บทที่3 โปรแกรมเชิงโครงสร...

29
..\PoP\sathit Edit 22042010 by Sathit Intajag 29 บทที3 โปรแกรมเชิงโครงสร้าง วัตถประสงค์ 1. ศึกษาเทคนิคพืนฐานของแกปัญหาด้วยโปรแกรมคอมพิวเตอร์ 2. เพื่อให้เข้าใจการเขียนโปรแกรมแบบโครงสร้าง 3. เพื่อให้สามารถพัฒนาอัลกอริทึมด้วยกระบวนการออกแบบจากข้างบนลงลาง (Top- down) และการตรวจสอบแบบกลันกรองทีละขัน 4. สามารถใช้สเตจเม็นต์ if และ if…else ในการเลือกทิศทางการทํางานของโปรแกรม 5. สามารถเขียนสเตจเม็นต์การวนซํา while ให้อยูในรูปของโปรแกรมเชิงโครงสร้างได้ 6. เพื่อให้เข้าใจการควบคุมการนับของการวนซํา เงื่อนไขที่ควบคุมการเริมต้นและการหยุดกา ทําซํา 3.1 บทนํา กอนเขียนโปรแกรมเพื่อแกปั ้ ญหาตางๆ จําเป็นจะต้องศึกษาทําความเข้าใจปัญหาแล้วจึง วางแผนเพื่อแกปัญหานันๆอยางรอบครอบ การวางแผนเขียนโปรแกรมเป็นการออกแบบขันตอนการ ทํางานของโปรแกรมที่เรียกวาอัลกอริทึม โดยทัวไปอัลกอริทึมสามารถออกแบบให้เป็นขันตอนแบบ โครงสร้างได้ และโปรแกรมที่เขียนตามอัลกอริทึมดังกลาวกจะเป็นโปรแกรมเชิงโครงสร้างทีประกอบด้วยสเตจเม็นต์ที่มีรูปแบบการทํางานเป็นระเบียบในรูปของบล็อก ทําให้สะดวกตอการ ออกแบบเนื่องจากสามารถนําบล็อกที่ออกแบบไว้มาเชื่อมตอกนเป็นโปรแกรม ในบทนีจะได้ศึกษา การสร้างบล็อกอยางงายแล้วนําบล็อกมาเชื่อมตอกนแบบ จากบนลงลาง 3.2 อัลกอริทึม โปรแกรมเป็นกระบวนการประกอบด้วยวิธีการแกปัญหาในแบบตางๆ เพื่อให้ได้คําตอบ ดังนันคําวา โปรแกรมในที่นีกคือ วิธีการแกปัญหาตามขันตอนที่ออกแบบไว้ จะเห็นวาโปรแกรม ้็ ประกอบขึนด้วยสเตจเม็นต์ที่เป็นคําสังให้คอมพิวเตอร์ทํางาน เมื่อจัดกลุ ่มคําสังที่ใช้แกปัญหายอย เฉพาะอยางขึนมาในรูปของบล็อกเล็กๆ และนําบล็อกเหลานีมาเรียงตอกนอยางมีลําดับ กจะได้ ขั ้นตอนวิธีหรือที่เรียกวา อัลกอริทึม (Algorithm) อัลกอริทึมคือวิธีการจัดเรียงคําสังอยางเป็นลําดับ กอนที่จะศึกษาอัลกอริทึมที่นํามาเขียนเป็น โปรแกรมคอมพิวเตอร์ ให้ลองพิจารณาขันตอนการดําเนินการของการมาเรียนหนังสือ เริมจากตื่น นอนจนกระทังไปถึงที่เรียน - ลุกจากเตียงนอน - เตรียมเสือผ้า

Upload: others

Post on 12-Jul-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 29

บทท 3 โปรแกรมเชงโครงสราง

วตถประสงค

1. ศกษาเทคนคพนฐานของแกปญหาดวยโปรแกรมคอมพวเตอร

2. เพอใหเขาใจการเขยนโปรแกรมแบบโครงสราง 3. เพอใหสามารถพฒนาอลกอรทมดวยกระบวนการออกแบบจากขางบนลงลาง (Top-

down) และการตรวจสอบแบบกลนกรองทละขน

4. สามารถใชสเตจเมนต if และ if…else ในการเลอกทศทางการทางานของโปรแกรม

5. สามารถเขยนสเตจเมนตการวนซา while ใหอยในรปของโปรแกรมเชงโครงสรางได

6. เพอใหเขาใจการควบคมการนบของการวนซา เงอนไขทควบคมการเรมตนและการหยดกา ทาซา

3.1 บทนา กอนเขยนโปรแกรมเพอแกป ญหาตางๆ จาเปนจะตองศกษาทาความเขาใจปญหาแลวจง

วางแผนเพอแกปญหานนๆอยางรอบครอบ การวางแผนเขยนโปรแกรมเปนการออกแบบขนตอนการ ทางานของโปรแกรมทเรยกวาอลกอรทม โดยทวไปอลกอรทมสามารถออกแบบใหเปนขนตอนแบบ โครงสรางได และโปรแกรมทเขยนตามอลกอรทมดงกลาวกจะเปนโปรแกรมเชงโครงสรางท ประกอบดวยสเตจเมนตทมรปแบบการทางานเปนระเบยบในรปของบลอก ทาใหสะดวกตอการออกแบบเนองจากสามารถนาบลอกทออกแบบไวมาเชอมตอกนเปนโปรแกรม ในบทนจะไดศกษา การสรางบลอกอยางงายแลวนาบลอกมาเชอมตอกนแบบ จากบนลงลาง

3.2 อลกอรทม

โปรแกรมเปนกระบวนการประกอบดวยวธการแกปญหาในแบบตางๆ เพอใหไดคาตอบ ดงนนคาวา โปรแกรมในทนกคอ วธการแกปญหาตามขนตอนทออกแบบไว จะเหนวาโปรแกรม ประกอบขนดวยสเตจเมนตทเปนคาสงใหคอมพวเตอรทางาน เมอจดกล มคาสงทใชแกปญหายอย เฉพาะอยางขนมาในรปของบลอกเลกๆ และนาบลอกเหลานมาเรยงตอกนอยางมลาดบ กจะได ขนตอนวธหรอทเรยกวา อลกอรทม (Algorithm)

อลกอรทมคอวธการจดเรยงคาสงอยางเปนลาดบ กอนทจะศกษาอลกอรทมทนามาเขยนเปน โปรแกรมคอมพวเตอร ใหลองพจารณาขนตอนการดาเนนการของการมาเรยนหนงสอ เรมจากตน นอนจนกระทงไปถงทเรยน

- ลกจากเตยงนอน

- เตรยมเสอผา

Page 2: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 30

- อาบนา

- แตงตว

- รบประทานอาหาร

- ขนรถประจาทางไปโรงเรยน

จะเหนวาขนตอนตางๆททาอยประจาดงเชนการไปโรงเรยน ทมการเตร ยมตวเปนอยางดในการตดสนใจกระทาในแตละขนตอนอยางเปนลาดบกจะบรรลวตถประสงคได อยางไรกตามถามการ สบเปลยนลาดบของขนตอนทปฏบตอยเพยงเลกนอย เชน

- ลกจากเตยงนอน

- เตรยมเสอผา

- แตงตว

- อาบนา

- รบประทานอาหาร

- ขนรถประจาทางไปโรงเรยน

ในกรณนนกเรยนคนนอาจจะถงโรงเรยนแบบเปยกๆ แตอาจจะมบางคนแยงขนมาวา ใครจะไป อาบนาทงชดนกเรยน กจะตองถอดออกกอนแลวอาบ เมออาบเสรจกใสกลบเขาไปใหม เทานกไมตอ ไปโรงเรยนแบบเปยกๆแลว ทกลาวเชนนนกถกเพราะไดกลาวไวตอนตนแลววา อลกอ รทมกคอขนตอนและวธ เมอสลบลาดบของขนตอนกจะทาใหวธเปลยนไปแตยงไดผลลพธเหมอนเดม อลกอรทมทมลาดบคาสงตางไปจากเดมกจะกลายเปนอกอลกอรทมหนง

3.3 รหสเทยม

รหสเทยม(Pseudo code) เปนภาษาทเขยนขน เพอชวยใหผเขยนโปรแกรมสา มารถพฒนา อลกอรทมไดงายขน รหสเทยมจะคลายกบภาษาองกฤษ ทาใหสะดวกตอการนามาใชอธบายขนตอน การแกปญหา ถงแมวารหสเทยมไมใชภาษาคอมพวเตอรจรงๆแตกสามารถแปลงเปนโปรแกรมภาษา ทเปนโครงสรางไดงาย

รหสเทยมไมสามารถนาไปประมวลผลดวยคอมพวเตอรได เนองจากเปนเพยงภาษาทใชอธบายขนตอนการแกปญหาทผเขยนโปรแกรมวางแผนเพอนามาเขยนเปนภาษาคอมพวเตอร ในบท นจะแสดงตวอยางของการใชรหสเทยม เพอพฒนาการเขยนโปรแกรมภาษาซใหเปนโปรแกรม โครงสราง

รหสเทยมเปนขอความทใชอธบายขนตอนการแกปญหา ดงนนผเขยนโปรแกรมอาจจะพมพรหสเทยมดวยคอมพวเตอรโดยใชโปรแกรมอดเตอร โปรแกรมรหสเทยมทออกแบบไวดแลวสามารถแปลงเปนภาษาซไดงาย ดวยการแทนสเตจเมนตในรหสเทยมดวยสเตจเมนตของภาษาซทสอดคลองกน

Page 3: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 31

