วันพุธที่ 21 พฤศจิกายน พ.ศ. 2555

คําสั่งเงื่อนไข if, if-else และ nested if




        คําสั่งควบคุม คือ คําสั่งที่ใช้ควบคุมทิศทางการทํางานของโปรแกรมให้เป็นไปตามที่ต้องการ 
มี 2 ประเภท คือ

1. คําสั่งเงื่อนไข (Condition Statement)
   -if, if-else
   -switch-case

2. คําสั่งทําซ้ํา (Iteration Statement)
   -while
   -do-while
    - for



          ด้วยการปรับแต่งโค้ดไม่มากนัก เราสามารถใช้ if, if-else, และ switch-case ทดแทนกันได้ อย่างไรก็ตามของแต่ละอย่างก็มีที่ใช้งานที่เหมาะสมที่สุดแตกต่างกันไป


การใช้ if

#include <stdio.h>
void main() {
int x;
scanf("%d", &x);
if (x > 0)
printf("positive");
}

• if ต้องตามด้วยวงเล็บ และภายในวงเล็บต้องมีเงื่อนไขระบุว่าจะทําสิ่งที่ตามมาหรือไม่
• ถ้าเงื่อนไขเป็นจริง โปรแกรมจะทําคําสั่งที่ตามมาทันที
• สิ่งที่แตกต่างไปจากซูโดโค้ดก็คือเราต้องประกาศตัวแปรและให้ความสําคัญกับชนิดข้อมูลของตัวแปรนั้น
• ถ้ามีการอ่านข้อมูลเข้า และ/หรือ การแสดงข้อความจะต้องมีการใช้  #include <stdio.h>




ตัวอย่าง เงื่อนไขที่ซับซ้อนขึ้น
จงเขียนโปรแกรมภาษาซี ที่รับตัวเลขสองจํานวนจากผู้ใช้  โปรแกรมนี้จะพิมพ์คําว่า positive เมื่อตัวเลขทั้งสองจํานวนเป็นบวก และจะไม่พิมพ์อะไรเลยหากมีตัวเลขที่ไม่ได้เป็นบวกอยู่ด้วย

วิเคราะห์ ในกรณีนี้เราต้องพิจารณาเงื่อนไขจากค่าสองค่าพร้อมกัน วิธีที่นิยมใช้กันมากก็คือ ‘ให้แยกออกเป็นสองเงื่อนไขย่อย แล้วนํามารวมกันด้วยวิธีทางตรรกศาสตร์’ สําหรับข้อนี้หากเราตั้งชื่อทั้งสองค่าว่า x และ y เราจะได้เงื่อนไขย่อยเป็น (1) x > 0 กับ (2) y > 0 เนื่องจากเงื่อนไขทั้งสองต้องเป็นจริงพร้อมกัน การนําเงื่อนไขย่อยนี้มารวมกันจึงใช้ ‘และ’ ซึ่งก็คือเครื่องหมาย ^ ในตรรกศาสตร์ และ เครื่องหมาย && ในภาษาซี



การใช้เครื่องหมาย && เพื่อรวมเงื่อนไขใน if

#include <stdio.h>
void main() {
int x, y;
scanf("%d %d", &x, &y);
if(x > 0 && y > 0)       ใช้เครื่องหมาย && ภายในวงเล็บเงื่อนไขของ if
printf("positive");
}


ตัวอย่าง เงื่อนไขที่ซับซ้อนขึ้น
จงเขียนโปรแกรมภาษาซี ที่รับตัวเลขสองจํานวนจากผู้ใช้ โปรแกรมนี้จะพิมพ์คําว่า positive หนึ่งครั้ง เมื่อมีตัวเลขอย่างน้อยหนึ่งตัวเป็นบวก และจะไม่พิมพ์อะไรเลยหากมีตัวเลขที่ไม่ได้เป็นบวกอยู่ด้วย

วิเคราะห์ ตอนนี้เงื่อนไขเปลี่ยนเป็น ‘มีอย่างน้อยหนึ่งตัว’ แสดงว่ามีตัวหนึ่งที่เป็นบวกก็เพียงพอแล้ว และจะเป็น x หรือ y ก็ได้ หรือตัวเลขทั้งสองจะเป็นบวกด้วยกันทั้งคู่ก็ได้ปัญหานี้ ต้องการหาว่าเงื่อนไขย่อยอย่างน้อยหนึ่งตัว เป็นจริงหรือไม่ จะตรงกับการรวมเงื่อนไขด้วยคําว่า ‘หรือ’ ซึ่งใช้เครื่องหมาย v ในตรรกศาสตร์และใช้เครื่องหมาย || ในภาษาซี

การใช้เครื่องหมาย || เพื่อรวมเงื่อนไขใน if

