沈阳航空航天大学【工程训练实验-随机数】

沈阳航空航天大学【工程训练实验-随机数】

一.实验目的

1、加深理解C语言编程基本程序框架;
2、培养自学能力,学习自主查阅文献;
3、掌握顺序结构、分支结构和单层循环结构程序设计方法及代码编写;
4、学习相关开发平台和开发工具的使用方法;
5、掌握流程图的绘制方法。

二.实验内容

完成“学生计算能力进阶训练程序”,具体要求如下:

1.自定义难度等级(例如:第1级为一位数和一位数的加法,减法和乘法运算;第2级为一位数和两位数的加法,减法和乘法运算;第3级为两位数和两位数的加法,减法和乘法运算),学生可以选择不同等级练习,某个等级练习的正确率在90%以上,可以升级;正确率在60%以下,则要降级;

2.每组难度题目数量为10题,软件随机出题,学生填写答案;

3、一组题全部答完后,显示学生成绩,并根据结果自动升降级,完成通关训练。

三.解答

1.实验设计

1> 定义函数①来随机生成两个数,并根据等级来控制随机生成数的范围。其中rand()函数和指针的使用参考了CSDN上的相关文章。

2> 定义函数②来随机生成一个运算符,用作随机算式的运算。

3> 定义函数③来运算函数①提供的随机数和函数②提供的随机运算符的算式并得出结果。

4> 在主函数中定义level(等级)、score=0(初始得分)、correct=0(初始正确数)、total=10(题目总数)、num1(算式中的第一个数)、num2(算式中的第二个数)、answer(用户输入的答案)、sign(运算符)等变量,并让用户自己输入level的值来选择难度等级。为了提高程序的可扩充性,在主函数中单独定义total而不是直接使用10,这样在后期修改题目总数时只需更改total的赋值即可。同时,为了方便后人进行程序的更改,我在源码中写入了大量的注释方便后来的程序员进行解读并在题目要求的基础上添加了除法运算使程序更完善。

5> 进入循环体,利用for()循环语句配合定义的函数①和函数②来随机生成题目,并打印在用户的屏幕上,再使用if条件语句和函数③返回的正确值与用户输入的值进行做差取绝对值判断误差是否小于0.01,如果误差小于0.01则给初始正确数+1,并根据total总数来确定总循环次数。

6> 在用户回答完每一等级所有题目后,计算出用户所得分数并打印在屏幕上给用户看。

7> 根据用户的得分情况判断是满足升级、保级、降级之中的哪一个,升级则给level加1,保级则level不变,降级则给level减1。

8> 当level发生变化时重置correct数量和total的数量方便进行下一次的分数计算。

9> 判断当变量level大于3时"打印恭喜你通关了!"在用户的屏幕上,并在用户按下任意键后结束进程。

2.源代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

// 随机生成两个数
void suijishu(int level, float* num1, float* num2)
{
    switch (level)
    {
    case 1:
        *num1 = rand() % 10 + 0;//随机从1到10取数
        *num2 = rand() % 10 + 1;
        break;

    case 2:
        *num1 = rand() % 90 + 0;//随机从1到90取数
        *num2 = rand() % 90 + 1;
        break;

    case 3:
        *num1 = rand() % 90 + 10;//随机从10到90取数
        *num2 = rand() % 90 + 10;
        break;

    default:
        break;
    }
}

// 随机生成运算符
char fuhao()
{
    int sign = rand() % 4;
    switch (sign)
    {
    case 0:
        return '+';

    case 1:
        return '-';

    case 2:
        return '*';

    case 3:
        return '/';

    default:
        return '+';
    }
}

// 计算结果
float jisuan(float num1, float num2, char sign)
{
    switch (sign)
    {
    case '+':
        return num1 + num2;

    case '-':
        return num1 - num2;

    case '*':
        return num1 * num2;

    case '/':
        return num1 / num2;

    default:
        return num1 + num2;
    }
}

int main()
{
    srand(time(NULL)); // 初始化随机数种子
    int level; //定义变量level等级
    int score = 0; // 初始得分为0
    int correct = 0; // 初始正确数量为0
    int total = 10; // 初始题目数量为10
    float num1, num2, answer;//定义计算数和答案
    char sign;//定义符号为字符型

    printf("请输入练习难度1或2或3 -> ");
    scanf("%d", &level);

    while (1)
    {
        // 随机生成题目
        for (int i = 0; i < total; i++)
        {
            suijishu(level, &num1, &num2);
            sign = fuhao();
            printf("%.0f %c %.0f = ", num1, sign, num2);
            scanf("%f", &answer);
            if (fabs(answer - jisuan(num1, num2, sign)) < 0.01)
            {
                printf("正确!\n");
                correct++;
            }
            else
            {
                printf("错误!\n");
            }
        }

        // 计算得分
        score = correct * 10 / total;
        printf("本次得分:%d\n", score);

        // 根据得分升降级
        if (score >= 9)
        {
            level++;
            printf("恭喜你升级到等级%d!\n", level);
        }
        else if (score < 6)
        {
            level--;
            printf("很遗憾,你降级到等级%d!\n", level);
        }

        // 重置正确数量和题目数量
        correct = 0;
        switch (level)
        {
        case 1:
            total = 10;
            break;
        case 2:
            total = 10;
            break;
        case 3:
            total = 10;
            break;
        default:
            break;
        }


        // 判断是否通关
        if (level > 3)
        {
            printf("恭喜你通关了!\n");
            break;
        }
    }

    system("pause");
    return 0;
}

今天的内容就分享这么多
求三连!!!
求关注!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

NineSense

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

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

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

打赏作者

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

抵扣说明:

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

余额充值