การเลือกทำตามเงื่อนไข
โครงสร้างแบบลำดับ (sequential structure) มีลักษณะการประมวลผลโปรแกรมจากคำสั่งแรกของฟังก์ชัน main() จนถึงคำสั่งสุดท้ายของฟังก์ชัน main() สังเกตได้จากตัวอย่างโปรแกรมในหัวข้อที่ผ่านมา นั่นคือ คำสั่งในลำดับที่ n+1 จะถูกประมวลหลังคำสั่งลำดับที่ n เสมอ
นอกจากโครงสร้างแบบลำดับแล้ว ภาษาซียังมีโครงสร้างแบบอื่นๆ อีก คือ โครงสร้างแบบทางเลือก (selection structure) และโครงสร้างแบบวนซ้ำ (repetition structure)
โดยโครงสร้างแบบทางเลือก ประกอบด้วย คำสั่ง if คำสั่ง if-else และคำสั่ง switch ส่วนโครงสร้างแบบวนซ้ำ ประกอบด้วย คำสั่ง for คำสั่ง while และ คำสั่ง do-while โครงสร้างทั้งสองแบบจะช่วยให้นักเขียนโปรแกรมสามารถเขียนโปรแกรมเพื่อแก้ปัญหาที่มีเงื่อนไขที่ซับซ้อนมากยิ่งขึ้น เมื่อเปรียบเทียบกับการใช้โครงสร้างแบบลำดับเพียงอย่างเดียว
นอกจากโครงสร้างแบบลำดับแล้ว ภาษาซียังมีโครงสร้างแบบอื่นๆ อีก คือ โครงสร้างแบบทางเลือก (selection structure) และโครงสร้างแบบวนซ้ำ (repetition structure)
โดยโครงสร้างแบบทางเลือก ประกอบด้วย คำสั่ง if คำสั่ง if-else และคำสั่ง switch ส่วนโครงสร้างแบบวนซ้ำ ประกอบด้วย คำสั่ง for คำสั่ง while และ คำสั่ง do-while โครงสร้างทั้งสองแบบจะช่วยให้นักเขียนโปรแกรมสามารถเขียนโปรแกรมเพื่อแก้ปัญหาที่มีเงื่อนไขที่ซับซ้อนมากยิ่งขึ้น เมื่อเปรียบเทียบกับการใช้โครงสร้างแบบลำดับเพียงอย่างเดียว
คำสั่ง if และ if-else
- คำสั่ง if
รูปแบบของคำสั่ง if เป็นดังนี้
เงื่อนไขทางเลือก ที่เขียนอยู่ระหว่างเครื่องหมาย ( และ ) เป็นนิพจน์ใด ๆ ที่สามารถประเมินค่าได้
คำสั่ง อาจเป็นคำสั่งอย่างง่าย หรือคำสั่งเชิงประกอบ ตามตัวอย่างที่ 4.1.1
ตัวอย่างที่ 4.1.1 โปรแกรมทายตัวเลข1
- ในกรณีที่ เงื่อนไขทางเลือก มีค่าเป็น จริง และไม่เท่ากับ 0
- จะประมวลผลคำสั่ง
- ในกรณีที่ เงื่อนไขทางเลือก มีค่าเป็น เท็จ และเท่ากับ 0
- จะไม่ประมวลผลคำสั่ง
คำสั่ง อาจเป็นคำสั่งอย่างง่าย หรือคำสั่งเชิงประกอบ ตามตัวอย่างที่ 4.1.1
ตัวอย่างที่ 4.1.1 โปรแกรมทายตัวเลข1
จากการรันครั้งที่ 1 ตัวแปร y (ในบรรทัดที่ 7) รับค่าจากแป้นพิมพ์ เท่ากับ 18 (ในบรรทัดที่ 10) นิพจน์เปรียบเทียบ y == TARGET (ในบรรทัดที่ 12) จะมีค่าเป็นเท็จ แล้วฟังก์ชัน printf( ) (ในบรรทัดที่ 13) จะไม่ได้ถูกประมวลผล แต่ไปประมวลผลต่อในคำสั่งถัดไป (ในบรรทัดที่ 14) และจนจบโปรแกรม
จากการรันครั้งที่ 2 ตัวแปร y รับค่าจากแป้นพิมพ์ เท่ากับ 25 ทำให้นิพจน์เปรียบเทียบ y == TARGET มีค่าเป็นจริง แล้วฟังก์ชัน printf( ) (ในบรรทัดที่ 13) ถูกประมวลผล แล้วประมวลผลต่อในคำสั่งถัดไปจนจบโปรแกรม
จากการรันครั้งที่ 2 ตัวแปร y รับค่าจากแป้นพิมพ์ เท่ากับ 25 ทำให้นิพจน์เปรียบเทียบ y == TARGET มีค่าเป็นจริง แล้วฟังก์ชัน printf( ) (ในบรรทัดที่ 13) ถูกประมวลผล แล้วประมวลผลต่อในคำสั่งถัดไปจนจบโปรแกรม
- คำสั่ง if-else
จากผลลัพธ์ตัวอย่างที่ 4.1.2 ตัวแปร y รับค่าจากแป้นพิมพ์ เท่ากับ 18 นิพจน์เปรียบเทียบ y == TARGET จะมีค่าเป็นเท็จ จะไม่ประมวลผลฟังก์ชัน printf( ) ในบรรทัดที่ 13 แต่ฟังก์ชัน printf( ) ในบรรทัดที่ 15 จะถูกประมวลผลแทน แล้วไปประมวลผลต่อในคำสั่งถัดไป (ในบรรทัดที่ 16) จนจบโปรแกรม
จะเห็นได้ว่าคำสั่ง if และคำสั่ง if – else ทำให้เกิดทางเลือกของการประมวลผลภายใต้เงื่อนไขที่กำหนดโดยนิพจน์ที่อยู่ต่อจาก if ในคำสั่ง if ถ้าเงื่อนไขเป็นเท็จคำสั่งที่อยู่หลังเงื่อนไขจะไม่ถูกประมวลผล สำหรับในกรณีคำสั่ง if – else จะมีเพียงคำสั่งหนึ่งคำสั่งใดเท่านั้นที่จะถูกประมวลผล ซึ่งจะประมวลผลคำสั่งใดขึ้นอยู่กับค่าความจริงของเงื่อนไข
- คำสั่ง if-else เชิงซ้อน (Nested if)
คำสั่ง if – else เชิงซ้อน คือ คำสั่ง if – else ที่มีคำสั่ง if – else ซ้อนอยู่ในส่วน else ประโยคเงื่อนไขในลักษณะนี้ อาจสร้างความสับสนแก่ผู้เขียนโปรแกรมได้ จึงต้องมีความระมัดระวัง
รูปแบบของคำสั่ง if – else เชิงซ้อน เป็นดังนี้
คำสั่ง if – else เชิงซ้อนเป็นรูปแบบการทำงานแบบหลายทางเลือก โดยจะมีคำสั่งเพียงเดียวเท่านั้นที่จะถูกเลือกให้ประมวลผล ขึ้นอยู่กับว่า เงื่อนไขทางเลือก ใดเป็นจริง และในกรณีที่ไม่มีเงื่อนไขทางเลือก ใดเป็นจริงเลย คำสั่งn จะถูกประมวลผล
คำสั่ง1, คำสั่ง2, คำสั่ง3, …, คำสั่งn อาจเป็นคำสั่งอย่างง่ายหรือคำสั่งเชิงประกอบ
คำสั่ง1, คำสั่ง2, คำสั่ง3, …, คำสั่งn อาจเป็นคำสั่งอย่างง่ายหรือคำสั่งเชิงประกอบ
พิจารณาค่าของตัวแปร y สำหรับโปรแกรมข้างต้นเป็น 3 กรณี ดังนี้
พิจารณาค่าของตัวแปร y สำหรับโปรแกรมข้างต้นเป็น 3 กรณี ดังนี้
กรณีที่ 1 ถ้า y มีค่าเท่ากับ 100 จะได้ว่านิพจน์ y >TARGET มีค่าเป็น จริง แล้วฟังก์ชัน printf( ) ในบรรทัดที่ 13 จะถูกประมวลผล
กรณีที่ 2 ถ้า y มีค่าเท่ากับ 9 จะได้ว่านิพจน์ y >TARGET มีค่าเป็น เท็จ และนิพจน์ y < TARGET มีค่าเป็น จริง แล้ว ฟังก์ชัน printf( ) ในบรรทัดที่ 15 จะถูกประมวลผล
กรณีที่ 3 ถ้า y มีค่าเท่ากับ 25 จะได้ว่านิพจน์ y > TARGET และนิพจน์ y < TARGET มีค่าเป็น เท็จ ทั้งคู่ ดังนั้น ฟังก์ชัน printf( ) ในบรรทัดที่ 17 จะถูกประมวลผล
พิจารณาคำสั่ง if ในรูปแบบต่อไปนี้ ซึ่งมีคำสั่ง if – else ซ้อนอยู่ด้านใน
พิจารณาค่าของตัวแปร y สำหรับโปรแกรมข้างต้นเป็น 3 กรณี ดังนี้
กรณีที่ 1 ถ้า y มีค่าเท่ากับ 100 จะได้ว่านิพจน์ y >TARGET มีค่าเป็น จริง แล้วฟังก์ชัน printf( ) ในบรรทัดที่ 13 จะถูกประมวลผล
กรณีที่ 2 ถ้า y มีค่าเท่ากับ 9 จะได้ว่านิพจน์ y >TARGET มีค่าเป็น เท็จ และนิพจน์ y < TARGET มีค่าเป็น จริง แล้ว ฟังก์ชัน printf( ) ในบรรทัดที่ 15 จะถูกประมวลผล
กรณีที่ 3 ถ้า y มีค่าเท่ากับ 25 จะได้ว่านิพจน์ y > TARGET และนิพจน์ y < TARGET มีค่าเป็น เท็จ ทั้งคู่ ดังนั้น ฟังก์ชัน printf( ) ในบรรทัดที่ 17 จะถูกประมวลผล
พิจารณาคำสั่ง if ในรูปแบบต่อไปนี้ ซึ่งมีคำสั่ง if – else ซ้อนอยู่ด้านใน
ถ้า เงื่อนไขทางเลือก1 และ เงื่อนไขทางเลือก2 มีค่า จริง แล้วโปรแกรมจะประมวลผล คำสั่ง1 ก่อนที่จะประมวลผล คำสั่ง3
ถ้า เงื่อนไขทางเลือก1 มีค่า จริง ขณะที่ เงื่อนไขทางเลือก2 มีค่าเท็จ แล้วโปรแกรมจะประมวลผล คำสั่ง2 ก่อนที่จะประมวลผล คำสั่ง3
และถ้า เงื่อนไขทางเลือก1 มีค่า เท็จ แล้วโปรแกรมจะประมวลผล คำสั่ง3 เพียงคำสั่งเดียวเท่านั้น
นั่นคือ ในคำสั่ง if – else ( หรือคำสั่ง if – else เชิงซ้อน ) else จะถูกจับคู่กับ if ก่อนหน้าที่อยู่ใกล้ที่สุดเสมอ ซึ่งในที่นี้คือ if ( เงื่อนไขทางเลือก2 )
ดังนั้น ในกรณีที่ต้องการให้ คำสั่ง2 ถูกประมวลผล เงื่อนไขทางเลือก1 มีค่า เท็จ ก่อนที่จะประมวลผล คำสั่ง3 จะต้องเพิ่มเครื่องหมาย { และ } ตามรูปแบบด้านล่าง และในที่นี้ if ( เงื่อนไขทางเลือก2 ) จัดเป็นคำสั่ง if ที่ซ้อนอยู่ในคำสั่ง if – else ของ if ( เงื่อนไขทางเลือก1 )
ถ้า เงื่อนไขทางเลือก1 มีค่า จริง ขณะที่ เงื่อนไขทางเลือก2 มีค่าเท็จ แล้วโปรแกรมจะประมวลผล คำสั่ง2 ก่อนที่จะประมวลผล คำสั่ง3
และถ้า เงื่อนไขทางเลือก1 มีค่า เท็จ แล้วโปรแกรมจะประมวลผล คำสั่ง3 เพียงคำสั่งเดียวเท่านั้น
นั่นคือ ในคำสั่ง if – else ( หรือคำสั่ง if – else เชิงซ้อน ) else จะถูกจับคู่กับ if ก่อนหน้าที่อยู่ใกล้ที่สุดเสมอ ซึ่งในที่นี้คือ if ( เงื่อนไขทางเลือก2 )
ดังนั้น ในกรณีที่ต้องการให้ คำสั่ง2 ถูกประมวลผล เงื่อนไขทางเลือก1 มีค่า เท็จ ก่อนที่จะประมวลผล คำสั่ง3 จะต้องเพิ่มเครื่องหมาย { และ } ตามรูปแบบด้านล่าง และในที่นี้ if ( เงื่อนไขทางเลือก2 ) จัดเป็นคำสั่ง if ที่ซ้อนอยู่ในคำสั่ง if – else ของ if ( เงื่อนไขทางเลือก1 )