Objective-C Programming Chapter 3 (Part 1)

Chapter 3

If else , Switch , Loop

ในชีวิตประจำวันของเราไม่ว่าจะทำอะไรก็มีการตัดสินใจและมีเงื่อนไขต่างๆเข้ามาเกี่ยวข้องแทบทั้งสิ้น เช่นถ้าวันนี้อากาศดีรถไม่ติดจะไปดูหนัง แต่ถ้าฝนตกหรือรถติดมากก็อาจจะไม่ไป โปรแกรมก็เช่นเดียวกันทุกโปรแกรมล้วนแล้วแต่มีเงื่อนไขและทางเลือกทั้งสิ้นเช่นกดเลือกเมนูต่างๆสิ่งเหล่านี้ก็ล้วนแต่ต้องเกี่ยวข้องกับเงื่อนไขและการติดสินใจ การเขียนโปรแกรมด้วยภาษา Objective-C มีรูปแบบการใช้เงื่อนใขและทางเลือกอยู่ทั้งหมด 3 แบบด้วยกันคือ if statement , switch statement และ loop statement

 

If statement

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

if ( expression )

statement

* ถ้าเงื่อนไข ( expression ) เป็นจริง ก็จะทำคำสั่งที่กำหนด ( statement )

 

 

ลองคิดกันเล่นๆว่าถ้าหากนำคำสั่ง if มาใช้กับเรื่องที่พบได้โดยทั่วไปในชีวิตประจำวัน เช่น ถ้าวันนี้อากาศสดชื่นจะไปเตะฟุตบอลจะเขียนให้เป็นภาษาโปรแกรมได้อย่างไร ? โค้ดของโปรแกรมอาจจะเขียนออกมาได้ลักษณะแบบนี้

 

 

จากโค้ดตัวอย่าง ถ้าเงื่อนไขอากาศสดชื่นเป็น “จริง” ถึงจะไปแตะฟุตบอล แต่ถ้าเป็น “เท็จ” เช่นเกิดฝนตกก็ไม่ได้ไปเตะฟุตบอล ถ้าเขียนเป็นแผนภาพก็จะได้ว่า

( รูป 1 )

การเขียนเงื่อนไขของภาษา Objective-C จะใช้เครื่องหมาย comparison operator เพื่อใช้ในการสร้างเงื่อนไขต่างๆตามตารางด้านล่าง เราเคยได้เห็นตารางการใช้เครื่องหมายแบบนี้ในบทที่แล้ว

 

สัญลักษณ์

ความหมาย

ตัวอย่าง

<

น้อยกว่า

x < 20

>

มากกว่า

y < z

<=

น้อยกว่าหรือเท่ากับ

a <= MAX

>=

มากกว่าหรือเท่ากับ

b >= 0

==

เท่ากับ

x == 24

!=

ไม่เท่ากับ

isLower != YES

 
ลองเขียนโปรแกรมง่ายๆสักโปรแกรม เช่น โปรแกรมเปรียบเทียบคะแนนโดยมีเงืื่อนไขว่าถ้าคะแนนมากกว่า 50 ให้แสดงผลผ่านทาง Console ว่า Pass ก็อาจจะเขียนได้ดังนี้

Program 3.1

Program 3.1 Output

Pass

 

ถ้าลองเปลี่ยนค่า score จาก 61 ให้เป็นค่าที่น้อยกว่าเช่น 30 ก็จะเห็นว่าที่ Console จะไม่แสดงผลอะไรเลย เพราะไม่ตรงตามเงื่อนไขที่กำหนด ลองเขียนโปรแกรมอีกสักโปรแกรม โดยมีเงื่อนไขว่าถ้าคะแนนเท่ากับ 100 พอดีก็ให้โปรแกรมแสดงผลคำว่า Maximum Score

Program 3.2

Program 3.2 Output

Maximum Score

 

ข้อผิดพลาดที่พบได้บ่อยคือการใช้เครื่องหมายเปรียบเทียบคือ ใช้เครื่องหมายผิดเช่น =< ที่ถูกต้องคือ >= หรือเว้นวรรเครื่องหมายเช่น = =

 

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

Program 3.3

Program 3.3 Output

