结对开发——四则运算(三)
发表日期时间: 2016-03-19 10:17
一、题目及题目要求
编程随机生成四则运算,算数包括整数和真分数 1.题目避免重复
2.可定制(数量/打印方式) 3.可以控制下列参数:
是否有乘除法;
是否有括号(最多可以支持十个数参与运算); 数值范围; 加减有无负数; 除法有无余数。 4.输入结果并判断正确 二、设计思路
在上次程序的基础上进行修改,
1.题目避免重复:为避免随机数每次相同用了srand函数。
2.可定制出题数量:通过键盘输入数字,在for循环中控制循环次数。 3. 是否有乘除法:把算符分为两大类,利用case语句选择前四种加和减,后四种乘除。
4. 数值范围:在产生随机数时通过输入控制rand函数的参数,从而使运算数不超过此范围。
5. 加减有无负号:结果无负数,判断两操作数,第一操作数若比第二操作数小,则第二个减第一个。
6.除法有无余数:除法无余数,判断第一操作数模第二操作数的结果,若为0即可输出,否则再循环一次。
7.是否有括号:先随机生成一个数字,代表着生成表达式中操作数的个数。再循环生成一个数字,将其输出,然后等概率生成‘+’‘-’‘*’‘/’中的一个跟在该数字后面,输出。以一定概率生成左括号,若生成了左括号则输出,并进行计数标志当前共有多少个未完成匹配的左括号。若当前有未完成匹配的左括号,则在生成一个数字后,生成一个操作符前,以一定的概率生成右括号。在生成完毕后,生成最后一个数并将为匹配的左括号予以匹配。把产生的式子存入文件。
8.输入结果并判断正确:(1)对于两个运算数的式子,把结果存入数组,调用函数与数组中的值比较。(2)对于多个运算数的式子,从文件中读取内容,利用中缀表达式转换为后缀表达式,然后就是后缀表达式的计算,最后与用户输入结果对比。 三、代码 #include
#define length 10000//存放答案数组长度 using namespace std; typedef long long ll; ofstream fout(\char Op[] = {'+', '-', '*', '/'}; int rights;//对题数目 int wrong;//错题数目
struct num{
ll numerator, denominator;
num(){numerator = 0; denominator = 1;} num(int n) {numerator = n; denominator = 1;} num(int n,int d) {numerator = n; denominator = d;}
void operator = (num x) {
numerator = x.numerator; denominator = x.denominator; } };
#define maxl 1005
char nifix[maxl], post[maxl]; char ans[maxl]; int cnt_right, cnt_wrong; bool error;
num res, rst;
//****分数类***// class fraction { private:
int above; //分子 int below; //分母 void reduction(); //约分
fraction makeCommond(fraction); //通分 public: fraction()
{ //构造函数 }
fraction add(fraction); //两分数相加 fraction sub(fraction); //两分数相减 fraction mul(fraction); //两分数相乘 fraction div(fraction); //两分数相除 int display(int,int); //显示分数 void setvalue(int ,int); //存储分数 };
//***********分数的约分*********//
void fraction::reduction() {
int i,comdiv,small,max; if(above small=above; max=below; } else { small=below; max=above; } for(i=small;i>1;i--) { if((small%i==0 )&(max%i==0) ) break; } comdiv=i; //最大公约数 if(i!=0) { above/=i; below/=i; } } //*************分数的通分*************// fraction fraction::makeCommond(fraction frac) { int b1=below,b2=frac.below, m,s; if(b1>b2) { m=b12; s=b2; } else { m=b2±; s=b1; } while(m>0) { int res=s%m; s=m,m=res; } int small=(b1*b2)/s; above=above*(small/below); frac.above=frac.above*(small/frac.below); below=small; frac.below=small; return frac; } //***************分数的相加*************// fraction fraction::add(fraction fr) { fraction myFraction; myFraction.above=above*fr.below+fr.above*below; myFraction.below=below*fr.below; myFraction.reduction(); return myFraction; } //*********************分数的相减***************// fraction fraction::sub(fraction fr) { fraction myFraction; myFraction.above=above*fr.below-fr.above*below; myFraction.below=below*fr.below; myFraction.reduction(); return myFraction; } //*******************分数的相乘****************//