【最新】用函数实现模块化程序设计

合集下载

实验七用函数实现模块化程序设计

实验七用函数实现模块化程序设计

实验七用函数实现模块化程序设计河南工业大学C语言实验报告专业班级:学号:姓名:指导老师:朱红莉评分:实验题目:用函数实现模块化程序设计实验目的:熟练掌握函数的定义、调用、声明实验内容:P218-219 习题1、2、4实验步骤:(具体程序及运行结果)1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。

两个整数由键盘输入。

#includeint main(){int hcf(int,int);int lcd(int,int,int);int u,v,h,l;scanf("%d,%d",&u,&v);h=hcf(u,v);printf("H.C.F=%d\n",h);l=lcd(u,v,h);printf("L.C.D=%d\n",l);return 0;}int hcf(int u,int v){int t,r;if(v>u){t=u,u=v;v=t;}while((r=u%v)!=0){u=v;v=r;}return (v);}int lcd(int u,int v,int h){return (u*v/h);}执行结果:2.求方程ax*x+b*x+c=0的根,用3个函数分别求当:b*b-4*a*c大于0、等于0和小鱼0时的根并输出结果。

从主函数输出a,b,c的值。

#include#includefloat x1,x2,disc,p,q;int main(){void greater_than_zero(float,float);void equal_to_zero(float,float);void smaller_than_zero(float,float);float a,b,c;printf("input a,b,c:");scanf("%f,%f,%f",&a,&b,&c);printf("equation:%5.2f*x*x+%5.2f*x+%5.2f=0\n",a,b,c);disc=b*b-4*a*c;printf("root:\n");if(disc>0){greater_than_zero(a,b);printf("x1=%f\t\tx2=%f\n",x1,x2);}else if(disc==0){equal_to_zero(a,b);printf("x1=%f\t\tx2=%f\n",x1,x2);}else{smaller_than_zero(a,b);printf("x1=%f+%fi\tx2=%f-%fi\n",p,q,p,q);}return 0;}void great_than_zero(float a,float b){x1=(-b+sqrt(disc))/(2*a);x2=((-b)-sqrt(disc))/(2*a);}void equal_to_zero(float a,float b){x1=x2=(-b)/(2*a);}void smaller_than_zero(float a,float b){p=-b/(2*a);q=sqrt(-disc)/(2*a);}执行结果:4.写一个函数,是给定的一个3*3的二维整型数组转置,即行列互换。

07_01_C语言程序设计_第七章 用函数实现模块化程序设计_周常欣

