เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร...

143
เรียนรูภาษา C++ ………. ในรูปแบบภาษาเชิงโครงสราง วัชระ รอดสัมฤทธิฟสิกสราชมงคล กุมภาพันธ 2553

Transcript of เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร...

Page 1: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

เรียนรูภาษา C++ ………. ในรูปแบบภาษาเชิงโครงสราง

วัชระ รอดสัมฤทธ์ิ ฟสกิสราชมงคล

กุมภาพันธ 2553

Page 2: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

บทท่ี 0

Warm up

กอนที่จะเร่ิมศึกษาภาษา C++ ตองเตรียมเครื่องมือใหพรอมเสียกอน จากนั้นทดลองใชเคร่ืองมือตาง ๆ

โดยเขียนโปรแกรมส้ัน ๆ ข้ึนมาสักโปรแกรมหน่ึง แลวดูผลการทํางานของโปรแกรมน้ัน เปนเสมือนการอุนเครื่อง

กอนท่ีจะลงสนามจริง ๆ

เคร่ืองมือท่ีใชประกอบในการเรียน ภาษา C++ (ไมนับรวมคอมพิวเตอรท่ีตองมีอยูแลว)ไดแก ตัวแปลภาษา

C++ ใหเปนภาษาเคร่ืองท่ีคอมพิวเตอรสามารถเขาใจ เรียกสั้น ๆ วา คอมไพเลอร (Compiler) ในท่ีน้ีจะเลือกใช

คอมไพเลอรของบริษัทบอรแลนด ซึ่งเปนของฟรี ดาวนโหลดมาใชโดยไมตองเสียสตางคและไมตองเกรงเร่ืองการ

ละเมิดลิขสิทธ์ิ เคร่ืองมืออีกชิ้นหนึ่งคือโปรแกรมประเภท editor ท่ีถนัด มีไวสําหรับพิมพตนฉบับโปรแกรมหรือท่ี

เรียกวา Source code

แบงการเตรียมการเปน 5 ข้ันตอนดังน้ี

1. download คอมไพเลอร Borland C ++ เวอรชั่น 5.5

2. ติดต้ังคอมไพเลอร

3. สราง configuration file สําหรับ คอมไพเลอร

4. ติดต้ัง Editor

5. ทดสอบโดยการเขียนโปรแกรมส้ัน ๆ ช่ือ Hello.cpp

เร่ิมทําตามขั้นตอนดังตอไปนี้

1. download คอมไพเลอร Borland C ++ เวอรช่ัน 5.5

เชื่อมตออินเทอรเน็ต แลวไปท่ี http://www.codegear.com/downloads/free/cppbuilder ใหทํา

ตามคําแนะนําท่ีบอกไวในเว็บไซต อาจตองลงทะเบียนหรือใส email ของเรา

Page 3: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

รูปที่ 1 หนาตาของเว็บไซตที่ จะดาวนโหลด Borland C++ compiler 5.5 เขาถึงเม่ือ 15 ม.ค. 2553

จากนั้นทําการดาวนโหลดไฟลท่ีชื่อวา FreeCommandLineTools.exe ขนาดของไฟลประมาณ 8.5 MB

มาเก็บไวในเคร่ืองของเรา

รูปที่ 2 ไฟล freecommandLinetools.exe ท่ีดาวนโหลดมาได

2. ทําการติดตั้ง Boland C++ Compiler (ตอไปจะขอเรียกส้ัน ๆ วา BCC) โดยปลอยใหโปรแกรมใชคาที่

ไดกําหนดไวแลว

Page 4: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

รูปท่ี 3 เร่ิมติดตั้ง Borland C++ Compiler

ตัวโปรแกรมคอมไพเลอรที่ถูกติดต้ังจะอยูท่ี ไดรว C ในโฟลเดอร C:\\Borland\BCC55 และมีโฟลเดอรยอย

แยกกันอยูอีกหลายโฟลเดอรดังรูปท่ี 4

รูปท่ี 4 เม่ือติดตั้งโปรแกรม Borland C++ compiler โดยใชคา default จะไดโฟลเดอรยอยดังรูป

3. กําหนดคาการใชงานตาง ๆ ใหกับระบบ (configuration)

3.1 กําหนด path เพื่อท่ีระบบปฏิบัติการจะไดมองเห็นคอมไพเลอรที่เราใชงาน

ถาคอมพิวเตอรน้ันใช Windows XP หรือ windows 2000 ใหทําดังน้ี

- คลิกเมาส ท่ีปุมขวา ท่ีไอคอน “My computer” ท่ีอยูบน desktop จะเห็นเมนู pop up ข้ึนมา ใหเลือก

“Properties” ซึ่งอยูลางสุด

Page 5: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

รูปที่ 5 เม่ือคลิกเมาสปุมขวา ท่ี My Computer

- เมื่อคลิกที่ “Properties” จะมีหนาตาง ชื่อ System Properties ปรากฏข้ึนมา ใหเลือก tab ที่ช่ือวา

“Advanced” ในแทบน้ี คลิกเมาสที่ปุม “Environmental Variables” ท่ีวงไวดวยสีแดง ในรูปท่ี 6

รูปท่ี 6 การกําหนดคา Path ใน Environment Variables

- ใหระบายหรือทํา Highlight ท่ี “Path” อยูตรงบริเวณดานลางของหนาตาง คลิกปุม Edit พิมพขอความ

“;C:\BORLAND\BCC55\BIN;” ตอทายประโยคเดิม ใหสังเกตวามีเคร่ืองหมาย semi colon ปดหัวทาย และไมตอง

พิมพเคร่ืองหมาย “ “

Page 6: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

รูปท่ี 7 การเพิ่มคา Path เพื่อใหวินโดวรูจัก คอมไพเลอร

- คลิกปุม OK ในหนาตาง “Edit System Variable” และ คลิกปุม OK ในหนาตาง “Environment

Variables” และปุม OK ในหนาตาง “System Properties”

ถาคอมพิวเตอรน้ันใช Windows 98/Me ใหทําดังน้ี

- กดปุม Start คลิกท่ีเมนู Run พิมพคําส่ัง “cmd” ลงไปในกลองขอความ แลวกด Enter

- ไปท่ี root ของไดรว C โดยพิมพคําวา “cd \” จากน้ัน พิมพคําวา “edit autoexec.bat “

- เพิ่มขอความบรรทัดใหมดังน้ี “PATH=C:\BORLAND\BCC55\BIN;%PATH%”

- Save ไฟล autoexec.bat ท่ีเราแกไข โดยกดปุม Alt + F และ กดปุม S

- ออกจากโปรแกรม edit โดยกดปุม Alt + F และ X

3.2 สราง Configuration files โดยจะสรางไฟลน้ีเก็บไวในโฟลเดอร C:\BORLAND\BCC55\BIN

จะสรางขี้นมา 2 ไฟล ไฟลหน่ึงสําหรับ คอมไพเลอร อีกไฟลหน่ึงสําหรับการ link กับ library ในระหวางการทํา

execute file

- คลิกท่ีปุม Start แลวคลิกท่ี เมนู Run พิมพคําวา “cmd” ลงในกลองขอความพรอม กด Enter

- ไปท่ีโฟลเดอร C:\BORLAND\BCC55\BIN โดยใชคําส่ังตอไปน้ี

cd\ กด Enter

Page 7: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

cd Borland กด Enter

cd bcc55 กด Enter

cd bin กด Enter

จะไดหนาตาดังรูปท่ี 8

รูปท่ี 8 การเขาไปท่ีโฟลเดอร C:\Borland\Bcc55\bin

- สราง configuration file หรือ ไฟล cfg อันแรก ชื่อวา bcc32.cfg โดยพิมพ คําส่ัง Notepad bcc32.cfg

รูปท่ี 9 การเรียกใช Notepad พิมพ configuration file

- โปรแกรม Notepad จะสรางไฟลวาง ๆ ท่ียังไมมีขอความใด ๆ ข้ึนมา 1 ไฟล จากนั้นใหพิมพขอความตอไปนี้ลงไป

ในพื้นท่ีวาง

-I"c:\Borland\Bcc55\include"

-L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\psdk"

บรรทัดแรก จะเปนประโยคที่บอกวา include file ท้ังหลายน้ันเก็บไวท่ีใด บรรทัดท่ี 2 จะบอกถึง Library file

ท่ีเก็บไว

Page 8: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

รูปที่ 10 ขอความใน bcc32.cfg

- Save ไฟล bcc32.cfg จากนั้นออกจากโปรแกรม Notepad

- สราง configuration file หรือไฟล cfg ไฟลที่ 2 ช่ือ ilink32.cfg โดยใช Notepad ใหพิมพคําสั่งดังน้ี

รูปที่ 11 การเรียกใช Notepad สรางไฟล ilink32.cfg

- พิมพขอความตอไปนี้ลงในพื้นท่ีวางของ Notepad

-L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\psdk"

รูปที่ 12 ขอความในไฟล ilink32.cfg

- Save ไฟล ilink32.cfg จากนั้นออกจากโปรแกรม Notepad

4. ติดต้ัง Editor ท่ีตนเองถนัด ในท่ีนี้ผูเขียน เลือกใช Editorplus เวอรชัน 2 (ปจจุบัน มีถึง เวอรชัน 3)

Page 9: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

แต editor ตัวน้ีเปน shareware สามารถดาวนโหลดทดลองใชได 30 วัน เราสามารถใช google คนหา editor ท่ีเปน

ของฟรีโดยใชคําวา “free editor” ก็จะไดโปรแกรม editor ท่ีเปน freeware หรือ Open source เปนจํานวนมาก

ตอไปนี้เปน Editor ท่ีเปนของฟรี

NotePad++ ดาวนโหลดไดท่ี http://notepad-plus.sourceforge.net/uk/site.htm

Crimson editor ดาวนโหลดไดท่ี www.crimsoneditor.com

VIM ดาวนโหลดไดที่ www.vim.org

PSPad ดาวนโหลดไดที่ www.psPad.com/en/

EditPad classic ดาวนโหลดไดท่ี www.jgsoft.com

ConTEXT ดาวนโหลดไดที่ www.context.com

ถาหาไมไดจริง ๆ จะใช Notepad ที่ติดมากับวินโดวเปน editor ก็ได แตจะทําใหการเขียนโปรแกรมอาจไมคอย

สะดวกมากนัก จึงไมอยากจะแนะนําใหใช

5. ทดสอบคอมไพเลอร ท่ีเราเพิ่งติดต้ัง ทําตามขั้นตอนตอไปน้ี

- สรางโฟลเดอรสําหรับเก็บ source code ที่เราจะเขียนไวโดยเฉพาะสักโฟลเดอรหน่ึงในท่ีน้ี จะใชช่ือวา

MyCpp โดยสรางไวท่ี C:\MyCpp ใหเขาไปที่ console box ดังท่ีเคยทํา(คลิกท่ี Start และคลิกท่ีเมนู Run พิมพ

คําวา “cmd” แลวกดปุม Enter)

- พิมพคําส่ัง “cd \” [Enter]

- พิมพ คําส่ัง “mkdir MyCpp” [Enter]

- พิมพคําสั่ง “cd MyCpp” [Enter]

รูปท่ี 13 การสรางโฟลเดอร MyCpp สําหรับเก็บ source code

ขณะน้ีเรากําลังอยูในโฟลเดอร C:\MyCpp

- เรียกใชโปรแกรม editor ในที่น้ีคือ Editplus คลิกที่เมนู File >> New >> C/C++

Page 10: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

รูปท่ี 14 การสรางไฟลใหมใน Editorplus เพื่อเขียนโปรแกรม

- พิมพขอความตอไปนี้ลงในพื้นท่ีวาง

// Hello.cpp #include <iostream.h> int main(void) { cout << "Hello, World" << endl; return 0; }

Page 11: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

รูปที่ 15 โปรแกรมแรก Hello.cpp

- Save โปรแกรมภาษา C++ โปรแกรมแรกของเรา เก็บไวในโฟลเดอร C:\MyCpp โดยตั้งช่ือวา Hello.cpp

รูปท่ี 16 แสดงโฟลเดอรท่ีจะเก็บไฟล Hello.cpp

Page 12: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

- กลับไปท่ีหนาตาง Console box พิมพคําส่ัง เพื่อทําการคอมไพลโปรแกรมดังน้ี “Bcc32 hello.cpp” แลว

เคาะ Enter โปรแกรมจะทําการคอมไพลและลิงค Hello.cpp ถาไมมีขอผิดพลาดใด ๆ ในการพิมพโปรแกรม จะได

ขอความท่ีหนาจอ ดังรูปท่ี 17

รูปท่ี 17 การคอมไพล Hello.cpp

- ทดลองใหโปรแกรมทํางาน โดยพิมพคําส่ัง hello จะเห็นขอความ “Hello, World” แสดงท่ีหนาจอ

รูปท่ี 18 แสดงการรัน Hello.exe

- เม่ือดูท่ี Folder C:\MyCpp พบวานอกจากไฟล Hello.cpp แลว ยังมีไฟลอื่นเกิดขึ้นอีก 3 ไฟล

Page 13: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

รูปท่ี 19 ไฟลท่ีเกิดขึ้น ในระหวางการคอมไพลและสิงค Hello.cpp

ไฟล Hello.obj เปน Object file ท่ีไดจากการท่ีคอมไพเลอรแปลโปรแกรมตนฉบับ Hello.cpp ใหเปนภาษาเคร่ือง

จากน้ันโปรแกรม Link จะนําไฟล Hello.obj ไปเชื่อมโยงกับ ไฟล Library ท่ีเก็บไวใน โฟลเดอร LIB แลวสรางเปน

ไฟลท่ีคอมพิวเตอรสามารถนําไปใชงานได เรียกวา executed file ในท่ีน้ี คือ Hello.exe เราสามารถนํา Hello.exe

ไปรันท่ีคอมพิวเตอรเคร่ืองใดก็ไดที่ใชระบบปฏิบัติการวินโดวเหมือนกัน สวน ไฟล Hello.tds ยอมาจาก Turbo

Debugger Symbols File เปนไฟลท่ีสรางข้ึนมาระหวางการคอมไพลและ Link มีประโยชนสําหรับการ Debug (การ

แกไขโปรแกรมเมื่อมีขอผิดพลาด) โดยใชโปรแกรม Turbo debugger เมื่อโปรแกรม Hello.exe ทํางานไดตาม

จุดประสงคที่เราตองการแลว สามารถลบไฟล Hello.obj และ Hello.tds ทิ้งได

มาถึงข้ันน้ี เคร่ืองมือตาง ๆ ท่ีเราเตรียมไวก็พรอมแลวท่ีจะตลุย นําเราไปสูการเรียนรูภาษา C++

Page 14: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

บทที ่1

C++จัดเปนภาษาคอมพิวเตอรเชิงวัตถุ (Object oriented language) แตยังคงสภาพเปนภาษาเชิง

โครงสราง(Structure or Procedure oriented language) ไวดวยในขณะเดียวกัน ภาษาคอมพิวเตอรเชิงวัตถุ

บางภาษาเชน Java, Smalltalk ไมมีคุณสมบัติเชนนี้ ปญหาที่มีลักษณะไมซับซอนมากนัก การออกแบบ

โปรแกรมใหมีลักษณะเชิงโครงสราง สามารถทําไดงายกวาและรวดเร็วกวา แตเม่ือถึงคราวท่ีจะตองทําซอฟตแวร

ขนาดใหญ ประกอบดวยคําส่ังไมนอยกวา สองแสนบรรทัดหรือมากกวา หรือมีโปรแกรมยอยขนาดเล็ก ๆ เปน

จํานวนมาก ตองใชโปรแกรมเมอรหลายคน แบงหนากันทํางาน การเขียนโปรแกรมเชิงวัตถุจะเหมาะสมกวา

เพราะงายและสะดวกในการจัดการและบริหารตัวซอฟตแวรที่มีขนาดใหญนั้น

โปรแกรมตนฉบับ (Source code) ที่เขียนดวยภาษา C++ จะตองถูกแปลงใหเปนภาษาเครื่อง

กลายเปน executed file กอนนําไปใชงาน และเปนไปตามวัฎจักรการพัฒนาโปรแกรม (Developed cycle) ซึ่ง

ประกอบดวยพิมพ(เขียน)โปรแกรมที่ออกแบบไวแลว (Editing) แปลโปรแกรมใหเปนภาษาเครื่อง (Compiling)

เช่ือมโยงโปรแกรมที่อยูในรูปภาษาเครื่องกับโปรแกรมยอย อื่น ๆ ที่เก็บไวในคลังโปรแกรม(Library) เรียกวา

Linking แลวนําโปรแกรมไปทดสอบการทํางาน (Testing or Running)

ถาการทํางานของโปรแกรมยังไมบรรลุวัตถุประสงคที่ต้ังไว ก็ตองหาขอบกพรองหรือขอผิดพลาด

(Debug) จากนั้นกลับไปเร่ิมตนวัฎจักรใหมอีกคร้ัง จนกวาจะไดโปรแกรมที่สามารถนําไปใชงานได

ทําไมตองเปน C++

ความเปนมาของภาษา C++

โปรแกรมแรก

ตัวแปรและคาคงที่ (Variable and Constant)

ชนิดของขอมูล (Data type)

นิพจนทางคณิตศาสตร (Mathematical Expression)

การรับขอมูลทางแปนพิมพ

ทําไมตองเปน C++ C++ มีลักษณะเฉพาะตัวที่มีความโดดเดนและเห็นไดชัดกวาภาษาคอมพิวเตอรอื่น ๆ คือ

Object-oriented programming การโปรแกรมเชิงวัตถุทําใหโปรแกรมเมอรสามารถออกแบบแอพ

พลิเคชันในมุมมองแบบวัตถุ การ Coding เปนการกําหนดใหวัตถุที่สรางส่ือสารซ่ึงกันและกัน สามารถนําโคดที่

สรางขึ้นกลับนํามาใชใหม ทําใหเกิดความผิดพลาดนอยและสรางผลงานไดอยางรวดเร็ว

Portability ในทางปฏิบัติสามารถนําโปรแกรมตนฉบับของภาษาC++ ไปคอมไพลในเคร่ือง

คอมพิวเตอรในแพลทฟอรมใด ๆ หรือระบบปฏิบติัการใด ๆ โดยไมตองแกไขดัดแปลงใหม

Brevity คําส่ังในภาษา C++ มีลักษณะส้ัน กระชับรัดกุมกวาภาษาอื่น ๆ (ทําใหคียบอรด อายุยืนกวา

: < )

Modular Programming สามารถแบงโปรแกรมออกเปนสวน ๆ คอมไพลและนํามาลิงคดวยกัน ชวย

ประหยัดเวลาการคอมไพล สวนใดผิดก็สามารถคอมไพลแลวแกไขเฉพาะสวนน้ัน นอกจากนี้ยังสามารถนําไป

เช่ือมตอกับภาษาอื่น ๆ เชน แอสเซมบลี ปาสคาล เปนตน

Page 15: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

C Compatibility โปรแกรมท่ีเขียนดวยภาษาC สามารถนําไปใชใน C++ โดยไมตองดัดแปลงคําส่ังใด

Speed โปรแกรมไบนารีที่คอมไพลโดย C++ จะมีขนาดเล็ก มีประสิทธิภาพ เพราะ C++ เปนทั้งภาษา

ชนิด High level และ low level

ความเปนมาของภาษา C++ ประมาณ ปค.ศ. 1969 หองปฏิบัติการ Bell ไดพัฒนาระบบปฏิบัติการขึ้นมาใหม ตอมามีชื่อเปน UNIX

โดย Ken Thomson ไดใชภาษาแอสเซมบลีเขียน UNIX บนเคร่ือง PDP-7 ตอมา Martin Richard พัฒนา

ภาษาระดับสูงชื่อ BCPL ( Basic Combined Programming Language) เพื่อใชเขียนระบบปฏิบัติการและ

คอมไพเลอร ใชกับเคร่ือง Multics ทอมสันไดยอสวน BCPL ใหมีขนาดเล็กลง เพื่อใหทํางานไดบนเคร่ือง DEC-

PDP-7 ซึ่งมีหนวยความจําเพียง 8 kB เรียกภาษานี้วา ภาษา B ทั้ง BCPL และ B เปนภาษาที่ไมมีชนิดขอมูล

ค.ศ. 1971 ไดมีการพัฒนาระบบ UNIX บนเคร่ือง PDP-11 ดวยภาษาแอสเซมบลี และ B

ค.ศ. 1972 Denis Ritchie ไดพัฒนาภาษา B ใหมีความสามารถมากขึ้น โดยนําลักษณะบางสวนของ

ภาษา Algo 68 มาใสรวมดวย เรียกวา ภาษา C ในปถัดมา ไดใชภาษา C เขียนระบบปฏิบัติการ UNIX เกือบ 90

%

ค.ศ. 1978 Brian Kernighan & Denis Ritchie เขียนหนังสือ The C Programming Language

จัดเปนคัมภีรภาษา C

ค.ศ. 1980 Bjarn Stroustrup ขยายขีดความสามารถของ C ใหเขียนเปนภาษาเชิงวัตถุได เรียกวา C

with class ตอมาในป 1983 Rich Mascitti ไดใหชื่อใหมเปน C++

ค.ศ. 1983 สํานักงานมาตรฐานแหงชาติอเมริกา ( American National Standard Institute, ANSI) ได

ต้ังคณะกรรมการ ชุด X3J11 กําหนดมาตรฐานภาษา C และในปค.ศ. 1989 ไดต้ังคณะกรรมการชุด X3J16

กําหนดมาตรฐาน C++

ค.ศ. 1989 กําหนดมาตรฐาน ANSI C ประกอบดวย K & R C และรวมบางสวนของภาษา C++ และ

รวม Standard Library ประกาศเปน ISO/ IEC 9699:1990 เม่ือ ปค.ศ. 1990 (ISO – International

Standardization Organization, IEC – International Electro technical Commission)

ค.ศ. 1991 คณะกรรมการ ANSI X3J16 รวมตัวกลายเปนสวนหนึ่งของ ISO/.IEC

JTC1/SC22/WG21

ค.ศ. 1998 ประกาศมาตรฐาน ภาษา C++ (ISO/IEC 14882: 1998)

ค.ศ. 1999 ประกาศมาตรฐาน ภาษา C (ISO/IEC 9899: 1999) เรียกยอวา ISO C99

( ขอมูลจาก www.hitmill.com/programming/cpp)

เริ่มตนโปรแกรมแรก กับภาษา C++ ในที่นี้จะเร่ิมตนโดยนํา C++ ไปใชในงานคํานวณ เปนการหาพื้นที่ของรูปส่ีเหล่ียมผืนผา ซึ่งหาไดจาก

สูตร กวาง × ยาว source code ของโปรแกรมมีดังนี้

Page 16: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

1: /* ==================================== 2: Program 1.1: FirstPrg.cpp 3: Calculating an area of rectangle. 4: Author: Wachara R. 5: Date: 03 Oct 2003 6: Last Update: - 7: Note: The first program in C++ 8: ------------------------------------- */ 9: #include <iostream.h> 10: int main() { 11: // define variables 12: float width, length, area; 13: // initialize variables 14: width = 30.0; // width of rectangle 15: length= 120.0; // length of rectangle 16: //Compute area of rectangle. 17: area = width*length; 18: //Print area on standard output 19: cout << " Area of this rectangle = " 20: << area << " sqr.meter" << endl; 21: // exit program 22: return 0; 23: } 24: // ============================================

โปรแกรมส้ัน ๆ 24 บรรทัดสามารถแยกออกเปนสวนประกอบยอย ๆ โดยเรียงตามลําดับที่ปรากฏใน

โปรแกรมดังนี้

• หมายเหตุของโปรแกรม (Comment)

• สวนกํากับในการแปลโปรแกรม (Preprocessor Directive)

• ฟงกชันที่มีชื่อวา main

• ตัวแปร (Variable)

• Statement

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

โปรแกรม เงื่อนไขการทํางานของโปรแกรม เพื่อสะดวกในการตรวจแก หรือเตือนความจําเม่ือกลับมาอาน

ภายหลัง คอมไพเลอรจะไมทําการคอมไพลในสวนที่เปน comment นี้ ในภาษา C++ จะมีหมายเหตุอยูสอง

ลักษณะคือ comment ที่เกิดจากรวมกันของบรรทัดหลาย ๆ บรรทัด หรือ comment เฉพาะบรรทัดนั้นเพียง

บรรทัดเดียว

บรรทัดที่ 1-8 จะใชสัญลักษณ /* (ในบรรทัดที่ 1) และ */ ( บรรทัด ที่ 8) ขอความที่อยูระหวางเคร่ืองหมาย

/*…..*/ คือสวนที่เปน comment

บรรทัดที่ 14 และ 15 ขอความที่อยูทายเคร่ืองหมาย // จนจบบรรทัดจะเปน comment

ในการแกไชโปรแกรม บางคร้ังจะกําหนดมิใหคําส่ังบางบรรทัดทํางาน โดยการใส // นําหนาบรรทัดนั้น หรือถา

ตองการใหประโยคคําส่ังหลาย ๆ บรรทัด ไมใหทํางานอาจครอมดวยเคร่ืองหมาย /*…..*/ แตตองระวัง

คอมไพเลอรบางบริษัท ฯ อาจไมยอมรับการใชคอมเมนตซอนคอมเมนต

Page 17: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

สวนกํากับในการแปลโปรแกรม (Preprocessor directive) คือคําส่ังที่ใชบอกใหคอมไพเลอรจะตองทํา

กอนที่จะทําการคอมไพลโปรแกรม คําวา preprocessing หมายถึงขั้นตอนแรกสุดกอนที่คอมไพเลอรจะ

แปลภาษา C++ ใหอยูในรูปภาษาเครื่อง บรรทัดที่ 9 #include <iostream.h> จัดเปน preprocessor

directive คําส่ังหนึ่ง ซึ่งจะใสไวตรงสวนหัวของโปรแกรม เปนคําส่ังใหคอมไพลนําไฟลที่อยูในวงเล็บรูปเหล่ียม

ในที่นี้คือ iostream.h มาแทรกตรงสวนนี้ของโปรแกรมในระหวางการคอมไพล ไฟลนี้มีคําส่ังที่ชวยใหเรา

สามารถใชคําส่ัง cout ในบรรทัดที่ 19 ซึ่งใชแสดงผลลัพธบนหนาจอได ถาลบบรรทัดนี้ออก คอมไพลเลอรจะแจง

ขอความผิดพลาดบนหนาจอวาไมรูจักคําส่ัง cout

ประโยคท่ีเปน preprocessor directive จะไมมีเคร่ืองหมาย ; ตามหลัง

สัญลักษณ <………..> ที่ใชครอมไฟลจะเปนการกําหนดวา header file นั้นถูกเก็บไวในโฟลเดอรที่

คอมไพเลอรกําหนดไว โดยปกติจะเก็บไวภายใตโฟลเดอรที่ชื่อ include ในเทอรโบซี เวอรชัน 3 ไฟลนี้จะถูกเก็บไว

ใน c:\tc\include\ ถาเราสราง include file ของเราเองเก็บไวที่เดียวกับโปรแกรมตนฉบับในโฟลเดอร MyCpp

จะตองแจงใหคอมไพเลอรทราบ โดยเขียนดังนี้

#include “myheader.h”

ระวังอยาใหมีชองวางในเคร่ืองหมาย <….> และ “…..”

Preprocessor directive จะขึ้นตนคําส่ังดวย # (pound sign) โดยทั่วไปจะถูกนํามาใชในลักษณะ

ตอไปนี้

1. ใชตัวกํากับ #include เพิ่มหรือแทรกสวนตาง ๆ ของโปรแกรม เราสามารถนําตัวแปรตาง ๆ ไปประกาศ

ไวในแฟม include เพียงที่เดียว เพื่อลดความเส่ียงที่ฟงกชันในแฟมตนฉบับอื่น ๆ หาตัวแปรไมพบ

2. ตัวกํากับที่มีเงื่อนไข (conditional directive) เราสามารถใชตัวกํากับที่มีเงื่อนไข เชน #if, #ifdef,

#ifndef, #else, #elseif และ #endif

3. ใชควบคุมการแปลโปรแกรมตนฉบับใหอยูภายใตเงื่อนไขตาง ๆ เชน แปลเพียงสวนใดสวนหนึ่งของ

โปรแกรม หรือนําไปคอมไพลบนระบบปฏิบัติการท่ีตางกัน

ขอแนะนํา ถาตองการ debug โปรแกรมเปนชวง ๆ สามารถใช preprocessor แทน /*…..*/ เพื่อปองกันการเกิด

comment ซอน comment เชน #if (0) while (I < 10) { sum = sum + i; /* summation of each preparation for average calculation */ } average = sum/n; #endif

ฟงกชัน main( ) บรรทัดที่ 10 เปนฟงกชันที่มีอยูเสมอในโปรแกรมภาษา C++ ทุก ๆ โปรแกรม เม่ือเรียกใช

โปรแกรมนี้ใหทํางาน ระบบปฏิบัติการจะใชฟงกชัน main() เปนจุดเร่ิมตนของโปรแกรม จากตัวอยาง

Int main( ) หมายถึงเม่ือจบการรันโปรแกรม ฟงกชัน main( ) จะสงคากลับเปนจํานวนเต็ม (integer) ไปยัง

ระบบปฏิบัติการ ในที่นี้คือ 0 ดูไดจากบรรทัดที่ 16 return 0; main เปนชื่อฟงกชัน ( ) ในวงเล็บวางเปลา แสดง

วาไมมีพารามิเตอรใด ๆ ที่ใชในฟงกขัน main

คําส่ังโปรแกรมจะอยูระหวางเคร่ืองหมายปกกาเสมอ ดังรูปแบบตอไปนี้

Page 18: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

Introductory comment Preprocessor directive int main( ) { definition – define variables used within main

executable statement – specify the computing operation to be carried out

}

ถึงแมจะไมมีคาวา int นําหนา main (และฟงกชันอื่น ๆ ก็เชนกัน) จะถือวาฟงกชันนั้นสงคากลับเปน

แบบจํานวนเต็ม

รูปแบบเต็มของฟงกชัน main มีดังนี้

int main (int argc, char **argv, char ** env) { }

ในระบบปฏิบัติการวินโดวส จุดเร่ิมตนของโปรแกรมที่ทํางานภายใตสภาพแวดลอมของวินโดวสจะเปน

int WinMain ( ) { }

ฟงกชัน main ( ) จะสงคากลับไปยังระบบปฏิบัติการ เพื่อใชตรวจการประมวลผลของโปรแกรมวามี

ขอผิดพลาดบางหรือไม ถาโปรแกรมสงคา “ศูนย” กลับมา แสดงวาการประมวลผลเปนไปอยางเรียบรอยไมมี

ปญหา ถาคาที่สงกลับมาไมใชศูนย แสดงวามีปญหาเกิดขึ้น โปรแกรมสวนใหญจะสงคาระหวาง 1 ถึง 5 ถามี

ปญหาคอนขางรายแรงระหวางโปรแกรมทํางาน ระบบปฏิบัติการสามารถใชตัวเลขเหลานี้เปน error code ใน

ระหวางการประมวลผล batch file ซึ่งอาจใชใหระบบปฏิบัติการยกเลิกการทํางานหรือทํางานสวนอื่นขึ้นอยูกับ

ความตองการของผูเขียน batch file

ตัวแปร (variable) คือพื้นที่หนวยความจําที่ใชเก็บขอมูล โดยการระบุชื่อ (identified) สมบัติที่สําคัญ

ของตัวแปรมีอยู 3 อยางคือ ชนิด (type) ขอบเขต (scope) และ ลักษณะการจัดเก็บขอมูล (storage class)วา

เปนแบบ auto หรือ register หรือ extern หรือ static ซึ่งจะกลาวอยางละเอียดในหัวขอตัวแปร

จากบรรทัดที่ 12 float width, length, area;

float เปนชนิดของตัวแปร มีตัวแปรชนิดนี้อยู 3 ตัวคือ width, length และ area

Statement หรือ ถอยแถลง หรือ กระทงความ อาจเปนประโยค หรือวลี หรือคําเพียงหน่ึงคํา ปดทายดวย

เคร่ืองหมาย semi colon เสมอ

บรรทัดที่ 13 14 และ 17 14: width = 30.0; 15: length= 120.0; 16: //Compute area of rectangle. 17: area = width*length;

เปนการกําหนดคา (assign) ใหตัวแปร width และ length

บรรทัดที่ 19 เปน statement ที่ใชพิมพผลลัพธของโปรแกรมออกท่ีจอภาพ 19: cout << " Area of this rectangle = "

Page 19: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

20: << area << " sqr.meter" << endl;

cout ยอมาจากคํ่าวา Console Output อานวา ซี – เอาท cout จะนําขอความ Area of this rectangle =

แสดงออกที่จอภาพ สัญลักษณ << หมายถึง Output operator หรือ insertion operator เปนการนําขอความ

สงตามมาดวย ซึ่งเปนคา area ที่คํานวณไดจากบรรทัดที่ 17 การสงขอความทั้งหลายไปยัง cout จะตอเนื่อง

เหมือนกับเปนกระแสขอความ คาในตัวแปรทั้งหลายที่สงนี้เรียกวา stream cout จะแสดงผลเรียงตามลําดับ

กอนหลังที่ปรากฏอยูหลังเคร่ืองหมาย <<

endl หมายถึง end of line เปนการกําหนดใหขึ้นบรรทัดใหม

return 0; เปนการสงคากลับของฟงกชัน main() ไปยังระบบปฏบิัติการ มีคาเปนศูนยเม่ือการทํางาน

ของโปรแกรมเปนไปอยางราบร่ืน

ขอควรระวัง ประโยคท่ีนิยามตัวแปร และ statement ตองปดทายดวย ; เสมอ

คอมไพเลอรภาษา C++ ในยุคหลัง ๆ รวมทั้ง Borland C ++ Compiler ที่กําลังใชอยูนี้ดวย ไดเพิ่ม

การใชงาน “namespace” รวมเขาไวดวย namespace จะชวยแบงขอบเขตการเรียกใชคลาส ตัวแปร เมธอด

ตาง ๆ มิใหโปรแกรมสับสน นิยมใชกับโปรแกรมที่มีขนาดใหญ มีผูรวมเขียนโปรแกรมหลายคน มีการเรียกใช

Library จากที่แหลงตาง ๆ เปนจํานวนมาก เพราะบางครั้งอาจมีการต้ังชื่อคลาส ตัวแปร หรือเมธอด ซ้ํากัน

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

เนื่องจากโปรแกรมของเรามีขนาดส้ัน ตัวแปรที่ใช และฟงกชันตาง ๆ จึงมีไมมากนัก ในที่นี้จึงไมใช

namespace ใสไวในโปรแกรม

พารามิเตอรของฟงกชัน main ( )

โปรแกรม 1-1 เปนการคํานวณหาพื้นที่ส่ีเหล่ียมผืนผา (สนามฟุตบอล) จะเห็นวาเรากําหนดความกวาง

ความยาวไวในโปรแกรม นั่นหมายถึงถาจะใชโปรแกรมน้ีคํานวณพื้นที่ส่ีเหล่ียมผืนผารูปอื่น ๆ จะตองเปล่ียนคา

width และ length ในโปรแกรมตนฉบับ จากนั้นจึงคอมไพล สราง execute file ขึ้นมาใหม และทําซํ้าเชนนี้ทุก

คร้ัง ที่เปล่ียนคาความกวางและความยาว

จะเปนการสะดวกถาเราจะใชโปรแกรมนี้คํานวณหาพื้นที่ส่ีเหล่ียมผืนผาใด ๆ เชน ตองการคํานวณหา

พื้นที่ของส่ีเหล่ียมผืนผา กวาง 45 เมตร ยาว 72 เมตร สามารถพิมพคําส่ังตอไปน้ีที่ระบบปฏิบัติการ

C: > findarea 45 72 ( กด enter)

จะไดผลลัพธ

Rectangle area = 3240 sqr meter

Page 20: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

เราสามารถทําเขนนี้ได โดยอาศัยพารามิเตอรของฟงกชัน main ดังโปรแกรม 1.2 ดังนี้

1: /* ==================================== 2: Program 1.2: FindArea.cpp 3: Find rectangular area at command prompt 4: Author: Wachara R. 5: Date: 03 Oct 2003 6: Last Update: - 7: ------------------------------------- */ 8: #include <iostream.h> 9: #include <math.h> 10: int main(int argc, char** argv, char**env) { 11: float width, length, area; 12: 13: if (argc < 3) { 14: cout << "How to use this program " << endl 15: << "C:\>testarg width length (press ENTER)" << endl; 16: } else { 17: width = atof(argv[1]); // width of rectangle 18: length= atof(argv[2]); // length of rectangle 19: //Compute area of rectangle. 20: area = width*length; 21: //Print area on standard output 22: cout << " Area of this rectangle = " 23: << area << " sqr.meter" << endl; 24: } 25: // exit program 26: return 0; 27: } 28: // ============================================ เม่ือเราพิมพ C: > findarea 45 72 ( กด enter) คาความกวาง 45 เมตรและความยาว 72 เมตร

ระบบปฏิบัติการ จะเก็บคานี้ไวในตัวแปร argv[1] และ argv[2] นําคาที่ไดนี้ไปเก็บไวที่ตัวแปร width และ

Page 21: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

length จากนั้นคํานวณหาพื้นที่ส่ีเหล่ียมผืนผาเก็บคาที่ไดไวใน area คําส่ัง cout จะพิมพ คําตอบ 3240 ปรากฎ

