:
ข้อมูลพื้นฐานและตัวดำเนินการ
ในบทนี้ เราจะเรียนรู้เกี่ยวกับองค์ประกอบพื้นฐานในการเขียนโปรแกรมภาษาซีกัน

Variable 
ตัวแปร (Variable)  คือ สิ่งที่จะช่วยเราจำค่าต่างๆ ไว้แสดงค่าหรือคำนวณในภายหลัง
โดยตัวแปรเหล่านี้จะเก็บค่าเอาไว้ในหน่วยความจำ (Memory) ของคอมพิวเตอร์นั่นเอง

การประกาศตัวแปร (Declarations) ก่อนที่เราจะนำตัวแปรมาใช้ได้ เราต้องประกาศตัวแปรก่อน (การสร้างมันขึ้นมา) โดยมีรูปแบบดังนี้

int number;
char letter;

int และ char คือประเภทของข้อมูล ที่ตัวแปรนั้นๆสามารถเก็บได้ ส่วน number และ letter คือชื่อของตัวแปร
ซึ่งเวลาเราจะเรียกข้อมูลที่เก็บค่าเอาไว้มาใช้ ก็ใช้ชื่อตัวแปรนี่แหละ ต่อไปมาดูประเภทของข้อมูลกันดีกว่า

Type nameMeaning
charใช้เก็บ ตัวอักษร หรืออักขระ 1 ตัว (Character)
intใช้เก็บ เลขจำนวนเต็ม (Integer)
floatใช้เก็บ เลขจำนวนจริง (Floating number)
doubleใช้เก็บ เลขจำนวนจริง มีขนาดใหญ่กว่า float เก็บได้ละเอียดกว่า

  * แนะนำให้ใช้ double ในการเก็บค่าประเภทเลขจำนวนจริงแทน float เสมอ
      เพราะ double มีความละเอียดมากกว่า ผิดพลาดน้อยกว่า (แม้จะใช้ Memory มากก็ตาม)

การกำหนดค่าตัวแปร คือการเปลี่ยนค่าที่ตัวแปรนั้นๆ เก็บไว้ในหน่วยความจำ เป็นค่าที่กำหนด

int x;     // declare x as a integer variable
x = 5;   // assign a value to x
บรรทัดแรกคือการประกาศตัวแปรที่มีชื่อว่า  x  ไว้เก็บข้อมูลประเภทเลขจำนวนเต็ม (Integer)
บรรทัดที่สอง คือการกำหนดค่าตัวแปร ในที่นี้เป็นการกำหนดค่า 5 ลงในตัวแปร x

เราสามารถกำหนดค่าตัวแปรพร้อมๆ กับการประกาศตัวแปรได้ ดังนี้


int x = 5;
char c = 'A';


การแสดงผลด้่วยคำสั่ง printf() มีรูปแบบดังนี้


int x = 5, y = 7;
float z = 392.65;
char c = 'A';

printf( "x + y = %d\n", x + y );        // %d - integer
printf( "z = %f\n", z );         // %f  - floating number
printf( "c = %c\n", c );        // %c - character
ผลลัพธ์
x + y = 12
z = 392.649994
c = A

จะเห็นได้ว่า  ใช้ %d กับตัวแปรประเภทเลขจำนวนเต็ม (Integer)
      ใช้ %f  กับตัวแปรประเภทเลขทศนิยม (Floating number)
      ใช้ %c กับตัวแปรประเภทอักขระ (Character)
เรายังสามารถใช้ %o %x %e %g กับตัวแปรประเภทตัวเลขได้อีกด้วย



--------------------------------------------------------
แบบฝึกหัดที่ 3.4
------------------------------------------------------------

จงเขียนโค้ด ประกาศตัวแปรดังรายละเอียดต่อไปนี้   
ชื่อตัวแปร:     myFirstVar                 (ตัวใหญ่ตัวเล็กสังเกตให้ดีด้วย)
ค่าในตัวแปร:  23.61
เสร็จแล้ว ให้แสดงผลลัพธ์ออกมาให้เหมือนด้านล่างนี้

ผลลัพธ์
The value of my first variable is: 23.61

หมายเหตุ:  ให้เลือกใช้ประเภทของตัวแปรให้เหมาะสมกับประเภทของข้อมูลที่ให้เก็บค่า