07_01_C语言程序设计_第七章 用函数实现模块化程序设计_周常欣
第 七 章
小节
本节主要介绍了函数的定义方法、函数 的调用,函数调用时的数据传递、函数的 返回值以及简单的函数的应用举例。
在科学中,新事物只伴随困难出现!
C
程 序 设 计 |
第 七 章
本节课堂习题
1、对C语言函数体的描述,下面正确的是(
A.可以定义和调用其它函数 B.可以调用但不能定义其他函数 C.不可调用但可以定义其它函数 D.不可调用及定义其它函数
(3)实参和形参在数量上,类型上,顺序上应严格一 致,否则会发生类型不匹配”的错误。
(4)通过return语句将函数值带回到主调函数。应当 注意返回值的类型要与函数类型一致。 (5)调用结束,形参单元被释放。
C
程 序 设 计 |
第 七 章
第七章 用函数实现模块化程序设计
7.3.4 函数的返回值
如果需要从被调用函数带回一个函数值(供主调函 数使用),被调用函数中必须包含return语句。 如果不需要从被调用函数带回返回值,可不用 return语句。 return语句后面的括号可以不加。 return z;与return(z);等价。 return后面还可以是一个表达式: int max(int x, int y) { return (x>y?x:y); }
int max(int x,int y) //定义有参函数 { int z; //声明部分 z=x>y?x:y; //执行部分 return(z); //指定函数返回值 }
自定义函数max
max(a,b);
调用max函数的语句
C
程 序 设 计 |
第 七 章
第七章 用函数实现模块化程序设计
函数调用的三种形式
int max(int x,in ty) //定义有参函数 { int z; //声明部分 z=x>y?x:y; //执行部分 return(z); //指定函数返回值 }

C语言 第7章 用函数实现模块化程序设计

C语言 第7章 用函数实现模块化程序设计

第7章用函数实现模块化程序设计为什么要用函数怎样定义函数为什么要定义函数⏹C语言要求,在程序中用到的所有函数,必须“先定义,后使用”⏹指定函数名字、函数返回值类型、函数实现的功能以及参数的个数与类型,将这些信息通知编译系统。

定义函数的方法1.定义无参函数类型名函数名(){函数体}2.定义有参函数定义有参函数的一般形式为:类型名函数名(形式参数表列){函数体}3. 定义空函数定义空函数的一般形式为:类型名函数名(){}调用函数函数调用的形式⏹函数调用的一般形式为:函数名(实参表列)函数调用的形式⏹按函数调用在程序中出现的形式和位置来分,可以有以下3种函数调用方式:1. 函数调用语句⏹把函数调用单独作为一个语句如printf_star();⏹这时不要求函数带回值,只要求函数完成一定的操作2. 函数表达式⏹函数调用出现在另一个表达式中如c=max(a,b);⏹这时要求函数带回一个确定的值以参加表达式的运算3. 函数参数⏹函数调用作为另一函数调用时的实参如m=max(a,max(b,c));⏹其中max(b,c)是一次函数调用,它的值作为max另一次调用的实参函数调用时的数据传递1.形式参数和实际参数❑在调用有参函数时,主调函数和被调用函数之间有数据传递关系❑定义函数时函数名后面的变量名称为“形式参数”(简称“形参”)❑主调函数中调用一个函数时,函数名后面参数称为“实际参数”(简称“实参”)❑实际参数可以是常量、变量或表达式2. 实参和形参间的数据传递❑在调用函数过程中,系统会把实参的值传递给被调用函数的形参❑或者说,形参从实参得到一个值❑该值在函数调用期间有效,可以参加被调函数中的运算对被调用函数的声明和函数原型⏹在一个函数中调用另一个函数需要具备如下条件:(1) 被调用函数必须是已经定义的函数(是库函数或用户自己定义的函数)(2) 如果使用库函数,应该在本文件开头加相应的#include 指令(3) 如果使用自己定义的函数,而该函数的位置在调用它的函数之前,可以不声明函数的嵌套调用函数的递归调用⏹在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。

第7章用函数实现模块化程序设计

第7章用函数实现模块化程序设计

PPT文档演模板
第7章用函数实现模块化程序设计
7.2 怎样定义函数
7.2.1 为什么要定义函数 7.2.2 定义函数的方法
PPT文档演模板
第7章用函数实现模块化程序设计
7.2.1 为什么要定义函数
Ø C语言要求,在程序中用到的所有函数, 必须“先定义,后使用”
Ø 指定函数名字、函数返回值类型、函数 实现的功能以及参数的个数与类型,将 这些信息通知编译系统。
PPT文档演模板
第7章用函数实现模块化程序设计
Ø 说明:
(2) 一个源程序文件由一个或多个函数以及其 他有关内容(如预处理指令、数据声明与定义 等)组成。一个源程序文件是一个编译单位, 在程序编译时是以源程序文件为单位进行编译 的,而不是以函数为单位进行编译的。
PPT文档演模板
第7章用函数实现模块化程序设计
PPT文档演模板
第7章用函数实现模块化程序设计
#include <stdio.h> int main()
•声明函数
{ void print_star();
void print_message();
print_star(); print_message();
print_star(); return 0;
PPT文档演模板
第7章用函数实现模块化程序设计
7.3.2 函数调用时的数据传递
先编写max函数:
int max(int x,int y) {
int z; z=x>y?x:y; return(z); }
PPT文档演模板
第7章用函数实现模块化程序设计
7.3.2 函数调用时的数据传递
• 在max函数上面,再编写主函数

c语言用函数实现模块化程序设计实验报告

c语言用函数实现模块化程序设计实验报告

c语言用函数实现模块化程序设计实验报告
1设计思想
1)、设定一个一维数组,可先按员工序号设定每位员工的工资
2)、利用While语句和Print语句完成用户菜单的设计
功能为:第1项设为员工编号和工资数据
第2项设为修改员工工资数据
第3项设为查询员工工资数据
第4项设为结束系统
3)、当用户选择1、2项时,需输入员工编号,所以需要设计编号校正功能,如果出错可输出“The error employ number”
4)、当选择2时,进行工资数据的修改,并将新数据存回该员工的工资数组中
5)、利用for循环中判断语句,将用户工资数与数组中的工资数进行比较,如相同则输出,将计数器加1,如此下去,直到把整个数组遍历一遍
6)、判断计数器是否为0, 是0表示找不到相符的工资,如果不为0,则输出共查出几比相符的工资
以上当然里面也涉及了“函数的模块化”理念,可以避免但需要重复打印头文件时重复编写打印信头的语句。

