ตัวแปรและชนิดข้อมูล 2

ภาษา c           จากบทความ ตัวแปรและชนิดข้อมูลภาษาซี นี้เป็นต่อที่2 นะครับผมแยกเอาไว้เพราะเดียวมันจะยาวเกินไปจนน่าเบื่อ มาโม้มาเยอะแล้วเรามาต่อกันเลยดีกว่า ในภาค2 ของ ตัวแปรและชนิดข้อมูลภาษาซี ครับ

 

ความสำพันธ์ระหว่างตัวแปรและชนิดข้อมูล

มันจะแสดงออกมาในรูปแบบ การประกาศตัวแปร คือ ในการประการตัวแปรขึ้นมาใช้งานแต่ละครั้ง จำเป็นต้องกำหนดชนิดข้อมูลของตัวแปรนั้นด้วย การกำหนดชนิดข้อมูลให้กำตัวแปรใดๆ ต้องคำหนึ่งถึง ขนาดของข้อมูลในการที่จะเก็บหรือใช้ เพราะท่าเล็กเกินไป program จะ error ได้ และท่าใหญ่เกินความจำเป็นก็จะทำให้กินเนื้อที่เกินความจำเป็น การเลือกชนิดตัวแปรนั้นมีความสำคัญมาก ต้องเลือกให้ดีนะครับ
รูปแบบการประกาศตัวแปร
        ชนิดตัวแปร  ตัวแปร;
รูปแบบ
     

  int a =1;
  char ch[4]='one';
  printf("%d - %d =%s",2,a, ch);

เช่น
char ch;  เป็นการประการตัวแปร ch ให้เป็นชนิดข้อมูลแบบตัวอักษร
int num;  เป็นการประการตัวแปร num ให้เป็นชนิดข้อมูลแบบตัวเลขจำนวนเต็ม
float as;  เป็นการประการตัวแปร ac ให้เป็นชนิดข้อมูลแบบตัวเลขจำนวนจริง(ทศนิยม มี6 หลักด้วย ^^)

การกำหนดค่าให้กับตัวแปร

นอกจากการประการตัวแปรแล้วเรายังกำหนดค่าให้มันได้ด้วยนะครับ
char ch ='a'; /* ประกาศตัวแปรพร้อมกำหนดค่าเริ่มต้น
int num=10; ให้กับตัวแปรด้วย
float avg=14.66564; */
 
char ch; /*
int num; ประกาศตัวแปรก่อน
float avg; แล้วกำหนดค่า
ch='a'; ให้ตัวแปรที่หลัง
num='10';  
avg=23.22234; */
 
int num1, num2=0; /*ทำการปรกาศตัวแปร num1 และ num2 ขึ้นมา ให้ตัวแปรสองตัวนี้เป็นชนิดข้อมูล
  แบบเลขจำนวนเต็ม และให้ num2 มีค่าเริ่มต้นเป็น 0*/
 
 


ประเภทตัวแปร


ตัวแปรที่เราประกาศขึ้นนั้นสามารถแบ่งออกได้เป็น 2 ประเภทดั้งนี้
ตัวแปรแบบโกบอล(Global Variable)
คือตัวแปรที่ประกาศขึ้นภาคนอกฟังก์ชั่นทุกฟังก์ชั่น เมือตัวแปรอยู่นอกฟังก์ชั่น ก็ หมายความว่าเป็นตัวแปร สาธารณะ ไม่มีฟังก์ชั่นใครเป็นเจ้าของ ดังนั้นทุกฟังก์ชั่นเลยสามารถเรียกใช้ได้
ตัวแปรแบบโลคอล(Local Variable)คือตัวแปรภายในฟังก์ชั่น เป็นตัวแปรที่มีฟังก์ชั่นใดรฟังก์ชั่นหนึ่งเป็นเจ้าของ คือมันอยู่ในฟังก์ชั่นใด ฟังก์ชั้นนั้นจะเป็นเจ้าของตัวแปรนั้น และฟังก์ชั้นอืนไม่สามารถเรียกใช้ได้
ตัวอย่างแสดงการใช้งาน Global และ Local
1:
  #include<stdio.h>
2:
   
3:
  int num=10;
4:
   
5:
  int testver(int x){
6:
  int n = 4, sum=0;
7:
  sum = n * x ;
8:
  return sum;
9:
  }
10:
   