Maximum Score

 

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

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

Program 3.4

Program 3.4 Output

Great!!!

 

จากโปรแกรม 3.4 จะเห็นว่า คะแนนไม่ได้เท่ากับ 100 โปรแกรมจึงไม่แสดงผลคำว่า Maximum Score ซึ่งก็ตรงตามเงื่อนไข แต่โปรแกรมกลับมีการแสดงผลคำว่า Greate!!! ด้วย นั่นเป็นเพราะว่า NSLog(@”Great!!!”); ไม่ได้อยู่ในเงื่อนไขนั่นเอง ไม่ว่าเงื่อนไขจะผิดหรือถูกโปรแกรมก็จะยังแสดงผลอยู่ดี แต่ถ้าหากต้องการให้ทำมากกว่า 1 คำสั่ง เราสามารถแก้ไขปัญหานี้ได้โดยเขียนคำสั่งทั้งหมดให้อยู่ภายใน { } ดังตัวอย่าง

Program 3.5

Program 3.5 Output

Congratulation

Pass

 

if-else

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

 

 

จากโปรแกรมเราได้เขียนเงื่อนไข if ด้วยกันถึงสองเงื่อนไข คือถ้า pass มีค่าเท่ากับ YES ให้แสดงผลคำว่า YOU PASS และอีกหนึ่งเงื่อนไขคือ pass มีค่าเท่ากับ NO ให้เแสดงคำว่า YOU FAIL โค้ดดังกล่าวแสดงให้เราได้เห็นว่าเงื่อนไขสองอย่างนี้มีความสัมพันธ์กันคือถ้า pass เป็นจริงให้ทำอย่าง แต่ถ้าเป็นเท็จก็ให้ทำอีกอย่าง ในภาษา Objective-C สามารถใช้คำสั่ง else เพื่อมาเป็นทางเลือกอีกทางได้ โดยไม่ต้องเขียนเงื่อนไขซ้ำซ้อนเหมือนดังโค้ดโปรแกรมตัวอย่าง โดยมีรูปแบบการใช้งานดังนี้

 

if ( expression )

statement1

else

statement 2

* ถ้าเงื่อนไข ( expression ) เป็นจริง ก็จะทำstatement 1แต่ถ้า เป็นเท็จ จะทำ statement 2

 

 

จากโค้ดตัวอย่างที่ผ่านมา ถ้าหากใช้ else เข้ามาช่วยโค้ดของเราก็จะเป็นดังนี้

Program 3.6

 

Program 3.6 Output

YOU FAIL

 

โปรแกรมของเรามีเงื่อนไขเพียงเงื่อนไขเดียวคือ pass == YES ถ้าหากค่าไม่ตรงตามเงื่อนไข ก็จะไปทำคำสั่งที่ else แทน การเขียนเงื่อนไขที่มี else เข้ามาช่วย ทำให้โค้ดสั้นลง และอ่านได้เข้าใจมากขึ้น ถ้ายังไม่เข้าใจให้ดูภาพการทำงานเพื่อความเข้าใจมากขึ้น

( รูป 2 )

Keyboard Input

่โปรแกรมที่เขียนส่วนใหญ่เราได้เขียนกำหนดค่าของตัวแปรต่างไว้เรียบร้อยแล้ว ผู้อ่านอาจจะเริ่มเบื่ออยากจะลองรับข้อมูลทางแป้นพิมพ์ผ่านทาง Console เพื่อนำเข้ามาใช้งานในโปรแกรมดูบ้าง แต่การรับข้อมูลทางแป้นพิมพ์ในภาษา Objective-C ต้องใช้คำสั่งของ Cocoa Framework หรือถ้าเขียนโปรแกรมสำหรับ iOS ก็ต้องใช้ Cocoa Touch Framework ซึ่งจะเป็นการรับข้อมูลผ่าน Graphic User Interface และไม่ได้ครอบคลุมในหนังสือเล่มนี้ ดังนั้นแล้ววิธีที่ง่ายที่สุดก็คือใช้ฟังก์ชั่นของภาษา C นั่นคือ scanf ซึ่งจะมีรูปแบบการใช้งานดังนี้

 

scanf ( format string , variable);

