编程算法基础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

height
          Rectangle 的高度。

 int

width
          Rectangle 的宽度。

 int

x
          Rectangle 左上角的 X 坐标。

 int

y
          Rectangle 左上角的 Y 坐标。

Rectangle(int x, int y, int width, int height)
          构造一个新的 Rectangle,其左上角被指定为 (x,y),其宽度和高度由同名的参数指定。

 boolean

isEmpty()
          确定 RectangularShape 是否为空。

 

Rectangle

intersection(Rectangle r)
          计算此 Rectangle 与指定 Rectangle 的交集。

 

Rectangle

union(Rectangle r)
          计算此 Rectangle 与指定 Rectangle 的并集。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值