一,設計思路:
本次的實作目标是在上次代碼的基礎之上實作使用者輸入答案,并判斷答案是否正确并進行統計,最後輸出正确答案的個數。
判斷答案是否正确的思路是在上次的基礎之上先定義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來表示。但是後運作結果還是有錯誤,輸出結果正确和錯誤的個數總是反着的,後發現在主函數中指針的傳回是有錯誤的,是以導緻了結果的錯誤。以上就是這次遇見的問題,這些問題裡面有粗心大意造成的,有邏輯錯誤造成的。歸根結底是基礎太差,缺乏練習!
轉載于:https://www.cnblogs.com/hushunli/p/4356461.html