阿瑟 發表
在這篇教學中小弟將以一個類別 (class) 與陣列 (array) 的應用來討論物件導向程式設計帶來了各種好處.
*注意: C++所有語法大小寫有差. 如果您在執行時發現中文無法顯示請自行將程式修改成英文.|
#include <iostream.h> #include <stdlib.h> void main() { int input; do { cout << "請選擇要執行的工作:" << endl; cout << "1. 查閱員工薪水" << endl; cout << "2. 發薪" << endl << endl; cout << "請輸入:"; cin >> input; } while(input!=1 && input!=2); if(input==1) { ...冗長的程式碼... } else { ...冗長的程式碼... } system("PAUSE"); } |
這不是一隻完整的程式, 只是隨便寫寫的一個架構.
我想大部分的人應該都會這樣開始: 輸入, 然後根據輸入做出對應的動作.
但是, 這樣寫不但費時又不易閱讀.
既然介紹了類別, 當然就來運用一下囉.
來看一下這個範例:
#include <iostream.h>
#include <stdlib.h>
class store //代表單一便利商店
{
private:
int salary[5]; //這是紀錄一所便利商店的五個員工分別的薪水
int salary_sum; //這是紀錄一所便利商店所有員工的薪水總和
public:
store(); //這是初始函式, 會將所有類別內數值歸零
void pay_employee(); //這是付薪水的函式, 每執行一次將給每個員工75元, 並紀錄薪水總和
void output_salary(); //輸出員工個別的薪水與所有員工的薪水總和
int return_salary_sum(); //回傳該便利商店的薪水總和
};
class enterprise //代表的是企業
{
private:
store stores[20]; //代表這家企業總共有20家便利商店
int stores_sum; //代表這家企業總共支出的薪水總和
public:
enterprise(); // 這是初始函式, 會將所有類別內數值歸零
void pay_stores(); //給每一家便利商店的員工發薪
void output_stores(); //列出所有員工的薪水
};
store::store()
{
for(int i=0; i<5; i++)
{
salary[i] = 0;
salary_sum = 0;
}
}
void store::pay_employee()
{
for(int i=0; i<5; i++)
{
salary[i] += 75;
salary_sum += 75;
}
}
void store::output_salary()
{
for(int i=0; i<5; i++)
{
cout << "第" << i << "個員工的薪水" << salary[i] << endl;
}
cout << "這家便利商店所有員工的薪水總和: " << salary_sum << endl;
}
int store::return_salary_sum()
{
return salary_sum;
}
enterprise::enterprise()
{
stores_sum = 0;
}
void enterprise::pay_stores()
{
for(int i=0; i<20; i++)
{
stores[i].pay_employee();
stores_sum += stores[i].return_salary_sum();
}
cout << "發薪完成" << endl;
}
void enterprise::output_stores()
{
for(int i=0; i<20; i++)
{
cout << "第" << i << "家便利商店的員工薪水資料:" << endl << endl;
stores[i].output_salary();
}
cout << endl << "所有便利商店薪資總和: " << stores_sum << endl;
}
void main()
{
int input;
char cont;
enterprise myenterprise;
do
{
cout << "請選擇要執行的工作:" << endl;
cout << "1. 查閱員工薪水" << endl;
cout << "2. 發薪" << endl << endl;
cout << "請輸入:";
cin >> input;
if(input==1)
{
myenterprise.output_stores();
}
else
{
myenterprise.pay_stores();
}
do
{
cout << endl << "動作完成, 是否繼續 (y/n)";
cin >> cont;
} while(cont != 'y' && cont != 'n');
} while(cont != 'n');
system("PAUSE");
}
|
小迪先逐一講解每一段的概念:
class store是一個類別, 其類別代表的是一家便利商店. 每家便利商店有5名員工因此有一個5個元素的陣列來記錄每一位員工的薪水. 其他的函式說明都已經寫在上面.
class enterprise這個類別代表是一家企業, 一家企業有20家便利商店, 因此有一個一個20元素的陣列 (注意喔! 這是以store類別作為型態的陣列喔!)
中間的寫法也沒有什麼特別的因此小弟就略過, 直接到void main()主函式的部分.
主函式為了避免使用者亂輸入因此用do-while迴圈來進行確認, 主函式中宣告了一個myenterprise物件, 代表一家企業. 使用者輸入經過if/else判斷以後再執行工作, 這樣的程式碼不是乾淨多了? 如果沒有使用物件導向的話你只能一行一行寫, 要是程式放著晚點再寫, 搞不好回來的時候自己在寫什麼都看不懂了 ^^||
小弟講解到這裡先打住, 其他的部分都是先前有提過的技巧, 加點邏輯思考應嘎是不難懂. 如果您有空的話可以試試看自己從空白的新原始檔著手開始寫, 對功力的增進很有幫助的.