這個作業難度還是比較低的。
先從兩個方面開始考慮:第一是生成整數(考慮到是小學的作業,整數設定在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; }
========================================================================
因為不是很熟練,所以程式碼難免冗長,排版不是很乾淨
執行效果如下:
如果正確會提示正確,錯誤會提示錯誤,出三十道題目,直到結束為止。
除法的答案要求分別寫出得數和餘數,真分數的運算要求先輸入分子後輸入分母。