Skip to main content

Control Structure

Control Structure คืออะไร

Control Structure คือโครงสร้างที่ใช้ในการควบคุมการทำงานของโปรแกรม โดยใช้สำหรับการทำเงื่อนไขหรือการทำซ้ำเป็นหลัก Control Structure ที่จะพูดถึงได้แก่

  1. Selection (Condition) การสร้างทางเลือกจากเงื่อนไขที่กำหนด ซึ่งจะประกอบด้วย if (ถ้า), else (ถ้าไม่), switch (ถ้าเท่ากับ)

  2. Iteration (Loop) การสร้าง block สำหรับการทำคำสั่งซ้ำตามเงื่อนไขที่กำหนด for (ทำซ้ำตามจำนวนที่กำหนด) และ while (ทำซ้ำขณะที่เงื่อนไขเป็นจริง) และ do-while

Control structure เป็นสำคัญในการเขียนโปรแกรมเพราะช่วยให้โปรแกรมสามารถทำงานตามเงื่อนไขที่เราต้องการได้ โดยการใช้ control structure จะช่วยให้เราสร้างทางเลือกและการทำซ้ำของโค้ดได้อย่างมีประสิทธิภาพ

เราจะมาลองดูตัวอย่างของ Condition และ Loop กัน

Condition (เงื่อนไข)

ในภาษา C++ เราสามารถใช้โครงสร้างทางเลือก (Selection) เพื่อสร้างทางเลือกในการควบคุมการทำงานของโปรแกรมได้ โดยใช้ keyword if, else if, และ else ซึ่งรูปแบบการใช้งานของโครงสร้างเงื่อนไขในภาษา C++ จะมีลักษณะดังนี้

// เคสที่ 1 : ใช้ if อย่างเดียว
if (เงื่อนไข1) {
// ถ้าเงื่อนไข1 เป็นจริง จะทำงานที่นี่
}

// เคสที่ 2 : ใช้ else คู่กับ if
if (เงื่อนไข1) {
// ถ้าเงื่อนไข1 เป็นจริง จะทำงานที่นี่
}
else {
// ถ้าไม่เข้าเงื่อนไขใดเลย จะทำงานที่นี่
}

// เคสที่ 3 : ใช้ if else if
if (เงื่อนไข1) {
// ถ้าเงื่อนไข1 เป็นจริง จะทำงานที่นี่
}
else if (เงื่อนไข2) {
// ถ้าเงื่อนไข2 เป็นจริง จะทำงานที่นี่
}
else {
// ถ้าไม่เข้าเงื่อนไขใดเลย จะทำงานที่นี่
}

โดย เงื่อนไข นั้นคือการใส่ Operator ของ Relational Operators และ Logical Operators เพื่อเป็นการระบุเงื่อนไขร่วมกันออกมาได้

เครื่องหมายเปรียบเทียบ (Relational Operators)

เครื่องหมายเปรียบเทียบใช้ในการเปรียบเทียบค่าของตัวแปรหรือค่าคงที่กัน เพื่อให้ได้ผลลัพธ์เป็นค่าจริง (true) หรือเท็จ (false) โดยเครื่องหมายเปรียบเทียบที่ใช้ได้ในภาษา C++ มีดังนี้

  • == เท่ากับ
  • != ไม่เท่ากับ
  • > มากกว่า
  • < น้อยกว่า
  • >= มากกว่าหรือเท่ากับ
  • <= น้อยกว่าหรือเท่ากับ

มาดู ตัวอย่างแรก กัน นี่คือพื้นฐานของการใช้ Relational Operator ทุกตัวโดยใช้ interger เป็นตัวหลักในการทำ condition ขึ้นมา

int a = 5;
int b = 3;

if (a == b) { // ไม่เป็นจริง (false)
cout << "a เท่ากับ b" << endl;
}
else { // เป็นจริง เนื่องจาก if condition ไม่เป็นจริง
cout << "a ไม่เท่ากับ b" << endl;
}

ผลลัพธ์ก็จะได้เป็นแบบนี้ออกมา

a ไม่เท่ากับ b

ตัวอย่างที่ 2 เราจะทำการสร้างตัวแปร number ขึ้นมา โดยสร้าง condition ไว้ตามนี้

#include <iostream>
using namespace std;

