《高级语言程序设计教学》第7章_第1页
《高级语言程序设计教学》第7章_第2页
《高级语言程序设计教学》第7章_第3页
《高级语言程序设计教学》第7章_第4页
《高级语言程序设计教学》第7章_第5页
已阅读5页,还剩62页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章函数1编辑ppt第7章函数7.1

函数的概念7.2

函数的简单调用7.3

数组作为函数参数的调用7.4

函数的嵌套调用7.5

函数的递归调用7.6

变量的作用域7.7

变量的存储类别2编辑ppt学习目标函数定义和函数调用掌握数组作为参数的函数调用掌握函数的嵌套和递归调用掌握变量作用域了解变量存储类别3编辑ppt7.1函数的概念1、C是模块化程序设计语言C是函数式语言必须有且只有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束所有函数是平行的,函数不能嵌套定义,可以嵌套调用C程序源程序文件1源程序文件i源程序文件n预编译命令函数1函数n说明部分执行部分……C程序结构C程序源程序文件预编译命令主函数main说明部分执行部分目前编写的C程序4编辑ppt#include"stdio.h"voidmain(void){floatx,y,z;

floataverage(floata,floatb);printf("输入2个数值:");scanf("%f%f",&x,&y);z=average(x,y);printf("%.2f和%.2f的平均值为:%.2f\n“,x,y,z);}floataverage(floata,floatb){floatc;

c=(a+b)/2;returnc;}5【例7-1】

计算两个数的平均值。主函数子函数函数声明函数调用函数定义函数返回值5编辑ppt简单的函数举例main(){ printf(“**********\n”);printf(“Howdoyoudo!\n”); printf(“**********\n”);}要求在屏幕上输出下列的图形**********

Howdoyoudo!**********6编辑ppt简单的函数举例#include<stdio.h>voidprintstar(intnum);

main(){

printstar(10);printf(“Howdoyoudo!\n”);

printstar(10);}函数声明函数调用voidprintstar(intnum){inti;for(i=0;i<num;i++) printf(“*”);printf(“\n”);}函数定义(无返回值)7编辑ppt

intmax(intx,inty){intz;z=x>y?x:y;

returnz;}main() {inta=5,b=9,c;c=max(a,b);printf(“Max=%d”,c);}例:求两个数中的最大值

函数定义函数调用函数返回值8编辑ppt2、函数分类从用户角度标准函数(库函数):由系统提供用户自定义函数printstar(intnum)从函数形式无参函数有参函数——strlen(字符数组名)9编辑ppt使用库函数应注意的问题1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值的意义和类型4、需要使用的包含头文件strlen(str)10编辑ppt例有参函数

intmax(intx,inty){intz;z=x>y?x:y;return(z);}例无参函数

printstar(){printf(“**********\n”);}或

voidprintstar(void){printf(“**********\n”);}7.2函数的定义1、函数定义的一般格式[存储类别]

函数类型

函数名(形参列表){

说明部分语句部分}例有参函数

intmax(intx,y){intz;z=x>y?x:y;return(z);}例

空函数//调用此函数时,什么都不做

dummy(){}函数体为空函数带回来的值的类型若缺省为:int整型函数没有返回值定义为void11编辑ppt2、函数的返回值返回语句的形式:功能:使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数说明:只能返回一个值,而不能返回多个值。

return(x,y);return(表达式);return

表达式;return;12编辑ppt函数语句printstar(10);表达式方式函数调用出现在表达式中,函数的返回值参加表达式的运算。c=5*max(a,b);作为函数的参数

printf(“max=%d”,max(a,b));c=max(k,max(i,j));函数的调用方式intmax(intx,inty){intz;z=x>y?x:y;return(z);}13编辑ppt【例7-3】输出数字金字塔#include<stdio.h>voidmain(void){ intnum;

voidpyramid(intn);

