第5章_模块化程序设计
第5章模块化程序设计
例如,输出两个整数值的函数可定义为: void outint( int x, int y)
数定义*/ {
printf("x=%d, y=%d", x, y); }
/*有参函
3. 函数的返回值与return语句 调用者在调用函数时,函数有时需要把处理的结果返回给调
用者,这个结果就是函数的返回值,函数的返回值是由 return语句传递的。 return语句的形式: return (表达式);或 return表达式;或 return; 注意: (1) return语句中表达式的类型应与函数返回值类型一致, 若不一致,则以函数返回值的类型为准,对于数值型数据 将自动进行类型转换。void类型函数中return后第一个 return语句返回,函数返回值为第一个return语句中表达 式的值;若return后面无表达式,则返回调用函数处。 (3) 若函数体内没有return语句,就一直执行到函数体的末 尾后返回调用函数。这时会返回一个不确定的函数值,若 确实不要求返回函数值,则应将函数定义为void类型。
1. 函数调用的形式 (1) 无参函数调用形式为 函数名(); (2) 有参函数调用形式为 函数名(参数表);
注意:
(1) 函数调用语句中函数名与函数定义的名字相同。
(2) 有参函数调用时参数表中列出的参数是实际参数(简称实
参)。
实参的形式为
参数1,参数2,…,参数n
其中,各参数间用逗号隔开,实参与形参要保持顺序一致、 个数一致、类型应一致。实参与形参按顺序一一对应,传 递数据。当实参与形参类型不一致时,实参的值转化为形 参的类型赋给形参。
注意: (1) 函数体内可以是0条、1条或多条语句。当函数体是0条语
句时,称该函数为空函数。空函数作为一种什么都不执行 的函数,通常在程序设计初期作为临时函数使用,在设计 过程中再实现或扩充功能。注意函数体内无论有多少条语 句,大括号是不能省略的。例如: void nothing() { } (2) 在函数体内不能定义另一个函数,也就是说函数定义不 能嵌套。例如下面函数的定义是错误的。 void output1( ) { printf("*****"); void output2( )
模块化程序设计
案例二:模块化设计的硬件项目
总结词
简化维护和升级
详细描述
硬件项目中的各个模块可以独立地进行维护和升级,而 不会影响整个系统的运行。这简化了维护和升级的过程 ,降低了运营成本。
案例三:模块化设计的游戏项目
总结词
提高游戏体验
详细描述
通过将游戏内容拆分成多个模块,如角色、场景、音 效等,游戏开发者可以更加灵活地设计和更新游戏内 容,以满足玩家的需求和提高游戏体验。
模块测试与调试
单元测试
对每个模块进行单元测试, 确保模块的正确性和稳定 性。
调试技巧
掌握调试技巧,以便于快 速定位和解决问题。
集成测试
对多个模块进行集成测试, 确保模块间的协调和交互。
05
模块化设计案例分析
案例一:模块化设计的软件项目
总结词
提高可维护性
VS
详细描述
模块化设计的软件项目可以将复杂的系统 拆分成多个独立的模块,每个模块具有明 确的功能和接口,便于开发和维护。通过 模块化设计,软件项目可以更加灵活地适 应需求变化,降低维护成本。
案例一:模块化设计的软件项目
总结词
提高可扩展性
详细描述
模块化设计的软件项目具有良好的可 扩展性,可以在不影响其他模块的情 况下添加新功能或修改现有功能。这 有助于提高软件的生命周期,满足不 断变化的市场需求。
案例一:模块化设计的软件项目
总结词
提高可重用性
详细描述
通过模块化设计,软件项目中的各个模块可 以独立地开发和测试,并在不同的项目中重 复使用。这有助于提高开发效率,减少代码 冗余和错误。
模块大小
模块的大小应适中,不宜过大或过小,以便于维护和 管理。
模块层级结构
实验五 模块化的程序设计
实验五模块化的程序设计实验目的(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是函数名,函数名应能体现函数的功能,以增强程序的可读性,这个函数的功能是打印一个固定的三角形。
《模块化程序设计》课件
03
避免模块间直接引用其他模块的内部实现 细节。
04
尽量减少模块间的直接依赖,可以通过引 入中介者模式或观察者模式来解耦。
模块的扩展性与可维护性
01
模块的扩展性与可维护性
02
模块的扩展性与可维护性是衡量模块化程序设计质 量的重要指标。
03
解决方案:采用灵活的模块划分和设计原则,使模 块能够适应未来的变化和需求。
特点
模块化程序设计具有清晰的结构、可 重用性、可维护性和可扩展性。每个 模块执行特定的功能,具有明确定义 的输入和输出,使得程序易于理解、 开发和维护。
模块化程序设计的重要性
提高代码质量
通过将程序分解为小模块,可以 降低复杂性,提高代码的可读性 和可维护性,减少错误和缺陷。
提高开发效率
模块化设计允许程序员重用现有 的模块,减少开发时间和成本, 加快软件开发速度。
ABCD
模块功能单一
每个模块应只负责一项功能或业务逻辑,避免模 块过于复杂。
模块可维护性
模块的设计应便于修改和维护,以便在需要时对 模块进行升级或修复错误。
02
CATALOGUE
模块化程序设计的基本概念
模块的划分与设计
模块的划分
将一个复杂的系统划分为若干个相对独立的、具有明确功能的模块。每个模块完成特定的子功能,共 同实现系统整体功能。
《模块化程序设计》ppt 课件
CATALOGUE
目 录
• 模块化程序设计概述 • 模块化程序设计的基本概念 • 模块化程序设计的方法与实践 • 模块化程序设计中的常见问题与解
决方案 • 模块化程序设计的未来发展与展望
01
CATALOGUE
模块化程序设计概述
模块化程序设计
模块化程序设计模块化程序设计什么是模块化程序设计在软件开发中,模块化程序设计是一种将软件系统划分为独立的模块或组件的方法。
每个模块都有自己的功能和责任,可以通过定义模块之间的接口来实现模块之间的通信和协作。
通过模块化程序设计,我们可以更加灵活地开发、测试和维护软件系统。
为什么需要模块化程序设计1. 提高代码的复用性模块化程序设计可以将功能相似的代码封装在独立的模块中,这样可以使得这部分代码可以被多个程序共享和复用。
通过复用模块,可以减少代码的重复编写,提高开发效率。
2. 提高代码的可维护性当一个软件系统被划分为多个模块时,每个模块的功能和责任都较为清晰明确。
这样,当需要修改系统的某个功能时,只需要关注与该功能相关的模块,而不需要修改整个系统的代码。
这样可以提高代码的可维护性,降低修改代码时的风险和工作量。
3. 提高开发效率将一个复杂的软件系统划分为多个模块后,每个模块可以由不同的开发人员独立开发。
这样可以并行开发不同模块,提高开发效率。
同时,不同模块之间的接口定义也可以促进开发人员之间的协作和沟通,减少开发冲突。
4. 降低系统的耦合度模块化程序设计可以将系统中的各个模块解耦。
模块之间通过明确定义的接口进行通信,模块之间的依赖关系减少。
这样,当需要修改系统的某个模块时,对其他模块的影响较小,可以降低系统的耦合度,增强系统的灵活性。
实现模块化程序设计的方法1. 使用函数模块化在很多编程语言中,函数是实现模块化程序设计的基本单位。
我们可以将相关功能的代码封装在一个函数中,并通过函数的参数和返回值来实现多个函数之间的通信和协作。
例如,在Python中,我们可以定义一个计算圆面积的函数:pythondef calculate_area(radius):return 3.14 radius 22. 使用类模块化除了函数,类也是一种常用的模块化设计方法。
通过将相关的属性和方法封装在类中,可以更好地组织和管理代码。
第5章模块化程序设计
第5章模块化程序设计在软件开发中,模块化程序设计是一种主要的设计思想和方法。
它将软件系统划分为多个相互独立、可重复使用的模块,以实现代码的解耦、提高开发效率和程序的可维护性。
模块化程序设计的重要性不言而喻,本文将以模块之间的通信、模块的设计与实现、模块化程序的优势和挑战四个方面,详细阐述模块化程序设计的概念和技术。
首先,模块化程序设计的核心是模块之间的通信。
模块是软件系统中独立的功能单元,它可以接收输入、进行处理和产生输出。
模块之间的通信是通过数据传递实现的,常见的通信方式有参数传递、全局变量和消息传递等。
参数传递是最常用的通信方式,通过函数参数将数据传递给被调用的模块。
全局变量是另一种通信方式,但它容易造成数据的冗余和混乱,因此被广泛认为是一种不良的设计方法。
消息传递是一种比较灵活的通信方式,模块之间通过发送消息进行通信,具有较好的松耦合性。
其次,模块的设计和实现是模块化程序设计的关键。
在模块设计中,要遵循“单一责任原则”,即每个模块应该有一个明确的功能,不涉及其他任务。
模块的实现可以采用面向对象的方法,将数据和处理过程封装在一个模块中,以提高代码的可复用性和可维护性。
同时,模块的接口设计也很关键,良好的接口设计可以提高模块的可组合性,降低模块之间的耦合度。
再次,模块化程序设计具有许多优势。
首先,模块化程序设计可以提高开发效率。
通过将软件系统划分为多个独立的模块,可以并行开发不同模块的代码,大大缩短了开发时间。
其次,模块化程序设计可以提高代码的可维护性。
当软件系统需要升级或修改时,只需要修改相应的模块而不会影响其他模块,降低了维护的成本。
此外,模块化程序设计可以提高代码的可重用性。
设计良好的模块可以在不同的项目中重复使用,减少了代码的重复编写,提高了代码的质量和效率。
最后,模块化程序设计也面临一些挑战。
首先,模块之间的接口设计需要考虑模块之间的数据传递和调用关系,这需要对系统功能和实现有深入的理解。
5分而治之-模块化程序设计
让srand函数需要的种子自动变化
函数time(NULL)是获得系统时间的函数,它 的返回值是系统当前的时间,单位是秒,是从 1970年1月1日0点开始走过的秒数,注意它的 参数是大写的NULL或者0,它在time.h中定 义。 srand( time( NULL)); 的种子是随系统当前的 时间变化而变化,使种子自动变化
模块化系统具有层次结构,降低了复杂性, 因此具有易读性,即容易阅读和理解; 模块化系统具有可修改性,即对系统的修 改只涉及少数部分模块;
模块化系统具有易验证性,每个模块可 以独立测试验证,而且由于功能单一、 规模较小,所以容易验证。 模块具有可重用性,每个模块可以反复 使用,因此也称可复用
完整代码见guessnumber0.c 运行测试
猜数游戏模拟实现(2)
模块化,层次化 算法顶层的每个抽象步骤模块化
开始
计算机想一个数
猜数游戏 (主函数main)
猜数
继续下一次游戏吗
N
Y
计算机 想一个 数 MakeMa gic
猜数 GuessN umber
结束
图5.2 猜数游戏程序的层次结构
(3)一对圆括号是函数的关键特征,只有 看到圆括号,才能确定其前面的名字是函 数名;一对花括号封闭了函数的主体。它 们都是必不可少的。 (4)参数列表是逗号隔开的,所含的列表 项可多可少,每一项说明一个参数。参数 的说明的格式是: – 参数类型 参数名称,参数类型 参数名 称,…
例如
int max(int a, int b) 有两个参数 int max( a, b ) 是错误的
今天要解决的问题
1 猜数游戏模拟问题 2 学生成绩管理问题
《模块化程序设计 》课件
模块应具有通用性,可以在不同的程序和项目中重复 使用,提高软件开发的效率。
模块化程序设计的好处
提高软件质量
通过将程序分解为独立的模块 ,可以单独测试每个模块,提
高软件的质量和可靠性。
提高开发效率
模块化程序设计使得开发人员 可以并行开发不同的模块,加 快开发进度。
提高软件可维护性
独立的模块使得代码易于理解 和修改,降低了维护的难度和 成本。
提高软件可重用性
通用的、可重用的模块可以应 用于不同的项目和应用程序中
,提高了软件的可重用性。
PART 02
模块的划分与设计
如何划分模块
01
根据功能划分
将程序划分为独立的、具有明确 功能的模块,每个模块完成特定 的功能。
02
根据逻辑划分
03
根据数据划分
根据程序逻辑结构划分模块,使 模块间的逻辑关系清晰,便于理 解和维护。
2023-2026
END
THANKS
感谢观看
KEEP VIEW
REPORTING
如何优化模块的性能
性能瓶颈
模块内部可能存在性能瓶颈,如算法效率低下。
解决方案
使用性能分析工具找出性能瓶颈,优化算法或调整数据结构,提高模块执行效率。
PART 05
案例分析
一个简单的模块化程序设计案例
总结词:简单示例
详细描述:介绍一个简单的模块化程序设计案例,例如计算两个数的和或差。通过这个案例,展示如何将程序拆分成不同的 模块,每个模块执行特定的功能,并演示模块之间的通信和协作。
高耦合问题
模块间的依赖关系过强,一个模块的 变动可能影响其他模块。
解决方案
采用接口或抽象类来定义模块间的契 约,而非直接依赖具体实现,实现松 耦合设计。
4.1程序设计语言的基础知识教学设计
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模块化程序设计
python模块化程序设计
1. 模块(Module):Python 中的模块是一个包含 Python 代码的文件。
模块可以包含变量、函数、类等定义。
模块的文件名以`.py`结尾。
2. 导入(Import):使用`import`语句可以将其他模块中的代码引入到当前模块中使用。
可以导入整个模块、模块中的特定函数、类或变量。
3. 命名空间(Namespace):每个模块都创建了一个独立的命名空间。
在一个模块中定义的变量、函数和类仅在该模块的命名空间中可见。
通过导入模块,可以访问模块中的内容。
4. 封装(Encapsulation):将相关的变量、函数和类组织在一个模块中,实现代码的封装。
模块可以隐藏实现细节,只公开接口供其他模块使用。
5. 模块层次结构:可以将模块组织成一个层次结构,主模块可以导入其他子模块,子模块又可以导入其他子模块,形成一个树状结构。
6. 可读性和可维护性:模块应该具有良好的可读性和可维护性。
使用有意义的模块名、函数名和变量名,添加适当的注释,有助于理解模块的功能。
7. 避免循环导入:循环导入是指两个或多个模块之间相互依赖,形成循环引用。
应该尽量避免循环导入,因为它可能导致难以理解和调试的问题。
通过遵循这些原则,使用 Python 的模块可以更好地组织和管理代码,提高代码的重用性和可维护性。
5分而治之-模块化程序设计(4)
计算机系 鲍春波
函数的前置条件(pre-conditions)。 与后置条件(post-conditions)
任何一个函数在定义的时候,一般都要有某种假 设。如果有不符合假设的参数进来,就应该是非 法的。通常把这个必须满足的假设条件称为前置 条件(pre-conditions)。 一个函数被调用之后都希望取得某种结果,如果 没有达到那个结果,可以肯定在这个函数代码中 存在一定的问题。这个在函数执行完后必须为真 的条件称为后置条件(post-conditions)。
计算机系 鲍春波
例1给求平方定义一个宏
#define SQUARE(x) ( (x) * (x) ) 这个宏叫SQUARE,它有一个参数,宏替 换的结果是参数的平方。
计算机系 鲍春波
思考:下面的定义正确吗?
#define SQUARE(x) x*x 假设实参为a+1,则SQUARE(a+1)替换为 a+1*a+1,显然我们期望的结果是替换为 (a+1)*(a+1), #define SQUARE(x) (x)*(x) 假设实参为a+1,则1/SQUARE(a+1)替换 为1/(a+1)*(a+1),而我们期望的显然是要替 换为1/((a+1)*(a+1))。
鲍春波
5.5.3在函数中使用断言
断言可以用在函数体的任何地方。到底什么时候 该用,用在哪里是比较讲究的事情。能否用好断 言是程序员专业素质的一个体现。 使用断言的目的是想尽早发现可能存在的bug。 程序员在程序设计实践中要有意思的训练这种能 力,碰到bug的时候要问自己,怎么样才能阻止 这个bug呢,能否自动监测到这个bug呢。
第5章模块化程序设计
root函数
调用函数root 调用函数xpoint
输出根 x 结束
xpoint函数 调用函数f
f函数
2023/11/5
《解析C程序设计》第5章 模块化程序设计
23
例5-3
求
3
1
9
1
15
1
的值。
i 1 i! i 6 i! i 12 i!
《解析C程序设计》第5章 模块化程序设计
17
例5-1问题的实现
/*LI5_1.c*/ #include <stdio.h> int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z); void main() { int a,b,c,d;
▪ 定义好后不要轻易改动 ▪ 在模块开头(文件的开头)进行函数声明
2023/11/5
《解析C程序设计》第5章 模块化程序设计
8
模块化程序设计方法的基本原则
❖ 模块化程序设计方法的基本原则是:高聚合、低耦合 及信息隐藏。
❖ 高聚合是指一个模块只能完成单一的功能,不能“身 兼数职”,在描述功能时不能出现“和”、“与”等 连词。
C程序
源程序文件1
源程序文件i
源程序文件n
预编译命令
函数1
函数i
函数n
2023/11/5
声明部分
执行部分
《解析C程序设计》第5章 模块化程序设计
11
函数设计的原则
❖函数的功能要单一,不要设计多用途的函数
❖ 函数的规模要小,尽量控制在50行代码以内
▪ 1986年IBM在OS/360的研究结果:大多数有错误的函数都 大于500行
第5章 模块化程序设计
以及采用何种机制进行存储。 这些都是变量的存储属性。
25
第5章 模块化程序设计 4.3.1 变量的作用域
变量有效的使用范围称变量的作用域。
C语言中的变量,按作用域范围可分为两种,即 局部变量和全局变量。
1. 局部变量
凡在函数(含main 函数)内部定义的变量称为局部 变量。 局部性: 局部变量仅在函数内部有效。
21,15↙ a=21,b=15 d=3
19
第5章 模块化程序设计 4.2 函数的递归调用 递归: 一个函数在其函数体中又出现直接或间接地 调用自身的语句。
直接递归 int f(int x) { int y, z; z=f (y); ……… } 间接递归 void a( ) { …… b( ); …… } void b( ) { …… a( ); …… }
求3!的递归过程
main( ) fac(3) fac( ) fac( ) fac( ) fac( )
n=3 fac(2) return 6
n=2 fac(1) return 2
n=1 fac(0) return 1
n=0
return 1
21
第5章 模块化程序设计 [例4] 编程求解汉诺塔问题。 a b
10
第5章 模块化程序设计 5.1.3 函数的调用
定义一个函数后,就可以在程序中调用这个函数。
调用标准库函数时,在程序的最前面用#include 命令包含相应的头文件。 调用自定义函数时,程序中必须有与调用函数相
对应的函数定义。
11
第5章 模块化程序设计
1.函数调用的一般形式
函数名(实参1,实参2,……) 函数调用分为无参函数调用和有参函数调用。
c
c语言模块化程序设计
b
4
temp
返回main()
x 4 y5
a 4 b5
a=b;
5
5
a
b
4
temp
b=temp;
5
4
a
b
4
temp
4
5
x
y
16
例 : 计算x的立方
# include “stdio.h” float cube(float x) { return(x*x*x); }
a ×1.×2 product 1×.7×28
13
例: 比较两个数并输出大者
int max(int x, int y)
形参
{ int z;
m=max(a,b);
(main 函数) z=x>y?x:y;
int max(int x, int y) (max 函数) return(z);
{ int z;
}
z=x>y?x:y; return(z); }
第5章 模块化程序设计
➢模块化设计与函数 ➢局部变量与全局变量 ➢变量的存储属性 ➢内部函数与外部函数 ➢编译预处理 ➢函数综合应用举例
5.1 模块化设计与函数
模块化程序设计 基本思想:将一个大的程序按功能分割成一些小模块。 特点: • 各模块相对独立、功能单一、结构清晰、接口简单。 • 控制了程序设计的复杂性。 • 缩短了开发周期。 • 避免程序开发的重复劳动。 • 易于维护和功能扩充。 开发方法: 自上向下,逐步细化。
x 1.2
main()
{ float a, product;
printf("Please input value of a:");
第五节模块化程序设计1
对每一部分进行细化,遇到不能很清楚解决的 步骤再向下一层延伸。依次进行第二层、第三 层的细化,直到每一步都是一个基本操作为止。 每次分步处理,都是算法在一个层次上的细化。
(4)列出判断获得证书类型的P1和P2的表达式 P1:(score(i, 1) >= 85 And score(i, 2) >= 85 And score(i, 3) >= 85) P2:(Sum(i) > 70 And score(i, 1) >= 60 And score(i, 2) >= 60 And score(i, 3) >= 60)
8
阅读程序代码,在下划线处完功能注释
Private Sub Form_Click() Const n As Integer = 25 Dim sname(25) As String '学生的姓名 Dim score(25, 3) As Integer '学生的三门课程成绩 Dim sum(25) as integer ‘学生的总分 Dim i As Integer Dim prompt As String ‘输入学生的成绩 For i = 1 To n prompt = "输入第" & i & "个学生姓名" sname(i) = InputBox(prompt) prompt = "输入" & sname(i) & "的软硬件基础成绩" score(i, 1) = Val(InputBox(prompt)) prompt = "输入" & sname(i) & "的文字处理成绩" score(i, 2) = Val(InputBox(prompt)) prompt = "输入" & sname(i) & "的网络技术应用成绩" score(i, 3) = Val(InputBox(prompt)) Next i ‘计算学生的总分 For i = 1 To n Sum(i) = score(i, 1) * 0.2 + score(i, 2) * 0.5 + score(i, 3) *
模块化程序设计
……
询询询
4/37
二 模块化程序设计的思想
自顶向下、逐步细化
5/37
二 模块化程序设计的思想
什么时候需要 模块化?
6/37
三 模块化程序的设计方法
模块分解的原则:
• 保证模块的相对独立性 高聚合、低耦合
• 模块的实现细节对外不可见 外部:关心做什么 内部:关心怎么做
设计好模块接口:
• 接口是指罗列出一个模块的所有的与外部打交道的变量等 • 定义好后不要轻易改动 • 在模块开头(文件的开头)进行函数声明
定义抓取吸盘工具的子程序
直接调用
25/37
四 带参数例行程序的设计与应用
什么是带参数的例行程序?
像上面的子程序GET_GUN2(),这种不传递参数,仅仅被直接 调用的为不带参数的例行程序。
如果一个例行程序能够传递或者引用某种参数的话,那么就为带参 数的例行程序。
格式为:GET_GUN2(N) 其中N为某种参数,可以是数字量num,位置数据量Pos,点位数 据量Robtarget,TCP数据量tooldata等等,也可以为常量或变量 或可变量。
3/37
一 模块化程序设计的概念
高校信息管理系统
人事管理 财务管理
子系统
子系统
学生管理 子系统
教学管理 子系统
设备管理 子系统
……
系统管理 学籍管理 班级管理 成绩管理 数据查询 综合测评 ……
用退录修 户出入改 管系信信 理统息息
录修 入改 信信 息息
录修 入改 信信 息息
学班成
籍 查
级 查
绩 查
30/37
四 带参数例行程序的设计与应用
带参数例行程序应用实例:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第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个主程序验证它。