1. 程式人生 > >程式設計演算法基礎3.3-測試驅動風格

程式設計演算法基礎3.3-測試驅動風格

3.3測試驅動風格

嚴格的說測試驅動風格不是設計風格,它是為了能夠保證程式設計師思路清晰熱情持續,我們採用的一種策略。

部隊長時間在雪地上行走,會出現雪盲症,戰士出現幻覺,像夢遊,注意力不集中

一般派先前部隊在路上在地上撒一些樹枝或別的東西解決。

同理,程式設計師也一樣,如果長時間編碼缺少反饋,也會使程式設計師思維鈍化,產生幻覺。

測試驅動可以使程式設計師能夠把他的任務轉變為不斷地製造錯誤和修改錯誤。

測試驅動的口號是:如果沒有錯誤,我們不寫程式碼。寫程式碼的過程就是改錯誤的過程。

人民幣小寫轉換為大寫格式

如:1050=壹仟零伍拾

第一步:寫一個一位數轉換的測試程式碼

越小間隔的編譯越有利於使程式設計師保持清晰的思路

第二步:多位數轉換的除錯

多位數的分割方式:

1,2424,3219

壹億貳仟肆佰貳拾肆萬叄仟貳佰壹拾玖

第三步:千一級,萬一級,億一級的數的編碼

第四步:去掉前後多餘的零

測試驅動風格

寫出測試用例

滿足:是,否

是:完成目標

否:修改程式----》滿足

/*
整數的人民幣金額大寫
人民幣小寫轉換為大寫格式
如:1050=壹仟零伍拾
第一步:寫一個一位數轉換的測試程式碼
 */
 
package testDrive01.RMB;
 
public class ChangeNumberToRMB {
    public static void main(String[] args) {
       System.out.println(RMB.read(0));// 壹
       System.out.println(RMB.read(9));
       System.out.println(RMB.read(19));
       System.out.println(RMB.read(191));
       System.out.println(RMB.read(1050));// 壹仟零伍拾
       System.out.println(RMB.read(321050));
       System.out.println(RMB.read(123456789));
       System.out.println(RMB.read(100000000));
       System.out.println(RMB.read(123000002));
    }
 
}
 
class RMB {
    private static String R = "零壹貳叄肆伍陸柒捌玖";
 
    public static String read1(int x) {
       return R.charAt(x) + "";
       // return "壹";//mock方式,先寫一個常量占上位置,應付過去
    }
 
    // 幾千幾百幾十幾
    public static String read4(int x) {
       int[] a = new int[4];
       for (int i = 0; i < a.length; i++) {
           a[i] = x % 10;// x對10求模,得到個位,放入a[i]
           x /= 10;// 把x除以10,把末位甩掉
       }
       String s = read1(a[3]) + "仟" + read1(a[2]) + "佰" + read1(a[1]) + "拾"
              + read1(a[0]);
       s = s.replaceAll("零仟", "零");// 將多餘的零處理掉
       s = s.replaceAll("零佰", "零");
       s = s.replaceAll("零拾", "零");
       s = s.replaceAll("零零", "零");
       s = s.replaceAll("零零", "零");
       if (s.endsWith("零") && s.length() > 1)
           s = s.substring(0, s.length() - 1);
 
       return s;
    }
 
    public static String read(int x) {
       final int W = 10000;// 經常使用10000,怕寫錯,所以做成常數W
       int a = x % W;// 對一萬求模,得到個位
       x /= W;
       int b = x % W;// 萬
       x /= W;
       int c = x % W;// 億
 
       String s = read4(c) + "億" + read4(b) + "萬" + read4(a);
       s = s.replaceAll("零億", "零");
       s = s.replaceAll("零萬", "零");
       s = s.replaceAll("零零", "零");
       s = s.replaceAll("零零", "零");
       s = s.replaceAll("零零", "零");
 
       if (s.startsWith("零") && s.length() > 1) {
           s = s.substring(1);
       }
       if (s.endsWith("零") && s.length() > 1) {
           s = s.substring(0, s.length() - 1);
       }
       return s;
    }
}
零
玖
壹拾玖
壹佰玖拾壹
壹仟零伍拾
叄拾貳萬壹仟零伍拾
壹億貳仟叄佰肆拾伍萬陸仟柒佰捌拾玖
壹億
壹億貳仟叄佰萬零貳

設計程式

在編寫圖形介面軟體的時候,經常會遇到處理兩個矩形的關係。

如圖【1】所示,矩形的交集指的是:兩個矩形重疊區的矩形,當然也可能不存在(參看【2】)。兩個矩形的並集指的是:能包含這兩個矩形的最小矩形,它一定是存在的。

本題目的要求就是:由使用者輸入兩個矩形的座標,程式輸出它們的交集和並集矩形。

矩形座標的輸入格式是輸入兩個對角點座標,注意,不保證是哪個對角,也不保證順序(你可以體會一下,在桌面上拖動滑鼠拉矩形,4個方向都可以的)。

輸入資料格式:

x1,y1,x2,y2

