C语言程序设计经典教程ppt课件.ppt

上传人:牧羊曲112 文档编号:1375832 上传时间:2022-11-16 格式:PPT 页数:48 大小:1.04MB
返回 下载 相关 举报
C语言程序设计经典教程ppt课件.ppt_第1页
第1页 / 共48页
C语言程序设计经典教程ppt课件.ppt_第2页
第2页 / 共48页
C语言程序设计经典教程ppt课件.ppt_第3页
第3页 / 共48页
C语言程序设计经典教程ppt课件.ppt_第4页
第4页 / 共48页
C语言程序设计经典教程ppt课件.ppt_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《C语言程序设计经典教程ppt课件.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计经典教程ppt课件.ppt(48页珍藏版)》请在三一办公上搜索。

1、1,第七章 函数,主要内容7.1 概述7.2 函数定义7.3 函数参数、函数调用和函数值的返回7.4 函数的嵌套与递归调用7.5 变量的作用域,2,重点,函数的定义和调用;函数参数(数组名作为函数的参数);局部变量。,3,7.1 概述,例7.1main()PrintStar();PrintMessage();PrintStar();PrintStar()printf(*n);PrintMessage()printf( Hellon);,主函数,两个自定义函数,*,Hello,*,4,说明:,一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位。即以源程序单位进行编译。一个C程序由一

2、个或多个源程序文件组成。便于调试,提高开发效率。C程序总是从main函数开始执行,在调用完其他函数后返回到main函数。从main函数开始执行,不管将其写在前面、中间或最后。main函数是系统定义的。所有函数都是平行定义的(即不可以嵌套定义),但可以嵌套调用。,5,从用户角度看,C语言函数分为两种:库函数是系统提供的已设计好的函数,只要指定了要调用函数所在的库文件,就可以直接调用了。用户自定义函数是用户自己编写的用来解决具体问题的函数。从函数的形式看,函数分为两类:无参函数不需要向函数传递参数。有参函数需要向函数传递必要的参数。本章将要详细介绍的是用户自定义函数。,6,7.2 函数定义,函数定

