วันจันทร์ที่ 19 กันยายน พ.ศ. 2554

การเขียนโปรแกรมแบบเงื่อนไข

วิธีใช้ switch case

บทนี้จะสอนการเช็คเงื่อนไขในอีกลักษณะ เรียกว่า switch...case ครับ
เช่น คุณสร้างโปรแกรมที่มีเมนู กด 1 ให้ทำอันนึง กด 2 ให้ทำอันนึง กด 0 ให้ออก เป็นต้น คุณจะทำยังไง

ถ้าเราทำแบบที่เคยเรียนกันมา เราก็ต้องรับค่าจากผู้ใช้ ว่ากดอะไร แล้วมาเข้า if..else ใช้มั้ยครับ
สมมติให้ตัวแปรชื่อ menu เก็บค่าเมนูที่ผู้ใช้เลือก (สมมติว่ารับค่าจาก scanf ) เวลาเช็คก็ทำงี้
if(menu==1) printf("You choose 1");
else if(menu==2) printf("You choose 2");
else if(menu==0) printf("You want to exit");
else printf("Wrong choosing");

ถ้าเมนูมีมากกว่า 3 อย่าง เราก็เพิ่มส่วน else if ไปเยอะๆ แต่เขียนแบบนี้บางทีมันยาว เราเลยจะใช้ switch...case ซึ่งมีรูปแบบ แบบนี้
switch(ตัวแปร) {
    case ค่า : คำสั่งที่จะให้ทำ;    // case ค่า ตามด้วยโคลอน(กด shft+เซมิโคลอน)
                   break;
    case ค่า : คำสั่ง;
                   break;
    default :คำสั่ง
}

งงล่ะสิ ห้าห้าห้า (โรคจิตว่ะ) คืองี้ ถ้าเราตจ้องการเช็คค่าในตัวแปรตัวนึง อย่างในตัวอย่างเราต้องการเช็คค่าในตัวแปร menu ถูกป่ะ เราก็เอา menu ไปใส่ในวงเล็บ แบบนี้    switch(menu) {.....}  ส่วน case คือค่าที่จะเช็ค ในที่นี้ก็คือเลข 1 2 และ 0 คำสั่งก็คือสิ่งที่จะให้ทำเมื่อเงื่อนไขถูกต้อง จะมีกี่คำสั่งก็ได้ โดยไม่ต้องมีปีกกาครอบหลัง case พอเขียนคำสั่งเสด ก็เขียน break ก่อนจะขึ้น case ต่อไป แต่มีข้อแม้ว่า ค่าที่จะเช็คใน case ต้องเป็นค่าตรงๆ อย่างเลข 1 2 3... หรือตัวอักษรเป็นตัวๆ จะมาใส่เป็นเงื่อนไขยาวๆแบบใน if ไม่ได้ ใครยังไม่เก็ท ดูตัวอย่าง
switch(menu) { // ต้องการดูค่าใน menu
    case 1 : printf("Choose 1");  // ถ้า menu มีค่าเป็น 1 ให้ printf ตรงนี้มากกว่า 1 คำสั่งได้             
                break; // ใส่ break ก่อนขึ้นเคสต่อไป
    case 2 : printf("Choose 2 ");
                break;
    case 0 : printf("exit");
                break;
    default : printf("Wrong"); // ถ้าไม่ตรงเลย จะมาทำหลัง default ซึ่งไม่ต้องมี break ก็ได้
}

แต่เวลาเขียนเคส จะเขียน    case >1 && <= 10 : ...อะไรทำนองนี้ไม่ได้นะ ต้องเขียนเป็นค่าตรงๆไปเลย
ถามว่าไม่ใส่ break ได้ป่ะ...
ได้ครับ คอมไพล์ผ่าน รันได้ แต่ปัญหาคือ ถ้า menu เป็น 1 มันจะทำตั้งแต่ case 1 :.. ไปจนถึง default หรือจนกว่าจะเจอคำสั่ง break; หรือถ้า menu เป็น 2 มันก็จะทำตั้งแต่ case 2 : ... ไปจนถึง default หรือจนเจอ break ครับ break เป็นคำสั่งที่บังคับให้ออกจากบล็อก {...} ของ switch นั่นเอง ถ้าไม่มีคำสั่่งนี้ มันก็จะืทำตั้งแต่เคสของมันไปจนถึง default หรือจนกว่าจะเจอ break เพราะอย่างงี้ default ถึงไม่ต้องมี break เนื่องจากเป็นอันสุดท้ายใน switch แล้ว เปรียบ default ได้กับคำสั่ง else นั่นเอง ซึ่ง switch...case จะไม่ยืดหยุ่นเท่า ifelse ครับ เพราะ if..else เราจะเขียนคำสั่งอะไรลงไปในบล็อก {...} ก็ได้ แต่ switch...case เช็คเงื่อนไขก็ได้แค่พื้นๆ แถมคำสั่งก็ทำได้แค่พวกฟังก์ชันหรือทำงานพื้นๆ
อย่าลืมว่าถ้าเราจะเช็ค case ที่เป็นตัวอักษร เราต้องใส่เครื่องหมาย ' ' ครอบตัวอักษรด้วย เช่น
switch(sex) {
    case 'm' : ...
    case 'f' : ..

เป็นต้น

การเขียนโปรแกรมแบบเงื่อนไข

1. if else if
2. switch case