รหสเทยมจะมเฉพาะสเตจเมนตทเปนคาสง แต มสเตจเมนตสวนหนงในภาษาคอมพวเตอรทไมเปนสเตจเมนตคาสง เปนเพยงสเตจเมนตของขอความททาใหคอมไพเลอรเขาใจ เชนการนยามตว แปร int j; ทเปนเพยงการบอกคอมไพเลอรวาตวแปร j เปนชนดเลขจานวนเตมและเปนการจองพนทหนวยความจา การนยามตวแปรทไม ใชคาสงเชนนไมจาเปนตองใสไวในรหสเทยม รหสเทยมจะม เฉพาะสเตจเมนตทมผลโดยตรงกบปญหาทกาลงแก เชนมผลกบอนพต เอาตพต และการคานวณ เปนตน แตมผออกแบบรหสเทยมจานวนหนงนยมประกาศตวแปรตางๆพรอมกบอธบายตวแปร เหลานนใหกระชบ โดยเฉพา ะจดประสงคของการใชตวแปร

3.4 โครงสรางการควบคม

โปรแกรมจะประมวลผลตามลาดบของสเตจเมนตหรอทเรยกวา การประมวลผลเชงลาดบ

(Sequential execution) ซงเปนโครงสรางพนฐานของการเขยนโปรแกรม แตการแกปญหา บางอยางจะตองมการเลอกทจะขามหรอไมขามบางสเตจ เมนต กลไกทชวยใหผเขยนโปรแกรมกาหนดวาจะขามหรอไมขามสเตจเมนตใดเรยกวา การถายโอนการควบคม (Transfer of control)

ในชวงป 1960 ยงใชการถายโอนการควบคมททาใหเกดปญหายงยากตามมาภายหลง เนองจากการทางานทกระโดดขามไปขามมา เพราะใชสเตจเมนต goto สาหรบถายโอนการควบคมไปยงสวนตางๆของโปรแกรม แตในการเขยนโปรแกรมเชงโครงสรางตองพยายามกาจดหรอ หลกเลยงการใช goto (goto elimination)

ในงานวจยของ บอมและจาคอฟปน (Bohm and Jacopini1) ไดแสดงใหเหนวาโปรแกรม

สามารถทจะเขยนโดยไมตองใชสเตจเ มนต goto ความทาทายทเกดขนกบผเขยนโปรแกรมในสมย นนคอ การเปลยนแนวคดในการเขยนโปรแกรมมาเปนแบบไมม goto หรอทเรยกวา “โกทเลสซ (goto-less)” แตแนวคดนยงไมประสบความสาเรจจนกระทงในยกต 1970 ไดมผเชยวชาญการเขยนโปรแกรมเรมพดถงกา รเขยนโปรแกรมเชงโครงสรางอยางจรงจง ประกอบกบกลมผพฒนา ซอฟตแวรทเขยนโปรแกรมเชงโครงสรางไดรายงานถงการลดเวลาการเขยนโปรแกรม ทาใหสามารถสงงานไดทนตามกาหนดเวลา นอกจากนยงสามารถควบคมตนทนการพฒนาซอฟตแวร กญแจสาคญททาใหการเขยนโปรแกรมเชงโครงสรางประสบความสาเรจคอ ความชดเจนของขนตอนการทางานในโปรแกรม และความงายในการตรวจสอบแกไข ทาใหเปนทมาของคาวา โปรแกรมไมมขอผดพลาดทเรยกกนวา “บกฟร (Bug-free)”

1

Bohm, C., and Jacopini, G., “Flow Diagrams, Turing Machines, and Languages with Only Two Formation Rules,” Communications of the ACM, Vol. 9, No. 5, May 1966, pp. 336-3371.

Page 4: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 32

ในงานวจยของบอมและจาคอฟปนไดแสดงใหเหนวาทกๆโปรแกรม สามารถเขยนใหอยใน รปของโครงสรางการควบคมทมอยสามแบบดวยกนคอ

1. โครงสรางเชงลาดบ (Sequence structure)

2. โครงสรางการเลอก (Selection structure) และ

3. โครงสรางการวนซา (Repetition structure)

โครงสรางเชงลาดบเปนโครงสรางพนฐานของโปรแกรม เนองจากคอมพวเตอรจะประมวลผลสเตจ

เมนตเปนลาดบอยางอตโนมตอยแลว ดงทเหนในโฟลวชารต (Flowchart2) รปท 3.1 ทแสดง

โครงสรางเชงลาดบควบคไปกบสเตจเมนตของภาษาซ

total = total + score;

counter = counter + 1;

บวกคะแนนเขากบคะแนนทงหมด

เพมคาใหกบดชน

รปท 3.1 โฟลวชารตโครงสรางเชงลาดบของภาษาซ

โฟลวชารตของโครงสรางเชงลาดบในรปท 3.1 ประกอบดวยสญลกษณสเหลยมผนผาซงเปน

สญลกษณปฏบตการ (Action symbol) ทใชแทนปฏบตการชนดใดๆในโปรแกรม เชน การคานวณ การดาเนนการกบอนพตหรอเอาตพต สาหรบลกศรจะแสดงถงลาดบทศทางการไหลของปฏบตการทจะถกกระทา โดยเรมจากนาคะแนนไปบว กเขากบคะแนนทงหมด แลวเอาหนงไปบวก เขากบตวแปร counter เพอกาหนดคาใหกบ counter

เมอสรางโฟลวชารตทสมบรณ สญลกษณวงรทมคาวา “เรมตน ” หรอ “Begin” หรอ “Start” อยขางในจะเปนจดเรมตนของโฟลวชารต สวนสญลกษณเดยวกนนทมคาวา “จบ” หรอ “End” หรอ “Stop” อยภายในจะแทนการสนสดหรอจบอลกอรทม แตถาตองการแสดงอลกอรทม เพยงสวนใดสวนหนงดงรปท 3.1 กจะละสญลกษณวงรเอาไวและจะใชวงกลมเลกๆแทน ซงจะเรยกวาสญลกษณตวเชอมตอ (Connector symbols)

2

ดในรายละเอยดในภาคผนวก

Page 5: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 33

สญลกษณทสาคญในการเขยนโฟลวชารตอกตวหนงคอรปสเหลยมขนมเปยกปน ซงเปนสญลกษณการตดสนใจ (Decision symbol) ทใชแทนการตดสนใจโดยการเลอกวาจะปฏบตการในสวนของสเตจเมนตใด ภาษาซมสเตจเมนตสามแบบสาหรบแทนโครงสรางการเลอกกระทา

• เรมจากสเตจเมนต if ทใชเลอกกระทาสเตจเมนตถาเงอนไขเปนจรง และสเตจเมนตดงกลาวจะไมถกกระทาถาเงอนไขเปนเทจ ซง if ในกรณนมกจะถกเรยกวา “สเตจเมนตทมการเลอกทางเดยว” เนองจาก if จะเลอกกระทาหรอไมกขามการกระทานนๆ

• สเตจเมนตตอไปคอ if…else ทจะปฏบตการอยางหนงถาเงอนไขเปนจรง และจะปฏบตการอกอยางหนงถาเงอนไขของ if เปนเทจ และมกจะเรยก if…else วา “สเตจเมนตทมการเลอกสองทาง” เนองจากสามารถเลอกทาปฏบตการไดสองทาง

• สเตจเมนตสดทายคอ switch ทใชเลอกทาปฏบตการตางๆตามคาในนพจนขอ ง switch

และมกจะเรยก switch วา “สเตจเมนตทมการเลอกไดหลายทาง” เนองจากสามารถทจะเลอกปฏบตการไดหลายกรณ

สาหรบโครงสรางแบบทาซา เกดจากการนาโครงสรางเชงลาดบมาใชรวมกบโครงสรางกา

เลอกกระทาหรอไมกระทา ภาษาซมสเตจเมนตอยสามแบบคอ while, do…while และ for ซงจะไดศกษาในรายละเอยดตอไป

โปรแกรมเชงโครงสรางทเขยนดวยภาษาซจะมสเตจเมนตทใชควบคมอยเจดชนดคอ ชนดทเปนแบบลาดบ สามชนดเปนสเตจเมนตทางเลอก และอกสามชนดสาหรบการทาซา โปรแกรมจะถสรางโดยการนาเอาสเตจเมนตการควบคมในแบบตางๆมาเรยงตอกน นนคอโปรแกรมจะม โครงสรางเชงลาดบเปนหลก และมการควบคมแบบวนซากบแบบทางเลอกสอดแทรกอยในกา ควบคมเชงลาดบ ในทางกลบกนการควบคมแบบเชงลาดบจะฝงตวอยในการวนซาหรอแบบทางเลอ ตามความเหมาะสมของอลกอรทมทใชแกปญหานนๆ อย างในโครงสรางเชงลาดบรปท 3.1 เราจะเหนวาการแทนโฟลวชารตของแตละสเตจเมนตการควบคมมสญลกษณวงกลมเลกๆสองวง วงแรก แทนการเขาสสเตจเมนตและอกวงเปนทางออก

การออกแบบสเตจเมนตควบคมจะตองใหมเสนทางเขาทางเดยวและออกทางเดยว ซงทาใหโครงสรางการควบคมเปนเสมอนบลอก การเขยนโปรแกรมเชงโครงสรางเชงลาดบกเหมอนกบการ นาบลอกมาตอกน โดยการเชอมจดทเปนทางออกกบจดทเปนทางเขาของบลอกถดไป ทาใหการ เขยนโปรแกรมเปรยบไดกบการนาบลอกมาวางซอนกน ซงจะเรยกบลอกทซอนกนเปนชนๆวา สแตก (Stack) ดงนนสเตจเมนตเชงลาดบในโปรแกรมเชงโครงสรางจงเปน สเตจเมนตควบคมแบบสแตก(Control-statement stacking)

Page 6: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 34

นอกจากนยงมวธการเชอมตอสเตจเมนตอกแบบหนง ทเกดจากการนาโครงสรางการทาซาม ใชรวมกบโครงสรางทางเลอก ทาใหไดโครงสรางทซอนกนเหมอ นกบรงนก และจะเรยกการเชอมตอในลกษณะนวา การสรางรงสเตจเมนตการควบคม (Control-statement nesting)

