การเขียนโปรแกรมภาษา C (ตอนที่ 3)#

 

หัวข้อสำหรับการเรียนรู้#

  • ประโยคคำสั่งตามเงื่อนไขแบบ if-else
  • ประโยคคำสั่งตามเงื่อนไขแบบ switch
  • การใช้ตัวดำเนินการเลือกค่าตามเงื่อนไข
  • ประโยคคำสั่งสำหรับการทำซ้ำแบบ for
  • ประโยคคำสั่งสำหรับการทำซ้ำแบบ while

ประโยคคำสั่งตามเงื่อนไขแบบ if-else#

หากต้องการกำหนดเงื่อนไขในการทำคำสั่งหรือกลุ่มของคำสั่ง โดยแบ่งเป็นสองกรณี เช่น ถ้านิพจน์ที่ใช้เป็นเงื่อนไข (condition) มีค่าเป็นจริง (1) ให้ทำคำสั่งหนึ่ง แต่ถ้ามีค่าเป็นเท็จ (0) ให้ทำอีกคำสั่งหนึ่ง ก็สามารถใช้ประโยคคำสั่งแบบ if หรือ if-else และนิพจน์ที่ใช้เป็นเงื่อนไขจะต้องอยู่ระหว่างวงเล็บหนึ่งคู่แล้วตามด้วยประโยคคำสั่ง หรือ บล็อกของโค้ด { ... }

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

if (condition) { // if the condition is true.
   // statement(s) 
}
if (!condition) { // if the condition is false.
   // statement(s) 
}

หรือจะเขียนใหม่ได้ดังนี้ โดยใช้ประโยคคำสั่ง if-else เป็นประโยคคำสั่งเดียวกัน

if (condition) { // if the condition is true.
   // statement(s) 
} 
else { // otherwise
   // statement(s) 
}

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

if (condition_1) { // if condition_1 is true.
   // statement(s) for condition 1
} 
else if (condition_2) { // if condition_2 is true.
   // statement(s) for condition 2
} 
...
else if (condition_N) { // if condition_N is true.
   // statement(s) for condition N
} 
else { // otherwise
   // statement(s)
}

 


โค้ดตัวอย่าง สาธิตการใช้ประโยคคำสั่งแบบมีเงื่อนไข เริ่มต้นการทำงานด้วยการรับค่าอินพุตจากผู้ใช้ผ่านทางช่องทางที่เรียกว่า Standard Input และใช้คำสั่ง scanf() เพื่อรับค่าอินพุตที่เป็นจำนวนเต็มแบบ int มาเก็บไว้ในตัวแปร number แล้วนำมาตรวจสอบดูว่า มีค่าเป็นศูนย์ บวก หรือ ลบ

#include <stdio.h>

int main( ) {
  int number;
  printf( "Enter an integer number: " );
  scanf( "%d", &number );
  printf( "The input number is %d.\n", number );
  if ( number == 0 ) {
    printf( "The input number is zero.\n" );
  }
  else if ( number > 0 ) {
    printf( "The input number is positive.\n" );
  }
  else {
    printf( "The input number is negative.\n" );
  }
  return 0;
}

 


ประโยคคำสั่งตามเงื่อนไขแบบ switch#

ถ้ามีเงื่อนไขที่ให้ค่าเป็นเลขจำนวนเต็ม เช่น char หรือ int และแบ่งออกได้เป็นหลายกรณี (Cases) และแต่ละกรณีจะต้องมีค่าไม่ซ้ำกัน ก็แนะนำให้ใช้ประโยคคำสั่ง switch

switch(value) {
  case value_1: // case 1
     // statement(s)
     break;
  case value_2: // case 2
     // statement(s)
     break;
  ...
  case value_N: // case N
     // statement(s)
     break;
  default: // other cases
     // statement(s)
}

value_1 ... value_N หมายถึง ข้อมูลค่าคงที่ซึ่งเป็นเลขจำนวนเต็ม สำหรับแต่ละกรณี ให้สังเกตว่า มีการใช้ประโยคคำสั่ง break สำหรับกรณีย่อย ซึ่งเป็นการจบการทำงานในแต่ละกรณี เมื่อเข้าเงื่อนไขใด จะทำคำสั่งที่เกี่ยวข้องไปจนถึงคำสั่ง break หรือสิ้นสุดประโยคคำสั่ง switch


โค้ดตัวอย่าง สาธิตการใช้ประโยคคำสั่งจำแนกกรณีด้วยเงื่อนไขแบบ switch

โปรแกรมเริ่มต้นด้วยการรับค่าเป็นตัวอักขระในภาษาอังกฤษจากผู้ใช้ผ่านทาง Standard Input โดยใช้ฟังก์ชัน scanf() ในการรับค่ามาให้ตัวแปร letter จากนั้นแปลงให้เป็นตัวพิมพ์เล็ก (Lower Case) ด้วยการเรียกใช้คำสั่ง tolower() ที่มีการประกาศไว้ในไฟล์ <ctypes.h>