int main() {
int number = 20;

if (number < 0) { // ไม่เป็นจริง (false)
cout << "The number is negative." << endl;
} else if (number >= 0 && number <= 10) { // ไม่เป็นจริง (false)
cout << "The number is between 0 and 10." << endl;
} else if (number > 10 && number <= 20) { // เป็นจริง (true)
// ผลลัพธ์ก็จะหยุดอยู่แค่ตรงนี้
cout << "The number is between 11 and 20." << endl;
} else { // ไม่ทำแล้วเนื่องจาก else if โดยทำงานไปแล้ว
cout << "The number is greater than 20." << endl;
}

return 0;
}

ผลลัพธ์ก็จะได้เป็นแบบนี้ออกมา

The number is between 11 and 20.

ตัวอย่างการใช้งาน Condition กับ Input/Output

ในภาษา C++ เราสามารถใช้โครงสร้างทางเลือก (Selection) เพื่อรับค่า input จากผู้ใช้งานและแสดงผลลัพธ์ output ตามเงื่อนไขที่กำหนดได้ ตัวอย่างเช่น

ตัวอย่างที่ 1 ทำการรับอายุเป็น input ตัวเลขเข้ามาและทำการสร้าง condition ว่า

  • หากอายุน้อยกว่า 18 ปี ให้แสดงคำว่า “คุณยังไม่สามารถเข้าร้านนี้ได้”
  • หากอายุอยู่ระหว่าง 18-60 ให้แสดงคำว่า “คุณสามารถเข้าร้านนี้ได้”
  • หากอายุมากกว่า 60 ปี ให้แสดงคำว่า “คุณเป็นผู้สูงอายุ ไม่สามารถเข้าร้านนี้ได้”
#include <iostream>
using namespace std;

int main() {
int age;
cout << "กรุณากรอกอายุของคุณ: ";
cin >> age;

if (age < 18) {
cout << "คุณยังไม่สามารถเข้าร้านนี้ได้" << endl;
}
else if (age >= 18 && age <= 60) {
cout << "คุณสามารถเข้าร้านนี้ได้" << endl;
}
else {
cout << "คุณเป็นผู้สูงอายุ ไม่สามารถเข้าร้านนี้ได้" << endl;
}

return 0;
}

ในตัวอย่างนี้ ผลลัพธ์ที่ได้จากโปรแกรมจะขึ้นอยู่กับค่าที่ผู้ใช้งานป้อนเข้ามา และโครงสร้างทางเลือก (Selection) จะทำงานเพื่อตรวจสอบเงื่อนไขและแสดงผลลัพธ์ที่เกี่ยวข้องกับเงื่อนไขนั้นๆ

กรุณากรอกอายุของคุณ: 43
คุณสามารถเข้าร้านนี้ได้

ตัวอย่างที่ 2 เป็นตัวอย่าง program สุด classic นั่นคือการตัดเกรดจากคะแนน โดยรับ input เป็นคะแนนเข้ามา และได้ผลลัพธ์เป็นเกรดออกมาได้

#include <iostream>
using namespace std;

int main() {
int score;
cout << "กรุณากรอกคะแนน: ";
cin >> score;

if (score >= 80 && score <= 100) {
cout << "เกรด A" << endl;
} else if (score >= 70 && score < 80) {
cout << "เกรด B" << endl;
} else if (score >= 60 && score < 70) {
cout << "เกรด C" << endl;
} else if (score >= 50 && score < 60) {
cout << "เกรด D" << endl;
} else if (score >= 0 && score < 50) {
cout << "เกรด F" << endl;
} else {
cout << "คะแนนไม่ถูกต้อง" << endl;
}

return 0;
}

ในโปรแกรมนี้ เราใช้โครงสร้างทางเลือก (Selection) เพื่อตรวจสอบคะแนนที่ผู้ใช้ป้อนเข้ามาและแสดงผลลัพธ์ที่เกี่ยวข้องกับคะแนนนั้น โดยใช้ระบบเกรดที่กำหนดดังนี้

  • คะแนน 80-100: เกรด A
  • คะแนน 70-79: เกรด B
  • คะแนน 60-69: เกรด C
  • คะแนน 50-59: เกรด D
  • คะแนน 0-49: เกรด F
  • คะแนนไม่ถูกต้อง: แสดงข้อความ "คะแนนไม่ถูกต้อง"

