|
|
|
|
|
|
|
|
|
|
คำสั่ง for เป็นคำสั่งควบคุมแบบวนซ้ำรูปแบบหนึ่ง |
|
แผนผังคำสั่งควบคุมแบบวนซ้ำ - คำสั่ง for |
|
|
|
มีรูปแบบการใช้คำสั่ง ดังนี้ |
|
|
อธิบาย |
|
กำหนดค่าเริ่มต้นของตัวนับ เป็นคำสั่งย่อยในคำสั่ง for ใช้สำหรับกำหนดค่าเริ่มต้น ให้กับตัวแปรที่ทำหน้าที่ควบคุมการวนซ้ำ และจะประมวลผลเพียงครั้งเดียว หากมีตัวนับหลายตัว ให้คั่นคำสั่งย่อยกำหนดค่าเริ่มต้นของตัวนับ ด้วยเครื่องหมาย , (comma) |
|
เงื่อนไขการวนซ้ำ หมายถึง นิพจน์ที่สามารถประเมินค่าได้ ให้ค่าเป็นจริงหรือเท็จ |
|
เมื่อเริ่มต้นประมวลผล คำสั่ง for เงื่อนไขการวนซ้ำ จะถูกตรวจสอบค่า หากมีค่าเป็นจริง คำสั่งภายใต้คำสั่ง for จะถูกประมวลผล 1 รอบ แล้วจะ เพิ่มหรือลดค่าตัวนับ ตามด้วยวนกลับไปตรวจสอบ เงื่อนไขการวนซ้ำอีก จนกระทั่งเงื่อนไขการวนซ้ำ มีค่าเป็นเท็จ คำสั่ง for จึงสิ้นสุดลง และไปทำคำสั่งถัดไป |
|
เพิ่มหรือลดค่าตัวนับ เป็นคำสั่งย่อยในคำสั่ง for ใช้สำหรับเพิ่มค่าตัวนับ หรือลดค่าตัวนับ โดยใช้คำสั่งคำนวณทางคณิตศาสตร์ หากมีตัวนับหลายตัว ให้คั่นคำสั่งย่อยเพิ่มหรือลดค่าตัวนับ ด้วยเครื่องหมาย , (comma) |
|
หากการตรวจสอบเงื่อนไขการวนซ้ำในครั้งแรก และมีค่าเป็นเท็จ คำสั่งภายใต้คำสั่ง for จะไม่ได้รับการประมวลผลเลย |
|
คำสั่งภายใต้คำสั่ง for อาจเป็นคำสั่งง่าย ๆ หรือ คำสั่งเชิงประกอบ หากมีมากกว่า 1 คำสั่ง ต้องเขียนคำสั่งภายใต้เครื่องหมาย {} |
|
สรุปขั้นตอนการทำงานของคำสั่ง for |
|
|
|
|
|
|
|
ตัวอย่างที่ 9 |
จงเขียนโปรแกรมแสดงเลขจาก 1 ถึง 10 ทางจอภาพ ( ex6-09.c ) |
|
|
จากโจทย์ เขียนผังงาน แสดงการแก้ปัญหา ได้ดังนี้ |
|
|
|
|
|
จากผังงาน เขียนโปรแกรมได้ดังนี้ |
|
|
บรรทัด |
รหัสต้นฉบับ (Source Code) |
อธิบายคำสั่ง |
/*1*/ |
#include <stdio.h> |
/* เป็นคำสั่งของตัวประมวลผลก่อนซี จะมีผลให้แฟ้ม stdio.h ซึ่งเป็นแฟ้มส่วนหัวที่ใช้เก็บรวบรวมคำสั่งเกี่ยวกับการรับและแสดงผลข้อมูล ถูกอ่านเข้ามาเพื่อประมวลผลร่วมกับโปรแกรมนี้ */ |
/*2*/ |
int main() { |
/* ประกาศ main เป็นฟังก์ชันหลัก ชนิดจำนวนเต็ม และเริ่มต้น block ของฟังก์ชัน main (เริ่มต้นโปรแกรม) */ |
/*3*/ |
int i ; |
/* ประกาศตัวแปร i เป็นชนิดจำนวนเต็ม */ |
/*4*/ |
for(i=1 ; i <= 10 ; i++) |
/* เป็นคำสั่งควบคุมแบบวนซ้ำ โดยมีขั้นตอนทำงานดังนี้
ขั้นตอนที่ 1) i = 1 กำหนดค่าเริ่มต้นให้ตัวนับ i = 1 (ทำเฉพาะรอบแรกเท่านั้น)
ชั้นตอนที่ 2) i <= 10 ตรวจสอบว่า ค่า i น้อยกว่าหรือเท่ากับ 10 จริงหรือไม่ ถ้าจริง เริ่มทำคำสั่งที่ต้องการทำซ้ำ บรรทัดที่ 5 ถ้าเท็จ สิ้นสุดการวนซ้ำด้วยคำสั่ง for ไปทำคำสั่งบรรทัดที่ 6 */ |
/*5*/ |
printf("%d\n" , i); |
/* แสดงข้อความ "%d" โดยแสดงค่า i ใน %d เสร็จแล้วขึ้นบรรทัดใหม่ (มีคำสั่งย่อยในคำสั่งแบบวนซ้ำ เพียงคำสั่งเดียว จึงไม่ต้องใส่เครื่องหมาย { } ก็ได้) แล้วกลับไปทำบรรทัดที่ 4 คำสั่งย่อย i++ แล้วกลับไปเริ่มทำ ขั้นตอนที่ 2) */ |
/*6*/ |
return 0; |
/* คืนค่า 0 ให้ฟังก์ชัน main โปรแกรมทำงานถูกต้องสมบูรณ์ */ |
/*7*/ |
} |
/* สิ้นสุด block ของฟังก์ชัน main (สิ้นสุดโปรแกรม) */ |
|
|
|
ผลการรันโปรแกรม |
|
|
|
|
|
|
|
ตัวอย่างที่ 10 |
จงเขียนโปรแกรมรับค่าตัวเลขจำนวนเต็ม จำนวน N ค่า แล้วหาค่าเฉลี่ย พร้อมแสดงผลทางจอภาพ ( ex6-10.c ) |
|
|
จากโจทย์ เขียนผังงาน แสดงการแก้ปัญหา ได้ดังนี้ |
|
|
|
|
|
จากผังงาน เขียนโปรแกรมได้ดังนี้ |
|
|
บรรทัด |
รหัสต้นฉบับ (Source Code) |
อธิบายคำสั่ง |
/*1*/ |
#include <stdio.h> |
/* เป็นคำสั่งของตัวประมวลผลก่อนซี จะมีผลให้แฟ้ม stdio.h ซึ่งเป็นแฟ้มส่วนหัวที่ใช้เก็บรวบรวมคำสั่งเกี่ยวกับการรับและแสดงผลข้อมูล ถูกอ่านเข้ามาเพื่อประมวลผลร่วมกับโปรแกรมนี้ */ |
/*2*/ |
int main() { |
/* ประกาศ main เป็นฟังก์ชันหลัก ชนิดจำนวนเต็ม และเริ่มต้น block ของฟังก์ชัน main (เริ่มต้นโปรแกรม) */ |
/*3*/ |
int i , N , num , sum = 0; |
/* ประกาศตัวแปร i N num และ sum เป็นชนิดจำนวนเต็ม พร้อมกำหนดค่าเริ่มต้นให้กับ sum เป็น 0 */ |
/*4*/ |
printf("Input N : "); |
/* แสดงข้อความ "Input N : " ทางจอภาพ เพื่อแจ้งให้ผู้ใช้โปรแกรมทราบว่า ต้องป้อนข้อมูลอะไร */ |
/*5*/ |
scanf("%d" , &N); |
/* รับค่าเลขจำนวนเต็ม จากแป้นพิมพ์ นำไปเก็บไว้ในตัวแปร N เมื่อป้อนข้อมูลเสร็จแล้ว ต้องกดแป้น Enter เพื่อยืนยันข้อมูลและทำคำสั่งถัดไป */ |
/*6*/ |
for(i=1 ; i <= N ; i++) { |
/* เป็นคำสั่งควบคุมแบบวนซ้ำ (มีคำสั่งย่อยมากกว่า 1 คำสั่ง ต้องเขียนคำสั่งภายใต้เครื่องหมาย { }) โดยมีขั้นตอนทำงานดังนี้
ขั้นตอนที่ 1) i = 1 กำหนดค่าเริ่มต้นให้ตัวนับ i = 1 (ทำเฉพาะรอบแรกเท่านั้น)
ชั้นตอนที่ 2) i <= N ตรวจสอบว่า ค่า i น้อยกว่าหรือเท่ากับ ค่า N จริงหรือไม่ ถ้าจริง เริ่มทำคำสั่งที่ต้องการทำซ้ำ บรรทัดที่ 7 ถ้าเท็จ สิ้นสุดการวนซ้ำด้วยคำสั่ง for ไปทำคำสั่งบรรทัดที่ 11 */ |
/*7*/ |
printf("Input Number %d : " , i); |
/* แสดงข้อความ "Input Number %d : " โดยแสดงค่า i ใน %d เพื่อแจ้งให้ผู้ใช้ โปรแกรมทราบว่า ต้องป้อนข้อมูลอะไร */ |
/*8*/ |
scanf("%d" , &num); |
/* รับค่าเลขจำนวนเต็ม จากแป้นพิมพ์ นำไปเก็บไว้ในตัวแปร num เมื่อป้อนข้อมูลเสร็จแล้ว ต้องกดแป้น Enter เพื่อยืนยันข้อมูลและทำคำสั่งถัดไป */ |
/*9*/ |
sum += num; |
/* คำสั่งคำนวณสะสมค่า เหมือนกับคำสั่ง sum = sum + num; โดย ประมวลผล sum + num ก่อน แล้วนำผลลัพธ์ที่ได้ ไปเก็บไว้ใน sum */ |
/*10*/ |
} |
/* กลับไปทำบรรทัดที่ 6 คำสั่งย่อย i++ แล้วกลับไปเริ่มทำ ขั้นตอนที่ 2) */ |
/*11*/ |
printf("\nAvg : %.2f" , (float)sum/N); |
/* ขึ้นบรรทัดใหม่ แล้วแสดงข้อความ "Avg : %.2f" โดยแสดงค่าจำนวนจริงของ sum/N ใน %.2f เป็นเลขทศนิยม 2 ตำแหน่ง */ |
/*12*/ |
return 0; |
/* คืนค่า 0 ให้ฟังก์ชัน main โปรแกรมทำงานถูกต้องสมบูรณ์ */ |
/*13*/ |
} |
/* สิ้นสุด block ของฟังก์ชัน main (สิ้นสุดโปรแกรม) */ |
|
|
|
ตัวอย่างผลการรันโปรแกรม |
|
|
|
|
|
|
|
|
|
คำสั่ง continue เป็นคำสั่งย่อย ที่ใช้ร่วมกับคำสั่ง while do - while และ for เพื่อเริ่มการประมวลผลในรอบถัดไป โดยข้ามคำสั่งย่อยที่ต้องการทำซ้ำ ที่อยู่ถัดจากคำสั่ง continue ทั้งหมด ยกเว้นในกรณีคำสั่ง for ที่ก่อนเริ่มประมวลผลรอบถัดไป จะต้องประมวลผล เพิ่มหรือลดค่าตัวนับ ก่อน |
|
ข้อสังเกต
คำสั่ง continue มักจะใช้ภายใต้คำสั่ง if หรือ if-else เพื่อให้มีเงื่อนไขทางเลือก บางเงื่อนไขเกิดขึ้น และทำให้เกิดการประมวลผลในรอบถัดไปเริ่มต้นก่อนเวลาอันควร แต่หากว่า คำสั่ง continue ไม่ได้อยู่ภายใต้คำสั่ง if หรือ if-else แล้ว จะทำให้คำสั่งที่ต้องการทำซ้ำ ที่อยู่ถัดจากคำสั่ง continue ไม่มีโอกาสถูกประมวลผลเลย |
|
คำสั่ง break เป็นคำสั่งย่อย ที่ใช้ร่วมกับคำสั่ง while do - while และ for (เช่นเดียวกับคำสั่ง continue แต่ลักษณะการทำงานตรงข้าม) การใช้คำสั่ง break มีวัตถุประสงค์ เพื่อให้คำสั่ง while do - while และ for สิ้นสุดการทำงาน ก่อนเงื่อนไขการวนซ้ำจะมีค่าเป็นเท็จ โดยข้ามคำสั่งย่อยที่ต้องการทำซ้ำ ที่อยู่ถัดจากคำสั่ง break ทั้งหมด |
|
ข้อสังเกต
1. คำสั่ง break มักจะใช้ภายใต้คำสั่ง if หรือ if-else เพื่อให้มีเงื่อนไขทางเลือก บางเงื่อนไขเกิดขึ้น และทำให้เกิดการสิ้นสุดคำสั่งการวนซ้ำก่อนเวลาอันควร แต่หากว่า คำสั่ง break ไม่ได้อยู่ภายใต้คำสั่ง if หรือ if-else แล้ว จะทำให้คำสั่งที่ต้องการทำซ้ำ ที่อยู่ถัดจากคำสั่ง break ไม่มีโอกาสถูกประมวลผลเลย
2. คำสั่ง break จะมีผลให้คำสั่ง while do - while และ for ชั้นที่มีคำสั่ง break อยู่เท่านั้น ที่สิ้นสุดการทำงาน |
|
|
|
ตัวอย่างที่ 11 |
จงเขียนโปรแกรมรับค่าจำนวนจริงบวก 5 จำนวน พร้อมหาผลรวม แล้วแสดงผลทางจอภาพ หากรับข้อมูลผิดพลาดให้รับข้อมูลใหม่ ( ex6-11.c ) |
|
|
จากโจทย์ เขียนผังงาน แสดงการแก้ปัญหา ได้ดังนี้ |
|
|
|
|
|
จากผังงาน เขียนโปรแกรมได้ดังนี้ |
|
|
บรรทัด |
รหัสต้นฉบับ (Source Code) |
อธิบายคำสั่ง |
/*1*/ |
#include <stdio.h> |
/* เป็นคำสั่งของตัวประมวลผลก่อนซี จะมีผลให้แฟ้ม stdio.h ซึ่งเป็นแฟ้มส่วนหัวที่ใช้เก็บรวบรวมคำสั่งเกี่ยวกับการรับและแสดงผลข้อมูล ถูกอ่านเข้ามาเพื่อประมวลผลร่วมกับโปรแกรมนี้ */ |
/*2*/ |
int main() { |
/* ประกาศ main เป็นฟังก์ชันหลัก ชนิดจำนวนเต็ม และเริ่มต้น block ของฟังก์ชัน main (เริ่มต้นโปรแกรม) */ |
/*3*/ |
int i = 1; |
/* ประกาศตัวแปร i เป็นชนิดจำนวนเต็ม พร้อมกำหนดค่าเริ่มต้นเป็น 1 */ |
/*4*/ |
float num , sum = 0.0; |
/* ประกาศตัวแปร num และ sum เป็นชนิดจำนวนจริง พร้อมกำหนดค่าเริ่มต้นให้กับ sum เป็น 0.0 */ |
/*5*/ |
printf("Summary 5 positive number\n"); |
/* แสดงข้อควาาม "Summary 5 positive number" แล้วขึ้นบรรทัดใหม่ */ |
/*6*/ |
while (i <= 5) { |
/* ตรวจสอบ ค่า i น้อยกว่าหรือเท่ากับ 5 จริงหรือไม่ ถ้าจริง ให้ทำเริ่มต้น block ของคำสั่ง while บรรทัดที่ 7 ถ้าเท็จ สิ้นสุดการทำซ้ำ ให้ไปทำคำสั่งบรรทัดที่ 16 */ |
/*7*/ |
printf("Input positive number %d : " , i); |
/* แสดงข้อความ "Input positive number %d : " โดยแสดงค่า i ใน %d เพื่อแจ้งให้ผู้ใช้โปรแกรมทราบว่า ต้องป้อนข้อมูลอะไร */ |
/*8*/ |
scanf("%f" , &num); |
/* รับค่าเลขจำนวนจริง จากแป้นพิมพ์ นำไปเก็บไว้ในตัวแปร num เมื่อป้อนข้อมูลเสร็จแล้ว ต้องกดแป้น Enter เพื่อยืนยันข้อมูลและทำคำสั่งถัดไป */ |
/*9*/ |
if (num <= 0) { |
/* ตรวจสอบว่า ค่า num น้อยกว่าหรือเท่ากับ 0 จริงหรือไม่ ถ้าจริง เริ่มทำบรรทัดที่ 10 ถ้าเท็จ เริ่มทำบรรทัดที่ 13 (มีคำสั่งย่อยมากกว่า 1 คำสั่ง ่ต้องเขียนคำสั่งภายใต้เครื่องหมาย { }) */ |
/*10*/ |
printf("\aError , Input positive number %d again\n" , i); |
/* ส่งเสียงปี๊บดัง 1 ครั้ง พร้อมแสดงข้อความ "Error , Input positive number %d again" โดยแสดงค่า i ใน %d แล้วขึ้นบรรทัดใหม่ */ |
/*11*/ |
continue; |
/* กลับไปเริ่มทำคำสั่งบรรทัดที่ 7 */ |
/*12*/ |
} |
/* สิ้นสุด block ของคำสั่ง if */ |
/*13*/ |
sum += num; |
/* คำสั่งคำนวณสะสมค่า เหมือนกับคำสั่ง sum = sum + num; โดย ประมวลผล sum + num ก่อน แล้วนำผลลัพธ์ที่ได้ ไปเก็บไว้ใน sum */ |
/*14*/ |
i++; |
/* เพิ่มค่าตัวนับ i ครั้งละ 1 (ความหมายเดียวกับคำสั่ง i = i + 1 หรือ i += 1) */ |
/*15*/ |
} |
/* สิ้นสุด block ของคำสั่ง while แล้ววนไปทำคำสั่งบรรทัดที่ 6 */ |
/*16*/ |
printf("\nSummary 5 positive number = %.2f" , sum); |
/* ขึ้นบรรทัดใหม่ แล้วจึงแสดงข้อความ "Summary 5 positive number = %.2f" โดยแสดงค่า sum ใน %.2f (แสดงทศนิยม 2 ตำแหน่ง) */ |
/*17*/ |
return 0; |
/* คืนค่า 0 ให้ฟังก์ชัน main โปรแกรมทำงานถูกต้องสมบูรณ์ */ |
/*18*/ |
} |
/* สิ้นสุด block ของฟังก์ชัน main (สิ้นสุดโปรแกรม) */ |
|
|
ตัวอย่างผลการรันโปรแกรม |
|
|
|
|
|
|
|
ตัวอย่างที่ 12 |
จงเขียนโปรแกรมรับค่าจำนวนจริงบวก 5 จำนวน พร้อมหาผลรวม แล้วแสดงผลทางจอภาพ หากรับข้อมูลผิดพลาดให้หยุดรับข้อมูล ( ex6-12.c ) |
|
|
จากโจทย์ เขียนผังงาน แสดงการแก้ปัญหา ได้ดังนี้ |
|
|
|
|
|
จากผังงาน เขียนโปรแกรมได้ดังนี้ |
|
|
บรรทัด |
รหัสต้นฉบับ (Source Code) |
อธิบายคำสั่ง |
/*1*/ |
#include <stdio.h> |
/* เป็นคำสั่งของตัวประมวลผลก่อนซี จะมีผลให้แฟ้ม stdio.h ซึ่งเป็นแฟ้มส่วนหัวที่ใช้เก็บรวบรวมคำสั่งเกี่ยวกับการรับและแสดงผลข้อมูล ถูกอ่านเข้ามาเพื่อประมวลผลร่วมกับโปรแกรมนี้ */ |
/*2*/ |
int main() { |
/* ประกาศ main เป็นฟังก์ชันหลัก ชนิดจำนวนเต็ม และเริ่มต้น block ของฟังก์ชัน main (เริ่มต้นโปรแกรม) */ |
/*3*/ |
int i = 1; |
/* ประกาศตัวแปร i เป็นชนิดจำนวนเต็ม พร้อมกำหนดค่าเริ่มต้นเป็น 1 */ |
/*4*/ |
float num , sum = 0.0; |
/* ประกาศตัวแปร num และ sum เป็นชนิดจำนวนจริง พร้อมกำหนดค่าเริ่มต้นให้กับ sum เป็น 0.0 */ |
/*5*/ |
printf("Summary 5 positive number\n"); |
/* แสดงข้อควาาม "Summary 5 positive number" ทางจอภาพ แล้วขึ้นบรรทัดใหม่ */ |
/*6*/ |
while (i <= 5) { |
/* ตรวจสอบ ค่า i น้อยกว่าหรือเท่ากับ 5 จริงหรือไม่ ถ้าจริง ให้ทำเริ่มต้น block ของคำสั่ง while บรรทัดที่ 7 ถ้าเท็จ สิ้นสุดการทำซ้ำ ให้ไปทำคำสั่งบรรทัดที่ 16 */ |
/*7*/ |
printf("Input positive number %d : " , i); |
/* แสดงข้อความ "Input positive number %d : " โดยแสดงค่า i ใน %d เพื่อแจ้งให้ผู้ใช้โปรแกรมทราบว่า ต้องป้อนข้อมูลอะไร */ |
/*8*/ |
scanf("%f" , &num); |
/* รับค่าเลขจำนวนจริง จากแป้นพิมพ์ นำไปเก็บไว้ในตัวแปร num เมื่อป้อนข้อมูลเสร็จแล้ว ต้องกดแป้น Enter เพื่อยืนยันข้อมูลและทำคำสั่งถัดไป */ |
/*9*/ |
if (num <= 0) { |
/* ตรวจสอบ ค่า num น้อยกว่าหรือเท่ากับ 0 จริงหรือไม่ ถ้าจริง เริ่มทำบรรทัดที่ 10 ถ้าเท็จ เริ่มทำบรรทัดที่ 13 (มีคำสั่งย่อยมากกว่า 1 คำสั่ง ่ต้องเขียนคำสั่งภายใต้เครื่องหมาย { }) */ |
/*10*/ |
printf("\aData Error!!!\n"); |
/* ส่งเสียงปี๊บดัง 1 ครั้ง พร้อมแสดงข้อความ "Data Error!!!" แล้วขึ้นบรรทัดใหม่ */ |
/*11*/ |
break; |
/* สิ้นสุดการทำงานของคำสั่งควบคุมการวนซ้ำ while เริ่มไปทำคำสั่งบรรทัดที่ 16 */ |
/*12*/ |
} |
/* สิ้นสุด block ของคำสั่ง if */ |
/*13*/ |
sum += num; |
/* คำสั่งคำนวณสะสมค่า เหมือนกับคำสั่ง sum = sum + num; โดย ประมวลผล sum + num ก่อน แล้วนำผลลัพธ์ที่ได้ ไปเก็บไว้ใน sum */ |
/*14*/ |
i++; |
/* เพิ่มค่าตัวนับ i ครั้งละ 1 (ความหมายเดียวกับคำสั่ง i = i + 1 หรือ i += 1) */ |
/*15*/ |
} |
/* สิ้นสุด block ของคำสั่ง while แล้ววนไปทำคำสั่งบรรทัดที่ 6 */ |
/*16*/ |
printf("\nSummary 5 positive number = %.2f" , sum); |
/* ขึ้นบรรทัดใหม่ แล้วจึงแสดงข้อความ "Summary 5 positive number = %.2f" โดยแสดงค่า sum ใน %.2f (แสดงทศนิยม 2 ตำแหน่ง) */ |
/*17*/ |
return 0; |
/* คืนค่า 0 ให้ฟังก์ชัน main โปรแกรมทำงานถูกต้องสมบูรณ์ */ |
/*18*/ |
} |
/* สิ้นสุด block ของฟังก์ชัน main (สิ้นสุดโปรแกรม) */ |
|
|
|
ตัวอย่างผลการรันโปรแกรม กรณีข้อมูลถูกต้อง |
|
ตัวอย่างผลการรันโปรแกรม กรณีข้อมูลผิดพลาด |
|
|
|
|
|
|
|
|
|
คำสั่งวนซ้ำเชิงซ้อน คือ คำสั่งวนซ้ำที่มีคำสั่งวนซ้ำเป็นคำสั่งย่อยอยู่ภายใน คำสั่งวนซ้ำที่ซ้อนกัน อาจเป็นคำสังวนซ้ำประเภทเดียวกันหรือแตกต่างกันก็ได้ เช่น คำสั่ง while ซ้อนอยู่ในคำสั่ง while คำสั่ง for ซ้อนอยู่ในคำสั่ง while หรือคำสั่ง for ซ้อนอยู่ในคำสั่ง for เป็นต้น โดยคำสั่งวนซ้ำจะซ้อนกันเป็นชั้น ๆ จากชั้นในสู่ชั้นนอกตามลำดับ |
|
ในการประมวลผลคำสั่งวนซ้ำเชิงซ้อน ในแต่ละรอบของการประมวลผลคำสั่งวนซ้ำชั้นนอก คำสั่งวนซ้ำชั้นในจะต้องประมวลผลจนกระทั่งสิ้นสุดเงื่อนไขการวนซ้ำก่อน แล้วจึงวนซ้ำ ไปประมวลผลคำสั่งวนซ้ำชั้นนอกในรอบถัดไป และวนซ้ำเช่นนี้ จนกระทั่งเงื่อนไขการวนซ้ำชั้นนอกจะสิ้นสุดลง จึงจะทำให้คำสั่งวนซ้ำเชิงซ้อนสิ้นสุดการทำงาน |
|
|
|
ตัวอย่างที่ 13 |
จงเขียนโปรแกรมแสดงดาวเป็นสามเหลี่ยม ดังรูป ( ex6-13.c ) |
|
|
|
|
จากโจทย์ เขียนผังงาน แสดงการแก้ปัญหา ได้ดังนี้ |
|
|
|
|
|
จากผังงาน เขียนโปรแกรมได้ดังนี้ |
|
|
บรรทัด |
รหัสต้นฉบับ (Source Code) |
อธิบายคำสั่ง |
/*1*/ |
#include <stdio.h> |
/* เป็นคำสั่งของตัวประมวลผลก่อนซี จะมีผลให้แฟ้ม stdio.h ซึ่งเป็นแฟ้มส่วนหัวที่ใช้เก็บรวบรวมคำสั่งเกี่ยวกับการรับและแสดงผลข้อมูล ถูกอ่านเข้ามาเพื่อประมวลผลร่วมกับโปรแกรมนี้ */ |
/*2*/ |
int main() { |
/* ประกาศ main เป็นฟังก์ชันหลัก ชนิดจำนวนเต็ม และเริ่มต้น block ของฟังก์ชัน main (เริ่มต้นโปรแกรม) */ |
/*3*/ |
int i = 1 , j ; |
/* ประกาศตัวแปร i และ j เป็นชนิดจำนวนเต็ม พร้อมกำหนดค่าเริ่มต้นให้กับ i เป็น 1 */ |
/*4*/ |
while (i <= 10) { |
/* ตรวจสอบ ค่า i น้อยกว่าหรือเท่ากับ 10 จริงหรือไม่ ถ้าจริง ให้ทำเริ่มต้น block ของคำสั่ง while บรรทัดที่ 5 ถ้าเท็จ สิ้นสุดการทำซ้ำ ให้ไปทำคำสั่งบรรทัดที่ 11 */ |
/*5*/ |
for(j = 1 ; j <= i ; j++) |
/* เป็นคำสั่งควบคุมแบบวนซ้ำ โดยมีขั้นตอนทำงานดังนี้
ขั้นตอนที่ 1) j = 1 กำหนดค่าเริ่มต้นให้ตัวนับ j = 1 (ทำเฉพาะรอบแรกเท่านั้น)
ชั้นตอนที่ 2) j <= i ตรวจสอบ ค่า j น้อยกว่าหรือเท่ากับ ค่า i จริงหรือไม่ ถ้าจริง เริ่มทำคำสั่งที่ต้องการทำซ้ำ บรรทัดที่ 6 ถ้าเท็จ สิ้นสุดการวนซ้ำด้วยคำสั่ง for ไปทำคำสั่งบรรทัดที่ 7 */ |
/*6*/ |
printf("* "); |
/* แสดงข้อความ "*" (มีคำสั่งย่อยในคำสั่งแบบวนซ้ำ เพียงคำสั่งเดียว จึงไม่ต้องใส่เครื่องหมาย { } ก็ได้) แล้วกลับไปทำบรรทัดที่ 5 คำสั่งย่อย j++ แล้วกลับไปเริ่มทำ ขั้นตอนที่ 2) */ |
/*7*/ |
printf("\n"); |
/* ขึ้นบรรทัดใหม่ */ |
/*8*/ |
i++; |
/* เพิ่มค่าตัวนับ i ครั้งละ 1 (ความหมายเดียวกับคำสั่ง i = i + 1 หรือ i += 1) */ |
/*9*/ |
} |
/* กลับไปทำบรรทัดที่ 4 */ |
/*11*/ |
return 0; |
/* คืนค่า 0 ให้ฟังก์ชัน main โปรแกรมทำงานถูกต้องสมบูรณ์ */ |
/*11*/ |
} |
/* สิ้นสุด block ของฟังก์ชัน main (สิ้นสุดโปรแกรม) */ |
|
|
|
ผลการรันโปรแกรม |
|
|
|
|
|
|
|
ตัวอย่างที่ 14 |
จงเขียนโปรแกรมแสดงดาวเป็นรูปสี่เหลี่ยมสลับลาย ดังภาพ ( ex6-14.c ) |
|
|
|
|
จากโจทย์ เขียนผังงาน แสดงการแก้ปัญหา ได้ดังนี้ |
|
|
|
|
|
จากผังงาน เขียนโปรแกรมได้ดังนี้ |
|
|
บรรทัด |
รหัสต้นฉบับ (Source Code) |
อธิบายคำสั่ง |
/*1*/ |
#include <stdio.h> |
/* เป็นคำสั่งของตัวประมวลผลก่อนซี จะมีผลให้แฟ้ม stdio.h ซึ่งเป็นแฟ้มส่วนหัวที่ใช้เก็บรวบรวมคำสั่งเกี่ยวกับการรับและแสดงผลข้อมูล ถูกอ่านเข้ามาเพื่อประมวลผลร่วมกับโปรแกรมนี้ */ |
/*2*/ |
int main() { |
/* ประกาศ main เป็นฟังก์ชันหลัก ชนิดจำนวนเต็ม และเริ่มต้น block ของฟังก์ชัน main (เริ่มต้นโปรแกรม) */ |
/*3*/ |
int i , j ; |
/* ประกาศตัวแปร i และ j เป็นชนิดจำนวนเต็ม */ |
/*4*/ |
for (i = 1 ; i <= 10 ; i++) { |
/* เป็นคำสั่งควบคุมแบบวนซ้ำ โดยมีขั้นตอนทำงานดังนี้
ขั้นตอนที่ 1) i = 1 กำหนดค่าเริ่มต้นให้ตัวนับ i = 1 (ทำเฉพาะรอบแรกเท่านั้น)
ชั้นตอนที่ 2) i <= 10 ตรวจสอบ ค่า i น้อยกว่าหรือเท่ากับ 10 จริงหรือไม่ ถ้าจริง เริ่มทำคำสั่งที่ต้องการทำซ้ำ บรรทัดที่ 5 ถ้าเท็จ สิ้นสุดการวนซ้ำด้วยคำสั่ง for (วงนอก) ไปทำคำสั่งบรรทัดที่ 12 */ |
/*5*/ |
for(j = 1 ; j <= 20 ; j++) |
/* เป็นคำสั่งควบคุมแบบวนซ้ำ โดยมีขั้นตอนทำงานดังนี้
ขั้นตอนที่ A) j = 1 กำหนดค่าเริ่มต้นให้ตัวนับ j = 1 (ทำเฉพาะรอบแรกเท่านั้น)
ชั้นตอนที่ B) j <= 20 ตรวจสอบ ค่า j น้อยกว่าหรือเท่ากับ 20 จริงหรือไม่ ถ้าจริง เริ่มทำคำสั่งที่ต้องการทำซ้ำ บรรทัดที่ 6 ถ้าเท็จ สิ้นสุดการวนซ้ำด้วยคำสั่ง for (วงใน) ไปทำคำสั่งบรรทัดที่ 10 */ |
/*6*/ |
if( (i + j) %2 == 1) |
/* ตรวจสอบ ค่า (i + j) % 2 เท่ากับ 1 จริงหรือไม่ ถ้าจริง เริ่มทำบรรทัดที่ 7 ถ้าเท็จ เริ่มทำบรรทัดที่ 8 (if - else บรรทัดที่ 6 - 9 เป็นคำสั่งเชิงประกอบ ถือว่าเป็น 1 คำสั่ง เมื่อมีคำสั่งย่อยในคำสั่งแบบวนซ้ำ เพียงคำสั่งเดียว จึงไม่ต้องใส่เครื่องหมาย { } ก็ได้) */ |
/*7*/ |
printf("*"); |
/* แสดงข้อความ "*" (มีคำสั่งย่อย เพียงคำสั่งเดียว จึงไม่ต้องใส่เครื่องหมาย { } ก็ได้) แล้วกลับไปทำบรรทัดที่ 5 คำสั่งย่อย j++ แล้วกลับไปเริ่มทำ ขั้นตอนที่ B) */ |
/*8*/ |
else |
/* ทำกรณีคำสั่งบรรทัดที่ 6 เป็นเท็จ */ |
/*9*/ |
printf(" "); |
/* แสดงข้อความ " " (ช่องว่าง 1 ช่อง) (มีคำสั่งย่อย เพียงคำสั่งเดียว จึงไม่ต้องใส่เครื่องหมาย { } ก็ได้) แล้วกลับไปทำบรรทัดที่ 5 คำสั่งย่อย j++ แล้วกลับไปเริ่มทำ ขั้นตอนที่ B) */ |
/*10*/ |
printf("\n"); |
/* ขึ้นบรรทัดใหม่ */ |
/*11*/ |
} |
/* กลับไปทำบรรทัดที่ 4 คำสั่งย่อย i++ แล้วกลับไปเริ่มทำ ขั้นตอนที่ 2) */ |
/*12*/ |
return 0; |
/* คืนค่า 0 ให้ฟังก์ชัน main โปรแกรมทำงานถูกต้องสมบูรณ์ */ |
/*13*/ |
} |
/* สิ้นสุด block ของฟังก์ชัน main (สิ้นสุดโปรแกรม) */ |
|
|
|
ผลการรันโปรแกรม |
|
|
|
|
|
|