บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit...

20
..\PoP\sathit Edit:22June2010 20 บทที2 การโปรแกรมภาษาซีเบื้องต ้น วัตถุประสงค์ 1. เพื่อให้สามารถเขียนโปรแกรมภาษาซีในขั ้นพื ้นฐานได 2. สามารถใช้ถ้อยแถลงหรือสเตจเม็นต์ (Statements) อินพุตและเอาต์พุตได้ 3. เพื่อทําความคุ้นเคยกับชนิดของข้อมูลพื ้นฐาน 4. เข้าใจความสัมพันธ์ระหว่างหน่วยความจําของคอมพิวเตอร์กับตัวแปร 5. สามารถใช้ตัวดําเนินทางคณิตศาสตร์ได้ 6. สามารถเขียนสเตจเม็นต์การตัดสินใจอย่างง่ายได้ บทนํา จากบทที1 ที่ได้ศึกษาหลักเบื ้องต ้นของการเขียนโปรแกรมคอมพิวเตอร์จากภาษาสัญลักษณ์ ในบทนี ้จะได้ศึกษาการเขียนโปรแกรมภาษาคอมพิวเตอร์ที่ใช้งานได้จริง ภาษาที่นํามาเป็นเครื่องมือ ในการศึกษาคือภาษาซีที่สนับสนุนการออกแบบโปรแกรมอย่างเป็นระเบียบแบบแผน และสามารถ รองรับการออกแบบโปรแกรมเชิงโครงสร้าง ซึ ่งถูกใช้เป็นพื ้นฐานในการเรียนรู ้หลักการเขียน โปรแกรม แต่ในเบื ้องต้นจะอธิบายด้วยตัวอย่างโปรแกรมที่แสดงถึงคุณลักษณะที่สําคัญของภาษาซี ขอให้ทําความเข้าใจ วิเคราะห์ให้ถี่ถ้วนสําหรับแต่ละตัวอย่างที่นํามาแสดง การเขียนโปรแกรมอย่างง่าย ภาษาซีใช้เครื่องหมายต่างๆที่อาจจะทําให้ผู้ที่ไม่คุ้นเคยกับภาษาคอมพิวเตอร์แลดูแปลกตา เรา จะเริ่มจากการพิจารณาโปรแกรมอย่างง่ายของภาษาซี ตัวอย่างแรกจะเริ่มจากการพิมพ์ตัวอักษร บรรทัดหนึ ่ง โปรแกรมและผลลัพธ์ที่พิมพ์ออกไปที่จอภาพได้แสดงไว้ในรูปที2.1 /* 1 */ /* Ex201.c ตัวอยางโปรแกรมแรกของภาษาซี */ /* 2 */ /* 3 */ #include <stdio.h> /* 4 */ int main() /* 5 */ { /* 6 */ printf("Welcome to C!\n"); /* 7 */ return 0; /* indicate that program ended successfully */ /* 8 */ } /* end function main */ () โปรแกรมพิมพ์ข้อความไปที่จอภาพ Welcome to C! () ผลลัพธ์ของโปรแกรม รูปที2.1 โปรแกรมการพิมพ์ตัวอักษร

Transcript of บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit...

Page 1: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 20

บทท 2 การโปรแกรมภาษาซเบองตน

วตถประสงค

1. เพอใหสามารถเขยนโปรแกรมภาษาซในขนพนฐานได

2. สามารถใชถอยแถลงหรอสเตจเมนต (Statements) อนพตและเอาตพตได

3. เพอทาความคนเคยกบชนดของขอมลพนฐาน

4. เขาใจความสมพนธระหวางหนวยความจาของคอมพวเตอรกบตวแปร

5. สามารถใชตวดาเนนทางคณตศาสตรได

6. สามารถเขยนสเตจเมนตการตดสนใจอยางงายได

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

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

การเขยนโปรแกรมอยางงาย

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

/* 1 */ /* Ex201.c ตวอยางโปรแกรมแรกของภาษาซ */ /* 2 */ /* 3 */ #include <stdio.h> /* 4 */ int main() /* 5 */ { /* 6 */ printf("Welcome to C!\n"); /* 7 */ return 0; /* indicate that program ended successfully */ /* 8 */ } /* end function main */

(ก) โปรแกรมพมพขอความไปทจอภาพ Welcome to C!

(ข) ผลลพธของโปรแกรม

รปท 2.1 โปรแกรมการพมพตวอกษร

Page 2: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 21

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

บรรทดท 1 ของโปรแกรมคอ /* 1 */ /* Ex201.c ตวอยางโปรแกรมแรกของภาษาซ */

เรมดวยเครองหมาย /* และปดดวย */ แสดงวาขอความทอยในเครองหมายนเปนคาอธบาย

(Comment) ทผเขยนโปรแกรมใสไว เพอเปนเอกสารประกอบทชวยใหอานโปรแกรมเขาใจไดงายขน คาอธบายโปรแกรมจะไมมผลใดๆกบคอมพวเตอรเมอมการประมวลผล เพราะคอมไพเลอรจะขามสวนทเปนคาอธบาย นนคอจะไมมสวนของคาอธบายปรากฏอยในภาษาเครองทเปนออฟเจกตโคต อยางคาอธบายในบรรทดท 1 จะบอกชอโปรแกรม คอ Ex201.c ตามดวยจดประสงคของโปรแกรมนวาใชทาอะไร จะเหนวาคาอธบายชวยใหคนอนอานโปรแกรมไดงายขน การเขยนคาอธบายในโปรแกรมภาษาซอยาลมขนตนดวย /* แลวอยางลมปดคาอธบายดวย */ เสมอ ไมเชนนนโปรแกรมจะมขอผดพลาดในขนตอนคอมไพล สวน /* 1 */ กถอเปนคาอธบายเชนกนกคอใชบอกวาเปนบรรทดท 1 ของโปรแกรม

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

/* 1 Ex201.c ตวอยางโปรแกรมแรกของภาษาซ */ แตถาคาอธบายยาวกวาหนงบรรทด กสามารถเขยนคาอธบายตอกนไดหลายบรรทด เชน

/* 1 Ex201.c 2 ตวอยางโปรแกรมแรกของภาษาซ */

จะเหนวาในกรณน บรรทดแรกยงไมจบดวย */ สวนในบรรทดทสองกไมตองขนตนดวย /* แตเมอจบคาอธบายในบรรทดทสองกจะปดดวย */

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

บรรทดท 3 คอ #include <stdio.h> เปนพรโพรเซสเซอรไดเรกตฟ (Preprocessor

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

Page 3: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 22

เปนชอของตวแปรได และในบรรทดพเศษนเปนการรวมเอาไฟลสวนหวหรอทเรยกวา “เฮดเดอรไฟล (Header file)” สาหรบใชเชอมโยงไปยงชอฟงกชนทเรยกใชจากไลบรารมาตรฐาน

