四则运算(感谢吴至远同志为我的代码提供的改进)
我截的图不完全(请自行补充)
1.确定这次题目的个数和范围,以及得到4个随机数(补充:1.鄙人能力有限只能到达整数和分数,真分数确实不会2.我直接来4个是为了之后我分了3种类都可以使用计算方便,各位也可以根据不同的类别定义分别定义2,3,4个随机数)

2.我用3个元素的数组定义了符号位,每个元素范围是0到3,数字代替算术运算符(补充:为防止出现/号后面有0的情况我做了一个循环),最后我定义了一个数组(也就是你看到的h数组),他长这样(元素,运算符,元素,运算符,元素,运算符,元素,0,0)(后面的0,0,与算法无关只是为了改进一个特殊情况,将在下文说明)

3.最关键的如何让计算机计算函数的答案(我以3个运算符为例子(本质上可以计算n个运算符))
4.第一步算乘除:首先打印题目让玩家可以计算answer,并且先找到2元运算符*,/;在让符号两边的元素进行相应的计算;算完后让前一个数为0后一个数为这次计算的答案(我在第三步算加减时是从左往右计算的,把不是减法的都加起来);接着找下一个2元运算符。(我有个表达错误,我们最后的答案不是这个result,而是计算完第二三步后的result的,你可以用temp代替这里的result,但是这个表达错误不影响结果(所以我不改正))



5.第二步解决特殊情况:如果在进行一次连续的*或/前的符号是减号,我们就应该交换,那交换那个,如何判断,请看图



6.第三步算加减:就像第一步图片说的那样把不是减法的运算都看做加法(重要);当然还有计算你自己的答案并判断是否正确(这不重要)。

7.进行两次运算就把7改为5

