Shape.cs
public class Shape
{
//****************成員*************
protected static double pi = 3.1415926;
private static int amount = 0; //用來紀錄全部共有幾個形狀
private static string ShapeName;
private string material = "";
private double density = 0;
//****************屬性*************
public double Density
{
set
{
if (value >= 0)
density = value;
else
density = 0;
}
get { return density; }
}
public string Material
{
set { material = value; }
get { return material; }
}
public static int Amount
{ get { return amount; }
set { amount = value; }
}
//***************建構子************
public Shape()
{
amount++;
}
//***************方法**************
virtual public double GetVolume()
{
return 0.0;
}//虛擬方法,可讓各子類別計算各自體積
public double GetWeight()
{
return GetVolume() * Density;
}//虛擬方法,可讓各子類別計算各自重量
virtual public string GetShapeName()
{
return "";
}//虛擬方法,各子類別return形狀名稱
}
class Ball : Shape
{
//*********成員**********
private static int amount = 0;
private static string ShapeName = "圓球";
private double parameter = 0;
//*********屬性**********
public double Parameter
{
set
{
if (value >= 0)
parameter = value;
else
parameter = 0;
}
get { return parameter; }
}
new public static int Amount
{ get { return amount; }
set { amount = value; }
}
//**********建構子********
public Ball(double p, double d, string m)
{
Material = m;
Parameter = p;
Density = d;
amount++;
}
//*********方法**********
public override double GetVolume()
{
return 4 * pi * Parameter * Parameter * Parameter / 3;
}//虛擬方法,可讓各子類別計算各自體積
public override string GetShapeName()
{
return ShapeName;
}
}
class Pyramid : Shape
{
//*********成員**********
private static int amount = 0;
private static string ShapeName = "金字塔";
private double length = 0;
private double height = 0;
//***********屬性**************
public double Length
{
set
{
if (value >= 0)
length = value;
else
length = 0;
}
get { return length; }
}
public double Height
{
set
{
if (value >= 0)
height = value;
else
height = 0;
}
get { return height; }
}
new public static int Amount
{ get { return amount; }
set { amount = value; }
}
//**********建構子********
public Pyramid(double l, double h, double d, string m)
{
Material = m;
Length = l;
Height = h;
Density = d;
amount++;
}
//***********方法**************
public override double GetVolume()
{
return Length * Length * Height / 3;
}//虛擬方法,可讓各子類別計算各自體積
public override string GetShapeName()
{
return ShapeName;
}
}
class Cylinder : Shape
{
//*********成員**********
private static int amount = 0;
private static string ShapeName = "圓柱";
private double parameter = 0;
private double height = 0;
//**********屬性**********
public double Parameter
{
set
{
if (value >= 0)
parameter = value;
else
parameter = 0;
}
get { return parameter; }
}
public double Height
{
set
{
if (value >= 0)
height = value;
else
height = 0;
}
get { return height; }
}
new public static int Amount
{ get { return amount; }
set { amount = value; }
}
//**********建構子********
public Cylinder(double p, double h, double d, string m)
{
Material = m;
Parameter = p;
Height = h;
Density = d;
amount++;
}
//**********方法**********
public override double GetVolume()
{
return Parameter * Parameter * pi * Height;
}//虛擬方法,可讓各子類別計算各自體積
public override string GetShapeName()
{
return ShapeName;
}
}
public partial class Form1 : Form
{
private double[] dens = new double[] {11.34, 8.9, 2.7};//鉛銅鋁的密度陣列
Shape[] tolArr = new Shape[100];
public Form1()
{
InitializeComponent();
//初始化版面,FrontPanel設定上ListView內容將View設定為"Details"
listView_temp.Columns.Add("形狀", 60, HorizontalAlignment.Center);
listView_temp.Columns.Add("材質", 60, HorizontalAlignment.Center);
listView_Output.Columns.Add("形狀", 60, HorizontalAlignment.Center);
listView_Output.Columns.Add("材質", 60, HorizontalAlignment.Center);
listView_Output.Columns.Add("體積", 80, HorizontalAlignment.Center);
listView_Output.Columns.Add("重量", 80, HorizontalAlignment.Center);
}
private void btn_Caculate_Click(object sender, EventArgs e)
{
listView_Output.Items.Clear();
PrintAllData();
}
private void btn_Add_Click(object sender, EventArgs e)
{
if (!CheckData(cbox_shape.SelectedIndex)) //檢查是否有資料忘記填寫
return ;
switch (cbox_shape.SelectedIndex)
{
//定義各形狀之建構子傳入參數為參數一,參數二,材料,密度
case 0 : //圓球
tolArr[Shape.Amount] = new Ball(double.Parse(txtb_left.Text), dens[cbox_material.SelectedIndex], cbox_material.SelectedItem.ToString());
txtb_BallNum.Text = Ball.Amount.ToString();
break;
case 1: //金字塔
tolArr[Shape.Amount] = new Pyramid(double.Parse(txtb_left.Text), double.Parse(txtb_right.Text), dens[cbox_material.SelectedIndex], cbox_material.SelectedItem.ToString());
txtb_PyrNum.Text = Pyramid.Amount.ToString();
break;
case 2: //圓柱
tolArr[Shape.Amount] = new Cylinder(double.Parse(txtb_left.Text), double.Parse(txtb_right.Text), dens[cbox_material.SelectedIndex], cbox_material.SelectedItem.ToString());
txtb_CylNum.Text = Cylinder.Amount.ToString();
break;
}
txt_TolalNum.Text = Shape.Amount.ToString();
ListViewItem Data = new ListViewItem(tolArr[Shape.Amount-1].GetShapeName());
Data.SubItems.Add(tolArr[Shape.Amount-1].Material);
listView_temp.Items.Add(Data);
}
//形狀切換
private void cbox_shape_SelectedIndexChanged(object sender, EventArgs e)
{
switch (cbox_shape.SelectedIndex)
{
case 0:
lbl_left.Text = "半徑";
txtb_right.Visible = false;
lbl_right.Visible = false;
break;
case 1:
lbl_left.Text = "邊長";
lbl_right.Text = "高";
txtb_right.Visible = true;
lbl_right.Visible = true;
break;
case 2:
lbl_left.Text = "半徑";
lbl_right.Text = "高";
txtb_right.Visible = true;
lbl_right.Visible = true;
break;
}
}
//將面板重置
private void ResetFrontPanel()
{
listView_temp.Items.Clear();
listView_Output.Items.Clear();
}
//列印所有資料
private void PrintAllData()
{
for (int i = 0; i < Shape.Amount; i++)
{
ListViewItem DataMamber = new ListViewItem(tolArr[i].GetShapeName());
DataMamber.SubItems.Add(tolArr[i].Material);
DataMamber.SubItems.Add(tolArr[i].GetVolume().ToString());
DataMamber.SubItems.Add(tolArr[i].GetWeight().ToString());
listView_Output.Items.Add(DataMamber);
}
}
//檢查數字是否有輸入
private bool CheckData(int flag)
{
switch (flag)
{
case 0:
if (txtb_left.Text == "")
{
MessageBox.Show("資料請輸入完整 !");
return false;
}
break;
case 1:
case 2:
if (txtb_left.Text == "" || txtb_right.Text == "")
{
MessageBox.Show("資料請輸入完整 !");
return false;
}
break;
}
if (cbox_material.Text == "請選擇" || cbox_shape.Text == "請選擇")
{
MessageBox.Show("請選擇形狀與材質 !");
return false;
}
return true;
}
private void btn_clear_Click(object sender, EventArgs e)
{
ResetFrontPanel();
for (int i = 0; i < Shape.Amount; i++)
{
tolArr[i] = null;
}
Shape.Amount = 0;
Ball.Amount = 0;
Pyramid.Amount = 0;
Cylinder.Amount = 0;
txtb_BallNum.Text = "0";
txtb_CylNum.Text = "0";
txtb_PyrNum.Text = "0";
txt_TolalNum.Text = "0";
txtb_left.Text = "";
txtb_right.Text = "";
cbox_material.Text = "請選擇";
cbox_shape.Text = "請選擇";
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HW8
{
interface IRollable
{
string RollDist();//介面方法,滾動距離
}
}



第七組
回覆刪除當按下計算的時候,各形狀的數量統計會歸零,這個地方可以稍微作修改一下
已修正 謝謝!
刪除volume 與 weight 是導出量, 計算時間也很短, 盡量不要宣告欄位來儲存
回覆刪除否則當改變物件的幾何尺寸時, 忘記重新計算這些量, 會造成錯誤
已修正 !
刪除目前以
GetVolume();
以及
GetWeight();做取值
計算金字塔與球的體積的公式好像怪怪的??
回覆刪除感謝 !! 已經修正了 !! XDDDD
刪除林高遠評論:
回覆刪除優:
1. 把pi宣告在基礎類別,很多組都宣告在衍生類別不好
2. 衍生類別建構子把參數設定一氣呵成!
3. 有清除按鈕
4. 有防呆
缺:
1. Get 系列的方法最好不要在基礎類別實做,因為你的基礎類別是在形容Shape,Shape是抽象的,沒有體積重量,也不會有自己的名字;實做出來,呼叫錯了就難發現
2. 防呆不夠好, 只能檢查空白與否, 不能檢查資料型態