printf("请输入金字塔的层数:");scanf("%d",&num); pyramid(num);}请输入金字塔的层数:5122333444455555Pressanykeytocontinue14编辑pptvoidpyramid(intn){ inti,j;for(i=1;i<=n;i++) {for(j=1;j<=n-i;j++)/*输出左侧空格*/printf("");for(j=1;j<=i;j++)/*输出数字*/printf("%d",i);printf(“\n”);/*换行*/}}请输入金字塔的层数:5122333444455555Pressanykeytocontinue15编辑ppt【例7-4】判断素数#include"stdio.h"#include"math.h"intprime(intn){ intk,i,result; k=sqrt(n);for(i=2;i<=k;i++)if(n%i==0)break;if(i>k)result=1;elseresult=0;returnresult;}【例4-16】判断n是否为素数

P75for(i=2;i<=sqrt(n);i++)if(n%i==0)break;if(i>sqrt(n))

printf("%disaprimenumber!\n",n);else

printf("%disnotaprimenumber!\n",n);16编辑pptvoidmain(void){ inta=1777,b=1991; if(prime(a))printf("%d是素数\n",a);elseprintf("%d不是素数\n",a);

if(prime(b))printf("%d是素数\n",b);elseprintf("%d不是素数\n",b);}1777是素数1991不是素数17编辑ppt说明:函数中可有多个return语句,

但是,当程序执行到第一个return语句时,函数执行完毕,后面的程序不再执行,返回到函数调用处若无return语句,遇

}时自动返回调用函数void型函数——没有返回值的函数若return返回值的类型和函数类型不一致,系统自动转换成函数类型后返回voidprintstar(intn){for(i=0;i<n;i++)printf(“*“);printf(“\n”);}intmax(intx,inty){if(x>y)returnx;elsereturny;}intfun(){

return10;inta=5;

returna;}#include"stdio.h"intaverage(floata,floatb){floatc;c=(a+b)/2;

returnc;}intmain(void){floatx,y,z;x=10.0;y=5.0;z=average(x,y);printf(“%.2f\n",z);}7.00Pressanykeytocontinue18编辑ppt【例7-5】编写函数,交换两个变量的数值#include"stdio.h"voidswap(intx,inty);voidmain(void){ inta,b; printf("请输入交换的数值:"); scanf("%d%d",&a,&b); printf("交换前a=%d,b=%d\n",a,b); swap(a,b); printf("交换后a=%d,b=%d\n",a,b);}voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}请输入交换的数值:711交换前a=7,b=11交换后a=7,b=1119编辑ppt为什么没有实现数值的交换?

函数间的参数传递形式参数和实际参数

形参:定义函数时,函数名后括号内的变量。形式参数只有在函数被调用时才分配变量空间(产生),并在函数调用结束后,释放变量空间(消失)。

实参:调用函数时,函数名后括号内的表达式。形式参数与实际参数的关系形参与实参类型一致,个数相同。若类型不一致,自动按形参类型转换。main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}max(intx,inty){intz;z=x>y?x:y;return(z);}实参形参20编辑ppt【例7-5】编写程序,交换两个变量的数值#include"stdio.h"voidswap(intx,inty);voidmain(void){ inta,b; printf("请输入交换的数值:"); scanf("%d%d",&a,&b); printf("交换前a=%d,b=%d\n",a,b); swap(a,b); printf("交换后a=%d,b=%d\n",a,b);}voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}ab××××711xy711117调用前调用时调用结束实参形参21编辑ppt结论参数“值”传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向值传递(形参的改变并不影响实参)22编辑ppt函数的声明对被调用函数要求——必须是已存在的函数1)库函数:#include<*.h>2)用户自定义函数:进行函数声明函数声明一般形式函数类型函数名(形参类型

[形参名],…);函数类型函数名();23编辑ppt

