C程序设计实例教程 教学课件 ppt 作者 金林樵 第6章 模块化程序设计

上传人:E**** 文档编号:89190856 上传时间:2019-05-21 格式:PPT 页数:49 大小:857KB
返回 下载 相关 举报
C程序设计实例教程 教学课件 ppt 作者 金林樵 第6章 模块化程序设计_第1页
第1页 / 共49页
C程序设计实例教程 教学课件 ppt 作者 金林樵 第6章 模块化程序设计_第2页
第2页 / 共49页
C程序设计实例教程 教学课件 ppt 作者 金林樵 第6章 模块化程序设计_第3页
第3页 / 共49页
C程序设计实例教程 教学课件 ppt 作者 金林樵 第6章 模块化程序设计_第4页
第4页 / 共49页
C程序设计实例教程 教学课件 ppt 作者 金林樵 第6章 模块化程序设计_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《C程序设计实例教程 教学课件 ppt 作者 金林樵 第6章 模块化程序设计》由会员分享,可在线阅读,更多相关《C程序设计实例教程 教学课件 ppt 作者 金林樵 第6章 模块化程序设计(49页珍藏版)》请在金锄头文库上搜索。

1、第六章 函数,6.1 概述 6.2 函数的定义 6.3 函数的参数和函数返回值 6.4 函数的调用 6.5 函数的嵌套调用和递归调用 6.6 数组作为函数参数 6.7 局部变量和全局变量 6.8 变量的存储类别 6.9 内部函数和外部函数,6.1 概述,模块化程序设计 基本思想:将一个大的程序按功能分割成一些小模块, 特点: 各模块相对独立、功能单一、结构清晰、接口简单 控制了程序设计的复杂性 提高元件的可靠性 缩短开发周期 避免程序开发的重复劳动 易于维护和功能扩充 开发方法: 自上向下,逐步分解,分而治之,C程序结构,C是函数式语言 必须有且只能有一个名为main的主函数 C程序的执行总是

2、从main函数开始,在main中结束 函数不能嵌套定义,可以嵌套调用,C是模块化程序设计语言,从用户角度 标准函数(库函数):由系统提供 用户自定义函数 从函数形式 无参函数 有参函数,使用库函数应注意: 1、函数功能 2、函数参数的数目和顺序,及各参数意义和类型 3、函数返回值意义和类型 4、需要使用的包含文件,函数分类,一般格式,例 有参函数(现代风格) int max(int x,int y) int z; z=xy?x:y; return(z); ,例 无参函数 printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); ,6