Variable naming 

ชื่อตัวแปรนั้น หากว่าอยากจะใช้ชื่อไหน ก็สรรหามาประกาศกันได้ คงจะสับสนกันน่าดู
ภาษาซีมีกฏเกณฑ์ในการตั้งชื่อตัวแปรดังนี้
     1.  ต้องประกอบขึ้นจากตัวอักษรภาษาอังกฤษ ตัวเลข และเครื่องหมาย  _  (Underscore) เท่านั้น
     2.  อักขระตัวแรกจะต้องเป็นตัวอักษรภาษาอังกฤษ หรือเครื่องหมาย  _  เท่านั้น (ห้ามเป็นตัวเลข)
     3.  ตัวพิมพ์ใหญ่ และตัวพิมพ์เล็กถือเป็นคนละตัวกัน เช่น Salary และ SALARY เป็นชื่อที่แตกต่างกัน
     4.  มีความยาวไม่เกิน 31 อักขระ
     5.  ชื่อจะต้องไม่ซ้ำกับคำสงวน (Reserved word)

คำสงวนของภาษาซี มีดังนี้

auto  double    intstruct
break elselongswitch
caseenumregister    typedef
charexternreturnunion
constfloatshortunsigned
continue    forsignedvoid
defaultgotosizeofvolatile
doifstaticwhile


ถ้าเราตั้งชื่อตัวแปร ไม่เป็นไปตามกฏ โปรแกรมก็จะไม่สามารถทำงานได้

นอกจากนี้ยังมีสิ่งที่ควรรู้ในการตั้งชื่ออีกคือ
     - ไม่ควรตั้งชื่อตัวแปรโดยใ้ช้ตัวพิมพ์ใหญ่ทั้งหมด เพราะอาจถูกเข้าใจผิดว่าเป็น ค่าคงที่ (มีในบทถัดไป)
     - หากชื่อนั้นประกอบขึ้นจากคำหลายคำ ให้ใช้  _  คั่นแต่ละคำ เช่น  student_info_nickname
        หรือใช้ตัวพิมพ์ใหญ่แทน  เช่น     studentInfoNickname
     - และอีกอันที่ขาดไม่ได้คือ ควรตั้งชื่อให้สื่อความหมาย ว่าตัวแปรนั้นๆ เก็บข้อมูลอะไรไว้อยู่
        เช่น  student_id  เราสามารถทราบได้ทันทีว่าเป็นข้อมูล ID ของนักเรียน
        แต่หากตั้งชื่อแค่ว่า    data    เราไม่สามารถทราบได้ว่าเป็นข้อมูลอะไร
        หากมาอ่านในภายหลังจะทำความเข้าใจได้ลำบาก



จงวิเคราะห์ชื่อตัวแปรตามกฎการตั้งชื่อ ว่า ชื่อใด สามารถใช้ได้ และใช้ไม่ได้เพราะเหตุใด
customerName
ID
address1
%available
auto
Int
3rdSubject
_sys_one
address_2
number5

จุดสังเกต: ตัวพิมพ์ใหญ่ หรือตัวพิมพ์เล็ก สังเกตกันให้ดีๆ นะครับ


Constant variable 

ตัวแปรค่าคงที่ (Constant variable) คือ ตัวแปรที่สามารถกำหนดค่าได้เพียงครั้งเดียว
นั่นคือตอนประกาศตัวแปร หลังจากนั้น จะไม่สามารถเปลี่ยนแปลงค่าที่ตัวแปรนั้นเก็บไว้ได้อีก

การประกาศตัวแปรค่าคงที่ ทำได้ดังนี้


#include <stdio.h>
#define  MAX_NUMBER  10   
int main() {
     printf( "Value from constant variable: %d", MAX_NUMBER );
}

ผลลัพธ์
Value from constant variable: 10
* โดยเรานิยมตั้งชื่อตัวแปรค่าคงที่ ด้วยตัวพิมพ์ใหญ่ทั้งหมด

