1. 程式人生 > 其它 >javaSE21/10/11

javaSE21/10/11

面向物件流水線

有理數的類封裝

public class Rational {
    int numerator = 1;//分子分母初始值都設1
    int denominator =1;
    //設定分子的值,化簡的過程
    void setNumerator(int a){//a為暫時的分子
        int c=f(Math.abs(a),denominator);
        numerator = a/c;
        denominator=denominator/c;
        if (numerator<0&&denominator<0){
            numerator = -numerator;
            denominator = -denominator;
        }
    }
    //設定分母,化簡的過程
    void setDenominator(int b){
        int c=f(numerator,Math.abs(b));
        numerator = numerator/c;
        denominator=b/c;
        if (numerator<0&&denominator<0){
            numerator = -numerator;
            denominator = -denominator;
        }
    }
    int getNumerator(){
        return numerator;
    }
    int getDenominator(){
        return denominator;
    }
    //求最大公約數
    int f(int a,int b){
        if (a==0){
            return 1;
        }
        if (a<b){
            int t = 0;
            t = a;
            a = b;
            b = t;
        }
        int r = a%b;
         while (r!=0){
             a = b;
             b = r;
             r = a%b;
         }
        return b;
    }
    //加法運算
    Rational add(Rational r){
        int a = r.getNumerator();//獲取所算的分數的分子
        int b = r.getDenominator();//獲取分母
        int newNumerator = numerator*b+denominator*a;
        int newDenominator = denominator*b;
        Rational result = new Rational();//新建一個結果
        result.setNumerator(newNumerator);
        result.setDenominator(newDenominator);
        return result;
    }
    Rational sub(Rational r){
        int a = r.getNumerator();//獲取所算的分數的分子
        int b = r.getDenominator();//獲取分母
        int newNumerator = numerator*b-denominator*a;
        int newDenominator = denominator*b;
        Rational result = new Rational();//新建一個結果
        result.setNumerator(newNumerator);
        result.setDenominator(newDenominator);
        return result;
    }
    Rational muti(Rational r){
        int a = r.getNumerator();//獲取所算的分數的分子
        int b = r.getDenominator();//獲取分母
        int newNumerator = numerator*a;
        int newDenominator = denominator*b;
        Rational result = new Rational();//新建一個結果
        result.setNumerator(newNumerator);
        result.setDenominator(newDenominator);
        return result;
    }
    Rational div(Rational r){
        int a = r.getNumerator();//獲取所算的分數的分子
        int b = r.getDenominator();//獲取分母
        int newNumerator = numerator*b;
        int newDenominator = denominator*a;
        Rational result = new Rational();//新建一個結果
        result.setNumerator(newNumerator);
        result.setDenominator(newDenominator);
        return result;
    }
}
public class RationalTest {
    public static void main(String[] args) {
        Rational r1 = new Rational();
        Rational r2 = new Rational();
        r1.setNumerator(3);
        r1.setDenominator(5);
        r2.setNumerator(1);
        r2.setDenominator(6);
        Rational result = r1.add(r2);
        int a = result.getNumerator();
        int b = result.getDenominator();
        System.out.println("3/5 + 1/6 = "+a+"/"+b);
    }
}
  • Shift+Tab程式碼整體向前移,Tab程式碼整體向後移

搭建流水線

public class SingGame {
    public static void main(String[] args) {
        Line line = new Line();
        line.giveScore();
    }
}
public class Line {
    InputScore inputScore;//先定義物件,不分配記憶體空間
    DelScore delScore;
    ComputerAver computer;

    Line() {//建立流水線物件後自動給各個類分配空間
        computer = new ComputerAver();
        delScore = new DelScore(computer);//b物件含有c物件的引用
        inputScore = new InputScore(delScore);//a物件含有b的引用,
    }
    public void giveScore(){
        inputScore.inputScore();
    }
}
public class InputScore { //錄入分數,a物件
    DelScore delScore;//定義b物件
    InputScore(DelScore delScore) {
        this.delScore = delScore;//構造方法的引數是b,
    }

    public void inputScore(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入評委數:");
        int count = scanner.nextInt();
        System.out.println("請輸入分數:");
        double[] a = new double[count];
        for (int i = 0; i <count ; i++) {
            a[i] = scanner.nextDouble();
        }
        delScore.doDelete(a);//呼叫b物件的方法,在執行完a後自動執行b
    }

}
public class DelScore {//去掉一個最高分和最低分,b物件
    ComputerAver computer;

    DelScore(ComputerAver computer) {
        this.computer = computer;
    }
    public void doDelete(double[] a){
        Arrays.sort(a);
        System.out.println("去掉一個最高分:"+a[a.length-1]);
        System.out.println("去掉一個最低分:"+a[0]);
        double[] b = new double[a.length-2];
        for (int i = 0; i < b.length; i++) {
            b[i]=a[i+1];
        }
        computer.giveAver(b);
    }
}
public class ComputerAver {//求平均分,c物件

    public void giveAver(double[] b){
        double sum = 0;
        for (int i = 0; i < b.length; i++) {
            sum+=b[i];
        }
        double aver = sum/b.length;
        System.out.println("選手最後得分:"+aver);
    }
}