เฮดเดอรไฟล stdio.h เปนทรวมของฟงกชน ตวแปร และคาคงททเกยวของกบอนพตและเอาตพตของคอมพวเตอร อยางในทนโปรแกรมไดเรยกใชฟงกชน printf ซงอยในบรรทดท 6 ของโปรแกรม เมอทาการเชอมโยงหรอลงคโปรแกรมน ตวดาเนนการเชอมโยงหรอลงเกอรจะนาออฟเจกตโคตของฟงกชน printf จากไลบรารมาตรฐานมาใสเขาไปทบรรทดท 6 เพอใหโปรแกรมทเขยนขนเรยกใชฟงกชน printf ได

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

บรรทดท 4 คอ int main() เปนการนยามฟงกชน เราคนเคยกบฟงกชนคณตศาสตร เชนฟงกชน sin(x) ถาเปรยบเทยบกนโดยเขยนฟงกชนไซนในรปเตมคอ double sin(double x) เมอ sin คอชอฟงกชน เชนเดยวกบ main ทเปนชอฟงกชนเชนกน สวนวงเลบทตามมามไวสาหรบใสชอตวแปรทจะสงใหฟงกชน ในทนฟงกชน sin รบตวแปร x ทเปนชนดเลขทศนยม(double) สวนฟงกชน main ไมไดรบตวแปรใดๆเขามาใชในฟงกชน เมอมการเรยกใชฟงกชนเชน y = sin(π/2)

เปนการคานวณคาไซนของ x = π/2 เมอคานวณเสรจกจะสงผลลพธทเปนเลขทศนยมกลบไปให y

แตฟงกชน main เมอทางานเสรจกจะสงคากลบเปนชนดจานวนเตม (int ยอมาจาก integer)

โปรแกรมภาษาซสามารถเขยนโดยมเพยงฟงกชนเดยว หรออาจจะมมากกวาหนงฟงกชนกได แตในโปรแกรมหนงๆจะตองมฟงกชน main อยเพยงฟงกชนเดยว ซงฟงกชน main นจะเรยกวาเปน

ฟงกชนหลก คอฟงกชนอนๆทมอยในโปรแกรมจะถกเรยกผานฟงกชนนไมโดยตรงกโดยออม อยางในโปรแกรม Ex201.c น ฟงกชน main มการเรยกใชฟงกชน printf ซงเปนการเรยกโดยตรง แตถาฟงกชน printf มการเรยกใชฟงกชนอนอกทหนงกเปนการเรยกใชโดยออมคอมการเรยกใชผานฟงกชน printf

ทกๆฟงกชนจะเรมดวยวงเลบปกกาเปด { ซงอยในบรรทดท 5 สวนวงเลบปด } ทคกน จะบอกถงจดสนสดของฟงกชนซงถกกาหนดไวในบรรทดท 8 คาสงทอยภายในวงเลบปกกาถกเรยกวา บลอก ซงเปนสวนสาคญในภาษาซททาใหแตละฟงกชนทางานแตกตางกน สาหรบการออกแบบบลอกจะไดศกษากนอยางละเอยดจากบททสามถงบททหา

บรรทดท 6 คอ printf(“Welcome to C!\n”); เปนการเรยกใชฟงกชน printf ทเปนคาสงใหคอมพวเตอรดาเนนการพมพขอความออกไปทจอภาพ สวนทอยในวงเลบของฟงกชนนเปนขอความ “Welcome to C!” ทถกปอนให printf ขอความในภาษาซจะเรยกวา สตรง (String) จะเขยนอยภายในเครองหมายคาพดซงบางครงจะเรยกวา สตรงของตวอกษร (Character string) หรอขอความ (Message) บรรทดนประกอบดวยชอฟงกชน printf ตามดวยตวแปรทอยในวงเลบของ

Page 4: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 23

ฟงกชนหรอทเรยกวา “อารกวเมนต (Argument)” สดทายจะตามดวยเครองหมาย เซมโคลอน

(Semicolon ;) เปนการบอกจบหรอปดคาสงในบรรทดน และทงบรรทดนจะถกเรยกวา สเตจเมนต (Statement) ทกๆสเตจเมนตของภาษาซจะจบดวยเครองหมายเซมโคลอน เมอบรรทดนถกประมวลผลกจะปรากฏขอความ Welcome to C! ทจอภาพ

การพมพตวอกษรตางๆทอยในเครองหมายคาพดของสเตจเมนต printf ใหสงเกตวาตวอกษร \n ไมถกพมพออกไปทผลลพธรปท 2.1(ข) เนองจากฟงกชน printf จะถอวาเครองหมาย \ แบคก-

สแลซ (Backslash) เปนกลมของตวอกษรทเรยกวา เอสแคปคาแรกเตอร (Escape character) ซงมหนาททาอะไรบางอยางทนอกเหนอจากตวอกษรปกต เมอมแบคกสแลซอยในสตรง คอมไพเลอรจะมองหาตวอกษรถดไป เพอนาแบคกสแลซมารวมกบตวอกษรทตามมาซงจะเปนเอสแคปซเควนซ (Escape sequence) แลวแปลความหมาย อยางในทนคอ \n ซงมความหมายเทากบการขนบรรทดใหม ในตารางท 2.1 ไดแสดงเอสแคปซเควนซไวบางสวน

จากตารางท 2.1 มเอสแคปซเควนซทดแตกตางจากตวอนๆอยสองตวคอ แบคกสแลซ กบเครองหมายฟนหน ทเปนเชนนเนองจาก แบคกสแลซ มความหมายพเศษเพราะเปนเอสแคปคาแรกเตอร ถาตองการพมพเครองหมายแบคกสแลซ \ ใหปรากฏอยในสตรงจะตองใชแบคกสแลซสองตวพมพตดกน สวนการพมพเครองหมายฟนหนนนจะตองม \ นาหนาเพราะขอความทปรากฏในเครองหมายคาพดเปนเครองหมายฟนหนเปดและปดทอยกอนและหลงขอความ ถาตองการใหเครองหมายนปรากฏอยในขอความกจะตองพมพเปน \” ในสตรงทเปนอารกวเมนตของฟงกชน printf

ตารางท 2.1 เอสแคปซเควนซทใชกนบอยๆในภาษาซ

เอสแคปซเควนซ ความหมาย \n ขนบรรทดใหม โดยเคอรเซอรจะไปปรากฏอยทบรรทดใหม \t แทนการกดแปน Tab โดยจะเลอนเคอรเซอรยง Tab ถดไป \a เปนเสยงเตอน ซงเปนเสยงตด \\ จะพมพแบคกสแลซใหปรากฏในขอความ \ \” จะพมพเครองหมายฟนหน (Double quote) ในขอความ

บรรทดท 7 คอ return 0; /* indicate that program ended successfully */ ในฟงกชน

main มกจะมบรรทดนเปนบรรทดสดทาย เรมจากคาหลกหรอคยเวรด (Keyword) return ทมความหมายหลายอยาง ซงในบรรทดนหมายถงการออกจากฟงกชน เมอสเตจเมนต return ถกใชในฟงกชน main อยางในโปรแกรม Ex201.c น คา 0 ทตามหลง return จะหมายถงโปรแกรมทางานถกตองสมบรณ อนทจรงสงทตามหลง return มความหมายมากกวาน และจะไดนามาอธบายตอไป

Page 5: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 24

