




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
函数第一节 函数的定义和返回值一、库函数1、 一个C语言源程序无论包含了多少函数,C程序总是从main开始执行。2、 调用C语言标准库函数时要求的include命令。1) 用户在源程序include命令中应该包含头文件:#include include命令必须用#开头,系统提供的头文件以.h作为文件的后缀,文件名用”或括起来,2) include命令不是C语句,因此不能在最后加分号。3、 标准库函数的调用:1) 一般调用形式为:函数名(参数表)scanf(“%d”,&a); printf(“%d”,a);putchar(ch); ch=getchar();2) 库函数的调用可以两种形式出现: 出现在表达式中: 例:y=pow(x,2,5)+1.3 作为独立语句完成某程操作: 例:printf(“*n”);常用函数: 数学函数:调用数学函数时,要求在源文件中包含以下命令行:#include “math.h”例: int abs(int x) double cos(double x)字符函数和字符串函数 调用字符函数时,要求在源文件中包含头文件”ctype.h”;调用字符串函数时,要求在源文件中包含头文件”string.h”如调用: int isalpha (int ch) 检查ch是否为字母。输入输出函数:调用输入输出函数时,要求在源文件中包含头文件”stdio.h”例:调用:putchar getchar gets puts二、函数的定义和返回值1、 函数定义的语法 函数首部(main( )) 函数1C语 定义说明部分言程 函数体 序 执行语句部分 函数22、C语言函数定义的一般形式如下1) 函数返回值的类型名 函数名(类型名 形式参数1,类型名 形式参数2.) /* 函数首部*/ 说明部分 /*函数体*/ 语句部分 例:int abs(int x) 2) 在老的C语言版本中,函数的首部用以下的形式: 函数返回值的类型名 函数名(形式参数1,形式参数2.) 形式参数类型说明;例: int abs(x) int; 3)函数名和形式参数都是由用户命名的标识符。在同一程序中,函数名必须唯一;形式参数名只要同一函数中唯一即可,可以与其它函数中的变量同名。4)C语言规定,不能在同一个函数的内部再定义函数。5)若在函数的首部省略了函数返回值的类型名,函数首部写成: 函数名(类型名 形式参数1,类型名 形式参数2.)C语言默认返回值类型为int型。例:编写求两个双精度之和的函数。 double add(double a, double b) double s; s=a+b; return s;6) 函数体中,除形参外,用到的其它变量必须在说明部分进行定义,这些变量(包括形参),只在函数被调用时才临时开辟存储单元,当退出函数时,这些临时开辟的存储单元全被释放掉,因此,这种变量只在函数体内部起作用,与其它函数中的变量互不相关,它们可以和其它函数中的变量同名。3、函数的返回值1)函数的值通过return语句返回,return语句的形式如下: return 表达式; 或 return(表达式); 或 return2) 说明 return语句中的表达式的值就是所求的函数值。此表达式值的类型必须与函数首部所说明的类型一致。若类型不一致,则以函数值的类型为准,由系统自动进行转换。当程序执行到return语句时,程序的流程式就返回到调用该函数的地方,并带回函数值。在同一函数内,可以根据需要在多处出现return语句。return语句也可以不含表达式,这时它的作用只是使流程返回到调用函数,并没有确定的函数值。函数体内可没有return语句,程序的流程就一直执行到函数末尾的”,然后返回调用函数,这时也没有确定的函数值带回。函数的调用和说明一、函数的两种调用方式:1、 函数的一般调用形式为:函数名(实在参数表)实在参数(简称实参)的个数多于一个时,各实在参数之间用逗隔开。若函数无形参,调用形式为:函数名( ) 例: ch=getchar();函数名后的一对括号不可少。例: fun(int x)int j,sum=0; for(j=1;j=x;j+) sum+=j; return sum;main( ) int s,n; scanf(“%d”,&n); s=fum(int n); printf(“%d”,s); 可用两种方式调用函数1)作为表达式出现例:y=add(3.0,4.0)2)作为独立语句出现例:printf(“*”);二、函数调用时的语法要求1、调用函数时,函数名必须与所调用的函数名字完全一致。2、实参的个数必须与形式参数的个数一致。实参可以是表达式,在类型上应按位置与形参一一对应匹配。如果类型不匹配,C编译程序按赋值兼容进行转换,若实参和形参的类型不赋值兼容,通常不给出出错信息,且程序仍然执行,只是不会得到正确的结果。因此,应该特别注意实参和形参的类型匹配。3、C语言规定:函数必须先定义,后调用(函数的返回值类型为int或char时除外)。第三节 调用函数和被调用函数之间数据的传递fun(int x) /被调用函数.main() int s,n;scanf(“%d”,&n); s=fun( n); Printf(“%d”,s);C语言中,调用函数被调用函数之间数据可以通过三种方式进行传递1.实在参数和形式参数之间进行数据传递2.通过return语句把函数值返回调用函数3.通过全局变量。二、在C语言中,数据只能从实参单向按值传递。也就是说,当简单变量作为实参时,用户不可能在函数中改变对应实参值。三、例题:例1:以下程序例示了函数参数之间的单向传递,请观察程序的执行结果。main( ) int x=2,y=3,z=0; printf(“(1)x=%d y=%d )z=%dn”,x,y,z); try(x,y,z); printf(“(4)x=%d y=%d z=%dn”,x,y,z);try(int x,int y,int z) printf(“(2)x=%d y=%d z=%dn”,x,y,z); z=x+y; /* 5=2+3 x=x*x; /* 4=2*2y=y*y; /* 9=3*3printf(“(3)x=%d y=%d z=%dn”,x,y,z);两个数交换 int a,b; main()int a,b,t; scanf(“%d%d”,&a,&b); printf(“a=%d,b=%d”,a,b); t=a;a=b;b=t; printf(“a=%d,b=%d”,a,b);例2:用函数方法main( ) int a,b; scanf(“%d%d”,&a,&b); printf(“a=%d,b=%d”,a,b); twr(a,b); printf(“a=%d,b=%d”,a,b);twr(int a,int b) int t; printf(“a=%d,b=%d”,a,b); t=a;a=b;b=t;printf(“a=%d,b=%d”,a,b);函数程序举例 例1:编写函数isprime(int a)用来判断自变量a是否为素数,若是素数,函数返回1,否则返回0。 素数:只能被1和本身整除的数。main( ) int x,i; scanf(“%d”,&x);for(i=2;i=x) printf(“YES”); /始终没有跳出循环,说明它是素数。else printf(“NO”);函数方法: main( ) int a; scanf(“%d”,&a); if(isprme(a) printf(“YES”); else printf(“NO”);isprime(int a) int i; for(i=2;ia;i+) if(a%i=0) return 0; return 1; 例2:编写函数,验证任意偶数为两个素数之和并输出这两个素数。 分析:任意输入一个数:如 12 12的因子: 2 3 4 5 6 7 8 9 10 11 2+10=12 (2,10 不是素数) 3+9=12 (3,9不是素数) 4+8=12 (4, 8不是素数) 5+7=12 6+6=12 (6不是素数) 超过一半就不用判断了,因为重复。 int isprime(int a) int i; for(i=2;ia;i+) if(a%i=0) retrurn 0; return 1; void even(int x) int i; for(i=2;i=x/2;i+) if(isprime(i) if(isprime(x-i) printf(“%d=%d+%d”,x,i,x-i); main( ) int x; /*当前要判断的偶数*/ scanf(“%d”,&x); if(x%2=0) /*如果为偶数*/even(x); /*函数为独立语句调用,没有返回值*/ else printf(“NO”); 例3:编写函数myupper(ch),把ch中的小写字母转换成大写字母作为函数值返回,其它字符不变。用字符结束输入。分析; dsdDSFDF#include “ctype.h”#include “stdio.h”char myupper(char ch) if(islower(ch) ch=ch-32; else ; return ch;main( ) char ch; while(ch=getchar()!=) ch= myupper(ch); putchar(ch); 例4:编写函数统计输入字符的个数 分析:如输入dkjfkd5456 遇到非法字符结束。如ctrl+z #include “stdio.h” int fun( ) char ch; int x=0; while(ch=getchar()!=EOF) x+; return x;main( ) int n=0; /*n用来统计输入的个数*/ n=fun( ); printf(“%d”,n); 例5:编写函数统计输入文本中单词的个数,单词之间用空格符、换行符、跳格符隔开。分析: my name is jinwen以name为例:name前一个字符必须是间隔符,当前字符必须为字母,说明n是首字母。int countword( ) int x=0,state=0; /*state为标志位。 char ch; while(ch=getchar()!=EOF) if(isspace(ch) state=0; /*0位于单词的外部,1位于单词的内部 else if(state=0) x+; state=1; return x; main( ) int n; n=countword( ); printf(“%d”,n); 例6:编写函数用以求表达式x2-5x+4,x作为参数传递给函数。 x2-5x+4=x*x-5*x+4 #include “math.h” double fun(double x) return x*x-5*x+4; main( ) double x,y; scanf(“%lf”,&x); y=fun(x); printf(“%lf”,y); 例7:编写函数求1-1/2+1/3-1/4+1/5-1/6+1/71/ndouble fun(int x) int i,n=1; /*n为符号控制变量*/ double s=0; for(i=1;i=x;i+) s+=n*(1.0/i); / s=s+n*(1.0/i) n=-n; return s; main( ) double s; int n; scanf(“%d”,&n); s=fun(n); printf(“%lf”,s);习题练习1:以下叙述中正确的是:A、C语言程序总是从第一个定义的函数开始执行。B、在C语言程序中,要调用的函数必须在main函数中定义。C、C语言程序总是从main函数开始执行。D、C语言程序中的main函数必须放在程序的开始部分。2、以下函数的类型是 A、与参数x的类型相同 B、void类型 C、int类型 D、无法确定fff(float x) printf(“%dn”,x*x);3、以下函数调用语句中,含有的实参个数是: A、1 B、2 C、 4 D、 5 Func(exp1,exp2),(exp3,exp4,exp5) 4、以下程序的输出结果是(A) A、5.500000 B、3.000000 C、4.000000 D、8.25 double f(int n) int i; double s; s=1.0; for(i=1;i=n;i+) s+=1.0/i; return s; main( ) int i,m=3;float a=0.0; for(i=0;im;i+) a+=f(i); /a=a+f(i)printf(“%fn”,a); 5、以下程序的输出结果是_4_ fun1(int a,int b) int c; a+=a; b+=b; c=fun2(a,b); return c*c; fun2(int a,int b) int c; c=a*b%3; return c; main( ) int x=11,y=19; printf(“%dn”,fun1(x,y); 函数指向函数的指针变量的定义1、在C语言中函数名代表该函数的入口地址,因此可以定义一种指向函数的指针来存放这种地址。2、double fun(int ,int*); 函数说明 double (*p) (int int*); 函数指针若有p=fun则以上两个等价。p与fun必须类型名与参数类型一一匹配。3、例: double fun(int a,int *p) . main( ) doulbe (*fp) (int ,int*),y; int n; fp=fun; . y=(*fp)(56,&n); 等价于 y=fun(56,&n); .函数名或指向函数的指针变量作为实参 函数名或指向函数的指针变量作为实参是将函数首地址传给形参: 例: #include “math.h” double tran(double (*)(double),double (*)(double), double); main( ) double y,v; v=6.0*3.1415/180.0; y=tran(sin,cos,v);printf(“tan(60)=%10.6fn”,y);y=tran(cos,sin,v);printf(“cot(60)=10.6fn”,y); double tran(double (*f1)(double),double (*f2) (double),double x) return (*f1)(x)/(*f2)(x);函数的递归调用基本概念C语言中的函数可以递归调用,即:可以直接或间接地自己调用自己。前者称简单递归,后者称间接递归。一个问题采用递归方法来解决时,必须符合以下三个条件:可以把要解的问题转化为一个新的问题,而这个新的问题的解法仍与原来的的解法相同。可以应用这个转化过程使问题得到解决。必定要有一个明确的结束递归的条件。while(不知道同学年纪) 问当前同学年纪while(不知道第一个同学年纪) 用当前同学年纪加两岁一、 实例应用1、 求n!分析:如求5! 5*4! 4*3! 3*2! 2*1! 1!=1double fun(int n) if(n=1) return 1; else return n*fun(n-1);main( ) int n; double s; scanf(“%d”,&n); s=fun(n);printf(“%d”,s);5!=5*fun(4) 5*24fun(4)=4*fun(3) 24fun(3)=3*fun(2) 6 fun(2)=2*fun(1) 2=2*12、用递归算法根据以下求平方根的迭代公式,求某数的a的平方根。x1=1/2(x0+a/x0)double mysqrt(double a,double x0) double x1; x1=(x0+a/x0)/2.0; if(fabs(x1-x0)0.00001) return mysqrt(a,x1); else return x1; main( ) double a; scanf(“%lf”,&a); printf(“The sqrt of %f=%fn”,a,mysqrt(a,1.0); 3、请写递归函数,把输入的一个整数转换成二进制数输出。分析:以8为例 8 8%2=0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 三原色课件染发
- 三副知识更新培训课件
- 三分屏剪辑课件
- 小兔子乖乖课件文案
- 小儿高热惊厥病例讨论
- 电子商务领域海垦集团面试题库及备考指导
- 年产150万套益智多彩木制游戏生产线技改项目可行性研究报告模板-立项备案
- 大学生毕业典礼毕业生代表发言稿
- 卓越人才必 备:时间协调面试问题及答案精 编速览
- 高阶职场求职达人必读:池州投资集团面试题目及答案精解
- 急诊清创缝合术
- 护理深静脉血栓科普
- 寄宿学校班主任培训课件
- 服务理念与服务意识培训
- ASTM-D3359-(附著力测试标准)-中文版
- 保险公司与定点医院合作协议书(2篇)
- 商业银行声誉风险应对及实践案例精讲课件
- 特种设备日管控、周排查、月调度管理制度
- 2024年县乡教师选调进城考试《教育学》题库及完整答案(全优)
- 2023年HSE法律法规清单
- 糖尿病运动疗法讲座医学课件
评论
0/150
提交评论