资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,Date:,*,临沂大学汽车学院:韩晓翠,第,7,章 用函数实现模块化程序设计,授课要点,函数的定义、声明、调用,无参无返回值的函数,无参有返回值的函数,有参无返回值的函数,有参有返回值的函数,#include,#include,void main(),/主函数,int,iNo,b;,printf(,input a number:n,),;/输出函数,scanf(,%d,&iNo,),;/输入函数,b=,sqrt(,iNo,),;/求平方根函数,printf,(%d,b,),;/输出函数,初识函数1,/*从键盘输入3个数,求和并输出。*/,#include,int myAdd(int x,int y,int z),int s;,s=x+y+z;return s;,void main(),/主函数,int iNo1,iNo2,iNo3,sum;,printf(,input 3 numbers:n,),;,/输出函数,scanf(,%d%d%d,&iNo1,&iNo2,&iNo3,),;,/输入函数,sum=,myAdd(,iNo1,iNo2,iNo3,),;,/用户自定义函数,printf(,sum=%d,sum,),;,/输出函数,初识函数2,为什么要用函数,问题:,大规模的程序,实际应用程序中需,要多次实现某一功能,用循环实现?,所有代码全写在main()中?,什么是函数,函数是,一段,完成特定功能,的,程序,换句话说,,函数,就,是,能够完成,一定功能,的,语句的集合,,是程序编译运行的基本单位。,前面一直在用各种各样的函数,如,printf,(),、,scanf,(),等等。,将程序中,反复使用的程序,定义为函数的形式,函数的分类,从用户角度,标准函数(库函数):由系统提供,用户自定义函数,从函数形式,无参函数,有参函数,无参无返回值,无参有返回值,有参无返回值,有参有返回值,为什么要定义函数,C,语言要求,在程序中用到的所有函数,必须“,先定义,后使用,”,指定函数,名字,、函数,返回值类型,、函数,参数的名字与类型、,函数,实现的,功能,,将这些信息通知编译系统。,为什么要定义函数,对于,库函数,程序设计者只需用,#include,指令把有关的头文件包含到本文件模块中即可,程序设计者需要在程序中自己定义想用的而库函数并没有提供的函数,函数的定义,函数定义的通用形式为:,返回值类型 函数名(,参数数据类型 参数1,参数数据类型 参数2,),函数首部,函数体,函数定义示例(1),一、无参数无返回值的函数,如:定义printStar函数,用以在屏幕上输出5个*符号。,void,printStar(),int star;,for(star=1;star=5;star+),printf(,*,);,printf(,n),;,函数无返回值时使用的数据类型,函数的调用,无参无返回值函数的调用形式:,函数名();,无参数无返回值的函数的调用,#include,void printStar();,void main(),printStar();,/函数调用,void printStar(),/函数定义,int star;,for(star=1;star=5;star+),printf(*);,printf(n);,自定义函数的声明,在程序的开头加上对应函数的声明,函数声明的形式:,返回值类型 函数名称(参数类型 参数1,);,其中前面的与函数定义时的首部完全一样,但末尾必须加“,;,”。,如对printStar函数的声明为:,void printStar();,无参数无返回值的函数的示例,#include,void printStar();,/,函数声明,void main(),printStar();,/,函数调用,void printStar(),/,函数定义,int star;,for(star=1;star=5;star+),printf(*);,printf(n);,授课要点,函数的定义、声明、调用,无参无返回值的函数,无参有返回值的函数,有参无返回值的函数,有参有返回值的函数,问题:,过年回家,车票难买,到处托人。假如你先把车票,钱,给帮你买车票的朋友,那么,返回,给你的应该是一张,车票,(,当然是顺利的情况,),。,同理,在C语言中,,函数的调用,有时候也是有,返回值,的,那么如何理解?,分析,对应到函数上,你的朋友就是,函数,,车票就是函数的,返回值,,而你就是调用函数的,主程序,。,函数的返回值,函数的返回值,返回语句,形式:,return(,表达式);,或,return,表达式;,或,return;,功,能:使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数,函数定义示例(2),无参数有返回值的函数,如定义函数sum_100,用以求1+2+3+100的和,并将结果返回给调用它的函数。,int,sum_100(),int s=0,i;,for(i=1;i=100;i+),s=s+i;,return s,;,/用return返回一个值给主调函数,(),无参数有返回值的函数示例,#include,int sum_100();,/函数声明,void main(),int s1,;,s1,=,sum_100();,/函数调用,printf(,和值为,:%dn,s1);,int,sum_100(),/函数定义(首部),int s=0,i;,for(i=1;i=100;i+),s=s+i;,return s;,/返回值给主调函数,模仿练习,无参无返回值函数编写:,1、自定义函数myPrint1(),在屏幕上输出如下图形(每行10个$符号),并在主函数中调用myPrint1()函数。,$,$,$,模仿练习,无参无返回值函数编写:,2、自定义函数myPrint2(),在屏幕上输出如下图形,并在主函数中调用myPrint2()函数。,模仿练习,无参有返回值函数编写:,3、自定义函数myFac(),计算10!,将计算结果返回给调用者。然后在主函数中调用myFac()函数,输出该结果。,4、自定义函数myMax(),实现功能:从键盘输入3个数,求最大数并将最大数返回给调用者。然后在主函数中调用myMax()函数,输出该结果。,讨论并总结,1、为什么使用函数?,2、如何理解函数调用与函数定义的不同?,3、空函数在程序结构设计中有什么作用?,学以致用,寻找你身边的一个实际问题,编写解决问题的程序,用到函数定义和调用。,例、电视是我们日常生活中所熟悉的,我们通过遥控器选择不同的频道,就可以播放相应的频道。请定义一个函数tvPlay(int channel),模拟根据遥控器的输入的频道号码,播放相应的频道。然后给出调用的例子,比如,遥控器上选择 5,则播放CCTV-5体育频道。,作业每人必做,1、编写一个函数sum(n),计算1+2+n 之和,根据n值的不同,得到不同的值。要求分别计算n50,n80,n100的情况。,2、将自己的“学生成绩管理系统”(循环菜单)以模块化的形式进行处理,具体实施方案:主菜单的显示和选择部分可定义函数menu_select()来调用,“编辑子菜单”可定义editmenu()来调用,“查找”可定义serachmenu()来调用。,作业选做,寻找你身边的一个实际问题,构造出解决问题的表达式,描述解决问题的算法,以及编写解决问题的程序。例如,MP3可以播放不同的歌曲,请编写一个MP3模拟函数,根据输入不同的歌曲代号,可以显示相应的歌曲名。然后,调用该函数,。,授课要点,函数的定义、声明、调用,无参无返回值的函数,无参有返回值的函数,有参无返回值的函数,有参有返回值的函数,问题:,试编程实现计算并输出,3!、4!、5!。,问题解决函数定义示例(3),有参数无返回值的函数,如定义fanc_n()函数,用以计算n!。其中n的值是由调用该函数的函数传递过来的。,void,fanc_n(,int n,),int i,s=1;,for(i=1;i=n;i+),s*=i;,printf(%dn,s);,函数参数(称为,形参,),函数调用,有参,无返回值,函数的调用形式:,函数名,(,实参,),;,实参与形参:,个数相等,类型一致,按顺序一一对应,有参数无返回值的函数调用,#include,void fanc_n(int n);,/函数声明,void main(),int num,;,scanf(%d,fanc_n(,num,);,/函数调用,void fanc_n(,int n,),/函数定义(首部),int i,s=1;,for(i=1;i=n;i+),s*=i;,printf(%dn,s);,函数参数(称为,形参,),调用时传递的参数(称为,实参,),授课要点,函数的定义、声明、调用,无参无返回值的函数,无参有返回值的函数,有参无返回值的函数,有参有返回值的函数,问题:,在主函数中输入n,,自定义函数,,计算1+2+3+4+n-1+n,将结果在主函数中输出。,问题解决函数定义示例(4),有参数有返回值的函数,如定义函数sum_n(),用以求1+2+3+n的和,并将结果返回给调用它的函数。,int,sum_n(,int m,),int s=0,i;,for(i=1;i=,m,;i+),s=s+i;,return s;,/通过return返回一个值,函数参数(称为,形参,),#include,int sum_n(int m);,/函数声明,void main(),int s1,n;,scanf(%d,s1=sum_n(,n,);,/函数调用,printf(和值为:%dn,s1);,int,sum_n(,int m,),/函数定义(首部),int s=0,i;,for(i=1;i=m;i+),s=s+i;,return s;,/返回一个值给主调函数,有参数有返回值的函数调用,函数的调用,1、语句调用方式,2、函数表达式,3、函数参数,函数的调用,调用方式,语句调用:,例,printmsg();,printf(打印成功!n);,函数表达式调用:,例 result=,aver(totalscore,stuno);,函数参数调用:,例 printf(%f,aver(totalscore,stuno),);,问题:,用户输入两个整数a、b,通过下面的例子中传递方式能否实现a、b值的交换,?,函数的值传递方式,#include,void swap(int a,int b);,/swap函数的声明,void main(),int x=7,y=11;,printf(x=%d,ty=%dn,x,y);,printf(swapped:n);,swap(,x,y,),;/调用swap函数,printf(x=%d,ty=%dn,x,y);,void,swap(int,a,int,b,),/定义swap函数,int temp;,temp=a;a=b;b=temp;,输出结果:,x=7,y=11,swapped:,x=7,y=11,结论,值,传递方式,值传递方式,方式,:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值,特点,:,形参与实参占用,不同的内存单元,单向,传递,,从实参到形参,随堂实践,有参无返回值函数编写:,1、自定义函数myprint_n(),在屏幕的一行上输出n个$符号。在主函数中调用myprint_n()函数,输出如下图形(每行上的符号个数由调用它的函数传递过来)。,函数首部为:void myprint_n(int n),$(5个$),$(10个),$(15个),$(20个),2、修改以上程序,实现以下功能:打印个数由用户输入决定,支持用户循环输入,当用户输入0时结束程序,。,有参有返回值函数编写:,3、自定义函数myfac_n(),求n!,并在主函数中调用myfac_n()
展开阅读全文