#include <stdio.h>
void main() {
int x, y;
scanf("%d %d", &x, &y);
if(x > 0 || y > 0)   ใช้เครื่องหมาย || ภายในวงเล็บเงื่อนไขของ if
printf("positive");
}




สิ่งที่มือใหม่มักทําผิด
เวลาที่บอกว่า ‘ถ้าเงื่อนไขเป็นจริงอย่างน้อยหนึ่งอย่าง’ มือใหม่จะคิดผิดแล้วแยกเงื่อนไขออกจากกัน แล้วใช้ if สองครั้ง ถ้าจับเงื่อนไขแยกกัน การทํางานจะผิดไปจากเดิม

int x, y;
scanf("%d  %d", &x, &y);
if(x > 0)
    printf("positive");
if(y > 0)
    printf("positive");


ย้อนดูปัญหาง่าย ๆ แต่ต่างกันเล็กน้อย
ตัวอย่างโจทย์ 
จงเขียนโปรแกรมภาษาซี ที่พิมพ์คําว่า positive เมื่อผู้ใช้ใส่ค่าตัวเลขที่เป็นบวก และไม่ว่าผู้ใช้จะใส่เลขใดเข้ามา ก่อนจบโปรแกรมให้พิมพ์คําว่า good bye

วิเคราะห์ เห็นได้ว่างานที่ต้องทํามีสองแบบ แบบแรกคือแบบเลือกทํา และแบบที่สองก็คือยังไงก็ต้องทําแน่ ๆ  มีเทคนิคในการคิดง่าย ๆ แต่ได้ผลก็คือ
• งานที่เลือกทําจะเกี่ยวข้องกับ if คือ ทําเมื่อเงื่อนไขที่กําหนดให้เป็นจริง
• งานที่ต้องทําแน่ ๆ จะอยู่นอก if คือ ต้องทําอย่างไม่มีเงื่อนไข
จากโจทย์ เห็นได้ว่า การพิมพ์คําว่า positive เกิดขึ้นเมื่อเงื่อนไขเป็นจริง
ส่วนการพิมพ์คําว่า good bye เป็นสิ่งที่ต้องทําโดยไม่มีเงื่อนไข

ตอบ

#include <stdio.h>
void main() {
int x;
scanf("%d", &x);
if (x > 0)
printf("positive\n");
printf("good bye");
}
คําสั่งนี้ตามหลัง if มาทันทีจึงอยู่ใต้เงื่อนไขของ ifคําสั่งนี้อยู่ภายนอก if โปรแกรมจะทําคําสั่งนี้อย่าง
ไม่มีเงื่อนไข ถ้าเทียบกับโฟลวชาร์ต มันก็คือคําสั่งที่มาหลังการบรรจบกันของทางแยกทั้งสองนั่นเอง




สรุปเรื่องเกี่ยวกับ if แบบพื้น ๆ
• คําสั่งที่ตาม if มาทันทีจะอยู่ภายใต้เงื่อนไขที่กําหนดไว้ในวงเล็บ ( ) ถ้าเงื่อนไขในวงเล็บเป็นจริง โปรแกรมจะทําคําสั่งที่ตาม if มา ถ้าเงื่อนไขไม่เป็นจริง คําสั่งที่ตามมานั้นจะถูกข้ามไป

• คําสั่งที่ตาม if มาทันทีจะอยู่ภายใต้เงื่อนไขที่กําหนดไว้ในวงเล็บ ( ) ถ้าเงื่อนไขในวงเล็บเป็นจริง โปรแกรมจะทําคําสั่งที่ตาม if มา ถ้าเงื่อนไขไม่เป็นจริง คําสั่งที่ตามมานั้นจะถูกข้ามไป
• ถ้ามีคําสั่งที่สองตามมา คําสั่งนั้นถือว่าเป็นคําสั่งทั่วไป โปรแกรมจะทําคําสั่งที่สองนี้อย่างไม่มีเงื่อนไข
ในภาษาซี ย่อหน้าไม่ได้บอกว่ามันอยู่ภายใต้ if หรือเปล่า สิ่งที่ตามมาทันทีถือว่าอยู่ภายใต้ if

