javaSE21/10/11
阿新 • • 發佈:2021-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);
}
}