软件工程个人作业02

简介: 题目:可怜的二柱子同学,老师又对他的自动出题系统提出了新的要求:  可以控制下列参数:   是否有乘除法;  是否有括号(最多可以支持十个数参与计算);  数值范围;  加减有无负数;  除法有无余数!思路和关键步骤:  1.是否有乘除法;加减有无负数;除法有无余数!,依据输入的不同年级判断是否需要,例如一年级没有乘除法,只有六年级有负数,除法在三年级开始有余数。

题目:可怜的二柱子同学,老师又对他的自动出题系统提出了新的要求:

  可以控制下列参数:
  是否有乘除法;
  是否有括号(最多可以支持十个数参与计算);
  数值范围;
  加减有无负数;
  除法有无余数!

思路和关键步骤:

  1.是否有乘除法;加减有无负数;除法有无余数!,依据输入的不同年级判断是否需要,例如一年级没有乘除法,只有六年级有负数,除法在三年级开始有余数。

  2.是否有括号,根据二叉树实现,根据去括号法则:

  假设待去括号的表达式为 (m1 op1 n1) op (m2 op2 n2) 这里m1、n1、m2、m2可能自身就是个表达式,也可能是数字,op、op1、op2为运算符

  1、若op为'/',则 (m2 op2 n2)的括号必须保留;

  2、若op为'*'或'-',如果op2为'+'或'-',则(m2 op2 n2)的括号必须保留;

  3、若op为'*'或'/',如果op1为'+'或'-',则(m1 op1 n1)的括号必须保留;

  4、 除此之外,去掉括号不影响表达式的计算顺序。

但是有bug(运算位数最大只能是8位),至今没有解决;

核心代码:

 1  /** 
 2          * 生成二叉树 
 3          *  
 4          */  
 5         public void createBTree(){  
 6             TreeNode lchild = null, rchild = null, lnode, rnode;  
 7               
 8             if(num == 1){  
 9                 lchild = new TreeNode(String.valueOf(Ran.getNumber(Arithmetic.getLine())), null, null);  
10                 rchild = new TreeNode(String.valueOf(Ran.getNumber(Arithmetic.getLine())), null, null);  
11                 root = new TreeNode(String.valueOf(Ran.getOperator()), lchild, rchild); 
12             }  
13             else{  
14                 int num1 = 0;  
15                 int n = getDeep() - 3;  
16                 boolean[] place = Ran.getChildPlace(num);  
17                 root = new TreeNode(String.valueOf(Ran.getOperator()), null, null);  
18                 opeList.add(root);  
19                   
20                 for(int i = 0; i < n; i++){  
21                     for(int j = 0; j < (int)Math.pow(2, i); j++, num1++){  
22                         lchild = new TreeNode(String.valueOf(Ran.getOperator()), null, null);  
23                         rchild = new TreeNode(String.valueOf(Ran.getOperator()), null, null);  
24                         opeList.get(j + num1).setChild(lchild, rchild);  
25                         opeList.add(lchild);  
26                         opeList.add(rchild);  
27                     }  
28                 }  
29                   
30                 for(int i = 0; i < place.length; i++){  
31                     if(place[i]){  
32                         lnode  = new TreeNode(String.valueOf(Ran.getNumber(Arithmetic.getLine())), null, null);  
33                         rnode  = new TreeNode(String.valueOf(Ran.getNumber(Arithmetic.getLine())), null, null);  
34                         if(i%2 == 0){  
35                             lchild = new TreeNode(String.valueOf(Ran.getOperator()), lnode, rnode);  
36                             opeList.add(lchild);  
37                             opeList.get(num1).setLchild(lchild);  
38                         }  
39                         else{  
40                             rchild = new TreeNode(String.valueOf(Ran.getOperator()), lnode, rnode);  
41                             opeList.add(rchild);  
42                             opeList.get(num1).setRchild(rchild);  
43                         }  
44                     }  
45                     else{  
46                         if(i%2 == 0){  
47                             lchild = new TreeNode(String.valueOf(Ran.getNumber(Arithmetic.getLine())), null, null);  
48                             opeList.get(num1).setLchild(lchild);  
49                         }  
50                         else{  
51                             rchild = new TreeNode(String.valueOf(Ran.getNumber(Arithmetic.getLine())), null, null);  
52                             opeList.get(num1).setRchild(rchild);  
53                         }  
54                     }  
55                     num1 = num1 + i%2;  
56                 }          
57             }  
58         }

