作業:隨機四則運算

eininy發表於2016-03-10

      這個作業難度還是比較低的。

      先從兩個方面開始考慮:第一是生成整數(考慮到是小學的作業,整數設定在100以內)的四則運算,第二是生成真分數(考慮是小學的作業,真分數的分子和分母都只用一位數)的四則運算。

      生成整數運算很簡單,用srand和rand生成兩個數字,顯示出來,並在系統內部計算,同時讓小學生寫出答案,最後將小學生的答案與正確答案相比,最後判定正確。加法和乘法就不用多說,減法的話,生成整數之後還要判定兩個數的大小,以免相減之後出現負數;除法的答案,用商和餘數的方法。

      生成分數運算,隨機兩個數,兩個陣列成一個分數,當然,要是真分數的話得判定分子與分母的大小,大的是分母。真分數的四則運算也就那樣,其實最重要的還是內部的答案化簡,利用輾轉相除法把得到的分數兩個數進行化簡,最後才能和小學生給出的答案相比判定。

      主函式使用switch函式,利用隨機數來隨機產生八種算式。

      原始碼如下:

====================================================================

 

#include <stdio.h>
#include <time.h> 
#include <stdlib.h> 

int shuzi() //隨機100以內的數字
{
      int a;
      a=rand()%100;
      return a;
}

int shuzi1() //隨機10以內的數字
{
      int a;
      a=rand()%10;
      return a;
}

int fenshuzi() //隨機10以內不為0的數字
{
      int a=11;

      loop: a=rand()%10;

      if(a==0)
      goto loop;


      return a;
}


int jiafa() //整數加法
{

      int a,b;
      a=shuzi();
      b=shuzi();
      printf("%d+%d=",a,b);
      int c,d;
      c=a+b;
      scanf("%d",&d);
      if(d==c)
            printf("正確!\n");
      else 
            printf("錯誤!\n");
      return 0;
}


int jianfa() //整數減法
{

      int a,b,k;
      a=shuzi();
      b=shuzi();
      if(a<b)
      {
            k=a;
            a=b;
            b=k;
      }
      printf("%d-%d=",a,b);
      int c,d;
      c=a-b;
      scanf("%d",&d);
      if(d==c)
            printf("正確!\n");
      else 
            printf("錯誤!\n"); 
      return 0;
}

int chufa() //整數除法
{

      int a,b;
      a=shuzi();
      b=shuzi();
      printf("%d÷%d=",a,b);
      int c,d,f,g;
      c=a/b;
      f=a%b;
      scanf("%d",&d);
      printf("餘:");
      scanf("%d",&g);
      if(d==c&g==f)
            printf("正確!\n");
      else 
            printf("錯誤!\n"); 
      return 0;

}

int chengfa() //整數乘法
{ 
      int a,b;
      a=shuzi();
      b=shuzi();
      printf("%dx%d=",a,b);
      int c,d;
      c=a*b;
      scanf("%d",&d);
      if(d==c)
            printf("正確!\n");
      else 
            printf("錯誤!\n"); 
      return 0;
}

int gcd(int n,int m) //分數化簡
{
      int temp,r;
      if(n<m)
      {
            temp=n;
            n=m;
            m=temp;
      }
      while(m!=0)
      { 
            r=n%m;
            n=m;
            m=r; 
      }
return n;
}

int fenshujiafa() //分數加法
{
      int a,b,c,d,i,j;
      a=fenshuzi();
      b=fenshuzi();
      if(a>b)
      {
            i=a;
            a=b;
            b=i;
      }


      c=fenshuzi();
      d=fenshuzi();
      if(c>d)
      {
            i=c;
            c=d;
            d=i;
      }

      printf("%d/%d + %d/%d =\n ",a,b,c,d);

      a=a*d;
      c=c*b;
      b=b*d;
      d=b;

      int fenzi,fenmu,fenzi1,fenmu1;
      fenzi=a+c;
      fenmu=b;

      fenzi1=fenzi;
      fenmu1=fenmu;

 

      fenzi=fenzi1/gcd(fenzi1,fenmu1);
      fenmu=fenmu1/gcd(fenzi1,fenmu1);

 

      scanf("%d",&i);
      printf("---\n ");
      scanf("%d",&j);

 

      if((i==fenzi)&(j==fenmu))
            printf("正確!\n");
      else
            printf("錯誤!\n");

      return 0;
}

