小学算术能力训练系统

小学算术能力训练系统

设计并实现一个进行小学程度的四则混合运算的算术能力训练系统,能够生成运
算对象为 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;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值