ในประโยคคำสั่ง switch มีการแบ่งกรณีโดยจำแนกว่า ตัวอักขระนั้นเป็นสระภาษาอังกฤษ (Vowels) หรือเป็นพยัญชนะ (Consonants)

#include <stdio.h>
#include <ctype.h>  // defines tolower()

int main( ) {
  char letter;
  printf( "Please enter a letter [a-z]: " );
  scanf( "%c", &letter );
  letter = tolower( letter );
  switch (letter) {
    case 'a':
    case 'e':
    case 'i':
    case 'o':
    case 'u':
       printf( "'%c' is a vowel.\n", letter );
       break;
    default:
       printf( "'%c' is a consonant.\n", letter );
  }
  return 0;
}

ในโค้ดตัวอย่างนี้ จะเห็นได้ว่า ถ้าค่าของตัวแปร letter ตรงกับกรณีใดใน {a, e, i, o, u} จะทำประโยคคำสั่ง printf() เหมือนกัน ซึ่งอยู่ในเงื่อนไข u (เพราะไม่มีการใส่คำสั่ง break ในกรณีก่อนหน้า)

หากจะเขียนโค้ด โดยใช้ประโยค if-else แทนการใช้ประโยค switch ก็มีตัวอย่างดังนี้

#include <stdio.h>
#include <ctype.h>  // defines tolower()

int main( ) {
  char letter;
  printf( "Please enter a letter [a-z]: " );
  scanf( "%c", &letter );
  letter = tolower( letter );
  if ( letter == 'a' || letter == 'e' ||
       letter == 'i' || letter == 'o' || letter == 'u' ) {
    printf( "'%c' is a vowel.\n", letter );
  } else {
    printf( "'%c' is a consonant.\n", letter );
  }
  return 0;
}

 


การใช้ตัวดำเนินการเลือกค่าตามเงื่อนไข (Conditional Ternary Operator)#

หากต้องการกำหนดค่าให้ตัวแปรตามเงื่อนไขที่กำหนดจากตัวเลือกสองกรณี ก็อาจเขียนโค้ดโดยใช้ประโยคคำสั่ง if-else หรือจะใช้ตัวดำเนินการ (condition) ? (expr1) : (expr2) ตามตัวอย่างต่อไปนี้

if (x >= 0) { // x is postive or zero.
  y = x;
} else { // x is negative.
  y = -x;
}

หรือเขียนโค้ดใหม่ได้สั้นลงในหนึ่งบรรทัดดังนี้

y = (x >= 0) ? x : -x;

ตัวแปร y จะได้ค่าที่เป็นบวกของตัวแปร x หรือ ค่าสัมบูรณ์ (Absolute Value)

 


ประโยคคำสั่งเพื่อทำซ้ำแบบ for#

ประโยคคำสั่ง for ใช้สำหรับการทำคำสั่งหรือกลุ่มคำสั่งในบล็อกของโค้ดที่มีการทำซ้ำ (Looping) ตามเงื่อนไขที่กำหนด โดยทั่วไปแล้ว จะเป็นการทำซ้ำหรือการวนลูปที่มีการนับจำนวนรอบในการทำ

รูปแบบของประโยคคำสั่ง for มีดังนี้ เริ่มต้นด้วยคำว่า for ตามด้วย ( ... ) และ { ... } ตามลำดับ ภายในวงเล็บแบ่งได้เป็น 3 ส่วน แบ่งโดยใช้สัญลักษณ์ ; ได้แก่

  1. ส่วนแรกเป็นประโยคคำสั่งที่จะทำก่อนเริ่มต้นการทำซ้ำ (Initialization)
  2. ส่วนที่สองเป็นเงื่อนไข (Loop Condition) ที่ต้องตรวจสอบก่อนว่าเป็นจริง จึงจะทำคำสั่งภายในบล็อกของโค้ด { ... } แต่ถ้าเงื่อนไขเป็นเท็จ จะจบการทำงานของประโยคคำสั่ง for
  3. ส่วนที่สามเป็นประโยคคำสั่งที่จะทำหลังจากทำคำสั่งในบล็อกของโค้ดหนึ่งรอบแล้ว และย้อนกลับไปทำขั้นตอนที่ 2 อีกครั้ง
for ( initialization; condition ; statement-after-loop-block ) {
  // statement(s)
}

โค้ดตัวอย่าง: การใช้คำสั่ง for เพื่อแสดงค่าตัวเลขจาก 1 ถึง n และหาผลรวม

#include <stdio.h>

int main( ) {
  int n = 10;
  int sum = 0;
  for ( int i=1; i <= n; i++ ) { // count up from 1 to n
    printf( "i = %d\n", i );
    sum = sum + i;
  }
  printf( "sum: 1 + ... + %d = %d\n", n, sum );
  return 0;
}

