内容正文:
第6章 函数与编译预处理
本章内容
6.1模块化设计
6.2函数的定义与调用
6.3函数的递归调用
6.4 变量的存储类型、作用域
6.5 编译预处理
6.6 综合案例
6.1模块化设计
模块化设计思想
把一个大问题分解成若干个比较容易求解的小问题,然后分别求解
模块设计原则
模块独立
功能单一。
模块间的联系力求简单。
数据局部化。
模块的规模要适当
分解模块要注意层次
6.2函数的定义与调用
6.2.1标准库函数
math.h头文件中函数:abs()、sin()、cos()、exp()、fabs()、floor()、rand()等
stdio.h头文件中函数:fgets()、fopen()、fprintf()、fputc()、gets()、puts()、fread()、getchar() 、putchar()、open()、close()、printf()、scanf()等
ctype.h头文件中函数: isalnum()、isalpha()、ispunch()、isspace()、isupper()、isxdigit()等
string.h头文件中函数:strcat()、strchr()、strcmp()、strcpy()、strlen()、strlwr()、strncat()、strncpy()、strstr()、strupr()等
6.2.2函数的定义
类型说明符 函数名称 (形式参数类型及说明列表)
{
/*以下为函数体*/
局部变量声明部分
语句序列
}
int max(int n1,int n2)
{
int t;
if(n1>n2)
t=n1;
else
t=n2;
return t;
}
函数的声明部分
类型说明符
定义了函数中return语句返回值的类型
省略类型说明符,函数返回一个整型值
函数没有返回值,可以定义为void
函数名称
遵循C语言标识符的命名规则
形式参数类型及说明列表
用逗号分隔的形式参数列表
每个列表项均由“类型说明符”和“形式参数名称”两部分组成
没有参数,括号仍然是必须要有的
函数体
和main函数一样,必须将变量声明语句和其它语句序列用{}括起来
有返回值,需要通过return语句返回
return语句的一般形式为:
return(表达式);
或者
return 表达式;
return语句有两个重要作用
返回一个值;
退出当前函数,也就是使程序返回到调用语句处继续进行
6.2.3函数的调用
调用函数定义在主调函数之前,主调函数可以直接调用
被调用函数定义在主调函数之后,则需要在主调函数中声明被调用函数。
函数的声明格式
类型名 函数名称(形式参数类型列表);
注意:
函数声明语句后面需加分号。
在声明函数时,函数的参数名称可以省略,但参数类型不能省略,且参数类型的个数、类型、次序必须保持一致。
main()
{
int max(int,int);
/*声明max函数,也可改为
int max(int n1,int n2);*/
……
c=max(a,b);
……
}
int max(int n1,int n2)
{
……
}
函数的调用
无参函数调用的一般形式为:
函数名();
有参函数调用的一般形式为:
函数名(实参表达式1,实参表达式2,……)
c=max(a,b);
printf(“%d”,c);
函数的嵌套调用
在C语言中,允许在定义一个函数时调用另外一个函数,则在该函数被调用的过程中将发生另一次函数调用
【例6.1】验证哥德巴赫猜想。猜想内容:任何一个大于4的偶数,都可以表示为两个素数的和。
图6.2 函数的嵌套调用
6.2.4参数的传递
形参和实参的概念
函数定义时使用的参数称之为形式参数,简称形参
函数调用时使用的参数,称之为实际参数,简称实参
在函数调用时,实参的个数要和形参相等,而且类型必须一致,另外实参与形参出现的次序也要一一对应。
程序举例
【例6.2】输入两个数,输出两个数中的最大值
#include "stdio.h"
main()
{
int a,b,m;
int max(int,int); /*声明max函数*/
printf("
Please input two numbers(a,b):");
scanf("%d,%d",&a,&b);
m=max(a,b); /*调用max函数*/
printf("max=%d
",m);
}
int max(int x,int y)
{
int t;
t=x>y?