原題目如下:
阿超有個兒子上小學二年級,老師每天讓家長給孩子出30道加減法題,雖然不多,但是每天都做也算是個負擔,阿超作為一個老牌程序員當然想用計算機來解決這個小問題,目前對於這個問題對於任何語言都不是問題,比如:
C/C++、C#、Java、Python、VB、JavaScript、Perl……
具體要求如下:
1.能自動生成小學四則運算題目(注意是給小學生用的,要是結果出現負數的話他們會迷茫的!)
2.除了整數外,還要支持真分數的四則運算
分析可知需要采用一個自己熟悉的語言來變成實現自動生成30道小學四則運算題目且結果均為非負數,同時還要可以支持真分數的四則運算。這里我選擇了C語言(畢竟我太菜,別的還不會)。一開始我的寫的是四則混合運算,但是反復調試發現自己的判斷非負的地方還存在很大問題,昨天晚上想了很久發現解決很麻煩,跟全算出結果差不多少,所以我還是放棄了。今天重新寫了一個簡單的。我覺得這個程序主要有3個地方需要注意。首先是隨機生成問題,只使用rand()是不對的,這樣生成的數是偽隨機數,上網查了一下得知最簡單的解決方法是應該在主函數里加上一句srand(time(0)),這里我最初是在每個rand()前都加上了srand(time(0)),導致產生的隨機數都一樣,應該只要在主函數里加一句就行了。這是個值得注意的地方。其次是關於如何保證結果都是非負數,由於是四則運算,因此只有出現“-”號的時候才會有這種可能。我是這樣解決的:用x和y來表示整數題目時2個運算數,當出現“-”時(if(op==‘-’)),通過while(x-y<0)語句來循環進行重新隨機,知道產生x大於等於y為止。當遇到分數題目時候,采用a/b,c/d形式,同理通過while(a*d-b*c<=0)語句來循環進行重新隨即。最后關於真分數的問題,並不難,真分數簡單來講就是分母比分子大的分數,因此只要保證a>b且c>d就好了。整個程序的開發時間大概1個小時。下面是源代碼:
#include<iostream.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> char Operator() { char op; int i; i=rand()%4+1; switch(i) { case 1: return '+'; case 2: return '-'; case 3: return 'x'; case 4: return '/'; } } void integer() { int x,y; char op; x=rand()%100+1; y=rand()%100+1; op=Operator(); if(op=='-') while(x<y) { x=rand()%100+1; y=rand()%100+1; } cout<<x<<op<<y<<"="<<endl; } void fraction() { int a,b,c,d; a=rand()%100+1; b=rand()%100+1; c=rand()%100+1; d=rand()%100+1; char op; while(a<=b||c<=d) { a=rand()%100+1; b=rand()%100+1; c=rand()%100+1; d=rand()%100+1; } op=Operator(); if(op=='-') while((b*c-a*d)<0) { a=rand()%100+1; b=rand()%100+1; c=rand()%100+1; d=rand()%100+1; } cout<<b<<"/"<<a<<op<<d<<"/"<<c<<"="<<endl; } + void main() { srand(time(0)); int i,n,m; cout<< "請輸入出題類型"<<endl; cout<< "1.整數四則運算"<<endl; cout<< "2.分數四則運算"<<endl; cin>>i; cout<< "請輸入出題數目"<<endl; cin>>n; for(m=1;m<=n;m++) { if(i==1) integer(); else fraction(); } }