ในเรองฟงกชน แตใหขอสงเกตไววาสงทตามหลง return จะตองสอดคลองกบชนดขอมลทฟงกชนจะสงคากลบ อยางในทนฟงกชน main จะมการสงคากลบเปนชนด int (อยางทเหนในบรรทดท 4

คอ int main()) ดงนนคาทตามหลง return คอจานวนเตมหรอ (Integer: int) ตามทกาหนดไว

บรรทดท 8 เปนบรรทดสดทายทบอกถงการจบหรอการสนสดของฟงกชน ซงแทนการสนสดดวยวงเลบปกกาปด }

ขอทควรนาไปปฏบตเสมอในการการเขยนโปรแกรมไมวาจะเปนภาษาใดคอ ความเปนระเบยบ เพราะไมใชเพยงทาใหโปรแกรมดสวยงามเทานน แตจะทาใหสะดวกในการตรวจสอบและแกไข อยางในโปรแกรม Ex201.c เราสามารถทจะพมพสเตจเมนตของบรรทดท 6 และ 7 ใหอยในบรรทดเดยวกนกไดคอ printf(“Welcome to C!\n”);return 0; คอมไพเลอรกยงแปลใหเปนภาษาเครองไดถกตองเหมอนกบทพมพแยกกนคนละบรรทดดงรปท 2.1 แตรปแบบของโปรแกรมในรปท 2.1 จะอานไดงายและสะดวกในการแกไข และทสาคญอกอยางหนงกคอจดประสงคหลกของภาษาระดบสงจะตองสามารถอานและเขาใจไดงาย แตถาไมจดรปแบบของสเตจเมนตใหเปนระเบยบกทาใหอานไมสะดวกจนทาใหเขาใจยากไดเชนกน

สงทควรทราบไวคอ ฟงกชนจากไลบรารมาตรฐานอยางฟงกชน printf เมอคอมไพเลอรแปลสเตจเมนต printf คอมไพเลอรกเพยงเตรยมพนทในโปรแกรมออฟเจกตไวเพอเรยกฟงกชนจากไลบราร แตคอมไพเลอรไมรวาไลบรารอยทไหน ตวททราบคอโปรแกรมลงเกอร ททาหนาทหาฟงกชนไลบรารทเรยกใช และเมอหาพบแลวกนาออฟเจกโคตของฟงกชนมาใสลงในตาแหนงทเรยกใช เมอลงเกอรนาเอาฟงกชนตางๆมาเชอมโยงเขาดวยกนเรยบรอยแลว ออฟเจกตกมรหสคาสงครบถวนสมบรณตามทกาหนดไวในโปรแกรม ทาใหไดโปรแกรมทสามารถนาไปประมวลผลไดหรอ เอกซควเอเบลโปรแกรม (Executable program)

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

- ใหทดลองเอาเครองหมายปด */ ทใชกาหนดคาอธบายในบรรทดท 1 ออก แลวทดลองคอมไพล

- เอาบรรทดท 2 ไปเชอมตอใหเปนบรรทดเดยวกบบรรทดท 1

- นาบรรทดท 7 มาเชอมตอกบบรรทดท 6

- ลบเครองหมายเซมโคลอนในบรรทดท 6 ออก

- ลบบรรทดท 2 ออก

Page 6: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 25

- ลบบรรทดท 3 ออก (ในการลบบรรทดสามารถทาไดโดยใชเครองหมายคาอธบายครอม อยางในกรณนคอ /* #include <stdio.h> */ คอมไพเลอรกจะขามบรรทดนไป)

- ลบบรรทดท 7 ออก

- ทดลองพมพ printf ในบรรทดท 6 ใหผดคอเปลยนเปน print

/* 1 */ /* Ex202.c */ /* 2 */ /* ตวอยางโปรแกรมภาษาซ. */ /* 3 */ /* 4 */ #include <stdio.h> /* 5 */ int main() /* 6 */ { /* 7 */ printf(“Welcome ”); /* 8 */ printf(“to C!\n”); /* 9 */ return 0; /* indicate that program ended successfully */ /* 10 */ } /* end function main */

การใชฟงกชน printf สามารถพมพ Welcome to C! ไดหลายวธ ดงทเหนในโปรแกรม

Ex202.c เปนการพมพทไดผลลพธเหมอนกบโปรแกรม Ex201.c ทเปนเชนนเนองจากฟงกชน printf

จะพมพตอจากตาแหนงสดทายจากพมพไว การทางานของฟงกชน printf ในโปรแกรม Ex202.c บรรทดท 7 จะพมพ Welcome ตามดวยการเวนวรรคหนงตวอกษร ตอจากนน printf ในบรรทดท 8 กจะพมพ to C! ตอไปในบรรทดเดยวกน ซงจะไดผลลพธเชนเดยวกบรปท 2.1(ข)

Welcome to C!

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

ขนบรรทดใหมเขาไป ใหทดลองเขาไปแกไขโปรแกรม Ex201.c ในบรรทดท 6 โดยแกเปน printf(“Welcome\nto\nC!\n”); เมอคอมไพลและลงค แลวนาโปรแกรมไปประมวลผลกจะไดผลลพธดงรปท 2.2

การบวกเลขจานวนเตม

โปรแกรม Ex203.c มการเรยกใชฟงกชน scanf จากไลบรารมาตรฐาน เพออานคาตวเลขจานวนเตมสองคาจากการปอนขอมลทางคยบอรด แลวนาคาตวเลขทงสองมาบวกกน ตอจากนนจะพมพผลลพธดวย printf ไปทหนาจอ สาหรบโปรแกรมและผลของโปรแกรมไดแสดงไวในรปท 2.3

เชนเดยวกบโปรแกรม Ex201.c ภาษาซจะเรมการทางานทฟงกชน main วงเลบปกกาเปด {

ในบรรทดท 3 ของโปรแกรม Ex203.c เปนตวบอกถงจดเรมตนของฟงกชน main ตอจากนน

Page 7: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 26

โปรแกรมจะประมวลผลแตละสเตจเมนตทเรยงตอกนตามลาดบไปเรอยๆ จนกระทงถงวงเลบปกกาปด } ทบรรทด 15 ซงเปนจดสนสดของฟงกชน main และเปนการจบโปรแกรมเชนกน

บรรทดท 4-6 คอ int x1; /* ใชเกบคาจานวนเตมคาแรกทป อนโดยผใช */ int x2; /* ใชเกบคาจานวนเตมคาทสองทป อนโดยผใช */ int y; /* เปนตวแปรทใชเกบคาผลรวมจาก x1 กบ x2 */

เปนการประกาศตวแปรชอ x1, x2, และ y ขนมาใชในโปรแกรม ตวแปรในภาษาคอมพวเตอรโดยทวไปกคอ สญลกษณทใชแทนตาแหนงหรอทเกบขอมลในหนวยความจา การกาหนดตวแปรไดระบวา x1, x2, และ y เปนตวแปรชนด int ซงหมายความวาตวแปรจะเกบขอมลทเปนจานวนเตม คอทงจานวนเตมลบ ศนย และจานวนเตมบวกเชน x1 = 6 และ x2 = 8 ดงทเหนในรปท 2.3 รปแบบการประกาศตวแปรจะตองระบชนด ตามดวยชอของตวแปรแลวปดทายดวยเซมโคลอน เพอบอกวาจบการประกาศตวแปร การประกาศตวแปรทองถน (Local variable) ของภาษาซจะประกาศหลงจากวงเลบปกกาเปดในการนยามฟงกชน เพอใหฟงกชนรวานคอตวแปรทสามารถนาไปใชได

