C语言寒假大作战04

这个作业属于哪个课程 班级链接
这个作业要求在哪里 C语言寒假大作战04
这个作业的目标 使用上次作业的菜单框架,并在其基础上增加各年级题目的答案函数
作业正文 如下所示
参考文献 %g与%d还有很多比如百度百科之类的

设计思路和遇到的问题

思路

在原本的操作上加入加和操作,然后先从一年级开始,再写二年级,最后写三年级的。

问题

最大的问题还是关于优先级的判断

之前我是使用if-else语句,一层层的嵌套让我的思维很是混乱。但是在学长的帮助下,我理清楚了中间的关系,转而使用switch作为主体的优先级判断,这的确方便了很多

后面又出现了一些问题,大多是switch中的使用,经常弄混符号两边的数字到底是什么,导致答案可能将同一个数字以不同的方式算了两边,而另一个数字却没有计算,而答案错误。

程序结果截图




程序代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include<stdlib.h>
#include<time.h>

void help();
int menu();
void error();
void grade_1();
void grade_2();
void grade_3();
double answer(double a, double b, double c, char d, char e);

int main()
{
	int grade = 1;c

	printf("========== 口算生成器 ==========\n");
	printf("欢迎使用口算生成器 :)\n");
	printf("\n\n");

	help();
	while (grade)
	{
		grade = menu();

		switch (grade)
		{
		case 1: grade_1(); break;
		case 2: grade_2(); break;
		case 3: grade_3(); break;
		case 4: help(); break;
		case 5: grade = 0; break;
		default: error(); grade = 1; break;
		}
	}
	printf("程序结束, 欢迎下次使用\n");
	printf("任意键结束……");

	_getch();
	return 0;
}

void help()
{
	printf("帮助信息:\n");
	printf("您需要输入命令代号来进行操作, 且\n");
	printf("一年级题目为不超过十位的加减法;\n");
	printf("二年级题目为不超过百位的乘除法;\n");
	printf("三年级题目为不超过百位的加减乘除混合题目.\n");
	printf("\n\n");
}

int menu()
{
	int a = 0;
	printf("操作列表:\n");
	printf("1)一年级    2)二年级    3)三年级\n");
	printf("4)帮助      5)退出程序\n");
	printf("请输入操作> ");
	scanf("%d", &a);
	printf("< 执行操作 :)\n");
	printf("\n\n");
	return a;
}

void error()
{
	printf("Error!!!报错了哦乖乖别乱按哦\n");
	printf("错误操作指令, 请重新输入\n");
	printf("\n\n");
}

void grade_1()
{
	printf("现在是一年级题目\n");
	int num = 0;
	printf("请输入所需要的题目个数>");
	scanf("%d", &num);
	printf("< 执行操作 :)\n\n");

	int a, b, c;
	srand((unsigned)time(NULL));

	printf("/*----- 一年级 -----*/\n\n");

	for (int i = 0; i < num; i++)
	{
		a = rand() % 10;
		b = rand() % 10;
		c = rand() % 2;
		if (c == 0)
		{
			printf("%d + %d = %d\n", a, b, a + b);
		}
		else
		{
			printf("%d - %d = %d\n", a, b, a - b);
		}
	}
}

void grade_2()
{
	printf("现在是二年级题目:\n");
	int num = 0;
	printf("请输入所需要的题目个数");
	scanf("%d", &num);
	printf("< 执行操作 :)\n\n");

	double a, b, c;
	srand((unsigned)time(NULL));

	printf("/*----- 二年级 -----*/\n\n");

	for (int i = 0; i < num; i++)
	{
		a = rand() % 100;
		b = rand() % 100;
		c = rand() % 2;
		if (c == 0)
		{
			printf("%2g * %2g = %g\n", a, b, a * b);
		}
		else
		{
			printf("%2g / %2g = %g\n", a, b + 1, a / (b + 1));
		}
	}
}

int num_dividend()
{
	for (int i = 0; true; i++)
	{
		if (i = rand() % 100)
			return i;
	}
}

char four_arithmetic(int num)
{
	switch (num)
	{
	case 1: return '+';
	case 2: return '-';
	case 3: return '*';
	case 0: return '/';
	}
}
void grade_3()
{
	printf("现在是三年级题目:\n");
	int num = 0;
	printf("请输入所需要的题目个数");
	scanf("%d", &num);
	printf("< 执行操作 :)\n\n");

	printf("/*----- 三年级 -----*/\n\n");

	double a = 0, b = 0, c = 0;
	char d, e;
	for (int i = 0; i < num; i++)
	{
		printf("%2g %c %2g %c %2g = %g\n", a = num_dividend(), d = four_arithmetic(rand() % 4),
			b = num_dividend(), e = four_arithmetic(rand() % 4), c = num_dividend(), answer(a, b, c, d, e));
	}
}

double answer(double a, double b, double c, char d, char e)
{
	double result = 0;
	if (d == '*' || d == '/')
	{
		switch (d)
		{
		case '*': result = a * b; break;
		case '/': result = a / b; break;
		}

		switch (e)
		{
		case '+': return result + c;
		case '-': return result - c;
		case '*': return result * c;
		case '/': return result / c;
		}
	}
	else if (e == '*' || e == '/')
	{
		switch (e)
		{
		case '*': result = b * c; break;
		case '/': result = b / c; break;
		}

		switch (d)
		{
		case '+': return a + result;
		case '-': return a - result;
		case '*': return a * result;
		case '/': return a / result;
		}
	}
	else
	{
		switch (d)
		{
		case '+': result = a + b; break;
		case '-': result = a - b; break;
		}

		switch (e)
		{
		case '+': return result + c;
		case '-': return result - c;
		}
	}
}

Gitee上传截图与链接

一只雯子


posted @ 2020-02-06 13:15  orange_toffee  阅读(162)  评论(0编辑  收藏  举报