เมื่อลอง run program ขึ้นมาและลองใส่คะแนนก็จะสามารถเข้าเงื่อนไขตามคะแนนที่ใส่ไปได้ผลลัพธ์เป็นแต่ละเกรดออกมาได้

กรุณากรอกคะแนน: 63
เกรด C

เราใช้โครงสร้างเงื่อนไข (Selection) เพื่อตรวจสอบเงื่อนไขและแสดงผลลัพธ์ที่เกี่ยวข้องกับเงื่อนไขนั้น ผลลัพธ์ที่ได้จะขึ้นอยู่กับคะแนนที่ผู้ใช้ป้อนเข้ามาและเงื่อนไขที่กำหนดใน code

การใช้ Switch case

นอกเหนือจากการใช้ if, else if แล้วใน c++ ยังสามารถทำ condition ผ่านการใช้งาน switch case ได้ด้วยเช่นกัน switch statement คือ ตัวที่ใช้สำหรับการแยกเคสของค่าตระกูล ตัวเลข (interger), ตัวอักษร (character) และ enumaration (เดี๋ยวเรากลับมาอธิบายอีกทีภายหลัง) เป็นอีกทางเลือกนอกเหนือจากการใช้ if-else ในกรณีที่เราเล่นกับหลาย condition แต่อยู่บนพื้นฐานของ “expression เพียงแค่อันเดียว” เราสามารถใช้ switch case ในการรวม case และแยก case ออกตามผลลัพธ์ของ condition ได้

นี่คือโครงสร้างของ switch case

switch (expression) {
case constant1:
// code to be executed if expression == constant1;
break; // optional
case constant2:
// code to be executed if expression == constant2;
break; // optional
// You can have any number of case statements.
default:
// code to be executed if expression doesn't match any case;
}

โดย

  • expression คือสิ่งที่จะทำเพียงครั้งเดียว เป็น expression ที่ใช้สำหรับการเปรียบเทียบเพื่อส่งผลลัพธ์ต่อไปยัง case
  • case constantN: แต่ละ case จะเป็นการใส่ value (ตรงตำแหน่ง consent หลัง case) เพื่อเป็นการเปรียบเทียบค่าใน expression ตัวนั้นออกมาว่าตรงกับ case นั้นหรือไม่ (ให้อารมณ์เหมือน else if แต่ไม่ต้องเขียน condition เพิ่มเนื่องจากใช้ condition คือ expression ที่ประกาศอันบนแล้วเรียบร้อย)
  • break คือ คำสั่งที่ถือว่าเป็น optional (แต่ส่วนใหญ่มักจะใส่กัน และภาษาสมัยใหม่หลายภาษาก็บังคับใส่หรือใส่ให้อัตโนมัติแล้ว) คือ คำสั่งสำหรับการออกจากการทำงานของ switch case เพื่อกันไม่ให้ไปทำคำสั่งต่อไป (case ด้านล่างๆ) เช่น หากเข้า case 1 ไป และ ไม่มี code break อยู่ ตัว program ก็จะลงไปทำ case 2 ต่อจนจบ program ไป (แทนที่จะเช็คแค่ case 1 แล้วจบลง)
  • default คือ คำสั่งที่ถือว่าเป็น optional เหมือนกัน ใช้ในกรณีที่เราอยาก handle case อื่นๆเพิ่มเติม (ที่ไม่ตกลงใน case ใดๆใน switch case เลย) เมื่อไม่มีการลง case ไหนใน switch case เลยมันก็จะลงมายังตำแหน่ง default ออกมาแทน (ให้อารมณ์เหมือน else ที่เปิดจบใน if และ if else)

และนี่คือตัวอย่างการใช้ switch case กับ Program สำหรับการแยกออกมาว่า วันนี้คือวันอะไรในสัปดาห์นี้โดย

  • ทำการใส่ day เป็นตัวแทนของวันที่ในสัปดาห์มา
  • และทำการ print ผ่าน cout ออกมาว่า วันที่ในสัปดาห์นี้ คือ วันที่ชื่อว่าอะไร ออกมา (เช่น 1 = Monday, 2 = Tuesday เป็นต้น)
#include <iostream>
using namespace std;