3.5 สเตจเมนต if if สามารถทจะเขยนเปนโครงสรางทใชเลอกกระทาหรอไมกระทากบสเตจเมนต หรอเซต

ของสเตจเมนต พจารณาตวอยางการกาหนดเกรดตอไปน ถามคะแนนมากกวาหรอเทากบ 60 ถงจะผาน สเตจเมนตของรหสเทยมคอ

if student’s score is greater than or equal to 60 print “Passed”

เงอนไขใน if คอ “คะแนนมากกวาหรอเทากบ 60” ซงมคาความจรงทอาจจะเปนจรงหรอเทจกได ถาเงอนไขเปนจ รง คาวา “Passed” กจะถกพมพและสเตจเมนตในลาดบถดไปกจะถกกระทา ตอ แตถาเงอนไขเปนเทจคาวา “Passed” กจะไมถกพมพและสเตจเมนตในลาดบถดไปกจะถก กระทาตอเชนกน สงเกตวาบรรทดทสองของรหสเทยมถกยอหนา การยอหนาเปนสงทควรกระทาแต ถาไมย อหนากไมเกดขอผดพลาดอะไร อยางไรกตามการยอหนาจะชวยเนนวาเปนสวนของสเตจ เมนตทซอนอยขางใน แตในการพมพโปรแกรมภาษาซจะใชการยอหนาเพอใหโปรแกรมอานงาย แมวาคอมไพเลอรภาษาซไมไดสนใจสวนทเวนวางหรอทเรยกวา “ตวอกษรไวทสเปส (Whitespace characters)” อยางชองวาง การยอหนาโดยการตง Tab และการขนบรรทดใหม

จากรหสเทยมทเขยนไว เมอแปลงเปนภาษาซกสามารถเขยนไดเปน if (score >= 60)

printf(“Passed\n”);

สงเกตวาภาษาซมความใกลเคยงกบรหสเทยมเปนอยางมาก นเปนคณสมบตหน งในหลายๆอยางทมประโยชนของรหสเทยม

โฟลวชารตในรปท 3.2 แทนสเตจเมนต if ทประมวลผลหนงสเตจเมนตเมอมคะแนนมากวาหรอเทากบหกสบ จะเหนวาโฟลวชารตใชสญลกษณการตดสนใจเพอทจะเลอกหรอไมเลอก กระทาสเตจเมนต print “Passesd” สญลกษณการตดสนใจจะมนพจนอยขางใน ซงนพจนนเปน เงอนไขทมคาความจรงทอาจจะเปนจรงหรอเทจกได สญลกษณการตดสนใจมลกศรสองเสนออก จากบลอก เสนแรกเกดจากเงอนไขทเปนจรง สวนอกเสนหนงแทนเงอนไขทเปนเทจ จากรปให สงเกตวาสเตจเมนต if มโครงสรางทมทางเขาและทางออกอยางละหนงเสนทาง

Page 7: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 35

score >= 60 print “Passed”true

false

รปท 3.2 โฟลวชารตของการเลอกทาหนงสเตจเมนตของ if

3.6 สเตจเมนต if…else

สเตจเมนตตางๆของ if จะถกดาเนนการเมอเงอนไขเปนจรงเทานน ถาเงอนไขเปนเทจกจะ ขามไปทาสเตจเมนตทถดไป แต if…else จะตองมปฏบตการอยางใดอยางหนงทตองเลอกกระทา ถา เงอนไขเปนจรงกกระทาสเตจเมนตของ if แตถาเงอนไขเปนเทจกจะกระทาใน else เชน

if student’s score is greater than or equal to 60 Print “Passed” else Print “Failed”

นนคอถา - คะแนนของนกศกษาคนใดทมากกวาหรอเทากบ 60 กจะผานการสอบและจะพมพคาวา

“Passed ” - แตถานกศกษาคนใดมคะแนนนอยกวา 60 กจะไมผานซงคาวา “Failed” กจะถกพมพ

หลงจากคาวา “Passed” หรอไมก “Failed” ถกพมพเรยบรอยแลว สเตจเมนตถดไปกจะถกดาเนนการตอ

จากรหสเทยมขางตนสามารถแปลงเปนภาษาซไดดงน if (score >= 60) printf(“Passed\n”); else printf(“Failed\n”);

รปท 3.3 แสดงโฟลวชารตเสนทางการไหลของสเตจเมนต if…else ทมทางเขาและออกอยางละเสนทาง

score >= 60 print “Passed” truefalse print “Failed”

Page 8: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 36

รปท 3.3 โฟลวชารตของการเลอกแบบสองทางของสเตจเมนต if…else

ภาษาซมตวดาเนนการเงอนไข (Conditional operator (?:) ) อกตวหนงทมการทางานใกลเคยงกบสเตจเมนต if…else โดยตวดาเนนการเงอนไขของภาษาซจะมโอเพอแรนดสามตวหรอทเรยกวา “ตวดาเนนการแบบเทอรนาร (Ternary operator)” ตวโอเพอแรนดทงสามทอยในตว ดาเนนการเงอนไขจะอยในรปของ นพจนเงอนไข (Conditional expression) โดยโอเพอแรนดตวแรกเปนเงอนไข โอเพอแรนดตวทสองจะถกปฏบตการเลอกกระทาเมอเงอนไขเปนจรง สาหรบโอเพอแรนดตวทสามถกกระทาเมอเงอนไขเปนเทจ ดงนนสเตจเมนต if…else ขางตนทมการพมพคา “Passed” หรอไมกพมพ “Failed” เมอแทนดวยตวดาเนนการเงอนไขจะเปนดงน

printf(“%s\n”, score >= 60 ? “Passed” : “Failed”); จะเหนวาในฟงกชน printf มอากวเม นตสองตว ตวแรกเปนสตรงควบคมรปแบบคอ “%s\n” ซงเปนการพมพสายอกษรหรอสตรง (%s) ทไดจากตวดาเนนการเงอนไขซงเปนอากวเมนตตวทสอง นนคอ ถาตวแปร score มคามากกวาหรอเทากบ 60 รปแบบการแปลง %s กจะถกแทนดวยสตรง “Passed” แตถาเงอนไข score >= 60 ไมเปนจรง %s กจะถกแทนดวย “Failed” จะเหนวาตวดาเนนการเงอนไขมการทางานเชนเดยวกบสเตจเมนต if…else

นอกจากนยงสามารถเขยนตวดาเนนการเงอนไขขางตนในรปแบบอนๆ ทยงคงใหผลลพธเหมอนเดมคอ

score >= 60 ? printf(“Passed\n”) : printf(“Failed\n”); ในสเตจเมนตนสามารถอานไดเปน “ถาคะแนนมากกวาหรอเทากบ 60 ดงนนใหกระทา printf(“Passed\n”) ถาไมเชนนนกใหกระทา printf(“Failed\n”);

รงหรอกลมของสเตจเมนต if…else โดยทวไปมกจะเรยกวา “เนตเตดอฟ (Nested if)” จะใชเนตเตดอฟเมอเงอนไขมความซบซอนขน โดยเรมจากสองทางเลอกและมทางเลอกหนงทซอนอก สองทางเลอกไวขางใน เชนสเตจเมนตรหสเทยมตอไปนทตองการพมพเกรด

“A” ถามคะแนนมากกวาหรอเทากบ 90 หรอไมกพมพเกรด “B” ถามคะแนนมากกวาหรอเทากบ 80

หรอไมกพมพเกรด “C” ถามคะแนนมากกวาหรอเทากบ 70

หรอไมกพมพเกรด “D” ถามคะแนนมากกวาหรอเทากบ 60

มฉะนนพมพเกรด “F” ในกรณอนๆ

ซงขอความทงหมดนสามารถเขยนเปนรหสเทยมไดดงน if student’s score is greater than or equal to 90 Print “A” else if student’s score is greater than or equal to 80

Page 9: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 37

Print “B” else if student’s score is greater than or equal to 70 Print “C” else if student’s score is greater than or equal to 60 Print “D” else Print “F” เมอแปลงรหสเทยมนเปนภาษาซจะไดวา

if (score >= 90) printf(“A\n”); else if(score >= 80) printf(“B\n”); else if(score >= 70) printf(“C\n”); else if(score >= 60) printf(“D\n”); else printf(“F\n”);

จากสวนของโปรแกรมภาษ าซจะเหนวาเมอไรทเกรด “A” ถกเลอกพมพ ซงคาของตวแปร score

จะตองมากกวาหรอเทากบ 90 ทาใหสวนของ else ทเหลอไมถกประเมนคาความจรงอกตอไป โดย จะหลดออกจากสเตจเมนตเนตเตดอฟ แตถาตวแปร score นอยวา 90 กจะตรวจสอบเงอนไข if…else ตอไปค อท score >= 80 ถาเงอนไขนจรงกจะพมพเกรด “B” และหยดการประเมนคาความจรงจาก if … else ในสเตจเมนตตอไป แตถาตวแปร score มคานอยกวา 80 กจะประเมน if … else

ในสเตจเมนตลาดบถดไปจนกระทงในกรณสดทายคอตวแปร score มคานอยกวา 60 กจะพม พเกรด “F” และจบสเตจเมนตเนตเตดอฟ แลวจงจะดาเนนการในสเตจเมนตถดไป

การพมพโปรแกรมภาษาซกรณทเปนเนตเตดอฟ มนกเขยนโปรแกรมหลายทานนยมพมพในรปแบบตอไปน

if (score >= 90) printf(“A\n”); else if (score >= 80) printf(“B\n”); else if (score >= 70) printf(“C\n”); else if (score >= 60) printf(“D\n”); else printf(“F\n”);

Page 10: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 38

อยางไรกตามคอมไพเลอรภาษาซจะเหนการพมพทงสองรปแบบไมตางๆกน แตรปแบบหลงเปนท นยมมากกวา เนองจากไมตองมการยอหนาทลกเก นไป

