一,设计思路:
本次的实现目标是在上次代码的基础之上实现用户输入答案,并判断答案是否正确并进行统计,最后输出正确答案的个数。
判断答案是否正确的思路是在上次的基础之上先定义wrong(用来统计错误个数)right(用来统计正确的个数)k1,参数。
在void Display函数中定义答案的判断和正确错误的统计,最后在主函数中通过指针的调用来实现答案正确和错误个数的统计。
二,源代码:
#include<stdlib.h>
#include<iostream.h>
#include<stdio.h>
//void Display(int p); //输出题目
int wrong=0,right=0;
int a[100],b[100],c[100];
//int i;
void Display(int p,int *ri,int *wr,int i) //输出题目
{
int k1=0;
if(p==0)
{
if(c[i]==0)
{
printf("%d+%d=\n",a[i],b[i]);
printf("请输入结果!");
scanf("%d",&k1);
if(k1!=a[i]+b[i])
wrong++;
else
right++;
}
else if(c[i]==1)
{
printf("%d-%d=\n",a[i],b[i]);
printf("请输入结果!");
scanf("%d",&k1);
if(k1!=a[i]-b[i])
wrong++;
else
right++;
}
else if(c[i]==2)
{
printf("%d*%d=\n",a[i],b[i]);
printf("请输入结果!");
scanf("%d",&k1);
if(k1!=a[i]*b[i])
wrong++;
else
right++;
}
else
{
printf("%d/%d=\n",a[i],b[i]);
printf("请输入结果!");
scanf("%d",&k1);
if(k1!=a[i]/b[i])
wrong++;
else
right++;
}
}
else
{
if(c[i]==0)
{
printf("%d+%d=\n",a[i],b[i]);
printf("请输入结果!");
scanf("%d",&k1);
if(k1!=a[i]+b[i])
wrong++;
else
right++;
}
else if(c[i]==1)
{
printf("%d-%d=\n",a[i],b[i]);
printf("请输入结果!");
scanf("%d",&k1);
if(k1!=a[i]-b[i])
wrong++;
else
right++;
}
else if(c[i]==2)
{
printf("%d*%d=\n",a[i],b[i]);
printf("请输入结果!");
scanf("%d",&k1);
if(k1!=a[i]*b[i])
wrong++;
else
right++;
}
else
{
printf("%d/%d=\n",a[i],b[i]);
printf("请输入结果!");
scanf("%d",&k1);
if(k1!=a[i]/b[i])
wrong++;
else
right++;
}
if((i+1)%p==0)
printf("\n");
}
*ri=right;
*wr=wrong;
}
void Carry(int *q,int *ri,int *wr) //执行全部过程,添加出错处理
{
int j;
int t;
int m;
int n;
//int q;
int d;
int p=3;
int r;
//int wrong=0;
//int right=0;
printf("1.请选择是否有乘除法(0:是 1:否)\n");
scanf("%d",&m);
if(m!=0&&m!=1)
{
printf("输入错误,请重新输入!\n");
Carry(q,ri,wr);
}
printf("2.请输入取值范围:(0-?)\n");
scanf("%d",&r);
printf("3.请选择加减有无负数:(0:有 1:无)\n");
scanf("%d",&n);
if(n!=0&&n!=1)
{
printf("输入错误请重新输入!\n");
Carry(q,ri,wr);
}
if(m==0)
{
printf("4.请选择出发有无余数:(0:有 1:无)\n");
scanf("%d",&d);
if(d!=0&&d!=1)
{
printf("输入错误请重新输入!\n");
Carry(q,ri,wr);
}
}
printf("5.请输入题目个数:\n");
scanf("%d",q);
if(*q<=0)
{
printf("输入错误请重新输入!\n");
Carry(q,ri,wr);
}
printf("6.请选择打印方式:0为逐行打印,输入其他数字则为一行几列\n");
scanf("%d",&p);
if(p<0)
{
printf("输入错误请重新输入!\n");
Carry(q,ri,wr);
}
for(int i=0;i<*q;i++)
{
a[i]=rand()%r;
b[i]=rand()%r;
c[i]=rand()%4;
if(c[i]==3&&b[i]==0)
{
b[i]++;
}
for(j=0;j<i;j++) //判断题目是否重复,若重复则a[i]++
if(a[j]==a[i]&&b[j]==b[i]&&c[j]==c[i])
a[i]++;
if(m==0&&n==0&&d==0)
{
Display(p,ri,wr,i);
}
else if(m==1) //没有乘除法
{
if(c[i]>=2)
c[i]=c[i]-2;
Display(p,ri,wr,i);
}
else if(m==0&&n==1&&d==0) //无负数,且被除数大于除数
{
if(a[i]<b[i])
{
t=a[i];
a[i]=b[i];
b[i]=t;
}
Display(p,ri,wr,i);
}
else
{
if(c[i]==3)
{
if(a[i]<b[i])
{
t=a[i];
a[i]=b[i];
b[i]=t;
}
while(a[i]%b[i]!=0) //无余数
b[i]++;
}
Display(p,ri,wr,i);
}
}
}
void main()
{
int tishu=0;
int wrong1=0,right1=0;
Carry(&tishu,&right1,&wrong1);
//printf("您总共做了"道题目,正确个数‘right‘,错误的个数‘wrong‘\n");
cout<<"您总做了"<<tishu<<"个题,正确"<<right1<<"的道,错误"<<wrong1<<"道"<<endl;
}
三,运行结果截图:
四,结果总结:
在初步的思路中是想在void Disply函数中定义对答案的判断和统计策略,最开始我把wrong和right变量定义在了Disply函数里面,最后导致运行结果一直输出正确答案1错误答案0,通过仔细见后发现每次对执行函数时都又把wrong和right恢复为0了,所以导致wrong和right统计结果错误。经过第一次改正后发现还是不正确,因为我忘记了Disply函数中各个模块是并立的关系所以要用else if 而不能用原来的if来表示。但是后运行结果还是有错误,输出结果正确和错误的个数总是反着的,后发现在主函数中指针的返回是有错误的,所以导致了结果的错误。以上就是这次遇见的问题,这些问题里面有粗心大意造成的,有逻辑错误造成的。归根结底是基础太差,缺乏练习!