11:
  void main(){
12:
  int xnum;
13:
  printf("Global var num is %d\n",num);
14:
  xnum=testver(num);
15:
  xnum=xnum * n;
16:
  printf("Local var is %d\n",x);
17:
  }

 
ผลลัพธ์โปรแกรม
 
คอมไพล์ไม่ผ่าน

เพราะบรรทัดที่15 ครับที่ทำให้เกิดการErrorของโปรแกรม รู้ใหมว่าทำไมมาดูกันเถอะ
อธิบายโปรแกรม
บรรทัดที่ 3 : ประกาศตัวแปร num เป็น global veriable ซึ่งทุกฟังก์ชั้นสามารถเรียกใช้ได้
บรรทัดที่ 6 : ประกาศตัวแปร n และ sum เป็น Local veriable ซึ่งเจ้าของตัวแปร n และ sum มีฟังก์ชั่น testver() เป็นเจ้าของ เพราะฉนั้น จะมีแค่ testver() เท่านั้นที่ใช้ได้
บรรทัดที่ 12: ประกาศตัวแปล xnum เป็น Local veriable ซึ่งจะใช้ได้แค่ Function main() เท่านั้น
บรรทัดที่ 14: เป็นการเรียกใช้เรียกใช้ Function testver() โดยส่งพารามิเตอร์เป็นเลขจำนวนเต็มเข้าไปใน Function โดยตัวที่ส่งไปคือค่าของ num นั้นเอง
บรรทัดที่ 5 : function testver() รับค่าเลขจำนวนเต็ม num ซึ่งมีค่าเท่ากับ 10 เข้ามาใน Function จากนั้นก็นำไปคูณกับ n ที่เป็นตัวแปลโลคอลได้ผลเท่ากับ 40 แล้วเก็บค่าไว้ที่ตัวแปร sum แล้วค่อยส่งค่ากับสู่ function main() ในบรรทัดที่ 14
บบรทัดที่ 15: พอถึงตรงนี้โปรแกรมก็เกิดปัญหาเพราะ เราเรียกใช้ ตัวแปลแบบ Local ของ Function testvar() คือตัว n นั้นเองครับ โดยมันจะแสดงว่า
Error : Undefined symbol 'n' in function main
ท่าอยากให้โปรแกรมนี้แสดงผล ผู้อ่านลองแก้ code program ดูครับ ^_^

Storage Class คือ


Storage Class เป็นสิ่งที่ใช้กำหนดขอบเขตการทำงานของตัวแปรว่าจะให้ใครเข้ามาใช้ได้ ไม่ได้ เรื่องของเวลาในการทำงาน ว่าจะให้โปรแกรมเก็บค่าของตัวแปรไว้นานเท่าใด โดยๅ Storge Class แบ่งออกเป็น 4 ประเภท ตามภาพนี้
ภาษา c
auto ใช้ในการประกาศ automaatic variable ก็คือตัวแปรแบบ local นั้นเอง ตัวแปรประเภทนี้เป็นตัวแปรทั้วไป เช่นเมื่อเราประกาศว่า
  int a =2;
  float b=1.33;
ทั้ง a และ b ก็จะถูกกำหนดใหนเป็น automaatic variable เลยทันทีโดย อัตโนมัติ มีความหมายเป็น
auti int a =2;
auto float b=1.33;

โดยทั่วไปเราไม่จำเป็นต้องระบุ auto ก็ได้เพราะ มันจะเป็น automaatic variable ให้โดยอัตโนมัติ อยู่แล้ว ซึ่งตัวแปรประเภทนี้จะใช้งานได้แค่ในฟังก์ชันตัวเองเท่านั้น เพราะมันจะถูกสร้างขึ้นเมื่อเข้ามาใน function แล้วจะถูกทำลายทิ้งไปโดยอัตโนมัติ เมื่อออกจาก function จึงเป็นเหตุที่ให้ function อืนใช้งานตัวมันไม่ได้ ครับ
extern เอาง่ายๆเลยนะมันคือตัวแปรแบบ Globle นั้นเอง ทุกฟังก์ชั่นมองเห็นและใช้งานได้ แต่จะเป็นตัวแปรที่มีการประกาศใช้งานอยู่ในfile อื่นนะครับ โดยการระบุ extern ไว้ข้างหน้าชนิดของตัวแปรเพื่อทำการอ้างอิงไปยังตัวแปรนั้น
ตัวอย่างเพื่อแสดงการทำงานของ extern
1:
  //test.c
