四则运算

一.作业规范要求

发布一篇随笔,使用markdown语法进行编辑
文字准确,样式清晰
请在本次及之后的每次作业随笔的最前面加上以下内容

请在本次及之后的每次作业随笔的最前面加上以下内容

| 博客班级 | https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18 |
| ---- | ---- | ---- |
| 作业要求 | https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11377 |
| 作业目标 | <你理解的作业目标具体内容> |
| 学号 | <3180701113> |

二.题目要求

写一个能自动生成小学四则运算题目的程序,然后在此基础上扩展:

1)除了整数以外,还要支持真分数的四则运算,例如:1/6+1/8=7/24

2)程序要求能处理用户的输入,判断对错,累积分数

3)程序支持可以由用户自行选择加、减、乘、除运算

4)使用-n参数控制生成题目的个数,例如Myapp.exe -n 10,将生成10个题目

三.代码提交

1)提交你的源代码在你的博客上,注释好各个函数,给出相应解释,并把运行成功的界面粘贴到博客上;

2)要求逻辑清晰,界面整洁

#include <stdio.h>
#include<iostream>
#include <stdlib.h>
#include <time.h>
#include <string.h>
using namespace std;
typedef struct											//定义分数结构体
{
	int up, down;
}fraction;
int gcd(int a, int b)									//最大公约数
{
	if (b == 0) return a;
	return gcd(b, a % b);
}
void yuefen(int &a, int &b,int flag)					//分数约分,并自动进行输出,用flag标志答案,答案不输出
{
	int d = gcd(abs(a), abs(b));
	a /= d;
	b /= d;
	if (flag == 0) {
		if (b == 1)printf("%d", a);
		else printf("%d/%d", a, b);
	}
}	
void add(int num,fraction fraans[],int ans[])					//加法题目生成及运算
{
	int a, b, up1, down1, up2, down2,flag=0,i;
	for (i = 0; i <=num / 2; i++)						//整数部分
	{	
		unsigned int times = (unsigned int)time(0);				//生成随机数
		srand(times * (i + 1));
		a = rand() % 10 + 1;
		b = rand() % 10 + 1;
		ans[i] = a + b;
		printf("%d.%d+%d\n", i+1, a, b);						//输出整数题目
	}
	for (i = num/2+1; i < num; i++)						//分数部分
	{
		unsigned int times = (unsigned int)time(0);
		srand(times * (i + 1));
		up1 = rand() % 10 + 1;
		down1 = rand() % 10 + 1;
		up2 = rand() % 10 + 1;
		down2 = rand() % 10 + 1;
		printf("%d.", i + 1);
		yuefen(up1, down1,flag);
		printf("+");
		yuefen(up2, down2,flag);
		printf("\n");											//将随机生成的分数进行约分后再输出
		fraans[i].up = up1 * down2 + up2 * down1;				
		fraans[i].down = down1 * down2;
		flag = 1;												//用flag标志答案,对答案不进行输出
		yuefen(fraans[i].up, fraans[i].down,flag);
		flag = 0;
	}
}

void subtract(int num, fraction fraans[], int ans[])			//减法题目生成及运算
{
	int a, b, up1, down1, up2, down2,flag=0,i;
	for (i = 0; i <= num / 2; i++)
	{
		unsigned int times = (unsigned int)time(0);
		srand(times * (i + 1));
		a = rand() % 10 + 1;
		b = rand() % 10 + 1;
		ans[i] = a - b;
		printf("%d.%d-%d\n", i, a, b);
	}
	for (i = num / 2 + 1; i < num; i++)
	{
		unsigned int times = (unsigned int)time(0);
		srand(times * (i + 1));
		up1 = rand() % 10 + 1;
		down1 = rand() % 10 + 1;
		up2 = rand() % 10 + 1;
		down2 = rand() % 10 + 1;
		printf("%d.", i + 1);
		yuefen(up1, down1, flag);
		printf("-");
		yuefen(up2, down2, flag);
		printf("\n");
		fraans[i].up = up1 * down2 - up2 * down1;
		fraans[i].down = down1 * down2;
		flag = 1;
		yuefen(fraans[i].up, fraans[i].down, flag);
		flag = 0;
	}
}

void multiply(int num, fraction fraans[], int ans[])			//乘法题目生成及运算
{
	int a, b, up1, down1, up2, down2,flag = 0,i;
	for (i = 0; i <= num / 2; i++)
	{
		unsigned int times = (unsigned int)time(0);
		srand(times * (i + 1));
		a = rand() % 10 + 1;
		b = rand() % 10 + 1;
		ans[i] = a * b;
		printf("%d.%d*%d\n", i+1, a, b);
	}
	for (i = num / 2 + 1; i < num; i++)
	{
		unsigned int times = (unsigned int)time(0);
		srand(times * (i + 1));
		up1 = rand() % 10 + 1;
		down1 = rand() % 10 + 1;
		up2 = rand() % 10 + 1;
		down2 = rand() % 10 + 1;
		printf("%d.", i + 1);
		yuefen(up1, down1, flag);
		printf("*");
		yuefen(up2, down2, flag);
		printf("\n");
		fraans[i].up = up1 * up2;
		fraans[i].down = down1 * down2;
		flag = 1;
		yuefen(fraans[i].up, fraans[i].down, flag);
		flag = 0;
	}
}