x1,y1,x2,y2

資料共兩行,每行表示一個矩形。每行是兩個點的座標。x座標在左,y座標在右。座標系統是:螢幕左上角為(0,0),x座標水平向右增大;y座標垂直向下增大。

要求程式輸出格式:

x1,y1,長度,高度

x1,y1,長度,高度

也是兩行資料,分別表示交集和並集。如果交集不存在,則輸出“不存在”

前邊兩項是左上角的座標。後邊是矩形的長度和高度。

例如,使用者輸入:

100,220,300,100

150,150,300,300

則程式輸出:

150,150,150,70

100,100,200,200

例如,使用者輸入:

10,10,20,20

30,30,40,40

則程式輸出:

不存在

10,10,30,30

package testToDrive;
 
/*
 * 設計程式
在編寫圖形介面軟體的時候,經常會遇到處理兩個矩形的關係。
如圖【1】所示,矩形的交集指的是:兩個矩形重疊區的矩形,當然也可能不存在(參看【2】)。
兩個矩形的並集指的是:能包含這兩個矩形的最小矩形,它一定是存在的。
本題目的要求就是:由使用者輸入兩個矩形的座標,程式輸出它們的交集和並集矩形。
矩形座標的輸入格式是輸入兩個對角點座標,注意,不保證是哪個對角,
也不保證順序(你可以體會一下,在桌面上拖動滑鼠拉矩形,4個方向都可以的)。
輸入資料格式:
x1,y1,x2,y2
x1,y1,x2,y2
資料共兩行,每行表示一個矩形。每行是兩個點的座標。x座標在左,y座標在右。
座標系統是:螢幕左上角為(0,0),x座標水平向右增大;y座標垂直向下增大。
要求程式輸出格式:
x1,y1,長度,高度
x1,y1,長度,高度
也是兩行資料,分別表示交集和並集。如果交集不存在,則輸出“不存在”
前邊兩項是左上角的座標。後邊是矩形的長度和高度。
例如,使用者輸入:
100,220,300,100
150,150,300,300
則程式輸出:
150,150,150,70
100,100,200,200
例如,使用者輸入:
10,10,20,20
30,30,40,40
則程式輸出:
不存在
10,10,30,30
*/
 
import java.awt.Rectangle;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class TwoRectangle {
   
    //輸入過程
    public static int[] inPut(){
       Scanner sc = new Scanner(System.in);
       String s = sc.nextLine();
       String temp[] = new String[4];
       int points[] = new int[4];
       Pattern pt = Pattern.compile("[0-9]+,[0-9]+,[0-9]+,[0-9]+");//判斷輸入格式
       Matcher m = pt.matcher(s);
       if(m.find()){//輸入格式正確時
           temp = s.split(",");//將使用者的輸入分解為字串陣列
           points[0] = Integer.parseInt(temp[0]);//將String轉換成Int
           points[1] = Integer.parseInt(temp[1]);
           points[2] = Integer.parseInt(temp[2]);
           points[3] = Integer.parseInt(temp[3]);
           return points;
       }else{
           System.out.println("輸入有誤,請重新輸入。");
           inPut();//重新呼叫自己
       }
       return null;
    }
 
    //得到矩形,呼叫Rectangle類
    public static Rectangle getRectangle(int[] a){
       return new Rectangle(Math.min(a[0], a[2]),Math.min(a[1], a[3]),Math.abs(a[0]-a[2]),Math.abs(a[1]-a[3]));//使用Rectangle的構造方法
    }
   
    //得到矩形的x1,y1,長度,高度
    public static String getXYWidthHeight(Rectangle temp){
       return temp.x+","+temp.y+","+temp.width+","+temp.height;
    }
   
    //求交集
    public static String getIntersection(Rectangle aa,Rectangle bb){
       Rectangle temp = aa.intersection(bb);
       if(temp.isEmpty()){
           return "不存在";
       }else{
          
           return getXYWidthHeight(temp);
       }
    }
    //求並集
    public static String getUnion(Rectangle aa,Rectangle bb){
       Rectangle temp = aa.union(bb);
       return getXYWidthHeight(temp);
    }
   
    public static void main(String[] args) {
       int []a = null;//存放數字的字串陣列
       int []b = null;
       Rectangle aa;
       Rectangle bb;
       a = inPut();//呼叫input
       b = inPut();
       aa = getRectangle(a);
       bb = getRectangle(b);
       System.out.println(getIntersection(aa, bb));
       System.out.println(getUnion(aa, bb));
    }
}
10,10,20,20
30,30,40,40
不存在
10,10,30,30

int


          Rectangle 的高度。

 int

width
          Rectangle 的寬度。

 int

x
          Rectangle 左上角的 X 座標。

 int

y
          Rectangle 左上角的 Y 座標。

(int x, int y, int width, int height)
          構造一個新的 Rectangle,其左上角被指定為 (x,y),其寬度和高度由同名的引數指定。

 boolean

()
          確定 RectangularShape 是否為空。


          計算此 Rectangle 與指定 Rectangle 的並集。