Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore เอกสารติว

เอกสารติว

Published by krupook_sajai, 2022-06-18 06:09:20

Description: เอกสารติว

Search

Read the Text Version

ตัวอยา่ ง 4.1 แสดงการทางานของโปรแกรมการบวก เลขจานวนจริง 2 จานวนท่รี บั จากผ้ใู ช้ #include <stdio.h> double InputDouble ( ) { double x; printf ( “\\nInput real value : “ ); scanf ( “%.2f ”, &x ); return ( x ); } 51

ตัวอยา่ ง 4.1 (ตอ่ ) double SumDouble ( double x, double y ) { return ( x + y ); } void PrintOut ( double x ) { printf ( “\\n Result of sum is : %.2f”, x ); } 52

ตัวอยา่ ง 4.1 (ตอ่ ) void main ( ) { double a1, a2, sumVal; a1 = InputDouble( ); a2 = InputDouble( ); sumVal = SumDouble ( a1, a2 ); PrintOut ( sumVal ); } 53

4.2 การประกาศโพรโทไทป์ของฟังกช์ ัน การประกาศโปรโตไทป์เป็นส่ิงจาเปน็ ใน ภาษาซีเน่อื งจากภาษาซเี ป็นภาษาในลักษณะทตี่ อ้ ง มกี ารประกาศฟังก์ชันก่อนจะเรยี กใช้ฟังกช์ ันน้นั (Predefined Function) 54

จากตวั อยา่ งท่ี 4.1 จะเหน็ วา่ ฟงั กช์ นั main ( ) จะอยู่ใต้ ฟงั กช์ นั อ่ืน ๆ ทีม่ ีการเรียกใช้ เป็นลักษณะท่ีตอ้ ง ประกาศฟงั ก์ชนั ที่ต้องการเรียกใช้กอ่ นจากเรยี กใช้ ฟงั กช์ นั น้ัน แตห่ ากตอ้ งการยา้ ยฟังก์ชนั main ( ) ขน้ึ ไป ไว้ด้านบน จะต้องมกี ารประกาศโปรโตไทป์ของฟังก์ชัน ท่ีต้องการเรียกใช้ก่อนเสมอ 55

ตัวอยา่ ง 4.2 แสดงการทางานของโปรแกรมการบวก เลขจานวนจริง 2 จานวนท่ีรบั จากผใู้ ช้ ในลกั ษณะทม่ี กี ารประกาศโปรโตไทป์ #include <stdio.h> double InputDouble ( ); double SumDouble ( double , double ); void PrintOut ( double ); 56

ตวั อย่าง 4.2 (ต่อ) void main ( ) { double a1, a2, sumVal; a1 = InputDouble( ); a2 = InputDouble( ); sumVal = SumDouble ( a1, a2 ); PrintOut ( sumVal ); } 57

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

4.3 การเรียกใช้ฟังกช์ ัน การเรยี กใชฟ้ ังก์ชนั ที่มีการคนื คา่ จะใช้ รูปแบบดังต่อไปน้ี คา่ ทีร่ ับ = ฟังก์ชนั (อารก์ ิวเมนต์) 59

ตวั อย่าง a1 ต้องมีชนดิ เป็น double เน่อื งจากคา่ ทจ่ี ะส่ง คนื กลับมาจากฟงั กช์ นั มชี นดิ เป็น double a1 = InputDouble ( ); ใช้ค่กู ับโปรโตไทป์ double InputDouble ( ); 60

ตวั อย่าง a1 และ a2 ต้องมชี นดิ เปน็ double เพื่อใหต้ รงกบั ชนิดตวั แปรของอารก์ ิวเมนท์ ทป่ี ระกาศในโปรโตไทป์ sumVal = SumDouble (a1,a2 ); ใชค้ ู่กบั โปรโตไทป์ double InputDouble ( ); 61

ตวั อย่าง PrintOut( sumVal ); ใชค้ ู่กับโปรโตไทป์ void PrintOut ( double ); ประกาศใหร้ ้วู ่าฟังก์ชันน้ีไม่มีการคืนคา่ 62

4.4 ขอบเขต ( Scope) การทางานของโปรแกรมภาษาซีจะทางานท่ี ฟังก์ชนั main ( ) กอ่ นเสมอ เม่ือฟังก์ชัน main ( ) เรียกใชง้ านฟงั กช์ นั อื่น กจ็ ะมกี ารส่งคอนโทรล (Control) ทค่ี วบคมุ การทางานไปยังฟังกช์ ันน้ัน ๆ จนกว่าจะจบฟังก์ชนั หรือพบคาส่งั return 63

