一. 引言
结对编程是一种高效的软件开发方法,它鼓励两名程序员共同编写代码。两个程序员在一台计算机上共同工作。一个人输入代码,另一个人在一旁审核他所写的每一行代码。一段时间后双方互换,一开始写代码的人成了“观察员”,换之前审核代码的程序员继续完成程序。
在此次结对编程中,我(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;
}

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

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

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