模块化程序设计
我们通过例子来理解模块化程序设计,要求用函数调用实现输出以下的结果:
*************
how do you do!
*************
解题思路
在输出的文字上下分别有一行 *
号,显然不必重复写这段代码,用一个函数 printstar
来实现输出一行 *
的功能。再写一个 print_message
函数来输出中间一行文字信息,用主函数分别调用这两个函数即可。创建 9-1.c 文件并输入以下代码:
#include<stdio.h>
#include<string.h>
int main(){
void printstar(); //声明 printstar 函数
void print_message(); //声明 print_message 函数
printstar(); //调用 printstar 函数
print_message(); //调用 print_message 函数
printstar(); //调用 printstar 函数
return 0;
}
void printstar(){ //定义 printstar 函数
printf("**************\n");
}
void print_message(){ //定义 print_message 函数
printf("how do you do!\n");
}
输入以下命令编译并运行:
gcc -o 9-1 9-1.c
./9-1
程序运行结果如下:
程序分析
printstar
和 print_message
都是用户自定义的函数名,分别用来输出一排 “*” 号和一行文字信息。在定义这两个函数时指定函数的类型为 void,表示函数无类型,即无函数值,也就是说,执行这两个函数不会返回任何值到 main
函数。
在程序中,定义 printstar
和 print_message
函数的位置是在 main
函数后面,在这种情况下,应该在 main
函数之前或 main
函数中的开头部分,对以上两个函数进行“声明”。
函数声明的作用是把有关函数的信息(函数名、函数类型、函数参数的个数与类型)通知编译系统,以便于在编译系统对程序进行编译时,在进行到 main
函数调用 printstar
和 print_message
时知道他们是函数而不是变量或其他对象。
函数的定义
C 语言要求,在程序中用到的所有函数,必须“先定义,后使用”。例如想用 max
求两个数的最大值。必须先按规范对它进行定义,指定他的名字、函数返回类型、函数实现的功能以及参数的个数和类型,将这些信息通知给编译系统。这样程序执行 max
函数的时,编译系统就会按照定义时所指定的功能去执行。如果事先不定义,编译系统是无从知晓 max
是什么,要实现什么功能的。
对于 C 编译系统提供的库函数,是由编译系统事先定义好的,库文件中包含了对各函数的定义。程序设计者不必自己定义,只需要用 #include
指令把有关的头文件包含到本文件中即可。例如在程序中用到 sqrt,fabs,sin 等数学函数,就必须在文件模块开头写上:#include<math.h>
。
库函数只提供了最基本、最通用的一些函数,而不可能包括人们在实际应用中所用到的所有函数。我们往往需要自己定义想要用的而库函数并没有提供的函数。
定义无参函数
我们在 9-1.c 中的 printstar 和 print_message 函数都是无参函数,大家可以看到函数名后的括号中是空的,没有任何参数。
其一般形式为
类型名 函数名(){
函数体
}
说明:
类型名表示的是返回值的类型,比如 9-1.c 中在定义 printstar
<