/* 1 */ #include <stdio.h> /* Ex203.c */ /* 2 */ int main() /* 3 */ { /* 4 */ int x1; /* ใชเกบคาจานวนเตมคาแรกทป อนโดยผใช */ /* 5 */ int x2; /* ใชเกบคาจานวนเตมคาทสองทป อนโดยผใช */ /* 6 */ int y; /* เปนตวแปรทใชเกบคาผลรวมของ x1 กบ x2 */ /* 7 */ /* 8 */ printf("Enter first integer x1 = "); /* มเคอรเซอรกระพรบรอรบขอมลจากคยบอรด */ /* 9 */ scanf("%d", &x1); /* รบคาจากคยบอรดไปเกบไวท x1 */ /* 10 */ printf("Enter second integer x2 = ");/*เคอรเซอรกระพรบรอขอมลจากคยบอรด */ /* 11 */ scanf("%d", &x2); /* รบคาจากคยบอรดไปเกบไวท x2 */ /* 12 */ y = x1 + x2; /* นาคาทเกบอยใน x1 บวกกบ x2 แลวเกบใน y */ /* 13 */ printf("Sum of y = %d\n\n", y); /* พมพผลรวมไปทจอภาพแลวเวนสองบรรทด */ /* 14 */ return 0; /* แสดงถงโปรแกรมวงจนจบอยางสมบรณ */ /* 15 */ } /* จบฟงกชน main */

รปท 2.3 โปรแกรมการบวกเลขจานวนเตม

สงเกตวาการกาหนดตวแปรชนด int ในบรรทด 4 ถง 6 สามารถรวมใหเหลอแคบรรทดเดยว

หรอสเตจเมนตเดยวโดยคนแตละตวแปรดวยคอมมานนคอ int x1, x2, y;

ชอตวแปรในภาษาซสามารถตงไดหลากหลาย การตงชอตวแปรโดยทวไปจะตองขนตนดวยตวอกษรหรอเครองหมายอนเดอรสกอร(Underscore: _ ) และตามดวยตวอกษร ตวเลข หรออนเดอรสกอร

Page 8: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 27

ชอของตวแปรจะตองไมขนตนดวยตวเลข สวนความยาวของชอตวแปรจะไมจากดแตคอมไพเลอรจะจาแนกความแตกตางของตวแปรไดเพยง 31 ตวอกษร ซงเปนขอตกลงตามมาตรฐาน ANSI C

นนคอตวแปรทความยาวเกน 31 ตวคอมไพเลอรจะพจารณาเพยง 31 ตวเชน double standard_deviation_of_random_variable_x1, standard_deviation_of_random_variable_x2;

คอมไพเลอรจะบอกวาตวแปรทงสองนไมแตกตางกน เนองจากตวอกษร 31 ตวแรกเหมอนกน นอกจากน ตวพมพเลก (Lowercase) กบตวตวพมพใหญ (Uppercase) จะมความแตกตางกนในการกาหนดชอตวแปร เชน y1, Y1 ภาษาซจะถอวา ตวแปร y1 กบ Y1 เปนคนละตวแปรกน

การกาหนดชอตวแปรตางๆทจะใชในฟงกชน ควรกาหนดหลงจากวงเลบปกกาเปดของฟงกชน และควรกาหนดกอนสเตจเมนตคาสง เชนในโปรแกรม Ex203.c ใหทดลองกาหนดตวแปรเพมเขาไปหลงสเตจเมนต printf ของบรรทดท 8 แลวทดลองคอมไพลโปรแกรมกจะเกดขอผดพลาดทางไวยกรณหรอทเรยกวา ซนแทกเออเรอร (Syntax error) ซนแทกเออเรอรโดยทวไปจะเกดจากคอมไพเลอรไมรจกสเตจเมนตนนๆเพราะเขยนผดหลกไวยกรณ ความผดพลาดนคอมไพเลอรจะแจงเปนขอความทระบถงความผดพลาดวาเกดขนทสเตจเมนตใด ซนแทกเออเรอรเปนความผดทเกดจากการเขยนโปรแกรมไมถกตามหลกของภาษานนๆ ในบางครงจะเรยกซนแทกเออเรอรวา คอมไพลเออเรอร (Compile error) หรอคอมไพลไทมเออเรอร (Compile-time error) ซงเปนการเรยกขอผดพลาดทเกดขนเมอคอมไพลโปรแกรม

หลกการตงชอตวแปรทดคอ ตงชอตวแปรใหสอความหมายตรงกบงานนนๆ เนองจากการตงชอตวแปรสามารถตงเปนชออะไรกได ขอใหตรงตามเงอนไขของขอกาหนดการตงชอของภาษานนๆกจะไดผลลพธทเหมอนกน แตการเขยนโปรแกรมโดยไมตงชอตวแปรใหสอความหมายวาตวแปรนใชแทนอะไร ทาใหผเขยนเทานนทอานเขาใจได สวนคนอนๆจะอานเขาใจไดยาก หรอเมอผานไประยะหนงแมผเขยนเองกอาจจะลม ดงนนการตงชอใหสอกบงานทเขยนทาใหอานเขาใจไดงายกวา อยางงานทางดานสถตจะตงชอตวแปร mean ไวเกบคาเฉลย standardDeviation ไวเกบคาสวนเบยงเบนมาตรฐาน และ variance ไวเกบคาความแปรปรวน เปนตน ขอสงเกตอกอยางหนงในการตงชอ คอกรณทนาคามาเชอมตอกน ระหวางคาจะตองไมเวนวรรค อยางตวแปร standardDeviation ถาเวนวรรคเปน standard Deviation กจะเกดความผดพลาดตอนคอมไพลโปรแกรม ในกรณทตวแปรเกดจากการนาคามาเชอมตอกนอาจจะใชตวพมพใหญมาคน เชน standardDeviation หรออาจจะใชอนเดอรสกอรกได เชน standard_deviation หรอถาไมตองการจะพมพยาวๆ กอาจจะใชตวยอแลวใชคาอธบายกากบตวแปร เชน float sd; /* standard deviation */

(float เปนตวแปรอกชนดหนงสาหรบเกบคาตวเลขทศนยม) บรรทดท 8 คอ printf("Enter first integer x1 = "); เปนการสงพมพขอความ Enter first

integer x1 = ไปทจอภาพและจะมเคอรเซอรกระพรบอยหลงเครองหมายเทากบ ซงจะเรยกขอความ

Page 9: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 28

ทมเคอรเซอรกระพรบอยเชนนวา พรอมพท (Prompt) เนองจากขอความนจะบอกผใชโปรแกรมใหทาอะไรบางอยาง