บนจอภาพ

โปรแกรมตอไปน้ี จะตรวจสอบพารามิเตอรของฟงกชัน main() ที่รับคาตาง ๆ จากระบบปฏิบัติการ 1: /* ==================================== 2: Program 1.2A: TestArg.cpp 3: Test arguments that passed to function main() 4: Author: Wachara R. 5: Date: 03 Oct 2003 6: Last Update: - 7: ------------------------------------- */ 8: #include <iostream.h> 9: int main(int argc, char** argv, char**env) { 10: int i; 11: cout << " argc = " << argc << endl; 12: for (i = 0; i < argc ; i++ ) { 13: cout << "argv[" << i<< "] ---> " << argv[i] << endl; 14: } 15: cout << endl; 16: i = 0; 17: while (env[i]) { 18: cout << "env[" << i << "] ---> " << env[i] << endl; 19: i++; 20: } 21: 22: 23: // exit program 24: return 0; 25: } 26: // ============================================

เม่ือพิมพคําส่ัง

C:> testarg test1 test2 test3 test4 (กด enter)

ฟงกชัน main( ) ของโปรแกรม testarg จะรับคาพารามิเตอรมา 5 คา คาตาง ๆ จะถูกเก็บไวใน argv [

] ดังรูป

argc = 5 argv[0] ---> C:\MyCpp\chap01\TESTARG.exe argv[1] ---> test1 argv[2] ---> test2 argv[3] ---> test3 argv[4] ---> test4 env[0] ---> =::=::\ env[1] ---> =C:=C:\MyCpp\chap01 env[2] ---> =ExitCode=00000000 : : :

Page 22: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ตัวแปร env[ ] จะเก็บคาสภาพแวดลอมของระบบปฏิบัติการ ซึ่งจะแตกตางกันไปในแตละเคร่ือง

ขึ้นอยูกับคาที่กําหนดไวใน autoexec.bat และ config.sys ในระบบปฏิบัติการ DOS เราสามารถใชคําส่ัง set

ตรวจสอบสภาพแวดลอมนี้ได

ลองทดลองพิมพ C:> testarg one two “three four” five six (กด enter)

ตัวแปรและคาคงท่ี (Variables and Constants) ตัวแปรคือเนื้อที่ของหนวยความจําที่ใชเก็บขอมูล ขอมูลที่เก็บนี้อาจมีการเปล่ียนแปลงคาในระหวาง

การประมวลผล เราจะกําหนดช่ือ (identifier or variable name) ใหกับตัวแปรเพื่อที่สะดวกในการอางอิงถึงใน

การเขียนโปรแกรม

การกําหนดช่ือตัวแปรมีหลักดังนี้

- มีความยาวก่ีตัวอักษรก็ได ตองขึ้นดวยตัวอักษร A ถึง Z หรือ a ถึง z และเครื่องหมาย _ (under

score) เทานั้น ขึ้นตนดวยตัวเลขไมได

- อักษรถัดจากตัวแรกจะเปนตัวอักษร หรือ ตัวเลข หรือ เคร่ืองหมาย _

- หามมีชองวางหรือเคร่ืองหมายทางคณิตศาสตร เชน +, - , *, / , ^, <<, >>, (, ), [, ], {, }, %,

$, &

- อักษรตัวใหญตัวเล็ก มีผลตอชื่อตัวแปร เชน Area กับ area ภาษา C++ จะถือวาเปนตัวแปรคน

ละตัวกัน

- ชื่อของตัวแปรจะตองไมซ้ํากับคําที่สงวนไว ( Reserved word or token) ในภาษา C++ มี 109

คําดังนี้

and and_eq asm auto bitand bitor bool break case catch char class const const_cast continue default delete do double dynamic_cast else enum explicit export extern false float for friend goto if inline int long mutable namespace new not not_eq operator or or_eq private protected public register reinterpret_cast return short signed sizeof static static_cast struct switch templatethis throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while Xor xor_eq

Page 23: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

คําสงวนบางคํา คอมไพเลอรรุนเกาไมไดนับรวมหรือจัดไววาเปนคําตองหาม ถึงกระนั้นก็ตามเราควร

หลีกเล่ียงชื่อตัวแปรโดยไมใชชื่อซ้ํากับคําเหลานี้ คอมไพเลอรบางบริษัทมีการเพิ่มคําสงวนเพิ่มเฉพาะเขาไปอีก

เชน Borland compilers for the PC มีการเพิ่มคําวา near, far, huge, cdecl และ pascal

จะเห็นวา main, cin และ cout ไมใชเปนคําสงวน แตในทางปฏิบัติไมควรต้ังชื่อตัวแปรใหซ้ํากับคํา

เหลานี้เชนกัน

- การต้ังชื่อตัวแปรควรส่ือความหมาย เพี่อประโยชนในการทําความเขาใจการทํางานของโปรแกรม

และสะดวกในการตรวจแกไขโปรแกรม

- ในระบบปฏิบัติการวินโดวส ไดเสนอแนะใหใชการต้ังชื่อตัวแปรแบบ Hungarian notation ซึ่งในชื่

ตัวแปรนั้นจะบอกชนิดของขอมูล วัตถุประสงคของตัวแปรวาจะนําไปใชทําอะไร

- หลักการต้ังชื่อตัวแปรสารมารถนําไปใชกับช่ือฟงกชัน คลาส และ structure ไดอีกดวย

แบบฝกหัด ชื่อตัวแปร ตอไปนี้ ถูกหรือผิด ถาผิดบอกเหตุผลดวย

Perimeter x_sum 3dimension f(x) fx operator tax_payment

Km/hr subtotal variable1 counter far null Net_Pay

Next_character _x get-result H2O _CLOCK_ x&y

_in_$ 4mypet PuZzle tip4you myCash while

Percent%rate

ชนิดของขอมูล (Data type) จะเปนตัวบอกใหคอมไพเลอรรูวาขอมูลที่เก็บไวในหนวยความจํา จะนําไปประมวลผลในลักษณะ

ใดบาง แบง ขอมูลที่สมารถนําไปคํานวณได (numeric data type) หรือเปนขอมูลที่ไมสามารถนําไปคํานวณได

เชน อักขระ ตาง ๆ หรือขอมูลตรรกะ (Logical data type)

ขนาดของหนวยความจําที่ใชเก็บขอมูลจะแปรเปล่ียนไปตามระบบปฏิบัติการ หรือตามแพลทฟอรม

ของคอมพิวเตอรที่ใชประมวลผล คอมไพเลอรที่ถูกสรางขึ้น ในระบบปฏิบัติการ DOS และใน Unix จะใชเนื้อที่ใน

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

โดยทั่วไปขนาดของหนวยความจําที่ใชเก็บขอมูลจะเปนไปตามตารางขางลางนี้

ตารางจําแนกชนิดของขอมูลใน C++

ชนิดขอมูล รายละเอียด จํานวน

byte

คาที่เปนไปไดตํ่าสุด คาที่เปนไปไดสูงสุด

ขอมูลที่เก็บแบบจํานวนเต็ม

char ขอมูลชนิด

ตัวอักษรโดย

เก็บรหัสASCII

ของตัวอักษรนั้น

1 -128 127

unsigned ขอมูลชนิด 1 0 255

Page 24: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

char ตัวอักษรไมคิด

เคร่ืองหมาย

short จํานวนเต็ม 2 -32,768 32,767

unsigned

short

จํานวนเต็มไม

คิดเคร่ืองหมาย

2 0 65,535

long จํานวนเต็มทั้ง

บวกและลบ

4 -2,147,483,648 2,147,483,647

unsigned

long

จํานวนเต็มบวก 4 0 4,294,967,295

int เชนเดียวกับ

long

2 -32,768 32,767

unsigned

int

เขนเดียวกับ

unsigned long

2 0 65,535

int64 จํานวนเต็ม 8 -9,223,372,036,854,775,807 9,223,372,036,854,775,808

ชนิดขอมูล รายละเอียด จํานวน

byte

คาที่เปนไปไดตํ่าสุด คาที่เปนไปไดสูงสุด

ขอมูลที่เก็บแบบเลขทศนิยม (Floating Point)

float จํานวนจริงแบบ

single

precision

4 1.75494E-38 3.402823E+38

double 8 2.2250738585E-308 1.7976931348E+308

long double จํานวนจริงแบบ

double

precision

10 3.3621031431E-4932 1.1897314953E+4932

ชอมูลชนิดตรรกะ (Boolean data type)

bool ขอมูลชนิด

ตรรกะ

1 true false

ถาเราตองการทราบวาขอบเขตของชนิดขอมูลในแพลตฟอรมที่เราใชงานอยู ทําไดโดยพิมพคาขีดจํากัดบนและ

ลางของขอมูลแตละชนิด โดยอาศัยคาคงท่ี ที่กําหนดไวใน header file ที่ชื่อวา limits.h และ float.h ดังตัวอยาง

ตอไปนี้ 1: // Program 1.3 testlimit.cpp 2: // Print the limits to the various data type 3: //------------------------------------------------ 4: #include <iostream.h>

Page 25: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

5: #include <limits.h> 6: #include <float.h> 7: main () { 8: cout << "Type" << "\t\t\tMinimum\t\t\tMaximum" << endl; 9: cout << "------------------------------------------------------" << endl; 10: 11: cout << "char\t\t\t" << CHAR_MIN << "\t\t\t"<< CHAR_MAX << endl; 12: cout << "signed char\t\t"<< SCHAR_MIN<<"\t\t\t"<<SCHAR_MAX << endl; 13: cout << "unsigned char\t\t" << 0 << "\t\t\t" << UCHAR_MAX << endl; 14: cout << "short\t\t\t" << SHRT_MIN << "\t\t\t" << SHRT_MAX << endl; 15: cout << "unsigned short\t\t" << 0 << "\t\t\t" << USHRT_MAX << endl; 16: cout << "int\t\t\t" << INT_MIN <<"\t\t\t"<< INT_MAX << endl; 17: cout << "unsigned int\t\t"<< 0 <<"\t\t\t-" << UINT_MAX << endl<<endl; 18: 19: cout << "long\t\t\t" << LONG_MIN << "\t\t" << LONG_MAX << endl; 20: cout << "unsigned long\t\t"<<0<<"\t\t\t<< ULONG_MAX << endl<< endl; 21: 22: cout << "float\t\t\t" << FLT_MIN << "\t\t" << FLT_MAX << endl; 23: cout << "double\t\t\t" << DBL_MIN << "\t\t" << DBL_MAX << endl; 24: cout << "long double\t\t" << LDBL_MIN << "\t\t" << LDBL_MAX << endl; 25: return 0; 26: } ภาษา C และ C++ ในยุคแรก ๆ ไมแยกชนิดชอมูลแบบตรรกะออกมาเปนเอกเทศ จะตรวจสอบ “จริง”

หรือ “เท็จ” จากขอมูลชนิด int ถามีคาไมเปนศูนย แสดงวา “จริง” ถามีคาเปนศูนยแสดงวาเปน “เท็จ”

ค.ศ. 1993 คณะกรรมการ ANSI X3J16 และ ISO WG21 ไดประชุมรวมกันโดยเพ่ิมขอมูลชนิด bool

ซึ่งจะรับคาเพียง 2 คา คือ จริงและเท็จ (true , false) เม่ือแปลงขอมูลชนิด bool ใหเปนชนิด int จะได true เปน

1 และ false มีคาเปนศูนย เม่ือแปลงขอมูลชนิด int เปน bool คาที่เปน non-zero จะมีคาเปน true และ 0 มีคา

เปน false

คอมไพเลอรรุนหลัง พฤศจิกายน 1993 ที่สามารถใชขอมูลชนิด bool ได เชน GNU C++ v2.6.1

Turbo C++ v 4.0

คอมไพเลอรรุนเกา สามารถใชขอมูลชนิด bool ได โดยเพิ่มประโยคตอไปนี้

typedef char bool; // define type tool

const bool false = 0; // init false

const bool true = 1; // init true.

โปรแกรมตอไปน้ีจะเปนโปรแกรมใชตรวจสอบขนาดของขอมูลแตละชนิด 1: //Program 1.4 TestVarSize.cpp 2: // Find the size of byte for storing some data type. 3: // 4: #include <iostream.h> 5: int main () { 6: char ch; 7: unsigned char uch; 8: int i; 9: unsigned int ui; 10: short si1; 11: short int si2; 12: unsigned short usi; 13: long li1;

Page 26: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

14: long int li2; 15: unsigned long uli; 16: float f; 17: double d; 18: long double ld; 19: cout << " Data Type\t\t\tSize in Byte" << endl 20: << "---------------------------------------" << endl; 21: cout << "char\t\t\t\t" << sizeof (ch) << endl 22: << "unsigned char\t\t\t" << sizeof (uch) << endl 23: << "int\t\t\t\t"<< sizeof(i) << endl 24: << "unsigned int\t\t\t" << sizeof (ui) << endl 25: << "short\t\t\t\t" << sizeof(si1) << endl 26: << "short int\t\t\t" << sizeof(si2)<< endl; 27: cout << "unsigned short int\t\t" << sizeof (usi) << endl 28: << "long\t\t\t\t" << sizeof (li1) << endl 29: << "long int\t\t\t"<< sizeof(li2) << endl 30: << "unsigned long int\t\t" << sizeof (uli) << endl 31: << "float\t\t\t\t" << sizeof(f) << endl 32: << "double\t\t\t\t" << sizeof(d)<< endl 33: << "long double\t\t\t" << sizeof(ld) <<endl; 34: 35: return 0; 36: } ขอสังเกต sizeof ถือวาเปน operator ตัวหนึ่ง ใชบอกขนาดของหนวยความจํา ที่ใชเก็บขอมูลชนิดนั้น sizeof

(ch) อาจเขียนเปน sizeof ch ก็ได โดยที่ไมตองใสวงเล็บ

ผลของการรันโปรแกรมที่ 1.4 จะเปนดังนี้

Data Type Size in Byte ----------------------------------------------------- char 1 unsigned char 1 int 4 unsigned int 4 short 2 short int 2 unsigned short int 2 long 4 long int 4 unsigned long int 4 float 4 double 8 long double 10

คาคงท่ี (Symbolic Constants) ถาขอมูลนั้นไมมีการเปล่ียนแปลงคาต้ังแตตนโปรแกรมจนจบการทํางาน เรานิยมกําหนดขอมูลนั้นให

เปนคาคงท่ี การกําหนดช่ือคาคงท่ี จะนําหนาดวย const ตามดวยชนิดของขอมูล และช่ือคาคงท่ี ปดทาย

ประโยคดวย ; เสมอ เชน

Const double PI = 3.141592653;

เม่ือนําไปใชในโปรแกรม เชน area = PI * radius * radius ; คา PI จะถูกแทนที่ดวย 3.141592653..

Page 27: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ตัวอยางคาคงท่ีอื่น ๆ ที่ใชบอยในการคํานวณทางวิทยาศาสตร กําหนดใหเปนคาคงท่ีจะได const double EARTH_GRAVITY = 9.81; // acceleration due to gravity const double ELECTRIC_CHARGE = 1.602177e-19 ; // an Electric charge const double LIGHT_SPEED = 2.999792e+8; // speed of light in vacuum const int DAY_IN_A_YEAR = 365; const char TAB = ‘’\t’; const float VATRATE = 0.07; const SECOND_IN_HOUR = 3600; บรรทัดสุดทาย ไมมีการระบุชนิดขอมูล จะถือวาเปนขอมูลชนิด int

คอมไพเลอรจะมองเห็นคาคงท่ีเปนเลขฐานสิบเสมอ เราสามารถเขียนคาคงท่ีใหคอมไพเลอรมองเห็น

เปนเลขฐานแปด หรือ ฐานสิบหกได จํานวนเลขใดที่ขึ้นตนดวย 0 (ศูนย) นําหนา C++ จะคิดวาเปนเลขฐาน

แปด เชน

023 หมายถึง 19 ในเลขฐานสิบ

010 หมายถึง 8 ในเลขฐานสิบ

จํานวนเลขใดที่ขึ้นตนดวย 0x (ศูนย กับ เอกซ) จะมองวาเลขฐานสิบหก เชน

0xa หรือ 0xA หมายถึง 10 ในเลขฐานสิบ

0x2f หรือ 0x2F หมายถึง 47 ในเลขฐานสิบ

จํานวนจริง เขียนไดในรูปแบบใสจุดทศนิยม หรือใชตัวอักษร e แทนการเขียนตัวเลขยกกําลัง เชน

0.0

32.68

-3e5 หมายถึง -3 x 105

ถาตอทายตัวเลขดวย f หรือ F จํานวนเลขน้ันจะถูกเก็บเปนแบบขอมูลชนิด float ถาตอทายตัวเลขดวย l หรือ L

จํานวนเลขน้ันจะถูกเก็บเปนแบบขอมูลชนิด long double จํานวนจริงที่ไมมีตัวอักษร f(F) หรือ l(L) ตอทาย

คอมไพเลอรจะมองเห็นเปน double

ขอมูลชนิด char อักขระ 1 ตัวจะอยูในเคร่ืองหมาย single quote เชน ‘a’, ‘3’, ‘\n’ เม่ือมีอักขระหลาย

ๆ ตัว หรือ วลี จะอยูในเคร่ืองหมาย double quote เชน “Area of rectangle”, “Hello, world”. เรียกอักขระหรือ

วลีเหลานี้วา String

ขอมูลชนิด char ยังสามารถเก็บสัญลักษณพิเศษที่ไมสามารถแสดงผลบนจอภาพ เรียกอักขระเหลานี้

วาเปน escape sequence ประกอบดวยตัวอักษร 1 ตัว นําหนาดวย \ ( back slash)

Escape sequence ความหมาย

\a alert character (bell)

\b backspace

\f form feed

\n New line

\r Carriage return

\t Horizontal tab

Page 28: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

\v Vertical tab

\\ Back slash

\? Question mark

\’ Single quote

\” Double quote

\xff Character constant in hex

การกําหนดคาใหกับตัวแปร (Assignment)

การกําหนดคาใหตัวแปร ใด ๆ คือ การนําคาคงท่ีหรือช่ือของตัวแปรหรือ ผลที่เกิดจากการคํานวณทาง

คณิตศาสตร ไปใสไวในหนวยความจําที่มีชื่อเปนของตัวแปรนั้น เชน

Float width, length, area; width = 30.0; length= 120.0; area = width*length;

เปนการกําหนดคาตัวแปรชื่อ width และ length มีคาเปน 30.0 และ 120.0 (30.0 และ 120.0 เปน

คาคงท่ีที่เปนตัวเลขแบบทศนิยม) และกําหนดคาตัวแปร area มีคาเทากับผลคูณของตัวแปร widthและ length

จากตัวอยาง ถาเปล่ียนการกําหนดคาเปนดังนี้ width = 30.0; length= width; เปนการกําหนดคาให length มีคาเทากับ width คือ 30.0 อาจเขียนใหอยูในบรรทัดเดียวกันไดดังนี้ width = length = 30.0; แตเราไมสามารถเขียนการกําหนดคา 20 = width เพราะกําหนดคาตัวแปรใหกับคาคงท่ีไมได

ถาการกําหนดคาตัวแปรใหไมตรงกับชนิดของขอมูล ขอมูลจะถูกแปลงคาใหเหมาะสมกับชนิดของ

ขอมูลของตัวแปรนั้น เชน int x; x = 4.5;

x เปนขอมูลชนิด จํานวนเต็ม ไมสามารถเก็บเลขทศนิยม ดังนั้นตัวแปร x จะเก็บคา x = 4 ไวในหนวยความจํา

เทานั้น ขอมูลจะไมถูกตองสมบูรณ ถาเราใสขอมูลชนิด float ใหกับตัวแปรชนิด integer

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

ของชนิดขอมูลโดยเรียงจากขนาดหนวยความจําและตัวเลขสูงสุดที่เก็บไดดังนี้

สูง long double

double

float

long int

Page 29: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

int

short int

ตํ่า char

กรณีแรก ถาขอมูลที่มีชนิดสูงกวาถูกกําหนดใหแกตัวแปรที่มีชนิดขอมูลตํ่ากวา ขอมูลจะมีการสูญหาย

และผลลัพธที่ไดอาจไมถูกตอง กรณีที่ 2 ถากําหนดขอมูลที่มีชนิดตํ่ากวาใหกับตัวแปรขอมูลที่มีชนิดขอมูลสูงกวา

ขอมูลจะถูกตอง ไมเกิดปญหา

จะเห็นวาไมไดนําขอมูลชนิด unsigned integer เขามาไวในรายการ เพราะจะทําใหเกิดความ

คลาดเคล่ือนเสมอ ทั้งสองกรณี อยางไรก็ตามควรกําหนดคาใหถูกตองกับชนิดของขอมูลจะเปนการดีที่สุด

เม่ือกําหนดคาคงที่ใหแกขอมูล คอมไพเลอรจะรูวาเปนขอมูลชนิดใดจะดูจากรูปแบบการเขียนจํานวน

เลขดังตอไปนี้

int จะเปนตัวเลขที่ไมมีทศนิยม เชน 1, 0 , -8, 123, -6385, 0xff (เลขฐานสิบหก)

long int เปนเลขจํานวนเต็มที่มี L ตอทาย เชน 1L, 0L,-8L, 123L, -6385L, 0xffL (ใช l ก็ได แตจะดูคลายเลข

หนึ่ง)

double ตัวเลขจํานวนจริงที่อยูในรูปทศนิยม หรือเลขดรรชนี เชน 1.0, 0.0, 1234.56, 5e2 ( 25 10× ), 3.2e6

( 63.2 10× ), 6.23e-34 ( 346.23 10−× )

โปรแกรม 1.5 จะเปนการทดสอบวา เม่ือไมกําหนดคาใหกับตัวแปร และบางแหงมีการกําหนดคาใหกับ

ตัวแปร คอมไพเลอรจะแสดงผลการคอมไพลอยางไรบาง

1: //Program 1.5 TestDataType.cpp 2: // Test Basic data type 3: // 4: #include <iostream.h> 5: main () { 6: //definition without initialization 7: char character; 8: int integer; 9: float floatnum; 10: double dfloatnum; 11: // definition with initialization 12: char ch='A', people='p'; 13: int i=2, j=6; 14: float height= 1.8, base = 7.0; 15: double charge = 1.6e-19; 16: //Print out uninititalized variables 17: cout << "\ncharacter (char Not initialized) = " << character; 18: cout << "\ninteger ( int not initialized) = " << integer; 19: cout << "\nfloatnum (float not initialized) = " << floatnum; 20: cout << "\ndfloatnum (double not initialized)= " << dfloatnum; 21: // Print out initialized variable 22: 23: cout << "\n ch (char data type) = " << ch 24: << "\n i (integer type) = " << i 25: << "\n height (float type) = " << height 26: << "\n charge (double type) = " << charge

Page 30: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

27: << endl; 28: 29: return 0; 30: } ผลลัพธการรันโปรแกรม 1.5 จะเปนดังนี้ character (char Not initialized) = integer ( int not initialized) = 256 floatnum (float not initialized) = 1.4013e-45 dfloatnum (double not initialized)= 2.01678e-307 ch (char data type) = A i (integer type) = 2 height (float type) = 1.8 charge (double type) = 1.6e-19 กอนนําตัวแปรไปใชงานจะตองกําหนดคาเร่ิมตนใหกอนเสมอ เพราะคอมไพเลอรจะไมเตือนเร่ืองการ

กําหนดคาเบื้องตนใหทราบ ส่ิงที่โปรแกรมนํามาแสดงคือ ขอมูลขยะ ผูเขียนโปรแกรมจะตองเปนฝายรับผิดชอบ

และรอบคอบในการกําหนดคาเร่ิมตนใหกับตัวแปรเอง

การแปลงชนิดขอมูล (Type Casting)

เม่ือกําหนดคาใหแกตัวแปรซึ่งเปนชนิดขอมูลตางกัน เชน กําหนดตัวแปรไวเปนจํานวนเต็ม เชน

int i;

i= 3.14;

ตัวแปร i จะเก็บคาไวเพียง i = 3; เพราะ i เปนตัวแปรแบบจํานวนเต็ม จะไมเก็บคาทศนิยม

จากตัวอยางโปรแกรม 1.1 เรากําหนดขอมูล width และ length เปน float แตเม่ือปอนจํานวนเต็ม

เชน width=20 length = 15 ตัวแปรชนิด float สามารถรับจํานวนเต็มได โดย C++ จะแปลงจํานวนเต็มใหเปน

จํานวนจริง คาที่เก็บไวใน width และ length จึงเปน 20.0 และ 15.0 ตามลําดับ

เม่ือกําหนดคาขอมูลที่มีชนิดตํ่ากวา ใหแกตัวแปรที่มีขอมูลชนิดสูงกวา ไมจําเปนตองใส type cast

operator ดังตัวอยางโปรแกรมที่ 1.6 เปนการแปลงชอมูลชนิด char ใหเปน short ใหเปน int ใหเปน long ไป

เร่ือย ๆ จนถึง double 1: //Program 1.6 TestCast.cpp 2: // Test order of variables 3: // 4: #include <iostream.h> 5: main () { 6: char ch = 'a'; cout << "\n ch (char type) = " << ch ; 7: short sh = ch; cout << "\n sh (short type) = " << sh; 8: int i = sh; cout << "\n i (int type) = " << i; 9: long n = i; cout << "\n n (long type) = " << n; 10: float f = n; cout << "\n f (float type) = " << f; 11: double df = f; cout << "\n df (double type) = " << df; 12: return 0; 13: }

Page 31: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ผลลัพธจากการกําหนดคา ch ซึ่งเปนตัวแปรชนิด char ใหมีคาเปน “a” ซึ่งมีคารหัสอัสกีเทากับ 97 เม่ือ

กําหนดคานี้ใหกับขอมูลที่มีชนิดสูงกวา พบวาขอมูลที่เก็บไมมีความคลาดเคล่ือน ผลของการทํางานของ

โปรแกรม 1.6 จะเปนดังน้ี

ch (char type) = a sh (short type) = 97 i (int type) = 97 n (long type) = 97 f (float type) = 97 df (double type) = 97

ถาการคํานวณทางคณิตศาสตรเก่ียวของกับขอมูลตางชนิดกัน ผลลัพธที่ไดอาจเกิดความคลาดเคลื่อน ตวัอยางเชน int i=12, j=4, k=3; int m; m = i*(j/k); คาของที่คาํนวณไดคือ 12 ไมใช 16 เพราะ j/k = 4/3 = 1 (เก็บเฉพาะจํานวนเต็ม ตัดเลขทศนิยมทิ้ง ) ผลลัพธจึงได 12 เราสามารถใชคาํสั่ง ทีมี่รูปแบบ ดังน้ี type(value) เม่ือ type คือชนิดของขอมูลที่ตองการ value คือขอมูลของอีกชนิดหน่ึงซึ่งตองการเก็บคาไว เชน x = 6.3124; ตองการเก็บคาไวในตัวแปร i ซึ่งเปนขอมูลชนิดจํานวนเตม็ สามารถเขียนไดเปน i = int (x); หรือ i = (int) x ตัวอยางผลลัพธที่เกิดจากการแปลงชนิดขอมูล int (4.5) = 4 float (2) = 2.0 float (3/2)= 1.0 float(3)/float(2) = 1.5 1: //Program 1.7 TestCas2.cpp 2: // Test order of variables 3: // 4: #include <iostream.h> 5: main () { 6: double x = 6.3214; 7: int m,n; 8: m = 6.3214; 9: n = int(x); // or n = (int) x 10: cout << "m = " << m << endl; 11: cout << "n = " << n << endl; 12: } ผลลัพธจากการรันโปรแกรม จะเห็นวา ถึงแมจะใชคําส่ัง casting ขอมูลในบรรทัดที่ 9 ผลลัพธที่ไดมีคาเทากับ

กําหนดคาโดยตรง m = 6 n = 6 เม่ือนําขอมุลชนิดสูงกวา เชน double ไปเก็บไวในขอมูลชนิดตํ่ากวา เชน integer ดังในตัวอยาง 1.7 พบวาเลข

ทศนิยมจะถูกตัดทิ้ง (truncate) ไมมีการปดเศษ

Page 32: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

เคร่ืองหมาย หรือตัวปฏิบัติการ (Operator)

จะเปนตัวบอกกับโปรแกรมวาจะใหจัดการกับขอมูลทั้งนั้นอยางไร เชน นําขอมูลมาคํานวณ นํามา

ตรวจสอบวาขอมูลทั้งสองชุดเทากันหรือไม หรือสลับคาขอมูลในตัวแปร

ในโปรแกรม 1.1 เราไดพบกับเครื่องหมาย = หมายถึงการกําหนดคาใหกับตัวแปร และ width * length

เคร่ืองหมาย * หมายถึงนําตัวแปรท้ังสองมาคูณกัน

ในภาษา C++ มีเคร่ืองหมายใหใชเปนจํานวนมาก สามารถจําแนกเคร่ืองหมายที่ใชบอย ๆ ใหเปน

หมวดหมูดังนี้

สัญลักษณ ความหมาย ตัวอยาง หมายเหตุ

+ หรือ - บอกวาเปนจํานวนบวกหรือลบ +x,+3,+5.2, -x, -3, -5.2 เปน unary operator

+ การบวก (Addition) z = x + y

- การลบ (Subtraction) z = x – y

* การคูณ (multiplication) z = x*y

/ การหาร (division) z = x/y

% การหารเก็บเศษ (modulus) z= x%y

5 %2 จะไดผลลัพธ 1

เก็บเฉพาะเศษไว

ไมสามารถใชกับเลข

ทศนิยมได

ภาษา C++ มีเคร่ืองหมายที่เก่ียวของกับการคํานวณและใชบอย ไดแก

