2016012036+小学四则运算练习软件项目报告

需求分析

  首先明确项目需要,一个可以定做小学四则运算的程序。所以需要我们能够随机生成不同的四则运算,范围应在100以内,包含“+,-,*,÷”四种操作。要求:不存在小数,题目尽量不重复。

功能设计

  基本功能应当包括,读入用户想要定制的算式数,以及对应的运算符数量,然后生成对应数目和难度的四则运算式子。并由程序自己计算,给出相应的答案。

  扩展功能可以用:在算式中包含括号,计算存在真分数的式子。

设计实现

  由计算机生成随机的第一个数字、运算符、后续数字、完成计算、显示结果等等。

  在生成后续数字时,可以限定生成条件以保证运算结果不会出现分数和负数的情况。

代码详解

 Lib类中 

 1 static String createFormula()
 2     {
 3         int  digital, sign = 0;
 4         char symbol = 0;
 5         String formula = "";
 6
 7         digital = (int)(Math.random()*20);
 8         formula = formula + digital;
 9
10         for(int i=0; i<5; i++)
11         {
12             if(sign >= 2)
13                 sign = (int)(Math.random()*2);
14             else sign = (int)(Math.random()*4);
15
16             if(sign == 0) {
17                 symbol = ‘+‘;
18                 digital = (int)(Math.random()*20+1);
19             }
20             else if(sign == 1) {
21                 symbol = ‘-‘;
22                 digital = (int)(Math.random()*digital+1);   //??è¥é?ò???digital
23             }
24             else if(sign == 2) {
25                 symbol = ‘*‘;
26                 digital = (int)(Math.random()*(100/(digital+1))+1);
27
28             }
29             else if(sign == 3) {
30                 symbol = ‘÷‘;
31                 for(int j=2; j<=digital; j++)
32                     if(digital%j == 0) {
33                         digital = j;
34                         break;
35                     }
36             }
37             formula = formula + symbol + digital;
38         }
39         return formula;
40     }

使用createFormula()创建算式,:

  1、随机生成算式第一个数(20以内)

  2、依次确定(生成)五个运算符以及第二个数字

    (1)sign用于避免出现连续的“乘”、“除”运算(原理:sign随机确定运算符,sign的上一个值>=2时,后面生成的运算符只有“+”、“-”)

    (2)为避免出现负数,当sign为“-”时,后一个数的生成范围为“比上一个数小”

    (3)当sign为“×”时,为避免出现大雨100的结果,第二个数的生成范围为[0,100/上一个数]

    (4)当sign为“÷”时,为保证不出现分数,第二个数为 [2~第一个数] 这个范围内找“第一个数的因数”生成

  3、实现字符串拼接

	static int answerFormula(String formula)
	{
		char[] charArray = formula.toCharArray();
		int[] stackForInt = new int[10];
		char[] stackForChar = new char[10];
		int topOfInt = -1, topOfChar = -1, num = 0;

		for(int i=0; i<charArray.length; i++){

			//System.out.println(i+" :"+topOfInt+" "+topOfChar);

			if(Character.isDigit(charArray[i])) {
				num = num*10 + charArray[i]-‘0‘;
				if(i == charArray.length - 1)
					stackForInt[++topOfInt] = num;
			}
			else {
				stackForInt[++topOfInt] = num;
				num = 0;

				if(topOfChar == -1) stackForChar[++topOfChar] = charArray[i];
				else if(charArray[i]==‘*‘ || charArray[i]==‘÷‘) {
					if(stackForChar[topOfChar] == ‘*‘ || stackForChar[topOfChar] == ‘÷‘) {
						int num1 = stackForInt[topOfInt--];
						int num2 = stackForInt[topOfInt--];
						char symbol = stackForChar[topOfChar--];
						if(symbol == ‘*‘) stackForInt[++topOfInt] = num1 * num2;
						else if(symbol == ‘÷‘) stackForInt[++topOfInt] = num2 / num1;

						stackForChar[++topOfChar] = charArray[i];
					}
					else if(stackForChar[topOfChar] == ‘+‘ || stackForChar[topOfChar] == ‘-‘) {
						stackForChar[++topOfChar] = charArray[i];
					}

				}
				else if(charArray[i]==‘+‘ || charArray[i]==‘-‘) {
					if(topOfChar == -1) stackForChar[++topOfChar] = charArray[i];
					else {
						while(topOfChar != -1) {
							int num1 = stackForInt[topOfInt--];
							int num2 = stackForInt[topOfInt--];
							char symbol = stackForChar[topOfChar--];
							if(symbol == ‘+‘) stackForInt[++topOfInt] = num1 + num2;
							else if(symbol == ‘-‘) stackForInt[++topOfInt] = num2 - num1;
							else if(symbol == ‘*‘) stackForInt[++topOfInt] = num1 * num2;
							else if(symbol == ‘÷‘) stackForInt[++topOfInt] = num2 / num1;
						}
					}
					stackForChar[++topOfChar] = charArray[i];
				}
			}
		}

		while(topOfChar!=-1) {
			int num1 = stackForInt[topOfInt--];
			int num2 = stackForInt[topOfInt--];
			char symbol = stackForChar[topOfChar--];
			if(symbol == ‘+‘) stackForInt[++topOfInt] = num1 + num2;
			else if(symbol == ‘-‘) stackForInt[++topOfInt] = num2 - num1;
			else if(symbol == ‘*‘) stackForInt[++topOfInt] = num1 * num2;
			else if(symbol == ‘÷‘) stackForInt[++topOfInt] = num2 / num1;
		}

		return stackForInt[0];
	}

