IT4X เทคนิคคอมพิวเตอร์ โน๊ตบุค ข่าว IT

ข่าวสาร / ความรู้ => คนเขียนโปรแกรม => ข้อความที่เริ่มโดย: Moshi ที่ สิงหาคม 18, 2009, 22:28:52

หัวข้อ: Listen 6 : Structure Programming
เริ่มหัวข้อโดย: Moshi ที่ สิงหาคม 18, 2009, 22:28:52

อยากจะบอกว่าในส่วนนี้เราจะทำการเรียนรู้เกี่ยวกับโครงสร้างของการโปรแกรมที่มีลักษณะเป็นแบบ   sequential lines นั่นคือ compiler   จะทำงานโดยการเริ่มไล่จากบรรทัดบนสุดแล้วทำงานไล่ลงมาเป็นบรรทัดๆ   ไปเรื่อยๆจนจบโปรแกรม ซึ่งจะต่างจากการทำงานของการโปรแกรมแบบ OOP (object oriented   programming) ซึ่งในที่นี้เราจะไม่พูดถึง

ในการโปรแกรมนี้เราจำเป็นจะต้องรู้จัก โครงสร้างของ loop หรือการวนซ้ำก่อน   ถามว่าทำไมจะต้องมีการวนซ้ำ ก็เป็นเพราะในการโปรแกรมส่วนใหญ่นั้นการวนซ้ำหรือ loop   นี้มีความสำคัญหรือมีส่วนเกี่ยวข้องอยู่มาก เช่นหากเราต้องการจะ ทำการบวกเลขตั้งแต่   1 ถึง 100 หากเรามานั่งเขียนหรือตั้งตัวแปรแล้วค่อยๆมาบวกกันเป็นคู่ๆ   หรือบวกกันทีเดียวในบรรทัดเดียวก็อาจทำได้แต่มันก็ไม่สมควรหากเราต้องการบวกตัวเลขมากกว่า   100 เช่น 1000 เป็นต้น
     ตัวอย่างที่ผิด เรากำหนดให้ n เป็นตัวแปรในการรับค่าคำตอบของการบวกกันของตัวเลข ตั้งแต่ 1 ถึง 100   เราจึงเขียนเป็นว่า

n=1+2+3+4+5+6+7+8+9+10+11+12+...+96+97+98+99+100;

ในส่วนที่ละไว้นั้น (... ) ในส่วนของการโปรแกรมเราจะต้องเขียนให้หมด   ซึ่งถ้าเขียนหมดจริงๆ ก็ตายกันพอดี
 ดังนั้น การวนซ้ำจึงเข้ามามีบทบาทในการทำ   ก็เลยจะขออธิบายโครงสร้างก่อนก็แล้วกัน
 
 คำสั่ง for loop

for(ตัวนับ= i;เงื่อนไขที่จะให้ยังทำงานอยู่ใน loop; การเพิ่มหรือการลดตัวนับ){
               statement   ;
 }
 
ก่อนอื่นต้องขออธิบายก่อนว่านี่คือโครงสร้างของ for loop   โดยขอให้สังเกตบรรทัดแรกตรงที่มีคำสั่ง for แล้วให้ดูในวงเล็บ   ปรากฎว่าตามรูปแบบมาตรฐานนั้น ในส่วนของวงเล็บหลังคำว่า for จะประกอบไปด้วย 3 ส่วน   ส่วนแรกก็คือ การกำหนดค่าเริ่มต้นให้กับตัวนับ อาจจะงงว่าตัวนับที่พูดถึงคืออะไร ใน   for loop นั้น จำเป็นจะต้องมีตัวนับอยู่ด้วยเสมอ ซึ่งตัวนับนี้ จะเป็นตัวบอกเราว่า   loop ของเรานั้นทำการวนซ้ำมาเป็นรอบที่เท่าไรแล้ว   และในส่วนแรกนี้เราจำเป็นจะต้องมีการกำหนด ค่าเริ่มต้นให้กับตัวนับก่อน   ในส่วนที่สอง เงื่อนไขที่จะให้ยังทำงานอยู่ใน loop นี้   โดยส่วนใหญ่จะเป็นการกำหนดว่าเมื่อตัวนับมีการวนซ้ำ   ถึงจำนวนรอบเท่านั้นเท่านี้ก็จะให้หลุดจาก loop ในส่วนที่สาม   การเพิ่มหรือการลดตัวนับ ตรงนี้สำคัญ ซึ่งจะเป็นส่วนที่ทำให้   ตัวนับของเรามีการเพิ่มค่าหรือลดค่า ในแต่ละรอบของการวนซ้ำเช่นอาจเพิ่มทีละหนึ่ง   หรือ เพิ่มทีละ3 เป็นต้นหรืออาจจะลดทีละ 1 หรือลดทีละ 3 ก็แล้วแต่โปรแกรมจะกำหนด   หลังจากวงเล็บที่อยู่หลัง for ก็จะมีเครื่องหมาย ปีกกาเพื่อให้เข้าสู่ส่วนของคำสั่ง   ที่จะต้องทำหลังจากบรรทัด for ก็มาถึง statement   ซึ่งจะเป็นส่วนที่ให้เราเขียนคำสั่งว่า ในแต่ละรอบนั้น เราจะให้โปรแกรมทำงานอะไร   ซึ่งก็อาจมีได้หลายคำสั่ง บรรทัดสุดท้ายก็คือ ปีกกาปิดเพื่อจบโครงสร้าง for   loop
   ดูตัวอย่าง การบวกเลขตั้งแต่ 1 ถึง 100
 
