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

仓库:https://git.coding.net/librarian1/Calculate_Operations.git

  • 目录
    • 需求分析
    • 功能设计
    • 设计实现
    • 算法详解
    • 测试运行
    • 代码展示
    • 总结
    • 展示PSP

1.需求分析

  • 输入n,生成n道加减乘除
    要求:数范围0~100 ,4-6个;运算符3~5个,至少2种 ;数与结果不出现负数和非整数,除数不为0。
  • 附加:支持括号,大于2个但不超过运算符数 ;支持真分数的加减,自动化简 ;真分数2-3个,3个时包括加减。

2.功能设计

  • 基本功能
    输入n ,判断合法
    随机生成符合要求的算符和算子,计算结果并判断合法(正负和分母不为0),输出并生成文件result.txt,判断创建文件 。
  • 扩展功能
    随机产生带括号的正整数运算或真分数运算。

3.设计实现

4.算法详解

生成算子算符 —— 算结果并判断合法——生成算式(加括号)——输出

如何使用调度场算法

  1. 先随机生成一串算子(真分数或整数)和一串算符(加减乘除2种以上),存入两个链表

算子:A B C D
算符:x y z

2.算结果并判断合法、化简

  • 情况1:如果是真分数加减不用加括号
    逐步计算化简出结果,一旦过程出现负数或分母为零,则跳出

A x B y C z D (全是加减运算)

  • 情况2:整数加减乘除,有优先级
    逐步计算出结果,一旦过程出现负数或分母为零,则跳出

A x B y C z D

注意:这其中会出现A + B * C从左至右的运算,但之后输出算式会是(A + B)* C

3.生成算式(加括号)

  • 情况1:如果是真分数加减直接输出

  • 情况2:整数加减乘除
    设置2个整型priority1 ,priority2 对算子串中前后两个算子进行优先级判断,+-为低优先级0,×/为高优先级1。
    如果priority1 ,priority2 为 01 那么在两端加括号,否则00 10 11则不加。

5.测试运行

6.代码展示

括号的实现

    	int priority1 = 0, priority2 = 0; // 加减乘除优先级
    	p = OperatorL.first;
    	q = CharaL.first;
    	String operation = p.data + "";
            
        ……
    	else //生成分数算式
    	{
    		while(!(q == null))
    		{
			    p = p.next;
				String fchara = q.character;
				priority1 = priority2 = 0;
				
				if(!(q.next == null)) //如果不是最后一个算子,那么判断前后算子优先级
				{
					String lchara = q.next.character;

					if(fchara == "+"  || fchara == "-")
						priority1 = 0;
					else if(fchara == "*" || fchara == "/")
						priority1 = 1;
					   				 	
					if(lchara == "+" || lchara == "-")
						priority2 = 0;
					else if(lchara == "*" || lchara == "/")
						priority2 = 1; 						
				}
			 
			 	if(priority1 == 0 && priority2 == 1)
			 	{
			 		operation ="(" + operation + q.character 
			 				   + p.data  + ")"; //低优先级在高优先级前,那么两边加括号
			 	}
			 	else
			 	{
			 		operation = operation + q.character + p.data;
			 	}
			    q = q.next;
    		}	

7.总结:

我在设计阶段大概画出了算法流程和类,所以编程的时候就先生成空方法和空类的框架,再具体的模块中输代码,其中需要多次调用的方法greatestcommondivisor和链表方法都单独列出,使代码简洁。这种自上而下的编程确实比逐步编程高效,但只有在比较复杂和庞大的项目中才得以体现。

8.展示PSP

任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
计划 10 10
· 估计这个任务需要多少时间,并规划大致工作步骤 10 10
开发 440 860
· 需求分析 (包括学习新技术) 20 30
· 生成设计文档 20 10
· 设计复审 (和同事审核设计文档) 5 5
· 代码规范 (为目前的开发制定合适的规范) 5 5
· 具体设计 60 90
· 具体编码 240 540
· 代码复审 30 60
· 测试(自我测试,修改代码,提交修改) 60 120
报告 25 12
· 测试报告 10 5
· 计算工作量 5 2
· 事后总结, 并提出过程改进计划 10 5

我在具体编码的时间和测试的时间比预计高出许多,但在这一过程中算法反而不是我编程过程中所遇到的难题,但是因为对编程不熟练,出现了很多编译错误,其中一个NullPointer的错误让我调试了一个多小时。

同时我也体会到了注释的重要性,如果注释了不确定或不理解的地方,那么debug的时候会省下大量的时间。

原文地址:https://www.cnblogs.com/librarian1/p/8646841.html