การเขียนโปรแกรมภาษา 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
และมีค่าเริ่มต้นเป็น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