#include
   main()
   {
   int i,ans;  
   ans=0;  
   for(i=1;i  <=100;i++){
        ans=ans+i;  
   }  
   printf(  "answer is %d",ans);
   }
   ในที่นี้เราทำการกำหนดให้ตัวแปร i เป็นตัวแปรนับ ส่วน ans   เป็นตัวแปรที่ใช้เก็บค่าคำตอบ ในบรรทัด for นั้นไม่มีปัญหาอะไรยกเว้น ที่เราเจอ i++   นั่นก็หมายถึง i+1 นั่นเอง คือ ใน loop นี้เราจะทำการเพิ่มตัวนับ i ไปทีละ 1   สมมตินะครับสมมติ ว่าหากเราต้องการจะ แสดงเฉพาะเลขคี่ที่อยู่ระหว่าง 1 ถึง 100   เราจะทำอย่างไร ดูต่อครับ
 

   ดูตัวอย่าง   การแสดงเฉพาะเลขคี่ที่อยู่ในช่วงตั้งแต่ 1 ถึง 100
 
#include
   main()
   {
   int   i   ;  
   for(i=1;i  <=100;i=i+2){
          printf(  "Odd number is   %dn",i);       
   }  
   }
   นั่นคือเราก็วน loop   เหมือนเดิมเพียงแต่ในแต่ละรอบนั้นเราทำการเพิ่มค่า i ไปทีละ 2 ซึ่งเดิมค่า i   มีค่าเท่ากับ 1 พอ compiler มา check ว่า 1<=100 นั้นจริงไหม   ปรากฎว่าจริงก็ให้ทำงานใน loop ต่อ โดยมีการเพิ่มค่า i=i+2 นั่นหมายความว่าตอนนี้ i   มีค่าเป็น 1+2 ก็คือ 3 นั่นเอง ในรอบต่อมาเราก็แสดงค่า 3 ทำเช่นนี้ไปเรื่อยๆ   เราก็จะได้เฉพาะเลขคี่ 1,3,5,7,...,99
   สมมตินะครับสมมติ ว่าหากเราต้องการจะ   แสดงเฉพาะเลขคู่ที่อยู่ระหว่าง 1 ถึง 100 เราจะทำอย่างไร ดูต่อครับ
     ดูตัวอย่าง   การแสดงเฉพาะเลขคู่ที่อยู่ในช่วงตั้งแต่ 1 ถึง 100
 
#include
   main()
   {
   int   i   ;  
   for(i=2;i  <=100;i=i+2){
          printf(  "Odd number is   %dn",i);       
   }  
   }
   เช่นเคยครับไม่ค่อยแตกต่างอะไรกับการ   แสดงเฉพาะเลขคี่ แต่จะต่างกันตรงการเริ่มต้นค่าให้กับตัวนับครับ   นั่นคือเราทำการเริ่มต้นค่า ตัวนับด้วย 2 นั่นคือตัวแปร i จะมีค่าเริ่มต้นเป็น 2   ในการวน loop รอบแรกครับจากนั้นก็เหมือนเดิมในแต่ละรอบ ค่า i จะถูกเพิ่มทีละ 2 ครับ   ดังนั้นสุดท้ายเราก็จะได้ 2,4,6,8,10,...,100   ไปตามระเบียบ
   และหากเราต้องการจะแสดงเฉพาะเลขคู่นี่แหละแต่ต้องการให้ แสดง   ถอยหลัง คือ แสดง 100,98,96,94,...,8,6,4,2 จะทำได้อย่างไร

