if (b.numerator == 0) //如果除的是0,则出现除法错误,返回 return true;
c.numerator = a.numerator * b.denominator; c.denominator = a.denominator * b.numerator; }
else //其他情况则出错 return true;
if (c.numerator != 0) //若结果不为0,则对分子分母约分 {
ll div = gcd(c.denominator, c.numerator); c.denominator /= div; c.numerator /= div; }
s.push(c); //将约分后结果入栈 } }
if (s.size() > 1) //如果所有操作符都进行相应操作数后栈内还有多个元素,则说明出错,返回 return true;
res = s.top(); //保存结果 s.pop();
if (res.denominator < 0) //化简结果,将分母的负号移到分子上 {
res.numerator = -res.numerator; res.denominator = -res.denominator; }
return false; }
bool trans_ans() { int i = 0; ll tmp = 0;
//两个标志位分别标志用户输入的分子分母是否为负数
bool num_flag = false, deno_flag = false; //先判断分子是否为负 if (ans[i] == '-') {
num_flag = true; i++; }
//接收第一个数字 while(isNum(ans[i])) {
tmp = tmp * 10 + (ans[i] - '0'); i++; }
//若第一个数为负数,则将转化过来的整数取负 if (num_flag) tmp = -tmp; //保存分子 rst.numerator = tmp; //分母赋初值为1 rst.denominator = 1; tmp = 0;
//判断是否是分数 if (ans[i] == '/') {
//判断分母是否为负数 if (ans[++i] == '-') {
deno_flag = true; i++; }
//接收第二个数 while(isNum(ans[i])) {
tmp = tmp * 10 + (ans[i] - '0');
i++; }
//若第二个数为负数,则将转化过来的整数取负 if (deno_flag) tmp = -tmp; //保存分母
rst.denominator = tmp; }
//若分母为0,则用户输入的结果是非法的 if (rst.denominator == 0) return true;
//若此时没有遍历所有的字符,则说明输入是非法的 if (i != strlen(ans)) return true;
//化简分母的负号,将其移至分子 if (rst.denominator < 0) {
rst.numerator = -rst.numerator; rst.denominator = -rst.denominator; }
//若用户输入的分子分母都是负数,则用户输入不符合规范,我们取分母为0(因为计算结果不可能出现分母为0的状况)标志这种情况的发生 if (num_flag && deno_flag) rst.denominator = 0; return false; } int main() {
fraction frac,frac2;
int sj1,sj2,sf=1,sj3,sj4,r,j=1;//定义随机数及算符 int above,below; int Num;//题的数量
int numchose;//运算数选择 char sfchose;//算符选择 char yschose;//余数选择 char jf;//减法结果选择 int qznum;//取值范围
int ans_2[length];//存放正确的答案 int ans_4[length]={0};//存放正确的余数
srand((unsigned)time(NULL)); //srand函数是以现在系统时间作为时间种子产生随机数
cout<<\欢迎使用自动出题系统*****\ cout<<\请对以下内容进行初始化设置:\
cout<<\请选择运算数(1.二个运算数 2.多个运算数)\ cin>>numchose; if(numchose==1) {
cout<<\请输入打印题数:\ cin>>Num;
cout<<\请选择是否有乘除法?(y/n)\ cin>>sfchose;
cout<<\请输入一个值确定算式中数值取值范围:\ cin>>qznum;
cout<<\减法结果中出现负数吗?(y/n)\ cin>>jf;
if(sfchose=='y') {
cout<<\请选择除法有无余数?(y/n)\ cin>>yschose; }
cout<<\
for(int i=0;i sj1=rand()%qznum; sj2=rand()%qznum; sj3=rand()%qznum; sj4=rand()%qznum; if(sfchose=='n')//无乘除法 { sf=rand()%4; } if(sfchose=='y')//有乘除法 { sf=rand()%8; } switch(sf) { case 0: cout< break; case 1: if(jf=='n')//无负数 { if(sj1 cout< cout<