2:
   
3:
  #include<stdio.h> //#include คือการนำเข้าของไฟล์
4:
  #include"sum.c"
5:
  int n=10;
6:
  main(){
7:
       showprint();
8:
  }
   
     
1:
  //sum.c
2:
   
3:
  #include<stdio.h>
4:
  extern int n; //บรรทัดนี้ได้อ้างอิงไปยังบรรทัดที่ 5 ของไฟล์test.c
5:
  void showprint(){
6:
  printf("Number sum is %d\n",n+5);
7:
  }

 
ผลลัพธ์โปรแกรม
 
Number sum is 15
ผมจะไม่อธิบายมากเดียวงง ไปใหญ่ ของยกให้ทุกท่าดูการอ้างอิง ของ extern เท่านั้น
Static มันอาจจะเป็นตัวแปรแบบGlobal หรือ Local ก็ได้ แต่ที่นิยมกันมาที่สุดก็จะให้มันเป็นแบบ Local โดย static มันจะถูกสร้างขึ้นเมื่อเริ่มโปรแกรม และถูกทำเมื่อจบโปรแกรม ยำ จบโปรแกรม ไม่ใช้ ฟังก์ชั่น อย่าไปงงกับ ตัวแปรชนิด auto นะครับ เพราะเหตุนี้ แม้มันจะออกจากฟังก์ชั่นค่าของมันก็จะไม่ถูกลบทิ้ง และเมื่อมันกลับเข้ามาอีกทีค่าก็จะเป็นค่าเดิมที่ก่อนออกฟังก์ชั่น เดียวไปดูตัวอย่างดีกว่าจะได้เข้าใจง่ายๆ
//test static   //test auto
#include <stdio.h>   #include <stdio.h>
void step(void);   void step(void);
     
