C语言程序设计教学课件:函数学习指导

上传人:壹****1 文档编号:570039945 上传时间:2024-08-01 格式:PPT 页数:37 大小:334KB
返回 下载 相关 举报
C语言程序设计教学课件:函数学习指导_第1页
第1页 / 共37页
C语言程序设计教学课件:函数学习指导_第2页
第2页 / 共37页
C语言程序设计教学课件:函数学习指导_第3页
第3页 / 共37页
C语言程序设计教学课件:函数学习指导_第4页
第4页 / 共37页
C语言程序设计教学课件:函数学习指导_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《C语言程序设计教学课件:函数学习指导》由会员分享,可在线阅读,更多相关《C语言程序设计教学课件:函数学习指导(37页珍藏版)》请在金锄头文库上搜索。

1、函数函数学习指导学习指导学习方法建议学习方法建议1.掌握掌握C语言的基本语法规则语言的基本语法规则2.掌握程序设计的一般思想和方法掌握程序设计的一般思想和方法3.多阅读程序、多动手上机编写、调试程序多阅读程序、多动手上机编写、调试程序4.熟练程序的调试过程熟练程序的调试过程一、一、C语言基本组成结构语言基本组成结构v基本数据类型基本数据类型v数据的输入输出数据的输入输出v选择选择程序设计程序设计v循环循环程序设计程序设计v数组数组v函数函数v指针指针v编译预处理编译预处理v结构体、共用体结构体、共用体v文件文件 本章知识点本章知识点函数的定义函数的定义函数的函数的声声明明函数参数函数参数的传递

2、的传递函数的调用函数的调用函数的返回值函数的返回值函数的递归调用函数的递归调用变量的作用域和变量的作用域和存储方法存储方法内部函数和外部函数内部函数和外部函数一、函数定义一、函数定义定义函数应包括的内容:定义函数应包括的内容:(1)指定函数的名字,以便以后按名调用;)指定函数的名字,以便以后按名调用;(2)指定函数的类型,即函数值的类型;)指定函数的类型,即函数值的类型;(3)指定函数的参数的名字和类型(有参);)指定函数的参数的名字和类型(有参);(4)指定函数执行的操作,即函数完成的功能。)指定函数执行的操作,即函数完成的功能。定义函数的一般形式定义函数的一般形式类型标识符类型标识符函数名

3、函数名(形式参数表形式参数表)说明部分说明部分语句语句若无参数,写若无参数,写void或空。或空。是被初始化的内部变量,是被初始化的内部变量,寿命和可见性仅限于函寿命和可见性仅限于函数内部数内部不说明类型,自动按整不说明类型,自动按整型处理型处理.建议都指定类型建议都指定类型函数体(一段程序,实现函数体(一段程序,实现函数的功能)函数的功能)二、函数的调用二、函数的调用(1)函数语句函数语句:(把(把函数调用作为一个语句)函数调用作为一个语句)一般形式:一般形式:函数名(实际参数表);函数名(实际参数表);(2)函数表达式函数表达式:(函数调用出现在一个表达式中,必须(函数调用出现在一个表达式

4、中,必须带回一个值)带回一个值)一般形式:一般形式:变量名变量名=函数表达式函数表达式函数调用函数调用执行过程:执行过程:计算各个表达式(计算各个表达式(TC2.0,VC+6.0实参求值顺序实参求值顺序自右至左自右至左);把得到值赋给对应的形参把得到值赋给对应的形参;执行函数体执行函数体;遇到遇到return或执行完最后一条语句或执行完最后一条语句,返回到函数调用处返回到函数调用处.三、函数的返回值三、函数的返回值1.函数的返回值语句函数的返回值语句一般形式:一般形式:return表达式表达式;或或return(表达式);(表达式);功能:功能:退出函数,将表达式的值带回主调函数,回到退出函数

5、,将表达式的值带回主调函数,回到程序原来的位置继续执行。程序原来的位置继续执行。 returnreturn语句只能把语句只能把一个返回值一个返回值传递给调用函数。传递给调用函数。若若returnreturn语句中表达式类型与函数类型不一致,以语句中表达式类型与函数类型不一致,以函数类型函数类型为准为准。返回值可以是返回值可以是有确定值有确定值的常量、变量或表达式,也可以是地的常量、变量或表达式,也可以是地址。当返值是地址时,应该用指针接受。址。当返值是地址时,应该用指针接受。无返回值的函数,应定义为无返回值的函数,应定义为voidvoid类型类型( (无类型函数)。无类型函数)。 (VC+6.

6、0必须指定函数类型)。必须指定函数类型)。一个函数中可以有多个返回语句。一个函数中可以有多个返回语句。1.值传递值传递:在函数调用时,实参将其在函数调用时,实参将其值值传递给形参。传递给形参。实参对形参的数据传递是实参对形参的数据传递是“单向传递值传递单向传递值传递”,只由,只由实参实参传递给传递给形参形参,而不能由形参传回来给实参。,而不能由形参传回来给实参。实参与形参占用不同的单元。在调用函数时,给形参实参与形参占用不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值

