#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;
}
雖然代碼寫得比較簡單,功能也還沒達到老師的要求,但是這種層次分明的寫法還是比較喜歡。功能有待改進...