寒假作业(Ⅲ)—— 四则运算的小程序
寒假作业(Ⅲ)—— 四则运算的小程序
参与人:
前言
这是小豪我第一次与他人搭档来写程序,而且我们两人对于C++的认识也只能算是皮毛,并且没有任何算法学习与运用的经验,所以写起来可以说是摸爬滚打从头开始。基于此,也就更加加大了我们对于任务实行起来的困难程度。由于我们自身能力的限制,所以在后续的设计编写过程中,思路与算法基本上都是易于理解与运用的,设计的变量也尽可能一目了然,最后还是希望我们自己的程序能够尽可能的按照面对对象的思想来完成项目。
实现设计思路
我们将这个程序的设计分为四个部分:
- 完成界面的设计
- 完成随机题目的生成
- 设计判断用户输入正确与否的算法
- 将这些融入到一个项目之中
订立的编码规范
- d数组代表随机数
- c数组代表随机符号
- choice代表用户选择中英界面的符号
- answer数组代表用户输入结果
- randomd函数代表随机d数组的函数
- randomc函数代表随机c数组的函数
- gcd代表最大公约数函数
(按位子进去,以下的A1,B1,B3,C1是我们之前商量好的结果,并且附上我们讨论方向的截图)
- A1代表没有括号的函数
- B1代表包含第一个与第二个数的括号的函数
- B3代表包含第二个与第三个数的括号的函数
- C1代表包含第一个到第三个数的括号的函数
- D1代表包含第一个和第二个数,包含第三个数和第四个数的有两个括号的函数(由于太难所以放弃了)
程序的实现和结果测试的截图
Part 1 界面设计
这块是我负责的部分,不花费太多的时间就写完,后续由我的队友整合进我们的项目中
char calculate2::choice()
{
cout<<"Please choose the language that you need:(a.Simple Chinese; b.English)"<<endl; //2种语言的切换
int i;
char choice;
for(i=0;;i++)
{
cin>>choice;
if(choice=='a')
{cout<<"请输入你所想要的题目数(你可以输入'q'则结束程序):"<<endl;break;}
else if(choice=='b')
{cout<<"Please enter the number of texts you want(You can enter'q'to end the program):"<<endl;break;}
else
{cout<<"输入不当,请重新选择选项/Please select the option again if it is wrong"<<endl;continue;}
}
return choice;
}
else
if(ch=='q')break;
}
if(ch=='a')
{
cout<<"回答正确的的题数为 :"<<endl;
}
else if(ch=='b')
{
cout<<"The number of correct answers are:"<<endl;
}
cout<<count<<endl;
return 0;
}
以上部分实现的是中英文界面的切换以及输入'q' 程序结束并显示统计结果。
Part 2 随机题目的生成
这部分主要由凯翔来负责,在不太了解随机函数的情况下,我们通过百度一步步去认识以及解决后来的伪随机问题。由于是完全陌生,所以我们花了整整2天才完成了以下这些东西。
int calculate2::randomd(int d[])
{
d[0]=rand()%10+1; //整数数字随机函数
d[1]=rand()%10+1;
d[2]=rand()%10+1;
d[3]=rand()%10+1;
}
int calculate2::randomc(int c[])
{
int j;
for(j=0;;j++) //+,-,*,/的随机
{
c[0]=rand()%6+42;
if(c[0]!=44&&c[0]!=46)break;
}
for(j=0;;j++)
{
c[1]=rand()%6+42;
if(c[1]!=44&&c[1]!=46)break;
}
for(j=0;;j++)
{
c[2]=rand()%6+42;
if(c[2]!=44&&c[2]!=46)break;
}
}
这是我们一开始弄得(含随机生成括号),发现由于不懂伪随机的原理,所有随机的数字都呈现一个样子的情况。
到后来发现是种子的问题。最后终于可以做到完全随机(当时小激动了一番,因此忘了截图)
Part 3 判断用户的输入正确与否
这是我们本次合作项目主要需解决的问题,起初我们两个都还没找对方向。后来由于种种原因的关系,我们之间的交流一直达不到同步,导致我们的交流出现了一些障碍,不能够及时地去传达各自想要表达的思想。
一开始算法的设计由凯翔来操办,后来转由两人共同合作。
在这个过程中,我们设计了许多不同的版本,但总是会存在bug。在经历了不断地摸索测试修改以后,我们也增加进假分数的运算。总之一路走来实在是出现太多太多的小问题,中途也可以说磕磕绊绊,对程序的编写与修缮也可以说是进度缓慢,但合作的过程不可不谓一种奇妙的体验,不同的思想碰撞在一起,总会出现意料之外的收获,所以一路走来,我们有失落也有欢喜。
下面是我们设计的包含假分数的算法:
int calculate2::A1(int d[],int c[],int fenshu[])
{
int j;
cout<<d[0]<<char(c[0])<<d[1]<<char(c[1])<<d[2]<<char(c[2])<<d[3]<<'='<<endl;
int k=0;
for(j=0;j<3;j++)
{
if(c[j]==45) // '-'
{
d[j+1]=-d[j+1];
c[j]=43;
}
}
for(j=0;j<3;j++)
{
if(c[0]==47&&c[2]==47&&c[1]==43)
{
fenshu[0]=d[0]*d[3]+d[2]*d[1];
fenshu[1]=d[1]*d[3];
c[1]=0;
break;
}
if(c[j]==42)
{
d[j+1]*=d[j];
d[j]=0;
c[j]=43;
}
if(c[j]==47)
{
if(k==0)fenshu[0]=d[j];
fenshu[1]*=d[j+1];
d[j+1]=d[j];
d[j]=0;
k++; //防止分子被重置
if(c[j+1]==42)
{
fenshu[0]*=d[j+2];
j++;
}
}
}
for(j=0;j<3;j++)
{
if(c[j]==43)
{
if(j==0)
fenshu[0]+=d[0]*fenshu[1];
fenshu[0]+=d[j+1]*fenshu[1];
}
}
int r,x=fenshu[0],y=fenshu[1],t;
if(x>y){t=x;x=y;y=t;}
while(r!=0)
{
r=y%x;
y=x;
x=r;
}
fenshu[0]=fenshu[0]/y;
fenshu[1]=fenshu[1]/y;
}
int answer[2];
cin>>answer[0];
if(c[0]=='/'||c[1]=='/'||c[2]=='/')
{
if(fenshu[0]%fenshu[1]==0) //结果不一定有除号 ,可能是整数
if(answer[0]==fenshu[0]/fenshu[1])count++;
else
{
if(answer[0]==fenshu[0])
{
char fenhao;
cin>>fenhao;
if(fenhao=='/')
{
cin>>answer[1];
if(answer[1]==fenshu[1])count++;
}
}
}
}
实现出来的效果整体看来还算满意,没亏待我们的付出。
Part 4 整合
由于没有好好把握住时间,导致我们这个方面没有做好,虽然整合在了一起却老是无法运行。这也是本次项目最大的遗憾。
main函数主体
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include "calculate2.h"
using namespace std;
int main()
{
srand((unsigned)time(NULL));
calculate2 cal;
char ch;
ch=cal.choice();
int N,i;
cin>>N;
int d[4],c[3],count=0,fenshu[2]={1,1};
for(i=0;i<N;i++)
{
cal.randomd(d);
cal.randomc(c);
int k;
k=rand()%4;
switch(k) //随机4种函数类型
{
case 0:cal.A1(d,c,fenshu);break;
case 1:cal.B1(d,c,fenshu);break;
case 2:cal.B3(d,c,fenshu);break;
case 3:cal.C1(d,c,fenshu);break;
}
if(ch=='a')
{
cout<<"请输入你的答案:"<<endl;
}
else if(ch=='b')
{
cout<<"Please enter your answer :"<<endl;
}
int answer[2];
cin>>answer[0];
if(c[0]=='/'||c[1]=='/'||c[2]=='/')
{
if(fenshu[0]%fenshu[1]==0) //结果不一定有除号 ,可能是整数
if(answer[0]==fenshu[0]/fenshu[1])count++;
else
{
if(answer[0]==fenshu[0])
{
char fenhao;
cin>>fenhao;
if(fenhao=='/')
{
cin>>answer[1];
if(answer[1]==fenshu[1])count++;
}
}
}
}
else
if(ch=='q')break;
}
if(ch=='a')
{
cout<<"回答正确的的题数为 :"<<endl;
}
else if(ch=='b')
{
cout<<"The number of correct answers are:"<<endl;
}
cout<<count<<endl;
return 0;
}
calculate2.h文件
#ifndef CALCULATE1_H
#define CALCULATE1_H
class calculate2
{
public:
int A1(int d[],int c[],int fenshu[]);
int B1(int d[],int c[],int fenshu[]);
int B3(int d[],int c[],int fenshu[]);
int C1(int d[],int c[],int fenshu[]);
int randomd(int d[]);
int randomc(int c[]);
int calculate(int d[],int c[]);
char choice();
int gcd(int x,int y);
private:
int d[4];
int c[3];
};
#endif
calculate2.cpp的代码没有全部列出,详见附上的GitHub地址
Part 5 GitHub提交链接
四则运算的Github地址:Github 传送门
Part 6 小组分工和协作依据截图
一开始凯翔负责算法,我写界面。结果发现界面设计简单,而算法进度困难。于是我们决定合作着写,或许这也导致我们的效率过于低下。
谢谢观赏,以上就是我对于我们此次合作的总结,希望能得到大家的意见与指点,菜鸡小豪恭候大家的建议。