การเขียนโปรแกรมภาษา C เบื้องต้น ตอนที่ 1 : รู้จักกับโครงสร้างของภาษา C

Picture1_thumb19_thumb
พื้นฐานเริ่มต้นเป็นสิ่งสำคัญที่จะทำให้เขียนโปรแกรมภาษา C ได้ โดยถ้าพื้นฐานเข้าใจแล้วยากกว่านั้นก็จะเข้าใจได้อย่างไม่ยาก โครงสร้างของภาษา C โดยทั่วไปจะเป็นแบบนี้และจะคล้ายกันทั้งหมด ไม่ว่าจะใช้ IDE ของเจ้าไหน จะว่าเป็นกฏเลยก็ว่าได้ 
Comment line
// my first program in C

บรรทัดนี้คือ comment line โดยจะมี // ขึ้นต้น เอาไว้ใช้บ่งบอกรายละเอียดอะไรก็ตามที่ผู้เขียนอยากจะ comment ไว้ ณ บรรทัดนั้นๆ ซึ่งบรรทัดที่มี // จะไม่ถูก compile และจะไม่มีผลกับการรันโปรแกรม โดยในโปรแกรมนี้นั้นผมเอาไว้ใช้บ่งบอกรายละเอียดว่านี่เป็น my first program in C


Header Files
#include <stdio.h> 
#include <conio.h>

บรรทัดที่ขึ้นต้นด้วยเครื่องหมาย # คือตัวที่บ่งชี้สำหรับการ preprocessor ในที่นี้กล่าวคือเป็น header files ซึ่งได้เก็บไลบรารี่มาตรฐานของภาษา C เอาไว้หรือไลบรารี่อื่นๆที่เราเขียนขึ้นมาเองหรือเอามาจากที่อื่นก็ได้ โดยจะถูกนำมารวม compile ไว้เพื่อนำมาใช้กับโปรแกรม โดยจะเขียนในลักษณะนี้


#include <ชื่อเฮดเดอร์ไฟล์> หรือ
#include “ชื่อเฮดเดอร์ไฟล์”


โดยในกรณีของโปรแกรมนี้ได้ include มา 2 ไฟล์ คือ stdio.h ซึ่งเป็นไลบรารี่มาตรฐานชื่อเต็มว่า Standard Input and Output Library ซึ่งเอาไว้จัดการฟังก์ชันอินพุตเอาท์พุต ส่วนอีกอันคือ conio.h ซึ่งเป็นไลบรารี่ฟังก์ชั่นการติดต่อกับส่วนแสดงผล

Function Prototype
void function_2();

บรรทัดนี้เป็นการประกาศฟังก์ชัน prototype ใช้ในกรณีที่เราต้องการเรียกใช้ฟังก์ชันย่อยซึ่งอยู่ข้างล่างบรรทัดที่เราเรียกใช้ ตัวอย่างเช่น ในกรณีโปรแกรมข้างบน จะเห็นได้ว่าเราเรียกใช้ function_2(); ใน function int main() แต่ว่า function_2(); นั้นเป็นฟังก์ชันย่อยที่อยู่ข้างล่าง ในกรณีอย่างนี้ต้องทำการประกาศ function prototype ไม่งั้นจะ compile ไม่ผ่าน เดี้ยวเรื่องฟังก์ชันย่อยจะไปพูดกันอีกทีในตอนหลังๆ

Global variables
int j;

บรรทัดนี้คือการประกาศตัวแปร แต่การประกาศตัวแปรตรงภายนอกฟังก์ชันนั้นจะเรียกว่า Global variable ซึ่งความหมายของ “Global” คือ "ทั้งหมด" นั่นหมายความว่าตัวแปรที่ถูกประกาศตรงบริเวณนี้จะเป็นตัวแปรแบบทั้งหมด ซึ่งสามารถนำไปใช้ได้และเข้าถึงได้กับทุกฟังก์ชันที่เขียนไว้ข้างล่าง


