大学计算机C语言函数(1 函数的定义和使用)_第1页
大学计算机C语言函数(1 函数的定义和使用)_第2页
大学计算机C语言函数(1 函数的定义和使用)_第3页
大学计算机C语言函数(1 函数的定义和使用)_第4页
大学计算机C语言函数(1 函数的定义和使用)_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章 函 数5.1 程序设计的艺术 5.2 函数的定义和使用5.3 数组作函数参数5.4 变量的作用域5.5 变量的存储类别5.6 预处理指令一、函数的概念 函数是形式上独立、功能上完整的程序段(块)。在C程序设计中常将一些常用功能模块编写成函数。函数可以完成特定的计算或操作处理功能。 C程序由函数组成;函数在形式上是平行的,不允许嵌套定义;C程序只执行主函数,子函数必须通过主函数或其他子函数的调用才能被执行;子函数不能调用主函数。实质上,设计程序就是设计函数。5.1 程序设计的艺术 (略)5.2 函数的定义和使用二、函数的分类(一)从用户的角度分1.标准函数,即库函数 ANSI C预先定义

2、的用户可直接使用的函数;使用库函数时,必须用#include把该函数所在的头文件包含进来。2.用户自定义函数 是用户为了解决各种应用问题而自行设计的函数。用户自定义函数必须先定义后使用!(二)从形式上分1.无参函数: 即无形式参数的函数。 如:getchar()2.有参函数 即带有形式参数的函数 如:putchar(ch)、sqrt(x)三、函数的定义1、 无参函数的定义函数返回值类型 函数名( void ) 函数体其中:函数返回值类型表示函数的返回结果值类型,函数只能有一个返回值,若函数无返回值即用void声明;返回函数值需使用:return 变量|表达式; 函数名由用户按标识符的命名规则自

3、行给定,但不能与标准函数同名; 圆括号中的关键字void表示函数无形式参数; 函数体是由实现函数功能必需的语句组成。例1:无参函数的定义。#includevoid PrintMessage (void)printf(t*n);printf(t Programming is fun.n);printf(t*n);int main(void)PrintMessage ( );PrintMessage ( );PrintMessage ( );return 0;函数返回值类型 函数名(数据类型 参数1, 数据类型 参数2, )函数体说明: 函数返回值类型、函数名、函数体的含义与无参函数相同;形式参数

4、的格式如:数据类型 形式参数1 形式参数(简称形参)必须单个独立定义,形参是用来接收函数被调用时对应实际参数传递的值或地址的,因此形参只能是变量,形参的存储空间是函数被调用时临时分配的动态空间、用完即释放(不能永久存储数据)。2、有参函数的定义int Average(int x, int y)int result;result = (x + y) / 2;return result;函数首部函数体例2:定义有参函数计算两个整数的平均。#include int Average(int x, int y)int result;result = (x + y) / 2;return result;i

5、nt main(void)int a1 = 12, b1 = 36, a2 = 24, b2 = 46, a3 = 5, b3 = 25;int ave1, ave2, ave3; ave1 = Average(a1, b1);ave2 = Average(a2, b2);ave3 = Average(a3, b3);printf(Average of %d and %d is %d.n, a1, b1, ave1);printf(Average of %d and %d is %d.n, a2, b2, ave2);printf(Average of %d and %d is %d.n, a

6、3, b3, ave3); return 0;形参为整形变量x和y变量a1和b1为实际参数1、函数调用的一般形式: 函数名(实在参数表)其中: 形参(形式参数)定义函数时在函数名后括号中声明的参数;实参( 实际参数 )在主调函数中调用函数时函数名后面括号中的参数(或表达式); 调用函数时实参的个数、顺序、类型必须与形参一一对应(赋值相容);实参可是常量、变量、函数或表达式; 函数调用时实参和形参是采用单向值传递形式即将实参的数值或地址单向传给对应的形参。四、函数的调用有返回值时(即函数功能为某种计算功能) 返回值 = 函数名(实参表列);例如:以赋值语句形式调用函数如 c = max(a,b)

7、;例如:作为另一个函数的参数形式调用函数如 c = max(max(a, b), c); printf(%dn, max(a, b);无返回值时(即函数功能是完成某种操作或处理)例如:以表达式语句形式调用函数如 display(a, b); 函数名(实参表列);2、具体调用形式理解函数的调用参数的传递int main(void)int a = 12;int b = 24;int ave;ave = Average(a, b);printf(Average of %d and %d is %d.n, a, b, ave);return 0;#include int Average(int x,

8、int y) int result; result = (x + y) / 2; return result;例3:定义求n!函数,然后调用该函数求sum=1!+2!+3!+m!的值。#include double Fac(int n) int i; double p = 1.0; for (i = 1; i n; i+) p *= i; return p; int main(void) int i, m; double sum = 0; printf (“Please input m data:”); scanf(“%d”, &m); for (i = 1; i = m; i+) sum +

