用函数实现模块化程序设计
如果程序的功能比较多,规模比较大,把所有的程序代码都写在一个主函数(main函数)中,会使主函数变得庞杂、头绪不清,使得阅读和维护变得困难。因此这就需要用模块化程序设计的思路(就像操作系统里分布式计算机的工作模式一样)。
可以事先编好一批常用的函数来实现各种不同的功能。
函数从本质意义上来说就是用来完成一定的功能的。所谓函数名就是给该功能起一个名字。函数就是功能。每一个函数用来实现一个特定的功能。函数的名字反映其代表的功能。
常用的标准库函数:标准定义<stddef.h>包含了标准库的一些常用定义,
无论包含哪种标准头文件,<stddef.h>都会自动包含进来。
标准库函数:
sqrt 平方根
pow 乘方
abs 取int值的绝对值
labs 取log值的绝对值
fabs 取double值的绝对值
cell 向上取整
foolr 向下取整
在设计一个较大的程序时,把它分为若干个程序模块,每一个模块包括一个或多个函数,每个函数实现一个特定的功能。一个 C程序可由一个主函数和若干个其他函数构成。由主函数调用其他函数,其他函数也可以互相调用。同一main个函数可以被一个或多个函数调用任意多次。
除了可以使用库函数外,有的部门还编写一批本领域或本单位常用到的专用函数,供本领域或本单位的人员使用。在程序设计中要善于利用函数,以减少重复编写程序段的工作量,也更便于实现模块化的程序设计。
几点说明:
1.一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。对于较大的程序,一般把所有内容分别放在若干个源文件中,由若干个源程序文件组成一个C程序。这样便于分别编写和编译,提高调试效率一个源程序文件可以为多个C程序共用。
2.一个源程序文件由一个或多个函数以及其他有关内容组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译的,而不是以函数为单位进行编译的。
3.C程序的执行是从 main 函数开始的,如果在 main 函数中调用其他函数,在调用后流程返回到 main 函数,在 main 函数中结束整个程序的运行。
4.所有函数都是平行的,在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一个函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用 mmain 函数。main函数是被操作系统调用的。
5.从用户使用的角度看,函数有两种。
1)库函数,它是由系统提供的,用户不必自己定义,可直接使用它们。
2)用户自己定义的函数。它是用以解决用户专门需要的函数
6.从函数的形式看,函数分两类。
1)无参函数。在调用无参函数时,主调函数不向被调用函数传递数据。无参函数一般用来执行指定的一组操作。无参函数可以带回或不带回函数值。但一般以不带回函数值的居多。
2)有参函数。在调用函数时,主调函数在调用被调用函数时,通过参数向被调用函数传递数据,一般情况下,执行被调用函数时会得到一个函数值,供主调函数使用。
一、定义函数
C语言要求,在程序中用到的所有函数,必须“先定义,后使用”。
定义函数包括以下几个内容:
1.指定函数的名字,以便以后按名调用。
2.指定函数的类型,即函数返回值的类型。
3.指定函数的参数的名字和类型,以便在调用函数时向它们传递数据。对无参函数不需要这项。
4. 指定函数应当完成什么操作,也就是函数是做什么的,即函数的功能。是在函数体中解决的。
对于C编译系统提供的库函数,是由编译系统事先定义好的,库文件中包括了对各函数的定义。程序设计者不必自己定义,只须用 #include 指令把有关的头文件包含到本文件模块中即可。在有关的头文件中包括了对函数的声明。
例如,在程序中若用到数学函数(如sqrt,fabs,sin,cos 等),就必须在本文件模块的开头写上:
#include<math.h>
库函数只提供了最基本、最通用的一些函数,而不可能包括人们在实际应用中所用到的所有函数。程序设计者需要在程序中自己定义想用的库函数并没有提供的函数。
1.定义函数的方法
1.定义无参函数
函数名后面的括号是空的,没有任何参数。定义无参函数的一般形式为
类型名 函数名()
{
函数体
}
或
类型名 函数名(void)
{
函数体
}
函数名后面括号内的 void 表示“空”,即函数没有参数函数体包括声明部分和语句部分。
在定义函数时要用“类型标识符”(即类型名)指定函数值的类型,即指定函数带回来的值的类型。
2.定义有参函数
定义有参函数的一般形式为:
类型名 函数名(形式参数表列)
{
函数体
}
例 以下定义的max函数是有参函数:
int max(int x,int y){
int z; //声明部分
z=x>y?x:y; //执行语句部分
return(z); //得到函数值返回到主函数中去
}
花括号内是函数体,它包括声明部分和语句部分。 声明部分包括对函数中用到的的变量进行定义
以及对要调用的函数进行声明。
return(z)的作用是指定将z的值作为函数值(称函数返回值)带回到主调函数。
3.定义空函数
在程序设计中会用到空函数,它的形式为:
类型名 函数名()
{
}
例如:
void dummy()
函数体是空的。调用此函数时,什么工作也不做没有任何实际作用。
在主调函数中如果有调用此函数的语句:
dummy();
表明“要调用dummy函数”而现在这个函数没有起作用。在程序设计中往往根据需要确定若干个模块,
分别由一些函数来实现。而在第1阶段只设计最基本的模块其他一些次要功能或锦上添花的功能则
在以后需要时陆续补上。在编写程序的开始阶段,可以在将来准备扩充功能的地方写上一空函数,
先用空函数占一个位置,等以后扩充程序功能时用一个编好的函数代替它。这样做,程序的结构清楚,
可读性好,以后扩充新功能方便,对程序结构影响不大。空函数在程序设计中常常是有用的。
二、调用函数
定义函数的目的是为了调用此函数,以得到预期的结果。
1.调用函数的形式
函数调用的一般形式为:函数名(实参列表);
如果是调用无参函数,则“实参表列”可以没有,但括号不能省略。如果实参表列包含多个实参,则各参数间用逗号隔开。
按函数调用在程序中出现的形式和位置来分,可以有以下3种函数调用方式:
1)函数调用语句
把函数调用单独作为一个语句。
如“printf_star();”这时不要求函数带回值,只要求函数完成一定的操作。
2)函数表达式
函数调用出现在另一个表达式中。
如“c=max(a,b);”,max(a,b)是一次函数调用它是赋值表达式中的一部分。
这时要求函数带回一个确定的值以参加表达式的运算。
例如:表达式 c=2*max(a,b);
3)函数参数
函数调用作为另一个函数调用时的实参。
如:m=max(a,max(b,c));
其中,max(b,c)是一次函数调用,它的值是b和c二者中的“大者”把它作为 max另一次调用的实参。
经过赋值后,m的值是 a,b,c三者中的最大者。又如:
printf("%d",max (a,b));
也是把max(a,b)作为printf函数的一个参数。
说明:调用函数并不一定要求包括分号(如 print_star();),只有作为函数调用语句才需要有分号。如果作为函数表达式或函数参数,函数调用本身是不必有分号的。
2函数调用时的数据传递
1.形参和实参
在调用有参函数时,主调函数和被调用函数之间有数据传递关系。
在定义函数时函数名后面括号中的变量名称为“形式参数”简称“形参”或“虚拟参数”。
在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”(简称“实参”)。实际参数可以是常量变量或表达式。
2.实参和形参间的数据传递
在调用函数过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个值。该值在函数调用期间有效,可以参加该函数中的运算。在调用函数过程中发生的实参与形参间的数据传递称为“虚实结合”。
函数调用例子:
(1)先编写max函数
int max(int x,int y){
int z;
z=x>y?x;y;
return(z); //通过return 将函数值带回到主函数中去
}
(2)再编写主函数
#include<stdio.h>
int main(){
int max(int x,int y); //对max函数的声明
int a,b,c;
printf("please enter two integer numbers:")
scanf("%d,%d",&a,&

本文探讨了C语言中模块化程序设计的重要性,通过使用函数实现程序模块化,提高代码可读性和维护性。介绍了库函数和用户自定义函数的使用,详细阐述了无参函数、有参函数以及函数调用的不同方式。同时,讲解了函数的声明、定义、参数传递以及返回值,强调了函数的先定义后使用原则。最后,讨论了局部变量和全局变量的区别,以及静态存储类别在函数中的应用。

最低0.47元/天 解锁文章
1860

被折叠的 条评论
为什么被折叠?



