欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    《高级语言程序设计教学课件》第7章.ppt

    • 资源ID:5904936       资源大小:725.50KB        全文页数:71页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    《高级语言程序设计教学课件》第7章.ppt

    1,第7章 函数,2,第7章 函数,7.1 函数的概念7.2 函数的简单调用7.3 数组作为函数参数的调用7.4 函数的嵌套调用7.5 函数的递归调用7.6 变量的作用域7.7 变量的存储类别,3,学习目标,函数定义和函数调用掌握数组作为参数的函数调用掌握函数的嵌套和递归调用掌握变量作用域了解变量存储类别,4,7.1 函数的概念,1、C是模块化程序设计语言C是函数式语言必须有且只有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束所有函数是平行的,函数不能嵌套定义,可以嵌套调用,#include stdio.hvoid main(void)float x,y,z;float average(float a,float b);printf(输入2个数值:);scanf(%f%f,5,5,【例7-1】计算两个数的平均值。,主函数,子函数,函数声明,函数调用,函数定义,函数返回值,6,简单的函数举例,main()printf(“*n”);printf(“How do you do!n”);printf(“*n”);,要求在屏幕上输出下列的图形*How do you do!*,7,简单的函数举例,#include void printstar(int num);main()printstar(10);printf(“How do you do!n”);printstar(10);,函数声明,函数调用,void printstar(int num)int i;for(i=0;inum;i+)printf(“*”);printf(“n”);,函数定义(无返回值),8,int max(int x,int y)int z;z=x y?x:y;return z;main()int a=5,b=9,c;c=max(a,b);printf(“Max=%d”,c);,例:求两个数中的最大值,函数定义,函数调用,函数返回值,9,2、函数分类从用户角度标准函数(库函数):由系统提供用户自定义函数 printstar(int num)从函数形式无参函数有参函数strlen(字符数组名),10,使用库函数应注意的问题,1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值的意义和类型4、需要使用的包含头文件,strlen(str),11,例 有参函数 int max(int x,int y)int z;z=xy?x:y;return(z);,例 无参函数 printstar()printf(“*n”);或 void printstar(void)printf(“*n”);,7.2 函数的定义,1、函数定义的一般格式,存储类别 函数类型 函数名(形参列表)说明部分语句部分,例 有参函数 int max(int x,y)int z;z=xy?x:y;return(z);,函数带回来的值的类型若缺省为:int整型函数没有返回值定义为void,12,2、函数的返回值返回语句的形式:功能:使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数说明:只能返回一个值,而不能返回多个值。return(x,y);,return(表达式);return 表达式;return;,13,函数语句 printstar(10);表达式方式 函数调用出现在表达式中,函数的返回值参加表达式的运算。c=5*max(a,b);作为函数的参数 printf(“max=%d”,max(a,b);c=max(k,max(i,j);,函数的调用方式,int max(int x,int y)int z;z=x y?x:y;return(z);,14,【例7-3】输出数字金字塔,#include void main(void)int num;void pyramid(int n);printf(请输入金字塔的层数:);scanf(%d,请输入金字塔的层数:5 1 2 2 3 3 3 4 4 4 45 5 5 5 5Press any key to continue,15,void pyramid(int n)int i,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”);/*换行*/,请输入金字塔的层数:5 1 2 2 3 3 3 4 4 4 45 5 5 5 5Press any key to continue,16,【例7-4】判断素数,#include stdio.h#include math.hint prime(int n)int k,i,result;k=sqrt(n);for(i=2;i k)result=1;else result=0;return result;,【例4-16】判断n是否为素数 P75for(i=2;isqrt(n)printf(%d is a prime number!n,n);else printf(%d is not a prime number!n,n);,17,void main(void)int a=1777,b=1991;if(prime(a)printf(%d是素数n,a);else printf(%d不是素数n,a);if(prime(b)printf(%d是素数n,b);else printf(%d不是素数n,b);,1777是素数1991不是素数,18,说明:函数中可有多个return语句,但是,当程序执行到第一个return语句时,函数执行完毕,后面的程序不再执行,返回到函数调用处若无return语句,遇 时自动返回调用函数void型函数没有返回值的函数若return返回值的类型和函数类型不一致,系统自动转换成函数类型后返回,void printstar(int n)for(i=0;in;i+)printf(“*“);printf(“n”);,int max(int x,int y)if(xy)return x;else return y;,int fun()return 10;int a=5;return a;,#include stdio.hint average(float a,float b)float c;c=(a+b)/2;return c;int main(void)float x,y,z;x=10.0;y=5.0;z=average(x,y);printf(“%.2fn,z);,7.00Press any key to continue,19,【例7-5】编写函数,交换两个变量的数值,#include stdio.hvoid swap(int x,int y);void main(void)int a,b;printf(请输入交换的数值:);scanf(%d%d,请输入交换的数值:7 11交换前a=7,b=11交换后a=7,b=11,20,为什么没有实现数值的交换?函数间的参数传递,形式参数和实际参数 形参:定义函数时,函数名后括号内的变量。形式参数只有在函数被调用时才分配变量空间(产生),并在函数调用结束后,释放变量空间(消失)。实参:调用函数时,函数名后括号内的表达式。形式参数与实际参数的关系 形参与实参类型一致,个数相同。若类型不一致,自动按形参类型转换。,main()int a,b,c;scanf(%d,%d,21,【例7-5】编写程序,交换两个变量的数值,#include stdio.hvoid swap(int x,int y);void main(void)int a,b;printf(请输入交换的数值:);scanf(%d%d,7,11,调用前,调用时,调用结束,22,结论,参数“值”传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向值传递(形参的改变并不影响实参),23,函数的声明,对被调用函数要求必须是已存在的函数1)库函数:#include 2)用户自定义函数:进行函数声明函数声明一般形式,函数类型 函数名(形参类型 形参名,);函数类型 函数名();,24,例如:int max(int x,int y);int max(int,int);,int max(int x,int y)int z;z=x y?x:y;return(z);,可以省略形参的名称,函数的声明,25,函数声明的位置函数的数据说明部分在预编译命令之后(建议使用),26,函数的声明举例,void main(void)int a,b;printf(请输入交换的数值:);scanf(%d%d,void swap(int x,int y);,void swap(int x,int y);,void swap(int x,int y)int temp;temp=x;x=y;y=temp;void main(void)int a,b;printf(请输入交换的数值:);scanf(%d%d,27,7.3 数组作为参数的函数调用,当形式参数是一维数组时,可以说明数组长度或不说明数组的长度形参数组与实参数组公用一块内存空间,main()int b6=,c;c=fun(b);int fun(int a6),int a,b,a,调用前,调用时,调用后,28,参数的“地址”传递方式方式:函数调用时,将数据的存储地址作为参数传递给形参函数调用后,形式参数数组a并没有像实际参数数组b一样再次申请一块连续的空间,而是使得数组a与数组b首地址相同。这样,在函数中访问数组a中的元素实际上等同于访问数组b中的元素,从而实现数组参数传递,29,特点:本质上仍然是“值”传递,只是传递的值是“地址”形参与实参指向同样的存储单元实参和形参必须是地址常量或地址变量“双向”传递形参的改变影响实参,30,函数中如何知道数组的长度呢?,C语言没有为函数提供任何简便的方法来确定传递给它的数组的长度。但是,处理数组,长度是必须的,所以通常要把数组长度也作为形式参数。,例如:int fun(int a,int n),31,【例7-6】求数组中元素的最大值,#include stdio.h#define N 10float max_array(float a,int n);void main(void)float arrayN,max;int i;printf(请输入%d个实数:n,N);for(i=0;i N;i+)scanf(%f,请输入10个实数:1.2 2.3 3.4 4.5 5.6 6.7 7.8 8.9 9.0 2.1最大的数组元素值是:9.00Press any key to continue,32,【例7-6】求数组中元素的最大值。,float max_array(float a,int n)int i;float max;max=a0;for(i=1;i max)max=ai;return max;,可以说明数组长度或不说明数组的长度,33,【例7-7】比较两个数组a和b的大小,比较规则为:,用m,n和k分别记录两个数组对应元素的比较结果,如果ai大于bi,m+,否则如果ai等于bi,k+,否则n+。如果mn,数组a大于b,否则如果mn,数组a小于b,否则数组a等于b。,34,#include stdio.h#define N 5int cmp_array(int a,int b,int length);void main(void)int aN,bN,cmp,i;printf(请输入数组1:%d个整数:n,N);for(i=0;i N;i+)scanf(%d,35,cmp=cmp_array(a,b,N);if(cmp0)printf(数组1大于数组2n);else if(cmp0)printf(数组1小于数组2n);else printf(数组1等于数组2n);,请输入数组1:5个整数:1 2 3 4 5请输入数组2:5个整数:3 4 5 1 2数组1小于数组2Press any key to continue,36,int cmp_array(int a,int b,int length)int i,result,m,n,k;m=n=k=0;for(i=0;i bi)m+;else if(ai n)result=1;else if(m n)result=-1;else result=0;return result;,37,【例7-8】编写函数实现字符串的复制,#include stdio.h#include string.h#define N 80void copy_string(char from,char to);void main(void)char aN,bN;printf(请输入一串字符串:n);gets(a);copy_string(a,b);puts(b);,字符串是以一维字符数组形式存放的,所以字符串的传递与一维数组的传递方式相同。,38,void copy_string(char from,char to)int i;for(i=0;fromi!=0;i+)toi=fromi;toi=0;,请输入一串字符串:I Love China!I Love China!,由于字符串具有结束标识0,所以函数定义中不需要数组长度参数,39,【例7-9】编写函数实现学生成绩按平均分排名,学生成绩存储在一个二维数组中,#include stdio.h#define M 5/*学生人数*/#define N 5/*成绩科数*/void sort_score(float scoreN,float ave);void main(void)float scoreMN=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;float aveM;int i,j;,40,【例7-9】编写函数实现学生成绩按平均分排名,学生成绩存储在一个二维数组中。,sort_score(score,ave);for(i=0;i M;i+)/*按排名输出学生成绩*/printf(第%d名学生平均成绩:%.2fn,i+1,avei);for(j=0;jN;j+)printf(%10.2f,scoreij);printf(n);,第1名学生的平均成绩为:91.2090.00 97.00 89.00 88.00 92.00第2名学生的平均成绩为:90.4080.00 89.00 98.00 97.00 88.00第3名学生的平均成绩为:81.6080.00 85.00 78.00 97.00 68.00第4名学生的平均成绩为:80.8098.00 61.00 78.00 99.00 68.00第5名学生的平均成绩为:73.0060.00 75.00 79.00 95.00 56.00,41,void sort_score(float scoreN,float ave)float sum,temp;int i,j,k;for(i=0;iM;i+)/*计算平均成绩*/sum=0;for(j=0;jN;j+)sum=sum+scoreij;avei=sum/N;,在C语言中,当形式参数是多维数组时,可以忽略第一维的长度,后面的维数必须书写,计算平均成绩并排序的函数,42,for(i=0;iM-1;i+)/*成绩排序*/for(j=i+1;jM;j+)if(avei avej)temp=avei;avei=avej;avej=temp;for(k=0;kN;k+)temp=scoreik;scoreik=scorejk;scorejk=temp;,43,地址传递在主调函数与被调函数要分别定义数组,并且数组类型应一致,如不一致将出错形参数组是一维数组,大小可不指定;是多维数组第一维可不指定形参数组名是地址变量,数组做函数参数的说明,44,7.4 函数的嵌套调用,说明:函数定义时不可嵌套调用时可以嵌套其它函数,main()int m,n;printf(%d,max(m,n);,int max(int x,int y)return(xy?x:y);,45,7.4 函数的嵌套调用,说明:函数定义时不可嵌套调用时可以嵌套其它函数,main(),调用函数a,结束,a函数,b函数,调用函数b,main.a();.int a()/a定义.b();.int b()/b定义.,46,【例7-10】编写函数计算最大公约数和最小公倍数,#include stdio.hint gys(int a,int b);int gbs(int a,int b);void main(void)int x,y;printf(输入两个整数:n);scanf(%d%d,47,【例7-10】编写函数计算最大公约数和最小公倍数。,int gys(int a,int b)int i;for(i=a=1;i-)if(a%i=0,48,【例7-10】编写函数计算最大公约数和最小公倍数。,int gbs(int a,int b)int t=a*b/gys(a,b);return t;,49,【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根,#include stdio.h#include math.h#define N 10float average(float a,int n);float variance(float a,int n,float ave);float rms(float a,int n);,50,void main(void)float xN,var;int i;printf(输入%d个数值:n,N);for(i=0;i N;i+)scanf(%f,51,【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根。,float average(float a,int n)int i;float sum=0.0;for(i=0;in;i+)sum=sum+ai;return sum/n;,52,【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根。,float variance(float a,int n,float ave)int i;float var;var=0.0;for(i=0;in;i+)var=var+pow(ai-ave),2);return var;,53,【例7-11】编写函数计算数组元素的均方差。方差等于数组中所有元素与其平均值的平方和,它描述的是数据波动的情况,均方差等于方差的平方根。,float rms(float a,int n)int i;float ave,var;ave=average(a,n);var=variance(a,n,ave);var=sqrt(var);return var;,输入10个数值:1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0这些数值的均方差为:9.0830,54,int f(int x)int y,z;z=f(y);.return(2*z);,7.5 函数的递归调用,定义:函数直接或间接的调用自身叫函数的递归调用,int f1(int x)int y,z;z=f2(y);.return(2*z);int f2(int t)int a,c;c=f1(a);.return(3+c);,55,说明C编译系统对递归函数的自调用次数没有限制每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出,56,【例7-12】编写函数计算整数的阶乘,double fact(int n);main()int n;scanf(“%d”,57,fac(int n),double f;,if(n=1|n=0),fac(n-1),return(24);,1,fac(int n),double f;,if(n=1|n=0),fac(n-1),return(6);,2,fac(int n),double f;,if(n=1|n=0),fac(n-1),return(2);,3,fac(int n),double f;,if(n=1|n=0),f=1;,return(1);,4,58,7.6 变量的作用域,变量定义的3个基本位置,函数内部,函数参数,函数外部,内部变量,外部变量,(局部变量),(全局变量),59,局部变量,定义:在函数内定义,只在本函数内有效说明main中定义的变量只在main中有效形参属于局部变量,即只在函数中有效不同函数中同名变量,占不同内存单元 复合语句中定义的变量,只在复合语句中有效,60,main()int a=3,b=4;printf(main:a=%d,b=%dn,a,b);sub();printf(main:a=%d,b=%dn,a,b);sub()int a,b;a=6;b=7;printf(sub:a=%d,b=%dn,a,b);,main:a=3,b=4sub:a=6,b=7main:a=3,b=4,说明 不同函数中同名变量,占不同的存储单元,3,4,6,7,61,#define N 5main()int i;int aN=1,2,3,4,5;for(i=0;iN/2;i+)int temp;temp=ai;ai=aN-i-1;aN-i-1=temp;printf(%d,temp);for(i=0;iN;i+)printf(%d,ai);,说明 复合语句中定义的变量,只在复合语句中有效,62,全局变量,定义:在函数外定义,可为本文件所有函数共用有效范围:从定义变量的位置开始到本文件结束,应尽少使用全局变量,因为:全局变量在程序全部执行过程中占用存储单元降低了函数的通用性、可靠性、可移植性降低程序清晰性,容易出错局部变量与全局变量重名时,局部优先,63,例 全局变量说明(在同一文件中),int p=1,q=5;float f1(int a)int b,c;int f3()char c1,c2;char f2(int x,int y)int i,j;main()int m,n;.,p,q的作用范围,c1,c2的作用范围,64,int a=3,b=5;max(int a,int b)int c;c=ab?a:b;return(c);main()int a=8;printf(max=%d,max(a,b);,运行结果:max=8,例 全局变量与 同名,_起作用,局部变量,局部变量,65,7.7 变量的存储类型,静态存储区,动态存储区,程序运行期间分配固定存储空间,程序运行期间根据需要,动态分配存储空间,Extern,Static,Register,auto,变量的存储类型规定了该变量数据在内存中的存储区域。在不同存储区域存储的数据,有不同的生存期。,66,auto变量,定义:auto 数据类型 变量名使用范围函数中的形参函数内部的变量复合语句中定义的变量说明:没有做特殊说明的变量都是auto变量特点:动态分配存储空间退出函数后自动释放空间,67,register变量,定义方法:register 数据类型 变量名使用范围:函数内部使用条件:当某些变量使用频繁时优点:提高执行效率,int fac(int n)register int i,f;for(i=1;i=n;i+)f=f*i;return f;main()int i;for(i=1;i=5;i+)printf(“%d!=%d”,i,fac(i);,68,static变量,定义方法:static 数据类型 变量名使用范围:函数的内部和函数外部特点:在静态存储区分配存储单元,在程序的整个运行期间都不释放空间静态变量是编译时赋初值,即只赋值一次若静态变量不赋初值,则系统指定为0(对数值型)或空字符(对字符型)局部静态变量在函数调用结束后仍然存在于静态存储区,但其他函数是不能引用的,69,静态变量举例,f(int a)int b=0;static c=3;b=b+1;c=c+1;return(a+b+c);main()int a=2,i;for(i=1;i3;i+)printf(“%d”,f(a);,4,1,5,1,2,3,70,extern变量,定义方法:extern 数据类型 变量名说明extern不是变量定义,只是扩展全局变量作用域,int p=1,q=5;float f1(int a)int b,c;int f3()char c1,c2;char f2(int x,int y)int i,j;main()int m,n;.,extern char c1,c2;,extern char c1,c2;,71,自动赋初值0或空字符,不确定,编译时赋初值,只赋一次,每次函数调用时,其它文件,本文件,定义变量的函数或复合语句内,程序整个运行期间,函数调用开始至结束,静态存储区,寄存器,动态区,静态存储,动态存储,extern,全局static,局部static,register,auto,变量存储类型,

    注意事项

    本文(《高级语言程序设计教学课件》第7章.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开