ถ้าเราอยากให้ if ทําคําสั่งมากกว่าหนึ่งคําสั่งล่ะ
ตัวอย่างที่ผ่านมาก่อนหน้าทั้งหมด เราบอกว่า ‘ถ้าเงื่อนไขเป็นจริง ให้พิมพ์คําว่า positive’ แล้วก็เลิกรากันไป แต่ถ้าเราบอกว่า “หากเลขทั้งสองที่ผู้ใช้ใส่เข้ามาเป็นบวกทั้งคู่  ให้โปรแกรม (1) พิมพ์คําว่า positive, (2) หาผลบวก และ (3) พิมพ์ผลบวกของเลข”   ถ้าเป็นแบบนี้จะทํายังไง ?
     กรณีนี้มีสิ่งที่ต้องการให้ทําภายใต้เงื่อนไขที่เป็นจริงมากกว่าหนึ่งอย่าง ควรรวมคําสั่งพวกนั้นไว้เป็นโค้ดบล็อกเดียวกัน  เรารวมโค้ดหลาย ๆ คําสั่งเป็นบล็อกเดียวได้ด้วยการเอาโค้ดไปใส่ไว้ใน
วงเล็บปีกกา จากนั้นเอาวงเล็บปีกกาที่บรรจุโค้ดไว้แล้ว วางต่อจาก if ทันที แบบนี้จะถือว่า ทุกอย่างในวงเล็บปีกกานั้นอยู่ภายใต้ if


ตัวอย่างการให้ if ทําคําสั่งมากกว่าหนึ่งคําสั่ง
ตัวอย่างโจทย์ 
จงเขียนโปรแกรมภาษาซีที่รับค่าจํานวนเต็มจากผู้ใช้มาสองจํานวน หากจํานวนทั้งสองเป็นบวกทั้งคู่ โปรแกรมจะพิมพ์คําว่า positive จากนั้นจะทําการบวกเลขทั้งสองนั้น แล้วพิมพ์ผลบวกออกมา  แต่หากตัว
เลขที่ใส่เข้ามามีจํานวนที่ไม่ได้เป็นบวกอยู่ด้วย โปรแกรมจะจบการทํางานโดยไม่พิมพ์อะไรออกมา

วิเคราะห์ 
สิ่งที่ต้องทําเมื่อเงื่อนไขใน if เป็นจริงมีอยู่มากกว่าหนึ่งอย่าง เมื่อคําสั่งที่อยู่ภายใต้เงื่อนไข if มีมากกว่าหนึ่ง เราต้องรวบคําสั่งพวกนี้เป็นก้อนเดียวด้วยการนําไปใส่ไว้ในวงเล็บปีกกา

ตอบ

#include <stdio.h>
void main() {
int  x,  y;
scanf("%d %d", &x, &y);
if (x > 0 && y > 0) {
printf("positive");
int sum = x + y;
printf("%d", sum);
}
}



แล้วถ้ามีคําสั่งเดียวจะเอาไปใส่ใน { } ได้หรือเปล่า??
ตอบ ได้ และเป็นสิ่งที่ควรทําเสมอ แม้แต่ผมก็ทําอย่างนั้นเวลาทํางานจริง ภาษาซีไม่บังคับว่าถ้ามีคําสั่งเดียวจะต้องใส่ไว้ในวงเล็บปีกกา แต่เพื่อป้องกันความผิดพลาด อันเกิดจากการใส่คําสั่งที่สองตามมาแล้วลืมวงเล็บปีกกา ผู้มีประสบการณ์จํานวนมากจึงเลือกที่จะใส่วงเล็บปีกกาไว้ตั้งแต่แรก
int x;
scanf("%d", &x);
if(x > 0) {
    printf("positive\n");
}
printf("good bye");




สรุปเรื่องเกี่ยวกับ if แบบยากขึ้นมาหน่อย
• คําสั่งที่ตาม if มาทันทีจะอยู่ภายใต้เงื่อนไขที่กําหนดไว้ในวงเล็บ ( ) ถ้าเงื่อนไขในวงเล็บเป็นจริง โปรแกรมจะทําคําสั่งที่ตาม if มา ถ้าเงื่อนไขไม่เป็นจริง คําสั่งที่ตามมานั้นจะถูกข้ามไป
• สิ่งที่ตามมาทันทีนั้น จะเป็นคําสั่งโดดหรือเป็นบล็อกวงเล็บปีกกาก็ได้
• เงื่อนไขของ if อาจจะเป็นเงื่อนไขย่อยสองอันที่เชื่อมกันด้วยตัวดําเนินการทางตรรกะอย่าง && หรือ || ก็ได้
• เงื่อนไขของ if จะมีการใช้เครื่องหมายนิเสธก็ได้ จะผสมการทํางานทางตรรกะเข้าไปหลาย ๆ อย่างก็ได้
• ถ้าเงื่อนไขเป็นอิสระจากกัน การแยกออกมาคิดจะทําให้อ่านเข้าใจง่ายกว่า แต่ธรรมชาติของการคิดแต่ละคนไม่เหมือนกัน เลือกวิธีที่เรามั่นใจ