จะเหนวาสเตจเมนต if ทกลาวมาขางตนจะมเพยงสเตจเมนตเดยวทถกกระทา แตเมอไรท ตองการประมวลผลหลายสเตจเมนต กจะตองทาใหสเตจเมนตเหลานนเปนเซตโดยการใสวงเลบปก กา ซงกลมหรอเซตของสเตจเมนตทอยภายในวงเลบปกกาจะถกเรยกวา “สเตจเมนตประกอบหรอคอมพาวนดสเตจเมนต (Compound statement) หรออาจจะเรยกวาบลอก”

ตวอยางตอไปนแสดงคอมพาวนดสเตจเมนต ทอยในสวนของ else นนคอ if (score >= 60) printf(“Passed\n”); else { printf(“Failed\n”); printf(“You must take this course again.\n”); }

ในกรณนถามคะแนนนอยกวา 60 โปรแกรมกจะประมวลผล printf ทงสองสเตจเมนตทอยในสวน ของ else โดยจะพมพผลลพธเปน Failed You must take this course again. ซงเปนผลจากคอมพาวนดสเตจเมนตทอยในสวนของ else ถาไมใสวงเลบปกกาเพอทาให เปนคอมพาวนดสเตจเมนตในบรรทด

printf(“You must take this course again.\n”);

กจะอยนอกสวนของ else และบรรทดนจะถกพมพไมวาเงอนไขจะเปนจรงหรอเทจ นนคอถา เงอนไขเปนจรงซงคาของตวแปร score >= 60 จรง กจะปรากฏขอความนบนหนาจอ Passed You must take this course again คอผานการสอบแตตองลงวชานใหมอกครง ซงผดวตถประสงค

3.7 สเตจเมนตการทาซา while

สเตจเมนตการทาซาทาใหผเขยนโปรแกรมสามารถกาหนดไดวา มสวนของสเตจเมนตใดบา ทจะตองถกประมวลผลซาในขณะทเงอนไขยงคงเปนจรง อย ตวอยางรหสเทยมของสเตจเมนตทตอ มการทาซาเชน

while there are more items on my shopping list Purchase next item and cross it off my list

ซงเปนการอธบายการทาซาทเกดขนในระหวางการเดนซอสนคา เงอนไข “there are more items

on my shopping list” หรอ “มอกหลายรายการทจะตองซอ” ซงเงอนไขนอาจจะมคาความจรงท เปนจรงหรอเทจ ถาเงอนไขยงคงเปนจรงอย สงทตองกระทาคอ “Purchase next item and cross

it off my list” นนกคอ ซอของในรายการนนแลวขดฆาหรอลบรายการทซอแลวออก ไปเสย

Page 11: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 39

ปฏบตการนจะถกกระทาซาในขณะทเงอนไขยงคงเปนจรง เพราะซอของในรายการยงไมครบ สเต เมนตทถกปฏบตการวนซาในสเตจเมนต while อาจจะเปนสเตจเมนตเดยวหรอเปนคอมพาวนดสเตจเมนตกได

เงอนไขจะกลายเปนเทจในขณะทประมวลผลอยในวงวนการทาซา (ของชนสดทายในรายการทตองซอ ถกซอและขดฆารายการนนไปแลว ) ทจดนจะเปนการหยดการทาซาและสเตจเมนต ทตองออกจาก while กจะถกประมวลผลอกครงหนง ซงทาใหเงอนไขเปนเทจ

ตวอยางสเตจเมนต while ในภาษาซ เมอพจารณาสวนของโปรแกรมทออกแ บบมาเพอคานวณหา 2 ยกกาลงเทาไรถงจะมคามากกวา 1000 เปนคาแรก เมอกาหนดใหตวแปร product เปนชนดจานวนเตมและมคาเรมตนเทากบ 2 เมอประมวลผลในสเตจเมนตของ while จนจบ กจะไดคาตอบทตองการ

product = 2; index = 1; while (product <= 1000) { product = 2 * product; index = index + 1; }

โฟลวชารตรปท 3.4 แสดงการควบคมทศทางการทาซาดวยสเตจเมนต while ทศทางการไหลทแสดงดวยลกศรจากสเหลยมผนผาทแทนการคานวณดวยการคณและการบวก จะไหลกลบไปทบลอกการตดสนใจ เพอทดสอบผลคณทไดในแตละครงขอ งการวนซาจนกระทงผลการตดสนใ กลายเปนเทจ ซงสเตจเมนต while จะหยดและการควบคมกจะผานจดนไปทางานทสเตจเมนตตอ จากบลอกของ while

จากรปท 3.4 เมอเรมเขาสสเตจเมนต while คา product ถกกาหนดคาเรมตนใหเทากบสอง และ index ถกกาหนดใหเท ากบหนง ( )12 2= เมอเรมการทาซาตวแปร product กจะถกคณดวย 2

ทาใหคาในตวแปร product เปลยนไปเปน 4, 8, 16, 32, 64, 128, 256, 512 และ 1024 ทสอดคลองกบตวแปร index ทอยในรป 2index คอ 22, 23, 24, 25, 26, 27, 28, 29 และ 210 เพราะตวแปร index ถกเพมคาครงละหนง เมอ index มคาเทากบ 10 ซงเปนคาสดทายทคา product เทากบ 1024 เงอนไขของสเตจเมนต while คอ product <= 1000 กลายเปนเทจ ทาใหหยดการทาซาและไดค ผลเฉลยตามทตองการ คอคาททาให 2 ยกกาลง 10 มคามากกวา 1000 เปนคาแรก

Page 12: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 40

product <= 1000 product = 2 * product index = index + 1

รปท 3.4 การควบคมการไหลการทาซาดวยสเตจเมนต while

3.8 การออกแบบอลกอรทม: กรณศกษาท 1 การควบคมตวนบการทาซา

ในหวขอนจะศกษาการออกแบบอลกอรทม โดยจาลองการแกปญหาดวยวธตางๆในการหา คะแนนเฉลยของหอง พจารณาปญหาตอไปน

หองเรยนหนงมนกศกษา 10 คน ทาการสอบทมคะแนนเตม 100 และตองการทราบคะแนนเฉลยของหอง เมอคะแนนเฉลยเทากบผลรวมของคะแนนทนกศกษาแตละคนสอบได แลวนามาหารดวยจานวน นกศกษา อลกอรทมของการแกปญหานเรมจากการอา นคะแนนเขามา แลวคานวณคาเฉลยและแสดงผล

รหสเทยมของขนตอนปฏบตการจะใช การควบคมตวนบการทาซา (Counter-control

repetition) จากการปอนคะแนนของนกศกษาแตละคน วธนจะประกาศตวแปร counter เพอกาหนดจานวนครงทเซตของสเตจเมนตถกประมวลผล การทาซาจะหย ดเมอตวนบมากกวา 10

รหสเทยมของการแกปญหานคอ Set total to zero Set score counter to one While score counter is less than or equal to ten Input the next score Add the score into the total Add one to the score counter Set the class average to the total divided by ten Print the class average

จากรหสเทยมทแสดงขนตอนการแกปญหา เมอนามาแปลเปนภาษาซกตองพจารณาใหรอบคอบวา ตวแปรทจะมารองรบแตละสเตจเมนตควรเปนชนดใดและจะสงตอใหสเตจเมนตตอๆไปอยางไร ซง ถาสงเกตใหดจะเหนวา แตละสเตจเ มนตในรหสเทยมจะเปนสเตจเมนตปฏบตการหรอเอกซควเท

Page 13: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 41

เบลสเตจเมนต ดงนนแตละสเตจเมนตจะเปนการแปลงขอมลและสงตอกนจนไดผลลพธทตองการ ในโปรแกรม gpa.c ตอไปนจะนารหสเทยมขางตนมาเขยนเปนภาษาซ 1. /* gpa.c is program to calculate the average score of a class that have 10 students */ 2. #include <stdio.h> 3. int main() 4. { 5. int counter; /* use to count the number of students */ 6. int score; /* score value */ 7. int total; /* sum of score */ 8. int average; /* averate of score */ 9. 10. /* initailization phase */ 11. total = 0; /* Set total to zero */ 12. counter = 1; /* Set score counter to one */ 13. 14. /* processing phase */ 15. while (counter <= 10) /* While counter less than or equal to ten */ 16. { 17. printf("Enter score of no. %2d: ", counter); 18. scanf("%d", &score); /* Input the next score */ 19. total = total + score; /* Add the score into the total */ 20. counter = counter + 1; /* Add one to the grade counter */ 21. } 22. average = total/10; /* Set the class average to the total divided by ten */ 23. printf("Grade point average of your class is %d\n\n", average); /* Print the GPA */ 24. return 0; 25. }

รปท 3.5 ผลลพธของโปรแกรม gpa.c

Page 14: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 42

(ก) (ข) รปท 3.6 การตรวจสอบคาเรมตนเมอโปรแกรมถกประมวลผลจนถงบรรทดทมลกศรชอย

สงเกตวาทงรหสเทยมและโปรแกรมมการกาหนดคาเรมตน อาจมหลายคนสงสยวาจะ

กาหนดคาเรมตนทาไมในเมอไดประกาศตว แปร counter และ total ในบรรทดท 5 และ 7 ไวเรยบรอยแลว ถาไมตองกาหนดคาเรมตนในบรรทดท 11 และ 12 จะไดหรอไม ถาตอบแบบไม คานงถงความถกตองของผลลพธทได กตอบวาได แตจะทาใหโปรแกรม gpa.c ขาดความนาเชอถอ

เนองจากคาคะแนนเฉลยทคานวณได ไมถกตอง เพราะการประกาศตวแปรไมไดยนยนวาคาตวแปร total จะเทากบ 0 และ counter จะเทากบ 1 เมอนาตวแปรไปใชในบรรทดท 19 กจะทาใหคะแนนรวมทงหมดผดพลาดได นอกจากนความผดพลาดจากตวแปร counter กไมยงยอนกวากน ให พจารณารปท 3.6 ทเปนการตรวจสอบการทางานของโปรแกรม

