顯示具有 Array 標籤的文章。 顯示所有文章
顯示具有 Array 標籤的文章。 顯示所有文章

2016年11月27日 星期日

利用父類別變數存取子類別成員的練習

/* hw10_11,利用父類別變數存取子類別成員的練習 (a)試定義一個圓形類別CCircle,它繼承自CShape類別,並改寫了父類別的area() method,可用來傳回圓形物件的面積。 (b)試定義一個正方形類別CSquare,它也繼承自CShape類別,同時改寫了父類別的area() method,可用來傳回正方形物件的面積。 (c)試定義一個三角形類別CTriangle,它也繼承自CShape類別,同時改寫了父類別的area() method,可用來傳回三角形物件的面積。 (d)試利用 (a)~(c) 所定義的類別,建立圓形、正方形與三角形物件各一個,其中所有的引數(如半徑、邊長或三角形的底和高等)請自行設定。 (e)試撰寫一個largest() method,可用來找出 (d) 中的所有物件裡,面積的最大值。 */ class CShapehw10_11 //父類別Cshape10_11 { public double area() { return 0.0; }


//比較三個面積的大小,因為CShapehw10_11 s[]陣列是在static類別裡宣告
//所以void前面必須加static
public static void largest(CShapehw10_11 s[])
{ double max=0.0; for(int i=0;i<s.length;i++){ if(s[i].area()>max){ //s[i].area()==>呼叫出每個陣列的面積
max=s[i].area(); }
} System.out.println("面積最大的是"+max); }
}


class CCirclehw10_11 extends CShapehw10_11 //子類別 CCirclehw10_11 { private double pi; private double radius;
public CCirclehw10_11(double p ,double r){ /子類別CCirclehw10_11建構元
pi=p; radius=r; }

public double area(){ return pi*radius*radius; //傳回圓面積
}
}


class CSquarehw10_11 extends CShapehw10_11 //子類別 CSquarehw10_11 { private double length; private double width; public CSquarehw10_11(double l ,double w){//子類別CSquarehw10_11建構元 length=l; width=w; }

public double area(){ return length*width; //傳回正方形面積 } }



class CTrianglehw10_11 extends CShapehw10_11 //子類別CTrianglehw10_11 { private double base=4.0; private double height=10.0; public CTrianglehw10_11(double b ,double h){ //子類別CTrianglehw10_11建構元
base=b; height=h; }


