คำสั่งต่างๆในภาษาซี


1.คำสั่ง if และ if-else
2.คำสั่ง switch
3.คำสั่งควบคุมแบบวนซ้ำ

1.คำสั่ง if และ if-else  การเลือกทำตามเงื่อนไข



           โครงสร้างแบบลำดับ (sequential structure) มีลักษณะการประมวลผลโปรแกรมจากคำสั่งแรกของฟังก์ชัน main() จนถึงคำสั่งสุดท้ายของฟังก์ชัน main() สังเกตได้จากตัวอย่างโปรแกรมในหัวข้อที่ผ่านมา นั่นคือ คำสั่งในลำดับที่ n+1 จะถูกประมวลหลังคำสั่งลำดับที่ n เสมอ
           นอกจากโครงสร้างแบบลำดับแล้ว ภาษาซียังมีโครงสร้างแบบอื่นๆ อีก คือ โครงสร้างแบบทางเลือก (selection structure) และโครงสร้างแบบวนซ้ำ (repetition structure)
          โดยโครงสร้างแบบทางเลือก ประกอบด้วย คำสั่ง if คำสั่ง if-else และคำสั่ง switch ส่วนโครงสร้างแบบวนซ้ำ ประกอบด้วย คำสั่ง for คำสั่ง while และ คำสั่ง do-while โครงสร้างทั้งสองแบบจะช่วยให้นักเขียนโปรแกรมสามารถเขียนโปรแกรมเพื่อแก้ปัญหาที่มีเงื่อนไขที่ซับซ้อนมากยิ่งขึ้น เมื่อเปรียบเทียบกับการใช้โครงสร้างแบบลำดับเพียงอย่างเดียว



         คำสั่ง if และ if-else 

 คำสั่ง if รูปแบบของคำสั่ง if เป็นดังนี้



              เงื่อนไขทางเลือก

              ที่เขียนอยู่ระหว่างเครื่องหมาย ( และ ) เป็นนิพจน์ใด ๆ ที่สามารถประเมินค่าได้

                     ในกรณีที่ เงื่อนไขทางเลือก มีค่าเป็น จริง และไม่เท่ากับ 0
              •จะประมวลผลคำสั่ง
                      ในกรณีที่ เงื่อนไขทางเลือก มีค่าเป็น เท็จ และเท่ากับ 0
              •จะไม่ประมวลผลคำสั่ง

          คำสั่ง  อาจเป็นคำสั่งอย่างง่าย หรือคำสั่งเชิงประกอบ ตามตัวอย่างที่ 4.1.1





                จากการรันครั้งที่ 1 ตัวแปร y (ในบรรทัดที่ 7) รับค่าจากแป้นพิมพ์ เท่ากับ 18 (ในบรรทัดที่ 10) นิพจน์เปรียบเทียบ y == TARGET (ในบรรทัดที่ 12) จะมีค่าเป็นเท็จ แล้วฟังก์ชัน printf( ) (ในบรรทัดที่ 13) จะไม่ได้ถูกประมวลผล แต่ไปประมวลผลต่อในคำสั่งถัดไป (ในบรรทัดที่ 14) และจนจบโปรแกรม
          จากการรันครั้งที่ 2 ตัวแปร y รับค่าจากแป้นพิมพ์ เท่ากับ 25 ทำให้นิพจน์เปรียบเทียบ y == TARGET มีค่าเป็นจริง แล้วฟังก์ชัน printf( ) (ในบรรทัดที่ 13) ถูกประมวลผล แล้วประมวลผลต่อในคำสั่งถัดไปจนจบโปรแกรม

           คำสั่ง if-else

          รูปแบบของคำสั่ง if – else เป็นดังนี



                จากผลลัพธ์ตัวอย่างที่ 4.1.2 ตัวแปร y รับค่าจากแป้นพิมพ์ เท่ากับ 18 นิพจน์เปรียบเทียบ y == TARGET จะมีค่าเป็นเท็จ จะไม่ประมวลผลฟังก์ชัน printf( ) ในบรรทัดที่ 13 แต่ฟังก์ชัน printf( ) ในบรรทัดที่ 15 จะถูกประมวลผลแทน แล้วไปประมวลผลต่อในคำสั่งถัดไป (ในบรรทัดที่ 16) จนจบโปรแกรม
          จะเห็นได้ว่าคำสั่ง if และคำสั่ง if – else ทำให้เกิดทางเลือกของการประมวลผลภายใต้เงื่อนไขที่กำหนดโดยนิพจน์ที่อยู่ต่อจาก if ในคำสั่ง if ถ้าเงื่อนไขเป็นเท็จคำสั่งที่อยู่หลังเงื่อนไขจะไม่ถูกประมวลผล สำหรับในกรณีคำสั่ง if – else จะมีเพียงคำสั่งหนึ่งคำสั่งใดเท่านั้นที่จะถูกประมวลผล ซึ่งจะประมวลผลคำสั่งใดขึ้นอยู่กับค่าความจริงของเงื่อนไข


            คำสั่ง if-else เชิงซ้อน (Nested if)

          คำสั่ง if – else เชิงซ้อน คือ คำสั่ง if – else ที่มีคำสั่ง if – else ซ้อนอยู่ในส่วน else ประโยคเงื่อนไขในลักษณะนี้ อาจสร้างความสับสนแก่ผู้เขียนโปรแกรมได้ จึงต้องมีความระมัดระวัง

          รูปแบบของคำสั่ง if – else เชิงซ้อน เป็นดังนี้



                คำสั่ง if – else เชิงซ้อนเป็นรูปแบบการทำงานแบบหลายทางเลือก โดยจะมีคำสั่งเพียงเดียวเท่านั้นที่จะถูกเลือกให้ประมวลผล ขึ้นอยู่กับว่า เงื่อนไขทางเลือก ใดเป็นจริง และในกรณีที่ไม่มีเงื่อนไขทางเลือก ใดเป็นจริงเลย คำสั่งn จะถูกประมวลผล
          คำสั่ง1, คำสั่ง2, คำสั่ง3, …, คำสั่งn อาจเป็นคำสั่งอย่างง่ายหรือคำสั่งเชิงประกอบ