3、.2 函数的定义,例 有参函数(传统风格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); ,函数传统风格和例子,形参与实参 形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式,例 比较两个数并输出大者,void main() int a,b,c; scanf(“%d,%d“, ,6.3 函数的参数和函数的返回值 6.3.1函数的参数,说明: 实参必须有确定的值 形参必须指定类型 形参与实参类型一致,个数相同 若形参与实参类型不一致,自动按形参类型转换函数调用转换 形参在函数被调用前不占内存;函数调用时

4、为形参分配内存;调用结束,内存释放,值传递方式 方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值 特点: 形参与实参占用不同的内存单元 单向传递,参数传递方式,#include void main() int x=7,y=11; printf(“x=%d,ty=%dn“,x,y); printf(“swapped:n“); swap(x,y); printf(“x=%d,ty=%dn“,x,y); swap(int a,int b) int temp; temp=a; a=b; b=temp; ,例 交换两个数,返回语句 形式: r

5、eturn(表达式); 或 return 表达式; 或 return; 功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数 说明: 函数中可有多个return语句 若无return语句,遇时,自动返回调用函数 若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换-函数调用转换 void型函数,例 无返回值函数 void swap(int x,int y ) int temp; temp=x; x=y; y=temp; ,6.3 函数的参数和函数的返回值 6.3.2 函数的返回值,调用形式 函数名(实参表); 说明: 实参与形参个数相等,类型一致,按顺序一一

6、对应 实参表求值顺序,因系统而定(Turbo C 自右向左),6.4 函数的调用,函数语句: 例 printstar(); printf(“Hello,World!n”); 函数表达式: 例 m=max(a,b)*2; 函数参数: 例 printf(“%d”,max(a,b); m=max(a,max(b,c);,函数的调用方式,对被调用函数要求: 必须是已存在的函数 库函数: #include 用户自定义函数: 函数类型说明 函数说明 一般形式: 函数类型 函数名(形参类型 形参名, ); 或 函数类型 函数名(); 作用:告诉编译系统函数类型、参数个数及类型,以便检验 函数定义与函数说明不

7、同 函数说明位置:程序的数据说明部分(函数内或外) 下列情况下,可不作函数说明 若函数返值是char或int型,系统自动按int型处理 被调用函数定义出现在主调函数之前 有些系统(如Borland C+)要求函数说明指出函数返值类型和形参类型,并且对void 和 int 型函数也要进行函数说明,函数说明,例 使用函数求出某同学英语、语文和数学三门课的平均成绩。 #include void main( ) int es, cs, ms; float aver; /* 因avg函数调用在前,定义在后,故需在main函数中对avg函数进行声明 */ float avg(int es, int cs,

8、 int ms); printf( “ninput es,cs,ms:“ ); scanf( “%d%d%d“, /* 返回三门课的平均成绩 */ ,程序运行情况如下: input es,cs,ms:80 100 90 Avg=80.0,嵌套调用 C规定:函数定义不可嵌套,但可以嵌套调用函数,6.5 函数的嵌套与递归调用,例:计算s=1!+2!+3!+n!,long sum( int n ) int x; long s, fact(int x); /* s变量定义与fact函数声明 */ for( s=0, x=1; x=n; x+ ) /* 阶乘累加和s清零及循环控制 */ s = s +

9、fact(x);/* 调用求阶乘的函数fact函数并进行阶乘值累加 */ return s; /* 返回阶乘值累加和 */ /* 定义求阶乘的函数fact, 形参为x, 返回值为long(阶乘值一般比较大) */ long fact( int x ) int i; long f; for( f = i = 1; i = x; i+ ) /* 求阶乘 */ f = f * i; return f; /* 返回x!的值 */ void main( ) int n; long total; printf( “nInput n:“ ); scanf( “%d“, ,程序运行情况如下: Input n:

10、 5 s=153,定义:函数直接或间接的调用自身叫函数的递归调用,说明 C编译系统对递归函数的自调用次数没有限制 每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出,int f(int x) int y,z; z=f(y); . return(2*z); ,递归调用,#include int fac(int n) int f; if(n0) printf(“n0,data error!“); else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f); main() int n, y; printf

11、(“Input a integer number:“); scanf(“%d“, ,例 求n的阶乘,6.6 数组作为函数参数 数组元素作函数实参值传递,例 一个数组中存放了5个学生的成绩,若大于等于60 则输出该成绩,若小于60则输出0。,void cmpzero( int v ) if( v60 ) printf( “%d “, v ); else printf( “%d “, 0 ); void main( ) int a5,i; printf(“ninput 5 numbers:“); for( i=0; i5; i+ ) scanf( “%d”, /* 输出对应的成绩 */ ,程序运行

12、情况如下: input 5 numbers:67 45 56 70 80 67 0 0 70 80,地址传递 在主调函数与被调函数分别定义数组,且类型应一致 形参数组大小(多维数组第一维)可不指定 形参数组名是地址变量,数组名作函数参数,#include float average(int stu10, int n); void main() int score10, i; float av; printf(“Input 10 scores:n“); for( i=0; i10; i+ ) scanf(“%d“, ,float average(int stu10, int n) int i;

13、float av,total=0; for( i=0; in; i+ ) total += stui; av = total/n; return av; ,实参用数组名,形参用数组定义, int stu ,例 求学生的平均成绩,#include void swap2(int x) int z; z=x0; x0=x1; x1=z; main() int a2=1,2; swap2(a); printf(“a0=%dna1=%dn“,a0,a1); ,地址传递,例 数组元素与 数组名 作函数参数比较,例 使用函数分别实现n个学生英语、语文和数字成绩的输入、计算每个学生平均成绩及输出学生的上述信息

14、。,#include “stdio.h“ #define N 10 /* 最大学生人数 */ void printdata(int es, int cs, int ms, float avg, int n) ; int inputdata(int es, int cs, int ms, float avg); void main() int n; int esN, csN, msN;/*存放英语、语文、数学成绩的数组 */ float avgN; /* 存放平均成绩的数组 */ n = inputdata( es, cs, ms, avg ); /* 调用输入成绩的函数 */ printdat

15、a( es, cs, ms, avg, n ); /* 调用输出成绩的函数 */ ,/* 输出学生数据的函数 */ void printdata(int es, int cs, int ms, float avg, int n) int i; printf( “n输入的学生数据是:“); printf( “n 英语 语文 数学 平均分“); for(i = 0; i n; i+ ) printf( “n%6d%6d%6d%10.2f“, esi, csi, msi, avgi ); ,/* 输入学生数据的函数,在该函数中完成学生数据的输入及平均成绩的计算 */ int inputdata(int es, int cs, int ms, float avg) int n = 0; char consele=y; while ( consele=y | consele=Y) avg n = 0; /* 总分清零 */ printf( “n请输入第%d位学生的数据(英语、语文、数学成绩):n“, n+1 ); scanf(“%d%d%d“, /*

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

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