C语言程序设计ppt课件 第5章.ppt
《C语言程序设计ppt课件 第5章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计ppt课件 第5章.ppt(62页珍藏版)》请在三一办公上搜索。
1、2022/11/16,华中科技大学计算机学院,1,C语言程序设计,The C Programming Language,华中科技大学计算机学院曹计昌,2022/11/16,华中科技大学计算机学院,2,第5章 函数与程序结构,本章内容:构化编程和C程序的一般结构。函数的机制: 包括函数定义、函数声明、函数调用、变量的存储类型、参数数目可变的函数等。递归与回溯: 包括解释递归与回溯的概念、递归函数设计,以及递归调用。多文件程序设计。,2022/11/16,华中科技大学计算机学院,3,5.1 C程序的一般结构,5.1.1 结构化程序设计 结构化编程是一种解决问题的策略,它包括如下2条编程标准:(1)
2、 程序中的控制流应该尽可能简单。(2) 应该自顶向下地设计程序结构。 自顶向下设计也称为逐步细化,即把一个问题按功能分解为若干子问题,如果子问题还较复杂,可将其继续分解,直到分解成为容易求解的子问题为止。分解而来的每个子问题被称为模块,C中提供的函数机制完成每个模块的编程任务,即用函数编写由分解而来的子问题的代码。,2022/11/16,华中科技大学计算机学院,4,例 显示从1到10的整数幂。,* * A TABLE OF POWERS * * Int Square Cube Quartic Quintic 1 1 1 1 1 2 4 8 16 32 3 9 27 81 243 4 16 64
3、 256 1024 5 25 125 625 3125 6 36 216 1296 7776 7 49 343 2401 16807 8 64 512 4096 32768 9 81 729 6561 59049 10 100 1000 10000 100000,2022/11/16,华中科技大学计算机学院,5,自顶向下的分解问题:,(1) 显示标题(2) 显示表头(3) 分列整齐地显示整数1到10的2至5次幂每个子问题都能作为函数直接被编写成代码,在main中调用这些函数,解决总的问题。,2022/11/16,华中科技大学计算机学院,6,#includevoid prn_banner(voi
4、d); /* prn_banner的函数原型 */ void prn_headings(void); /* prn_headings的函数原型 */double power(int x,int n); /* power的函数原型 */void main(void) int i,j; prn_banner() ; /* 显示标题 */ prn_headings(); /* 显示表头 */ for(i=1;i=10;i+) printf(%5d,i); for(j=2;j=5;j+) printf(%10.0f, power(i,j); /* i j */ printf(n); ,main函数:,
5、2022/11/16,华中科技大学计算机学院,7,结构化程序设计的益处,使程序编制方便,易于管理、修改和调试。增强了程序的可读性、可维护性和可扩充性,方便于多人分工合作完成程序的编制。函数可以公用,避免在程序中使用重复的代码。提高软件的可重用性,软件的可重用性是转向面向对象程序设计的重要因素。,2022/11/16,华中科技大学计算机学院,8,5.1.2 C程序的一般结构,C程序由一或多个函数组成,这些函数可以编辑成多个C源文件,每一个C源文件含有一个或多个函数定义。各C源文件中要用到的一些外部变量说明、枚举类型声明、结构类型声明、函数原型和编译预处理指令等可编辑成一个.h头文件,然后在每个C
6、文件中包含该头文件。每个源文件可单独编译生成目标文件,组成一个C程序的所有源文件都被编译之后,由连接程序将各目标文件中的目标函数和系统标准函数库的函数装配成一个可执行C程序。 除main以外的其它函数分两类,一类是由系统提供的标准函数。另一类是需要由程序员自己编写的函数(“自定义函数”)。,2022/11/16,华中科技大学计算机学院,9,5.2 函数的定义与函数的声明,程序中若要使用自定义函数实现所需的功能,需要做三件事: 按语法规则编写完成指定任务的函数,即定义函数; 有些情况下在调用函数之前要进行函数声明; 在需要使用函数时调用函数,2022/11/16,华中科技大学计算机学院,10,5
7、.2.1 函数的定义,函数定义的一般形式为:类型名 函数名(参数列表) 声明部分 语句部分无返回值,类型名用void。无参数,参数列表void(可缺省不写),2022/11/16,华中科技大学计算机学院,11,函数定义的例子,/* 函数prn_banner:显示标题 */void prn_banner(void) /* 同于void prn_banner() */ printf(n %s%s%sn, * n, * A TABLE OF POWERS * n, * n );,2022/11/16,华中科技大学计算机学院,12,未指明函数返回值的类型,默认为 int,/* 函数prn_headin
8、gs:显示表头 */void prn_headings( ) /* 不同于 prn_headings( ) */ printf(n %5s%10s%10s%10s%10sn,Int,Square,Cube,Quartic,Quintic);,2022/11/16,华中科技大学计算机学院,13,必须明确地列出每一个参数的类型。函数定义中的参数称为形式参数(形参),/* 函数power:计算x n ,n 0 */double power(int x,int n) /*不能为 double power(int x,n) */ int i; double p; for (i=1,p=1;i=n;i+)
9、 p*=x; return p;,2022/11/16,华中科技大学计算机学院,14,5.2.2 return语句,return语句可以是如下两种形式之一:(1)return ; /* void函数 */(2)return 表达式 ; /* 非void函数 */ void函数也可以不包含return语句。如果没有return语句,当执行到函数结束的右花括号时,控制返回到调用处,把这种情况称为离开结束。 表达式值的类型应该与函数定义的返回值类型一致,如果不相同,就把表达式值的类型自动转换为函数返回值的类型 。,2022/11/16,华中科技大学计算机学院,15,函数返回的值,程序可以使用它,也可
10、以不使用它,while() getchar(); /* 返回值不被使用 */ c=getchar(); /* 返回值被使用 */ ,2022/11/16,华中科技大学计算机学院,16,一旦return被执行,控制立即返回到调用处,其后的代码不可能被执行,/* is_prime:如果n是素数,则返回1;否则,返回0 */int is_prime(int n) /* 等价于 is_prime(int n) */ int k, limit; if (n=2) return 1; if (!(n % 2) return 0; limit=n/2 ; for (k=3; k=limit; k+=2) i
11、f ( !(n % k) ) return 0; return 1;,2022/11/16,华中科技大学计算机学院,17,5.2.3 函数的声明,1函数定义起函数声明的作用 函数定义在前,调用函数在后。例:#includevoid prn_banner(void) void prn_headings(void) double power(int x,int n) void main(void) ,2022/11/16,华中科技大学计算机学院,18,2函数原型,函数定义出现在函数调用后 被调用函数在其它文件中定义 必须在函数调用之前给出函数原型。,2022/11/16,华中科技大学计算机学院,1
12、9,函数原型的一般形式,类型名 函数名(参数类型表); 参数类型表通常是用逗号隔开的形参类型列表,而形参名可以省略。例如, double power(int, int); 等价于 double power(int x, int n); 无参函数的函数原型参数表必须指定为void,2022/11/16,华中科技大学计算机学院,20,函数原型的作用,函数原型告诉编译器函数返回值的数据类型,传递给函数的参数个数、参数类型和参数顺序。编译器用函数原型校验函数调用, 强制转换传递的参数类型,从而避免错误的函数调用导致的致命运行错误或微妙而难以检测的非致命逻辑错误。例如, printf (%.1f n,
13、sqrt(4) ) ;(1)包含了math.h,输出 2.0 */(2)没有包含math.h,函数调用sqrt(4)不会产生正确的值。,2022/11/16,华中科技大学计算机学院,21,3遗漏函数原型,编译器首次遇到没有声明的函数调用时,将构造一个缺省声明并继续编译: int f(); /*函数是int类型,但不给出参数表信息*/ (1) 函数类型不是int,给出一个错误提示: Type mismatch in redeclaration of f (2) 函数类型是int,就不给出错误提示。编译器对参数类型不作检查,把正确类型的参数传递给函数是程序员的责任。假设函数f只有一个类型为int的
14、参数,函数调用f (2)会产生正确的值,而函数调用f(2.5)将产生错误的运行结果。,2022/11/16,华中科技大学计算机学院,22,良好的编程风格,在函数调用之前必须给出它的函数定义、函数原型或两者都给出。 引入标准头文件的主要原因是它含有函数原型。,2022/11/16,华中科技大学计算机学院,23,5.3 函数调用与参数传递,5.3.1 函数调用 1函数调用的形式 函数名(实参列表)实参是一个表达式 ,对于无函数,调用形式 : 函数名(),2022/11/16,华中科技大学计算机学院,24,函数调用在程序中出现的形式,(1) 作为表达式语句出现。 prn_headings(); pu
15、tchar(c);(2)作为表达式中的一个操作数出现。例如: c=getchar() sum += power(i,j);(3)作为函数调用的一个实参出现,即嵌套调用。 printf(%10.0f, power(i , j) ); putchar ( getchar() );,2022/11/16,华中科技大学计算机学院,25,2. 函数调用的执行过程,#includeint max(int,int);void main(void) int m, a=3, b=4; m=max( a, b ); printf(%d,m); int max( int x, int y ) if(xy) retu
16、rn x; else return y;,2022/11/16,华中科技大学计算机学院,26,3实参的求值顺序,实参的求值顺序由具体实现确定,有的按从左至右的顺序计算,有的按从右至左的顺序计算 a=1; max (a,a+) -从左至右:max(1,1) -从右至左:max(2,1) (多数 ) 为了保证程序清晰、可移植,应避免使用会引起副作用的实参表达式 .实参的求值顺序C语言采用从右至左规则,2022/11/16,华中科技大学计算机学院,27,实参的求值顺序C语言采用从右至左规则,#include stdio.hvoid main(void) int x=1; printf(%dt%dt%
17、dn,x,x+,x);运行结果:2 1 1,2022/11/16,华中科技大学计算机学院,28,5.3.2 参数的值传递,参数的传递方式是“值传递”,实参的值单向传递给相应的形参。如果实参、形参都是x,被调用函数不能改变实参x的值。,2022/11/16,华中科技大学计算机学院,29,例 说明值传递概念的程序,#include long fac(int); void main() int n=4; printf(%dn,n); /* 输出4 */ printf(%ldn,fac(n); /* 输出24 */ printf(%dn,n); /* 输出4 */ long fac(int n) /*
18、 计算n的阶乘 */ long f=1; for( ;n0;-n) f *=n ; /* main中的n值未改变 */ printf(%dn,n); /* 输出0 */ return(f); ,2022/11/16,华中科技大学计算机学院,30,5.4 作用域,作用域:程序正文中可以使用该标识符的那部分程序段。根据作用域,变量有两类:局部变量:在函数内部定义的变量,作用域是定义该变量的程序块,程序块是带有说明的复合语句(包括函数体)。不同函数可同名,同一函数内不同程序块可同名。形式参数是局部变量。外部变量:在函数外部定义的变量,其作用域从其定义处开始一直到其所在文件的末尾,可由程序中的部分或所
19、有函数共享。,2022/11/16,华中科技大学计算机学院,31,关键字extern的作用,int sp=0;/*sp是外部变量 ,main,push和pop均可访问 */void main() /* val不能用在main中 */double valMAXVAL; /* val是外部数组 */void push(double f ) double pop(void) 利用extern对外部变量进行声明可以扩大其作用域,使得外部变量在定义之前可以使用,以及其它源文件中的函数也可以使用。例如 void main() extern double valMAXVAL; ,2022/11/16,华中科
20、技大学计算机学院,32,外部变量的声明和定义的区别,外部变量的声明用于通报变量的类型(引用性声明)外部变量的定义除此以外还引起存储分配(定义性声明) int sp; 这是外部变量的定义,一方面说明了sp类型为int,另一方面系统还要为其分配2B的存储单元。而 extern int sp ; 这是外部变量的声明,仅仅说明了sp类型为int,不会为其分配存储单元。 外部变量只能定义一次,而外部变量的声明可以出现多次。外部变量的初始化只能出现在其定义中。,2022/11/16,华中科技大学计算机学院,33,5.5 存储类型,变量和函数都有两个属性:数据类型和存储类型。函数的存储类型决定函数的作用域,
21、可使用的关键字有extern和static(5.9节)。变量的存储类型决定变量的作用域、存储分配方式、生命周期和初始化方式,可使用的关键字有:auto、extern、static和register。 存储分配方式:在何时、何处给变量分配存储单元; 生命周期:变量在内存中的存在期; 初始化方式:在定义变量时如果未显示初始化,是否有缺省初值,如果有显示初始化,赋初值操作如何执行(执行一次还是执行多次)。,2022/11/16,华中科技大学计算机学院,34,5.5.1 存储类型auto,局部变量的缺省存储类型是auto,称自动变量auto int a; /*等价于int a; 也等价于auto a;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计ppt课件 第5章 语言程序设计 ppt 课件

链接地址:https://www.31ppt.com/p-1375819.html