Objective-C Programming Chapter 3 (Part 2)

 

Chapter 3

 

Loop

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

 

 

การคำนวนผลบวกของ 1 ถึง 10 คงจะไม่ได้เกิดปัญหาอะไรเพราะเราสามารถเขียนการคำนวนด้วยสมการดังกล่าวได้ แต่ถ้าหากเราต้องหาค่าผลบวกตั้งแต่ 1 ถึง 10000 ยอมเกิดปัญหาแน่นอน เพราะการเขียนสมการ 1+2+3 … + 10000 เป็นเรื่องที่เสียเวลาหรือแทบจะเรียกว่าเป็นไปไม่ได้ และมีความผิดพลาดสูงมาก แต่นับว่าเป็นโชคดีที่เรามีวิธีที่ง่ายกว่านั้น เมื่อพิจาณณาจากสมการจะเห็นว่า การบวกเลขตั้งแต่ 1 ถึง 1000 นั้นมีการทำงานที่ซ้ำกันคือ การบวก ถ้าหากเราสามารถกำหนดให้โปรแกรมทำการบวกเลขตั้งแต่ 1 ถึง 1000 ได้ด้วยตัวเองย่อมดีกว่าแน่นอน ในภาษา Objective-C คำสั่งให้ทำซ้ำทั้งหมดทั้งหมด 4 แบบด้วยกันคือ

‣ for loop

‣ while loop

‣ do while loop

‣ for each

แต่ในบทนี้จะกล่าวถึงเพียงแค่ 3 แบบคือ for loop , while loop , do while loop

 

For loop

การใช้ loop แบบนี้นิยมใช้กับการทำงานที่สามารถระบุจำนวนครั้งของการทำซ้ำเป็นตัวเลข (Counter-controlled repetition) ได้เช่น 19 ครั้ง หรือไม่เกิน 15 ครั้งเป็นต้น การใช้คำสั่ง for loop นั้นมีส่วนประกอบอยู่ด้วยกันสามส่วนคือ ค่าเริ่มต้น อย่างที่สองคือเงื่อนไข และสุดท้ายคำสั่งหลังจากจบรอบ คำสั่ง for loop นี้จะทำงานไปเรื่อยๆจนกว่าเงื่อนไขจะเป็นเท็จ โดยทั่วไปคำสั่ง loop มีรูปแบบการใช้งานดังนี้

 

for ( initial expression ; loop condition ; loop expression )

program statement

* initial expression คือค่าตั้งต้นของเงื่อนไขส่วน loop condition คือเงื่อนไขโปรแกรมซึ่งจะทำงานก็ต่อเมื่อเงื่อนไขเป็นจริง และสุดท้าย loop expression คือคำสั่งหลังจากการ loop สิ้นสุดลงในแต่ละรอบ

 

เมื่อลูปทำงานจะมีการทำงานเป็นขั้นตอนต่างๆ 5 ขั้นตอน

1. อันดับแรกส่วนของ initial expression จะเริ่มทำงานก่อน โดยทั่วๆไปส่วนนี้ไว้สำหรับตั้งค่าต่างๆให้กับตัวแปร อย่างเช่น การกำหนดค่าให้กับตัวแปรที่ไว้สำหรับการนับรอบของ loop

2. ตรวจสอบเงื่อนไขของ loop condition ถ้าเงื่อนไขนี้่เป็นเท็จ การทำงานของ loop นี้จะจบลง แต่ถ้าเงื่อนไขเป็นจริงโปรแกรมจะเริ่มทำงานส่วนภายในของ loop

3. คำสั่งภายใน loop ทำงาน

4. เมื่อทำงานภายใน loop เสร็จ ส่วน loop expression จะทำงานต่อ โดยปกติส่วนนี้จะไว้ใช้สำหรับการเปลี่ยนค่าตัวแปรที่ไว้สำหรับการนับรอบ ส่วนมากจะเป็นการลดค่าลงทีละ 1 หรือเพ่ิมค่าทีละ 1