จากโค้ดตัวอย่าง จะเห็นได้ว่า

  • int i=1 เป็นคำสั่งที่ทำในส่วนแรกสำหรับการเริ่มต้นของประโยคคำสั่ง for ซึ่งเป็นการประกาศใช้ตัวแปร i ที่มีชนิดข้อมูล int และมีค่าเริ่มต้นเป็น 1
  • i <= n เป็นนิพจน์เงื่อนไขสำหรับการวนลูป ถ้าเงื่อนไขนี้เป็นจริง ให้ทำคำสั่งภายในบล็อกของโค้ดสำหรับคำสั่ง for
  • i++ เป็นคำสั่งที่จะต้องทำเมื่อจบการทำงานแต่ละรอบของ for ซึ่งในกรณีคือ การเพิ่มค่าของตัวแปร i ครั้งละหนึ่ง
  • sum เป็นตัวแปร int ที่ใช้เก็บค่าผลรวมของค่าตัวเลขจากตัวแปร i (Partial Sum) ในแต่ละรอบของลูป และมีค่าเริ่มต้นเป็น 0

ตัวแปร i มีค่าเริ่มต้นเท่ากับ 1 มองเห็นได้เฉพาะประโยคคำสั่ง for และมีค่าเพิ่มขึ้นทีละหนึ่งในแต่ละรอบการทำซ้ำ ถ้า i <= n ยังเป็นจริงอยู่ ก็ให้ทำซ้ำ เมื่อจบการทำงานของ for ตัวแปร i จะไม่สามารถมองเห็นและใช้งานได้

ข้อความเอาต์พุตของโปรแกรม

i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10
sum: 1 + ... + 10 = 55

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

#include <stdio.h>

int main( ) {
  int n = 10;
  int sum = 0;
  for ( int i=n; i >= 1; i-- ) { // count down from n to 1
    printf( "i = %d\n", i );
    sum = sum + i;
  }
  printf( "sum: %d + ... + 1 = %d\n", n, sum );
  return 0;
}

ข้อความเอาต์พุตจากโปรแกรม

i = 10
i = 9
i = 8
i = 7
i = 6
i = 5
i = 4
i = 3
i = 2
i = 1
sum: 10 + ... + 1 = 55

 

ในภาษาซี มีประโยคคำสั่งที่เกี่ยวข้องกับการทำงานของ for ได้แก่ break และ continue

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

จากโค้ดตัวอย่างที่แล้ว ถ้าจะลองใช้คำสั่ง break และสาธิตการทำงาน ก็เขียนโค้ดได้ใหม่ดังนี้

#include <stdio.h>

int main( ) {
  int n = 10;
  int sum = 0;
  for ( int i=1; ; i++ ) {
    printf( "i = %d\n", i );
    sum = sum + i;
    if ( i >= n )
      break;
  }
  printf( "sum: 1 + ... + %d = %d\n", n, sum );
  return 0;
}

จากโค้ดตัวอย่าง จะเห็นได้ว่า ไม่มีการระบุเงื่อนไขสำหรับ for ดังนั้นจึงมองว่าเป็น 1 เสมอ ดังนั้นจะทำซ้ำไปเรื่อย แต่ว่าภายในบล็อกของโค้ดสำหรับคำสั่ง for มีประโยคคำสั่ง if เพื่อตรวจสอบเงื่อนไข i >= n และถ้าเป็นจริง ซึ่งจะเกิดขึ้นเมื่อค่าของตัวแปร i มีค่าเพิ่มขึ้นจนเท่ากับ n ก็จะทำคำสั่ง break และจบการทำงานของ for

 

ประโยค for สามารถนำมาใช้แบบซ้อนกันได้ (Nested For Loops) ดังตัวอย่างต่อไปนี้

#include <stdio.h>

int main( ) {
  int n=5; // number of lines
  for ( int i=0; i < n; i++ ) { // outer loop
    for ( int j=0; j < n; j++ ) { // inner loop
       printf( "*" );
       if ( j >= i ) {
          break; // exit the inner for loop
       }
    }
    printf("\n"); // newline
  }
  return 0;
}

ในตัวอย่างนี้ มีการใช้คำสั่ง break ภายในเงื่อนไข j >= i และจะหยุดการทำงานของ for ที่อยู่ชั้นใน (Inner Loop) เท่านั้น เมื่อเงื่อนไขเป็นจริง แต่ไม่มีผลต่อการทำงานของ for ที่อยู่ชั้นนอก (Outer Loop)

ข้อความเอาต์พุตของโปรแกรม

*
**
***
****
*****

แต่สำหรับโค้ดตัวอย่างนี้ หากไม่ต้องการใช้คำสั่ง break ก็เขียนโค้ดได้ใหม่ดังนี้ และได้ผลลัพธ์เหมือนกัน

#include <stdio.h>

int main( ) {
  int n=5; // number of lines
  for ( int i=0; i < n; i++ ) { // outer loop
    for ( int j=0; j <= i; j++ ) { // inner loop
       printf( "*" );
    }
    printf("\n"); // newline
  }
  return 0;
}

 


ประโยคคำสั่งเพื่อทำซ้ำแบบ while#

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

while (condition) {
  // statements
}

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

do {
  // statements
} while (condition)

 


อ่านเนื้อหา: "การเขียนโปรแกรมภาษา C" (ตอนที่ 1) | (ตอนที่ 2)


This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

Created: 2022-09-04 | Last Updated: 2022-11-13