軟件工程做業02

題目:     

二柱子又對本身提出了新的要求:html

設計思想:

  • 項目名稱、源文件等見軟件工程做業01
  • 對於乘除法,其實咱們做業01中已經有了除法,別忘了分數就是特殊的除法運算哦!可是咱們要的不是隻有分數的除法,還要加入對乘法的支持,那麼咱們在CT.java文件(源碼見做業01)中會看到有兩個函數是用來生成題目的:只須要對上面兩個方法進行改進就好了,可是還有一個問題:何時出現乘法、何時出現除法呢?在源代碼中咱們看到了有兩個隨機數t和f是否超50來控制什麼時候出現加法什麼時候出現減法。那麼咱們就能夠藉助這個思想進行改進,加減法的出現是將0-100數軸分紅兩份,前一段設置出現加法後一段設置出現減法,那麼咱們能夠把0-100數軸分紅四份,每份表示一個運算符,這樣咱們就實現了對加減乘除的控制。
    • quesGrow_int()                 // 用來生成整數之間的運算
    • quesGrow_div()                // 用來生成分數之間的運算
  • 至於括號,咱們做業01的運行結果中能夠看出是有括號的出現的,因此暫時擱置一下。
  • 對於數值範圍,凡是設計分數的運算結果都是保留一位小數,可是對於整數之間的運算,如果限制在一位小數的話,可能會出現結果爲0的答案過多,因此暫時擱置了。
  • 此做業用時1個多小時。

源代碼:

 咱們只對CT.java文件進行了更改,因此若是有須要,請前往軟件工程做業01中查看剩餘文件源碼!java

CT.javadom

package cn.simo;

import java.util.Scanner;
/**
 * 小學生出題系統(30道四則運算題)
 * @author www.cnsimo.cn
 * @since 2017-03-07 21:53:14
 */
public class CT {

	public static String str = "";//保存題目的字符串
    public static int num = 5;//每題中數的個數
    public static int num_i = 0;//題目中已有數的個數    
    public static int numberRange = 100;//運算中數的最大取值    
    public static double sum = 0;//記錄結果
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("注意:結果保留1位小數!");
		System.out.println("共30道題目:");
		Scanner in = new Scanner(System.in);
		double answer = 0;
		double result = 0;
		String[] question = new String[30];
		int questionNumber = 0;
		int answerTrue = 0;
		boolean flag;
		for(;;) {
			answer = 0; result = 0; flag = true; str="";
			if((questionNumber + 1)%5 != 0) {
				GetQuestion_int();
			} else {
				GetQuestion_div();
			}
			for(int j = questionNumber-1; j >= 0; j --) {
				if(question[j].equals(str)) {
					flag = false; break;
				}
			}
			if(!flag) continue;
			else {question[questionNumber] = new String(str); questionNumber++;}
			System.out.print("" + questionNumber + ". " + str+" = ");
			answer = in.nextDouble();
			if(!str.isEmpty()) {
				result = Arithmetic.arithmetic(str);
			}
			if(answer == result) {
				System.out.println("   ✔️");
				answerTrue++;
			} else {
				System.out.println("   ❌ " + "  正確答案:" + result);
			}
			
			if(questionNumber == 30) break;         // 滿30個跳出
		}
		