Function


void function_1()
{   
  j = j+2;
}


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

Main Function
int main()
{   
  int i;   
  for(i=0;i<5;i++)   
  {    
   function_1();    
   printf("i = %d , j = %d\n",i,j);                    
  }   
  function_2();    
  getch();
}

ส่วนนี้คือส่วนหลักของโปรแกรมเลย โดยทุกโปรแกรมภาษา C จะทำงานโดยเริ่มจากบรรทัดแรกภายใต้ฟังก์ชัน main นี้ ทุกๆโปรแกรมจะต้องมีฟังก์นี้และเป็นส่วนหลักในการทำงานทุกอย่าง สังเกตตัวแปร i ตัวแปรที่ประกาศภายในฟังกชันนี้จะเรียกว่าตัวแปรแบบ local ซึ่งจะมีผลและเรียกใช้ได้ภายในฟังก์ชันนี้เท่านั้น โดย Function_1() และ Function_2() จะไม่สามารถเรียกใช้ตัวแปรนี้ได้โดยตรง

Function


void function_2()
{     
  int k=10;     
  j=20;     
  printf("k = %d\n",k);     
  printf("j = %d\n",j); 
}


ส่วนนี่ก็เป็นฟังกชันย่อยอีกฟังก์ชันนึง แต่ฟังก์ชันนี้อยู่ข้างล่างฟังก์ชัน main โดยสังเกตได้ว่าฟังก์ชัน main ได้เรียกใช้ฟังก์ชันนี้ ดังนั้นแล้วเราจึงต้องประกาศ Function Prototype ของ void function_2() ด้วย ไม่งั้นฟังก์ชัน main จะไม่สามารถเรียกใช้ได้ซึ่งเราได้ทำการประกาศไว้ข้างบนเรียบร้อยแล้ว ทีนี้ให้สังเกตที่ตัวแปร ทั้ง 2 ตัวในฟังก์ชัน ตัวแปร k คือตัวแปรแบบ local ซึ่งทำการกำหนดค่าไว้เท่ากับ 10 และ ได้ทำการกำหนดค่าตัวแปร j ไว้เท่ากับ 20 แสดงให้เห็นถึงตัวแปรแบบ Global ที่สามารถเข้าถึงได้อย่างทั่วถึงทุกฟังก์ชัน

ลองพิมพ์ตามและทำการ Compile & Run ผลที่ได้จะเป็นแบบนี้


Test_Structure_Run_thumb3_thumb




เพิ่มเติม


- ให้ลองทำการใส่ตัว comment เพื่อไม่ให้บรรทัดนั้นทำการ Compile โดยให้ใส่ตัว // ไว้หน้า void function_2(); ที่บริเวณ Function Prototype แล้วสังเกตดูว่าเกิดอะไรขึ้น

- ให้ลองทำการใส่ตัว comment เพื่อไม่ให้บรรทัดนั้นทำการ Compile โดยให้ใส่ตัว // ไว้หน้า int j; ที่บริเวณ Global variables ครับ แล้วสังเกตดูว่าเกิดอะไรขึ้น

- ให้ลองทำการย้ายบรรทัด function_2(); ที่อยู่ในฟังก์ชัน main ไปไว้บนก่อนบรรทัด for(i=0;i<5;i++) แล้วให้สังเกตผลลัพธ์จากการ Run โปรแกรม

- ให้ลองทำการใส่ตัว comment เพื่อไม่ให้บรรทัดนั้นทำการ Compile โดยให้ใส่ตัว // ไว้หน้า getch(); ในฟังก์ชัน main

Comments

Popular posts from this blog

MCS-51 Based Tachometer (เครื่องวัดความเร็วรอบ)

สร้าง Traindata สำหรับ OCR ด้วย Tesseract

การเชื่อมต่อและการเขียนโปรแกรมใช้งาน Rotary Encoder แบบ X4 Counting