[2017年整理]函数—模块化程序设计

上传人:油条 文档编号:51940557 上传时间:2018-08-17 格式:PPT 页数:51 大小:239.50KB
返回 下载 相关 举报
[2017年整理]函数—模块化程序设计_第1页
第1页 / 共51页
[2017年整理]函数—模块化程序设计_第2页
第2页 / 共51页
[2017年整理]函数—模块化程序设计_第3页
第3页 / 共51页
[2017年整理]函数—模块化程序设计_第4页
第4页 / 共51页
[2017年整理]函数—模块化程序设计_第5页
第5页 / 共51页
点击查看更多>>
资源描述

《[2017年整理]函数—模块化程序设计》由会员分享,可在线阅读,更多相关《[2017年整理]函数—模块化程序设计(51页珍藏版)》请在金锄头文库上搜索。

1、高级语言程序设计第5章 函数 模块化程序设计 学习目标l模块化程序设计的思想,l自顶向下的实现方法,l系统函数库的使用方法,l自定义函数的方法,l参数传递方式,l函数调用过程,l接口与实现的分离,l开发大规模程序引言l如何对比较复杂、庞大的问题进行程序设计?例 如:绘制一个动物图案l头 正方型l躯干菱形l下肢矩型 建立一个学生信息管理系统l界面l建立信息l维护信息l查询信息解决比较大的问题要成千上万行代码怎么实现呢?l每个软件只有一个main(), main()当中能放多少行程序?l读多少行的程序能让你不头疼?l如果所有代码都在main()当中,怎么团队 合作?l如果代码都在一个文件中,怎么团

2、队合作 ?模块化程序设计思想l复杂问题分解成若干子问题模块,逐个解决每 个子问题l模块各司其职每个模块只负责一件事情,它可以更专心一个模块一个模块地完成,最后再将它们集成便于开发、调试、测试和维护等工作l开发人员各司其职按模块分配任务,职责明确并行开发,缩短开发时间 l分而治之(Wirth, 1971 ) 信息隐藏(Parnas, 1972)C语言用函数表示模块l分而治之函数把较大的任务分解成若干个较小的任务,并提炼出公用任务l代码复用程序员可以在其他函数的基础上构造程序,而不需要从头做起l信息隐藏(黑盒子)设计得当的函数可以把具体操作细节对程序中不需要知道它们的 那些部分隐藏掉,从而使整个程

3、序结构清楚l如把编程比做制造一台机器,函数就好比其零部 件可将这些“零部件”单独设计、调试、测试好,用时拿出来装配,再 总体调试。这些“零部件”可以是自己设计制造/别人设计制造/现在的标准产品函数的定义形式l返回值类型 函数名 (参数列表) l l 函数体 变量声明部分 语句部分 l l函数可以没有返回值,也可以没有参数,均用void表示如:void funcname(void)l参数列表的形式:参数类型 参数名称1,参数类型 参数名称2, 如:int maxium( int a, int b, int c) 具有三个参数,返回类型为int的函数或 void print( int a, int

4、 b) 如大家熟悉的int main(void)printf(。);实际上 printf,scanf也是这样定义的我们可以根据需要定义各种自己的函数。函数调用已经定义的函数要在某个地方使用才有意义,使用一个函 数称为函数调用。可以在main()中调用其它函数在任意一个函数中均可以调用其它函数。调用的形式:函数名(实际参数)-有参数时或函数名()- 无参数时问题1 绘制一个动物图案。l定义无参数、无返回类型的函数l如打印矩型的函数l void Rectangle (void) 。 使用已经定义的函数测试lvoid Rectangle (void) /这种函数叫做stub 树桩或存根 printf

5、(“rectangle okn”) ; /仅供测试 void diamond(void) printf(“diamond okn”); lint main(void)ll rectangle();/函数调用l diamond(); l rectangle();l return 0;l l被调用的函数必须先定义,即各个函数的定义现在一定要放在主函数之前( 等会我们会有另外的方法)问题2 学生信息系统l 同样每个功能模块用一个函数表示void create(void) void display(void) void modify(void) void query(void )void delete

