c++函数回顾
函数的定义语法形式:
类型说明符 函数名(含类型说明符的形参表)
{
程序语句
}
调用其他函数的函数被称为主调函数,被其他函数调用的函数被称为被调函数。但如果希望在一个函数定义前调用它,则需要在函数调用前添加该函数的函数原型声明。函数原型声明的形式如下:
类型说明符 函数名 (含类型说明的形参表);
与变量的生命和定义类似,声明一个函数只是将函数的有关信息(函数名、返回值类型、参数表等)告诉编译器。声明函数时,形参表只要包含完整的类型信息即可,形参名可以省略(并不推荐,只是可以存在这种情况)。同时函数又可分为自定义函数和系统函数。
1、系统函数
充分利用系统函数,可以大大减少编程的工作量,提高程序的运行效率和可靠性。编译环境提供的系统函数分为两类,一类是标准c++的函数,另一类是非标准的c++函数,它是当前操作系统或编译环境中所特有的系统函数。例如,cmath中所声明的sin、cos、tan等函数都是标准函数。
具体常用的函数:(转载自http://www.cnblogs.com/MarkKobs-blog/p/10456759.html)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
数学<math.h>: 1 三角函数 double sin (double); double cos (double); double tan (double); 2 反三角函数 double asin (double); 结果介于[-PI/2, PI/2] double acos (double); 结果介于[0, PI] double atan (double); 反正切(主值), 结果介于[-PI/2, PI/2] double atan2 (double, double); 反正切(整圆值), 结果介于[-PI/2, PI/2] 3 双曲三角函数 double sinh (double); double cosh (double); double tanh (double); 4 指数与对数 double exp (double x); e的x次幂 double pow (double x, double y); x的y次幂 double sqrt (double); double log (double x); 以e为底的对数,即ln x double log10 (double x);log10(x) 以10为底。 没有以2为底的函数但是可以用换底公式解 决:log2(N)=log10(N)/log10(2) 5 取整 double ceil (double); 不小于x的最小整数 double floor (double); 不大于x的最大整数 6 绝对值 int abs(int);整型 long labs(long);长整型 double fabs (double);浮点型 7 标准化浮点数 double frexp (double f, int p); 标准化浮点数, f = x 2^p, 已知f求x, p ( x介于[0.5, 1] ) double ldexp (double x, int p); 与frexp相反, 已知x, p求f 8 取整与取余 double modf (double, double*); 将参数的整数部分通过指针回传, 返回小数部分 double fmod (double, double); 返回两参数相除的余数 9.平方根 double sqrt(double x); 字符<ctype.h>: int isalpha(int c);c是否为字母 int isdigit(int c);c是否为数字 int tolower(int c);将c转换为小写字母 int toupper(int c);将c转换为大写字母 字符串<string.h>: char strcpy(char sl,char s2);将字符串s2复制给s1,即覆盖 unsigned strlen(char sr);求字符串str长度 内存操作<memory.h>: void memcpy(void d,void *s,int c);将s指向的内存区域的c个字节复制到d指向的区域 类型转换<stdlib.h>: int atoi(char s);将字符串转化为整数 char itoa(int v,char *s,int x);将整数v按x进制转成字符串s 时间<time.h>: time_t time(time_t *timer);返回1970/1/1零点到目前的秒数 其他<stdlib.h>: srand(unsigned seed);设置随机数的种子 int rand();产生0-RAND_MAX的随机数 exit(int);终止正在执行的程序
2、递归调用
函数可以直接或间接的调用自身,称为递归调用。对同一个函数的多次不同调用,编译器会为函数的形参和局部变量分配不同的内存空间,它梦互不影响。
# include <iostream> using namespace std; // 计算n的阶乘 int fun(int n){ int d; if (n==0) d=1; else f = fun(n-1)*n; return f; } int main (){ int n,y; cout<<"请输入参数:" <<endl; cin>>n; y = fun(n); cout<<n<<"的阶乘结果为:"<<y; return 0; }
3、函数的参数传递
参数传递大致为两类:值传递、引用传递。值传递是指发生函数调用时,给形参分配内存空间,并用实参来初始化形参。这一过程是参数的单向传递,一旦形参获得了值便与实参脱离关系,此后无论形参发生了怎样的改变,都不会影响到实参。引用是一种特殊的变量,可以被认为是另一个变量的别名。也就是说,一个引用,从它诞生之时起,就必须确定是那个变量的别名,而却始终只能作为这一个变量的别名,
4、函数重载
两个以上的的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数,这就是函数重载。重载函数的形参必须不同,可以个数不同或者类型不同。