ดูตัวอย่าง การแสดงเฉพาะเลขคู่(ถอยหลัง)ที่อยู่ในช่วงตั้งแต่ 1 ถึง   100
 
#include
   main()
   {
   int   i   ;  
   for(i=100;i  >=1;i=i-2){
          printf(  "Odd number is   %dn",i);       
   }  
   }
   นั่นคือในบรรทัด for เรากำหนดค่าเริ่มต้นเป็น 100   ที่สำคัญคือเงื่อนไขเดิมเรากำหนดเป็น น้อยกว่าเท่ากับ แต่ในที่นี้เรากำหนดเป็นว่า i   มากกว่าเท่า 1 loop จึงจะยังทำงานต่อ และที่สำคัญเช่นเดียวกันคือเราทำการลดค่า i   ไปทีละ 2 ครับ เท่านี้เราก็จะได้ ค่า 100,98,96,...,4,2 แล้วครับ   ขอให้ลองไล่โปรแกรมดูสักนิด แล้วก็จะเข้าใจโดยกระจ่างเองครับ

 
 
คำสั่ง while   loop
             มีอีกหนึ่งโครงสร้างที่มีลักษณะคล้ายกับ for loop   ที่อธิบายมาข้างต้น นั่นก็คือ while loop ก่อนอื่นต้องขอบอกถึง ความแตกต่าง   ที่เห็นได้ชัดเจนระหว่าง for loop กับ while loop เสียก่อน นั่นคือ เราจะเห็นได้ว่า   for loop นั้น เราจะมีการบอกถึง ค่าเริ่มต้น ค่าสิ้นสุด   ของตัววิ่ง(จากข้างต้นก็คือตัว i นั่นเอง) แต่ while loop   นั้นจะบอกแค่เงื่อนไขการจบเท่านั้น ซึ่งถ้าใน for loop นั้น เงื่อนไขการจบก็คือ   การที่ตัววิ่ง วิ่งถึงค่าสิ้นสุด ก็จะหลุดออกจาก loop for แต่ while loop   ก็มีลักษณะคล้ายกันแต่อาจจะไม่เหมือนกัน สักทีเดียว   ลองมาดูกัน

while ( เงื่อนไขที่ทำให้ยังต้องเข้าไปใน   loop ) {
                   statement   ;
 }
 เรามักจะแปลได้ว่า   "ขณะที่(.....เงื่อนไข......ยังเป็นจริงอยู่) ก็เข้าไปทำคำสั่งหลังเครื่องหมาย {   "

   
ต่อไปนี้จะขอสร้างตัวอย่างขยายข้อความข้างบนหน่อย   โดยเราจะสั่งให้มีการบวกเลขตั้งแต่ 1-100 เหมือนตัวอย่างใน for loop   นั่นแหละ(มันเป็นตัวอย่างเอาไว้หากิน!!!)
     #include
     main()
     {
                  int       i , ans;
                  i=1;              /* initial variable */
                    ans=0;
                  while ( i <= 100 ) {
                      ans = ans + i   ;
                      i=i+1;       /* increase variable   */
                  }
                 printf("answer is %d",ans);
     }

       