จากรปท 3.6 จะเหนวาเมอโปรแกรม gpa.c ถกโหลดเขาไปในหนวยความจา ตวแปรตางๆ ในบรรทดท 5 ถง 8 ถกประกาศขนแตยงไมไดกาหนดคาเรมตนใหกบตวแปร total และ counter ทาใหคาของตวแปรเปน คาขยะ (Garbage value) ซงเปนคาท คางอยในหนวยความจา ดงทไดเหน จากรปท 3.6(ก) คาในกรอบขางลางของรปนกคอคาขยะ เมอโปรแกรมประมวลผลไปถงการ กาหนดคาเรมตนใหกบตวแปร total และ counter เรยบรอยแลวดงรปท 3.6(ข) ทลกศรถกเลอนลงมาชทสเตจเมนต while คาของตวแปร counter = 1 และ total = 0 สวนคาตวแปร average และ score

กยงเปนคาขยะเหมอนเดม แตตวแปรทงสองนจะไมสงผลตอความผดพลาดของโปรแกรม เนองจาก พวกมนจะถกกาหนดคา นนคอตวแปร score กจะถกกาหนดคาจากฟงกชน scanf สวนตวแปร average กจะถกกาหนดคาจาก บรรทด average = total/10 เพอนาไปแสดงผลในบรรทดถดไป

Page 15: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 43

ขอทนาสงเกตอกอยางหนงของโปรแกรม gpa.c กคอ การคานวณคาเฉลยในบรรทดท 22 เนองจากตวแปร average เปนเลขจานวนเตม ดงรปท 3.5 ซงเปนผลมาจากการทางานของโปรแกรมทไดคาเฉลยเทากบ 60 ทง ทคะแนนรวมของนกศกษาเทากบ 606 และเมอหารดวย 10 กนาจะได คาเฉลยเทากบ 60.6 ทเปนเลขทศนยม(ภาษาซมตวแปรชนด float สาหรบเกบตวเลขทเปนคาทศนยม )

3.9 การออกแบบอลกอรทมแบบบนลงลาง การออกแบบอลกอรทมแบบบนลงลางหรอ การออกแบบทอปดาวน(Top-Down design)

เมอโปรแกรมถกออกแบบดวยวธทอปดาวน อลกอรทมจะตองถกกลนกรองเพอใหไดขนตอนท ละเอยดครบถวน ทาใหงายตอการนาไปแปลเปนโปรแกรม ปญหาทนามาเปนกรณศกษาการ ออกแบบดวยวธทอปดาวน ยงคงใชปญหาการหาคาเฉลยจากหวขอทแลว แตจะนามาออกแ บบเพมเตมในสวนของการควบคมดวยเครองหมายการหยดการวนซา (Sentinel-Controlled repetition)

พฒนาโปรแกรมคานวณคะแนนเฉลยของหองทสามารถประมวลผลโดยไมจากดจานวนนกศกษา

จากโปรแกรม gpa.c ทไดศกษาในหวขอทแลว เมอพฒนาอลกอรทมขนมาใหมโดยใชสญญ าณการหยดการทาซา ทาใหโปรแกรมทพฒนาขนมาใหมไมมขอจากดเรองจานวนนกศกษา

อลกอรทมทจะพฒนาขนมาใหม จะตองคานวณคะแนนเฉลยของหองทสามารถประมวลผล โดยไมจากดจานวนนกศกษา เมอกลบไปพจารณาอลกอรทมเดมของโปรแกรม gpa.c กอาจจะเกด ขอสงสยขนม าสองขอวา โปรแกรมจะหยดการทาซาไดอยางไรและจะทราบจานวนนกศกษาทจะใชคานวณคะแนนเฉลยไดอยางไร สาหรบคาตอบของขอสงสยเรองการหยดการวนซานน จะมวธหนงท ใชคาพเศษทเรยกวา สญญาณหรอเครองหมายการหยด (Sentinel value) สาหรบหยดการปอนขอมล เมอผใชโปรแกรมปอนคะแนนนกศกษาจนครบทกคน คาสญญาณการหยดกจะสงสญญาณ บอกการทาซาของสเตจเมนต while ใหหยด การใชสญญาณการหยดทควบคมการทาซาบางครงจ เรยกวา “การทาซาแบบไมมกาหนด (Indefinite repetition)” เนองจากไมทราบลวงหนาวาจะ วนซากร อบ

การหยดการทาซาดวยสญญาณการหยดทาใหโปรแกรมมความยดหยนมากขน เพรา โปรแกรมสามารถคานวณคะแนนเฉลยของแตละหองทมจานวนนกศกษาไมเทากนได ถามการ กาหนดจานวนนกศกษาไวอยางโปรแกรมทแลว กจะทาใหการคานวณคะแนนเฉลยของอกหองทม จานวนนกศกษาตาง ไปจากเดมจะไดคาเฉลยทผดพลาด ถาจะใหถกตองกตองเขาไปแกจานวน นกศกษาใหม ซงถาจานวนของนกศกษาแตละหองไมเทากนกตองเขาไปแกโปรแกรมใหมทกครง

แนนอนวาคาทใชเปนสญญาณการหยดการทาซา จะตองไมกอใหเกดความสบสนกบคาขอ ขอมลทปอน เนองจากคะแนนของนกศกษาไมเปนคาทตดลบ ดงนนถานยามสญญาณการหยดให เทากบ –1 การประมวลผลของโปรแกรมคานวณคาเฉลยโดยการปอนคะแนนเชน 90, 60, 85, 74,

Page 16: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 44

65 และ –1 โปรแกรมกจะออกจากวงวนการทาซาเมอปอน –1 และจะคานวณคาเฉลยของคะแนนทปอนเขาไป

วธการทใชในการพฒนาโปรแกรมน เปนเทคนคการออกแบบจากบนลงลางและการ กลนกรองทละขนตอน เทคนคนมความสาคญตอการพฒนาโปรแกรมเชงโครงสราง โดยเรมจากการ เขยนดวยรหสเทยมของสวนบนสดคอ

Determine the class average for the quiz จะเหนวาสวนบนสดหรอสวนทอปข องปญหานมเพยงสเตจเมนตเดยว และสเตจเมนตนกเปนผล จากสเตจเมนตอนๆของโปรแกรม หรอกลาวอกนยหนงกคอสวนบนสดของปญหา กคอผลลพธท เปนคาตอบของปญหา และคาตอบของปญหากไมไดบอกรายละเอยดวาจะตองเขยนโปรแกรม อยางไร ดงนนเราจะเรมจากการกลน กรองสวนบนสดของปญหา โดยการแบงสวนบนสดของปญหา ออกเปนลาดบของขนตอนการแกปญหาทละเอยดลงไปอก ซงจากการกลนกรองปญหานครงแรกจะ ไดวา Initialize variables Input, sum, and count the number of students Calculate and print the class average ผลทไดจากการกลนกรองเปนเพยงโครงรางของลาดบการทางานเพอใหไดคาตอบของปญหา

การกลนกรองในครงทสอง เปนการกาหนดตวแปรตางๆทใชแกปญหาน เมอนารหสเทยม จากการกลนกรองในครงทหนงมาวเคราะหจะพบวาตวแปรทตองใชคอ ตวแปรทใชเกบผลรวมของ คะแนน ตวแปรทใชนบจานวนนกศกษา ตวแปรทใชรบคาคะแนนของนกศกษาแตละคน และตว แปรทใชเกบคาเฉลย ดงนนจากสเตจเมนตของรหสเทยม Initialize variables ผลจากการกลนกรองในขนทสองนจะไดเปน Initialize total to zero Initialize counter to zero จะเหนวาตวแปรทตองกาหนดคาเรมตนมสองตวคอ total และ counter ทตองกาหนดใหมคาเทากบ ศนย สวนเหตผลทตองกาหนดคาเรมตนของทงสองตวแปรตวนกมาจากเหตผลเดยวกบโปรแกรม gpa.c ทไดอธบายไปแลวในหวขอกอนหนาน รหสเทยมในลาดบตอมาทจะตอง กลนกรองในครงท สองคอ Input, sum, and count the number of students ในสเตจเมนตนตองการโครงสรางทมการวนซาเพอทจะอานคะแนนเขามา เนองจากยงไมทราบว จะตองอานคะแนนเขามาจานวนกคน จงตองใชสญญาณการหยดการวนซา เมอผใชโปรแกรมปอ คะแนนของนกศกษาทกคนเรยบรอยแลวกจะปอนคาสญญาณการหยด เมอโปรแกรมตรวจสอบพบ สญญาณการหยด เงอนไขในสเตจเมนต while กจะเปนเทจ และผลจากการกลนกรองของบรรทดน จะไดรายละเอยดดงน

Input the first score /* ป อนคะแนนแรกเกบไวทตวแปร score*/

Page 17: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 45

While the user has not as yet entered the sentinel /*เมอยงไมป อนสญญาณการหยด */ Add the score into the running total /* เกบผลรวมของคะแนนไวท total */ Add one to the counter /* เพมคาตวนบไปอกหนง */ Input the next score (possibly the sentinel) /* อานขอมลมาเกบท score */

สงเกตวาจากรหสเทยมในสวนนจะใชการยอหนา เพอใหทราบวาสวนทยอหนาทงหมดอยในการ ควบคมของสเตจเมนต while

สเตจเมนตสดทายจากการกลนกรองครงแรกคอ Calculate and print the class average เมอกลนกรองใน ครงทสองจะไดวา If the counter is not equal to zero /* ถาจานวนนกศกษาไมเทากบศนย */ Set the average to the total divided by the counter /* คานวณคาเฉลย*/ Print the average /* พมพคาเฉลย */ else /* ในกรณทจานวนนกศกษาเทากบศนย */ Print “No score were entered”/*ใหพมพขอความบอกวายงไมไดป อนคะแนน*/ สงเกตวาในรหสเทยมนไดมการปองกนกรณของการหารดวยศนย เมอผใชไมไดปอนคะแนนเขามา เนองจากไดกาหนดคาเรมตนของตวแปร counter ไวใหเทากบศนย ถาไมไดตรวจสอบสวน นเอาไว กจะทาใหเกด ขอผดพลาดขนรายแรง (Fatal error) ในขณะประมวลผลโปรแกรม และผลจากการกลนกรองในครงทสองทงหมดกจะไดรหสเทยมดงตอไปน