++ หมายถึงการเพิ่มคาคร้ังละ 1 เชน x++ หมายถึง x = x +1 (เพิ่มคาขอมูลในตัวแปร x อีก 1

จากนั้นนําคาที่ไดไปเก็บไวในตัวแปร x เชนเดิม

- - หมายถึงการลดคาคร้ังละ 1 เชน x- - หมายถึง x = x -1 (ลดคาขอมูลในตัวแปร x อีก 1 จากนั้นนํา

คาที่ไดไปเก็บไวในตัวแปร x

นิพจนทางคณิตศาสตร (Arithmetic expression) เราสามารถนําตัวแปร เคร่ืองหมายทางคณิตศาสตร คาคงท่ี มาเรียบเรียงเปนนิพจนเพื่อนําไปใชในการ

คํานวณได ส่ิงที่ตองพึงระวังเปนอยางย่ิงในการเขียนขอความทางคณิตศาสตร คือ ตองรูลําดับการทํางานของ

เคร่ืองหมาย มิฉะนั้นจะไดผลการคํานวณออกมาคลาดเคล่ือน โดยที่คอมไพเลอรไมแสดงขอความเตือนหรือแจง

ขอผิดพลาดใหทราบ เชน

X = 5 + 2*3

จะไดคา x เทากับ 11 ไมใช 21 เพราะการคูณมีลําดับการทํางานกอนเคร่ืองหมายบวก เพื่อใหดูเขาใจ

งาย ควรเขียนเปน

X = 5 + (2*3)

ลําดับการทํางานกอนหลังของเคร่ืองหมายทางคณิตศาสตรเปนไปดังตารางตอไปนี้ เคร่ืองหมายที่อยู

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

Page 33: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

เร่ิมกระทําจาซายไปขวา หรือจากขวาไปซายตามที่กําหนดไวในตาราง การคูณจะเร่ิมคํานวณจากทางซายไป

ขวามือ x*y*z หมายถึง (x*y)*z ไมใช x*(y*z)

ลําดับ เคร่ืองหมายหรือตัวปฏิบัติการ (operator) เร่ิมประมวลผลจาก(Associativity)

1 ( ) parentheses เร่ิมกระทําจากวงเล็บในสุด

2 + , -, ++, - - , cast unary operator ขวาไปซาย

3 *, /, % การคูณ การหาร

และการหารเก็บ

เศษ

ซายไปขวา

4 +, - การบวก การลบ ซายไปขวา

5 =, +=, -=, *=, /=, %= assignment ขวาไปซาย

ตัวอยางการเขียนนิพจนทางคณิตศาสตร

ก. พื้นที่ส่ีเหล่ียมคางหมู = ½ x สูง x ผลบวกของดานคูขนาน

Area = 0.5 * h * (a + b);

ข. ระยะกระจัดของกอนหินที่ตกลงมาอยางอิสระภายใตสนามโนมถวงของโลก ดวยความเร็วตน u ที่เวลา t

ใด ๆ คือ 2

21 gtuty += เม่ือ g คือความเรงเนื่องจากแรงดึงดูดของโลก

y= u* t + 0.5 * g * t* t;

ค. แรงไฟฟาเน่ืองจากจุดประจุขนาด q1 และ q2 วางหางกันเปนระยะ r ใด ๆ หาไดจาก

221

rqkqF = เม่ือ k คือคาคงท่ี

เขียนเปนนิพจนทางคณิตศาสตรในภาษา C++ ไดดังนี้

F = k*q1 * q2/(r*r);

โปรแกรมที่ 1.8 จะเปนการตรวจสอบลําดับการคํานวณของเครื่องหมายและตัวปฏิบัติการ 1: //Program 1.8 Testprecedence.cpp 2: // 3: // 4: #include <iostream.h> 5: main () { 6: int i=12, j=4, k=3; 7: cout << "\n i + j * k = " << i+j*k; 8: cout << "\n i*j + k = " << i*j +k;

a

b

h

Page 34: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

9: cout << "\n i * j / k = " << i*j/k; 10: cout << "\n i* (j + k) = " << i*(j /k); 11: return 0; 12: 13: }

คําตอบ ในบรรทัดที่ 10 ไมตรงกับที่คาดคะเนไวเพราะวา เรากําหนดตัวแปร i, j, k เปนชนิดจํานวนเต็ม เม่ือนํา j/k

= 4/3 = 1 สวนที่เปนทศนิยมจะถูกตัดทิ้งไป ทําใหผลลัพธในบรรทัดที่ 9 และ 10 ไมเทากัน

กําหนดให x เปนตัวแปรชนิดจํานวนเต็ม จงหาผลลัพธของนิพจนตอไปนี้

x=8*10-9%4*3+9 = 80 – (9%4)*3 + 9

= 80 – 2*3 + 9

= 80 – 6 + 9

= 83

x=(8*(10-9)%4)*3+9 = (8*1%4)*3+9

= (0)*3 + 9

= 9

x=(8+9)%5/2 = 17%5/2

= 2/2

= 1

x=-6*8/-5 = -48%-3

= 0

เราสามารถเขียนการกําหนดคาทางคณิตศาสตรใหส้ันลงกวาเดิมได

ขอความเต็ม ขอความยอ

identifier = identifier operator expression; identifier operator=identifier;

y = y+1; y++; หรือ y +=1;

y = y-1; y--; หรือ y -=1;

z=z-2; z-=2;

d=d/4.5; d/=4.5;

r=r%3; r%=3;

ตัวอยางอื่น ๆ

x=x+1;

z= x+y;

นิพจนทางคณิตศาสตร 2 บรรทัดนี้ เขียนใหรวบรัดอยูในบรรทัดเดียวกันไดดังนี้

z= x++ +y;

การเขียนนิพจน x++ หรือ x—เชนนี้เรียกวาเขียนแบบตอทาย (postfix) หมายถึงคา x ถูกนําไปใชในการคํานวณ

กอนแลวจึงมีการเพิ่มคาหรือลดคา

Page 35: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ถาเขียนแบบนําหนา(prefix) ++x หรือ –x หมายถึงมีการเพิ่มคาหรือลดคากอน แลวจึงนําคา x ไปคํานวณ

ตัวอยาง

Int i=4; j=2;

I= i*j++; จะได i=8 และ j =3 นํา j ไปคูณกับ i กอน แลวจึงเพิ่มคา j

Int i=4; j=2;

I= i*++j; จะได i=12และ j =3 เพิ่มคา j กอน แลวจึงนํา j ไปคูณกับ i

Int i=4; j=2;

I= i*j--; จะได i=8 j =2

Int i=4; j=2;

I= i*--j; จะได i=4 j =2

แบบฝกหัด

จงตรวจสอบดูวานิพจนตอไปนี้ถูกตองตามหลักของภาษา C++ หรือไม ถาถูกตองใหหาผลลัพธ

ก. 24/8*3; เฉลย 9

ข. 24/8/3; เฉลย 3

ค. 32%3*2 ; เฉลย 4

ง. 6(8+4); ไมถูกตอง ตองมีเคร่ืองหมาย * หลังเลข 6

จ. 18%5%2 เฉลย 1

ฉ. 18%(5%2) เฉลย 0

จงเขียนคําส่ังตอไปนี้ใหจบในบรรทัดเดียว

ก. price=price+1;

sum = sum + price;

(เฉลย sum += +price;)

ข. a= a-(b+c);

c = c+1;

(เฉลย a -= (b+c++); )

กําหนดให int x=2, y=3; ในแตละขอ เม่ือโปรแกรมทําคําส่ังแตละบรรทัดจะไดคา x, y เทาใด

ก. y +=--x; เฉลย x= 1, y=4

ข. y *=x++; เฉลย x= 3, y=6

กําหนดให int x=2, y = 4; ในแตละนิพจนคา z (ซึ่งเปนตัวแปรชนิด int เชนกัน) จะมีคาเทาใด

ก. z = ++x*y; เฉลย z = 12

Page 36: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ข. z= x++*y; เฉลย z = 8

จงเขียนนิพจนคณิตศาสตรตอไปนี้ใหอยูในรูปประโยคคําส่ังของภาษา C++

ก. x3 -2x2 + 5x + 7

ข. 11

3

2

+−

xx

ค. ความเรงของระบบมวล m1 และ m2 คลองกับเชือกเบาและรอกไมมีความฝดมีคาเปน

gmm

mma21

21

+=

ง. สมการสถานะแกสของแวน เดอร วาลส (Van der Waals) มีรูปสมการเปน

RT = ))(( 2 bnV

VaP −−

เม่ือ T คืออุณหภูมิสมบูรณ

P คือความดันของแกส

n คือจํานวนโมลของแกส

a,b คือคาคงท่ี

R คือคาคงท่ีสากลของแกส

V คือปริมาตรของแกส

จ. ความเร็วของทรงกระบอกมวล m รัศมี r ที่กล้ิงลงมาถึงปลายพ้ืนเอียงสูง h หาไดจาก

V = )1(

2

2mrI

gh

+

เม่ือ I คือโมเมนตความเฉ่ือยของทรงกระบอก

จงเขียนโปรแกรมตอไปนี้

1. ระยะทางระหวางกรุงเทพฯ ถึงเชียงราย เทากับ 838 กิโลเมตร จงแปลงระยะทางนี้ใหเปนไมล โดยที่ 1

ไมล เทากับ 1.6093440 กิโลเมตร

2. แปลงน้ําหนักนักมวย 110 ปอนด ใหเปนกิโลกรัม 1 กิโลกรัม เทากับ 2.205 ปอนด

3. แปลงอุณหภูมิ 30 องศาเซลเซียส ใหเปนอุณหภูมิฟาเรนไฮต (Fahrenheit) โดยใชสูตร

9

325

−=

FC

4. หาพื้นที่ของเซกเตอรของวงกลม ซึ่งมีมุมระหวางรัศมี(d, degree) 30 องศา รัศมี (r) ยาว 2 เมตร พื้นที่

ของเซกเตอรคือ θ221 r เม่ือ θ คือมุมที่วัดเปนเรเดียน

5. จงหาปริมาตร(V, volume)และพ้ืนที่ผิว(A, Surface area) ของทรงกลมที่มีรัศมี 15 เซนติเมตร

m1

m2

Page 37: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

คําถาม ถากําหนดคา unsigned int num = -1; การคอมไพลจะเปนอยางไร

คําตอบ คอมไพเลอรจะเตือน คา -1 จะถูกตีความเปนตัวเลขท่ีไมคิดเคร่ืองหมาย -1 = 0xff ในเลขฐานสิบหก

หรือ 65535 ของเลขฐานสิบ

คําถาม ถากําหนดคา int number = 6.3;

คําตอบ คอมไพเลอรจะแจงเตือนเชนเดียวกัน ตัวเลขที่เก็บไวจะถูกตัดใหเหลือเฉพาะจํานวนเต็มคือ 6

จงต้ังช่ือตัวแปรและเลือกชนิดของขอมูลใหเหมาะสมกับคาของขอมูลที่จะเก็บ

ก. พื้นที่สนามฟุตบอล

ข. อายุของนักศึกษา

ค. รายไดตอหัวของประชากรไทย

ง. จํานวนสุนัขจรจัด ในกรุงเทพ ฯ

ประโยคตอไปนี้ใช comment ถูกหรือไม

cout << “First try in C++ // my first time in C++”;

โปรแกรมตอไปน้ีคอมไพลผานหรือไม

main() {

2000; // y2k year

return 0;

}

ในแตละขอตอไปนี้ เปนการประกาศตัวแปรที่ผิดหรือไม ถาผิด แกไขใหถูกตอง

ก. int old = 60; new =20;

ข. int a = b= 5;

ค. double float c;

โปรแกรมตอไปน้ีคอมไพลผานหรอืไม

main() {

c =35;

cout << c << endl;

}

Page 38: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

การรับขอมูลทางแปนพิมพ (Keyboard) เม่ือตองการกําหนดคาตัวแปรใด โดยวิธีปอนขอมูลผานแปนพิมพ ภาษา C++ มีคําส่ัง cin (console

input –อานวา ซี-อิน) รับขอมูลจากแปนพิมพ นําไปเก็บไวในตัวแปรที่ตองการ รูปแบบคําส่ังทั่วไปมีดังนี้

cin >> ชื่อตัวแปร1 >> ชื่อตัวแปร 2 >> …..;

เคร่ืองหมาย >> เรียกวา input operator ระวังอยาสับสนกับ << ของ cout

จากโปรแกรม 1.1 ถาตองการรับคาความกวางและความยาวของส่ีเหล่ียมผืนผาทางแปนพิมพ ใชคําส่ัง cin

โปรแกรมจะเปล่ียนไปดังนี้

1: /* ==================================== 2: Program 1.9: FindArea2.cpp 3: Find rectangular area at command prompt 4: Author: Wachara R. 5: Date: 03 Oct 2003 6: Last Update: - 7: ------------------------------------- */ 8: #include <iostream.h> 9: #include <math.h> 10: int main() { 11: float width, length, area; 12: 13: cout << "Input width and length : "; 14: cin >> width >> length; 15: //Compute area of rectangle. 16: area = width*length; 17: //Print area on standard output 18: cout << " Area of this rectangle = " 19: << area << " sqr.meter" << endl; 20: 21: // exit program 22: return 0; 23: } 24: // ============================================ เม่ือใหโปรแกรมทํางาน โปรแกรมจะหยุดใหปอนคา ความกวาง ความยาว ใหเราปอนตัวเลข 2 จํานวน แยกจาก

กันโดยใชเวนวรรค (เคาะแปน spacebar)

Input width and length : 22.5 30.2 (กด enter)

เม่ือกด enter จะปรากฏผลลัพธบนจอภาพ

Area of rectangle = 679.5 sqr.meter.

Page 39: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

บทที่ 2

การควบคุมลําดับคําส่ัง (Control Structure)

ภาษา C++ มีการควบคุมลําดับคําส่ังของโปรแกรมเชนเดียวกับภาษาคอมพิวเตอรอื่น ๆ มีการควบคุม

โดยใชเงื่อนไข (if, else) การวนรอบ (for, while, do while) หรือเลือกทําคําส่ังจากชุดคําส่ังหลาย ๆ ชุด (switch)

การควบคุมชุดคําส่ังโดยใชเงื่อนไข (if)

ประโยค if ใชในการควบคุมการทํางานของโปรแกรม ใหเปนไปตามเงื่อนไขที่กําหนดไว

รูปแบบการใช if แบบที่ 1

If (conditional_expression) {

ชุดคําส่ังที่ 1;

}

ชุดคําส่ังที่ 2 ;

ถาประโยคเง่ือนไข conditional_expression เปนจริง

คําส่ังชุดที่ 1 ภายในวงเล็บปกกาจะทํางาน แลวจึงออกจาก

วงเล็บมาทําคําส่ังชุดที่ 2 ถา conditional_expression เปน

เท็จ โปรแกรมจะขามมาทําชุดคําส่ังที่ 2

รูปแบบการใช if แบบที่ 2

If (conditional_expression) {

ชุดคําส่ังที่ 1;

} else {

ชุดคําส่ังที่ 2 ;

}

ชุดคําส่ังที่ 3;

ถาประโยคเง่ือนไข conditional_expression เปน

จริง โปรแกรมจะทํา คําส่ังชุดที่ 1 ภายในวงเล็บปกกาจากนั้น

จะกระโดดขามมาทําชุดคําส่ังที่ 3 ถา

conditional_expression เปนเท็จ โปรแกรมจะทําชุดคําส่ังที่ 2 แลวตอดวยชุดคําส่ังที่ 3

รูปแบบการใช if แบบที่ 3

If (conditional_expression1) {

ชุดคําส่ังที่ 1;

Page 40: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

} else if{ conditional_expression2) {

ชุดคําส่ังที่ 2 ;

} else {

ชุดคําส่ังที่ 3;

}

ชุดคําส่ังที่ 4;

ถาประโยคเง่ือนไข conditional_expression1 เปนจริง ชุดคําส่ังที่ 1 จะทํางานแลวขามมาทําชุดคําส่ัง

ที่ 4 ถา conditional_expression1 เปนเท็จ โปรแกรมจะตรวจสอบประโยคเงื่อนไขที่ 2

conditional_expression 2 ถาเปนจริงชุดคําส่ังที่ 2 จะถูกประมวลผล แลวขามไปทําชุดคําส่ังที่ 4 ถา

conditional_expression 2 เปนเท็จ ชุดคําส่ังที่ 3 จะทํางานแลวตอดวยชุดคําส่ังที่ 4

กรณีที่มี if ..else ซอนกันหลาย ๆ ชั้น การใสวงเล็บปกกาจะชวยใหทราบวา if กับ else ตัวไหนจับคู

กัน เชน

If ( expression1) {

คําส่ังที่ 1;

If (expression 2) คําส่ังที่ 2;

} else

คําส่ังที่ 3;

แสดงวา else จับคูกับ if ของบรรทัดแรก ถาไมใสวงเล็บปกกา else จะจับคูกับ if ของบรรทัดที่ 2

โดยทั่วไป else จะจับคูกับ if ที่อยูติดกันเสมอ

การใช if ในรูปแบบที่ 3 ซึ่งเปนการใช if ซอน if เรียกแบบน้ีวา nested if statement ในภาษา C++

สามารถใช if ซอน if ไดไมมีขีดจํากัด ในทางปฏิบัติการใช if ซอนกันหลายชั้น ทําใหเกิดการสับสนในการ

ตรวจสอบการทํางานของโปรแกรม 1: //Program 2.1 Calculating the square root of positive number 2: // Program will display some message if you input negative number. 3: #include <iostream.h> 4: #include <math.h> 5: int main() { 6: int x; 7: cout << "Finding square root of an integer\n" << endl; 8: cout << " ===============================\n" << endl; 9: cout << "Enter an integer :"; 10: cin >> x; 11: if ( x < 0) 12: cout << "Don't input negative number" << endl; 13: else 14: cout << "The square root of "<< x << " is " <<sqrt(x) << endl; 15: 16: cout << "program terminated normally " << endl; 17: return 0; 18: } 19:

Page 41: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

เม่ือใหโปรแกรม 2.1 ทํางาน เม่ือปอนคา -4 คําส่ังตรวจเงื่อนไข if พบวา x มีคานอยกวาศูนย เงื่อนไข

เปนจริง คําส่ังในบรรทัดที่ 12 จะแสดงผลบนจอภาพวา Don’t input negative number แลวขามมาทําบรรทัดที่

16 แสดงผล Program terminated normally และจบการทํางาน

เม่ือใหโปรแกรมทํางานอีกคร้ัง ทดลองปอน +4 คําส่ัง if จะตรวจสอบพบวา x มีคามากกวาศูนย

เงื่อนไขเปนเท็จ โปรแกรมจะทําคําส่ังตามหลัง else (บรรทัดที่ 14) หาคารากท่ีสองของ x แลวแสดงผลบน

จอภาพเปน 2 ( 24 ±= )

ทดลองใหโปรแกรมทํางานอีกคร้ัง แลวปอนคา x ที่เปนเลขทศนิยม เชน 4.3 แลวสังเกตผลลัพธที่ได

หรืออาจปอนคาจํานวนเต็ม เชน 5 รากที่สองที่ไดจะแสดงผลเปนจํานวนเต็มหรือไม

ขอสังเกต ถาประโยคคําส่ังที่ตามหลัง if หรือ else มีเพียงคําส่ังเดียว ไมจําเปนตองใสเคร่ืองหมาย

วงเล็บปกกาปดลอมคําส่ัง แตการใสเคร่ืองหมายวงเล็บปกกาจะทําใหงายตอการตรวจสอบ

If (x < 0 ) {

cout << “don’t input negative number \n”;

} else {

cout << “ Yes, positive number \n “;

}

If (x < 0 )

cout << “don’t input negative number \n”;

else

cout << “ Yes, positive number \n “;

โปรแกรม 2.2 เปนการหาคาฟงกชัน 4

42 −

=x

y เม่ือปอนคา x ใด ๆ โปรแกรมจะคํานวณหาคา y พรอม

แสดงผลที่จอภาพ เม่ือปอนคา x =2 หรือ x = -2 โปรแกรมจะแจงเตือนวาไมสามารถหาคา ได เพราะคา x

ดังกลาว ทําใหเกิดกรณีการหารดวยศูนย 1: //Program Calculate y = 4/(x^2 -4) 2: // Program will stop if x = +2 or x = -2 3: #include <iostream.h> 4: int main() { 5: double x, y; 6: cout << "Enter a number: " ; 7: cin >> x; 8: if ( x == 2 || x == -2) 9: cout << "Zero Division, stop calculating" << endl; 10: else { 11: y = 4/(x*x-4); 12: cout << "When x = " << x << "y = 4/(x^2 -4) = " << y << endl; 13: } 14: cout << "program ended normally " << endl; 15: return 0; 16: }

ผลการรันโปรแกรมจะเปนดังรูป

Page 42: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

นิพจนเงื่อนไข (Conditional expression)

นิพจนเงื่อนไขที่ตามหลัง if (หรือ while หรือ do while หรือ for) ตองใหคาเปน “จริง” หรือ “เท็จ”

ขอความในนิพจนอาจจะอยูในรูปแสดงความสัมพันธกัน เชน เทากับ มากกวา นอยกวา หรืออยูในรูปของตรรกะ

เคร่ืองหมายที่ใชแสดงความสัมพันธ (relation operator) เพื่อเปรียบเทียบระหวางนิพจน 2 นิพจนมี

ดังนี้

สัญลักษณ ความหมาย ตัวอยาง

== เทากับ if ( x == 5) { … }

!= ไมเทากับ if (x != 5) {…}

< นอยกวา if ( x < 5) { … }

> มากกวา If (x > 5) { … }

<= นอยกวาหรือเทากับ if ( x <=5) { … }

>= มากกวาหรือเทากับ if ( x >=5) { … }

เคร่ืองหมายเชิงตรรกะ (logical operator) มีดังนี้

สัญลักษณ ความหมาย ตัวอยาง

&& และ (and) A && B

|| หรือ (or) A || B

! คาความจริงที่ตรงขาม (not) !A

A && B , A || B และ !A จะมีคาเปนจริงหรือเท็จ ใหดูจากตารางคาความจริงดังตอไปนี้ F หมายถึง false

T หมายถึง true

A B A && B

F F F

F T F

T F F

T T T

A !A

F T

T F

A B A || B

F F F

F T T

T F T

T T T

Page 43: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ลําดับความสําคัญ(Precedence)ของเครื่องหมายแสดงความสัมพันธและเครื่องหมายตรรกะจะตํ่ากวา

เคร่ืองหมายทางคณิตศาสตร แตจะสูงกวาเคร่ืองหมายกําหนดคา ดังตารางตอไปนี้

ลําดับความสําคัญ เคร่ืองหมาย ลักษณะการกระทําเร่ิมจาก

1 ( ) เร่ิมจากวงเล็บในสุด

2 + - ++ -- cast ! (unary operator) ขวาไปซาย

3 * / % ซายไปขวา

4 + - ซายไปขวา

5 < <= > >= ซายไปขวา

6 == != ซายไปขวา

7 && ซายไปขวา

8 || ซายไปขวา

9 = += -= *= /= %= ขวาไปซาย ตัวอยางประโยคเง่ือนไข ให a = 3, b=2 , c= -1 ประโยคเงื่อนไขของแตละขอตอไปนี้ จะใหคาจริงหรือเท็จ

ก. a < b + c ประโยคน้ีเปนเท็จ เพราะ 3 < 1 ไมเปนจริง

ข. a + c >= b ประโยคน้ีเปนจริง เพราะ 2 เทากับ 2

ค. –c < c+10 ประโยคน้ีเปนจริง เพราะ -1 < 9

ง. a < 6 && a > 1 ประโยคน้ีเปนจริง เพราะ 3 < 6 และ 3 > 1

จ. a == b-c ประโยคน้ีเปนจริง เพราะ 3 เทากับ 2-(-1)

ฉ. a == b || b==c ประโยคน้ีเปนเท็จ เพราะ 3 == 2 หรือ 2 == -1

ขอผิดพลาดที่พบบอยในการใชประโยคเงื่อนไข

ผูเร่ิมตนเขียนโปแกรมภาษา C++ มักจะตกหลุมพรางตอไปนี้เสมอ ประโยคเงื่อนไขตอไปนี้ถูกหลัก

ไวยากรณของ C++ และเม่ือคอมไพลก็จะไมแจงขอความเตือนหรือผิดพลาด แตผลลัพธของการทํางานของ

โปรแกรมไมตรงกับจุดประสงคที่ตองการ

1. สับสนเคร่ืองหมาย = (การกําหนดคา) กับเคร่ืองหมาย == ( เทากับ)

ถาตองการตรวจสอบวา i มีคาเทากับ 10 หรือไม ประโยคท่ีถูกคือ

If ( i == 10 ) cout << “i equals 10 \n”; // test exactly equality

แตถาเขียนแบบนี้ If ( i = 10 ) cout << “i equals 10 \n”; // test of the value assigned to i (zero or nonzero)

จะเปนการตรวจสอบวามีการนําคาคงท่ี (ในที่นี้คือ 10) ใสไวในตัวแปร i หรือไม ประโยคน้ีจะไดเงื่อนไข

เปนจริงเสมอ เพราะ i ไมเทากับศูนย

2. ประโยคทางคณิตศาสตร bxa ≤≤ หมายถึง x มีคามากกวาหรือเทากับ a แตมีคานอยกวาหรือ

เทากับ b เม่ือเขียนในโปรแกรมมักจะเขียนเปน

if ( a <= x <= b) cout << “ value of x = “ << x;

Page 44: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ถากําหนดคาให a = 2 b= 5 และ x = 6 ประโยคเง่ือนไขนี้จะไดคาที่ถูกตองคือ เท็จ แตในการหาคาจริงเท็จของ

ประโยคน้ีจะเร่ิมจากซายไปขวา เร่ิมตนดวยเปรียบเทียบ a กับ x ( a <= x) จะไดคาเปนจริงคือ 1 แลวนํา 1 นี้ไป

เปรียบเทียบกับ b ( 1 <= 5) คาที่ไดจะเปนจริงคือ 1

3. เปรียบเทียบโดยใชเคร่ืองหมาย == หรือ != กับตัวแปรที่มีชนิดขอมูลเปน float หรือ double ในทาง

ทฤษฎีเปนไปไดที่จํานวนจริง 2 จํานวนมีคาเทากัน แตการเก็บเลขจํานวนจริงของคอมพิวเตอร ความเที่ยงตรง

(precision)ของจํานวนเลข จะถูกจํากัดดวยขนาดของหนวยความจําที่ใชเก็บ เลขจํานวนจริงจึงถูกปดเศษ ทําให

เกิดความคลาดเคล่ือนไปจากคาจริง ไมตรงกับที่เราตองการ

การแปรียบเทียบควรตรวจสอบกับคาความแมนยําที่ยอมรับไดมากกวา เชนตองการใหคาที่ได

ผิดพลาดไดไมเกิน 10-6 ควรเปรียบเทียบดังนี้ If (fab(x-y) < 1.0e-6) cout << “ x = y”;

ไมควรใช If ( x == y) cout << “ x = y”;

ลองดูตัวอยางตอไปนี้ { float x,y;

x = 0.123456780;

y=0.123456785;

if ( x == y )

cout << “ x equals to y”;

else

cout << “ x not equals to y “

:

:

}

พบวา จะไดเงื่อนไขเปนจริง เนื่องจาก x และ y เปนตัวแปรชนิด float ซึ่งขาดความเที่ยงตรงของทศนิยมตําแหนง

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

ประโยคน้ีไปคอมไพลบนเคร่ืองที่กําหนดใหตัวแปรชนิด float เปนแบบ 32 บิต เงื่อนไขนี้จะใหคาจริงเชนกัน

4. ประโยคเงื่อนไขจะมีคาเปนจริง(true) เม่ือคาที่ไดไมเปนศูนย นั่นหมายถึงจํานวนลบก็จะทําใหไดคา

จริงเชนกัน การสรางประโยคเงื่อนไขควรใหคาที่ไดออกมาเปนไปไดเพียงคาเดียว คือควรตรวจสอบกรณีเปนศูนย

จะดีกวา เพราะจะลดความเส่ียงของคาตาง ๆ ที่อาจเกิดขึ้นไดอยางคาดไมถึง คาตาง ๆ ตอไปนี้ทําใหประโยค

เงื่อนไขใหคาเปนเท็จเสมอ

ชนิดขอมูล false value

char ‘\0’

short 0

int 0

long 0L

float 0.0

double 0.0

Page 45: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

pointer null or 0

คําส่ังยอสําหรับเงื่อนไข if … else

เราสามารถใชเคร่ืองหมาย ? : เขียนประโยคคําส่ัง if… else ใหดูกะทัดรัด โดยมีรูปแบบทั่วไปดังนี้ expression1 ? expression2 : expression3;

มีความหมายเหมือนกับ

If ( expression1)

expression2;

else

expression3;

ตัวอยาง เปรียบเทียบเลข 2 จํานวน แลวพิมพเลขที่มีคามาก

if ( a > b)

cout << a;

else

cout << b;

(a > b) ? cout << a : cout << b;

ตัวอยาง ถา x มากกวาหรือเทากับ 0 ให z = x+2 ถานอยกวา 0 ให z = x2

ตัวอยาง ตัวแปรที่ชื่อ bit_val ตองการพิมพคาบิตที่ 0 (บิตสุดทายทางขวามือ) ใหเปนเลขฐานสองคือ 0 หรือ 1 ทํา

ไดดังนี ้

การวนรอบโดยใช while และ do… while

การวนรอบโดยใชคําส่ัง while หรือ do .. while เปนการ

กระทําซํ้าชุดคําส่ังที่อยูในประโยค while ตราบเทาที่ประโยคเงื่อนไข

หลัง while มีคาเปนจริง (หรือไมเปนศูนย) มีรูปแบบทั่วไปดังนี้

while (conditional_expression) {

Statements1;

}

statements2;

if ( x >= 0)

z = x+2;

else

z= x*x;

z = (x >= 0) ? x+2 :x*x;

if (( bit_val & 1)== 0)

cout << ‘0’;

else

cout << ‘1’;

cout << (bit_val & 1) ? ‘0’ : ‘1’;

หรือ

cout << (char)(‘0’ + (bit_val & 1));

หมายเหตุ char เปน casting operator

Page 46: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

do {

statements1;

} while (conditional_expression);

statements2;

การทํางานของวงรอบ while จะตรวจสอบประโยค

เงื่อนไข (conditional_expression) กอน ถาเปนจริง

ชุดคําส่ัง statements1 จะทํางาน ถาประโยคเงื่อนไขมีคา

เปนเท็จ จะกระโดดขามมาทํา statements2 ทันที นั่นคือถา

เร่ิมตนการทํางาน ประโยคเงื่อนไขเปนเท็จ statements1

จะไมมีการทํางานเลย

สวนการทํางานของ do .. while loop statements1 จะถูกประมวลผลในการวนรอบคร้ังแรกเสมอ นั่น

คือ statements1 ใน do .. while จะทํางานอยางนอยหนึ่งคร้ัง

ตัวอยาง ตองการหาคาเฉล่ียของเลขชุดหนึ่ง โดยการปอนตัวเลขผานแปนพิมพ เม่ือปอนครบเสร็จแลวใหปอน

-99 โปรแกรมจะคํานวณหาคาเฉล่ียใหทันที 1: // Program: FindAverage.cpp 2: //Loop reading real number from keyboard until finding the end of file (Ctr+z) 3: // then calculate the average value of those numbers. 4: #include <iostream> 5: using namespace std; 6: int main(void) { 7: int n=0; 8: float x, // number of values read 9: sum =0.0f, //sum of values start with zero 10: average; // average value of numbers 11: 12: cout << "Input a series of real numbers :"; 13: while (cin >> x) { 14: n++; 15: sum = sum + x; 16: } 17: average = sum / n; 18: cout << "Number of data = " << n << " average = " << average << endl; 19: return 0; 20: }

ใน BCC5.5 ไมสามารถใช Ctr + z ได ตองพิมพ /0 เปนขอมูลสุดทาย โปรแกรมจึงจะหาคาเฉล่ียให

การวนรอบโดยใชคําส่ัง for

ภาษาคอมพิวเตอรอื่น ๆ จะใชคําส่ัง for ในการวนรอบเม่ือรูจํานวนรอบที่จะวน แต for ในภาษา C++ มี

ความยืดหยุนมากกวานั้น สามารถตรวจสอบประโยคเง่ือนไขได เหมือนกับคําส่ัง while ประโยค for ประกอบดวย

3 สวน แตละสวนค่ันดวยเคร่ืองหมาย ; ประกอบดวย สวนที่เปนคาเร่ิมตน (initial) สวนท่ีตรวจสอบเงื่อนไข

(conditional_expression) และสวนที่ใชในการเพิ่มคาหรือลดคา (adjust)

Page 47: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

For ( initial; conditional_expression ; adjust) {

Statements1;

}

statements2;

ตัวอยาง แสดงการหาผลรวมของ 1 + 2 + 3 + …+ 50

1: //Program Sum1to50.cpp 2: // Finding summation of number from 1 to 50 3: #include <iostream.h> 4: int main() { 5: int sum = 0; 6: for (int i=1; i<=50; i++) { 7: sum +=i; 8: } 9: cout << " 1 + 2 + 3 +...+ 50 = " << sum << endl; 10: } 11: ตัวอยาง แสดงการคนวณแฟคตอเรียลของเลขจํานวนเต็มบวก n โดยที่

n ! = n (n-1)(n-2)…1 เม่ือ n มากกวาหรือเทากับ 0

และ 0 ! = 1 1: // Program Factorial n 2: #include <iostream.h> 3: int main() { 4: //int n,fac; 5: //long n,fac; 6: unsigned long n, fac; 7: //double n, fac; 8: cout << "Enter a positive number for calculating Factorial : "; 9: cin >> n; 10: fac = n; 11: if ( n != 0) { 12: for (unsigned long i=n-1; i > 1; i--) { 13: fac = fac * i; 14: } 15: } else if ( n==0) 16: fac =1; 17: else cout << "can't calculating Factorial" << endl; 18: cout << n << "! = " << fac << endl; 19: return 0; 20: }

Page 48: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ทดลองใหโปรแกรมทํางาน แลวทดสอบดูวา เม่ือกําหนดใหตัวแปร n เปนชนิด int คา n มีคาไดไมเกินเทาใด คา

n! จะยังคงไมผิดพลาด

ใน เทอรโบ ซีพลัส พลัส พบวา 8! = -25216 คาที่ถูกตองคือ 40320 คานี้เกิน 32767 ซึ่งเปนคามาก

ที่สุดที่ตัวแปรชนิด int เก็บได

ถาเปล่ียนชนิดขอมูลของตัวแปร n ใหเปน unsigned long พบวาหาคาไดถูกตองถึง 32!

32! = 2147483648

ตัวอยาง การหา จํานวนเฉพาะ (Prime number) จํานวนเฉพาะคือ จํานวนเลขท่ีมากกวา 1 และไมมีเลขอ่ืนใด

หารไดลงตัวเลย ยกเวนตัวมันเอง และ 1 จํานวนเฉพาะไดแก

2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67, … 1: //Program Prime.cpp 2: // Find positive integers for prime number. 3: //A prime number is greater than 1 and is 4: // divisible only by itself and 1 5: #include <iostream.h> 6: void main() { 7: unsigned long max_num,j; 8: int line = 0; 9: cout << "\nSearch prime number up to : "; 10: cin >> max_num; 11: cout << "These are prime number===> " << endl; 12: for (unsigned long i=3; i<=max_num; i+=2) { 13: //divide number i by add integer j ranging from 3 to i/2 14: for ( j=3;i%j !=0 && (j < (i/2)); j+=2) 15: /* leave as null statement intentionally */ ; 16: if ( j >= (i/2)) { 17: line += 1; 18: if (line%10 == 0) cout << i << endl; 19: else cout << i << " "; 20: } // if 21: } //for i loop 22: } ตัวอยางการหาจํานวนเฉพาะต้ัง1 – 1000 จะเห็นวาโปรแกรมน้ีไมรวม 2 เปนจํานวนเฉพาะดวย

Page 49: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

continue และ break

ในบางคร้ังเราอาจตองการใหการวนรอบที่เกิดจากการใชคําส่ัง for หรือ while หรือ do .. while มีการ

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

วนรอบ

เม่ือการวนรอบของ for หรือ while หรือ do .. while พบกับคําส่ัง continue จะไมมีการทําคําส่ังที่อยู

หลัง continue จะกระโดดขามไปวนรอบคาตอไปทันที ตัวอยางเชน การบวกเลขจํานวนคูต้ังแต 2 ถึง 10 1: #include <iostream> 2: // using namespace std; 3: 4: int main( ) 5: { 6: int sum, i ; 7: for( sum=0, i=0; i <= 10; i++) { 8: if (i & 1) continue; 9: sum +=i; 10: 11: } 12: cout << "2 + 4 + 6 + 8 + 10 = " << sum << endl; 13: return 0; 14: } คําส่ัง break ใชเพื่อเปนการออกจากการวนรอบกลางคัน โปรแกรมจะประมวลผลคําส่ังถัดไปที่ตอจากการ

วนรอบ

การวนรอบแบบไมรูจบ (infinite loop)

บางคร้ังเราตองการบังคับโปรแกรมใหทํางานวนรอบแบบไมส้ินสุด ตัวอยางเชน ในระบบควบคุม

โปรแกรมอาจจะวนรอบเพื่อคอยรับคาที่ไดจากหัววัด หรือระบบตรวจจับอื่น ๆ อยางตอเนื่องตลอดเวลาแลวนํา

คาเหลานี้ไปประมวลผล ซึ่งโปรแกรมไมสามารถจะหยุดทํางานไดดวยตัวมันเอง การหยุดการทํางานตองอาศัย

ระบบปฏิบัติการท่ีเรียกวา killing process ในระบบยูนกิซ ทําไดโดยกดปุม Ctrl + c หรือ Ctrl + Q หรือใชวิธี

reset เคร่ืองคอมพิวเตอร เราสามารถสรางการวนรอบแบบอนันตไดดังนี้

while (1) {

statements;

:

:

}

สําหรับ for loop

for ( ; ;) {

statements;

:

:

}

Page 50: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

สําหรับ do … while loop

do {

statements;

:

:

} while (1);

การควบคุมคําส่ัง โดยใช switch

การตรวจสอบเงื่อนไขโดยการใช if … else ซอนกันหลาย ๆ ชั้น อาจเล่ียงมาใช switch จะทําใหการ

ตรวจสอบดูงาย โอกาสที่จะเกิดความผิดพลาดมีนอยกวา ตัวอยางเชน

if ( n == 1)

statement1;

else if ( n==2)

statement2;

else if ( n==3)

statement3;

else if ( n==4)

statement4;

:

else default_statements;

switch ( n) {

case 1 : { statement1 ;

break; }

case 2 : { statement2;

break; }

case 3 : { statement3;

break; }

case 4 : { statement4;

break; }

:

default : default_statements;

}

บางคร้ังเปนการบังคับใหโปรแกรมทํางานตามอักขระที่เรากดแปนพิมพ เชน

cin << ch;

if ( ch == ‘r’)

readdata();

else if ( ch==’s’)

savedata();

else if ( ch==’c’)

calculatedata();

else if ( ch==’p’)

printdata();

:

cin << ch;

switch ( ch) {

case ‘r’ : { readdata() ; break; }

case ‘s’ : { savedata(); break; }

case ‘c’ : { calculatedata(); break; }

case ‘p’ : { printdata(); break; }

:

}

Page 51: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

รูปแบบของคําส่ัง switch

switch (expression) {

case constant1 : { statements1;

break; }

case constant2 : { statements2;

break; }

case constant3 : { statements3;

break; }

:

:

default : { default_statements;

}

}

next_statements;

ตัวแปร expression ในวงเล็บของ switch จะตองเปนขอมูลชนิด int หรือ char การใชขอมูลแบบ

string ดังตอไปนี้ ไมถูกตอง คอมไพเลอรจะแสดงขอความผิดพลาดขณะคอมไพล

switch (stringvar) {

case “one” : { …. };

case “two” : { … } ;

}

คําส่ัง switch จะทําการตรวจสอบตัวแปร expression วาจะไปทําคําส่ัง case ที่ลําดับใด ถาคาใน

expression เทากับ constant2 โปรแกรมจะกระโดมาทําคําส่ัง statement2 ที่อยูในบล็อกของ case constant2

เม่ือถึงคําส่ัง break โปรแกรมจะขามมาทําคําส่ัง next_statements

ถาคาใน expression ไมตรงกับคาคงท่ีใด ๆ ที่ตามหลังcase เลย โปรแกรมจะทําคําส่ังที่อยูในบล็อก

ของ default แลวตอดวย next_statements

ขอสังเกต

1. คําส่ัง case จะสลับลําดับกอนหลังอยางไรก็ได เชนเดียวกับ default จะนําไปเขียนตรงสวนใดก็ได

ในระหวางคําส่ัง switch { … }

2. คําส่ัง break จะเปนการกําหนดใหโปรแกรมทาํเฉพาะชุดคําส่ังที่อยูใน case นั้น ถาตัดคําส่ัง

break ออก โปรแกรมจะประมวลผลไลตามลําดับลงมาเร่ือย ๆ รวมทั้งทําคําส่ังของ default ดวย

3. case แตละคา สามารรถเขียนเรียงกันในบรรทัดเดียวกันได เชน

case 1 : case 2 : statement ;

Page 52: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ตัวอยาง ในการจัดกลุมการสอบยอย ซึ่งมีคะแนนเต็ม 10 คะแนน นักศึกษาท่ีไดคะแนน 8 – 10 คะแนนจัดอยูใน

กลุมเกง (Good) นักศึกษาท่ีไดคะแนน 5-7 คะแนน จัดอยูในกลุมพอใช (Not bad) นักศึกษาท่ีไดคะแนน 0 -4

คะแนน ตองแกไขปรับปรุง (More practice) 1: #include <iostream> 2: using namespace std; 3: 4: int main( ) { 5: int score; 6: cout << "Input your score (from 0 to 10) : "; 7: cin >> score; 8: switch (score) { 9: case 10: case 9: case 8: { cout << "Good " << endl; break; } 10: case 7 :case 6: case 5: { cout << "Not bad " << endl ; break; } 11: case 4 : case 3 : case 2 : case 1 : case 0 : { 12: cout << " You must practice more ! " << endl; break; 13: } 14: default : { cout << "Please input an integer from 0 to 10 \n"; } 15: } 16: 17: return 0; 18: } มาถึงตอนนี้ เราไดเรียนรู การใชชนิดขอมูลแบบตาง ๆ ใหเหมาะสมกับงาน การใชตัวปฏิบัติการตาง ๆ

การควบคุมคําส่ังใหโปรแกรมวนรอบตามที่เราตองการ ตอไปนี้จะเปนการนําความรูเหลานี้มาเขียนเปนโปรแกรม

ส้ัน ๆ เพื่อคํานวณและแกปญหาทางคณิตศาสตร หรือทางวิทยาศาสตร

ปญหา (ดัดแปลงจาก Schaum’s outline หนา 79) กําหนดตัวต้ัง (numerator) และตัวหาร (denominator) ทั้ง

คูเปนเลขจํานวนเต็มบวก โปรแกรมจะแสดงผลหารซึ่งเปนจาํนวนเต็ม (integer quotient) และเศษเหลือ

(remainder)

ก. ใชเคร่ืองหมาย / และ %

ข. หามใชเคร่ืองหมาย / และ %

ก. ใชเคร่ืองหมาย / (quotient operator) และ % (remainder operator) 1: // Program division.cpp -- Finding quotient and remainder 2: // by using / and % operator 3: // 01 Jan 2004 4: #include <iostream> 5: using namespace std; 6: int main() { 7: int n ; // numerator 8: int d; // denominator 9: cout << "Input Numerator = "; cin >> n; 10: cout << "Input Denominator = ";cin >> d; 11: if ( n <=0 ||d <= 0) { 12: cout << "Your number should greater than zero \n"; 13: return 1; 14: } 15: cout << "Quotient = " << n/d; 16: cout << "\tRemainder= " << n%d;

Page 53: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

17: return 0; 18: }

ข. หามใชเคร่ืองหมาย / และ % แตจะใชการวนรอบแกปญหาแทน

1: // Program divis2.cpp -- Finding quotient and remainder 2: // by using for loop 3: // 01 Jan 2004 4: #include <iostream> 5: using namespace std; 6: 7: main() { 8: int n ; // numerator 9: int d; // denominator 10: int i; // number of iteration 11: int r; // remainder 12: cout << "Input Numerator = "; cin >> n; 13: cout << "Input Denominator = ";cin >> d; 14: if ( n <=0 || d <= 0) { 15: cout << "Your number should greater than zero \n"; 16: return 1; 17: } 18: r = n; 19: for ( i = 0; r > d; i++) 20: r = r - d; 21: 22: cout << "Quotient = " << n/d << endl; 23: cout << "Remainder= " << n%d << endl; 24: return 0; 25: } ปญหา (จากหนังสือ Schaum’s outline หนา 80) การหาตัวหารรวมมาก (ห.ร.ม.)(GCD, The Greatest

Common Divisor) โดยใช Euclidean algorithm

