




已阅读5页,还剩60页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章问题的模块化求解,第7章问题的模块化求解,函数的定义函数的调用和声明函数间的参数传递数组作函数参数EXIT()函数变量的作用域与存储类型C语言的编译预处理,【本章要点】,7.0模块化程序设计,基本思想:将一个大的程序按功能分割成一些小模块。特点:各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性提高元件的可靠性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法:自上向下,逐步分解,分而治之,7.0模块化程序设计,C程序结构,说明:1.一个C程序可以分为若干个函数2.每个程序有且只有一个主函数(main),其他都是子函数3.子函数可以相互调用,但主函数不能被调用4.一个C源程序由一个或多个文件构成,每个文件就是一个编译单位,7.0模块化程序设计,7.1引例,7.1.1问题描述1.在家庭装修铺设瓷砖的工程计划中,由于每个家庭的住房面积和房屋结构各不相同,需要计算装修各个房间的瓷砖用量。一般情况下,地面瓷砖和墙面瓷砖的规格不同,且有的房间只需要铺设地面瓷砖。假设已测得各个房间的地面面积和墙面面积,需编程计算所需地面瓷砖和墙面瓷砖的数量(瓷砖切割情况忽略不计)。,7.1引例,7.1.1问题描述2.某商店需要一个商品销售管理系统软件,对商品的销量做统计分析,要求系统具有以下功能:(1)录入每种商品的编号、名称和日销量;(2)统计每种商品的月销量和平均销量;(3)按每种商品的月销量由高到低进行销量排行;(4)按商品编号查询某种商品的销售排名及日销量;(5)输出每种商品的编号、名称、日销量、月销量和平均销量。,7.1.2问题分析引例1:完全可以用前面所学的问题求解方法实现。缺点:代码冗余引例2:也可以利用前面所学知识在主函数中实现所有功能。缺点:功能繁多,主函数冗长,结构不清晰。,7.1引例,7.1.3算法设计引例1:将计算瓷砖数量的基本任务设计成函数。引例2:将“商品销售管理系统”看成总任务,将其分解成5个子任务(录入商品信息、统计月销量和平均销量、按月销量排序、按商品编号查询和输出),子任务需要通过自定义函数实现。,7.1引例,7.2函数的定义,函数:具有某种功能的独立程序段。,(1)从程序设计方法看C函数:它是实现模块化程序设计的语法元素。,(2)从C语言中程序的组成方式看C函数:它是程序的基本组成单位。,7.2函数的定义,从用户使用的角度看,函数有两种:,标准函数(库函数);用户自己定义的函数,库函数:是由编译系统提供的已设计好的函数,用户只需调用而无需去实现它。前几章用过的scanf,printf,getchar,putchar,fmod,sqrt等都是库函数。,用户自定义函数:由程序员自己定义和设计的函数。需要程序员自己来编写函数功能实现代码。,函数定义一般格式:,合法标识符,函数返回值类型缺省int型无返回值void,函数体,例有参函数(现代风格)intmax(intx,inty)intz;z=xy?x:y;return(z);,例无参函数voidprintstar()printf(“*n”);或voidprintstar(void)printf(“*n”);,7.2函数的定义,例7-1:编写一个函数,求n!。问题分析:函数功能为计算n!,实现这一功能需要参数传入n的具体值,然后经过函数计算返回n!。函数首部的各个部分定义如下:函数返回值类型:由于函数返回的阶乘数值较大,可以设函数体类型为long型。函数名:根据函数的功能是求阶乘运算,可定义函数名为“Fact”。形参类型及个数:n的值为多少应由形参n决定,故取int型变量n为形参。,7.2函数的定义,例7-1:编写一个函数,求n!。函数设计:longFact(intn)inti;longresult=1;for(i=2;i=y)m=x;elsem=y;return(m);main()intm,x,y;scanf(%d%d,函数定义,函数调用,实参,形参,7.3函数的调用和声明,7.3.1函数的调用,函数调用的一般形式为:函数名(实参表),在语言中,可以用以下几种方式调用函数:(1)函数语句形式调用。(2)函数表达式形式调用。(3)函数实参形式调用。,切记:实参的个数、类型和顺序,必须与被调用函数所要求的参数个数、类型和顺序一致,才能正确地进行数据传递。,7.3.1函数的调用,函数的参数分为形参和实参两种,作用是实现数据传送。,形参:即“形式参数”,出现在函数定义中。当发生函数调用时,接受传递过来的值。,实参:即“实际参数”,出现在函数调用中。当发生函数调用时,调用函数把实参的值复制1份,传送给被调用函数的形参,从而实现实参向形参的数据传送。,1、采用函数语句形式调用,voidmax(intx,inty)intm;if(x=y)printf(max=%dn,x);elseprintf(max=%dn,y);main()intm,x,y;scanf(%d%d,函数语句形式调用,2、采用函数表达式形式调用,intmax(intx,inty)intm;if(x=y)m=x;elsem=y;return(m);main()intm,x,y;scanf(%d%d,函数表达式形式调用,3、采用函数实参形式调用,intmax(intx,inty)intm;if(x=y)m=x;elsem=y;return(m);main()intx,y;scanf(%d%d,函数实参形式调用,例计算x的立方,#includefloatcube(floatx)return(x*x*x);voidmain()floata,product;printf(Pleaseinputvalueofa:);scanf(%f,x,1.2,1.2,1.728,7.3.1函数的调用,例7-3:编写main()函数,调用函数Isprime()判定用户从键盘输入的一个正整数是否为素数。问题分析:Isprime()函数应该有一个int型形参,存储被判定的数;而函数体内可直接输出判定结果无需返回值,故函数类型为void。,7.3.1函数的调用,例7-3:编写main()函数,调用函数Isprime()判定用户从键盘输入的一个正整数是否为素数。算法设计:本例的主要功能在Isprime()函数中实现,主函数中只需从键盘获取一个正整数x0,然后以x0为参数调用Isprime()函数即可。因此,主要的算法思想体现在Isprime()函数中。根据上面的分析,该函数只需逐个判定从2x-1的每个整数是否能整除x即可。若有某个数能整除x,则x不是素数;否则x是素数。这一过程可通过for语句实现。,7.3.1函数的调用,对被调用函数要求:必须是已存在的函数库函数:#include用户自定义函数:函数类型说明函数原型声明:一般形式:函数类型函数名(形参类型形参名,.);或函数类型函数名();作用:告诉编译系统函数类型、参数个数及类型,以便检验函数定义与函数声明不同函数说明位置:程序的数据说明部分(函数内或外),7.3.2函数的声明,下列情况下,可不作函数声明:若函数返值是char或int型,系统自动按int型处理被调用函数定义出现在主调函数之前有些系统(如BorlandC+)要求函数声明指出函数返值类型和形参类型,并且对void和int型函数也要进行函数声明,7.3.2函数的声明,函数原型声明举例,值传递方式:方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向传递,7.4函数间的参数传递,#include#includefloatfun(float,int);/函数声明voidmain(void)floata=2.5,x;intb=3;x=fun(a,b);/函数调用printf(%.1f的%d次方是%.3fn,a,b,x);floatfun(floatx,inty)/函数定义floatz;z=pow(x,y);/pow()是计算xy的库函数return(z);,形参,实参,实参和形参的个数、类型、位置是一一对应的。,实参与形参的特点归纳如下:,(1)为了实现实参和形参之间正确的数值传递,规定:实参与形参的个数、数据类型、书写顺序必须严格一致,否则会发生“类型不匹配”的错误,导致传值出错。(2)实参与形参可以同名,也可以不同名。它们不会相互影响,因为实参与形参占用各自的内存空间。只有在函数调用发生时,系统才为形参分配存储空间,当函数调用结束后,系统又会将形参的存储空间释放掉,因此形参只有在被调用函数内部才有效。(3)实参可以是常量、变量、表达式、函数等,无论是何种类型的量,在进行函数调用时,系统都会将其具体的数值计算出来,以便实参有确切的数值传递给形参。(4)由于实参向形参传值是单向的,也就算说,形参的改变不会影响到实参。,#includevoidswap(int,int);voidmain(void)intx=2,y=3;printf(1)x=%d,y=%dn,x,y);swap(x,y);printf(4)x=%d,y=%dn,x,y);voidswap(inta,intb)intt;printf(2)a=%d,b=%dn,a,b);t=a;a=b;b=t;printf(3)a=%d,b=%dn,a,b);,程序运行结果:(1)x=2,y=3(2)a=2,b=3(3)a=3,b=2(4)x=2,y=3,实参和形参示意图,7.5数组作函数参数数组元素作函数实参值传递,例:从键盘输入3个整数并存于数组a中,计算他们的和并输出。,#includeintsum(intx,inty)returnx+y;voidmain()inta3,b;for(inti=0;i3;i+)scanf(“%d”,ai);b=sum(a0,a1);printf(“sum=%dn”,sum(b,a2);,7.5数组作函数参数,数组名作函数参数地址传递在主调函数与被调函数分别定义数组,且类型应一致形参数组大小(多维数组第一维)可不指定形参数组名是地址变量,例求学生的平均成绩,#includefloataver(intstu10,intn);voidmain()ints10,i;floatav;printf(Input10scores:n);for(i=0;i10;i+)scanf(%d,floataver(intstu10,intn)inti;floatav,tl=0;for(i=0;in;i+)t+=stui;av=t/n;returnav;,实参用数组名,形参用数组定义,intstu,input(a,10);,例数组元素与数组名作函数参数比较,#includevoidswap2(intx,inty)intz;z=x;x=y;y=z;main()inta2=1,2;swap2(a0,a1);printf(a0=%dna1=%dn,a0,a1);,值传递,#includevoidswap2(intx)intz;z=x0;x0=x1;x1=z;main()inta2=1,2;swap2(a);printf(a0=%dna1=%dn,a0,a1);,地址传递,例数组元素与数组名作函数参数比较,例求二维数组中最大元素值,intmax(intarray34)inti,j,k,max;max=array00;for(i=0;imax)max=arrayij;return(max);voidmain()inta34=1,3,5,7,2,4,6,8,15,17,34,12;printf(maxvalueis%dn,max(a);,例求二维数组中各行元素之和,sum(intx3,intre,intr,intc)inti,j;for(i=0;ir;i+)rei=0;for(j=0;j=0),使用循环做:floatfac(intn)floatf=1;if(n=0)for(i=2;i1)f=fac(n-1)*n;elseif(n=0|n=1)f=1;elsef=-1;returnf;voidmain()intn;floaty;printf(“inputaintegernumber:”);scanf(“%d”,49,例有5个人坐在一起,问第5个人多少岁?答:比第4个人大2岁;第4个人说他比第三个人大2岁;第3个人比第2个人大2岁,第2个人比第1个人大2岁.而第1个人有10岁.问第5个人多少岁?,50,函数调用过程,#includeintage(intn)intc;if(n=1)c=10;elsec=age(n-1)+2;returnc;voidmain()printf(“%d“,age(5);,exit()函数用于中途退出程序运行状态,控制权交给操作系统。函数原型为voidexit(intstatus)。参数status为0时表示正常退出;status非0时表示不正常退出。,7.7exit()函数,7.8变量的作用域与存储类型,7.8.1变量的作用域,1.变量按作用域:分为全局变量和局部变量2.区别:,例:,#includeinta,b;/*a,b为全局变量*/voidf1()intt1,t2;t1=a*2;t2=b*3;b=100;printf(“t1=%d,t2=%dn”,t1,t2);main()a=2;b=4;f1();printf(“a=%d,b=%d”,a,b);,程序输出结果为:t1=4,t2=12a=2,b=100,将程序改为:,#includeinta=2,b=4;/*a,b为全局变量*/voidf1()intt1,t2;t1=a*2;t2=b*3;b=100;printf(“t1=%d,t2=%dn”,t1,t2);voidmain()intb=4;f1();printf(“a=%d,b=%d”,a,b);,程序输出结果为:t1=4,t2=12a=2,b=4结论:全局变量与局部变量同名时,局部变量的作用域屏蔽全局变量,7.8.2变量的存储类型,局部变量默认为auto型register型变量个数受限,且不能为long,double,float型局部static变量具有全局寿命和局部可见性局部static变量具有可继承性extern不是变量定义,可扩展外部变量作用域,例文件file1.cinta;main().f2();.f1();.f1()autointb;f2();.f2()staticintc;,“编译预处理”是C语言编译系统的一个组成部分。编译预处理是在编译前由编译系统中的预处理程序对源程序的预处理命令进行加工。源程序中的预处理命令均以“#”开头,结束不加分号,以区别源程序中的语句,它们可以写在程序中的任何位置,作用域是自出现点到源程序的末尾。预处理命令包括执行宏定义(宏替换)、包含文件和条件编译。,7
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 环境影响评价与保护措施承诺函6篇
- 2025-2026学年河南省驻马店市某中学高二上学期开学考试英语试题(解析版)
- 2025福建省二建建设集团有限公司招聘19人模拟试卷及参考答案详解1套
- 江西省鹰潭市2024-2025学年高一下学期期末地理试题(解析版)
- 2025年开封教投教育集团招聘教师116人模拟试卷及答案详解(考点梳理)
- 2025广东省江门市蓬江区教师招聘23人模拟试卷及答案详解(网校专用)
- 企业控制标准化体系指南
- 2025年商丘夏邑县公安局招聘看护队员50人模拟试卷附答案详解(完整版)
- 2025年衢州常山县卫健系统医疗卫生单位招聘高层次、紧缺医疗卫生人才14人模拟试卷有答案详解
- 2025年广东环保集团春季招聘模拟试卷完整参考答案详解
- 2025农村果园租赁合同示范文本
- 人教版二年级数学上册第二单元 1~6的表内乘法必刷卷 (含答案)
- 化工厂苯乙烯泄漏、着火、爆炸引发人员中毒、受伤综合应急演练脚本
- 公司财务流程透明化披露方案模板
- 法院反诈骗法律知识培训课件
- 2024年《岁儿童学习与发展指南》艺术领域测试题(附答案)
- 高校毕业生求职指导案例集
- 2025年两类人员安全考试题及答案
- 客户限额管理办法
- 排污许可证审核及环境应急管理服务方案投标文件(技术方案)
- 艺术展演活动策划公司简介范文
评论
0/150
提交评论