阿瑟 發表
在這篇教學中小弟將以一個類別 (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判斷以後再執行工作, 這樣的程式碼不是乾淨多了? 如果沒有使用物件導向的話你只能一行一行寫, 要是程式放著晚點再寫, 搞不好回來的時候自己在寫什麼都看不懂了 ^^||
小弟講解到這裡先打住, 其他的部分都是先前有提過的技巧, 加點邏輯思考應嘎是不難懂. 如果您有空的話可以試試看自己從空白的新原始檔著手開始寫, 對功力的增進很有幫助的.