บรรทดท 9 คอสเตจเมนต scanf("%d", &x1); ฟงกชน scanf จะอานคาจากคยบอรด เมอผใชปอนคาเขาไปแลวกดแปน Enter เพอบอกการสนสดการปอนคา ฟงกชน scanf มตวแปรหรออารกวเมนตสองตวคอ “%d” และ &x1 อารกวเมนตตวแรกคอสตรงควบคมรปแบบ (Format control

string) เปนสตรงทใชกาหนดชนดขอมล ในทนกาหนดดวย %d ทเปนการระบวาขอมลทปอนเขามาจะตองเปนเลขจานวนเตม ตว d แทนจานวนเตมของเลขฐานสบ (Decimal integer) สวน %

เปนบรบทหรอสภาพแวดลอมทกาหนดขนมาและถกจดการในฟงกชน scanf (รวมทง printf ทจะกลาวตอไปเชนกน) เครองหมาย % ในกรณนเปนตวอกษรพเศษสาหรบกากบการแปลงขอมล สวนอารกวเมนตตวทสองเรมตนดวยตวแอมเพอรแซนด (Ampersand: &) ซงในภาษาซ & เปนตวดาเนนการทใชบอกตาแหนงในหนวยความจาของตวแปร แอมเพอรแซนดทใชรวมกบชอตวแปร เปนการบอกใหฟงกชน scanf ทราบถงตาแหนงในหนวยความจาทตวแปร x1 ถกจองเอาไว เมอผใชปอนคาเขามาแลว ฟงกชน scanf กจะเกบคาทปอนเขาไปไวท x1 การใชเครองหมายแอมเพอรแซนดมกจะทาความสบสนใหกบโปรแกรมเมอรมอใหมหรอคนทคนเคยกบภาษาอนมากอน แตในตอนนใหจาไวเพยงวา & จะใชนาหนาตวแปรทกตวทใชในฟงกชน scanf แตจะมขอยกเวนบางอยางสาหรบกฎขอน ซงจะไดนามาอธบายกนตอไปในเรองพอยนเตอร (Pointer)

เมอโปรแกรมถกประมวลผลฟงกชน scanf จะคอยจนกระทงผใชปอนคาใหกบตวแปร x1

ในการปอนคาจะพมพตวเลขจานวนเตมแลวกดแปนพมพเอนเตอร (Enter) เพอสงตวเลขใหกบคอมพวเตอร แลวฟงกชน scanf กจะกาหนดคาทปอนเขาไปใหกบตวแปร x1 ทงฟงกชน scanf และ

printf จะใชในสอสารกนระหวางคอมพวเตอรกบผใช

บรรทดท 10 คอ printf("Enter second integer x2 = "); จะแสดงขอความ Enter second

integer x2 = ไปทจอภาพ และมเคอรเซอรกระพรบรอรบคาอยหลงเครองหมายเทากบ

บรรทดท 11 คอ scanf("%d", &x2); เปนการอานคาจานวนเตมจากคยบอรดทผใชปอนเขาไปแลวนาไปเกบไวทตวแปร x2

บรรทดท 12 เปนสเตจเมนตทใชกาหนดคาใหกบตวแปร y นนคอ y = x1 + x2; ซงเปนการนาคาทเกบไวทตวแปร x1 และ x2 มารวมกน แลวนาผลรวมทคานวณไดไปกาหนดใหตวแปร y โดยผานตวดาเนนการกาหนดคาทแทนดวยเครองหมาย = ซงในสเตจเมนตนจะอานวา “y เกบคาผลการคานวณ x1 + x2” การคานวณเกอบทงหมดจะถกกระทาผานสเตจเมนตการกาหนดคา ตวดาเนนการ = และ + เปนตวดาเนนการไบนาร (Binary operator) เนองจากทงสองตวนตางกมโอเพอรแรนด (Operand) สองตว ในกรณของเครองหมาย + โอเพอรแรนดคอ x1 กบ x2 สาหรบเครองหมาย =

โอเพอรแรนดคอ y กบผลรวมทไดจาก x1+x2

Page 10: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 29

บรรทดท 13 printf("Sum of y = %d\n\n", y); /* พมพผลรวมไปทจอภาพแลวเวนสองบรรทด */ เปนการเรยกฟงกชน printf เพอพมพขอความ Sum of y = และตามมาดวยคาทเกบอยในตวแปร y ในบรรทดน printf มอารกวเมนตสองตวคอ “Sum of y = %d\n\n” และ y อารกวเมนตตวแรกเปนขอความและสตรงควบคมรปแบบทเปนตวกากบการแปลง %d สาหรบใชพมพเลขจานวนเตมไปทหนาจอ สวนอารกวเมนตวทสองเปนตวแปรทเกบคาทตองการพมพ สงเกตวาตวกากบการแปลงสาหรบเลขจานวนเตมจะเหมอนกนทง printf และ scanf

การคานวณสามารถดาเนนการไดในฟงกชน printf โดยนาเอาสเตจเมนตทใชคานวณผลรวมมาใสแทนท y นนคอ printf(“Sum of y = %d\n\n”, x1+x2); กจะไดผลลพธเชนเดยวกบทแสดงไวในรปท 2.3

บรรทดท 14 return 0; /* แสดงถงโปรแกรมวงจนจบอยางสมบรณ */ ในบรรทดนเปนการสงคา 0 กลบไปแจงใหระบบปฏบตการทโปรแกรมประมวลผลอยทราบ ซงเปนการแสดงวาระบบปฏบตการใหบรการจนกระทงโปรแกรมประมวลผลจนเสรจสนสมบรณ และในบรรทดท 15 เปนวงเลบปกกาปด } สาหรบแสดงจดสนสดของฟงกชน main