public double area() { return (base*height)/2; //傳回三角形面積 } }

public class hw10_11 { public static void main(String args[]){ //CCirclehw10_11 cir=new CCirclehw10_11(3.0,4.0); //cir.area(); //CSquarehw10_11 cqr=new CSquarehw10_11(5.0,6.0); /cqr.area(); //CTrianglehw10_11 ctr=new CTrianglehw10_11(7.0,8.0); //ctr.area();

//透過父類別變數存取子類別物件的成員 CShapehw10_11 shp[]=new CShapehw10_11[3];


//傳值到CCirclehw10_11(double p ,double r)建構元,並將回傳面積儲存在shp[0] shp[0]=new CCirclehw10_11(3.0, 4.0);
System.out.println("圓形面積="+shp[0].area());


//傳值到CSquarehw10_11(double l ,double w)建構元,並將回傳面積儲存在shp[1]
shp[1]=new CSquarehw10_11(5.0,6.0);
System.out.println("正方形面積="+shp[1].area());

//傳值到CTrianglehw10_11(double b ,double h)建構元,並將回傳面積儲存在shp[2] shp[2]=new CTrianglehw10_11(7.0,8.0);
System.out.println("三角形面積="+shp[2].area()); CShapehw10_11.largest(shp);//將陣列傳遞到largest()函數內比較大小
} }

試設計一程式,依照下列公式來計算sum的值,並將其印出

/* * 試設計一程式,依照下列公式來計算sum的值,並將其印出。 * Sum = a[n]*b[9-n]=a[0]*b[9]+a[1]*b[8]+....+a[9]*b[0] * */ public class hw6_2 { public static void main(String[] args) { int sum=0; int a[]={18,-51,23,35,10,9,-3,52,81,69}; int b[]={28,32,-35,40,73,17,92,32,13,29}; //只有n的值在改變而已,所以只需要一個迴圈
for(int i=0;i<a.length;i++){ //迴圈中i<a.length或b.length皆可以,因為a,b兩陣列長度皆為10 sum+=a[i]*b[9-i]; //計算總和 } System.out.println(sum); } }

陣列相關公式

1.陣列遞增寫法for(int i=0;i<a.length;i++) //假設陣列名稱為a 2.陣列遞減寫法for(int i=a.length-1;i>=0;i--) //因為陣列長度會比索引值多1,因此減1 3.假設有一維陣列double sum[]={0,0,0,0}; 要取得該陣列長度:sum.length ==>4 4.假設有二維陣列double[][] data = {{18.2, 17.3, 15.0, 13.4}, {23.8, 25.1, 20.6, 17.8}, {20.6, 21.5, 18.4, 15.7}}; 4.1.要取得data陣列的列數:data.length ==>3 4.2.要取得data陣列第0列的元素的個數:data[0].length ==>4
4.3 設兩個二維陣列用第2個取代第一個: int A[][]={{1,2,3},{4,5,6}}; //設陣列A
public void replace(){
//設陣列data,列數與行數比照A陣列
int data[][]=new int[A.length][A[0].length];
for(int i=0;i<A.length;i++){ for(int j=0;j<A[i].length;j++){ data[i][j]=A[i][j]; //data陣列取代A陣列的內容 } } for(int i=0;i<data.length;i++){ for(int j=0;j<data[i].length;j++){ System.out.print("data:["+i+"]"+"["+j+"]="+data[i][j]+" "); //印出data陣列 } }
}

請將表的內容直接於程式中以陣列初值方式設定

/* 星期 一 二 三 四 ---------------------------------------- 時段一 18.2 17.3 15.0 13.4 時段二 23.8 25.1 20.6 17.8 時段三 20.6 21.5 18.4 15.7 請將上表的內容直接於程式中以陣列初值方式設定,並依序完成下列各題: (a)印出陣列內容。 (b)每日的平均溫度。 (c)時段一、時段二與時段三的平均氣溫。 (d)溫度最高的日子與時段。 (e)溫度最低的日子與時段。 */ public class hw6_8 { private double[][] data = {{18.2, 17.3, 15.0, 13.4}, {23.8, 25.1, 20.6, 17.8}, {20.6, 21.5, 18.4, 15.7}}; public void print(){ //印出陣列內容 for(int i=0;i<data.length;i++){ for(int j=0;j<data[i].length;j++){ System.out.print("data["+i+"]"+"["+j+"]="+data[i][j]+"\t"); } System.out.println(); //換行 } }

public void columnaverage(){ //計算行的總和與平均 /*宣告sum為一維陣列,大小設4個元素 (因為星期一到四有4行,每個元素分別儲存星期1、2、3、4加總) 可寫成double sum[]={0,0,0,0}; data[0].length,抓取data陣列第0列的元素個數,結果為整數4,代表有4行 */ double sum[]=new double[data[0].length];//此寫法不用手動計算行數給值 for(int i=0;i<data.length;i++){ for(int j=0;j<data[i].length;j++){ sum[j]+=data[i][j]; //只儲存行的值並加總 } }

for(int i=0;i<sum.length;i++){ System.out.printf("day %d 的總和=%.2f度 平均溫度=%.2f度\n",
i+1,sum[i],(sum[i])/(sum.length-1)); //sum陣列長度為4,,但一行的元素值只有三個,因此sum.length-1再與行的總和相除才正確 } }

public void rowaverage(){ //計算列的總和與平均 double sum=0.0; for(int i=0;i<data.length;i++){ sum=0.0; //每印完一次時段總和即歸零,否則總和會三列全部相加
for(int j=0;j<data[i].length;j++){ sum+=data[i][j]; //儲存列的總和 } System.out.printf("時段 %d 的總和=%.2f 平均溫度=%.2f度\n",
i+1,sum,(sum)/(data[0].length)); /*data陣列的列數只有三列,但一列有4個元素 因此算平均時不能使用data.length,否則會變成(sum/3)
所以必須改用data[0].length,代表取得第0列元素的個數,也就是4
*/ } } public void maxvalue(){ //找出陣列中溫度最高的時段和對應之日期 int day=0,period=0; double max=data[0][0]; for(int i=0;i<data.length;i++) { for(int j=0;j<data[i].length;j++){ double sum=data[i][j]; if(max<sum){ max=sum; day=j; period=i; } } }

System.out.printf("星期 %d 的第%d時段 溫度最高=%.2f度",day+1,period+1,max);
System.out.println(); //換行 //由於陣列索引值是從0開始,所以day與period都必須加一才符合對應之日期與時段 } public void minvalue(){ int day=0,period=0; double min=data[0][0]; for(int i=0;i<data.length;i++){ for(int j=0;j<data[i].length;j++){ double sum=data[i][j]; if(min>sum){ min=sum; day=j; period=i; } } } System.out.printf("星期 %d 的第%d時段 溫度最低=%.2f度",day+1,period+1,min); } public static void main(String[] args) { //程式進入點 hw6_8 app = new hw6_8 (); app.print();//印出陣列內容 app.columnaverage(); //印出行(星期1~4)的總和與平均 app.rowaverage(); //印出列(時段1~3)的總和與 app.maxvalue(); app.minvalue(); } }