结对编程——100以内加减乘除

前言
按照结对编程的原则,我(2252627)和我的合作伙伴(2252616)两人进行了结对编程,我们共同完成的项目的是小学的四则运算,通过随机生成四则运算题目,供学生答题,并在学生提交答案后进行自动评定,返回正误。经过讨论,我们采用了C++语言作为开发语言,并选取Dev C++5.11作为开发环境。

功能要求
小学老师要每周给同学出300道四则运算练习题。
–这个程序有很多种实现方式:
C/C++
C#/VB.net/Java
Excel
Unix Shell
Emacs/Powershell/Vbscript
Perl
Python
–两个运算符,100 以内的数字,不需要写答案。

–需要检查答案是否正确,并且保证答案在 0..100 之间

–尽可能地多设置一些条件
创新性:
程序增加了文件读写功能,能将做错了的题目写入错题本.txt文件里;
在算式中如果出现除法运算,算式能保证不出现小数;
程序保证每一个算式的结果都是0到100之间的整数;
程序对非法输入有特殊处理,所有输入用string保存用getline函数获取,防止程序发生错误,提高了程序的健壮性;
程序对回答者的正确率进行了计算,并进行针对性的评价;
回答出错的时候出现会"暂停"等待回答者思考;
程序保证所有合法的算式都能出现,且概率均等。