3、义的一般形式类型符 函数名(形式参数说明表)说明部分语句部分,函数头(首部),函数体,int add(int x,int y)int sum;sum=x+y;return sum;,完整的函数定义,无参函数定义,空函数定义,int read() int x;scanf(%d,dummy() ,7,7.3 函数参数、函数值(返回值)及函数调用,7.3.1 函数的参数: 例7.2 main()int a=15,b=20,c;c=max(a+10,b); printf(Max=%d,c);int max(int x,int y)int z;z=xy?x:y;return z;,main函数,max函

4、数,25,20,25,25,8,说明:定义函数时,形参是变量,必须指定类型。形参变量需要的存储单元是在函数被调用时才给它分配,函数结束时予以释放。实参与形参在个数和类型上应一一对应。实参可以是常量、变量或表达式。但变量和表达式要有确定的值。如当a=10时:c=max(7,8);/* ok */c=max(a,2*4);/* ok */c=max(a,b);/* error, b没有确定的值 */C语言中,参数的传递是值传递,即单向传递。数据只能由实参传送给形参,而不由形参传回给实参。,9,7.3.2 函数的返回值通常,在调用一个函数时,都希望被调函数能返回一个确定的值。这就是函数的返回值。函数

5、的返回值是通过返回语句return实现的,返回语句的形式为:return; 或 return 表达式;前一种形式,函数返回值是不确定的,这时调用者一般对返回值不感兴趣,同时将函数说明成void类型。后一种形式,函数要把表达式的值返回给调用者。,10,说明:如果要从被调函数带回一个值,被调函数中必须要有return 表达式语句。函数中可以有多个return语句,执行到哪个,哪个就起作用且立即返回调用函数。例如:int max(int x,int y)if(xy) return x;elsereturn y;,11,函数的返回值要有一个确定的类型,应该在定义函数时指定。如:int max(x,y)

6、 /* max函数值为整型 */char letter(int asc) /* letter函数值为字符型 */long fact(int n) /* fact函数值为长整型 */为了明确函数不返回值,可用关键字void定义函数。如:void add(int x,int y)printf(Sum is %d,x+y);,12,例7.3,float power(float x,int n)float y=1;int i;for(i=1;i=n;i+)y*=x;return y;main()float a=2.5,c;int b=3;c=power(a,b);printf(%fn,c);,13,7

7、.3.3 函数的调用,函数调用的一般形式函数名(实参表)若是调用无参函数,则实参表可没有,但括号不可省。若实参表包含多个实参,则各参数之间用逗号隔开。实参与形参的个数应相等,类型应一致。实参与形参按顺序对应,一一传递数据。如:p=power(2.5,4);/* ok */q=power(2.5,3.8);/* error */s=power(2.5);/* error */t=power(5,3);/* ok */,14,函数调用的方式1函数语句:即把函数调用作为一个语句。如:PrintStar();printf(*); 这时不要求函数带回值,只要求完成一定的操作,通常将函数字义为void类型

8、。2函数表达式:函数出现在可以写表达式的地方,此时需要的是函数的值。如:c=2*max(a,b);printf(%d,max(a,b);,15,对被调函数的声明 main() int a=10,b=20,c; c=max(a,b); printf(%dn,c);int max(int x,int y) return xy?x:y;怎样使这些信息正确呢?,C编译系统假定: 1、函数名:max 2、函数类型:int根据扫描得知: 3、有两个参数 4、每一个参数的类型均为int,该函数与已知信息相符。,float,float,float,float,%f,由于类型的变化,使该函数与已知信息不相符。这

9、句有错误!,float,对被调函数的声明,16,函数声明有三种格式:格式1:函数类型 函数名(形参说明表);格式2:函数类型 函数名(形参类型表);格式3:函数类型 函数名( );如:int max(int x,int y);int max(int,int);int max();,函数原型,17,例7.4 函数声明,#include main() float max(float x,float y);float a=10,b=20,c;c=max(a,b);printf(%fn,c);float max(float x,float y) return xy?x:y;,18,不必函数声明的情况:

10、当函数定义出现在主调函数之前,可不必函数声明。函数定义包括了函数声明。例7.4.1 如果被调函数的函数值为int类型,也可以不必函数声明。 例7.2,19,函数定义在主函数之前,可无函数声明,例 7.4.1#include float max(float x,float y) return xy?x:y;main()float a=10,b=20,c;c=max(a,b);printf(%fn,c);,20,被调函数的函数值为int类型,可无函数声明。,例7.2 main()int a=15,b=20,c;c=max(a+10,b); printf(Max=%d,c);int max(int

11、x,int y)int z;z=xy?x:y;return z;,21,7.3.4 数组作函数参数,函数实参可以为变量。数组元素同样是变量(下标变量),也可以作函数的实参。此外,数组名也可以作函数的参数,传递整个数组。 数组元素作函数的实参数组元素作函数实参的用法与普通变量的用法一致,是单向传递。例7.5 找出数组中的最大值,22,例7.5 找出数组中的最大值,int max(int x,int y)return xy?x:y;main()int a=8,7,55,23,49;int i,m;m=a0;for(i=1;i5;i+)m=max(m,ai);/* 数组元素作实参 */printf(

12、Max=%dn,m);,23,练习7.5 :打印一批数中的素数。判断是否是素数由函数(PrimeNumber)完成。,#include #include int PrimeNumber(int x)int i;for(i=2;i=sqrt(x);i+)if(x%i=0)return 0;return 1;main()int a=15,17,19,21,23;int i;for(i=0;i5;i+)if(PrimeNumber(ai)=1)printf(%dt,ai);printf(n);,24,数组名作函数参数当数组名作参数时,传递的是整个数组。按照实参与形参的对应要求,当实参为数组名时,形参

13、必须定义为与实参是同类型的数组。例7.6:找出数组中的最大值 int array_max(int x5) main()int a =8,7,55,23,49; max=array_max(a); ,形参数组可以不指定大小。为了能正确使用数组元素,再增加一个参数用来存放数组元素的个数。,25,例7.6找出数组中的最大值,在主函数中告知找哪个数组中的最大,找最大由函数完成。 int array_max(int x5)/* 数组名作形参 */int i,m=x0;for(i=1;i5;i+)if(mxi) m=xi;return m;main() int a=8,7,55,23,49;int max

14、;max=array_max(a);/* 数组名作实参 */printf(Max=%dn,m);,26,练习7.6:编写一个函数,求数组元素之和。一般情况下,当函数被调用时,需要为形参变量分配存储单元。但当数组名作参数时,并不给形参数组分配存储单元,而是实现换名操作。例7.6的运行分析:,int array_max(int x ,int n)main() int a =8,7,55,23,49; max=array_max(a); ,x,27,练习7.6 编写一个函数,用来求给定数组的元素之和。,int ArrSum(int x)int i,s=0;for(i=0;i5;i+)s+=xi;re

15、turn s;main()int a=2,4,6,8,10;printf(Sym=%dn,ArrSum(a);,28,7.4 函数的嵌套与递归调用,例7.7void print_star();void print_hello();main()print_star();print_hello();print_star();void print_star() printf(*n); void print_hello() printf( Hellon);,嵌套调用,29,递归调用,在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C语言的特点之一就在于允许函数的递归调用。例

16、如:int fun(int x)int y,z;z=fun(y);return z-10;,从递归调用的形式上看,函数会无终止地调用自己,这种情况是我们所不希望的。因此,在定义递归函数时还要有终止条件,使递归调用在条件不满足时不再继续。,30,例7.8 用递归方法求xn。分析:求解过程:2423 22 21 20运行过程分析:,31,例7.8 用递归方法求xn。,float Pow(float x,int n)float p;if(x=1|n=0)p=1.0;/* 终止条件 */else p=x*Pow(x,n-1);return p;main()printf(2的4次幂=%fn,Pow(2,

17、4);,32,练习7.8:计算n!的数学定义为:请编写递归函数fact()求n!。,33,练习7.8:用递归函数求n!,long fact(int n)long f;if(n=0 | n=1)f=1;else f=n*fact(n-1);return f;main()int a=5;printf(%d! = %ldn,a,fact(a);,34,7.5 变量的作用域,char ch;double fun2(char c)float b;ch=c;int x;main()int m,n;,在函数内部说明的变量是局部变量。作用域:自说明位置起至函数结束止。,在函数外部说明的变量是全局变量。作用域:

18、自说明位置起至文件结束止。,35,在定义一个变量时,除了指定其数据类型外,还可以指定其存储类别。C语言中用四个关键字来表示存储类别:auto 自动的register寄存器的static 静态的extern 外部的,36,7.8.1 局部变量,自动变量(auto)int f(int a)auto int b,c=3; 自动变量在内存的动态存储区分配:当函数(或分程序)执行时为自动变量分配存储空间;当函数(或分程序)结束时释放自动变量所占的存储空间。auto关键字可以省略。,37,寄存器变量(register)int f(int a) register int i; 寄存器变量存在于CPU的寄存器

19、中:当函数(或分程序)执行时为寄存器变量分配寄存器;当函数(或分程序)结束时释放寄存器变量所占用的寄存器。,38,自动变量与寄存器变量之间的区别自动变量main()int s=0,i; for(i=1;i=3;i+)s=s+i; 寄存器变量main()register int s=0,i; for(i=1;i=3;i+)s=s+i; ,寄存器,0,寄存器,运行分析,运行分析,1,1,3,1,0,1,1,2,0,1,3,1,2,寄存器变量的使用可以减少内存与CPU之间的数据交换,从而提高程序执行的效率。,39,静态的局部变量(static)如:static int x; 静态的局部变量在内存的静

20、态存储区分配。静态存储区具有如下性质:在编译时即分配存储空间;当程序执行结束后,由操作系统把应用程序撤消时才被释放。存储在静态区的变量,未初始化时为0。 虽然它在整个程序的运行期间总是存在的,但由于它是局部变量,还要受作用域的限制。,这与其所在的函数无关,40,例7.9 静态变量与动态变量的比较,void inc(int z)static int x=0;auto int y=0;x+;y+; z+;printf(%d,%d,%dn,x,y,z);main() int p=5; inc(p); inc(p);,运行分析,问题,5,1,1,6,运行结果: 1,1,6,2,1,6,5,1,6,2,

21、此处加一句:printf(%d,x);可以吗?,41,全局(程)变量,它是在函数外部定义的。存储在静态区,它的内存分配与释放是由系统完成的。全局变量未初始化时,其初值为0。全局变量的作用域是从定义它的位置开始,一直到本文件结束。例7.10在程序中使用全局变量求1!+2!+5!,7.8.2 全局变量,42,例7.10 在程序中使用全局变量求1!+2!+5!,int p=1;void fact(int n)p=p*n;main()int i,s;for(s=0,i=1;i=5;i+)fact(i);s+=p;printf(1!+2!+5!=%dn,s);,43,全局变量的使用,全局变量虽然增加了函

22、数传递数据的渠道,但它的使用使函数的通用性降低。由于全局变量在程序执行期间一直占用内存空间,增加了内存开销。结论不在必要时,最好不使用全局变量。,44,1.下列程序的运行结果是5和8,还是8和5?说明为什么。void swap(int x,int y)int t;t=x;x=y;y=t;main()int a=5,b=8;swap(a,b);printf(%d,%d,a,b);,小测试,45,2. 写出下列程序的输出结果。void fun(int,int);main() int i,j,x,y,n,g;i=2;j=3;g=x=5;y=9;n=7;fun(n,6);printf(g=%d,i=%

23、d,j=%d,x=%d,y=%dn,g,i,j,x,y);fun(n,6);void fun(int i,int j) int x,y,g;g=8;x=7;y=2;printf(g=%d,i=%d,j=%d,x=%d,y=%dn,g,i,j,x,y);x=8;y=6;,46,3. 写出下列程序的输出结果。#include int fun(int x ,int n) int i, s=1; for(i=0; i=n; i+) s*=xi; return s; main() int a =1,2,3,4,5,6; int x=fun(a,4 ); printf(%d,x); A. 24 B. 120 C. 720 D.5,47,4. 写出下列程序完成的功能。#include main( ) void fun(int); int n; scanf(%d , ,实验五 函数应用的程序设计,编写一函数,统计字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串并输出统计结果。(1)作出流程图(2)用值传送的方式实现函数调用,分别从键盘上输入三个不同字符串,并记录下运行的过程和结果。,48,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号