void divide(int num, fraction fraans[])						//除法题目生成及运算
{
	int up1, down1, up2, down2, flag = 0;
	for (int i = 0; i < num; i++)
	{
		unsigned int times = (unsigned int)time(0);
		srand(times * (i + 1));
		up1 = rand() % 10 + 1;
		down1 = rand() % 10 + 1;
		up2 = rand() % 10 + 1;
		down2 = rand() % 10 + 1;
		printf("%d. ", i + 1);
		yuefen(up1, down1, flag);
		printf(" / ");
		yuefen(up2, down2, flag);
		printf(" \n");
		fraans[i].up = up1 * down2;
		fraans[i].down = down1 * up2;
		flag = 1;
		yuefen(fraans[i].up, fraans[i].down, flag);
		flag = 0;
	}
}

int main()
{

	int m=1;
	fraction fraans[400], userfraans[400];
	int ans[100] = { 0 }, userans[100] = { 0 },i;
	int num, symbol, grade;
	printf("\n\n\n\t\t\t*****欢迎使用四则运算生成程序*****\n");
	printf("\t\t\t\t   1.加法运算");
	printf("\n\t\t\t\t   2.减法运算");
	printf("\n\t\t\t\t   3.乘法运算");
	printf("\n\t\t\t\t   4.除法运算");
	printf("\n\t\t\t\t   0.退出");
	while(m)
	{
label:	printf("\n请选择符号0、1、2、3、4:");
		scanf("%d", &symbol);
		grade=0;//用symbol标志用户选择的符号,1234对应加减乘除;
		switch (symbol)														//对应选择不同的算法
		{
		case 0:m=0;break;
		case 1:			
			printf("请输入题目数量(最少为2,最大100):");
			scanf("%d", &num);add(num, fraans, ans); break;
		case 2:			
			printf("请输入题目数量(最少为2,最大100):");
			scanf("%d", &num);subtract(num, fraans, ans); break;
		case 3:			
			printf("请输入题目数量(最少为2,最大100):");
			scanf("%d", &num);multiply(num, fraans, ans); break;
		case 4:			
			printf("请输入题目数量(最少为2,最大100):");
			scanf("%d", &num);divide(num, fraans); break;
		default:
		    printf("请重新输入:");
			goto label;
		
		}
		if(m!=0)
		{	

			if (symbol != 4)													//当用户选择的运算不为除法时,分别对整数和分数答案进行保存
			{

				for ( i = 0; i <= num / 2; i++)
				{
					printf("第%d道题的答案为:", i + 1);
					scanf("%d", &userans[i]);
				}
				for ( i = num / 2 + 1; i < num; i++)
				{
					printf("第%d道题的答案为:", i + 1);
					if (fraans[i].down == 1)
					{
						scanf("%d", &userfraans[i].up);
						userfraans[i].down = 1;
					}
					else
					{
						scanf("%d/%d", &userfraans[i].up, &userfraans[i].down);
					}
				}
			}
		else																//当用户选择为出发时,对用户输入的答案进行保存
		{
			for ( i = 0; i < num; i++)
			{
				printf("第%d道题的答案为:", i + 1);
				if (fraans[i].down == 1)
				{
					scanf("%d", &userfraans[i].up);
					userfraans[i].down = 1;
				}
				else
				{
					scanf("%d/%d", &userfraans[i].up, &userfraans[i].down);
				}
			}
		}
	
		for ( i = 0; i <= num / 2; i++)									//对用户输入的答案和答案进行对比,如果一致,得分+1
		{
			if (userans[i] == ans[i])grade++;
		}
		for ( i = num / 2 + 1; i < num; i++)
		{
			if (userfraans[i].up == fraans[i].up && userfraans[i].down == fraans[i].down)grade++;
		}
		printf("grade=%d\n", grade);
		}
		
	}
}

运行结果:
1.加法:

2.减法:

3.乘法:

4.除法:

四.个人小结

1)在软件开发中,掌握时间是一个很重要的技能,请通过psp表格做到:

a.理清开发的完整环节,争取在每个环节都有实际的工作,一开始边界不清楚是正常的,但请尝试按照自己的理解努力对应每个环节的实际工作

b.预估每个环节的时间,并真实统计这些环节的耗时,在完成后填写完整的psp耗时表

c.这些表格是给自己看的,请不要伪造数据

d.psp表格模板如下,表格里的时间只是示意

psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 300 400
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 380 370
Development 开发 20 20
Analysis 需求分析(包括学习新技术) 25 30
Design Spec 生成设计文档 40 30
Design Review 设计复审 40 35
Coding Standard 代码规范 15 20
Design 具体设计 15 10
Coding 具体编码 120 150
Code Review 代码复审 20 10
Test 测试(自我测试,修改代码,提交修改) 30 30
Reporting 报告 15 10
Test Report 测试报告 20 15
Size Measurement 计算工作量 20 15
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 20 25

2)如果所有环节你都认真做了,那么,此处,你应该有许多经验愿意与大家分享。
代码虽然不完全是自己一个人完成的,但是确实学到了许多东西。另外,也学会了使用博客写博文,受益匪浅!

posted @ 2020-11-08 16:40  慕阳*  阅读(112)  评论(0编辑  收藏  举报