* format string ใช้เหมือนกันกับ NSLog แต่ไม่ต้องมี @ นำหน้า เพราะเป็นฟังก์ชั่นของภาษา C

 

 

การใช้ scanf มีการใช้งานคล้ายๆกับกับการใช้ NSLog คือต้องมี format string เพื่อกำหนดชนิดของข้อมูล เช่นตัวอย่าง

Program 3.7

 

จากโค้ดคำสั่ง scanf จะเห็นตัวแปร score นั้นมีเครื่องหมาย & อยู่ด้านหน้าซึ่งหมายถึงตำแหน่งหน่วยความจำ (Address of ) การใช้งาน scanf ต้องมีเครื่องหมายนี้ด้านหน้าตัวแปรเสมอ เมื่อคอมไพล์โปรแกรมและให้โปรแกรมทำงานจะเห็น Console แสดงคำว่า Input score: แล้วจะหยุดรอรับข้อมูล ( เอาเมาส์ไปคลิกที่ Console Area จะเห็นเคอเซอร์กระพริบ แล้วลองพิมพ์เลขดู ) และถ้าดูที่ toolbar จะเห็นคำว่า Running ดังรูป

( รูป 3 หน้าต่าง Console )

ถ้าผู้ใช้ใส่เลขที่มีค่ามากกว่า 50 ก็จะแสดงผลว่า Congratulation และ Pass! ตามลำดับ แต่ถ้าใส่คะแนนน้อยกว่า 50 เช่น 44 โปรแกรมก็จะไม่แสดงผลอะไรออกมาเลย

Program 3.7 Output

Input score: 67

Congratulation

Pass

 

Program 3.7 Output ( 2 )

Input score: 44

 

Nested if

จากการใช้ if else แบบง่ายๆ เราสามารถที่จะสร้างเงื่อนไขที่ซับซ้อนเพิ่มมากขึ้นโดยการเขียน if else ซ้อนกันได้อีกด้วย ดังเช่นตัวอย่าง

 

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

 

if ( score >= 50 )

if ( score >= 80)

NSLog(@”GOOD SCORE”);

else

NSLog(@”YOU PASS”);

หรืออาจใช้ { } เพื่อให้เข้าใจได้ง่ายขึ้นได้ดังนี้

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

Program 3.8

Program 3.8 Output

Input score: 71

B

Program 3.8 Output ( 2 )

Input score: 84

A

 

โปรแกรมดังกล่าวเป็นโปรแกรมหาเกรดจากคะแนน โดยเรากำหนดเงื่อนไขแรกคือ ถ้าคะแนนมากกว่า 50 ถึงจะตรวจสอบเงื่อนไขต่อไปแต่ถ้าคะแนนน้อยกว่าก็สอบตก และหลังจากที่คะแนนผ่านเกิน 50 มาแล้วก็จะมีเงื่อนไขตรวจสอบคะแนนต่างๆอีกมากมาย เรียงทีละลำดับโดยเริ่มจากตรวจสอบว่าคะแนนมากกว่า 80 หรือไม่ และต่อมาก็จะเงื่อนไขพิจารณาคะแนนลดลงมาเรื่อยๆตามเงื่อนไขแต่ละเงื่อนไขที่ได้เขียนไว้ตามแต่ละลำดับ เมื่อเราได้ป้อนคะแนนเป็น 71 โปรแกรมก็จะแสดงเกรด B และเมื่อทำงานครั้งสองใส่ค่าคะแนนเข้าไปใหม่คือ 84 โปรแกรมก็จะแสดงผลเป็นเกรด A จะเห็นได้ว่าเราสามารถนำคำสั่ง if และ else มาสร้างเงื่อนไขต่างๆได้อย่างมากมายดังโค้ดตัวอย่างโปรแกรม แต่การเขียนโค้ดลักษณะแบบโปรแกรม 3.8 อาจจะดูซับซ้อนและเข้าใจยาก เราอาจจะเขียนใหม่เพื่อให้อ่านเข้าใจได้ง่ายขึ้น ดังเช่นตัวอย่าง


 

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

 

Compound if Statement

ลองพิจารณาโค้ดตัวอย่างต่อไปนี้

 

 

