• 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的时候会省下大量的时间。

  • 相关阅读:
    前端安全-XSS攻击
    leetcode-0003 无重复字符的最长子串
    leetcode-0002 两数相加
    leetcode-0001 两数之和
    数据结构篇-数组(TypeScript版+Java版)
    前端性能优化(一)-- 文件的压缩与合并
    《深入浅出RxJS》读书笔记
    python工具函数
    [其他]Ubuntu安装genymotion后unable to load VirtualBox engine
    [linux]CentOS无法使用epel源
  • 原文地址:https://www.cnblogs.com/librarian1/p/8646841.html
Copyright © 2020-2023  润新知