7、。在执后,形参单元被释放,实参单元仍保留并维持原值。在执行被调用函数时,形参的值如果发生变化,并不会改变主行被调用函数时,形参的值如果发生变化,并不会改变主调函数中实参的值。调函数中实参的值。如:简单变量、常量、表达式、下标变量、函数调用等。如:简单变量、常量、表达式、下标变量、函数调用等。四、函数参数的传递四、函数参数的传递2.2.地址传递地址传递:函数调用时,函数调用时,将实参的将实参的地址地址传递给形参传递给形参。 实参和形参指向同一内存空间,对形参的修改,直接实参和形参指向同一内存空间,对形参的修改,直接影响实参。影响实参。 如:数组名、变量的地址作参数如:数组名、变量的地址作参数。例

8、例: 有函数调用语句:有函数调用语句: int i=3; printf(”%d,%d”,i,+i);输出结果为:输出结果为:4,4 若改为:若改为: int i=3, j; j=i; printf(”%d,%d”,i,+j);输出结果为:输出结果为:3,4 main () int x=1,y=2,z=1; printf(%d %dn,(+x,y+,z+),x+y+z+); 2 4 例例1 1 编写函数交换两个变量的值。编写函数交换两个变量的值。 #include “stdio.h” void swap ( int x, int y) int temp; temp=x; x=y; y=temp;

9、 printf ( x=%d, y=%dn, x, y);main ( ) int a, b; a=5; b=10; printf ( a=%d, b=%dn, a, b); swap(a, b); printf ( a=%d, b=%dn, a, b);运行结果:运行结果:a=5,b=10x=10,y=5a=5,b=10例例2:编写函数求三个数中的最大值。:编写函数求三个数中的最大值。#include“stdio.h”intmax(intx,inty,intz)intt;if(x=y)t=x;elset=y;if(tz)t=z;returnt;main()intx,y,z;scanf(“%d

10、%d%d”.&x,&y,&z);printf(“max=%d”,max(x,y,z);实参单项值传递,带回一个返回值。例例3:删除字符串中指定字符,在主函数中调用并输出删除子串:删除字符串中指定字符,在主函数中调用并输出删除子串后的字符串。后的字符串。voiddel(chars,inti,intn)intj,k,length=0;while(slength!=0)A;j=-i;k=i+n;while(klength)sj+=sk+;sj=0;main()charstr=management;del(B);printf(Thenewstringis:%sn,str);答案答案A:length+B

11、:str,3,4实参与形参是地址传递,实参与形参是地址传递,对形参的操作就是对实对形参的操作就是对实参的操作。参的操作。无需返回值输出:mament例例4:编写函数,编写函数,找出任意一个二维数组中的鞍点。鞍点即是该位置找出任意一个二维数组中的鞍点。鞍点即是该位置上的元素在所在行中最大而在所在列中最小。要求输出鞍点的位上的元素在所在行中最大而在所在列中最小。要求输出鞍点的位置置,无鞍点时给出有关信息。无鞍点时给出有关信息。#includestdio.h#defineM4#defineN4voitandian(intaMN)inti,j,k,max,jj,flag=0;for(i=0;iM;i+

12、)max=ai0;for(j=0;jmax)max=aij;jj=j;for(k=0;kM;k+)if(akjj=M)printf(%d%d%dn,i,jj,aijj);flag=1;if(flag=0)printf(无鞍点无鞍点!n);main()inti,j,aMN;for(i=0;iM;i+)for(j=0;jN;j+)scanf(“%d”,&aij);andian(a);运行情况:运行情况:输入:输入:1976460587823898输出:输出:116例例5 5:以下函数的功能是利用顺序查找法从给定的数组中检索关键字:以下函数的功能是利用顺序查找法从给定的数组中检索关键字m m,若找,