6、(void )l写一个main测试它们问题3 :设计一个能求某个自然数以内的 自然数之和的函数模块有参数和返回值 的函数 l分析:首先取名 sum确定是否有返回值?如果有,是什么类型?确定是否有参数?几个?什么类型? l函数定义int sum(int n) int s=0; for(int i=1;i lint sum(int n) l l l lint main(void) lint m,s; scanf(“%d”, /准备一个实参ms = sum(m); /调用sumprintf(“ %dn”, s); /输出结果 /或者直接printf(“ %dn”, sum(m);return 0;

7、函数调用的注意事项1l有返回值时调用结果可以放到一个数值表达式中,如s = sum(m);也可以作为另一个函数调用的参数,如printf(“%dn“, sum(m);l无返回值时函数调用只能独立使用rectangle();函数调用的注意事项2l实参可以是符合参数类型的常量l如 s = sum(100);变量l如 s = sum(m);表达式l如 s = sum(m+10);实参与形参必须一致l函数调用时实参与形参必须保持参数个数相同参数类型相同,如果不同将自动转换参数顺序相同l当函数有多个表达式参数时,函数调用时实参求值的顺序可能是从左到右或从右到左,举例funcpara.cpp为了清楚起见,

8、需要对函数接口加以注释 说明/* 函数功能:实现功能函数参数: 参数1,表示参数2,表示函数返回值: */ 返回值类型 函数名(参数表) 函数体 return 表达式; 问题4 设计一个求两个数的平均值的函数 模块/*函数功能: 计算平均数函数入口参数: 整型x,存储第一个运算数整型y,存储第二个运算数函数返回值: 平均数 */ int average(int x, int y) int result;result = (x + y) / 2;return result; 函数执行的过程l函数调用时,实参值传递给形参变量l暂时离开调用者,去执行函数体l函数执行完毕后,回到调用的位置,继续 执行

9、调用者的语句使用了average函数的main() main() int a = 12; int b = 24; int ave;ave = average(a, b);printf(“average of %d and %d is %d.n“, a, b, ave); int Average(int x, int y) int result;result = (x + y) / 2;return result; main() int a = 12;int b = 24;int ave;ave = Average(a, b); printf(); 数据传递执行顺序问题5 设计一个判断某个数是否

10、是素数的 函数模块问题6 设计一个求某个数a的n次幂的函数 模块l可以定义各种各样的函数模块当问题比较复杂时,需要很多函数l所有自定义的函数都要放在main的前面, 这将喧宾夺主,本末倒置l解决的方法是在使用之前,先有函数的原型声明l实际上,头文件中包含了要使用的函数的 原型声明l 如stdio.h中包含了printf,scanf等跟I/O相 关的函数原型l某一模块定义为一个函数之后,在使用它 (函数调用)之前,先用函数原型声明。l使用函数原型声明,重写上述例题函数原型的作用l函数原型 如 int sum(int n);可以写成 int sum(int) l函数原型告诉编译器函数返回的数据类型

11、 ,函数接收的参数个数,参数类型及参数 顺序l强制转换参数类型小结:函数三要素l函数原型l函数调用l函数定义函数的分类l库函数ANSI/ISO C定义的标准库函数l符合标准的C语言编译器必须提供这些函数l函数的行为也要符合ANSI/ISO C的定义第三方库函数l由其它厂商自行开发的C语言函数库。不在标准范围 内,能扩充C语言的功能(图形、网络、数据库等)l自定义函数自己编写的函数l包装后,也可成为函数库,供别人使用数学函数库使用l常用的数学函数l sqrt(x) l exp(x) l log(x) 自然对数l log10(x)l fabs(x)l ceil(x) 不小于x的最小整数l floo

12、r(x) 不大于x的最大整数l pow(x,y)l sin(x) x为弧度l #includel找出所有小于500的构成直角三角形的三条边input a, b,cc = sqrt(pow(a,2)+pow(b,2)l求一元二次方程的根 a,b,c sqrt(b*b 4*a*c) 0 sqrt(b*b 4*a*c) 0 sqrt(b*b 4*a*c) =0l打印02PI之间sin(x)对照表l例sinecurve.cpp随机数的产生l rand() 产生一个0到 RAND_MAX(32767) 之间的一个 整数,伪随机数l需要包含 stdlib.hl l模拟掷硬币和骰子l缩放 rand()%6l

13、srand(unsigned) 为rand()设置种子ltime(NULL)参数NULL返回秒为单位的计算机系统的当 前时间。time.hl srand(time(NULL)l例rand.cppvoid Print(int flag)void Print(int flag) if (flag) if (flag) printf(“Right!n“); printf(“Right!n“);else elseprintf(“Not correct!n“); printf(“Not correct!n“); 小学生加法考试题/* 函数功能: 计算两整型数之和,如果与用户输入的答案相同,则返回1 ,否

14、则返回0函数参数: 整型变量a和b,分别代表被加数和加数函数返回值:当a加b的结果与用户输入的答案相同时,返回1,否则返回0 */ int AddTest(int a, int b) int answer; printf(“%d+%d=“, a, b); scanf(“%d“, if (a+b = answer) return 1; else return 0; 只答只答1 1次次main() int a, b, answer;printf(“ “Input a,b:“ “);scanf(“ “%d,%d“ “, answer = AddTest(a, b);Print(answer);do

15、while (answer = 0);小学生加法考试题 直到做对为止直到做对为止main() int answer,chance=0;doanswer = AddTest(a, b);Print(answer);chance+;while (answer = 0 小学生加法考试题 最多给最多给3 3次机会次机会int a,b;int error = 0;int score = 0; srand(time(NULL);for (int i=0; i10; i+) a = rand()%10 + 1;b = rand()%10 + 1;answer = AddTest(a, b);Print(answer);if (answer = 1)score = score + 10;elseerror+; 实验4:小学生加法考试题 随机出题随机出题连续做连续做1010道题道题统计分数统计分数通用小学生算术软件碰运气游戏-掷双骰子l游戏规则l 掷两个骰子,点数相加。第一次时如果和 为7或11则玩家赢

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 电子/通信 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号