第5章_模块化程序设计
- 格式:doc
- 大小:56.00 KB
- 文档页数:13
实验五模块化的程序设计实验目的(1)理解自顶向下,逐步细化的模块化设计思想划分子模块;知道模块化程序设计方法。
(2)熟悉函数的定义、函数的声明和函数的调用,理解函数调用的实现过程。
(3)理解函数调用时的数据传送机制,通过参数将主调函数的数据传递到被调函数,运用return语句将被调函数的处理结果返回主调函数。
(4)通过设置断点和单步执行,观察子函数的执行路径,和子函数中变量的值的变化。
实验范例引导任务任务1会变化的三角形任务2 计算生日相差几天任务1会变化的三角形任务描述在屏幕上打印一个三角形,如图5-1所示,运行程序时输入三角形的级别n,可以打印不同大小的三角形。
图5-1 输出可变的三角形任务解决任务解决路径:图5-2 任务1 解决路径第一步:学习无参无返回值函数的定义、声明和调用;第二步:了解函数参数的作用,学习使用带参的函数构建多层模块程序的构建; 第三步:学习带参无返回值函数的设计;1.编写打印三角形的函数(1)问题分析要在屏幕上打印一个三角形,可以直接在main 函数中使用printf 语句完成,如下程序代码所示:在本任务中,要求调整程序的结构,写一个打印三角形的无参无返回值函数,然后在main 函数中调用它实现打印三角形。
程序员编写的函数称为用户自定义函数,相对于系统函数而言,不是系统已写好的代码,需要程序员自己定义函数和编写实现函数的程序代码。
无参无返回值函数通常执行一个具体的操作,无计算结果。
(2)函数的应用使用用户自定义函数分三步:函数定义,函数声明和函数调用。
①无参无返回值函数的定义无参无返回值函数定义的一般形式为:一个打印三角形的函数的定义可以为:#include <stdio.h> int main() {printf("打印一个三角形\n ");printf(" *\n");printf(" ***\n");printf("*****\n");printf("打印结束\n"); return 0; }void 函数名(void ) { ...... }void triangle(void){printf(" *\n");printf(" ***\n");printf("*****\n");}triangle是函数名,函数名应能体现函数的功能,以增强程序的可读性,这个函数的功能是打印一个固定的三角形。
模块化程序设计模块化程序设计什么是模块化程序设计在软件开发中,模块化程序设计是一种将软件系统划分为独立的模块或组件的方法。
每个模块都有自己的功能和责任,可以通过定义模块之间的接口来实现模块之间的通信和协作。
通过模块化程序设计,我们可以更加灵活地开发、测试和维护软件系统。
为什么需要模块化程序设计1. 提高代码的复用性模块化程序设计可以将功能相似的代码封装在独立的模块中,这样可以使得这部分代码可以被多个程序共享和复用。
通过复用模块,可以减少代码的重复编写,提高开发效率。
2. 提高代码的可维护性当一个软件系统被划分为多个模块时,每个模块的功能和责任都较为清晰明确。
这样,当需要修改系统的某个功能时,只需要关注与该功能相关的模块,而不需要修改整个系统的代码。
这样可以提高代码的可维护性,降低修改代码时的风险和工作量。
3. 提高开发效率将一个复杂的软件系统划分为多个模块后,每个模块可以由不同的开发人员独立开发。
这样可以并行开发不同模块,提高开发效率。
同时,不同模块之间的接口定义也可以促进开发人员之间的协作和沟通,减少开发冲突。
4. 降低系统的耦合度模块化程序设计可以将系统中的各个模块解耦。
模块之间通过明确定义的接口进行通信,模块之间的依赖关系减少。
这样,当需要修改系统的某个模块时,对其他模块的影响较小,可以降低系统的耦合度,增强系统的灵活性。
实现模块化程序设计的方法1. 使用函数模块化在很多编程语言中,函数是实现模块化程序设计的基本单位。
我们可以将相关功能的代码封装在一个函数中,并通过函数的参数和返回值来实现多个函数之间的通信和协作。
例如,在Python中,我们可以定义一个计算圆面积的函数:pythondef calculate_area(radius):return 3.14 radius 22. 使用类模块化除了函数,类也是一种常用的模块化设计方法。
通过将相关的属性和方法封装在类中,可以更好地组织和管理代码。
第5章模块化程序设计在软件开发中,模块化程序设计是一种主要的设计思想和方法。
它将软件系统划分为多个相互独立、可重复使用的模块,以实现代码的解耦、提高开发效率和程序的可维护性。
模块化程序设计的重要性不言而喻,本文将以模块之间的通信、模块的设计与实现、模块化程序的优势和挑战四个方面,详细阐述模块化程序设计的概念和技术。
首先,模块化程序设计的核心是模块之间的通信。
模块是软件系统中独立的功能单元,它可以接收输入、进行处理和产生输出。
模块之间的通信是通过数据传递实现的,常见的通信方式有参数传递、全局变量和消息传递等。
参数传递是最常用的通信方式,通过函数参数将数据传递给被调用的模块。
全局变量是另一种通信方式,但它容易造成数据的冗余和混乱,因此被广泛认为是一种不良的设计方法。
消息传递是一种比较灵活的通信方式,模块之间通过发送消息进行通信,具有较好的松耦合性。
其次,模块的设计和实现是模块化程序设计的关键。
在模块设计中,要遵循“单一责任原则”,即每个模块应该有一个明确的功能,不涉及其他任务。
模块的实现可以采用面向对象的方法,将数据和处理过程封装在一个模块中,以提高代码的可复用性和可维护性。
同时,模块的接口设计也很关键,良好的接口设计可以提高模块的可组合性,降低模块之间的耦合度。
再次,模块化程序设计具有许多优势。
首先,模块化程序设计可以提高开发效率。
通过将软件系统划分为多个独立的模块,可以并行开发不同模块的代码,大大缩短了开发时间。
其次,模块化程序设计可以提高代码的可维护性。
当软件系统需要升级或修改时,只需要修改相应的模块而不会影响其他模块,降低了维护的成本。
此外,模块化程序设计可以提高代码的可重用性。
设计良好的模块可以在不同的项目中重复使用,减少了代码的重复编写,提高了代码的质量和效率。
最后,模块化程序设计也面临一些挑战。
首先,模块之间的接口设计需要考虑模块之间的数据传递和调用关系,这需要对系统功能和实现有深入的理解。
4.1程序设计语言的基础知识教学设计程序设计语言的基础知识教学设计教学目标:1. 理解程序设计语言的基本概念和原理。
2. 掌握常见的程序设计语言的语法和控制结构。
3. 能够独立设计和实现简单的程序。
教学内容:第一章:引言1.1 程序设计语言的定义和分类1.2 程序设计语言的发展历程第二章:编程环境和工具2.1 编程环境的概念和结构2.2 常见的程序设计工具和集成开发环境第三章:程序的基本构成3.1 程序的基本概念和结构3.2 变量和数据类型3.3 运算符和表达式第四章:控制结构4.1 顺序结构4.2 分支结构4.3 循环结构第五章:函数和模块化程序设计5.1 函数的定义和调用5.2 函数的参数和返回值5.3 模块化程序设计的概念和原理教学方法:1. 授课结合实践:理论知识和实际编程相结合,通过实例演示和实践操作,加深学生对程序设计语言的理解和应用能力。
2. 案例分析:通过分析实际问题和案例,引导学生运用程序设计语言解决实际问题的能力。
3. 小组讨论:设置小组讨论环节,让学生在小组中相互交流和讨论,促进他们的合作能力和思维能力的发展。
4. 课堂练习和作业:布置适量的课堂练习和作业,加强学生对所学内容的巩固和应用。
教学过程:第一章:引言1.1 程序设计语言的定义和分类- 通过举例解释什么是程序设计语言,并介绍常见的程序设计语言的分类。
1.2 程序设计语言的发展历程- 简要介绍程序设计语言的发展历程,让学生对其发展脉络有个整体认识。
第二章:编程环境和工具2.1 编程环境的概念和结构- 解释编程环境的概念和组成部分,让学生了解编程环境对程序设计的重要性。
2.2 常见的程序设计工具和集成开发环境- 介绍常见的程序设计工具和集成开发环境,让学生能够选择合适的工具和环境进行编程实践。
第三章:程序的基本构成3.1 程序的基本概念和结构- 介绍程序的基本概念和结构,包括程序的输入、处理和输出。
3.2 变量和数据类型- 解释变量的概念和作用,讲解常见的数据类型和变量的定义和使用。
python模块化程序设计
1. 模块(Module):Python 中的模块是一个包含 Python 代码的文件。
模块可以包含变量、函数、类等定义。
模块的文件名以`.py`结尾。
2. 导入(Import):使用`import`语句可以将其他模块中的代码引入到当前模块中使用。
可以导入整个模块、模块中的特定函数、类或变量。
3. 命名空间(Namespace):每个模块都创建了一个独立的命名空间。
在一个模块中定义的变量、函数和类仅在该模块的命名空间中可见。
通过导入模块,可以访问模块中的内容。
4. 封装(Encapsulation):将相关的变量、函数和类组织在一个模块中,实现代码的封装。
模块可以隐藏实现细节,只公开接口供其他模块使用。
5. 模块层次结构:可以将模块组织成一个层次结构,主模块可以导入其他子模块,子模块又可以导入其他子模块,形成一个树状结构。
6. 可读性和可维护性:模块应该具有良好的可读性和可维护性。
使用有意义的模块名、函数名和变量名,添加适当的注释,有助于理解模块的功能。
7. 避免循环导入:循环导入是指两个或多个模块之间相互依赖,形成循环引用。
应该尽量避免循环导入,因为它可能导致难以理解和调试的问题。
通过遵循这些原则,使用 Python 的模块可以更好地组织和管理代码,提高代码的重用性和可维护性。
第5章模块化程序设计5.1 简答题(1)指令“CALL EBX”采用了指令的什么寻址方式?寄存器间接寻址(2)为什么MASM要求使用proc定义子程序?(这个问题不好回答,是不是作者写错了?我猜测可能的原因:在汇编语言中,函数、子程序等都称为过程,所以使用proc定义子程序)(3)为什么特别强调为子程序加上必要的注释?便于程序员调用时使用,而不必关注子程序的内部实现。
(4)参数传递的“传值”和“传址”有什么区别?传值是传递参数的拷贝,传址是传递参数的地址(5)子程序采用堆栈传递参数,为什么要特别注意堆栈平衡问题?保证正确返回;释放传递参数占用的堆栈空间,避免多次调用可能导致的堆栈溢出(6)INCLUDE语句和INCLUDELIB有什么区别?INCLUDE语句包含的是文本文件、是源程序文件的一部分;INCLUDELIB语句包含的是子程序库文件(7)什么是子程序库?子程序库就是子程序模块的集合,其中存放着各子程序的名称、目标代码以及有关定位信息,便于子程序的管理和调用(8)调用宏时没有为形参提供实参会怎样?缺少的实参,形参会做“空”处理。
(9)宏定义体中的标号为什么要用local为指令声明?为了避免宏展开后出现标示符不唯一的情况,定义为局部。
(10)条件汇编不成立的语句会出现在可执行文件中吗?不会。
5.2 判断题(1)过程定义proc是一条处理器指令。
错,proc是伪指令(2)CALL指令的执行并不影响堆栈指针ESP。
错,要改变,因为返回地址要压入堆栈(3)call指令本身不能包含子程序的参数。
对。
(4) call指令用在调用程序中,如果被调用程序中也有call指令,说明出现了嵌套。
对。
(5)子程序需要保护寄存器,包括保护传递入口参数和出口参数的通用寄存器。
错,不能保护传递出口参数的寄存器(6)利用INCLUDE包含的源文件实际上只是源程序的一部分。
对(7)宏调用与子程序调用一样都要使用CALL指令实现。
错,宏调用是通过宏展开实现的调用,不用CALL指令(8)宏定义与子程序一样一般书写与主程序之后。
错,宏需要先定义后调用,一般在源程序开头部分。
(9)重复汇编类似于宏汇编,需要先定义后调用。
错。
(10)条件汇编并不像条件转移指令那样使用标志作为条件对。
5.3 填空题(1)指令“RET i16”的功能相当于“RET”指令和“ADD ESP, __________”组合。
i16(2)例5-1程序中的ret指令,如果用pop ebp和jmp ebp指令替换,则ebp内容是()0000000分(3)子程序的参数传递主要有3种,它们是()、()和()。
寄存器传递,共享变量传递,堆栈传递(4)数值10在计算机内部用二进制“1010”编码表示,用十六进制表达是:____。
如果将该编码加37H,则为_____,它是字符______的ASCII码值。
A,41H,A(5)利用堆栈传递子程序参数的方法是固定的,例如寻址堆栈段数据的寄存器是_____。
EBP(6)MASM汇编语言中,声明一个共用的变量应使用___伪指令;而使用外部变量要使用___伪指令声明。
PUBLIC,EXTERN(7)过程定义开始是“TEST PROC”语句,则过程定义结束的语句是________。
宏定义开始是“DISP MACRO”语句,则宏定义结束的语句是________。
TEST ENDP,ENDM(8)一个宏定义开始语句“WriteChar MACRO CHAR:REQ”,则宏名是(),参数有( ) 个,并且使用“:REQ”说明该参数()。
WriteChar,1 ,不可缺少(9)实现“byte 20 dup(20h)”语句的功能也可以使用重复汇编,第1个语句是(),第2个语句是“byte 20h”,第3个语句是()。
REPEAT 20, ENDM(10)条件汇编语言语句“IF NUM LT 100”中的LT 表示(),该语句需要配合()语句结束条件汇编小于,ENDIF习题5.4如下子程序完成对ECX个元素的数组(由EBX指向其首地址)的求和,通过EDX和EAX 返回结果,但是程序有错误,请改正。
Crazy procPush e axXor eax,eaxXor edx,edxAgain:Add eax,[ebx]Adc edx,0Add ebx,4Loop againRetENDP Crazy答:Crazy procXor eax,eaxXor edx,edxAgain:Add eax,[ebx]Adc edx,0Add ebx,4Loop againRetCrazy ENDP习题5.5请按如下说明编写子程序:子程序功能:把用ASCII码表示的两位十进制数转换为压缩BCD码。
入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码出口参数:AL=对应的BCD码答:asc2bcd procshl dh,4and dl,0fhor dh,dlmov al,dhretasc2bcd endp习题5.6乘法的非压缩BCD码调整指令AAM执行的操作是:AH<-AL/10的商,AL<-AL/10的余数。
利用AAM可以实现将AL中的100内数据转换为ASCII码,程序如下:Xor ah,ahAamAdd ax,3030h利用这段程序,编写一个显示AL中数值(0~99)的子程序。
答:suba procaamadd ax,3030hxchg a h,alcall dispcxchg a h,alcall dispcretsuba endp习题5.7编写一个源程序,在键盘上按一个键,将其返回的ASCII码值显示出来,如果按下退格键(对应ASCII码是08H)则程序退出。
请调用书中的HTOASC子程序答:;代码段,主程序again: call readccmp al,08h ;退格键BS=08Hjz donemov bl,almov al,':'call dispcmov al,blrol al,4call htoasc ;调用子程序call dispc ;显示一个字符mov al,blcall htoasc ;调用子程序call dispc ;显示一个字符call dispcrlfjmp againdone:习题5.8编写一个子程序,它以二进制形式显示EAX中32位数据,并设计一个主程序验证。
答:;代码段,主程序mov eax,8F98FF00Hcall dispbd ;调用子程序;代码段,子程序dispbd proc ;32位二进制数的输出push ecxmov ecx,32 ;要输出的字符个数dbd: rol eax,1 ;AL循环左移一位push eaxand al,01h ;取AL最低位add al,30h ;转化成相应的ASCLL码值call dispc ;以二进制的形式显示pop eaxloop dbdpop ecxretdispbd endp习题5.9将例5-4的32位寄存器改用16位寄存器,仅实现输出-215 ~ +215-1之间的数据。
答:start:mov ecx,lengthof arraymov ebx,0again: mov ax,array[ebx]call writecall dispcrlfinc ebxinc ebxloop againexit 0write procpush ebxpush ecxpush edxmov ebx,offset writebuftest ax,axjnz write1mov byte ptr [ebx],30hinc ebxjmp write5write1: jns write2mov byte ptr [ebx],'-'inc ebxneg axwrite2: mov cx,10push cxwrite3: cmp ax,0jz write4xor dx,dxdiv cxadd dx,30hpush dxjmp write3write4: pop dxcmp dx,cxje write5mov [ebx],dlinc ebxjmp write4write5: mov byte ptr [ebx],0mov eax,offset writebufcall dispmsgpop edx ;恢复寄存器pop ecxpop ebxret ;子程序返回write endp习题5.10参考例5-6,编写实现32位无符号整数输入的子程序,并设计一个主程序验证。
答:include io32.inc.datacount = 5array dword count dup(0)tempdword ? ;共享变量readbuf byte 30 dup(0).codestart:mov ecx,countmov ebx,offset arrayagain: call read ;调用子程序,输入一个数据mov eax,temp ;获得出口参数mov [ebx],eax ;存放到数据缓冲区add ebx,4dec ecxjnz againexit 0read procpush eaxpush ebxpush ecxpush edxread0:mov eax,offset readbufcall readmsgtest eax,eaxjz readerrcmp eax,10ja readerrmov edx,offset readbufxor ebx,ebxread1:mov al,[edx]read2:inc edxcmp al,'0'jb readerrcmp al,'9'ja readerrsub al,30himul ebx,10jc readerrmovzx eax,aladd ebx,eaxcmp ebx,0ffffffffhja readerrdec cxjnz read1jmp read5readerr: mov eax,offset errmsgcall dispmsgjmp read0;read5: mov temp,ebxpop edxpop ecxpop ebxpop eaxreterrmsg byte 'Input error, enter again: ',0read endpend start习题5.11编写一个计算字节校验和的子程序。
(所谓“校验和”是指不记进位的累加,常用于检查信息的正确性。
)主程序提供入口参数,包括数据个数和数据缓冲区的首地址。
子程序回送求和结果这个出口参数。
答:;计算字节校验和的通用过程;入口参数:DS:EBX=数组的段地址:偏移地址ECX=元素个数;出口参数:AL=校验和;说明:除EAX/EBX/ECX外,不影响其他寄存器checksumprocxor al,al ;累加器清0sum: a dd al,[ebx] ;求和inc ebx ;指向下一个字节loop sumretchecksumendp习题5.12编制3个子程序把一个32位二进制数用8位十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并配合3个主程序验证它。