ในขณะทโปรแกรมกาลงประมวลผลอยถาเกดขอผดพลาดขน ระบบปฏบตการสวนใหญกจะมขอความแจงถงความผดพลาด โดยเฉพาะเรองการเขาถงหนวยความจา (Segmentation fault

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

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

x1, x2 และ y ทประกาศในโปรแกรม Ex203.c กเพอใชอางถงตาแหนงในหนวยความจาของคอมพวเตอร สาหรบเกบขอมลและดงขอมลออกมาใช

โปรแกรม Ex203.c เมอสเตจเมนต scanf(“%d”, &x1); ถกประมวลผล คาทผใชปอนเขาไปจะถกนาไปใสทตาแหนงของหนวยความจาซงถกจองไวในชอตวแปร x1 สมมตคาทปอนคอ 100

คอมพวเตอรกจะใสคา 100 เขาไปทตาแหนงของ x1 อยางทจาลองใหเหนในรปท 2.4

x1 100 รปท 2.4 ตาแหนงของหนวยความจาทแทนดวยชอและคาของตวแปรเทากบ 100

เมอไรทปอนคาใหกบตวแปร คาทถกปอนเขาไปกจะแทนทคาทมอยเดมในหนวยความจา

และคาเดมกจะสญหายไป ดงนนการกาหนดคาใหกบตวแปรกเปนกระบวนการอานขอมลเขาไปทตาแหนงของหนวยความจาซงจะเรยกวา การอานเขาแบบทาลาย (Destructive read-in)

จากโปรแกรม Ex203.c ในบรรทด 11 เมอ scanf("%d", &x2); ถกประมวลผล ผใชปอนคา 72 เขาไป คานจะถกใสเขาไปทตาแหนงหนวยความจาของตวแปร x2 ดงทเหนในรปท 2.5

Page 11: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 30

x1 100

x2 72

รปท 2.5 ตาแหนงของหนวยความจาหลงจากททงสองตวแปรถกปอนเขาไป

เมอตวแปร x1 และ x2 ถกกาหนดคาเรยบรอยแลว โปรแกรมกจะนาคาไปบวกกนเพอ

กาหนดคาใหกบตวแปร y ในบรรทดท 13 นนคอ y = x1 + x2; การกาหนดคาเชนนกเปนการอานเขาแบบทาลายเชนกน เมอ y ถกกาหนดคาเขาไปทหนวยความจากจะปรากฏดงรปท 2.6 สงเกตวา x1

และ x2 ยงมคาเทาเดมเหมอนกบตอนทถกปอนเขาไป ดงนนการอานคา x1 และ x2 ออกมาจากหนวยความจาเพอนาคามาบวกกนจะไมเปนการทาลายคาทเกบอย จงเรยกการนาคาออกมาใชนวา การอานคาออกแบบไมทาลาย (Nondestructive read-out)

x1 100 x2 72

y 172

รปท 2.6 คาของตวแปรในหนวยความจาหลงจากการคานวณคา y เลขคณตในภาษาซ

ตวดาเนนการทางคณตศาสตรของภาษาซไดสรปไวในตารางท 2.2 ตวดาเนนการทางคณตศาสตรของภาษาซ มการใชสญลกษณพเศษหลายตวทแตกตางจากตวดาเนนการของพชคณต เชน แอสเทอรสก (Asterisk *) ทใชแทนเครองหมายคณ และเครองหมายเปอรเซนต % ทใชแทนตวดาเนนการหารแบบเหลอเศษ (Remainder) ในทางพชคณตถาเราตองการคณ a กบ b กสามารถเขยนในรปแบบงายๆ โดยนาตวแปรมาเขยนตดกนเปน ab แตในภาษาซถาเขยนในรปแบบดงกลาวคอ ab กจะถกแปลความหมายเปนชอตวแปรอกตวหนง ซงถายงไมไดประกาศเอาไวกจะเกดขอผดพลาดขนมา แตถากาหนดตวแปร ab เอาไวแลว กไมไดหมายความวาเปนการคณกนของตวแปร a กบ b เพราะฉะนนภาษาซหรอแมแตภาษาคอมพวเตอรอนๆ เมอตองการนาคาในตวแปร a

และ b มาคณกน กจะใชตวดาเนนการคณหรอตวแอสเทอรสก นนคอ a * b

ตวดาเนนการทางคณตศาสตรเปนตวดาเนนการไบนาร (Binary operators) เพราะมตวโอเพอแรนดสองตว เชน การบวกกจะใชตวโอเพอเรเตอรเครองหมายบวกหนงตว เพอบวกคาคงทหรอคาจากตวแปรสองตว เชน 3 + 8 จะมตวดาเนนการบวกหรอเครองหมายบวก + หนงตวและม 3

Page 12: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 31

กบ 8 เปนโอเพอแรนด สวนตวดาเนนการคณ หาร ลบ และการหารเหลอเศษ กเปนตวดาเนนการแบบไบนารทตองมโอเพอแรนดสองตวเชนกน

ตารางท 2.2 ตวดาเนนการทางคณตศาสตร

การดาเนนการของภาษาซ

ตวดาเนนการคณตศาสตร

นพจนพชคณต

นพจนของภาษาซ

บวก + f + 7 f + 7

ลบ - p – 7 p - 7

คณ * Ab a * b

หาร / a/b หรอ a÷b

a/b

หารแบบเหลอเศษ % a mod b a % b

การหารเลขจานวนเตม (Integer division) จะไดผลลพธเปนเลขจานวนเตม เชน 7/4 กจะ

ไดผลลพธเทากบ 1 และ 17/5 กจะไดผลลพธเทากบ 3 โดยเศษทเหลอหรอทศนยมจะถกปดทง นอกจากนภาษาซยงมตวดาเนนการหารแบบเหลอเศษโดยใชตวดาเนนการ % ซงผลลพธทไดกคอเศษทเหลอจากการหารเลขจานวนเตม ตวดาเนนการหารเหลอเศษเปนตวดาเนนการของเลขจานวนเตมทใชกบโอเพอแรนดทเปนเลขจานวนเตมเทานน อยางนพจน a%b ผลลพธทไดกคอเศษทเหลอ

หลงจาก a ถกหารดวย b ดงนน 7%4 ผลลพธทไดคอ 3 หรอ 314

⎛ ⎞⎜ ⎟⎝ ⎠

และ 17%5 ผลลพธทไดคอ 2

หรอ 235

⎛ ⎞⎜ ⎟⎝ ⎠

นพจนทางคณตศาสตรในภาษาซจะตองเขยนเปนแนวเสนตรง (Straight-line form) เชนนพจน a หาร b จะเขยนเปน a/b นนคอทงตวดาเนนการและตวถกดาเนนการหรอโอเพอแรนด

จะตองอยในบรรทดเดยวกน แตในทางพชคณตมกจะเขยนเปน ab

วงเลบถกใชในการจดกลมเทอมตางๆ ในนพจนภาษาซ ซงโดยทวไปจะตรงกบการใชวงเลบในนพจนทางพชคณต เชนตองการคณ a กบคาทไดจาก b + c กเขยนไดเปน a * (b + c)

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

- การคณ การหาร และการหารเหลอเศษ มระดบความสาคญทเทากน แตมลาดบการประมวลผลทสงกวาการบวกและการลบ ทาใหตวดาเนนการเหลานถกประมวลผลกอน

Page 13: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 32

ถานพจนประกอบดวยการคณ การหารและการหารเหลอเศษหลายเทอม การประเมนนพจนกจะเรมจากซายไปขวา

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

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

ตวดาเนนการ การดาเนนการ การประเมนลาดบ

*

/ %

การคณ

การหาร

หารเหลอเศษ

ตวดาเนนการกลมนมระดบความสาคญสง จะถกประเมนกอน ถามหลายเทอมจะถกประเมนจากซายไปขวา

+ -

การบวก

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

จากกฎความสาคญกวาของตวดาเนนการ ตวอยางตอไปนจะอธบายทงนพจนพชคณตและ

การดาเนนการของภาษาซทสอดคลองกน

ตวอยางตอไปนเปนการคานวณคาเฉลยเลขคณต

พชคณต: 5

a b c d em + + + +=

ภาษาซ: m = (a + b + c + d + e) / 5;

วงเลบถกใชเพอจดกลมการบวก เนองจากการหารมลาดบความสาคญทสงกวาการบวก แตในกรณนการบวกจะตองถกกระทากอนจงตองใสวงเลบ ซงเทากบวาผลรวมทงหมด (a + b + c + d

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

;/ 5;

sum a b c d em sum

= + + + +=

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

Page 14: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 33

;/ 5;

m a b c d em m= + + + +=

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

โดยทวไปเรามกคนเคยกบรปแบบของสเตจเมนตทเขยนอยในบรรทดเดยวกนคอ m = (a +

b + c + d + e) / 5; เพราะตรงกบรปแบบทางพชคณต การเขยนแบบนถาลมใสวงเลบเปดหรอวงเลบปดดานใดดานหนง คอมไพเลอรกจะพบขอผดพลาดวาใสวงเลบไมครบ แตถาไมใสวงเลบเลยคอ

m = a + b + c + d + e / 5; คอมไพเลอรไมพบขอผดพลาดใดๆ แตผลลพธทไดจากการคานวณจะผด เพราะจากลาดบความสาคญของตวดาเนนการทางคณตศาสตรทาให e/5 ถกคานวณเปนอนดบแรก เสรจแลวจะนาผลหารทไดไปรวมกบผลบวกของ a, b, c, d ซงผดวตถประสงคของการหาคาเฉลยจาก a, b, c, d, e

ตวอยางตอไปเปนการคานวณคาของสมการเสนตรง พชคณต: y mx b= +

ภาษาซ: y = m*x + b;

นพจนนไมจาเปนจะตองใสวงเลบ เนองจากการคณจะถกคานวณกอนแลวจงมาดาเนนการบวก

ตวอยางตอไปนมการหารเหลอเศษ การคณ การหาร บวก ลบและการกาหนดคา

พชคณต: % wz pr q yx

= + −

ภาษาซ: z = p * r % q + w/x – y;

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

การเขยนสเตจเมนตทางคณตศาสตร ไมจาเปนจะตองมวงเลบหลายค เชนในนพจน a * (b

+ c) + c * (d + e) ไมจาเปนตองจดกลมใหอยในวงเลบทงหมด หลกทใชในการพจารณาการใสวงเลบคอ ใหใสวงเลบเพอจดกลมลาดบการคานวณใหไดผลลพธทถกตองกเปนการเพยงพอ

Page 15: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 34

เนองจากการใสวงเลบทมากเกนไปทาใหเกดความยงยากในการอาน ดงในนพจนขางตนถาเราใสวงเลบครบทกเทอมกจะอยในรป ( a * (b + c)) + (c * (d + e))

ขนท 1 y = 2 * 5 * 5 + 3 * 5 + 7;(เทอมซายสดซงเปนตวดาเนนการคณจะถกคานวณกอน) 2 * 5 คอ 10

ขนท 2 y = 10 * 5 + 3 * 5 + 7; (เทอมซายสดซงเปนตวดาเนนการคณจะถกคานวณกอน) 10 * 5 คอ 50

ขนท 3 y = 50 + 3 * 5 + 7; (ดาเนนการคณกอนทจะบวก)

3 * 5 คอ 15

ขนท 4 y = 50 + 15 + 7; (ทาการบวกเทอมซายสดกอน) 50 + 15 คอ 65

ขนท 5 y = 65 + 7; (บวกครงสดทาย) 65 + 7 คอ 72

ขนท 6 y = 72; (นาคา 72 ไปใสในตวแปร y) รปท 2.7 ลาดบการคานวณโพลโนเมยลอนดบทสอง

เพอใหเขาใจกฎความสาคญกวาของตวดาเนนการภาษาซ ใหพจารณาตวอยางการคานวณโพ

ลโนเมยล (Polynomial) อนดบสองตอไปน

พชคณต: 2y ax bx c= + +

ภาษาซ: y = a * x * x + b * x + c;

ตวเลขในวงกลมทอยใตสเตจเมนตแสดงถงลาดบการคานวณของตวดาเนนการในภาษาซ สงเกตวาภาษาซไมมตวดาเนนการยกกาลง ดงนนเมอตองการคานวณ 2x กจะใช x * x แทน แตภาษาซมฟงกชน pow ทอยในไลบรารมาตรฐานไวสาหรบใชคานวณเลขยกกาลง แตฟงกชนนคอนขางซบซอน เพราะเกยวของกบชนดของขอมลซงจะไดอธบายถงรายละเอยดในบทตอไป

สมมตวาโพลโนเมยลขางตนมคา a = 2, b = 3, c = 7 และ x = 5 ในรปท 2.7 แสดงขนตอนการคานวณในภาษาซ

ตวดาเนนการเปรยบเทยบความเทากนและตวดาเนนการความสมพนธ

ทศทางการประมวลผลของโปรแกรม จะถกกาหนดโดยเงอนไข(Condition) เชนการกาหนดเกรดใหกบนกศกษาตามคะแนนทได ถานกศกษาสอบไดคะแนน 60 หรอมากกวากใหพมพขอความวา “ยนดดวยคณผานในรายวชาน” ในหวขอนจะอธบายการตดสนใจอยางงายดวยการใช สเตจเมนต if ททาใหโปรแกรมมการตดสนใจบนพนฐานของคาความจรงทอาจจะมคาเปนจรงหรอ

Page 16: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 35

เปนเทจ โดยขนอยกบเงอนไข ถาเงอนไขเปนจรง (True) สเตจเมนต if จะถกประมวลผล แตถาเงอนไขเปนเทจ (False) สเตจเมนตของ if กจะไมถกประมวลผล ตอจากนนสเตจเมนตถดจาก if กจะถกประมวลผลตอ

ตารางท 2.4 ตวดาเนนการเปรยบเทยบ

ตวดาเนนการในพชคณต ตวดาเนนการ

ในภาษาซ

ตวอยางเงอนไข

ในภาษาซ

ความหมายของ เงอนไขในภาษาซ

ตวดาเนนการเทากน = ≠

= = !=

x ==y x != y

x เทากบ y

x ไมเทากบ y ตวดาเนนการความสมพนธ

> <

≥ ≤

> <

>= <=

x > y x < y

x >= y x <= y

x มากกวา y

x นอยกวา y

x มากกวาหรอเทากบ y

x นอยกวาหรอเทากบ y

/* 1 */ /* ex204.c ใชแสดงการตดสนใจของตวดาเนนการความสมพนธและความเทากน */ /* 2 */ #include <stdio.h> /* 3 */ /* 4 */ int main() /* 5 */ { /* 6 */ int num1, num2; /* ตวแปรไวรบอนพตทผใชป อนเขามาทางคยบอรด */ /* 7 */ /* 8 */ printf("Enter two integers, and I will tell you\n"); /* 9 */ printf("the relationships they satisfy: "); /* 10 */ scanf("%d%d", &num1, &num2); /* อานตวเลขไปเกบไวท num1 และ num2 */ /* 11 */ /* 12 */ if(num1 == num2) /* 13 */ { /* วงเลบปกกาเปดเพอกาหนดการเรมตนของบลอก if */ /* 14 */ printf("%d is equal to %d\n", num1, num2); /* 15 */ } /* สนสดบลอก if */ /* 16 */ if(num1 != num2)/* กรณทสเตจเมนต if มบรรทดเดยวไมตองใสวงเลบกได */ /* 17 */ printf("%d is not equal to %d\n", num1, num2); /* 18 */ if(num1 < num2) /* 19 */ printf("%d is less than %d\n", num1, num2); /* 20 */ if(num1 > num2) /* 21 */ printf("%d is greater than %d\n", num1, num2); /* 22 */ if(num1 <= num2) /* 23 */ printf("%d is less than or equal to %d\n", num1, num2); /* 24 */ if(num1 >= num2) /* 25 */ printf("%d is greater than or equal to %d\n", num1, num2); /* 26 */ return 0; /* 27 */ }

Page 17: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 36

เงอนไขของสเตจเมนต if จะถกกาหนดจากตวดาเนนการความเทากน (Equality

operators) และตวดาเนนการความสมพนธ (Relational operator) ทไดสรปไวในตารางท 2.4 ตวดาเนนการความสมพนธจะมระดบความสาคญเทากนและจะประมวลผลจากซายไปขวา ตวดาเนนการเปรยบเทยบความเทากนมระดบความสาคญตากวาตวดาเนนการความสมพนธ และมการประมวลผลจากซายไปขวาเชนเดยวกบตวดาเนนการความสมพนธ

ตวอยางโปรแกรม Ex204.c ไดใชสเตจเมนต if จานวนหกสเตจเมนตดวยกน เพอเปรยบเทยบอนพตทผใชปอนเขามาสองจานวน ถาเงอนไขในสเตจเมนต if ใดเปนจรง ฟงกชน printf กจะถกประมวลผล ฟงกชน scanf ในบรรทดท 10 จะอานตวเลขจานวนเตมสองคาจากคยบอรด โดยมตวกากบการแปลง “%d%d” สองตว %d ตวแรกจะแปลงคาทปอนเขามาใหเปนจานวนเตมแลวนาไปกาหนดใหกบตวแปร num1 สวน %d ตวทสองจะแปลงคาไปเกบทตวแปร num2 สาหรบผลลพธของโปรแกรมนไดแสดงไวในรปท 2.8

ก. กรณทปอนคา num1 นอยกวา num2

ข. กรณทปอนคา num1 มากกวา num2

ค. กรณทปอนคา num1 เทากบ num2

รปท 2.8 การใชตวดาเนนการเปรยบเทยบกบสเตจเมนต if ตารางท 2.5 แสดงความสาคญกวาของตวดาเนนการตางๆ ทไดกลาวไปแลวในบทน ตว

ดาเนนการถกแสดงจากบนลงลางในลาดบความสาคญทลดหลนกนลงมา สงเกตวาเครองหมาย

Page 18: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 37

เทากบ (=) กเปนตวดาเนนการหนงเชนกน ตวดาเนนการตางๆเหลาน จะดาเนนการจากซายไปขวา ยกเวนตวดาเนนการกาหนดคาจะประมวลผลจากขวาไปซาย ตารางท 2.5 ลาดบความสาคญของตวดาเนนการชนดตางๆ

ตวดาเนนการ ความสมพนธในกลม

* / % ซายไปขวา + - ซายไปขวา < <= > >= ซายไปขวา = = != ซายไปขวา = ขวาไปซาย

คาตางๆทถกสงวนไวใชกบภาษาซ ทนามาใชอธบายในตวอยางโปรแกรมแลวในบทนคอ int

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

auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

รปท 2.9 คยเวรดของภาษาซ

แบบฝกหด

1. ใหเตมคาในชองวางของแตละขอตอไปน

ก) ภาษาซทกโปรแกรมจะเรมประมวลผลทฟงกชน______________________

ข) เครองหมายใดทใชบอกจดเรมตนและจดสนสดของฟงกชนและบลอก____________

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

