2-3 陣列與類別的應用範例


阿瑟 發表



在這篇教學中小弟將以一個類別 (class) 與陣列 (array) 的應用來討論物件導向程式設計帶來了各種好處.

*注意: C++所有語法大小寫有差. 如果您在執行時發現中文無法顯示請自行將程式修改成英文.

*注意: 如果您執行程式後, 程式視窗會自動關閉的話, 請至MS-DOS模式重新執行程式, 或是在void main()最底端加上system("PAUSE");來暫停程式.



我們先來假設: 今天你要幫一個某大企業管理棋下的20家便利商店 (每家各有5名員工), 你該怎麼寫呢?
您的業主對這隻程式的要求是必須能夠紀錄並且管理每家員工的薪水, 並且採用選單的方式操作.

如果採用傳統的程式設計方式, 你可能會先要求使用者輸入, 然後用if/else去判別來設計一個選單的功能, 應該會像這樣:
#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判斷以後再執行工作, 這樣的程式碼不是乾淨多了? 如果沒有使用物件導向的話你只能一行一行寫, 要是程式放著晚點再寫, 搞不好回來的時候自己在寫什麼都看不懂了 ^^||

小弟講解到這裡先打住, 其他的部分都是先前有提過的技巧, 加點邏輯思考應嘎是不難懂. 如果您有空的話可以試試看自己從空白的新原始檔著手開始寫, 對功力的增進很有幫助的.

最後更新日期: 5/29/2003 2:19:58 PM