1. 函数的说明与定义 Turbo C2.0中所有函数与变量一样在使用之前必须说明。所谓说明是指说明函 数是什么类型的函数, 一般库函数的说明都包含在相应的头文件<*.h>中, 例如标 准输入输出函数包含在stdio.h中, 非标准输入输出函数包含在io.h中, 以后在使 用库函数时必须先知道该函数包含在什么样的头文件中, 在程序的开头用#include <*.h>或#include"*.h"说明。只有这样程序在编译, 连接时Turbo C 才知道它是提 供的库函数, 否则, 将认为是用户自己编写的函数而不能装配。
1.1 函数说明
1. 经典方式 其形式为: 函数类型 函数名(); 2. ANSI 规定方式 其形式为: 函数类型 函数名(数据类型 形式参数, 数据类型 形式 参数, ......); 其中: 函数类型是该函数返回值的数据类型, 可以是以前介绍的整型(int), 长整型(long), 字符型(char), 单浮点型(float), 双浮点型(double)以及无值型 (void), 也可以是指针, 包括结构指针。无值型表示函数没有返回值。 函数名为Turbo C2.0的标识符, 小括号中的内容为该函数的形式参数说明。可 以只有数据类型而没有形式参数, 也可以两者都有。对于经典的函数说明没有参数 信息。如: int putlll(int x,int y,int z,int color,char *p)/*说明一个整型函数*/ char *name(void); /*说明一个字符串指什函数*/ void student(int n, char *str); /*说明一个不返回值的函数*/ float calculate(); /*说明一个浮点型函数*/ 注意: 如果一个函数没有说明就被调用, 编译程序并不认为出错, 而将此函数 默认为整型(int)函数。因此当一个函数返回其它类型, 又没有事先说明, 编译时 将会出错。
1.2 函数定义 函数定义就是确定该函数完成什么功能以及怎么运行, 相当于其它语言的一个 子程序。Turbo C2.0对函数的定义采用ANSI规定的方式。即: 函数类型 函数名(数据类型形式参数; 数据类型 形式参数...) { 函数体; } 其中函数类型和形式参数的数据类型为Turbo C2.0的基本数据类型。函数体为 Turbo C2.0提供的库函数和语句以及其它用户自定义函数调用语句的组合, 并包括 在一对花括号"{"和"}"中。 需要指出的是一个程序必须有一个主函数, 其它用户定义的子函数可以是任意 多个, 这些函数的位置也没有什么限制, 可以在main()函数前, 也可以在其后。 Turbo C2.0将所有函数都被认为是全局性的。而且是外部的, 即可以被另一个文件 中的任何一个函数调用。
|
二、被调用函数向调用函数返回值
一般使用return语句由被调用函数向调用函数返回值, 该语句有下列用途: 1. 它能立即从所在的函数中退出, 返回到调用它的程序中去。 2. 返回一个值给调用它的函数。 有两种方法可以终止子函数运行并返回到调用它的函数中: 一是执行到函数的 最后一条语句后返回; 一是执行到语句return时返回。前者当子函数执行完后仅返 回给调用函数一个0。若要返回一个值, 就必须用return语句。只需在return 语句 中指定返回的值即可。例1返回最大值时变为: 例3: #include<stdio.h> int maxmum(int x, int y, int z); /*说明一个用户自定义函数*/ int main() { int i, j, k, max; printf("i, j, k=?\n"); scanf("%4d%4d%4d", &i, &j, &k); max=maxmum(i, j, k); /*调用子函数, 并将返回值赋给max*/ printf("The maxmum value is %d\n", max); getch(); return 0; } maxmum(int x, int y, int z) { int max; max=x>y?x:y; /*求最大值*/ max=max>z?max:z; return(max); /*返回最大值*/ } return语句可以向调用函数返回值, 但这种方法只能返回一个参数, 在许多情 况下要返回多个参数, 这是用return语句就不能满足要求。Turob C2.0提供了另一 种参数传递的方法, 就是调用函数向被调用函数传递的形式参数不是传递变量本身, 而是传递变量的地址, 当子函数中向相应的地址写入不同的数值之后, 也就改变了 调用函数中相应变量的值, 从而达到了返回多个变量的目的。 例4: #include<stdio.h> void subfun(int *m, int *n); /*说明子函数*/ int main() { int i, j; printf("i, j=?\n"); scanf("%d, %d", &i, &j); /*从键盘输入2个整数*/ printf("In main before calling\n"/*输出此2数及其乘积*/ "i=%-4d j=%-4d i*j=%-4d\n", i, j, i*j); subfun(&i, &j); /*以传送地址的方式调用子函数*/ printf("In main after calling\n"/*调用子函数后输出变量值*/ "i=%-4d j=%-4d i*j=%-4d\n", i, j, i*j); getch(); return 0; } void subfun(int *m, int *n) { *m=*m+2; *j=*i-*j; printf("In subfun after calling\n" /*子函数中输出变量值*/ "i=%-4d j=%-4d i*j=%-4d\n", *i, *j, *i**j); }
上例中, *i**j表示指针i和j所指的两个整型数*i和*j之乘积。 另外, return语句也可以返回一个指针, 举例如下。 下例中先等待输入一字符串, 再等待输入要查找的字符, 然后调用match() 函 数在字符串中查找该字符。若有相同字符, 则返回一个指向该字符串中这一位置的 指针, 如果没有找到, 则返回一个空(NULL)指针。 例5: #include<stdio.h> char *match(char c, char *s); int main() { char s[40], c, *str; str=malloc(40); /*为字符串指什分配内存空间*/ printf("Please input character string:"); gets(s); /*键盘输入字符串*/ printf("Please input one character:"); c=getche(); /*键盘输入字符*/ str=match(c, s); /*调用子函数*/ putchar('\n'); puts(str); /*输出子函数返回的指针所指的字符串*/ getch(); return 0; } char *match(char c, char *s) { int i=0; while(c!=s[i]&&s[i]!='\n')/*找字符串中指定的字符*/ i++; return(&s[i]); /*返回所找字符的地址*/
}
|
三、用全程变量实现参数互传 以上两种办法可以在调用函数和被调用函数间传递参数, 但使用不太方便。如 果将所要传递的参数定义为全程变量, 可使变量在整个程序中对所有函数都可见。 这样相当于在调用函数和被调用函数之间实现了参数的传递和返回。这也是实际中 经常使用的方法, 但定义全程变量势必长久地占用了内存。因此, 全程变量的数目 受到限制, 特别对于较大的数组更是如此。当然对于绝大多数程序内存都是够用的。 例6: #incluide<stdio.h> void disp(void); int m[10]; /*定义全程变量*/ int main() { int i; printf("In main before calling\n"); for(i=0; i<10; i++){ m[i]=i; printf("%3d", m[i]); /*输出调用子函数前数组的值*/ } disp(); /*调用子函数*/ printf("\nIn main after calling\n"); for(i=0; i<10; i++) printf("%3d", m[i]); /*输出调用子函数后数组的值*/ getch(); return 0; } void disp(void) { int j; printf("In subfunc after calling\n");/*子函数中输出数组的值*/ for (j=0; i<10; j++){ m[j]=m[j]*10; printf("%3d", m[i]); } } |
|
2.3 函数的递归调用 Turbo C2.0允许函数自己调用自己, 即函数的递归调用, 递归调用可以使程序 简洁、代码紧凑, 但要牺牲内存空间作处理时的堆栈。 如要求一个n!(n的阶乘)的值可用下面递归调用: 例8: #include<stdio.h> unsigned ling mul(int n); int main() { int m; puts("Calculate n! n=?\n"); scanf("%d", &m); /*键盘输入数据*/ printf("%d!=%ld\n", m, mul(m));/*调用子程序计算并输出*/ getch(); retun 0; } unsigned long mul(int n) { unsigned long p; if(n>1) p=n*mul(n-1); /*递归调用计算n!*/ else p=1L; return(p); /*返回结果*/ } 运行结果: calculate n! n=? 输入5时结果为: 5!=120 | | |