Initialize total to zero Initialize counter to zero Input the first score

While the user has not as yet entered the sentinel Add this score into the running total Add one to the counter

Input the next score (possibly the sentinel) If the counter is not equal to zero

Set the average to the total divided by the counter Print the average else Print “No score were entered”

จากการออกแบบดวยเทคนคทอปดาวนกบปญหาการคานวณคะแนนเฉลย เมอมการกลนกรองสองครง กจะไดรหสเทยมทสามารถนาไปแปลงเปนภาษาซไดแลว แตในบางปญหาอาจจะ ตองมการกลนกรองทมากกวาน โปรแกรม GPA_TD.c ทไดจากการแปลงรหสเทยมแบบทอปดาวน แมวาจะปอนคะแนนเปนจานวนเตม แตคาเฉลยควรจะเปนเลขทศนยมซงในภาษาซตวแปร ชนด int จะไมสามารถรองรบคาตวเลขทเปนทศนยมได ดงนนในโปรแกรมจะเรมใชตวแปรอกชนด

Page 18: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 46

หนงคอ float ทใชประกาศตวแปรชนดเลขทศนยม นอกจากนจะไดเหนการใชต วดาเนนการแปลงจากตวแปรชนดหนงไปยงอกชนดหนงทเรยกวา ตวดาเนนการแคสต (Cast operator) 1. /* GPA_TD.c เปนโปรแกรมสาหรบคานวณคะแนนเฉลย ทออกแบบดวยเทคนคจากบนลงลาง */ 2. #include <stdio.h> 3. int main() 4. { 5. int counter, score, total; 6. float average; 7. 8. total = 0; 9. counter = 0; 10. 11. printf("Enter score, -1 to end: "); 12. scanf("%d", &score); 13. while(score != -1) 14. { 15. total = total + score; 16. counter = counter + 1; 17. printf("Enter score, -1 to end: "); 18. scanf("%d", &score); 19. } 20. 21. if(counter != 0) 22. { 23. average = (float)total/counter; 24. printf("\nGPA of this class is %.2f\n\n", average); 25. } 26. else 27. printf("\nNo score were entered\n\n"); 28. 29. return 0; 30. }

(ก) เมอปอนคะแนน (ข) ไมปอนคะแนน

รปท 3.7 ผลจากการวงโปรแกรม GPA_TD รหสเทยมของโปรแกรม GPA_TD.c ไดมการยอหนาสวนทถกครอบคลม เชนสเตจเมนต

while และ if…else สาหรบสเตจเมนตทถกครอบคลมของภาษาซหรอคอมพาวนดสเตจเมนต จะตอง

Page 19: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 47

มการใสวงเลบปกกาเพอบอกขอบเขต แตจะใชการยอหนาหรอไมนนกจะไมมผลตอความถกตอง ของผลลพธ อยางไรกตามการยอหนากจะทาใหอานโปรแกรมไดงายขน

สวนทเปนคอมพาวนสเตจเม นตในภาษาซ ถาลมใสวงเลบกจะทาใหเกดความผดพลาดของ ผลลพธทได อยางในคอมพาวนดสเตจเมนต while ทครอบคลมสสเตจเมนต คอตงแตบรรทดท 15 ถง 18 ถาไมไดใสวงเลบปกกาเพอกาหนดขอบเขตของคอมพาวนดสเตจเมนตกจะไดวา

while(score != -1) total = total + score; counter = counter + 1; printf("Enter score, -1 to end: "); scanf("%d", &score);

จากรหสเทยมและโฟลวชารตในรปท 3.8 จะเหนวาถงมการยอหนาเอาไวเชนเดยวกบรหสเทยม แต การยอหนาในสเตจเมนต while กยงไมเปนคอมพาวนดสเตจเมนตอยด คอเมออานคะแนนของ นกศกษาคนแรกเขามาตวแปร score กจะเกบคะแนนของนกศกษาคนแรกเอาไว เมอเขาสวงวน while ตวแปร score กไมมทางทจะเทากบ –1 ทาใหวงวน while เขาสสภาวะของการทางานแบ บไมรจบหรอทเรยกวา “อนฟนตลป (Infinite loop)” เพราะวาวงวนของ while จะครอบคลมแคเพยงหนงสเตจเมนตคอ total = total + score นนคอ มนจะทาบรรทดนแลวกลบไปตรวจสอบเงอนไขท ยงเปนจรงอยเนองจาก score ไมไดมการปอนคาเขาไปใหม แลวกกล บมาทาบรรทด total = total +

score อก และจะวนอยเชนนไมมทางทจะออกจากวงวนไปไดเลยจงทาใหไดชอวาวงวนไมรจบ

score != 1

total = total + score

counter = counter + 1

printf(“Enter score, -1 to end: ”);

scanf(“%d”, &score);

counter != 0

average = (float)total/counter;

printf("\nGPA of this class is %.2f\n\n", average);

printf("\nNo score were entered\n\n");

yes

yesno

no

(ก) กาหนดคอมพาวนดสเตจเมนต ของ while ถกตอง

Page 20: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 48

score != 1

total = total + score

counter = counter + 1

printf(“Enter score, -1 to end: ”);

scanf(“%d”, &score);

counter != 0

average = (float)total/counter;

printf("\nGPA of this class is %.2f\n\n", average);

printf("\nNo score were entered\n\n");

yes

yesno

no

(ข) กาหนดไมครอบคลม

รปท 3.8 โฟลวชารตสวนของโปรแกรมในสเตจเมนต while และ if…else

จากรปท 3.8(ข) ในกรณทไมไดปอนคะแนน แตปอน –1 ตวแปร total จะมคาเทากบ 0

เนองจากเงอนไขใน while เปนเทจกเลยไมทาบรรทด total = total + score แตจะขามมาบรรทด counter = counter + 1; ทาให counter ไมเทากบ 0 และมการใหปอนคะแนนอกครงหนงแตจะไมม ผลอะไร เนองจาก score ไมไดวนกลบขนไปทวงวน while อกแลว สเตจเมนตตอไปทจะทาคอ if…else เมอ counter ไมเทากบ 0 กจะทาทบรรทดท 23 และ 24 คอคานวณคาเฉลยและพมพซงจะพมพคาเฉลยเทากบ 0 เนองจาก total = 0 ดงนนการเขยนโปรแกรมจะตองรอบครอบ ขอบเขตของหรอเซตของสเตจเมนตตางๆจะตองกาหนดใหถกตอง

โดยทวไปคาเฉลยจะมจดทศนยม ซงภาษาซจะแทนขอมลชนดนดวย float ในโปรแกรม GPA_TC.c ไดประกาศตวแปร average เปนชนด float ไวในบรรทดท 6 เพอไวเกบผลการคานวณทเปนเลขทศนยม อยางไรกตามผลหาร total/counter จะเปนจานวนเตม เนองจากทงตวแปร total

และ counter ตางเปนจานวนเตม เมอนาตวแปรชนดจานวนเตมหารดวยจานวนเตม ผลลพธทไดกจะ เปนจานวนเตมทมการปดเศษทง (Truncation) เพอไมใหมการปดเศษทงจากกรณดงกลาว กตอง สรางคาชวขณะหรอชวคราว (Temporary value) ไวเกบคาทไดจากการคานวณดวย ตวดาเนนการแคสต ทไดใชในบรรทดท 23 คอ

Page 21: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 49

average = (float)total/counter;

ตวดาเนนการแคสตทใชในทนคอ (float) ซงเปนตวสรางเลขทศนยมขนมาชวคราวจากตวแปร total

โดยคาทเกบอยในตวแปร total ยงคงเปนเลขจานวนเตม การใชตวดาเนนการแคสตในลกษณะนจะเรยกวา “การแปลงโดยตรง (Explicit conversion)”

การคานวณในบรรทดท 23 ประกอบดวยเลขทศนยม (คอคาชวคราวท ถกแปลงมาจากตวแปร total) ทหารดวยเลขจานวนเตมในตวแปร counter คอมไพเลอรมขนตอนการประเมนนพจนทมตวแปรตางชนดกน เพอใหโอเพอแรนดของตวดาเนนการแคสตเปนชนดเดยวกน คอมไพเลอรจะ กระทากระบวนการทเรยกวา “การแปลงโดยออม (Implicit conversion)” กบโอเพอแรนดตางๆ ทถกเลอก เชนในนพจนทมชนดขอมลเปน int และ float ตวแปรชนด int กจะถกเลอกและจะแปลงใหเปนตวแปรชนด float ดงนนในบรรทดท 23 ตวแปร counter กจะถกทาสาเนาใหเปนชนด float

ทาใหการคานวณทางขวามอของเครองหมายเทากบเปนการ หารเลขทศนยม แลวนาคาทไดไปเกบใน average ซงเรองการแปลงชนดของตวแปรจะไดอธบายกนอกในบทตอไป

ตวดาเนนการแคสตสามารถใชแปลงตวแปรไดทกชนด ตวแปรทตองการแปลงใหเปนขอมลชนดใดกจะใสวง เลบชนดขอมลทตองการไวขางหนาตวแปรนนๆ ดงทเหนในบรรทดท 23 ของโปรแกรม GPA_TD.c คอใสวงเลบ (float) ไวหนาตวแปร total ขอสงเกตอกอยางหนงคอตวดาเนนการแคสตจะมลาดบความสาคญของการประมวลผลสงกวาตวดาเนนการคณ หาร และหารเหลอเศษ อยางในบรรทดท 23 ทมตวดาเนนการหาร แตคอมไพเลอรจะแปลงขอมลก อนการหาร คอแปลงตวแปร total ใหเปนชนด float กอน

