模块化程序设计实例
- 格式:doc
- 大小:84.00 KB
- 文档页数:21
模块化程序设计模块化程序设计文档范本:1·简介1·1 目的1·2 背景1·3 目标读者2·模块化概述2·1 什么是模块化程序设计2·2 模块化程序设计的优势2·3 模块化程序设计的基本原则3·模块设计3·1 模块的定义3·2 模块的关键特征3·3 模块的划分原则3·4 模块的命名规范4·模块间通信4·1 模块之间的数据传递4·2 模块之间的函数调用4·3 模块间通信的设计原则4·4 模块间通信的常见问题及解决方案5·模块化开发流程5·1 模块化开发的步骤及流程图5·2 模块化开发的具体步骤解释5·3 模块化开发的注意事项6·实例案例6·1 案例一:网页开发模块化设计实例6·2 案例二:酒店管理系统模块化设计实例7·模块化程序测试7·1 模块测试的重要性7·2 模块测试的方法和步骤7·3 模块测试的常见问题及解决方案8·模块化程序维护8·1 模块化程序的维护性8·2 模块化程序维护的方法和步骤8·3 模块化程序维护的常见问题及解决方案9·附录9·1 附录一:模块化程序设计的相关工具和资源9·2 附录二:模块化程序设计的案例代码9·3 附录三:常用的模块化程序设计技术术语附件:●案例一:网页开发模块化设计实例代码●案例二:酒店管理系统模块化设计实例代码法律名词及注释:1·模块化程序设计:一种软件开发方法,通过将一个大型程序划分为独立的功能模块来增强代码的重用性和维护性。
2·模块:一个独立的、能够实现特定功能的程序代码单元。
模块化案例模块化设计是一种将系统分割成一系列相互独立、可重用的模块的软件设计方法。
通过将系统功能进行模块化,可以提高软件的可维护性、可拓展性和可重用性。
以下是一个关于模块化设计的案例。
假设有一个电商网站,需要实现用户管理、商品管理和订单管理等功能。
为了提高系统的可维护性和可拓展性,我们可以将系统分割成以下几个模块:用户模块、商品模块和订单模块。
用户模块负责处理用户的注册、登录、用户信息修改等功能。
该模块的接口包括注册接口、登录接口和修改信息接口等。
用户模块可以独立开发、测试和部署,并且可以在其他系统中重用。
商品模块负责处理商品的添加、删除、修改和查询等功能。
该模块的接口包括添加商品接口、删除商品接口和查询商品接口等。
商品模块可以独立开发、测试和部署,并且可以在其他系统中重用。
订单模块负责处理订单的创建、支付、取消和查询等功能。
该模块的接口包括创建订单接口、支付订单接口和取消订单接口等。
订单模块可以独立开发、测试和部署,并且可以在其他系统中重用。
通过模块化设计,系统的各个功能模块可以独立开发、测试和部署,不同模块之间的依赖关系明确,使得系统更加可维护和可拓展。
例如,当需要修改用户模块的功能时,不需要影响到其他模块的开发和部署。
而如果系统没有进行模块化设计,所有的功能都放在一个模块中,当需要修改一个功能时,很可能会影响到其他功能的正常运行。
除了提高系统的可维护性和可拓展性,模块化设计还可以提高系统的可重用性。
通过将各个功能模块独立开发,可以在其他系统中重用这些模块,避免了重复开发相同功能的问题。
总之,模块化设计是一种优秀的软件设计方法,能够提高系统的可维护性、可拓展性和可重用性。
在实际开发中,我们应该将系统功能进行模块化分割,将各个模块独立开发、测试和部署,遵循模块化设计原则,提高开发效率、降低维护成本。
实验六用函数实现模块化程序设计【实验目的】1. 函数编译程序的初步应用;2. 多个小函数的同时应用;3. 函数的递归调用;4. 数组作函数的参数。
【实验内容】实验一:最大公约数和最小公倍数的求解,源程序如下:#include<stdio.h>int f1(int x,int y){if(x%y!=0) return f1(y,x%y);else return y;}int f2(int x,int y){int r,i;if(x<y) {r=x;x=y;y=r;}for(i=1;i<=y;i++)if(i*x%y==0) {return (i*x);break;}}int main(){int m,n;printf("请输入两个整数:");scanf("%d%d",&m,&n);printf("%d与%d的最大公约数是:%d\n",m,n,f1(m,n));printf("%d与%d的最小公倍数是:%d\n",m,n,f2(m,n));return 0;}结论:结果正确。
实验二:方程根的求解,源程序如下:#include<stdio.h>#include<math.h>double f1(float m,float n,float q){double r,x1,x2;r=n*n-4*m*q;if(m==0) x1=-q/n,printf("方程有唯一实根:%lf\n",x1);else x1=(-n+sqrt(r))/(2*m),x2=(-n-sqrt(r))/(2*m),printf("方程有两个不等的实根:%lf\t%lf\n",x1,x2);return 0;}double f2(float m,float n,float q){double x1;if(n!=0) x1=-n/(2*m),printf("方程有两个相等实根:%lf\n",x1);elseif(q==0) printf("方程的根为任意数\n");else printf("方程无解\n");return 0;}double f3(float m,float n,float q){double r,p,d;r=n*n-4*m*q;p=sqrt(-r)/(2*m),d=-n/(2*m);printf("方程有两个复根:");printf("%lf+%lfi\t",d,p);printf("%lf-%lfi\n",d,p);return 0;}int main(){float r,a,b,c;printf("请输入方程的系数:");scanf("%f%f%f",&a,&b,&c);r=b*b-4*a*c;if(r>0) f1(a,b,c);if(r==0) f2(a,b,c);if(r<0) f3(a,b,c);return 0;}结论:结果正确。
模块化编程案例模块化编程是一种将程序划分为独立、可重用、可测试的模块的编程方法。
它能够提高代码的可维护性、可读性和可复用性,并且使开发过程更加高效。
下面是一些关于模块化编程的案例:1. 案例一:图书管理系统在一个图书馆的图书管理系统中,可以将不同功能的代码模块化,比如图书的借阅模块、归还模块、查询模块等。
每个模块都有自己的功能和接口,可以独立进行开发和测试。
这样,当需要修改或添加某个功能时,只需修改对应的模块,而不影响其他模块的功能。
2. 案例二:购物网站在一个购物网站的后台管理系统中,可以将不同功能的代码模块化,比如商品管理模块、订单管理模块、用户管理模块等。
每个模块都有自己的功能和接口,可以独立进行开发和测试。
这样,当需要修改或添加某个功能时,只需修改对应的模块,而不影响其他模块的功能。
3. 案例三:游戏开发在游戏开发中,可以将不同功能的代码模块化,比如角色控制模块、地图生成模块、碰撞检测模块等。
每个模块都有自己的功能和接口,可以独立进行开发和测试。
这样,当需要修改或添加某个功能时,只需修改对应的模块,而不影响其他模块的功能。
4. 案例四:音乐播放器在一个音乐播放器的软件中,可以将不同功能的代码模块化,比如音乐搜索模块、播放控制模块、歌词显示模块等。
每个模块都有自己的功能和接口,可以独立进行开发和测试。
这样,当需要修改或添加某个功能时,只需修改对应的模块,而不影响其他模块的功能。
5. 案例五:社交媒体平台在一个社交媒体平台的开发中,可以将不同功能的代码模块化,比如用户管理模块、信息发布模块、评论管理模块等。
每个模块都有自己的功能和接口,可以独立进行开发和测试。
这样,当需要修改或添加某个功能时,只需修改对应的模块,而不影响其他模块的功能。
6. 案例六:电子邮件客户端在一个电子邮件客户端的开发中,可以将不同功能的代码模块化,比如邮件接收模块、邮件发送模块、邮件搜索模块等。
每个模块都有自己的功能和接口,可以独立进行开发和测试。
Java模块化是一个将大型应用程序分解为更小、更易于管理的组件的过程。
这有助于降低复杂性,提高代码的可重用性和可维护性。
Java模块化通常通过使用Java模块系统(Jigsaw项目)来实现,该系统是Java 9及更高版本的一部分。
下面是一个简单的Java模块化示例,该示例展示了如何创建和使用模块。
步骤1:创建模块首先,我们需要创建两个模块:module-a和module-b。
每个模块都有自己的源代码目录和模块描述符文件(module-info.java)。
module-asrc/main/java/com/example/modulea/ModuleA.javajavapackage com.example.modulea;public class ModuleA {public static void printMessage() {System.out.println("Hello from Module A!");}}src/main/java/module-info.javajavamodule com.example.modulea {exports com.example.modulea;}module-bsrc/main/java/com/example/moduleb/ModuleB.javajavapackage com.example.moduleb;import com.example.modulea.ModuleA; // 导入module-a中的类public class ModuleB {public static void main(String[] args) {ModuleA.printMessage(); // 调用module-a中的方法System.out.println("Hello from Module B!");}}src/main/java/module-info.javajavamodule com.example.moduleb {requires com.example.modulea; // 声明对module-a的依赖}步骤2:构建模块使用Maven或Gradle等构建工具来构建模块。
模块化设计案例范文在现代软件开发中,模块化设计是一种被广泛采用的方法,它将软件系统分解为相互独立的模块,每个模块具有自己的功能和特定的责任。
模块化设计的目标是提高代码的可维护性、重用性和可理解性。
下面是一个关于图书管理系统的模块化设计案例。
首先,我们可以将图书管理系统分为三个模块:图书管理、用户管理和借还管理。
每个模块负责不同的功能,这样可以降低系统的复杂性,并且便于单独维护和扩展。
用户管理模块负责管理用户的信息,包括用户的基本信息如姓名、年龄、性别等,以及用户的借书记录。
该模块可以提供用户的增加、删除、修改和查询功能,同时还可以提供用户的按照不同的属性进行筛选和排序的功能。
借还管理模块负责借书和还书的管理,包括借出图书、归还图书、续借图书等操作。
该模块可以提供根据读者编号查询借还信息、统计读者的借书量和归还情况等功能。
同时还可以提供超期检测和罚款计算等相关功能。
这三个模块之间可以通过接口进行交互和通信,例如图书管理模块可以调用用户管理模块的接口来获取用户的信息,借还管理模块可以调用图书管理模块的接口来获取图书的信息。
为了更好地实现模块化设计,我们可以采用面向对象的编程方法,将每个模块设计为一个类,并使用类之间的继承和组合关系来体现模块之间的关系。
同时,还可以使用设计模式来提高模块的可复用性和灵活性,例如可以使用工厂模式来创建图书和用户对象,使用观察者模式来实现借还管理模块和图书管理模块的通信等。
总结起来,模块化设计是一种分解复杂系统的方法,将系统划分为相互独立的模块,每个模块具有自己的功能和责任。
本文以图书管理系统为例,介绍了如何使用模块化设计来提高软件系统的可维护性、重用性和可理解性。
通过设计合理的模块接口、使用面向对象编程和设计模式,可以更好地实现模块化设计的目标。
模块化设计不仅在图书管理系统中适用,而且在其他软件开发项目中也是一种常用的设计方法。
一个理想的模块化程序设计案例吕振洪浙江师范大学,浙江金华,321004jhlzhxch@摘要:模块化的抽象思维能力在项目开发过程中至关重要。
但在C语言的教学、训练中,鲜有好的项目让学生理解、消化用模块化程序设计对解决问题带来的影响和优势。
本文通过“Turbo C 2.0菜单系统”这案例,把项目分解成一些小模块,先让学生分步实现各模块,后按模块化程序设计的思路再优化原实现,最后逐步组装成“菜单系统”这项目。
项目实施过程紧凑,代码简洁且可读性好。
该案例也可应用于8086系列汇编语言课程的教学。
关键词:模块化程序赫斯基,菜单系统,优化,数据结构1引言在C语言教学中,教师需解决“教学中的理论内容在实际中如何应用?”这问题。
教材中鲜有较好的案例来指导模块化程序设计[1]。
本文以Turbo C 2.0菜单系统为例,利用“→”、“←”、“↑”、“↓”、“Esc”、“Enter”、“Alt-X”这些键在Windows的控制台环境下来模拟完成菜单的操作。
该菜单系统的逻辑结构如下图一:图一 Turbo C 2.0的逻辑菜单目前的面向对象的程序设计语言要实现这样的菜单已非常简单。
但对C语言的初学者来说,通过这案例可在三个方面来强化模块化设计:一是实现Turbo C系统该怎样模块化设计;二是菜单系统的模块化设计;三是实现小的功能时的模块化设计。
2菜单系统的数据组织我们希望所编写的菜单程序能处理各种各样的菜单,这需要有好的数据结构[3]。
一方面要有好的菜单存储结构,另一方面是满足菜单系统选择处理所需的数据模型[2]。
2.1 菜单的存储结构从菜单系统的逻辑结构图可看出:主菜单里包含子菜单,子菜单里含子菜单或菜单项。
根据这样的递归结构,我们可用如下的存储结构来解决:typedef struct MenuItemStru{ int SubMenuItemCount;int SubMenuItemWidth;MenuItemStru * pSubMenuAddr; int MenuItemStrWidth;char * MenuItemStrAddr;}上述结构分别表示:子菜单数目、子菜单的字符宽度、指向子菜单的指针、菜单项的字符宽度、菜单项的标题。
模块化设计案例模块化设计是一种将系统分解为若干相互独立的模块,并且这些模块之间具有明确的接口和依赖关系的设计方法。
模块化设计可以提高系统的可维护性、可扩展性和可重用性,是软件开发中非常重要的一环。
下面我们将通过一个实际的案例来介绍模块化设计的应用。
案例背景。
假设我们需要开发一个在线购物系统,该系统需要包括商品展示、购物车管理、订单管理等功能模块。
为了提高系统的可维护性和可扩展性,我们决定采用模块化设计的方式来进行系统设计和开发。
模块划分。
首先,我们需要对系统进行模块划分。
根据功能的不同,我们将系统划分为商品模块、购物车模块和订单模块。
商品模块负责展示商品信息,包括商品的名称、价格、图片等;购物车模块负责管理用户的购物车信息,包括加入商品、删除商品、修改商品数量等操作;订单模块负责处理用户的订单信息,包括生成订单、支付订单、取消订单等操作。
模块接口定义。
接下来,我们需要定义模块之间的接口。
例如,商品模块需要向购物车模块提供添加商品的接口,购物车模块需要向订单模块提供生成订单的接口。
通过定义清晰的接口,可以降低模块之间的耦合度,提高系统的灵活性。
模块依赖管理。
在模块化设计中,模块之间可能存在依赖关系。
我们需要明确每个模块的依赖关系,并且合理管理模块之间的依赖。
例如,订单模块可能依赖于购物车模块的信息,因此需要在设计和开发过程中合理处理这种依赖关系。
模块实现与集成。
最后,我们需要对每个模块进行实现,并进行集成测试。
在实现每个模块时,需要遵循模块化设计的原则,保持模块的独立性和可重用性。
在集成测试阶段,需要验证各个模块之间的接口和依赖关系是否正确,确保整个系统的功能正常运行。
总结。
通过模块化设计,我们成功地将系统分解为若干相互独立的模块,并且定义了模块之间的接口和依赖关系。
这种设计方法使得系统具有良好的可维护性、可扩展性和可重用性,为系统的开发和维护带来了诸多便利。
结语。
模块化设计是软件开发中非常重要的一环,它可以提高系统的灵活性和可维护性。
模块化设计应用实例模块化设计是一种将系统划分为独立的组件或模块的设计方法,每个模块负责特定的功能或任务,通过模块之间的相互协作来构建完整的系统。
这种设计方法可以提高系统的可维护性、可扩展性和可重用性,减少开发时间和成本。
以下是一些模块化设计应用实例。
1.软件开发模块化设计在软件开发中得到了广泛应用。
通过将软件系统划分为独立的模块,开发人员可以同时进行模块的开发,提高开发效率。
而且,当需要修改或更新系统时,只需修改或替换特定的模块,而不会影响其他模块的运行。
2.电子商务网站在电子商务网站中,通常需要处理多个功能模块,如用户管理、商品管理、订单管理等。
通过模块化设计,各个功能模块可以独立开发和维护,同时也方便进行功能的扩展和更新。
3.游戏开发游戏开发是一个复杂的过程,涉及多个功能模块,如图形渲染、物理模拟、碰撞检测等。
通过模块化设计,可以将这些功能模块分别实现,并通过接口进行交互。
这样的设计方法可以提高游戏开发的效率和可维护性。
4.机械设备控制系统在机械设备控制系统中,需要同时处理多个控制任务,如运动控制、传感器数据采集等。
通过将不同的控制任务划分为独立的模块,可以简化系统的开发和维护,并提高系统的稳定性和可靠性。
5.车辆诊断系统车辆诊断系统用于检测和修复车辆故障。
通过模块化设计,可以将系统划分为不同的模块,如故障检测模块、故障诊断模块、修复建议模块等。
这样的设计方法可以提高系统的故障检测和诊断能力,并使系统更易于扩展和更新。
6.智能家居系统智能家居系统通常包括多个功能模块,如照明控制、温度控制、安防监控等。
通过模块化设计,可以将这些功能模块独立开发和维护,同时也方便进行功能的扩展和更新。
此外,不同的模块可以通过网络相互协作,实现更智能、更便捷的家居控制。
总之,模块化设计在多个领域有着广泛的应用。
通过将系统划分为独立的模块,可以提高系统的可维护性、可扩展性和可重用性,减少开发时间和成本。
无论是软件开发、电子商务网站还是机械设备控制系统,模块化设计都能够帮助开发人员更高效地组织和管理系统的功能模块。
实验7 用函数实现模块化程序设计班级电信132 学号201315100209 姓名许春欢一、实验目的①掌握定义函数的方法;②掌握函数实参与形参的对应关系以及“值传递”的方式;③掌握函数的嵌套调用和递归调用的方法;④掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。
⑤学习对多文件程序的编译和运行。
二、实验内容用函数实现以下程序并调试。
1、写一个函数,求10个学生的平均成绩。
#include <stdio.h>#define N 10void main( ){float a(float y[ ],int M);int i;float cj[N],pjcj;printf("输入%d个学生的成绩:\n",N);for(i=0;i<N;i++)scanf("%f",&cj[i]);pjcj=a(cj,N);printf("平均成绩是%5.2f\n",pjcj);}float a(float y[ ],int M){int i;float pj,sum=0;for(i=0;i<10;i++)sum=sum+y[i];pj=sum/M;return(pj);}2、写一个函数,用“起泡法”对输入的10个数字由小到大排序。
#include<stdio.h>#include<string.h>int str[10];int main(){ void sort(int str[]);int i,str[10];printf("input 10 nubers:\n");for(i=0;i<10;i++)scanf("%d",&str[i]);printf("\n");sort(str);printf("string sorted:\n");for(i=0;i<10;i++)printf("%3d",str[i]);printf("\n");return 0;}void sort(int str[]){int i,j,t;for(j=0;j<9;j++)for(i=0;i<9-j;i++)if(str[i]>str[i+1]){t=str[i];str[i]=str[i+1];str[i+1]=t;}}3、求方程ax2+bx+c=0的根,用三个函数分别求当b2-4ac大于0、等于0和小于0时的根,并输出结果。
列举模块化实例模块化是指将一个系统或产品拆分成多个独立的模块,每个模块负责完成特定的功能。
模块化的设计可以提高代码的可维护性、重用性和可测试性,同时也方便团队协作和开发进度控制。
下面将列举几个模块化实例,展示模块化在不同领域的应用。
1. 软件开发中的模块化在软件开发中,模块化是一种常见的设计思想。
通过将软件系统拆分成多个模块,每个模块专注于完成特定的功能,可以提高代码的可维护性和重用性。
例如,一个电子商务网站可以拆分成用户管理模块、商品管理模块、订单管理模块等,每个模块独立开发和测试,最后集成到一起形成完整的系统。
这种模块化的设计可以提高开发效率,减少代码冗余,降低系统复杂度。
2. 硬件设计中的模块化在硬件设计中,模块化同样是一种常见的设计原则。
例如,一个计算机主板可以拆分成CPU模块、内存模块、输入输出模块等,每个模块负责不同的功能。
这种模块化的设计可以方便硬件的维护和升级,同时也提高了系统的可扩展性。
此外,模块化还可以加速硬件的设计和生产过程,不同模块可以并行开发和测试,最后集成到一起形成完整的系统。
3. 电子产品中的模块化在电子产品的设计中,模块化也是一种常见的方法。
例如,一台智能手机可以拆分成处理器模块、摄像头模块、屏幕模块等,每个模块负责不同的功能。
这种模块化的设计可以方便产品的维修和升级,同时也提高了产品的灵活性。
此外,模块化还可以降低产品的制造成本,不同模块可以由不同的供应商生产,最后组装到一起形成完整的产品。
4. 建筑设计中的模块化在建筑设计中,模块化是一种新兴的设计方法。
通过将建筑物拆分成多个标准化的模块,可以提高建筑的施工效率和质量控制。
例如,一个办公楼可以采用预制混凝土模块化设计,每个模块负责一个房间或一个楼层,可以在工厂中预先制造好,然后现场组装。
这种模块化的设计可以减少现场施工时间,降低成本,同时也提高了建筑物的可持续性。
5. 汽车制造中的模块化在汽车制造中,模块化也是一种常见的设计方法。
c++模块化开发实例
C++是一种强大的编程语言,能够支持模块化开发,使得程序开发更加高效和灵活。
本文介绍了几个C++模块化开发的实例,包括: 1.使用命名空间进行模块化开发:通过使用命名空间,将函数和变量进行分类,从而使得代码更加清晰和易于维护。
2.使用类进行模块化开发:通过将相关的函数和数据封装在一个类中,实现模块化开发和代码复用。
3.使用模板进行模块化开发:通过定义模板类和模板函数,实现通用的代码逻辑,从而使得程序更加灵活和可扩展。
4.使用库进行模块化开发:通过使用已有的库,可以集成一些通用的功能,从而快速地实现自己的需求。
以上几种模块化开发的实例都可以提高程序的效率和可维护性,对于C++的开发者来说都是非常有用的。
- 1 -。
9 .5 模块化程序设计实例《程序设计基础》(基于C语言讲解)石光华编著—北京: 清华大学出版社下面以设计一个简单的成绩管理软件为例,一步一步地按模块化程序设计方法进行设计。
1 .定义问题设计一个成绩管理软件,其基本功能包括:输入成绩,成绩加分,计算平均成绩,找出最高分,找出最低分,输出成绩等。
2 .确定组成程序的模块根据成绩管理软件的功能,确定软件的基本模块包括:输入模块,加分模块,平均分模块,最高分模块,最低分模块,输出模块等。
142 程序设计基础3 .绘制程序结构图成绩管理软件的结构图如图9-5所示。
图9-5 成绩管理软件结构图4 .流程图用流程图确定主程序的逻辑结构,如图9-6所示。
在流程图中,istate 的作用是记录是否已经输入成绩。
istate 的使用有如下两种方式。
(1) 作为全局变量使用。
此时istate可以在所有模块中改变其值,主程序更简洁,但可能产生边际效应。
(2) 作为主程序的局部变量使用。
此时istate只能在主程序中改变其值。
在主程序中可以直观地看到其变化,能够防止边际效应。
采用方式(2)的主程序如下。
#include < stdio .h>#define SIZE 10void main(){int iscore[SIZE] ={0};int key= - 1;int iresult=0;float fresult=0;int istate=0;printf(″1:Input scores;\n″);第9章模块化程序设计 143图9-6 成绩管理软件主程序流程图printf(″2:Output scores;\n″);printf(″3:Count for the max score;\n″); printf(″4:Count for the minimum score;\n″); printf(″5:Count for the total score;\n″); printf(″6:Count for theaverage score;\n″); printf(″- 1:Exit .\n″);while(1){printf(″Please input your choose:″);scanf(″%d″,&key);if (key = = - 1)144 程序设计基础switch(key){case1:istate=input_all_numbers(iscore,SIZE);break;case2:if (istate = =0)printf(″ERROR:You must input scoresfirst ! \n″); elseoutput_all_numbers(iscore,SIZE);break;case3:if (istate = =0)printf(″ERROR:You must input scoresfirst ! \n″); else{iresult=count_for_max(iscore,SIZE);printf(″the max score is %d\n″,iresult);}break;case4:if (istate = =0)printf(″ERROR:You must input scoresfirst ! \n″);{iresult=count_for_min(iscore,SIZE);printf(″the min score is %d\n″,iresult);}break;case5:if (istate = =0)printf(″ERROR:You must input scoresfirst ! \n″); else第9章模块化程序设计 145{iresult=count_for_total(iscore,SIZE);printf(″the total score is %d\n″,iresult);}break;case6:if (istate = =0)printf(″ERROR:You must input scoresfirst ! \n″); else{fresult=count_for_average(iscore,SIZE);printf(″the average score is % .2f\n″,fresult); }default:printf(″ERROR:Input error,please input again! \n″);}}}5 .编写算法为程序结构图中每个模块编写算法。
实验五模块化的程序设计实验目的(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是函数名,函数名应能体现函数的功能,以增强程序的可读性,这个函数的功能是打印一个固定的三角形。
9 .5 模块化程序设计实例《程序设计基础》(基于C语言讲解)石光华编著—北京: 清华大学出版社下面以设计一个简单的成绩管理软件为例,一步一步地按模块化程序设计方法进行设计。
1 .定义问题设计一个成绩管理软件,其基本功能包括:输入成绩,成绩加分,计算平均成绩,找出最高分,找出最低分,输出成绩等。
2 .确定组成程序的模块根据成绩管理软件的功能,确定软件的基本模块包括:输入模块,加分模块,平均分模块,最高分模块,最低分模块,输出模块等。
142 程序设计基础3 .绘制程序结构图成绩管理软件的结构图如图9-5所示。
图9-5 成绩管理软件结构图4 .流程图用流程图确定主程序的逻辑结构,如图9-6所示。
在流程图中,istate 的作用是记录是否已经输入成绩。
istate 的使用有如下两种方式。
(1) 作为全局变量使用。
此时istate可以在所有模块中改变其值,主程序更简洁,但可能产生边际效应。
(2) 作为主程序的局部变量使用。
此时istate只能在主程序中改变其值。
在主程序中可以直观地看到其变化,能够防止边际效应。
采用方式(2)的主程序如下。
#include < stdio .h>#define SIZE 10void main(){int iscore[SIZE] ={0};int key= - 1;int iresult=0;float fresult=0;int istate=0;printf(″1:Input scores;\n″);第9章模块化程序设计 143图9-6 成绩管理软件主程序流程图printf(″2:Output scores;\n″);printf(″3:Count for the max score;\n″); printf(″4:Count for the minimum score;\n″); printf(″5:Count for the total score;\n″); printf(″6:Count for theaverage score;\n″); printf(″- 1:Exit .\n″);while(1){printf(″Please input your choose:″);scanf(″%d″,&key);if (key = = - 1)144 程序设计基础switch(key){case1:istate=input_all_numbers(iscore,SIZE);break;case2:if (istate = =0)printf(″ERROR:You must input scoresfirst ! \n″); elseoutput_all_numbers(iscore,SIZE);break;case3:if (istate = =0)printf(″ERROR:You must input scoresfirst ! \n″); else{iresult=count_for_max(iscore,SIZE);printf(″the max score is %d\n″,iresult);}break;case4:if (istate = =0)printf(″ERROR:You must input scoresfirst ! \n″);{iresult=count_for_min(iscore,SIZE);printf(″the min score is %d\n″,iresult);}break;case5:if (istate = =0)printf(″ERROR:You must input scoresfirst ! \n″); else第9章模块化程序设计 145{iresult=count_for_total(iscore,SIZE);printf(″the total score is %d\n″,iresult);}break;case6:if (istate = =0)printf(″ERROR:You must input scoresfirst ! \n″); else{fresult=count_for_average(iscore,SIZE);printf(″the average score is % .2f\n″,fresult); }default:printf(″ERROR:Input error,please input again! \n″);}}}5 .编写算法为程序结构图中每个模块编写算法。
在前面的学习中,已经学过如何加分,计算平均分,以及查找最高、最低分,在这里就不再画出流程图了。
6 .审查算法最后审查整个算法,直到没有任何逻辑错误。
7 .编程调试审查算法后,即可进行编程调试。
【例9-12】成绩管理软件的完整程序。
/ *name:a management system about scores*// *creat:stone,2004/ 3/ 8*/146 程序设计基础/ *modify:stone,2004/ 3/ 20*// *version:1 .0#include < stdio .h>#define SIZE 5 / *定义成绩个数的符号常量*/int input_all_numbers(int iscore[],int isize);void output_all_numbers(int iscore[],int isize);int count_for_max(int iscore[],int isize);int count_for_min(int iscore[],int isize);int count_for_total(int iscore[],int isize);floatcount_for_average(int iscore[],int isize);void main(){int iscore[SIZE] ={0};int key= - 1;int iresult=0;float fresult=0;/ *用于区分是否已经输入数据的标志,0表示未输入,1表示已经输入*/int istate=0;/ *主菜单,可以选择完成不同的成绩统计功能*/printf(″**********************************************\n″);printf(″This is a management system about scores .\n\t\tWELCOME ! \n″); printf(″**********************************************\n″);printf(″1:Input scores;\n″);printf(″2:Output scores;\n″);printf(″3:Count for the max score;\n″);printf(″4:Count for the minimum score;\n″);printf(″5:Count for the total score;\n″);printf(″6:Count for theaverage score;\n″);printf(″- 1:Exit .\n″);while(1)printf(″Please input your choose:″);scanf(″%d″,&key);/ *根据输入选择的不同,分别进行不同的处理*/第9章模块化程序设计 147if (key = = - 1)break;switch(key){case 1:istate=input_all_numbers(iscore,SIZE);break;case 2:if (istate = =0)printf(″ERROR:You must input scores first ! \n″); elseoutput_all_numbers(iscore,SIZE);break;case 3:if (istate = =0)printf(″ERROR:You must input scoresfirst ! \n″); else{iresult=count_for_max(iscore,SIZE);printf(″the max score is %d\n″,iresult);break;case 4:if (istate = =0)printf(″ERROR:You must input scores first ! \n″); else{iresult=count_for_min(iscore,SIZE);printf(″the min score is %d\n″,iresult);}break;case 5:if (istate = =0)printf(″ERROR:You must input scores first ! \n″); 148 程序设计基础else{iresult=count_for_total(iscore,SIZE);printf(″the total score is %d\n″,iresult);}break;case 6:if (istate = =0)printf(″ERROR:You must input scores first ! \n″);else{fresult=count_for_average(iscore,SIZE);printf(″the average score is % .2f\n″,fresult);}break;default:printf(″ERROR:Input error,please input again! \n″); }}}/ *功能: 输入学生成绩*/int input_all_numbers(int iscore[],int isize){int iindex=0;printf(″please input %d scores:\n″,isize);for(iindex=0; iindex{scanf(″%d″,&iscore[iindex]);}return1;}/ *功能: 输出学生成绩*/第9章模块化程序设计 149void output_all_numbers(int iscore[],int isize){int iindex=0;for(iindex=0; iindex{printf(″iscore[%2d] = %3d\n″,iindex,iscore[iindex]);}}/ *功能: 计算最高分*/int count_for_max(int iscore[],int isize){int imax=iscore[0];int iindex=0;for(iindex=0; iindex{if (imax<ISCORE[IINDEX])< p>imax=iscore[iindex];}return imax;}/ *功能: 计算最低分*/int count_for_min(int iscore[],int isize){int imin=iscore[0];int iindex=0;for(iindex=0; iindex{if (imin>iscore[iindex])imin=iscore[iindex];}return imin;150 程序设计基础}/ *功能: 计算总分*/int count_for_total(int iscore[],int isize) {int iindex=0;int isum=0;for(iindex=0; iindex{isum=isum+iscore[iindex];}return isum;}/ *功能: 计算平均分*/floatcount_for_average(int iscore[],int isize) {int iindex=0;float faverage=0;for(iindex=0; iindex{faverage=faverage+iscore[iindex];}faverage=faverage/ isize;returnfaverage;}由于 C语言中,常用的输入语句 scanf()存在缺陷,在1 .0 版中,输入成绩时,如果误按了字母键,则程序会出现异常。