Loops คําสั่งวนซ้ำ ภาษา C
คุณอาจพบสถานการณ์เมื่อจำเป็นต้องดำเนินการบล็อกของโค้ดหลายครั้ง โดยทั่วไป คำสั่งจะถูกดำเนินการตามลำดับ: คำสั่งแรกในฟังก์ชันจะถูกดำเนินการก่อน ตามด้วยคำสั่งที่สอง และอื่นๆ
คำสั่งวนลูป หรือ คําสั่งวนซ้ำ เป็นคำสั่งที่ใช้ควบคุมการทำงานของโปรแกรมแบบวนซ้ำ การทำงานเดิมๆตามเงื่อนไขที่ดำหนด เช่น การวนซ้ำการทำงานเดิมเป็นจำนวนหลายๆรอบ ทำงานซ้ำๆจนกว่าเงื่อนไขจะเป็นเท็จ (false)
คำสั่งวนรอบช่วยให้เราสามารถดำเนินการคำสั่งหรือกลุ่มของคำสั่งได้หลายครั้ง ด้านล่างนี้คือรูปแบบทั่วไปของคำสั่งวนซ้ำในภาษาการเขียนโปรแกรมส่วนใหญ่ −
การเขียนโปรแกรม ภาษา C จัดเตรียมลูปประเภทต่อไปนี้เพื่อจัดการกับข้อกำหนดการวนซ้ำ
1. while loop
คำสั่ง while loop ใช้ในการเขียนโปรแกรม C ซ้ำ ๆ รันคำสั่งเป้าหมายตราบเท่าที่ เป็นความจริง
ไวยากรณ์
ไวยากรณ์ของ while loop ในภาษาซีคือ −
while(condition) {
statement(s);
}
ในที่นี้ชุดคำสั่ง (statement) อาจเป็นข้อความเดี่ยวหรือกลุ่มข้อความก็ได้ เงื่อนไข (condition) อาจจะแสดงออกใด ๆ และที่แท้จริงคือค่า nonzero ใด ๆ วนซ้ำในขณะที่เงื่อนไขเป็นจริง (true)
เมื่อเงื่อนไขกลายเป็นเท็จ (false) ตัวควบคุมโปรแกรมจะส่งผ่านไปยังบรรทัดต่อจากลูปทันที
Flow Diagram
ประเด็นสำคัญที่ควรทราบก็คือการวนรอบในขณะที่อาจไม่ทำงานเลย เมื่อเงื่อนไขถูกทดสอบและผลลัพธ์เป็นเท็จ เนื้อหาของลูปจะถูกข้ามและคำสั่งแรกหลังจากลูป while จะถูกดำเนินการ
ตัวอย่าง
#include <stdio.h>
int main () {
/* local variable definition */
int a = 10;
/* while loop execution */
while( a < 20 ) {
printf("value of a: %d\n", a);
a++;
}
return 0;
}
เมื่อโค้ดด้านบนถูกคอมไพล์และรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ −
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19
2. for loop
for loop เป็นโครงสร้างควบคุมการทำซ้ำที่ช่วยให้คุณเขียนลูปที่ต้องการดำเนินการตามจำนวนครั้งที่เจาะจงได้อย่างมีประสิทธิภาพ
ไวยากรณ์
ไวยากรณ์ของ for loop ในโปรแกรมภาษา C เป็น –
for ( init; condition; increment ) {
statement(s);
}
นี่คือการไหลของการควบคุมในวง ‘ for loop ‘ −
- init (คือการประกาศตัวแปรพร้อมกับใส่ค่าให้ตัวแปรในทันทีในบรรทัดเดียวกัน) ขั้นตอนจะถูกดำเนินการครั้งแรกและเพียงครั้งเดียว ขั้นตอนนี้ช่วยให้คุณประกาศและเริ่มต้นตัวแปรควบคุมลูปได้ คุณไม่จำเป็นต้องใส่คำสั่งที่นี่ ตราบใดที่เครื่องหมาย ; ปรากฏขึ้น
- ถัดไปเงื่อนไข (condition) จะถูกประเมิน หากเป็นจริง เนื้อหาของลูปจะถูกดำเนินการ หากเป็นเท็จ เนื้อหาของลูปจะไม่ทำงาน และโฟลว์ของการควบคุมจะข้ามไปยังคำสั่งถัดไปหลังจากลูป ‘for’
- หลังจากที่เนื้อความของลูป ‘for’ ทำงาน โฟลว์ของการควบคุมจะข้ามกลับไปที่คำสั่ง ตัวดำเนินการเพิ่มและลดค่า (increment) คำสั่งนี้อนุญาตให้คุณอัปเดตตัวแปรควบคุมลูป คำสั่งนี้สามารถเว้นว่างได้ ตราบใดที่มีเครื่องหมาย ; ปรากฏขึ้นหลังเงื่อนไข
- ขณะนี้มีการประเมินเงื่อนไขอีกครั้ง หากเป็นจริง ลูปจะดำเนินการและกระบวนการจะทำซ้ำเอง (เนื้อหาของลูป จากนั้นเพิ่มขั้นตอน แล้วจึงสร้างเงื่อนไขอีกครั้ง) หลังจากที่เงื่อนไขกลายเป็นเท็จ วนรอบ ‘for’ จะสิ้นสุดลง
Flow Diagram
ตัวอย่าง
#include <stdio.h>
int main () {
int a;
/* for loop execution */
for( a = 10; a < 20; a = a + 1 ){
printf("value of a: %d\n", a);
}
return 0;
}
เมื่อโค้ดด้านบนถูกคอมไพล์และรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ −
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19
3. do…while loop
ไม่เหมือนกับ forและ while loops ซึ่งทดสอบเงื่อนไขลูปที่ด้านบนของลูป แต่ do…while loop ในการเขียนโปรแกรม C จะตรวจสอบเงื่อนไขที่ด้านล่างของลูป
สิ่งที่แตกต่างของ do…while loop คือการตรวจสอบ condition หลังจากการทำงานรอบแรกเสร็จสิ้น นั่นหมายความว่า do…while loop จะต้องทำงานอย่างน้อย 1 รอบ สังเกตุว่า เงื่อนไข (condition) จะอยู่ที่ตอน้ทายของลูป
ไวยากรณ์
ไวยากรณ์ของ do…while ในภาษาซีคือ −
do {
statement(s);
} while( condition );
ขอให้สังเกตว่านิพจน์เงื่อนไขปรากฏขึ้นที่ส่วนท้ายของลูป ดังนั้นคำสั่งในลูปจะทำงานหนึ่งครั้งก่อนที่จะทดสอบเงื่อนไข
หากเงื่อนไขเป็นจริง โฟลว์ของการควบคุมจะกระโดดกลับไปทำ และคำสั่งในลูปจะดำเนินการอีกครั้ง กระบวนการนี้ทำซ้ำจนกว่าเงื่อนไขที่กำหนดจะกลายเป็นเท็จ
Flow Diagram
ตัวอย่าง
#include <stdio.h>
int main () {
/* local variable definition */
int a = 10;
/* do loop execution */
do {
printf("value of a: %d\n", a);
a = a + 1;
}while( a < 20 );
return 0;
}
เมื่อโค้ดด้านบนถูกคอมไพล์และรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ −
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19
4. nested loops
ลูปซ้อนใน C การเขียนโปรแกรม C อนุญาตให้ใช้หนึ่งลูปภายในอีกวงหนึ่ง ส่วนต่อไปนี้แสดงตัวอย่างบางส่วนเพื่อแสดงแนวคิด
ไวยากรณ์
ไวยากรณ์สำหรับคำสั่ง nested for loop ใน C มีดังต่อไปนี้ −
for ( init; condition; increment ) {
for ( init; condition; increment ) {
statement(s);
}
statement(s);
}
ไวยากรณ์สำหรับคำสั่ง nested while loop ในภาษาซีมีดังต่อไปนี้ −
while(condition) {
while(condition) {
statement(s);
}
statement(s);
}
ไวยากรณ์สำหรับคำสั่ง nested do…while loop ในภาษาการเขียนโปรแกรม C มีดังต่อไปนี้ −
do {
statement(s);
do {
statement(s);
}while( condition );
}while( condition );
หมายเหตุสุดท้ายเกี่ยวกับการซ้อนลูปคือคุณสามารถใส่ลูปประเภทใดก็ได้ภายในลูปประเภทอื่น ตัวอย่างเช่น ลูป ‘for’ สามารถอยู่ภายในลูป ‘while’ หรือในทางกลับกัน
ตัวอย่าง
โปรแกรมต่อไปนี้ใช้การวนซ้ำซ้อนเพื่อค้นหาจำนวนเฉพาะตั้งแต่ 2 ถึง 100 −
#include <stdio.h>
int main () {
/* local variable definition */
int i, j;
for(i = 2; i<100; i++) {
for(j = 2; j <= (i/j); j++)
if(!(i%j)) break; // if factor found, not prime
if(j > (i/j)) printf("%d is prime\n", i);
}
return 0;
}
เมื่อโค้ดด้านบนถูกคอมไพล์และรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ −
2 is prime
3 is prime
5 is prime
7 is prime
11 is prime
13 is prime
17 is prime
19 is prime
23 is prime
29 is prime
31 is prime
37 is prime
41 is prime
43 is prime
47 is prime
53 is prime
59 is prime
61 is prime
67 is prime
71 is prime
73 is prime
79 is prime
83 is prime
89 is prime
97 is prime
Loop Control Statements
คำสั่งควบคุมลูปเปลี่ยนการดำเนินการจากลำดับปกติ เมื่อการดำเนินการออกจากขอบเขต ออบเจ็กต์อัตโนมัติทั้งหมดที่สร้างขึ้นในขอบเขตนั้นจะถูกทำลาย
C รองรับคำสั่งควบคุมต่อไปนี้
1. คำสั่ง break
break คำสั่งในการเขียนโปรแกรม C มีสองต่อไปนี้ –
- เมื่อพบคำสั่ง break ภายในลูป การวนซ้ำจะสิ้นสุดลงทันที และการควบคุมโปรแกรมจะกลับมาทำงานต่อในคำสั่งถัดไปหลังจาก วนซ้ำ
- สามารถใช้เพื่อยุติกรณีและปัญหาในคำสั่ง switch (ครอบคลุมในบทต่อไป)
หากคุณกำลังใช้การวนซ้ำซ้อนกัน คำสั่ง break จะหยุดการทำงานของวงในสุดและเริ่มรันโค้ดบรรทัดถัดไปหลังจากบล็อก
ไวยากรณ์
ไวยากรณ์สำหรับคำสั่ง break ใน C มีดังต่อไปนี้ −
break;
Flow Diagram
ตัวอย่าง
#include <stdio.h>
int main () {
/* local variable definition */
int a = 10;
/* while loop execution */
while( a < 20 ) {
printf("value of a: %d\n", a);
a++;
if( a > 15) {
/* terminate the loop using break statement */
break;
}
}
return 0;
}
เมื่อโค้ดด้านบนถูกคอมไพล์และรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ −
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
2. คำสั่ง continue
continue คำสั่งในการเขียนโปรแกรม C ทำงานคล้าย break คำสั่ง แทนที่จะบังคับให้ยุติ มันบังคับให้วนซ้ำรอบถัดไปเกิดขึ้น โดยข้ามโค้ดใดๆ ที่อยู่ระหว่างนั้น
สำหรับ for loop , คำสั่ง continue เป็นสาเหตุที่ทำให้การทดสอบและการเพิ่มเงื่อนไขบางส่วนของวงที่จะดำเนินการ สำหรับ while และ do…while loops คำสั่ง continue ที่ทำให้เกิดการควบคุมโปรแกรมที่จะส่งผ่านไปยังการทดสอบเงื่อนไข
ไวยากรณ์
ไวยากรณ์สำหรับคำสั่ง continue ใน C มีดังต่อไปนี้ −
continue;
Flow Diagram
ตัวอย่าง
#include <stdio.h>
int main () {
/* local variable definition */
int a = 10;
/* do loop execution */
do {
if( a == 15) {
/* skip the iteration */
a = a + 1;
continue;
}
printf("value of a: %d\n", a);
a++;
} while( a < 20 );
return 0;
}
เมื่อโค้ดด้านบนถูกคอมไพล์และรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ −
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 16
value of a: 17
value of a: 18
value of a: 19
3. คำสั่ง goto
goto คำสั่งในการเขียนโปรแกรม C ให้กระโดดไม่มีเงื่อนไขจาก ‘ไปที่’ จะเป็นคำสั่งที่มีข้อความในฟังก์ชั่นเดียวกัน
หมายเหตุ – ห้ามใช้คำสั่ง goto อย่างเด็ดขาดในภาษาการเขียนโปรแกรมใดๆ เนื่องจากจะทำให้การติดตามโฟลว์การควบคุมของโปรแกรมทำได้ยาก ทำให้โปรแกรมเข้าใจยากและปรับเปลี่ยนได้ยาก โปรแกรมใด ๆ ที่ใช้ goto สามารถเขียนใหม่เพื่อหลีกเลี่ยงได้
ไวยากรณ์
ไวยากรณ์สำหรับคำสั่งgotoใน C มีดังต่อไปนี้ −
goto label;
..
.
label: statement;
ที่ label อาจเป็นข้อความธรรมดาใด ๆ ยกเว้นคำหลัก C และมันสามารถเป็นชุดใดก็ได้ในโปรแกรม C ด้านบนหรือด้านล่างเพื่อคำสั่ง goto
Flow Diagram
ตัวอย่าง
#include <stdio.h>
int main () {
/* local variable definition */
int a = 10;
/* do loop execution */
LOOP:do {
if( a == 15) {
/* skip the iteration */
a = a + 1;
goto LOOP;
}
printf("value of a: %d\n", a);
a++;
}while( a < 20 );
return 0;
}
เมื่อโค้ดด้านบนถูกคอมไพล์และรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ −
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 16
value of a: 17
value of a: 18
value of a: 19
Infinite Loop
การวนซ้ำจะกลายเป็นการวนซ้ำแบบอนันต์หากเงื่อนไขไม่เป็นเท็จ for loop ที่ใช้เพื่อการนี้ เนื่องจากไม่จำเป็นต้องใช้นิพจน์สามนิพจน์ที่สร้างลูป ‘for’ คุณจึงสร้างลูปไม่สิ้นสุดได้โดยปล่อยให้นิพจน์เงื่อนไขว่างไว้
#include <stdio.h>
int main () {
for( ; ; ) {
printf("This loop will run forever.\n");
}
return 0;
}
เมื่อไม่มีนิพจน์เงื่อนไข จะถือว่าเป็นจริง คุณอาจมีการเริ่มต้นและนิพจน์ที่เพิ่มขึ้น แต่โปรแกรมเมอร์ C มักใช้โครงสร้าง for(;;) เพื่อแสดงถึงการวนซ้ำที่ไม่สิ้นสุด
หมายเหตุ – คุณสามารถยุติการวนซ้ำอนันต์โดยกดแป้น Ctrl + C