括号添加及去掉:

 1   /** 
 2      * 先对每个运算式添加括号,然后根据去括号法则,去掉多余的子式的括号 
 3      *  
 4      * @return string 
 5      */  
 6     public String toString(){  
 7         String Lstr = "", Rstr = "", Str = "";  
 8         if(hasChild()){  
 9             if(getRchild().hasChild()){                           
10                 if(str.equals("÷")){  
11                     Rstr = getRchild().toString();                
12                 }  
13                 else if(str.equals("×") || str.equals("-")){  
14                     if(getRchild().str.equals("+") || getRchild().str.equals("-")){   
15                         Rstr = getRchild().toString();            
16                     }  
17                     else{  
18                         Rstr = getRchild().toString().substring(1, getRchild().toString().length()-1);    
19                     }  
20                 }  
21                 else{   
22                     Rstr = getRchild().toString().substring(1, getRchild().toString().length()-1);        
23                 }  
24             }  
25             else{  
26                 Rstr = getRchild().str;  
27             }  
28             //左子树的情况同右子树类似  
29             if(getLchild().hasChild()){                                               
30                 if(str.equals("×") || str.equals("÷")){  
31                     if(getLchild().str.equals("+") || getLchild().str.equals("-")){  
32                         Lstr = getLchild().toString();  
33                     }  
34                     else{  
35                         Lstr = getLchild().toString().substring(1, getLchild().toString().length()-1);  
36                     }  
37                 }  
38                 else{  
39                     Lstr = getLchild().toString().substring(1, getLchild().toString().length()-1);  
40                 }  
41             }  
42             else{  
43                 Lstr = getLchild().str;  
44             }  
45             Str = "(" + Lstr + str + Rstr + ")";                                      
46         }  
47         else{  
48             Str = str;  
49         }  
50         return Str;  
51     }

结果计算:

 1 /** 
 2      * 获取每个节点的运算结果,并检验除法 
 3      *  
 4      * @return result 
 5      */  
 6     public String getResult(){  
 7         if(hasChild()){  
 8             switch(str){  
 9                 case "+":  
10                     return String.valueOf(Integer.parseInt(getLchild().getResult()) + Integer.parseInt(getRchild().getResult()));  
11                 case "-":  
12                     if(Integer.parseInt(getLchild().getResult()) - Integer.parseInt(getRchild().getResult()) < 0) {
13                             setChild(getRchild(), getLchild()); //如果减法运算结果为负数,则只需要将左右孩子交换一下就行了
14                     }
15                     return String.valueOf(Integer.parseInt(getLchild().getResult()) - Integer.parseInt(getRchild().getResult()));  
16                 case "×":  
17                     return String.valueOf(Integer.parseInt(getLchild().getResult()) * Integer.parseInt(getRchild().getResult()));  
18                 case "÷":  
19                     if(getRchild().getResult().equals("0")){  //除数是0的情况
20                         while(str.equals("÷")){  
21                             str = String.valueOf(Ran.getOperator());  //重新生成运算符
22                         }  
23                         return this.getResult();  
24                     }  
25                     else if(Integer.parseInt(getLchild().getResult()) % Integer.parseInt(getRchild().getResult()) != 0){  
26                          while(str.equals("÷")){  
27                              str = String.valueOf(Ran.getOperator());  //重新生成运算符
28                          }  
29                         return this.getResult();  
30                     }  
31                     else  
32                         return String.valueOf(Integer.parseInt(getLchild().getResult()) / Integer.parseInt(getRchild().getResult()));  
33             }  
34         }   
35         return str;  
36     }   

 

效果截图:

 

总结:在数据结构这一块还是存在很大问题,对算法和结构的理解欠缺,虽然在javaweb上面学会了许多东西,但是之前学的一些基础的东西还得多翻阅翻阅。

 PSP0级过程文档

 

  

 

目录
相关文章
|
5天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
389 93
|
6天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
5天前
|
SQL 人工智能 自然语言处理
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
随着生成式AI的普及,Geo优化(Generative Engine Optimization)已成为企业获客的新战场。然而,缺乏标准化流程(Geo优化sop)导致优化效果参差不齐。本文将深入探讨Geo专家于磊老师提出的“人性化Geo”优化体系,并展示Geo优化sop标准化如何帮助企业实现获客效率提升46%的惊人效果,为企业在AI时代构建稳定的流量护城河。
391 156
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
|
5天前
|
数据采集 缓存 数据可视化
Android 无侵入式数据采集:从手动埋点到字节码插桩的演进之路
本文深入探讨Android无侵入式埋点技术,通过AOP与字节码插桩(如ASM)实现数据采集自动化,彻底解耦业务代码与埋点逻辑。涵盖页面浏览、点击事件自动追踪及注解驱动的半自动化方案,提升数据质量与研发效率,助力团队迈向高效、稳定的智能化埋点体系。(238字)
272 158
|
13天前
|
机器人 API 调度
基于 DMS Dify+Notebook+Airflow 实现 Agent 的一站式开发
本文提出“DMS Dify + Notebook + Airflow”三位一体架构,解决 Dify 在代码执行与定时调度上的局限。通过 Notebook 扩展 Python 环境,Airflow实现任务调度,构建可扩展、可运维的企业级智能 Agent 系统,提升大模型应用的工程化能力。