พิจารณาค่าของตัวแปร y สำหรับโปรแกรมข้างต้นเป็น 3 กรณี ดังนี้
             กรณีที่ 1 ถ้า y มีค่าเท่ากับ 100 จะได้ว่านิพจน์ y >TARGET มีค่าเป็น จริง แล้วฟังก์ชัน printf( ) ในบรรทัดที่ 13 จะถูกประมวลผล
                กรณีที่ 2 ถ้า y มีค่าเท่ากับ 9 จะได้ว่านิพจน์ y >TARGET มีค่าเป็น เท็จ และนิพจน์ y < TARGET มีค่าเป็น จริง แล้ว ฟังก์ชัน printf( ) ในบรรทัดที่ 15 จะถูกประมวลผล
                กรณีที่ 3 ถ้า y มีค่าเท่ากับ 25 จะได้ว่านิพจน์ y > TARGET และนิพจน์ y < TARGET มีค่าเป็น เท็จ ทั้งคู่ ดังนั้น ฟังก์ชัน printf( ) ในบรรทัดที่ 17 จะถูกประมวลผล
          พิจารณาคำสั่ง if ในรูปแบบต่อไปนี้ ซึ่งมีคำสั่ง if – else ซ้อนอยู่ด้านใน


ถ้า เงื่อนไขทางเลือก1 และ เงื่อนไขทางเลือก2 มีค่า จริง แล้วโปรแกรมจะประมวลผล คำสั่ง1 ก่อนที่จะประมวลผล คำสั่ง3
          ถ้า เงื่อนไขทางเลือก1 มีค่า จริง ขณะที่ เงื่อนไขทางเลือก2 มีค่าเท็จ แล้วโปรแกรมจะประมวลผล คำสั่ง2 ก่อนที่จะประมวลผล คำสั่ง3
          และถ้า เงื่อนไขทางเลือก1 มีค่า เท็จ แล้วโปรแกรมจะประมวลผล คำสั่ง3 เพียงคำสั่งเดียวเท่านั้น
          นั่นคือ ในคำสั่ง if – else ( หรือคำสั่ง if – else เชิงซ้อน ) else จะถูกจับคู่กับ if ก่อนหน้าที่อยู่ใกล้ที่สุดเสมอ ซึ่งในที่นี้คือ if ( เงื่อนไขทางเลือก2 )
          ดังนั้น ในกรณีที่ต้องการให้ คำสั่ง2 ถูกประมวลผล เงื่อนไขทางเลือก1 มีค่า เท็จ ก่อนที่จะประมวลผล คำสั่ง3 จะต้องเพิ่มเครื่องหมาย { และ } ตามรูปแบบด้านล่าง และในที่นี้ if ( เงื่อนไขทางเลือก2 ) จัดเป็นคำสั่ง if ที่ซ้อนอยู่ในคำสั่ง if – else ของ if ( เงื่อนไขทางเลือก1 )