答案部分:使用中序运算式转成后序运算式以计算表达式

  1、stackForInt:模拟int栈

  2、stackForChar:模拟字符栈

  3、topOfChar / topOfInt:模拟栈顶

将string类型的算式转化成数组

用中序运算读取字符数字并计算得出答案

static void printFormula(String[] formulaList, int n)throws IOException
	{
		FileOutputStream fs = new FileOutputStream(new File("result.txt"));
		PrintStream p = new PrintStream(fs);
			p.println("2016012036");
        for(int i=0; i<n; i++)
            p.println(formulaList[i]);
		p.close();
	}

  在result中显示结果(优先显示学号信息)

在Main中

public static void main(String args[])
	{
		Scanner input = new Scanner(System.in);
		int n;
		n = input.nextInt();
		String[] formulaList = new String[50];
		for(int i=0; i<n; i++)
		{
			 formulaList[i] = Lib.createFormula();
			//System.out.println(formula);
			int answer = Lib.answerFormula(formulaList[i]);

			formulaList[i] = formulaList[i] + ‘=‘ + answer;
		}

		try {
				Lib.printFormula(formulaList, n);
			}
        	catch(IOException ioe) {
		        ioe.printStackTrace();
        	}
	}

  主函数循环n次,生成n个式子并完成计算,catch异常。

结果展示

基本实现了基础功能

用“模块化”将代码分块实现,避免了很多不必要的麻烦,整个项目实现起来也更加流畅,思路更加清晰,对效率的提高有很大帮助。

PSP展示

  这次作业战线拉得特别长,从分块方式等开始慢慢构思,很多思考过程都是在平时的生活中完成的,而且在实现过程中因为不熟练,每天的进度非常低,所以并没有使用PSP……而且之前也败在没有真正习惯事先定好时间计划,所以实在没办法进行PSP展示。

原文地址:https://www.cnblogs.com/yfxxg/p/8646221.html

时间: 2024-11-09 14:29:37

2016012036+小学四则运算练习软件项目报告的相关文章

2016011990小学四则运算练习软件项目报告

 小学四则运算练习软件项目报告 项目克隆地址:https://git.coding.net/chenf640/workhome2_2.git 目录: 一.需求分析 二.功能设计 三.设计实现 四.算法详解 五.测试运行 六.代码展示 七.psp 八.总结 -------------------------------------------------- 一.需求分析 (一)功能需求  基本功能: 程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题. 每个数字