8.如果你有更好的方法或你会命令行,请赐教(第一次把自己想的算法写博客,可能写的不好,(。・_・。)ノI’m sorry~)
12月13日添加:
include <stdio.h>
include <stdlib.h>
include <math.h>
include<time.h>
int main()
{
char q;
do {
int n;
do {
printf("输入单次题目的个数:\n");
scanf("%d",&n);//输入单次题目的个数
} while(n<=0);
int i=0,e[10000]= {0},r,j;
do {
printf("输入随机数的范围:\n");
scanf("%d",&r);//输入随机数的范围
} while(r<=1);
for(i=0; i<n; i++) { //计算几道题
srand(time(NULL));
double a,b,c,d,open4;
int operat[3]= {0};
char fuhao[3];
a=rand()%r;
b=rand()%r;
c=rand()%r;
d=rand()%r;//
open4=rand()%3;//
for(j=0; j<open4+1; j++) {
operat[j]=rand()%4;
switch (operat[j]) {
case 0:
fuhao[j]='+';
break;
case 1:
fuhao[j]='-';
break;
case 2:
fuhao[j]='*';
break;
case 3:
fuhao[j]='/';
break;
}
}
int g;
double result,answer;
double h[9]= {a,operat[0],b,operat[1],c,operat[2],d,0,0};//0是为了处理特殊状况本质上只要前7个
while((operat[0]==3&&b==0)||(operat[1]==3&&c==0)||(operat[2]==3&&d==0)) {
b=rand()%r+1;
c=rand()%r+1;
d=rand()%r+1;
}
if(open4==2) {
printf("第%d题:%0.f%c%0.f%c%0.f%c%0.f",i+1,a,fuhao[0],b,fuhao[1],c,fuhao[2],d);
for(g=1; g<7; g+=2) {
if(h[g]==2) {
result=(h[g-1])*(h[g+1]);
h[g-1]=0;
h[g+1]=result;
} else if(h[g]==3) {
result=(h[g-1])/(h[g+1]);
h[g-1]=0;
h[g+1]=result;
}
}
int l,m;
for(l=1; l<7; l +=2) {
if(h[l]==1&&h[l+2]>=2) {
m=l+2;
while(h[m]>=2) { //跳过乘除号
m+=2;
}
int temp=h[l+1];
h[l+1]=h[m-1];
h[m-1]=temp;
}
}
for(g=1; g<7; g+=2) {
if(h[g]!=1) {
result=(h[g-1])+(h[g+1]);
h[g+1]=result;
} else if(h[g]==1) {
result=(h[g-1])-(h[g+1]);
h[g+1]=result;
}
}
printf("输入答案(如果有分数请输入2位小数):");
scanf("%lf",&answer);
if(fabs(answer-result)<0.1) {
printf("\n yes\n");
e[i]=1;
} else {
printf("\n no \n");
printf("正确答案是:%f\n",result);
e[i]=2;
}
} else if(open4==1) { //只进行两次运算
printf("第%d题:%0.f%c%0.f%c%0.f",i+1,a,fuhao[0],b,fuhao[1],c);
for(g=1; g<5; g+=2) {
if(h[g]==2) {
result=(h[g-1])*(h[g+1]);
h[g-1]=0;
h[g+1]=result;
} else if(h[g]==3) {
result=(h[g-1])/(h[g+1]);
h[g-1]=0;
h[g+1]=result;
}
}
int l,m;
for(l=1; l<5; l +=2) {
if(h[l]==1&&h[l+2]>=2) {
m=l+2;
while(h[m]>=2&&m<5) { //跳过乘除号
m+=2;
}
int temp=h[l+1];
h[l+1]=h[m-1];
h[m-1]=temp;
}
}
for(g=1; g<5; g+=2) {
if(h[g]!=1) {
result=(h[g-1])+(h[g+1]);
h[g+1]=result;
} else if(h[g]==1) {
result=(h[g-1])-(h[g+1]);
h[g+1]=result;
}
}
printf("输入答案(如果有分数请输入2位小数):");
scanf("%lf",&answer);
if(fabs(answer-result)<0.1) {
printf("\n yes\n");
e[i]=1;
} else {
printf("\n no \n");
printf("正确答案是:%f\n",result);
e[i]=2;
}
} else if(open4==0) { //只进行一次运算
printf("第%d题:%0.f%c%0.f",i+1,a,fuhao[0],b);
for(g=1; g<3; g+=2) {
if(h[g]==2) {
result=(h[g-1])*(h[g+1]);
h[g-1]=0;
h[g+1]=result;
} else if(h[g]==3) {
result=(h[g-1])/(h[g+1]);
h[g-1]=0;
h[g+1]=result;
}
}
for(g=1; g<3; g+=2) {
if(h[g]!=1) {
result=(h[g-1])+(h[g+1]);
h[g+1]=result;
} else if(h[g]==1) {
result=(h[g-1])-(h[g+1]);
h[g+1]=result;
}
}
printf("输入答案(如果有分数请输入2位小数):");
scanf("%lf",&answer);
if(fabs(answer-result)<0.1) {
printf("\n yes\n");
e[i]=1;
} else {
printf("\n no \n");
printf("正确答案是:%f\n",result);
e[i]=2;
}
}
}//重复计算n次
int c3=0,c4=0;
printf("正确题目的题号:");
for(i=0; i<n; i++) {
if(e[i]==1) {
printf("%2d",i+1);
c3++;
}
}
printf("正确个数:%6d\n",c3);
printf("错误题目的题号:");
for(i=0; i<n; i++) {
if(e[i]==2) {
printf("%2d",i+1);
c4++;
}
}
printf("错误的个数:%6d\n",c4);
printf("你想接着玩儿吗?(y or n)");
do {
scanf(" %c",&q);
} while(q!='y'&&q!='n');
} while(q=='y');
return 0;
}
这是我写的代发运行图,如你所见有问题,但能满足大部分需求。(我会持续跟进改正,点个赞吧)

浙公网安备 33010602011771号