函数的概念
在一个程序中,如果在不同地点多次执行某项操作,就可以把完成这项操作的程序段从程序中独立出来,定义成函数,而原来程序中凡需要进行这个操作的程序段可以只用“函数调用”来替代,从而达到简化程序清单的目的。建立函数成为“函数的定义”,使用函数称为“函数的调用”。
通常把调用其它函数的函数称为“主调函数”,而别调用的函数称为“被调函数”。在C语言中,任何函数都可以是被调函数,也可以是主调函数。而主函数只能是主调函数,不能是被调函数,因为任何函数都不能调用主函数。
每一个函数都能完成特定的任务,称为“函数的功能”;每次调用函数时的某些待处理的数据和函数运行后获得的某些结果统称为“函数的参数”;把主调函数中加工对象带入函数,称为“函数参数的输入”;吧函数运行的某些结果带回主调函数,称为“函数参数的输出”;函数参数的输入和输出统称为“函数间数据的传递”。
函数的定义
格式为:存储类型符 数据类型符 函数名(形式参数表)
数据定义语句序列;
执行语句序列;
通常把一堆花括号括住的部分称为“函数体”,函数体前面的部分称为“函数头”。
1)函数头
存储类型符 可以是extern或static两种
选取extern,则定义的函数叫做外部函数,它可以被其它编译单位中的函数调用;选取static的函数叫做内部函数,它只能被本编译单位中的函数调用。存储类型说明符可以省略,省略时,默认为外部函数。
数据类型符 规定返回值的类型,可以是指针形,数组型,集合型,字符串型,整数型,void型等。
函数名 是一个标识符,在同一个编译单位中函数是是不能重名的。如果参数不一样,函数名是是可以相同的。
2)函数体
数据定义语句序列 若干条数据定义语句组成,用来定义本函数中使用的变狼、数组、指针变量等。
执行语句序列 本函数中完成函数功能的程序段组成。如果有返回值,则在序列中至少有一条返回语句return
各类函数的定义模式(static或extern或空)
1。有参函数: public static String test(int a)
2。无参函数: public static String test()
3。有返回值函数: public String test(){return "asdf"};
4。无返回值函数:public void test(){};
5。内部函数: public static String test()
6。外部函数: public extern String test()
注意:内部函数与外部函数的主要区别是“存储类型符”。内部函数的存储类型是“static”,而外部函数的存储类型符石“extern”或 空;
3)函数调用的过程
1.首先暂停函数调用所在语句的执行,转向被调用的函数继续执行。
2.为函数的所有形式参数分配内存;再将所有实际参数的值计算出来,依次赋予对应的形式参数(如果形参是数组则不给形参分配内存。)如果是无参函数,则本项操作不执行。
3.进入函数体,先执行数据定义语句,为函数体中定义的变量、数组等分配内存。
4.在执行函数体中的可执行语句。
如果是“无返回值函数”,则执行到“返回语句”。若返回语句被省略,则执行到函数体的右花括号。
如果有返回值函数,则执行到返回语句时,计算表达式值作为函数的返回值。
5.收回分配给本函数体中定义的变量、数组、形式参数的内存单元。
6.返回主调函数继续执行。
变量存储类型与作用域
1)变量的存储类型。
存储类型符及其含义如下。
1.自动型
自动型又称堆栈型。自动型变量是分配在内存的堆栈区,堆栈区内存在程序运行中是重复使用的。假定某个函数中定义了自动型变量,函数被调用时,C语言就在堆栈区给该变量分配内存用于存放变量的值。当函数调用结束时,C语言就释放该变量,即从堆栈区中收回分配给该变量的内存,以便重新分配给其他自动型变量。这样做的目的是节省内存。
2.寄存器型
寄存器型变量是分配在CPU的通用寄存器中。由于CPU具有的通用寄存器数量有限,C程序中允许定义的寄存器型变量一般以2个左右为宜。如果定义为寄存器型变量的数目超过所能提供的寄存器数目,编译系统自动将超出的变量设为自动型变量。对于占用字节数多的变量,如:long,float,double类型的变量一般不能定义为寄存器型变量。
3.静态型。
静态型变量是分配在内存的数据区中,它们在程序开始运行时就分配了固定的内存,在程序运行过程中不释放。只有程序运行结束后,才释放所占用的内存。
4外部参照型
外部参照型变量是专用于多个便宜单位之间传递数据用的。
变量初始化和变量存储类型有很大关系,进行初始化时要注意下列几点:
#外部参照型(extern)变量不允许初始化。自动型(auto)变量、寄存器(register)变量和静态型(static)变量都可以初始化。
#自动型变量和寄存器变量如果进行初始化,则每次进入所定义的函数或复合语句都随着重新定义而重新初始化。自动型变量和寄存器型变量如果不进行初始化,变量值将不确定。因此,必须用其他赋值方式为其赋值后方能参与运算。
#景泰兴变量如果进行初始化,只有第一次执行定义语句时随着分配内存赋予初值,当退出所定义的函数或复合语句时,将保留分配给它的内存和其中的值。再次进入定义的函数或复合语句时,不在重新分配内存,也不进行初始化。
2)变量的生命周期
由于变量必须分配内存单元(或寄存器),所以变量就有存货时间的问题。通俗的说,当某个变量占用内存单元(或寄存器)时,我们就说他“活着”;当变量占用的内存单元(或寄存器)被收回了,我们就说他死了。我们把变量从开始i分配内存单元(或寄存器)到分配的内存单元(或寄存器)被收回的期间称为“变量的生存期”。
3)变量的作用域
在变量的生存期中,我们把变量可以使用的程序区域称为变量的作用域。任何变量只能在其作用域内使用,不能再其作用域外使用,否则程序就会出错。例如:局部变量就只能在局部使用。
指针型函数及其调用
指针型函数是指该函数的返回值是指针行,也就是说,这类函数的返回值必须是地址值,调用该类函数时,接受返回值的必须是指针变量、指针数组元素等能存放地址值的对象。
例如:char *max_char(int n){char *p; p=a; return(p);}
1)指针型函数的调用
指针型函数的调用和一般函数的调用方法完全相同,唯一需要注意的是只能用指针变量或指针型数组元素来接受指针型函数的返回值,不能使用数组名来接受指针型函数的返回值,因为数组名是地址常量,不是地址型变量,不能接受地址型数据。
例如:char *max_char(int n){........}
void main(){
int n=2;
char *p;
p=max_char(n);
}
文件包含命令与多文件程序的处理
1)文件包含命令
格式1:#include<文件名> //则系统仅按规定的路径搜索文件。
格式2:#include "文件名" //系统先在本程序清单文件所在的磁盘和路径下寻找文件;若找不到,在按系统规定的路径搜索文件。
常用系统函数
1)常数的数学处理函数
1.求整形绝对值函数
函数头 int abs(int x)
例如:abs(-10) 结果为10
abs(-32768) 结果为-32768.
说明:本函数返回值在0-32767.如果x的值为-32768,则返回值为-32768
2.求长整形绝对值函数
函数头 long labs(long x)
例如:labs(-10L) 结果为10.
3.求实型绝对值函数
函数头 double fabs(double x)
例如:fabs(-10.2) 结果为10.2.
4.求小于或等于x的最大整数函数
函数头 double floor(double x)
例如:floor(-10.5) 结果为-11.0.
floor(10.0) 结果为10.0.
5.求大于或等于x的最小整数函数
函数头 double ceil(double x)
例如:ceil(-10.5) 结果为-10.0.
ceil(10.9) 结果为11.0.
6。求正平方根函数
函数头 double sqrt(double x)
说明 x的值应>=0
7.求常用对数函数
函数头 double log10(double x)
说明 x的值应>0
8.求自然对数函数
函数头 double log(double x)
说明 x的值应>0
9.求指数函数
函数头 double exp(double x)
返回值 参数x的指数e的x平方。
10.求10的x次方函数
函数头 double pow10(int x)
例如:pow10(-1) 结果为0.100000
11.求x的y次方函数
函数头 double pow(double x,double y)
例如:pow(2,-2) 结果为0.250000
pow(0.2,2) 结果为0.040000.
12.求正弦函数
函数头 double sin(double x)
例如:sin(90*3.14159/180) 结果为1.000000
13.求余弦函数
函数头 double cos(double x)
例如:cos(90*3.14159/180) 结果为0.0
14.求正切函数
函数头 double tan(double x)
例如:tan(45*3.14159/180) 结果为1.0
2)常用的类型转换函数
1.将字符串转换成浮点数函数
函数头 double atof(char *x)
例如:12.3、0123e2,转换结果将是:12.3、12.3.如果不是正确的实数形式,转换结果将取前面若干个能组成实数的字符。例如:1A2.345、0.1b23e2,转换的结果将为1.0、0.1。
2.将字符串转换成整数函数
函数头 int atoi(char *x)
例如:12、1200等,转换的结果将是:12、1200等。如果不是正确的整数形式,转换结果将取前面若干个能组成整数的字符对应的证书。例如:1A2、12B00,转换的结果将为1、12.
3)常用的字符处理函数
1.判断是否英文字母函数
函数头 int isalpha(int x)
例如:isalpha(49) 结果为0(49对应的字符是‘1’)(假)
isalpha('a') 结果为非0(真)
2.判断是否英文小写字母函数
函数头 int islower(int x)
例如:islower(97) 结果为非0(真)
islower('A') 结果为0(假)
3.判断是否英文大写字母函数
函数头 int isupper(int x)
例如:isupper(97) 结果为0(97对应的字符是‘a’)(假)
isupper('A') 结果为非0(真)
4.判断是否数字字符函数
函数头 int isdigit(int x)
例如:isdigit(49) 结果为非0(49对应的字符是‘1’)(真)
isdigit('a') 结果为0(假)
5.将大写字母转换为小写字母函数
函数头 int tolower(int x)
例如:tolower(49) 结果为‘1’(49对应的字符是‘1’)
tolower('A') 结果为‘a’
说明:若参数x中存放室大写字母,则返回值是对应的小写字母。如果参数x中存放的字符不是大写字母,则返回值等于x的原来值。
6.将小写字母转换为大写字母函数
函数头 int toupper(int x)
例如:toupper(49) 结果为‘1’(49对应的字符是‘1’)
toupper('a') 结果为‘A’
7.将字符转换成ASCII代码值函数
函数头 int toascii(int x)
例如:toascii(129) 结果为1
toascii('a') 结果为97(97对应的字符是‘a’)
说明:返回值在0-127之间。
4)其他常用函数
1.能发出鸣笛声的函数
函数头 void sound(int x)
功能:按照参数x赫兹的频率连续发出鸣笛声。
2.中指鸣笛声的函数
函数头 void nosound()
功能 中止由sound()函数发出的鸣笛声。
3.延时函数
函数头 void delay(int x)
功能 延时参数x毫秒。
4.随机数发生器初始化函数
函数头 void randomize()
功能 对随机数发生器进行初始化
5.随机数发生函数
函数头 int randoom(int num)
功能 产生一个从0到num-1之间的随机整数。