像这样的程序是多见的,这样不但降低了程序还发效率,而且耗时浪费资源“共用体”的使用简化了程序的“复杂”性,正如(4)中,学号与姓名同时表示一个人,但在函数使用了“共用体”,从而程序的简单可以便于纠错,查找问
题,避免了代码的重复,这样就给编译时带来了一定的难度与“量”的繁杂。

一般不采取这样的做法,力求“简单、明了、清晰”。

第7章用函数实现模块化程序设计Convertor

第7章用函数实现模块化程序设计Convertor

第7章用函数实现模块化程序设计7.1为何要用函数7.2怎样定义函数7.3调用函数7.4对被调用函数的申明和函数原型7.5函数的嵌套调用7.6函数的递归调用7.7数组作为函数参数7.8局部变量和全局变量7.9变量的储藏方式和生计期7.10关于变量的申明和定义7.11内部函数和外面函数7.1为何要用函数问题:若是程序的功能比很多,规模比较大,把全部代码都写在main函数中,就会使主函数变得错杂、眉目不清,阅读和保护变得困难有时程序中要多次实现某一功能,就需要多次重复编写实现此功能的程序代码,这使程序冗长,不精髓7.1为何要用函数解决的方法:用模块化程序设计的思路采纳“组装”的方法简化程序设计的过程预先编好一批实现各种不同样功能的函数把它们保留在函数库中,需要时直接用7.1为何要用函数解决的方法:用模块化程序设计的思路函数就是功能每一个函数用来实现一个特定的功能函数的名字应反响其代表的功能7.1为何要用函数在设计一个较大的程序时,经常把它分为若干个程序模块,每一个模块包含一个或多个函数,每个函数实现一个特定的功能C程序可由一个主函数和若干个其余函数组成主函数调用其余函数,其余函数也能够相互调用同一个函数能够被一个或多个函数调用任意多次7.1为何要用函数mainabcfghdeie7.1为何要用函数能够使用库函数能够使用自己编写的函数在程序设计中要擅长利用函数,能够减少重复编写程序段的工作量,同时能够方便地实现模块化的程序设计7.1为何要用函数例7.1输出以下的结果,用函数调用实现。

Howdoyoudo!7.1为何要用函数解题思路:在输出的文字上下分别有一行“*”号,显然不用重复写这段代码,用一个函数print_star来实现输出一行“*”号的功能。

再写一个print_message函数来输出中间一行文字信息用主函数分别调用这两个函数#include<stdio.h>intmain(){voidprint_star();voidprint_message();print_star();print_message();print_star();return0;}voidprint_star(){printf(“voidprint_message() {printf(“Howdoyoudo!n”);} n”);}输出16个*输出一行文字#include<stdio.h>intmain(){voidprint_star();voidprint_message();print_star();print_message(); print_star();return0;}voidprint_star(){printf(“voidprint_message() {printf(“Howdoyoudo!n”);} n”);}申明函数定义函数#include<stdio.h>intmain(){voidprint_star();voidprint_message();print_star();print_message(); print_star();return0;}voidprint_star(){printf(“voidprint_message() {printf(“Howdoyoudo!n”);} n”);}说明:(1)一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程前言件。

第7章用函数实现模块化程序设计

第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指令把有关的头⽂件中包含到本⽂件模块中即可。

实验六_用函数实现模块化程序设计[策划]

实验六_用函数实现模块化程序设计[策划]

实验六用函数实现模块化程序设计【实验目的】1. 函数编译程序的初步应用;2. 多个小函数的同时应用;3. 函数的递归调用;4. 数组作函数的参数。

【实验内容】实验一:最大公约数和最小公倍数的求解,源程序如下:#include<stdio.h>int f1(int x,int y){if(x%y!=0) return f1(y,x%y);else return y;}int f2(int x,int y){int r,i;if(x<y) {r=x;x=y;y=r;}for(i=1;i<=y;i++)if(i*x%y==0) {return (i*x);break;}}int main(){int m,n;printf("请输入两个整数:");scanf("%d%d",&m,&n);printf("%d与%d的最大公约数是:%d\n",m,n,f1(m,n));printf("%d与%d的最小公倍数是:%d\n",m,n,f2(m,n));return 0;}结论:结果正确。

