分享
分享赚钱 收藏 举报 版权申诉 / 51

类型函数—模块化程序设计.ppt

  • 上传人:j35w19
  • 文档编号:6861444
  • 上传时间:2019-04-25
  • 格式:PPT
  • 页数:51
  • 大小:239.50KB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    函数—模块化程序设计.ppt
    资源描述:

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

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

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

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

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

    6、ete(void ) 写一个main测试它们,问题3 :设计一个能求某个自然数以内的自然数之和的函数模块有参数和返回值的函数,分析: 首先取名 sum 确定是否有返回值?如果有,是什么类型? 确定是否有参数?几个?什么类型? 函数定义 int sum(int n) int s=0;for(int i=1;i=n;i+).s=s+i;return s; 此函数有一个整型参数,有一个整型的返回值 在函数定义中的参数称为形参,只是一个形式定义,这个参数的具体值由调用者通过实参给定,实参可以是一个与形参类型一致的表达式。,测试sum函数 驱动程序,#include int sum(int n) int

    7、 main(void) int m,s; scanf(“%d”, ,函数调用的注意事项1,有返回值时 调用结果可以放到一个数值表达式中,如s = sum(m); 也可以作为另一个函数调用的参数,如printf(“%dn“, sum(m); 无返回值时 函数调用只能独立使用rectangle();,函数调用的注意事项2,实参可以是符合参数类型的 常量 如 s = sum(100); 变量 如 s = sum(m); 表达式 如 s = sum(m+10);,实参与形参必须一致,函数调用时实参与形参必须保持 参数个数相同 参数类型相同,如果不同将自动转换 参数顺序相同 当函数有多个表达式参数时,函

    8、数调用时 实参求值的顺序可能是从左到右 或从右到左,举例funcpara.cpp,为了清楚起见,需要对函数接口加以注释说明,/* 函数功能:实现功能函数参数: 参数1,表示参数2,表示函数返回值: */ 返回值类型 函数名(参数表) 函数体 return 表达式; ,问题4 设计一个求两个数的平均值的函数模块,/*函数功能: 计算平均数函数入口参数: 整型x,存储第一个运算数整型y,存储第二个运算数函数返回值: 平均数 */ int average(int x, int y) int result;result = (x + y) / 2;return result; ,函数执行的过程,函数调

    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); ,问题5 设计一个判断某个数是否是素数的函数模块,问题6 设计一个求某个数a的n次幂的函数模块,可以定义各种各样的函数模块,当问题比较复杂时,需要很多函数,所有自定义的函数都要放在main的前面,这将喧宾夺主,本末倒置 解决的方法是

    10、 在使用之前,先有函数的原型声明实际上,头文件中包含了要使用的函数的原型声明如stdio.h中包含了printf,scanf等跟I/O相关的函数原型,某一模块定义为一个函数之后,在使用它(函数调用)之前,先用函数原型声明。使用函数原型声明,重写上述例题,函数原型的作用,函数原型 如 int sum(int n); 可以写成 int sum(int) 函数原型告诉编译器函数返回的数据类型,函数接收的参数个数,参数类型及参数顺序 强制转换参数类型,小结:函数三要素,函数原型 函数调用 函数定义,函数的分类,库函数 ANSI/ISO C定义的标准库函数 符合标准的C语言编译器必须提供这些函数 函数的

    11、行为也要符合ANSI/ISO C的定义 第三方库函数 由其它厂商自行开发的C语言函数库。不在标准范围内,能扩充C语言的功能(图形、网络、数据库等) 自定义函数 自己编写的函数 包装后,也可成为函数库,供别人使用,数学函数库使用,常用的数学函数sqrt(x) exp(x) log(x) 自然对数log10(x)fabs(x)ceil(x) 不小于x的最小整数floor(x) 不大于x的最大整数pow(x,y)sin(x) x为弧度,#include,找出所有小于500的构成直角三角形的三条边 input a, b,c c = sqrt(pow(a,2)+pow(b,2) 求一元二次方程的根a,b

    12、,csqrt(b*b 4*a*c) 0 sqrt(b*b 4*a*c) 0sqrt(b*b 4*a*c) =0 打印02PI之间sin(x)对照表 例sinecurve.cpp,随机数的产生,rand() 产生一个0到 RAND_MAX(32767) 之间的一个整数,伪随机数 需要包含 stdlib.h模拟掷硬币和骰子 缩放 rand()%6srand(unsigned) 为rand()设置种子 time(NULL)参数NULL返回秒为单位的计算机系统的当前时间。 time.hsrand(time(NULL) 例rand.cpp,void Print(int flag) if (flag) p

    13、rintf(“Right!n“);elseprintf(“Not correct!n“); ,小学生加法考试题,/* 函数功能: 计算两整型数之和,如果与用户输入的答案相同,则返回1,否则返回0函数参数: 整型变量a和b,分别代表被加数和加数函数返回值:当a加b的结果与用户输入的答案相同时,返回1,否则返回0 */ int AddTest(int a, int b) int answer;printf(“%d+%d=“, a, b);scanf(“%d“, ,main() int a, b, answer;printf(“Input a,b:“);scanf(“%d,%d“, ,do whil

    14、e (answer = 0);,小学生加法考试题,main() int answer,chance=0;doanswer = AddTest(a, b);Print(answer); chance+;while (answer = 0 ,小学生加法考试题,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 =

    15、 score + 10;elseerror+; ,实验4:小学生加法考试题,通用小学生算术软件,碰运气游戏-掷双骰子,游戏规则掷两个骰子,点数相加。第一次时如果和为7或11则玩家赢;如果得到的和适2、3或12,玩家输;如果和为4、5、6、8、9或10,用这个和作为游戏的点数。要想赢,继续掷,直到取得自己的点数为止。但是如果掷出了7点玩家则输。,返回多个值的函数,可以通过函数的返回语句返回某个类型的计算值,但是只能返回一个。 实例研究:交互两个数的函数 如何交换两个数 swap.cpp 可见函数的参数传递是单向的,不能通过简单的函数参数传递实现实参值的改变 为什么不能,其原因是传值,怎么样才能反

    16、向传递呢?,参数用变量的地址 refswap.cpp 怎么声明存放变量地址的变量参数? 指针变量声明符 *int *aPtr;int a;二者不同aPtr = a = 10; 二者效果相同,可以看出,通过指针参数可以实现返回多个结果再看一个实例 设计一个函数,可以处理学生成绩的简单计算和求平均值。void gradeStatistics( int * numbers, float * ave),变量的作用域,变量是有生命的,有范围的 指在源程序中定义变量的位置及其能被读写访问的范围 分为 局部变量(Local Variable) 全局变量(Global Variable ),局部变量(Loca

    17、l),局部变量 在语句块内定义的变量 形参也是局部变量 特点 定义时不会自动初始化,除非程序员指定初值 进入语句块时获得内存,仅能由语句块内语句访问,退出语句块时释放内存,不再有效 并列语句块各自定义的同名变量互不干扰,全局变量(Global),全局变量 在所有函数之外定义的变量 特点 在程序中定义它的位置以后都有效 在定义点之前或在其他文件中引用,应该进行如下声明:extern 类型名 变量名; 从程序运行起即占据内存,程序运行过程中可随时访问,程序退出时释放内存 使函数之间的数据交换更容易,也更高效 但是并不推荐使用,尽量少用 因为谁都可以改写全局变量,所以很难确定是谁改写了它,存储类型,

    18、一个完整的变量说明格式如下:存储类型 数据类型 变量名 如: static int x , y ; C程序的存储类别有: auto型(自动变量型) static型(静态变量型) register型(寄存器型),自动变量(auto),“自动”体现在 进入语句块时自动申请内存,退出时自动释放内存 标准定义格式auto 类型名 变量名; 动态局部变量 缺省的存储类型 不初始化时,值是不确定的,静态变量(static),函数的内部变量在函数退出后失效(内存释放)。再次进入函数,变量重新定义 每次函数执行都建立一个全新的执行环境,不受其它函数的干扰 把此变量定义为static,则变量的值可以保存到下次进

    19、入函数 static int i; 静态变量自动初始化为0,寄存器变量(register),寄存器是CPU内的高速但容量有限的存储器 使用频率比较高的变量声明为register ,可以使程序更小、执行速度更快 register 类型名 变量名; register int i; 它只是一个建议 编译器有权决定变量是否是register 编译器的决定往往更科学 所以,通常用不着它,变量的生存期,静态存储区中的变量 与程序“共存亡” 动态存储区中的变量 与语句块“共存亡” 寄存器中的变量 同动态存储区,程序的调试与测试,小结与作业,1.设计一个打印10行10列的直角三角形图案的函数,要求无参数无返回值。 2.设计一个判断一个数是否是素数的函数,是返回1,不是返回0。 3.设计模拟掷硬币的程序。每投掷一次硬币,程序要打印出正面还是反面,投掷100次,计算出现正面的次数。其中投掷硬币调用一个函数叫flip,自己定义,不带参数,正面返回1,反面返回0。 4.设计一个小学生乘法练习程序。,

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:函数—模块化程序设计.ppt
    链接地址:https://www.docduoduo.com/p-6861444.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开