小学算术能力训练系统
设计并实现一个进行小学程度的四则混合运算的算术能力训练系统,能够生成运
算对象为 100 以内的四则混合运算题,要进行合法性检查,即保证除数不为 0。用户
在输入答案后,可显示答案正确或错误。该系统应实现以下基本功能:
(1)随机出题,并判定答案是否正确。
(2)设置两种可选的答题模式:练习模式和考试模式。
(3)练习模式不断的循环出题,直到用户要求终止。并且每答完一题,还应显示
当前的正确率(已答对题数/已答题数)。
(4)考试模式可由用户指定题目总数量(如 10、50、100),在答完全部题目后
显示总题数、答对题数、和正确率。
(5)每一次进入考试模式的考试结果(总题数、答对题数、正确率)都应写入文
件保存,用户可随时查看过去的考试结果。
(6)合理组织排列各项功能,界面可使用键盘操作。
测试样例
练习模式
考试模式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
char filename[10] = {"scorce"}; ///创建文件
FILE *fp;
float text()
{
int a, b, x;
float ans;
char c, ch[105] = {"\0"};
srand((unsigned int)time(NULL)); ///随时间产生随机数
a = rand()%101; ///a的取值范围是0~100
b = rand()%100 + 1; ///rand()%100 取得随机值在0~99 加1可以是范围变成1~100 避免在除法运算的时候分母为0
x = rand()%4;
switch(x)
{
case 0: c = '+'; ans = a + b; break;
case 1: c = '-'; ans = a - b; break;
case 2: c = '*'; ans = a * b; break;
case 3: c = '/'; ans =1.0* a / b; ans *= 10; ans = (int)ans; ans /= 10; break; ///ans进行保留两位小数,先*100 再取整 再/100
default: printf("error!\n");
}
fprintf(fp, "\t%d %c %d = ", a, c, b); ///使用fprintf把题目写入文件
if(c == '/')
printf("(保留一位小数)");
printf("\t%d %c %d = ", a, c, b);
return ans;
}
float input() //用于输入计算题的答案
{
int i, j, t = 0, del = -1;
float sum = 0; //t用来判断正负 sum用于存储 把字符串答案变成整型的答案
char str[105];
scanf("%s", str);
fputs(str,fp); ///把输入的答案写入文件
fputs("\n",fp);
int len = strlen(str);
if(str[0] == '#')
return 99999; //return结束输入
if(str[0] == '-')
t = 1;
for(i = t; i < len; i++){
if(str[i] == '.') //如果是小数确定小数点位置
del = i;
if(str[i] >= '0' && str[i] <= '9')
sum = sum*10 + (str[i] - '0');
}
if(del != -1){ //因为sum存的是数字部分,如果是个小数 则需要对sum处理成小数
int temp = len - del - 1;
for(i = 0; i < temp; i++ )
sum /= 10;
}
if(t)
sum *= -1; //如果是负数则需要乘-1
return sum;
}
void printline() //用于界面美化
{
for(int i = 0; i < 99; i++)
printf("-");
printf("\n");
}
void practice() //练习模式
{
float ans1, ans2;
int cnt, right; //cnt是答题总数 righ 是正确题数 rate是正确率
double rate;
cnt = right = 0;
printf("\t\t\t练习模式\n");
getchar(); //输入的答案是通过gets输入 需要吃掉 上面scanf的回车
if((fp = fopen(filename,"w")) == NULL){
printf("无法打开此文件!\n");
exit(0);
}
while(1){
ans1 = text();
ans2 = input();
if(ans2 == 99999)
break;
cnt++;
if(ans1 == ans2){
fputs("\t答案正确!\n",fp); ///把答题情况写入文件
printf("\t答案正确!\n");
right++;
}
else{
if((int)ans1 == ans1){ ///(int)ans1 == ans1用于判断是否给定的正确答案是 实数 还是 整数
fprintf(fp, "\t答案错误!\t答案:%.0f\n", ans1);
printf("\t答案错误!\t答案:%.0f\n", ans1);
}
else{
fprintf(fp, "\t答案错误!\t答案:%.1f\n", ans1);
printf("\t答案错误!\t答案:%.1f\n", ans1);
}
}
rate = 1.0*right/cnt*100;
fprintf(fp, "\t答题数:%d\t答题数:%d \t正确率:%.2f%%\n\n", cnt, right, rate);
printf("\t答题数:%d\t答题数:%d \t正确率:%.2f%%\n\n", cnt, right, rate);
}
fclose(fp);
}
void exam() //考试模式
{
float ans1, ans2;
double rate;
int num, cnt, right;
printf("\t\t\t考试模式\n");
printf("输入1 题量为10;输入2 题量为50;输入3 题量为100\n");
if((fp = fopen(filename,"w")) == NULL){
printf("无法打开此文件!\n");
exit(0);
}
while(1){
scanf("%d", &num);
if(num == 1){
num = 10;
break;
}
else if(num == 2){
num = 50;
break;
}
else if(num == 3){
num = 100;
break;
}
else
printf("error!,请重新输入!\n");
}
getchar(); //输入的答案是通过gets输入 需要吃掉 上面scanf的回车
cnt = right = 0;
while(num--){
ans1 = text();
ans2 = input();
cnt++;
if(ans1 == ans2){
fputs("\t答案正确!\n",fp);
printf("\t答案正确!\n");
right++;
}
else{
if((int)ans1 == ans1){
fprintf(fp, "\t答案错误!\t答案:%.0f\n", ans1);
printf("\t答案错误!\t答案:%.0f\n", ans1);
}
else{
fprintf(fp, "\t答案错误!\t答案:%.1f\n", ans1);
printf("\t答案错误!\t答案:%.1f\n", ans1);
}
}
rate = 1.0*right/cnt*100;
fprintf(fp, "\t答题数:%d\t答题数:%d \t正确率:%.2f%%\n\n", cnt, right, rate);
printf("\t答题数:%d 正确数:%d \t正确率:%.2f%%\n\n", cnt, right, rate);
}
fclose(fp);
printline();
}
void pattern() //用于现在 练习模式 与 考试模式 的选择
{
int flag;
printline();
printf("\n\t\t\t\t\t小学算术能力训练系统\n\n");
printline();
printf("\t输入0进入考试模式(分10/50/100题模式)\n\t输入1进入练习模式(进入练习模式之后,若要结束练习模式在题目的答案部分输入'#')\n");
printline();
scanf("%d", &flag);
if(flag == 1){
practice();
printline();
}
else
exam();
}
void printfile()
{
char ch;
if((fp = fopen(filename,"r")) == NULL){
printf("无法打开此文件!\n");
exit(0);
}
ch = getc(fp); ///逐一输出文件字符直到文件结束EOF
while(ch != EOF){
putchar(ch);
ch = getc(fp);
}
fclose(fp);
printline();
}
int main()
{
int flag;
pattern(); //选择练习模式还是考试模式
printf("输入1查询历史测试,输入0结束测试\n");
scanf("%d", &flag);
if(flag)
printfile();
printf("谢谢使用!\n");
return 0;
}