2.คำสั่ง switch
          รูปแบบของคำสั่ง switch เป็นดังนี้



นิพจน์ และ ค่าคงที่ ของนิพจน์ในแต่ละ case จะต้องเป็นชนิดจำนวนเต็ม และมีค่าไม่ซ้ำกัน
          ถ้า นิพจน์ มีค่าเท่ากับ ค่าคงที่1 แล้ว คำสั่ง1 จะถูกประมวลผลเป็นลำดับแรก ตามด้วย คำสั่ง2 จนกระทั่งถึง คำสั่ง ของ default ตามลำดับ
          ในกรณีที่ นิพจน์ มีค่าเท่ากับ ค่าคงที่2 การประมวลผลจะเริ่มต้นที่ คำสั่ง2 จนกระทั่งถึง คำสั่งของ default ตามลำดับ
          คำสั่ง switch อาจไม่มีกรณี default ได้แต่ในกรณีที่มี default และ นิพจน์ มีค่าไม่ตรงกับค่าคงที่ ใดๆ เลย แล้ว คำสั่ง ของกรณี default จะเป็นเพียงคำสั่งเดียวที่ถูกประมวลผล
          และในกรณีที่ไม่มี default และ นิพจน์ มีค่าไม่ตรงกับ ค่าคงที่ ใดๆจะไม่มีคำสั่งใดเลยที่ถูกประมวลผล




          ผลลัพธ์ข้างต้นเป็นผลจากการป้อนอักขระ 5 ให้โปรแกรม นั่น คือ ในกรณีที่อักขระที่รับค่าเข้ามามีค่าเป็น 1 – 9 โปรแกรมจะประมวลผลฟังก์ชัน printf() ของ case ที่ตรงกันและตรงกัน และน้อยกว่าจนครบทุกกรณี และในกรณีที่อักขระที่รับเข้ามาเป็นอักขระอื่น ๆ โปรแกรมจะประมวลผลฟังก์ชัน printf() ในกรณี default เพียงเท่านั้น
          ในกรณีที่ต้องการให้คำสั่งของ case ใด case หนึ่งเท่านั้นถูกประมวลผล นักเขียนโปรแกรมจะต้องเพิ่มคำสั่ง break เป็นคำสั่งสุดท้ายในแต่ละ case
คำสั่ง break
          คำสั่ง break ใช้สำหรับควบคุมการกระทำการ โดยบังคับให้หยุดประมวลผล ใช้ควบคู่กับคำสั่ง switch เพื่อป้องกันไม่ให้ประมวลผลข้อความคำสั่งอื่นที่ตามมาภายในคำสั่ง switch




3.คำสั่งควบคุมแบบวนซ้ำ