จากตัวอย่างนี้ สิ่งที่สำคัญที่สุด ก็คือ   การกำหนดค่าเริ่มต้นให้กับตัวแปร i , ans อันนี้สำคัญมากเราจะต้องกำหนดไว้เสมอ   หากเราไม่กำหนดไว้ตั้งแต่เริ่มต้น โปรแกรมจะไปหยิบค่าอะไรก็ไม่รู้จากใน memory   มาเก็บไว้ในตัวแปร i และ ans ซึ่งจะทำให้โปรแกรมของเราผิดพลาดทันที ส่วนใน while   loop นั้นอธิบายได้ง่ายๆ ว่า ขณะที่ i ยังน้อยกว่าหรือเท่ากับ 100 อยู่   ก็ให้ทำคำสั่งหลังเครื่องหมาย { นั่นก็คือ ans=ans+i และจุดที่สำคัญอีกจุดหนึ่ง   ไม่แพ้การ กำหนดค่าเริ่มต้นให้กับตัวแปร นั่นก็คือ บรรทัด i=i+1   ซึ่งเป็นการบอกว่าให้เพิ่มค่า i ไปทีละ 1 ในทุกๆรอบ หากขาดบรรทัดนี้ไป loop ของเรา   จะวิ่งไม่หยุดหรือที่เรียกกันว่า infinite loop นั่นเอง เพราะหากเราไม่เพิ่มค่า i   แล้ว ค่า i ตลอดโปรแกรมก็จะยังคงเท่ากับ 1เหมือนที่เรากำหนดไว้ตอนเริ่มต้น   ดังนั้นเมื่อ compiler มาตรวจดูเงื่อนไขของ while loop ก็พบว่า ยังเป็นจริงอยู่   นั่นก็คือ 1 ยังคงน้อยกว่าหรือเท่ากับ 100 อยู่วันยังค่ำ นั่นก็คือ loop   นี้จะวิ่งไปเรื่อยๆ ไม่มีวันหยุดนั่นเอง   ถึงตอนนี้ขอให้ลองเปรียบเทียบตัวอย่างนี้กับตัวอย่างที่เป็น for loop   ดูสิว่ามีอะไรแตกต่างกันบ้าง
         ่ก่อนจะสรุปอะไรไปมากกว่านี้ ต้องบอกเลยว่า ทั้ง   for loop และ while loop นั้นมีความคล้ายคลึงกันมากๆๆๆ   หรืออาจจะมองเป็นสิ่งเดียวกันก็ได้ หรืออาจจะมองเป็นคนละสิ่งก็ได้   แล้วแต่ว่าเราจะกำหนดให้มันทำงานอย่างไรมากกว่า เหมือนกันอย่างไร นั่นคือ ใน for   loop นั้นซึ่งมีโครงสร้างบรรทัดแรกดังนี้
         for(ตัวนับ= i; เงื่อนไขที่จะให้ยังทำงานอยู่ใน loop; การเพิ่มหรือการลดตัวนับ){
         เราจะพบว่าจะต้องมีการกำหนดค่าเริ่มต้นให้กับตัวนับหรือตัววิ่งนั่นเอง   ซึ่งพบว่าใน while loop ข้างต้นเราก็ต้องกำหนดค่าเริ่มต้นให้กับ i ตอนก่อนเข้า loop   เหมือนกัน และใน for loop ก็มีการกำหนดเงื่อนไขที่จะยังให้ทำงานอยู่ใน loop ซึ่งใน   while loop ก็มีเช่นเดียวกัน ตรงข้อความหลัง while และในส่วนสุดท้ายของ for loop   ซึ่งมีการกำหนดให้ เพิ่มตัวนับหรือลดตัวนับ ซึ่งก็ถือเป็นส่วนสำคัญของ while loop   เช่นเดียวกันนั่นคือ บรรทัด i=i+1 จากบรรทัดข้างต้นนั่นเอง   ต่อไปจะขอแปลงตัวอย่างทั้งหมดจาก for loop มาเป็น while loop ให้ดูกัน   แล้วลองเปรียบเทียบกันเองนะครับว่าเหมือนหรือแตกต่างกันอย่างไร
         
           ดูตัวอย่าง   การแสดงเฉพาะเลขคี่ที่อยู่ในช่วงตั้งแต่ 1 ถึง 100
           
#include
             main()
             {
                              int   i ;
                              i=1;
                              while(i<=100){
                                     printf("Odd number is   %dn",i);       
                                     i=i+2;
                              }
             }
             ดูตัวอย่าง   การแสดงเฉพาะเลขคู่ที่อยู่ในช่วงตั้งแต่ 1 ถึง 100
               
#include
                 main()
                 {
                                      int   i ;
                                      i=2;
                                      while(i<=100){
                                             printf("Odd number is   %dn",i);    
                                             i=i+2;    
                                      }
                 }
                 ดูตัวอย่าง   การแสดงเฉพาะเลขคู่(ถอยหลัง)ที่อยู่ในช่วงตั้งแต่ 1 ถึง   100
                   
#include
                     main()
                     {
                                              int   i   ;
                                              i=100;    
                                              while (i>=1){
                                                     printf("Odd number is   %dn",i);       
                                                     i=i-2;

                                                  }
                       }