จากตัวอย่างเราจะเห็นว่า ถ้าหากต้องการแสดงให้ผลลัพธ์คือ A ต้องมีคะแนนเข้าเงื่อนไขทั้งสองเงื่อนไข นั่นคือคะแนนมากหรือเท่ากับ 80 และเงื่อนไขที่สองคะแนนต้องน้อยกว่าหรือเท่ากับ 100 ถ้าผิดเงื่อนไขใดเงื่อนไขหนึ่ง Console จะไม่แสดงผลลัพธ์อะไรเลย การเขียนเงื่อนไขมากกว่าหนึ่งเงื่อนไข นอกจากจะเขียนโปรแกรมแบบใช้ nested if แล้วเราสามารถที่จะรวมเงื่อนไข 2 เงื่อนไขเข้าไปด้วยกัน โดย

 

ใช้ && ( Logic Operator AND ) เพื่อทดสอบว่าเงื่อนไขทั้งสองต้องเป็นจริง ถึงจะถือว่าเป็นจริง

ใช้ || ( Logic Operator OR ) ตรวจสอบว่าถ้าเงื่อนไขใด เงื่อนไขหนึ่งเป็นจริง ก็ถือว่าเป็นจริง

 

จากโปรแกรม 3.8 เราอาจจะเขียนเงื่อนไขใหม่ดังเช่นตัวอย่างอย่าง

Program 3.9

 

Program 3.9 Output

Input score: 65

C

Program 3.9 Output ( 2 )

Input score: 42

FAIL

 

จากตัวอย่าง 3.9 ได้รวมเอาสองเงื่อนไขเข้าด้วยกัน เงื่อนไขแรกก็คือคะแนนต้องมากกว่าหรือเท่ากับ 80 และน้อยกว่าหรือเท่ากับ 100 ถึงจะได้เกรด A เงื่อนไขอื่นๆก็มีลักษณะเดียวกัน โปรแกรม 3.8 และ 3.9 มีเงื่อนไขที่ต่างกันแต่โปรแกรมทำงานได้เหมือนกันขึ้นอยู่กับว่าเราจะเขียนเงื่อนไขแบบไหน ซึ่งผู้อ่านก็สามารถเขียนเงื่อนแบบอื่นที่ให้ผลลัพธ์แบบนี้ได้เช่นกัน

Switch statement

ในบางครั้งเราต้องการเงื่อนไขที่มีหลายทางเลือก เช่นสมมติว่ามีเมนูให้กดหมายเลข 1 , 2 , 3 , 4 การใช้ if หรือ if-else นั้นก็อาจจะดูยุ่งยากหน่อยเพราะต้องเขียนหลายเงื่อนไข แต่มีอีกวิธีที่ทำให้เราเขียนเงื่อนไขต่างๆได้ง่ายขึ้น นั่นคือการใช้ switch เพื่อกำหนดเงื่อนไข การใช้ switch นั้นมีรูปแบบดังนี้

 

switch ( expression )

{

case integer constant expression1 :

statement

statement

break;

case integer constant expression 2 :

statement

statement

break;

case integer constant expression n :

statement

statement

break;

default:

statement

statement

}

* integer constant expression เป็นจำนวนเต็มเท่านั้น

 

 

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

Program 3.10

Program 3.10 Output

Input score: 5

Five

And more

 

Program 3.10 Output ( 2 )

Input score: 1

One

 

Program 3.10 Output ( 3 )

Input score: 8

None

 

โปรแกรมที่ 3.10 เมื่อผู้ใช้ป้อนค่าตัวเลขเข้ามาทาง Console ก็จะตรวจสอบค่าของ menu ว่าตรงตาม case ใด เช่นถ้าผู้ใช้ป้อนเลข 2 เข้ามาโปรแกรมก็จะแสดง Two เป็นต้น แต่ถ้าหากผู้ใช้ป้อนค่าที่ไม่ตรงกับ case ใดๆเลย โปรแกรมจะทำงานที่ default จากโปรแกรม 3.10 เราสามารถใช้ if ได้เช่นกันดังเช่นตัวอย่าง


Program 3.11

 

