版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、函数模块化程序设计第1页,共51页,2022年,5月20日,9点31分,星期一学习目标模块化程序设计的思想,自顶向下的实现方法,系统函数库的使用方法,自定义函数的方法,参数传递方式,函数调用过程,接口与实现的分离,开发大规模程序第2页,共51页,2022年,5月20日,9点31分,星期一引言如何对比较复杂、庞大的问题进行程序设计?例如:绘制一个动物图案头 正方型躯干菱形下肢矩型 建立一个学生信息管理系统界面建立信息维护信息查询信息解决比较大的问题要成千上万行代码第3页,共51页,2022年,5月20日,9点31分,星期一怎么实现呢?每个软件只有一个main(),main()当中能放多少行程序?
2、读多少行的程序能让你不头疼?如果所有代码都在main()当中,怎么团队合作?如果代码都在一个文件中,怎么团队合作?第4页,共51页,2022年,5月20日,9点31分,星期一模块化程序设计思想复杂问题分解成若干子问题模块,逐个解决每个子问题模块各司其职每个模块只负责一件事情,它可以更专心一个模块一个模块地完成,最后再将它们集成便于开发、调试、测试和维护等工作开发人员各司其职按模块分配任务,职责明确并行开发,缩短开发时间分而治之(Wirth, 1971 )信息隐藏(Parnas, 1972)第5页,共51页,2022年,5月20日,9点31分,星期一C语言用函数表示模块分而治之函数把较大的任务分
3、解成若干个较小的任务,并提炼出公用任务代码复用程序员可以在其他函数的基础上构造程序,而不需要从头做起信息隐藏(黑盒子)设计得当的函数可以把具体操作细节对程序中不需要知道它们的那些部分隐藏掉,从而使整个程序结构清楚如把编程比做制造一台机器,函数就好比其零部件可将这些“零部件”单独设计、调试、测试好,用时拿出来装配,再总体调试。这些“零部件”可以是自己设计制造/别人设计制造/现在的标准产品第6页,共51页,2022年,5月20日,9点31分,星期一函数的定义形式返回值类型 函数名 (参数列表) 函数体变量声明部分语句部分 函数可以没有返回值,也可以没有参数,均用void表示如:void funcn
4、ame(void) 参数列表的形式:参数类型 参数名称1,参数类型 参数名称2, 如:int maxium( int a, int b, int c) 具有三个参数,返回类型为int的函数或 void print( int a, int b) 第7页,共51页,2022年,5月20日,9点31分,星期一如大家熟悉的 int main(void) printf(。); 实际上 printf,scanf也是这样定义的我们可以根据需要定义各种自己的函数。 第8页,共51页,2022年,5月20日,9点31分,星期一函数调用已经定义的函数要在某个地方使用才有意义,使用一个函数称为函数调用。可以在mai
5、n()中调用其它函数在任意一个函数中均可以调用其它函数。调用的形式: 函数名(实际参数)-有参数时 或 函数名()- 无参数时第9页,共51页,2022年,5月20日,9点31分,星期一问题1 绘制一个动物图案。定义无参数、无返回类型的函数如打印矩型的函数 void Rectangle (void) 。 第10页,共51页,2022年,5月20日,9点31分,星期一使用已经定义的函数测试void Rectangle (void) /这种函数叫做stub 树桩或存根 printf(“rectangle okn”) ; /仅供测试 void diamond(void) printf(“diamon
6、d okn”);int main(void) rectangle();/函数调用 diamond(); rectangle(); return 0; 被调用的函数必须先定义,即各个函数的定义现在一定要放在主函数之前(等会我们会有另外的方法)第11页,共51页,2022年,5月20日,9点31分,星期一问题2 学生信息系统 同样每个功能模块用一个函数表示void create(void) void display(void) void modify(void) void query(void )void delete(void )写一个main测试它们第12页,共51页,2022年,5月20日,
7、9点31分,星期一问题3 :设计一个能求某个自然数以内的自然数之和的函数模块有参数和返回值的函数分析:首先取名 sum确定是否有返回值?如果有,是什么类型?确定是否有参数?几个?什么类型?函数定义int sum(int n) int s=0; for(int i=1;i=n;i+). s=s+i; return s;此函数有一个整型参数,有一个整型的返回值在函数定义中的参数称为形参,只是一个形式定义,这个参数的具体值由调用者通过实参给定,实参可以是一个与形参类型一致的表达式。第13页,共51页,2022年,5月20日,9点31分,星期一测试sum函数 驱动程序#includeint sum(i
8、nt n) int main(void) int m,s; scanf(“%d”,&m); /准备一个实参m s = sum(m); /调用sum printf(“ %dn”, s); /输出结果 /或者直接 printf(“ %dn”, sum(m); return 0;第14页,共51页,2022年,5月20日,9点31分,星期一函数调用的注意事项1有返回值时调用结果可以放到一个数值表达式中, 如s = sum(m);也可以作为另一个函数调用的参数, 如printf(%dn, sum(m);无返回值时函数调用只能独立使用 rectangle();第15页,共51页,2022年,5月20日,
9、9点31分,星期一函数调用的注意事项2实参可以是符合参数类型的常量如 s = sum(100);变量如 s = sum(m);表达式如 s = sum(m+10);第16页,共51页,2022年,5月20日,9点31分,星期一实参与形参必须一致函数调用时实参与形参必须保持参数个数相同参数类型相同,如果不同将自动转换参数顺序相同当函数有多个表达式参数时,函数调用时实参求值的顺序可能是从左到右或从右到左,举例funcpara.cpp第17页,共51页,2022年,5月20日,9点31分,星期一为了清楚起见,需要对函数接口加以注释说明/* 函数功能:实现功能 函数参数: 参数1,表示 参数2,表示
10、函数返回值: */返回值类型 函数名(参数表) 函数体return 表达式;第18页,共51页,2022年,5月20日,9点31分,星期一问题4 设计一个求两个数的平均值的函数模块/* 函数功能: 计算平均数 函数入口参数: 整型x,存储第一个运算数 整型y,存储第二个运算数 函数返回值: 平均数*/int average(int x, int y)int result;result = (x + y) / 2;return result;第19页,共51页,2022年,5月20日,9点31分,星期一函数执行的过程函数调用时,实参值传递给形参变量暂时离开调用者,去执行函数体函数执行完毕后,回到
11、调用的位置,继续执行调用者的语句第20页,共51页,2022年,5月20日,9点31分,星期一使用了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(
12、a, b); printf();数据传递执行顺序第21页,共51页,2022年,5月20日,9点31分,星期一问题5 设计一个判断某个数是否是素数的函数模块第22页,共51页,2022年,5月20日,9点31分,星期一问题6 设计一个求某个数a的n次幂的函数模块第23页,共51页,2022年,5月20日,9点31分,星期一可以定义各种各样的函数模块第24页,共51页,2022年,5月20日,9点31分,星期一当问题比较复杂时,需要很多函数所有自定义的函数都要放在main的前面,这将喧宾夺主,本末倒置解决的方法是在使用之前,先有函数的原型声明实际上,头文件中包含了要使用的函数的原型声明 如std
13、io.h中包含了printf,scanf等跟I/O相关的函数原型第25页,共51页,2022年,5月20日,9点31分,星期一某一模块定义为一个函数之后,在使用它(函数调用)之前,先用函数原型声明。使用函数原型声明,重写上述例题第26页,共51页,2022年,5月20日,9点31分,星期一函数原型的作用函数原型 如 int sum(int n);可以写成 int sum(int) 函数原型告诉编译器函数返回的数据类型,函数接收的参数个数,参数类型及参数顺序强制转换参数类型第27页,共51页,2022年,5月20日,9点31分,星期一小结:函数三要素函数原型函数调用函数定义第28页,共51页,2
14、022年,5月20日,9点31分,星期一函数的分类库函数ANSI/ISO C定义的标准库函数符合标准的C语言编译器必须提供这些函数函数的行为也要符合ANSI/ISO C的定义第三方库函数由其它厂商自行开发的C语言函数库。不在标准范围内,能扩充C语言的功能(图形、网络、数据库等)自定义函数自己编写的函数包装后,也可成为函数库,供别人使用第29页,共51页,2022年,5月20日,9点31分,星期一数学函数库使用常用的数学函数 sqrt(x) exp(x) log(x) 自然对数 log10(x) fabs(x) ceil(x) 不小于x的最小整数 floor(x) 不大于x的最大整数 pow(x
15、,y) sin(x) x为弧度 .第30页,共51页,2022年,5月20日,9点31分,星期一#include找出所有小于500的构成直角三角形的三条边input a, b,cc = sqrt(pow(a,2)+pow(b,2)求一元二次方程的根 a,b,c sqrt(b*b 4*a*c) 0 sqrt(b*b 4*a*c) 0 sqrt(b*b 4*a*c) =0打印02PI之间sin(x)对照表例sinecurve.cpp第31页,共51页,2022年,5月20日,9点31分,星期一 随机数的产生 rand() 产生一个0到 RAND_MAX(32767) 之间的一个整数,伪随机数需要包
16、含 stdlib.h 模拟掷硬币和骰子缩放 rand()%6srand(unsigned) 为rand()设置种子time(NULL)参数NULL返回秒为单位的计算机系统的当前时间。time.h srand(time(NULL)例rand.cpp第32页,共51页,2022年,5月20日,9点31分,星期一void Print(int flag) if (flag) printf(Right!n); else printf(Not correct!n);小学生加法考试题/* 函数功能: 计算两整型数之和,如果与用户输入的答案相同,则返回1,否则返回0 函数参数: 整型变量a和b,分别代表被加数
17、和加数 函数返回值:当a加b的结果与用户输入的答案相同时,返回1,否则返回0*/int AddTest(int a, int b)int answer;printf(%d+%d=, a, b);scanf(%d, &answer);if (a+b = answer) return 1;else return 0;只答1次第33页,共51页,2022年,5月20日,9点31分,星期一main() int a, b, answer; printf(Input a,b:); scanf(%d,%d, &a, &b); answer = AddTest(a, b); Print(answer);do
18、while (answer = 0);小学生加法考试题 直到做对为止第34页,共51页,2022年,5月20日,9点31分,星期一main() int answer,chance=0; do answer = AddTest(a, b); Print(answer); chance+; while (answer = 0 & chance 3);小学生加法考试题 最多给3次机会第35页,共51页,2022年,5月20日,9点31分,星期一 int a,b; int error = 0; int score = 0; srand(time(NULL); for (int i=0; i10; i+
19、) a = rand()%10 + 1; b = rand()%10 + 1; answer = AddTest(a, b); Print(answer); if (answer = 1) score = score + 10; else error+; 实验4:小学生加法考试题 随机出题连续做10道题统计分数第36页,共51页,2022年,5月20日,9点31分,星期一通用小学生算术软件第37页,共51页,2022年,5月20日,9点31分,星期一碰运气游戏-掷双骰子游戏规则 掷两个骰子,点数相加。第一次时如果和为7或11则玩家赢;如果得到的和适2、3或12,玩家输;如果和为4、5、6、8、
20、9或10,用这个和作为游戏的点数。要想赢,继续掷,直到取得自己的点数为止。但是如果掷出了7点玩家则输。第38页,共51页,2022年,5月20日,9点31分,星期一返回多个值的函数可以通过函数的返回语句返回某个类型的计算值,但是只能返回一个。实例研究:交互两个数的函数如何交换两个数swap.cpp可见函数的参数传递是单向的,不能通过简单的函数参数传递实现实参值的改变为什么不能,其原因是传值第39页,共51页,2022年,5月20日,9点31分,星期一怎么样才能反向传递呢?参数用变量的地址refswap.cpp怎么声明存放变量地址的变量参数?指针变量声明符 * int *aPtr; int a;
21、二者不同 aPtr = &a; 二者联系起来怎么访问指针变量指向的内存变量?间接引用运算符 * *aPtr = 10; a = 10; 二者效果相同第40页,共51页,2022年,5月20日,9点31分,星期一可以看出,通过指针参数可以实现返回多个结果再看一个实例设计一个函数,可以处理学生成绩的简单计算和求平均值。 void gradeStatistics( int * numbers, float * ave)第41页,共51页,2022年,5月20日,9点31分,星期一变量的作用域变量是有生命的,有范围的指在源程序中定义变量的位置及其能被读写访问的范围分为局部变量(Local Variab
22、le)全局变量(Global Variable )第42页,共51页,2022年,5月20日,9点31分,星期一局部变量(Local)局部变量在语句块内定义的变量形参也是局部变量特点定义时不会自动初始化,除非程序员指定初值进入语句块时获得内存,仅能由语句块内语句访问,退出语句块时释放内存,不再有效 并列语句块各自定义的同名变量互不干扰 第43页,共51页,2022年,5月20日,9点31分,星期一全局变量(Global)全局变量在所有函数之外定义的变量特点在程序中定义它的位置以后都有效在定义点之前或在其他文件中引用,应该进行如下声明: extern 类型名 变量名;从程序运行起即占据内存,程序运行过程中可随时访问,程序退出时释放内存 使函数之间的数据交换更容易,也更高效但是并不推荐使用,尽量少用因为谁都可以改写全局变量,所以很难确定是谁改写了它第44页,共51页,2022年,5月20日,9点31分,星期一存储类型一个完整的变量说明格式如下: 存储类型 数据类型 变量名如: static int x , y ;C程序的存储类别有:auto型(自动变量型)static型(静态变量型)register型(寄存器型)第45页,共51页,2022年,5月20日,9点31分,星期一自动变量(auto)“自动”体现在进入语句块时自动申请内存,退
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消化内科核心疾病 VIP 瘤课件
- 消化内科核心疾病真性红细胞增多症治疗与消化课件
- 外科学总论破伤风患者康复期心理护理要点课件
- 智能护理实操雾化器参数调节课件
- 消化内科核心疾病肠系膜上动脉综合征康复课件
- 2026年外卖配送员职业技能模拟试卷含答案
- 2025年公厕管理人员考试题及答案
- 2026年中级职称评审业务考核试题含答案
- 2026年河北司法警官职业学院单招职业技能考试备考题库带答案解析
- 2026年校园保安业务知识模拟考试题含答案
- 养老机构安全生产责任制清单
- 《红岩》中考试题(解析版)-2026年中考语文名著复习核心知识梳理与专项训练
- 医务人员职业安全防护课件
- 非洲鼓基础知识培训课件
- ICU患者睡眠质量持续改进方案
- 单侧双通道脊柱内镜技术
- KET考试必背核心短语(按场景分类)
- 2025四川产业振兴基金投资集团有限公司应届毕业生招聘9人笔试历年难易错考点试卷带答案解析2套试卷
- GB/T 14748-2025儿童呵护用品安全儿童推车
- 精防医生考试试题及答案
- 2025年中国碳氢清洗剂市场调查研究报告
评论
0/150
提交评论