第六周(笔记)
6.1 6.2 函数
- “函数” 可以将实现了每一个功能,并需要反复使用的代码包装起来形成一个功能模块(即写成一个”函数“),那么当程序中需要使用该项功能时,只需要写一条语句,调用那个实现该功能的函数即可。
- 函数的定义
- 如果函数不需要返回值,则"返回值类型"可以写void
返回值类型 函数名(参数1类型 参数1名称,参数2类型 参数2名称 ......) {
语句组(即“函数体”)
}
- 调用函数和return语句
- 调用函数:
- 函数名(参数1,参数2,…)
- 对函数的调用,也是一个表达式。函数调用表达式的值,由函数内部的return语句决定
- return 返回值;
- return语句的功能是结束函数的执行,并将”返回值“作为结果返回,若返回值类型为void,return语句就直接写:return ;
- 函数调用语句导致程序进入函数执行,return 语句导致程序回到调用语句的后面继续执行
- 调用函数:
- 函数的声明
- 一般来说函数的定义,否则调用语句出错,一般函数的调用语句前面有函数的声明即可
返回值类型 函数名(参数1类型 参数1名称,参数2类型 参数2名称......);
- 函数参数的传递
- 函数的形参是实参的一个拷贝,且形参的改变不会影响到实参(除非形参类型是数组或引用)
- 一维数组作为函数的参数
- 写法:类型名 数组名[] (不用写出数据元素的个数)
- 数组作为函数参数是,是传引用的,即形参数组改变了,实参数组也会改变
- 二维数组作为函数的参数
- 二维数组作为参数时,必须写明数组有多少列,不用写明有多少行
- 必须写明列数,编译器才能根据下标算出元素的地址
- a[i] [j]的地址: 数据首地址 + i * N * sizeof(a[0] [0]) + j * sizeof(a[0] [0]) (N是数组列数)
- 形参数组的首地址就是实参数组的首地址
void PrintArray(int a[][5]) {
cout << a[4][3];
}
6.3 递归初步
- 递归(一个函数自己调用自己就是递归)
n ! = { 1 n = 0 n ∗ ( n − 1 ) ! n > 0 n!=\begin{cases} 1 & n=0 \\ n*(n-1)! & n>0 \end{cases} n!={1n∗(n−1)!n=0n>0
int Factorial(int n) {
//返回函数n的阶乘
if (n < 2)
return 1;//终止条件
else
return n * Factorial(n-1);
}
- 递归函数需要有终止条件,否则就会无穷递归导致程序无法终止甚至崩溃
- 斐波那契数列
Fibonacci sequence:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ……
f ( n ) = { 0 n = 0 1 n = 1 f ( n − 2 ) + f ( n − 1 ) n > 1 f(n)=\begin{cases} 0 & n=0 \\ 1 & n=1 \\ f(n-2)+f(n-1) & n>1 \end{cases} f(n)=⎩⎪⎨⎪⎧01f(n−2)+f(n−1)n=0n=1n>1
int fib(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
return fib(n - 2) + fib(n - 1);
}
6.4 库函数和头文件
-
库函数:c/c++标准规定的,编译器自带的函数
-
头文件:c++编译提供许多头文件,如(cmath,string)
-
数学函数
int abs(int x) 求整数型x的绝对值 double cos(double x) 求x的预先 double fabs(doublex) 求浮点数x的绝对值 int ceil(double x) 求不小于x的最小整数 double sin(double x) 求x的正弦 double sqrt(double x) 求x的平方根 -
字符处理函数
int isdigit(int c) 判断c是否是数字字符 int isalpha(int c) 判断c是否是一个字母 int isalnum(int c) 判断c是否是一个数字或者字母 int islower(int c) 判断c是否是一个小写字母 int isupper(int c) 判断c是否是一个大写字母 int toupper(int c) 如果c是一个小写字母,则返回对应的大写字母 int tolower(int c) 如果c是一个大写字母,则返回对应小写字母