函数是结构化设计的基础。
【问题:分段函数】
有一个函数
y={ x x<1 | 2x-1 1<=x<10 \ 3x-11 x>=10
写一段程序,输入x,输出y。 说明:x 和 y 都是整数。
这是一个典型的函数,有输入、有输出。和数学中的函数不同的是,C语言中的数据是有数据类型的。
C语言中的函数基本结构如下:
1 2 3 4 | 返回类型 函数名称(参数列表) { 函数体 } |
这个函数的C程序如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> int main(int argc, char *argv[]) { int x, y; scanf("%d",&x); if(x<1) y=x; else if(x<10) y=2*x-1; else y=3*x-11; printf("%d",y); return 0; } |
可以根据以下的原则将 main 程序改写成函数:
1) 将 scanf 中读入的数据作为参数列表,去除声明中重复的参数
2) 将 printf 语句输出的值改为返回值
3) 将 scanf 和 printf 之间的语句作为函数体
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> int f(int x) { int y; if(x<1) y=x; else if(x<10) y=2*x-1; else y=3*x-11; return y; } |
可以编写一个主函数来测试这个函数是否编写的正确。
1 2 3 4 5 6 7 | int main(int argc, char *argv[]) { int n; scanf("%d", &n); printf("%d\n", f(n)); return 0; } |
函数除了是模块化设计的基础之外,还可以简化逻辑判断。 本题中的函数可以改写为
1 2 3 4 5 6 | int f(int x) { if(x<1) return x; if(x<10) return 2*x-1; return 3*x-11; } |
当执行到第4行时, 隐含的条件是 x>=1。因为如果 x<1,那么已经执行第3行的语句返回了。 同样的道理对于第5行语句也成立。