实验二:方程根的求解,源程序如下:#include<stdio.h>#include<math.h>double f1(float m,float n,float q){double r,x1,x2;r=n*n-4*m*q;if(m==0) x1=-q/n,printf("方程有唯一实根:%lf\n",x1);else x1=(-n+sqrt(r))/(2*m),x2=(-n-sqrt(r))/(2*m),printf("方程有两个不等的实根:%lf\t%lf\n",x1,x2);return 0;}double f2(float m,float n,float q){double x1;if(n!=0) x1=-n/(2*m),printf("方程有两个相等实根:%lf\n",x1);elseif(q==0) printf("方程的根为任意数\n");else printf("方程无解\n");return 0;}double f3(float m,float n,float q){double r,p,d;r=n*n-4*m*q;p=sqrt(-r)/(2*m),d=-n/(2*m);printf("方程有两个复根:");printf("%lf+%lfi\t",d,p);printf("%lf-%lfi\n",d,p);return 0;}int main(){float r,a,b,c;printf("请输入方程的系数:");scanf("%f%f%f",&a,&b,&c);r=b*b-4*a*c;if(r>0) f1(a,b,c);if(r==0) f2(a,b,c);if(r<0) f3(a,b,c);return 0;}结论:结果正确。

用函数实现模块化程序设计1

用函数实现模块化程序设计1

{ int b,c;
……
} char f2(int x,int y) { int i,j;
类似于不同 班同名学生
……
} int main( ) { int a,b;
a、b也仅在此 函数内有效
……
return 0;
}
a
6
int main ( ) { int a,b;
…… { int c;
c=a+b; …… } …… }
a
4
float f1( int a) { int b,c;
a、b、c仅在 此函数内有效
……
}
char f2(int x,int y)
{ int i,j; ……
x、y、i、j仅在 此函数内有效
}
int main( )
{ int m,n; …… return 0;
m、n仅在此 函数内有效
}
a
5
float f1( int a)
7.8.1 局部变量 7.8.2 全局变量
a
2
7.8.1 局部变量
➢定义变量可能有三种情况: 在函数的开头定义 在函数内的复合语句内定义 在函数的外部定义
a
3
7.8.1 局部变量
➢在一个函数内部定义的变量只在本函数 范围内有效
➢在复合语句内定义的变量只在本复合语 句范围内有效
➢在函数内部或复合语句内部定义的变量 称为“局部变量”
Max=Min=array[0]; for(i=1;i<n;i++) { if(array[i]>Max) Max=array[i];
else if(array[i]<Min) Min=array[i]; sum=sum+array[i]; } aver=sum/n; return(aver); }

C语言程序设计 用函数实现模块化程序设计

C语言程序设计 用函数实现模块化程序设计
15/73
7.3 函数参数和函数的值
二、函数的返回值
例7例8- 2 1.返回函数值的方法 #include <stdio.h> (1)函数的返回值也就是函数的 int max(int x,int y) y) int max(int x,int 值,如果一个函数有返回值, { int z; { if(x>y) return y; ; z = x > y ? x :>(x) ? x : y ); 就必须用return语句; return(x y return return((zz); ); } (2)一个函数中可以有多个 } void main() return语句,无论执行到哪 void main() { int a,b,c ; 个return语句,都将结束函 { int a,b,c ; scanf(“%d,%d”,&a,&b); 数调用,返回主调函数。 scanf(“%d,%d”,&a,&b); c=max(a,b); c=max(a,b); (3) return语句中的括号可以 printf(“The max is %d”, c); printf(“The max is %d”, c); } 省略,return后面可以是一 } 个表达式,返回的是表达式 的值。
13/73
7.3 函数参数和函数的值
一、形式参数和实际参数
说明: 1.定义函数时,必须说明形参类 型,形参只能是变量和数组; 2.函数被调用前,形参不占内存 ,函数调用结束后,内存也被释 放; 3.实参可以是常量、变量和表达 式; 4.实参和形参的类型必须一致, 字符型和整型可以相互匹配; 5.C语言中实参对形参的数据传 递是“值传递”,即单向传递 ,仅由参数的对应位置决定,与 名字无关。 例7例8- 2 #include <stdio.h> int max(int x,int y) b,int a) { int z; c; c x b a b: y; z = x > y ? x : a; return( z ); c x } void main() { int a,b,c ; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“The max is %d”, c); } 23,56 The max is 56

