ความรู้เบื้องต้นเกี่ยวกับโปรแกรมภาษาซี
ใบความรู้ที่ 2
เรื่อง ความรู้เบื้องต้นเกี่ยวกับโปรแกรมภาษาซี
ภาษาซี(C)
- ประวัติความเป็นมาของภาษาซี
ปี ค.ศ. 1972 Dennis Ritchie เป็นผู้คิดค้นสร้างภาษาซีขึ้นเป็นครั้งแรกโดยพัฒนามาจากภาษา B และภาษา BCPL แต่ขณะนั้นยังไม่มีการใช้งานภาษาซีอย่างกว้างขวางนัก จนกระทั่งต่อมาในปี ค.ศ. 1978 Brian Kernighanได้ร่วมกับ Dennis Ritchie พัฒนามาตรฐานของภาษาซีขึ้นเรียกว่า “K&R”(Kernighan & Ritchie) และเขียนหนังสือชื่อ “The C Programming Language” ออกมาเป็นเล่มแรกทำให้มีผู้สนใจภาษาซีเพิ่มมากขึ้น และด้วยความยืดหยุ่นของภาษาซีที่สามารถปรับใช้งานกับคอมพิวเตอร์ชนิดต่าง ๆ ได้ ทำให้ภาษาซีได้รับความนิยมแพร่หลายไปทั่วโลก จนมีบริษัทต่าง ๆ สร้างและผลิตภาษาซี ออกมาเป็นจำนวนมาก เกิดเป็นภาษาซีในหลากหลายรูปแบบเนื่องจากในขณะนั้นยังไม่มีการกำหนดมาตรฐานสำหรับการสร้างภาษาซี ดังนั้นในปี ค.ศ. 1988 Ritchie และ Kernighanจึงได้ร่วมกับ ANSI สร้างมาตรฐานของภาษาซีขึ้น เรียกว่า ANSI C เพื่อใช้เป็นตัวกำหนดมาตรฐานในการสร้างภาษาซีรุ่นต่อ ๆ ไป
ปัจจุบันภาษาซียังคงได้รับความนิยมและใช้งานอย่างกว้างขวางเนื่องจากเป็นภาษาระดับสูง ที่เหมาะกับการเขียนโปรแกรมแบบโครงสร้าง (Structured Programming) และเป็นภาษาที่มีความยืดหยุ่นมาก คือใช้งานกับเครื่องต่างๆ ได้ และที่สำคัญในปัจจุบัน ภาษาโปรแกรมรุ่นใหม่ เช่น C++, Perl Java , C# , PHP ยังใช้หลักการของภาษาซีเป็นพื้นฐานด้วย กล่าวคือ หากมีพื้นฐานของภาษาซีมาก่อน ก็จะสามารถศึกษาภาษารุ่นใหม่เหล่านี้ง่ายขึ้น
- ลักษณะเด่นของภาษา C (Features of C)
- ความสามารถในการใช้งานบนสภาพแวดล้อมที่แตกต่างกัน (Portability) ลักษณะเด่นนี้ถือเป็นจุดเด่นของภาษา C เลยทีเดียว กล่าวคือ ภาษา C สามารถโปรแกรมหรือรันอยู่บนคอมพิวเตอร์ได้หลายระดับ ตั้งแต่เมนเฟรมคอมพิวเตอร์ จนถึงไมโครคอมพิวเตอร์ ซึ่งเมื่อเทียบกับภาษาอื่น ๆ แล้ว ยากที่จะหาภาษาใดเทียบเคียงได้เท่า ดังนั้น คำสั่งภาษา C ที่เขียนในคอมพิวเตอร์ระดับหนึ่ง สามารถนำมาใช้งานบนคอมพิวเตอร์อีกระดับหนึ่งได้โดยไม่ต้องเปลี่ยนแปลงชุดคำสั่งเลย หรืออาจต้องเปลี่ยนแปลงบางชุดคำสั่งเพียงเล็กน้อย อีกทั้งยังสามารนำโปรแกรมภาษา C ไปใช้งานบนระบบปฏิบัติการที่หลากหลาย ถึงแม้ว่าจะมีรูปแบบที่แตกต่างกันก็ตาม
- มีประสิทธิภาพ (Efficiency) ภาษา C มีชุดคำสั่งที่มีความกะทัดรัด และมีการจัดการหน่วยความจำที่ประสิทธิภาพสูงมาก ส่งผลให้มีการทำงานที่รวดเร็ว เทียบเท่าภาษาระดับต่ำ ทั้งนี้เนื่องจากภาษา C มีความใกล้ชิดกับฮาร์ดแวร์มากกว่าภาษาระดับสูงอื่น ๆ โดยสามารถติดต่อกับรีจิสเตอร์ และหน่วยความจำได้โดยตรงเช่นเดียวกับภาษาแอสเซมบลี
- ความสามารถในการเขียนโปรแกรมแบบโมดูล (Modularity) ภาษา C อนุญาตให้มีการแบ่งโมดูลเพื่อคอมไพล์ได้ ซึ่งสามารถลิงค์เชื่อมโยงเข้าด้วยกันได้อีก รูปแบบโปรแกรมสามารถเขียนขึ้นได้ตามแบบแผนการโปรแกรมเชิงโครงสร้างได้อย่างดีเยี่ยม ภาษา C คือภาษาที่ประกอบด้วยฟังก์ชัน ทั้งนี้โมดูลต่างๆ จะเขียนอยู่ในรูปแบบของฟังก์ชันทั้งสิ้น
- พอยน์เตอร์ (Pointer Operations) ภาษา C มีความสามารถในการทำงานแบบ พอยน์เตอร์เป็นอย่างมาก ยากที่จะพบได้ในภาษาระดับสูงทั่วไป โดยพอยน์เตอร์หรือตัวชี้สามารถกำหนดได้จากชนิดข้อมูล (Data Types) หลายชนิดด้วยกัน เช่นเดียวกับฟังก์ชัน หรือโครงสร้าง รวมถึงตัวแปรแบบอาร์เรย์ ก็ยังสามารถถูกจัดการด้วยการนำพอยเตอร์เข้ามาช่วยก็ยังได้
- มีความยืดหยุ่นสูง (Flexible Level) ถึงแม้ว่าภาษา C จะจัดอยู่ในภาษาคอมพิวเตอร์ระดับสูงก็ตาม แต่ภาษา C ก็ยังสามารถเขียนใช้งานร่วมกับภาษาระดับต่ำอย่างภาษาแอสเซมบลีได้ ดังนั้นในบางครั้งจึงมีการกล่าวว่า ภาษา C เป็นภาษาที่อยู่กึ่งกลางระหว่างภาษาระดับสูงและภาษาระดับต่ำ
- ตัวอักษรตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ แตกต่างกัน (Case Sensitivity) ตามปกติภาษาระดับสูงทั่วไป ตัวแปรที่ตั้งขึ้นด้วยอักษรตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ สามารถนำมาใช้งานร่วมกันได้ แต่ในภาษา C จะถือว่ามีความหมายแตกต่างกัน ดังนั้น ตัวอักษรพิมพ์ใหญ่ (Upper Case) และอักษรตัวพิมพ์เล็ก (Lower Case) จะมีความแตกต่างกันอย่างสิ้นเชิง เช่น NUM ไม่เท่ากับ num ในขณะเดียวกัน Num ก็จะไม่เท่ากับ num เช่นกัน ดังนั้นการอ้างอิงชื่อตัวแปรและชื่อฟังก์ชัน จึงต้องอ้างอิงบนชื่อที่ถูกต้องด้วย
- ขั้นตอนการพัฒนาโปรแกรมภาษาซี
- ขั้นตอนเขียนโปรแกรม (source code) โดยใช้ editor เขียนโปรแกรมภาษาซีและทำการบันทึกไฟล์ต้นฉบับให้มีนามสกุลเป็น .cpp เช่น cpp เป็นต้น editor คือ โปรแกรมที่ใช้สำหรับการเขียนโปรแกรม โดยตัวอย่างของ editor ที่นิยมนำมาใช้ในการเขียนโปรแกรมได้แก่ Notepad, Edit Plus , Turbo C , Dev C++ เป็นต้น ผู้เขียนโปรแกรมสามารถเลือกใช้โปรแกรมใดในการเรียนโปรแกรมก็ได้ แล้วแต่ความถนัดของแต่ละบุคคล
- ขั้นตอนคอมไพล์โปรแกรม (compile) นำ source code จากขั้นตอนที่ 1 มาทำการคอมไพล์ เพื่อแปลจากภาษาซีที่มนุษย์เข้าใจไปเป็นภาษาเครื่องที่คอมพิวเตอร์เข้าใจได้ ในขั้นตอนนี้คอมไพเลอร์จะทำการตรวจสอบ source code ว่าเกิดข้อผิดพลาดหรือไม่ หากเกิดข้อผิดพลาด จะแจ้งให้ผู้เขียนโปรแกรมทราบ ผู้เขียนโปรแกรมจะต้องกลับไปแก้ไขโปรแกรม และทำการคอมไพล์โปรแกรมใหม่อีกครั้ง หากไม่พบข้อผิดพลาด คอมไพเลอร์จะแปลไฟล์ source code จากภาษาซีไปเป็นภาษาเครื่อง ( ไฟล์นามสกุล .obj) เช่นถ้าไฟล์ source code ชื่อ cpp ก็จะถูกแปลไปเป็นไฟล์ work.obj ซึ่งเก็บภาษาเครื่องไว้เป็นต้น
- ขั้นตอนเชื่อมโยงโปรแกรม (link) การเขียนโปรแกรมภาษาซีนั้นผู้เขียนโปรแกรม ไม่จำเป็นต้องเขียนคำสั่งต่าง ๆ ขึ้นใช้งานเอง เนื่องจากภาษาซีมีฟังก์ชั่นมาตรฐานให้ผู้เขียนโปรแกรมสามารถเรียกใช้งานได้ เช่น การเขียนโปรแกรมแสดงข้อความ “Love C” ออกทางหน้าจอ ผู้เขียนโปรแกรมสามารถเรียกใช้ฟังก์ชั่น printf() ซึ่งเป็นฟังก์ชั่นมาตรฐานของภาษาซีมาใช้งานได้ โดยส่วนการประกาศ (declaration) ของฟังก์ชั่นมาตรฐานต่าง ๆ จะถูกจัดเก็บอยู่ในเฮดเดอร์ไฟล์ ด้วยเหตุนี้ภาษาเครื่องที่ได้จากขั้นตอนที่ 2 จึงยังไม่สามารถนำไปใช้งานได้ แต่ต้องนำมาเชื่อมโยงเข้ากับ library ก่อน ซึ่งผลจากการเชื่อมโยงจะทำให้ได้ executable program ( ไฟล์นามสกุล .exe เช่น exe) ที่สามารถนำไปใช้งานได้
- ขั้นตอนประมวลผล (Run) เมื่อนำ executable program จากขั้นตอนที่ 3 มาประมวลผลก็จะได้ผลลัพธ์ (output) ของโปรแกรม
โครงสร้างของโปรแกรมภาษาซี
โครงสร้างของโปรแกรมภาษาซีแบ่งออกเป็น 3 ส่วน ดังนี้
1: | #include <stdio.h> โครงสร้างที่ 1 | |
2: | main( ) โครงสร้างที่ 2 | |
3: | { | |
4: | . . . โครงสร้างที่ 3 | |
5: | } |
4.1. ส่วนหัวของโปรแกรม (Preprocessing Directive) ใช้ระบุเพื่อบอกให้คอมไพเลอร์กระทำการใด ๆ ก่อนการแปลผลโปรแกรมในที่นี่คำสั่ง #include <stdio.h>ใช้บอกกับคอมไพเลอร์ให้นำเฮดเดอร์ไฟล์ที่ระบุ เช่น stdio.h เข้าร่วมในการแปลโปรแกรมด้วย โดยการกำหนด preprocessing directives นี้จะต้องขึ้นต้นด้วยเครื่องหมาย # เสมอ
เฮดเดอร์ไฟล์เป็นไฟล์ชนิดข้อความ (Text File) ที่ภายในโปรแกรมจะมีการประกาศค่าตัวแปร และค่าคงที่ต่างๆ ซึ่งจะบรรจุฟังก์ชันมาตรฐานต่าง ๆ รวมเข้าด้วยกันตามลักษณะงานเดียวกันไว้ และจัดเก็บลงในไลบรารี โดยจะถูกนำเข้ามาอ่านรวมกันกับชุดคำสั่งในโปรแกรมในขณะคอมไพล์
เฮดเดอร์ไฟล์ชื่อ stdio.h จัดเป็นเฮดเดอร์ไฟล์ของฟังก์ชันหนึ่งในไลบรารีมาตรฐาน ซึ่งมักถูกเรียกใช้งานอยู่บ่อย ๆ เนื่องจากเกี่ยวข้องกับอินพุตและเอาต์พุต เช่น ฟังก์ชัน printf() ที่ใช้สำหรับสั่งพิมพ์ตัวแปรหรือข้อความ ฟังก์ชัน scanf() ที่ใช้สำหรับรับค่าตัวแปร เป็นต้น ซึ่งทั้งสองฟังก์ชัน ถูกผนวกอยู่ในเฮดเดอร์ไฟล์ชื่อ stdio.h นั่นเอง ดังนั้น หากภายในโปรแกรมได้มีการเรียกใช้งานฟังก์ชัน printf() หรือฟังก์ชัน scanf() และมิได้ผนวกเฮดเดอร์ไฟล์ stdio.h เข้าไปในโปรแกรม เมื่อคอมไพล์โปรแกรมก็จะเกิดข้อผิดพลาด เนื่องจากคอมไพเลอร์ไม่รู้จักฟังก์ชัน printf() หรือฟังก์ชัน scanf() อย่างไรก็ตามโปรแกรมภาษา C ที่เขียนขึ้น สามารถผนวกเฮดเดอร์ไฟล์หลาย ๆ ไฟล์ได้ตามความจำเป็น
คำสั่งที่ใช้ระบุให้คอมไพเลอร์นำเฮดเดอร์ไฟล์เข้าร่วมในการแปลโปรแกรม สามารถเขียนได้ 2 รูปแบบ คือ #include <ชื่อเฮดเดอร์ไฟล์> โดยชื่อเฮดเดอร์ไฟล์ ที่จำเป็นในการเขียนโปรแกรม คือ <stdio.h> และ <conio.h>
สำหรับความหมายของพรีโปสเซสเซอร์(Preprocessing)นั้นก็คือ “ตัวประมวลผลก่อน” ซึ่งจะต้องถูกกำหนดไว้นอกฟังก์ชันเสมอ โดยในส่วนนี้จะได้รับการประมวลผลก่อนชุดคำสั่งภายในฟังก์ชัน จึงเป็นที่มาของคำว่าพรีโปรเซสเซอร์นั่นเอง และการเขียนพรีโปรเซสเซอร์จะต้องนำหน้าด้วยเครื่องหมาย # เสมอ ซึ่งพรีโปรเซสเซอร์ที่มีอยู่ในภาษา C มีดังนี้
#if #ifdef #ifndef
#else #elif #endif #include #define #undef #line #error #pragma |
4.2. ส่วนของฟังก์ชั่นหลัก (Main Function) ฟังก์ชั่นหลักของภาษาซี คือ ฟังก์ชั่น main( ) ซึ่งโปรแกรมภาษาซีทุกโปรแกรมจะต้องมีฟังก์ชั่นนี้อยู่ในโปรแกรมเสมอ จะเห็นได้จากชื่อฟังก์ชั่นคือ main แปลว่า “ หลัก ” ดังนั้น การเขียนโปรแกรมภาษาซีจึงขาดฟังก์ชั่นนี้ไปไม่ได้ โดยการทำงานของฟังก์ชั่นจะเริ่มต้นที่เครื่องหมาย { และจะสิ้นสุดที่เครื่องหมาย } ฟังก์ชั่น main( ) สามารถเขียนในรูปแบบของ void main(void) ก็ได้มีความหมายเหมือนกัน คือ หมายความว่า ฟังก์ชั่น main() จะไม่มีอาร์กิวเมนต์ (argument) คือไม่มีการรับค่าใด ๆ เข้ามาประมวลผลภายในฟังก์ชั่น และจะไม่มีการคืนค่าใด ๆ กลับออกไปจากฟังก์ชั่นด้วย
1:
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: |
#include <stdio.h>
int add(int num1, int num2) ฟังก์ชันที่สร้างขึ้นเอง { int sum; sum = num1 + num2; return sum; } void main( ) ฟังก์ชันหลัก { int n1 = 10, n2 = 5, ans = 0; ans = add(n1,n2); เรียกฟังก์ชัน add เพื่อสั่งให้ทำงาน printf(²summation=%d\n², ans); } |
4.3. ประโยคคำสั่ง (Compound Statement) ประโยคคำสั่งในที่นี้หมายถึง ชุดคำสั่งที่บรรจุอยู่ในฟังก์ชันนั้น ๆ ซึ่งอาจเป็น
- ประโยคที่ใช้สำหรับประกาศตัวแปร (Variable Declaration) หรือการกำหนดค่าเริ่มต้นให้กับตัวแปรต่าง ๆ โดยจำเป็นต้องได้รับการประกาศตัวแปรนั้นๆ ด้วย
- ประโยคนิพจน์คณิตศาสตร์ เช่น ประโยคคำนวณตัวเลขต่างๆ
- ประโยคคำสั่งควบคุมอื่น ๆ เช่น คำสั่งควบคุมวงจรลูป คำสั่งควบคุมเงื่อนไข เป็นต้น
ประโยคคำสั่งเหล่านี้จะถูกบรรจุอยู่ภายในบล็อก { } เพื่อบอกจุดเริ่มต้นและจุดสิ้นสุดการทำงานภายในบล็อก เครื่องหมายปีกกาก็ยังสามารถมีบล็อก { } ซ้อนย่อยเข้าไปได้อีก ที่สำคัญ เมื่อสิ้นสุดประโยคใด ๆ จะต้องลงท้ายด้วย ; (Semicolon) เสมอ
- คอมเมนต์ (comment) คือส่วนที่เป็นหมายเหตุของโปรแกรม มีไว้เพื่อให้ผู้เขียนโปรแกรมใส่ข้อความอธิบายกำกับลงไปใน source code ซึ่งคอมไพเลอร์จะข้ามการแปลผลในส่วนที่เป็นคอมเมนตซึ่งในภาษาซีมี 2 แบบ คือ
- คอมเมนต์แบบบรรทัดเดียว ใช้เครื่องหมาย //
- คอมเมนต์แบบหลายบรรทัด ใช้เครื่องหมาย /* และ */
- กฎเกณฑ์การเขียนโปรแกรมภาษา C
สำหรับกฎเกณฑ์การเขียนโปรแกรมภาษา C สามารถสรุปได้ดังนี้
- จะต้องกำหนดพรีโปรเซสเซอร์ที่ต้นโปรแกรมก่อน เช่น #include <stdio.h>
- คำสั่งต่าง ๆ จะใช้อักษรตัวพิมพ์เล็ก ยกเว้นชื่อตัวแปรหรือชื่อฟังก์ชั่น
- ตัวแปรที่ใช้งานในโปรแกรม จะต้องถูกประกาศไว้เสมอ
- ภายในโปรแกรมจะต้องมีอย่างน้อยหนึ่งฟังก์ชัน ซึ่งก็คือ ฟังก์ชัน main ()
- ใช้เครื่องหมาย { เพื่อบอกจุดเริ่มต้นของชุดคำสั่ง และเครื่องหมาย } เพื่อบอกจุดสิ้นสุดของชุดคำสั่งโดยสามารถมีเครื่องหมาย { } ซ้อนอยู่ภายในได้
- สิ้นสุดของแต่ละประโยคคำสั่ง จะต้องจบด้วยเครื่องหมาย ;
- สามารถใช้เครื่องหมาย /*comment*/ หรือ //comment เพื่อระบุหมายเหตุภายในโปรแกรม โดยข้อความอธิบายภายในเครื่องหมายดังกล่าว จะไม่ถูกนำมาประมวลผล
- กฎการตั้งชื่อ
ภาษาซีมีกฎเกณฑ์ในการตั้งชื่อให้กับ Identifier ซึ่งหมายถึงตัวแปร, ฟังก์ชั่น ดังนี้
- ชื่อที่ตั้งจะต้องไม่ซ้ำกับคำสงวน (reserved word) ในภาษาซี
asm
auto break case cdecl char const continue |
default
do double else enum extern far float |
for
goto huge if int interrupt long near |
pascal
register return short signed sezeof static struct |
switch
typedef union unsigned void volatile while _cs |
_ds
es _ss |
- ชื่อต่างๆ ที่ตั้งจะเป็นแบบ case-sensitive หมายความว่าตัวอักษรใหญ่กับตัวอักษรเล็ก ถือว่าเป็นคนละตัวกัน เช่น TEST, Test, test, tEsT ถือว่าเป็นคนละชื่อ
- ชื่อจะต้องขึ้นต้นด้วยตัวอักษรหรือเครื่องหมาย underscore ( _ ) เท่านั้น จะขึ้นต้นด้วยตัวเลขไม่ได้ แต่ภายในชื่อสามารถประกอบด้วยตัวอักษร เครื่องหมาย underscore หรือตัวเลขก็ได้ เช่น TEST_VALUE, HELLO123, h1_T2, _UserName เป็นต้น
- การตั้งชื่อจะเว้นวรรค (มีช่องว่างหรือแท็บภายในชื่อ) ไม่ได้
- การตั้งชื่อจะประกอบด้วยอักขรพิเศษ เช่น $ , @ , # , & ไม่ได้