9、= Fac(i); printf(“Sum=%.0fn”, sum); return 0;#include int max ( int x, int y ) int z;if (x y) z = x;else z = y;return (z);int main(void) int a = 45, b = 78, c = 99, d, e;d = max(a, b); printf(max1 = %dn, d);printf(max2 = %dn, max(a, b);e = c - max(a, b);printf(e = %dn, e);printf(max3 = %dn, max(max(

10、a, b), c);return 0;例4:函数定义与调用max1 = 78max2 = 78e = 21max3 = 99该程序的输出是什么?例5:定义求素数的函数,然后调用该函数求100到200之间的所有素数。#include #include int Prim(int x) int i, j, k; k = (int)sqrt(i); for ( j = 2; j = k + 1) return 1; else return 0; int main(void) int i; for (i = 100; i = 200; i+) if ( Prim(i) ) printf(“%d, ”,

11、i); return 0 ; 五、函数原型声明(prototype)1、为什么要声明函数原型? 函数应该先定义,然后才能调用。但是,如果函数的调用出现在函数的定义之前,就必须对被向前调用的函数进行函数原型声明,否则就会出现函数调用错误。2、声明格式: 函数类型 函数名(类型名1 形参数1,);或 函数类型 函数名(类型名1,类型名2,);注意:如果函数严格遵循先定义后调用原则就无需进行函数原型声明。例6:函数原型声明(先调用后定义函数)#include double Fac(int n);int main(void) f1 = Fac(m); double Fac(int n) .函数Fac的

12、原型声明先调用函数Fac函数Fac的定义出现在调用之后#include int Average(int x, int y)int result;result = (x + y) / 2;return result;int main(void)int a = 12;int b = 24;int ave = Average(a, b);printf(Average of %d and %d is %d.n, a, b, ave);return 0;函数定义函数调用例7:以下函数为先定义后调用,不用声明原型#include int Average(int x, int y); /*声明Average

13、()函数*/ int main(void) int a = 12; int b = 24; int ave = Average(a, b); printf(Average of %d and %d is %d.n, a, b, ave); return 0; int Average(int x, int y)int result;result = (x + y) / 2;return result;例 8:函数的原型声明(先调用后定义)int main()a();return 0;a 函数b();return;b函数return;六、函数的嵌套调用 在调用一个函数的过程中,又调用其他的函数,称

14、为函数的嵌套调用。 以下为函数调用与调用返回过程:例9:函数的嵌套调用#include float b (float m) float n;n = m * 10;return (n);float add (float x, float y) float z;z = b(x) + y; return (z);int main(void)float a = 1.2, b = 3.4, c; c = add(a, b); printf (“c = %fn”, c); return 0;b函数main调用add函数调用b函数add函数 结束七、函数的递归调用 在调用一个函数的过程中,出现直接或间接地调

15、用该函数本身,称为函数的递归调用。int f(int x)int y, z;z = f(y);return (2 * z);f函数调用f函数f1函数调用f2函数f2函数调用f1函数例10:函数的递归调用 有3个人坐在一起,问第3个人多少岁?他说比第2个人大2岁。问第2个人多少岁?他说比第1个人大2岁。最后问第1个人,他说是10岁。请问第3个人多大?分析:age(3)=age(2)+2;age(2)=age(1)+2;age(1)=10;归纳:n=1 age(n)=10 n1 age(n)=age(n-1)+2程序如下:#include int age(int n) int c; if (n =

16、 1) c = 10; else if (n 1) c = age(n - 1) + 2; return c; int main(void) printf(“%d”, age(3); return 0;程序执行过程如下:int main(void) printf(“%d”, age(3);int age(3) int c; c = age(2) + 2; return c;int age(2) int c; c = age(1) + 2; return c;int age(1) int c; c = 10; return c;课堂习题#include void func1(int i);voi

17、d func2(int i);char st = hello,friend!;void func1(int i) printf(%c, sti); if (i 3) i += 2; func2(i); void func2(int i) printf(%c, sti); if (i 3) i += 2; func1(i); int main(void) int i = 0; func1(i); return 0;A) helloB) helC) hloD) hlm1下列程序执行后的输出结果是( )2有如下程序:#include int func(int a, int b) return (a+b); int main(void) int x = 2, y = 5, z = 8, r ; r = func( func(x, y), z); printf(“%dn”,

温馨提示

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

评论

0/150

提交评论