zoukankan      html  css  js  c++  java
  • 四则运算

    作业信息

    博客班级 软件工程
    作业要求 具体要求
    作业目标 理解并熟练使用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
    ", 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("
    ");											//将随机生成的分数进行约分后再输出
    		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
    ", 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("
    ");
    		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
    ", 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("
    ");
    		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(" 
    ");
    		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("四则运算题目生成程序
    ");
    		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
    ", 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|
  • 相关阅读:
    [包计划] date-fns
    [包计划] create-react-app
    [包计划] js-cookie
    [包计划] cheerio
    [包计划] 30-seconds-of-code
    new
    [源计划] array-first
    [源计划] is-sorted
    [源计划] array-flatten
    images
  • 原文地址:https://www.cnblogs.com/zhaorui123/p/13945887.html
Copyright © 2011-2022 走看看