標籤:
設計思路:
1、定義類node,變數有node類型root ,left,right以及string類型weight
2、初始化函數(以一個新節點為當前節點,根節點為null),設定一個計數器flag=0
2、1初始化weight值,隨機數字或符號(若i>=3則必為數將算式限定在10個數以內)
2、11若weight值為符號則i++且調用此初始化函數,(以left為當前節點,本函數中節 點為根節點。)
2、12若weight為符號則i++且調用此初始化函數,(以right為當前節點,本函數中節點為根節點。)
3、遍曆函數 void inOrderTraverse(Node node)
3、1判斷node函數是否為空白,為空白則return
3、2輸出左括弧
3、3 inOrderTraverse(node.left);
3、4輸出本節點權值
3、5 inOrderTraverse(node.right);
3、6輸出右括弧
4、求值函數int evaluateExpTree(Node)
4、1 設lvalue和rvalue並初始化為0
4、2 如果節點為運算元,返回該值
4、3如果節點不是運算子
4、31遞迴計算左子樹值為lvalue
4、32遞迴計算右子樹值為rvalue
4、33根據節點計算符計算
5、判斷答案是否正確
實驗代碼:
package demo;import java.util.Random;import java.util.Scanner;class Node { public Node root; public Node left; public Node right; public String weight; public void setroot(Node r) {root=r;}//根植 public void setleft(Node l) {left=l;}//左子樹 public void setright(Node r) {right=r;}//右子樹 public void setweight(String w) {weight=w;}//判斷運算子號 public String getweight() {return weight;} } public class show{ //控制式子長度 static int flag=0; static String length=""; static void setTree(Node zz,Node root)//初始化樹 { zz.left=new Node(); zz.right=new Node(); zz.setroot(root); int panding=new Random().nextInt(2); if(panding==1) { //產生符號 int fuhao=new Random().nextInt(4); if(fuhao==0) zz.setweight("+"); if(fuhao==1) zz.setweight("-"); if(fuhao==2) zz.setweight("*"); if(fuhao==3) zz.setweight("*"); setTree(zz.left,zz); setTree(zz.right,zz); } if(panding==0) { int num=new Random().nextInt(100); zz.setweight(""+num); flag++; } } static void inOrderTraverse(Node zz)//遍曆產生算式 { if(zz.weight==null) return; else{ length=length+"("; inOrderTraverse(zz.left); length=length+zz.getweight(); inOrderTraverse(zz.right); length=length+")"; } } static int evaluateExpTree(Node zz)//求值 { int lvalue=0,rvalue=0; int ans=0; if(zz.left.getweight()!=null){ lvalue=evaluateExpTree(zz.left); rvalue=evaluateExpTree(zz.right); } else { ans=Integer.parseInt(zz.getweight()); } if(zz.weight.charAt(0)==‘+‘) ans=lvalue+rvalue; if(zz.weight.charAt(0)==‘-‘) ans=lvalue-rvalue; if(zz.weight.charAt(0)==‘*‘) ans=lvalue*rvalue; if(zz.weight.charAt(0)==‘/‘) ans=lvalue/rvalue; return ans; } public static void main(String args[]) { int j=0; System.out.println("請在等號後輸入結果:"); Scanner zhi=new Scanner(System.in); int []b=new int[30]; for(int i=0;i<30;i++) { Node initial = new Node(); Node ltree=new Node(); Node rtree=new Node(); initial.setweight("+"); initial.setleft(ltree); initial.setright(rtree); //判斷數字位元,超過則重新出題 while(flag==0||flag>4) { flag=0;setTree(ltree,initial); } flag=0; while(flag==0||flag>4) { flag=0;setTree(rtree,initial); } inOrderTraverse(initial); length=length+"="; System.out.println(length); b[i]=zhi.nextInt(); if(b[i]==evaluateExpTree(initial)) { j++; System.out.println("結果正確"); } else System.out.println("結果錯誤,正確結果為:"+evaluateExpTree(initial)); length=""; flag=0; } System.out.println("做對了"+j+"道題"); }}View Code
結果:
結對照片
軟體工程概論作業