#include <stdio.h> #include <stdlib.h> int getChoice(); void showMenu(); void doExercise(int); int test(int); int getChoice() { int choice; scanf("%d",&choice); return choice; } void showMenu() { printf("===================================\n"); printf("\n歡迎使用小學四則運算練習軟件\n"); printf("\n"); printf("\t1、加法練習\t2、減法練習\n"); printf("\t3、乘法練習\t4、除法練習\n"); printf("\t5、綜合練習\t0、退出系統\n"); printf("\n"); printf("請輸入你的選擇(0--5):\n"); printf("\n===================================\n"); } void doExercise(int n) { int count=0; int score=0; //練習得分,初始化為0 int i=0; //練習題數的計數器 for(i=1;i<=10;i++) { count=count+test(n); //間接遞歸調用test(n) score=count*10; } printf("本次練習十道題,你做對了%d道,所得分數為%d分\n",count,score); } /* 功能:進行一道題的測試過程 */ int test(int n) { int ranswer=0; //正確答案 int uanswer=0; //用戶輸入的答案 int t=0; //臨時變量 char operation; //運算類別 int num1=0; //操作數1 int num2=0; //操作數2 srand(time(NULL)); //初始化隨機數種子 num1=rand()%10; //取0—9之間的隨機數 num2=rand()%10; //進入程序功能,如果選擇5就隨機產生1-4所代表的每一種運算方式 if(n==5) { n=rand()%4+1; } switch(n) { case 1: operation='+'; break; case 2: operation='-'; break; case 3: operation='*'; break; case 4: operation='/'; break; } /*加入一條防止“不夠減”的語句,當選擇減法且num1小於num2時不夠減 的時候,用臨時變量交換兩個操作數*/ if((operation=='-') && (num1<num2)) { t=num1; num1=num2; num2=t; } /*防止“除數為0”的程序漏洞,當num2被隨機取值到0時,就將num2強制置為1 做除法時,將num1的值強制賦值給num1*num2,防止不能整除*/ if(operation=='/') { if(num2==0) { num2=1; } num1=num1*num2; //防止num1不能被num2整除的語句 } //輸出測試題本身、提示用戶輸入 printf("%d%c%d= ",num1,operation,num2); scanf("%d",&uanswer); //程序計算正確結果 switch(operation) { case '+': ranswer=num1+num2; break; case '-': ranswer=num1-num2; break; case '*': ranswer=num1*num2; break; case '/': ranswer=num1/num2; break; } //評判,做對返回1,做錯返回0 if(uanswer==ranswer) { printf("做對了!\n"); return 1; } else { printf("做錯了!\n"); return 0; } } //主函數 int main(void) { int choice=0; //接收用戶的選擇 //循環開始功能,本次用do……while循環 do { showMenu(); //顯示菜單 choice=getChoice(); //控制choice的范圍 if(choice<0 || choice>5) { choice=1; //強制做加法 } if(choice==0) { break; //用戶選擇0,退出循環(退出系統) } doExercise(choice); //做什麼練習,並啟動評分 }while(choice!=0); printf("歡迎使用本軟件,再見!\n"); return 0; }
雖然代碼寫得比較簡單,功能也還沒達到老師的要求,但是這種層次分明的寫法還是比較喜歡。功能有待改進...