เมือ่ มกี ารเรียกใชง้ านฟังกช์ นั จะมีการจองพื้นท่ี หน่วยความจาสาหรบั ตวั แปรที่ตอ้ งใช้ภายใน ฟังกช์ นั น้ัน และเมื่อสิ้นสุดการทางานของฟังก์ชนั ก็จะมกี ารคืนพนื้ ท่ีหนว่ ยความจาส่วนนนั้ กลบั สู่ ระบบ การใชง้ านตัวแปรแตล่ ะตวั จะมีขอบเขต ของการใชง้ านขึ้นอยู่กบั ตาแหน่งทีป่ ระกาศตัวแปร นั้น 64

ตวั อย่าง จากตวั อยา่ ง 4.1 และ 4.2 สามารถ แสดงขอบเขตการทางานได้ดงั น้ี main ( ) a1 step1 a2 a1 = InputDouble( ); sumVal 65 InputDouble ( ) x

ตวั อย่าง (ตอ่ ) main ( ) a1 a2 step2 sumVal a2 = InputDouble( ); InputDouble ( ) x 66

ตัวอยา่ ง (ต่อ) Step3 main ( ) a1 sumVal=SumDouble(a1,a2) a2 sumVal sumDouble ( ) x y 67

ตัวอยา่ ง (ต่อ) main ( ) a1 a2 step4 sumVal PrintSum(sumVal); PrintSum ( ) x 68

จะเหน็ วา่ ตวั แปร x ทป่ี ระกาศในแตล่ ะขน้ั ตอนจะ ทางานอย่ภู ายในฟังกช์ นั ทมี่ กี ารประกาศคา่ เท่านนั้ และใช้ พ้ืนทีใ่ นการเก็บขอ้ มูลคนละส่วนกนั ขอบเขตการทางานของตัวแปรแตล่ ะตวั จะกาหนดอยู่ ภายบลอ็ กของคาส่ังภายในเครอื่ งหมายปีกกา ( { } ) หรือ การประกาศในช่วงของการประกาศฟงั ก์ชัน เรยี กตวั แปร เหลา่ นวี้ า่ ตัวแปรโลคอล (Local Variable) 69

นอกจากนี้สามารถประกาศตวั แปรไว้ทภ่ี ายนอกฟงั กช์ ัน บริเวณสว่ นเริ่มของโปรแกรมจะเรยี กวา่ ตัวแปรโก ลบอล (Global Variable) ซงึ่ เป็นตัวแปรทีส่ ามารถ เรียกใช้ท่ีตาแหนง่ ใด ๆ ในโปรแกรมก็ได้ ยกเว้นใน กรณีท่ีมีการประกาศตวั แปรทม่ี ีชือ่ เดยี วกันตัวแปรโก ลบอลภายในบล็อกหรอื ฟงั กช์ นั 70

ตัวอยา่ ง 4.3 แสดงการทางานของโปรแกรมในลกั ษณะท่ี มตี ัวแปรโกลบอล แสดงขอบเขตการใช้ งานของตัวแปรภายในโปรแกรม #include <stdio.h> int x; void func1 ( ) { x = x + 10; printf ( “func1 -> x : %d\\n”, x ); } 71

ตวั อยา่ ง 4.3 (ตอ่ ) void func2 ( int x ) { x = x + 10; printf ( “func2 -> x : %d\\n”, x ); } void func3 ( ) { int x=0; x = x + 10; printf ( “func3 -> x : %d\\n”, x ); } 72

ตวั อย่าง 4.3 (ต่อ) 73 void main ( ) { x = 10; printf ( “main (start) -> x : %d\\n”, x ); func1 ( ); printf ( “main (after func1) -> x : %d\\n”, x ); func2 ( x ); printf ( “main (after func2) -> x : %d\\n”, x); func3 ( ); printf ( “main (after func3) -> x : %d\\n”, x); }

ตวั อย่าง 4.3 (ต่อ) ผลการทางาน main (start) -> x : 10 func1 -> x : 20 main (after func1) -> x : 20 func2 -> x : 30 main (after func2) -> x : 20 func3 -> x : 10 main (after func3) -> x : 20 74

มแ โร ร แ เ (Structures and Unions) 75

5.1 มร ่ ปเก่ ก โ ร ร (4,3) (0,0) แก โ เิ ปร ก ป ม เ มปร เภ int ปร เภ ม ่ ก ก รเก ม ุ แก x แ y เป็ ม โ ร ร ม ร ปร ก ศปร เภ ใ แกปร เภ ม แ ม ่ใ 76