13、若找到此元素或查找到数组尾时结束,若找到,返回此元素的下标;若未找到,到此元素或查找到数组尾时结束,若找到,返回此元素的下标;若未找到,返回值返回值-1-1。#includeintsearch(inta10,intn)inti;for(i=0;i10;i+)if(A)return(i);return(-1);main()inti,a10=2,1,0,3,4,6,7,9,5,8,m,no;scanf(“%d”,&m);no=search(a,m);if(B)printf(“nOK,Found!%d”,no+1);elseprintf(“nSorry,NotFound!”);A:ai=nB:no!

14、=-1例例6:使用函数编写一个竞赛评分程序。(设有:使用函数编写一个竞赛评分程序。(设有6位选手,位选手,5位评位评委)。可以使用随机数函数获取数据,随机函数包含在委)。可以使用随机数函数获取数据,随机函数包含在stdlib.h中,函数原型:中,函数原型:intrand(void)。注注意:为了使每次生成的随机数都不同,在使用意:为了使每次生成的随机数都不同,在使用rand()函数之函数之前要使用包含在前要使用包含在time.h中的中的srand(time(NULL)函数重新部署一函数重新部署一次种子。如:次种子。如:#include#include#includemain()inta30,i

15、;srand(time(NULL);for(i=0;i30;i+)ai=rand()%90+10;程序示例程序示例/*评分程序*/#include stdio.h#include #include #define M 6#define N 5void mark(float aMN,float dM)int i,j,k,b=0,c=0;float sum,max,min; for(k=0,i=0;iM;i+,k+) min=max=ai0; sum=ai0; b=c=0;for(j=1;jmax) max=aij; b=j; if(aijmin) min=aij; c=j; sum=sum+ai

16、j; dk=(sum-aib-aic)/3; for(k=0;kM;k+) printf(第%d名的成绩是:%.2fn,k+1,dk);main()float aMN,dM;int i,j;srand(time(NULL); /*重新部署一次种子重新部署一次种子*/ printf(请按顺序输入N位评委对每位选手的评分并按回车:n);for(i=0;iM;i+) /*随机产生选手成绩随机产生选手成绩*/ for(j=0;jN;j+) aij=rand()%90+10; for(i=0;iM;i+) /*输出随机产生的选手成绩输出随机产生的选手成绩*/ for(j=0;j=0;i-) printf

17、(%d ,ai); main()int n=5;scanf(%d,&n); transfer(n);五、递归程序设计递归的概念:递归的概念:在调用一个函数的过程中在调用一个函数的过程中直接或间接地直接或间接地调用该函数本身。调用该函数本身。递归函数的执行过程:递归函数的执行过程:-递归调用:记住本次现场,递归调用。递归调用:记住本次现场,递归调用。-终了调用:返回上次调用现场。终了调用:返回上次调用现场。特点:特点:-是无终止的递归调用,程序中是无终止的递归调用,程序中应该给定一应该给定一个限个限制递归次数的条件。制递归次数的条件。-结构简练。结构简练。例例8:利用递归方法,编写函数计算:利用

18、递归方法,编写函数计算x的的n次方。次方。#include “stdio.h”double f(double x,int n)double s; if(n0) s=x*f(x,n-1);else if(n=0) s=1;return s;main()int n;double x,m;printf(Input X:n);scanf(%lf,&x);printf(Input N:n);scanf(%d,&n);m=f(x,n); printf(Answer=%lfn,m);例例9:以下程序的功能是利用递归方法,计算第:以下程序的功能是利用递归方法,计算第5位学生的年龄。位学生的年龄。#includ

19、e stdio.hint age(int n)if(n=1) c=10; else c=age(n-1)+2;return c;main()int n=5;printf(“age:%dn”,age(5); 递推公式如下: 10 ( n=1) age(n-1)+2 (n1)age(n)=六、变量的作用域与存储方法1.1.局部变量(内部变量)局部变量(内部变量) 定义:在函数内部定义:在函数内部(包括主函数)或复合语句中(包括主函数)或复合语句中定义定义的变量,的变量,作用域作用域只能在本函数只能在本函数或定义它的复合语句或定义它的复合语句内使用。内使用。 如:形参,普通变量。如:形参,普通变量。

20、 2. 2. 全局变量全局变量定义:定义:在函数之外定义的变量。在函数之外定义的变量。使用范围:使用范围:可以为本文件中所有的函数可以为本文件中所有的函数使使用。用。作用域:作用域:从定义变量的位置开始到本文件结束从定义变量的位置开始到本文件结束。在同一个文件中,当全局变量与局部变量同名时,在在同一个文件中,当全局变量与局部变量同名时,在局部变量的作用域内,全局变量不起作用。局部变量的作用域内,全局变量不起作用。3.3.变量的存储方法变量的存储方法 自动变量、自动变量、 静态局部变量、全局变量、寄存器变量静态局部变量、全局变量、寄存器变量例例10:阅读以下程序,写出程序的运行结果。:阅读以下程

21、序,写出程序的运行结果。main()inti=3,j=2,k;k=i+j;intk=8;if(i=4)printf(%d,k);elseprintf(%d,j);printf(%d,%d,i,k);运行结果:2,3,5例例11:阅读下列程序,给出程序运行结果。:阅读下列程序,给出程序运行结果。#includestdio.h“intfun(intx,inty)staticintm=0,i=2;i+=m+1;m=i+x+y;returnm;main()inta=2,b=3;printf(%d,fun(a,b);printf(%dn,fun(b,a);运行结果8,17例例12:输入:输入6名学生名学

22、生5门课程的成绩,分别用函数求出:门课程的成绩,分别用函数求出:每门课程的平均分;找出最高分数所对应的学生和课程。每门课程的平均分;找出最高分数所对应的学生和课程。/* 求学生的成绩 d7-5-6*/#include stdio.h#include #include int n,k;int pmax(int b65) int i,j,m; m=b00; for(i=0;i6;i+) for(j=0;jm) m=bij;n=i;k=j; return m ;void sum(int b65,float w5) int i,j,s; for(i=0;i5;i+) s=0; for(j=0;j6;j

23、+) s+=bji; wi=s/6.0; main()int a65,i,j,max; float p6; srand(time(NULL); for(i=0;i6;i+) for(j=0;j5;j+) aij=rand()%90+10; for(i=0;i6;i+) for(j=0;j5;j+) printf(%3d ,aij); printf(n); sum(a,p); for(i=0;i5;i+) printf(%5.2f ,pi); printf(n); max=pmax(a); printf(“max=%3d,coure=%3d,student=%3dn,max,n+1,k+1);例

24、例13:编写函数,利用全局变量求一维数组中正数的平均值编写函数,利用全局变量求一维数组中正数的平均值和负数的平均值传递给调用函数输出。和负数的平均值传递给调用函数输出。#include“stdio.h”floatzaver=0,faver=0;/*定义全局变量定义全局变量*/voidsaver(intarray,intn)inti,z=0,f=0;for(i=0;i=0)zaver+=arrayi;z+;elsefaver+=arrayi;f+;if(z!=0)zaver=zaver/z;/*计算正数的平均值计算正数的平均值*/if(f!=0)faver=faver/f;/*计算负数的平均值计

25、算负数的平均值*/main()inta10=1,-3,4,6,-2,7,9,-8,-5,0;saver(a,10);printf(“正数平均值正数平均值=%f,负数平均值负数平均值=%fn”,zaver,faver); 七、七、内部函数和外部函数内部函数和外部函数1 . 1 . 内部函数内部函数( (静态函数)静态函数)定义定义:只能被本文件中其它函数调用的函数。只能被本文件中其它函数调用的函数。格式格式:static static 类型标识符类型标识符 函数名(形参表)函数体函数名(形参表)函数体 例如:例如:static static intint fun(a, b) fun(a, b)

26、作用作用:函数的作用域限于所在文件,不同文件中同名函函数的作用域限于所在文件,不同文件中同名函数互不干扰,便于程序的格式化。数互不干扰,便于程序的格式化。2.外部函数外部函数定义定义:允许被其它文件调用的函数。:允许被其它文件调用的函数。格式格式:extern类型标识符类型标识符函数名(形参表)函数体函数名(形参表)函数体例如:例如:externintfun(inta,intb)2.外部函数外部函数定义定义:如果一个函数允许被其它文件调用,称:如果一个函数允许被其它文件调用,称为外部函数。为外部函数。定义格式定义格式:extern类型标识符类型标识符函数名(形参表)函函数名(形参表)函数体数体

27、如:如:externintfun(inta,intb)或或intfun(inta,intb)通常不加通常不加static标识符的函数都是外部函数。标识符的函数都是外部函数。例例14:下面程序由两个文件组成,请分析运行结果。下面程序由两个文件组成,请分析运行结果。/*文件一文件一prog1.c*/#includestdio.h#includeprog2.cintx=10,y=10;externvoidsub();voidadd()inty=5;y=10+x;x*=2;printf(add:y=%d;,y);main()x+=5;add();sub();printf(main:x=%d;main:

28、y=%dn,x,y);/*文件二文件二prog2.c*/#include“stdio.h”externintx;voidsub()inty=5;x-=y;printf(“sub:y=%d;”,y);运行结果:/* 例例15该程序功能包括该程序功能包括3个计算圆形体体积的函数个计算圆形体体积的函数*/#include stdio.hdouble vol_ball() /* 计算球体体积*/double r;printf(请输入球的半径:); scanf(%lf,&r); return (4.0/3.0*3.1415926*r*r*r);double vol_cylind() /* 计算圆柱体积*

29、/double r,h;printf(请输入圆柱的底圆半径和高:); scanf(%lf%lf,&r,&h); return (3.1415926*r*r*h);double vol_cone() /* 计算圆锥体积*/double r,h;printf(请输入圆锥的底圆半径和高:); scanf(%lf%lf,&r,&h); return (3.1415926*r*r*h/3.0);main() int choice; do printf( =功能选项=n); printf( 1-计算球体体积 n); printf( 2-计算圆柱体积 n); printf( 3-计算圆锥体积 n); pri

30、ntf( 0-退 出 n); printf(请选择: ); scanf(%d,&choice); switch(choice) case 1: printf(球体积为:%.2fn,vol_ball(); break; case 2: printf(圆柱体积为:%.2fn,vol_cylind(); break; case 3: printf(圆锥体积为:%.2fn,vol_cone(); break; case 0: break; while(choice!=0); printf(谢谢使用! n);按下列要求编写程序:按下列要求编写程序:(1 1)生成)生成1010个个2 2位随机正整数并存在

31、位随机正整数并存在a a数组中;数组中;(2 2)编写函数实现按从小到大顺序排序,并调用它;)编写函数实现按从小到大顺序排序,并调用它;(3 3)任意输入一个数,并插入到数组中,使之仍然有序;)任意输入一个数,并插入到数组中,使之仍然有序;(4 4)任意输入一个)任意输入一个0 0到到9 9之间的整数之间的整数k k,删除,删除akak 。分析:在长度为分析:在长度为n+1n+1的有序数组中插入一个数的有序数组中插入一个数, ,首先要确定插首先要确定插入位置。从第一个数开始比较,若入位置。从第一个数开始比较,若 ajajkk, ,则则k k就应插在就应插在ajaj 前面。先移动(从最后一个数开

32、始移动),后插入。前面。先移动(从最后一个数开始移动),后插入。 例例16:函数编程举例:函数编程举例10203040K=24a0a1a2a3a4a0a1a2a3a41020304024main()inti,j,k,t,n,aN;n=N;for(i=0;iN;i+)ai=rand()%90+10;printf(“%4d”,ai);printf(“n”);sort(a,n);#include“stdlib.h”#defineN10voidsort(intarray,intn)inti,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(arrayjarray

33、k)k=j;if(k!=i)t=arrayk;arrayk=arrayi;arrayi=t;for(i=0;iN;i+)/*打印排序后的数组打印排序后的数组*/printf(“%4d”,ai);printf(“npleaseinputainsertnumber:n”);scanf(“%d”,&k);for(i=0;iN;i+)/*找插入位置找插入位置*/if(ki;j-)/*aj(j=n-1,n-2,i+1)后移一个位置后移一个位置*/aj=aj-1;aj=k;/*将将k插入到插入到ai*/n=n+1;/*数组增加一个元素数组增加一个元素*/printf(“n请输入要删除数组元素的下标请输入要删除数组元素的下标k:n”);scanf(“%d”,&k);for(j=k;jn-1;j+)/*aj+1(j=k,k+1,n-2)前移一个位置前移一个位置*/aj=aj+1;n=n-1;for(i=0;in;i+)/*打印删除后的数组打印删除后的数组*/printf(“%4d”,ai);printf(“n”);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号