C++: 实战:函数综合
最后更新:2026-08-26
前面的课程我们分开了讲函数的各个方面,但真实程序里它们是混在一起用的。
这一课,我们通过几个综合实例,练习如何让函数协同工作。
1. 实例一:简单的数学工具库
(1) 1.1 需求分析
我们要做一个数学工具库,包含以下函数:
int add(int a, int b)— 加法int subtract(int a, int b)— 减法int multiply(int a, int b)— 乘法double divide(int a, int b)— 除法(返回浮点数)int power(int base, int exp)— 幂运算bool isPrime(int n)— 判断素数
▶ 示例 1:数学工具库(难度⭐⭐)
CPP
📖 仅展示
#include <iostream>
#include <cmath>
// 函数原型
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
double divide(int a, int b);
int power(int base, int exp);
bool isPrime(int n);
int main() {
int x = 10, y = 3;
std::cout << "x + y = " << add(x, y) << std::endl;
std::cout << "x - y = " << subtract(x, y) << std::endl;
std::cout << "x * y = " << multiply(x, y) << std::endl;
std::cout << "x / y = " << divide(x, y) << std::endl;
std::cout << "x ^ y = " << power(x, y) << std::endl;
std::cout << "x 是素数吗?" << (isPrime(x) ? "是" : "不是") << std::endl;
return 0;
}
// 函数定义
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int multiply(int a, int b) {
return a * b;
}
double divide(int a, int b) {
if (b == 0) {
return 0.0;
}
return static_castdouble(a) / b;
}
int power(int base, int exp) {
if (exp < 0) {
return 0; // 简化:不支持负指数
}
int result = 1;
for (int i = 0; i < exp; i++) {
result *= base;
}
return result;
}
bool isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
输出:
TEXT
📖 仅展示
x + y =
x - y =
x * y =
x / y =
x ^ y =
x 是素数吗?是不是
运行效果:
TEXT
📖 仅展示
x + y = 13
x - y = 7
x * y = 30
x / y = 3.33333
x ^ y = 1000
x 是素数吗?不是
2. 实例二:猜数字游戏(函数版)
(1) 2.1 需求分析
把之前的猜数字游戏改写成函数版:
void printWelcome()— 打印欢迎信息int getSecretNumber()— 生成秘密数字int getGuess()— 获取用户猜测void printResult(int guess, int secretNumber)— 打印结果(大了/小了/对了)void playGame()— 主游戏逻辑
▶ 示例 2:猜数字游戏(函数版)(难度⭐⭐)
CPP
📖 仅展示
#include <iostream>
#include <cstdlib>
#include <ctime>
// 函数原型
void printWelcome();
int getSecretNumber();
int getGuess();
void printResult(int guess, int secretNumber);
void playGame();
int main() {
std::srand(static_cast<unsigned int>(std::time(nullptr)));
char playAgain;
do {
playGame();
std::cout << "想再玩一次吗?(y/n):";
std::cin >> playAgain;
} while (playAgain == 'y' || playAgain == 'Y');
std::cout << "谢谢游玩,再见!" << std::endl;
return 0;
}
// 函数定义
void printWelcome() {
std::cout << "=========== 猜数字游戏 ===========" << std::endl;
std::cout << "我想了一个 1-100 的数字,你来猜!" << std::endl << std::endl;
}
int getSecretNumber() {
return std::rand() % 100 + 1;
}
int getGuess() {
int guess;
std::cout << "请输入你的猜测:";
std::cin >> guess;
return guess;
}
void printResult(int guess, int secretNumber) {
if (guess > secretNumber) {
std::cout << "大了!再试试。" << std::endl;
} else if (guess < secretNumber) {
std::cout << "小了!再试试。" << std::endl;
} else {
std::cout << "🎉 恭喜你!猜对了!" << std::endl;
}
}
void playGame() {
printWelcome();
int secretNumber = getSecretNumber();
int guess;
int attempts = 0;
do {
guess = getGuess();
attempts++;
printResult(guess, secretNumber);
} while (guess != secretNumber);
std::cout << "你一共猜了 " << attempts << " 次。" << std::endl << std::endl;
}
输出:
TEXT
📖 仅展示
想再玩一次吗?(y/n):
谢谢游玩,再见!
=========== 猜数字游戏 ===========
我想了一个 1-100 的数字,你来猜!
请输入你的猜测:
大了!再试试。
小了!再试试。
🎉 恭喜你!猜对了!
你一共猜了 次。
3. 实例三:简单的计算器(函数重载版)
(1) 3.1 需求分析
用函数重载实现计算器,支持 int 和 double 两种类型。
▶ 示例 3:计算器(函数重载版)(难度⭐⭐)
CPP
#include <iostream>
#include <iomanip>
// 函数原型(重载)
int calculate(int a, int b, char op);
double calculate(double a, double b, char op);
int main() {
int intResult = calculate(10, 3, '+');
double doubleResult = calculate(10.0, 3.0, '/');
std::cout << "10 + 3 = " << intResult << std::endl;
std::cout << std::fixed << std::setprecision(2);
std::cout << "10.0 / 3.0 = " << doubleResult << std::endl;
return 0;
}
// 函数定义(重载)
int calculate(int a, int b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b; // 整数除法
default: return 0;
}
}
double calculate(double a, double b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return b != 0 ? a / b : 0.0;
default: return 0.0;
}
}
输出:
TEXT
📖 仅展示
10 + 3 =
10.0 / 3.0 =
4. 实战练习:学生成绩管理(函数版)
▶ 示例 4:学生成绩管理(难度⭐⭐⭐)
CPP
📖 仅展示
#include <iostream>
#include <string>
// 函数原型
void printMenu();
void addStudent(std::string names, int scores, int& count);
void printStudents(const std::string names, const int scores, int count);
double calculateAverage(const int scores, int count);
int findMaxScore(const int scores, int count);
int main() {
const int MAX_STUDENTS = 100;
std::string names[MAX_STUDENTS];
int scores[MAX_STUDENTS];
int count = 0;
int choice;
do {
printMenu();
std::cout << "请选择(1-4):";
std::cin >> choice;
if (choice == 1) {
addStudent(names, scores, count);
} else if (choice == 2) {
printStudents(names, scores, count);
} else if (choice == 3) {
if (count == 0) {
std::cout << "没有学生数据!" << std::endl;
} else {
std::cout << "平均分:" << calculateAverage(scores, count) << std::endl;
std::cout << "最高分:" << findMaxScore(scores, count) << std::endl;
}
} else if (choice == 4) {
std::cout << "再见!" << std::endl;
} else {
std::cout << "错误:请输入 1-4 之间的数字!" << std::endl;
}
std::cout << std::endl;
} while (choice != 4);
return 0;
}
// 函数定义
void printMenu() {
std::cout << "=========== 学生成绩管理 ===========" << std::endl;
std::cout << "1. 添加学生" << std::endl;
std::cout << "2. 显示所有学生" << std::endl;
std::cout << "3. 统计" << std::endl;
std::cout << "4. 退出" << std::endl;
}
void addStudent(std::string names, int scores, int& count) {
if (count >= 100) {
std::cout << "学生数量已达上限!" << std::endl;
return;
}
std::cout << "请输入姓名:";
std::cin.ignore();
std::getline(std::cin, names[count]);
std::cout << "请输入成绩:";
std::cin >> scores[count];
count++;
std::cout << "添加成功!" << std::endl;
}
void printStudents(const std::string names, const int scores, int count) {
if (count == 0) {
std::cout << "没有学生数据!" << std::endl;
return;
}
std::cout << "=========== 学生列表 ==========" << std::endl;
for (int i = 0; i < count; i++) {
std::cout << i + 1 << ". " << names[i] << " - " << scores[i] << std::endl;
}
}
double calculateAverage(const int scores, int count) {
if (count == 0) {
return 0.0;
}
int sum = 0;
for (int i = 0; i < count; i++) {
sum += scores[i];
}
return static_castdouble(sum) / count;
}
int findMaxScore(const int scores, int count) {
if (count == 0) {
return 0;
}
int maxScore = scores[0];
for (int i = 1; i < count; i++) {
if (scores[i] > maxScore) {
maxScore = scores[i];
}
}
return maxScore;
}
输出:
TEXT
📖 仅展示
请选择(1-4):
没有学生数据!
平均分:
最高分:
再见!
错误:请输入 1-4 之间的数字!
=========== 学生成绩管理 ===========
1. 添加学生
2. 显示所有学生
3. 统计
4. 退出
学生数量已达上限!
请输入姓名:
请输入成绩:
添加成功!
没有学生数据!
=========== 学生列表 ==========
. -
❓ 常见问题
Q 什么时候应该把代码写成函数?
A > - 代码重复了 2 次以上 → 写成函数 > - 一段代码有明确的功能 → 写成函数(提高可读性) > - 需要复用 → 写成函数
Q 函数原型必须写吗?
A 如果函数定义在
main 之前,可以不用写函数原型。📖 小节
- 真实程序里,函数是协同工作的
- 把大问题拆分成小函数,每个函数只做一件事
- 用函数原型声明函数,用函数定义实现功能
- 函数重载可以让同名函数处理不同类型
- 好的函数命名能让代码自文档化
📝 作业
-
基础题 (Difficulty ⭐): 把之前的"计算矩形面积"程序改写成函数版:
-
写一个函数
double calculateArea(double width, double height) -
在
main里调用它 -
进阶题 (Difficulty ⭐⭐): 写一个程序,包含以下函数:
-
int fibonacci(int n)— 返回斐波那契数列的第 n 项 -
void printFibonacci(int n)— 打印前 n 项 -
在
main里让用户输入 n,调用这两个函数 -
挑战题 (Difficulty ⭐⭐⭐): 扩展"学生成绩管理"程序,添加以下功能:
-
删除学生(按姓名或序号)
-
按成绩排序(从高到低)
-
保存到文件 / 从文件读取(选做)
- 函数封装提高代码可读性和复用性
- 数组作为函数参数时退化为指针
- 函数组合:一个函数调用另一个函数
- 递推公式常见应用:阶乘、斐波那契、幂运算
- 程序架构:输入→处理→输出,每步用函数封装
5. 🚀 下一步
恭喜你!Phase 2(函数)的所有课程都学完了。 接下来我们进入 Phase 3(数组、字符串、结构体),学习如何处理多个同类型的数据,以及 C++ 的字符串。