		System.out.println("你的正確機率:" + answerTrue + "/30");
		in.close();
	}
	
    private static void GetQuestion_int() {
        //獲得問題函數,在這裏調用遞歸函數quesGrow()。
        str = "";
        sum = 0;
        num_i = num;//用前都清零
        quesGrow_int();
    }
    
    private static void GetQuestion_div() {
    	str = "";
        sum = 0;
        num_i = num;//用前都清零
        quesGrow_div();
    }

    private static void quesGrow_int() {
        //
        if( num_i > 1 ) {
            int j = num_i;//記錄這是第幾層調用。
            num_i--;
            quesGrow_int();//遞歸
            
            int w=1+(int)(Math.random()*numberRange);//隨機生成一個數
            int t=1+(int)(Math.random()*100);//向左生成,仍是向右生成,相似於樹。
            int f=1+(int)(Math.random()*100);//運算符控制
            
            if(t>50)//新數往右加
            {
                if(f>50) {
                	if(f>75) {
	                    sum = sum + w;
	                    str = str + "+" + String.valueOf( w );
                	} else {
                		sum *= w;
                		str = str + "*" + String.valueOf(w);
                	}
                }
                else {
                	if(f<25) {
	                    sum = sum - w;
	                    str = str + "-" + String.valueOf( w );
                	} else {
                		sum = sum / w;
	                    str = str + "/" + String.valueOf(w);
                	}
                }
            }
            else//不然 新數往左加
            {
                if(f>50) {
                	if(f>50) {
	                    sum = w + sum;
	                    str = String.valueOf( w ) + "+" + str;
                	} else {
                		sum = w * sum;
                		str = String.valueOf(w) + "*" + str; 
                	}
                } else {
                    if( j < 3 ) {//3——摸索出的數,不用給本身套上括號。實際上就是j=2
                    	if(f<25) {
	                        sum = w - sum;
	                        str = String.valueOf( w ) + "-" + str;
                    	} else {
                    		sum = w / sum;
                    		str = String.valueOf( w ) + "/" + str;
                    	}
                    }
                    else {
                    	if(f<25) {
	                        sum = w - sum;
	                        str = String.valueOf( w ) + "-" + "(" +str+ ")";
	                        //向左添減法的時候加括號,打破順序計算模式。
                    	} else {
                    		sum = w / sum;
                    		str = String.valueOf(w) + "/" + "(" + str + ")";
                    	}
                    }
                }
            }
        }
        else if( num_i == 1 ) {
            //最後一層,也是輸出的第一層
            int w=1+(int)(Math.random()*numberRange);
            sum = sum + w;
            str = str + String.valueOf( w );
        }
    }
    
    private static void quesGrow_div() {
    	if( num_i > 1 ) {
            int j = num_i;//記錄這是第幾層調用。
            num_i--;
            quesGrow_div();//遞歸
            
            double w=Math.random();//隨機生成一個數
            int t=1+(int)(Math.random()*100);//向左生成,仍是向右生成,相似於樹。
            int f=1+(int)(Math.random()*100);//運算符控制
            
            if(t>50)//新數往右加
            {
                if(f>50) {
                	if(f>75) {
                		sum = sum + w;
                        str = str + "+" + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4));
                                                           // +0.01保證w長度不低於4,而且w須要截取到小數點後2位,防止小數點後字符長度過大不能轉化成int型
                	} else {
                		sum *= w;
                		str = str + "*" + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4));
                	}
                }
                else {
                	if(f<25) {
	                    sum = sum - w;
	                    str = str + "-" + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4));    
                	} else {
                		sum = sum / w;
	                    str = str + "/" + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4));
                	}
                }
            }
            else//不然 新數往左加
            {
                if(f>50) {
                	if(f>75){
	                    sum = w + sum;
	                    str = ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)) + "+" + str;    
                	} else{
                		sum = w * sum;
	                    str = ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)) + "*" + str;    
                	}
                }
                else {
                    if( j < 3 ) {//3——摸索出的數,不用給本身套上括號。實際上就是j=2
	                    sum = w - sum;
	                    str = ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)) + "-" + str;
                    }
                    else {
	                    sum = w - sum;
	                    str = ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)) + "-" + "(" +str+ ")";
	                    //向左添減法的時候加括號,打破順序計算模式。
                    }
                }
            }
        }
        else if( num_i == 1 ) {
            //最後一層,也是輸出的第一層
            double w=Math.random();
            sum = sum + w;
            str = str + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4));
        }
	}
}

運行結果:

 

總結:

對於本程序,可能會出現棧溢出的異常,可是不多狀況纔會出現一次,因此問題所在之處並很差找,只能放棄。經過這個做業咱們須要掌握PSP項目計劃的指定以及把握對時間的掌握!函數

相關文章
相關標籤/搜索