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

实验目的

本次学习的任务是通过两人结对编程(一个人Coding,一个人审核)的方式,来体会团队合作的过程。本次实验由我和2230232共同完成。

编程题目

小学老师要每周给同学出300道四则运算练习题。
–这个程序有很多种实现方式:
C/C++
C#/VB.net/Java
Excel
Unix Shell
Emacs/Powershell/Vbscript
Perl
Python
– 两个运算符,100 以内的数字,不需要写答案。
– 需要检查答案是否正确,并且保证答案在 0..100 之间
– 尽可能地多设置一些条件

项目实现过程

本次项目我们通过讨论决定使用C++语言进行编写。我们通过C++中头文件实现随机生成数字,通过getPriority()函数生成随机生成计算式,为了确保计算结果最终在0~100之间,我们设置了一个循环调用getAnswer(int a, string op, int b)函数来确保该计算式的结果是在0~100以内,若答案超过这个范围则重新生成计算式。在答题结束后通过displayAnswers()函数来显示答题的题目。但是在实际使用中发现打印出的答案和题目使用一个颜色,所以我们经过讨论使用<windows.h>头文件中的SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE);来设置答案的颜色,使得更方便区分,也易于使用。

项目实现的功能

  1. 输出需要的计算式数量,随机生成需要数量的计算式。
  2. 作答完成后统计正确数量
  3. 输出打印正确的答案

运行截图


实验代码

#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <random>
#include <algorithm>
#include <windows.h>

using namespace std;

class Project {
public:
    int M = 3;
    static const int N = 301;
    int a[N];
    int b[N];
    int c[N];
    float ans[N];
    float check[N];
    int w[N];
    bool flag;
    map<string, int> opMap;
    string op[4] = {"+", "-", "*", "/"};
    string ch1[N];
    string ch2[N];

int getAnswer(int a, string op, int b) {
    if (a < 0 || b < 0) return -1;  // 如果a或b小于0,则返回-1
    if (a > 100 || b > 100) return -1;  // 如果a或b大于100,则返回-1
    if (op == "+") {
        if (a + b > 100) return -1;  // 如果加法结果大于100,则返回-1
        return (a + b);
    }
    if (op == "-") {
        if (a - b < 0) return -1;  // 如果减法结果小于0,则返回-1
        return (a - b);
    }
    if (op == "*") {
        if (a * b > 100) return -1;  // 如果乘法结果大于100,则返回-1
        return (a * b);
    }
    if (op == "/") {
        if (b == 0 || a % b != 0 || a / b > 100) return -1;  // 若b为0或a不能整除b或除法结果大于100,则返回-1
        return (a / b);
    }
    return 0;
}



    void displayAnswers() {
        cout << "正确答案如下:" << endl;
        for (int i = 1; i <= M; i++) {
            int correctAnswer = getAnswer(a[i], ch1[i], b[i]);
            //调用此方法设置参数
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE);
            correctAnswer = getAnswer(correctAnswer, ch2[i], c[i]);
            cout << "(" << i << ") " << a[i] << ch1[i] << b[i] << ch2[i] << c[i] << "=" ;
            //调用此方法设置参数
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
            cout<< correctAnswer << endl;
        }
    }







void getPriority() {
    opMap["+"] = 0;
    opMap["-"] = 0;
    opMap["*"] = 1;
    opMap["/"] = 1;

    random_device rd;
    mt19937 gen(rd());
    for (int i = 0; i <= M; i++) {
        //设置一个循环,确保生成的计算式计算结果在0~100之间
        flag = false;
        while (!flag) {
            a[i] = gen() % 101;
            b[i] = gen() % 101;
            c[i] = gen() % 101;
            ch1[i] = op[gen() % 4];
            ch2[i] = op[gen() % 4];
            int result = getAnswer(a[i], ch1[i], b[i]);
            result = getAnswer(result, ch2[i], c[i]);
            if (result >= 0 && result <= 100) {
                ans[i] = result;
                flag = true;
            }
        }
    }
}


public:
    Project() {
        getPriority();
    }

    int getM() {
        return M;
    }

    void setM(int m) {
        M = m;
    }

    int* getA() {
        return a;
    }

    int* getB() {
        return b;
    }

    int* getC() {
        return c;
    }

    float* getAns() {
        return ans;
    }

    float* getCheck() {
        return check;
    }

    int* getW() {
        return w;
    }

    bool isFlag() {
        return flag;
    }

    map<string, int> getOpMap() {
        return opMap;
    }

    string* getOp() {
        return op;
    }

    string* getCh1() {
        return ch1;
    }

    string* getCh2() {
        return ch2;
    }
};

int main() {
    int t;

    Project pj = Project();
    cout << "请输入您要出的题目数量" << endl;
    cin >> t;
    pj.setM(t);
    pj.getPriority();
    int num = 0;
    cout << "请依次输入答案,按回车自动进入下一道题" << endl;
    for (int i = 1; i <= pj.getM(); i++) {
        cout << "(" << i << ") " << pj.getA()[i] << pj.getCh1()[i] << pj.getB()[i] << pj.getCh2()[i] << pj.getC()[i] << "=";
        cin >> pj.getCheck()[i];
        if (pj.getCheck()[i] != pj.getAns()[i])
            pj.getW()[++num] = i;
    }
    cout << "您一共答对" << (pj.getM() - num) << "道题" << "答错" << num << "道题" << endl;
    pj.displayAnswers();

    return 0;
}
posted @   Z045  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示