ง) ในคลงของฟงกชนมาตรฐานมฟงกชนใดทใชแสดงผลไปทจอภาพ _______________

จ) ตวแปรชนดตางๆในภาษาคอมพวเตอรประกาศหรอกาหนดขนมาเพอ_____________

2. แตละขอตอไปนเปนจรงหรอเทจ ถาเปนเทจใหอธบายเหตผล

ก) เมอฟงกชน printf ถกเรยกใช ฟงกชนนจะเรมพมพทบรรทดใหมเสมอ

Page 19: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 38

ข) คาอธบายโปรแกรมทเขยนอยระหวางเครองหมาย /* */ กาหนดขนมาเพอใหคอมพวเตอรแสดงขอความทอยระหวางเครองหมายดงกลาวเมอโปรแกรมประมวลผล

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

ง) ตวแปรทกชนดจะตองถกประกาศกอนทจะนามาใช

จ) ทกตวแปรทประกาศจะตองระบชนดเสมอ

ฉ) ภาษาซจะถอวาการประกาศตวแปร counter กบ Counter นน เปนตวแปรเดยวกน

ช) การประกาศตวแปรสามารถจะประกาศทใดๆกไดทตองการใชในฟงกชน

ซ) ตวดาเนนการหารเหลอเศษทแทนดวย % สามารถทจะใชไดกบโอเพอแรนดทเปนจานวนเตมเทานน

ฌ) ตวดาเนนการเลขคณต *, /, %, + และ - ทงหมดนมระดบความสาคญของการประมวลผลกอนหลงเทากน

3. ใหเขยนสเตจเมนตของภาษาซของแตละขอตอไปน

ก) ใหประกาศตวแปร a, counter, mean และ number เปนเปนชนดจานวนเตม

ข) ตองการแสดงขอความ “End an integer” ตามดวยเครองหมายโคลอนและเวนวรรคหนงตวอกษรโดยใหเคอเซอรกระพรบอยหลงการเวนวรรค

ค) อานจานวนเตมจากคยบอรดมาเกบไวในตวแปร a

ง) ถาตวแปร counter ไมเทากบสบ ใหแสดงขอความ “The counter is not equal to 10”

จ) ใหแสดงขอความ “Principle of Computer Programming” ในหนงบรรทด

ฉ) ใหแสดงขอความ “Principle of Computer Programming” ในสบรรทด โดยแสดงคาละบรรทด

4. ใหระบความผดพลาดทเกดขนในแตละสเตจเมนตตอไปน พรอมกบแกไขใหถกตอง ก) scanf(“d”, value); ข) printf(“The product of %d and %d is %d”\n, x, y); ค) x + y = sumXY; ง) if(number => largestNumber)

largestNumber = = number; จ) */ Program to determine the largest of three integers /* ฉ) Scanf(“%d”, number); ช) printf(“Remainder of %d divided by %d is \n”, x, y, x%y); ซ) if(x = y)

printf(%d is equal to %d\n”, x, y); ฌ) Printf(“The value that you entered is: %d\n, &value);

Page 20: บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit Edit:22June2010 20 บทท

..\PoP\sathit Edit:22June2010 39

5. ใหตอบคาถามในแตละขอตอไปน

ก) มตวดาเนนการทางคณตศาสตรตวใดบางทมระดบความสาคญเทากบตวดาเนนการคณ

ข) เมอใชวงเลบซอนกนเพอจดกลมการคานวณ เซตของวงเลบใดทถกประมวลผลเปนอนดบแรก

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

6. ลาดบของการประมวลผลของตวดาเนนการในแตละสเตจเมนตของภาษาซทแสดงไวในแตละ

ขอ ตวแปร x จะมคาเทาไร

ก) x = 7 + 3 * 6 / 2 – 5; ข) x = 3 % 3 + 3 * 3 – 3 / 3; ค) x = (3 * 9 * (3 + (9 * 3 / (3))));

7. ใหเขยนสมการ y = ax3 + 8 เปนสเตจเมนตภาษาซ