คำสั่งต่างๆ รวมถึงการประกาศตัวแปรที่ผ่านมา ล้วนอยู่ระหว่าง  {  และ } ที่ตามหลัง main() ทั้งสิ้น
แต่การประกาศตัวแปรค่าคงที่นั้น เราจะใส่ไว้เหนือ main() ดังตัวอย่างด้านบน โดยมีรูปแบบคือ
   #define  ชื่อตัวแปรค่าคงที่   ค่าคงที่ที่ต้องการเก็บ
* ให้สังเกตว่า ไม่ต้องมีเครื่องหมาย ; (Semicolon) ตามหลัง


วิธีนำมาใช้ เหมือนกับตัวแปรปกติทุกประการ ต่างกันตรงที่ไม่สามารถเปลี่ยนแปลงค่าที่เก็บไว้ได้โค๊ด
#include <stdio.h>
#define  FACTOR  5

int main() {
    int x = 3, y = 4;
    x = y + FACTOR;
    printf( "x = %d\n", x );
    printf( "y = %d\n", y);
    printf( "FACTOR = %d", FACTOR );
}
ผลลัพธ์
x = 9
y = 4
FACTOR = 5
Tip: เราสามารถประกาศตัวแปรที่เป็นประเภทเดียวกัน พร้อมกันในบรรทัดเดียวได้ โดยใช้  ,  (Comma) คั่น

จะเห็นได้ว่า เดิมที ตอนประกาศตัวแปร ตัวแปร x ถูกกำหนดค่าไว้เป็น 3
แต่บรรทัดต่อมาตัวแปร x ได้ถูกกำหนดค่าใหม่อีกครั้ง โดยมีค่าเท่ากับ
ค่าของตัวแปร y บวกด้วย ค่าของตัวแปรค่าคงที่ FACTOR  ซึ่งมีค่าเท่ากับ  4 + 5
ทำให้ตัวแปร x มีค่าเปลี่ยนไปเป็น 9  ส่วนตัวแปร y และตัวแปรค่าคงที่ยังมีค่าเท่าเดิมคือ 4, 5 ตามลำดับ

เราไม่สามารถเขียนแบบนี้ได้
        FACTOR = 7;       หรือ       FACTOR = x + y + 5;
เพราะ FACTOR เป็นตัวแปรค่าคงที่ จะกำหนดค่าใหม่ หรือเปลี่ยนแปลงค่ามิได้



--------------------------------------------------------
แบบฝึกหัดที่ 3.5
------------------------------------------------------------
จากโค๊ดเริ่มต้นที่กำหนดให้ จะเห็นได้ว่ามีการใช้ตัวแปร  PI  ในการคำนวณ
แต่ยังไม่มีการประกาศ และกำหนดค่าให้กับตัวแปร  PI  แต่อย่างใด

จงแก้ไขโค๊ดที่กำหนดให้ ให้สามารถทำงานได้อย่างถูกต้อง
โดยการ ประกาศให้  PI  เป็นตัวแปรค่าคงที่ และมีค่าเท่ากับ  3.1415926


#include <stdio.h>
       int main() {
       int radius = 14;
       double circleArea = PI * radius * radius;
       printf("radius: %d\n", radius);
       printf("area of circle: %lf", circleArea);
}


Operators 

ตัวดำเนินการคำนวณพื้นฐาน มีดังนี้
        +   ตัวดำเนินการ     บวก
        -   ตัวดำเนินการ     ลบ
        *   ตัวดำเนินการ     คูณ
        /   ตัวดำเนินการ     หาร
        %   ตัวดำเนินการมอดูลัส (Modulus) หรือหารแล้วเอาเฉพาะเศษนั่นเอง
เราสามารถใช้ตัวดำเนินการคำนวณเหล่านี้ ทำการคำนวณแล้วเก็บค่าไว้ในตัวแปร
หรือแสดงผลลัพธ์ออกมาเลยก็ได้ ดังตัวอย่างต่อไปนี้

#include <stdio.h>
       int main() {
       int x = 7, y = 3;
       int sum, mod, div;
       sum = x + y;
       mod = x % y;
       div = x / y;
       printf("sum = %d\n", sum);
       printf("x + y = %d\n", x + y);
       printf("mod = %d\n", mod);
       printf("div = %d\n", div);
       printf("%d + %d + %d = %d", sum, mod, div, sum + mod + div);
}

ผลลัพธ์
sum = 10
x + y = 10
mod = 1
div = 2
10 + 1 + 2 = 13

