函数省公共课一等奖全国赛课获奖课件.pptx
《函数省公共课一等奖全国赛课获奖课件.pptx》由会员分享,可在线阅读,更多相关《函数省公共课一等奖全国赛课获奖课件.pptx(170页珍藏版)》请在咨信网上搜索。
第7章函数概述概述函数定义函数定义函数普通调用函数普通调用函数参数传递方式函数参数传递方式函数嵌套与递归调用函数嵌套与递归调用函数与指针函数与指针函数与结构体函数与结构体变量作用域变量作用域内部函数与外部函数内部函数与外部函数预处理命令预处理命令模块结构程序设计模块结构程序设计模块结构程序工程创建与调试模块结构程序工程创建与调试第1页回顾结构是由若干数据项组合而成复杂数据对象,这些数据项称为结构成员。定义一个结构,需要给出各个成员类型及名称。结构定义仅描述了一个结构形式。要在程序里使用结构,需要声明结构变量。访问结组成员操作要用圆点运算符(.),一般形式为:结构变量名.成员名。可以经过指向结构指针访问结组成员,常用形式为:结构指针变量-成员名。数组元素类型为结构数组称为结构数组。第2页目标掌握C语言中常见内置函数了解函数定义、申明、函数原型和函数返回值熟练掌握自定义函数定义和调用方式了解两种参数传递方式:传值、引用掌握函数嵌套与递归调用掌握函数参数或返回值为指针、结构体时程序设计方法了解变量作用域、存放类型了解内部函数与外部函数掌握宏定义、文件包含、条件编译等预处理命令掌握模块结构程序设计及工程创建、调试方法第3页7.1概述C语言是经过函数来实现模块化程序设计。一个完整C程序可由一个主函数和若干个称作子函数函数组成,每个函数分别对应各自功效模块。C程序由一个main和任意多个函数组成。除main函数外,其它函数可相互调用。main()abcdxz第4页voidmain()printstar();/*函数调用*/printmsg();printstar();voidprintstar()/*函数定义*/printf(*n);voidprintmsg()/*打印日期*/printf(Funtion!n);【例7.1】打印简单信息。第5页说明一个C程序是由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。一个C程序由一个或多个源程序文件组成。一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位。C程序执行从main函数开始,调用其它函数后流程回到main函数,在main函数中结束。全部函数都是平行,函数不能嵌套定义,能够相互调用但不能调用main函数。第6页从用户使用角度看,函数有两种:p标准函数(库函数):这些函数是由系统提供,用户无须自己定义,只需在程序前包含有该函数原型头文件即可在程序中直接调用。如scanf(),printf()。p用户定义函数:由用户按需要写函数。对于用户自定义函数,不但要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。如例7.1中printstar()和printmsg()。第7页 从函数形式看:p无参函数:函数定义、函数说明及函数调用中均不带参数。主调函数和被调函数之间不进行参数传送。这类函数通惯用来完成一组指定功效,能够返回或不返回函数值。p有参函数:也称为带参函数。在函数定义及函数说明时都有参数,称为形式参数(简称为形参)。在函数调用时也必须给出参数,称为实际参数(简称为实参)。进行函数调用时,主调函数将把实参值传送给形参,供被调函数使用。第8页7.2函数定义自定义函数定义形式以下:数据类型数据类型函数名函数名(形式参数列表形式参数列表)函数体函数体;第9页说明函数体是一个程序段,也就是一个复合语句。函数体可长可短,依据函数要完成功效决定。函数体能够没有语句(空函数)。依据有没有形式参数列表项,函数分为:无参函数,有参函数。有参函数形式参数列表格式为数据类型形参变量名,数据类型形参变量名p形参变量名与变量名命名方法相同。p形式参数列表能够是一个或多个形参,多个形参时中间用“,”隔开。函数参数能够了解为执行函数初始条件或函数自变量。第10页自定义函数函数名与变量名命名方法相同。主调函数经过函数名调用该函数。函数数据类型(从有没有返回值角度看)。p无返回值函数。无返回值函数更像是一个过程,主调函数调用被调函数就是使被调函数完成这个过程。定义无返回值函数,函数数据类型符用void。假如没有明确返回值,函数名前又没有加void,则C语言要求按默认int数据类型处理。p有返回值函数,主调函数调用被调函数,被调函数执行后要向主调函数返回一个值。函数数据类型就是定义该函数返回值数据类型。第11页函数返回值。p被调函数向主调函数经过return语句返回值,return语句格式以下:return(表示式表示式);或或return表示式表示式;preturn语句作用有两个:一是结束函数运行;二是带着返回值(表示式运算结果)返回主调函数。p无明确返回值函数中普通不用return语句。第12页#include/*定义有参函数,x,y为形参*/intmin(intx,inty)intz=x;if(xy)z=y;returnz;voidmain()inta,b;scanf(%d,%d,&a,&b);printf(Minis%dn,min(a,b);【例7.2】键盘输入2个数,得到其较小数。第13页7.3函数普通调用调用其它函数函数称为主调函数;被其它函数调用函数称为被调函数。函数调用普通形式为函数名函数名(实参列表实参列表)假如调用无参函数,则没有实参列表,不过圆括号不能省略。假如调用有参函数,调用函数时参数个数与数据类型要同函数定义时给出参数个数和数据类型一致。它们需按次序对应,一一传递数据。第14页函数调用方式函数语句把函数调用作为一条语句,如printstar();主调函数不要求被调函数返回值(能够有返回值但不使用),只要求被调函数完成一定操作。函数表示式函数出现在一个表示式中,此时要求函数返回一个确定值以参加表示式运算,如printf(Minis%dn,min(a,b);/*min(a,b)*/im=2*min(a,b);/*min(a,b)*/第15页函数申明函数申明普通形式为函数类型函数类型函数名(参数类型函数名(参数类型1参数名参数名l,参数类参数类型型2参数名参数名2,););n参数名能够省略。第16页#includeintmin(intx,inty);/*min函数申明*/voidmain()inta,b;scanf(%d%d,&a,&b);printf(Minis%dn,min(a,b);/*调用函数语句,a,b为实参*/intmin(intx,inty)intz=x;if(xy)z=y;returnz;【例7.3】键盘输入2个数,得到其较小数。注意:min函数申明语句也可改为intmin(int,int);两个形式参数位置上int后都没有指定参数名。编译系统不检验参数名,所以参数名可省略不写。在函数申明中也能够加上参数名,本例中函数原型申明也能够写成:intmin(inta,intb);第17页函数“定义”和“申明”“定义”是指对函数功效确实定,包含指定函数名、函数类型、形参及其类型、函数体等,它是一个完整、独立系统。“申明”作用则是把函数名字、函数类型以及形参类型、个数和次序通知编译系统,方便在调用该函数时系统按此进行对照检验。通常情况下,函数申明是将已定义函数首部复制后加一个分号。第18页函数申明几个特殊情况假如被调函数返回值是整型或字符型时,能够在调用前不做函数申明,而直接调用,这时系统将自动对被调函数返回值按整型处理。假如被调用函数定义出现在主调函数之前,在主调函数中也能够不对被调函数做申明而直接调用。假如在全部函数定义之前,在函数外预先说明了各个函数类型,则在以后各主调函数中,可不再对被调函数做申明。第19页函数申明能够是一条独立语句也能够与普通变量一起出现在同一个定义语句中,比如:floatadd(float,float);floatx,y,max(float,float);函数申明也可放在主调函数内说明部分,如在main函数内部进行申明,则只能在main函数内部识别该函数。p假如使用库函数(如printf),普通还应在本文件开头include命令将调用相关库函数所需信息“包含”到本文件中来(如#include)。第20页#includevoidmain()longfact(int);/*计算阶乘函数申明*/longsum=0;inti,n;scanf(%d,&n);for(i=1;i=n;i+)sum=sum+fact(i);/*函数表示式形式调用阶乘函数*/printf(%ldn,sum);longfact(intn)/*函数定义,有参函数,n为形参*/inti;longp=1;for(i=1;i=n;i+)p=p*i;returnp;【例7.4】计算1!+2!+3!+n!。第21页7.4函数参数传递方式在调用函数时,主调函数和被调函数之间有数据传递关系。数据传递由形参和实参来完成,实参把值传递给形参过程称为“形实结合”。函数参数分为形参和实参两种。形参出现在函数定义中,实参出现在主调函数中。发生函数调用时,主调函数把实参值传送给被调函数形参。第22页形参和实参特点形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配内存单元。所以,形参只在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。实参能够是常量、变量、表示式、函数等,不论实参是何种形式,在进行函数调用时,它们都必须含有确定值,方便把这些值传送给形参。第23页实参和形参在数量、类型和次序上应严格一致,不然会发生类型不匹配等错误。“值传递”函数调用中发生数据传送是单向,即只能把实参值传送给形参,在函数调用过程中,形参值发生改变时,不会使实参值发生改变。第24页#includevoidswap(intx,inty)inttemp;temp=x;x=y;y=temp;voidmain()inta=3,b=8;printf(交换前:%d,%dn,a,b);swap(a,b);printf(交换后:%d,%dn,a,b);【例7.5】调用swap函数使变量a、b内容发生交换。第25页数组元素作为实参数组用作函数参数有两种形式,p把数组元素(下标变量)作为实参使用。p把数组名作为函数形参和实参使用。数组元素作为函数实参加普通变量并无区分,即数组元素作为函数实参使用与普通变量完全相同。在发生函数调用时,把作为实参数组元素值传送给形参,实现单向值传送,即“值传递”方式。第26页#includevoidmain()intprime(int);/*函数申明*/inti,a10=3,8,12,13,15,17,21,23,25,27;for(i=0;i10;i+)if(prime(ai)=1)printf(%5d,ai);/*实参为数组元素*/printf(n);intprime(intx)/*判断x是否为素数*/intk=2;while(x%k!=0&kx)k+;if(k=x)return1;/*返回值为1,则x是素数*/elsereturn0;/*返回值为0,则x不是素数*/【例7.6】用函数实现输出数组中素数。注意:注意:函数中有两条return语句。不论碰到哪条都结束函数并携值返回main()函数。第27页数组名作函数参数用数组名作为函数参数时,形参和相对应实参都必须是类型相同数组或指针变量。因为数组名实际上是数组首地址,所以在数组名作函数参数时所进行传送是地址传送,也就是说把实参数组首地址赋予形参数组名。形参数组名取得该首地址之后,形参数组和实参数组为同一数组,共同拥有一段内存空间。第28页main()intarray10;f(array,10);f(intarr,intn);【例】调用swap函数使变量a、b内容发生交换。第29页说明实际上,能够接收并存放地址值只能是指针变量。C语言编译系统都是将形参数组名作为指针变量来处理。如数组形式:f(intarr,intn)在编译时是将arr按指针变量处理,相当于将函数首部写成:f(int*arr,intn)以上两种写法是等价。在调用该函数时,系统会建立一个指针变量arr,用以存放从主调函数传递过来实参数组首地址。第30页【例7.7】将数组a中n个元素按相反次序存放。比如:原始数组:37911067542交换后数组:24576011973本题算法是将a0与an-1对换,再a1与an-2对换,直到a(n-1)/2与a(n-int(n-1)/2)对换。#includevoidmain()intprime(int);/*函数申明*/inti,a10=3,8,12,13,15,17,21,23,25,27;for(i=0;i10;i+)if(prime(ai)=1)printf(%5d,ai);/*实参为数组元素*/printf(n);intprime(intx)/*判断x是否为素数*/intk=2;while(x%k!=0&kx)k+;if(k=x)return1;/*返回值为1,则x是素数*/elsereturn0;/*返回值为0,则x不是素数*/第31页二维数组名作函数参数二维数组作为函数参数形参,其表示方式为数据类型数据类型数组名数组名长度长度对应实参是已知二维数组名,长度即数组列数不能省略,且实参二维数组列数要与形参二维数组列数一致。比如:形参:intmax(intg4,intp,intt)实参:max(s,3,4),其中S定义为ints34=1,2,3,4,5,6,7,8,9,10,11,12第32页【例7.8】定义一个二维数组3*4,求最大数下标。#includevoidmax(inta4,intn,intm,intb);voidmain()inta34=3,7,9,11,0,6,7,5,4,2,81,-90,b2=0;max(a,3,4,b);printf(最大数下标为:%5d,%5dn,b0,b1);voidmax(inta4,intn,intm,intb)*数组b中b0和b1分别统计最大数行号和列号*intx=0,i,j;x=a00;for(i=0;in;i+)for(j=0;jx)x=aij;b0=i;b1=j;第33页7.5函数嵌套与递归调用函数嵌套调用pC语言中不能嵌套定义函数,但能够嵌套调用函数。p函数嵌套调用是指,在执行被调用函数时,被调用函数又调用了其它函数。第34页【例7.9】计算s=22!+s2!+n2!。#include/*定义函数fact,求阶乘*/longfactorial(intq)longc=1;inti;for(i=1;i=q;i+)c=c*i;returnc;/*返回c值,c=q!*/*定义函数mysqrt,求平方*/longmysqrt(intp)intk;longr;k=p*p;/*计算平方值*/r=factorial(k);/*调用fact函数*/returnr;/*返回r值,r=fact(p*p)*/*定义函数sum,求和*/longsum(intn)inti;longs=0;for(i=1;i=n;i+)s=s+mysqrt(i);/*调用mysqrt函数*/returns;voidmain()intn;scanf(%d,&n);printf(s=%ldn,sum(n);第35页【例7.10】用弦截法求方程根。取两个不同点x1、x2,如果f(x1)和f(x2)符号相反,则(x1,x2)区间内必有一个根。如果f(x1)与f(x2)同符号,则应改变x1、x2,直到f(x1)、f(x2)异号为止。注意x1、x2值不应差太大,以保证(x1,x2)区间只有一根。(2)连接f(x1)和f(x2)两点,此线(即弦)交x轴于x,见下列图第36页x x点坐标可用下式求出:点坐标可用下式求出:xyxf(x1)f(x)x1x2f(x2)再从再从x x求出求出f(x)f(x)。第37页(3)若f(x)与f(x1)同符号,则根必在(x,x2)区间内,此时将x作为新x1。假如f(x)与f(x2)同符号,则表示根在(x1,x2)区间内,将x作为新x2.(4)重复步骤(2)和(3),直到|f(x)|为止,为一个很小数,比如10-6。此时认为f(x)0,即x为方程根。第38页输入x1、x2,求f(x1)、f(x2)直到f(x1)与f(x2)异号求f(x1)与f(x2)连线与x轴交点xy=f(x),y=f(x1)y与y1同号x1=xy1=yx2=xy2=y直到|f(x)|root=x 输出root真假根据上述思路画出n-s流程图,见下列图第39页#include#include/*头文件,使用了库函数fabs*/*定义函数f,f(x)=x3-5x2+16x-80*/floatf(floatx)floaty;y=(x-5.0)*x+16.0)*x-80.0;return(y);/*定义函数xpoint,求弦与x轴交点*/floatxpoint(floatx1,floatx2)floaty;y=(x1*f(x2)-x2*f(x1)/(f(x2)-f(x1);return(y);第40页floatroot(floatx1,floatx2)/*定义函数root,求近似根*/floatx,y,y1;y1=f(x1);dox=xpoint(x1,x2);y=f(x);if(y*y10)y1=y;x1=x;elsex2=x;while(fabs(y)=0.0001);/*实型数求绝对值标准函数fabs*/return(x);第41页voidmain()floatx1,x2,f1,f2,x;doprintf(inputx1,x2:n);scanf(%f,%f,&x1,&x2);f1=f(x1);f2=f(x2);while(f1*f2=0);x=root(x1,x2);printf(Arootofequationis%8.4fn,x);第42页函数递归调用函数递归调用是指,一个函数在它函数体内,直接或间接地调用它本身。语言允许函数递归调用。在递归调用中,调用函数又是被调用函数,执行递归函数将重复调用其本身。每调用一次就进入新一层。为了预防递归调用无终止地进行,必须在函数内有终止递归调用伎俩。惯用方法是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。第43页n!=1 (n=0,1)n(n1)!(n1)【例7.11】用递归方法求n!。n!可用下面递归公式表示:#includelongfac(intn)longrs;if(n=1|n=0)/*递归结束*/rs=1;elsers=n*fac(n-1);/*函数递归调用*/returnrs;voidmain()intn;scanf(%d,&n);printf(%d!=%ldn,n,fac(n);/*函数调用*/第44页n=1n=2n=3n=4fac=4!fac=3!fac=2!fac=1n=5第45页【例7.13】Hanoi塔问题这是一个经典只有用递归方法(而不可能用其它方法)处理问题。问题是这么:一块板上有三根柱子A、B、C,A柱上套有64个大小不等圆盘,大在下,小在上,如图7.6所表示。要把这64个圆盘从A柱移动到C柱上,每次只能移动一个圆盘,移动能够借助B柱进行。但在任何时候,任何柱上圆盘都必须保持大盘在下,小盘在上。求移动步骤。BCAn个盘子个盘子第46页1)先将A塔 n-1 个盘子借助于C移至B上2)将A上剩下一个移至C上.3)将B上 n-1 个盘子借助于A移至C上.能够看到:1)、3)为同一问题,都为 n 1 个盘子借助于一个空塔移至另一塔上。第47页程序以下:#includevoidhanoi(intn,charA,charB,charC)if(n=1)printf(将第%d个盘子从%c柱-%c柱:n,n,A,C);elsehanoi(n-1,A,C,B);/*将第n-1个盘子从柱A搬到柱B*/printf(将第%d个盘子从%c柱-%c柱:n,n,A,C);/*将最终一个盘子从柱A搬到柱C*/hanoi(n-1,B,A,C);/*将第n-1个盘子从柱B搬到柱C*/第48页voidmain()charA=A,B=B,C=C;intn;printf(请输入A柱上盘子总数:);scanf(%d,&n);printf(当A柱上有%d个盘子时候,移动步骤依次为:n,n);hanoi(n,A,B,C);第49页递归关键点从编写递归函数程序角度看,有两个关键点。1)递归出口:即递归结束条件,何时结束递归调用。2)递归式子:递归表示式,如fac(n)=n*fac(n-1)。任何需要使用递归处理问题,抓住这两点,程序只是形式。第50页7.6函数与指针指针作函数参数指针变量既能够作为函数实参,也能够作为函数形参。指针作为形参,能够接收主调函数传送变量地址或数组地址;指针作为实参,向被调函数传递地址。p实参为数组名,形参为指针变量p实参为指针变量,形参为数组名p实参为指针变量,形参也为指针变量p实参为数组名,形参为数组p指针数组作实参第51页实参为数组名,形参为指针变量指针变量值是地址,数组名即为数组首地址,也可作为函数实参使用。main()inta10;f(a,10);f(int*x,intn)实参a为数组名,形参x为指向整型变量指针变量,函数开始执行时,x指向a0,即x=&a0。经过x值改变,能够指向a数组任一元素。第52页【例7.7修改】将数组a中n个元素按相反次序存放。比如:原始数组:37911067542交换后数组:24576011973本题算法是将a0与an-1对换,再a1与an-2对换,直到a(n-1)/2与a(n-int(n-1)/2)对换。#includevoidinv(int*x,intn)int*p,temp,*i,*j,m=(n-1)/2;i=x;j=x+n-1;p=x+m;for(;i=p;i+,j-)temp=*i;*i=*j;*j=temp;voidmain()inti,a10=3,7,9,11,0,6,7,5,4,2;printf(Beforen);for(i=0;i10;i+)printf(%5d,ai);inv(a,10);printf(nAftern);for(i=0;i10;i+)printf(%5d,ai);printf(n);第53页【例7.14】分别求数组中奇数元素与偶数元素和。#includevoidarr_sum(int*p,intn,ints)inti;for(i=0;in;i+)if(pi%2=0)s0=s0+pi;elses1=s1+pi;voidmain()inti,a10=3,7,9,11,0,6,7,5,4,2,b2=0,0;for(i=0;i10;i+)printf(%5d,ai);printf(n);arr_sum(a,10,b);printf(偶数和为%5d,奇数和为%5dn,b0,b1);第54页说明经过函数名(函数中用return语句返回)只能向主调函数返回一个值,多值返回问题必须借助数组名或指针作形参实现。地址调用与传值调用最大区分在于形参改变会影响实参。传值调用只是复制实参值给形参,形参在被调用时系统才为它提供新内存空间,所以形参值改变不会影响实参值;地址调用,形参和实参指向是同一地址存放空间,其中值既属于形参,也属于实参,形参值改变同时会改变实参值。第55页【例7.15】编写程序,经过函数给数组输入若干个大于0整数,用负数作为输入结束标志,并调用函数输出数组中元素。#include#defineM100voidarrout(int*,int);intarrin(int*);voidmain()intsM,k;k=arrin(s);arrout(s,k);arrin(int*a)inti=0,x;printf(请输入大于0整数,负数作为输入结束标志:n);scanf(%d,&x);while(x=0)*(a+i)=x;i+;scanf(%d,&x);returni;voidarrout(int*a,intn)inti;printf(输入整数数列为:);for(i=0;in;i+)printf(%d,*(a+i);printf(n);第56页实参为指针变量,形参为数组名第57页【例7.16】从10个数中找出其中最大值和最小值。#includevoidmax_min_value(intarray,intn,intm2)int*p,*array_end;array_end=array+n;m0=m1=*array;for(p=array+1;pm0)m0=*p;elseif(*pm1)m1=*p;voidmain()inti,number10,*pn,m2;pn=number;printf(Enter10integernumbers:n);for(i=0;i10;i+)scanf(%d,&numberi);max_min_value(pn,10,m);printf(max=%d,min=%dn,m0,m1);第58页【例7.17】用选择法对10个整数按降序排序。程序以下:所谓选择法就是先将10个数中最小数与a0对换,再将a1到a9中最小数与a1对换,每比较一轮,找出一个未经排序数中最小一个。共比较9轮。下面以5个数为例说明选择法步骤。#includevoidsort(intarray,intn)inti,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(arrayjarrayk)k=j;t=arrayk;arrayk=arrayi;arrayi=t;voidmain()int*p,i,a10;p=a;printf(inputthearray10:);for(i=0;i10;i+)scanf(%d,p+i);p=a;/*指针变量重新指向数组首地址*/sort(p,10);printf(thesortedarray10:);for(p=a,i=0;i10;i+)printf(%d,*p+);printf(n);第59页实参为指针变量,形参也为指针变量第60页【例7.16修改】从10个数中找出其中最大值和最小值。#includeintmax,min;voidmax_min_value(int*array,intn)/*形参用指针变量*/int*p,*array_end;array_end=array+n;max=min=*array;for(p=array+1;pmax)max=*p;elseif(*pmin)min=*p;voidmain()inti,number10,*p;p=number;/*使pn指向number数组*/printf(Enter10integernumbers:n);for(i=0;i10;i+,p+)scanf(%d,p);printf(The10integernumbers:n);for(p=number,i=0;i10;i+,p+)printf(%d,*p);p=number;/*使pn重新指向number数组首地址*/max_min_value(p,10);/*实参用指针变量*/printf(nmax=%d,min=%dn,max,min);第61页【例7.18】下面main函数试图经过调用swap函数交换主函数中变量a、b内容。#includevoidswap(int*x,int*y)inttemp;temp=*x;*x=*y;*y=temp;voidmain()inta=3,b=8,*p,*q;p=&a;q=&b;printf(交换前:%d,%dn,a,b);swap(p,q);printf(交换后:%d,%dn,a,b);第62页实参为数组名,形参为数组形参为数组情况与形参为指针变量情况类似。第63页指针数组作实参当指针数组作为实参时,对应形参应该是一个指向指针指针。main()doublea53,*p5;for(i=0;i5;i+)pi=ai;func(p);第64页则func函数首部能够是以下三种形式之一:fun(double*a5);fun(double*a);fun(double*a)。因为传送是一维指针数组,所以参数定义形式与一维数组名作实参形式类似。第65页返回指针值函数函数返回值假如是指针,则称为返回指针值函数,简称指针函数。定义指针函数普通形式为类型说明符类型说明符*函数名函数名(形参表形参表)/*函数体函数体*/例:int*pa(intx,inty)第66页返回指针值函数申明格式:类型说明符类型说明符*函数名函数名(形参表形参表);调用格式:指针变量指针变量=函数名函数名(实参表实参表);第67页【例7.19】经过指针函数输入一个17之间整数,输出对应星期名。#include#includevoidmain()inti;char*day_name(intn);printf(inputDayNo:n);scanf(%d,&i);if(i%sn,i,day_name(i);char*day_name(intn)staticchar*name=Illegalday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday;return(n7)?name0:namen);第68页说明函数指针变量和指针型函数二者在写法和意义上区分。int(*p)()和int*p()是两个完全不一样语句:int(*p)()是一个变量定义,指明p是一个指向函数入口指针变量,该函数返回值是整型量,(*p)两边括号不能少;int*p()则不是变量说明,而是说明P为函数名,函数返回值类型为指针。第69页函数指针和指向函数指针变量在语言中,一个函数在编译时总是被分配一个入口地址,这个入口地址就称为函数指针。函数总是占用一段连续内存区,而函数名就是该函数所占内存区首地址。把函数这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数,然后经过指针变量就能够找到并调用这个函数。通常把这种指向函数指针变量称为“函数指针变量”。第70页函数指针变量定义普通形式为类型说明符类型说明符(*指针变量名指针变量名)();比如:int(*pf)();p表示pf是一个指向函数入口指针变量,该函数返回值(函数值)是整型。经过指向函数指针变量调用函数普通形式为(*指针变量名指针变量名)(实参表实参表);第71页【例7.21】求a和b中较大者,用指针形式实现对函数调用方法。#includeintmax(inta,intb)if(ab)returna;elsereturnb;voidmain()intmax(inta,intb);int(*pmax)(int,int);intx,y,z;pmax=max;printf(inputtwonumbers:n);scanf(%d%d,&x,&y);z=(*pmax)(x,y);printf(maxmum=%dn,z);第72页说明函数调用既能够经过函数名调用,也可经过指向函数指针变量调用。函数指针变量不能进行算术运算,如pmax+n、p+、p-等,函数指针移动毫无意义。函数调用中“(*指针变量名)”两边括号不可缺乏,其中“*”不应该了解为求值运算,在此处它只是一个表示符号。第73页在给函数指针变量赋值时,只需要给出函数名,而无须给参数。比如,pmax=max,此时只是将函数max入口地址赋值给pmax,而不包括到实参加形参结合问题,此时不能写成pmax=max(a,b)形式。第74页主函数main参数普通情况下,在编写main函数时,都是不带参数,main后面都是空括号,没有参数。实际上,main函数能够带参数,这个参数能够认为是main函数形式参数。语言要求main函数参数只能有两个,可由用户自己命名,习惯上这两个参数写为argc和argv。第75页C语言还要求第一个形参argc必须是整型变量,第二个形参argv必须是字符型指针数组,这个字符型指针数组每个元素都指向一个字符串,故第二个参数argv还可直接定义为char*argv;加上形参说明后,main函数函数头可写为main(intargc,char*argv)也可写成:main(intargc,char*argv)第76页main函数不能被其它函数调用。main函数参数值只能从操作系统命令行上取得。当要运行一个可执行文件时,在DOS提醒符下键入文件名,再输入实际参数便可把这些实参传送到main形参中去。DOS提醒符下命令行普通形式为C:可执行文件名可执行文件名参数参数参数参数第77页main两个形参和命令行中参数在位置上不是一一对应。argc参数表示了命令行中参数个数(文件名本身也算一个参数),argc值是在输入命令行时由系统按实际参数个数自动赋予。第78页比如,设包含上述main函数文件经过编译后,产生可执行文件名为Myfile.exe,在DOS提醒符号下输入:C:MyfileOK!GoodMorning文件名Myfile本身也算一个参数,所以共有4个参数,所以argc取得值为4,即参数个数。argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)首地址,指针数组长度即为参数个数,数组元素初值由系统自动赋予,argv0、argv1、argv2、argv3分别指向字符串“Myfile”、“OK!”、“Good”和“Morning”。第79页【例7.22】显示命令行中输入参数。#includevoidmain(intargc,char*argv)inti;printf(argc=%dn,argc);while(argc-1)printf(%s,*+argv);假如本例可执行文件名为Myfile.exe,且输入命令行是C:MyfileOK!GoodMorning第80页7.7函数与结构体将某一结构体变量值传递给另一个函数,有以下3种方法。p在函数之间传递结构体组员值与结构体组员地址。p在函数之间传递结构体组员值。比如,用stu1.num或stu2.name作函数实参。使用方法和普通变量作实参是一样,属于“值传递”方式。p在函数之间传递结构体变量。p向函数传递结构体变量(或数组)地址(指针)。第81页用结构体变量作参数系统允许把结构体变量作为一个整体传送给对应形参,这时形参必须是同类型结构体变量,在函数调用时形参也要占用内存单元,并将实参中各组员值赋给对应形参。因为采取值传递方式,假如在执行被调用函数期间改变了形参值,该值将不能返回主调函数。第82页【例7.23】有一个结构体变量stu,内含学生学号、姓名和三门课程成绩,要求用结构体变量作为函数参数,在main函数中赋予值,在另一个函数中输出。#include#includestructstudentintnum;charname9;floatscore3;voidmain()voidprint(structstudentstu);structstudentstu;stu.num=10101;strcpy(stu.name,李红);stu.score0=60;stu.score1=70;stu.score2=80;print(stu);voidprint(structstudentstu)printf(%dn%sn%4.1fn%4.1fn%4.1fn,stu.num,stu.name,stu.score0,stu.score1,stu.score2);第83页【例7.24】利用结构变量求解两个复数之积:(3+4i)(5+6i)。#includestructcomplxintreal,im;/*real:复数实部,im:复数虚部*/;structcomplxcmult(structcomplxza,structcomplxzb)structcomplxw;w.real=za.real*zb.real-za.im*zb.im;w.im=za.real*zb.im+za.im*zb.real;return(w);/*返回结果,结构类型*/voidmain()structcomplxa=3,5,b=4,6,c;c=cmult(a,b);printf(%d+%din,c.real,c.im);第84页用指向结构体变量指针作参数用指向结构体变量(或数组- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 公共课 一等奖 全国 获奖 课件
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【a199****6536】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【a199****6536】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【a199****6536】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【a199****6536】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文