การตั้งชื่อตัวแปร
1. ต้องขึ้นต้นด้วยตัวอักษรหรือเครื่องหมาย underscore เท่านั้น
2. ตัวต่อไปจะเป็นตัวเลขหรือตัวอักษรหรือเครื่องหมาย underscore
3. ชื่อมีความยาวไม่จำกัด (ตั้งยาวเกินได้ แต่ compiler จำแนกได้เพียง 31 ตัวแรกเท่านั้น ตั้งเกินจึงไม่มีประโยชน์)
4.ห้ามตั้งชื่อตรงกับคำสงวนในภาษาซี ซึ่งมี 33 คำ ดังนี้
asm auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
5. ชื่อตัวแปรควรสื่อความหมายของตัวแปรเพื่อป้องกันความสับสนของการพิจารณาโปรแกรม
การประกาศตัวแปร
ในการจะใช้งานตัวแปรจะต้องมีการประกาศชนิดและชื่อของตัวแปรนั้นก่อน โดยการประกาศตัวแปรใช้รูปแบบ คือ
ชนิดของตัวแปร ชื่อตัวแปร
โดยถ้ามีตัวแปรชนิดเดียวอาจประกาศพร้อมกันโดยใช้ คอมมา คั่นระหว่างชื่อของตัวแปร ถ้ามีการกำหนดค่าให้ใช้เครื่องหมาย = และใช้เครื่องหมายแสดงการจบคำสั่งเมื่อสิ้นสุด คำสั่ง ตัวอย่าง เช่น
char name, day = 'S' , surname[20] ="Kodedee";
int x=5 ,y,z[100]; float a=5.00 ,b,c; double k=1.234567, m ;
การประกาศค่าคงที่(หรือตัวคงที่)
ค่าคงที่มีลักษณะทำนองเดียวกับตัวแปร แต่เป็นตัวแปรที่มีค่าไม่เปลี่ยนแปลง การประกาศทำได้ 2 แบบ คือใช่คำสั่ง const ดังนี้
const ชนิดของข้อมูล ชื่อตัวแปร = ค่าของตัวแปร;
เช่น
const int num1 = 5;
const float vat = 0.07;
const char student[10] = ‘Bush’;
ใช้ directive #define (เคยอธิบายมาแล้ว) ดังนี้
#define ชื่อตัวคงที่ ค่าคงที่
เช่น
#define NUM1 5
#define VAT 0.07
#define STUDENT Bush
โปรแกรม MinGW ได้กำหนดค่าคงที่มาให้ไว้ด้วย โดยค่าคงที่ที่เป็นจำนวนเต็มจะเก็บไว้ใน header file คือ limits.h ส่วนจำนวนจริงจะอยู่ใน float.h ดังตัวอย่างในโปรแกรม con_max_min.c ที่แสดงไว้
/* con_max_min.c */
#include <stdio.h>
#include <limits.h>
main()
{
printf("\n\tConstants names\tValue\n");
printf("\n\tCHAR_BIT \t%d",CHAR_BIT);
printf("\n\tCHAR_MAX \t%d",CHAR_MAX);
printf("\n\tCHAR_MIN \t%d",CHAR_MIN);
printf("\n\tSCHAR_MAX \t%d",SCHAR_MAX);
printf("\n\tSCHAR_MIN \t%d",SCHAR_MIN);
printf("\n\tINT_MAX \t%d",INT_MAX);
printf("\n\tINT_MIN \t%d",INT_MIN);
printf("\n\tLONG_MAX \t%ld",LONG_MAX);
printf("\n\tLONG_MIN \t%ld",LONG_MIN);
printf("\n\tSHRT_MAX \t%hd",SHRT_MAX);
printf("\n\tSHRT_MIN \t%hd",SHRT_MIN);
printf("\n\tUCHAR_MAX \t%u",UCHAR_MAX);
printf("\n\tUINT_MAX \t%u",UINT_MAX);
printf("\n\tULONG_MAX \t%lu",ULONG_MAX);
printf("\n\tUSHRT_MAX \t%hu",USHRT_MAX);
getch();
}
เมือโปรแกรมทำงานจะได้ผลดังรูป
ตัวดำเนินการ(operator)
ตัวดำเนินการมีหลายประเภทลักษณะการดำเนินการแตกต่างกันไป ในที่นี้จะกล่าวถึงบางประเภทเท่านั้น
ตัวดำเนินการทางคณิตศาสตร์ (mathematical operators)
สัญลักษณ์ |
การดำเนินการ |
ตัวอย่าง |
+ |
การบวก |
2+5 ผลลัพธ์ 7 |
- |
การลบ |
7-4 ผลลัพธ์ 3 |
* |
การคูณ |
2*6 ผลลัพธ์ 12 |
/ |
การหาร |
8/2 ผลลัพธ์ 4 |
% |
การหารหาเศษ |
9%4 ผลลัพธ์ 1 |
ตัวดำเนินการความสัมพันธ์หรือการเปรียบเทียบ (relational operators)
สัญลักษณ์ |
การดำเนินการ |
ตัวอย่าง |
< |
น้อยกว่า |
2<3 ผลลัพธ์ จริง(1) |
> |
มากกว่า |
2>3 ผลลัพธ์ เท็จ(false)(0) |
<= |
น้อยกว่าหรือเท่ากับ |
2<= 3 ผลลัพธ์ จริง(true) |
>= |
มากกว่าหรือเท่ากับ |
2>= 3 ผลลัพธ์ เท็จ(false) |
== |
เท่ากับ |
4==4 ผลลัพธ์ จริง(true) |
!= |
ไม่เท่ากับ |
2!= 2 ผลลัพธ์ เท็จ(false) |
ตัวดำเนินการตรรกะ (logical operators)
สัญลักษณ์ |
การดำเนินการ |
ตัวอย่าง |
&& |
และ(AND) |
(2<3)&&(3>1) ผลลัพธ์ จริง |
|| |
หรือ(OR) |
(2>3)||(4<1) ผลลัพธ์ เท็จ(false) |
! |
ไม่(NOT) |
!(2> 3) ผลลัพธ์ จริง(true) |
ตัวดำเนินการกำหนดค่า (assignment operators)
สัญลักษณ์ |
การดำเนินการ |
ตัวอย่าง |
= |
กำหนดค่า(assignment) |
a=2 ความหมายคือ กำหนดให้a มีค่าเป็น2 |
+= |
การบวก(addition) |
a+=b ความหมายคือ(a=a+b) |
*= |
การคูณ(multiplication) |
a*=b ความหมายคือ(a=a*b) |
-= |
การลบ(subtraction) |
a-=b ความหมายคือ(a=a-b) |
/= |
การหาร(division) |
a/=b ความหมายคือ(a=a/b) |
%= |
การหารหาเศษ(remainder) |
a%=b ความหมายคือ(a=a%b) |
++ |
เพิ่มค่า(increment) |
a++ หรือ ++a ความหมายคือ a=a+1 |
-- |
ลดค่า(decrement) |
a-- หรือ --a ความหมายคือ a=a-1 |
ลำดับการดำเนินการของตัวดำเนินการ (operator precedence)
ลำดับที่ |
ตัวดำเนินการ |
ลักษณะการทำงาน |
1 |
( ) [ ] . -> |
ซ้าย ไป ขวา |
2 |
- ~ | * & |
ขวา ไป ซ้าย |
3 |
++ -- |
ขวา ไป ซ้าย |
4 |
* / % |
ซ้าย ไป ขวา |
5 |
+ - |
ซ้าย ไป ขวา |
6 |
<< >> |
ซ้าย ไป ขวา |
7 |
< > <= >= |
ซ้าย ไป ขวา |
8 |
== != |
ซ้าย ไป ขวา |
9 |
&(bitwise AND) |
ซ้าย ไป ขวา |
10 |
^(bitwise XOR) |
ซ้าย ไป ขวา |
11 |
|(bitwise OR) |
ซ้าย ไป ขวา |
12 |
&& |
ซ้าย ไป ขวา |
13 |
|| |
ซ้าย ไป ขวา |
14 |
?: |
ซ้าย ไป ขวา |
15 |
= += -= /= %= |
ขวา ไป ซ้าย |
16 |
<<= >>= |
ขวา ไป ซ้าย |
โดยตัวดำเนินการที่มีลำดับน้อยกว่าจะดำเนินก่อนตัวดำเนินการที่มีลำดับสูงกว่า เช่น
X = 2 + 5 * 3 จะมีลำดับการดำเนินการ คือ
ลำดับที่ 1 5 * 3 (เพราะ * มีลำดับเป็น 4 ส่วน + อยู่ลำดับ 5)
ลำดับที่ 2 2 + 15
ลำดับที่ 3 17 เป็นค่าของ X
นิพจน์ (expression)
เกิดจากการนำ ค่าคงที่ หรือ ตัวแปร และตัวดำเนินการมาประกอบกัน โดยนิพจน์มีหลายชนิด เช่นนิพจน์ทางคณิตศาสตร์ นิพจน์ทางตรรกะ นิพจน์ทางการเปรียบเทียบ นิพจน์เกี่ยวกับเงือนไข นิพจน์เกี่ยวกับข้อความ เช่น
2 + x * 5
เป็นตัวอย่างของนิพจน์ทางคณิตศาสตร์ (2>3)&&(5>=4) เป็นนิพจน์ทางตรรกะและการเปรียบเทียบ !(a) เป็นนิพจน์ทางตรรกะ if(x==y) เป็นนิพจน์เงื่อนไข
ตัวอย่าง การหาผลลัพธ์ของนิพจน์
กำหนด int a = 10 , b = 12, c =3; จงหาผลลัพธ์ของ 2 * a + b % c ดำเนินการดังนี้ (2 * a) + (b %c) ผลลัพธ์ คือ 20 + 0 คือ 20
จากข้อกำหนดด้านบน จงหาผลลัพธ์ ของ (a>b)&&(c<=b) ซึ่งเราอาจพิจารณา ดังนี้
(เท็จ)&& (จริง) ดังนั้น ผลลัพธ์ คือ เท็จ
จากความรู้ที่เรียนมาในใบความรู้ที่ 1 และ 2 ควรจะเขียนโปรแกรมเป็นภาษาซีได้บ้างแล้ว
ตัวอย่าง 2.1 กำหนดให้ x y z เป็นจำนวนเต็ม จงเขียนโปรแกรม หา ค่า ของ z ที่มีความสัมพันธ์กับ x y เป็นสมการทางคณิตศาสตร์ ดังนี้ z = 5x + 10y โดย x มีค่าเป็น 6 ส่วน y มีค่า 7 และแสดงผลลัพธ์ทางจอภาพ
โปรแกรม อาจเป็นทำนองนี้
/* program example2_1_1.c */
#include <stdio.h>
int x = 6,y=7,z; /* declare variable */
main()
{
z = (5 * x) +( 10 * y); /* compute value of z */
printf("value of x = %d \t value of y = %d \t value of z = %d",x,y,z);
getch(); /* wait for keyboard pressing */
}
หรือ
/* program example2_1_2.c */
#include <stdio.h>
int x = 6,y=7,z;
main()
{
printf("value of x = %d \t value of y = %d \t value of z = %d",x,y,5*x+10*y);
getch(); /* wait for keyboard pressing */
}
โปรแกรม example2_1_1.c กับ example2_1_2.c จะให้ผลที่แสดงออกเหมือนกัน ต่างกันที่ขั้นตอนการดำเนินการ example2_1_1.c มีการประกาศตัวแปรที่ใช้ทั่วไปตลอดโปรแกรม และมีการคำนวณ ค่า z เก็บไว้ในหน่วยความจำก่อน จึงแสดงผลลัพธ์ ส่วนโปรแกรม example2_1_2.c ประกาศตัวแปรที่ใช้ได้เฉพาะในฟังก์ชัน main() เท่านั้น และไม่มีการคำนวณหาค่า z แต่คำนวณแล้วแสดงผลลัพธ์ออกทางจอภาพเลยโดยไม่มีการเก็บค่าที่คำนวณได้ไว้ในตัวแปร z
ตัวอย่างที่2.2 จาก ขั้นตอนวิธีหรือรหัสจำลอง ต่อไปนี้
เริ่มต้น
กำหนดค่าความยาวฐาน = 5
กำหนดค่าความสูง = 4
คำนวณพื้นที่ = 0.5 x ความยาวของฐาน x ความสูง
พิมพ์หัวรายงาน
พิมพ์ความยาวของฐาน
พิมพ์ความสูง
พิมพ์พื้นที่
จบ
จงเขียนโปรแกรมที่ทำงานตามขั้นตอนวิธี ดังกล่าว
จากขั้นตอนวิธี ดังกล่าว อาจเขียนโปรแกรมได้ ดังโปรแกรม example2_2.c ดังนี้
/* program example2_2.c */
#include <stdio.h>
int lengt , high ;
float area;
main()
{ /* begin the program */
lengt = 5; /* assign the length of triangle */
high = 4; /* assign the height of triangle */
area = 0.5 * lengt * high ; /* compute the area of triangle */
printf("\tDetermination of triangle area\n"); /* print report title */
printf("\tThe length of triangle = %d\n ",lengt); /* print length */
printf("\tThe height of triangle = %d\n ",high); /* print height */
printf("\tThe area of triangle = %.2f\n",area); /* print area */
getch(); /* wait for keyboard pressing */
} /* end program */
ผลการทำงานของโปรแกรมนี้ จะลักษณะ ดังรูป
ตัวอย่าง2.3 จงเขียนโปรแกรมหา พื้นที่วงกลมที่มีรัศมี 2.00 หน่วย
วิธีการ เนื่องจากขั้นตอนการทำงานไม่ยุ่งยากและคิดว่านักเรียนคงสามารถสร้างขั้นตอนในสมองได้ จึงไม่เขียนรหัสลำลองก่อน โปรแกรมอาจเขียนได้ ดัง โปรแกรม example2_3.c ดังนี้
/* program 2_3.c */
#include <stdio.h>
#define pi 3.14
float radius,area;
main()
{
radius = 2.00;
area = pi * radius * radius;
printf("\tArea of circle\n ");
printf("\tRadius = %.2f \n",radius);
printf("\tArea = %.2f \n",area);
getch();
}
ตัวอย่าง 2.4 การหารจำนวนเต็มและการหาจำนวนจริง ให้นักเรียนศึกษาการทำงานของโปรแกรม example2_4.c ซึ่งมคำสั่ง ดังนี้
/* program example2_4.c */
#include <stdio.h>
main()
{
int x,y;
float a,b,c,d;
x = 5;
y = 2;
a = 5;
b = 2;
c = 5.0;
d = 2.0;
printf("\n\tInteger division\n");
printf("\t x/y = %d \n\t y/x = %d \n",x/y,y/x);
printf("\t 5/2 = %d \n\t 2/5 = %d \n",5/2,2/5);
printf("\n\tFloating point division\n");
printf("\t a/b = %f \n\t b/a = %f \n",a/b,b/a);
printf("\t c/d = %f \n\t d/c = %f \n",c/d,d/c);
printf("\t 5/2 = %f \n\t 2/5 = %f \n" ,5/2 , 2/5);
printf("\t 5./2. = %f \n\t 2./5. = %f \n",5./2.,2./5.);
printf("\t 5.0/2.0 = %f \n\t 2.0/5.0 = %f \n",5.0/2.0,2.0/5.0);
getch();
}
เมื่อโปรแกรมทำงานจะได้ผลลัพธ์ดังรูป
ตัวดำเนินการเอกภาค (unary operator)
คือ ตัวดำเนินการที่ดำเนินกับตัวแปรตัวเดียว เช่น ++x หรือ ++x หรือ –y หรือ y— ซึ่งมีลักษณะการใช้ 2 แบบ คือ ตัวดำเนินการเอกภาคเติมหน้า( prefix mode ) เช่น ++x หรือ – y ตัวดำเนินการแบบนี้จะทำงานก่อนที่จะทำตามคำสั่งอื่น กับ ตัวดำเนินการเอกภาคเติมหลัง (postfix mode) เช่น x++ หรือ y-- ตัวดำเนินการแบบนี้จะทำงานหลังจากที่ทำคำสั่งอื่น แล้ว
ตัวอย่าง2.5 โปรแกรม example2_5.c แสดงการใช้ตัวดำเนินการเอกภาคทำงานร่วมกับการทำงานอื่น ๆในคำสั่งเดียวกัน
/* program example2_5.c */
#include <stdio.h>
main()
{ int a,b;
a = b = 0;
printf("\n\ta\tb");
printf("\n\t%d\t%d",a++,++b); /* จะมีการพิมพ์ค่า a เป็น 0 ก่อนเพิ่มค่า a เป็น 1 ส่วน b จะเพิ่มค่าเป็น 1 ก่อนพิมพ์ค่า */
printf("\n\t%d\t%d",a++,++b); /* จะมีการพิมพ์ค่า a เป็น 1 ก่อนเพิ่มค่า a เป็น 2 ส่วน b จะเพิ่มค่าเป็น 2 ก่อนพิมพ์ค่า */
b = a++ ; /* กำหนด ค่า b ให้มีค่า เท่ากับ a คือ 2 แล้วเพิ่มค่า a อีก 1 เป็น 3
printf("\n");
printf("\n\t%d\t%d",a,b); /* พิมพ์ a คือ 3 และ b คือ 2 */
b = ++a ; /* เพิ่มค่า a อีก 1 เป็น 4 แล้วให้เป็นค่าของ b ดังนั้น b มีค่าเป็น 4 */
printf("\n");
printf("\n\t%d\t%d",a,++b); / พิมพ์ค่า a คือ 4 และ เพิ่มค่า b อีก 1 เป็น 5 แล้วจึงพิมพ์ ค่า b คือ 5
b = b + ++a ; /* เพิ่มค่า a อีก 1 เป็น 5 แล้วนำไปบวก กับ b เดิมคือ 5 ทำให้ b มีค่าเป็น 10 */
printf("\n");
printf("\n");
printf("\n\t%d\t%d",a,b); /* พิมพ์ค่า a คือ 5 ส่วน b คือ 10
b = a-- - a ; /* นำค่า a คือ 5 ลบกัน ได้ 0 ทำให้ b มีค่าเป็น 0 แล้วลดค่า a อีก 1 ทำให้ a มีค่าเป็น 4 */
printf("\n");
printf("\n\t%d\t%d",a,b); /* พิมพ์ ค่า a คือ 4 และ b คือ 0
b = ++a - a ; */ เพิ่มค่า a จาก 4 เป็น 5 แล้วลบกัน เป็น ค่า b ทำให้ b มีค่าเป็น 0 */
printf("\n");
printf("\n\t%d\t%d",a,b); /* พิมพ์ค่า a คือ 5 ส่วน b คือ 0 */
b = a - --a ; /* ลดค่า a ลง 1 ทำให้ a มีค่า เป็น 4 แล้วนำมาลบกันเป็นค่าของ b ทำให้ b มีค่าเป็น 0 */
printf("\n");
printf("\n\t%d\t%d",a,b); /* พิมพ์ ค่า a คือ 4 ส่วน b คือ 0 */
b = --a - --a ; /* ลดค่า a ครั้งละ 1 จำนวน 2 ครั้ง ทำให้ a เป็น 2 ส่วน b เป็น 0 */
printf("\n");
printf("\n\t%d\t%d",a,b);
b = a++ + ++a ; /* เพิ่มค่า a จาก 2 เป็น 3 บวกกันทำให้ b เป็น 6 แล้วเพิ่มค่า a อีก 1 เป็น 4
printf("\n");
printf("\n\t%d\t%d",a,b);
getch(); }
ผลการทำงานของโปรแกรมเป็นดังรูป
การแปลงชนิดของข้อมูล
การเปลี่ยนชนิดของข้อมูล ทำได้หลายวิธีขึ้นกับชนิดของข้อมูล วิธีการที่จะกล่าวถึง คือ กำหนดชนิดหน้าข้อมูล มีรูปแบบคือ
ตัวแปร = (ชนิดข้อมูล) นิพจน์;
ดังตัวอย่าง ในโปรแกรม example2_6.c
ตัวอย่างที่ 2.6 โปรแกรม example2_6.c แสดงตัวอย่างการเปลี่ยนชนิดของข้อมูล
/* program example2_6.c */
#include <stdio.h>
main()
{
int a,b;
a = 2.7 + 3.9 ; /* บวกก่อน ได้ 6.5 แต่เนื่องจาก a เป็น int จึงตัดทศนิยมทิ้งได้ a เป็น 6 */
printf("\n\ta = %d ",a);
b = (int) 2.7 + (int) 3.9 ; /* เปลี่ยน 2.7 เป็น int ได้ 2 และเปลี่ยน 3.9 เป็น int ได้ 3 บวกกันได้ 5 */
printf("\n\tb = %d ",b);
int num1 =5 , num2 =4;
float x,y;
x = num1/num2; /* ผลหารได้ 1.25 แต่ทั้ง num1 และ num2 เป็น int จึงตัดเศษทิ้ง แล้วจึงกำหนดค่าให้ x จึงมีค่าเป็น 1 แต่ x เป็น float จึงมีทศนิยม */
printf("\n\tx = %f",x); /* พิมพ์ x เป็นแบบ %f ถ้าไม่ระบุตำแหน่งจะให้ 6 ตำแหน่งจึงเป็น 1.000000 */
y = (float)num1/num2; /* เปลี่ยน num1 เป็น float ก่อน แล้วจึงหาร จึงได้ผลลัพธ์เป็น 1.25 */
printf("\n\ty = %f",y); /* พิมพ์แบบ float จึงได้ผลลัพธ์เป็น 1.250000
getch();
}
ผลการทำงานของโปรแกรมได้เป็น
a = 6
b = 5
x = 1.000000
y = 1.250000
กรณีที่นิพจน์นั้นประกอบด้วยข้อมูลหลายชนิด จะมีการเปลี่ยนเป็นข้อมูลชนิดเดียวกันก่อน จึงดำเนินการอื่นต่อ โดยการเปลี่ยนจะเปลี่ยนจากข้อมูลที่เล็กกว่าเป็นข้อมูลชนิดที่ใหญ่กว่า เช่นข้อมูลชนิด int มีการดำเนินการกับข้อมูลชนิด float จะมีการเปลี่ยนข้อมูลชนิด int เป็น float ก่อน จึงดำเนินการอื่นต่อไป