




已阅读5页,还剩74页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章函数,在编写大型程序时,通常采用模块化程序设计的思想,先按照功能将整个系统分解成若干个模块,再对每个模块编写相应的自定义函数。由于每个模块功能简单、程序规模不大,这样便于编程和调试,并且能够提高程序的可读性和可维护性。本章将介绍用户自定义函数的编程方法,并实现“学生信息管理系统”中的数据显示、查找、修改和删除功能。,主要内容,6.1函数的定义、调用和声明6.2函数的应用举例6.3函数的递归调用6.4数组作为函数参数6.5变量的作用域6.6变量的生存期6.7外部函数与内部函数6.8案例分析与实现,【学习目标】,掌握函数的定义、调用和声明掌握函数的递归调用掌握数组作为函数的参数掌握变量的作用域了解变量的生存期了解外部函数与内部函数了解多文件的编译与连接能够熟练使用函数编写程序,6.1.1函数的定义语法格式如下:返回值类型函数名(形式参数列表)函数体例如,编写一个求圆的面积的自定义函数。doublearea(doubler)doubles;s=3.14*r*r;returns;/向主调函数返回计算结果,6.1函数的定义、调用和声明,【格式说明】,(1)调用自定义函数时,自定义函数称为“被调函数”,调用它的函数称为“主调函数”。(2)返回值类型是指自定义函数向“主调函数”提供的数据的类型,应根据实际需要来确定。如果函数没有返回值,则应该设为void,即空类型。(3)函数名最好能见名知义。(4)形式参数(简称形参)列表语法格式如下:类型1形参1,类型2形参2,类型n形参n(5)(5)returns;语句用于向“主调函数”返回执行结果。,格式如下:函数名(实际参数列表);例如,调用求圆的面积的自定义函数。voidmain()doublex,y;printf(请输入圆的半径:);scanf(%lf,6.1.2函数的调用,函数调用的方式有三种,赋值表达式例如:y=area(2.3);函数参数例如:printf(%lfn,area(2.3);函数语句例如:add();这是“学生信息管理系统”中调用学生信息输入函数的语句。这种方式通常用于以下两种情况:调用没有返回值的函数、主调函数不需要使用函数的返回值。,6.1.3函数的声明,函数声明用于对程序中将要调用的自定义函数进行说明。函数声明的目的是:说明函数的类型和参数情况,以便调用函数时,编译系统能够正确识别函数。函数声明有以下两种语法格式:返回值类型函数名(类型1形参1,类型n形参n);返回值类型函数名(类型1,类型n);,【格式说明】,(1)第一种格式与定义函数时的首部写法一致,只是在末尾加上了分号。第二种格式省略了参数名。例如,对于上面求圆的面积的自定义函数,可以用以下语句进行声明:doublearea(doubler);或者doublearea(double);(2)如果自定义函数出现在主调函数之前,则可以不进行函数声明,反之则必须声明。,【例6-1】对于求圆的面积的自定义函数,如果将它放在main()函数之后,则必须进行声明。,#includevoidmain()doublex,y;doublearea(doubler);/函数声明printf(请输入圆的半径:);scanf(%lf,6.1.4函数的调用过程,1.return语句使用格式如下:return表达式;或者return;例如,在例6-1中的语句:returns;。,【格式说明】,(1)对于有返回值的函数,应该采用第一种格式;对于无返回值的函数,应该采用第二种格式或省略return语句。(2)return语句的作用是:停止本函数的执行,将程序的执行流程转到函数的调用语句处。(3)return语句中表达式的类型一般应该与函数首部的返回值类型一致。如果两者不一致,则以返回值类型为准,由系统自动进行类型转换。,2.函数的调用过程,编程思路?,【例6-2】编写函数判断一个数是否是素数,如果是,则显示“是素数”,否则,显示“不是素数”。要求在main()函数中进行数据的输入和输出。,6.2函数的应用举例,#include#includeintprime(intm)inti;for(i=2;i=a,数组名作为函数实参时,形参应当用数组或指针(指针将在第7章中介绍)。由于数组名表示数组的首地址,因此,实参向形参传递的是实参数组的首地址,这样,实参数组和形参数组共占相同的内存单元。【例6-9】编写一个将字符数组中所有小写字母转换成大写字母的函数,并在main()函数中调用该函数。要求采用数组名作为函数实参。,6.4.2数组名作为函数实参,#includevoidchange(charb10)inti=0;while(bi!=0)if(bi=a,二维数组名也可以作为函数实参,此时,形参数组可以指定每一维的大小,也可省略第一维的大小,但第二维的大小不能省略,而且要和实参数组第二维的大小相同,以便编译系统能够区分每一行。【例6-10】有一个NN的矩阵,编写函数求两条对角线上的所有元素之和。要求在main()函数中输入矩阵数据,并输出结果。,#defineN3#includevoidmain()inti,j,aNN,s;intsum(intbN);printf(请输入矩阵:n);for(i=0;iN;i+)for(j=0;jy)c=x;elsec=y;returnc;voidmain()inta=88;/a为局部变量printf(max=%dn,max(a,b);,【例6-16】输入一行字符,统计其中字母、数字、空格及其它字符的个数。,#includeintletter,digit,space,others;/全局变量voidmain()charstr1000;voidcount(charch);printf(请输入一个字符串(=a,【程序说明】,当变量的值需要被多个函数访问时,可以采用全局变量来实现。(2)一般情况下,尽量少用全局变量。以免误修改。在“学生信息管理系统”中,由于“已输入的学生人数”和“每个学生的信息”这两个数据所有的函数都要访问,因此,在学生信息输入模块(见附录D的add.c文件)中将他们定义成了全局变量,定义方式如下:intstu_num=0;/已输入的学生人数structstu_typestu100;/学生数组,2.全局变量的声明外部变量的作用域是从定义点开始到本文件的末尾。如果要在定义点之前或在其他文件中使用它,就必须采用关键字extern对该外部变量进行声明,声明的语法格式如下:extern数据类型外部变量名;,文件file1.c:#includeinta;/定义外部变量voidmain()voidf();/函数声明f();/函数调用printf(a=%dn,a);文件file2.c:externinta;/外部变量声明voidf()a=1000;,在“学生信息管理系统”的add.c文件中,将“已输入的学生人数”和“每个学生的信息”定义成了全局变量,其他文件(如display.c,即学生信息显示模块)要访问这两个全局变量,需进行声明,声明如下:externintstu_num;/已输入的学生人数externstructstu_typestu100;/学生数组如果程序员希望自己定义的某个外部变量只能在本文件中使用,不能被其他文件使用,此时又该如何定义?可以在定义外部变量时,在其前面加上关键词“static”,这样的外部变量被称为“静态外部变量”。,变量的生存期是指在程序运行期间变量存在的时间,即从分配存储单元开始到存储单元被撤销为止所经历的时间。对全局变量而言,其生存期是固定的,即从程序开始运行到程序运行结束。但对局部变量而言,其生存期与存储类别有关。局部变量的存储类别有auto(自动)、static(静态)和register(寄存器)三种,这样定义变量的完整格式是:存储类别数据类型变量名=初值;,6.6变量的生存期,1.自动局部变量(auto变量),自动局部变量是程序中使用最广泛的一种变量,在定义局部变量时,如果省略存储类别,则默认是auto型。自动局部变量在执行其定义语句时被分配存储空间,当其作用域部分执行完后即释放这些空间。,【例6-14】分析下面程序的执行结果。#includevoidmain()voidprt();/函数声明intx=1;prt();printf(%dn,x);voidprt()autointx=5;printf(%dn,x);,调用prt()函数时,该函数体中的变量x才被分配存储空间,离开函数时该存储空间即被释放。,2.静态局部变量(static变量),静态局部变量在程序开始运行时就分配了存储空间,并在程序运行期间始终占用,直到整个程序运行结束。【例6-15】写出下面程序的执行结果。,#includevoidmain()voidf1(),f2();/函数声明inti;for(i=1;i=3;i+)f1();for(i=1;i0)/学生人数大于0printf(学生学号t姓名t年龄tC语言t数学t英语t总分t平均分n);for(i=0;istu_num;i+)printf(%-16s%st%dt%dt%dt%dt%dt%5.1fn,stui.num,,stui.age,stui.c,stui.math,stui.en,stui.sum,stui.ave);elseprintf(学生信息为空!);else/显示指定学号的学生的信息,for(i=0;istu_num;i+)if(strcmp(str,stui.num)=0)/查找/显示该学生的信息printf(学生学号t姓名t年龄tC语言t数学t英语t总分t平均分n);printf(%-16s%st%dt%dt%dt%dt%dt%5.1fn,stui.num,,stui.age,stui.c,stui.math,stui.en,stui.sum,stui.ave);k=i;/将该学生的数组下标赋给kif(k=-1)printf(没有找到符合条件的学生n);returnk;,【程序说明】,(1)display()函数的参数为学生的学号。如果用语句display();调用该函数,则显示所有学生的信息。(2)如果找到了指定学号的学生,则函数的返回值为该学生在结构体数组中的下标,否则,函数的返回值为-1。该值在后面的有些函数调用中用到了。,【例6-17】从键盘输入某学生的学号,查找该学生,并显示他的所有信息,如果没找到,则显示没有找到符合条件的学生。,voidfind()charstr15;printf(请输入要查找的学生学号:);scanf(%s,str);display(str);/显示该学生的信息,【例6-18】从键盘输入某学生的学号,找出该学生并修改他的信息。编程思路:输入学号后,先调用display()函数显示该学生的全部信息,并提示是否修改。如果确认修改的话,再逐项输入该学生的新数据。,voidmodify()charstr15,m;inti;printf(请输入要修改的学生学号:);scanf(%s,str);i=display(str);/查找并显示该学生的信息,i为该学生的数组下标if(i!=-1)/i!=-1表明在display()函数中该学生已找到printf(确认修改该学生的信息吗?(y/n):);m=getche();if(m=y|m=Y)/再修改printf(n请重新输入该学生的信息n);printf(n请输入学号:);scanf(%s,stui.num);printf(请输入姓名:);scanf(%s,);,【程序说明】,getche()函数用于从键盘输入一个字符,它与getchar()函数的区别在于:getche()函数输入一个字符后不需要按回车键,而getchar()函数需要按回车键。,【例6-19】从键盘输入一批学生的信息到“学生信息管理系统”中,然后输入某学生的学号,删除该学生的信息。编程思路:输入学号后,先调用display()函数显示该学生的全部信息,并提示用户是否删除,如果回答“y”或“Y”,则删除。删除的方法是:将学生总人数减1,并将该学生后面的所有学生记录前移一位。,voiddel()charstr15,m;inti,j;printf(请输入要删除的学生学号:);scanf(%s,str);i=display(str);/查找并显示信息,i为该学生的数组下标if(i!=-1)/i!=-1表明该学生已找到printf(确认删除该学生的信息吗?(y/n):);m=getche();if(m=y|m=Y)stu_num-;/学生总人数减1for(j=i;jstu_num;j+)/将该学生后面的记录前移一格stuj=stuj+1;printf(n记录删除成功!n);,一个大型程序包含了很多文件,那么这些文件如何有效地组织起来,以方便地进行编译、连接和执行呢?VC6.0采用工程来管理多文件的编译和连接,下面以“学生信息系统”为例说明整个工程的编译和连接过程,如图6-6所示。,6.8.4多文件的编译与连接,工程的编译、连接过程,建立工程及编译、连接的具体步骤,(1)新建一个工程,(2)在工程中添
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 七夕节活动方案(合集18篇)
- 年产300万只汽车前大灯智项目实施方案
- 年产20万吨氟化系列产品生产项目建议书(仅供参考)
- 广告牌匾规范化整治规划设计方案(范文)
- 公共厕所改造工程规划设计方案(范文)
- 社会服务方案设计
- 伊春职业学院《申论》2023-2024学年第二学期期末试卷
- 毕节医学高等专科学校《视唱III》2023-2024学年第二学期期末试卷
- 厦门兴才职业技术学院《教师语言技能B1》2023-2024学年第二学期期末试卷
- 郴州思科职业学院《大数据运维实验》2023-2024学年第二学期期末试卷
- 2024年10月广东省高等教育自学考试08263工程经济学与项目资源试题及答案
- 吉林交通职业技术学院《工程造价》专业人才培养方案3年制(2019版)
- 2024年职业培训学校安全管理制度范文(二篇)
- 员工培训流程图
- 健身器材采购项目投标方案
- 交警辅警培训课件
- 《微观经济学》考试复习题库(含答案)
- Linux操作系统期末复习题(含答案)
- 2024年“头脑奥林匹克万人大挑战”题库
- 智研咨询发布:2025年中国金针菜(黄花菜)行业市场全景调查及投资前景预测报告
- 《害羞与社交焦虑症:CBT治疗与社交技能训练》随笔
评论
0/150
提交评论