int main() {
int day = 4;
switch (day) {
case 1:
cout << "Monday";
break;
case 2:
cout << "Tuesday";
break;
case 3:
cout << "Wednesday";
break;
case 4:
cout << "Thursday";
break;
case 5:
cout << "Friday";
break;
case 6:
cout << "Saturday";
break;
case 7:
cout << "Sunday";
break;
default:
cout << "Invalid day";
}
return 0;
}

และนี่คือผลลัพธ์ของ code นี้

Thursday

จากตัวอย่างนี้ เรามีตัวแปร day ที่เก็บเลข 4 เอาไว้ และได้รับ output ออกมาเป็น Thursday ออกมา โดย switch นั้นจะทำการ check ค่าที่อยู่ในตัวแปร day มาเทียบกันในแต่ละ case ว่าตรงกับ case ไหนบ้าง และก็มาเจอว่า ตรงกับ case 4 ออกมาได้ (day == 4) ดังนั้น เมื่อตกลงที่ case 4: code ก็จะดำเนินการภายใน case นั้น (print Thursday ออกมา) และทำการ break เพื่อจบการทำงาน switch case ลงนั่นเอง

Loop (การทำซ้ำ)

Loop (การทำซ้ำ) คือโครงสร้างที่ใช้ในการทำงานซ้ำๆ จนกว่าเงื่อนไขที่กำหนดจะเป็นเท็จ โดยหลักการทำงานของ Loop คือทำซ้ำเบื้องต้นก่อนที่จะตรวจสอบเงื่อนไข หากเงื่อนไขเป็นจริงจะทำงานภายใน Loop จนกว่าเงื่อนไขจะเป็นเท็จ แล้วจึงทำงานต่อไป

โครงสร้าง Loop ที่พูดถึงได้แก่

  1. for Loop คือโครงสร้างที่ใช้ในการทำซ้ำตามจำนวนที่กำหนด
  2. while Loop คือโครงสร้างที่ใช้ในการทำซ้ำขณะที่เงื่อนไขเป็นจริง
  3. do-while Loop คือโครงสร้างที่ใช้ในการทำซ้ำขณะที่เงื่อนไขเป็นจริง แต่จะทำงานอย่างน้อย 1 ครั้ง

Control structure ที่เกี่ยวกับ Loop เป็นสิ่งสำคัญในการเขียนโปรแกรมเพราะช่วยให้เราสามารถทำซ้ำการทำงานของโปรแกรมได้ตามที่เราต้องการ โดยการใช้ Loop จะช่วยให้เราสามารถทำงานซ้ำได้อย่างมีประสิทธิภาพ

เราจะมาลองดูตัวอย่างของ Loop กัน

for Loop

ในภาษา C++ เราสามารถใช้โครงสร้าง for Loop ในการทำซ้ำตามจำนวนที่กำหนดได้ โดยรูปแบบการใช้งานของ for Loop จะมีลักษณะดังนี้

for (เงื่อนไขเริ่มต้น; เงื่อนไขที่ต้องการให้ทำซ้ำ; การเปลี่ยนแปลงค่าตัวแปร) {
// ทำงานที่ต้องการซ้ำ
}

ตัวอย่างการใช้งาน:

for (int i = 0; i < 5; i++) {
cout << "ค่าของ i: " << i << endl;
}

ในตัวอย่างนี้ เราใช้ for Loop เพื่อทำซ้ำการแสดงค่าของตัวแปร i ตั้งแต่ 0 ถึง 4 โดยทำงานภายในบล็อกที่กำหนด ในแต่ละรอบของการทำซ้ำ code ภายในบล็อกจะถูกทำงานและค่าของ i จะเปลี่ยนแปลงตามที่กำหนดในการเปลี่ยนแปลงค่าตัวแปร

while Loop

ในภาษา C++ เราสามารถใช้โครงสร้าง while Loop ในการทำซ้ำขณะที่เงื่อนไขเป็นจริงได้ โดยรูปแบบการใช้งานของ while Loop จะมีลักษณะดังนี้

while (เงื่อนไขที่ต้องการให้ทำซ้ำ) {
// ทำงานที่ต้องการซ้ำ
}

ตัวอย่างการใช้งาน:

int i = 0;

while (i < 5) {
cout << "ค่าของ i: " << i << endl;
i++;
}