อัลกอริธึมของ ยูคลิด สามารถเขียนเปน flow chart ไดดังนี้

Page 54: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ตัวอยางเชน จงหา ห.ร.ม.ของ 52, 128

1. สลับที่ : 128, 52

2. นํา 128 % 52 จะเหลือเศษ 24 จะไดตัวเลขเก็บไวเปน 52, 24

3. นํา 52 % 24 จะเหลือเศษ 4 จะไดตัวเลขเปน 24, 4

4. นํา 4 % 2 จะเหลือเศษ 0 จะไดตัวเลขเปน 4,0

5. ห.ร.ม. ของ 52, 128 คือ 4

ตัวอยาง จงหา ห.ร.ม. ของ 532, 112

(532, 112 ) (112,84) (84,28) (28,0) ห.ร.ม. ของ 532, 112 คือ 28

ตัวอยาง จงหา ห.ร.ม. ของ 540, 432

(540, 432 ) (432,108) (108,0) ห.ร.ม. ของ 540, 432 คือ 108

Page 55: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

1: //Program gcd.cpp -- Calculate the greatest common divisor (g.c.d.) 2: // Jan 01, 2004 3: #include <iostream> 4: using namespace std; 5: 6: main() { 7: long a,b; 8: long remainder; 9: long temp; // temporaly variable 10: cout << "Input two positive integer "; 11: cin >> a >> b; 12: if (a < b) { 13: temp = a; 14: a = b; 15: b = temp; 16: } 17: cout << "The great common divisor of " << a << " and " << b << " = "; 18: while ( b > 0) { 19: remainder = a % b; 20: a = b; 21: b = remainder; 22: } 23: cout << a << endl; 24: return 0; 25: 26: }

ปญหา ( Schaum’s outline หนา 80) จงเรียงตัวเลขจํานวนเต็มใหยอนกลับทิศทางเดิม เชน 1234 จะแสดงผล

4321 1: //Program Reverse.cpp -- Reverse your input number 2: // Jan 01, 2004 3: #include <iostream> 4: using namespace std; 5: 6: main() { 7: long Number; 8: long digit; 9: long NewNumber=0; 10: cout << "What is your number ? "; 11: cin >> Number; 12: if (Number <= 0) { 13: cout << "Please input positive integer only "; 14: return 1; 15: } 16: while (Number > 0) { 17: digit = Number % 10; //find the right-most digit 18: Number = Number / 10; // remove the right-most digit 19: NewNumber = 10*NewNumber + digit; // reverse them 20: } 21: cout << " The reverse Number is " << NewNumber <<endl; 22: return 0; 23: 24: }

Page 56: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ตัวอยางการทํางาน

ขอสังเกต 007 จะไดเปน 7

7500 จะไดเปน 57

การสรางตัวเลขสุม

การใชโปรแกรมคอมพิวเตอรจําลองสถานการณ (simulation) เชน การทอดลูกเตา จับสลากออก

รางวัล โดยใหคอมพิวเตอรสรางขอมูลโดยสุมตัวเลขขึ้นมาเอง ตัวเลขท่ีคอมพิวเตอรสุมขึ้นมาน้ัน ตองไมจําเพาะ

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

ในภาษา C++ มีฟงกชัน rand() ใชสรางตัวเลขสุมที่มีคาเปนบวก ต้ังแต 0 ถึง RAND_MAX การใช

ฟงกชันนี้จะตองใส header file ชื่อ stdlib.h ไวที่ตนโปรแกรมดวย

ทดลองสุมตัวเลขมา 10 คาโดยเขียนโปรแกรมดังนี้ 1: // Program random1.cpp --Generate Random number 2: // Jan 01, 2004 3: #include <iostream> 4: #include <stdlib> 5: using namespace std; 6: 7: main() { 8: for (int i = 1 ; i <= 10 ; i++) 9: cout << rand() << endl; 10: cout << "Maximum random number = " << RAND_MAX; 11: return 0; 12: } 13: ใหโปรแกรมทํางาน จะไดเลขสุม ออกมา 10 คา โดยเขียนโปรแกรม ดังนี้ 346 130 10982 1090 11656 7117 17595 6415 22948 31126 Maximum random number = 32767

Page 57: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

จะเห็นเลขสุมที่ไดจะมีคาไมซ้ํากันเลย และไมสามารถเดาเลขสุมคาถัดไปดวยวามีคาเทาใด เพราะถูกสุมออกมา

โดยไมมีรูปแบบที่แนนอน เม่ือใหโปรแกรมนี้ทํางานกับเคร่ืองคอมพิวเตอรตางเคร่ืองกัน พบวาอนุกรมเลขสุม

อาจจะไมเหมือน ดังที่เขียนไวในตัวอยางนี้

เม่ือทดสอบใหโปรแกรมทํางานครั้งที่ 2 จะไดผลลัพธดังนี้ 346 130 10982 1090 11656 7117 17595 6415 22948 31126 Maximum random number = 32767

และคร้ังที่ 3 346 130 10982 1090 11656 7117 17595 6415 22948 31126 Maximum random number = 32767

โปรแกรมทํางานแตละคร้ังจะสรางเลขสุมต้ังแต 0 ถึง RAND_MAX ( ในที่นี้จะไดคา 32767) พบวาเลขสุมที่

ลําดับเดียวกันของทั้งสามคร้ังจะเปนเลขตัวเดียวกันหรือการทํางานแตละคร้ังจะใหเลขสุมที่เปนอนุกรมเดียวกัน

ที่เปนเชนนี้ เพราะการทํางานของโปรแกรมแตละคร้ังจะสรางอนุกรมของตัวเลขจากจุดเร่ิมตน (seed) เดียวกัน

ซึ่งจะกําหนดคาโดยคอมพิวเตอรโดยปริยาย และเปนคาเดียวกันทุกคร้ังที่โปรแกรมนี้ทํางาน

คอมพิวเตอรไมสามารถสรางเลขสุมที่แทจริง เพราะเม่ือใหคาอินพุตคาเดียวกัน คอมพิวเตอรจะใหผล

ลัพธออกมาเหมือนกันเสมอ แตจํานวนท่ีไดทั้ง 10 คาจัดไดวาเปนเลขสุม เราเรียกเลขสุมที่ไดจากคอมพิวเตอรนี้

วาเปนเลขสุมเทียม (psudo-random number)

ถากําหนดจุดเร่ิมตน (seed) ที่ตางกันไป จะไดอนุกรมของเลขสุมที่ตางกัน โดยใชฟงกชัน sran( )

กําหนดจุดเร่ิมตนของเราเอง ไมตองใหคอมพวิเตอรกําหนดให จะไดชุดเลขสุมที่ตางกันไป ดังตัวอยางตอไปนี้

1: // Program - random2.cpp --Generate Random number 2: // Jan 01, 2004 3: #include <iostream> 4: #include <stdlib> 5: using namespace std;

Page 58: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

6: 7: main() { 8: unsigned seed; 9: cout << " Input seed for random number : "; 10: cin >> seed; 11: srand(seed); 12: cout << "Seed = " << seed << endl; 13: for (int i = 1 ; i <= 10 ; i++) 14: cout << rand() << " "; 15: // cout << "Maximum random number = " << RAND_MAX; 16: return 0; 17: }

เม่ือกําหนดคา seed =1, seed=123, seed = 500 และ seed =346 จะไดอนุกรมเลขสุมที่มีคาตางกันดังนี้

Input seed for random number : Seed = 1 346 130 10982 1090 11656 7117 17595 6415 22948 31126 Input seed for random number : Seed = 123 9827 6588 24191 6712 22732 10409 17951 18683 8409 12981 Input seed for random number : Seed = 500 9312 23588 19347 13071 8345 3124 3206 30808 15588 15732 Input seed for random number : Seed = 346 21517 24031 19326 29074 19611 14009 28003 15860 25345 1571

เม่ือพิจารณาอนุกรมเลขสุม ที่ seed =1 พบวาเปนอนุกรมเดียวกันกับตัวเลขสุมที่ไดจากโปรแกรม

random1.cpp แสดงวาโปรแกรมไดกําหนดคา seed = 1 เปนคาโดยปริยาย

เพื่อที่จะไมตองกําหนดคา seed ในแตละคร้ังที่มีการสรางเลขสุม จะใชประโยชนจากสัญญาณนาฬิกา

ของระบบคอมพิวเตอรเปนผูสรางคา seed ให ฟงกชัน time ( ) จะนําคาเวลาของเคร่ือง ณ ขณะนั้นสงกลับเปน

เลขจํานวนเต็มบวก การใชฟงกชัน time () ตองกําหนด header file ชื่อ time.h ไวที่สวนหัวของโปรแกรม 1: // Program random3.cpp -- Generate Random number 2: // Jan 01, 2004 3: #include <iostream> 4: #include <stdlib> 5: #include <time> 6: using namespace std; 7: 8: main() { 9: unsigned seed; 10: seed = time(NULL); 11: cout << "Seed = " << seed << endl; 12: srand(seed); 13: for (int i = 1 ; i <= 10 ; i++) 14: cout << rand() << " "; 15: // cout << "Maximum random number = " << RAND_MAX; 16: return 0; 17: }

Page 59: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

เม่ือใหโปรแกรมทํางานครั้งแรกจะได seed = 38620 จะไดเลขสุมออกมา 1 ชุด อีก 11 วินาทีตอมา รันโปรแกรม

อีกคร้ังจะไดอนุกรมเลขสุมอีกชุดหนึ่ง ดังนี้ Seed = 38620 4974 27386 29523 668 25353 22414 13030 21087 9781 22631 Seed = 38631 8783 25014 17821 22931 10505 5253 29983 29177 27809 14280

ปญหา การทายตัวเลข : คอมพิวเตอรจะสุมตัวเลขจํานวนหน่ึงมีคาระหวาง 1 ถึง 100 จากนั้นใหผูเลนทายวา

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

จํานวนคร้ังที่ทายนอยที่สุดเทาที่จะเปนไปได 1: // Program guessnum.cpp --Guessing a Number 2: // Jan 01, 2004 3: #include <iostream> 4: #include <stdlib> 5: #include <time> 6: using namespace std; 7: 8: main() { 9: unsigned seed,number,guess; 10: char ch = 'y'; 11: int min =1, max = 100,n; 12: int range; 13: while (ch == 'y' || ch == 'Y') { 14: seed = time(NULL); 15: srand(seed); 16: range = max - min + 1; 17: number = rand() % range + min; 18: cout << "\nI picked a number(1 to 100). Guess it? "; 19: cin >> guess; 20: n=1; 21: while ( guess != number) { 22: cout << n << " Your select is " << guess << endl; 23: if (guess > number) cout << "Too large..\n"; 24: if (guess < number) cout << "Too small ..\n"; 25: cout << "Try again ---> "; cin >> guess; 26: n++; 27: } 28: cout << "At last you are right in " << n << " time. My number is " 29: << number << endl; 30: 31: cout << "Would you like to play again ? "; 32: cin >> ch; 33: } //while 34: return 0; 35: } จากโปรแกรม guessnum.cpp จะเห็นวา เราสามารถสรางเลขสุมใหมีคาอยูในชวงที่ตองการ เชน จาก

โปรแกรมใหมีคาระหวาง 1 -100 นั่นคือ max =100 , min = 1 ชวงของเลขสุมคือ range มีคาเทากับ max –

min + 1 นําไปหาเลขสุมไดจาก

number = min()+

rangerand

Page 60: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ปญหา เกมไฮโลว มีลูกเตาอยู 3 ลูก เม่ือทอดลูกเตาแลวนับจํานวนแตมทั้งสามลูกซ่ึงมีคาระหวาง 3 ถึง 18 ถา

รวมแลวนอยกวา 11 ถือวาการทอดคร้ังนี้ออก “ตํ่า” ถามากกวา 11 ถือวาออก “สูง” ถารวมกันได 11 พอดีจะถือ

วาออก “ไฮโลว “ (height – low) โปรแกรมนี้จะใหผูเลนทายวาลูกเตาทั้งสามลูกออกมา ตํ่า สูง หรือ “ไฮโลว”

คอมพิวเตอรจะสุมเลขสุม ต้ังแต 1 ถึง 6 ออกมา 3 จํานวนแทนลูกเตาแตละลูก 1: // Hilo.cpp 2: // Jan 01, 2004 3: #include <iostream> 4: #include <stdlib> 5: #include <time> 6: using namespace std; 7: 8: int main() { 9: unsigned dice1,dice2,dice3; 10: char ch = 'y'; 11: int min =1, max = 6,range,sum,answer,result; 12: range = max - min + 1; 13: while (ch == 'y' || ch == 'Y') { 14: srand(time(NULL)); 15: dice1 = rand()%range + min; 16: srand(time(NULL)+5); 17: dice2 = rand()%range + min; 18: srand(time(NULL)+10); 19: dice3 = rand()%range + min; 20: sum = dice1+ dice2 + dice3; 21: if (sum < 11 ) result = 1 ; 22: else if ( sum > 11 ) result = 3 ; 23: else result = 2; 24: cout << "I've tossed my dices. Pleas guess.\n" 25: << " Press 1 if it's low, \n" 26: << " Press 2 if it's just hi-lo \n" 27: << " Press 3 if it's high.\n"; 28: cout << "Your select is ==> ";cin >> answer; 29: if (answer == result) 30: cout << "Congratulation. You win.....\n"; 31: else cout << "Sorry. You lossed.....\n"; 32: cout << "Dice # 1 = " << dice1 << endl; 33: cout << "Dice # 2 = " << dice2 << endl; 34: cout << "Dice # 3 = " << dice3 << endl; 35: cout << "Sum of 3 dices = " << sum << endl; 36: cout << "\nPlay again ? "; 37: cin >> ch; 38: } //whlile 39: return 0; 40: }

ผลของการทํางานของโปรแกรมมีดังนี้

Page 61: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

แบบฝกหัด (จากหนังสือ teach yourself c++ in 21 days)

1. ตอไปนี้ใหคาจริงหรือเท็จ

ก. 0

ข. 1

ค. x = 0

ง. -1

จ. x == 0

2. จงคาดคะเนผลลัพธจากโปรแกรมตอไปนี้

#include <iostream>

using namespace std;

int main () {

int x=1, y =1, z;

if ( z = (x-y))

cout << “z = “ << z;

return 0;

}

3. จงคาดคะเนผลลัพธจากโปรแกรมตอไปนี้

#include <iostream>

using namespace std;

Page 62: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

int main () {

int i=1;

int x;

while ( i < 100) {

cout << “ Input an integer :”;

cin >> x;

}

return 0;

(เฉลย ตองมีประโยค i++; มิฉะนั้นจะวนรอบไมส้ินสุด)

4. จงเขียนผลลัพธของโปรแกรม

#include <iostream>

using namespace std;

int main () {

short int mynumber;

mynumber = 65535;

cout << “Now the number = “ << mynumber << endl;

mynumber ++;

cout << “Now the number = “ << mynumber << endl;

mynumber ++;

cout << “Now the number = “ << mynumber << endl;

return 0;

}

ผลลัพธ จะไดเปน

Now the number = 65535

Now the number = 0

Now the number = 1

จงเขียนโปแกรมหาคา ex

...!3!2

132

++++=xxxe x

ใหผูใชปอนคา x จากนั้นแสดงผล ex

Page 63: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

บทที่ 3

Standard I/O และ ฟงกชันทางคณิตศาสตร

ภาษาC++ อํานวยความสะดวกใหผูเขียนโปรแกรมสามารถนําขอมูลแสดงออกทาง output (จอภาพ,

เคร่ืองพิมพ , ฯ) หรือรับขอมูลจาก input (แปนพิมพ, พอรตตาง ๆ , หรือไฟล) ไดโดยงาย โดยบรรจุฟงกชัน และ

คลาสที่ทําหนาที่เหลานี้ไวใน standard library (คลังโปรแกรมมาตรฐาน) พรอมนําไปใชงานไดทันที

การแสดงผลออกทางจอภาพ เราไดใชคําส่ัง cout (console output) มาแลวในโปรแกรม 1.1 บทที่ 1

cout << “Area of rectangle = “ << area << endl;

จากประโยคนี้มีการสงผานพารามิเตอร (parameter) 3 คา ไปยัง cout โดยสงเรียงไปตามลําดับเปน

กระแสขอความ (stream – A stream is any flow of data form a producer (source) to a consumer(sink) )

ค่ันดวยเคร่ืองหมาย << (insertion parameter) cout สามารถแปลงขอมูลชนิดตาง ๆ อยางอัตโนมัติ ไมวาจะ

เปนจํานวนเต็ม หรือเลขทศนิยม จะถูกแปลงใหเปนตัวอักษรแสดงผลเรียงลําดับบนจอภาพ

กอนจะใช cout แสดงผลบนจอภาพ หรือ cin (console input) รับขอมูลจากแปนพิมพ จะตองนํา

header file ชื่อ iostream.h ใสไวตรงสวนหวัของโปรแกรมเสมอ โดยใชคําส่ัง #include ในไฟล iostream.h จะมี

การกําหนดขอมูลและเคร่ืองหมายตาง ๆ สําหรับ cout และ cin นําไปใช

การแสดงผลอาจใชตัวกรองขอมูล หรือ manipulator ทําหนาที่กรองกระแสขอมูลใหผานไปยัง cout ทํา

ใหรูวาจะสงขอมูลแสดงผลในลักษณะใด manipulator จะถูกนิยามไวใน iostream.h ไดแก hex จะเปนการ

กําหนดใหพิมพตัวเลขในรูปฐานสิบหก dec พิมพจํานวนเลขเปนเลขฐานสิบ oct พิมพจํานวนเลขเปนเลขฐาน

แปด

ตัวอยางการนําไปใชมีดังนี้ 1: // Program 3.1 Dec2HexAndOct.cpp 2: // Converse decimal to Hex and Oct 3: // ------------------------------ 4: #include <iostream> 5: using namespace std; 6: 7: main() { 8: int i; 9: cout << "Input an Integer Number :" ; 10: while ( cin >> i) { 11: cout << i << " in Hexadecimal = " << hex << i << endl; 12: cout << i << " in Octal = " << oct << i << endl; 13: } 14: return 0; 15: }

Page 64: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

การทํางานของโปรแกรมจะเปนดังนี้

manipulator นอกจากจะนิยามไวใน iostream แลว ยังนิยามไวใน iomanip ดวย ที่ใชบอย ๆ ในการแสดงผล

จํานวนจริง ไดแก

setw หมายถึง set field width บอกจํานวนตําแหนงที่จะแสดงผลบนหนาจอ สามารถจัดรูปแบบการ

แสดงผลโดยใชแทน tab (\t)

ตัวอยาง เชน int i = 625;

cout << setw(5) << i; จะแสดงผลบนจอโดยพิมพตัวเลขชิดขวา เติมชองวางดานหนาใหอีก 2 ตําแหนงใหครบ 5 ตําแหนง

_ _ 6 2 5

setprecision เปนการกําหนดจํานวนตัวเลขหลังจุดทศนิยม โดยปกติจะแสดงตัวเลขหลังจุดทศนิยม 6

ตําแหนง

setiosflags จะใชในการกําหนดรูปแบบหรือต้ังคาการแสดงผลและรับขอมูล ขอมูลจะคงรูปแบบเชนนี้

ตลอดไปในโปรแกรม จนกวาจะใชคําส่ัง resetiosflags ทั้งการแสดงผลและการรับขอมูลจะมองจาก flag ที่

manipulator กําหนดไว

flag ที่ใชในการแสดงผลมีดังนี้

ios :: right แสดงผลตัวเลขในลักษณะชิดดานขวา

ios :: left แสดงผลตัวเลขในลักษณะชิดดานซาย

ios :: dec แสดงผลตัวเลขในฐานสิบ เชนเดียวกับ dec ที่อยูในไฟล iostream

ios :: oct แสดงผลตัวเลขในฐานแปด เชนเดียวกับ oct ที่อยูในไฟล iostream

ios :: hex แสดงผลตัวเลขในฐานสิบหก เชนเดียวกับ hex ที่อยูในไฟล iostream

ios :: scientific แสดงผลในรูป exponential เชน 3.24 จะเขียนในรูป 3.2 e1

ios :: fixed แสดงผลเปนจํานวนจริงที่มีจํานวนตําแหนงของเลขทศนิยมคงที่

1: // Program 3.2 realFormat.cpp 2: // How to print a number in different format 3: // ------------------------------ 4: #include <iostream> 5: #include <iomanip> 6: using namespace std; 7: main() { 8: const double PI = 3.141592653; 9: const double AVOGADRO = 6.0221e23; 10: const double ELECTRON_MASS = 9.1095e-19; 11: const double FIFTY = 50.0;

Page 65: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

12: cout << "Print PI in different precision : \n"; 13: for (int i=1; i <=10; i++ ) { 14: cout << setprecision(i) << PI << endl; 15: } 16: 17: cout << "\n\nPrint PI with set field width = 12 " << endl; 18: cout << setw(12) << setprecision(4) << PI << endl; 19: 20: cout << "\n\nPrint PI in scientific notation "; 21: cout << setiosflags(ios::scientific) << PI << endl; 22: 23: cout << "\n\nPrint 50.0, display in scientific notation, because of \n 24: setting seiosflag(ios::scientific)"; 25: cout << "\n FIFTY = 50.0 but display in Scientific Notation " << FIFTY << 26: endl; 27: 28: cout << "\n\nThen reset Scientific Notation flag" << resetiosflags(ios:: 29: scientific); 30: cout << "\n FIFTY = 50.0 and display as " << FIFTY << endl; 31: return 0; 32: 33: } ผลการรันโปรแกรม ดังรูปขางลางนี้

โปรแกรมจะทํางานในขั้นแรก หมายเลข 1 ในรูป จะแสดงผลคา PI (PI = 3.141592653) ที่มีตัวเลขหลัง

ทศนิยมตางกัน ตามที่กําหนดไว setprecision( i) โดยกําหนดให i มีคาต้ังแต 1 ถึง10

หมายเลข 2 กําหนดใหการพิมพคา PI โดยกําหนดความกวางของ setw(12)

หมายเลข 3 เปนการพิมพคา PI ในรูปเลขยกกําลัง

หมายเลข 4 ไดกําหนด flag ไวเปน ios :: scientific เมื่อพิมพจํานวน 50 พบวาจะอยูในเลขยกกําลัง

Page 66: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

หมายเลข 5 เมื่อ reset flag พบวาสามารถพิมพตัวเลข 50 ในรูปแบบปกติที่เราคุนเคย cin และการตรวจสอบขอมูลที่ปอนเขามาทางแปนพิมพ

ขอมูลที่ปอนเขามาทางแปนพิมพอาจมีการพิมพผิด เชน ตองการปอนขอมูลตัวเลข อาจมีตัวอักษรปน

เขามาดวย เราสามารถตรวจสอบไดโดยใชคําส่ัง cin ดังนี้

cin.eof( ) สงคา 1 กลับคืนถาพบจุดส้ินสุดของไฟล (end of file)

cin.good( ) สงคา 1 กลับคืนถาขอมูลที่รับเขามาถูกตอง

cin.fail ( ) สงคา 1 กลับคืน ถาพบวาขอมูลที่ปอนเขามามีขอผิดพลาด

ตัวอยางเชน

int i;

cin >> i;

if ( cin.good() ) cout << “ Data ok, value = “ << i << endl;

else

cout << “Data input error !!! “;

………….

กรณีเลือกใช cin.fail() ในการตรวจสอบจะเปนดังนี้

if ( cin.fail () ) cout << “Data Error \n”;

else cout << “ Data ok, value = “ << i << endl;

………….

วิธีการตรวจสอบ อาจใชสถานะของ stream ในตัวคําส่ังของ cin จะเรียกฟงกชัน cin.fail () จะสงกลับ

คา false ถามีขอผิดพลาด

if ( cin) cout << “ Data OK \n “ ;

else cout << “Data Error \n”;

อาจเขียนคําส่ังตรวจสอบกะทัดรัด พรอมคําส่ังปอนขอมูลก็ไดดังนี้

if ( cin >> i) cout << “ Data OK = “ << i ;

else cout << “Data error \n “;

1: // Program 3_3. testcin.cpp 2: // Read a radius of circle from keyboard 3: // if ok, claculate area of this circle. 4: 5: #include <iostream> 6: using namespace std; 7: const float PI =3.141592653; 8: main() { 9: float radius, area; 10: cout << "Enter radius of circle (real number) : "; 11: if ( cin >> radius) 12: { cout << "radius = " << radius << endl; 13: area = PI * radius *radius; 14: cout << "Area of this circle is " << area << endl;

Page 67: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

15: } else { 16: cout << "Data input error \n "; 17: } 18: return 0; 19: }

โปรดสังเกต การปอนคา radius ผานแปนพิมพ โดยใชคําส่ัง cin ดังตอไปนี้

ฟงกชันทางคณิตศาสตร (Mathematical function)

ในการแกปญหาทางวิทยาศาสตรและวิศวกรรม สมการที่ไดอาจอยูในรูปเลขยกกําลังหรือล็อกการิธึม

ฟงกชันตรีโกณมิติ ฟงกชันเอ็กซโพเนนเชียล ภาษาC++ ไดสรางฟงกชันทางคณิตศาสตรเตรียมไวใหเรียกใชงาน

ไดทันที ฟงกชันเหลานี้อยูใน standard C++ library การเรียกใชงานฟงกชัน ตองใสประโยค #include

<math> ไวที่สวนหัวของโปรแกรม

ฟงกชันทางคณิตศาสตรพื้นฐานที่ใชบอย ๆ ในงานคํานวณ ไดแก

Page 68: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

- ceil (x) ปดจํานวนจริง x ใหมีคาเพิ่มขึ้นเปนจํานวนเต็มที่มีคาใกล x และใกลคา ∞ (infinity)

มากที่สุด ( smallest integer >= x) or round up เชน ceil (5.03) = 6

- exp(x) คํานวณคา ex เม่ือ e เปนเลขฐานธรรมชาติ e = 2.718282…, exp(e) = 7.38906,,,

- fab(x) หาคาสมบูรณของ x เชน fab(-6) = 6

- floor ( x ) ปดจํานวนจริง x ใหมีคาลดลงเปนจํานวนเต็มที่มีคาใกล x และใกลคา -∞ มากที่สุด (

largest integer <= x) or round down เชน floor (5.03) = 5

- log ( x ) คํานวณคา ln x จะเกิดขอความผิดพลาด ถา x นอยกวา หรือเทากับ 0 เชน log (2) =

0.693147

-log10 (x) คํานวณคา log ฐานสิบของ x จะเกิดขอความผิดพลาด ถา x นอยกวา หรือเทากับ 0

เชน log10 ( 2) = 0.30103

- pow (x,p) คํานวณคา xP จะเกิดขอความผิดพลาด ถา x เทากับศูนย และ P นอยกวาศูนย หรือ

ถา x นอยกวาศูนย และ P ไมใชเลขจํานวนเต็ม เชน pow(3,2) = 9.0

- sqrt ( x ) คํานวณคารากท่ีสองชอง x จะเกิดขอความผิดพลาด ถา x เปนจํานวนลบ เชน

sqrt(3)=1.732…

ฟงกชันทางคณิตศาสตรจะสงคากลับแบบ double ถาคาที่สงผานในอารกิวเมนตเปนจํานวนเต็ม จะถูก

เปล่ียนเปนจํานวนจริงเสียกอนที่จะนําไปคํานวณ

การใชงานฟงกชันทางคณิตศาสตร ทําไดโดยเขียนช่ือฟงกชันตามดวยวงเล็บ ภายในวงเล็บคือคาคงท่ี

หรือคาของตัวแปรที่จะใหฟงกชันนั้นไปใชในการคํานวณ อาจจะมีมากกวา 1 คา เชน pow ( x, y) จะตองมี

คาคงท่ีหรือตัวแปรถึง 2 ตัว หรืออาจไมมีเปนวงเล็บวาง ๆ ก็ได คาที่อยูในวงเล็บเรียกวา parameter หรือ

argument ฟงกชันใดที่มีพารามิเตอรมากกวา 1 ตัว การใสคาพารามิเตอรจะตองเรียงลําดับใหถูกตอง และตรง

กับชนิดขอมูลที่กําหนดไวดวย

บางคร้ังจะตองระวังเร่ืองหนวยวัดของคาพารามิเตอรดวย ฟงกชันตรีโกณมิติจะรับคามุมที่มีหนวยเปน

เรเดียนเทานั้น ถาขอมูลมีหนวยเปนองศา จะตองเปล่ียนคามุมที่เปนองศาใหเปนเรเดียนเสียกอน

ตัวอยางเชน ตองการเก็บคา sin x ไวในตัวแปร y โดยที่ x วัดเปนองศา จะตองเปล่ียนคา x ใหเปน

เรเดียนเสียกอน โดยใชความสัมพันธ 180 องศา เทากับ π เรเดียน const double PI = 3.141592653; : : double x, y; y = sin (x *PI/ 180);

ฟงกชันสามารถใชเปนตัวพารามิเตอรของอีกฟงกชันหนึ่งก็ได บรรทัดตอไปนี้คําส่ังหาคา log ของคา

สมบูรณของ x

y = log (fabs(x));

Page 69: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ฟงกชันตรีโกณมิติ

ฟงกชันตรีโกณมิติที่มีอยูใน standard C++ library มีดังนี้

sin (x) คํานวณหาคา sin x เม่ือ x มีหนวยเปนเรเดียน

cos (x) คํานวณหาคา cos x เม่ือ x มีหนวยเปนเรเดียน

tan (x) คํานวณหาคา tan x เม่ือ x มีหนวยเปนเรเดียน

asin (x) คํานวณหาคา arcsine หรือ inverse sine ของ x x จะมีคาอยูระหวาง -1 ถึง 1 ฟงกชัน

จะสงผลลัพธกลับเปนคามุมเรเดียน มีคา -π/2 ถึง π/2

acos (x) คํานวณหาคา arccosine หรือ inverse cosine ของ x x จะมีคาอยูระหวาง -1 ถึง 1

ฟงกชันจะสงผลลัพธกลับเปนคามุมเรเดียน มีคา -π/2 ถึง π/2

atan(y,x) คํานวณหาคา arctan หรือ inverse tan ของ y/ x ฟงกชันจะสงผลลัพธกลับเปนคามุม

เรเดียน มีคา -π/2 ถึง π/2

atan2(y/x) คํานวณหาคา arctan หรือ inverse tan ของ y/ x ฟงกชันจะสงผลลัพธกลับเปนคามุม

เรเดียน มีคา -π ถึง π

ฟงกชัน atan จะสงกลับคามุมซึ่งอยูในควอแดรนตที่ 1 และ 3 ในขณะที่ฟงกชัน atan2 จะสงกลับคามุมซึ่งอยู

ในควอแดรนตใด ๆ ขึ้นอยูกับเคร่ืองหมายของ x และ y ในการแกปญหาทางวิทยาศาสตร ควรใชฟงกชัน atan2

คา inverse ของ sine และ cosine จะถูกตองก็ตอเม่ือคาอารกิวเมนตอยูในชวง -1 ถึง 1 เทานั้น

ตัวอยาง การใชฟงกชันคณิตศาสตรหารากสมการกําลังสองซึ่งอยูในรูป ax2 + bx + c = 0 เม่ือ a,b และ c เปน

สัมประสิทธิ์ของ x รากสมการท่ีไดจะมี 2 คา คือ

a

acbbx2

42

1−+−

=

a

acbbx2

42

2−−−

=

การทํางานเปนไปตามโฟลวชารต ดังตอไปนี้

Page 70: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

1: // Program 3.3 quadratic.cpp 2: // How to print a number in different format 3: // ------------------------------ 4: #include <iostream> 5: #include <iomanip> 6: using namespace std; 7: main() { 8: double a, b, c, d, x1, x2; 9: cout << "Input coefficints of quadratic equation : "; 10: cin >> a >> b >> c; 11: if ( a == 0 ) {

Page 71: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

12: cout << " It's not quadratic equation. \n"; 13: return 0; 14: } 15: d = b*b - 4*a*c; // the discriminant 16: if ( d < 0 ) { 17: cout << " No real Solution \n"; 18: return 0; 19: } 20: x1 = (-b + sqrt(d)) /(2*a); 21: x2 = (-b - sqrt(d)) /(2*a); 22: 23: cout << "The quadratic equation is " << a <<"x^2 + " << b \ 24: << "x + " << c << " = 0 \n"; 25: cout << "The Solutions are : " << x1 << " and " << x2 << endl; 26: } 27:

ผลการรันโปรแกรม จะไดดังนี้

Enumeration Type

นอกจากจะมีชนิดขอมูลแบบจํานวนเต็ม ไดแก int และ char ใหใชงานแลว C++ ยังยอมใหผูเขียน

โปรแกรมสรางชนิดขอมูลในแบบเฉพาะของตนเอง (user- define type) อีกดวย ซึ่งทําไดหลายวิธี วิธีที่มี

ประสิทธิภาพมากท่ีสุดคือใช class (กลาวถึงตอไปในบทที่ 9) วิธีที่งายและทําใหโปรแกรมสามารถส่ือ

ความหมายของตัวมันเองไดชัดเจน คือใชชนิดขอมูลแบบ enumeration type ซึ่งมีรูปแบบดังนี้

enum ชื่อชนิดขอมูล { รายการขอมูลตาง ๆ ที่จะเปนสมาชิกของชนิดขอมูลนี้ };

enum เปนคําสงวนใน C++ การต้ังชื่อชนิดขอมูล (typename) ใชหลักเกณฑเดียวกันกับการต้ังชื่อตัว

แปร รายการขอมูล (enumeratorlist) ที่ใสในวงเล็บปกกาจะถูกแทนดวยจํานวนเต็ม โดยเร่ิมตนที่ศูนย

ตัวอยางเชน

enum Grade { F, D, C, B, A };

เราสามารถนําชนิดขอมูล Grade ไปใชงาน ดังนี้

Page 72: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

Grade sci_grade, math_grade; sci_grade = B; math_grade = A; if ( sci_grade == math_grade) cout << “You got the same grade \n”; else cout << “ You got different grade\n”;

คาจํานวนเต็มที่ถูกกําหนดไวในรายการขอมูล เรียกวา enumerator ซึ่งจะคลายกับการนิยามคาคงที่

const int F =0;

const int D = 1;

: :

const int A = 4;

คาที่กําหนดใน enumeratorlist อาจเปนจํานวนเต็มคาอื่นที่เราตองการก็ได เชน

enum Base { binary = 2, octal =8, decimal = 10, hexadecimal = 16 };

หรือกําหนดคาเร่ิมตนเปนคาอื่น ที่ไมใชศูนย เชน

enum DayOfWeek { sun=1, mon, tue, wed, thu, fri, sat };

sun มีคาเทากับ 1 mon มีคาเทากับ 2 , …, sat มีคาเทากับ 7

สามารถสราง enumerator ที่มีคาซํ้ากันได เชน

enum Answer { false =0, no=0, ture=1, yes=1, ok=1 };

การนําไปใชใหประกาศตัวแปรดังนี้ Answer ans; : if (ans) cout << “ Your answer is ok. “; ไมวาคา ans จะเปน true หรือ yes หรือ ok ทุกตัวมีคาเทากับ 1 เงื่อนไขนี้จะเปนจริงเสมอ

ตัวอยางอื่น ๆ กับการกําหนดขอมูลชนิด enumeration type enum Sex { female, male}; enum CardType { clubs, diamonds, hearts, spades }; enum RainbowColor { violet, blue, green, yellow, orange, red}; enum RomanNumber { I=1, V=5, X= 10, L=50, C=100, D=500, M=1000}; ขอควรระวัง

1. สมาชิกใน enumeratorlist ไมสามารถมีเคร่ืองหมาย + หรือ - ไดเชน

enum Grade { F, D, D+, C, C+, B, B+, A};

2. ชื่อสมาชิกของขอมูลชนิด enumeratorlist ที่มากกวา 2 ชุดขึ้นจะซํ้ากันไมได เชน enum Grade { F, D, C, B, A }; enum RomanNumber { I=1, V=5, X= 10, L=50, C=100, D=500, M=1000}; จากตัวอยางนี้จะเห็นวา C และ D จะถูกนิยามสองครั้ง

ตัวอยางโปรแกรมการสรางขอมูลชนิด enum

Page 73: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

1: #include <iostream> 2: using namespace std; 3: enum number { zero, one, two, three, four, five, six, seven, eight, nine }; 4: 5: int main( ) { 6: 7: number mynum; 8: mynum = one; 9: if (mynum==1) cout << "My number = " << one << endl; 10: mynum = two; 11: if (mynum==2) cout << "My number = " << two << endl; 12: mynum = three; 13: if (mynum==3) cout << "My number = " << three << endl; 14: 15: mynum = (number)(two + three); 16: cout << "Now, My number = " << mynum << endl; 17: return 0; 18: } ผลลัพธของ two + three จะมีคาเหมือน 2 + 3 = 5 อยางไรก็ตาม mynum ไมใชขอมูลชนิด int แต

เปน number จึงตอง cast ชนิดขอมูลดวย number

แฟมขอมูล

ไฟลหรือแฟมขอมูลใน C++ จัดเปน stream คือประกอบดวยบิต (0 หรือ 1) ถูกจัดเก็บเรียงตอกันใน

