[TH] Arduino : condition

บทความนี้อธิบายรูปแบบของการใช้ชุดคำสั่งสำหรับการตรวจสอบเงื่อนไขเพื่อสร้างทางเลือกในการเขียนโปรแกรม ทั้งนี้การเขียนโปรแกรมภาษา C++ ใช้เครื่องหมาย { และ } เป็นเครื่องหมายบ่งบอกบล็อกของการทำงานแต่ละบล็อก นั่นหมายความว่า ชุดคำสั่งในแต่ละบล็อกมีขั้นตอนการทำงานเรียงจากบนลงล่างเสมอ โดยกระทำทีละ 1 และสามารถเลือกทำคำสั่งด้วยการสร้างเงื่อนไข นอกจากนี้สามารถให้ทำซ้ำในส่วนของคำสั่งที่ต้องการได้ด้วยการทำซ้ำซึ่งจะกล่าวถึงในบทความตอนถัดไป

ถ้าเป็นแบบนี้ให้ทำสิ่งนี้

เงื่อนไขแบบที่ 1 เป็นการตรวจสอบเงื่อนไขกรณีที่ถ้าสิ่งที่ต้องการตรวจสอบเป็นจริง ให้กระทำสิ่งใด เช่น ถ้าอิ่มแล้วให้แสดงอิ๊มอิ่ม สามารถเขียนได้ดังนี้

ตัวแปรอิ่มแล้ว = true
ถ้า ตัวแปรอิ่มแล้ว == true
    แสดง("อิ๊มอิ่ม")

ในกรณีนี้รูปแบบ C++ คือ

if ( เงื่อนไข )
สิ่งที่ทำเมื่อเงื่อนไขเป็นจริง

หรือกรณีที่มีคำสั่งหลายคำสั่งที่ต้องทำเมื่อเงื่อนไขเป็นจริง

if ( เงื่อนไข ) {
สิ่งที่ทำเมื่อเงื่อนไขเป็นจริง
}

bool bFull = true;

void setup() {
  Serial.begin(115200);
  if (bFull) 
    Serial.println("...อิ๊มอิ่ม...");
}

void loop() {
}

เงื่อนไขในกรณีที่ถ้าจริงฉันจะทำอย่างหนึ่งถ้าไม่จริงฉันจะทำอีกอย่างหนึ่ง เช่น ถ้าฉันอิ่มฉันจะร้องโวยวาย แต่ถ้าฉันไม่อิ่มฉันจะกินต่อไป เขียนได้ดังนี้

ตัวแปรอิ่มแล้ว = true
ถ้า ตัวแปรอิ่มแล้ว == true
    แสดง("ฉันจะร้องโวยวาย")
อื่น ๆ
    แสดง("ฉันกินต่อก่อนนะ")

ในรูปแบบของ C++ คือ

if ( เงื่อนไข )
สิ่งที่ทำเมื่อเป็นจริง
else
สิ่งที่ทำเมื่อเงื่อนไขเป็นเท็จ

bool bFull = true;

void setup() {
  Serial.begin(115200);
  if (bFull) 
    Serial.println("ฉันจะโวยวาย");
  else
    Serial.println("ฉันกินต่อก่อนนะ");
}

void loop() {
}

ถ้ากรณีที่มีคำสั่งที่ต้องทำมีมากกว่า 1 คำสั่งต้องใช้ { และ } กำหนดบล็อกของการทำงาน

ถ้าเป็นจริงให้ทำสิ่งนี้ไม่จริงแต่เป็นแบบนี้ให้ทำสิ่งนั้น

กรณีที่มีเงื่อนไขดังนี้ ถ้าคะแนนมากกว่า 80 ให้แสดงว่า ดีมากเลย ถ้ามากกว่า 60 แสดงว่า พอได้ ๆ ถ้ามากกว่า 30 แสดงว่า พอไหว แต่ถ้าไม่ใช่เลยให้แสดงว่า พอเถอะ จะเขียนอย่างไร

มาดูตัวอย่างแรก

คะแนน = 80
ถ้า คะแนน > 80
    แสดง("ดีมากเลย")