คําสั่งเงื่อนไข if-else
• คําสั่ง if แบบโดดเป็นการเลือกทําหรือทําไม่ทํา
• ส่วน if-else เป็นการเลือกทําอย่างใดอย่างหนึ่งจากทางเลือกสองทาง
• คําสั่งที่จะเลือกทําจึงแบ่งออกเป็นสองกลุ่ม  โปรแกรมเลือกทํากลุ่มแรกเมื่อเงื่อนไขของ if เป็นจริง และทํากลุ่มที่สองเมื่อเงื่อนไขของ if เป็นเท็จ



หลักการทั่วไปของ if-else
• สิ่งที่ตาม if มาทันที จะถูกทํางานถ้าเงื่อนไขใน if เป็นจริง
• สิ่งที่ตาม else มาทันที จะถูกทํางานถ้าเงื่อนไขใน if เป็นเท็จ
• เช่นเดียวกับ if สิ่งที่ตามมาทันทีต้องเป็นคําสั่งโดด หรือไม่ก็วงเล็บปีกก
• เมื่อจบสิ่งที่ตาม if มาทันที ก็ถือว่าของอื่น ๆ อยู่นอก if ถึงจุดนี้ถ้าจะมี else ก็ให้ใส่ตามไปเลย อย่าเอาคําสั่งอะไรไปคั่นเป็นอันขาด



การซ้อนเงื่อนไขมีสองแบบ
1. การใช้ if – else if ต่อเนื่องกันไป
2. การใช้ if ภายใต้ if อีกตัวหนึ่ง
เรื่องการซ้อนเงื่อนไขเป็นแนวคิดที่มือใหม่มักหลงคิดว่าตัวเองเข้าใจ แต่พอให้ทําแบบฝึกหัดหรือข้อสอบจะทําไม่ได้กัน เพราะไม่สามารถจัดลําดับความคิดที่จัดการกับเงื่อนไขได้อย่างถูกต้อง ทําให้มีที่ผิดมากมายตามมาเรื่องนี้เป็นหนึ่งในเหตุผลสําคัญที่คนไม่ผ่านวิชานี้  (แต่เหตุผลที่สําคัญที่สุดก็คือนักศึกษาขี้เกียจ เข้าใจผิดว่าตัวเองรู้เรื่อง คิดว่าตัวเองเข้าใจ ฝันว่าจะทําข้อสอบหรือแก้ปัญหาได้ แต่ความฝันนั้นไม่ได้เป็นความจริงเลย)



การใช้ if – else if ต่อเนื่องกันไป
ลักษณะทั่วไป


if (เงื่อนไขที่ 1) {

} else if (เงื่อนไขที่ 2) {

} else if (เงื่อนไขที่ 3) {

} else {

}


วิธีนี้โปรแกรมจะเลือกทํางานที่อยู่ภายใต้เงื่อนไขที่เป็นจริงอันแรก และไม่สนใจงานที่เหลือที่ตามมาแม้ว่าเงื่อนไขที่ตามมาจะเป็นจริงก็ตาม



else ที่ห้อยท้าย if – else if ไว้เป็นอย่างไร
• การใช้ else เปล่า ๆ โดยไม่มีเงื่อนไขกํากับ หมายความว่า ถ้าเงื่อนไขที่มาก่อนหน้าใน if หรือ else if ไม่มีตัวไหนที่เป็นจริงเลย ให้ทําชุดคําสั่งที่ตาม else มาทันที
• เปรียบเทียบ if – else กับ if – else if – … – else
คําสั่งภายใต้ else ใน if – else นั้นจะทํางานเมื่อเงื่อนไขใน if ไม่เป็นจริง
คําสั่งภายใต้ else ใน if – else if – … – else จะทํางานถ้าหากไม่มี
เงื่อนไขใด ๆ เลยทั้งใน if และ else if ที่เป็นจริง





การซ้อน if ไว้ภายใน if
• if – else if แบบที่ผ่านมาจะมีการพิจารณาเงื่อนไขต่อ ๆ กันไป
– เงื่อนไขที่ตามมาจะถูกพิจารณาเมื่อเงื่อนไขก่อนหน้าเป็นเท็จ
• แล้วถ้าเราอยากให้พิจรณาเงื่อนไขที่ตามมา เมื่อเงื่อนไขก่อนหน้าเป็นจริงล่ะ
ต้องซ้อน if อีกตัวพร้อมเงื่อนไขไว้ข้างใน if เหมือนเป็นคําสั่งที่ให้ทํา
เมื่อเงื่อนไขของ if ตัวแรกเป็นจริง


if (เงื่อนไขที 1) {
if (เงื่อนไขที 2) {
if (เงื่อนไขที 3) {

}
}
}

ไม่มีความคิดเห็น:

แสดงความคิดเห็น