一. 引言
结对编程是一种高效的软件开发方法,它鼓励两名程序员共同编写代码。两个程序员在一台计算机上共同工作。一个人输入代码,另一个人在一旁审核他所写的每一行代码。一段时间后双方互换,一开始写代码的人成了“观察员”,换之前审核代码的程序员继续完成程序。
在此次结对编程中,我(2352303)和我的同伴(2352309)组队,目标是创建一个c++的四则运算程序。
二. 项目设想
我们俩初步讨论后,设想:
1.此程序两个运算符,100 以内的数字,不需要写答案。
2.需要检查答案是否正确,并且保证答案在 0..1000 之间
3.符合小学生水平,除法小数保留两位
4.页面简洁,易上手
5.将题目和答案保存到文件
三.代码编写与改进

点击查看代码
#include<iostream>
#include<cmath>
#include<vector>
#include<fstream>
#include<iomanip>
#include<cstdlib>
#include<ctime>
using namespace std;
int generatenumber(){
    return rand()%100+1;
}
char generateoperator(){
    int op=rand()%3;
    switch (op){
        case 0:return '+';
        case 1:return '-';
        case 2:return '*';
        
    }
    return '+';
}
bool isValidExpression(int a,char op1,int b){
    int result;
    if(op1=='+')
    result=a+b;
    else if(op1=='-')
    result=a-b;
    else if(op1=='*')
    result=a*b;
    return result>=0&&result<=1000;
}

string generateExpression(){
    int a=generatenumber();
    int b=generatenumber();
    char op=generateoperator();
    
    while(!isValidExpression(a,op,b)){
        a=generatenumber();
        b=generatenumber();
        op=generateoperator();
    }
    return to_string(a)+" "+op+" "+to_string(b);
}

int evaluateExpression(const string&expression){
    int a,b;
    char op;
    sscanf(expression.c_str(),"%d %c %d",&a,&op,&b);
    
    if(op=='+')
    return a+b;
    else if(op=='-')
    return a-b;
    else if(op=='*')
    return a*b;
    
    return 0;
}
int main(){
    srand(static_cast<unsigned int>(time(0)));
    int x;
    cout<<"生成数量:";
    cin>>x;
    vector<string>questions;
    vector<int>answers;
    for(int i=0;i<x;++i){
        string question=generateExpression();
        int answer=evaluateExpression(question);
        questions.push_back(question);
        answers.push_back(answer);
    }
    cout<<"题目"<<endl;
    for (int i=0;i<x;i++){
        cout<<i+1<<"."<<questions[i]<<"=";
        int u;
        cin>>u;
        if(u==answers[i]){
            cout<<"yes"<<endl;
        }else{
            cout<<"no!right is:"<<answers[i]<<endl;
        }
        
    }
    ofstream outfile("questions_and_answers.txt");
    if(outfile.is_open()){
        for(int i=0;i<x;++i){
            outfile<<questions[i]<<"="<<answers[i]<<endl;
        }
        outfile.close();
        cout<<"题目已保存到 questions_and_answers.txt"<<endl;
    }
    else{
        cout<<"无法保存"<<endl;
    }
    return 0;
}


这是一开始的代码,虽然能够运行,但当前代码只支持一种运算,且只生成二位数,我们开始讨论改进。
点击查看代码
#include <iostream>
#include <cmath>
#include <vector>
#include <fstream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <sstream> // 用于stringstream
using namespace std;

int generatenumber() {
    return rand() % 100 + 1;
}

char generateoperator() {
    int op = rand() % 3;
    switch (op) {
        case 0: return '+';
        case 1: return '-';
        case 2: return '*';
    }
    return '+';
}

bool isValidExpression(int a, char op1, int b, char op2, int c) {
    // 按照运算优先级计算结果
    int result;
    if (op1 == '+') {
        if (op2 == '+') result = a + b + c;
        else if (op2 == '-') result = a + b - c;
        else result = a + b * c;
    }
    else if (op1 == '-') {
        if (op2 == '+') result = a - b + c;
        else if (op2 == '-') result = a - b - c;
        else result = a - b * c;
    }
    else { // op1 is '*'
        if (op2 == '+') result = a * b + c;
        else if (op2 == '-') result = a * b - c;
        else result = a * b * c;
    }
    
    return result >= 0 && result <= 1000;
}

