ความรู้เบื้องต้นเกี่ยวกับโปรแกรมภาษาซี

ใบความรู้ที่ 2

เรื่อง ความรู้เบื้องต้นเกี่ยวกับโปรแกรมภาษาซี

 

ภาษาซี(C)

  1. ประวัติความเป็นมาของภาษาซี

ปี ค.ศ. 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 ยังใช้หลักการของภาษาซีเป็นพื้นฐานด้วย  กล่าวคือ หากมีพื้นฐานของภาษาซีมาก่อน ก็จะสามารถศึกษาภาษารุ่นใหม่เหล่านี้ง่ายขึ้น

 

  1. ลักษณะเด่นของภาษา 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 เช่นกัน ดังนั้นการอ้างอิงชื่อตัวแปรและชื่อฟังก์ชัน จึงต้องอ้างอิงบนชื่อที่ถูกต้องด้วย
  2. ขั้นตอนการพัฒนาโปรแกรมภาษาซี
    • ขั้นตอนเขียนโปรแกรม (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 แบบ คือ
  • คอมเมนต์แบบบรรทัดเดียว ใช้เครื่องหมาย //
  • คอมเมนต์แบบหลายบรรทัด ใช้เครื่องหมาย /* และ */
  1. กฎเกณฑ์การเขียนโปรแกรมภาษา C

สำหรับกฎเกณฑ์การเขียนโปรแกรมภาษา C สามารถสรุปได้ดังนี้

  • จะต้องกำหนดพรีโปรเซสเซอร์ที่ต้นโปรแกรมก่อน เช่น #include <stdio.h>
  • คำสั่งต่าง ๆ จะใช้อักษรตัวพิมพ์เล็ก ยกเว้นชื่อตัวแปรหรือชื่อฟังก์ชั่น
  • ตัวแปรที่ใช้งานในโปรแกรม จะต้องถูกประกาศไว้เสมอ
  • ภายในโปรแกรมจะต้องมีอย่างน้อยหนึ่งฟังก์ชัน ซึ่งก็คือ ฟังก์ชัน main ()
  • ใช้เครื่องหมาย { เพื่อบอกจุดเริ่มต้นของชุดคำสั่ง และเครื่องหมาย } เพื่อบอกจุดสิ้นสุดของชุดคำสั่งโดยสามารถมีเครื่องหมาย { } ซ้อนอยู่ภายในได้
  • สิ้นสุดของแต่ละประโยคคำสั่ง จะต้องจบด้วยเครื่องหมาย ;
  • สามารถใช้เครื่องหมาย /*comment*/ หรือ //comment เพื่อระบุหมายเหตุภายในโปรแกรม โดยข้อความอธิบายภายในเครื่องหมายดังกล่าว จะไม่ถูกนำมาประมวลผล
  1. กฎการตั้งชื่อ

ภาษาซีมีกฎเกณฑ์ในการตั้งชื่อให้กับ 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  เป็นต้น
  • การตั้งชื่อจะเว้นวรรค (มีช่องว่างหรือแท็บภายในชื่อ)  ไม่ได้
  • การตั้งชื่อจะประกอบด้วยอักขรพิเศษ เช่น $ , @ , # , & ไม่ได้