ส่ือบันทึกขอมูล เชน แผนดิสก หรือเทป ระบบปฏิบัติการของคอมพิวเตอรจะตีความหมายบิตทั้งหลายเหลานี้ใน

ลักษณะตาง ๆ กัน เชน ถาบิตถูกจัดกลุม ๆ ละ 8 บิต จะถูกแปลความหมายเปนรหัสอัสกี (ASCII code) ไฟลนี้

จะจัดเปน text file สามารถเปดดูไดโดยอาศัยโปรแกรมประเภท text editor ถาบิตเหลานี้ถูกจัดกลุม ๆ ละ 32

บิตแทนพิกเซลของสี ไฟลนี้จะเปนไฟลประเภทกราฟก ตองใชโปรแกรมประเภทกราฟก เชน paint หรือ

photoshop เปดดูขอมูล ถาไฟลนั้นเปนชุดคําส่ังของคอมพิวเตอร เชนมีนามสกุล เปน exe หรือ com บิตจะถูก

แปลความหมายเปนคําส่ังของคอมพิวเตอร หนวยประมวลผลกลางหรือcpu จะนําไปประมวลผลตอไป

ถาไฟลนั้นถูกใชงานสําหรับเขียนขอมูลหรือแสดงขอมูลออกทางจอภาพหรือเคร่ืองพิมพ จะเรียกเปน

output file stream ถาไฟลนั้นถูกเปดขึ้นมาเพื่ออานขอมูลจากไฟลนําเขาไปสูหนวยความจําของคอมพิวเตอรจะ

เรียกวา input file stream การใชงานแฟมขอมูลจะตองอางไฟล fstream.h ไวที่สวนตนของโปรแกรม ในไฟล

fstream.h นี้จะมีการนิยามคลาส ofstream และ ifstream สําหรับใชกับ output file stream และ input file

stream ตามลําดับ instance ของคลาสเหลานี้จะใชเคร่ืองหมาย << (insertion operator) และ เคร่ืองหมาย

>> (extraction operator) เหมือนกับ stream อื่น ๆ

ภาพตอไปนี้แสดงความสัมพันธระหวาง stream กับส่ิงที่เก่ียวของ อาจมอง stream เหมือนกับทอน้ําที่

นําขอมูลเขาหรือออกจากโปรแกรมไปยังตนทางหรือปลายทาง (from page 396 Schaum’s outline)

Page 74: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ในกรณีขอมูลที่ใชในการคํานวณมีปริมาณมาก การปอนขอมูลเขาทางแปนพิมพยอมไมสะดวก หรือ

บางคร้ังขอมูลที่ได ไดมาจากเคร่ืองมือวัด (probe or sensor) ซึ่งเก็บขอมูลตามระยะเวลาท่ีกําหนด ขอมูลที่เก็บ

ไดจะถูกบันทึกไวในรูปแฟมขอมูล โปรแกรมสามารถดึงขอมูลจากแฟมนั้นมาประมวลผลไดทันที

การเขียนโปรแกรมที่ใชงานแฟมขอมูลจะตองกําหนดไฟลสวนหัว (header file) ไวดังนี้

#include <fstream>

ไฟล fstream.h จะเก็บขอมูลที่เก่ียวของกับการจัดการกับแฟมขอมูล กอนที่แฟมขอมูลแตละแฟมจะ

ถูกสรางขึ้นมา จะตองกําหนดเปนชนิดขอมูลที่เรียกวา file object สําหรับใชในการติดตอกับแฟมขอมูล เชนเรา

จะสรางไฟล ชื่อ data1.dat เพื่อไวเก็บขอมูล จะตองกําหนด file object ชื่อวา myfile (การกําหนดช่ือ file

object เปนไปตามเงื่อนไขเดียวกับ identifier ขอสําคัญตองส่ือความหมายและอานงาย) ไวใชติดตอเช่ือมโยงกับ

ไฟลดังกลาว โดยกําหนดดังนี้

fstream myfile;

file object ชื่อ myfile ที่กําหนดช้ึนมาน้ี จะถูกนําไปใชจัดการกับไฟล data1.dat โดยใชฟงกชัน open

ซึ่งประกอบดวยอากิวเมนต (argument) 2 ตัวคือ

fstream object_name;

object_name.open ( “filename”, access_mode);

สามารถเขียนรวมเปนบรรทัดเดียวกันไดดังนี้

fstream object_name (“filename”, access_mode);

อากิวเมนตตัวแรกเปนชื่อไฟล ปดหัวทายดวยเคร่ืองหมาย “..” (double quotes) ตัวที่สอง จะใชบอก

สถานะไฟลหรือลักษณะการเขาถึงตัวไฟล (access mode) วาจะบันทึกขอมูลลงในไฟล หรืออานขอมูลจากไฟล

นั้น

ถาตองการอานขอมูลจากไฟล จะตองกําหนดสถานะเปน ios:: in ถาตองการจะเขียนขอมูลลงในไฟล

จะตองกําหนดเปน ios: :out

ถาเราตองการอานขอมูลที่เก็บไวใน data1.dat จะตองเขียนคําส่ังในโปรแกรมดังนี้

myfile. open ( “data1.dat”, ios :: in);

Page 75: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

เม่ือกําหนดช่ือไฟลและสถานะของไฟลแลว เราสามารถนําขอมูลจากไฟลมาใชในการคํานวณ แทนที่

จะตองปอนผานแปนพิมพที่ละคา ซึ่งจะทดลองทําดังตอไปนี้

ขั้นแรกใหเปดโปรแกรมประเภท editor เชน Notepad ในวินโดว หรือ edit ใน DOS พิมพคะแนนของ

นักศึกษา 12 คน ดังนี้

ขอมูลบรรทัดแรกเปนจํานวนนักศึกษา ขอมูลในบรรทัดที่ 2 และ 3 จะเปนคะแนนของนักศึกษาท้ัง 12 คน จัดเก็บ

ขอมูลนี้ในไฟลชื่อ data1.dat โดยเก็บไวในโฟลเดอรที่เราจะสราง execute file จากนั้นเขียนและคอมไพล

โปรแกรมตอไปน้ี 1: // Program 3.6: findAv2.cpp 2: // Read data from file , data1.dat 3: #include <iostream> 4: #include <fstream> 5: using namespace std; 6: 7: main() { 8: int num=0; 9: double sum,score,average; 10: fstream myfile; 11: 12: myfile.open("data1.dat", ios::in); 13: myfile >> num; 14: sum = score = average = 0.0; 15: 16: for (int i=1 ; i <= num; i++) { 17: myfile >>score; 18: sum = sum + score; 19: } 20: average = sum/num; 21: cout << "The average of scores = " << average << endl; 22: myfile.close(); 23: return 0; 24: }

ผลการรันโปรแกรมจะเปนดังนี้

Page 76: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

เราสามารถนําขอมูลจากไฟลมาเก็บไวในตัวแปรโดยใชเคร่ืองหมาย >> (คลายกับ cin) ซึ่งเปนการรับ

ขอมูล

myfile >> num;

เปนการนําขอมูลคาแรก (คือ 12) มาเก็บไวในตัวแปร num จากนั้นวนรอบอีก 12 คร้ัง เพื่ออานคะแนน

เขามาเก็บไวในตัวแปร score เม่ืออานขอมูลจากไฟลครบแลว ตองปดแฟมขอมูลกอนจบโปรแกรมเสมอ โดยใช

คําส่ัง

myfile.close ();

ตัวอยาง ตอไปนี้เปนขอมูลที่ไดจากการวัดอุณหภูมิเปน

องศาเซลเซียสที่เวลาตาง ๆ กัน ขอมูลจะถูกบันทึกไวใน

แฟมขอมูล ขื่อ temp.dat

ขอมูลที่ไดมีจํานวนหลายรายการ (record) เชนรายการที่ 1 เม่ือเวลา 5.20 น.วัดอุณหภูมิได 23 องศาเซลเซียส

ขอมูลเหลานี้อาจไดจากหัววัดอุณหภูมิ หรือเคร่ืองตรวจวัดอุณหภูมิ จํานวนรายการท่ีวัดไดมีจํานวนเทาใดนั้น จะ

ใชฟงกชัน eof () ( end of file) ตรวจสอบหาจุดส้ินสุดของไฟล จากนั้นจะหาคาเฉล่ีย คาสูงสุด และคาตํ่าสุดของ

อุณหภูมิ ในชวงเวลาท่ีเก็บขอมูล 1: // Program 3.7- temp.cpp 2: // Read data from file , temp.dat 3: #include <iostream> 4: #include <fstream>

Page 77: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

5: using namespace std; 6: 7: main() { 8: int num=0; 9: double time; 10: double temp; 11: double max, min, average, maxtime, mintime; 12: double sum; 13: fstream myfile; 14: 15: sum = max =average = 0; 16: min = 1000; 17: myfile.open("temp.dat", ios::in); 18: if (myfile.fail() ) { 19: cout << "Error opening temp.dat\n"; 20: return 1; 21: } 22: myfile >> time >> temp; 23: while (!myfile.eof()) { 24: 25: sum = sum + temp; 26: if (temp > max) { 27: maxtime = time; 28: max = temp; 29: } 30: if ( temp < min ) { 31: mintime = time; 32: min = temp; 33: } 34: num++; 35: 36: // cout << num << " " << time << " " << temp << endl; 37: myfile >> time >> temp; 38: } 39: average = sum/num; 40: 41: cout << "The number of record = " << num << endl; 42: cout << "Max temperature is " << max 43: << " at time = " << maxtime << endl; 44: cout << "Min temperature is " << min 45: << " at time = " << mintime << endl; 46: 47: cout << "Average temperature = " << average << endl; 48: myfile.close(); 49: return 0; 50: 51: } ผลของการรันโปรแกรม เปนดังภาพ

Page 78: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ทดลองพลิกแพลงเพื่อตรวจสอบการอานไฟลของภาษา C++

จะเห็นวาจะมีการอานคาเวลาและอุณหภูมิมาเก็บไวที่ตัวแปร time , temp ในบรรทัดที่ 22 กอน แลว

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

ในบรรทัดที่ 37 บรรทัดที่ 36 จะไวใชตรวจสอบขอมูลที่อานเขามา วาถูกตองหรือไม

ถาจะพลิกการอานขอมูลจากไฟลใหเปนแบบอื่น ๆ บางดังตัวอยางตอไปนี้ 1: // Program 3_19. temp2.cpp 2: // Read data from file , temp.dat 3: #include <iostream> 4: #include <fstream> 5: using namespace std; 6: 7: main() { 8: int num=0; 9: double time; 10: double temp; 11: double max, min, average, maxtime, mintime; 12: double sum; 13: fstream myfile; 14: 15: sum = max =average = 0; 16: min = 1000; 17: myfile.open("temp.dat", ios::in); 18: if (myfile.fail() ) { 19: cout << "Error opening temp.dat\n"; 20: return 1; 21: } 22: while (!myfile.eof()) { 23: myfile >> time >> temp; 24: 25: sum = sum + temp; 26: if (temp > max) { 27: maxtime = time; 28: max = temp; 29: } 30: if ( temp < min ) { 31: mintime = time; 32: min = temp; 33: } 34: num++; 35: 36: cout << num << " " << time << " " << temp << endl; 37: } 38: average = sum/num; 39: 40: cout << "The number of record = " << num << endl; 41: cout << "Max temperature is " << max 42: << " at time = " << maxtime << endl; 43: cout << "Min temperature is " << min 44: << " at time = " << mintime << endl; 45: 46: cout << "Average temperature = " << average << endl; 47: myfile.close(); 48: return 0; 49:

Page 79: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

50: } 51: จากตัวอยางนี้จะเห็นวา จะทําการอานขอมูลสุดทาย 2 คร้ัง ทําใหจํานวนขอมูลกลายเปน 20 รายการ ผลที่

ตามมาคือคํานวณคาเฉล่ียผิดพลาด

ทดสอบโดยการเปล่ียนคําส่ังบางคําส่ัง ดังที่พิมพไวดวยตัวหนา ในโปรแกรม temp3.cpp

1: // Program 3_19. temp3.cpp 2: // Read data from file , temp.dat 3: #include <iostream> 4: #include <fstream> 5: using namespace std; 6: 7: main() { 8: int num=0; 9: double time; 10: double temp; 11: double max, min, average, maxtime, mintime; 12: double sum; 13: fstream myfile; 14: 15: sum = max =average = 0; 16: min = 1000; 17: myfile.open("temp.dat", ios::in); 18: if (myfile.fail() ) { 19: cout << "Error opening temp.dat\n"; 20: return 1; 21: } 22: while (myfile >> time >> temp) { 23: 24: sum = sum + temp; 25: if (temp > max) { 26: maxtime = time;

Page 80: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

27: max = temp; 28: } 29: if ( temp < min ) { 30: mintime = time; 31: min = temp; 32: } 33: num++; 34: 35: cout << num << " " << time << " " << temp << endl; 36: } 37: average = sum/num; 38: 39: cout << "The number of record = " << num << endl; 40: cout << "Max temperature is " << max 41: << " at time = " << maxtime << endl; 42: cout << "Min temperature is " << min 43: << " at time = " << mintime << endl; 44: 45: cout << "Average temperature = " << average << endl; 46: myfile.close(); 47: return 0; 48: 49: } 50:

ผลการรันโปรแกรม พบวาเปนไปอยางถูกตอง ดังรูป

การบันทึกขอมูลลงในแฟมขอมูล

การบันทึกขอมูลเก็บไวในแฟมขอมูลก็เหมือนกับการแสดงผลที่จอภาพ ตางกันตรงที่ขอมูลถูกเขียนลง

ในแผนดิสก การบันทึกขอมูลตอไปนี้จะบันทึกเฉพาะตัวขอมูลลวน ๆ ไมมีสวนหัวที่ใชบอกจํานวนrecord หรือ

สวนทายของขอมูล

Page 81: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ตัวอยาง การบันทึกขอมูลตอไปนี้จะบันทึกคาความสูงและระยะไกลของวัตถุ ที่มีการเคล่ือนที่แบบวิถีโคงภายใต

แรงโนมถวงของโลกที่เวลาตาง ๆกัน โดยเพิ่มเวลาชวงละ 0.5 วินาที กําหนดใหความเร็วตนของวัตถุเทากับ 24

m/s ทํามุม 60 องศากับแนวราบ สมการความเร็วและการกระจัดที่เวลา t ใด ๆ เปนไปตามสมการตอไปนี้

θcosuvx = θsinuvy =

tux θcos=

2

21sin gttuy −= θ

1: // Program Projectile.cpp 2: // write data to file , prj.dat 3: #include <iostream> 4: #include <iomanip> 5: #include <fstream> 6: using namespace std; 7: const double PI = 3.1416; 8: 9: main() { 10: double u, delta_t, x,y, t,g; 11: fstream projectile; 12: u = 24; 13: delta_t = 0.5; 14: g = 10; 15: cout << "Writing the projectile motion information " 16: << " \nTime (in sec) distance (m) and height (m) "; 17: projectile.open ("prj.dat", ios::out); 18: for (t=0; t <=5 ; t=t+delta_t ) { 19: x = u* cos (60*PI/180)*t; 20: y = u*sin( 60*PI/180)*t -0.5*g*t*t; 21: cout << setw(4) << setprecision(4) << t << " " 22: <<setw(8) << setprecision(4) << x << " " 23: << setprecision(4) << y << " \n "; 24: projectile << t << " " <<setprecision(4)<< x << " " <<setprecision(4)<< y << endl; 25: } 26: projectile.close(); 27: 28: return 0; 29: 30: }

เม่ือใหโปรแกรมทํางาน ผลลัพธที่คํานวณไดและจะถูกเก็บไวในไฟลชื่อ prj.dat แสดงออกที่จอภาพดังรูป

Page 82: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

เม่ือเปดไฟล prj.dat ดวยโปรแกรม editor ในที่นี้ใช notepad จะเห็นขอมูลที่เก็บไวดังภาพ

แบบฝกหัด

1. จงหาคาคําส่ังตอไปนี้

floor (-2.6) ceil (-2.6)

pow(2, -3) sqrt(floor(10,7))

2. การหดส้ันของความยาว (Length contraction) ในทฤษฎีสัมพัทธภาพพิเศษของไอนสไตน มีดังนี้

length = 2

2

0 1cvL −

เม่ือ 0L คือความยาวขอววัตถุเม่ืออยูนิ่งเทียบกับผูสังเกต

0v คือความเร็วชองวัตถุ

Page 83: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

c คือความเร็วของแสงในสุญญากาศ เทากับ 83 10× m/s

จงเขียนสมการน้ีใหอยูในรูปนิพจนคณิตศาสตรของคําส่ังในภาษา C++ จากนั้นเขียนเปนโปรแกรม ปอนคา

L0, v ผานทางแปนพิมพแลวคํานวณหาคา length

3. จงหาพื้นที่ของสามเหล่ียมที่มีดานแตละดานยาว a, b,c โดยใชสูตร

