文章目录
一、通过例子理解函数
1. 求n次方
#include<iostream>
using namespace std;
double power(double x, int n);
int main() {
cout << "5 to the power 2 is " << power(5, 2) << endl;
return 0;
}
double power(double x, int n) {
double val = 1.0;
while (n != 0) {
val *= x;
n--;
}
return val;
}
2. 二进制转十进制
#include<iostream>
using namespace std;
void binToDec();
int main() {
binToDec();
return 0;
}
void binToDec() {
int value = 0;
cout << "Enter an 8 bit binary number: ";
for (int i = 7; i >= 0; i--) {
char ch;
cin >> ch;
if (ch == '1')
value += power(2, i);
}
cout << "Decimal value is " << value << endl;
}
3. 计算π
#include<iostream>
using namespace std;
double arctan(double x) {
double cur = x;
int i = 1;
double sum = 0;
while (cur / i > 1e-15) {
if (i % 4 == 1)
sum += cur / i;
else
sum -= cur / i;
i += 2;
cur = cur * x * x;
}
return sum;
}
void computePi() {
// 整数相除结果取整
double x = arctan(1 / 5.0);
double y = arctan(1 / 239.0);
cout << "Pi = " << 16 * x - 4 * y << endl;
}
int main() {
computePi();
return 0;
}
4. 回文数
#include<iostream>
using namespace std;
bool symm(unsigned n) {
unsigned i = n;
unsigned m = 0;
while (i != 0) {
m = m * 10 + i % 10;
i = i / 10;
}
return m == n;
}
void countSymm(unsigned start, unsigned end) {
for (unsigned i = start; i <= end; i++) {
if (symm(i) && symm(i * i) && symm(i * i * i)) {
cout << "m = " << i;
cout << " m * m = " << i * i;
cout << " m * m * m = " << i * i * i;
cout <<endl;
}
}
}
int main() {
countSymm(11, 999);
return 0;
}
5. 分段函数
#include<iostream>
#include<cmath>
using namespace std;
double tsin(double x) {
double sum = 0;
double cur = x;
int i = 1;
while (cur > 1e-6) {
if (i % 4 == 1)
sum += cur;
else
sum -= cur;
cur = cur * x / (i + 1) * x / (i + 2); // 不这样处理会超出范围
i += 2;
}
return sum;
}
void piecewiseFunction(double r, double s) {
if (r * r > s * s)
cout << tsin(r * s) / 2.0 << endl;
else
cout << sqrt(tsin(r) * tsin(r) + tsin(s) * tsin(s)) << endl;
}
int main() {
piecewiseFunction(5, 8);
return 0;
}
6. 掷骰子
#include<iostream>
#include<cstdlib>
using namespace std;
int rollDice() {
int die1 = 1 + rand() % 6;
int die2 = 1 + rand() % 6;
int sum = die1 + die2;
cout << "Player rolled " << die1 << " + " << die2 << " = " << sum << endl;
return sum;
}
enum GameStatus {WIN, LOSE, PLAYING};
void playGame(unsigned seed) {
int sum, myPoint;
GameStatus status;
srand(seed);
sum = rollDice();
switch (sum) {
case 7:
case 11:
status = WIN;
break;
case 2:
case 3:
case 12:
status = LOSE;
break;
default:
status = PLAYING;
myPoint = sum;
cout << "Point is " << sum << endl;
}
while (status == PLAYING) {
sum = rollDice();
if (sum == myPoint)
status = WIN;
else if (sum == 7)
status = LOSE;
}
if (status == WIN)
cout << "Player wins" << endl;
else
cout << "Player loses" << endl;
}
int main() {
playGame(8);
playGame(23);
return 0;
}
7. n!
#include<iostream>
using namespace std;
unsigned fac(unsigned n) {
unsigned ans;
if (n == 0)
return 1;
else
return n * fac(n - 1);
}
int main() {
cout << "5! = " << fac(5) << endl;
return 0;
}
8. 组合数
#include<iostream>
using namespace std;
int comm(int n, int k) {
if (n < k)
return 0;
else if (n == k || k == 0)
return 1;
else
return comm(n - 1, k) + comm(n - 1, k - 1);
}
int main() {
cout << "C(n, k) = " << comm(18, 5) << endl;
return 0;
}
9. 汉诺塔
#include<iostream>
using namespace std;
void move(char src, char dest) {
cout << src << " --> " << dest << endl;
}
void hanoi(int n, char src, char medium, char dest) {
if (n == 1)
move(src, dest);
else {
hanoi(n - 1, src, dest, medium);
move(src, dest);
hanoi(n - 1, medium, src, dest);
}
}
int main() {
int m;
cout << "Enter the number of diskes: ";
cin >> m;
cout << "The steps to moving " << m << " diskes:" << endl;
hanoi(m, 'A', 'B', 'C');
return 0;
}
二、函数的参数传递
1. 值传递
#include<iostream>
using namespace std;
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 5, y = 10;
cout << "x = " << x << " y = " << y << endl;
swap(x, y);
cout << "x = " << x << " y = " << y << endl;
return 0;
}
x = 5 y = 10
x = 5 y = 10
2. 引用传递
#include<iostream>
using namespace std;
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 5, y = 10;
cout << "x = " << x << " y = " << y << endl;
swap(x, y);
cout << "x = " << x << " y = " << y << endl;
return 0;
}
x = 5 y = 10
x = 10 y = 5
3. 两者比较
#include<iostream>
using namespace std;
void fiddle(int a, int &b) {
a = a + 100;
b += 100;
cout << "a = " << a << " b = " << b << endl;
}
int main() {
int x = 5, y = 10;
cout << "x = " << x << " y = " << y << endl;
fiddle(x, y);
cout << "x = " << x << " y = " << y << endl;
return 0;
}
x = 5 y = 10
a = 105 b = 110
x = 5 y = 110
三、内联函数
- 求圆面积
#include<iostream>
using namespace std;
const double PI = 3.14159265358979;
inline double calArea(double radius) {
return PI * radius * radius;
}
int main() {
double r = 3.0;
cout << calArea(r) << endl;
return 0;
}
四、带默认形参值的函数
1. 表示方法
有默认值的形参必须在形参列表的最后
int add(int x, int y = 5, int z = 6); //正确
int add(int x = 1, int y = 5, int z); //错误
int add(int x = 1, int y, int z = 6); //错误
2. 好习惯
在相同的作用域内,声明后不能再重复定义。
#include<iostream>
using namespace std;
int add(int x = 5, int y = 6);
int main() {
cout << add() << endl;
return 0;
}
int add(int x /*= 5*/, int y /*= 6*/) {
return x + y;
}
3. 计算长方体的体积
using namespace std;
int getVolume(int length, int width = 2, int height = 3);
int main() {
int l = 10, w = 12, h = 15;
cout << getVolume(l, w, h) << endl;
cout << getVolume(l, w) << endl;
cout << getVolume(l) << endl;
return 0;
}
int getVolume(int length, int width /*= 2*/, int height /*= 3*/) {
cout << length << " * " << width << " * " << height << " = ";
return length * width * height;
}
四、函数重载
- 重载函数的形参必须不同:个数不同或者类型不同。
int add(int x, int y);
float add(float x, float y);
int add(int x, int y);
int add(int x, int y, int z);
- 不能只以形参名和返回值区分函数。
int add(int x, int y);
int add(int a, int b);
错误!!!编译器不以形参名来区分函数
int add(int x, int y);
void add(int x, int y);
错误!!!编译器不以返回值来区分函数
- 有默认形参时要防止二义性。
void fun(int length, int width = 2, int height = 3);
void fun(int length);
fun(1);
语法错误!!!因为编译器不知道应该执行哪个函数。
两整数平方和及两实数平方和
#include<iostream>
using namespace std;
int sumOfSquare(int x, int y) {
return x * x + y * y;
}
double sumOfSquare(double x, double y) {
return x * x + y * y;
}
int main() {
cout << sumOfSquare(3, 5) << endl;
cout << sumOfSquare(2.3, 5.8) << endl;
return 0;
}