桃夭不妖

导航

四则运算

作业信息

博客班级 软件工程
作业要求 具体要求
作业目标 理解并熟练使用Markdown算法
学号 3180701229

作业要求

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

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()
{
	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对应加减乘除:");
		scanf("%d", &symbol);												//用symbol标志用户选择的符号,1234对应加减乘除;
		printf("请输入题目数量(最少为2,最大100):");
		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) |

  • | :-: | :-: | :-: | -:
    Planing |计划 |10 |20 |
    Estimate |估计这个任务需要多少时间,
    并规划大致工作步骤 |10 | 10 |
    Development |开发| 200| 500|
    Analysis |需求分析(包括学习新技能)|30|80|
    Design Spec|生成设计文档|15|30|
    Design Review|设计审核|15|15|
    Coding Standard|代码规范|5|10|
    Design|具体设计|10|15|
    Coding|具体编码|200|200|
    Code Review|代码复核|20|25|
    Test|测试(自我测试,修改代码
    提交修改)|60|60|
    Reporting|报告|15|15|
    Test Report|测试报告|5|8|
    Size Measurement|计算工作量|20|25|
    Postmortem & Process
    Improvement|事后总结,并提出过程修改计划|5|5|

posted on 2020-11-08 21:13  桃夭不妖  阅读(116)  评论(0编辑  收藏  举报