设计思路
实现我们讨论了程序应该实现的功能和程序框架,然后由我负责编程,2252616同学建设性的提出了具体的实现框架,决定了要实现的功能以及如何实现。随后,我正式开始了编程,我们在编程过程中始终保持无障碍沟通,最终实现了四则运算的题目。
具体代码如下:

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <fstream>//文件读写功能 
using namespace std; 
char fuhao[2];//选择的运算符 
char jjcc[4]={'+','-','*','/'};//用于随机运算符时选择 
int num[3];//随机选择的数字 
int yes=0;//所选择的算式正确计算时的结果 
string ANT;//输入的内容,用字符串存储,防止非法输入 
int ant=0;//由ANT转换成的数字 
int getRand(int min, int max) //返回min到max之间的随机数,左闭右闭区间
{
    return ( rand() % (max - min + 1) ) + min ;
}
bool ooo(int a1,char b1,int a2,char b2,int a3)//判断生成的表达式结果在不在0到100之间 
{//yes为该算式的结果 
	if(fuhao[0]=='+'&&fuhao[1]=='+')
		{yes=a1+a2+a3;return a1+a2+a3>=0&&a1+a2+a3<=100;}
	if(fuhao[0]=='+'&&fuhao[1]=='-')
		{yes=a1+a2-a3;return a1+a2-a3>=0&&a1+a2-a3<=100;}
	if(fuhao[0]=='+'&&fuhao[1]=='*')
		{yes=a1+a2*a3;return a1+a2*a3>=0&&a1+a2*a3<=100;}
	if(fuhao[0]=='+'&&fuhao[1]=='/')
		{yes=a1+a2/a3;return a1+a2/a3>=0&&a1+a2/a3<=100;}
		
	if(fuhao[0]=='-'&&fuhao[1]=='+')
		{yes=a1-a2+a3;return a1-a2+a3>=0&&a1-a2+a3<=100;}
	if(fuhao[0]=='-'&&fuhao[1]=='-')
		{yes=a1-a2-a3;return a1-a2-a3>=0&&a1-a2-a3<=100;}
	if(fuhao[0]=='-'&&fuhao[1]=='*')
		{yes=a1-a2*a3;return a1-a2*a3>=0&&a1-a2*a3<=100;}
	if(fuhao[0]=='-'&&fuhao[1]=='/')
		{yes=a1-a2/a3;return a1-a2/a3>=0&&a1-a2/a3<=100;}
		
	if(fuhao[0]=='*'&&fuhao[1]=='+')
		{yes=a1*a2+a3;return a1*a2+a3>=0&&a1*a2+a3<=100;}
	if(fuhao[0]=='*'&&fuhao[1]=='-')
		{yes=a1*a2-a3;return a1*a2-a3>=0&&a1*a2-a3<=100;}
	if(fuhao[0]=='*'&&fuhao[1]=='*')
		{yes=a1*a2*a3;return a1*a2*a3>=0&&a1*a2*a3<=100;}
	if(fuhao[0]=='*'&&fuhao[1]=='/')
		{yes=a1*a2/a3;return a1*a2/a3>=0&&a1*a2/a3<=100;}
	
	if(fuhao[0]=='/'&&fuhao[1]=='+')
		{yes=a1/a2+a3;return a1/a2+a3>=0&&a1/a2+a3<=100;}
	if(fuhao[0]=='/'&&fuhao[1]=='-')
		{yes=a1/a2-a3;return a1/a2-a3>=0&&a1/a2-a3<=100;}
	if(fuhao[0]=='/'&&fuhao[1]=='*')
		{yes=a1/a2*a3;return a1/a2*a3>=0&&a1/a2*a3<=100;}
	if(fuhao[0]=='/'&&fuhao[1]=='/')
		{yes=a1/a2/a3;return a1/a2/a3>=0&&a1/a2/a3<=100;}
}
void qwer()//初始化算式,并保证算式符合题目要求 
{
	fuhao[0]=jjcc[getRand(0,3)];
	fuhao[1]=jjcc[getRand(0,3)];//随机生成两个运算符 
    if(fuhao[0]!='/'&&fuhao[1]!='/')//这两个运算符里面没有除法 
    {
    	ddd:
    	num[0]=getRand(1,100);
    	num[1]=getRand(1,100);
    	num[2]=getRand(1,100);//随机弄三个整数 
    	if(!ooo(num[0],fuhao[0],num[1],fuhao[1],num[2])) goto ddd;
		//检查这个算式的结果符不符合要求 ,不符合则重新生成随机数
	}
	else//算式有除法,需要保证每一步的结果均为整数 
    {
    	if(fuhao[0]=='/'&&fuhao[1]=='/')//a/b/c
    	{
    		fff:
			num[0]=getRand(1,100);
    		num[1]=getRand(1,100);
    		num[2]=getRand(1,100);
    		if(num[0]%num[1]!=0||(num[0]/num[1])%num[2]!=0)  goto fff; 
    		//检查这个算式的每一步的结果是否均为整数 ,不符合则重新生成随机数
    		if(!ooo(num[0],fuhao[0],num[1],fuhao[1],num[2])) goto fff;
    		//检查这个算式的结果符不符合要求 ,不符合则重新生成随机数
    	}
    	if(fuhao[0]=='/'&&fuhao[1]!='/')//a/b?c
    	{
    		ggg:
			num[0]=getRand(1,100);
    		num[1]=getRand(1,100);
    		num[2]=getRand(1,100);
    		if(num[0]%num[1]!=0)  goto ggg; 
    		//检查这个算式的每一步的结果是否均为整数 ,不符合则重新生成随机数
    		if(!ooo(num[0],fuhao[0],num[1],fuhao[1],num[2])) goto ggg;
    		//检查这个算式的结果符不符合要求 ,不符合则重新生成随机数
    	}
    	if(fuhao[0]!='/'&&fuhao[1]=='/')//a?b/c
    	{
    		hhh:
		    num[0]=getRand(1,100);
    	    num[1]=getRand(1,100);
    	    num[2]=getRand(1,100);
    	    if(fuhao[0]=='+'&&num[1]%num[2]!=0)  goto hhh; 
    	    if(fuhao[0]=='-'&&num[1]%num[2]!=0)  goto hhh;
    	    if(fuhao[0]=='*'&&(num[0]*num[1])%num[2]!=0)  goto hhh;
    	    //检查这个算式的每一步的结果是否均为整数 ,不符合则重新生成随机数
    	    if(!ooo(num[0],fuhao[0],num[1],fuhao[1],num[2])) goto hhh;
    	    //检查这个算式的结果符不符合要求 ,不符合则重新生成随机数
    	}
	}
}
bool BBB(string s)//将输入的字符串转换为数字放如ant里,并判断是否有非法输入 
{
	if(s.size()==0)return false; //防止输入为空(按Enter键) 时发生错误 
	int q=1;
	for(int i=s.size()-1;i>=0;i--)//将储存在字符串里的数字转换为数字 
	{
		if(s[i]-'0'>=0&&s[i]-'0'<=9)
		{
		    ant=ant+(s[i]-'0')*q;
		    q=q*10;
		}
		else
		    return false;
	}
	return true;
}


