软件开发与创新——结对编程

larheiheihei / 2024-04-23 / 原文

本次结对编程作业由我和学号2252406的同学一起编写

一、题目:小学老师要求出300道四则运算练习题
要求:两个运算符,都是100以内的数字,答案在0-1000之间。
拓展功能:有除法时计算的结果保留两位小数,避免除0错误,回答错误的题目存到“错题本.txt”文件中,方便后续查看及改正。300道题全部答完之后会出现正确题目占比(为了能够及时的看出结果这里以3道题为例)
二、代码及截图

点击查看代码
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <cmath>
#include<fstream>

using namespace std;

// 生成随机整数
int RandomNumber(int min, int max) {
    return rand() % (max - min + 1) + min;
}

// 生成随机运算符
char RandomOperator() {
    char operators[] = { '+', '-', '*', '/' };
    return operators[rand() % 4];
}

//定义运算符优先级
int precedence(char op) {
    if (op == '+' || op == '-')
        return 1;
    if (op == '*' || op == '/')
        return 2;
    return 0;
}

// 执行四则运算
double performOperation(double num1, char op, double num2) {
    switch (op) {
    case '+':
        return num1 + num2;
    case '-':
        return num1 - num2;
    case '*':
        return num1 * num2;
    case '/':
        return num1 / num2;
    default:
        return 0.0;
    }
}


int main() {
    srand(time(0)); // 设置随机种子
    ofstream outfile("错题本.txt");
    const int numQuestions = 3; // 生成题目数量
    int correctCount = 0; // 记录答对数量
    cout << "加减乘除的四则运算";
    cout << "(所有结果均保留两位小数!)" << endl;
    // 生成并输出题目
    for (int i = 0; i < numQuestions; ++i) {
        int num1 = RandomNumber(1, 100);
        int num2 = RandomNumber(1, 100);
        int num3 = RandomNumber(1, 100);
        char op1 = RandomOperator();
        char op2 = RandomOperator();

        // 将运算符和数字转换为字符串
        string question = to_string(num1) + " " + op1 + " " + to_string(num2) + " " + op2 + " " + to_string(num3);

        // 计算答案
        double intermediateResult;
        double answer;
        if ((op1 == '/' && num2 == 0) || (op2 == '/' && num3 == 0)) {
            i--;
            continue; // 避免除零错误
        }
        else {
            if (precedence(op2) > precedence(op1)) {
                intermediateResult = performOperation(num2, op2, num3);
                answer = performOperation(num1, op1, intermediateResult);
            }
            else {
                intermediateResult = performOperation(num1, op1, num2);
                answer = performOperation(intermediateResult, op2, num3);
            }
        }
        if (answer < 0 || answer>1000)
        {
            i--;
            continue;
        }
        double reanswer = round(answer * 100) / 100;
        // 输出题目并要求用户输入答案
        cout << "--------------------------------------" << endl;
        cout << "第" << (i + 1) << "题" << ": " << question << " =  ";
        double userAnswer;
        cin >> userAnswer;

        // 判断答案是否正确
        if (userAnswer == reanswer) {
            cout << "回答正确!" << endl;
            correctCount++;
        }
        else {
            cout << "回答错误!" << endl;
            cout<<"正确答案为: " << reanswer << endl;
            outfile << "第" << (i + 1) << "题" << ": " << question << " =  " << endl << "错误答案:" << userAnswer << "   " << "正确答案:" << reanswer << endl;

        }
    }
    outfile.close();
    // 输出总体成绩
    cout << "-------------------------------" << endl;
    cout << "回答正确题目占比: " << correctCount << "/" << numQuestions << endl;
    cout << "注:错题已保留在“错题本.txt”中" << endl;
    cout << "-------------------------------";

    return 0;
}

三、总结
通过本次结对编程我们体会到看似简单的题目其实有很多细节问题需要注意,因为是两个人一起写一个项目,所以这里就明显的体现出注释的重要性。在面对同一个问题时由于两个人的想法不一致有很多种方法去解答,我们共同寻找最简单明了的方法。同时也通过老师提示一步一步去完成题目中的要求并且也拓展了一些内容,使页面具有个性化。在结对过程中,能力较强的同学可以将知识传授给能力较弱的同学;并且在编程过程中可以有效提高代码质量,减少错误的产生;还可以促进团队合作,增强小组成员的适应性和灵活性。