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

实验七用函数实现模块化程序设计河南工业大学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语言程序设计_第七章 用函数实现模块化程序设计_周常欣

小节
本节主要介绍了函数的定义方法、函数 的调用,函数调用时的数据传递、函数的 返回值以及简单的函数的应用举例。
在科学中,新事物只伴随困难出现!
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章 用函数实现模块化程序设计

第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) 如果使用自己定义的函数,而该函数的位置在调用它的函数之前,可以不声明函数的嵌套调用函数的递归调用⏹在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。
c语言程序设计第7章 用函数实现模块化程序设计

函数体为空
函数体
➢先用空函数占一个位置,以后逐步扩充 ➢好处:程序结构清楚,可读性好,以后
扩充新功能方便,对程序结构影响不大
7.3 调用函数
7.3.1函数调用的形式 7.3.2函数调用时的数据传递 7.3.3函数调用的过程 7.3.4函数的返回值
7.3.1函数调用的形式
➢函数调用的一般形式为: 函数名(实参表列)
➢指定函数名字、函数返回值类型、函数 实现的功能以及参数的个数与类型,将 这些信息通知编译系统。
7.2.1 为什么要定义函数
➢指定函数的名字,以便以后按名调用 ➢指定函数类型,即函数返回值的类型 ➢指定函数参数的名字和类型,以便在调
用函数时向它们传递数据 ➢指定函数的功能。这是最重要的,这是
在函数体中解决的
(5) 从用户使用的角度看,函数有两种。
库函数,它是由系统提供的,用户不必自己定义 而直接使用它们。应该说明,不同的C语言编译 系统提供的库函数的数量和功能会有一些不同, 当然许多基本的函数是共同的。
用户自己定义的函数。它是用以解决用户专门需 要的函数。
(6) 从函数的形式看,函数分两类。
① 无参函数。无参函数一般用来执行指定的一 组操作。无参函数可以带回或不带回函数值, 但一般以不带回函数值的居多。
➢问题:
如果程序的功能比较多,规模比较大,把所有代 码都写在main函数中,就会使主函数变得庞杂、 头绪不清,阅读和维护变得困难
有时程序中要多次实现某一功能,就需要多次重 复编写实现此功能的程序代码,这使程序冗长, 不精炼
7.1为什么要用函数
➢ 解决的方法:用模块化程序设计的思路
采用“组装”的办法简化程序设计的过程 事先编好一批实现各种不同功能的函数 把它们保存在函数库中,需要时直接用 函数就是功能 每一个函数用来实现一个特定的功能 函数的名字应反映其代表的功能
C语言第07章 用函数实现模块化程序设计

