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("欢迎使用口算生成器:)\n\n");
    help();
    do
    {
        control = 1;
        memu();
    }
    while(control);
    return 0;
}

//菜单函数定义
void memu()
{
    printf("操作列表:\n1)一年级    \n2)二年级     \n3三年级   \n4)帮助   \n5)退出程序)\n");
    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("欢迎下次使用\n");
        control=0;
        break;
    default:
        error();
    }
}

//错误函数定义
void error()
{
    printf("Error!!!\n错误操作指令,请重新输入\n\n\n");
}
//帮助函数定义
void help()
{
    printf("帮助信息:\n");
    printf("您需要输入命令代号来进行操作, \n且一年级题目为不超过十位的加减法;\n二年级题目为不超过百位数的乘法;\n三年级题目为不超过百位的加减乘除混合题目");
}


//各个年级题目函数定义
void one_grade()
{
    int num;
    printf("<执行操作 :)\n\n现在是一年级题目:\n请输入生成的个数>\n\n:");
    scanf("%d",&num);
    printf("<执行操作:)\n\n");
    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\n", a,op, b, c);
    }
}


void two_grade()
{
    int num;
    printf("<执行操作 :)\n\n现在是二年级题目:\n请输入生成个数>\n\n");
    scanf("%d",&num);
    printf("<执行操作:)\n\n");

    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\n", a,op, b, c);
    }
}


void three_grade()
{
    int num;
    printf("<执行操作 :)\n\n现在是三年级题目:\n执\n请输入生成个数>\n\n");
    scanf("%d",&num);
    printf("<执行操作 :)\n\n");
    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\n", a, op1, b, op2, c, f);
    }
}


㈣.2.2.5

㈤.2.2.6 Gitee上传截图与链接

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

posted @ 2020-02-17 18:16  GoblinQ  阅读(309)  评论(0编辑  收藏  举报
复制代码