int main() 
{
    srand(time(0));
    int t=300;//最大答题数目 
	float YES=0;//正确的个数 
    cout<<"**************欢迎来到100内加减乘除程序**************\n"; 
    cout<<"输入n或者N退出程序\n\n";
    while(t--)//循环300次
    {
    	qwer();//qwer函数初始化算式并保证生成的算式符合要求
    	cout<<"问题:"<<num[0]<<fuhao[0]<<num[1]<<fuhao[1]<<num[2]<<endl;
    	ttt:
		cout<<"在这里写出你的答案:";
		getline(cin,ANT);//获取输入 
		if(ANT=="N"||ANT=="n")break;//提前结束 
		if(!BBB(ANT))//是否正确输入? 
		{
			cout<<"非法输入,请重新输入正确的值!\n";
			ant=0; 
			goto ttt;//回答上一步重新输入 
		}
		if(ant==yes)//回答正确 
		{
			cout<<"恭喜你!回答正确。"<<endl;YES++;
		}
		else//回答错误 
		{
		    fstream f; 
	        f.open("错题本.txt",ios::out|ios::app);//追加写入,如果没有则创建
	        //文件读写的实现,将做题信息写入文件中 
            f<<num[0]<<" "<<fuhao[0]<<" "<<num[1]<<" "<<fuhao[1]<<num[2]<<endl;
			f<<"正确回答:"<<yes<<endl<<"你的错误回答:"<<ant<<endl<<endl<<endl; 
            f.close();
			cout<<"很遗憾,回答错误。该算式的正确答案为:"<<yes<<endl;
			cout<<"已将该题目加入错题本内……\n按Eeter键继续回答……";
			getchar(); //“暂停”效果 
		}
		cout<<endl<<endl;
		ant=0;
	}
	YES=YES/(300-t);//计算正确率 
	printf("\n正确率为:%.2f",YES*100); 
	if(YES>=0.9)cout<< "%,你真棒!";
	if(YES>=0.6&&YES<0.9)cout<<"%,继续努力!";
	if(YES<0.6)cout<<"%,要加油了"; 
    return 0;
}

运行效果
程序运行:

文件写入效果展示:

文件结构展示:

感悟
结对编程让我们明白了合作的重要性。在编程过程中,有时候一个人可能很难快速找到解决方案。但是,当两个人一起思考时,我们可以互相启发,共同找到问题的症结所在,从而更快地解决问题。这种合作不仅提高了我们的工作效率,还让我们在解决问题的过程中更加深入地理解了编程知识。
在本次结对编程过程中,也出现了一些问题。例如,有时候两个人的想法可能不一致,导致在解决问题上产生分歧。但是,我认为这正是结对编程的意义和价值所在。通过沟通和讨论,我们可以学会尊重对方的意见,学会在团队中寻求共识,这对于我们未来的职业发展是非常有益的。
在我们看了,这种相互交流,共勉共进的方式可以促进双方的的共同进步,不仅仅提高了我们的编程效率和技能,还促进我们之间的沟通和合作。

posted @ 2024-04-17 14:05  壹贰叁肆伍陆柒  阅读(7)  评论(0编辑  收藏  举报