คำสั่งควบคุมแบบวนซ้ำ


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

                        โครงสร้างควบคุมแบบวนซ้ำ (repetition control structure) ประกอบด้วย

                                                                คำสั่ง for
                                                                คำสั่ง while
                                                                คำสั่ง do-while

          คำสั่ง for เป็นคำสั่งที่สั่งให้ประมวลผลคำสั่ง หรือชุดคำสั่ง วนซ้ำได้หลายรอบ โดยต้องกำหนดจำนวนรอบให้การวนซ้ำที่แน่นอน
          รูปแบบของคำสั่ง for เป็นดังนี้


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

         คำสั่งภายใต้คำสั่ง for อาจเป็นคำสั่งอย่างง่ายหรือคำสั่งเชิงประกอบ







             เงื่อนไขการวนซ้ำ เป็นนิพจน์ใดๆ ที่สามารถประเมินค่าได้ โดยจะต้องเขียนไว้ระหว่างเครื่องหมาย ( และ ) เสมอเช่นเดียวกับคำสั่ง if และคำสั่ง if – else

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



     หมายเหตุ
  หมายถึง ให้กดปุ่ม Enter บนแป้นพิมพ์
^z   หมายถึง ให้กดปุ่ม Ctrl - z บนแป้นพิมพ์
          โปรแกรม InOut1.c แสดงการใช้คำสั่งของภาษาซี 2 คำสั่ง getchar() และ putchar() เพื่อใช้รับข้อมูลนำเข้าและแสดงผลลัพธ์แทนการใช้คำสั่ง scanf() และ printf()

          คำสั่ง getchar() เป็นคำสั่งไม่มีอาร์กิวเมนต์ และจะรับอักขระ 1 ตัวจากแผงแป้นอักขระแล้ว ส่งกลับค่าจำนวนเต็มที่มีค่าในตารางรหัสแอสกีที่ตรงกับอักขระดังกล่าว

          ฟังก์ชัน putchar() มีอาร์กิวเมนต์ 1 ตัวเป็นชนิด int และแสดงอักขระในตารางรหัสแอสกีที่มีค่าตรงกับจำนวนเต็มดังกล่าวจอภาพ

          สำหรับ EOF เป็นค่าคงที่ที่นิยามอยู่ในแฟ้มส่วนหัวชื่อ stdio.h และใช้เป็นอักขระสำหรับตรวจสอบการสิ้นสุดการป้องกันข้อมูลซึ่งในที่นี้ คือการป้องกัน Ctrl - z

          จากโปรแกรม InOut1.c ตราบใดที่อักขระผู้ใช้ป้อนไม่ใช้อักขระสิ้นสุดการป้อนข้อมูลเงื่อนไข การวนซ้ำ iochar != EOF จะยังมีค่าเป็นจริง และแสดงผลค่าอักขระนั้นออกทางจอภาพก่อนที่จะวนรับอักขระตัวถัดไป และในรอบที่ผู้ใช้ป้อน Ctrl - z เงื่อนไขการวนซ้ำ iochar != EOF จะมีค่าเป็นเท็จ และคำสั่ง while จะสิ้นสุดการทำงาน

          ในกรณีที่ผู้ใช้ป้อน Ctrl-z ในครั้งแรก เงื่อนไขการวนซ้ำ iochar != EOF จะมีค่าเป็นเท็จและคำสั่ง while จะสิ้นสุดการทำงานในทันที โดยที่คำสั่งในบรรทัดที่ 11 และ 12 ไม่ถูกประมวลผลเลย



     คำสั่ง จะถูกประมวลผลโดยไม่มีเงื่อนไขใด ๆ ในรอบแรก จากนั้นเงื่อนไขการวนซ้ำ จะถูกตรวจสอบค่า และคำสั่ง จะถูกประมวลผลซ้ำอีกทุกครั้งที่ เงื่อนไขการวนซ้ำ มีค่าเป็น จริง และในครั้งแรกที่ เงื่อนไขการวนซ้ำ มีค่าเป็น เท็จ คำสั่ง do-while จึงจะสิ้นสุดลง


          คำสั่ง ภายใต้คำสั่ง do-while อาจเป็นคำสั่งอย่างง่ายหรือคำสั่งเชิงประกอบ

   ตัวอย่างที่ 4.2.3 โปรแกรมเลขยกกำลัง










ขอบคุณข้อมูลจาก
บทเรียนออนไลน์ การเขียนโปรแกรมภาษา C
นางสาว  กวีณา  รอดคง
ที่อยู่เว็บ http://thecprogrammingproject.weebly.com/


Krubella Wassana Buathong