Decision Making การตัดสินใจ ภาษา C
โครงสร้างการตัดสินใจต้องการให้โปรแกรมเมอร์ระบุเงื่อนไขหนึ่งหรือหลายเงื่อนไขที่จะได้รับการประเมินหรือทดสอบโดยโปรแกรม พร้อมกับคำสั่งหรือคำสั่งที่จะดำเนินการหากเงื่อนไขถูกกำหนดให้เป็นจริง และทางเลือกอื่น ๆ ที่จะดำเนินการถ้าเงื่อนไข ถูกกำหนดให้เป็นเท็จ
แสดงด้านล่างเป็นรูปแบบทั่วไปของโครงสร้างการตัดสินใจทั่วไปที่พบในภาษาการเขียนโปรแกรมส่วนใหญ่ −
ภาษาซีจะถือว่าค่าที่ไม่ใช่ศูนย์และไม่ใช่ค่าว่างเป็นจริงและหากเป็นค่าศูนย์หรือค่าว่างระบบจะถือว่าค่านั้นเป็นค่าเท็จ
คำสั่งควบคุมเงื่อนไข ในภาษาซีจะใช้ประโยคเงื่อนไข if เพื่อสร้างเงื่อนไข และตรวจสอบเงื่อนไขว่าเป็นจริงหรือเท็จ ทั้งนี้ประโยค if ดังกล่าว ยังสามารถนำมาใช้งานเพื่อเปรียบเทียบเงื่อนไขอย่างง่าย จนถึงเงื่อนไขที่ซับซ้อนสูงได้
การควบคุมเงื่อนไขด้วย if-statement ในการใช้ประโยคคำสั่ง if-statement เพื่อตรวจสอบเงื่อนไข มีอยู่ 5 แบบด้วยกัน คือ
1. if statement
ประโยคเงื่อนไข if อย่างง่ายหรือเรียกว่า if แบบทางเลือกเดียว
Syntax (ไวยากรณ์)
ไวยากรณ์ของคำสั่ง ‘if’ ในภาษาซีคือ −
if(boolean_expression) {
/* statement(s) will execute if the boolean expression is true */
}
หากนิพจน์บูลีนประเมินว่าเป็น จริง (true) บล็อกของโค้ดภายในคำสั่ง ‘if’ จะถูกดำเนินการ หากนิพจน์บูลีนประเมินเป็น เท็จ (false) โค้ดชุดแรกหลังจุดสิ้นสุดของคำสั่ง ‘if’ (หลังวงเล็บปีกกาปิด) จะถูกดำเนินการ
ภาษาซีจะถือว่าค่าที่ไม่ใช่ศูนย์และไม่ใช่ค่าว่างเป็น จริง (true) และหากเป็นค่าศูนย์หรือค่าว่างระบบจะถือว่าค่านั้นเป็นค่า เท็จ (false)
Flow Diagram
ตัวอย่าง
#include <stdio.h>
int main () {
/* local variable definition */
int a = 10;
/* check the boolean condition using if statement */
if( a < 20 ) {
/* if condition is true then print the following */
printf("a is less than 20\n" );
}
printf("value of a is : %d\n", a);
return 0;
}
เมื่อโค้ดด้านบนถูกคอมไพล์และรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ −
2. if…else statement
ประโยคคำสั่งตัดสินใจแบบสองทางเลือกด้วย if…else
Syntax (ไวยากรณ์)
ไวยากรณ์ของคำสั่ง ‘if’ ในภาษาซีคือ −
if(boolean_expression) {
/* statement(s) will execute if the boolean expression is true */
} else {
/* statement(s) will execute if the boolean expression is false */
}
คำสั่ง if…else เป็นคำสั่งที่เราใช้กำหนดให้โปรแกรมตัดสินใจเลือกทำคำสั่งอย่างใดอย่างหนึ่งจาก 2 ทางเลือก โดยตรวจสอบเงื่อนไขที่กำหนดว่าเป็นจริงหรือเท็จ ถ้าเงื่อนไขที่กำหนดเป็น จริง (true) โปรแกรมจะทำงานที่ชุดคำสั่งที่อยู่ภายใต้คำสั่ง if แต่ถ้าเงื่อนไขที่กำหนดให้เป็น เท็จ (false) โปรแกรมจะทำงานที่ชุดคำสั่งที่อยู่ภายใต้คำสั่ง else
ภาษาซีจะถือว่าค่าที่ไม่ใช่ศูนย์และไม่ใช่ค่าว่างเป็น จริง (true) และหากเป็นค่าศูนย์หรือค่าว่างระบบจะถือว่าค่านั้นเป็นค่า เท็จ (false)
Flow Diagram
ตัวอย่าง
#include <stdio.h>
int main () {
/* local variable definition */
int a = 100;
/* check the boolean condition */
if( a < 20 ) {
/* if condition is true then print the following */
printf("a is less than 20\n" );
} else {
/* if condition is false then print the following */
printf("a is not less than 20\n" );
}
printf("value of a is : %d\n", a);
return 0;
}
เมื่อโค้ดด้านบนถูกคอมไพล์และรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ −
a is not less than 20;
value of a is : 100
If…else if…else Statement
ถ้า ชุดคำสั่ง สามารถตามด้วยตัวเลือกอื่นถ้า … อื่นคำสั่งซึ่งจะเป็นประโยชน์มากในการทดสอบเงื่อนไขต่าง ๆ โดยใช้เพียงครั้งเดียวถ้า … ถ้ามีคำสั่งอื่น
เมื่อใช้คำสั่ง if…else if..else มีบางประเด็นที่ต้องคำนึงถึง −
- if สามารถมีศูนย์หรือของอื่นได้และต้องตามหลัง if’s
- if สามารถมีค่าเป็นศูนย์ถึง if’s อื่น ๆ และต้องมาก่อนค่าอื่น
- อีกครั้งหากสำเร็จ จะไม่มีการทดสอบ if’s หรือ else’s ที่เหลืออีกเลย
ไวยากรณ์
ไวยากรณ์ของคำสั่งif…else if…elseในภาษาซีคือ −
if(boolean_expression 1) {
/* Executes when the boolean expression 1 is true */
} else if( boolean_expression 2) {
/* Executes when the boolean expression 2 is true */
} else if( boolean_expression 3) {
/* Executes when the boolean expression 3 is true */
} else {
/* executes when the none of the above condition is true */
}
ตัวอย่าง
#include <stdio.h>
int main () {
/* local variable definition */
int a = 100;
/* check the boolean condition */
if( a == 10 ) {
/* if condition is true then print the following */
printf("Value of a is 10\n" );
} else if( a == 20 ) {
/* if else if condition is true */
printf("Value of a is 20\n" );
} else if( a == 30 ) {
/* if else if condition is true */
printf("Value of a is 30\n" );
} else {
/* if none of the conditions is true */
printf("None of the values is matching\n" );
}
printf("Exact value of a is: %d\n", a );
return 0;
}
เมื่อโค้ดด้านบนถูกคอมไพล์และรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ −
None of the values is matching
Exact value of a is: 100
3. nested if statements
การเขียนโปรแกรม C มักจะถูกที่จะซ้อนคำสั่ง if-else ซึ่งหมายความว่าคุณสามารถใช้คำสั่ง if หรือ else if ในคำสั่งอื่น if หรือ else if ได้
ไวยากรณ์
ไวยากรณ์สำหรับคำสั่งซ้อน if เป็นดังนี้ −
if( boolean_expression 1) {
/* Executes when the boolean expression 1 is true */
if(boolean_expression 2) {
/* Executes when the boolean expression 2 is true */
}
}
คุณสามารถซ้อนคำสั่ง if…else ในลักษณะเดียวกับที่คุณซ้อนคำสั่ง if
ตัวอย่าง
#include <stdio.h>
int main () {
/* local variable definition */
int a = 100;
int b = 200;
/* check the boolean condition */
if( a == 100 ) {
/* if condition is true then check the following */
if( b == 200 ) {
/* if condition is true then print the following */
printf("Value of a is 100 and b is 200\n" );
}
}
printf("Exact value of a is : %d\n", a );
printf("Exact value of b is : %d\n", b );
return 0;
}
เมื่อโค้ดด้านบนถูกคอมไพล์และรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ −
Value of a is 100 and b is 200
Exact value of a is : 100
Exact value of b is : 200
4. switch statement
การควบคุมเงื่อนไขด้วย switch-case (switch-statement)
switch (สวิทช์) คำสั่งอนุญาตให้ตัวแปรที่จะทดสอบเพื่อความเท่าเทียมกันกับรายการของค่า แต่ละค่าเรียกว่า case และตัวแปรที่ถูกเปิดจะถูกตรวจสอบสำหรับ switch caseแต่ละอัน
ไวยากรณ์
ไวยากรณ์สำหรับคำสั่งswitchในภาษาซีมีดังต่อไปนี้ −
switch(expression) {
case constant-expression :
statement(s);
break; /* optional */
case constant-expression :
statement(s);
break; /* optional */
/* you can have any number of case statements */
default : /* Optional */
statement(s);
}
นอกจากประโยคคำสั่ง if-else แล้วในภาษา c ก็ยังมีการควบคุมเงื่อนไขด้วยการใช้ประโยคคำสั่ง switch โดยประโยคคำสั่ง switch เหมาะกับการนำไปประยุกต์ใช้กับโปรแกรมที่มีเมนูให้เลือกรายการต่างๆ
กฎต่อไปนี้ใช้กับคำสั่งswitch −
- แสดงออกมาใช้ในสวิทช์คำสั่งจะต้องมีประเภทหนึ่งหรือแจกแจงหรือเป็นประเภทการเรียนในชั้นที่มีฟังก์ชั่นแปลงเดียวชนิดหนึ่งหรือแจกแจง
- คุณสามารถมีคำสั่งกรณีและปัญหาจำนวนเท่าใดก็ได้ภายในสวิตช์ แต่ละกรณีจะตามด้วยค่าที่จะเปรียบเทียบและทวิภาค
- คงแสดงออกสำหรับกรณีที่จะต้องมีข้อมูลเดียวกันที่พิมพ์เป็นตัวแปรในสวิทช์และมันจะต้องเป็นค่าคงที่หรืออักษร
- เมื่อตัวแปรที่เปิดอยู่มีค่าเท่ากับเคส คำสั่งที่ตามหลังเคสนั้นจะดำเนินการจนกว่าจะถึงคำสั่งbreak
- เมื่อถึงคำสั่งbreakสวิตช์จะสิ้นสุด และโฟลว์ของการควบคุมจะข้ามไปยังบรรทัดถัดไปหลังจากคำสั่ง switch
- ไม่ได้ทุกกรณีจำเป็นต้องมีการแบ่ง หากไม่มีตัวแบ่งโฟลว์ของการควบคุมจะผ่านไปยังกรณีและปัญหาต่อมาจนกว่าจะถึงตัวแบ่ง
- สวิทช์คำสั่งสามารถมีตัวเลือกเริ่มต้นกรณีที่ต้องปรากฏในตอนท้ายของสวิทช์ กรณีเริ่มต้นสามารถใช้สำหรับการทำงานเมื่อไม่มีกรณีและปัญหาใด ๆ ที่เป็นจริง ไม่มีการหยุดพักในกรณีเริ่มต้น
Flow Diagram
ตัวอย่าง
#include <stdio.h>
int main () {
/* local variable definition */
char grade = 'B';
switch(grade) {
case 'A' :
printf("Excellent!\n" );
break;
case 'B' :
case 'C' :
printf("Well done\n" );
break;
case 'D' :
printf("You passed\n" );
break;
case 'F' :
printf("Better try again\n" );
break;
default :
printf("Invalid grade\n" );
}
printf("Your grade is %c\n", grade );
return 0;
}
เมื่อโค้ดด้านบนถูกคอมไพล์และรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ −
Well done
Your grade is B
5. nested switch statements
เป็นไปได้ที่จะมีสวิตช์เป็นส่วนหนึ่งของลำดับคำสั่งของสวิตช์ภายนอก แม้ว่าค่าคงที่ตัวพิมพ์ของสวิตช์ด้านในและด้านนอกจะมีค่าร่วมกัน จะไม่เกิดข้อขัดแย้งใดๆ
ไวยากรณ์
ไวยากรณ์สำหรับคำสั่งสวิตช์ที่ซ้อนกันมีดังนี้ −
switch(ch1) {
case 'A':
printf("This A is part of outer switch" );
switch(ch2) {
case 'A':
printf("This A is part of inner switch" );
break;
case 'B': /* case code */
}
break;
case 'B': /* case code */
}
ตัวอย่าง
#include <stdio.h>
int main () {
/* local variable definition */
int a = 100;
int b = 200;
switch(a) {
case 100:
printf("This is part of outer switch\n", a );
switch(b) {
case 200:
printf("This is part of inner switch\n", a );
}
}
printf("Exact value of a is : %d\n", a );
printf("Exact value of b is : %d\n", b );
return 0;
}
เมื่อโค้ดด้านบนถูกคอมไพล์และรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ −
This is part of outer switch
This is part of inner switch
Exact value of a is : 100
Exact value of b is : 200