用函数实现模块化程序设计优秀课件
第7章_用函数实现模块化程序设计_[谭浩强_C程序设计_(第四版)]
![第7章_用函数实现模块化程序设计_[谭浩强_C程序设计_(第四版)]](https://img.taocdn.com/s3/m/c99a12e1f61fb7360b4c6574.png)
例7.3将例7.2稍作改动,将在max函数中定 义的变量z改为float型。函数返回值的类型 与指定的函数类型不同,分析其处理方法。 解题思路:如果函数返回值的类型与指定 的函数类型不同,按照赋值规则处理。
#include <stdio.h> int main() { int max(float x,float y); float a,b; int c; scanf("%f,%f,",&a,&b); c=max(a,b); 变为2 printf("max is %d\n",c); return 0; 1.5 2.6 } int max(float x,float y) { float z; z=x>y?x:y; return( z ) ; } 2 2.6
C语言要求,在程序中用到的所有函数, 必须“先声明,再定义,后使用”
7.2 怎样定义函数
函数名字、函数返回值类型、函数实现 的功能以及参数的个数与类型 函数名字——以便以后按名调用
函数类型——函数返回值的类型
函数参数的名字和类型——以便在调用 函数时向它们传递数据 函数的功能——函数的具体实现
实参和形参间的数据传递
在调用有参函数时,主调函数和被调用函 数之间有数据传递关系 定义函数时函数名后面的变量名称为“形 式参数”(简称“形参”) 主调函数中调用一个函数时,函数名后面 参数称为“实际参数”(简称“实参”)
在调用函数过程中,系统会把实参的值传 递给被调用函数的形参 或者说,形参从实参得到一个值,该值在 函数调用期间有效
主函数 #include <stdio.h> int main() { int max4(int a,int b,int c,int d); int a,b,c,d,max; 输入4个整数 printf(“4 interger numbers:"); scanf("%d%d%d%d",&a,&b,&c,&d); max=max4(a,b,c,d); printf("max=%d \n",max); return 0; }
第07章 用函数实现模块化程序设计

成。
函数间的调用关系:由主函数调用其他函数,其他
函数也可以互相调用。 同一个函数可以被一个或
多个函数调用任意多次。
7.1 函数是什么
例7.1 分别求出克拉索夫斯基椭球和1975年国际椭球第一偏心率(用函数实现) #include<stdio.h> #include<math.h> void main( ) /* 主函数*/ { double DYPXLE(double a,double b); /* 对被调用函数DYPXLE的声明 */ double a, b, e; /*定义变量a、b、e */ a=6378245.0000000000;b=6356863.0187730473; e=DYPXLE(a,b); /*调用DYPXLE函数,求克拉索夫斯基椭球第一偏心率e */ printf(“克拉索夫斯基椭球第一偏心率是:%lf\n”,e);/*输出e的值*/ a=6378140.0000000000;b=6356755.2881575287; e=DYPXLE(a,b); /*调用DYPXLE函数,求1975国际椭球第一偏心率e */ double DYPXLE(double a,double b) printf(“1975国际椭球第一偏心率是:%lf\n",e);/*输出e的值*/ 说明: } {
{
double e; e=(sqrt(a*a-b*b))/a; return (e); }
7.2.3 函数的调用
1. 调用无参函数的形式 函数名()
如:print_star( )
说明:
如果是调用无参函数,则“实参表列”可以
没有,但括弧不能省略。 如 print_star( )。
7.2.3 函数的调用
第7章 用函数实现模块化程序设计.

7.1为什么要用函数
问题:
如果程序的功能比较多,规模比较大,把所有代 码都写在main函数中,就会使主函数变得庞杂、 头绪不清,阅读和维护变得困难
有时程序中要多次实现某一功能,就需要多次重 复编写实现此功能的程序代码,这使程序冗长, 不精炼
7.1为什么要用函数
解决的方法:用模块化程序设计的思路
二.函数调用的方式 1.函数语句:即把函数调用作为一个语句。如: printStar(); printf(“***********”); 这时不要求函数带回值,只要求完成一定的操 作,通常将函数字义为“void”类型。 2.函数表达式:函数出现在可以写表达式的地方, 此时需要的是函数的值。如: c=2*max(a,b); printf(“%d”,max(a,b));
7.2.2 定义函数的方法
函数定义的一般形式 类型符 函数名(形式参数说明表) { 说明部分 函数体 语句部分 }
完整的函数定义
函数首部
无参函数定义
空函数定义
int add(int read() x,int y) { int x; sum; { }; dummy() sum=x+y; scanf(“%d”,&x); return sum; x; }
指定函数的名字,以便以后按名调用
指定函数类型,即函数返回值的类型
指定函数参数的名字和类型,以便在调 用函数时向它们传递数据 指定函数的功能。这是最重要的,这是 在函数体中解决的
7.2.1 为什么要定义函数
对于库函数,程序设计者只需用 #include指令把有关的头文件包含到 本文件模块中即可 程序设计者需要在程序中自己定义想用 的而库函数并没有提供的函数
7.3.2 函数调用时的数据传递
第7章用函数实现模块化程序设计

第7章⽤函数实现模块化程序设计7.1为什么要⽤函数模块化程序设计:实现编写好⼀批常⽤的函数,需要使⽤时可直接调⽤,⽽不必重复在写,减少了程序的冗余,使得程序变得更加精炼,编写⼀次,就可以多次调⽤。
函数声明的作⽤:吧有关函数的信息(函数名、函数类型、函数参数的个数与类型)通知编译系统,以便在编译系统对程序进⾏编译时,在进⾏到Main 函数中调⽤其它函数时,知道它们是定义的函数⽽不是变量或其他对象。
说明:(1) ⼀个C程序由⼀个或多个程序模块组成,每⼀个程序模块作为⼀个源程序⽂件。
对于较⼤的程序,⼀般不希望把所有的内容全放在⼀个⽂件中,⽽是将它们分别编写成若⼲个源⽂件中,由若⼲个源程序⽂件组成⼀个C程序。
(2) ⼀个源程序⽂件由⼀个胡多个函数以及其他有关内容(如指令、数据声明与定义)组成。
⼀个源程序⽂件是⼀个编译单位,在程序编译时是以源程序⽂件为单位进⾏编译的,⽽不是以函数为单位进⾏编译的。
(3) C程序的执⾏是从main函数开始的,如果在main函数中调⽤它其他函数,在调⽤后流程返回到main函数,在main函数找那个结束整个程序的运⾏。
(4) 所有函数都是平⾏的,即在定义函数时是分别进⾏的,是相互独⽴的;⼀个函数并不从属于另⼀个函数,即函数不能嵌套定义。
(5) 从⽤户使⽤的⾓度看,函数有两种形式①库函数②⽤户⾃⼰定义的函数(6) 从函数的⾓度看,函数有两种形式①⽆参函数②有参函数7.2 怎样定义函数7.2.1 为什么要定义函数定义函数包含以下内容:(1)指定函数名字,使后续可按名字调⽤(2)指定函数的类型,即函数返回值的类型(3)指定函数的参数的名字和类型,以便在调⽤函数时向它们传递数据。
⽆参参数该项不需要指定(4)指定函数应当完成什么操作,即函数的功能说明:对于C编译系统提供的库函数,是由编译系统事先定义好的,库⽂件中包括了个函数的定义。
我们不必⾃⼰定义,只须⽤#include指令把有关的头⽂件中包含到本⽂件模块中即可。
《C程序设计项目教程》课件项目六 函数实现程序模块化设计的好帮手

(3)重复步骤(1)、(2),直到f (x)的值小于给定的误差值。
根据上述思路,设计如下函数来实现程序:
(1)root()函数用于计算给定的两个值之间的实根。 (2)xpoint()函数用于计算两点连线与x轴的交点的横坐标。 (3)f()函数用于计算给定的横坐标所对应的纵坐标值。
#include<stdio.h>
#include<math.h>
实d施ou步ble骤f(double x);
double xpoint(double x1,double x2);
double root(double x1,double x2);
int main(void)
步骤{ 1 启do动uVblCe,x1创,x2建,f一1,f个2,xC;++源文件,在编辑区内输入如下代码。
任务实施——用弦截法求方程 x3 5x2 16x 80 0 的根
任务分析 弦截法是一种求方程根的基本方法,体现的是极限的思想,在计
算机编程中常用,其解题思路如下: 如图6-3所示,在横坐标轴上
取两个点(x1,0),(x2,0),如果 f (x1)和f (x2)的符号相反,则在 区间(x1,x2)上必有方程的一个根。
C语言程序设计项目教程
项目六共分为两个任务
项目六 函数 ——实现程序模块化设计的好帮手
任务一 学习函数的基础知识 任务二 深入学习函数知识
任务一 学习函数的基础知识
任务说明 在本任务中我们来学习函数的基本概念以及定义、声明和调用
函数的方法。 预备知识
一、函数的基本概念 二、函数的声明和定义 三、函数的调用
(三)函数的参数
定义函数时,函数名后面括号中的变量名称为形式参数(简称形 参)。调用函数时,函数名后面括号中的参数(或表达式)称为实际参 数(简称实参)。形参和实参用于实现主调函数与被调函数之间数据的 传递。
第7章 用函数实现模块化程序设计

函数体
说明
§函数就像一段小程序,调用一个函数就 相当于在调用的这个位置运行这个小程 序。 §如果把函数看作是一个黑盒子,那么形 参就是它的输入,return语句返回的值就 是他的输出。
2011-12-14
函数定义举例
求两个数之和的函数 int add(int x, int y) { int z; z=x+y; return(z); }
1.2 ×× 1.728 ×× 1.2
x
参数传递方式
值传递方式
方式:函数调用时,为形参分配单元,并将实参的值复制到形参 中;调用结束,形参单元被释放,实参单元仍保留并维持原值 特点: 形参与实参占用不同的内存单元 单向传递
例 交换两个数
调用前: x: x: 调用: a: swap: x: a: 7 7 11 temp 调用结束: x: 7 y: 11 b: y: b: 11 11 7 7 7 y: y: 11 11
#include <stdio.h> main() { int x=7,y=11; printf("x=%d,\ty=%d\n",x,y); printf("swapped:\n"); swap(x,y); printf("x=%d,\ty=%d\n",x,y); } swap(int a,int b) { int temp; temp=a; a=b; b=temp; }
#include <stdio.h> 文件包含编译预处理命令 long sum(int a, int b); 函数说明 long factorial(int n); main() { int n1,n2; long a; long factorial(int n) long sum(int a, int b); { long rtn=1; scanf("%d,%d",&n1,&n2); int i; a=sum(n1,n2); 函数调用 实参 for(i=1;i<=n;i++) printf("a=%1d",a); rtn*=i; } 函数定义 return(rtn); long sum(int a,int b) } 形参 { long factorial(int n); long c1,c2; c1=factorial(a); 函数调用 c2=factorial(b); return(c1+c2); 函数返回值 }
第7章用函数实现模块化程序设计

7.1 函数是什么
main
P168
a
b
c
de f g h
i
e
7.1 函数是什么 P168
➢除了可以使用库函数外,还可以编写一些 本领域或本单位常用到一些专用函数, 供本领域或本单位的人员使用。、
➢在程序设计中要善于利用函数,可以减 少各人重复编写程序段的工作量,同时 可以方便地实现模块化的程序设计。
义而直接使用它们。应该说明,不同的C语言 编译系统提供的库函数的数量和功能会有一些 不同,当然许多基本的函数是共同的。
用户自己定义的函数。它是用以解决用户专门 需要的函数。
➢说明:
(6) 从函数的形式看,函数分两类。 ① 无参函数。函数没有参数,一般用来执行固 定的一组操作。无参函数可以带回或不带回函 数值,但一般以不带回函数值的居多。
7.2.1 为什么要定义函数 P170
➢C语言要求,在程序中用到的所有函数, 必须“先定义,后使用”
➢指定函数名字、函数返回值类型、函数 实现的功能以及参数的个数与类型,将 这些信息通知编译系统。
7.2.1 为什么要定义函数 P170
➢指定函数的名字,以便以后按名调用 ➢指定函数类型,即函数返回值的类型 ➢指定函数参数的名字和类型,以便在调
解题思路:
➢题目要求用一个max函数实现比较两个 整数,并将得到的大数带回主函数。显 然,二个整数中的大者也应该是整数, 因此max函数应当是int型。
➢两个数是在主函数中输入的,在max函 数中进行比较,因此应该定义为有参函 数,在函数调用时进行数据的传递。
#include <stdio.h>
第7章用函数实现模块化程序设计
7.1 函数是什么 P168
WL第7章用函数实现模块化程序设计

无参函数 从表现形式
有参函数
WL第7章用函数实现模块化程序设 计
举例说明
9 9/53
WangLan二、函数的定义
1、形式:
返回值类型 函数名(形式参数)
{ 声明部分
语句
}
说明:(1)[返回值类型符]指的是函数体语句执行完成后, 函数返回值的类型。
如int,float,char等。
若函数无返回值,则用空类型void来定义函数的返回值。
五、函数中的变量
1、按作用域分
局部变量:在本函数内部有效。
全局变量:从定义位置到源程序结束均有效。
2、按存储类型分
静态存储变量:程序运行时有固定的存储空间, 程序结束时释放内存单元。
WL第7章用函数实现模块化程序设 计
3 3/53
WangLan
数学函数(1)
y f (x)
因变量
函数返回值
函数名
自变量
参数
WL第7章用函数实现模块化程序设 计
4 4/53
WangLan
数学函数(2)
y2x23x5 一个自变量,一个因变量
zaxnbymc 两个自变量,一个因变量
WL第7章用函数实现模块化程序设 计
信息隐藏
设计得当的函数可以把具体操作细节对程序中不需要知道它们的那 些部分隐藏掉,从而使整个程序结构清楚。
WL第7章用函数实现模块化程序设 计
7 7/53
WangLan
一、C语言中的函数
说明:
➢ 一个源程序文件由一个或多个函数组成。 ➢ 一个C程序由一个或多个源程序文件组成。 ➢ C程序的执行从main函数开始,调用其他函数后流程
printf("|%d|+|%d|=%d\n",x,y,z);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例7.1_1:设计一个求阶乘的函数。通过主函数对这个子函数的 多次调用来完成从m个数中取n个数的组合。
double jiech(int x)
{ int i; double p=1; for (i=1;i<=x;i++) p=p*i; return p;}
一个完整的函数。由 函数首部 函数体 组成的。
例7.1_1:设计一个求阶乘的函数。通过主函数对这个子函数的 多次调用来完成从m个数中取n个数的组合。
double jiech(int x)
int i; double p=1; for (i=1;i<=x;i++) p=p*i;
这是函数的首部。其中 包括函数的类型、函数 的名称以及函数中所用 到的参数的类型及参数 的名称。P174
程序运行时输入:5,3
#include<math.h> #include<stdio.h> int main() {int m,n; double c; scanf("%d,%d",&m,&n); printf("%f",pow(m,n)); c=jiech(m)/(jiech(n)*jiech(m-n)); printf("%f",c); return 0;}
7.1为什么要用函数
➢原因有两个:
如果程序的功能比较多,规模比较庞大,把所有 不同功能的代码都写在main函数中,就会使主 函数变得庞杂、头绪不清,阅读和维护变得困难.
有时程序中要多次实现某一功能(例如打印每一 页的页头),就需要多次重复编写实现此功能的 程序代码,这使程序冗长,
7.1为什么要用函数
例7.1_1:设计一个求阶乘的函数。通过主函数对这个子函数的 多次调用来完成从m个数中取n个数的组合。
5
double jiech(int x)
{ int i; double p=1; for (i=1;i<=x;i++) p=p*i; return p;}
程序运行时输入:5,3
#include<math.h> #include<stdio.h> int main() {int m,n; double c; scanf("%d,%d",&m,&n); printf("%f",pow(m,n)); c=jiech(m)/(jiech(n)*jiech(m-n)); printf("%f",c); return 0;}
例7.1_1:设计一个求阶乘的函数。通过主函数对这个子函数的 多次调用来完成从m个数中取n个数的组合。
double jiech(int x)
{ int i; double p=1; for (i=1;i<=x;i++) p=p*i; return p;}
函数体(用于实现特定 功能的——在此程序中 是实现求阶乘功能的), 它包括声明部分和语句 部分
➢ 解决办法:采用“组装”的办法来简化程序设 计的过程。
1. 事先编好一批常用的实现各种不同功能的函数 2. 把它们保存在函数库中,需要时直接调用函数库中
对应的代码.执行这些代码,就得到预期的结果。
在设计一个较大的程序时,往往把它分为若干个程 序模块,每个模块包括一个或几个函数,每个函数实 现一个特定的功能。这就是模块化程序设计的思路。
第三次函数调用结束后,将p的 值2带回做为jiech(m-n)的值. 供主调函数使用。
例7.1_1:设计一个求阶乘的函数。通过主函数对这个子函数的 多次调用来完成从m个数中取n个数的组合。
double jiech(int x)
{ int i; double p=1; for (i=1;i<=x;i++) p=p*i; return p;}
第一次函数调用结束后,将p的 值120带回做为jiech(m)的值. 供主调函数使用。
例7.1_1:设计一个求阶乘的函数。通过主函数对这个子函数的 多次调用来完成从m个数中取n个数的组合。
3
double jiech(int x)
{ int i; double p=1; for (i=1;i<=x;i++) p=p*i; return p;}
程序运行时输入:5,3
#include<math.h> #include<stdio.h> int main() {int m,n; double c; scanf("%d,%d",&m,&n); printf("%f",pow(m,n)); c=jiech(m)/(jiech(n)*jiech(m-n)); printf("%f",c); return 0;}
第二次函数调用结束后,将p的 值6带回做为jiech(n)的值.供主 调函数使用。
例7.1_1:设计一个求阶乘的函数。通过主函数对这个子函数的 多次调用来完成从m个数中取n个数的组合。
2
double jiech(int x)
{ int i; double p=1; for (i=1;i<=x;i++) p=p*i; return p;}
第7章 用函数实现模块化程序设计
7.1为什么要用函数
7.2怎样定义函数
7.3 怎么调用函数
7.4对被调用函数的声明和的递归调用
7.7数组作为函数参数 7.8局部变量和全局变量
7.9变量的存储方式和生存期
7.10 关于变量的声明和定义
7.11 内部函数和外部函数
用函数实现模块化程序设计
通知
第14周周四(12月6号)上午08:00 ~09:30 自动化121-124班上机
第14周周四(12月6号)下午14:00 ~15:30 电气121-122班上机
实验八:字符数组程序设计(要求实验内容全做) 上传内容: 实验八的内容(二)、(三)、(四)、(五)、(六) 地点:五区515,516机房
程序运行时输入:5,3
#include<math.h> #include<stdio.h> int main() {int m,n; double c; scanf("%d,%d",&m,&n); printf("%f\t",pow(m,n)); c=jiech(m)/(jiech(n)*jiech(m-n)); printf("%f",c); return 0;}