เปรียบเทียบโปรแกรม 3.10 และ 3.11 โปรแกรมทั้งสองทำงานเหมือนกันแต่ใช้คนละคำสั่งกัน การใช้ switch ควรจะใช้กับลักษณะการเปรียบเทียบที่เท่ากัน ไม่สามารถใช้การเปรียบเทียบแบบมากกว่าหรือน้อยกว่าได้

 

 

การใช้ switch นั้นมีข้อจำกัดอีกอย่างคือ integer constant expression นั้นจะต้องเป็นจำนวนเต็มเท่านั้น ไม่สามารถใช้ทศนิยมได้ เช่น

 

และข้อจำกัดสุดท้ายของการใช้ switch คือไม่สามารถใช้การเปรียบเทียบกับตัวแปรได้

 

 

การใช้ case ทั้งสามแบบข้างบนเป็นการใช้งานที่ไม่สามารถทำได้ หากจะทำการเปรียบเทียบแบบทศนิยมหรือแบบอื่นๆ ต้องใช้คำสั่ง if แทน และข้อควรระวังในการใช้ switch คือ ต้องหยุดคำสั่งด้วยการใช้ break ต่อท้ายเสมอ ถ้าหากไม่ใช้ โปรแกรมจะทำงานต่อจากบรรทัดนั้นโดยอัตโนมัติ ดังเช่นตัวอย่าง


Program 3.12

โปรแกรมที่ 3.12 ได้นำคำสั่ง break ออกจาก case 2 ถ้าผู้ใช้งานป้อนเลข 2 เข้ามาในโปรแกรมจะได้ผลลัพธ์ดังนี้

Program 3.12 Output

Input score: 2

Two

Three

 

จะเห็นได้ว่าโปรแกรมนั้นทำงานที่ case 2 แสดงผลลัพธ์เป็น Two แต่เน่ืองจากไม่มีคำสั่งหยุด โปรแกรมจึงทำงานต่อไปยัง case 3 จึงได้แสดงผลลัพธ์เป็น Three และหลังจากนั้นก็เจอคำสั่ง break โปรแกรมจึงหยุดทำงาน นั่นเอง

ฉะนั้นแล้วการใช้ switch ต้องระวังตรงจุดนี้ให้มาก เพราะเกิดข้อผิดพลาดได้ง่าย

 

Conditional Operator

ในภาษา Objective-C มีเครื่องหมายที่อาจจะดูแปลกประหลาดกว่าเครื่องหมายอื่นคือ conditional operator เพราะเป็นเครื่องหมายแทนการใช้ if เครื่องหมายลักษณะแบบนี้เรียกว่า ternary operator เพราะเป็นเครื่องหมายที่เกี่ยวข้องกับ 3 ส่วน การใช้ conditional operator มีรูปแบบดังนี้

(expression) ?(statement 1) : (statement 2)

* ถ้าเงื่อนไข ( expression ) เป็นจริง ก็จะทำstatement 1แต่ถ้า เป็นเท็จ จะทำ statement 2

 

ปกติแล้วการใช้ conditional opertator มักจะใช้กับการให้ค่าของตัวแปร เป็นต้นว่า ถ้าหากค่า y มีค่าติดลบก็จะให้ค่า x เป็น 0 แต่ถ้าค่า y มีค่าเป็นบวก ก็จะให้ x มีค่าเท่ากับค่า y เมื่อเขียนออกมาก็จะได้โค้ดดังตัวอย่าง

 

 

โปรแกรมจะเปรียบเทียบเงื่อนไข y > 0 ก่อนเป็นอันดับแรก ถ้าหากค่า y มีค่ามากกว่า 0 โปรแกรมให้ค่า x เท่ากับ y แต่ถ้าค่า y น้อยกว่า ก็จะทำ x เท่ากับ 0

จากโค้ดข้างบนเราสามารถเขียนเงื่อนไขดังกล่าวโดยการใช้ if ก็จะได้ว่า

 

 

ลองดูอีกสักตัวอย่าง สมมติว่าเราต้องการคำนวนว่าปี ค.ศ. ใดเป็นปีที่เดือน ก.พ. มี 29 วันสามารถคำนวนได้จาก เงื่อนไขต่อไปนี้ ปีนั้นต้องเป็นปีที่หารด้วย 4 ลงตัว แต่ต้องหารด้วย 100 ไม่ลงตัว หรือถ้าปีนั้นที่หารด้วย 400 ลงตัวก็ถือว่าปีนั้นเดือน ก.พ มี 29 วัน เมื่อเขียนออกมาเป็นโค้ดก็จะได้ว่า

 

 

