(五)函数 -- 3 函数编写

    科技2022-07-13  132

    3. 函数编写

    在C程序中增加一个新的函数由两个步骤组成: (1) 需要指定这个函数原型,它通常位于整个程序的头部,在#include行之后。 (2) 在程序的稍后部分,需要提供该函数的实现,即指定一些实际的程序步骤。

    例如,要写一个将摄氏温度转为华氏温度的函数。

    其原型为:

    double CelsiusToFahrenheit(double c);

    函数的实现是由它的原型开始,去掉结尾的分号,然后加入函数体。

    函数体(function body) 函数体是一个程序块,由一组括在一对花括号中的语句组成。

    程序块中的语句前面可以有变量声明,就如前面所见的main函数中一样。

    3.1 return语句

    如果函数返回一个结果,则函数体中至少包含一个return语句,它指出了要返回的值。

    如上所述, return语句包含两个概念:“我已经完成了”和“这就是答案”。

    return语句完成了写一个CelsiusToFahrenheit函数的实现所需的所有手段:

    double CelsiusToFahrenheit(double c) { return (9.0/5.0*c+32); }

    该函数计算相应表达式的值,并将该值作为函数的结果值返回。

    3.2 函数与主程序

    函数celsiusToFahrenheit本身不能组成一个完整的程序。 每个完整的程序都有一个名字为main的函数,当程序开始执行的时候就调用该函数。

    生成温度转换表的完整程序如下:

    /* File: c2ftable.c * ---------------- * This program illustrates the use of functions by generating * a table of Celsius to Fahrenheit conversions. */ #include <stdio.h> #define LowerLimit 0 #define UpperLimit 100 #define StepSize 5 /* Function Prototypes */ double CelsiusToFahrenheit(double c); /* Main Program */ main() { int c; printf(" C F\n"); for (c = LowerLimit; c <= UpperLimit; c += StepSize) { printf("= %3g\n", c, CelsiusToFahrenheit(c)); } } /* Function: CelsiusToFahrenheit * Usage: f = CelsiusToFahrenheit(c); * ---------------------------------- * This function returns the Fahrenheit equivalent of the Celsius * temperature c. */ double CelsiusToFahrenheit(double c) { return (9.0 / 5.0 * c + 32); }

    3.3 包含内部控制结构的函数

    在许多情况下,计算一个函数需要做出很多测试或编写一个循环。这样的细节问题增加了实现一个函数的复杂性,但不会改变函数的基本形式。

    示例如下:

    /* Input an integer n and calculate n!. */ #include <stdio.h> /* Function Prototype */ int Factorial(int n); /* Main Program */ main() { int n; printf("Input a number: "); scanf("%d", &n); printf("Factorial product is %d.\n", Factorial(n)); } /* Function */ int Factorial(int n) { int product; product = 1; for (n; n > 1; n--) { product *= n; } return product; }

    3.4 返回非数字值的函数

    在C语言中,函数可以返回任意数据类型的值。

    例如,将用数值表示的月份(1~12)转换为相应的用文字表示月份名(从January到December) 的string类型的函数,其代码示例如下:

    /* Convert number 1-12 into month name. */ #include <stdio.h> /* Function Prototype */ char* MonthName(int month); /* Main Program */ main() { int month; printf("Input an integer (1-12): "); scanf("%d", &month); // printf("%d\n", month); printf("%s\n", MonthName(month)); } /* Function */ char* MonthName(int month) { switch (month) { case 1: return ("January\n"); case 2: return ("February\n"); case 3: return ("March\n"); case 4: return ("April\n"); case 5: return ("May\n"); case 6: return ("June\n"); case 7: return ("July\n"); case 8: return ("August\n"); case 9: return ("September\n"); case 10: return ("October\n"); case 11: return ("November\n"); case 12: return ("December\n"); default: return ("Illegal month\n"); } }

    在MonthName函数的switch语句中,每个case子句中的return语句自动地退出整个函数,因此不需要再写一个break语句。

    如果在设计程序时让每个case子句都以break或return语句结尾,可以避免调试中的许多困难。

    3.5 谓词函数

    虽然C语言的函数可以返回任何类型的值,但有一种结果类型值得特别关注,那就是bool类型。

    谓词函数(predicate function) 返回bool类型值的函数被称为谓词函数。

    例如,列出某个整数区间中的偶数(如1-10),代码示例如下:

    /* List even numbers from LowerLimit to UpperLimit. */ #include <stdio.h> #define LowerLimit 1 #define UpperLimit 10 /* Function Prototype */ _Bool isEven(int n); /* Main Program */ main() { int i; for (i = LowerLimit; i <= UpperLimit; i++) { if (isEven(i)) printf("%d\n", i); } } /* Function */ _Bool isEven(int n) { return (n % 2 == 0); }

    参考 《C语言的科学和艺术》 —— 第5章 函数

    Processed: 0.010, SQL: 8