การประกาศประเภทขอ้ มลู แบบโครงสร้าง struct point { Member int x; int y; }; หมายเหตุ การประกาศชอื่ สมาชกิ ภายใน struct จะใชช้ อื่ ใดกไ็ ด้ อาจจะซากับชอื่ ตัวแปรทีอ่ ยภู่ ายนอก struct แตช่ อ่ื ทีอ่ ย่ภู ายใน struct เดยี วกันห้ามประกาศชอ่ื ซากัน 77

การประกาศตัวแปรข้อมูลแบบโครงสรา้ ง แบบที่ 1 struct point { int x; int y; } x, y , z; หมายเหตุ จะเหน็ ว่าช่อื ของ struct จะประกาศหรอื ไม่กไ็ ด้ หาก ไม่มกี ารประกาศจะไมส่ ามารถนา struct นนั กลับมาใช้ได้อกี 78

แบบท่ี 2 struct point { การ int x; ประกาศ int y; แบบขอ้ มูล โครงสรา้ ง }; การ struct point x,y,z ประกาศ ตวั แปร ข้อมูลแบบ โครงสรา้ ง 79

การกาหนดค่าเริ่มต้นให้กับตัวแปรข้อมูลแบบโครงสร้าง struct point pt = {320,200}; การอา้ งถึงสมาชิกภายในตวั แปรขอ้ มลู แบบโครงสรา้ ง struct_name.member 80

ตวั อยา่ ง เม่ือต้องการอ้างถงึ สมาชิกภายใน struct ว่าอยู่ตรงกบั จุดใดบนแกนโคออดิเนทจะใช้ printf ( “%d, %d”, pt.x, pt.y ); หรอื หากตอ้ งการคานวณระยะทางจะวา่ หา่ งจาก จุดเริม่ ตน้ (0, 0) เท่าใดสามารถใช้ double dist, sqrt (double); dist =sqrt ((double)pt.x * pt.x +(double)pt.y * pt.y ); 81

หมายเหตุ สมาชกิ ของข้อมูลประเภท struct อาจจะ เปน็ ตวั แปรประเภทใดก็ได้ ทั้งขอ้ มลู พื้นฐาน และ ประเภทข้อมูลอน่ื ๆ เชน่ อาเรย์ และยังประกาศ ตวั แปรของขอ้ มลู ประเภท struct ได้อีกด้วย ตวั อยา่ ง หากต้องการเก็บขอ้ มลู pt2 ของส่ีเหลี่ยมดังรูป pt1 สามารถทาการประกาศ ตวั แปรไดด้ ังน้ี 82

struct rect { การประกาศ struct point pt1; แบบขอ้ มูล struct point pt2; โครงสร้าง }; การประกาศ ตัวแปรข้อมลู struct rect screen; แบบโครงสรา้ ง int co_x; co_x = screen.pt1.x การอา้ งถงึ สมาชกิ 83

5.2 ก รเก ม แ โ ร ร การเก็บข้อมลู แบบโครงสรา้ งภายในหน่วยความจาจะ เกบ็ ตามลาดบั ทีม่ กี ารประกาศสมาชกิ ของข้อมลู นั้น โดยท่วั ไปข้อมูลแบบโครงสรา้ งจะประกอบข้ึนจาก ขอ้ มูลหลาย ๆ ชนิด และข้อมูลแตล่ ะชนิดมักจะมกี าร จองพืน้ ท่ใี ช้งานแต่ตา่ งกัน เนอ่ื งจากการจองพนื้ ท่ี หนว่ ยความจาในระบบส่วนใหญ่จะจองทีแ่ อดเดรสที่ หารดว้ ย 2 หรือ 4 ลงตัว 84

ตวั อยา่ ง member num2 num1 ch 34 struct alignment { 02 int num1; char ch; Byte Offset int num2; } example; จะเห็นวา่ num2 จะไม่สามารถใชพ้ ืน้ ทที่ ี่ตดิ กับ ch ได้ เนอื่ งจาก num2 เปน็ ขอ้ มูลประเภทเลขจานวนต้องใช้พน้ื ทท่ี ี่มี แอดเดรสหารด้วย 2 หรอื 4 ลงตวั ทาให้เกดิ ทีว่ ่างทีไ่ ม่สามารถ นามาใชป้ ระโยชนไ์ ด้ เพราะฉะนน้ั การประกาศสมาชกิ ของ โครงสรา้ งจะมีผลตอ่ การใช้พนื้ ที่ในหน่วยความจาด้วย 85

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

ตวั อยา่ ง 5.1 ฟงั กช์ นั ใชใ้ นการกาหนดค่าให้กบั ตัวแปร struct struct point makepoint ( int x, int y ) { struct point temp; temp.x = x; temp.y = y; return temp; } หมายเหตุ ตวั อยา่ งนแี สดงฟงั กช์ นั ทีท่ าการสง่ คา่ กลับเป็นรูปแบบโครงสร้าง 87

