四则运算

作业通知

| 博客班级 | AHPU-软件工程导论-计算机18级 |
| ---- | ---- | ---- |
| 作业要求 | 个人作业-四则运算题目生成程序 |
| 作业目标 | 学会markdown |
| 学号 | 3180701231 |

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

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

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

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

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

二、代码提交

#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()
{
	char f = 'Y';
	while(f!='N'&&f!='n')
	{
		fraction fraans[400], userfraans[400];
		int ans[100] = { 0 }, userans[100] = { 0 },i;
		int num, symbol, grade = 0;
		printf("四则运算题目生成程序\n");
		printf("请输入数字1,2,3,4,分别对应加减乘除:\n");
	
		scanf("%d", &symbol);												//用symbol标志用户选择的符号,1234对应加减乘除;
		printf("请输入生成题目数量(最少为2,最大100):\n");
		scanf("%d", &num);
		switch (symbol)														//对应选择不同的算法
		{
		case 1:add(num, fraans, ans); break;
		case 2:subtract(num, fraans, ans); break;
		case 3:multiply(num, fraans, ans); break;
		case 4:divide(num, fraans); break;
		}
		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);
		printf("是否继续做题?(Y/N)");
		cin >> f;
		if (f != 'N' && f != 'n')system("cls");
		else return 0;
	}
}

三、运行截图

1.加法运算截图

2.减法运算截图

3.乘法运算截图

4.除法运算截图

四、个人小结

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

收获

    这是我第一次在博客园使用markdown编辑器,之前在学习python时候也使用过,俩者对比之下,jupyter notebook中的UI和工具按钮相对更让人舒适,而博客园更多是要自己编写语法。本次博客是软件工程课程一次题目作业,根据题目的要求进行对应的编程,整个过程其目的还是让我们初步了解和认识博客园的使用。

posted @ 2020-11-08 23:44  可依旧少年  阅读(102)  评论(0编辑  收藏  举报