东华理工大学 C语言程序设计作业:算数练习

                                                        (作者联系方式见文末)

注意:本项目采用多文件编译(开发软件为VS2022),请先按照如下步骤进行设置:

                 1.项目->(项目名称xxx)属性->C/C++->预处理器->预处理器定义->编辑中添加:_CRT_SECURE_NO_WARNINGS (这一步是防止vs2022对于printf等基础函数不安全的报错.)

                 2.项目->(项目名称xxx)属性->链接器->命令行->其他选项中添加:/FORCE:MULTIPLE (防止link找到多个定义的报错)

                 3.在C盘中创建名为C_DEMO的文件夹(本项目涉及文件读写)

                 4.展示如下

头文件

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int menu(void);
void test(int n);
FILE* exam(int n, int difficulty);
void showinfo(FILE*);

void main()
{
    int diff = 3;
    int choices = 999;
    int qs = 0;
    FILE* fpt = NULL; 
    while (choices != 4)
    {
        choices = menu();
        switch (choices)
        {
            case 1:
                printf("输入题目数:\n");
                scanf("%d",&qs);
                test(qs);
                break;
            case 2:
                printf("难度为%d级!\n",diff);
                printf("输入题目数:\n");
                scanf ("%d", &qs);                
                fpt = exam(qs, diff);
                break;
            case 3:
                printf("选择难度等级:(有1.2.3三级)\n");
                scanf("%d",&diff);
            case 4:break;
            case 5:
                showinfo(fpt);
                break;
        }
    }   

}


                                               menu函数

  ( 在解决方案资源管理器->源文件 一栏中创建,以下函数同)

#include"head.h"

int menu()
{
    printf("\033[44m练习:1 测验:2 设置:3 退出:4 查看成绩:5\033[0m\n");
    printf("请选择:\n");
    int choice = 0,logic = 0;
    scanf("%d",&choice);
    while (logic == 0)
    {
        if (choice<=5&&choice>=1)logic = 1;
        else
        {
            printf("无该选项!重新选择:\n");
            scanf("%d", &choice);
        }
    }
    return choice;
}

test函数

(用于练习)

#include"head.h"

void test(int n)
{
    int count = n;
    int tick = 0;
    int i = 1;
    for (; i <= count; i++)
    {
        float a = (rand() % 10000 + 1) / 10;//0-999随机小数
        float b = (rand() % 10000 + 10) / 10;//1-999随机小数
        int sign = rand() % 4 + 1;     //1.2.3.4对应加减乘除
        char c = '0';
        switch (sign)
        {
        case 1:c = '+'; break;
        case 2:c = '-'; break;
        case 3:c = '*'; break;
        case 4:c = '/'; break;
        }
        printf("第%d题:%.2f %c %.2f = ", i,a,c,b);
        float user_answear = 0,std_an = 0;
        scanf("%f", &user_answear);
        switch (sign)
        {
        case 1:std_an = a + b; break;
        case 2:std_an = a - b; break;
        case 3:std_an = a * b; break;
        case 4:std_an = a / b; break;
        }
        if (fabs(std_an - user_answear)<=0.01 )
        {
            printf("正确!答案为%.2f\n", std_an);
            tick++;
        }
        
        else
        {
            printf("错误!正确答案为%.2f\n",std_an);
        }
        printf("\033[31m当前共有%d题 答对%d道 正确率:%.2f\n\033[0m",i,tick, ((float)tick / i * 100));
        if (i != count)
        {
            printf("是否继续?(输入0结束)\n");
            int end = 9;
            scanf("%d", &end);
            if (end == 0)break;
        }
        printf("测试完毕 返回菜单!\n");
    }
}

exam函数

(用于测验,本函数会将测验结果写入文件)

#include"head.h"

FILE* exam(int n, int difficulty)
{
    FILE* fpt = fopen("C:\\C_DEMO\\exam.txt", "w + ");
    fprintf(fpt, "本次考试共有%d题!\n",n);
    fclose(fpt);
    int count = n;
    int tick = 0;
    int i = 1;
    float a;
    float b;
    for (; i <= count; i++)
    {
        switch (difficulty)
        {
        case 1: a = (rand() % 100 + 1) / 10;//0-9随机小数
                b = (rand() % 100 + 10) / 10;//1-9随机小数
               break;
        case 2: a = (rand() % 1000 + 1) / 10;//0-99随机小数
                b = (rand() % 1000 + 10) / 10;//1-99随机小数
               break;
        case 3: a = (rand() % 10000 + 1) / 10;//0-999随机小数
                b = (rand() % 10000 + 10) / 10;//1-999随机小数
               break;
        default:printf("难度设置错误!\n");
            return NULL;
        }
        
        int sign = rand() % 4 + 1;     //1.2.3.4对应加减乘除
        char c = '0';
        switch (sign)
        {
        case 1:c = '+'; break;
        case 2:c = '-'; break;
        case 3:c = '*'; break;
        case 4:c = '/'; break;
        }
        //开文件
        fpt = fopen("C:\\C_DEMO\\exam.txt", "a ");
        fprintf(fpt, "第%d题:%.2f %c %.2f = ?", i, a, c, b);
        fclose(fpt);
        printf("第%d题:%.2f %c %.2f = ", i, a, c, b);
        float user_answear = 0, std_an = 0;
        scanf("%f", &user_answear);
        switch (sign)
        {
        case 1:std_an = a + b; break;
        case 2:std_an = a - b; break;
        case 3:std_an = a * b; break;
        case 4:std_an = a / b; break;
        }
        if (fabs(std_an - user_answear) <= 0.01)
        {
            printf("正确!\n");
            fpt = fopen("C:\\C_DEMO\\exam.txt", "a");
            fprintf(fpt, "本题正确 答案为%.2f\n", std_an);
            fclose(fpt);
            tick++;
        }
        else
        {
            printf("错误!正确答案为%.2f\n", std_an);
            fpt = fopen("C:\\C_DEMO\\exam.txt", "a");
            fprintf(fpt, "本题错误 答案为%.2f\n", std_an);
            fclose(fpt);
        }
        
    }
    printf("\033[31共有%d道题 答对%d道 正确率:%.2f\n\033[0m",n, tick, (((float)tick / n )* 100));
    fpt = fopen("C:\\C_DEMO\\exam.txt", "a ");
    fprintf(fpt, "本次考试得分:%.0f", (((float)tick / n) * 100));
    fclose(fpt);
}

  showinfo函数

(读取文件中的测验结果并展示)

#include"head.h"

void showinfo(FILE*fpt)
{
    fpt = fopen("C:\\C_DEMO\\exam.txt", "r");
    char c = '0';
    c = fgetc(fpt);
    while (c != EOF)
    {
        putchar(c);
        c = fgetc(fpt);
    }
    fclose(fpt);
    putchar('\n');
}

//代码结束

有任何问题请联系QQ:2695286486

  • 21
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Twilight#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值