5. กลับไปยังข้อ 2

ลองดูโปรแกรมตัวอย่างการใช้งานจะได้เข้าใจง่ายขึ้น สมมติว่าเราเขียนโปรมแกรมง่ายเช่นต้องการให้แสดงคำว่า Hello Objective-C ทาง Console ซ้ำเดิมสัก 5 รอบก็จะเขียนได้ว่า

Program 3.17

Program 3.17 Output

Hello

Hello

Hello

Hello

 

Loop จะเริ่มส่วน int counter = 0 ก่อนเป็นอันดับแรก ค่าของตัวแปร counter จะถูกตั้งค่าให้เป็น 0 เพื่อเป็นค่าเริ่มต้น หลังจากนั้นโปรแกรมจะงานในส่วนของการตรวจสอบเงื่อนไข ซึ่งเงื่อนไขของลูปนี้คือ counter < 5 ถ้าเงื่อนไขนี้เป็นเท็จโปรแกรมส่วนของลูปนี้ก็จะจบการทำงาน แต่ถ้าเงื่อนไขเป็นจริงก็จะทำคำสั่ง NSLog(@”Hello”) เมื่อทำงานภายใน loop เสร็จ โปรแกรมจะทำคำสั่งสุดท้ายของ loop คือ counter++ แล้วก็จะวนกลับมาเปรียบเทียบเงื่อนไข counter < 5 อีกครั้ง โปรแกรมจะทำงานตามลำดับขึ้นตอนเช่นนี้ไปเรื่อยๆจนกว่าเงื่อนไขจะเป็นเท็จ เมื่อเขียนเป็นแผนภาพการทำงานของโปรแกรม 3.17 ก็จะมีลักษณะดังนี้

 


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

Program 3.18

Program 3.18 Output

Please input number: 10

Sum = 55

 

โปรแกรมตัวอย่างทั้งสองโปรแกรมที่ได้เขียนไปจะเห็นว่าการใช้ loop ลดการเขียนโค้ดซ้ำซ้อนลงได้และมีประโยชน์มาก เมื่อดูโค้ดของโปรแกรม 3.18 และโปรแกรม 3.17 ส่วนของ loop expression มักจะใช้เครื่องหมาย incremental และ decremental ก็พอจะเดาได้ว่าเครื่องหมาย ++ และ — นี้ ได้ออกแบบมาเพื่อการใช้งานลักษณะนี้แน่นอน สำหรับผู้ที่ยังไม่คุ้นเคยกับการใช้เครื่องหมายแบบนี้จะใช้ counter = counter + 1 แทนก็ได้

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

Program 3.19

Program 3.19 Output

Hello

Objective-C

Hello

Objective-C

Hello

Objective-C

Hello

Objective-C

 

การใช้ Loop ควรระวังการเปรียบเทียบตัวแปรทศนิยมในเงื่อนไข


initial expression; loop condition ; loop expression

ถึงแม้ for loop ประกอบไปด้วย 3 ส่วนด้วยกันคือ initial expression , loop condition และ loop expression แต่การใช้ for loop ไม่จำเป็นต้องมีทุกๆส่วนก็ได้ เช่น ถ้าแก้ไขโปรแกรม 3.18 โดยไม่ต้องมีส่วนของ initial expression และ loop expression ก็จะมีโค้ดจะเป็นดังนี้

Program 3.20

Program 3.20 Output

Please input number: 10

Sum = 55

 

จากโค้ดของโปรแกรม 3.20 ไม่ได้เขียน initial expression และได้ย้าย number– จาก loop expression มาไว้ภายในส่วนของ loop พร้อมเปลี่ยนวิธีคิดคำนวน จะเห็นได้ว่าโปรแกรมทำงานได้เหมือนแต่มีวิธีเขียนต่างกัน ดูอีกสักหนึ่งตัวอย่างที่นอกจากไม่เขียน loop expression และ init expression แล้ว โค้ดของโปรแกรมไม่เขียนแม้กระทั่ง loop condition ปล่อยให้เป็น loop ว่างก็ยังได้