จากโค้ดตัวอย่างหลายคนอาจจะอ่านโค้ดไม่เข้าใจยังมองไม่ออก ใส่วงเล็บเข้าเพื่อให้อ่านเข้าใจง่ายขึ้น

 

 

โค้ดบรรทัดดังกล่าวมีความหมายเดียวกับการเขียนโค้ดต่อไปนี้

 

 

เมื่อเขียนออกมาเป็นโปรแกรมโดยสมบูรณ์ก็ได้โค้ดดังนี้

Program 3.13


Program 3.13 Output

Input score: 2000

YES !!! Year 2000 is a leap year

 

Program 3.13 Output (2)

Input score: 2012

YES !!! Year 2012 is a leap year

 

Program 3.13 Output (3)

Input score: 1900

YES !!! Year 1900 is a leap year

 

 

Compare Floating Point

ก่อนจะจบเรื่องของการใช้ switch และ if ผมอยากให้ลองเดาผลลัพธ์ของโปรแกรมต่อไปนี้ก่อนครับว่าผลจะออกมาเป็นอย่างไร

Program 3.14

 

เชื่อว่าคงมีคนเดาผิดมากกว่าเดาถูกแน่ๆ เพราะโปรแกรมมีผลลัพธ์ดังนี้

Program 3.14 Output

But Different

 

ทำไมถึงไม่เท่ากัน ? เนื่องจากแปรทศนิยมในระบบคอมพิวเตอร์การเก็บค่าที่ไม่ลงตัวเช่น 0.1 เป็นเรื่องที่ไม่สามารถทำได้อย่างแม่นยำ เมื่อทำการบวกหลายๆครั้งตัวเลขทศนิยมในจุดหลังๆจะผิดพลาด หรือหากมีการคำนวนค่าของตัวแปรเป็นทศนิยมที่ไม่ลงตัว โปรแกรมมักจะคำนวนถูกต้องแค่ 7 หรือ 15 หลัก เช่น หากคำนวนค่า 1/3 ก็จะได้ประมาณ 0.33333334326744 จะเห็นว่าค่าเลขหลักหลังๆ นั้นผิดพลาด ลองดูอีกสักตัวอย่าง


Program 3.15

Program 3.15 Output

Not Equal

 

การแก้ปัญหาของการไม่เท่ากันระหว่างทศนิยมสามารถแก้ไขได้หลายเทคนิคแต่วิธีแบบง่ายที่สุด คือวิธีการเทียบ ablsolute error ซึ่งเป็นการเทียบเคียงค่าผลต่างของสองจำนวนกับค่าผิดพลาดที่ยอมรับได้มากที่สุด การใช้วิธีนี้ต้องมีคำสั่ง fabs() ซึ่งเป็นการหาค่าสัมบูรณ์ (absolute) ของทศนิยมเข้าช่วย ดังเช่นตัวอย่าง

Program 3.16

Program 3.16 Output

Same Same

จากโปรแกรมตัวแปร epsilon ก็คือค่าผิดพลาดที่ยอมรับได้มากที่สุด หมายความว่าถ้าคำนวนค่า 1.0 / 3.0 ได้ผลออกมาเป็น 0.33333334326744 เมื่อลบกับค่าที่ต้องการเปรียบเทียบคือ 3.33333 ผลลัพธ์ก็คือ 0.00000334326744 ซึ่งน้อยกว่า ค่าผิดพลาดที่ยอมรับได้มากที่สุดคือ 0.00001 ดังนั้นการเปรียบเทียบสองจำนวนนี้จึงถือว่าเท่ากัน

 

 


เป็นจริง คือค่าที่มากกว่า 1

ในบางครั้งโปรแกรมจะทำงานได้ถูกต้อง แต่ส่วนมากจะไม่ถูกต้อง

One thought on “Objective-C Programming Chapter 3 (Part 1)”

Leave a Reply