C++: 实战:函数综合

最后更新:2026-08-26

前面的课程我们分开了讲函数的各个方面,但真实程序里它们是混在一起用的。

这一课,我们通过几个综合实例,练习如何让函数协同工作。


1. 实例一:简单的数学工具库

(1) 1.1 需求分析

我们要做一个数学工具库,包含以下函数:

  1. int add(int a, int b) — 加法
  2. int subtract(int a, int b) — 减法
  3. int multiply(int a, int b) — 乘法
  4. double divide(int a, int b) — 除法(返回浮点数)
  5. int power(int base, int exp) — 幂运算
  6. 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;
}
逻辑代码 52 行(超过 40 行限制,仅展示)

输出:

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 需求分析

把之前的猜数字游戏改写成函数版:

  1. void printWelcome() — 打印欢迎信息
  2. int getSecretNumber() — 生成秘密数字
  3. int getGuess() — 获取用户猜测
  4. void printResult(int guess, int secretNumber) — 打印结果(大了/小了/对了)
  5. 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;
}
逻辑代码 50 行(超过 40 行限制,仅展示)

输出:

TEXT 📖 仅展示
想再玩一次吗?(y/n):
谢谢游玩,再见!
=========== 猜数字游戏 ===========
我想了一个 1-100 的数字,你来猜!
请输入你的猜测:
大了!再试试。
小了!再试试。
🎉 恭喜你!猜对了!
你一共猜了  次。


3. 实例三:简单的计算器(函数重载版)

(1) 3.1 需求分析

用函数重载实现计算器,支持 intdouble 两种类型。

▶ 示例 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;
}
逻辑代码 87 行(超过 40 行限制,仅展示)

输出:

TEXT 📖 仅展示
请选择(1-4):
没有学生数据!
平均分:
最高分:
再见!
错误:请输入 1-4 之间的数字!
=========== 学生成绩管理 ===========
1. 添加学生
2. 显示所有学生
3. 统计
4. 退出
学生数量已达上限!
请输入姓名:
请输入成绩:
添加成功!
没有学生数据!
=========== 学生列表 ==========
.  - 

❓ 常见问题

Q 什么时候应该把代码写成函数?
A > - 代码重复了 2 次以上 → 写成函数 > - 一段代码有明确的功能 → 写成函数(提高可读性) > - 需要复用 → 写成函数
Q 函数原型必须写吗?
A 如果函数定义在 main 之前,可以不用写函数原型。

📖 小节


📝 作业

  1. 基础题 (Difficulty ⭐): 把之前的"计算矩形面积"程序改写成函数版:

  2. 写一个函数 double calculateArea(double width, double height)

  3. main 里调用它

  4. 进阶题 (Difficulty ⭐⭐): 写一个程序,包含以下函数:

  5. int fibonacci(int n) — 返回斐波那契数列的第 n 项

  6. void printFibonacci(int n) — 打印前 n 项

  7. main 里让用户输入 n,调用这两个函数

  8. 挑战题 (Difficulty ⭐⭐⭐): 扩展"学生成绩管理"程序,添加以下功能:

  9. 删除学生(按姓名或序号)

  10. 按成绩排序(从高到低)

  11. 保存到文件 / 从文件读取(选做)


5. 🚀 下一步

恭喜你!Phase 2(函数)的所有课程都学完了。 接下来我们进入 Phase 3(数组、字符串、结构体),学习如何处理多个同类型的数据,以及 C++ 的字符串。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