2016012075+小学四则运算练习软件项目报告

2016012075+小学四则运算练习软件项目报告 一.需求分析 二.功能设计 三.设计实现 四.算法详解 五.测试详解 六.代码展示 七.总结 八.PSP展示 coding.net地址:https://git.coding.net/sparkleStar/arithmetic.git,代码在Main.java中 一.需求分析 1.编写目标 使用Java编程语言,独立完成一个3到5个运算符的四则运算练习的命令行软件开发. 2.基本功能需求 (1)程序可接收一个输入参数n,然后随机产生加减乘除(分

2016012002+小学四则运算练习软件项目报告

项目报告目录: 一.感想 二.需求分析 三.功能设计 四.设计实现 五.算法详解 六.测试运行 七.总结反思 八.PSP展示 代码仓库地址:https://git.coding.net/Vsmile1997/symx.git测试效果见src下生成的result.txt文件 一.感想 我把感想写在第一部分,是想首先谈谈完成这个项目的体验和感悟.重新梳理程序的代码思路,满满的完成任务的成就感和如释重负的轻松感. 从拿到作业的起初,我把问题过度放大了.Java?我还要重新拿起那本大厚书学习Java?出

2016012098+小学四则运算练习软件项目报告

项目地址:https://git.coding.net/meiyoupiqidefan/Four-Operations.git 目录: 一.需求分析 二.功能设计 三.设计实现 四.算法详解 五.测试运行 六.粘贴代码 七.总结 八.展示PSP ---------------------------- 一.需求分析 由于每次出题的数目不定,所以要求题数参数n由控制台输入 小学生水平有限,故每个数字在 0 和 100 之间,运算符在3个到5个之间. 为了让小学生得到充分锻炼,每个练习题至少要包含2

2016011986+小学四则运算练习软件项目报告

我的项目源码地址:https://coding.net/u/Dearpangpang/SiZeYunSuan.git/git.html 项目需求: 软件基本功能要求如下: 程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在0和100之间,运算符在3个到5个之间. 为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符.同时,由于小徐生没有分数和负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出(3÷5+2=2.6,2-5+10

小学四则运算练习软件项目报告

Github的仓库主页链接地址:https://github.com/cy0325/CulClation.git 一.实验要求 软件基本功能要求如下: 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符是3-4个. 为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符.同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3/5+2=2.6,2-5+10=7等算式. 练习题生成好后,将你的学号与生成的

2016012015+小学四则运算练习软件项目报告

1.仓库地址:https://git.coding.net/FrrLolix/Calculate.git 2.需求分析: ①程序接受一个输入的参数n后,随机生成n道四则运算式,其中要保证生成的运算式的运算符在3-5个之间,同时程序对生成的运算式自动求解,结果和运算式一同输出到result.txt文件中. ②因为面向对象是小学生,所以要保证生成的运算式中不出现负数和小数,运算的结果也不能出现负数和小数. ③程序需要判断输入的参数n是否合法,在不合法时要进行一定的处理. ④在原有的基础上,生成的运算

2016012034+小学四则运算练习软件项目报告

代码仓库地址:https://coding.net/u/Siamese_miao/p/fourArithmetic/git?public=true 测试效果见src下生成的result.txt文件 一. 需求分析 1.  使用JAVA编程语言. 2.  接收一个输入参数n,随机产生n道四则运算练习题,符号用+-*÷来表示. 3.  每个数字在 0 和 100 之间. 4.  运算符在3个到5个之间并且每道练习题至少要包含2种运算符. 5.  运算过程中不得出现负数与非整数. 6.  将学号和生成

2016012054+小学四则运算练习软件项目报告

作业源代码地址:https://git.coding.net/mal123/elementary_arithmetic.githttps://git.coding.net/mal123/elementary_arithmetic.githttps://git.coding.net/mal123/elementary_arithmetic.githttps://git.coding.net/mal123/elementary_arithmetic.githttps://git.coding.net