area = ))()(( csbsass −−−

เม่ือ s = 2

cba ++

โดยใหโปรแกรมหยุดรอรับคา a, b และ c จากแปนพิมพ

4. พิสัย(Range, R) ของมวลชิ้นหนึ่งที่เคล่ือนที่แบบวิถีโคงภายใตแรงดึงดูดของโลก หาไดจากสมการ

g

uR θ2sin2

=

เม่ือ u คือความเร็วตนของมวล

θ คือมุมของ u กับพื้นดิน

g = 9.8 m/s2

ใหปอนคาความเร็วตน (u) และมุมที่ยิงสูอากาศ θ

5. logarithm ของ x ฐาน b หาไดจาก

bxxb ln

lnlog =

จงเขียนโปรแกรมพิมพคา log ฐาน 2 เชน 2log 8 3=

6. จงแปลงคําส่ังในภาษา C++ ตอไปนี้ใหเปนนิพจนทางคณิตศาสตร

ก. dm = m* (sqrt(1+v/c)/sqrt(1 – v/c)-1);

ข. volume = PI * r * r *h;

ค. P = atan2(z, sqrt(x*x + y*y));

7. ให n เปนจํานวนเต็ม (integer) x เปนจํานวนจริง (floating point number) คําส่ังตอไปนี้ตางกันอยางไร

n = x;

และ n = static_cast<int> (x +0.5);

x มีคาเทาใด จึงจะไดผลลัพธจากทั้งสองคําส่ังเหมือนกัน และ x มีคาเทาใด ที่ทําใหผลลัพธแตกตางกัน

และจะเปนอยางไรถา x ติดลบ

8. จงอธิบายความแตกตางระหวาง

2, 20, “2”, “2.0”

9. ผลลัพธจากคําส่ังตอไปนี้ เปนอยางไร

x = 2;

y = x + x;

และ

Page 84: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

s = “2”;

t = s + s;

10. จริงหรือเท็จ

ก. x และ “x” มีคาเทากัน ถา x เปนจํานวนเต็ม

ข. static_cast <int> (static_cast<double>(x) จะมีคาเทากับ x ถา x เปนจํานวนเต็ม

ค. s.substr(0, s.length()) มีคาเทากับ s

11. จงอธิบายความแตกตางระหวางการปอนขอมูลเปนคํา (word oriented) และเปนบรรทัด (line oriented) ใน

ภาษา C++ ทําไดอยางไร เม่ือใดจะใชแบบไหน

12. จงหา syntax error จากโปรแกรมตอไปนี้ ( 5 แหง) 1: #include iostream 2: int main(); 3: { cout << "Enter your number : " 4: cin >> a, b; 5: cout << "The sum of << a << " and" << b 6: << " is " << a+b << endl; 7: return; 8: } 9: 10: เฉลย บรรทัดที่1 ตองมี <iostream> และมีคําส่ัง using namespace std;

บรรทัดที่ 2 หลังคําส่ัง main() ตองไมมี ;

บรรทัดที่ 4 ตองประกาศตัวแปร a, b และตองเปล่ียนเปน cin >> a >> b ;

บรรทัดที่ 7 แกเปน return 0;

13. จงหา logic error ของโปรแกรมตอไปนี้ ( 3 แหง) 1: #include <iostream> 2: using namespace std; 3: 4: int main(); 5: { 6: int total; 7: int x1, x2; 8: cout << "Enter your number : "; 9: cin >> x1; 10: total = total + x1; 11: cout << "Enter another number : "; 12: cin >> x2; 13: total = total +x1; 14: float average = total/2; 15: cout << "The average of the two number is " << average << endl; 16: 17: return 0; 18: 19: }

เฉลย บรรทัดที่ 10 ตอง initialize คา total กอนนําไปใชงาน

บรรทัดที่ 13 ควรเปน total = total + x2

Page 85: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

บรรทัดที่ 14 มีการคํานวณโดยใชขอมูลตางชนิดกัน โดยไมมีการ casting

Page 86: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

บทที่ 4 การเขียนฟงกชันใชงาน

การทํางานของโปรแกรมในภาษา C++ จะเร่ิมตนที่ฟงกชัน main( ) โปรแกรมหนึ่ง ๆ อาจะประกอบดวย

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

ชุดคําส่ังชุดที่ 2 อาจเรียงลําดับขอมูล ชุดคําส่ังที่ 3 คํานวณหาคาเฉล่ีย ชุดคําส่ังที่ 4 อาจทําหนาที่แสดงผลออกที่

จอภาพ เปนตน การนําชุดคําส่ังซึ่งทํางานในหนาที่ตาง ๆ กัน ไปรวมกันอยูในฟงกชัน main( ) ทั้งหมด ทําให

โปรแกรมมีลักษณะซับซอน คําส่ังที่เรียงลดหล่ันกันมาทําใหดูลายตา อานไดยาก ขาดคุณสมบัติที่เรียกวาเรียบ

งาย สบายตา (Simplicity and readability) เราจึงนิยมนําชุดคําส่ังที่ทําหนาที่ประมวลผลงานหนึ่ง ๆ ไปเขียน

รวมกันเปนฟงกชัน หรือ เรียกทั่ว ๆ ไป เปน มอดุล (module)

ฟงกชันในภาษา C++ อาจนํามาจากฟงกชันสําเร็จรูป ที่มีอยูใน standard C++ Library เชน setw

(ใชกําหนดความกวางของฟลดที่จะแสดงผลจํานวนเลข) หรือ sqrt ใชหาคารากท่ีสองของจํานวนจริงใด ๆ

ฟงกชันใดที่โปรแกรมเมอรเขียนขึ้นมาเพื่อใชประมวลผลงานหนึ่ง ๆ เรียกวา programmer defined function

แนวคิดเร่ืองฟงกชัน เกิดจากแนวคิดการแกปญหาแบบ Divide and conquer แบงปญหาออกเปน

สวนยอย ๆ (module) สวนยอย ๆ นี้จะทําหนาที่แกปญหาในสวนน้ัน ๆ ใหสมบูรณในตัวมันเอง มีลักษณะงาย

และเขาใจขั้นตอนการทํางานไดไมยากนัก

ประโยชนการแบงโปรแกรมยาว ๆ ใหเปนฟงกชัน คือ ฟงกชันมีการทํางานตามจุดประสงคทีแนนอน

เราอาจเขียนโปรแกรมตรวจสอบการทํางานของฟงกขัน โดยแยกออกจาโปรแกรมหลัก เพราะฟงกชันมีขนาดเล็ก

การตรวจสอบจึงทําไดงายและสะดวกกวา ฟงกชันใดเม่ือผานการตรวจสอบมาดีแลว เม่ือนําไปใชรวมกับ

โปรแกรมหลัก ก็ไมจําเปนตองตรวจสอบซํ้าตรงฟงกชันนี้อีก เชน เขียนฟงกชันหาคาเฉล่ียของจํานวนเลข n ชุด

เม่ือตรวจสอบแลวพบวาการทํางานของฟงกชันนี้ไมมีขอบกพรอง เราสามารถนําฟงกชันไปใชในโปรแกรมอื่น ๆที่

ตองการหาคาเฉล่ียไดอีกดวย วิธีการเขียนฟงกชันเพียงคร้ังเดียวแลวนําไปใชกับโปรแกรมอื่น ๆ ไดโดยที่ไมตอง

เขียนโปรแกรมซ้ํานี้ เรียกวา การนํากลับมาใชใหม (reusability) เปนการประหยัดเวลาในการพัฒนาโปรแกรม

ขนาดใหญ ๆ ไดเปนอยางมาก

การเขียนโปรแกรมในลักษณะ มอดุล หรือฟงกชันนี้ชวยลดความยาวและความซับซอนของโปรแกรม

ชุดคําส่ังบางคําส่ังที่อาจเกิดขึ้นซ้ํา ๆ ตรงสวนตาง ๆ ของโปรแกรม เม่ือถูกนําไปทําเปนมอดุล หรือฟงกชัน

ชุดคําส่ังที่ปรากฏซํ้า ๆ นั้น จะถูกเขียนแทนดวยคําส่ังที่เรียกใชฟงกชันนั้นเพียงบรรทัดเดียว

การแบงโปรแกรมขนาดใหญออกเปนมอดุล ทําใหโปรแกรมเมอรหลาย ๆ คนสามารถทํางานคูขนานกัน

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

โครงการ ทําใหระยะเวลาในการเขียนโปรแกรมในโครงการหนึ่ง ๆ ส้ันลง

ฟงกชันหรือมอดุลหนึ่ง ๆ ซึ่งถูกเขียนใหประมวลผลงานหนึ่งสําเร็จตามจุดประสงคนั้นเปนการสนับสนุน

แนวคิดที่เรียกวา ซอนรายละเอียดที่ไมจําเปนตองรู (abstraction) ฟงกชันประกอบดวยรายละเอียดของขั้นตอน

ในการทํางานช้ินนั้น โปรแกรมเมอรสามารถอางถึงหรือเรียกใชฟงกชันนั้นโดยไมตองสนใจในรายละเอียดของ

ฟงกชันนั้นวามันทํางานอยางไร อาจมองฟงกชันหรือมอดุล เปน “กลองดํา” (black box) เพียงปอนขอมูลอินพุต

ใหถูกตอง ก็จะไดผลลัพธจากกลองดํานั้น ใน standard C++ library มีฟงกชันใชคํานวณหารคาล็อกการิธึม

เราสามารถนําฟงกชันนั้นมาหาคา log ของจํานวนใด ๆ ไดโดยไมตองไปรูในรายละเอียดวาฟงกชันนั้นใชวิธีเปด

Page 87: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ตารางหาคา log หรือคํานวณโดยใชการประมาณคาจากอนุกรม การซอนรายละเอียดจะชวยลดเวลาการพัฒนา

โปรแกรม และเพิ่มความม่ันใจวาโปรแกรมไมมีขอผิดพลาด (increase its quality)

ฟงกชันหนึ่ง ๆ ควรมีความยาวเทาใด ถึงแมจะไมมีการจํากัดความยาวของชุดคําส่ัง โปรแกรมเมอร

หลายคนเสนอแนะวา ฟงกชันควรมีขนาดยาวพอเหมาะกับ 1 จอภาพ เพื่อที่สามารถอานคําส่ังในฟงกชันได

ตลอด ฟงกชันที่มีขนาดเล็กนั้นงายตอทําความเขาใจและการแกไข ฟงกชันหนึ่งควรทํางานหรือเกิดผลลัพธเพียง

1 งาน ถาเขียนฟงกชันใดแลวพบวามันยาวเกินไป แสดงวาควรแตกฟงกชันนั้นออกเปนฟงกชันยอย ๆ อีกไดแลว

จะแสดงตัวอยางการเขียนโปรแกรมที่ประกอบดวยฟงกชันที่เราเขียนขึ้นใชเองดังนี้

ตัวอยาง 4.1 เม่ือปอนคารัศมีของวงกลม โปรแกรมจะคํานวณหาพื้นที่ของวงกลมและเสนรอบวง 1: // Program 4.1 Circle.cpp 2: // Feb16, 2004 3: #include <iostream> 4: using namespace std; 5: 6: float find_area(float); 7: float compute_perimeter(float); 8: float input_radius(void); 9: void display_result(float); 10: 11: int main() { 12: float area, circumference; 13: float r; 14: r = input_radius(); 15: cout << "Calculating area of a circle \n"; 16: area = find_area(r); 17: display_result( area); 18: cout << "Compute circumference of this circle \n"; 19: circumference = compute_perimeter(r); 20: display_result(circumference); 21: return 0; 22: } 23: 24: float input_radius() { 25: float radius; 26: cout << "Input a radius of circle : "; 27: cin >> radius; 28: return radius; 29: } 30: 31: float find_area(float radius) { 32: float a; 33: a = 3.14159 * radius * radius; 34: return a; 35: } 36: 37: float compute_perimeter(float radius) { 38: return (3.14159*2*radius); 39: } 40: 41: void display_result(float result) { 42: cout << "The result : " << result << endl; 43: }

Page 88: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

จากตัวอยาง 4.1 จะแบงตัวงานออกเปน 4 งานยอย ๆ คือ สวนที่ทําหนาที่รับขอมูลไดแกฟงกชัน

input_radius ( ) สวนที่ 2 เปนสวนที่คํานวณหาพื้นที่ของวงกลม ฟงกชัน find_area สวนที่ 3 ทําหนาที่คํานวณ

ความยาวเสนรอบวงกลม compute_perimeter ( ) สวนที่ 4 เปนสวนที่แสดงผลการคํานวณ คือฟงกชัน

display ( ) งานแตละสวนถูก แยกเขียนเปนฟงกชัน 4 ฟงกชัน จะเห็นวาจํานวนบรรทัดในฟงกชัน main ( ) ซึ่ง

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

แตละสวน เชนคํานวณหาพื้นทีอยางไร จะถูกซอนไวในฟงกชัน

ฟงกชันที่เขียนขึ้นใชเองจะประกอบดวย 2 สวนใหญ คือ สวนหัว (header) และสวนท่ีเปนรางของ

ฟงกชัน (body)

สวนหัวของฟงกชัน มีรูปแบบการเขียนดังนี้

return_type function_name ( [ type [ parameter_name] ] ,…)

เชน ฟงกชัน find_area จะมีสวนหัวของฟงกชัน ในบรรทัดที่ 31

จะเห็นวาไมตองมี เซมิโคลอน ตอทาย

หมายเลข 1 คือ return type คือชนิดของขอมูลที่ฟงกชันสงคากลับคืนไปยังโปรแกรมที่เรียกใชงาน

หมายเลข 2 คือ function name เปนชื่อของฟงกชัน การต้ังชื่อฟงกชันมีกฎเกณฑเชนเดียวกับการต้ังชื่อตัวแปร

ตองขึ้นตนดวยตัวอักษรเทานั้น อักษรถัดไปจะเปนตัวเลขหรือตัวอักษรหรือเคร่ืองหมาย under score ผสมปน

กันก็ได ชื่อของฟงกชันจะยาวเทาใดก็ได แตคอมไพเลอรจะเก็บชื่อฟงกชันไวเพียง 32 ตัวอักษรแรกเทานั้น ชื่อ

ฟงกชันควรต้ังใหสอดคลองและส่ือความหมายกับงานที่ฟงกชันทํา เพื่อทําใหการอานโปรแกรมแลวสามารถ

เขาใจไดงาย

ตัวอักษรตัวพิมพใหญและตัวพิมพเล็ก จะทําใหฟงกชันกลายเปนฟงกชันคนละฟงกชันกัน เชน

find_area และ Find_Area ถือวาเปนคนละฟงกชันกัน

หมายเลข 3 จะอยูในวงเล็บเรียกวา parameter list ฟงกชัน find_area มีพารามิเตอรที่ใชในฟงกชันเพียง 1 ตัว

คือ float radius สวนที่เปน body ของฟงกชันจะนําพารามิเตอรเหลานี้ไปใชในการทํางาน

สวนที่จัดวาเปน body ของฟงกชันจะอยูระหวางวงเล็บปกกา ประกอบดวยสวนที่เปนประกาศของตัว

แปรที่ใชงานในฟงกชัน ตามดวยประโยคคําส่ังตาง ๆ ที่ฟงกชันนั้นทํางาน และจะปดทายดวยคําส่ัง return ดัง

ปรากฏในบรรทัดที่ 34

คําส่ัง return เปนการจบการทํางานของฟงกชันนั้นและสงคาที่ฟงกชันนั้นทํางานไดกลับไปใหกับ

โปรแกรมที่เรียกใชฟงกชันนั้นใชงาน ฟงกชันหนึ่ง ๆ สงคาคืนกลับไดเพียงคาเดียว ฟงกชันอาจทํางานโดยไมมี

การสงคาคืนกลับก็ได ดังเชน ฟงกชัน display( ) ในบรรทัดที่ 41

Page 89: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

คําส่ัง void หมายถึง ฟงกชันนี้ไมมีการสงคาคืนกลับไปยังโปรแกรมที่เรียกใชงาน

ยอนกลับไปดูโปรแกรม 4.1 อีกคร้ัง จะเห็นโปรแกรมที่มีการแบงเปนสวนยอย ๆ แตกเปนฟงกชันนั้น

จะเก่ียวของกับสวนตาง ๆ ดังนี้

สวน A เรียกวา การกําหนดรูปแบบฟงกชัน (function prototype) กอนที่จะนําไปใชงาน (ในภาษา C

ไมจําเปนตองมีสวนนี้)

สวน B เรียกวา function definition ประกอบดวยสวนหัวและสวนที่เปนรางของฟงกชัน สวนน้ีจะอยู

กอน main( ) หรือหลังก็ได

สวน C คือสวนที่มีการเรียกใชฟงกชัน (function call)

Page 90: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ฟงกชันที่เปนมาตรฐานใน Library การกําหนดรูปแบบฟงกชัน จะมีการกําหนดไวเรียบรอยแลวใน

include file

ตอไปนี้เปนตัวอยางการเขียน function prototype เพิ่มเติม

long calculate_rectangle (long length, long width);

คํานวณพื้นที่ส่ีเหล่ียมผืนผาสงคากลับเปนจํานวนเต็มชนิด long มีพารามิเตอร 2 ตัวคือ length และ

width ซึ่งเปนตัวแปรชนิด long ดวยกันทั้งคู

void print_result (int number);

ฟงกชัน print_result ไมมีการสงคากลับ มีพารามิเตอรเปนขอมูลชนิดจํานวนเต็ม 1 ตัว

int get_your_selection ( );

สงคากลับเปนขอมูลชนิดจํานวนเต็ม ไมมีพารามิเตอร

myfunction ( );

สงคากลับเปนขอมูลประเภท int ไมมีพารามิเตอร

ขอบเขตของตัวแปรและฟงกชัน

ตัวแปรที่ถูกประกาศไวภายในบล็อกหรือฟงกชันหนึ่ง จะถูกจํากัดการใชงานไดเพียงภายในบล็อกนั้น

หรือภายในฟงกชันนั้นเทานั้น เรียกตัวแปรประเภทน้ีวาเปนตัวแปรทองถ่ิน (local variable) คําส่ังอื่น ๆ นอก

บล็อกนั้นหรือฟงกชันอื่น ไมสามารถนําตัวแปรนั้นมาใชงานได

ในโปรแกรม 4.1 ตัวแปรที่ประกาศไวในฟงกชัน main คือ area, circumference, r ตัวแปรเหลานี้จะ

ถูกใชงานภายในฟงกชัน main ฟงกชันอื่น ๆ ไดแก find_area, input_radius, compute_perimeter ไม

สามารถนําคาที่เก็บไวในตัวแปรมาใชในการทํางานได ในทํานองเดียวกัน ในฟงกชัน input_radius จะมีตัวแปร

radius ชนิด float ใชงานไดในฟงกชันนี้เทานั้น ฟงกชัน main หรือ ฟงกชันอื่น ไมสามารถนําตัวแปรนี้ไปใชงานได

ในฟงกชัน find_area มีตัวแปรชื่อ area ซึ่งเปนตัวแปรชนิด float มีชื่อซํ้ากับตัวแปร area ทีปรากฏในฟงกชัน

main ถือวาเปนตัวแปรคนละตัวกัน ตัวแปรจะยึดครองหนวยความจํา ขณะที่ฟงกชันนั้น หรือบล็อกคําส่ังนั้น

ทํางาน เม่ือบล็อกหรือฟงกชันนั้นส้ินสุดการทํางาน ตัวแปรเหลานั้นจะไมถูกลบจากหนวยความจําทันทีทันใด ตัว

แปรเหลานั้นจะคงอยูในหนวยความจําอีกถามีการทํางานในบล็อกนั้นหรือในฟงกชันนั้นซ้ําอีกคร้ัง

ตัวอยางตอไปนี้ จะแสดงใหเห็นถึงขอบเขตของตัวแปรในบล็อกและฟงกชัน 1: // Program 4.2 Demonstrate variable scope 2: // Feb 16, 2004 3: #include <iostream> 4: using namespace std; 5: 6: void displaynumber(void); 7: 8: main() { 9: int number = 3; 10: cout << "\n In main, value of number = " << number << endl; 11: // now call displaynumber for displaying a nubmer 12: displaynumber(); 13: //back to main program 14: cout << "\n Back in main value of number : " << number << endl; 15: return 0; 16: }

Page 91: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

17: 18: void displaynumber() { 19: int number = 5; 20: cout << "number in function before enter loop is " << number << endl; 21: for (int number = 1 ; number <= 10 ; number++) { 22: cout << "Number in FOR loop = " << number << endl; 23: } 24: cout << " Numberr in funciton after out of loop is " << number <<endl; 25: } 26:

โปรแกรม 4.2 เร่ิมตนที่ main ( ) ภายในฟงกชัน main( ) มีการกําหนดตัวแปรชนิด int ชื่อ number ให

มีคาเปน 3

บรรทัดที่ 10 เม่ือพิมพคา number จะไดผลลัพธเทากับ 3 บรรทัดที่ 12 เรียกใชฟงกชัน

displaynumber() ในฟงกชันนี้มีตัวแปรทองถ่ิน ชื่อ number เหมือนกัน แตกําหนดใหมีคาเปน 5 และจะ

แสดงผล number มีคาเทากับ 5

ในการวนรอบดวยคําส่ัง for ในบรรทัดที่ 21 มีการประกาศคาตัวแปร ชื่อ number (เปนตัวแปรตัวที่ 3 ที่

มีชื่อ number เหมือนกัน) โดยใหวนรอบ เร่ิมต้ังแต number = 1 วนรอบจํานวน 10 คร้ัง ในแตละคร้ังจะแสดงคา

number บนจอภาพ จะเห็นวาคา number จะมีคาต้ังแต 1 ถึง 10 เม่ือวนรอบจบแลว ใหแสดงผล number อีก

คร้ัง ดังปรากฏในคําส่ังบรรทัดที่ 24 ขณะนี้ การทํางานของโปรแกรมออกมานอกขอบเขตของการวนรอบของ

คําส่ัง for แลว ดังนั้นคา number ที่ไดในบรรทัดที่ 24 นึ้จึงเปนคาของตัวแปร number = 5 ที่กําหนดไวในฟงกชัน

displaynumber ()

เม่ือส้ินสุดการทํางานชองฟงกชันในบรรทัดที่ 13 ใหแสดงผล number อีกคร้ัง บรรทัดที่ 14 จะนําคา

number = 3 แสดงผลบนจอภาพ จะเห็นวาคา number ที่กําหนดไวในฟงกชัน displaynumber( ) ไมมีผลตอตัว

แปรในฟงกชนั main ( )

โปรแกรมนี้แสดงใหเห็นขอบเขตการทํางานของตัวแปรที่ถูกกําหนดคาไวคนละที่เทานั้น ในทางปฏิบัติ

ควรกําหนดช่ือตัวแปรทั้งสามตัวใหมีชื่อตางกันไปจะดีกวา เพื่อลดความสับสน ขณะไลดูการทํางานของโปรแกรม

ตัวแปรแบบโกลบบอล (Global variable)

Page 92: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ตัวแปรที่นิยามไวนอกฟงกชันใด ๆ รวมทั้ง main ดวย เปนตัวแปรที่ทุกฟงกชันมองเห็นและสามารถ

นําไปใชงานได ในบางกรณีที่โปรแกรมเมอร ตองการใหฟงกชันทุกฟงกชันสามารถตําคาจากตัวแปรน้ีไปใชหรือ

เปล่ียนคาตัวแปรไดโดยไมตองผานขอมูลในตัวแปร้ีผานทางตัวพารามิเตอรของฟงกชัน โดยปกติดเราไมนิยมใช

ตัวแปรแบบโกลบบอลในภาษา C++ เพราะคอนขางเส่ียงตออันตราย ทั้งนี้เพราะการใชขอมูลรวมกันในตัวแปร

แบบโกลบบอล ฟงกชันอื่น ๆ ตางก็สามารแกไขขอมูลในตัวแปร โดยมิไดต้ังใจ อาจทําใหโปรแรกมเกิด

ขอผิดพลาดและการแกไขทําไดลําบาก

ตัวแปรทองถ่ินถึงแมจะมีชื่อเดียวกันกับตัวแปรแบบโกลบบอล ก็จะไมกระทบกระเทือนถึงขอมูลที่เก็บ

ไวในตัวแปรแบบโกลบบอล การอางถึงตัวแปรในฟงกชันใดที่มีขื่อซํ้ากัน จะหมายถึงตัวแปรประจําถ่ินในฟงกชัน

นั้น 1: // Program 4.3 global variable demonstration 2: // Feb 16, 2004 3: #include <iostream> 4: using namespace std; 5: 6: void displayvar(); //function prototype 7: int x =10; // Global variables 8: int y = 20; 9: 10: main() { 11: int x = 5; 12: cout << "\n In main, x = " << x << endl; 13: cout << "\n In main, y = " << y << endl; 14: cout << " ----------------------" << endl; 15: // now call displayvar 16: displayvar(); 17: //back to main program 18: cout << " ----------------------" << endl; 19: cout << "\n In main again, x = " << x << endl; 20: cout << "\n In main again, y = " << y << endl; 21: cout << "\n Global x = " << ::x << endl; 22: return 0; 23: } 24: 25: void displayvar() { 26: int x = 2; 27: cout << "\n In function, x = " << x << endl; 28: cout << "\n In function, y = " << y << endl; 29: } 30:

Page 93: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

จากโปรแกรม 4.3 บรรทัดที่ 7 และ 8 เปนการประกาศตัวแปรชนิด int ชื่อ x และ y ซึ่งเปนตัวแปรแบบโกลบบอล

กําหนดให x = 10, y = 20 ตามลําดับ

บรรทัดที่ 12 และ 13 แสดงผลคา x และ y ในฟงกชันเนื่องจากไดมีการนิยามตัวแปร x ในฟงกชัน

main() ซ้ํากับตัวแปรโกลบบอล ผลลัพธที่ไดจึงเปนคา x ของตัวแปรทองถ่ิน และคา y ของตัวแปรโกลบบอล

เม่ือเรียกใชงานฟงกชัน displayvar( ) ในบรรทัดที่ 16 ฟงกชันนี้จะมีการนิยามและประกาศคาตัวแปร

1 ตัวคือ int x = 2 การแสดงคา x จึงใชคาตัวแปรทองถ่ิน

เม่ือฟงกชันทํางานจบกลับมาท่ี main ( ) แสดงผลคา x และ y อีกคร้ัง จะเปนคา x ในตัวแปรทองถ่ิน

และคา y ที่เก็บไวในตัวแปรแบบโกลบบอล

ในบรรทัดที่ 21 แสดงใหเห็นวาถาตองการเขาถึงขอมูลที่เก็บไวในตัวแปรโกลบบอล x ในฟงกชัน main

( ) ทําไดโดยใชเคร่ืองหมาย :: (scope resolution operator) กํากับหนาตัวแปร x

cout << “Global x << ::x << endl;

เคร่ืองหมายนี้บอกใหคอมไพเลอรรูวาตองการแสดงคา x ที่เก็บไวในตัวแปรแบบโกลบบอล ไมใชคาที่

เก็บไวในตัวแปรทองถ่ิน

การผานคา parameter ไปยังฟงกชัน (Passing parameter to function)

เม่ือมีการเรียกใชฟงกชันในโปรแกรมใด จะตองมีการผานคาพารามิเตอร ไปยังฟงกชัน ตามที่ประกาศ

ไวในการกําหนดรูปแบบฟงกชัน (Function prototype) การผานคาใน C++ มี 2 แบบดังนี้

1. การผานเฉพาะคาของตัวแปรนั้น (passing by value) ฟงกันจะสําเนานําเฉพาะขอมูลของตัวแปรที่

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

เดิม นั่นคือฟงกชันจะคัดลอกเฉพาะขอมูลจากตัวแปรที่สงผานและสรางตัวแปรที่มีชนิดขอมูลแบบเดียวกันใน

หนวยความจําคนละแหง

ในโปรแกรม 4.1 คําส่ังเรียกใชฟงกชัน find_area (float r) เปนการผานคา r (รัศมีของวงกลม) ไปให

ฟงกชัน find_area หาพื้นที่ของวงกลม ฟงกชัน find_area จะก็อปปเฉพาะคา r ไปใชในการคํานวณเทานั้น ไม

ทําใหคาที่เก็บไวนใน r มีการเปล่ียนแปลงแตอยางไร

Page 94: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

การผาน r ในการเรียกใชฟงกชัน computer_preimeter ก็เชนเดียวกัน เปนการผานคาแบบ passing

by value เพราะขอมูลในตัวแปรที่ใชในการผานคาไมมีการเปล่ียนแปลง การเขียนโปรแกรมจึงตองพึงระวัง ใน

กรณีที่ตองการใหฟงกชันนั้นมีการปรับปรุงขอมูล ตัวแปรที่ใชผานคา ดังตัวอยางตอไปนี้ 1: // Program 4.4 Demonstrate passing by value 2: // Feb 16, 2004 3: #include <iostream> 4: using namespace std; 5: 6: void swap(int, int); 7: 8: main() { 9: int x ,y; 10: x = 2; 11: y = 7; 12: cout << " x = " << x << " and y = " << y << endl; 13: swap(x,y); 14: cout << "After swap ..." << endl; 15: cout << " x = " << x << " and y = " << y << endl; 16: return 0; 17: } 18: void swap ( int a, int b) { 19: int temp; 20: temp = a; 21: a = b; 22: b = temp; 23: cout << "In function swap x = " << a << " and y = " << b << endl; 24: }

โปรแกรมนี้ตองการสลับคาระหวาง x กับ y โดยสรางฟงกชันชื่อ swap ใหทําการสลับคา จะเห็นวาเม่ือ

ผานคา x = 2, y = 7 ไปใหฟงกชัน swap ฟงกชันจะรับคาไปสลับไดอยางถูกตอง สังเกตจากการแสดงผลภายใน

ฟงกชัน จะได x = 7, y= 2

เม่ือฟงกชัน swap ทํางานเสร็จแลว กระโดดกลับมายังฟงกชัน main เม่ือแสดงผลคา x, y พบวายังคง

มีคาเทาเดิม คาที่เก็บไวในตัวแปร x, y ไมมีการสลับแตอยางใด

การผานคาแบบ passing by value นอกจากสามารถใชตัวแปรเปนตัวพารามิเตอรแลว ยังสามารถใช

คาคงท่ี หรือ นิพจน ในการผานคาไดดวย เชน

find_area ( 5 ) ; // คํานวณพื้นที่วงกลมรัศมี 5 หนวย

find_area ( 3*x + 7) ; // คํานวณพื้นที่วงกลมรัศมีเกิดจาก 3x + 7

display( find_area( 5) ) // แสดงผลลัพธที่ไดจากการคํานวณหาพื้นที่วงกลม เปนการใชฟงกชันเปน

พารามิเตอร

2. การผานโดยการอางอิงตําแหนงหนวยความจําของตัวแปรนั้น (passing by reference) ประโยชน

ของการผานคาโดยวิธีนี้คือฟงกชันสามารถเขาถึงตัวแปรใน calling program และใชในกรณีที่ตองการใหฟงกชัน

Page 95: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

สงคากลับคืนมากกวา 1 คา หรือตองการเปล่ียนแปลงคาตัวแปรหรือตัวแปรที่ใชผานคาใชเนื้อที่หนวยความจํา

มาก เสียเวลาในการคัดลอก เชนขอมูลรูปภาพขนาด 5 Mb เปนตน กลไกการผานคาแบบนี้จะตางจากการผาน

คาแบบ passing value คือ แทนที่จะสําเนาขอมูลในตัวแปรที่ใชเปนตัวพารามิเตอร กลับถือวาพารามิเตอรนั้น

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

ใหม

โปรแกรม 4.5 จะนําโปรแกรมที่ 4.4 มาปรับปรุงโดยใหการผานคาไปยังฟงกชัน swap เปนแบบอางอิง 1: // Program 4.5 Demonstrate passing by reference 2: // Feb 16, 2004 3: #include <iostream> 4: using namespace std; 5: 6: void swap(int&, int&); 7: 8: main() { 9: int x ,y; 10: x = 2; 11: y = 7; 12: cout << " x = " << x << " and y = " << y << endl; 13: swap(x,y); 14: cout << "After swap ..." << endl; 15: cout << " x = " << x << " and y = " << y << endl; 16: return 0; 17: } 18: void swap ( int& a, int& b) { 19: int temp; 20: temp = a; 21: a = b; 22: b = temp; 23: cout << "In function swap x = " << a << " and y = " << b << endl; 24: } 25:

ในการประกาศรูปแบบฟงกชัน swap มีส่ิงที่เพิ่มเติมจากเดิมดังนี้ void swap (int &, int & ) ; เคร่ืองหมาย & ๖ reference operator ) จะอยูตอทายชนิดของขอมูล ในที่นี้คือ int เปนสัญลักษณบอกวาเปน

การผานคาตัวแปรแบบอางอิง

int &a หมายถึง a จะเปนตัวใชอางอิงตัวแปรชนิด int ที่ถูกผานคามา (a is a reference to the int

variable passed to it) ในทํานองเดียวกัน int & b b จะเปนชื่อที่ใชเปนตัวอางอิงตัวแปรชนิด int ตัวที่ 2 ที่ถูก

ผานคามา a และ b จะมีตําแหนงในหนวยความจําเดียวกันกับ x, y ที่ผานคามา อาจกลาวไดวา a, b คือตัว

แปร x, y ที่ถูกเปล่ียนช่ือ

สังเกตเห็นไดอยางหนึ่งวา เราไมไดใชเคร่ืองหมาย & ในการเรียกใชฟงกชัน swap (x, y) ในบรรทัดที่

13 ดังนั้นการดูประโยคคําส่ังที่เรียกใชฟงกชัน จึงไมสามารถตัดสินไดเลยวาการผานคาพารามิเตอร เปนแบบสง

คาหรืออางอิงตําแหนง

การผานคาแบบอางอิงตําแหนง สามารถเขียนเปน

Page 96: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

int & x, int & y; หรือ

int &x, int &y; ก็ได

พารามิเตอรที่ใชในการผานคา ตองเปนตัวแปรเทานั้น ไมสามารถใชคาคงท่ีหรือสมการ หรือฟงกชันใน

การผานคาได

ตัวอยางตอไปนี้ จะอาศัยประโยชนจากการผานคาแบบอางอิง โดยไมตองอาศัยคําส่ัง return 1: // Program 4.6 Convert inch to centimeter 2: // Feb 16, 2004 3: #include <iostream> 4: using namespace std; 5: 6: void convert_inch2centimeter (float &); 7: 8: main() { 9: float length; 10: cout << " Input length in inch : "; 11: cin >> length; 12: convert_inch2centimeter(length); 13: cout << "In centimeter = " << length << endl; 14: 15: } 16: 17: 18: void convert_inch2centimeter (float & length) { 19: length = length *2.54; 20: 21: } 22:

เปรียบเทียบระหวางการผานคาแบบ passing by value กับ passing by reference จะไดดังนี้

Passing by value passing by reference

การประกาศฟงกชัน

float x;

myfunction (float x);

float &x;

myfunction (float &x);

x เปนตัวแปรทองถ่ิน x เปนตัวแปรทองถ่ินเชนกัน

ฟงกชันที่ถูกเรียกจะคัดลอกคาจากพารามิเตอรที่ใช

ผานคา

ฟงกชันที่ถูกเรียกจะมีตัวแปรเปนตัวเดียวกับ

พารามิเตอรที่ใชในการผานคา เพียงแตชื่อตัวแปร

ตางกัน

พารามิเตอรที่ใชในการผานคาไมมีการเปล่ียนแปลงคา

(read only)

สามารถเปล่ียนแปลงคาที่เก็บไวในพารามิเตอรที่ใช

ผานคา (read write)

พารามิเตอรที่ใชผานคาเปนไดทั้งคาคงท่ี ตัวแปร

สมการ

ใชตัวแปรเปนพารามิเตอรในการผานคาเทานั้น

Page 97: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

โปรแกรม 4.7 เปนการนําโปรแกรม 4.1 มาปรับปรุงโดยใชการผานคาแบบอางอิง จํานวนบรรทัดของโปรแกรมจะ

ส้ันลง 1: // Program 4.7 Circle2.cpp 2: // Feb16, 2004 3: #include <iostream> 4: using namespace std; 5: 6: void calculate_circle( float &, float &, float ); 7: 8: 9: int main() { 10: float radius, area, circumference; 11: float r; 12: cout << "Input radius : "; 13: cin >> radius; 14: calculate_circle(area, circumference, radius); 15: cout << "Area = " << area << endl ; 16: cout << "Circumference = " << circumference << endl; 17: 18: return 0; 19: } 20: 21: void calculate_circle(float &a, float &c, float r) { 22: const float PI = 3.141592653; 23: a = PI*r*r; 24: c = 2*PI*r; 25: 26: } ตัวอยางตอไปนี้เปนการตรวจสอบการผานคาแบบอางอิง ทดลองพิมพ คากอนสงผานคา และระหวางที่อยูใน

ฟงกชัน และหลังจากออกจากฟงกชัน 1: // Program 4.8 testRef.cpp 2: // Feb16, 2004 3: #include <iostream> 4: using namespace std; 5: 6: void change_value(float &); 7: 8: 9: int main() { 10: float x=50.8; 11: cout << "Before calling function :" << endl; 12: cout << " x = " << x << endl; 13: cout << "&x = " << &x << endl; 14: change_value( x ) ; // passing by reference 15: cout << "After calling function : " << endl; 16: cout << " x = " << x << endl; 17: return 0; 18: } 19: 20: void change_value( float &a) { 21: cout << "in called function .... "<< endl; 22: cout << " a = " << a << endl; 23: cout << "&a = " << &a << endl; 24: a = 21.2; 25: cout << "Now a = " << a <<endl;

Page 98: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

26: } 27:

การผานคาแบบอางอิง มีความเส่ียงตรงท่ีตัวแปรที่ใชเปนตัวพารามิเตอรถูกเปล่ียนแปลงคาได ใน

ภาษา C++ จึงมีทางเลือกที่ 3 ให คือ ผาน คา by constant reference เปนการผานคาเหมือนกับแบบอางอิง

ปกติทั่วไป แตฟงกชันจะมีการปองกันไมใหตัวแปรเปล่ียนคาระหวางที่ฟงกชันทํางาน

โปรแกรม 4.9 เปนตัวอยางการผานคาแบบ constant reference 1: // Program 4.9 test constant reference 2: // Feb16, 2004 3: #include <iostream> 4: using namespace std; 5: 6: void test_const_ref( int, int &, const int &); 7: 8: int main() { 9: int x,y,z; 10: x = 1; y =2; z = 3; 11: cout << "x = " << x << " y = " << y << " z = " << z << endl; 12: test_const_ref(x,y, z); 13: cout << "x = " << x << " y = " << y << " z = " << z << endl; 14: 15: return 0; 16: } 17: 18: void test_const_ref( int p, int &q, const int &r) 19: { 20: p=2*r; 21: q = r+5; 22: // r= q-3; 23: cout << "p = " << p << " q = " << q << " r = " << r << endl; 24: 25: } 26:

ถาทดลองเปล่ียนคา z โดยลบ comment ในบรรทัดที่ 22 ออก จะคอมไพลไมผาน มีการแจงขอความ

ผิดพลาด การผานคาโดยวิธี constant reference นิยมใชผานคา object ที่มีขนาดใหญ เชน array

Page 99: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

inline function

ฟงกชันชวยใหการเขียนโปรแกรมมีขนาดกะทัดรัดและอานงาย เม่ือผานการคอมไพลและถูกโหลดเขา

ไปในเคร่ืองแลว ไมส้ินเปลืองหนวยความจํา เพราะสวน binary code ของฟงกชันจะอยูในหนวยความจําเพียงที่

เดียว สวนอื่น ๆ ของโปรแกรมที่มีการเรียกใชฟงกชันนี้ ไมวาจะก่ีคร้ังก็ตาม คอมไพเลอรจะกําหนดใหกระโดดไป

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

หลังคําส่ังที่เรียกใชฟงกชันนี้

ขณะที่ไดประโยชนจากการประหยัดหนวยความจําในการเก็บชุดคําส่ังของฟงกชันนี้ บางคร้ังตอง

สูญเสียเวลาและหนวยความจําบางสวนในขณะท่ีมีการเรียกใชฟงกชัน ถาผานคาแบบ by value จะตองคัดลอก

คาของพารามิเตอรตาง ๆ เก็บไวในตัวแปรทองถ่ิน ตองเก็บตําแหนงหนวยความจําของคําส่ังที่เรียกใชฟงกชัน

เพื่อที่จะไดกระโดดกลับมาไดถูก เม่ือฟงกชันทํางานเสร็จแลว จะตองใชเวลาลบตัวแปรตาง ๆ ที่สรางไว และสง

คาคืนกลับไปยังตัวแปรชองโปรแกรมหลัก (ถาฟงกชันมีการสงคากลับคืน)

เพื่อลดเวลาการทํางานของโปรแกรม ถาฟงกชันนั้นมีขนาดส้ัน และถูกเรียกใชบอย ๆ จึงเลือกที่จะให

ฟงกชันนั้นฝงตัวอยูในโปรแกรมตรงสวนที่มีการเรียกใชทันที ยอมเสียเนื้อที่หนวยความจําเพื่อแลกกับเวลาการ

ทํางานที่เร็วขึ้น

การบอกใหคอมไพเลอรนําชุดคําส่ังของฟงกชันไปใสแทนตรงตําแหนงที่มีการเรียกใชฟงกชัน ทําไดโดย

เพิ่มคําวา inline ไวขางหนาฟงกชันนั้น 1: // Program 4.10 test inline funciton 2: // Feb16, 2004 3: #include <iostream> 4: using namespace std; 5: 6: inline float mile2km (float mile) { 7: return (8.0*mile/5.0); 8: } 9: 10: 11: int main() { 12: float m; 13: cout << "Enter Distance in mile : " ; 14: cin >> m; 15: cout << "Distance in kilometer = " << mile2km(m) ; 16: } 17:

มีขอปลีกยอยเก่ียวกับการใช inline function บางประการ คือ คอมไพเลอรจะตองมองเห็นตัวฟงกชัน

ทั้งหมด กอนที่จะมีการเรียกใชฟงกชัน (ไมใชเฉพาะการประกาศฟงกชัน) เพื่อที่จะไดแทรกชุดคําส่ังลงใน

โปรแกรมไดถูกตองตรงตําแหนงที่เรียกใช จากตัวอยางจะเห็นวา ฟงกชัน mile2km จึงถูกเขียนไวกอน main ()

ดังนั้นการประกาศฟงกชันกอนเรียกใชจึงไมจําเปน

เม่ือผานการคอมไพลแลว ภายในโปรแกรม main ( ) จะถูกแทนที่ดวยชุดคําส่ังที่อยูในฟงกชัน

mile2km ดังนี้

Page 100: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

int main() { float m; cout << "Enter Distance in mile : " ; cin >> m; cout << "Distance in kilometer = " << 8.0*mile/5.0; }

ฟงกชันเรียกใชตัวมันเอง (Recursion)

คือการที่ฟงกชันหนึ่ง ๆ เรียกใชตัวมันเอง มีอยู 2 แบบ คือ เรียกใชตัวมันเองโดยตรง (direct) และโดย

ออม คือการที่ฟงกชัน A เรียกใชฟงกชัน B และ ในฟงกชัน B นั้นก็มีการเรียกใชฟงกชัน A

การใชวิธีเรียกใชตัวมันเองแกปญหาบางปญหา ทําใหโปรแกรมนั้นดูงายและมีขนาดกะทัดรัด มักใชกับ

ปญหาที่กระทํากับขอมูลแตละตัว ในลักษณะที่มีวิธีการซ้ํา ๆ กัน การออกแบบฟงกชันแบบรีเคอชัน จะไดผลลัพธ

จากการประมวลผลสมตามความตองการ แตก็เสียงกับการวนรอบแบบไมรูจบและเกิด runtime error

เม่ือฟงกชันเรียกใชตัวมันเอง โปรแกรมจะสรางฟงกชันนั้นขึ้นในหนวยความจําอีกชุด ตัวแปรทองถ่ิน

ของฟงกชันอันหลังจะเปนคนละตัวกับตัวแปรของฟงกชันอันแรก ดังนั้นคาที่เกบไวในตัวแปรแตละชุดของฟงกชัน

จึงไมกระทบกระเทือนตอกัน

ตัวอยางปญหาที่ใชวิธี recursion ในการแกปญหาไดแกเลขอนุกรมของฟโบนัคซี (Fibonacci series)

ประกอบดวยเลขจํานวนเต็มตอไปนี้

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …….

เลขสองตัวคาแรกจะเปน 0 และ 1 เลขถัดจากนี้ไปจะเกิดจากการนําผลบวกของเลขสองจํานวนท่ีอยู

กอนหนารวมกัน หรือเลขตัวที่ n เกิดจากผลรวมของเลขเทอมท่ี n-2 และ n-1 โดยที่ n มากกวา 2

ฟงกชันเรียกตัวมันเองตองมีเงื่อนไขในการใหการเรียกตัวมันเองหยุดลง เชนในเร่ืองอนุกรมฟโบนัคซี

ฟงกชันจะหยุดการเรียกตัวมันเองเมื่อ n > 2

ขั้นตอนการทํางานจะเปนดังนี้

- ตองการเลขฟโบนัคซีที่ตําแหนง n

- เรียกใชฟงกชัน fibonacci (n)

- ฟงกชัน fibonacci (n) จะตรวจสอบอากิวเมนต n

ถา n < 3 จะคืนคากลับเทากับ 1

ถา n > 3 จะเรียกใชฟงกชัน fibonacci โดยผานคา n-2 และเรียกตัวมันเองอีกคร้ัง โดยผาน

คา n-1 แลวคืนคาที่เปนผลบวก

- ถาเรียกใชฟงกชัน fibonacci (0) จะสงคา 0 คืนกลับ

ถาเรียกใชฟงกชัน fibonacci (1) จะสงคา 1 คืนกลับ

ถาเรียกใชฟงกชัน fibonacci (2) จะสงคา 1 คืนกลับ

ถาเรียกใชฟงกชัน fibonacci (3)จะสงคา fibonacci (2) และ fibonacci (1) คืนกลับ เพราะ

fibonacci (2) สงคากลับมาเปน 1 และ fibonacci (2) สงคาคืนกลับมาเปน 1 ดังนั้น fibonacci (3)จะ

สงคากลับคืนมาเปน 2

Page 101: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

- ถาเรียกใชฟงกชัน fibonacci (4)จะสงคาผลบวกจากการเรียกใช fibonacci (3) และ fibonacci (2)

เพราะ fibonacci (3) สงคาคืนกลับมาเปน 2 โดยการเรียกใช fibonacci (2)และ fibonacci (1) fibonacci

(2)สงคาคืนกลับมาเปน 1 ดังนั้น fibonacci (4) จะไดผลลัพธเปน 3

- ถาเรียกใชฟงกชัน fibonacci (5)ฟงกชันจะสงคาผลบวกระหวางfibonacci (4) และ fibonacci (3)

เพราะ fibonacci (4) สงคาคืนกลับมาเปน 3 และ fibonacci (3) สงคาคืนกลับมาเปน 2 ผลรวมที่ fibonacci

(5) สงกลับมาคือ 5

ขั้นตอนการหาเลขฟโบนัคซีดังกลาวไมมีประสิทธิภาพนัก เพราะเม่ือเราหา fibonacci (20) จะตองมี

การเรียกใชตัวมันเองถึง 13,529 คร้ัง หรือ fibonacci (n) จํานวนคร้ังที่เรียกใชตัวมันเองคือ 2n ในการเรียกใช

ตัวมันเองแตละคร้ังจะตองสูญเสียหนวยความจําในการคัดลอกฟงกชัน เม่ือม่ีคําส่ัง return จึงจะปลดปลอย

หนวยความจําสวนนั้น 1: // Program 4.11 - demonstrates recursion 2: // Calculates the nth Fibonacci number 3: // Uses this algorithm: fibonacci(n) = fibonacci(n-1) + fibonacci(n-2) 4: // Stop conditions: n < 3 5: 6: #include <iostream> 7: using namespace std; 8: 9: long fibonacci(long n); 10: 11: int main() 12: { 13: 14: long n, result; 15: cout << "Enter number to find: "; 16: cin >> n; 17: 18: cout << "\n\n"; 19: result = fibonacci(n); 20: 21: cout << result << " is the " << n << "th Fibonacci number\n"; 22: return 0; 23: } 24: 25: long fibonacci (long n) 26: { 27: cout << "Processing fibonacci(" << n << ")... "; 28: 29: if (n < 3 ) 30: { 31: cout << "Return 1!\n"; 32: return (1); 33: } 34: else 35: { 36: cout << "Call fibonacci(" << n-2 << ") and fibonacci(" << n-1 << ").\n"; 37: return( fibonacci(n-2) + fibonacci(n-1)); 38: } 39: } 40: 41:

Page 102: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

เชนตองการหาเลขฟโบนัคซี เทอมที่ 35 หาไดดังนี้

การหาแฟคทอเรียลของจํานวนเต็มบวก n ใด ๆ เปนตัวอยางการแกปญหาแบบเรียกใชตัวมันเองท่ีดีอีกตัวอยาง

หนึ่ง เขียนเปนสัญลักษณทางคณิตศาสตรไดเปน n! อานวา n factorial หาไดจาก

n ! = n (n -1) (n – 2) ( n – 3)… 1

โดยที่ 1 ! = 1 และ 0 ! = 1

6! = (6)(5)(4)(3)(2)(1)

เราสามารถใชวิธีการวนรอบแบบธรรมดาคํานวณหาคา n! ไดดังนี้ factorial =1; for (int i = n; i >=1; i--) factorial = factorial * i; return factorial;

เม่ือใชวิธีแกปญหาโดยใชฟงกชันเรียกตัวมันเอง โปรแกรมที่สมบูรณจะเปนดังนี้ 1: // Program 4.12 - demonstrates recursion 2: // Calculates n factorial 3: 4: #include <iostream> 5: using namespace std; 6: 7: unsigned long factorial (unsigned long n); 8: 9: int main() 10: { 11: 12: unsigned long number; 13: 14: cout << "Enter positive integer : "; 15: cin >> number; 16: 17: cout << "\n\n"<< number << "! = " << factorial (number) <<endl; 18: 19: return 0; 20: } 21: 22: unsigned long factorial (unsigned long n) 23: { 24: 25: if (n <=1 ) return 1; 26: else 27: return n*factorial(n-1); 28: } 29:

ทดลองหา 33! จะไดผลลัพธดังภาพ

Page 103: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ฟงกชัน factorial รับคาพารามิเตอรชนิด unsigned long และคืนคากลับเปนขอมูลชนิด unsigned

long เหมือนกัน ขอมูลชนิด unsigned long จะเก็บขอมูลโดยใชหนวยความจํา 4 byte สามารับคาที่ไดจากการ

คํานวณแฟคทอเรียลไดถึง 4,294,967,295 แตคาแฟคทอเรียลที่ไดจะเพิ่มคาอยางรวดเร็ว n มีคาเทาใดจึงจะไม

เกินคาที่เก็บไดในหนวยความจํานี้

การเขียนฟงกชันเรียกตัวมันเอง โดยไมมีการคืนคากลับ หรือไมมีคําส่ัง return จะถูกคอมไพเลอรแจง

เตือนขณะท่ีทําการคอมไพล ถาในฟงกชันนั้นขาดเงื่อนไขที่จะใหฟงกชันหยุดการเรียกตนเอง จะทําใหเกิดกรณี

เรียกตนเองไมส้ินสุด ส้ินเปลืองหนวยความจํา และใหผลลัพธจากการทํางานที่มิอาจคาดเดาได

ฟงกชันที่มีการต้ังคาปริยายใหอากิวเมนต

(Function with default argument)

การเรียกใชฟงกชัน จะตองผานคาที่ตองการใหกับพารามิเตอรแกฟงกชันที่ถูกเรียก โปรแกรมเมอร

สามารถจะกําหนดคาอากิวเมนตใหมีคาตามที่ต้ังไวได เม่ือเรียกใชฟงกชันโดยไมมีการผานคาพารามิเตอรใด ๆ

คาที่กําหนดไวจะถูกนํามาใชงานทันที

คาอากิวเมนตที่มีการต้ังคาที่กําหนดไว จะตองเปนพารามิเตรอที่อยูขวามือสุดของฟงกชันนั้น ถามี

หลายตัว ตองเรียงลําดับไวขวามือสุด คาที่ถูกต้ังไวโดยปริยายนั้นสามารถเปนไดทั้งตัวคงท่ี ตัวแปรแบบโกลบ

บอลหรือฟงกชัน การต้ังคาdefault นี้ สามารถทําไดใน inline function ดวย 1: // Program 4.13 How to use default argument 2: // Feb16, 2004 3: #include <iostream> 4: using namespace std; 5: 6: float volumeOfBox ( float length=1.0, float width=1.0, float height=1.0); 7: 8: int main() { 9: // ommiting all parameters 10: cout << "The volume of this box (in default size) = "<< volumeOfBox() <<endl ; 11: // ommiting the 2nd and 3rd parameter 12: cout << "The volume of this box with length =5.0 = " << volumeOfBox(5) << endl; 13: // ommiting the 3rd parameter 14: cout << "The volume of this box with length=5, width = 3.0 = " << volumeOfBox(5, 3) << endl; 15: // Overriding all the default parameter 16: cout << "The volume of this box with length=5.0, width=3.0, height=2.0 = " << volumeOfBox(5,3,2) << endl; 17: return 0; 18: 19: } 20: float volumeOfBox (float l, float w, float h) 21: { 22: return (l*w*h); 23: }

Page 104: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

24:

การสงผานคาพารามิเตอรตอไปน้ี ไมถูกตอง

volumeOfBox ( , 3, 2) เม่ือจะละเวนพารามิเตอรตัวแรก จะตองละเวนตัวที่ 2 และ 3 ดวย

volumeOfBox ( 5, , 2) เม่ือละเวนพารามิเตอรตัวที่ 2 จะตองละเวนคาพารามิเตอรทุกตัวที่ตามหลัง

ตัวที่ 2

การประกาศฟงกชันที่มีคา default ตอไปนี้ ไมถูกตอง

ตัวอยาง void myfunc ( int a=2, int b , int c =3);

แกไขโดยตําพารามิเตอรที่มีคาต้ังไว ไปไวทางขวามือ

void myfunc (int b , int a=2, int c =3);

ตัวอยาง int func(int a, int b = 0, int c);

แกไขโดยเปล่ียนลําดับพารามิเตอรใหมดังนี้

int func(int a, int c , int b = 0);

ตัวอยาง void anotherFunc( int , int =2 , int = 3);

การประกาศในตัวอยางนี้ ทําไดถูกตอง

Function Overloading

ในภาษา C++ ยอมใหเราเขียนฟงกชันที่มีชื่อเหมือนกันแตชนิดขอมูลและจํานวนพารามิเตอรแตกตาง

กัน ความสามารถที่ยอมใหฟงกชันมีชื่อซ้ํากันไดนี้ เรียกวา overloading เม่ือมีการเรียกใช overloaded function

คอมไพเลอรจะตรวจสอบจํานวน ชนิด และลําดับของอากิวเมนตที่ถูกสงผานในพารามิเตอร และจะเลือกฟงกชัน

ที่มีชื่อเดียวกันนั้นใหเหมาะสมกับอากิวเมนตนั้น ฟงกชันโอเวอรโหลดดิง จะใชในการสรางฟงกชันที่ทําหนาที่

เดียวกัน แตมีชนิดขอมูลตางกัน ดังตัวอยางตอไปนี้

1: // Program 4.14 Overloading Function 2: #include <iostream> 3: using namespace std; 4: 5: int multiply ( int num1, int num2) { return (num1*num2); } 6: double multiply ( double num1, double num2) { return ( num1*num2); } 7: short multiply ( short num1, short num2) { return (num1*num2); } 8: 9: int main() { 10: int a,b; 11: short c, d; 12: double x,y; 13: a = 6; b=8; 14: cout << "Integer : " << a << " x " << b << " = " << multiply(a,b) << endl; 15: c = 4; d = 5; 16: cout << "Short : " << c << " x " << d << " = " << multiply(c,d) << endl; 17: x = 3.2 ; y = 5.4;

Page 105: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

18: cout << "double : " << x << " x " << y << " = " << multiply(x,y) << endl; 19: 20: return 0; 21: 22: }

การใช overloaded function ทําใหเราประหยัดการต้ังชื่อฟงกชัน ในภาษา C ถาชนิดขอมูลตางกัน

ถึงแมฟงกชันจะทํางานแบบเดียวกัน ตองต้ังชื่อตางกัน เชน int imultiply ( int num1, int num2); double dmultiply (double num1, double num2); short smultiply (short num1, short num2);

การสรางฟงกชัน overloading มีขอพึงระวังดังนี้

1. ไมสามารถทํา overload ฟงกชันที่มีชนิดและจํานวนของตัวพารามิเตอรเทากัน แตคืนคาชนิดขอมูล

ตางกัน int max (int a, int b); unsigned max ( int a , int b); ฟงกชัน max มีพารามิเตอรเหมือนกันทุกประการ แตสงคืนคาขอมูลตางชนิดกัน C++ จะจําแนก

overloading function โดยดูจาก argument list ไมสามารถจําแนกจากชนิดขอมูลที่คืนคา

2. ถาคา argument ที่สงผานมีชนิดขอมูลไมสอดคลองกับที่ไดประกาศไว จะตอง cast ชนิดขอมูลให

ตรงกันกอน เชน float float_var =2.4; in tint_var = 4; int result; result = multiply (float_var , int_var); จะขึ้นขอความผิดพลาดวาสับสนชนิดขอมูล ใน argument list ตองแกเปน result = multiply ( (int) float_var , int_var);

แตถาขอมูลที่สงผานคาเปนชนิดขอมูลที่ใชเนื้อที่หนวยความจําในการเก็บนอยกวาชนิดขอมูลของ