ในบรรทดท 24 ของโปรแกรม GPA_TD.c ฟงกชน printf ใชตวกาหนดการแปลง %.2f

เพอพมพคาเฉลยจากตวแปร average ตวอกษร f ทอยหลง %.2 ใชระบวาตวแปรทพมพเปนทศนยม

สวนจดทตามดวยเลขสองหรอ .2 คอจานวนตวเลขหลงจดทศนยมทตองการพมพ ในทนเปนการพมพตวเลขหลงจดสองตว ถาไมไดกาหนดวาใหพมพจานวนตวเลขหลงจดทศนยมกตว ตว กาหนดการแปลงกจะอยในรป %f ภาษาซกจะกาหนดระดบความถกตองหรอจานวนตวเลขหลงจด ใหเอง (Default precision) ซงโดยปกตแลวจะมหกตว (หรอ %.6f นนเอง )

เมอเลขทศนยมถกพมพโดยการกาหนดจานวนตวเลขหลงจด กจะมการปดเศษทเหลอทง (Rounded) เพอใหไดคาตวเลขตามระดบความถกตองทตองการ เชนเมอตองการพมพคา 3.446 ถาระบตวกาหนดการแปลงเปน “%.2f” ผลลพธทไดคอ 3.45 แตถากาหนดเปน “%.1f” ผลลพธทไดคอ 3.4 จะเหนวามการปดเศษตามจานวนทระบไวหลงจด คอจะพจารณาตาแหนงถดไปวามากกวาหรอ นอยกวา 0.5 ถามากกวากจะปดขนถานอยกวากจะปดทง เชน ถากาหนดเปนสองตาแหนงกจะมการ พจารณาตาแหนงทสามว ามากวาหรอนอยกวา 0.5 นนคอทศนยมตาแหนงทสามของ 3.446 คอ 0.6

ซงมากกวา 0.5 กจะปดขนโดยปดทศนยมตาแหนงทสองใหมคาเพมขนอก 0.1 นนคอ 3.45 แตใน

Page 22: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 50

กรณทตองการแสดงหนงตาแหนง กจะพจารณาทศนยมตาแหนงทสองวามากกวาหรอนอยกวา 0.5 ซงในทนนอยกวา 0.5 กเลยปดทงทาใหคาทพมพคอ 3.4

3.10 รงโครงสรางการควบคม

จากกรณศกษาของหวขอทแลวทพจารณาถงการควบคมการจดวางสเตจเมนตซอนกนอยาง เปนลาดบเหมอนกบการนาบลอกโครงสรางมาวางเรยงตอกน ในหวขอนลาดบขนตอนการทางาน ของสเตจเมนตจะซบซอนขน มการผสมผสานโครงสรางทงสามแบบเขาดวยกนคอมทงโครงสราง เชงลาดบ ทางเลอกและการทาซา ซงทาใหเกดโครงสรางอกแบบหนงของการควบคมสเตจเมนตท เรยกวารงโครงสรางการควบคม (Nested control structures) ทกาลงจะศกษากนจากตวอยาง ของปญหาตอไปน

สถาบนแหงหนงไดเปดอบรม เพอเตรยมนกศกษาทจะสอบใบอนญาตสาหรบเปนตวแทนซอขายอสงหารมทรพย เนองจากในปทผานมาไดมนกศกษาหลายคนทผานวชานไดใบอนญาต ในทนสถาบนตองการทจะทราบวานกศกษาจะทาผลสอบไดดขนาดไหน

ใหเขยนโปรแกรมสรปผลการสอบ โดยมรายชอของนกศกษา 10 คน แตละคนจะถกกาหนดดวยคา 1 ถาผานการสอบและ 2 สาหรบกรณทไมผาน

โปรแกรมทเขยนขนจะตองสามารถดาเนนการไดดงน 1. ใหปอนผลการสอบของนกศกษาทงหมด โดยแสดงขอความ “Enter result”และให

ปอน 1 หรอ 2 แทนผลสอบผานและไมผานโดยลาดบ

2. นบจานวนของผลสอบวาผานกคนตกกคน

3. แสดงผลสรปการสอบวาผานกคนตกกคน

4. ถามนกศกษาสอบผานมากกวา 8 คนใหพมพขอความ “Raise tuition”

หลงจากทอานปญหานแลวใหพจารณาขอสงเกตดงตอไปน 1. โปรแกรมจะประมวลผลการสอบของนกศกษา 10 คน โดยใชตวนบควบคมการทาซา

2. ผลสอบถกบนทกดวยคาตวเลข 1 หรอไมก 2 โดยแตละครงทโปรแกรมอานผลสอบ จะตองทดสอบวาคาทปอนเขามาเปน 1 หรอ 2 ถาคาทอานเขามาไมใช 1 กใหกาหนด เลยวามคาเทากบ 2

3. ใชตวนบสองตว โดยตวแรกจะนบคนทสอบผานและต วทสองจะใชนบคนทไมผาน

4. เมอทราบผลการนบแลว จะตองตดสนใจวามนกศกษาผานมากกวา 8 คนหรอไม เมอแกปญหานดวยวธการออกแบบจากบนลงลาง รหสเทยมสวนบนสดหรอผลลพธของ

ปญหานคอ Analyze exam results and decide if tuition should be raised

Page 23: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 51

นนคอสวนบนสดของปญหาเปนการวเคราะหผลการสอบและการตดสนใจขนคาสอน เมอการ กลนกรองอกหลายๆครง เพอใหไดรหสเทยมทดกอนทจะแปลงเปนภาษาคอมพวเตอร ซงผลการ กลนกรองในครงแรกคอ Initialize variables Input the ten quiz grades and count passes and failures Print a summary of the exam results and decide if tuition should be raised จากการกลนกรองครงแรก ทาใหไดขนตอนและเหนวธการทจะดาเนนการไดชดเจนขน คอมการ กาหนดคาเรมตนใหกบตวแปรทตองใช ซงประกอบดวยตวทใชนบผลการสอบวา ผานหรอตก และตวนบทใชควบคมการวนซาเมอปอนผลสอบ และอกตวแปรหนงทจาเปนตองใชสาหรบเกบคาจา การปอนขอมล

สาหรบรหสเทยมในสวนของการกาหนดคาเรมตนจากการกลนกรองในครงแรก Initialize variables เมอถกกรองในครงทสองจะได Initialize passes to zero Initialize failures to zero Initialize student to one

สาหรบรหสเทยมของการปอนขอมลจากการกลนกรองครงแรกคอ

Input the ten quiz grades and count passes and failures ในบรรทดนจะมการวนซาเพออานผลการสอบเขามา โดยจานวนรอบของการวนซา จะตองทรลวงหนา จงตองมการควบคมตวนบจานวนการวนซาทเหมาะสม สวนภายในวงวนทเปรยบเสมอนร หรอสงทซอนอยในวงวน จะมสเตจเมนตทมการเลอกแบบสองทางเพอใชเลอกวาผลการสอบใดท ผานและผลการสอบใดทตก หลงจากนนจะเพมคาของตวนบทสอดคลองกบผล สอบ จากผลการกลนกรองรหสเทยมในครงทสองนคอ While student counter is less than or equal to ten Input the next exam result If the student passed Add one to passes else Add one to failures Add one to student counter

สเตจเมนตสดทายจากการกลนกรองครงแรกคอ

Print a summary of the exam results and decide if tuition should be raised เมอกลนกรองในครงทสองจะไดวา Print the number of passes Print the number of failures If more than eight students passed

Page 24: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 52

Print “Raise tuition”

จากการกลนกรองในขนทสองจะไดรหสเทยมทสามารถนาไปเขยนเปนโปรแกรมไดโดยงาย ซงรหสเทยมทงหมดจากขนทสองคอ Initialize passes to zero Initialize failures to zero Initialize student to one While student counter is less than or equal to ten Input the next exam result If the student passed Add one to passes else Add one to failures Add one to student counter Print the number of passes Print the number of failures If more than eight students passed Print “Raise tuition”

โปรแกรม AnalyzeExam.c เปนการนารหสเทยมทผานการกลนกรองอยางเพยงพอแลวมา แปลงเปนภาษาซ และในโปรแกรมนจะกาหนดคาเรมตนในสเตจเมนตเดยวกนกบการประกาศตว แปร ซงการกาหนดคาเรมตนเชนนจะเกดขนตอนคอมไพลโปรแกรม

1. /* AnalyzeExam.c is used to anylysis of examination results */ 2. #include <stdio.h> 3. int main() 4. { 5. int passes = 0; 6. int failures = 0; 7. int student = 1; 8. int result; 9. 10. while(student <= 10) 11. { 12. printf("Enter result (1=pass, 2=fail): "); 13. scanf("%d", &result); 14. if(result == 1) 15. passes = passes + 1; 16. else 17. failures = failures + 1; 18. student = student + 1; 19. } 20. 21. printf("\nPassed %d", passes); 22. printf("\nFailed %d\n\n", failures); 23. if(passes > 8) 24. printf("Raise tuition\n\n"); 25. return 0;

Page 25: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 53

26. }

3.11 ตวดาเนนการกาหนดคา ภาษาซมตวดาเนนการกาหนดคาหลายรปแบบดวยกน อยางทไดเคยใ ชมาแลวเชน

x = x + 5;

ซงสามารถเขยนในรปยอ ดวยตวดาเนนการกาหนดคาการบวก += คอ x += 5;

ตวดาเนนการ += จะบวกคานพจนทางขวามอของตวดาเนนการกบคาของตวแปรทางซายมอของ เครองหมายเทากบ แลวเกบผลลพธทไดไวในตวแปรทางซายมอของเครองหมายเทา กบ ดงนนสเตจ เมนตใดๆทอยในรป

ตวแปร = นพจนตวดาเนนการของตวแปร;

โดยตวดาเนนการของตวแปรจะตองเปนตวดาเนนการไบนาร เชน +, -, *, / หรอ % กจะสามารถเขยนในรปยอไดเปน

