8  ตัวอย่างการวิเคราะห์และการแก้ปัญหาทางธุรกิจด้วยการเขียนโปรแกรม

วัตถุประสงค์

  1. เพื่อให้สามารถวิเคราะห์ออกแบบโปรแกรมในการแก้ปัญหาทางธุรกิจอย่างง่ายได้

  2. เพื่อให้สามารถเขียนโปรแกรมเพื่อแก้ปัญหาทางธุรกิจอย่างง่ายได้

  3. เพื่อให้เข้าใจแนวคิดการเขียนโปรแกรมเชิงวัตถุเบื้องต้นได้

ในบทนี้จะเป็นการนำเสนอตัวอย่างการวิเคราะห์ออกแบบและการเขียนโปรแกรมเพื่อการกระตุ้นให้ผู้เรียนนำความรู้และเครื่องมือในการเขียนโปรแกรมมาใช้ในการแก้ปัญหาอย่างง่ายได้ อย่างไรก็ตามสิ่งสำคัญคือผู้เรียนจะต้องฝึกปฏิบัติการเขียนโปรแกรมด้วยตัวเองจึงจะเกิดความชำนาญ

8.1 ตัวอย่างที่ 1

โปรแกรมคำนวณรายรับให้แก่พนักงานขายของร้านค้าแห่งหนึ่ง โดยมีเงื่อนไขดังนี้

  • พนักงานขายจะมีรายรับจากเงินเดือน (Salary) คนละ 8,000 บาท และ

  • พนักงานขายจะมีรายรับจากค่าคอมมิชชั่น (Commission) จากการขายโดยคิดตามยอดขาย (Sales) ของแต่ละคน

    • ยอดขายต่ำกว่า 10,000 บาทจะไม่ได้รับค่าคอมมิชชั่น

    • ยอดขายตั้งแต่ 10,000 บาท แต่ไม่ถึง 30,000 บาทจะได้รับค่าคอมมิชชั่น 10% ของยอดขาย

    • ยอดขายตั้งแต่ 30,000 บาท ขึ้นไปจะได้รับค่าคอมมิชชั่น 12% ของยอดขาย โดยค่าคอมมิชชั่นที่พนักงานจะได้รับนี้จะต้องหักภาษี (Tax) ตามเงื่อนไข ดังนี้

    • พนักงานอายุงาน (year of work) น้อยกว่า 5 ปี หักภาษี (Tax) 10 % ของค่าคอมมิชชั่น

    • พนักงานอายุงานตั้งแต่ 5 ปีขึ้นไป หักภาษี (Tax) 8 % ของค่าคอมมิชชั่น

การทำงานของโปรแกรมนี้ จะมีการคำนวณค่าคอมมิชชั่นจากยอดขายของพนักงานขายและแสดงผลรายรับทั้งหมด (Total income) ที่พนักงานคนนี้จะได้รับในเดือนนี้ ตัวอย่างหน้าจอโปรแกรม

ตัวอย่างที่ 1

Enter sales: 25000

Enter year of work: 4

**** output ****

Commission: 2500.0

Tax: 250.0

Total income: 10250.0

ตัวอย่างที่ 2

Enter sales: 45000

Enter year of work: 6

**** output ****

Commission: 5400.0

Tax: 432.0

Total income: 12968.0

ตัวอย่างที่ 3

Enter sales: 12000

Enter year of work: 3

**** output ****

Commission: 1200.0

Tax: 120.0

Total income: 9080.0

การวิเคราะห์ข้อมูลนำเข้า กระบวนการ และข้อมูลนำออก

การกำหนดตัวแปร

sale แทน ยอดขาย

income แทน รายรับ

year แทน อายุงาน

totalIncome แทน รายรับทั้งหมด

commission แทน ค่าคอมมิช

tax แทน ภาษี