例如:intmax(intx,inty);intmax(int,int);intmax(intx,inty){intz;z=x>y?x:y;return(z);}可以省略形参的名称函数的声明24编辑ppt函数声明的位置函数的数据说明部分在预编译命令之后(建议使用)25编辑ppt函数的声明举例voidmain(void){ inta,b; printf("请输入交换的数值:"); scanf("%d%d",&a,&b); printf("交换前a=%d,b=%d\n",a,b); swap(a,b); printf("交换后a=%d,b=%d\n",a,b);}voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}voidswap(intx,inty);voidswap(intx,inty);voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}voidmain(void){ inta,b; printf("请输入交换的数值:"); scanf("%d%d",&a,&b); printf("交换前a=%d,b=%d\n",a,b); swap(a,b); printf("交换后a=%d,b=%d\n",a,b);}26编辑ppt7.3数组作为参数的函数调用当形式参数是一维数组时,可以说明数组长度或不说明数组的长度形参数组与实参数组公用一块内存空间main(){intb[6]={},c;……c=fun(b);}intfun(inta[6]){}inta[]bb[5]b[4]b[3]b[2]b[1]b[0]a调用前调用时调用后27编辑ppt参数的“地址”传递方式方式:函数调用时,将数据的存储地址作为参数传递给形参函数调用后,形式参数数组a并没有像实际参数数组b一样再次申请一块连续的空间,而是使得数组a与数组b首地址相同。这样,在函数中访问数组a中的元素实际上等同于访问数组b中的元素,从而实现数组参数传递28编辑ppt特点:本质上仍然是“值”传递,只是传递的值是“地址”形参与实参指向同样的存储单元实参和形参必须是地址常量或地址变量“双向”传递——形参的改变影响实参29编辑ppt函数中如何知道数组的长度呢?C语言没有为函数提供任何简便的方法来确定传递给它的数组的长度。但是,处理数组,长度是必须的,所以通常要把数组长度也作为形式参数。例如:intfun(inta[],intn){…}30编辑ppt【例7-6】求数组中元素的最大值#include"stdio.h"#defineN10floatmax_array(floata[],intn);voidmain(void){floatarray[N],max;inti;printf("请输入%d个实数:\n",N);for(i=0;i<N;i++)scanf("%f",&array[i]);max=max_array(array,N);printf(“最大的数组元素值是:%.2f\n",max);}请输入10个实数:1.22.33.44.55.66.77.88.99.02.1最大的数组元素值是:9.00Pressanykeytocontinue31编辑ppt【例7-6】求数组中元素的最大值。floatmax_array(floata[],intn){inti;floatmax;max=a[0];for(i=1;i<n;i++) if(a[i]>max)max=a[i];returnmax;}可以说明数组长度或不说明数组的长度32编辑ppt【例7-7】比较两个数组a和b的大小,比较规则为:用m,n和k分别记录两个数组对应元素的比较结果,如果a[i]大于b[i],m++,否则如果a[i]等于b[i],k++,否则n++。如果m>n,数组a大于b,否则如果m<n,数组a小于b,否则数组a等于b。33编辑ppt#include"stdio.h"#defineN5intcmp_array(inta[],intb[],intlength);voidmain(void){inta[N],b[N],cmp,i;printf("请输入数组1:%d个整数:\n",N);for(i=0;i<N;i++) scanf("%d",&a[i]);printf("请输入数组2:%d个整数:\n",N);for(i=0;i<N;i++)scanf("%d",&b[i]);34编辑pptcmp=cmp_array(a,b,N);

