package classadvanced;
/*
* 傳遞物件陣列到函數裡
* EX:建立10個物件陣列,值為1~100的亂數整數
* (a)建立有一引數(int r)的建構元設定實例變數radius的值
* (b)傳遞物件陣列到average函數中算radius平均並回傳
* (c)傳遞物件陣列到compare函數中找出最大值並回傳
*/
class CCircle{
private int radius;
public CCircle(int r){
this.radius=r;
}
public static double average(CCircle c[]){ //宣告為static函數,方便用類別名稱.函數名稱()呼叫
double sum=0,average=0;
for(int i=0;i<c.length;i++){
System.out.println("c["+i+"]="+c[i].radius);
sum+=c[i].radius;
}
average=(sum)/c.length;
return average;
}
public static int compare(CCircle c[]){ //比較大小
int max;
max=c[0].radius;
for(int i=0;i<c.length;i++){
if(max<c[i].radius){
max=c[i].radius;
}
}
return max;
}
}
public class BasicArrayObject {
public static void main(String[] args) {
CCircle c[]=new CCircle[10]; //設定物件陣列大小
for(int i=0;i<c.length;i++){ //亂數給值
c[i]=new CCircle((int)(Math.random()*100)+1);
}
System.out.printf("ArrayObject of average=%.2f\n",CCircle.average(c)); //印出平均取小數點第2位
System.out.println("ArrayObject of maxvalue="+CCircle.compare(c));
}
}
goodice0728 發表在 痞客邦 留言(0) 人氣()
package classadvanced;
/*
(a)試設計類別CWin,內含count變數(初值設為0)與count() method,只要每建立一個物件,count的值便加1。
count可用來追蹤CWin物件建立的個數。
(b)試設計一個建構元Cwin(String str,int w, int h),當此建構元被呼叫時,便會自動設定color=str,width=w,height=h。
(c)請接續 (a) 的部份,請再設計一個沒有引數的建構元CWin(),使得當此建構元呼叫時,便會自動設定color="Red",width=2,height=2。
(d)試設計setZero() method,當此method呼叫時,count的值會被歸零。
(e)試設計setValue(int n) method,當此method呼叫時,count的值會被設為n。
*/
class CWin{
/*
* 宣告count為CWin類別變數,每當建立一個CWin物件時
* 每一個物件的count變數均指向記憶體中的同一個位址
* 也就是說count這個變數是由所有的物件所共用
*/
public static int count=0;
public String color;
public int width=0;
public int height=0;
public CWin(){
this("Red",2,2);
}
public void countadd()
{
count++;
}
public CWin(String str,int w,int h){
this.color=str;
this.width=w;
this.height=h;
countadd();
}
public static void setZero(){
count=0;
}
public static void setValue(int n){
count=n;
}
public static void show(){
System.out.println("cnt="+count);
}
}
public class BasicConstructor {
@SuppressWarnings("static-access")
public static void main(String[] args) {
CWin num1=new CWin();
num1.show(); //建立一個物件
CWin num2=new CWin();
num2.show(); //建立兩個物件
System.out.println("將count歸零");
num1.setZero();
num1.show();
}
}
goodice0728 發表在 痞客邦 留言(0) 人氣()
package classadvanced;
/*
* 類別型態的變數練習
(a)試撰寫method,public void setND(int num, int den),可用來同時設定分數的分子與分母。
(b)試將CRational類別裡的show() method改寫成FractionCompute類別裡的函數成員,而非CRational類別裡的函數成員。
(c)試在CRational類別裡加入分數運算的相關method,其中所有method的傳回型態皆為CRational,且分數運算的結果不需化成最簡分數
(d)加入add(CRational r) method,它可用來將呼叫它的CRational物件與傳入的引數進行分數的相加,並傳回相加後的結果。
(e)加入sub(CRational r) method,它可用來將呼叫它的CRational物件與傳入的引數進行分數的相減,並傳回相減後的結果。
(f)加入mul(CRational r) method,它可用來將呼叫它的CRational物件與傳入的引數進行分數的相乘,並傳回相乘後的結果。
(g)加入div(CRational r) method,它可用來將呼叫它的CRational物件與傳入的引數進行分數的相除,並傳回相除後的結果。
(h)撰寫compare(CRational r1,CRational r2)函數來比較兩分數大小,並傳回較大者
(i)撰寫larger(CRational r)函數,用來判別呼叫larger()的CRational物件的值是否大於r,若是則傳回true,否則傳回false
*/
class CRational // 分數類別
{
public int n; //分子
public int d; //分母
public void setND(int num,int den){
this.n=num;
this.d=den;
}
public CRational add(CRational r){ //分數相加
display(this,r,'+');
CRational sum=new CRational();
//切記不可用this.d或n=this.d或n(*+-/) 或r.d或n=r.d或n(*+-/) 會造成初始值變更
sum.d=(this.d)*(r.d); //num1分母通分=num2分母通母
sum.n=(this.n)*(r.d)+(r.n)*(this.d); //分子通分後相加
return sum;
}
public CRational sub(CRational r){ //分數相減
display(this,r,'-');
CRational sum=new CRational();
//切記不可用this.d或n=this.d或n(*+-/) 或r.d或n=r.d或n(*+-/) 會造成初始值變更
sum.d=(this.d)*(r.d); //num1分母通分=num2分母通母
sum.n=(this.n)*(r.d)-(r.n)*(this.d); //分子通分後相減
return sum;
}
public CRational mul(CRational r){ //分數相乘
display(this,r,'*');
CRational sum=new CRational();
sum.n=(this.n)*(r.n); //分子相乘
sum.d=(this.d)*(r.d); //分母相乘
return sum; //傳回結果
}
public CRational div(CRational r){ //分數相除
display(this,r,'/');
CRational sum=new CRational();
sum.n=((this.n)*(r.d)); //num1分子*num2的分母=分子
sum.d=(this.d)*(r.n); //num1分母*num2的分子=分母
return sum; //傳回結果
}
public void display(CRational r1,CRational r2,char ch) {
System.out.print("(");
System.out.print(r1.n+"/"+r1.d);
System.out.print(")");
System.out.print(ch);
System.out.print("(");
System.out.print(r2.n+"/"+r2.d);
System.out.print(")=");
}
public CRational compare(CRational r1,CRational r2){ //比較兩分數大小
CRational sum=new CRational ();
/*
* 交叉相乘比大小
*/
sum.n=((r1.n)*(r2.d)); //r1分子*r2的分母=r1
sum.d=(r1.d)*(r2.n); //r1分母*r2的分子=r2
if(sum.n>sum.d){ //r1>r2
return r1;
}
else
return r2;
}
public boolean larger(CRational r){ //比較呼叫此函數的物件與被傳入的物件兩者誰大
CRational sum=new CRational ();
/*
* 交叉相乘比大小
*/
sum.n=((this.n)*(r.d)); //num1分子*num2的分母=num1
sum.d=(this.d)*(r.n); //num1分母*num2的分子=num2
if(sum.n>sum.d){ //num1>num2
return true;
}
else
return false;
}
}
public class FractionCompute
{
public static void main(String args[])
{
CRational num1=new CRational();
CRational num2=new CRational();
CRational result=new CRational(); //result儲存+-*/的結果
CRational comparemax=new CRational();
num1.setND(3, 4); //設定第一個數為3/4
num2.setND(10, 2); //設定第二個數為10/2
result=num1.add(num2); //計算分數相加
show(result); //顯示結果
result=num1.sub(num2); //計算分數相減
show(result); //顯示結果
result=num1.mul(num2); //計算分數相乘
show(result); //顯示結果
result=num1.div(num2); //計算分數相除
show(result); //顯示結果
result=comparemax.compare(num1, num2); //比較num1與num2的大小
show(result); //顯示結果
System.out.println("is large");
boolean larger=num1.larger(num2); //使用num1呼叫larger函數來比較傳入值num2
System.out.println("num1>num2?"+larger); //顯示結果
}
public static void show(CRational result){
System.out.println(result.n+"/"+result.d);
}
}
goodice0728 發表在 痞客邦 留言(0) 人氣()