第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 学生成绩管理问题
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章 S7-1200 PLC的用户程序结构
FB的典型应用是执行不能在一个扫描周期结束的操作。
在调用FB时,打开了对应的背景数据块,后者的变量可以供其他 代码块使用。
调用同一个功能块时使用不同的背景数据块,可以控制不同的设 备。例如用来控制水泵和阀门的功能使用包含特定的操作参数的 不同的背景数据块,可以控制不同的水泵和阀门。
S7-1200的部分指令(例如IEC标准的定时器和计数器指令)实际上
块
简要描述
组织块(OB) 操作系统与用户程序的接口,决定用功能的子程序,有专用的背景数 据块
功能(FC)
用户编写的包含经常使用的功能的子程序,没有专用的背景 数据块
背景数据块(DB)
用于保存FB的输入变量、输出变量和静态变量,其数据在编 译时自动生成
第5章 S7-1200 PLC的用户程序结构
2021/6/30
1
5.1 用户程序结构简介——模块化编程 1/3
模块化编程将复杂的自动化任务划分为对应于生产过程的技术功 能的较小的子任务,每个子任务对应于一个称为“块”的子程序, 可以通过块与块之间的相互调用来组织程序。这样的程序易于修 改、查错和调试。
功能是快速执行的代码块,用于执行下列任务:完成标准的和 可重复使用的操作,例如算术运算;完成技术功能,例如使用 位逻辑运算的控制。
可以在程序的不同位置多次调用同一个FC,这可以简化重复执 行的任务的变成。
功能没有固定的存储区,执行结束后,其临时变量中的数据就 丢失了。可以用全局数据块或M存储区来存储那些在功能执行 结束后需要保持的数据。
全局数据块(DB) 存储用户数据的数据区域,供所有的代码块共享
2021/6/30
2
5.1 用户程序结构简介——模块化编程 2/3
块结构显著增加了PLC程序的组织透明性、可理解性和易维护性。 OB、FB、FC都包含代码,统称为代码块(Code)块。 被调用的代码块又可以调用别的代码块,这种调用称为嵌套调用。 在块调用中,调用者可以是各种代码块,被调用的块是OB之外 的代码块。调用功能时需要为它指定一个背景数据块。
第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
汇编语言第5章王爽版(子程序调用指令)
例5-1:分别用三种参数传递方法编写求1+2的和的程序。要求将结果送到内存单元,并显示。
DATA SEGMENT SUM DB 0 DATA ENDS STACK SEGMENT DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA MOV DS,AX MOV AL, 1 MOV BL, 2 CALL subprog mov ah,4cH int 21h CODE ENDS END START
5.2 子程序的定义、调用和返回(续)
子程序返回指令(RET)
RET [n] 功能:弹出CALL指令压入堆栈的返回地址 段内返回——偏移地址IP出栈 IP←SS:[SP], SP+2 段间返回——偏移地址IP和段地址CS出栈 IP←SS:[SP],SP←SP+2 CS←SS:[SP],SP←SP+2
子程序的概念
子程序的现场保护与参数传递**
子程序的嵌套与递归调用
子程序的定义、调用和返回 **
子程序设计 *
宏汇编程序设计
教学基本内容
第5章 结构化程序设计
子程序:在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 过程(子程序):是指功能相对独立的一段程序。 主程序和子程序间的关系:调用子程序的程序称为主调程序或主程序,被调用的程序称为子程序。
Spr PROC PUSH BP MOV BP, SP MOV AX, [BP+6] MOV BX, [BP+4] ADD AL, BL OR AL, 30H MOV DL,AL MOV AH,2 INT 21H MOV SUM, AL POP BP RET Spr ENDP
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)。
y=f(x),y1=f(x1)
真 y与y1同号 假 root函数
x1=x y1=y
直到 |y|<
x2=x
root=x 输出 root
2013-12-11
《解析C程序设计》第5章 模块化程序设计
弦截法求根程序
/* 定义f函数,求f(x)的值 */ float f(float x) { float y; /* 计算f(x)的值 */ y=((x-5.0)*x+16.0)*x-80.0; return(y); } /* 定义xpoint函数,求弦与x轴的交点 */ float xpoint(float x1,float x2) { float x; x=(x1*f(x2)-x2*f(x1))/ (f(x2)-f(x1)); return(x); } /* 定义root函数,求近似根 */ float root(float x1,float x2) { float x,y,y1; y1=f(x1); do { x=xpoint(x1,x2); y=f(x); /* 新的f(x)与f(x1)同号时, 用x替换x1,否则替换x2 */ if (y*y1>0) { y1=y; x1=x; }else x2=x; }while(fabs(y)>=0.0001); /* 当f(x)约等于0时退出循环 */ return(x); }
预编译命令
函数1
函数i
函数n
声明部分
《解析C程序设计》第5章 模块化程序设计
执行部分
2013-12-11
11
函数设计的原则
函数的功能要单一,不要设计多用途的函数 函数的规模要小,尽量控制在50行代码以内
1986年IBM在OS/360的研究结果:大多数有错误的函数都 大于500行 1991年对148,000行代码的研究表明:小于143行的函数比 更长的函数更容易维护
2013-12-11
《解析C程序设计》第5章 模块化程序设计
6
为什么需要模块化程序设计
什么时候需要模块化? 某一功能,如果重复实现2遍及其以上,即应考虑模块 将它写成通用函数,并向小组成员发布。
化,
要尽可能利用其它人的现成模块。
模块化程序设计方法就是按照“自顶向下、逐步求精”的思 想,将系统功能逐步细分,使每个功能非常单一,一般不超 过50行。
y f(x2)
x1 0
x
x2 x
f(x)
f(x1)
x
x1 f ( x 2 ) x 2 f ( x1 ) f ( x 2 ) f ( x1 )
2013-12-11
《解析C程序设计》第5章 模块化程序设计
20
弦截法N-S图及程序
输入x1,x2,求f(x1),f(x2) 直到f(x1)与f(x2)异 号 求f(x1)与f(x2)连线与x轴的交点x
第5章 模块化程序设计
主讲:甘玲
本章内容
1
怎样解决一个复杂的问题
模块化程序设计思想 函数的嵌套调用
2
Hanoi(汉诺)塔问题
函数的递归调用
2013-12-11
《解析C程序设计》第5章 模块化程序设计
2
5.1 怎样解决一个复杂的问题
怎样来分析和完成“高校信息管理系统” 呢? 一个大系统(或子系统)不可能用一个主 函数来完成,必须将大问题分解成小问题, 再由若干人、若干函数(模块)来完成。
修 改 信 息
录 入 信 息
修 改 信 息
学 籍 查 询
班 级 查 询
成 绩 查 询
……
2013-12-11
《解析C程序设计》第5章 模块化程序设计
4
模块化程序设计思想
为了完成上述大型系统的开发,我们将软件开发 看成是一项工程来做,其过程大致分为:系统定
义、需求分析、系统设计、编写程序、系统测试、
系统维护等阶段。 软件工程的思想:将一个大的系统采取“分而治 之”方法解决。
2013-12-11
《解析C程序设计》第5章 模块化程序设计
5
模块化程序设计思想
开发一个软件系统时,最好的办法是从编写主程 序开始,在主程序中,将问题作为一个整体考虑, 然后找出完成整个任务的主要步骤,再沿着这条 主线将整个问题继续分解为独立的模块。 这种“自顶向下、逐步细化”的思想就是模块化 程序设计的主要思想。
模块化程序设计的特点是: −各模块相对独立、功能单一、结构清晰、接口简单; −避免程序开发的重复劳动; −易于维护和功能扩充; −程序设计的复杂性得到了有效控制等。
2013-12-11 《解析C程序设计》第5章 模块化程序设计 10
C程序结构
C语言是模块化程序设计语言,每个模块都是由函数完成的,C语言是函数式 的语言,函数就是模块。使用顺序结构、分支结构、循环结构三种基本结构 设计的程序必然就是结构化程序。 C程序 源程序文件1 源程序文件i 源程序文件n
C语言就是模块化程序设计语言。
2013-12-11
《解析C程序设计》第5章 模块化程序设计
13
简化的模块化问题√
实现前面 “高校信息管理系统” ,需要用到模块 化程序设计、函数的定义、声明、调用(嵌套调用)、 返回等,还需要用到数组、指针、结构体、文件等知 识,这些知识将在后续章节逐一介绍。 这里另外提出一个稍微简单一点的问题,以便在本 节中实现。
2013-12-11
《解析C程序设计》第5章 模块化程序设计
14
提出问题
例5-1:求三个数中最大数和最小数的差 值。
2013-12-11
《解析C程序设计》第5章 模块化程序设计
15
【分析】
主函数可以调用其他函数,反之,不然。 自定义函数之间能否调用呢?能。 函数不能嵌套定义,但是函数能嵌套调用,即函 数调用函数,前者称为调用函数,后者称为被调 函数。 这里可以定义3个函数:最大值、最小值、最大 值与最小值的差,第三个函数将调用前两个函数。
2013-12-11 《解析C程序设计》第5章 模块化程序设计 9
模块化程序设计的优点
每个模块都可以分配给不同的程序员完成,从而缩短开发周期。 各个模块高聚合、模块之间低耦合,只要模块之间确定了参数 传递的接口,不管哪个模块内部的改动,均不会影响其它模块, 从而使软件产品的生产更加灵活。 系统细化到模块,条理清楚,系统更加容易理解和实现。 容易维护、系统可靠。
#include <stdio.h> #include <math.h> float f(float x); float xpoint(float x1,float x2); float root(float x1,float x2); void main() { float x1,x2,f1,f2,x; /* 输入x1和x2并保证其 函数值反号 */ do { printf("Input x1,x2:\n"); scanf("%f,%f",&x1,&x2); f1=f(x1); f2=f(x2); }while(f1*f2>=0); x=root(x1,x2); printf("A root of \ equation is \ %8.4f",x); }
C语言中的函数与模块
在C语言中,每个模块都是由函数完成的。 一个小模块就是一个函数。 在程序设计中,常将一些常用的功能模块编写成函数,放在 函数库中供公共选用。程序员要善于利用库函数,以减少重 复编写程序段的工作量。 在编写某个函数时,遇到具有相对独立的功能的程序段,都 应独立成另一个函数,而在一个函数中调用另一个函数;当 某一个函数拥有较多的代码时(一般函数代码50行左右), 也应将函数中相对独立的代码分成另一个函数。
2013-12-11
《解析C程序设计》第5章 模块化程序设计
7
模块化程序设计方法
功能分解
自顶向下、逐步求精的过程
模块分解的原则
保证模块的相对独立性
• 高聚合、低耦合
模块的实现细节对外不可见
• 外部:关心做什么 • 内部:关心怎么做
设计好模块接口
接口是指罗列出一个模块的所有的与外部打交道的变量 等 定义好后不要轻易改动 在模块开头(文件的开头)进行函数声明
2013-12-11
《解析C程序设计》第5章 模块化程序设计
3
高校信息管理系统功能分解
高校信息管理系统
人事管理 子系统
财务管理 子系统
学生管理 子系统
教学管理 子系统
设备管理 子系统
……
系统管理
学籍管理
班级管理
成绩管理
数据查询
综合测评 ……
用 户 管 理
退 出 系 统
录 入 信 息
修 改 信 息
录 入 信 息
3
9
15
2013-12-11
《解析C程序设计》第5章 模块化程序设计
19
举一反三
例5-2 用弦截法求方程的根 x 5 x 16 x 80 0
3 2
【分析】 弦截法求方程的根的方法如下: ①取两个不同点x1、x2,如果f(x1)与 f(x2)符号相反,则(x1,x2)区间内必有一 个根。否则改变x1、x2的值使得f(x1)与 f(x2)异号为止。(注意:x1与x2的值不能 相差太大,确保之间只有一个根) ②连接f(x1)与f(x2)两点,此线(即弦) 交x轴于x点(计算见图)。再求出f(x)。 ③若f(x)与f(x1)同号,则将x作为新的x1。 若f(x)与f(x2)同号,则将x作为新的x2。 ④重复第②与第③步,直到| f(x)|<, 其中是一个很小的正数,如0.0001, 此时可以认为: f(x)≈0。
/* 定义min函数求三数的最小值 */