ข้อดีของภาษา C และ C++
โปรแกรมเมอร์โดยทั่วไปในปัจจุบันนิยมพัฒนาโปรแกรมด้วยภาษา C และ C++ ด้วยเหตุผล ดังนี้
1.โปรแกรมเมอร์สามารถสร้างโปรแกรมที่ควบคุมการทำงานของคอมพิวเตอร์และการโต้ ตอบระหว่างผู้ใช้กับคอมพิวเตอร์ได้อย่างเต็มประสิทธิภาพ เช่น การเขียนโปรแกรมในลักษณะที่ผู้ใช้ควบคุมโปรแกรมในสภาพแวดล้อม ที่เป็น Event-Driven คือ ผู้ใช้สามารถควบคุมเหตุการณ์ต่าง ๆ ของโปรแกรมในขณะทำงานได้ไม่ใช่ผู้ใช้ถูกควบคุมโดยโปรแกรม ลักษณะการทำงานแบบ Event-Driven ได้แก่โปรแกรมที่ทำงานในสภาพแวดล้อมภายใต้ระบบปฏิบัติการวินโดวส์ เป็นต้น
2. ภาษา C และ C++ มีประสิทธิภาพของภาษาอยู่ในระดับที่ใกล้เคียงกับภาษา Assembly มากที่ สุด แต่มีความยืดหยุ่นในยึดติดกับฮาร์ดแวร์คอมพิวเตอร์หรือ Microprocessor รุ่นใดรุ่นหนึ่ง ทำให้สามารถ นำโปรแกรมที่สร้างขึ้นไปทำงานได้กับเครื่องคอมพิวเตอร์ได้ทุกรุ่น
3. ภาษา C++ สนับสนุนการเขียนโปรแกรมในลักษณะเชิงวัตถุหรือ OOP (Object Oriented Programming) ซึ่งเป็นเทคนิคการเขียนโปรแกรมที่นิยมใช้เขียนโปรแกรมขนาดใหญ่ที่มีจำนวน ข้อมูลใน โปรแกรมมาก
4. โปรแกรมเมอร์ส่วนใหญ่จะนิยมใช้ภาษา C, C++ พัฒนาโปรแกรมประยุกต์ในงานด้านต่าง ๆ เป็นจำนวนมากในปัจจุบัน เพราะประสิทธิภาพของภาษาที่ได้เปรียบภาษาอื่น ๆ
*************************************************************************************************************************
C++ เป็นหนึ่งในภาษาที่ได้รับความนิยมอย่างแพร่หลาย มีโปรแกรมจำนวนมากมายที่ถูกเขียนด้วย C++ เช่น Windows, Word, Excel, PowerPoint, SQL Server, Chrome, Firefox, Safari, Photoshop, MySQL รวมถึง เกม, device driver และโปรแกรมควบคุมการทำงานของ Hardware, microcontroller, robot และอื่น ๆ อีกมากมาย
***********************************************************************************************************************************
อยากทำเว็บ สร้างเกม เขียนแอปจังเลย ! ว่าแต่ภาษาในการเริ่มพัฒนาโปรแกรมมันมีมากมายเต็มไปหมด แล้วเราจะเลือกใช้าภาษาไหนในการสร้างดี ? เลือกทั้งหมดเลยได้ไหม ? หรือ หยุดที่ภาษาเดียวเลยดีไหม ? ไปหาคำตอบกันเลยจ้าา :D
**********************************************************************************************************************************************************************************
[source code: FirstPrg.cpp ]
โปรแกรมเมอร์โดยทั่วไปในปัจจุบันนิยมพัฒนาโปรแกรมด้วยภาษา C และ C++ ด้วยเหตุผล ดังนี้
1.โปรแกรมเมอร์สามารถสร้างโปรแกรมที่ควบคุมการทำงานของคอมพิวเตอร์และการโต้ ตอบระหว่างผู้ใช้กับคอมพิวเตอร์ได้อย่างเต็มประสิทธิภาพ เช่น การเขียนโปรแกรมในลักษณะที่ผู้ใช้ควบคุมโปรแกรมในสภาพแวดล้อม ที่เป็น Event-Driven คือ ผู้ใช้สามารถควบคุมเหตุการณ์ต่าง ๆ ของโปรแกรมในขณะทำงานได้ไม่ใช่ผู้ใช้ถูกควบคุมโดยโปรแกรม ลักษณะการทำงานแบบ Event-Driven ได้แก่โปรแกรมที่ทำงานในสภาพแวดล้อมภายใต้ระบบปฏิบัติการวินโดวส์ เป็นต้น
2. ภาษา C และ C++ มีประสิทธิภาพของภาษาอยู่ในระดับที่ใกล้เคียงกับภาษา Assembly มากที่ สุด แต่มีความยืดหยุ่นในยึดติดกับฮาร์ดแวร์คอมพิวเตอร์หรือ Microprocessor รุ่นใดรุ่นหนึ่ง ทำให้สามารถ นำโปรแกรมที่สร้างขึ้นไปทำงานได้กับเครื่องคอมพิวเตอร์ได้ทุกรุ่น
3. ภาษา C++ สนับสนุนการเขียนโปรแกรมในลักษณะเชิงวัตถุหรือ OOP (Object Oriented Programming) ซึ่งเป็นเทคนิคการเขียนโปรแกรมที่นิยมใช้เขียนโปรแกรมขนาดใหญ่ที่มีจำนวน ข้อมูลใน โปรแกรมมาก
4. โปรแกรมเมอร์ส่วนใหญ่จะนิยมใช้ภาษา C, C++ พัฒนาโปรแกรมประยุกต์ในงานด้านต่าง ๆ เป็นจำนวนมากในปัจจุบัน เพราะประสิทธิภาพของภาษาที่ได้เปรียบภาษาอื่น ๆ
*************************************************************************************************************************
C++ เป็นหนึ่งในภาษาที่ได้รับความนิยมอย่างแพร่หลาย มีโปรแกรมจำนวนมากมายที่ถูกเขียนด้วย C++ เช่น Windows, Word, Excel, PowerPoint, SQL Server, Chrome, Firefox, Safari, Photoshop, MySQL รวมถึง เกม, device driver และโปรแกรมควบคุมการทำงานของ Hardware, microcontroller, robot และอื่น ๆ อีกมากมาย
***********************************************************************************************************************************
อยากทำเว็บ สร้างเกม เขียนแอปจังเลย ! ว่าแต่ภาษาในการเริ่มพัฒนาโปรแกรมมันมีมากมายเต็มไปหมด แล้วเราจะเลือกใช้าภาษาไหนในการสร้างดี ? เลือกทั้งหมดเลยได้ไหม ? หรือ หยุดที่ภาษาเดียวเลยดีไหม ? ไปหาคำตอบกันเลยจ้าา :D
สรุปแบบไวที่สุดด กับพื้นฐานตั้งแต่การทำงานของ Software จนไปถึงพื้นฐานการเขียนโปรแกรมเบื้องต้น
ที่ทำให้เราได้ทบทวนพื้นฐาน หรือ รวมความรูทั้งหมดไว้ใน 10 นาที ที่นี่ ที่เดียววว !
**********************************************************************************************************************************************************************************
First step for C++ Programming
C++ จัดเป็นภาษาคอมพิวเตอร์เชิงวัตถุ (Object oriented language) แต่ยังคงสภาพเป็นภาษาเชิงโครงสร้าง (Structure or Procedure oriented language) ไว้ด้วยในขณะเดียวกัน ภาษาคอมพิวเตอร์เชิงวัตถุบางภาษาเช่น Java, Smalltalk ไม่มีคุณสมบัติเช่นนี้ ปัญหาที่มีลักษณะไม่ซับซ้อนมากนัก การออกแบบโปรแกรมให้มีลักษณะเชิงโครงสร้าง สามารถทำได้ง่ายกว่าและรวดเร็วกว่า แต่เมื่อถึงคราวที่จะต้องทำซอฟต์แวร์ขนาดใหญ่ ประกอบด้วยคำสั่งไม่น้อยกว่า สองแสนบรรทัดหรือมากกว่า หรือมีโปรแกรมย่อยขนาดเล็ก ๆ เป็นจำนวนมาก ต้องใช้โปรแกรมเมอร์หลายคน แบ่งหน้ากันทำงาน การเขียนโปรแกรมเชิงวัตถุจะเหมาะสมกว่า เพราะง่ายและสะดวกในการจัดการและบริหารตัวซอฟต์แวร์ที่มีขนาดใหญ่นั้น
ในบทนี้จะกล่าวถึงหัวข้อต่อไปนี้
- ทำไมต้องเป็น C++
- ความเป็นมาของภาษา C++
- โปรแกรมแรก
- ตัวแปรและค่าคงที่ (Variable and Constant)
- ชนิดของข้อมูล (Data type)
- นิพจน์ทางคณิตศาสตร์ (Mathematical Expression)
- การรับข้อมูลทางแป้นพิมพ์
C++ มีลักษณะเฉพาะตัวที่มีความโดดเด่นและเห็นได้ชัดกว่าภาษาคอมพิวเตอร์อื่น ๆ คือ
Object-oriented programming การโปรแกรมเชิงวัตถุทำให้โปรแกรมเมอร์สามารถออกแบบแอพพลิเคชันในมุมมองแบบวัตถุ การ Coding เป็นการกำหนดให้วัตถุที่สร้างสื่อสารซึ่งกันและกัน สามารถนำโค้ดที่สร้างขึ้นกลับนำมาใช้ใหม่ ทำให้เกิดความผิดพลาดน้อยและสร้างผลงานได้อย่างรวดเร็ว
Portability ในทางปฏิบัติสามารถนำโปรแกรมต้นฉบับของภาษา C++ ไปคอมไพล์ในเครื่องคอมพิวเตอร์ในแพลทฟอร์มใด ๆ หรือระบบปฏิบัติการใด ๆ โดยไม่ต้องแก้ไขดัดแปลงใหม่
Brevity คำสั่งในภาษา C++ มีลักษณะสั้น กระชับรัดกุมกว่าภาษาอื่น ๆ (ทำให้คีย์บอร์ด อายุยืนกว่า : < )
Modular Programming สามารถแบ่งโปรแกรมออกเป็นส่วน ๆ คอมไพล์และนำมาลิงค์ด้วยกัน ช่วยประหยัดเวลาการคอมไพล์ ส่วนใดผิดก็สามารถคอมไพล์แล้วแก้ไขเฉพาะส่วนนั้น นอกจากนี้ยังสามารถนำไปเชื่อมต่อกับภาษาอื่น ๆ เช่น แอสเซมบลี ปาสคาล เป็นต้น
C Compatibility โปรแกรมที่เขียนด้วยภาษา C สามารถนำไปใช้ใน C++ โดยไม่ต้องดัดแปลงคำสั่งใด ๆ
Speed โปรแกรมไบนารีที่คอมไพล์โดย C++ จะมีขนาดเล็ก มีประสิทธิภาพ เพราะ C++ เป็นทั้งภาษาชนิด High level และ low level
ประมาณ ปีค.ศ. 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++ ไปใช้ในงานคำนวณ เป็นการหาพื้นที่ของรูปสี่เหลี่ยมผืนผ้า ซึ่งหาได้จากสูตร กว้าง คูณ ยาว source code ของโปรแกรมมีดังนี้
โปรแกรมสั้น ๆ 24 บรรทัดสามารถแยกออกเป็นส่วนประกอบย่อย ๆ โดยเรียงตามลำดับที่ปรากฏในโปรแกรมดังนี้
- หมายเหตุของโปรแกรม (Comment)
- ส่วนกำกับในการแปลโปรแกรม (Preprocessor Directive)
- ฟังก์ชันที่มีชื่อว่า main
- ตัวแปร (Variable)
- Statement
หมายเหตุของโปรแกรม เป็นส่วนที่ผู้เขียนโปรแกรมบันทึกข้อความเช่น บอกชื่อโปรแกรม จุดประสงค์ของโปรแกรม เงื่อนไขการทำงานของโปรแกรม เพื่อสะดวกในการตรวจแก้ หรือเตือนความจำเมื่อกลับมาอ่านภายหลัง คอมไพเลอร์จะไม่ทำการคอมไพล์ในส่วนที่เป็น comment นี้ ในภาษา C++ จะมีหมายเหตุอยู่สองลักษณะคือ comment ที่เกิดจากรวมกันของบรรทัดหลาย ๆ บรรทัด หรือ comment เฉพาะบรรทัดนั้นเพียงบรรทัดเดียว
บรรทัดที่ 1-8 จะใช้สัญลักษณ์ /* (ในบรรทัดที่ 1) และ */ ( บรรทัด ที่ 8) ข้อความที่อยู่ระหว่างเครื่องหมาย /*…..*/ คือส่วนที่เป็น comment
บรรทัดที่ 14 และ 15 ข้อความที่อยู่ท้ายเครื่องหมาย // จนจบบรรทัดจะเป็น comment
ในการแก้ไชโปรแกรม บางครั้งจะกำหนดมิให้คำสั่งบางบรรทัดทำงาน โดยการใส่ // นำหน้าบรรทัดนั้น หรือถ้าต้องการให้ประโยคคำสั่งหลาย ๆ บรรทัด ไม่ให้ทำงานอาจคร่อมด้วยเครื่องหมาย /*…..*/ แต่ต้องระวังคอมไพเลอร์บางบริษัท ฯ อาจไม่ยอมรับการใช้คอมเมนต์ซ้อนคอมเมนต์
ส่วนกำกับในการแปลโปรแกรม (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 จะต้องแจ้งให้คอมไพเลอร์ทราบ โดยเขียนดังนี้
เวอร์ชัน 3 ไฟล์นี้จะถูกเก็บไว้ใน c:\tc\include\ ถ้าเราสร้าง include file ของเราเองเก็บไว้ที่เดียวกับโปรแกรมต้นฉบับในโฟลเดอร์ MyCpp จะต้องแจ้งให้คอมไพเลอร์ทราบ โดยเขียนดังนี้
#include “myheader.h”
ระวังอย่าให้มีช่องว่างในเครื่องหมาย <….> และ “…..”
Preprocessor directive จะขึ้นต้นคำสั่งด้วย # (pound sign) โดยทั่วไปจะถูกนำมาใช้ในลักษณะต่อไปนี้
• ใช้ตัวกำกับ #include เพิ่มหรือแทรกส่วนต่าง ๆ ของโปรแกรม เราสามารถนำตัวแปรต่าง ๆ ไปประกาศไว้ในแฟ้ม include เพียงที่เดียว เพื่อลดความเสี่ยงที่ฟังก์ชันในแฟ้มต้นฉบับอื่น ๆ หาตัวแปรไม่พบ
• ตัวกำกับที่มีเงื่อนไข (conditional directive) เราสามารถใช้ตัวกำกับที่มีเงื่อนไข เช่น #if, #ifdef, #ifndef, #else, #elseif และ #endif
• ใช้ควบคุมการแปลโปรแกรมต้นฉบับให้อยู่ภายใต้เงื่อนไขต่าง ๆ เช่น แปลเพียงส่วนใดส่วนหนึ่งของโปรแกรม หรือนำไปคอมไพล์บนระบบปฏิบัติการที่ต่างกัน
ข้อแนะนำ ถ้าต้องการ debug โปรแกรมเป็นช่วง ๆ สามารถใช้ preprocessor แทน /*…..*/ เพื่อป้องกันการเกิด comment ซ้อน comment เช่น
ฟังก์ชัน main( ) บรรทัดที่ 10 เป็นฟังก์ชันที่มีอยู่เสมอในโปรแกรมภาษา C++ ทุก ๆ โปรแกรม เมื่อเรียกใช้โปรแกรมนี้ให้ทำงาน ระบบปฏิบัติการจะใช้ฟังก์ชัน main() เป็นจุดเริ่มต้นของโปรแกรม จากตัวอย่าง
Int main( ) หมายถึงเมื่อจบการรันโปรแกรม ฟังก์ชัน main( ) จะส่งค่ากลับเป็นจำนวนเต็ม (integer) ไปยังระบบปฏิบัติการ ในที่นี้คือ 0 ดูได้จากบรรทัดที่ 16 return 0; main เป็นชื่อฟังก์ชัน ( ) ในวงเล็บว่างเปล่า แสดงว่าไม่มีพารามิเตอร์ใด ๆ ที่ใช้ในฟังก์ขัน main
คำสั่งโปรแกรมจะอยู่ระหว่างเครื่องหมายปีกกาเสมอ ดังรูปแบบต่อไปนี้
ถึงแม้จะไม่มีค่าว่า int นำหน้า main (และฟังก์ชันอื่น ๆ ก็เช่นกัน) จะถือว่าฟังก์ชันนั้นส่งค่ากลับเป็นแบบจำนวนเต็ม
รูปแบบเต็มของฟังก์ชัน main มีดังนี้
iในระบบปฏิบัติการวินโดวส์ จุดเริ่มต้นของโปรแกรมที่ทำงานภายใต้สภาพแวดล้อมของวินโดวส์จะเป็น
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 = "
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
เราสามารถทำเข่นนี้ได้ โดยอาศัยพารามิเตอร์ของฟังก์ชัน main ดังโปรแกรม 1.2 ดังนี้
[Source code: FindArea.cpp]
เมื่อเราพิมพ์ C: > findarea 45 72 ( กด enter) ค่าความกว้าง 45 เมตรและความยาว 72 เมตร ระบบปฏิบัติการ จะเก็บค่านี้ไว้ในตัวแปร argv[1] และ argv[2] นำค่าที่ได้นี้ไปเก็บไว้ที่ตัวแปร width และ length จากนั้นคำนวณหาพื้นที่สี่เหลี่ยมผืนผ้าเก็บค่าที่ได้ไว้ใน area คำสั่ง cout จะพิมพ์ คำตอบ 3240 ปรากฎบนจอภาพ
โปรแกรมต่อไปนี้ จะตรวจสอบพารามิเตอร์ของฟังก์ชัน main() ที่รับค่าต่าง ๆ จากระบบปฏิบัติการ
[Source code: TestArg.cpp]
เมื่อพิมพ์คำสั่ง
C:> testarg test1 test2 test3 test4 ( กด enter)
ฟังก์ชัน main( ) ของโปรแกรม testarg จะรับค่าพารามิเตอร์มา 5 ค่า ค่าต่าง ๆ จะถูกเก็บไว้ใน argv [ ] ดังรูป
ตัวแปร env[ ] จะเก็บค่าสภาพแวดล้อมของระบบปฏิบัติการ ซึ่งจะแตกต่างกันไปในแต่ละเครื่อง ขึ้นอยู่กับค่าที่กำหนดไว้ใน autoexec.bat และ config.sys ในระบบปฏิบัติการ DOS เราสามารถใช้คำสั่ง set ตรวจสอบสภาพแวดล้อมนี้ได้
ลองทดลองพิมพ์ C:> testarg one two “three four” five six ( กด enter)
ตัวแปรคือเนื้อที่ของหน่วยความจำที่ใช้เก็บข้อมูล ข้อมูลที่เก็บนี้อาจมีการเปลี่ยนแปลงค่าในระหว่างการประมวลผล เราจะกำหนดชื่อ (identifier or variable name) ให้กับตัวแปรเพื่อที่สะดวกในการอ้างอิงถึงในการเขียนโปรแกรม
การกำหนดชื่อตัวแปรมีหลักดังนี้
• มีความยาวกี่ตัวอักษรก็ได้ ต้องขึ้นด้วยตัวอักษร A ถึง Z หรือ a ถึง z และเครื่องหมาย _ (under score) เท่านั้น ขึ้นต้นด้วยตัวเลขไม่ได้
• อักษรถัดจากตัวแรกจะเป็นตัวอักษร หรือ ตัวเลข หรือ เครื่องหมาย _
• ห้ามมีช่องว่างหรือเครื่องหมายทางคณิตศาสตร์ เช่น +, - , *, / , ^, <<, >>, (, ), [, ], {, }, %, $, &
• อักษรตัวใหญ่ตัวเล็ก มีผลต่อชื่อตัวแปร เช่น Area กับ area ภาษา C++ จะถือว่าเป็นตัวแปรคนละตัวกัน
• ชื่อของตัวแปรจะต้องไม่ซ้ำกับคำที่สงวนไว้ ( Reserved word or token) ในภาษา C++ มีดังนี้
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
|
template
|
this
|
throw
|
true
|
try
|
typedef
|
typeid
|
typename
|
union
|
unsigned
|
using
|
virtual
|
void
|
volatile
|
wchar_t
|
while
|
xor
|
xor_eq
|
คำสงวนบางคำ คอมไพเลอร์รุ่นเก่าไม่ได้นับรวมหรือจัดไว้ว่าเป็นคำต้องห้าม ถึงกระนั้นก็ตามเราควรหลีกเลี่ยงชื่อตัวแปรโดยไม่ใช้ชื่อซ้ำกับคำเหล่านี้ คอมไพเลอร์บางบริษัทมีการเพิ่มคำสงวนเพิ่มเฉพาะเข้าไปอีก เช่น Borland compilers for the PC มีการเพิ่มคำว่า near, far, huge, cdecl และ pascal
จะเห็นว่า main, cin และ cout ไม่ใช่เป็นคำสงวน แต่ในทางปฏิบัติไม่ควรตั้งชื่อตัวแปรให้ซ้ำกับคำเหล่านี้เช่นกัน
• การตั้งชื่อตัวแปรควรสื่อความหมาย เพี่อประโยชน์ในการทำความเข้าใจการทำงานของโปรแกรม และสะดวกในการตรวจแก้ไขโปรแกรม
• ในระบบปฏิบัติการวินโดวส์ ได้เสนอแนะให้ใช้การตั้งชื่อตัวแปรแบบ Hungarian notation ซึ่งในชื่ตัวแปรนั้นจะบอกชนิดของข้อมูล วัตถุประสงค์ของตัวแปรว่าจะนำไปใช้ทำอะไร
หลักการตั้งชื่อตัวแปรสารมารถนำไปใช้กับชื่อฟังก์ชัน คลาส และ structure ได้อีกด้วย
จะเป็นตัวบอกให้คอมไพเลอร์รู้ว่าข้อมูลที่เก็บไว้ในหน่วยความจำ จะนำไปประมวลผลในลักษณะใดบ้าง แบ่ง ข้อมูลที่สมารถนำไปคำนวณได้ (numeric data type) หรือเป็นข้อมูลที่ไม่สามารถนำไปคำนวณได้ เช่น อักขระ ต่าง ๆ หรือข้อมูลตรรกะ (Logical data type)
ขนาดของหน่วยความจำที่ใช้เก็บข้อมูลจะแปรเปลี่ยนไปตามระบบปฏิบัติการ หรือตามแพลทฟอร์มของคอมพิวเตอร์ที่ใช้ประมวลผล คอมไพเลอร์ที่ถูกสร้างขึ้น ในระบบปฏิบัติการ DOS และใน Unix จะใช้เนื้อที่ในการเก็บข้อมูลต่างกัน ความแม่นยำ ความถูกต้องของจำนวนเลข ค่าสูงสุด ค่ำต่ำสุดที่เก็บได้จะต่างกันไปด้วย แต่โดยทั่วไป ขนาดของหน่วยความจำที่ใช้เก็บข้อมูลจะเป็นไปตามตารางข้างล่างนี้
ตารางจำแนกชนิดของข้อมูลใน C++
ชนิดข้อมูล | รายละเอียด | จำนวน byte | ค่าที่เป็นไปได้ต่ำสุด | ค่าที่เป็นไปได้สูงสุด |
ข้อมูลที่เก็บแบบจำนวนเต็ม | ||||
char | ข้อมูลชนิดตัวอักษรโดยเก็บรหัส ASCII ของตัวอักษรนั้น | 1 | -128 | 127 |
unsigned char | ข้อมูลชนิดตัวอักษรไม่คิดเครื่องหมาย | 1 | 0 | 255 |
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 |
ข้อมูลที่เก็บแบบเลขทศนิยม ( 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 ดังตัวอย่างต่อไปนี้
[Soruce code : TestLimit.cpp]
ภาษา 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.
โปรแกรมต่อไปนี้จะเป็นโปรแกรมใช้ตรวจสอบขนาดของข้อมูลแต่ละชนิด
[Source code: TestVarSize.cpp]
ข้อสังเกต : sizeof ถือว่าเป็น operator ตัวหนึ่ง ใช้บอกขนาดของหน่วยความจำ ที่ใช้เก็บข้อมูลชนิดนั้น sizeof (ch) อาจเขียนเป็น sizeof ch ก็ได้ โดยที่ไม่ต้องใส่วงเล็บ
ผลของการรันโปรแกรมที่ 1.4 จะเป็นดังนี้
ค่าคงที่ (Symbolic Constants)
ถ้าข้อมูลนั้นไม่มีการเปลี่ยนแปลงค่าตั้งแต่ต้นโปรแกรมจนจบการทำงาน เรานิยมกำหนดข้อมูลนั้นให้เป็นค่าคงที่ การกำหนดชื่อค่าคงที่ จะนำหน้าด้วย const ตามด้วยชนิดของข้อมูล และชื่อค่าคงที่ ปิดท้ายประโยคด้วย ; เสมอ เช่น
Const double PI = 3.141592653;
เมื่อนำไปใช้ในโปรแกรม เช่น area = PI * radius * radius ; ค่า PI จะถูกแทนที่ด้วย 3.141592653..
ตัวอย่างค่าคงที่อื่น ๆ ที่ใช้บ่อยในการคำนวณทางวิทยาศาสตร์ กำหนดให้เป็นค่าคงที่จะได้
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 หมายถึง
32.68
-3e5 หมายถึง
ถ้าต่อท้ายตัวเลขด้วย 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 |
\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 | |
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 ( ), 3.2e6 ( ), 6.23e-34 ( )
โปรแกรม 1.5 จะเป็นการทดสอบว่า เมื่อไม่กำหนดค่าให้กับตัวแปร และบางแห่งมีการกำหนดค่าให้กับตัวแปร คอมไพเลอร์จะแสดงผลการคอมไพล์อย่างไรบ้าง
[Source code: testType.cpp]
ผลลัพธ์การรันโปรแกรม 1.5 จะเป็นดังนี้
ก่อนนำตัวแปรไปใช้งานจะต้องกำหนดค่าเริ่มต้นให้ก่อนเสมอ เพราะคอมไพเลอร์จะไม่เตือนเรื่องการกำหนดค่าเบื้องต้นให้ทราบ สิ่งที่โปรแกรมนำมาแสดงคือ ข้อมูลขยะ ผู้เขียนโปรแกรมจะต้องเป็นฝ่ายรับผิดชอบ และรอบคอบ ในการกำหนดค่าเริ่มต้นให้กับตัวแปรเอง
การแปลงชนิดข้อมูล (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
[Source code: TestCast.cpp]
ผลลัพธ์จากการกำหนดค่า ch ซึ่งเป็นตัวแปรชนิด char ให้มีค่าเป็น “a” ซึ่งมีค่ารหัสอัสกีเท่ากับ 97 เมื่อกำหนดค่านี้ให้กับข้อมูลที่มีชนิดสูงกว่า พบว่าข้อมูลที่เก็บไม่มีความคลาดเคลื่อน ผลของการทำงานของโปรแกรม 1.6 จะเป็นดังนี้
ถ้าการคำนวณทางคณิตศาสตร์เกี่ยวข้องกับข้อมูลต่างชนิดกัน ผลลัพธ์ที่ได้อาจเกิดความคลาดเคลื่อน ตัวอย่างเช่น
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
float (2) = 2.0
float (3/2)= 1.0
float(3)/float(2) = 1.5
[Source code: TestCas2.cpp]
ผลลัพธ์จากการรันโปรแกรม จะเห็นว่า ถึงแม้จะใช้คำสั่ง casting ข้อมูลในบรรทัดที่ 9 ผลลัพธ์ที่ได้มีค่าเท่ากับกำหนดค่าโดยตรง
m = 6
n = 6
เมื่อนำข้อมุลชนิดสูงกว่า เช่น double ไปเก็บไว้ในข้อมูลชนิดต่ำกว่า เช่น integer ดังในตัวอย่าง 1.7 พบว่าเลขทศนิยมจะถูกตัดทิ้ง (truncate) ไม่มีการปัดเศษ
เครื่องหมาย หรือตัวปฏิบัติการ ( 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
เราสามารถนำตัวแปร เครื่องหมายทางคณิตศาสตร์ ค่าคงที่ มาเรียบเรียงเป็นนิพจน์เพื่อนำไปใช้ในการคำนวณได้ สิ่งที่ต้องพึงระวังเป็นอย่างยิ่งในการเขียนข้อความทางคณิตศาสตร์ คือ ต้องรู้ลำดับการทำงานของเครื่องหมาย มิฉะนั้นจะได้ผลการคำนวณออกมาคลาดเคลื่อน โดยที่คอมไพเลอร์ไม่แสดงข้อความเตือนหรือแจ้งข้อผิดพลาดให้ทราบ เช่น
X = 5 + 2*3
จะได้ค่า x เท่ากับ 11 ไม่ใช่ 21 เพราะการคูณมีลำดับการทำงานก่อนเครื่องหมายบวก เพื่อให้ดูเข้าใจง่าย ควรเขียนเป็น
X = 5 + (2*3)
ลำดับการทำงานก่อนหลังของเครื่องหมายทางคณิตศาสตร์เป็นไปดังตารางต่อไปนี้ เครื่องหมายที่อยู่ส่วนบนของตารางจะมี่ลำดับความสำคัญกว่าลำดับที่อยู่รองลงไป เครื่องหมายที่มีลำดับความสำคัญเท่ากัน จะเริ่มกระทำจาซ้ายไปขวา หรือจากขวาไปซ้ายตามที่กำหนดไว้ในตาราง การคูณจะเริ่มคำนวณจากทางซ้ายไปขวามือ 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 ใด ๆ คือ เมื่อ g คือความเร่งเนื่องจากแรงดึงดูดของโลก
y= u* t + 0.5 * g * t* t;
• แรงไฟฟ้าเนื่องจากจุดประจุขนาด q 1 และ q 2 วางห่างกันเป็นระยะ r ใด ๆ หาได้จาก
เมื่อ k คือค่าคงที่
เขียนเป็นนิพจน์ทางคณิตศาสตร์ในภาษา C++ ได้ดังนี้
F = k*q1 * q2/(r*r);
โปรแกรมที่ 1.8 จะเป็นการตรวจสอบลำดับการคำนวณของเครื่องหมายและตัวปฏิบัติการ
[Source code: TestPrecedence.cpp]
คำตอบ ในบรรทัดที่ 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
= 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
= (8*1%4)*3+9
= (0)*3 + 9
= 9
x=(8+9)%5/2 = 17%5/2
= 2/2
= 1
= 2/2
= 1
x=-6*8/-5 = -48%-3
= 0
= 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 ถูกนำไปใช้ในการคำนวณก่อนแล้วจึงมีการเพิ่มค่าหรือลดค่า
ถ้าเขียนแบบนำหน้า (prefix) ++x หรือ –x หมายถึงมีการเพิ่มค่าหรือลดค่าก่อน แล้วจึงนำค่า x ไปคำนวณ
ตัวอย่างการใช้ prefix
Int i=4; j=2;
i= i*j++; จะได้ i=8 และ j =3 นำ j ไปคูณกับ i ก่อน แล้วจึงเพิ่มค่า j
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
i= i*++j; จะได้ i=12 และ j =3 เพิ่มค่า j ก่อน แล้วจึงนำ j ไปคูณกับ i
Int i=4; j=2;
i = i*j--; จะได้ i=8 j =2
i = i*j--; จะได้ i=8 j =2
Int i=4; j=2;
i= i*--j; จะได้ i=4 j =2
i= i*--j; จะได้ i=4 j =2
เมื่อต้องการกำหนดค่าตัวแปรใด โดยวิธีป้อนข้อมูลผ่านแป้นพิมพ์ ภาษา C++ มีคำสั่ง cin (console input – อ่านว่า ซี - อิน) รับข้อมูลจากแป้นพิมพ์ นำไปเก็บไว้ในตัวแปรที่ต้องการ รูปแบบคำสั่งทั่วไปมีดังนี้
cin >> ชื่อตัวแปร 1 >> ชื่อตัวแปร 2 >> …..;
เครื่องหมาย >> เรียกว่า input operator ระวังอย่าสับสนกับ << ของ cout
จากโปรแกรม 1.1 ถ้าต้องการรับค่าความกว้างและความยาวของสี่เหลี่ยมผืนผ้าทางแป้นพิมพ์ ใช้คำสั่ง cin โปรแกรมจะเปลี่ยนไปดังนี้
[Source code: FindArea2.cpp]
เมื่อให้โปรแกรมทำงาน โปรแกรมจะหยุดให้ป้อนค่า ความกว้าง ความยาว ให้เราป้อนตัวเลข 2 จำนวน แยกจากกันโดยใช้เว้นวรรค (เคาะแป้น spacebar)
Input width and length : 22.5 30.2 (กด enter)
เมื่อกด enter จะปรากฏผลลัพธ์บนจอภาพ
Area of rectangle = 679.5 sqr.meter.
แบบฝึกหัดที่ 1.2
1. จงตรวจสอบดูว่านิพจน์ต่อไปนี้ถูกต้องตามหลักของภาษา 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 )
2. จงเขียนคำสั่งต่อไปนี้ให้จบในบรรทัดเดียว
ก. price=price+1;
sum = sum + price;
(เฉลย sum += +price;)
ข. a= a-(b+c);
c = c+1;
(เฉลย a -= (b+c++); )
3. กำหนดให้ int x=2, y=3; ในแต่ละข้อ เมื่อโปรแกรมทำคำสั่งแต่ละบรรทัดจะได้ค่า x, y เท่าใด
• y +=--x; (เฉลย x= 1, y=4 )
• y *=x++; (เฉลย x= 3, y=6 )
4. กำหนดให้ int x=2, y = 4; ในแต่ละนิพจน์ค่า z ( ซึ่งเป็นตัวแปรชนิด int เช่นกัน) จะมีค่าเท่าใด
• z = ++x*y; (เฉลย z = 12 )
• z= x++*y; (เฉลย z = 8 )
5. จงเขียนนิพจน์คณิตศาสตร์ต่อไปนี้ให้อยู่ในรูปประโยคคำสั่งของภาษา C++
ก. x 3 -2x 2 + 5x + 7
ข.
ค. ความเร่งของระบบมวล m 1 และ m 2 คล้องกับเชือกเบาและรอกไม่มีความฝืดมีค่าเป็น
จ. สมการสถานะแก๊สของแวน เดอร์ วาลส์ (Van der Waals) มีรูปสมการเป็น
RT =
เมื่อ T คืออุณหภูมิสมบูรณ์
P คือความดันของแก๊ส
n คือจำนวนโมลของแก๊ส
a,b คือค่าคงที่
R คือค่าคงที่สากลของแก๊ส
V คือปริมาตรของแก๊ส
ฉ. ความเร็วของทรงกระบอกมวล m รัศมี r ที่กลิ้งลงมาถึงปลายพื้นเอียงสูง h หาได้จาก
V =
เมื่อ I คือโมเมนต์ความเฉื่อยของทรงกระบอก
ุ5. จงเขียนโปรแกรมต่อไปนี้
• ระยะทางระหว่างกรุงเทพฯ ถึงเชียงราย เท่ากับ 838 กิโลเมตร จงแปลงระยะทางนี้ให้เป็นไมล์ โดยที่ 1 ไมล์ เท่ากับ 1.6093440 กิโลเมตร
• แปลงน้ำหนักนักมวย 110 ปอนด์ ให้เป็นกิโลกรัม 1 กิโลกรัม เท่ากับ 2.205 ปอนด์
• แปลงอุณหภูมิ 30 องศาเซลเซียส ให้เป็นอุณหภูมิฟาเรนไฮต์ (Fahrenheit) โดยใช้สูตร
• หาพื้นที่ของเซกเตอร์ของวงกลม ซึ่งมีมุมระหว่างรัศมี (d, degree) 30 องศา รัศมี (r) ยาว 2 เมตร พื้นที่ของเซกเตอร์คือ ให้มุมที่วัดเป็นเรเดียน
• จงหาปริมาตร (V, volume) และพื้นที่ผิว (A, Surface area) ของทรงกลมที่มีรัศมี 15 เซนติเมตร
ุ6. ถ้ากำหนดค่า unsigned int num = -1; การคอมไพล์จะเป็นอย่างไร
(เฉลย: คอมไพเลอร์จะเตือน ค่า -1 จะถูกตีความเป็นตัวเลขที่ไม่คิดเครื่องหมาย -1 = 0xff ในเลขฐานสิบหก หรือ 65535 ของเลขฐานสิบ )
7. ถ้ากำหนดค่า int number = 6.3;
(เฉลย: คอมไพเลอร์จะแจ้งเตือนเช่นเดียวกัน ตัวเลขที่เก็บไว้จะถูกตัดให้เหลือเฉพาะจำนวนเต็มคือ 6 )
8. ประโยคต่อไปนี้ใช้ comment ถูกหรือไม่
cout << “First try in C++ // my first time in C++”;
9. โปรแกรมต่อไปนี้คอมไพล์ผ่านหรือไม่
main() {
2000; // y2k year
return 0;
}
10. ในแต่ละข้อต่อไปนี้ เป็นการประกาศตัวแปรที่ผิดหรือไม่ ถ้าผิด แก้ไขให้ถูกต้อง
• int old = 60; new =20;
• int a = b= 5;
• double float c;
11. โปรแกรมต่อไปนี้คอมไพล์ผ่านหรือไม่
main() {
c =35;
cout << c << endl;
}