if(cmp>0)printf("数组1大于数组2\n");elseif(cmp<0)printf("数组1小于数组2\n");elseprintf("数组1等于数组2\n");}请输入数组1:5个整数:12345请输入数组2:5个整数:34512数组1小于数组2Pressanykeytocontinue35编辑pptintcmp_array(inta[],intb[],intlength){inti,result,m,n,k;m=n=k=0;for(i=0;i<length;i++){if(a[i]>b[i])m++;elseif(a[i]<b[i])n++;elsek++;}if(m>n) result=1;elseif(m<n)result=-1;else result=0;returnresult;}36编辑ppt【例7-8】编写函数实现字符串的复制#include"stdio.h"#include"string.h"#defineN80voidcopy_string(charfrom[],charto[]);voidmain(void){chara[N],b[N];printf("请输入一串字符串:\n");gets(a);copy_string(a,b);puts(b);}字符串是以一维字符数组形式存放的,所以字符串的传递与一维数组的传递方式相同。37编辑pptvoidcopy_string(charfrom[],charto[]){inti;for(i=0;from[i]!='\0';i++)to[i]=from[i];to[i]='\0';}请输入一串字符串:ILoveChina!ILoveChina!由于字符串具有结束标识'\0',所以函数定义中不需要数组长度参数38编辑ppt【例7-9】编写函数实现学生成绩按平均分排名,学生成绩存储在一个二维数组中#include"stdio.h"#defineM5/*学生人数*/#defineN5/*成绩科数*/voidsort_score(floatscore[][N],floatave[]);voidmain(void){floatscore[M][N]={ {80.0,85.0,78.0,97.0,68.0}, {90.0,97.0,89.0,88.0,92.0}, {60.0,75.0,79.0,95.0,56.0}, {98.0,61.0,78.0,99.0,68.0}, {80.0,89.0,98.0,97.0,88.0}};floatave[M];inti,j; 39编辑ppt【例7-9】编写函数实现学生成绩按平均分排名,学生成绩存储在一个二维数组中。 sort_score(score,ave); for(i=0;i<M;i++)/*按排名输出学生成绩*/

{ printf("第%d名学生平均成绩:%.2f\n",i+1,ave[i]); for(j=0;j<N;j++) printf("%10.2f",score[i][j]); printf("\n"); }}第1名学生的平均成绩为:91.2090.0097.0089.0088.0092.00第2名学生的平均成绩为:90.4080.0089.0098.0097.0088.00第3名学生的平均成绩为:81.6080.0085.0078.0097.0068.00第4名学生的平均成绩为:80.8098.0061.0078.0099.0068.00第5名学生的平均成绩为:73.0060.0075.0079.0095.0056.0040编辑pptvoidsort_score(floatscore[][N],floatave[]){floatsum,temp;inti,j,k;for(i=0;i<M;i++)/*计算平均成绩*/{sum=0;for(j=0;j<N;j++)sum=sum+score[i][j];ave[i]=sum/N;}在C语言中,当形式参数是多维数组时,可以忽略第一维的长度,后面的维数必须书写计算平均成绩并排序的函数41编辑pptfor(i=0;i<M-1;i++)/*成绩排序*/for(j=i+1;j<M;j++){if(ave[i]<ave[j]){temp=ave[i];ave[i]=ave[j];ave[j]=temp;for(k=0;k<N;k++){temp=score[i][k];score[i][k]=score[j][k];score[j][k]=temp;}}}}42编辑ppt地址传递在主调函数与被调函数要分别定义数组,并且数组类型应一致,如不一致将出错形参数组是一维数组,大小可不指定;

是多维数组第一维可不指定形参数组名是地址变量※数组做函数参数的说明43编辑ppt7.4函数的嵌套调用说明:函数定义时不可嵌套调用时可以嵌套其它函数main(){intm,n;printf("%d",max(m,n));}intmax(intx,inty){return(x>y?x:y);}44编辑ppt7.4函数的嵌套调用说明:函数定义时不可嵌套调用时可以嵌套其它函数main()调用函数a结束a函数b函数调用函数bmain{...a();...}inta()//a定义{...b();...}intb()//b定义{...}45编辑ppt【例7-10】编写函数计算最大公约数和最小公倍数#include"stdio.h"intgys(inta,intb);intgbs(inta,intb);voidmain(void){intx,y;printf("输入两个整数:\n");scanf("%d%d",&x,&y);printf("%d和%d的最大公约数是:%d",x,y,gys(x,y));printf(",最小公倍数是%d\n",gbs(x,y));}46编辑ppt【例7-10】编写函数计算最大公约数和最小公倍数。

intgys(inta,intb){inti;for(i=a<b?a:b;i>=1;i--){if(a%i==0&&b%i==0)break;}returni;}47编辑ppt【例7-10】编写函数计算最大公约数和最小公倍数。