最新课件-C语言程序设计教学第七章用函数实现模块化程

最新课件-C语言程序设计教学第七章用函数实现模块化程
第七章 用函数实现模块化程序设计
• 交实验报告140页3题 • 格式:按照《上机指导书》171页附录D
格式书写
• 采用统一的实验报告纸
7.1 为什么要用函数
算法是解决具体问题的方案
• 基本要求:根据给出的算 法编写程序
实际的软件开发
• 实际问题往往由多个基本问题构成。 • 要求软件开发人员首先分析问题,将问题
**********
函数的分类 1.函数参数形式
无参函数
无有参函数例(输出两数中大者) m#inaicnlu()de ຫໍສະໝຸດ stdio.h>有参函数
main( ) {{ ipnrtinmt_asxta(irn()t;
x,int
y);
2. 从用户使用的角度分 标准函ipn数rt(in库1t_函,nm2数e,as);sage();
c=max(a, b);
----------------------- 实参:在运行时
max(int x,int y) 把值传给函数。
{ ………
returu (z);
形参:通知系统
}
要预留内存位置。
上例中形参与实参、函数名与返回值之间的关系
五、函数的返回值 通过函数调用使主调函数得到一个确定的值
main( ) { int max( int x, int y) ;int a,b,c;
• 函数就是可以完成某项基本任务的一组 语句。
• 函数名是唯一的。 • 函数可以被其他的函数使用,称为函数
的调用。
参数
• 主调用函数给被调用函数一些数据,即 参数。
• 被调用函数根据参数值完成相应的工作。
返回值
• 被调用函数完成工作后,可能会返回某 些数据作为计算结果。

第7章 用函数实现模块化程序设计

第7章 用函数实现模块化程序设计

元素作为数组的成员,不能单独分配,因此不能用
来作形参。
数组元素的用法与变量相同,在作实参时,是“单向值传
递”,即函数中形参的变化不会影响到实参。
35/82
第7章 用函数实现模块化程序设计 例7.9 输入10个数,要求输出其中值最大的元素和该数是第几 个数。 思路: (1)求最大值的过程:前两个数比较,求出较大的,再用该
被调函数传递数据。
如:printf(“Hello”)、fabs(x)。
5/82
第7章 用函数实现模块化程序设计 2.函数的定义 (1)定义函数时需要做的几件事: ① 指定函数名字,以备按名调用。 ② 指定函数的类型,即确定函数返回值的类型。
③ 对于有参函数,指定函数参数的名字和类型。
④ 指定函数应当完成什么操作,即编写函数体。
利用函数可以减少重复
编写程序段的工作量,
也方便程序的调试。
4/82
第7章 用函数实现模块化程序设计 (5)从用户使用的角度看,函数有两种。 库函数:由系统提供,如:printf、sqrt、fabs等。
用户自己定义的函数:由用户根据需要自行编制。
(6)从函数的形式看,函数分两类。 无参函数:主调函数不向被调函数传递数据。 如:getchar()。 有参函数:主调函数在调用被调函数时,通过参数向
//注意:括号不参省略
有参函数:函数名(实参列表)
函数调用可出现在三个位置:
① 单独成为一个语句,也称为函数调用语句。 printf(“Hello”); ② 出现在表达式中,该表达式称为函数表达式。 2*max(a,b)
11/82
第7章 用函数实现模块化程序设计 ③ 作为函数参数出现。 max(max(a,b),c)

实验7 用函数实现模块化程序设计

实验7 用函数实现模块化程序设计

实验7 用函数实现模块化程序设计班级电信132 学号201315100209 姓名许春欢一、实验目的①掌握定义函数的方法;②掌握函数实参与形参的对应关系以及“值传递”的方式;③掌握函数的嵌套调用和递归调用的方法;④掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。

⑤学习对多文件程序的编译和运行。

二、实验内容用函数实现以下程序并调试。

1、写一个函数,求10个学生的平均成绩。

#include <stdio.h>#define N 10void main( ){float a(float y[ ],int M);int i;float cj[N],pjcj;printf("输入%d个学生的成绩:\n",N);for(i=0;i<N;i++)scanf("%f",&cj[i]);pjcj=a(cj,N);printf("平均成绩是%5.2f\n",pjcj);}float a(float y[ ],int M){int i;float pj,sum=0;for(i=0;i<10;i++)sum=sum+y[i];pj=sum/M;return(pj);}2、写一个函数,用“起泡法”对输入的10个数字由小到大排序。

#include<stdio.h>#include<string.h>int str[10];int main(){ void sort(int str[]);int i,str[10];printf("input 10 nubers:\n");for(i=0;i<10;i++)scanf("%d",&str[i]);printf("\n");sort(str);printf("string sorted:\n");for(i=0;i<10;i++)printf("%3d",str[i]);printf("\n");return 0;}void sort(int str[]){int i,j,t;for(j=0;j<9;j++)for(i=0;i<9-j;i++)if(str[i]>str[i+1]){t=str[i];str[i]=str[i+1];str[i+1]=t;}}3、求方程ax2+bx+c=0的根,用三个函数分别求当b2-4ac大于0、等于0和小于0时的根,并输出结果。

第5章 用函数实现模块化程序设计

第5章  用函数实现模块化程序设计

函数的基本知识
5.1.2 函数的声明 1.传统格式 类型说明符 被调函数名( ); 2.现代格式 类型说明符 被调函数名(类型说明符 形参,类型说明符 形参…); 或者是 类型说明符 被调函数名(类型说明符,类型说明符…);
5.1
函数的基本知识
5.1.3 函数的定义、声明和调用的区别 (1)函数的定义时函数头下面一定要有函数体,也就是{} 括起来的一个程序段,函数头后面千万不要有分号。函数 头中有函数的类型以及各形参的类型说明。 (2)把函数头下面的函数体去掉,然后在函数头后面加一 个分号,就成了函数的声明。 (3)调用函数时,只需要写出函数名,如果该函数是无参 函数,函数名后面直接加一对小括号就行了;如果被调函数 是有参的,这时要在小括号里写出实参,但实参不要加类型 说明。

当前函数
random
当前函数
当前函数 整个程序
5.6 变量的存储类型
5.6.1 动态变量 动态变量是在程序执行的某一时刻被动态地建立,并在 另一时刻被动态地撤消的一种变量。它们存在于程序的局部, 也只在这个局部中可以使用。动态变量分为自动变量和寄存 器变量。 1.自动变量 系统在执行过程中自动建立和撤消的变量。系统默认变量 的存储类别为自动变量。定义自动变量的语法格式是: [auto] 数据类型 变量名[=初值表达式] …;
5.3 函数的调用
5.3.3 递归调用 一个函数直接或间接地调用它自身称为递归调用,这 种函数称为递归函数。在C语言中,允许函数的递归调用。 在递归调用中,主调函数又是被调函数。执行递归函数将 反复调用其自身。每调用一次就进入新的一层。
5.3 函数的调用
【例】用递归法计算n!
long ff(int n) { long f; if(n<0) printf("n<0,input error"); else if(n==0||n==1) f=1; else f=ff(n-1)*n; return(f); } main() { int n; long y; printf("\ninput a inteager number:\n"); scanf("%d",&n); y=ff(n); printf("%d!=%ld",n,y); }

第6章用函数实现模块化程序设计

第6章用函数实现模块化程序设计
然后把它作为函数值返回main函数 main函数中输出结果
6.6 函数的递归调用
❖ 在调用一个函数的过程中又出现直接或间 接地调用该函数本身,称为函数的递归调 用。
❖ C语言的特点之一就在于允许函数的递归 调用。
例6.3 用递归方法求n!。 ❖ 解题思路:
求n!也可以用递归方法,即5!等于4!× 5,而4!=3!×4…,1!=1
3. 函数参数 ❖ 函数调用作为另一函数调用时的实参
如m=max(a,max(b,c)); ❖ 其中max(b,c)是一次函数调用,它的值作为max
另一次调用的实参
6.3.2 函数调用的过程
函数调用的执行过程如下: ➢ 暂停当前函数的执行,保存下一条语句的地 址,并保存现场。 ➢ 执行被调函数,实参向形参传递数据。 ➢ 被调函数执行结束,恢复先前保存的现场,
1. 函数调用语句 ❖ 把函数调用单独作为一个语句
如printf_star(); ❖ 这时不要求函数带回值,只要求函数完成一定的
操作
6.3.1函数调用的形式
2. 函数表达式 ❖ 函数调用出现在另一个表达式中
如c=max(a,b); ❖ 这时要求函数带回一个确定的值以参加表达式的
运算
ห้องสมุดไป่ตู้
6.3.1函数调用的形式
3.将外部变量的作用域限制在本文件中
❖ 有时在程序设计中希望某些外部变量只限 于被本文件引用。这时可以在定义外部变 量只时能加用一于个本s文ta件tic声明。本文件仍然不能用
file1.c static int A; int main ( ) {
…… }
file2.c extern A; void fun (int n) { ……
A=A*n; …… }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2021/2/2
43
实参、形参都是float型
float average(float array[10])
{ int i;
与score共占同一存储单元
float aver,sum=array[0];
for(i=1;i<10;i++)
相当于score[0]
sum=sum+array[i];
aver=sum/10; return(aver);
如例7.1中的“print_star();”
2021/2/2
31
调用函数的方式:
➢按函数在程序中出现的位置来分,可以有 以下3种函数调用方式 2. 函数表达式 ➢函数出现在一个表达式中,这种表达式称 为函数表达式
如例7.2中的“c=max(a,b);”
2021/2/2
32
调用函数的方式:
➢按函数在程序中出现的位置来分,可以有 以下3种函数调用方式 3. 函数参数 ➢函数调用作为一个函数的实参
2021/2/2
12
➢说明:
(4) 所有函数都是平行的,即在定义函数时是 分别进行的,是互相独立的。一个函数并不从 属于另一个函数,即函数不能嵌套定义。函数 间可以互相调用,但不能调用main函数。 main函数是由系统调用的。
2021/2/2
13
➢说明:
(5) 从用户使用的角度看,函数有两种。 库函数,它是由系统提供的,用户不必自己定
{ int z;
定义函数内
if (x>y) z=x; 使用的变量
else z=y;
return(z);
}
2021/2/2
26
c=max(a,b); (main函数)
int max(int x, int y) (max函数) {
int z; z=x>y?x:y; return(z); }
2021/2/2
2021/2/2
4
7.1 函数是什么 P168
➢函数就是功能(Function) ➢每一个函数用来实现一个特定的功能 ➢函数的名字应反映其代表的功能
2021/2/2
5
7.1 函数是什么 P168
➢在设计一个较大的程序时,往往把它分 为若干个程序模块,每一个模块包括一 个或多个函数,每个函数实现一个特定 的功能。
2021/2/2
40
7.4.2 数组名作函数参数 P186
➢希望在函数中处理整个数组的元素时,可 以用数组名作为函数实参
➢注意,此时只是将数组的首元素的地址传 递给所对应的形参,因此对应的形参应当 是指针变量(见第8章)。
2021/2/2
41
例7.7 有10个学生成绩,用一个函数求全 体学生的平均成绩。
(3) 如果使用自己定义的函数,而该函数的位
置在调用它的函数后面,应该进行函数声明
2021/2/2
34
7.2.4 对被调用函数的声明 P175 和函数原型
➢函数原型的一般形式有两种:
如 int max(int x,int y); int max(int,int);
➢原型说明可以放在文件的开头,这时本文 件中所有函数都可以使用此函数
调用a函数 调用b函数


⑦⑥
b函数 ⑤
结束
2021/2/2
38
7.4 数组作为函数参数 P184
7.4.1 数组元素作函数实参 7.4.2 数组名作函数参数
2021/2/2
39
7.4.1 数组元素作函数实参 P185
由于实参可以是表达式,而数组元素可以 是表达式的组成部分,因此数组元素可以 作为函数的实参。
➢除了可以使用库函数外,还可以编写一些 本领域或本单位常用到一些专用函数, 供本领域或本单位的人员使用。、
➢在程序设计中要善于利用函数,可以减 少各人重复编写程序段的工作量,同时 可以方便地实现模块化的程序设计。
2021/2/2
9
➢说明:
(1) 一个C程序由一个或多个程序模块组成, 每一个程序模块作为一个源程序文件。对于较 大的程序,一般不把所有内容全放在一个源程 序文件中,而是将它们分别放在若干个源文件 中,由若干个源程序文件组成一个C程序。这 样便于分别编写、分别编译,提高调试效率。 一个源程序文件可以为多个C程序所调用。
如果有多个 参数,用逗
号隔开
2021/2/2
24
例7.2 输入两个整数,输出二者中的 大者。要求在主函数中输入两个整 数,用一个函数max求出其中的大 者,并在主函数中输出此值。
2021/2/2
25
#include <stdio.h>
函数类型
参数类型
int max(int x,int y) 定义函数
➢解题思路:
在主函数中定义一个实型数组score,将输入 的10个学生成绩存放在数组中
设计函数average,用来求学生平均成绩 需要把数组有关信息传递给average函数 采取用数组名作为实参,把数组地址传给
average函数,在该函数中对数组进行处理
2021/2/2
42
#include <stdio.h> void main() { float average(float array[10]);
义而直接使用它们。应该说明,不同的C语言 编译系统提供的库函数的数量和功能会有一些 不同,当然许多基本的函数是共同的。
用户自己定义的函数。它是用以解决用户专门 需要的函数。
2021/2/2
14
➢说明:
(6) 从函数的形式看,函数分两类。 ① 无参函数。函数没有参数,一般用来执行固 定的一组操作。无参函数可以带回或不带回函 数值,但一般以不带回函数值的居多。
27
#include <stdio.h>
void main()
{ int max(int x,int y); int a,b,c;
printf(”please input two number:”);
scanf(“%d,%d”,&a,&b);
c = max(a,b); 实际参数
printf(“max is %d\n”,c);
19
7.2.2 函数定义 P171
1.怎样定义无参函数
➢函数名后面圆括号中空的,没有参数
➢定义无参函数的一般形式为:
类型名 函数名()
{ 指定函数 函数体 值的类型 }
包括声明部分和 语句部分
2021/2/2
20
7.2.2 函数定义 P171
1.怎样定义无参函数
➢函数名后面圆括号中空的,没有参数
如printf (″%d″, max (a,b));
2021/2/2
33
7.2.4 对被调用函数的声明 P175 和函数原型
➢在一个函数中调用另一个函数需要具备如
下条件:
(1) 被调用函数必须是已经定义的函数(是库
函数或用户自己定义的函数)。
(2) 如果使用库函数,应该在本文件开头加相
应的#include指令。
2021/2/2
16
7.2.1 为什么要定义函数 P170
➢C语言要求,在程序中用到的所有函数, 必须“先定义,后使用”
➢指定函数名字、函数返回值类型、函数 实现的功能以及参数的个数与类型,将 这些信息通知编译系统。
2021/2/2
17
7.2.1 为什么要定义函数 P170
➢指定函数的名字,以便以后按名调用 ➢指定函数类型,即函数返回值的类型 ➢指定函数参数的名字和类型,以便在调
第7章 用函数实现 模块化程序设计 P168
7.1 函数是什么 7.2 函数的定义和调用 7.3 函数的嵌套调用和递归调用 7.4 数组作为函数参数 7.5 变量的作用域和生存期
2021/2/2
1
7.1 函数是什么 P168
➢如果程序的功能比较多,规模比较大, 把所有的程序代码都写在一个主函数 中,就会使主函数变得庞杂、头绪不 清,使阅读和维护程序变得困难。
2021/2/2
35
P177
7.3 函数的嵌套调用和递归调用
7.3.1 函数的嵌套调用 7.3.2 函数的递归调用
202套调用 P177
➢调用一个函数的过程中,又可以调 用另一个函数
2021/2/2
37
7.3.1 函数的嵌套调用 P177
main函数


a函数 ③④
实参 a 2 3 b
形参 x 2 3 y
2021/2/2
29
函数调用的过程:
➢调用结束,形参单元被释放 ➢实参单元仍保留并维持原值,没有改变 ➢如果在执行一个被调用函数时,形参的值 发生改变,不会改变主调函数的实参的值
实参 a 2 3 b
形参 x 2 3 y
2021/2/2
30
调用函数的方式:
➢按函数在程序中出现的位置来分,可以有 以下3种函数调用方式 1. 函数语句 ➢调用没有返回值的函数,函数调用单独作 为一个语句
➢定义无参函数的一般形式为:
类vo型id名 函数名()

函数体 }
表示不需要 带回函数值
2021/2/2
21
7.2.2 函数定义 P171
2. 怎样定义有参函数 ➢定义有参函数的一般形式为:
类型标识符 函数名(形式参数表列) { 函数体 }
2021/2/2
22
7.2.2 函数定义 P171
2. 怎样定义有参函数
2021/2/2
6
7.1 函数是什么 P168
➢一个C程序可由一个主函数和若干个其 他函数构成。由主函数调用其他函数, 其他函数也可以互相调用。同一个函数 可以被一个或多个函数调用任意多次
相关文档
最新文档