最近几天,老师布置一个小学生计算机辅助教学系统–练习加,减,乘,除法的作业要我们实现,我花费了几个小时把它干完了,本想拿这个小项目练练手,因为要考研了,复习复习C语言。没有想到这个项目涉及到的C语言知识不深,只涉及到了循环结构,函数,指针只有一个函数指针知识点。指针部分没有深挖。行了,行了,废话不多说,我直接上内容。
项目是编写一个程序来帮助小学生练习加、减、乘、除四则运算。功能要求如下:
(1)编写一个菜单,显示本系统供选择的基本功能:加、减、乘、除四则运算,退出,并提示用户输入选项,然后根据用户的选项进行不同的练习。
(2)进入每一个功能时,程序首先随机产生两个1-100之间的正整数,在屏幕上打印出问题。例如:“16+9=?”,然后让学生输入答案。程序检查学生输入的答案是否正确。若正确,则打印出“Right!”,否则“Wrong!Please try again”并提示学生重做,直到答案正确为止。然后继续下一个问题;
(3)在任务2的基础上,当学生回答错误时,最多给三次做的机会,三次仍未做好,则显示“Wrong! You have tried three times! Test Over!”程序结束。
(4)在任务2的基础上,连续做10道题,不给机会重做,若学生回答正确,则显示“Right!”,否则显示“Wrong!”。10道题全部做完后,按每题10分统计并输出总分,同时为了记录学生能力提高的过程,再输出学生的总分和回答正确率。
(5)在任务4的基础上,为使学生通过反复练习掌握所学的内容,在学生完成10道运算题后,若回答正确率低于75%,则重做10道题,直到回答正确率高于75%时才退出程序。
(6)在任务5的基础上,使用随机函数产生一个1-4之间的随机数,配合使用选择语句,来为学生输入的每个正确或错误的答案输出不同的评价。
对于正确答案,可在以下4中提示信息中选择一个进行显示:
Verygood!
Excellent!
Nicework!
Keepup the good work!
对于错误答案,可在以下4中提示信息中选择一个进行显示:
No.Please try again!
Wrong. Try once more.
Don’t Give up
Notcorrect.Keep Tring.
#include
#include
#include
int main(){
int menu();
//************************************
// void exit();
int submenu();
void test(int (*p)(int,int),char ch);
void practice(int (*p)(int,int),char ch);
int add(int a,int b);
int sub(int a,int b);
int mul(int a,int b);
int division(int a,int b);
char ch;//运算符号
int opt;//选项
int (*p)(int,int);//函数指针,根据用户所选项调用函数
opt=menu();
switch(opt){
case 1: p=add;
ch='+';
break;
case 2: p=sub;
ch='-';
break;
case 3: p=mul;
ch='x';
break;
case 4: p=division;
ch='/';
break;
case 5: exit(0);
break;
}
system("pause");
system("cls");
opt=submenu();//子菜单
if(opt==1){
printf("******************练习模式***********************\n");
practice(p,ch);//进入练习模式
}
else{
printf("******************测试模式***********************\n");
system("pause");
test(p,ch);//进入测试模式
}
return 0;
}
int menu(){//显示菜单,带回用户所选择的选项
int opt;//选择项
printf("***********************************************\n");
printf("本系统供选择的基本功能有加、减、乘、除\n");
printf("***********************************************\n");
printf("有如下选项供选择:\n");
printf("1.练习加法\n");
printf("2.练习减法\n");
printf("3.练习乘法\n");
printf("4.练习除法\n");
printf("5.退出\n");
printf("***********************************************\n");
printf("请输入你的选项:\n");
scanf("%d",&opt);
while(opt!=1&&opt!=2&&opt!=3&&opt!=4&&opt!=5){//防止小学生瞎输入
printf("输入的选项错误,请重新输入!!\n");
printf("请输入你的选项:\n");
scanf("%d",&opt);
}
return opt;
}
int add(int a,int b){//加法
return a+b;
}
int sub(int a,int b){//减法
return a-b;
}
int mul(int a,int b){//乘法
return a*b;
}
int division(int a,int b){//除法 (本系统开发的是面向小学生,应该没有学习小数,所以不考虑小数情况)
return a/b;
}
int submenu(){//选择练习模式或者测试模式
int op;//选择的模式
printf("******************模式选择*****************\n");
printf("1.练习模式\n");
printf("2.测试模式\n");
printf("请输入你要选择的模式:\n");
scanf("%d",&op);
return op;
}
void practice(int (*p)(int,int),char ch){//练习模式
void wrong_evaluate();//学生做错题目时,出现的评语
void right_evaluate();//学生做对题目时,出现的评语
int a,b;//两个1-100之间的正整数
int answer;//正确答案
int stu_answer;//学生的答案
int flag;//标志位,正确为1
int count=0;//统计一题中做错数
srand((unsigned)time(NULL)+1);//播种,产生真随机数
//随机产生两个1-100之间的正整数
a= rand()%100 + 1;
srand((unsigned)time(NULL));//播种,产生真随机数
b=rand()%100 + 1;
answer=(*p)(a,b);
//在屏幕上打印出问题
printf("%d%c%d=?\n",a,ch,b);
printf("请输入你的答案:\n");
scanf("%d",&stu_answer);
if(stu_answer==answer){
right_evaluate();//学生做对题目时,出现的评语
flag=1;
}
else{
wrong_evaluate();//学生做错题目时,出现的评语
count++;
flag=0;
}
//学生重做,直到答案正确为止
while(!flag){
printf("***********************************************\n");
printf("请输入你的答案:\n");
scanf("%d",&stu_answer);
if(stu_answer==answer){
printf("Right!\n");
flag=1;
}
else{
printf("Wrong!Please try again!\n");
count++;
flag=0;
}
if(count>=3){//给三次做的机会,还没有做对题目,就结束程序
printf("wrong!You have tried three times.Test over!");
system("pause");
exit(0);//程序正常退出
}
}
}
void test(int (*p)(int,int),char ch){//测试模式
void wrong_evaluate();//学生做错题目时,出现的评语
void right_evaluate();//学生做对题目时,出现的评语
int i;//循环变量
int score;//总分
int right_num=0;//答对题目数
int a,b;//两个1-100之间的正整数
int answer;//正确答案
int stu_answer;//学生的答案
float right_rate=0;//学生做10题的正确率
while(right_rate<0.75){
system("cls");
right_num=0;
right_rate=0;
for(i=0;i<10;i++){
srand((unsigned)time(NULL)%100+1+i+(unsigned)time(NULL)%100);//播种,产生真随机数
//随机产生两个1-100之间的正整数
a= rand()%100 + 1;
srand((unsigned)time(NULL)%100+i);//播种,产生真随机数
b=rand()%100 + 1;
answer=(*p)(a,b);
//在屏幕上打印出问题
printf("***********************************************\n");
printf("%d%c%d=?\n",a,ch,b);
printf("请输入你的答案:\n");
scanf("%d",&stu_answer);
if(stu_answer==answer){
right_evaluate();//学生做错题目时,出现的评语
right_num++;
}
else{
wrong_evaluate();//学生做对题目时,出现的评语
}
}
score=right_num*10;
right_rate=right_num/10.0;
system("pause");
system("cls");
printf("本次测试\n学生的总分:%d分\n回答正确率:%.2f\n",score,right_rate);
system("pause");
fflush(stdin);//清除标准输入输出缓存区中的内容
}
}
void wrong_evaluate(){//学生做错题目时,出现的评语
int choice;//选项
srand((unsigned)time(NULL));//播种,产生真随机数
//随机产生一个1-4之间的正整数
choice= rand()%4 + 1;
switch(choice){
case 1:
printf("No.Please try again!\n");
break;
case 2:
printf("Wrong. Try once more.\n");
break;
case 3:
printf("Don’t Give up!!!\n");
break;
case 4:
printf("Not correct.Keep Tring.\n");
break;
default:
printf("error!");
}
}
void right_evaluate(){//学生做对题目时,出现的评语
int choice;//选项
srand((unsigned)time(NULL));//播种,产生真随机数
//随机产生一个1-4之间的正整数
choice= rand()%4 + 1;
switch(choice){
case 1:
printf("Very good!\n");
break;
case 2:
printf("Excellent!\n");
break;
case 3:
printf("Nice work!\n");
break;
case 4:
printf("Keep up the good work!\n");
break;
default:
printf("error!");
}
}
//void exit(){//退出
// exit(0);//正常退出
//}
主菜单选项:选择要练习的类别(测试加法):
模式菜单:选择要练习的模式(进入练习模式):
测试减法:
进入测试模式:
显示第一次测试模式学习情况:得分率低于0.75,进入下一轮测试模式:
第二次测试模式:
回答正确率高于0.75结束程序: