四则运算3(二柱子同学的第三炼狱)
?
設計思路:
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、判斷答案是否正確
?
代碼如下:
1 package 四則運算3; 2 3 import java.util.Scanner; 4 5 //節點類 6 class Node 7 { 8 public Node root; 9 public Node left; 10 public Node right; 11 public String weight; 12 13 public void setroot(Node r) 14 { 15 root=r; 16 } 17 18 public void setleft(Node l) 19 { 20 left=l; 21 } 22 public void setright(Node r) 23 { 24 right=r; 25 } 26 public void setweight(String w) 27 { 28 weight=w; 29 } 30 public String getweight() 31 { 32 return weight; 33 } 34 } 35 36 37 public class Test { 38 39 //控制式子長度 40 static int flag=0; 41 static String shizi=""; 42 43 //初始化樹函數(當前節點,當前節點父節點) 44 static void setTree(Node now,Node root) 45 { 46 47 now.left=new Node(); 48 now.right=new Node(); 49 now.setroot(root); 50 //用于判定是符號-1還是數字-0 51 int panding=(int)(Math.random()*2); 52 //System.out.println(panding); 53 54 if(panding==1) 55 { 56 //生成符號 57 //System.out.println("生成符號"); 58 int fuhao=(int)(Math.random()*4); 59 if(fuhao==0) now.setweight("+"); 60 if(fuhao==1) now.setweight("-"); 61 if(fuhao==2) now.setweight("*"); 62 if(fuhao==3) now.setweight("*"); 63 //System.out.println(now.getweight()); 64 setTree(now.left,now); 65 setTree(now.right,now); 66 } 67 if(panding==0) 68 { 69 //System.out.println("生成數字"); 70 now.setweight(""+(int)(Math.random()*100)); 71 flag++; 72 //System.out.println(now.getweight()); 73 } 74 75 } 76 //遍歷函數(生成算式) 77 static void inOrderTraverse(Node now){ 78 79 if(now.weight==null) return; 80 else{ 81 shizi=shizi+"("; 82 inOrderTraverse(now.left); 83 shizi=shizi+now.getweight(); 84 inOrderTraverse(now.right); 85 shizi=shizi+")"; 86 87 } 88 89 } 90 //求值函數 91 static int evaluateExpTree(Node now){ 92 int lvalue=0,rvalue=0; 93 int zhi=0; 94 //如果本節點是符號則遞歸否則返回本值 95 if(now.left.getweight()!=null){ 96 //System.out.println("是符號"+now.getweight()); 97 lvalue=evaluateExpTree(now.left); 98 rvalue=evaluateExpTree(now.right); 99 } 100 else 101 { 102 //System.out.println("是數字"+now.getweight()); 103 zhi=Integer.parseInt(now.getweight()); 104 } 105 //System.out.println("左值為"+lvalue); 106 //System.out.println("右值為"+rvalue); 107 if(now.weight.charAt(0)=='+') zhi=lvalue+rvalue; 108 if(now.weight.charAt(0)=='-') zhi=lvalue-rvalue; 109 if(now.weight.charAt(0)=='*') zhi=lvalue*rvalue; 110 if(now.weight.charAt(0)=='/') zhi=lvalue/rvalue; 111 //System.out.println("值為"+zhi); 112 return zhi; 113 } 114 115 116 public static void main(String args[]) 117 { 118 119 for(int i=0;i<10;i++){ 120 Node initial = new Node(); 121 initial.setweight("+"); 122 Node ltree=new Node(); 123 Node rtree=new Node(); 124 initial.setleft(ltree); 125 initial.setright(rtree); 126 //判斷數字位數,超過則重新出題 127 while(flag==0||flag>4) 128 { 129 flag=0;setTree(ltree,initial); 130 } 131 flag=0; 132 while(flag==0||flag>4) 133 { 134 flag=0;setTree(rtree,initial); 135 } 136 137 138 inOrderTraverse(initial); 139 shizi=shizi+"="; 140 System.out.println(shizi); 141 System.out.println("請輸入答案"); 142 Scanner sca=new Scanner(System.in); 143 int answer=sca.nextInt(); 144 if(answer==evaluateExpTree(initial)) 145 System.out.println("回答正確"); 146 else 147 System.out.println("回答錯誤,正確答案是"+evaluateExpTree(initial)); 148 149 shizi=""; 150 flag=0; 151 } 152 153 154 } 155 156 }?
?
截圖如下:
?
轉載于:https://www.cnblogs.com/hehejeson/articles/5322971.html
總結
以上是生活随笔為你收集整理的四则运算3(二柱子同学的第三炼狱)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 时间记录日志
- 下一篇: 一个子数组最大值的问题