intgbs(inta,intb){intt=a*b/gys(a,b);returnt;}48编辑ppt【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根#include"stdio.h"#include"math.h"#defineN10floataverage(floata[],intn);floatvariance(floata[],intn,floatave);floatrms(floata[],intn);49编辑pptvoidmain(void){floatx[N],var; inti;printf("输入%d个数值:\n",N);for(i=0;i<N;i++)scanf("%f",&x[i]);var=rms(x,N);

printf("这些数值的均方差为:%.4f\n",var);}50编辑ppt【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根。

floataverage(floata[],intn)

{inti; floatsum=0.0;for(i=0;i<n;i++)sum=sum+a[i];returnsum/n;}51编辑ppt【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根。

floatvariance(floata[],intn,floatave)

{inti;floatvar;var=0.0;for(i=0;i<n;i++)var=var+pow((a[i]-ave),2);returnvar;}52编辑ppt【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根。

floatrms(floata[],intn){inti;floatave,var;ave=average(a,n);var=variance(a,n,ave);var=sqrt(var);returnvar;}输入10个数值:1.02.03.04.05.06.07.08.09.010.0这些数值的均方差为:9.083053编辑pptintf(intx){inty,z;……

z=f(y);…….return(2*z);}7.5函数的递归调用定义:函数直接或间接的调用自身叫函数的递归调用intf1(intx){inty,z;……

z=f2(y);

…….return(2*z);}intf2(intt){inta,c;……

c=f1(a);

…….return(3+c);}54编辑ppt说明C编译系统对递归函数的自调用次数没有限制每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出55编辑ppt【例7-12】编写函数计算整数的阶乘doublefact(intn);main(){intn;

scanf(“%d”,&n);printf(“%d!=%.0f\n",fact(n));}doublefact(intn){doublef;if(n==1||n==0)f=1;elsef=fact(n-1)*n;return(f);}56编辑pptdoublefac(intn){doublef;if(n==1||n==0)f=1;elsef=fac(n-1)*n;return(f);}n=4doublefac(intn){doublef;if(n==1||n==0)f=1;elsef=fac(n-1)*n;return(f);}n=3doublefac(intn){doublef;if(n==1||n==0)f=1;elsef=fac(n-1)*n;return(f);}n=2doublefac(intn){doublef;if(n==1||n==0)f=1;elsef=fac(n-1)*n;return(f);}n=1fac(intn)

double

f;if(n==1||n==0)fac(n-1)return(24);1fac(intn)

double

f;if(n==1||n==0)fac(n-1)return(6);2fac(intn)

double

f;if(n==1||n==0)fac(n-1)return(2);3fac(intn)

double

f;if(n==1||n==0)f=1;return(1);457编辑ppt7.6变量的作用域变量定义的3个基本位置函数内部函数参数函数外部内部变量外部变量(局部变量)(全局变量)58编辑ppt局部变量定义:在函数内定义,只在本函数内有效说明main中定义的变量只在main中有效形参属于局部变量,即只在函数中有效不同函数中同名变量,占不同内存单元

复合语句中定义的变量,只在复合语句中有效floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效59编辑pptmain(){

inta=3,b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}main:a=3,b=4sub:a=6,b=7main:a=3,b=4说明不同函数中同名变量,占不同的存储单元baba346760编辑ppt#defineN5main(){inti;inta[N]={1,2,3,4,5};for(i=0;i<N/2;i++)

{inttemp;temp=a[i];a[i]=a[N-i-1];a[N-i-1]=temp;

}printf("%d",temp);for(i=0;i<N;i++)printf("%d",a[i]);}说明

复合语句中定义的变量,只在复合语句中有效

61编辑ppt全局变量定义:在函数外定义,可为本文件所有函数共用有效范围:从定义变量的位置开始到本文件结束应尽少使用全局变量,因为:全局变量在程序全部执行过程中占用存储单元降低了函数的通用性、可靠性、可移植性降低程序清晰性,容易出错局部变量与全局变量重名时,局部优先62编辑ppt例全局变量

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论