ถ้า คะแนน > 60
    แสดง("พอได้ ๆ")
ถ้า คะแนน > 30
    แสดง("พอไหว")
อื่น ๆ
    แสดง("พอเถอะ")

ลองแปลงเป็น C++

int score = 80;

void setup() {
  Serial.begin(115200);
  Serial.println("\n\n");
  if (score > 80)
    Serial.println("..ดีมากเลย..");
  if (score > 60)
    Serial.println("..พอได้ ๆ..");
  if (score > 30)
    Serial.println("...พอไหว...");
  else
    Serial.println("พอเถอะ");
}

void loop() {
}

ผลลัพธ์เป็นดังนี้

จากผลลัพธ์จะพบว่าแสดง 2 กรณี คือ มากกว่า 60 และมากกว่า 30 แต่ความต้องการจริง คือ ให้แสดงกรณีของ พอได้ ๆ ดังนั้นต้องเปลี่ยนรูปแบบของการเขียนเป็นดังนี้

if (เงื่อนไข1)
สิ่งที่ทำกรณีเงื่อนไข1เป็นจริง
else if (เงื่อนไข2)
สิ่งที่ทำกรณีที่เงื่อนไข 2 เป็นจริง และกรณี 1 เป็นเท็จ
else if (เงื่อนไข3)
สิ่งที่ทำกรณีที่เงื่อนไข3 เป็นจริงและเงื่อนไข2 เป็นเท็จ

else if (เงื่อนไขn)
สิ่งที่ทำเมื่อเงื่อนไขn เป็นจริงและเงื่อนไขก่อนหน้านี้เป็นเท็จ

กรณีที่มีการทำเมื่อไม่มีเงื่อนไขใดเป็นจริงให้ใช้ตามรูปแบบต่อไปนี้

if (เงื่อนไข1)
สิ่งที่ทำกรณีเงื่อนไข1เป็นจริง
else if (เงื่อนไข2)
สิ่งที่ทำกรณีที่เงื่อนไข 2 เป็นจริง และกรณี 1 เป็นเท็จ
else if (เงื่อนไข3)
สิ่งที่ทำกรณีที่เงื่อนไข3 เป็นจริงและเงื่อนไข2 เป็นเท็จ

else if (เงื่อนไขn)
สิ่งที่ทำเมื่อเงื่อนไขn เป็นจริงและเงื่อนไขก่อนหน้านี้เป็นเท็จ
else
สิ่งที่ทำเมื่อไม่มีกรณีใดเป็นจริง

ดังนั้น โค้ดที่ควรจะเป็นจะต้องเขียนดังนี้

int score = 80;

void setup() {
  Serial.begin(115200);
  Serial.println("\n\n");
  if (score > 80)
    Serial.println("..ดีมากเลย..");
  else if (score > 60)
    Serial.println("..พอได้ ๆ..");
  else if (score > 30)
    Serial.println("...พอไหว...");
  else
    Serial.println("พอเถอะ");
}

void loop() {
}

นอกจากนี้ยังมีการใช้ if ที่ซ้อนเข้าไปใน if หรือเรียกว่า nest-if ซึ่งขอละเอาไว้ เมื่อใดมีตัวอย่างจะอธิบายอีกครั้ง เนื่องจากรูปแบบไม่แตกต่างกัน เพียงกรณีที่เป็นจริงมีการตรวจสอบเงื่อนไขซ้อนด้านใน

สรุป

จากรูปแบบของการเขียนโปรแกรมแบบกระทำตามเงื่อนไขด้วยคำสั่ง if สามารถเขียนในรูปแบบย่อได้คือ

(เงื่อนไข)?(กรณีที่เป็นจริง):(กรณีที่เป็นเท็จ)

นอกจากนี้ยังมีคำสั่ง switch ที่เป็น if อีกรูปแบบหนึ่ง แต่สามารถเขียนด้วย if แทนได้ ผู้เขียนจึงข้ามรูปแบบนี้ไปก่อน สุดท้ายขอให้สนุกกับการเขียนโปรแกรมครับ

(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุง 2021-05-30, 2021-09-23