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

 

 

Coding.net源码仓库地址:https://coding.net/u/hahahahaoleng/p/calc_demo/git

一、需求分析

1,程序可以接收一个参数n,然后随机生成n道小学四则运算题

2,每个数字都必须在0~100以内

3,每个运算式必须包括3~5个运算符并且至少有两种运算符

4,运算式在运算过程中不能出现小数以及负数

5,将学号以及输出的n道运算题包括答案一起输出到result.txt文件中

 

二、功能设计

需要两个数组,一个用来装数字,一个用来装符号。

分析加减乘除的具体情况。

写出两组随机数分别随机数字与符号

重点解决负数,整除问题。 

 

 

 、设计实现

      使用了两个 逆波兰公式,一个用来产生随机的四则运算,一个用来判断其是否符合要求,即计算过程中有无出现分数小数的情况。如何生成随机四则运算不算太艰难,但是如何去除小数,负数,无法整除的情况是难点重点。我使用了两个 逆波兰公式,一个用来产生随机的四则运算,一个用来判断其是否符合要求,即计算过程中有无出现分数小数的情况。

 

四、算法详解

   通过random函数随机生成两组随机数,第一组代表数字,第二组每一个数字代表一种符号。

         我使用了逆波兰表达式逆波兰表达式,逆波兰表达式又叫做后缀表达式。它的语法规定,表达式必须以逆波兰表达式的方式给出。

         解决小数,负数的问题上,运用了Boolean方法。以true false 来进行判断。

五、测试运行

 

 

 

 

 

 

 

 

六、代码展示

产生随机数,符号

 char[] ch = {'+','-','*','/'}; //字符数组
            Random r = new Random();
   
                int x,i=0; 
                System.out.println("2016012080");
                System.out.print ("请输入题目的数量:");
                Scanner in=new Scanner(System.in);
                x=in.nextInt();
             
            while(i<x){
                int l = r.nextInt(ch.length); //随机符号
                  int m = r.nextInt(ch.length); //随机符号
                    int n = r.nextInt(ch.length); //随机符号
                      int o = r.nextInt(ch.length); //随机符号
            
                int a=(int)(Math.random()*99)+1;//随机生成一个1-99的整数
                  int b=(int)(Math.random()*99)+1;//随机生成一个1-99的整数
                    int c=(int)(Math.random()*99)+1;//随机生成一个1-99的整数
                      int d=(int)(Math.random()*99)+1;//随机生成一个1-99的整数
                        int e=(int)(Math.random()*99)+1;//随机生成一个1-99的整数
                      
               int g=(int)(Math.random()*3)+3;//生成四则运算的位数

 

计算逆波兰式

 private static void evoe(ArrayList<String> strArr){
	        String str = ele.getOperations();
	        boolean flag = true;                                       //判断过程中是否有负数或小数
	        Stack<String> stack = new Stack<String>();
	        for(String s : strArr){
	            if(!str.contains(s)){                                  //如果是数字,放入栈中
	                stack.push(s);
	            }else{
	                int a = Integer.valueOf(stack.pop());
	                int b = Integer.valueOf(stack.pop());
	                try {
	                    switch(s){
	                        case "+" :
	                            stack.push(String.valueOf(a+b));
	                            break;
	                        case "-" :
	                            if(b-a < 0) flag=false;
	                            stack.push(String.valueOf(b-a));
	                            break ;
	                        case "*" :
	                            stack.push(String.valueOf(a*b));
	                            break;
	                        case "/" :
	                            if(a == 0) {a = 1;flag = false;}
	                            if(b/a*a != b) flag = false;
	                            stack.push(String.valueOf(b/a));
	                            break ;
	                    }
	                } catch (Exception e) { }
	            }
	        }
	        ele.setResult(Integer.parseInt(stack.pop()));
	        return flag;
	    }

  

 

 

 

 

七、展示psp

PSP2.1

任务内容

计划共完成需要的时间(min)

实际完成需要的时间(min)

         Planning

计划

10

30

·        Estimate

·估计这个任务需要多少时间,并规划大致工作步骤

10

10

         Development

开发

300

600

·        Analysis

·需求分析 (包括学习新技术)

20

15.

·        Design Spec

·生成设计文档

15

17

·        Design Review

·设计复审 (和同事审核设计文档)

10

30

·        Coding Standard

·代码规范 (为目前的开发制定合适的规范)

10

3

·        Design

·具体设计

15

25

·        Coding

·具体编码

120

1200

·        Code Review

·代码复审

10

20

·        Test

·测试(自我测试,修改代码,提交修改)

15

50

          Reporting

报告

10

30

·         Test Report

 测试报告

5

3

·         Size Measurement

·计算工作量

5

3

·         Postmortem & Process        

·事后总结并提出过程改进计划

5

 

9

 

 

八、总结

   一开始我觉得这个作业没有多少难度。当我真正开始着手做的时候才发现问题的繁多与自己的才疏学浅。一开始我用最笨的方法分析了每一种符号出现的情况,做了一下午只做出的三个符号着一种情况。我知道自己的方法虽然能做出与题目要求差不多的效果,但是工程量太大,做到一半就放弃了。我才知道自己的知识储备是多么的匮乏。后来查阅了大量的资料与代码,又经室友的提醒学习了逆波兰算法,终于算是完成了。基本理解了代码的意思与这么做的意义。

   这次的作业过程十分艰辛困难,由于自己之前的怠慢,又使得难上加难。我深刻了解到了软件工程的艰苦,并需要及时加强自己的代码能力,不能再眼高手低了。这次作业我也知道了代码不只是一些if语句的堆砌,而是需要更高层次的代码思想。

          这次的作业存在许多的不足之处。我只使用了一个类,导致出现几百行的代码,难以查错与维护。这些我会在之后的学习与实践中渐渐完善。

 

posted @ 2018-03-25 15:54  哈哈哈好冷  阅读(193)  评论(2编辑  收藏  举报