string generateExpression() {
    int a = generatenumber();
    int b = generatenumber();
    int c = generatenumber();
    char op1 = generateoperator();
    char op2 = generateoperator();
    
    // 确保两个运算符不相同
    while (op1 == op2) {
        op2 = generateoperator();
    }
    
    // 确保表达式结果合法
    while (!isValidExpression(a, op1, b, op2, c)) {
        a = generatenumber();
        b = generatenumber();
        c = generatenumber();
        op1 = generateoperator();
        op2 = generateoperator();
        while (op1 == op2) {
            op2 = generateoperator();
        }
    }
    
    // 使用stringstream替代to_string
    stringstream ss;
    ss << a << " " << op1 << " " << b << " " << op2 << " " << c;
    return ss.str();
}

int evaluateExpression(const string &expression) {
    int a, b, c;
    char op1, op2;
    sscanf(expression.c_str(), "%d %c %d %c %d", &a, &op1, &b, &op2, &c);
    
    // 按照运算优先级计算结果
    int result;
    if (op1 == '+') {
        if (op2 == '+') result = a + b + c;
        else if (op2 == '-') result = a + b - c;
        else result = a + b * c;
    }
    else if (op1 == '-') {
        if (op2 == '+') result = a - b + c;
        else if (op2 == '-') result = a - b - c;
        else result = a - b * c;
    }
    else { // op1 is '*'
        if (op2 == '+') result = a * b + c;
        else if (op2 == '-') result = a * b - c;
        else result = a * b * c;
    }
    
    return result;
}

int main() {
    srand(static_cast<unsigned int>(time(0)));
    
    int x;
    cout << "请输入题目数量(最多300道):";
    cin >> x;
    
    // 限制题目数量在300以内
    if (x > 300) {
        cout << "题目数量超过限制,已调整为300道" << endl;
        x = 300;
    }
    
    vector<string> questions;
    vector<int> answers;
    
    for (int i = 0; i < x; ++i) {
        string question = generateExpression();
        int answer = evaluateExpression(question);
        questions.push_back(question);
        answers.push_back(answer);
    }
    
    cout << "题目如下:" << endl;
    for (int i = 0; i < x; i++) {
        cout << i + 1 << "." << questions[i] << "=";
        int u;
        cin >> u;
        if (u == answers[i]) {
            cout << "yes" << endl;
        }
        else {
            cout << "no!正确答案是:" << answers[i] << endl;
        }
    }
    
    ofstream outfile("questions_and_answers.txt");
    if (outfile.is_open()) {
        for (int i = 0; i < x; ++i) {
            outfile << questions[i] << "=" << answers[i] << endl;
        }
        outfile.close();
        cout << "题目已保存到 questions_and_answers.txt" << endl;
    }
    else {
        cout << "无法保存题目" << endl;
    }
    
    return 0;
}

最终代码 1.生成包含三个操作数和两个运算符的表达式,运算符优先级会被考虑。

2.使用 generateoperator() 生成两个不同的运算符(确保 op1 != op2)

3.限制题目数量最多 300 道,并提示用户。
四. 代码功能演示

五.总结与心得
结对编程时,两个人共同完成一个程序可以避免个人误区。且通常个人的想法难免有局限性,双方站在不同的角度能够看到彼此在思考上的差异,从其中选择更为优秀的思想对整个程序的开发过程是有极大好处的。当然,通过结对,代码经另一个程序员审查,使得整个程序的设计,测试和编程过程都更加高效且一定程度上保证了质量。
通过本次结对编程实践,我们共同编写了一个简单的c++四则运算应用。在编写代码的过程中,我们不断交流、讨论和反馈,确保代码逻辑正确且符合需求。同时,我们也发现了潜在的问题并提出了改进建议。结对编程不仅提高了我们的编程效率,还让我们学会了如何更好地合作和沟通。
在未来的开发中,我们将继续采用结对编程的方法,不断提高代码质量和开发效率。同时,我们也将不断探索新的编程技术和工具,以应对更加复杂的开发需求。

posted on 2025-04-15 10:27  951357456852  阅读(38)  评论(0)    收藏  举报