ในตัวอย่างนี้ เราใช้ while Loop เพื่อทำซ้ำการแสดงค่าของตัวแปร i ตั้งแต่ 0 ถึง 4 โดยทำงานภายในบล็อกที่กำหนด โค้ดภายในบล็อกจะถูกทำงานและตรวจสอบเงื่อนไขที่กำหนดว่ายังเป็นจริงหรือไม่ ถ้าเงื่อนไขยังเป็นจริง โค้ดในบล็อกจะถูกทำซ้ำและค่าของ i จะเปลี่ยนแปลงตามที่กำหนดในการเปลี่ยนแปลงค่าตัวแปร

do-while Loop

ในภาษา C++ เราสามารถใช้โครงสร้าง do-while Loop ในการทำซ้ำขณะที่เงื่อนไขเป็นจริง แต่จะทำงานอย่างน้อย 1 ครั้ง โดยรูปแบบการใช้งานของ do-while Loop จะมีลักษณะดังนี้

do {
// ทำงานที่ต้องการซ้ำ
} while (เงื่อนไขที่ต้องการให้ทำซ้ำ);

ตัวอย่างการใช้งาน:

int i = 0;

do {
cout << "ค่าของ i: " << i << endl;
i++;
} while (i < 5);

ในตัวอย่างนี้ เราใช้ do-while Loop เพื่อทำซ้ำการแสดงค่าของตัวแปร i ตั้งแต่ 0 ถึง 4 โดยทำงานภายในบล็อกที่กำหนด โค้ดภายในบล็อกจะถูกทำงานและตรวจสอบเงื่อนไขที่กำหนดว่ายังเป็นจริงหรือไม่ โค้ดในบล็อกจะถูกทำซ้ำอย่างน้อย 1 ครั้งและค่าของ i จะเปลี่ยนแปลงตามที่กำหนดในการเปลี่ยนแปลงค่าตัวแปร

Loop ในการทำงานกับ Array

Loop เป็นเครื่องมือที่มีประสิทธิภาพในการทำงานกับ Array โดยเราสามารถใช้ Loop เพื่อเข้าถึงและประมวลผลข้อมูลที่อยู่ใน Array ได้อย่างรวดเร็วและง่ายดาย

ตัวอย่างการใช้งาน Loop ในการทำงานกับ Array:

#include <iostream>
using namespace std;

int main() {
int numbers[] = {1, 2, 3, 4, 5};

// ใช้ for loop เพื่อแสดงค่าใน array
for (int i = 0; i < 5; i++) {
cout << "ค่าของ numbers[" << i << "]: " << numbers[i] << endl;
}

return 0;
}

ในตัวอย่างนี้ เรามี Array ชื่อ numbers ที่เก็บตัวเลข 1, 2, 3, 4, 5 จากนั้นเราใช้ for Loop เพื่อแสดงค่าใน Array โดยเข้าถึงแต่ละค่าของ Array ด้วยตัวดัชนี (index) และแสดงผลลัพธ์ออกทางหน้าจอ

Loop ในการทำงานกับ String

Loop เป็นเครื่องมือที่สามารถใช้งานกับ String ได้อย่างมีประสิทธิภาพ โดยสามารถทำซ้ำการประมวลผลตัวอักษรแต่ละตัวใน String ได้อย่างสะดวกและง่ายดาย

ตัวอย่างการใช้งาน Loop ในการทำงานกับ String:

#include <iostream>
#include <string>
using namespace std;

int main() {
string message = "Hello, World!";

// ใช้ for loop เพื่อแสดงตัวอักษรใน string
for (int i = 0; i < message.length(); i++) {
cout << "ตัวอักษรที่ " << i << ": " << message[i] << endl;
}

return 0;
}

ในตัวอย่างนี้ เรามีตัวแปร String ชื่อ message ที่มีค่า "Hello, World!" จากนั้นเราใช้ for Loop เพื่อแสดงตัวอักษรแต่ละตัวใน String โดยเข้าถึงแต่ละตัวอักษรใน String ด้วยตัวดัชนี (index) และแสดงผลลัพธ์ออกทางหน้าจอ

มาลองดูโจทย์กับ Control Structure ดูบ้าง

ตัวอย่างที่ 1 หาจำนวนเฉพาะ