ถ้าสังเกตดีๆ จะเห็นว่า  div  หรือ  x / y  มีค่าเป็น  2  ไม่ใช่  2.333  ทั้งนี้เพราะว่า
         int ทำอะไรกับ    int   ก็ต้องได้    int
          7     /      3     =     2
(โดยคอมพิวเตอร์จะแปลง  2.333 ให้เป็น  int  ด้วยการปัดทศนิยมทิ้ง)
ในทำนองเดียวกัน
         double ทำอะไรกับ   double ก็ย่อมได้  double
ข้อมูลจำพวกตัวเลขประเภทอื่นก็เ่ช่นเดียวกัน
แล้วถ้า เลขสองตัวนั้น เป็นคนละประเภทหล่ะ จะเป็นอย่างไร ?
       int   ทำอะไรกับ   double    ก็ต้องได้    double

* อันนี้ต้องจำ ระวังคำนวณพลาดเพราะจุดนี้นะครับ
แล้วถ้าอยากให้  7 / 3  มีค่าเท่ากับ   2.333  หล่ะจะทำอย่างไร
เราก็ต้องแปลง 7 กับ 3 ตัวใดตัวหนึ่ง หรือทั้งสองตัวให้เป็น double ซะก่อน
มี 2 วิธี ดังนี้
         7.0  +  3.0      หรีิอ     (double) 7 + (double) 3
ใช่แล้วครับวิธีแรกคือการเติม  .0  ให้กับเลขจำนวณเต็ม เลขนั้นก็จะกลายเป็นเลขที่มีทศนิยมเป็น 0 ซึ่งเป็น
double ทันที  ส่วนอีกวิธีหนึ่งคือการใส่ (double) ไว้ด้านหน้าตัวเลขที่เราต้องการจะแปลง เลขตัึวนั้น
ก็จะถูกเปลี่ยนให้เป็น double ทันที  ในทำนองเดียวกัน (int),(long),(float) ก็ทำได้เช่นกัน
แต่ว่าวิธีแรกนั้น จะไม่สามารถใช้กับตัวแปรได้ ต้องใช้วิธีหลังคือการเติม (double) เท่านั้นดังนี้
       (double) x + (double) y
โดยจะทำการแปลงค่าที่ถูกเรียกใช้มาจากตัวแปร  x  และ  y  เป็น  double
แต่ค่าที่เก็บไว้ใน  x และ  y  ยังคงเป็น  int เหมือนเดิม ไม่ถูกเปลี่ยนแปลง อย่าสับสนนะครับ
ทีนี้เราลองมาเขียนโค๊ดกันดู

#include <stdio.h>
       int main() {
       int x = 7, y = 3;
       int div = (double) x / (double) y;
       printf("result = %d", div);
}

ผลลัพธ์
result = 2

อ้าว ไหนเราอุตส่าห์แปลงค่าจากตัวแปรให้เป็น double แล้วไง ทำไมยังได้ 2 อยู่หล่ะ
ที่เป็นอย่างนี้ เพราะว่า  div นั้นเป็นตัวแปรประเภท  int  นั่นเอง
สิ่งที่จะเก็บเข้าตัวแปรประเภท  int จะถูกแปลงให้เป็น  int  โดยอัตโนมัติ
ดังนั้นเราต้องประกาศ  div  ให้เป็นตัวแปรประเภท  double  ด้วย
และอย่าลืมที่เปลี่ยน  %d  เป็น  %lf  ด้วยนะครับ เดี๋ยวจะผิดซ้ำสองโค๊ด
int x = 7, y = 3;
double div = (double) x / (double) y;
printf("result = %lf", div);
ผลลัพธ์
result = 2.333333
ก็เป็นอันที่เรียบร้อยสำหรับหน้านี้



--------------------------------------------------------
แบบฝึกหัดที่ 3.6
------------------------------------------------------------
จากโค้ด จงแก้โค้ดให้ได้ผลลัพธ์ตามที่ต้องการ
int x = 7, y = 3;
int div = (double) x / (double) y;
printf("result = %lf", div);

ผลลัพธ์
result = 2.33
----------------------------------------------------------------
Refer: Link
----------------------------------------------------------------