การเรียกใชง้ านฟังก์ชนั struct rect screen; struct point middle; struct point makepoint ( int, int ); screen.pt1 = makepoint ( 0, 0 ); screen.pt2 = makepoint ( XMAX, YMAX ); middle = makepoint ((screen.pt1.x + screen.pt2.x) / 2, (screen.pt1.y + screen.pt2.y) / 2 ); 88

ตัวอย่าง 5.2 ฟงั กช์ ันการบวก x และ y ของจุด 2 จดุ และคืน คา่ ผลของการบวกเปน็ struct struct point addpoint(struct point p1, struct point p2) { p1.x += p2.x; p1.y += p2.y; return p1; } หมายเหตุ ตวั อยา่ งนแี สดงการสง่ อารก์ วิ เมนทแ์ บบ struct ใหก้ ับฟังก์ชนั 89

ตวั อย่าง 5.3 ฟังกช์ นั การหาว่าจดุ อยใู่ นพืน้ ทส่ี ีเ่ หลีย่ มหรอื ไม่ int pinrect ( struct point p, struct rect r ) { return p.x >= r.pt1.x && p.x < r.pt2.x && p.y >= r.pt1.y && p.y < r.pt2.y; } หมายเหตุ ตัวอย่างนีเปน็ การหาว่าจดุ ท่ีระบอุ ยู่ในพืนทส่ี ่เี หลี่ยม หรอื ไม่ โดยส่งค่าจุดและพนื ท่ีส่ีเหล่ียมเปน็ อากิวเมนทใ์ ห้กับฟงั กช์ นั หากจุดอยู่ในพนื ท่สี ี่เหลีย่ มจะคนื คา่ 1 แตห่ ากจดุ อยู่นอกพืนท่ี สเี่ หลย่ี มจะคนื คา่ เปน็ 0 90

แ รเร (Pointer and Array) 91

6.1 ก แ เ ร (Pointers and Address) int i; i int i; i = 10; 400 i = 10; i 10 400 402 402 404 404 รป ่ 6.1 ก รแ ม ใ ม แปรปร เภ พ ฐ 92

p p p 40 36 00 10 i 10 i i 10 40 0 รป ่ 6.2 ก รแ ม ใ ม แปรปร เภ 93

6.2 ก รปร ก ศ แปรปร เภ การประกาศตวั แปรประเภทพอยน์เตอร์จะใช้ Unary Operator * ซ่ึงมชี ่ือเรียกว่า Indirection หรือ Dereferencing Operator โดยจะตอ้ งประกาศประเภทของตัวแปรพอยนเ์ ตอร์ให้ สอดคลอ้ งกบั ประเภทของตวั แปรที่เราตอ้ งการ (ยกเวน้ ตัว แปรพอยน์เตอร์ประเภท void ทสี่ ามารถช้ไี ปยงั ตัวแปร ประเภทใดก็ได)้ 94

ตัวอยา่ ง int *ip; เป็นการประกาศตัวแปร ip ให้เป็นตัวแปรพอยน์เตอรท์ ี่ ชีไ้ ปยังตวั แปรประเภท int double *dp, atof(char *); เป็นการประกาศตวั แปร dp เป็นตัวแปรพอยนเ์ ตอร์ท่ชี ้ี ไปยังตัวแปรประเภท double และประกาศฟงั ก์ชนั atof มพี ารามเิ ตอรเ์ ป็นตัวแปรพอยนเ์ ตอร์ประเภท char 95

6.3 ก รก แ ก ร แปรปร เภ การกาหนดค่าให้กับตัวแปรพอยน์เตอร์จะเป็นการ กาหนดแอดเดรสของตัวแปรที่มปี ระเภทสอดคลอ้ งกบั ประเภทของตัวแปรพอยนเ์ ตอร์เท่าน้นั โดยการใช้ Unary Operator & เปน็ โอเปอเรเตอรท์ ่ีอ้างถงึ แอดเดรสของออปเจค็ (Object) ใด ๆ 96

int x = 1, y = 2; แปร int *ip, *iq; ip = &x; 97 y = *ip; *ip = 0; y = 5; ip = &y; *ip = 3; iq = ip; รป ่ 6.3 ก รก แ ก ร

x 1 400 y 2 402 int x = 1, y = 2; int *ip, *iq; ip 500 iq 502 98

x 1 400 ip = &x; y 2 402 99 ip 400 500 iq 502

x 1 400 y = *ip; y 1 402 ip 400 500 iq 502 100


Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook