บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit...
Transcript of บทที่การโปรแกรมภาษาซีเบื้องต้นstaff.cs.psu.ac.th/sathit/StructuredProgramming/Ch2.pdf..\PoP\sathit...
..\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 โปรแกรมการพมพตวอกษร
..\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 ซงในทนแสดงดวยตวพมพหนาเพอแสดงใหเหนวาคานจะถกสงวนไวใชเฉพาะภาษาซ ผเขยนโปรแกรมไมสามารถนาไปกาหนด
..\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 ตามดวยตวแปรทอยในวงเลบของ
..\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 มความหมายมากกวาน และจะไดนามาอธบายตอไป
..\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 ออก
..\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 ตอจากนน
..\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: _ ) และตามดวยตวอกษร ตวเลข หรออนเดอรสกอร
..\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 = ไปทจอภาพและจะมเคอรเซอรกระพรบอยหลงเครองหมายเทากบ ซงจะเรยกขอความ
..\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
..\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
..\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
..\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) ซงโดยทวไปกจะคลายกบการดาเนนการทใชอยในพชคณตดงน
- การคณ การหาร และการหารเหลอเศษ มระดบความสาคญทเทากน แตมลาดบการประมวลผลทสงกวาการบวกและการลบ ทาใหตวดาเนนการเหลานถกประมวลผลกอน
..\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 เพมขนมาอกหนงตว ถาไมตองการเพมตวแปรกสามารถทาไดดงน
..\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) ไมจาเปนตองจดกลมใหอยในวงเลบทงหมด หลกทใชในการพจารณาการใสวงเลบคอ ใหใสวงเลบเพอจดกลมลาดบการคานวณใหไดผลลพธทถกตองกเปนการเพยงพอ
..\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 ททาใหโปรแกรมมการตดสนใจบนพนฐานของคาความจรงทอาจจะมคาเปนจรงหรอ
..\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 */ }
..\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 แสดงความสาคญกวาของตวดาเนนการตางๆ ทไดกลาวไปแลวในบทน ตว
ดาเนนการถกแสดงจากบนลงลางในลาดบความสาคญทลดหลนกนลงมา สงเกตวาเครองหมาย
..\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 ถกเรยกใช ฟงกชนนจะเรมพมพทบรรทดใหมเสมอ
..\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);
..\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 เปนสเตจเมนตภาษาซ