argument list C++ จะเปล่ียนชนิดขอมูลนั้น ใหเปนชนิดขอมูลตัวเลข (numeric type) ตามที่ปรากฎใน

argument list เชน

int multiply ( int i1, int i2);

double multiply (double d1, double d2);

float f1, f2;

cout << multiply (f1, f2);

จะเปล่ียน ขอมูลชนิด float ใหเปนขอมูลชนิด double

long L1, L2;

cout << multiply (L1, L2);

ไมสามารถเปล่ียนขอมูลชนิด long ใหเปนขอมูลชนิด int ได เพราะขอมูลชนิด long ใชเนื้อที่

หนวยความจํามากกวาขอมูลชนิด int

Page 106: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

3. Overloaded function ที่มีการต้ังคาตัวแปรโดยปริยายไว อาจจะสับสนกับ overloaded function ที่

ผานคาตัวแปรเปน void ไดเชน

int multiply ( int i1=5, int i2=7);

int multiply (void) {

int i1=3 ;

int i2=4;

return i1*i2;

}

เม่ือเรียกใชฟงกชัน

int result = multiply ( );

คอมไพเลอรจะสับสนไมสามารถเลือกถูกวาจะใชฟงกชันชุดใด

ฟงกชันตนแบบ ( Function template)

ฟงกชันโอเวอรโหลดใชเม่ือการผานคา argumentที่มีจํานวนและชนิดขอมูลตางกัน งานที่ประมวลผลมี

ลักษณะเหมือนกันหรือมีลักษณะซํ้ากันทุกประการ การใช template จะทําใหเขียนโคดของฟงกชันนั้นเพียง

คร้ังเดียว แตใชกับตัวแปรที่มีชนิดขอมูลตางกันได เราสามารถสรางฟงกชันตนแบบ เพียง 1 ชุด นําไป

แกปญหาเดียวกันไดทั้งหมด ถึงแมจะเปนขอมูลตางชนิดกัน เปนการสราง generic function ที่ใชไดกับ

ขอมูลครอบจักรวาล

ฟงกชันตนแบบ จะนําหนาดวยคําวา template ตามดวยชนิดขอมูล รูปแบบทั่วไปจะเปนดังนี้

template <class Ttype>

return_type FunctionName ( parameter list) {

// body function

}

เม่ือนําฟงกชัน multiply เขียนเปนฟงกชันตนแบบจะไดดังนี้ 1: // Program 4.15 templated function demo 2: #include <iostream> 3: using namespace std; 4: 5: template <class T> // or template <TypeName> 6: T multiply ( T num1, T num2) 7: { return num1*num2; 8: } 9: 10: int main() { 11: int a,b; 12: short c, d; 13: double x,y; 14: a = 6; b=8; 15: cout <<"Integer : " << a << " x " << b << " = " << multiply(a,b) << endl; 16: c = 4; d = 5; 17: cout << "Short : " << c << " x " << d << " = " << multiply(c,d) << endl; 18: x = 3.2 ; y = 5.4; 19: cout << "double : " << x << " x " << y << " = " << multiply(x,y) << endl;

Page 107: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

20: 21: return 0; 22: 23: }

บรรทัดที่ 5 ถึง 8 เปนการเขียนฟงกชันตนแบบ ชื่อmultiply มีการประกาศขอมูลชนิด T ซึ่งจะถูกใชใน

ฟงกชัน และขอมูลที่สงคาคืนกลับก็เปนขอมูลชนิด T เชนเดียวกัน จะเห็นวาการใชฟงกชันตนแบบจะลด

จํานวนบรรทัดการเขียนคําส่ังลงไปไดมาก

ตัวอยางตอไปนี้เปนฟงกชันตนแบบที่ใชเปรียบเทียบขอมูล 3 ชุด แลวหาวาขอมูลชุดใดมีคามากที่สุด 1: // Program 4.16 find them maximum value of 3 data sets 2: #include <iostream> 3: using namespace std; 4: 5: template <class anytype> 6: anytype maximum (anytype a, anytype b, anytype c) 7: {anytype max =a; 8: if (b > max) max =b; 9: if ( c > max ) max = c; 10: return max; 11: } 12: 13: int main() { 14: int i1, i2, i3; 15: cout << "Input three Integer number "; 16: cin >> i1 >> i2 >> i3; 17: cout << "The Maximum number is "<< maximum(i1,i2, i3)<< endl; 18: double d1, d2, d3; 19: cout << "Input three real number "; 20: cin >> d1 >> d2 >> d3; 21: cout<<"The Maximum real number is "<<maximum(d1,d2, d3)<< endl; 22: 23: char c1, c2, c3; 24: cout << "Input three character "; 25: cin >> c1 >> c2 >> c3; 26: cout <<"The Maximum character is "<<maximum(c1,c2, c3)<< endl; 27: 28: 29: return 0; 30: 31: }

Page 108: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

แบบฝกหัด

1. จงคอมไพลโปรแกรมที่ใชงาน overloaded function ตอไปนี้ แลวดูผลที่ได ถามีขอผิดพลาดจะตอง

แกไขอยางไร 1: // ex01.cpp 2: // from Borland C++ 3.1 -- Object oriented programming page 186 3: #include <iostream> 4: using namespace std; 5: 6: void display (long val) { cout << val << " in function 1 " << endl;} // ................(1) 7: void display (double val) { cout << val << " in function 2" << endl; } //..............(2) 8: void display (float val) { cout << val <<" in function 3 " << endl; } //................(3) 9: 10: 11: main() { 12: display (123456789); 13: display (3.141592653); 14: display (23); 15: return 0; 16: 17: }

(เม่ือ คอมไพลดวย BCC 5.1 จะแจงขอผิดพลาด ในบรรทัดที่ 12 และ 14 วาเปนการผานคาแบบกํากวม

ทําใหไมสามารถเลือกใช display ที่เปน long หรือ float

บรรทัดที่ 13 นาจะเรียกใชฟงกชัน 3 แตคาคงท่ี 3.141582653 จะถูกคอมไพเลอรมองวาเปน double

เพราะไมมีการประกาศตัวแปรวาเปน float ดังนั้นจึงเรียกใชฟงกชันที่ 2)

2. จงเขียนฟงกชันที่รับตัวเลขจํานวนเต็ม 3 คา ฟงกชันจะสงกลับจํานวนท่ีมีคามากที่สุด

int max_int ( int i, int j, int k);

3. เขียนโปรแกรมที่ใชฟงกชันและตรวจสอบ

44232)( 2

2

++−−

=xxxxxf

โดยกําหนด function prototype ดังนี้

double fx( double x);

4. จงเขียนและตรวจสอบฟงกชันตอไปนี้

g(x) = 0 x < 0

= )1(3 −xe x ≥ 0

โดยกําหนด function prototype ดังนี้

double gx( double x);

5. เขียนและตรวจสอบฟงกชันที่หาความยาวเสนตรงระหวางจุด (x1, y1) และ จุด (x2, y2)

length = 212

212 )()( yyxx −+−

6. จงเขียนและตรวจสอบวา จุด (x,y) อยูใน quadrant ใด

int quadrant ( double x, double y);

Page 109: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

7. หอคอยแหงฮานอย เกมสนี้ประกอบดวยเสาหลักจํานวน 3 หลัก ใหเปนเสา A, B และ C ตามลําดับ ที่

เสา A มีแผนจานขนาดตาง ๆ เรียงซอนกันโดยใหจานแผนใหญอยูลางสุดไลไปตามลําดับแผนเล็กอยู

บนสุดจํานวน N แผน (จากรูป N = 3 แผน) กติกาการเลนคือใหเคล่ือนยายแผนจากจากเสา A ทั้งหมด

ไปยังเสา C มีขอบังคับวา

- การหยิบแตละคร้ัง จะหยิบแผนจานไดเพียง 1 แผน

- หามนําจานแผนใหญวางซอนบนจานแผนเล็ก

- สามารถใชเสา B เปนที่พักจานช่ัวคราวได แตหามนําจานแผนใหญวางซอนจานแผนเล็กเชนกัน

-

ถาจานมีเพียง 1 แผน (N = 1) สามารถยายจานจากเสา A ไปยังเสา C ไดเลยโดยไมตองใชเสา B เปน

ที่พักจาน (จะใชเปนเงื่อนไขในการหยุดการทํางาน และสงคาคืนกลับของฟงกชัน)

ถามีจานอยู 3 แผน จะยายจานจากเสา A มาไวที่เสา C ลําดับการยายจะเปนดังนี้

A C

A B

C B

A C

B A

B C

A C

8. ชุดคําส่ังตอไปนี้ ผิดตรงสวนใด void main ( ) { discount_price ( 500.0 , 10 ); …. } void discount_price (float & price, float & percent_discount) { price = price - price*percent_discount/100.0; } ผิดตรงท่ีผานคาคงที่ใหกับการผานคา by reference

9. ตองการประกาศตัวแปร 3 ตัว เปนแบบ passing by reference

int& a, b, c;

int &a, &b, &c;

int &a, b ,c;

Page 110: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

บรรทัดแรก ถูกเพียงบรรทัดเดียว บรรทัดที่ 2, 3 ไมถูกตอง

10. (Going from C to C++) พิจารณาคําส่ังตอไปนี้ มีขอผิดพลาดตรงไหนบาง

int minus (int i ) {

return –i;

}

long minus (long r) {

return –r;

}

int main ( ) {

int a = minus (‘A’);

cout << a;

long b = minus (271.83);

}

11. การประกาศ Overloaded function ถูกตองหรือไม

int add ( int i, int j);

int add ( int i, int j, int k);

(ถูกตอง)

12. การประกาศ Overloaded function ตอไปนี้มีขอบกพรองหรือไม

int calculate ( int x);

int calculate ( int x, int y = 50);

ปญหาคือ การเรียกใชโดยผานคาเพียงตัวเดียวอาจจะเปนฟงกชันที่ 2 โดยละเวนคา default ก็ได

Page 111: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

บทที่ 5 Array, structure และ pointer

อะเรย 1 มิติ

การแกปญหาในทางวิทยาศาสตรและวิศวกรรม บางคร้ังขอ มูลมีเพียง 1 คา เชนการหาพ้ืนที่วงกลม เราใชรัศมี

ของวงกลมในการหาพื้นที่นั้น จุดตาง ๆ ในระนาบ x, y สามารถใชตัวแปรเพียง 2 ตัว คือ x –coordinate และ

y-coordinate สําหรับหาจุดพิกัด ปญหาบางปญหาตองใชขอมูลแบบเดียวกันเปนจํานวนมาก และเราก็ไม

ตองการต้ังชื่อขอมูลเหลานี้ใหแตกตางกัน เชน เราวัดอุณหภูมิของน้ํา 10 คร้ังไดขอมูล 10 คา เราไมตองการที่จะ

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

ในรูปอะเรย

อุณหภูมิที่เก็บไดจะจัดเก็บในรูปอะเรยดังแผนภาพตอไปนี้

ให T เปน identifier ของอะเรย จําแนกคาตาง ๆ ของอุณหภูมิทั้ง 10 คาโดยใช subscript หรือ index

value ในภาษา C++ subscript จะเร่ิมตนที่ 0 และจะเพิ่มคาทีละ 1 ขอมูลอุณหภูมิคาที่ 1 จะถูกเก็บไวใน T [0]

อุณหภูมิคาที่ 2 จะถูกเก็บไวใน T [1] ไปเรื่อย ๆ จนถึงอุณหภูมิคาที่10 จะถูกเก็บไวใน T[9]

การสรางตัวแปรแบบอะเรยทําไดดังนี้

ขอมูลที่เก็บไวในตัวแปรอะเรย เรียกวา สมาชิก(elements)ของอะเรย ตัวอยางการนิยามตัวแปรแบบอะเรย

int NumberOfStudentEachYear[12];

อะเรยเก็บขอมูลชนิดจํานวนเต็มเก็บขอมูล 12 คา

double distance[100]; เก็บขอมูลชนิดจํานวนจริงแบบ double ได 100 คา

char ch[10]; เก็บขอมูลชนิดตัวอักษร 10 ตัว

เราสามารถกําหนดคาเร่ิมตนใหอะเรยขณะที่นิยามอะเรยนั้น ทําไดโดยกําหนดคาสมาชิกแตละตัวค่ัน

ดวยเคร่ืองหมายจุลภาค ปดหัวทายดวยวงเล็บปกกา เชน

int a[5] = {3,5,7,9, 11} ;

กําหนดให a เปนตัวแปรแบบอะเรยชนิดจํานวนเต็ม ให a[0]=3, a[1]=5, a[2]=7, a[3]=9, a[4]=11,

float f[ ] = {4.2, 6.8, 3.7 };

Page 112: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

กรณีที่ไมใสขนาดของอะเรยในวงเล็บ ขนาดของอะเรยจะถูกจองไวในหนวยความจําเทากับจํานวน

สมาชิกที่กําหนดไวตอนเร่ิมตน ในที่นี้คือ 3

float ff[10]= { 0};

กําหนดใหอะเรย ff ทั้ง 10 ตัวมีคาเปนศูนย

การกําหนดคาใหกับสมาชิกอะเรยไมครบทุกตัว ตัวที่ไมมีการกําหนดคาจะถูกกําหนดโดยคอมไพเลอร

ใหมีคาเปนศูนย

double b[5] = {3.2, 6.8, 4.1 };

จะได b[0]=3.2, b[1]=6.8, b[2]=4.1, b[3] = 0, b[4] =0

ถาประกาศตัวแปรแบบอะเรย แตไมมีการกําหนดคาเร่ิมตน จะไดขอมูลที่เปนขยะเก็บไวในอะเรยนั้น

ดังตัวอยางโปรแกรมตอไปนี้ 1: //Array uninitialize 2: #include <iostream> 3: using namespace std; 4: 5: int main() { 6: double a[5] ; 7: cout << "Show gabage data in array \n" ; 8: for(int i = 0 ; i < 5; i++) 9: cout << "a[" << i << " ] = " << a[i] << endl; 10: return 0; 11: } 12:

char vowels[5] = { ‘a’, ‘e’, ‘i’, ‘o’, ‘u’};

การกําหนดชนิดขอมูลแบบตัวอักษร จะได vowels[0] = ‘a’, vowels[1]=’e’, vowels[2]= ‘i’,

vowels[3] = ‘o’, vowels[4]=’u’ หรือกําหนดเปน

char vowels[5] = { “aeiou” };

char str[ ] = “This is a sentence”;

ไมสามารถใชตัวแปรในการกําหนดขนาดของอะเรยได ตัวอยางตอไปนี้จึงไมถูกตอง

int n = 20;

int myArray[n];

แตเราสามารถใชคาคงท่ีไปกําหนดขนาดของอะเรยได เม่ือตองการเปล่ียนขนาดของอะเรย สามารถ

เปล่ียนตัวเลขที่ ArraySize เพียงแหงเดียว ไมตองไปตามแกหลายแหง ถามีการสรางอะเรยไวหลายที่ #include <iostream> using namespace std; const int ArraySize=100; int main ( ) { int testArray[ArraySize]; int i; for ( i=0; i < ArraySize; i++) { testArray[i] = i; cout << “testArray[ “ << i << “ ] = “ << testArray[i] << endl; } }

Page 113: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

จะตองพึงระวังวาเม่ือสรางตัวแปรอะเรย a มีขนาด n อะเรย a จะมีคาต้ังแต a[0], a[1], .. ,a[n-1]

เทานั้น ไมมี a[n] ถาใช a[n] จะพบขอความผิดพลาดขณะคอมไพลโปรแกรม วาไมมีสมาชิกตัวที่ n หรือ out of

bound error. คอมไพเลอรบางตัวไมมีการตรวจสอบขนาดของอะเรยและจะนําตัวเลขที่เปนขยะมาแสดงผล

โปรแกรมเมอรควรตรวจสอบขนาดของอะเรย เพื่อปองกันการนําขอมูลขยะที่อยูนอกขอบเขตของอะเรยมาใชงาน

โปรแกรมตอไปน้ีเปนการแสดงผลขอมูลที่เก็บไวในอะเรย 1: // program 5.1 2: #include <iostream> 3: using namespace std; 4: 5: int main() { 6: 7: int number[6] = { 2,3,5,7,11,13}; 8: // display number on screen 9: for (int i = 0; i < 6 ; i++ ) 10: cout << " Number [ " << i << " ] = " << number[i] << endl; 11: // assign new number to number [i] 12: for (int i = 0; i < 6 ; i++ ) 13: number[i] = (i+1)*2; 14: cout << "Now, data in array number[] has been changed...\n"; 15: for (int i = 0; i < 6 ; i++ ) 16: cout << " Number [ " << i << " ] = " << number[i] << endl; 17: return 0; 18: } 19: 20:

อะเรยประเภทchar จะถูกปดทายดวย null character ( \0) ไวทายอะเรยเสมอ เพื่อแสดงวาส้ินสุดขอบเขต

ของอะเรยเพียงเทานี้ และจะแสดงผลเพียงเทานี้ ดังตัวอยางในโปรแกรม 5.2

mystr เปนอะเรยประเภท char เก็บคา Test character arrays. ไวในหนวยความจําปดทายดวย null

character ดังรูป

T e s t c h a r a c t e r a r r a y s . \0

เม่ือกําหนด mystr[4] = ‘\0’

เม่ือใหแสดงผล mystr พบวาขอความที่เหลือ จะได Test เทานั้น ขอความหลัง ‘\0’ จะถูกละท้ิงไมแสดงผล

ทั้งหมด 1: //Program 5.2 Char array 2: #include <iostream> 3: using namespace std; 4: 5: int main() {

T e s t \0 c h a r a c t e r a r r a y s . \0

Page 114: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

6: char mystr[] = "Test character arrays."; 7: cout << mystr << endl; // 8: mystr[4] = '\0'; 9: cout << mystr<< endl; 10: return 0; 11: } 12: ผลที่ไดจากการรันโปรแกรม

เราสามารถใชคําส่ัง mystr[4] = 0; แทน mystr[4] = ‘\0’; ในบรรทัดที่ 8 ได การใชเคร่ืองหมาย \ (backslash)

บอกใหคอมไพเลอรรูวามีตัวอักษรพิเศษตามหลัง \

ถาตองการกําหนดคา เลขศูนยเก็บไวในอะเรยจะตองใชคําส่ังดังนี้

mystr[4] = ‘0’;

หรือ mystr[4] = 48; ซึ่งเปนรหัสอัสกีของเลขศูนย

โปรแกรม 5.3 เปนการนําตัวแปรแบบอะเรยมาใชงาน โปรแกรมน้ีจะใหปอนเลขจํานวนจริงหรือจํานวนเต็ม ไม

เกิน 100 คา แลวแสดงผลตัวเลขที่ปอนเขาไป พรอมคาเฉล่ีย 1: // Program5.3 2: // Terminating input by press Control -z 3: 4: #include <iostream> 5: using namespace std; 6: 7: const int MAXSIZE = 100; 8: 9: int main() 10: { 11: float data[MAXSIZE]; 12: int size = 0; 13: float currentnumber, average, sum; 14: cout << "Enter your first number - > (CTR-z to stop Entering) "; 15: cin >> currentnumber; 16: while (! cin.eof()) { 17: data[size] = currentnumber; 18: size++; 19: cout << "Enter your next number : "; 20: cin >> currentnumber; 21: } 22: cout << "You've enter "<< size << " data " << endl; 23: sum = 0.0; 24: for ( int i = 0; i < size ; i++ ) { 25: cout << data[i] << " " ; 26: sum = sum + data[i]; 27: } 28: average = sum / size; 29: cout << "Average value of these number is " << average << endl; 30: return 0;

Page 115: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

31: } 32:

เพื่อความปลอดภัยอาจตรวจสอบขอบเขตของอะเรย โดยแทรกคําส่ังตอไปนี้หลังบรรทัดที่ 22

if ( size*sizeof(float) > sizeof(data) return 0;

sum =0.0;

for ( int i=0; int i < size; i++ )

………

การใชตัวแปรอะเรยกับ enumeration type

เราสามารถนําขอมูลแบบ enumeration type มาใชรวมกับตัวแปรชนิดอะเรยไดอยางกลมกลืน ทําให

โปรแกรมมีลักษณะอานงายและชัดเจนในตัวมันเอง

ขอมูลแบบ enum type จะคลายกับขอมูลประเภท int หรือ char ตางกันตรงที่สมารถแสดงเปนชื่อที่

บงบอกถึงความหมาย ไมจําเปนตองเรียงลําดับ ขึ้นอยูกับโปรแกรมเมอรจะกําหนด

โปรแกรมตอไปน้ีแสดงความยาวคล่ืนของแสงสีตาง ๆ ในหนวย นาโนเมตร 1: #include <iostream> 2: using namespace std; 3: 4: enum LightColor { violet, blue, green, yellow, orange, red }; 5: float wavelength[red+1]= {300, 420, 480, 530,600,620 }; 6: 7: int main () 8: { 9: cout << "The wavelength from violet to red --> " << endl; 10: for (LightColor light = violet; light <= red; light++ ) 11: cout << wavelength[light] << endl; 12: 13: return 0; 14: } 15:

ในบรรทัดที่ 10, 11, 12 จะเห็นวาการใช enum type จะชวยใหการเขียนคําส่ังมีลักษณะใกลเคียงกับภาษาพูด

เปนการบอกใหแสดงคาความยาวคล่ืนของแสงสีตาง ๆ ต้ังแต violet, blue, green, yellow, orange, และ red

อะเรยหลายมิติ

Page 116: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

อะเรยที่กลาวมาจะเปนอะเรยเพียงแถวเดียว ถาอะเรยนั้นมีหลายแถวจัดวาเปนอะเรยหลายมิติ การ

ประกาศตัวแปรที่เปนอะเรยหลายมิติ ทําไดโดยกําหนดขนาดใหเทากับจํานวนของมิตินั้น เชน

int a[3][4];

a เปนตัวแปรอะเรยเก็บขอมูลชนิดจํานวนเต็มขนาด 3 แถว 4 สดมภ เปนอะเรย 2 มิติ

ในหนวยความจําจะถูกจัดวางตําแหนงดังนี้

ตัวอยางการประกาศคาตัวแปรที่เปนอะเรย 3 มิติ

float farray[6][2][4];

เปนอะเรยที่เก็บขอมูลชนิดจํานวนจริง (float) มีขนาด 6 x 2 x 4

รูปแบบทั่วไปของการประกาศตัวแปรแบบอะเรยมีดังนี้

Data_type ArrayName [size1][size2][….][…];

การกําหนดคาในอะเรยหลายมิติ มีลักษณะคลายกับเมตริกซ (Matrix) ในคณิตศาสตร

เมตริกซ b มีขนาด 2 x 3 มีคาดังนี้

Page 117: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

⎥⎦

⎤⎢⎣

⎡ −=

752013

b

เขียนเปนอะเรย 2 มิติ ในภาษา C++ ไดดังนี้

int b[2][3] = { { 3, -1, 0 },

{2, 5, 7 }

};

หรือจะเขียนใหอยูในแถวเดียว

int b[2][3] = { 3, -1, 0, 2, 5, 7};

int calendar[12][31];

calendar เปนอะเรยเก็บชอมูลชนิดจํานวนเต็มจํานวน 11 แถวแตละแถวมีสมาชิก 31 ตัว (ไมใช 31

แถว แตละแถวมีสมาชิก 12 ตัว)

sizeof (calendar) = (31)(12)(sizeof (int)) = 372

ให c เปนอะเรย 3 มิติ มีขนาดเปน 2 x 4 x 3 มีจํานวนสมาชิก 24 ตัว

การกําหนดคาเร่ิมตนของอะเรย 3 มิติ ทาํไดดังนี้

int c [2][4][3] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 };

หรือ

int c [2][4][3] = { { {0, 1, 2} , {3, 4, 5}, {6, 7, 8}, {9, 10, 11} },

{ {12, 13, 14}, {15, 16, 17}, {18, 19, 20}, {21, 22, 23} };

จะทดลองนําอะเรย c ไปแสดงผล 1: // Print 3 D arrayProgram5_2 2: #include <iostream.h> 3: 4: int main() 5: { 6: int c[2][4][3] = { {{0,1,2}, {3,4,5}, {6,7,8}, {9,10,11} }, 7: { {12,13,14}, {15,16,17}, {18,19,20},{21,22,23} }}; 8: for (int i = 0; i < 2 ; i++) { 9: cout << endl; 10: for(int j = 0; j < 4 ; j++) { 11: cout << endl; 12: for(int k = 0; k < 3; k++ ) { 13: cout << "C[" << i <<"][" << j << "][" << k << "] = " 14: << c[i][j][k] << " "; 15: } 16: } 17: } 18: return 0; 19: } 20: 21:

Page 118: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

การผานคาตัวแปรอะเรยไปยังฟงกชัน

การผานคาอะเรยไปยังฟงกชันอื่นเพื่อประมวลผลเปนการผานคาแบบ reference ตัวอยางเชน

int myarray[ ] ; เปนการประกาศตัวแปรอะเรยชื่อ myarray สมาชิกของอะเรยแตละตัวจะเปนแบบ

integer ชื่อ myarray จะเก็บตําแหนงของหนวยความจําที่เก็บอะเรย คอมไพเลอรจะรับรูเพียงตําแหนงของ

หนวยความจํา และชนิดขอมูลที่เก็บ ไมจําเปนตองระบุจํานวนสมาชิกอะเรย

เม่ือผานคาอะเรยไปยังฟงกชัน จะเปนการผานตําแหนงของหนวยความจําที่เก็บตัวแปรอะเรยตัวแรก

เทานั้น ฟงกชันสามารถเปล่ียนแปลงคาที่เก็บไวในอะเรยโดยการระบุตําแหนงหนวยความจําที่เหมาะสม การ

ผานคาตัวแปรอะเรยไปยังฟงกชัน ควรระบุขนาดของอะเรยไปยังฟงกชันที่ถูกเรียก เพื่อปองกันการประมวลผล

อะเรยที่อยูนอกเหนือขอบเขต

ตัวอยางตอไปนี้เปนการผานคาอะเรยแบบ 1 มิติ ไปยังฟงกชัน เปนการขยายโปรแกรมการหาคาเฉล่ีย

โดยแตกงานออกเปน 3 ฟงกชันนั่นเอง 1: // program - ArrayAverage.cpp 2: #include <iostream> 3: using namespace std; 4: 5: const int MAXSIZE = 100; 6: void ArrayInput( double [], int & ); 7: void ArrayDisplay( double[], int ); 8: double Average (double[], int); 9: 10: int main() 11: { 12: double data[MAXSIZE]; 13: int n; 14: double mean; 15: ArrayInput(data,n); 16: cout << "Array Name \"DATA\" has " << n << " elements." << endl; 17: ArrayDisplay(data,n); 18: mean = Average(data,n); 19: cout << "Average of these value = " << mean; 20: return 0; 21: } 22: void ArrayInput( double a[], int &num) 23: { num = 0; 24: cout << "Input data (type -99 for stop)-->"; 25: for( num = 0; num < MAXSIZE ; num++ ) { 26: cout << "a["<<num << "] = " ; 27: cin >> a[num]; 28: if (a[num] == -99) break;

Page 119: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

29: } 30: } 31: void ArrayDisplay (double a[], int num) { 32: for (int i = 0; i < num ; i++) { 33: cout << "dat[" << i <<"] = " << a[i] << endl; 34: } 35: } 36: double Average(double array[], int n) 37: { 38: double sum, mean; 39: sum = 0; 40: for (int i = 0; i < n; i++ ) 41: sum = sum + array[i]; 42: mean = sum/(double)n; 43: return mean; 44: }

ฟงกชันทั้ง 3 ฟงกชันในโปรแกรม ArrayInput (data, n), ArrayDisplay (data, n) และ Average (data ,n) เปน

การผานเฉพาะช่ือตัวแปรอะเรย (คือ data) ไปยังฟงกชันนั้น ๆ และผานคาจํานวนของสมาชิกอะเรยโดยใชตัว

แปร n

ฟงกชัน ArrayInput จะผานคา n แบบตัวแปรอางอิงนั้นหมายถึงฟงกชัน ArrayInput จะเปนตัวกําหนดจํานวน

สมาชิกของอะเรย data วาผูใชจะปอนขอมูลเขามาก่ีชุด n จะมีคาตามจํานวนชุดที่ปอน การวนรอบ for จะ

กําหนดไวใหผูใชปอนขอมูลไดไมเกิน MAXSIZE = 200 ชุด

ฟงกชัน ArrayDisplay จะนําขอมูลในตัวแปรอะเรย data มาแสดงผลเทากับจํานวนสมาชิก n

ฟงกชัน Average จะหาคาเฉลี่ยของขอมูลที่ผูใชปอนเขามา n ชุด สงคาเฉล่ียคืนกลับไปยังโปรแกรมหลัก

การผานคาอะเรย 2 มิติ ไปยังฟงกชัน

ตัวอยาง โปรแกรมตอไปนี้เปนการเก็บคะแนนของนักศึกษา 3 คน แตละคนทําแบบทดสอบ 5 ชุด ไดคะแนน

แตกตางกัน การเก็บคะแนนจะเก็บไวในตัวแปรอะเรยขนาด 3 x 5 ( 3 แถว 5 คอลัมน) จากนั้นคํานวณหา

คะแนนเฉลี่ยของนักศึกษาแตละคน และคะแนนเฉลี่ยของแบบทดสอบแตละชุดที่นักศึกษาทําได

1: // program – Array2Av.cpp 2: #include <iostream> 3: using namespace std; 4: 5: const int NumberOfStudents = 3; 6: const int NumberOfQuiz = 5; 7: 8: void DisplayTable( float table[][NumberOfQuiz], int row); 9: void ShowQuizAverage(float table[][NumberOfQuiz],int row); 10: void ShowClassAverage(float table[][NumberOfQuiz],int row); 11: 12: int main() 13: { 14: float data[NumberOfStudents][NumberOfQuiz]= { {8.0, 8.5, 5.0,7.0,5.0}, 15: { 4.0,2.0,1.5,7.0,5.5}, 16: {9.0, 7.0,6.0, 7.0, 8.0}}; 17: int n = NumberOfStudents;

Page 120: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

18: cout << "Display scores of 3 students and 5 quizes : \n"; 19: DisplayTable(data, n); 20: cout << "\nNow calculate the class average and quiz average....\n"; 21: ShowQuizAverage(data, n); 22: cout << endl; 23: ShowClassAverage(data,n); 24: return 0; 25: } 26: void DisplayTable (float a[][NumberOfQuiz], int num) { 27: for (int i = 0; i < num ; i++) { 28: cout << "\nStudent # " << i+1 <<" : "; 29: for(int j=0; j < NumberOfQuiz ; j++) 30: cout << a[i][j] << " "; 31: } 32: } 33: // finding quiz average of each student 34: void ShowQuizAverage (float a[][NumberOfQuiz], int num) { 35: float sum; 36: for (int i = 0; i < num ; i++) { 37: sum = 0.0; 38: for(int j=0; j < NumberOfQuiz ; j++) 39: sum = sum+ a[i][j] ; 40: cout << "Student's quizes average # " << i+1 << " = " 41: << sum/(float)NumberOfQuiz << endl; 42: 43: } 44: } 45: void ShowClassAverage (float a[][NumberOfQuiz], int num) { 46: float sum; 47: for (int i = 0; i < NumberOfQuiz ; i++) { 48: sum = 0.0; 49: for(int j=0; j < num ; j++) 50: sum = sum+ a[j][i] ; 51: cout << "Class average of quiz # " << i+1 << " = " 52: << sum/(float)num << endl; 53: 54: } 55: } 56:

Page 121: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

การเรียงลําดับขอมูลโดยใชตัวแปรอะเรย

การเรียงลําดับขอมูล(จากมากไปหานอย (descending) หรือจากนอยไปหามาก (Ascending)) เปนส่ิงที่

หลีกเล่ียงไมพนในการแกปญหาทางวิทยาศาสตร ตัวแปรแบบอะเรยจะชวยแกปญหาการเรียงลําดับขอมูลให

งายขึ้น

การเรียงลําดับขอมูลที่งายที่สุดคือ การเรียงลําดับแบบ bubble sort ในการเรียงลําดับ(ในที่นี้จะเรียง

จากนอยไปมาก) จะมีการวนรอบแบบซอนก้ัน 2 ชั้น ชั้นในสุดจะเปรียบเทียบสมาชิกกับสมาชิกตัวที่อยูถัดไป ถา

มีคามากกวาจะสลับคากัน ลักษณะจะคลายกับสมาชิกตัวที่นอยเปนฟองอากาศท่ีลอยตัวขึ้นมาอยูบนสุดของผิว

น้ํา 1: #include <iostream> 2: using namespace std; 3: 4: const int ascending =0; 5: const int decending =1; 6: void BubbleSort ( double a[], int , int); 7: void printdata (double a[], int ); 8: 9: int main() 10: { 11: double data[10] = {9.5, 6.2, 7.6, 4.1, 5.3, 2.1, 8.7, 9.4, 1.6, 3.2 }; 12: 13: cout << "Before bubble sorting ... \n"; 14: printdata (data,10); 15: cout << "\nAfter sorting by ascending .. \n "; 16: BubbleSort(data,10,ascending); 17: printdata (data,10); 18: 19: cout << "\nAfter sorting by decending .. \n "; 20: BubbleSort(data,10,decending); 21: 22: printdata (data,10); 23: 24: return 0; 25: } 26: void BubbleSort ( double a[], int n, int SortType) { 27: double temp; 28: for (int i = n-1; i > 0 ;i-- ) 29: for( int j =0; j < i; j++ ) 30: { 31: if (SortType==0) // ascending sort 32: { if (a[j] > a[j+1]) 33: { temp = a[j]; 34: a[j] = a[j+1]; 35: a[j+1] = temp; 36: } 37: } 38: else { 39: if (a[j] < a[j+1]) 40: { temp = a[j]; 41: a[j] = a[j+1]; 42: a[j+1] = temp; 43: } 44: } //else

Page 122: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

45: } //for loop 46: } 47: void printdata (double a[], int n ) { 48: for (int i = 0;i < n ;i++ ) 49: { 50: cout << a[i] << ", " ; 51: } 52: } 53:

ขอมูลแบบโครงสราง (structure)

สตรักเจอรเปนการนําขอมูลที่เก่ียวของกันแตมีชนิดขอมูลแตกตางกันมารวมไวเปนกลุมเดียวกัน ตาง

จากขอมูลแบบอะเรยซึ่งตองเปนขอมูลชนิดเดียวกันเทานั้น

รูปแบบการใชงาน

ตองการเก็บรหัสนักศึกษา (Id) ชื่อ-สกุล (name) กลุมนักศึกษา(section) ระดับคะแนนเฉล่ีย(GPA) ของ

นักศึกษาแตละคน จะเปนการสะดวกถานําขอมูลของนักศึกษาแตละคนรวบรวมไวเปนชุดเดียวกัน ซึ่งทําไดโดย

เก็บขอมูลเปนแบบ structure ดังนี้

struct StudentRecord {

long id;

char name [40];

int section ;

float gpa;

};

StudentRecord เปนตัวแปรแบบโครงสราง ที่มีสมาชิกที่เปนขอมูลประเภท char int และ float การนํา

StudenRecord ไปใชงานในการเก็บขอมูลนักศึกษา 5 คน ทําไดโดยประกาศตัวแปรดังตอไปนี้

StudentRecord student01, student02, student03, student04, student05;

หรือจะใชตัวแปรแบบอะเรยในการประกาศคาก็ได

Page 123: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

StudentRecord students[5];

การกําหนดคาเร่ิมตนของตัวแปรโครงสราง ทําไดดังนี้

StudentRecord students[5] = { { 100001, “Dang”, 1, 3.2},

{100002, “Sompong”, 2, 2.4},

{100003, “Naree”, 1, 2.75},

{100004, “Supan”, 2, 1.89},

{100005, “Wipa”, 2, 3.00} };

ตัวอยางตอไปนี้เปนการปอนขอมูลนักศึกษา จํานวน 3 ราย ลงในตัวแปรแบบโครงสราง StudentRecord

จากนั้น แสดงผลขอมูลที่ปอนเขาไปบนจอภาพ 1: // structure data type 2: #include <iostream> 3: using namespace std; 4: 5: struct StudentRecord { 6: long id; 7: char name [40]; 8: int section ; 9: float gpa; 10: }; 11: 12: 13: void ShowRecord(int , StudentRecord); 14: 15: int main() { 16: int index = 0; 17: char temp[20]; 18: StudentRecord students[5]; 19: do { 20: cout << "Id no.: "; 21: cin.getline(temp, sizeof(temp)-1); 22: students[index].id= atol(temp); 23: cout << "Name : "; 24: cin.getline(students[index].name, sizeof(students[index].name)-1); 25: cout << "Section : " ; 26: cin.getline(temp, sizeof(temp)-1); 27: cout << "Grade Point Average :"; 28: students[index].section= atoi(temp); 29: cin.getline(temp, sizeof(temp)-1); 30: students[index].gpa= atof(temp); 31: index++; 32: } 33: while ( index < 3) ; 34: for (int i = 0; i < 3; i++ ) { 35: ShowRecord(i, students[i]); 36: } 37: } 38: void ShowRecord (int n, StudentRecord s) { 39: cout << "Record # " << (n+1) << " ==> " << endl; 40: cout << "Identification : " << s.id << " Name : " << s.name 41: << " Section : " << s.section << " Grade : " << s.gpa