Program 3.21

Program 3.21 Output

Please input number: 20

Sum = 210

โปรแกรม 3.21 ไม่มีส่วนของ loop condition แต่เราได้เพิ่มโค้ด if( number <= 0 ) break; เข้ามาแทนการใช้ loop condition ซึ่งก็สามารถทำงานได้เช่นกัน ไม่ว่าจะเป็นโปรแกรมที่ 3.18 , 3.20 หรือ 3.21 โปรแกรมทำงานก็ทำงานได้เหมือนกัน แต่เขียนคนละแบบกัน อย่างไรก็ดีการเขียนให้ครบทั้งสามอย่างนั้นโค้ดจะดูง่ายและไม่ซับซ้อน

ในกรณีที่เราต้องการให้ค่าตัวแปรใน init expression หรือ loop expression มากกว่าหนึ่งอย่าง ก็สามารถทำได้ ด้วยการใช้เครื่องหมาย , (commar) ดังเช่นตัวอย่างต่อไปนี้

Program 3.22

Program 3.22 Output

Please input number: 5

5 x 1 = 5

4 x 2 = 8

3 x 3 = 9

2 x 4 = 8

1 x 5 = 5

 

ส่ิงที่ต้องระวังมากที่สุดของการใช้ for รวมถึง loop อื่นๆคือ loop condition ต้อง “ไม่เป็นจริงตลอด” ไม่เช่นนั้นจะเกิด infinite loop หรือการทำงานไม่สิ้นสุด เช่นตัวอย่าง โค้ดต่อไปนี้

 

 

จากโค้ดดังกล่าวจะหากคิดดีๆ จะเห็นว่าค่า i ไม่มีทางเกิน 5 แน่นอน เพราะค่า i จะลดลงเรื่อยๆ เงื่อนไขนี้ก็จะเป็นจริงตลอด ดังนั้นแล้วโค้ดดังกล่าวจะเกิด inifinite loop โปรแกรมจะทำงานไปเรื่อยๆ ไม่หยุด

 

Nested loop

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

จากตารางจะเห็นว่า ค่าของตัวตั้งได้เพิ่มขึ้นตามลำดับของคอลัมน์เมื่อพิจารณาก็จะเห็นว่าก็คือลูปหนึ่งลูป ( A ) และถ้าดูในแต่ละคอลัมน์ค่าของตัวคูณก็จะเปลี่ยนไปตามแต่ละแถวซึ่งก็คือลูปอีกหนึ่งลูป ( B ) เมื่อนำลูปทั้งสองมาพิจาณาก็จะเห็นว่าลูปสองลูปนี้ทับซ้อนกันอยู่ดังรูป

( รูป 5 )

โค้ดของโปรแกรมแสดงสูตรคูณ มีดังตัวอย่าง

Program 3.23

Program 3.23 Output

2 x 2 = 4

2 x 3 = 6

2 x 4 = 8

2 x 5 = 10

2 x 6 = 12

2 x 7 = 14

———–

3 x 2 = 6

3 x 3 = 9

3 x 4 = 12

3 x 5 = 15

3 x 6 = 18

3 x 7 = 21

———–

4 x 2 = 8

4 x 3 = 12

4 x 4 = 16

4 x 5 = 20

4 x 6 = 24

4 x 7 = 28

———–

5 x 2 = 10

5 x 3 = 15

5 x 4 = 20

5 x 5 = 25

5 x 6 = 30

5 x 7 = 35

———–
While loop

คำสั่ง while loop จะลักษณะต่างออกไปจากการใช้ for loop ที่ลักษณะเป็นการนับจำนวนรอบที่แน่นอน การทำงานของ while loop จะทำงานไปเรื่อยๆจนกว่าเงื่อนไขจะไม่เป็นจริง ( Sentinel-controlled repetation ) เหมาะกับการทำงานที่ไม่อาจจะคาดเดาได้ว่ามีจำนวนรอบเป็นเท่าไหร่ เช่น ให้โปรแกรมอ่านค่าตัวเลขจากไฟล์และให้ทำงานไปเรื่อยๆจนกว่าค่าจะสิ้นสุดไฟล์เป็นต้น การใช้ while loop นั้นมีรูปแบบการใช้งานดังนี้

 

while ( loop condition)

program statement

* จะทำงานก็ต่อเมื่อ loop condition เป็นจริง

 

 

เขียนโปรแกรมสักโปรแกรมเพื่อทดลองการใช้งานของ while loop โดยโปรแกรมแรกที่จะเขียนคือ โปรแกรมที่หาที่มากที่สุดจากตัวเลขที่ผู้ใช้ป้อนเข้ามาทาง Console โปรแกรมจะหยุดรับค่าก็ต่อเมื่อผู้ใช้งานป้อนค่า -1

 

Program 3.24

Program 3.24 Output

Please input number: 42

Please input number: 25

Please input number: 203

Please input number: -1

 

Maximum number is 203

 

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

ถ้าเขียนแผนภาพการทำงานของโปรแกรมดังกล่าวก็จะมีการทำงานดังนี้

 

 

( รูป 6 )

เราสามารถเขียนโค้ด while loop ให้ทำงานแบบ Counter-controlled repetition เหมือนการใช้ for loop ได้เช่นกัน เช่น หากแก้ไขโปรแกรม 3.17 ให้เปลี่ยนจากการใช้ for loop เป็น while loop โปรแกรมก็จะมีลักษณะดังกล่าว

Program 3.25

Program 3.25 Output

Hello

Hello

Hello

Hello

Hello

 

โปรแกรม 3.25 มีความคล้ายกันกับของโปรแกรม 3.17 เป็นอย่างมากสามารถแทน while ( i < 5 ) ด้วยคำสั่ง for ( ; i < 5 ; ) ได้เลย โดยที่โปรแกรมยังทำงานเหมือนเช่นเดิม

 

Do while loop

การทำงานของ do while มีลักษณะการทำงานคล้ายกับการใช้ while loop คือจะจะทำงานไปเรื่อยๆจนกว่าเงื่อนไขจะเป็นเท็จ แต่การทำงานของลูปแบบนี้มีความแตกต่างกับ while loop ตรงที่ do while loop จะทำงานส่วนภายในลูปก่อนโดยไม่สนใจว่าเงื่อนไขจะเป็นจริงหรือเท็จ แล้วถึงจะตรวจสอบเงื่อนไขในภายหลัง ส่วน while loop จะตรวจสอบเงื่อนไขตั้งก่อนถ้าไม่ตรงตามเงื่อนไขก็จะไม่ทำคำสั่งภายในลูป ดังนั้นแล้วการใช้ do while จะเป็นการรับประกันว่าโค้ดในส่วนของภายใน loop จะทำงานอย่างน้อยหนึ่งครั้ง การใช้ do while มีรูปแบบดังนี้

 

do

program statement

while ( loop condition);

* จะทำงานก็ต่อเมื่อ loop condition เป็นจริง

 

 

โปรแกรมที่เราจะเขียนเพื่อทดลองการใช้งาน do while นี้เป็นโปรแกรมที่มีการทำงานอย่างง่ายๆคือรับค่าตัวเลขจากผู้ใช้และให้แสดงคำว่า Hello ทาง Console ตามจำนวนตัวเลขนั้น

Program 3.26

 

Program 3.26 Output

Please input number: 3

Hello

Hello

Hello

 

Program 3.26 Output ( 2 )

Please input number: 0

Hello

 