จำนวนเฉพาะคือตัวเลขที่มีเพียงสองตัวประกอบเท่านั้น คือ 1 และตัวเลขตัวเอง หรือกล่าวอีกอย่างว่าไม่สามารถหารด้วยตัวเลขอื่นๆ ได้โดยไม่เหลือเศษ เช่น 2, 3, 5, 7, 11, 13, และอื่นๆ

#include <iostream>
using namespace std;

int main() {
int n, i, j;
bool isPrime;

cout << "Enter a positive integer: ";
cin >> n;

for (i = 2; i <= n; i++) {
// Assume the current number is prime
isPrime = true;

// Check if i is prime
for (j = 2; j * j <= i; j++) {
if (i % j == 0) {
isPrime = false;
break; // Not a prime number
}
}

// If isPrime is true, then i is a prime number
if (isPrime) {
cout << i << " ";
}
}

return 0;
}

code ด้านบนเป็นตัวอย่างการหาจำนวนเฉพาะในช่วงตั้งแต่ 2 ถึงตัวเลขที่ผู้ใช้ป้อนเข้ามา (n) โดย

  • ใช้โครงสร้างควบคุม for Loop ซ้อนกัน ใน for Loop ชั้นนอก จะเป็นการวนลูปตั้งแต่ 2 ถึง n เพื่อตรวจสอบว่าเลขใดเป็นจำนวนเฉพาะ
  • ใช้ตัวแปร isPrime เพื่อเก็บสถานะของเลขนั้นๆ ว่าเป็นจำนวนเฉพาะหรือไม่
  • ใน for Loop ชั้นใน จะเป็นการใช้ Loop เพื่อตรวจสอบว่าเลขใดเป็นตัวหารของเลขนั้นๆ โดยเริ่มต้นที่ 2 และสิ้นสุดที่รากที่สองของเลขนั้นๆ
  • ถ้าพบตัวหารที่ทำให้เหลือเศษ จะกำหนดให้ isPrime เป็นเท็จและหยุดการวน Loop
  • หาก isPrime เป็นจริงแสดงว่าเลขนั้นเป็นจำนวนเฉพาะ จึงแสดงค่าเลขนั้นออกทางหน้าจอ

ตัวอย่างที่ 2 หาตัวเลข factorial

ตัวเลข factorial คือผลคูณของตัวเลขทั้งหมดตั้งแต่ 1 ถึงตัวเลขนั้นเอง เช่น ตัวเลข factorial ของ 5 (เขียนเป็น 5!) คือ 1 x 2 x 3 x 4 x 5 = 120

#include <iostream>
using namespace std;

int main() {
int n;
long long factorial = 1; // Using long long for handling larger values

cout << "Enter a non-negative integer: ";
cin >> n;

if (n < 0) {
cout << "Factorial is not defined for negative numbers." << endl;
} else {
for (int i = 1; i <= n; ++i) {
factorial *= i; // Multiplying with each number up to n
}
cout << "Factorial of " << n << " = " << factorial << endl;
}

return 0;
}

code ด้านบนเป็น code ที่ใช้ในการหาค่า factorial ของตัวเลขที่ผู้ใช้ป้อนเข้ามา (n) โดยมีขั้นตอนการทำงานดังนี้:

  1. รับค่าตัวเลขจากผู้ใช้เข้ามาผ่านทาง keyboard (input ข้อมูลตัวเลขเข้ามา)
  2. ตรวจสอบว่าตัวเลขที่ผู้ใช้ป้อนมาเป็นค่าลบหรือไม่ หากเป็นค่าลบจะแสดงข้อความว่า "Factorial is not defined for negative numbers."
  3. หากตัวเลขเป็นค่าจำนวนเต็มบวก จะใช้ for เพื่อคำนวณค่า factorial โดยเริ่มจาก 1 ถึงตัวเลขที่ผู้ใช้ป้อนเข้ามา โดยใช้ตัวแปร factorial เพิ่มค่าทีละตัวเลข
  4. แสดงผลลัพธ์ค่า factorial ออกทางหน้าจอ

ตัวอย่างเช่น หากผู้ใช้ป้อนตัวเลข 5 โปรแกรมจะคำนวณและแสดงผลลัพธ์ว่า "Factorial of 5 = 120"