Page 124: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

42: << endl ; 43: } 44:

ทดลองนําขอมูลจากตัวแปรโครงสรางซ่ึงมีการกําหนดคาไวแลวในตอนตนโปรแกรม มาแสดงผลบนจอภาพ 1: // structure data type 2: #include <iostream> 3: using namespace std; 4: 5: struct StudentRecord { 6: long id; 7: char name [40]; 8: int section ; 9: float gpa; 10: }; 11: 12: 13: void ShowRecord(int , StudentRecord); 14: 15: int main() { 16: StudentRecord students[5] = { { 100001, "Dang", 1, 3.2}, 17: {100002, "Sompong", 2, 2.4}, 18: {100003, "Naree", 1, 2.75}, 19: {100004, "Supan", 2, 1.89}, 20: {100005, "Wipa", 2, 3.00} }; 21: 22: int index = 0; 23: for (int i = 0; i < 5; i++ ) { 24: ShowRecord(i, students[i]); 25: } 26: } 27: void ShowRecord (int n, StudentRecord s) { 28: cout << "Record # " << (n+1) << " ==> " << endl; 29: cout << "Identification : " << s.id << " Name : " << s.name 30: << " Section : " << s.section << " Grade : " << s.gpa 31: << endl ; 32: } 33:

Page 125: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ถาเรากําหนดคาเร่ิมตนใหแก students[0], students[1], students[2], students[3] แต students[4]

ไมกําหนดคาเร่ิมตนให จะเกิดอะไรขึ้น พบวาคอมไพเลอรจะใสคา 0 ใหแกขอมูลชนิดตัวเลข และใสคา null

ใหแกขอมูลชนิดตัวอักษร

Pointers

เม่ือประกาศตัวแปรในโปรแกรม เชน int i = 3; หรือ float x = 5.6; เม่ือใหโปรแกรมทํางานจะเร่ิม

ดวยการจัดสรรหนวยความจําแรม เพื่อเก็บตัวแปรเหลานี้ ตัวแปรแตละตัวจะถูกเก็บในหนวยความจําซ่ึงมี

address เปนตัวเลขท่ีแนนอน ขนาดของหนวยความจําที่ใชเก็บขึ้นอยูกับชนิดขอมูล เชนตัวแปรชนิด int จะใช

เนื้อที่เก็บ 2 ไบต ตัวแปรชนิด float จะใชเนื้อที่เก็บ 4 ไบต

address ของหนวยความจําจะเปนเสมือนบานเลขท่ี จะเร่ิมตนที่ 0, 1, 2, …จนถึงคาสูงสุดซึ่งขึ้นอยูกับ

วาคอมพิวเตอรเคร่ืองนั้นมีหนวยความจําเทาใด ถาเคร่ืองคอมพิวเตอรนั้นมีหนวยความจํา 640 kB address

ของหนวยความจําจะมีคาไปถึง 655,359 ถาเคร่ืองคอมพิวเตอรนั้นมีหนวยความจํา 1 MB จะมีaddress ไดถึง

1,048,575 เม่ือโปรแกรมถูกโหลดเขาสูหนวยความจํา ถาอยากจะรูวาตัวแปรตาง ๆ ในหนวยความจําอยูที่

ตําแหนงเลขท่ีเทาใด สามารถใช & (address of operator) หาตําแหนงของตัวแปรนั้นไดดังนี้ 1: // pointer1.cpp 2: #include <iostream> 3: using namespace std; 4: int main() { 5: int i1=3; 6: int i2=7; 7: float x = 5.6; 8: cout << "Address of i1 =" << &i1 << endl 9: << "Address of i2 = " << &i2 << endl 10: << "Address of x = " << &x << endl; 11: 12: } 13:

ผลการทํางานของโปรแกรมจะไดดังนี้

ในการใหโปรแกรมทํางานแตละคร้ังหรือในแตละเคร่ืองจะไดตําแหนงของหนวยความจําที่ตางกันไป

ขึ้นอยูกับขนาดของระบบปฏิบัติการของเคร่ืองนั้น และขึ้นอยูกับวาขณะน้ันมีโปรแกรมอื่นกําลังทํางานอยูใน

เคร่ืองหรือไม

จากรูปจะเห็นวาตําแหนงของหนวยความจําจะเรียงจากมากไปนอย ขณะรันโปรแกรม ตัวแปรเหลานี้

จะถูกเก็บไวในหนวยความจําที่เรียกวา stack โดยเร่ิมตนจาก address ที่มีคามากไปสู address ที่มีคานอย ถา

ตัวแปรนั้นเปนแบบ external จะถูกเก็บไวในหนวยความจําที่เรียกวา heap จะเก็บตัวแปรเรียงซอนกันใน

ลักษณะตรงขามกับ stack เลขท่ีตําแหนงจะเรียงจากนอยไปมาก รายละเอียดตรงสวนนี้ โปรแกรมเมอรไมตอง

ใสใจก็ได คอมไพเลอรจะเปนผูจัดการรายละเอียดปลีกยอยเหลานี้ใหเรา

Page 126: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ระวังอยาสับสน address of operator & ซึ่งนําหนาช่ือตัวแปร กับ reference operator & ซึ่งตามหลังชนิด

ขอมูล

ตัวแปรพอยเตอร ( Pointer variable)

ตัวแปรใดก็ตามท่ีเก็บตําแหนงเลขที่ของตัวแปรอื่น หรือออปเจกตอื่น เรียกตัวแปรนั้นวาเปนตัวแปรพอย

เตอร คอมไพเลอรตองรูดวยวาตัวแปรพอยนเตอรเก็บ address ของตัวแปรเปนขอมูลชนิดใด เพราะการเพิ่มคา

pointer ไปยังaddress ตาง ๆ จะเพิ่มตามขนาดของขอมูล การประกาศตัวแปรพอยนเตอร จึงตองประกาศให

ตรงกับชนิดของตัวแปรนั้น ๆ ดวย

การประกาศตัวแปรพอยนเตอร ใน C++ มีรูปแบบดังนี้

data_type *pointer_var ; // define a ‘ pointer to type’

เชน

int *ptrint; // define a pointer to int

float *ptrx; // define a pointer to float

*ptrint และ *ptrx เปนตัวแปรพอยนเตอรที่เก็บตําแหนงเลขท่ีหนวยความจําของตัวแปรที่มีชนิดขอมูลเปน Int

และ float ตามลําดับ เคร่ืองหมาย * มีความหมายวาเปน pointer to type

ตัวอยางตอไปนี้เปนการกําหนดคา address ใหกับตัวแปรพอยนเตอรและใชประโยชนจากตัวแปรพอยนเตอร

ในการแสดงคา

1: // pointer2.cpp 2: #include <iostream> 3: using namespace std; 4: int main() {

Page 127: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

5: int i1=3; 6: int i2=7; 7: int *ptr_int; 8: float x = 5.6; 9: float *ptr_x; 10: ptr_int = &i1; // pointer point to i1 11: cout << "content in ptr_int = *ptr_int = " << *ptr_int << endl; 12: ptr_int = &i2; 13: cout << "content in ptr_int = *ptr_int = " << *ptr_int << endl; 14: ptr_x = &x; 15: cout << "content in ptr_x = *ptr_x = " << *ptr_x << endl; 16: 17: } 18:

บรรทัดที่ 10 เปนการกําหนดคาใหตัวแปรพอยนเตอร ptr_int เก็บตําแหนง address ของ i1

เม่ือพิมพคา ptr_int จะไดคาหนวยความจําของตัวแปร i1 เม่ือใหพิมพคา *ptr_int จะแสดงขอมูลที่เก็บ

ไวในหนวยความจําที่ address นี้ จะเห็นวาในบางครั้ง เราอาจไมทราบช่ือตัวแปร แตถารู addressของตัวแปร

ก็สามารถรูวาขอมูลของตัวแปรนั้นมีคาเทาใดได โดยอาศัยตัวแปรแบบพอยนเตอร

บรรทัดที่ 12 เปนการใหตัวแปรพอยนเตอรเปล่ียนคา address ของหนวยความจําเปนของ i2 ขอมูลใน

ptr_intจะกลายเปนตําแหนงเลขที่ของหนวยความจําของตัวแปร i2 ดังรูป

และตัวแปร ptr_x จะเก็บ address ของตัวแปร x

Page 128: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

เม่ือประกาศตัวแปรพอยนเตอรโดยไมกําหนดคาเร่ิมตน คาที่เก็บอยูในตัวแปรพอยนเตอรอาจเปนคาอะไรก็ได

อาจชี้ไปยังหนวยความจําที่ address ใด ๆ ซึ่งอาจเปนที่เก็บขอมูลสําคัญของระบบปฏิบัติการ ถามีการเปล่ียน

คาอาจทําใหเคร่ืองหยุดทํางาน การกําหนดคาเร่ิมตนใหแกตัวแปรพอยนเตอรจึงเปนส่ิงสําคัญ

* เปน operator เขาถึงขอมูลของตัวแปรที่มี address ตรงกับ พอยนเตอรนั้นชี้อยู อาจกลาววา

เคร่ืองหมาย * คือ ‘ at address’

& จะใหคาเลขท่ีตําแหนงของหนวยความจําของตัวแปรนั้น จํางาย ๆ คือ ‘The address of ….’

ใหทดลองเปล่ียคําส่ังใหเปนดังตอไปนี้ ทดลองดูวาเม่ือคอมไพลจะเกิดอะไรขึ้น

ptr_int = &x;

ptr_x = &i1;

หรือประกาศตัวแปรดังนี้

int *ptr_int = &i1;

int i1;

พิจารณาสวนหน่ึงของโปรแกรมตอไปนี้ แลวคาดคะเนวาผลลัพธที่ได int *ptr_int; int n; ptr_int = &n; *ptr_int = 15; cout << “n = “ << n << endl; cout <<” *ptr_int = “ << *ptr_int << endl; ………. ตัวแปรพอยนเตอรสามารถใชในการคํานวณคณิตศาสตร

int *ptri;

int i, n =5;

ptri = &n;

i = 8*(*ptri); // 8*5 = 40

…………..

………..

หรือจะเขียนเปน 8 * *ptri ก็ได เพราะ *ptri เปน indirection operator มีลําดับความสําคัญกอนเคร่ืองหมายคูณ

Page 129: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

คําส่ังทั้งสองบรรทัดตอไปนี้ใหผลลัพธเชนเดียวกัน

j = i;

j = *&i;

ประโยคตอไปนี้ควรระวัง

i = 8/*ptri // divide 8 by object pointer to, assign result to i

เพราะเคร่ืองหมาย /* คอมไพเลอร (บางบริษัท) จะมองวาเปนเร่ิมตนของการ comment

การเพิ่มคา pointer ดังตัวอยางตอไปนี้

int i = 10;

int *pi;

*pi = i;

*pi += 1; // add 1 to *pi

หรือจะใชคําส่ัง (*pi)++; การใสวงเล็บ จะประมวลผลเร่ิมจากขวาไปซาย (กรณี ++ และ * )

ถาเขียน *pi ++ จะเปน *(pi++) ความสัมพันธระหวางอะเรยและพอยนเตอร อะเรยและพอยนเตอรมีความสัมพันธใกลชิดกันมาก บางคร้ังการจัดการกับสมาชิกของอะเรยโดยใชตัว

แปรพอยนเตอร จะมีประสิทธิภาพมากกวา การกลาวถึงชื่ออะเรยและดรรชนีหรือ subscript โดยตรง

เม่ือประกาศตัวแปร int a [ 5 ] = { 0, 10, 20, 30, 40}; หมายถึง a เปนตัวแปรชนิดอะเรยเก็บจํานวน

เต็มได 5 คา

int *iptr_a; ตัวแปรช่ือ ptr_a เปนตัวแปรพอยนเตอรชี้ไปยัง address ของอะเรยที่เก็บจํานวนเต็ม

คําส่ัง iptr = &a[0];

กําหนดให iptr_a ชี้ไปที่ตําแหนง a[0] หรือจะเขียนเปน iptr_a = a; จะใหผลเหมือนกัน

ตัวอยางตอไปนี้เปนการอางถึงหรือแสดงขอมูลในตัวแปรอะเรยโดยใชพอยนเตอร ดังนี้

1: // array pointer.cpp 2: #include <iostream> 3: using namespace std; 4: int main() {

Page 130: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

5: int a[5] = {0, 10,20,30,40}; 6: int *iptr, index; 7: iptr = a; 8: cout << " \n1) Using a[index] " << endl; 9: for (index = 0; index < 5; index++) 10: cout << "a[" << index <<"] = " << a[index] << " " ; 11: cout << endl; 12: 13: cout << " \n2) Using iptr[index] " << endl; 14: for (index = 0; index < 5; index++) 15: cout << "iptr[" << index <<"] = " << iptr[index] << " " ; 16: cout << endl; 17: 18: cout << "\n 3) Using array name as a pointer *(a+index) " << endl; 19: for (index = 0; index < 5; index++) 20: cout << "*(a+ " << index << ") = " << *(a+index) << " " ; 21: cout << endl; 22: 23: cout << "\n 4) Using a pointer name as a pointer *(iptr+index) " << endl; 24: for (index = 0; index < 5; index++) 25: cout << "*(iptr + " << index << ") = " << *(iptr+index) << " " ; 26: cout << endl; 27: 28: cout << "\n 5) Using increasing pointer Arithmatics iptr++ " << endl; 29: for (iptr = &a[0]; iptr <= &a[4]; iptr++) 30: cout << "*(iptr) at address " << iptr << ") = " << *iptr << " " ; 31: cout << endl; 32: 33: return 0; 34: } 35:

ผลลัพธจากการทํางานของโปรแกรมดังกลาวจะไดดังนี้ 1) Using a[index] a[0] = 0 a[1] = 10 a[2] = 20 a[3] = 30 a[4] = 40 2) Using iptr[index] iptr[0] = 0 iptr[1] = 10 iptr[2] = 20 iptr[3] = 30 iptr[4] = 40 3) Using array name as a pointer *(a+index) *(a+ 0) = 0 *(a+ 1) = 10 *(a+ 2) = 20 *(a+ 3) = 30 *(a+ 4) = 40 4) Using a pointer name as a pointer *(iptr+index) *(iptr + 0) = 0 *(iptr + 1) = 10 *(iptr + 2) = 20 *(iptr + 3) = 30 *(iptr + 4) = 40 5) Using increasing pointer Arithmatics iptr++ *(iptr) at address 0012FF78) = 0 *(iptr) at address 0012FF7C) = 10 *(iptr) at address 0012FF80) = 20 *(iptr) at address 0012FF84) = 30 *(iptr) at address 0012FF88) = 40

การใช indirection operator กับการเพิ่มคาและลดคา

Page 131: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

กําหนดให int data[ ] = { 10, 20, 30, 40, 50};

และ int *ip, temp;

ip = & data[1];

temp = *ip;

จะเห็นวา ip เปนตัวแปรพอยนเตอรชี้ไปยังสมาชิกอะเรย data ตัวที่ 2 ซึ่งมีคาเทากับ 20 คาที่เก็บไวในตัวแปร

temp จึงเทากับ 20 ดวย

ถาเพิ่มประโยคคําส่ังตอไปนี้

*++ip; // *(++ip)

temp = *ip;

เปนการเพิ่มคาพอยนเตอร ip ไปอีก 1 ตําแหนง พอยนเตอรจะช้ีไปที่สมาชิกอะเรยตัวที่ 3 คาที่เก็บไวใน

temp จึงมีคาเทากับ 30

++ *ip; // ++ (*ip)

temp = *ip;

ขณะนี้ ip ชี้อยูที่สมาชิกตัวที่ 3 ของ data คําส่ัง ++(*ip) เปนการเพิ่มคาขอมูลที่เก็บไวใน address ที่

ip ชี้อยู จาก 30 เปน 31 คาที่เก็บไวใน temp จึงมีคา 31

temp = *ip++; // y = *(ip++)

เคร่ืองหมาย++ จะกระทํากับ ip เพราะใสไวขางหลัง ip หรือม่ีลักษณะเปน postfix จึงมีผลเม่ือประโยค

นี้ไดถูกประมวลผลแลว นั่นคือ temp ยังคงมีคาเทากับ 31 เม่ือ temp ไดรับคาแลว ip จะเพิ่มคาขึ้นอีก 1 จะช้ีไป

ยังสมาชิกตัวที่ 4 ซึ่งมีคาเทากับ 40

temp = (*ip)++;

เปนการเพิ่มคาขอมูลที่เก็บไวใน address ที่ ip ชี้อยู จาก 40 จะมีคาเปน 41

ความสัมพันธระหวาง Structure และ Pointer จากตัวแปรแบบโครงสราง

struct StudentRecord {

long id;

char name [40];

int section ;

float gpa;

};

ประกาศตัวแปรที่มีชนิดขอมูลแบบ StudentRecord ไดดังนี้

StudentRecord mystudent, *p_student;

p_student = &mystudent;

Page 132: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

p_student เปนตัวแปรพอยนเตอร ชี้ไปย้ังขอมูลชนิด StudentRecord ซึ่งเปนตัวแปรแบบโครงสราง

การใชตัวแปรพอยนเตอรเขาถึงขอมุลแบบโครงสรางทําไดดังนี้ (*p_student).id = 1001; strcpy(*p_student.name = “Somsak”); (*p_student).section = 1; (*p_student).gpa = 2.75; เพราะเคร่ืองหมายจุด . มีลําดับความสําคัญมากกวาเคร่ืองหมาย * จึงตองใสวงเล็บที่ตัวแปรพอยน

เตอร เพื่อบังคับใหคอมไพเลอรมองเห็น p_student เปนพอยนเตอรกอน การใชพอยนเตอรกับตัวแปรแบบ

โครงสราง จะนิยมใชเคร่ืองหมาย คําส่ังชุดขางบนจึงเขียนใหมไดเปน p_student id = 1001; strcpy(p_student name = “Somsak”); p_student section = 1; p_student gpa = 2.75;

การจัดสรรหนวยความจําขณะ run time โดยใชพอยนเตอร

การใชโปรแกรมท่ีเขียนดวยภาษา C++ จะเก่ียวของกับหนวยความจําใน 3 ลักษณะ คือ จัดเก็บแบบ

อัตโนมัติ (automatic storage) เปนบริเวณหนวยความจําที่ใชเก็บตัวแปรของฟงกชัน เม่ือมีการเรียกใชฟงกชัน

แบบที่ 2 คือจัดเก็บแบบสถิต (static storage) เม่ือขอมูลถูกประกาศใหเปน static ซึ่งจะคงอยูตลอดเวลาเม่ือ

โปรแกรมทํางาน และสวนที่จัดเก็บอยางอิสระ (free storage) ในภาษา C เรียกสวนน้ีวา heap หนวยความจํา

สวนนี้จะถูกจัดสรรสําหรับคําส่ังของโปรแกรมขณะท่ีประมวลผล เราสามารถจัดสรรและจัดการหนวยความจํา

บริเวณน้ีโดยใชคําส่ัง new และ delete

การที่เราสามารถจัดสรรควบคุมหนวยความจําไดขณะที่โปรแกรมทํางานจะเปนการใชทรัพยากร

(หนวยความจํา) ไดอยางมีประสิทธิภาพ ณ ขณะนี้เราสามารถจับจองและใชหนวยความจําโดยวีสรางตัวแปร

นั่นคือบอกใหคอมไพเลอรรูวาเราจะตองใชหนวยความจําจํานวนเทาใดในการรันโปรแกรม ในบางกรณีทําใหเกิด

การใชพื้นที่หนวยความจําไมคุมคา

ตัวอยางเชน ตองการหาคะแนนเฉลี่ยของนักศึกษาแตละกลุม กลุมนักศึกษาอาจมีมากถึง 200 คน บาง

กลุมมี 20 คน บางกลุมมี 10 คน การประกาศตัวแปร float score[200]; ตองจองเนื้อที่ไวถึง 200 ที่ ถึงแมสวน

ใหญกลุมนักศึกษาจะมีเพียง 20 คน หรือ 30 คน ก็ตาม

การจัดสรรหนวยความจําแบบพลวัต หมายถึงการจองเน้ือที่หนวยความจําเทาที่จําเปนในขณะที่

โปรแกรมประมวลผล การจัดสรรหนวยความจํา ทําไดโดยใชคําส่ัง new และปลอยคืนหนวยความจําดวยคําส่ัง

delete ดังตัวอยางตอไปนี้ 1: // Program -- NewDel1.cpp 2: #include <iostream> 3: using namespace std; 4: 5: int main( ) 6: { 7: double *e = new double; 8: *e=2.71828; 9: cout << "The values of e = " << *e << endl; 10: delete e; 11: 12:

Page 133: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

13: return 0; 14: }

ในการจองเนื้อที่หนวยความจํา ถาจองไมสําเร็จ คําส่ัง new จะคืนคากลับเปน null pointer ซึ่งปกติมี

คาเปน 0 แทนดวยสัญลักษณ NULL การใชคําส่ัง new ควรมีการตรวจสอบทุกคร้ังวาสามารถจอง

หนวยความจําไดสําเร็จหรือไม ดังนี้ ……… double *e = new double; if ( e == NULL) exit(1); *e =2.71828; …………

การใช new และ delete กับตัวแปรชนิดอะเรย

เม่ือใชคําส่ัง new หรือ delete เพื่อจองหรือปลดปลอยหนวยความจํากับตัวแปรประเภทอะเรย จะตอง

เพิ่มวงเล็บตอทายดังนี้ new[ ] และ delete [ ] อะเรยที่ถูกสรางโดยคําส่ัง new เรียกวา dynamic array

ตัวอยางตอไปนี้เปนการจองหนวยความจําเพื่อเก็บคา double จํานวน 10 คา 1: // Program -- NewDel2cpp 2: #include <iostream> 3: using namespace std; 4: 5: int main( ) 6: { 7: double *number = new double[10]; 8: if (number == NULL) exit(1); 9: number[2] = 2.345; 10: cout << "The value stored in number[2] = " << number[2] << endl; 11: delete[] number; 12: 13: return 0; 14: } ตัวอยางการใช new และ delete อีกตัวอยางหน่ึง 1: // Program -- NewDel3.cpp 2: #include <iostream> 3: using namespace std; 4: 5: int main( ) 6: { 7: int *i; 8: char *c; 9: i = new int; // return pointer to int-size , 2 byte 10: *i = 15273; 11: c = new char [125]; // allocate block of 125 * char-size byte 12: cout << "Type any letters...."; 13: cin >> c; 14: cout << c << endl; 15: delete i; 16: delete c; 17: 18: return 0; 19: }

Page 134: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ในภาษา C มีคําส่ัง malloc () และ free ( ) ซึงเทียบเทากับคําส่ัง new และ delete สามารถใชไดใน C++

เชนเดียวกัน แต new และ delete จะดูเขาใจงายกวา

main ( ) { int *i; i = (int *) malloc( sizeof(int)); *i = 15273; printf(“ %d \n “, *i); free(i); }

ขอควรระวังการใชคําส่ัง new

1. ไมสามารถใชกับคาคงท่ีไดโดยตรง เชน

i = new 125; // จองพื้นที่หนวยความจํา 125 byte

2. การจองหนวยความจําสําหรับอะเรยหลายมิติมีรูปแบบที่พึงระวังดังนี้

int *k;

k = new int[4][10]; // เปนการจองอะเรย k ชนิดจํานวนเต็มใชเนื้อที่ 80 byte

หรือ

int *k;

int i;

i =4;

k = new int [i][10]; // จัดวาเปนคําส่ังที่ถูกตอง

i = 10;

k = new int[4][i] ; // ไมถูกตองในวงเล็บหลังจะตองเปนตัวคงท่ีเสมอ

แบบฝกหัด

1. ขอใดประกาศตัวแปรแบบอะเรยไดถูกตอง

ก. int a[10];

ข. int a;

ค. a { 10};

ง. array a[10];

2. เลขดรรนีของอะเรยที่มีสมาชิก 29 ตัว คือขอใด

ก. 29

ข. 28

ค. 0

ง. ขึ้นอยูกับโปรแกรมเมอรกําหนด

เฉลย ข

3. ขอใดเปนอะเรยแบบ 2 มิติ

Page 135: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

ก. array a[20][20];

ข. int a[20][20];

ค. char a[20];

ง. int a[20,20];

4. ตองการเชาถึงขอมูลของสมาชิกอะเรยตัวที่ 7 คือขอใด

ก. f[6];

ข. f[7];

ค. f(7);

ง. f

เฉลย ก.

5. ขอใดตอไปนี้บอกถึงตําแหนงของหนวยความจําของสมาชิกตัวแรกของอะเรย foo ซึ่งมีจํานวนสมาชิก

100 ตัว

ก. foo[0];

ข. foo;

ค. &foo;

ง. foo[1];

เฉลย ข.

6. จงเขียนโปรแกรมหาคาตัวเลขท่ีมากที่สุดในอะเรยพรอมกับระบุตําแหนงของสมาชิกอะเรยที่เก็บตัวเลข

คามากที่สุด

7. จงประกาศคาตัวแปรอะเรยชื่อ rainfall ซึ่งใชเก็บปริมาณนํ้าฝนท่ีตกลงมาใน 1 สัปดาหใหคาเร่ิมตน

ของสมาชิกแตละตัวมีคาเปนศูนย

เฉลย const int days s= 7;

float rainfall [days] = {0};

8. จงประกาศตัวแปรอะเรยเก็บขอมูลชนิดตัวอักษรจํานวน 100 ตัว โดยเร่ิมตนใหศมาชิกทุกตัวมีคาเปน a

เฉลย char arrayOfChar[100] = {‘a’};

9. จงประกาศตัวแปรอะเรยเพี่อใชระบุตําแหนงตารางหมากรุกขนาด 8 x 8

เฉลย int chessboard [8][8];

10. จงประกาศตัวแปรอะเรย 2 มิติ ขนาด 10 x 10 ใหแตละชองเก็บอักษร x เม่ือตอนเริ่มตน

เฉลย char table[10][10] = { ‘x’ };

11. จงเขียนประกาศตัวแปรอะเรยตอไปนี้ 11.1 อะเรยเก็บจํานวนเต็ม 10 คา

11.2 อะเรยเก็บจํานวนจริง 4 คา กําหนดคาเร่ิมตนดังนี้ 3.2, 1.8, 7.7และ 5.1

11.3 อะเรยเก็บขอความ “Hello”

12.การประกาศตัวแปรตอไปนี้ตางกันอยางไร

Page 136: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

char word[8] = “Welcome”;

char word[8] = { ‘W’, ‘e’, ‘l’, ‘c’, ‘o’, ‘m’, ‘e’ };

12. จงนําขอมุลบอกความสูงในตารางตอไปนี้เขียนเปนอะเรย เพศ นอยกวา 150 cm 150 – 170 cm มากกวา 170 cm

ชาย 13 % 55 % 22 %

หญิง 15% 75% 10%

Page 137: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

บทเบ็ดเตล็ด โปรแกรมเล็ก ๆ ตอไปน้ี เปนโปรแกรมท่ีผูเขียนเขียนไวใชงานสวนตัว อาจจะมีประโยชนบางสําหรับผูที่สนใจ โปรแกรมใสเลขบรรทัดของ Source code ของโปรแกรมคอมพิวเตอร (LineNo.ccp) โดยปกติ โปรแกรมตนฉบับภาษา C++ จะไมมีเลขบรรทัดกํากับ ในการอธิบายโปรแกรมวาแตละบรรทัดทําหนาที่อะไรน้ัน การมีตัวเลขกํากับหนาบรรทัดจะทําใหการอางอิงถึงบรรทัดที่จะอธิบายทําไดสะดวกขึ้น เปนประโยชนตอผูอานที่จะสามารถติดตามไดงาย โดยไมตองมาคอยนับบรรทัด ในการใสตัวเลขหนาบรรทัดโดยวิธีเติมตัวเลขทีละบรรทัดน้ันเปนการเสียเวลาไมนอย ในที่น้ีจึงเขียนโปรแกรมใหทําหนาที่ใสตัวเลขหนาบรรทัดของแตละบรรทัดใหอยางอัตโนมัติ โปรแกรมจะ save ไฟลที่ใสเลขประจําบรรทัดน้ันเปนช่ือเดิม แตเปลี่ยนนามสกุลของไฟลใหมจาก cpp เปน lin Source code ของโปรแกรมมีดังน้ี

1: // LineNumber.cpp 2: // Jan 3.2004 3: #include <iostream.h> 4: #include <fstream.h> 5: #include <string.h> 6: #include <stdlib.h> 7: #include <iomanip.h> 8: 9: main( int argc, char *argv[]) 10: { 11: char *infilename; 12: char outfilename[25] ; 13: ofstream outfile; 14: ifstream infile; 15: int line = 1; 16: char c; 17: if (argc < 2 ) { 18: cout << "Enter filename : "; 19: cin >> infilename; 20: } 21: else {

Page 138: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

22: strcpy(infilename,argv[1]); 23: } 24: cout << "Input your filename : " << infilename << endl; 25: infile.open( infilename, ios::in); 26: if (!infile) { 27: cerr << " Could not open file \n"; 28: exit(1); 29: } 30: 31: strncpy(outfilename, infilename,strlen(infilename) - 5); 32: outfilename[strlen(infilename)-5]= '\0'; 33: strcat(outfilename,".lin"); 34: cout << "has been inserted line number.\n" 35: << "And its name 's changed to " << outfilename << endl; 36: outfile.open(outfilename, ios::out); 37: if (!outfile) { cerr << "Could not create output file\n";} 38: outfile << setw(3) << line << ":\t"; 39: while((c = infile.get()) != EOF) { 40: if (c == '\n') { 41: line++; 42: outfile.put(c); 43: outfile << setw(3) << line << ":\t"; 44: } 45: else outfile.put(c); 46: } 47: 48: infile.close(); 49: outfile.close(); 50: return 0; 51: }

การใชงานโปรแกรม สามารถพิมพคําสั่งไดโดยตรง ใน DOS mode ตามลําดับดังน้ี - คลิกที่ปุม start และคลิกที่เมนู Run

Page 139: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

- จะมีหนาตาง Run ปรากฏขึ้น ใหพิมพคําวา cmd พรอมกด Enter

- จะไดหนาตาง Command window ดังรูป

Page 140: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

- ไปที่ โฟลเดอร ที่เราเก็บ Source code ในที่น้ี คือ MyCpp ใหนําโปรแกรม LineNo.exe อยูในโฟลเดอรเดียวกันน้ีดวย

- จะทดลองใสเลขหนาบรรทัดของไฟล LineNo.cpp ใหพิมพคําสั่งดังรูป โปรแกรมจะแสดงขอความใหทราบวาไดใสหมายเลขที่หนาบรรทัดแตละบรรทัดของไฟล LineNo.cpp แลว และไฟลที่มีการใสเลขหนาบรรทัดน้ีจะถูกเปล่ียนช่ือใหมเปน LineNo.lin ไฟลตนฉบับ LineNo.cpp ไมไดถูกเปลี่ยนแปลงหรือแกไขแตอยางใด

จากน้ันเราสามารถนําไฟล LineNo.lin ไปใชงานประกอบการอธิบายโปรแกรม โปรแกรมนี้สามารถใสหมายเลขบรรทัด source code ของโปรแกรมที่เขียนโดยภาษาคอมพิวเตอรอ่ืน ไดเชนกัน โดยไฟลตนฉบับน้ีจะตองถูกจัดเก็บในรูป text file

Page 141: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

โปรแกรมคนหาคําใน text file เปนโปรแกรมท่ีใชคนหาคําที่ตองการ ผูใชจะปอนคําที่ตองการคนหา โปรแกรมจะแจงใหทราบวาคําที่คนหาน้ันพบเปนจํานวนก่ีครั้ง อยูที่บรรทัดท่ีเทาใดบาง โปรแกรมนี้ตองระบุช่ือไฟลที่ตองการคนหาลงไปในโปรแกรม ซึ่งในโปรแกรมน้ีจะใชคนหาคําที่ตองการในไฟลชื่อ somewhere.txt อาจไมสะดวกนัก ถาไฟลที่ตองการคนหาน้ันมีอยูหลายไฟล ซึ่งควรจะแกไขใหผูใชสามารถระบุช่ือไฟลที่ตองการคนหาไดเม่ือเร่ิมตนใชคําสั่งใหโปรแกรมทํางาน รายละเอียดของโปรแกรมมีดังน้ี 1: // Findtext.cpp --- search your word or phrase in text file 2: // Last update : Sept 22, 2003 3: 4: #include <stdio.h> 5: #include <iostream.h> 6: #include <string.h> 7: 8: int main( ) { 9: 10: //char *filename; 11: FILE *fp; 12: int i,c,findFlag, wlength,buflength,position,foundtime; 13: int foundpos[64]; 14: char buffer[10240]; 15: char yourword[255]; 16: 17: char ch; 18: cout << "Input what you want to search for : "; 19: cin.get(yourword,255); 20: // cout << yourword << "\n"; 21: wlength = strlen(yourword); 22: // printf("length of buffer = %d \n",wlength); 23: findFlag = 0; 24: if ((fp=fopen("somewhere.txt","r"))== NULL) { 25: cout << "File openning failed \n"; 26: return 1; 27: } 28: // store all texts into memory 29: c = fgetc(fp); 30: for( i=0; (i < 10240) && (feof(fp)==0) ; i++) { 31: buffer[i] = c; 32: c = fgetc(fp); 33: } 34: buffer[i] = '\0' ; //make a c -style string 35: buflength = strlen(buffer); 36: cout << "\nThe content in this file ..... :\n\n"; 37: cout << buffer<< "\n\n"; 38: position = 0; 39: foundtime=0; 40: for (i =0; i < (buflength - wlength) ;i++ ) { 41: ch=buffer[i]; 42: if (ch != '\n' ) position +=1;

Page 142: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

43: if (ch == yourword[findFlag]) { 44: findFlag +=1; 45: if (findFlag == wlength) { 46: foundtime +=1; 47: foundpos[foundtime] = position -wlength+1; 48: } 49: } else { findFlag = 0; } 50: } //end for loop 51: cout << "'" << yourword <<"'" << " was found " << foundtime << " time(s) at

postion as following \n"; 52: for (i= 1;i <= foundtime ;i++ ) { 53: cout << " position ---> " << foundpos[i] << " \n"; 54: } 55: cout << " \n\n\n.......All job has been done successfully..........\n\n\n"; 56: } ตัวอยางการใชงาน หลังจาก compile โปรแกรมแลว เรียกใชงาน ผานหนาตาง Dos command โปรแกรมจะใหใสคําที่ตองการคนหา ในที่น้ีตองการคนคําวา love

โปรแกรมจะคนหาคําที่เราตองการ พรอมแจงใหทราบวาพบคําน้ีก่ีครั้งในไฟลน้ี พบที่ตําแหนงใดบาง

หมายเหตุ : ไฟล ชื่อ somewhere.txt เปนไฟลของเนื้อเพลงที่ช่ือวา Somewhere my love ไฟลน้ีจะตองอยูในโฟลเดอรเดียวกันกับ โปรแกรม Findtext.exe อยู

Page 143: เรียนรู ภาษา C++ · C++ ให เป นภาษาเคร ื่องที่คอมพิวเตอร สามารถเข าใจ เรียกสั้น

reference 1. Reisdorph, Kent. Teach Yourself Borland C++ Builder in 24 Hours., Sams

Publishing, New York, 1999, 451p. 2. Breamer, Brian and Bramer, Susan. C++ for Engineers. Hodder Headline

Group, London, 1996, 468p. 3. Faison, Ted. Borland C++ 3.1 Object-Oriented Programming. 2nd Sams

Publishing, Indiana, 1992, 1107p. 4. Etter, Delores M. Introduction to C++ for Engineers and Scientists., Prentice-

Hall,Inc., 1997, New Jersey, 162p. 5. Bell, Douglas, The Essence of Programming Using C++, Prentice-Hall,

Hertfordshire, 1997,220p. 6. Lafore, Robert. Object-Oriented Programming in Turbo C++, Waite Group,

Inc. , 1991, California 739p. 7. Cannon Scott R., Understanding Programming An Introduction Using C++.,

West Publishing Company, Minneapolis, 1997, 479p. 8. Hubbard John R. Programming with C++, Schaum’s Outline Series, McGraw

Hill, Singapore, 1996, 436p. 9. Conte Paul, Commonsense C. , Duke Communication. Colorado, 1983, 100p. 10. Traister, Robert J., Going from C to C++., Academic Press, Messachusette,

1993, 185p. 11. Schildt, Herbert. Schildt’s Expert C++., Osborn McGraw Hill, 1996,

California, 402p. 12. Reverchon, Alain and Ducamp Marc. Mathematical Software Tools in C++.,

John Wiley &Sons, 1993, England, 507p. 13. Eckel, Bruce. Thinking in C++. Prentice Hall, 2000, New Jersey, 842p. 14. Deitel H.M. and Deitel P. J. C++ How to Program., Prentice Hall, 2001, New

Jersey, 1168p. 15. Shammas, Namir. C/C++ Mathematical Algorithms for Scientists and

Engineer., McGraw-Hill, Inc., 1996, Singapore, 304p. 16. Gurewich Nathan and Gurewich Ori., Mastering C++ (from C to C++ in 2

weeks).,Sybex, Inc., 1994, Singapore, 503p. 17. Horstmann Cay S., Computing Concepts with C++ Essential., 2nd edition, John

Wiley & Sons, Inc., 1999, New York, 685p.