int fenshujianfa() //分數減法
{
      int a,b,c,d,i,j;
      a=fenshuzi();
      b=fenshuzi();
      if(a>b)
      {
            i=a;
            a=b;
            b=i;
      }


      c=fenshuzi();
      d=fenshuzi();
      if(c>d)
      {
      i=c;
      c=d;
      d=i;
      }

      float god,pig,god1,pig1;
      god=a;
      pig=b;
      god1=c;
      pig1=d;
      god=god/pig;
      god1=god1/pig1;
      if(god<god1)
      {
            i=a;
            a=c;
            c=i;
            i=b;
            b=d;
            d=i;
      }

      printf("%d/%d - %d/%d =\n ",a,b,c,d);

      a=a*d;
      c=c*b;
      b=b*d;
      d=b;

      int fenzi,fenmu,fenzi1,fenmu1;
      fenzi=a-c;
      fenmu=b;

      fenzi1=fenzi;
      fenmu1=fenmu;

 

      fenzi=fenzi1/gcd(fenzi1,fenmu1);
      fenmu=fenmu1/gcd(fenzi1,fenmu1);

      scanf("%d",&i);
      printf("---\n ");
      scanf("%d",&j);

 

      if((i==fenzi)&(j==fenmu))
            printf("正確!\n");
      else
            printf("錯誤!\n");

      return 0;

}

int fenshuchufa() //分數除法
{
      int a,b,c,d,i,j;
      a=fenshuzi();
      b=fenshuzi();
      if(a>b)
      {
            i=a;
            a=b;
            b=i;
      }


      c=fenshuzi();
      d=fenshuzi();
      if(c>d)
      {
            i=c;
            c=d;
            d=i;
      }

      printf("%d/%d ÷ %d/%d =\n ",a,b,c,d);

      i=c;
      c=d;
      d=i;

      int fenzi,fenmu,fenzi1,fenmu1;
      fenzi=a*c;
      fenmu=b*d;

      fenzi1=fenzi;
      fenmu1=fenmu;

 

      fenzi=fenzi1/gcd(fenzi1,fenmu1);
      fenmu=fenmu1/gcd(fenzi1,fenmu1);

 

      scanf("%d",&i);
      printf("---\n ");
      scanf("%d",&j);

 

      if((i==fenzi)&(j==fenmu))
            printf("正確!\n");
      else
            printf("錯誤!\n");

      return 0;
}

int fenshuchengfa() //分數乘法
{
      int a,b,c,d,i,j;
      a=fenshuzi();
      b=fenshuzi();
      if(a>b)
      {
            i=a;
            a=b;
            b=i;
      }


      c=fenshuzi();
      d=fenshuzi();
      if(c>d)
      {
            i=c;
            c=d;
            d=i;
      }

      printf("%d/%d X %d/%d =\n ",a,b,c,d);


      int fenzi,fenmu,fenzi1,fenmu1;
      fenzi=a*c;
      fenmu=b*d;

      fenzi1=fenzi;
      fenmu1=fenmu;

 

      fenzi=fenzi1/gcd(fenzi1,fenmu1);
      fenmu=fenmu1/gcd(fenzi1,fenmu1);


      scanf("%d",&i);
      printf("---\n ");
      scanf("%d",&j);

 

      if((i==fenzi)&(j==fenmu))
            printf("正確!\n");
      else
            printf("錯誤!\n");

      return 0;
      }

 

int main()
{

      srand(time(0));
      int i,j;
      

      for(j=0;j<30;j++)
      {
      i=shuzi1();
          i=i%8;
            switch (i)
            {
                  case 0: {jiafa(); break;}
                  case 1: {jianfa(); break;} 
                  case 2: {chufa(); break;} 
                  case 3: {chengfa(); break;} 
                  case 4: {fenshujiafa(); break;}
                  case 5: {fenshujianfa(); break;} 
                  case 6: {fenshuchufa(); break;} 
                  case 7: {fenshuchengfa(); break;} 
                  default : printf("error \n");
            }

      }


      return 0;
}

 

 

 

 

========================================================================

因為不是很熟練,所以程式碼難免冗長,排版不是很乾淨

 

 

執行效果如下:

 

如果正確會提示正確,錯誤會提示錯誤,出三十道題目,直到結束為止。

除法的答案要求分別寫出得數和餘數,真分數的運算要求先輸入分子後輸入分母。

相關文章