จากผลลัพธ์ของโปรแกรม 3.26 ในรอบแรกป้อนตัวเลข 3 โปรแกรมก็ได้แสดงคำว่า Hello ทั้งหมด 3 รอบ แต่เมื่อป้อนค่าตัวเลขเป็นค่า 0 ซึ่งไม่ตรงตามเงื่อนไข แต่ก็ยังแสดง Hello อย่างน้อย 1 ครั้ง นั่นก็เพราะว่า do while loop ทำงานก่อนแล้วถึงตรวจสอบเงื่อนไขทีหลังนั่นเอง


Break & Continue

สองคำสั่งนี้เป็นคำสั่งในการเปลี่ยนขึ้นตอนการทำงานของ loop เราเคยใช้คำสั่ง break มาแล้วก่อนหน้านี้ในเรื่องของการใช้ switch ซึ่งเป็นการให้หยุดทำงานเมื่อคำสั่งภายใน case นั้นจบลงเพื่อไม่ให้ไปทำงานใน case อื่นต่อไป แต่ถ้าเราใช้คำสั่ง break ใน for , do , do while จะเป็นการหยุดการทำงานของ loop นั้น เช่นตัวอย่างโปรแกรมต่อไปนี้

Program 3.27

Program 3.27 Output

Hello 1

Hello 2

Hello 3

 

จากผลลัพธ์ของโปรแกรม 3.27 แสดงให้เห็นว่าโปรแกรมทำงานไปได้ทั้งหมด 3 รอบด้วยกัน และเมื่อโปรแกรมเข้าสู่การทำงานรอบที่สี่ค่าของตัวแปร conter มีค่าเท่ากับ 4 โปรแกรมก็หยุดทำงาน ลองดูอีกสักตัวอย่าง

Program 3.28

 

Program 3.28 Output

x = 1 , y = 1

x = 1 , y = 2

x = 2 , y = 1

x = 2 , y = 2

x = 3 , y = 1

x = 3 , y = 2

x = 4 , y = 1

x = 4 , y = 2

 

โปรแกรม 3.28 จะเห็นว่าคำสั่ง break อยู่ใน Inner loop และเมื่อคำสั่ง break ทำงานโปรแกรมจะหยุดการทำงานของ Inner loop เท่านั้น ไม่ได้หยุดส่วนของ Main loop

 

ส่วนคำสั่ง continue เมื่อใช้ใน do while , while จะเป็นคำสั่งในการข้ามการของโค้ดในส่วนที่เหลือภายใน loop นั้นๆ ในส่วนของ for loop โปรแกรมก็จะข้ามทำงานของโค้ดในส่วนที่เหลือเหมือนกัน แต่โปรแกรมจะยังทำส่วน loop expression

Program 3.29

Program 3.29 Output

Hello 1

Hello 2

Hello 3

Hello 5

 

ผลลัพธ์ของโปรแกรมแสดงให้เห็นว่าเมื่อค่า counter เป็น 4 โปรแกรมจะข้ามการทำงานในส่วนที่เหลือของ loop นั่นคือคำสั่ง NSLog ดังนั้นโปรแกรม 3.28 จึงมีผลลัพธ์ดังกล่าว

 

ในบทนี้เราได้ใช้ if else switch และ loop ต่างๆ ซึ่งเป็นพื้นฐานของโปรแกรม อยากให้ลองทำความเข้าใจการใช้งานอีกสักรอบ และลองทำแบบทดสอบดูครับ และ่ในบทหน้าเราจะได้ใช้ส่วนที่ภาษา Objective-C ได้เพิ่มเข้า ซึ่งเป็นแกนหลักของหนังสือเล่มนี้กันเสียที

โหลด PDF ไปอ่านได้ครับ
Objective-C Chapter 3

4 thoughts on “Objective-C Programming Chapter 3 (Part 2)”

  1. ขอบคุณครับ ผมขอโหลด pdf ไปปริ้นท์ด้วยนะครับ

  2. Chapter 3 Part 1, 2 ไม่มี PDF ให้หรอครับ
    กำลังอ่านต่อเนื่องเลยครับ ขอบคุณสำหรับความรู้ครับ

Leave a Reply