7.4 函数的声明和函数原型
在一个函数中调用另一个函数需要具备如下条 件:
(1) 被调用函数必须是已经定义的函数(是库函数或用 户自己定义的函数),如果使用库函数,应该在本文 件开头加相应的#include指令 (2) 如果使用自己定义的函数,而该函数的位置在调 用它的函数后面,则应在该函数的调用位置前对其 进行声明
定义函数
int prime(int n) { int i, isPrime=1; for (i=2;i<=sqrt(n);i++) if(n%i==0) { isPrime=0; break; } return isPrime; } 函数功能:判断一个 数n是否为素数
main( )
printf( )
在设计一个较大的程序时,往往把程序分为若 干个程序模块,每一个模块包括一个或多个函 数,每个函数实现一个特定的功能
函数概述
C程序可由一个主函数(main)和若干个其他函数 构成(其中a,b,c,d,e,f,g,h,i均为函数,箭头表示调 用) main
a
b
c
d
e
f
g
h
i
e
函数使用实例
例7.1 求100-200之间的素数,用函数调用实现 思路:
函数体没有任何内容
先用空函数占一个位置,通常是模块设计过程中 作为预留模块,以后逐步补充 好处:增强程序可读性,以后扩充新功能方便, 对程序结构影响不大
函数的定义实例
编写一个函数求两个数 的最大公约数。 分析: 需要带入两个整数,需要 返回一个值,类型也是整 数。
int gcd(int a, int b) { int r; r=a%b; // 求a除b的余数 while (r!=0) // 迭代,直到r为0 { a=b; b=r; r=a%b; } return b; // 函数返回值 }
c语言程序设计第07章用函数实现模块化程序设计

例7.2:(题同例7.1) void main( ) {int max(int x,int y); /*函数原型*/ int a,b,c; scanf(“%d%d”,&a,&b); c=max(a,b); /*调用函数max*/ printf(“max is %d\n”,c); } int max(int x,int y) {int z; z=(x>y)?x:y; return(z); /*可简化为return z; */ }
4 函数的定义及调用
函数的定义是分别进行的,是相互独立。一个函数并不 从属于另一个函数,即函数的定义是平行的,不能嵌 套。 一般函数只有被调用才能执行,函数间可以相互调用,
但不能调用main函数,main函数是系统调用的。函
数调用可以嵌套,还可以直接递归或间接递归。
7.2 函数的定义和调用
7.2.1 为什么要定义函数
2 函数调用过程
(1) 实参与形参必须一一对应(个数、类型、意义) (2) 执行函数调用时,首先按照定义的类型给形参分配存储单 元,并将实参的值传递给相应的形参,即“单向传值”。 然后执行函数体。 (3) 在执行函数体中的语句时,只有形参参加各种操作即使形 参的值发生改变,也不影响实参的值,即“单向传值” (4) 通过return语句将函数值带回到主调函数,亦称返回值。 函数体中可以出现多个return语句,但只能执行其中一个 当无返回值(无return语句)时,函数定义为void类型。 (5) 函数调用结束,形参单元被释放(值就不存在了),而实参 单元仍保留并维持原值,即“单向传值”。
编程序:
#include <stdio.h> int fac(int n) { int x; if (n==0) x=1; else x=n*fac(n-1); /*直接递归调用函数fac*/ return x; } void main( ) { int n,x; scanf(“%d”,&n); x=fac(n); /*调用函数fac*/ printf(“%d!= %d\n”,n,x); }
第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 函数调用时的数据传递
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int main()
{int prime(int);
t n;
printf("input an integer:");
scanf("%d",&n);
if (prime(n))
printf("%d is a prime.\n",n);
else
printf("%d is not a prime.\n",n);
#include <stdio.h>
int main()
{inthcf(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);
}
7.3写一个判素数的函数,在主函数输入一个整数,输出是否为素数的信息。
河南工业大学C语言实验报告
专业班级:生物11级1班学号:201112910118姓名:l刘路路指导老师:朱红莉评分:
实验题目:用函数实现模块化程序设计
实验目的:熟练掌握函数的定义、调用、声明
实验内容:P218-219习题1、2、4
实验步骤:(具体程序及运行结果)
7.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。
#define N 3
int array[N][N];
int main()
{ void convert(int array[][3]);
int i,j;
printf("input array:\n");
for (i=0;i<N;i++)
for (j=0;j<N;j++)
scanf("%d",&array[i][j]);
printf("\noriginal array :\n");
for (i=0;i<N;i++)
{for (j=0;j<N;j++)
printf("%5d",array[i][j]);
printf("\n");
}
convert(array);
printf("convert array:\n");
for (i=0;i<N;i++)
{for (j=0;j<N;j++)
printf("%5d",array[i][j]);
printf("\n");
}
return 0;
}
void convert(int array[][3])
{int i,j,t;
for (i=0;i<N;i++)
for (j=i+1;j<N;j++)
{t=array[i][j];
array[i][j]=array[j][i];
array[j][i]=t;
}
}
实验体会:通过本次试验的学习,让你给我懂得了,进行程序设计,必须用一种计算机语言作为工具,否则是纸上谈兵。C语言功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率高、可移植性好,即具有高级语言的优点,又有低级语言的许多特点,即适合编写系统软件,又能方便地编写应用软件。
return 0;
}
int prime(int n)
{int flag=1,i;
for (i=2;i<n/2 && flag==1;i++)
if (n%i==0)
flag=0;
return(flag);
}
7.4写一个函数,使给定的一个3×3的二维整型数组转置,即行列互换。
#include <stdio.h>