หน่วยที่ 4: คำสั่งควบคุมโปรแกรม (Control Flow Command) เอกลักษณ์ สุมนพันธุ์ Computer Engineering Ekkalak@rmutl.ac.th
บทนำ การทำงานของโปรแกรมคอมพิวเตอร์ ประกอบไป ด้วย 3 ลักษณะใหญ่ ได้แก่ การทำงานของโปรแกรมคอมพิวเตอร์ ประกอบไป ด้วย 3 ลักษณะใหญ่ ได้แก่ 1. การทำงานตามโปรแกรมทีละคำสั่งตามลำดับ ก่อนหลัง (Sequencing) 2. ควบคุมให้โปรแกรมทำงานซ้ำจนกว่าจะเป็นไป ตามเงื่อนไขที่ตั้งไว้ (Iteration) 3. การตรวจสอบเงื่อนไขแล้วเลือกทำตามคำสั่งที่ เลือก (Selection)
บทนำ (ต่อ) การทำซ้ำและการตรวจสอบเงื่อนไข ภาษาซีมี คำสั่งในหมวดนี้ 3 คำสั่งได้แก่ 1. คำสั่งที่ให้ข้ามไปทำงานโดยไม่มีเงื่อนไข goto, break และ continue 2. คำสั่งให้ข้ามไปทำงานโดยมีเงื่อนไข if และ switch 3. คำสั่งให้ทำงานซ้ำ while, do…while และ for
คำสั่ง If if เป็นคำสั่งแบบมีเงื่อนไข (Conditional Statement) ผลการตรวจสอบเงื่อนไข จริง ทำภายใน if{ } แต่ถ้าเท็จทำภายใน else{ } รูปแบบของคำสั่ง if(condition){ statement1; } else{ statement2;
ตัวอย่างการใช้คำสั่ง if Example: scanf(“Enter x and y :”,&x,&y); if(x>y){ printf(“x>y”); } else{ printf(“y>x”);
การใช้ if/else หลายทางเลือก สำหรับการตรวจสอบเงื่อนไขมากกว่า 2 ทางเลือก ใช้คำสั่ง if/else ได้ใช้คำสั่ง if/else ซ้อนกัน หลายระดับ รูปแบบการใช้คำสั่ง if(condition1)statement1; else if(condition2)statement2; else if(condition3)statement3; Else statement4;
if/else สามารถเขียนเป็น Flowchart ได้ดังนี้
โปรแกรมแปลงหน่วยความยาวฟุต เมตร โปรแกรมแปลงหน่วยความยาวฟุต เมตร #include”stdio.h” main(){ float num; int choice; printf(“1. Feet to Meter 2.Meter to Feet\n”); printf(“Enter choice :”); scanf(“%d”,&choice); if(choice==1){ printf(“\n\nEnter number of feet :”); scanf(“%f”,&num); printf(“Meter : %f”,num/3.28); } else{ printf(“\n\nEnter number of meter :”); scanf(“%f”,&num); printf(“Feet : %f”,num*3.28); }
การใช้ Logical Operator ในการตรวจสอบเงื่อนไข && (AND) || (OR) ! (NOT) สามารถใช้กับคำสั่ง if ได้ทำให้ทางเลือก การทำงานหลากหลายขึ้น เช่น x>0 && x<10 y>=0 && y<=10 z==5 || z==15
โปรแกรมการคิดเกรดจากคะแนน score #include <stdio.h> main(){ int score; char grade; printf(“Enter score :”); scanf(“%d”,&score); if(score>=60 && score<=80)grade=‘B’; else if(score>80) grade=‘A’; else grade=‘C’; printf(“Grade is %c”,grade); }
คำสั่ง switch เหมือนกันกับคำสั่ง if/else ซ้อนกันหลายครั้ง แต่ใช้ งานได้สะดวกกว่า ประกอบไปด้วยคำสั่งย่อยภายใน case เพื่อเลือก ตัดสินใจทำงานตามนิพจน์ที่ได้ผลลัพธ์ทางลอจิกเป็นค่า จริง รูปแบบของคำสั่ง : switch(variable){ case constant1: statement; break; case constant2: statement; break; ……… default: statement }
ตัวอย่างการใช้งานคำสั่ง switch switch(x){ case 1: printf(“x = 1\n”); break; case 2: printf(“x = 2\n”); case 3: printf(“x = 3\n”); default: printf(“No Value !”); }
for(initialization;condition;increment) statement; เป็นคำสั่งสำหรับการทำซ้ำ ใช้ควบคุมการทำงานของโปรแกรมให้มีการทำซ้ำกันหลายๆ ครั้งตามที่ กำหนด โครงสร้างของคำสั่งประกอบด้วย 3 ส่วนดังนี้ 1) ส่วนที่กำหนดค่าเริ่มต้น 2) ส่วนตรวจสอบเงื่อนไข 3) ส่วนค่าที่เปลี่ยนไป รูปแบบ for(initialization;condition;increment) statement;
แนวทางการเขียนผังงานคำสั่ง for
ตัวอย่าง การใช้งานคำสั่ง for for(x=1;x<=100;x++) printf(“%d”,x); #include “stdio.h” main(){ int I; for(i=1;i<100;i++){ printf(“This is i: %d”,i); printf(“and I squared is %d\n”,i*i); }
การกำหนดนิพจน์ใน () ของคำสั่ง for นิพจน์ภายในวงเล็บ () สามารถกำหนดให้ยืดหยุ่นต่อการใช้ งาน นิพจน์แต่ละส่วนคั่นด้วย ; แต่บางนิพจน์อาจจะไม่ระบุก็ได้เช่น เมื่อไม่มีส่วนของการระบุนิพจน์สำหรับตรวจสอบเงื่อนไข คอมไพเลอร์จะถือว่าส่วนที่ไม่ระบุนิพจน์มีค่าเป็น 0 (เท็จ) ตลอดเวลา for(x=0; ;x=x+5) printf(“%d”,x); for(; ;);
การใช้นิพจน์ย่อยในคำสั่ง for โปรแกรมวนรอบแสดงตัวเลขตั้งแต่ 0 ถึง 98 โดยเพิ่มค่าขึ้นครั้งละ 2 กำหนดให้ใช้ตัวแปร 2 ตัว x และ y กำหนดค่าเริ่มต้นเท่ากับ 0 #include “stdio.h” main(){ int x,y; for(x=0,y=0;x+y<100;++x,++y) printf(“%d”,x+y); }
ตัวแปรที่สามารถใช้ได้กับคำสั่ง for ตัวแปรที่ใช้ในคำสั่ง for สำหรับการวนรอบจะเป็น int หรือ char กรณีที่ใช้ตัวแปร char for(ch=‘A’;ch<=‘Z’;ch++) printf(“ASCII = %c decimal = %d\n”,ch,ch);
while(condition) statement; เป็นคำสั่งการทำงานวนรอบเช่นเดียวกับคำสั่ง for การทำงานจะเริ่มต้นด้วยการตรวจสอบเงื่อนไขก่อน เมื่อตรวจพบว่านิพจน์ที่ทำการตรวจสอบให้ค่าจริงก็จะทำ คำสั่งต่อจากคำสั่ง while แต่ถ้าพบว่าไม่จริงก็จะหยุดรอบ การทำงานแล้วข้ามไปทำคำสั่งต่อไป รูปแบบ while(condition) statement;
แนวทางการเขียนผังงานคำสั่ง while
ตัวอย่างการใช้งานคำสั่ง while Example #include “stdio.h” main(){ int i=1; int count=0; while(i<=100){ count+=1; i++; } printf(“Total = %d”,count);
คำสั่ง do/while ใช้สำหรับควบคุมการทำงานของโปรแกรมให้ทำวนรอบ เหมือนคำสั่ง for และ while และลักษณะการทำงานจะตรงกันข้าม ลักษณะการทำงานจะเริ่มต้นทำตามคำสั่งที่อยู่ใน do แล้วจึงไปตรวจสอบเงื่อนไข หลังคำสั่ง while กรณีที่ผลจากการตรวจสอบเป็นจริง ก็จะกลับไปทำตามคำสั่งที่อยู่ หลัง do แต่ถ้าพบว่าไม่จริงก็จะจบการทำงาน โดยข้ามไปทำคำสั่งหลังจาก while รูปแบบ do{ statement; }while(condition);
แนวทางการเขียนผังงานคำสั่ง do-while
ตัวอย่างการใช้คำสั่ง do/while #include “stdio.h” main(){ int i=1,count=0; do{ count+=I; i++; }while(i<=100); printf(“Total = %d”,count); }
ตัวอย่างการใช้คำสั่ง do/while โปรแกรมวนรอบแสดงอัตราส่วนของตัวแปร a/b โดย b ต้องไม่เป็น 0 เมื่อกดคีย์ ‘S’ จึงจบการทำงาน do{ printf(“\nEnter two number :”); scanf(“%f %f”,&a,&b); if(b==0.0) printf(“The ratio is undefined !\n”); else{ ratio=a/b; printf(“The ratio is %f\n”,ratio); } printf(“Press <S> to stop, any key to continue.”); }while(getch()!=‘S’);
การวนรอบซ้ำ (Nested Loop) การแก้ปัญหาโจทย์หรือระบบงานที่ซับซ้อน จะ เกี่ยวข้องกับการใช้ตัวแปรหลายๆตัว ระบบงานที่ซับซ้อน อาจจะกระทำในลักษณะ ของการวนรอบซ้อน เรียกว่า Nested Loop for, while และ do…while สามารถใช้ใน ลักษณะการวนรอบซ้อนได้ตามความต้องการ
โปรแกรมวนรอบซ้อน ด้วยคำสั่ง for printf(" x x^2 x^3 x^4 \n"); for(x=1; x<10; x++){ for(y=1; y<5; y++){ num=1; for(z=0; z<y; z++){ num=num*x; } printf("%9d",num); printf("\n"); ผลลัพธ์จะปรากฎดังนี้ X x^2 x^3 x^4 1 1 1 4 8 16 9 27 81 16 64 256 25 125 625 …. … …. ….. 9 81 729 6561
คำสั่ง break การทำงานของคำสั่งวนรอบ จะหยุดการทำงานเมื่อ เงื่อนไขที่ตรวจสอบเป็นเท็จ กรณีที่ต้องการหยุดการวนรอบก่อนครบกำหนด สามารถทำได้โดยใช้คำสั่ง break for(x=0;x<100;x++){ printf(“%d”,x); if(x==10) break; }
คำสั่ง continue ตรงข้ามกับคำสั่ง break เมื่อพบคำสั่ง continue จะกลับไปวนรอบใหม่เพื่อตรวจสอบ เงื่อนไขตามที่กำหนด for(x=0;x<100;x++){ continue; printf(“%d”,x); }
โปรแกรมบวกเลข ด้วยคำสั่ง continue do{ printf(“Enter next number <0 to STOP> “); scanf(“%d”,&i); printf(“ls %d correct ? <Y/N> “,i); ch=getch(); printf(“\n”); if(ch==‘N’) continue; total+=i; }while(i); printf(“Total is %d\n”,total);
คำสั่ง goto goto ใช้สำหรับสั่งให้ข้ามการทำงานไปยังตำแหน่ง หรือชื่อที่กำหนดโดยไม่มีเงื่อนไข ประกอบด้วยส่วน สำคัญ 2 ส่วน คือ 1. ส่วนของคำสั่ง 2. ส่วนของ Label รูปแบบ goto label;
ตัวอย่างการใช้คำสั่ง goto ไม่มีโอกาสประมวลผล goto step; printf(“This line will not print”); step: printf(“This line will print”); float r=2,pi=3.14159; loop: printf(“R=%f Area=%f\n”,r,pi*r*r); r=r+1; goto loop; }
บทสรุป คำสั่งตัดสินใจทางเลือก if..else , switch คำสั่งวนรอบ for, while, do..while คำสั่งข้ามไปทำยังตำแหน่งที่ต้องการ goto
THE END