ตวแปร ตวดาเนนการ= นพจน

ตารางตอไปนเปนการกาหนดคาทางคณตศาสตรของ นพจนอยางงาย โดยใชตวดาเนนการรปยอและ แบบปกต เมอกาหนดให int a=3, b=4, c=6, d=5, e = 10; ตวดาเนนการกาหนดคา รปยอ รปปกต การกาหนดคา += a += 7; a = a + 7; เอาคา 10 ไปเกบไวท a

-= b -= 5; b = b – 5; เอาคา –1 ไปเกบไวใน b

*= c *= 2; c = c * 2; เอาคา 12 ไปเกบไวใน c

/= d /= 5; d = d/5; เอาคา 1 ไปเกบไวใน d

%= e %= 3; e = e%3; เอาคา 1 ไปเกบไวใน e

3.12 ตวดาเนนการเพมและตวดาเนนการลดคา ภาษาซมตวดาเนนการยนาร (Unary operators) อกสองตวคอ ตวดาเนนการเพมคา

(Increment operator) ทใชเครองหมาย ++ แทนการเพมคาตวแปรครงละหนง สวนอกตว ดาเนนการหนงจะใชในการลดคาลง (Decrement operator) ทแทนดวยเครองหมาย -- ซงเปนการลดคาตวแปรลงครงละหนง และทงสองตวดาเนนการนไดสรปคณสมบตเอาไวในตารางขางลาง

จากตารางตวดาเนนการเพมแล ะลดคาลงครงละ 1 เมอเขยนตวดาเนนการวางไวหนาตวแปรจะเรยกวา ตวเพมคากอน (Preincrement) และตวลดคากอน (Predecrement) โดยลาดบ สวนตวดาเนนการเพมและลดคาลงทวางไวหลงตวแปรจะเรยกวา ตวเพมคาทหลง (Postincrement) และตวลดคาทหลง (Postdecrement) โดยลาดบ

Page 26: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 54

ดงนนในโปรแกรม AnalyzeExam.c จากหวขอกอนหนาน ซงมการเพมคาตวแปรทเขยน อยในรป

passes = passes + 1; failures = failures + 1;

student = student + 1;

ทสามารถเขยนในรปยอไดเปน passes += 1; failures += 1;

student += 1;

หรออาจจะแทนดวยตวเพมคากอน ++passes; ++failures; ++student;

หรออาจจะแทนทดวยตวเพมคาทหลง passes++; failures++; student++;

ซงรปแบบของการเพมคาทงหมดนยงคงทาใหโปรแกรม AnalyzeExam.c ยงคงไดผลลพธเทาเดม

Page 27: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 55

ตวดาเนนการ ++, --, +, และ – จะมลาดบความสาคญของการประเมนผลสงกวา *, /, และ %

แตตวดาเนนการ ++, --, +, และ – จะเรมประมวลผลจากขวาไปซาย สาหรบ + และ – ในทนไมใช การบวกหรอลบแตเปนการกาหนดคาใหตวแปรวาเปนคาบวกหรอลบ เชน int a = -5; ซงเปนการกาหนดคา –5 ใหกบตวแปร a แตในกรณเครองหมายบวกจะไมนยมใส กน เชน int b = +5; แตสวน ใหญแลวจะกาหนดเปน int b = 5;

แบบฝกหด

1. ใหตอบคาถามแตละขอตอไปน ก) ขนตอนสาหรบแกปญหาใดๆ ทอยในเทอมของลาดบการดาเนนการเพอใหไดมาซงคาตอบ

ของปญหานนๆ จะเรยกวา ข) คาสงทเรยงตอกนตามลาดบและสามารถประมวลผลลาดบคาส งเหลานนดวยคอมพวเตอร

จะเรยกเซตของคาสงนวา

ตวดาเนนการ ตวอยางน พจน คาอธบาย

++ ++a เปนการบวกคา 1 เพมเขาไปในตวแปร a (a=a + 1;)

แต ++a จะมการเพมคาของ a กอนทจะนา a ไปใชในนพจน เชนเมอ a = 2; printf(“%d”, ++a); คาทพมพไปทหนาจอคอ 3

++ a++ เปนการบวกคา 1 เพมใหกบตวแปร a เชนเดยวกบ ++a แต a++ จะเพมคาของ a หลงจากทออกจากนพจน เชนเมอ a = 2; printf(“%d”, a++); คาทพมพไปทหนาจอคอ 2 และคาใน a จะเปลยนเปน 3

−− −−a เปนการลบคาออกจากตวแปร a ออกไป 1 จะมคณสมบตคลาย ++a นนคอ --a จะลดคาลงกอนการ ประมวลผลในนพจนทม --a อย เชนเมอ a = 4;

printf(“%d”, --a); คาทพมพไปทหนาจอคอ 3

−− a−− เปนการลบคาออกจากตวแปร a ออกไป 1 จะมคณสมบตคลาย a++ คอ a-- จะลดคาลงหลงจากมนออกจากนพจนทฝงตวอย เชนเมอ a = 4;

printf(“%d”, a--); คาทพมพไปทหนาจอคอ 4 แตคา ใน a จะเทากบ 3

Page 28: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 56

ค) ทกโปรแกรมสามารถออกแบบดวยสเตจเมนตการควบคมสามชนดมสเตจเมนตใดบาง ง) สเตจเมนตทใชในการเลอกกระทาการอยางหนงเมอเงอนไขเปนจรง และดาเนนการอก

อยางหนงเมอเงอนไขเปนเทจคอ

จ) หลายๆสเตจเมนตทถกรวมเขาดวยกนอยในวงเลบปกกาจะถกเรยกวา ฉ) สเตจเมนตการวนซาใดทกาหนดไววา สเตจเมนตหรอกลมของสเตจเมนตทอยภายใต

เงอนไขการวนซาจะถกประมวลผลในขณะทเงอนไขยงคงเปนจรง

ช) การควบคมการวนซาทตองกาหนดจานวนครงของการทาซาจะเรยกวาอะไร

ซ) วธใดทใชออกจากสเตจเมนตการวนซาทไมทราบจานวนรอบของการวนซาทแนนอน

2. ใหเขยนสเตจเมนตภาษาซสแบบสาหรบการบวกจานวนเตม x ดวยหนงและเกบผลบวกไวใน x

3. ใหเขยนสเตจเมนตของภาษาซเพยงสเตจเมนตเดยวสาหรบแตละขอตอไปน ก) ใหกาหนดคาผลบวกของตวแปร x และ y ไวในตวแปร z แลวบวก x ดวยหนง ข) ใหคณตวแปร product ดวย 2 โดยใชตวดาเนนการ *=

ค) ทดสอบคาของตวแปร counter วามคามากกวาสบหรอยง ถามากกวาใหพมพขอความ “Counter is greater than 10.”

ง) ลดคาของตวแปร x ลงมาหนง แลวนาคาไปลบออกจากตวแปร total

จ) คานวณคาผลบวกของ x กบ total แลวเกบไวในตวแปร total หลงจากนนใหลดคา x ลงหนงคา

ฉ) พมพคา 3.14159 เปนเลขทศนยมสองตาแหนงไปทจอภาพ

4. ใหเขยนภาษาซจากขอกาหนดตอไปน ก) ประกาศตวแปร sum และ x เปนชนดจานวนเตม

ข) กาหนดคาเรมตนของ x ใหเทากบหนง

ค) กาหนด คาเรมตนของ sum ใหเทากบศนย

ง) บวกคาในตวแปร x กบตวแปร sum แลวกาหนดใหตวแปร sum

จ) ใหแสดงขอความ “The sum is : ” และตามดวยการพมพคาของตวแปร sum

5. ใหรวมสเตจเมนตตางๆจากขอ 4. ใหอยในรปของโปรแกรมทคานวณผลรวมของจานวนเตมจาก 1 ถง 10 โดยใชวงวน while ดวยการเพมคาของตวแปร x

6. ตวแปร product และ x มคาเทาไรหลงจากทคานวณสเตจเมนต product += x++;

โดยท x และ product กอนคานวณมคาเทากบ 5

7. ใหเขยนโปรแกรมภาษาซจากขอกาหนดตอไปน ก) อานขอมลเปนเลขจานวนเตมจากคยบอรดมาสองคาโดยคาหนงเกบไ วในตวแปร x และอก

คาหนงเกบในตวแปร y ดวยฟงกชน scanf

ข) กาหนดคาเรมตนใหกบตวแปรจานวนเตมบวก j ใหเทากบ 1

Page 29: บทที่3 โปรแกรมเชิงโครงสร ้างstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch3.pdfบทท 3 โปรแกรมเช งโครงสร

..\PoP\sathit Edit 22042010 by Sathit Intajag 57

ค) กาหนดคาเรมตนใหกบตวแปรจานวนเตมบวก power ใหเทากบ 1

ง) คณตวแปร power ดวย x แลวกาหนดคาใหกบ power

จ) เพมคาใหกบ j ดวย 1

ฉ) ตรวจสอบเงอนไขถา j นอยกวาหรอเทากบ y ใหกลบไปทาขอ ง) ถง จ) แลวกลบมาตรวจสอบเงอนไขในขอนใหมจนกระทงเงอนไขเปนเทจจงไปทาขอ ช )

ช) แสดงขอความ “pow(x, y) =” ตามดวยคาตวแปร power

8. ใหบอกขอผดพลาดและแกไขใหถกตองสาหรบแตละขอตอไปน ก) c = 1

while(c<=5) { product *= c; c++;

ข) scanf(“%.4f”, &value);

ค) if(gender == 1) printf(“Woman\n”);

else; printf(“Man\n”);

9. การหาผลรวมจากตวนบถอยหลงจาก 100 ถง 1 ตามสเตจเมนตตางๆ ตอไปนใหหาขอผดพลาด และใหแกไขใหถกตอง Int z=100, sum=0; while(z>=100) sum += z;