ขั้นตอนวิธี

  1. รับค่า sale และ year

  2. ถ้า sale < 10,000

    2.1 ถ้าใช่ commission = 0

    2.2 ถ้าไม่ใช่ ถ้า sale < 30,000

        2.2.1 ถ้าใช่ commission = sale * 0.10
    
        2.2.2 ถ้าไม่ใช่ commission = sale * 0.12
  3. income = 8,000 + commission

  4. ถ้า year < 5 ปี

    4.1 ถ้าใช่ tax = commission * 0.10

    4.2 ถ้าไม่ใช่ tax = commission 0.08

  5. totalIncome = income – tax

  6. แสดงผล commission, tax, และ totalIncome ออกทางจอภาพ

โปรแกรม
import java.util.Scanner;
public class Item8  {
    public static void main (String[ ] args)  {
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter sales: ");
        double sale = sc.nextDouble();
        System.out.print("Enter year of work: ");
        int year = sc.nextInt();
        double commission;
        //Check sale condition to calculate commission
        if(sale < 10000)
            commission = 0;
        else if(sale < 30000)
            commission = sale * 0.10;
        else    commission = sale * 0.12;
        //Calculate income
        double income = 8000 + commission;  
double tax;
        //Check year condition to calculate tax
        if(year < 5)
            tax = commission * 0.10;
        else     tax = commission * 0.08;
        //Calculate total income
        double totalIncome = income - tax;
        //Display result
        System.out.println("******** output ***********");
        System.out.println("Commission: " + commission);

8.2 ตัวอย่างที่ 2

โปรแกรมรับค่าจำนวนชนิดสินค้าและยอดเงินหน่วยเป็นบาทจากการขายสินค้าแต่ละชนิดของบริษัทชาวจีนแห่งหนึ่งในประเทศไทย มาแปลงเป็นหน่วยเงินหยวนซึ่งมีอัตราแลกเปลี่ยนเป็นดังนี้ คือ 1 บาท = 0.214640837 หยวน

บริษัทดังกล่าวต้องการทราบว่ายอดขายสินค้าของสินค้าที่ขายได้มากที่สุด ยอดขายของสินค้าที่ขายได้น้อยที่สุด ยอดรวมของการขายสินค้าทุกชนิด และยอดขายเฉลี่ยของแต่ละสินค้า

นอกจากนี้ทางบริษัทต้องการที่จะแบ่งกลุ่มของสินค้าจากยอดขายสินค้าออกเป็น 3 กลุ่ม คือ สินค้ากลุ่ม A กลุ่ม B และกลุ่ม C ตามลำดับ โดยแบ่งตามยอดขายดังนี้ สินค้ากลุ่ม A คือสินค้าที่มียอดขายตั้งแต่ 10,000 หยวนขึ้นไป สินค้ากลุ่ม B คือสินค้าที่มียอดขายตั้งแต่ 8,000 แต่ไม่ถึง 10,000 หยวน และสินค้าเกรด C คือสินค้าที่มียอดขายต่ำกว่า 8,000 หยวน จากข้อกำหนดความต้องการของโปรแกรมนี้เราสามารถใช้อาร์เรย์ในการจัดเก็บยอดขายสินค้าได้ และสร้างเมท็อดในการแปลงหน่วยเงิน ดังตัวอย่างโปรแกรมต่อไปนี้

โปรแกรม
import java.util.Scanner;
public class ProductGroup   {
     public static void main (String[]args) { 
Scanner sc = new Scanner(System.in);
System.out.print("Enter number of product types: ");
int num = sc.nextInt();
double [ ] product = new double[num];
double [ ] yuan = new double[num];
double sum = 0;
double max, min;
//Input product revenues
for (int i = 0; i < num; i++) {
System.out.print("Enter product " + (i+1) + "(Baht) : ");
product[i] = sc.nextDouble();
}
System.out.println("****Output****");
max = product[0];
min = product[0];
for (int i = 0; i < num; i++) {
yuan[i] = convertMoney(product[i] );
sum = sum + yuan[i];
System.out.println("product " + (i+1) + "(Yuan) : " + yuan[i]);
if(max < yuan[i]) {
max = yuan[i];
}
if(min > yuan[i]) {
min = yuan[i];
}
}
System.out.println("\nMax (Yuan) = " + max);
System.out.println("Min (Yuan) = " + min);
System.out.println("Sum (Yuan) = " + sum);
System.out.println("Average (Yuan) = " + (sum/yuan.length));
System.out.print("\nGrade A: Product ");
for (int i = 0; i < 5; i++)
if (yuan[i] >= 10000)
System.out.print((i+1) + " ");
System.out.print("\nGrade B: Product ");
for (int i = 0; i < 5; i++)
if(yuan[i]<10000 && yuan[i]>=8000 )
System.out.print((i+1) + " ");
System.out.print("\nGrade C: Product ");
for (int i = 0; i < 5; i++)
if(yuan[i]<8000)
System.out.print((i+1) + " ");
} //main method

public static double convertMoney (double amount) {
return amount * 0.214640837;
}//method converMoney

      } //class
ตัวอย่างผลการทำงานของโปรแกรมเป็นดังนี้

Enter number of product types: 5

Enter product 1(Baht) : 44000

Enter product 2(Baht) : 48000

Enter product 3(Baht) : 50200

Enter product 4(Baht) : 37000

Enter product 5(Baht) : 43000

*****Output*****

product 1(Yuan) : 9444.196828

product 2(Yuan) : 10302.760176

product 3(Yuan) : 10774.9700174

product 4(Yuan) : 7941.710969

product 5(Yuan) : 9229.555991

Max (Yuan) = 44000.0

Min (Yuan) = 7941.710969

Sum (Yuan) = 47693.1939814

Average (Yuan) = 9538.63879628

Grade A: product 2 3

Grade B: product 1 5

Grade C: product 4

อย่างไรก็ตามการแก้ปัญหาอาจมีวิธีการแก้ไขได้หลายวิธี การเขียนโปรแกรมตามตัวอย่างนี้จึงเป็นเพียงแนวทางหนึ่งเท่านั้น

8.3 การเขียนโปรแกรมเชิงวัตถุ

เนื้อหาในเอกสารประกอบการสอนรายวิชานี้เป็นการเขียนโปรแกรมคอมพิวเตอร์เบื้องต้นโดยเน้นรูปแบบการเขียนโปรแกรมเชิงกระบวนการ (procedural programming) ดังนั้นแม้ว่าภาษาจาวาจะเป็นภาษาที่รองรับการเขียนโปรแกรมเชิงวัตถุ (object-oriented programming: OOP) แต่ในทุกบทที่ผ่านมาจะนำเสนอโปรแกรมภาษาจาวาในรูปแบบที่ไม่มีการสร้างวัตถุหรืออ็อบเจกต์ (object) ในส่วนนี้จึงขอกล่าวถึงแนวคิดการเขียนโปรแกรมเชิงวัตถุในเบื้องต้นเพื่อให้เห็นถึงแนวทางการแก้ปัญหาอีกรูปแบบหนึ่งซึ่งจะมีการเรียนการสอนเพิ่มเติมในรายวิชาโครงสร้างข้อมูลและแนวคิดการเขียนโปรแกรมเชิงวัตถุ และรายวิชาการเขียนโปรแกรมบนอุปกรณ์เคลื่อนที่

8.3.1 แนวคิดการเขียนโปรแกรมเชิงวัตถุ

แนวทางการเขียนโปรแกรมเชิงวัตถุข้อมูลสามารถถูกประกาศใช้ในแต่ละอ็อบเจกต์และภายในอ็อบ-เจกต์จะมีส่วนของการทำงานของโปรแกรมหรือเมท็อดรวมอยู่ด้วยกัน การจัดเก็บข้อมูลไว้ในอ็อบเจกต์จะช่วยป้องกันข้อมูลโดยการห่อหุ้มข้อมูลไว้ภายในอ็อบเจกต์ทำให้ไม่สามารถเข้าถึงข้อมูลโดยไม่ได้รับอนุญาต หากต้องการเข้าถึงข้อมูลของอ็อบเจกต์หนึ่งจากอีกอ็อบเจกต์หนึ่งสามารถทำได้ผ่านการเรียกใช้เมท็อดที่อยู่ภายในอ็อบเจกต์ที่มีข้อมูลนั้นอยู่ ดังภาพที่ 8-1 ทำให้การแก้ไขโปรแกรมและการนำส่วนของโปรแกรมกลับไปใช้ใหม่ทำได้ง่ายขึ้นเหมาะกับโปรแกรมหรือระบบงานที่มีการทำงานที่ซับซ้อน

ภาพที่ 8.1 แนวคิดของอ็อบเจกต์ซึ่งภายในจะประกอบไปด้วยข้อมูลและเมท็อด

8.3.2 คลาสและอ็อบเจกต์

การแก้ปัญหาต่าง ๆ ด้วยการเขียนโปรแกรมเชิงวัตถุจะอาศัยการวิเคราะห์และออกแบบโปรแกรมโดยการมองสิ่งที่มีคุณลักษณะ (attribute) หรือข้อมูลหรือตัวแปร และความสามารถ (เมท็อด) เหมือนกันไว้เป็นกลุ่มเดียวกันเรียกว่า คลาส   ดังนั้นคลาสจะเป็นเหมือนแม่แบบที่ใช้ในการสร้างอ็อบเจกต์หรือวัตถุ   ตัวอย่างเช่น  คลาสสามารถสร้างอ็อบเจกต์คือภาพยนตร์ (movie) แต่เรื่อง เช่น ภาพยนตร์เรื่อง Tinanic ภาพยนตร์เรื่อง Life is Beautiful  ภาพยนตร์เรื่อง Transformer เป็นต้น  ภาพแต่ละเรื่องจะมีคุณสมบัติเหมือนกันคือ มีชื่อเรื่อง (title) ประเภท (genre) ความนิยม (rating) และมีความสามารถเหมือนกัน คือ สามารถเล่นภาพยนตร์เรื่องนั้นได้ เป็นต้น  จึงจัดเป็นคลาสเดียวกัน  แต่เมื่อนำไปสร้างเป็นอ็อบเจกต์ของภาพยนตร์แต่ละเรื่องก็จะมีชื่อเรื่อง ประเภท และความนิยม แตกต่างกันไป ดังภาพที่ 8-2

ภาพที่ 8-2 ภาพจำลองของคลาส Movie

8.3.3 การเขียนโปรแกรมแบบมีการสร้างคลาสและอ็อบเจกต์

ในส่วนนี้จะขอยกตัวอย่างวิธีการสร้างและใช้งานอ็อบเจกต์อย่างง่ายซึ่งจำเป็นจะต้องมีคลาสอย่างน้อย 2 คลาสคือ คลาสที่เป็นแม่แบบของอ็อบเจกต์ที่ต้องการจะสร้าง และคลาสอีกคลาสหนึ่งซึ่งมีเมท็อด main โดยที่เมท็อด main จะทำการสร้างและเข้าถึงอ็อบเจกต์ของคลาสแรกที่เป็นแม่แบบของอ็อบเจกต์   ในที่นี้จะทดลองเขียนโปรแกรมอย่างง่ายโดยให้คลาสที่ใช้เพื่อเป็นตัวทดสอบการใช้งานอ็อบเจกต์มีวัตถุประสงก์การทำงานอย่างเดียวคือเรียกใช้เมท็อดและตัวแปรของอีกคลาสหนึ่งเท่านั้น ดังตัวอย่างโปรแกรมต่อไปนี้
Note
class Movie {  
String title;  
String genre;  
int rating;  
void playMovie() {    
System.out.println(“Playing the movie”);  
} 
            }
public class MovieTest {  
public static void main(String[] args) {    
Movie m1 = new Movie();    
m1.title = “Tinanic”;    
m1.genre = “Tragic”;    

จากโปรแกรมข้างต้นมีการสร้างคลาสแรกชื่อ Movie ซึ่งมีคุณสมบัติหรือตัวแปรคือ title, genre และ rating โดยมีความสามารถหรือเมท็อดคือ playMovie() สำหรับคลาสที่สองชื่อ MovieTest เป็นคลาสที่ประกอบไปด้วยเมท็อด main ซึ่งมีการสร้างอ็อบเจกต์ของคลาส Movie ที่บรรทัดที่ 11, 15 และ 20 ชื่อ m1, m2 และ m3 ตามลำดับ โดยคำสั่งจากตัวอย่างบรรทัดที่ 11 คือ Movie m1 = new Movie(); เป็นคำสั่งการสร้างอ็อบเจกต์ชื่อ m1 จากคลาส Movie การกำหนดค่าให้กับตัวแปรในแต่ละอ็อบเจกต์ใช้ตัวดำเนินการจุด (.) เช่นในบรรทัดที่ 12 คือ m1.title = “Tinanic”; หมายถึงกำหนดให้ตัวแปร title ของอ็อบเจกต์ m1 มีค่าเป็น “Titanic” สำหรับการเรียกใช้งานเมท็อดของอ็อบเจกต์ มีตัวอย่างดังในบรรทัดที่ 19 คือ m2.playMovie(); เป็นการเรียกใช้งานเมท็อด playMovie()

แบบฝึกหัด

  1. ให้เขียนโปรแกรมเพื่อตรวจสอบคุณสมบัติของผู้สมัครเข้าทำงานของบริษัทแห่งหนึ่ง โดยบริษัทได้ทำการจัดสอบวัดความสามารถด้านภาษาอังกฤษขึ้นเองแล้วต้องการนำคะแนนของผู้สมัครแต่ละคนมาทำการเปรียบเทียบกับผลคะแนนการสอบ TOEFL ซึ่งมีสูตรการแปลงดังนี้ คะแนน TOEFL = (คะแนนสอบ/550.0) * 650 โดยทางบริษัทต้องการทราบผลคะแนนสูงสุด ต่ำสุด และคะแนนเฉลี่ยทั้งหมดด้วย การตรวจสอบคุณสมบัตินี้ถ้าผู้สมัครคนใดได้คะแนนมากกว่าคะแนนเฉลี่ยของการสอบในครั้งนั้นจะถือว่าสอบผ่าน

  2. ให้เขียนโปรแกรมเพื่อคำนวณเกรดเฉลี่ยประจำภาคการศึกษา และพิจารณาหาสถานภาพนักศึกษาตามระเบียบมหาวิทยาลัยสงขลานครินทร์ ว่าด้วยการศึกษาระดับปริญญาตรี ฉบับล่าสุด แล้วแสดงรายงานข้อมูลรหัสนักศึกษา ชื่อ-สกุล ชั้นปี ชื่อวิชา จำนวนหน่วยกิต ระดับขั้น เกรดเฉลี่ยสะสม และสถานภาพของนักศึกษา

  3. ให้เขียนโปรแกรมเพื่อจำลองการทำงานของตู้ขายสินค้าหรือการให้บริการอัตโนมัติ โดยกำหนดรายละเอียดอื่น ๆ ตามความเหมาะสมให้ใกล้เคียงกับการทำงานจริงมากที่สุด

  4. ให้เขียนโปรแกรมแบบเชิงวัตถุ โดยทำการสร้างคลาสนักศึกษาขึ้นมาให้มีคุณสมบัติหรือตัวแปร คือ ชื่อ นามสกุล และชั้นปี คลาสนี้มีความสามารถหรือเมท็อด คือ แสดงชื่อ แสดงนามสกุล และแสดงชั้นปีของนักศึกษาได้ จากนั้นให้ทดลองสร้างอ็อบเจ็กและเรียกใช้เมท็อดดังกล่าว