การเขียนโปรแกรมภาษา 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 ส่วน แบ่งโดยใช้สัญลักษณ์ ; ได้แก่
- ส่วนแรกเป็นประโยคคำสั่งที่จะทำก่อนเริ่มต้นการทำซ้ำ (Initialization)
- ส่วนที่สองเป็นเงื่อนไข (Loop Condition) ที่ต้องตรวจสอบก่อนว่าเป็นจริง
จึงจะทำคำสั่งภายในบล็อกของโค้ด
{...}แต่ถ้าเงื่อนไขเป็นเท็จ จะจบการทำงานของประโยคคำสั่งfor - ส่วนที่สามเป็นประโยคคำสั่งที่จะทำหลังจากทำคำสั่งในบล็อกของโค้ดหนึ่งรอบแล้ว และย้อนกลับไปทำขั้นตอนที่ 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และมีค่าเริ่มต้นเป็น1i <= nเป็นนิพจน์เงื่อนไขสำหรับการวนลูป ถ้าเงื่อนไขนี้เป็นจริง ให้ทำคำสั่งภายในบล็อกของโค้ดสำหรับคำสั่งfori++เป็นคำสั่งที่จะต้องทำเมื่อจบการทำงานแต่ละรอบของ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