项目介绍
项目引言
在学习编程的道路上,理论知识与实践项目相辅相成,而结对编程更是加速成长、深化理解的有效方式,对于两个可能编程风格和速度截然不同的人,想要共同完成一个项目就不得不需要沟通、设计和互相借鉴学习。近期,我与搭档(学号2352313)携手合作,共同完成了一个 C++ 编写的四则运算测验程序。通过两人思维的碰撞与技术的互补,我们不仅巩固了 C++ 编程的各类知识,还收获了团队协作的宝贵经验。该程序能够生成包含两个运算符的四则运算题目,引导用户进行答题,并在测验结束后给出得分与个性化评价,是一个兼具实用性与学习价值的小项目。接下来,我将详细分享我们在结对编程过程中的设计思路、代码实现与实践感悟 。
功能需求
1.能够随机生成包含两个运算符的四则运算题目,运算符包括加、减、乘、除。
2.确保生成的题目符合数学规则,例如除数不能为零,减法结果不能为负数,除法结果必须为整数。
3.能够让用户输入答案,并判断答案是否正确。
4.记录用户的正确答题数量,并计算得分。
5.根据用户的得分给出相应的评价。
用户需求
1.在学校教育体系中,四则运算是数学学科最基础且重要的内容。小学阶段,学生需要通过大量练习来熟练掌握整数的加减乘除运算,打好数学基础;初中阶段,运算的复杂性提升,包含小数、分数等类型,对运算的准确性和速度都有更高要求。此程序可以为学生提供个性化的练习方式,学生通过输入题目数量,能够自主安排学习强度,在课后进行针对性的训练,从而提高课堂知识的掌握程度,在考试中取得更好成绩。同时,程序即时反馈答案正误和最终得分评价的功能,能让学生快速了解自己的学习效果,及时发现知识薄弱点。
2.教师在教学过程中,常常需要为学生布置适量的四则运算练习题。传统方式下,教师需要手动编写题目,耗时耗力。使用本程序,教师可以根据教学进度和学生的实际水平,输入合适的题目数量,快速生成大量符合要求的四则运算题目,用于课堂练习、课后作业或测验。而且,程序统一的评分和评价标准,也能为教师评估学生学习情况提供参考,减轻教师的教学负担,提高教学效率。
3.家长在辅导孩子学习四则运算时,往往缺乏系统的练习资源。借助这个程序,家长可以根据孩子的学习状态和能力,灵活调整题目数量,为孩子制定专属的学习计划。在孩子完成练习后,家长能够通过程序给出的得分和评价,直观了解孩子的学习效果,有针对性地进行辅导和强化训练,助力孩子提升数学运算能力。
设计思路
整体架构
数据结构
使用 std::mt19937 作为随机数生成器,确保生成的随机数具有较好的随机性。
使用 std::vector<char> 存储运算符,方便随机选择运算符。
使用 std::stringstream 来拼接题目字符串。
算法设计
随机数生成:使用 std::uniform_int_distribution 生成 1 到 100 之间的随机整数。
题目生成:通过循环不断生成随机的运算符和操作数,直到生成的题目符合数学规则和结果范围要求。
结果计算:根据运算符的优先级,先计算乘法和除法,再计算加法和减法。
代码实现
代码设计
以下是该项目的代码设计:
#include <iostream>
#include <string>
#include <vector>
#include <random>
#include <ctime>
#include <stdexcept>
#include <sstream>
#include <iomanip>
#include <limits>
class MathQuiz {
private:
std::mt19937 rng;
const std::vector<char> operators{ '+', '-', '*', '/' };
int randomNum() {
std::uniform_int_distribution<int> dist(1, 100);
return dist(rng);
}
bool isDivisible(int a, int b) {
return (b != 0) && (a % b == 0);
}
int calculateResult(int num1, char op1, int num2, char op2, int num3) {
int part1, part2, result;
if ((op1 == '+' || op1 == '-') && (op2 == '*' || op2 == '/')) {
part2 = (op2 == '*') ? num2 * num3 : num2 / num3;
result = (op1 == '+') ? num1 + part2 : num1 - part2;
}
else {
switch (op1) {
case '+': part1 = num1 + num2; break;
case '-': part1 = num1 - num2; break;
case '*': part1 = num1 * num2; break;
case '/': part1 = num1 / num2; break;
}
switch (op2) {
case '+': result = part1 + num3; break;
case '-': result = part1 - num3; break;
case '*': result = part1 * num3; break;
case '/': result = part1 / num3; break;
}
}
return result;
}
public:
MathQuiz() {
rng.seed(std::time(nullptr));
}
// 修改了返回类型,避免使用结构化绑定
void generateProblem(std::string& problem, int& answer) {
int num1, num2, num3;
char op1, op2;
bool valid;
do {
valid = true;
std::uniform_int_distribution<int> opDist(0, 3);
op1 = operators[opDist(rng)];
op2 = operators[opDist(rng)];
num1 = randomNum();
num2 = randomNum();
num3 = randomNum();
if (op1 == '/' && !isDivisible(num1, num2)) {
valid = false;
continue;
}
if (op2 == '/') {
if (op1 == '+' || op1 == '-') {
int temp = (op1 == '+') ? num1 + num2 : num1 - num2;
if (!isDivisible(temp, num3)) {
valid = false;
continue;
}
}
else {
if (!isDivisible(num2, num3)) {
valid = false;
continue;
}
}
}
if (op1 == '-' && num1 < num2) {
valid = false;
continue;
}
if (op2 == '-') {
if (op1 == '+' || op1 == '-') {
int temp = (op1 == '+') ? num1 + num2 : num1 - num2;
if (temp < num3) {
valid = false;
continue;
}
}
else {
if (num2 < num3) {
valid = false;
continue;
}
}
}
answer = calculateResult(num1, op1, num2, op2, num3);
if (answer < 0 || answer > 1000) {
valid = false;
}
} while (!valid);
std::stringstream ss;
ss << num1 << " " << op1 << " " << num2 << " " << op2 << " " << num3;
problem = ss.str();
}
void runQuiz(int numProblems) {
int correctAnswers = 0;
std::cout << "\n四则运算测验开始!共 " << numProblems << " 题。\n\n";
for (int i = 0; i < numProblems; ++i) {
std::string problem;
int answer;
generateProblem(problem, answer); // 修改了调用方式
int userAnswer;
std::cout << "第 " << i + 1 << " 题: " << problem << " = ? ";
while (!(std::cin >> userAnswer)) {
std::cout << "请输入一个有效的整数: ";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
std::cin.ignore(); // 清除换行符
if (userAnswer == answer) {
std::cout << "✓ 正确!\n";
correctAnswers++;
}
else {
std::cout << "✗ 错误!正确答案是: " << answer << "\n";
}
std::cout << std::endl;
}
double score = static_cast<double>(correctAnswers) / numProblems * 100;
std::cout << "测验结束!\n";
std::cout << "你的得分: " << correctAnswers << "/" << numProblems
<< " (" << std::fixed << std::setprecision(1) << score << "%)\n";
if (score == 100) {
std::cout << "六百六十六你真的会做\n";
}
else if (score >= 80) {
std::cout << "有点东西,但不多\n";
}
else if (score >= 60) {
std::cout << "一般\n";
}
else {
std::cout << "纯飞舞,菜就多练\n";
}
}
};
int main() {
MathQuiz quiz;
int numProblems;
std::cout << "四则运算练习题与测验系统\n";
std::cout << "请输入要回答的题目数量: ";
std::cin >> numProblems;
if (std::cin.fail() || numProblems <= 0) {
std::cerr << "请输入一个有效的正整数" << std::endl;
return 1;
}
quiz.runQuiz(numProblems);
return 0;
}







浙公网安备 33010602011771号