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);
}
}