zoukankan      html  css  js  c++  java
  • C语言寒假大作战04

    这个作业属与那个课程 https://edu.cnblogs.com/campus/zswxy/CST2019-3
    这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/10278
    我在这个课程课程目标 上次作业的菜单框架,并在其基础上增加各年级题目操作函数
    这个作业在那个具体方面帮我实现目标 熟练使用码云,函数的基础知识
    参考文献 https://www.runoob.com/cprogramming/c-standard-library-stddef-h.html

    一.本周作业

    ㈠.2.2.2 设计思路和遇到的问题

    1.设计思路:
    怎样把答案用呈现出来
    2.遇到的问题:
    一直打不出三年级的题目答案。
    

    ㈡.2.2.3 程序结果截图



    ㈢.2.2.4 程序代码

    
    #include<stdio.h>
    #include<stdlib.h>
    #include <time.h>
    
    void memu();
    void help();
    void error();
    void one_grade();
    void two_grade();
    void three_grade();
    
    
    int control;
    //循环控制变量
    int flag;
    
    
    // 生成获取一个数字
    // base  = 10 生成10以内的数字
    // base = 100 生成100以内的数字
    // zero = 0 生成的数字不允许出现0
    // zero = 1 生成的数字允许出现0
    int get_number(int base, int zero)
    {
        int num = rand() % base;
        // 如果随机数为0,且不允许为0,就让它+1
        if (zero == 0 && num == 0)
        {
            return num + 1;
        }
        return num;
    }
    
    // 获取一个运算符
    // type = 2 为 + -
    // type = 4 为 + - * /
    char get_op(int type)
    {
        int i = rand() % type;
        char op[] = {'+','-','*','/'};
        return op[i];
    }
    
    // 获取表达式的值
    // 运算 a + - * / b
    double get_answer(double a, char op, double b)
    {
        switch(op)
        {
        case '+':
            return a + b;
        case '-':
            return a - b;
        case '*':
            return a * b;
        case '/':
            return a / b;
        default:
            printf("error op %c", op);
        }
        return 0.0;
    }
    
    // 计算优先级
    int op_cmp(char op1, char op2)
    {
        // 乘除优先级一致
        if (op1 == '*')
        {
            op1 == '/';
        }
        // 加减优先级一致
        if (op1 == '+')
        {
            op1 == '-';
        }
        // 减号的ASCII码是 45
        // 除号的ASCII码是 47
        // 这里如果op1比op2优先级高,差值就会大于0
        return op1 - op2;
    }
    
    
    //swith菜单选择变量
    int main()
    {
        printf("欢迎使用口算生成器:)
    
    ");
        help();
        do
        {
            control = 1;
            memu();
        }
        while(control);
        return 0;
    }
    
    //菜单函数定义
    void memu()
    {
        printf("操作列表:
    1)一年级    
    2)二年级     
    3三年级   
    4)帮助   
    5)退出程序)
    ");
        printf("请输入操作>");
        scanf("%d",&flag);
        switch(flag)
        {
        case 1:
            one_grade();
            break;
        case 2:
            two_grade();
            break;
        case 3:
            three_grade();
            break;
        case 4:
            help();
            break;
        case 5:
            printf("欢迎下次使用
    ");
            control=0;
            break;
        default:
            error();
        }
    }
    
    //错误函数定义
    void error()
    {
        printf("Error!!!
    错误操作指令,请重新输入
    
    
    ");
    }
    //帮助函数定义
    void help()
    {
        printf("帮助信息:
    ");
        printf("您需要输入命令代号来进行操作, 
    且一年级题目为不超过十位的加减法;
    二年级题目为不超过百位数的乘法;
    三年级题目为不超过百位的加减乘除混合题目");
    }
    
    
    //各个年级题目函数定义
    void one_grade()
    {
        int num;
        printf("<执行操作 :)
    
    现在是一年级题目:
    请输入生成的个数>
    
    :");
        scanf("%d",&num);
        printf("<执行操作:)
    
    ");
        int i =0, a = 0, b = 0, c = 0;
        char op = 0;
    
    
        for (i=0; i<num; i++)
        {
            // 获取 10 以内的数字,允许出现 0
            a = get_number(10, 1);
            b = get_number(10, 1);
            //  获取运算 + -
            op = get_op(2);
            c = get_answer(a, op, b);
            if (c < 0)
            {
                // 结果为负数的题目不应该出现在小学里面
                i--;
                continue;
            }
            printf("%2d %c %2d = %d
    ", a,op, b, c);
        }
    }
    
    
    void two_grade()
    {
        int num;
        printf("<执行操作 :)
    
    现在是二年级题目:
    请输入生成个数>
    
    ");
        scanf("%d",&num);
        printf("<执行操作:)
    
    ");
    
        int i =0, a = 0, b = 0;
        double c = 0;
        char op = 0;
    
        for (i=0; i<num; i++)
        {
            // 获取 100 以内的数字,允许出现 0
            a = get_number(100, 1);
            b = get_number(100, 1);
            // 获取运算 + - *  /
            op = get_op(4);
            c = get_answer(a, op, b);
            if (c < 0)
            {
                // 结果为负数的题目不应该出现在小学里面
                i--;
                continue;
            }
            printf("%2d %c %2d = %lf
    ", a,op, b, c);
        }
    }
    
    
    void three_grade()
    {
        int num;
        printf("<执行操作 :)
    
    现在是三年级题目:
    执
    请输入生成个数>
    
    ");
        scanf("%d",&num);
        printf("<执行操作 :)
    
    ");
        int i = 0, a = 0, b = 0, c = 0;
        double d = 0, e = 0, f = 0;
        char op = 0, op1 = 0, op2 = 0;
    
        for (i=0; i< num; i++)
        {
            op1 = get_op(4);
            op2 = get_op(4);
    
            a = get_number(100, 1);
            b = get_number(100, 1);
            c = get_number(100, 1);
    
            // 如果 前面的优先级大,就先算前面的
            if (op_cmp(op1, op2) > 0)
            {
                if (op1 == '/' && b == 0)
                {
                    // 被除数不能为0
                    b = get_number(100, 0);
                }
                // 先算前面的
                d = get_answer(a, op1, b);
                e = c;
                op = op2;
    
                if (d < 0)
                {
                    // 结果为负数的题目不应该出现在小学里面
                    i--;
                    continue;
                }
            }
            else
            {
                if (op2 == '/' && c == 0)
                {
                    // 被除数不能为0, 重新生成一个不为0的数
                    c = get_number(100, 0);
                }
                // 先算后面的
                d = a;
                e = get_answer(b, op2, c);
                op = op1;
    
                if (e < 0)
                {
                    // 结果为负数的题目不应该出现在小学里面
                    i--;
                    continue;
                }
            }
    
            // 被除数不能为0, 再来一次
            if (op == '/' && e == 0)
            {
                i--; // 这次的循环不计数
                continue;
            }
    
            f = get_answer(d, op, e);
            if (f < 0)
            {
                // 结果为负数的题目不应该出现在小学里面
                i--;
                continue;
            }
            printf("%2d %c %2d %c %2d = %lf
    ", a, op1, b, op2, c, f);
        }
    }
    
    
    

    ㈣.2.2.5

    ㈤.2.2.6 Gitee上传截图与链接

    个人链接 :https://gitee.com/hu_qing_qing

  • 相关阅读:
    日月
    硕人
    式微
    芣苡
    樛木
    兔罝
    绿衣
    汉广
    小星
    惠子相梁
  • 原文地址:https://www.cnblogs.com/huqingqing2/p/12322914.html
Copyright © 2011-2022 走看看