void main(){   void main(){
int i;   int i;
for(i=0;i<5,i++){   for(i=0;i<5,i++){
    step();       step();
}   }
     
void step(){   void step(){
static int a=0;   auto int b=0;
a++;   b++;
printf("a = %d\n",a);   printf("b = %d\n",b);
}   }
     

 
ผลลัพธ์โปรแกรม
     
ผลลัพธ์โปรแกรม
 
a = 1
a = 2
a = 3
a = 4
a = 5
  b = 1
b = 1
b = 1
b = 1
b = 1

อธิบายโปรแกรม
ตัวแปร a เป็น static variable และ ตัวแปร b เป็น auto variable จากผลลัพธ์จะเห็นได้ว่า ตัวแปร b จะเป็นค่าเดิมใหการแสดงทุกครั้ง เพราะทุกครั้งเมื่อออกจากฟังก์ชั่น step() จะโดนทำลายทิ้งไปทุกครั้ง จะไม่มีการเก็บค่าเดินไว้ที่ตัวแปร b เลย คือ เมื่อเข้าสู้ function ครั้งใดก็จะ รีเซ็ตค่าตัวแปรทุกครั้ง  ส่วนตัวแปร a ซึ่ง เป็น static variable นั้นค่าเพิ่มขึ้นครั้งละ1 เป็นเพราะเมือมันออกจาก function มันไม่ได้มีการ ทำลายทิ้ง คือ เมื่อกลับเข้าไปใน function อีกครั้ง มันก็จะเริ้มจากค่าที่ออกจาก function ครั้งล่าสุด เพราะมันไม่มีการรีเซต จนกว่าจะจบ โปรแกรมครับ
regiter การประกาศ ตัวแปร regiter นั้นเป็นการประกาศตัวแปรเพื่อจัดเก็บในความจำรอง(รีจิสเตอร์) ซึ่งต่างจากที่ผ่านมา(พวกนั้นเป็นความจำหลัก) โดยตัวการประกาศตัวแปรประเภทนี้ จะทำให้สามารถเข้าถึงได้ตัวแปรได้เร็วกว่าตัวแปรที่เก็บในหน่วยความจำหลัก เนื่องจากรีจิสเตอร์เป็นหน่วยความจำที่อยู่ภายใน CPU แต่ควรระหวังในการใช้ด้วยเพราะอาจทำให้ รีจิสเตอร์ เต็ม จากจะทำให้โปรแกรมที่เขียนนั้นเร็ว กลับกลายเป็นช้าได้นะครับ

มาดูConstabt (ค่าคงที่)กันหน่อย

ค่าคงที่สามารถจำแนกได้3 ประเภท คือ Literal,Defined,Memory เรามาดูว่าแต่ละอย่างทำน่าที่อย่างไรนะครับ
Literal constant
คือ ค่าคงที่ที่เป็นข้อมูลที่แน่นอน ค่าคงที่พวกนี้ไม่จำเป็นต้องมีตัวแปลมาลองรับ สามากำหนดเข้าไปได้เลยครับ ดูภาพนี้เพื่อความเข้าใจ
ภาษา c
Defined costant
เป็นค่าคงที่ซึ่งต้องกำหนดในส่วนหัวของโปรแกรมในลักษณะของ Preprocessing Directives เช่น
#define NUM_MAX 10
ตัวอย่าง การกำหนด Defined
1:   #include<stdio.h>
2:   #define NUM_MAX 10
3:     /*เทียบได้กับ
4:   main(){  
5:   int i;  
6:   for(i=0;i< NUM_MAX;i++){ for(i=0;i<10;i++){
7:   printf("%d\n",i); printf("%d\n",i);
8:   } } */
9:   }
     
อธิบายโปรแกรม
                บรรณทัดที่ 2 : กำหนด define constant ชื่อ NUM_MAX ให้มีค่าเป็น10
                บรรณทัดที่ 6 : เป็นการเรียกใช้ NUM_MAX ซึ่งมีค่าเทียบเท่า10
 
ข้อความจำ
 
การตังชื่อให้กับ defined constant นั้นจะต้องเป็นไปตามหลักของภาษาซี และส่วนมากจะนิยมตั้งชื่อให้เป็นตัวใหญ่เพราะจะได้ดูง่ายครับ และที่สำคัญคือค่า defined constant นี้มันจะใช้แทนค่าตามที่เรากำหนดให้ช่วงต้นเท่านั้นครับ จนกว่าจะจบโปรแกรม ครับ
Memory constant
เป็นการกำหนดรูปแบบของตัวแปร ซึ่งเมื่อทำการกำหนดค่าในลักษณะนี้แล้วตัวแปรที่ถูกกำหนดค่าจะมีค่าตามที่เรากำหนดไปจนกว่าจะจบโปรแกรมนั้นเลยครับซึ่งเราจะไม่สามารถเปลี่ยนแปลงค่านั้นไม่ได้เลยครับ รูปแบบการกำหนดก็เป็นไปตามนี้

        const int x = 10;
รูปแบบ
     
นี้คือตัวอย่างโปรแกรมแสดงการกำหนดค่าคงที่แบบ Memory constants
1:   #include<stdio.h>
2:    
4:   main(){
5:     const int x = 10;
6:   printf("You num memory constant :%d",x);
7:      x = 200;
8:   printf("You num memory constant :%d",x);
9:    
10:   }
ผลลัพธ์โปรแกรมนี้คือ รันไม่ออกครับ เพราะอะไรกัน มาดูกันเถอะ
ซึ่งท่าดุแบบ ผิวเผินโปรแกรมนี้ผลของโปรแกรมน่าจะออกมาเป็น ตามนี้ใช่ประครับ
You num memory constant :10
You num memory constant : 200
ซึ่งมันจะเป็นเช่นนั้นไม่ได้ เพราะ ค่า x เราประกาศเป็น Memory constants ก็อย่างที่บอกว่าเราไม่สามารถปรับเปลียน ค่าได้ไม่ ว่า จะทำยังไงก็ตาม จนกว่ามันจะจบโปรแกรมด้วย
 
ข้อความจำ
 
ข้อควรระวัง คือ การกำหนดรูปแบบ ค่าคงที่แบบ Defined constant อาศัยหลักการทำงานของ Processing Directives ดั้งนั้นค่าที่กำหนดที่ส่วนหัวของโปรแกรมเท่านั้น ส่วน รูปแบบของ Memory constant จะถูกกำหนดในFunction ด้วย keyword const การเรียกใช้ควรระมัดระวังเพราะอาจจะทำให้สับสนได้ ครับ

#include<stdio.h>
#define ST 42.111        // Defined Constant
main(){
const int n = 20;          //Memory Constant
}

>>การรับและแสดงผลข้อมูล

0 ความคิดเห็น:

แสดงความคิดเห็น