2. ข้อมูลพื้นฐานและตัวดำเนินการ
องค์ประกอบพื้นฐานในการเขียนโปรแกรมภาษาซี ได้แก่ คำสงวน การตั้งชื่อ ตัวแปร ชนิดของข้อมูล ค่าคงตัว ค่าคงที่
1. คำสงวน
คำสงวน หมายถึง คำที่สงวนไว้สำหรับเรียกใช้ตามวัตถุประสงค์ที่กำหนดดดยเฉพาะ เช่น คำที่ใช้ในคำสั่งควบคุม และชนิดของข้อมูล เป็นต้น คำสงวนของภาษาซีมีดังนี้
| auto | double | int | struct |
| break | else | long | switch |
| case | enum | register | typedef |
| char | extern | return | union |
| const | float | short | unsigned |
| continue | for | signed | void |
| default | goto | sizeof | volatile |
| do | if | static | while |
2. การตั้งชื่อ
นักเขียนโปรแกรมจะต้องตั้งชื่อให้กับตัวแปร ค่าคงที่ โปรแกรมย่อย พารามิเตอร์ และส่วนต่างๆ ของโปรแกรม กฎเกณฑ์ที่ใช้ในการตั้งชื่อของภาษาซีมีดังนี้
1. ชื่อจะประกอบขึ้นจากตัวอักษร ตัวเลข และเครื่องหมายขีดเส้นใต้(underscore) เท่านั้น
2. อักขระแรกของชื่อจะต้องเป็นตัวอักษร หรือเครื่องหมายขีดเส้นใต้เท่านั้น
3. ตัวพิมพ์ใหญ่ และตัวพิมพ์เล็กถือเป็นตัวอักษรคนละตัวกัน เช่น Salary และ SALARY เป็นชื่อที่แตกต่างกัน เป็นต้น
4. ชื่อมาตรฐาน ANSI C จะมีความยาวไม่จำกัด แต่คอมไพเลอร์ตามมาตรฐาน ANSI C จะต้องสามารถจำแนกชื่อที่แตกต่างกันได้อย่างมาก 31 อักขระแรก
5. ชื่อจะต้องไม่ซ้ำกับคำสงวน
3. ตัวแปร
การกำหนดตัวแปรเป็นการใช้ชื่อตัวแปรแทนตำแหน่งบนหน่วยความจำ สำหรับเก็บข้อมูลระหว่างการประมวลผล ซึ่งอาจเป็นข้อมูลนำเข้า ข้อมูลที่เกิดจากการดำเนินการ หรือข้อมูลผลลัพธ์
การตั้งชื่อให้กับตัวแปรจะเป็นไปตามหลักการตั้งชื่อของภาษาซี และชื่อที่เหมาะสมควรจะเป็นชื่อที่สื่อความหมาย
การประกาศตัวแปรมีรูปแบบ ดังนี้
ชนิดข้อมูล ตัวแปร1, ตัวแปร2, …,ตัวแปรn;
|
เช่น int age; float salary, overtime; เป็นต้น
4. ชนิดข้อมูล
ชนิดข้อมูลพื้นฐานในภาษาซีเป็นข้อมูลชนิดสเกลาร์ โดยที่ตัวแปรที่มีชนิดสเกลาร์ในขณะใดขณะหนึ่งจะเก็บข้อมูลได้เพียงค่าเดียวเท่านั้น ข้อมูลชนิดสเกลาร์แบ่งออกเป็น
1) ข้อมูลชนิดตัวเลข (arithmetic data type) ซึ่งประกอบด้วย ข้อมูลชนิดจำนวนเต็ม และข้อมูลชนิดจำนวนจริง
2) ข้อมูลชนิดตัวชี้ (pointer data type)
3) ข้อมูลชนิดแจงนับ (enumerated data type)
ในเอกสารนี้จะกล่าวถึงเฉพาะการใช้งานข้อมูลชนิดจำนวนเต็มและข้อมูลชนิดจำนวนจริงเท่านั้น
4.1 ข้อมูลชนิดจำนวนเต็ม
การประกาศข้อมูลชนิดจำนวนเต็มสามารถทำได้ ดังนี้
int age;
ซึ่งเป็นการกำหนดให้ตัวแปร age เป็นชนิด int หรือชนิดจำนวนเต็ม
เมื่อประกาศตัวแปรแล้วจะมีค่าอย่างใดอย่างหนึ่งได้ด้วยการใช้คำสั่งกำหนดค่าให้กับตัวแปร ซึ่งมีรูปแบบ ดังนี้
เช่น age = 15;
เครื่องหมาย = เป็นตัวดำเนินการกำหนดค่า และมีผลให้ตัวแปร age มีค่าข้อมูลเท่ากับ 15
ตัวอย่างที่ 4.1 โปรแกรมพิมพ์อายุ
/* 1 */ //Program: PrintArea.c/* 2 */ #include <stdio.h>/* 3 */ void main() {
/* 4 */ int age;
/* 5 */ age = 15;
/* 6 */ printf(“The child age is %d.\n”, age);
/* 7 */ } |
ผลลัพธ์ คือ
บรรทัดที่ 4 ตัวแปร age ถูกประกาศให้มีชนิดจำนวนเต็ม และถูกกำหนดให้มีค่าเป็น 15 ในบรรทัดที่ 5
บรรทัดที่ 6 ค่าตัวแปร age ซึ่งเป็นอาร์กิวเมนต์ที่สองของคำสั่ง printf() จะถูกจัดรูปแบบให้อยู่ในรูปของจำนวนเต็มฐานสิบก่อนแสดงผล
สังเกตว่าอาร์กิวเมนต์แรกของคำสั่ง printf() จะต้องมีชนิดเป็นสายอักขระเสมอ และคำสั่ง printf() จะมีจำนวนอาร์กิวเมนต์นอกเหนือจากอาร์กิวเมนต์แรกอีกเท่าใดขึ้นอยู่กับจำนวนชุดอักขระจัดรูปแบบในอาร์กิวเมนต์แรก โดยที่อาร์กิวเมนต์ในลำดับถัดไปอาจอยู่ในรูปของค่าคงตัว นิพจน์ หรือตัวแปรก็ได้
ตัวอย่างที่ 4.2 โปรแกรมพิมพ์พิกัดของจุด
/* 1 */ //Program: Coord.c/* 2 */ #include <stdio.h>/* 3 */ void main() {
/* 4 */ int x1, y1;
/* 5 */ int x2 = 5, y2 = 0;
/* 6 */ x1 = 2;
/* 7 */ y1 = 3;
/* 8 */ printf(“The first coordinate is (%d, %d).\n”,x1, y1);
/* 9 */ printf(“The second coordinate is (%d, %d).\n”,x2, y2);
/* 10 */ } |
ผลลัพธ์ คือ
The first coordinate is (2, 3).
The second coordinate is (5, 0). |
บรรทัดที่ 4 เป็นการประกาศให้ x1 และ y1 เป็นตัวแปรชนิดจำนวนเต็มทั้งสองตัว และบรรทัดที่ 5 เป็นการประกาศให้ x2 และ y2 เป็นตัวแปรชนิดจำนวนเต็ม พร้อมกับกำหนดให่มีค่าเริ่มต้นเป็น 5 และ 0 ตามลำดับ
อาร์กิวเมนต์แรกของคำสั่ง printf() ในบรรทัดที่ 8 เป็นสายอักขระที่ประกอบด้วยชุดอักขระจัดรูปแบบ %d จำนวน 2 ชุด โดย %d แรกใช้จัดรูปแบบการแสดงผลค่าของตัวแปร x1 และ %d ที่สองใช้จัดรูปแบบการแสดงผลค่าของตัวแปร y1
นอกจากชุดอักขระจัดรูปแบบ %d แล้วยังมีชุดอักขระจัดรูปแบบสำหรับจำนวนเต็มในฐานอื่นอีก คือ %o และ %x ซึ่งเป็นชุดอักขระที่ใช้จัดรูปแบบข้อมูลให้อยู่ในรูปจำนวนเต็มฐานแปด (octal) และจำนวนเต็มฐานสิบหก (hexadecimal) ตามลำดับ ดังแสดงในตัวอย่างที่ 4.3
ตัวอย่างที่ 4.3 โปรแกรมพิมพ์ตัวเลขฐานต่างๆ
/* 1 */ //Program: PrnD-O-X.c/* 2 */ #include <stdio.h>/* 3 */ void main() {
/* 4 */ int a = 78;
/* 5 */ printf(“Value %d in decimal is %d.\n”,a, a);
/* 6 */ printf(“Value %d in octal is %o.\n”,a, a);
/* 7 */ printf(“Value %d in hexadecimal is ”,a);
/* 8 */ printf(“%x or %X.\n”,a ,a);
/* 9 */ } |
ผลลัพธ์ คือ
Value 78 in decimal is 78.Value 78 in octal is 116.
Value 78 in hexadecimal is 4e or 4E. |
4.2 ข้อมูลชนิดจำนวนจริง
ชนิดข้อมูลจำนวนจริงในภาษาซีประกอบด้วย float double และ long double โดยชนิด float จะมีจำนวนตำแหน่งทศนิยมน้อยกว่าชนิด double และชนิด long double ตามลำดับ
ชุดอักขระจัดรูปแบบที่ใช้สำหรับข้อมูลชนิดจำนวนจริงในคำสั่ง printf() ประกอบด้วย %f ใช้เพื่อจัดรูปแบบข้อมูลชนิด float ให้อยู่ในรูปแบบจำนวนจริงฐานสิบ %e และ %E ใช้เพื่อจัดรูปแบบข้อมูลให้อยู่ในรูปของสัญลักษณ์เชิงวิทยาศาสตรสำหรับข้อมูลชนิด double และ long double จะใช้อักขระ lf และ Lf เป็นอักขระที่เพิ่มเข้าไปใช้ชุดอักขระจัดรูปแบบ ตามลำดับ
ตัวอย่างที่ 4.4 โปรแกรมพิมพ์คะแนน
/* 1 */ //Program: PrnScore.c/* 2 */ #include/* 3 */ void main() {
/* 4 */ float score;
/* 5 */ score = 300.545;
/* 6 */ printf(“Score are %f, %e ”,score, score);
/* 7 */ printf(“and %E. ”,score);
/* 8 */} |
ผลลัพธ์ คือ
| Score are 300.545013, 3.005450e+02 and 3.005450E+02. |
การแสดงผลข้อมูลชนิดจำนวนจริงในคำสั่ง printf() โดยใช้ %f %e หรือ %E จะแสดงค่าทศนิยม 6 ตำแหน่ง อย่างไรก็ตามในชุดอักขระจัดรูปแบบจำนวนจริง ยังสามารถกำหนดจำนวนตำแหน่งในการแสดงผลข้อมูลให้กับข้อมูลแต่ละจำนวน เพื่อจัดรูปแบบผลลัพธ์ให้สวยงาม ดังแสดงในตัวอย่างที่ 4.5
ตัวอย่างที่ 4.5 โปรแกรมพิมพ์อุณหภุมิรูปแบบต่างๆ
/* 1 */ //Program: PrnTemps.c
/* 2 */ // พิมพ์อุณหภูมิรูปแบบต่างๆ/* 3 */ #include <stdio.h>
/* 4 */ void main() {
/* 5 */ float tempFri;
/* 6 */ double tempSat;
/* 7 */ tempFri = 12.345;
/* 8 */ printf(“Friday temperature: %7.2f, ”, tempFri);
/* 9 */ printf(%10.3e, %10.3E. \n”, tempFri, tempFri);
/* 10 */ tempSat = 1.2465e-5;
/* 11 */ printf(“Saturday temperature: %7.2lf, ”,tempSat);
/* 12 */ printf(“%7.5le, %7.5lE.\n”, tempSat, tempSat);
/* 13 */}
|
ผลลัพธ์ คือ
Friday temperature: 12.35, 1.235e+01, 1.235E+01.
Saturday temperature: 0.000, 1.24650e-05, 1.25650E-05. |
จากตัวอย่างที่ 5 ในบรรทัดที่ 8 %7.2f มีความหมายว่าจำนวนตำแหน่งที่ใช้แสดงข้อมูลชนิดจำนวนจริงจะมีค่าอย่างน้อยเท่ากับ 7 โดย 1 ตำแหน่งเป็นทศนิยม 2 ตำแหน่งเป็นค่าทศนิยม และ 4 ตำแหน่งที่เหลือเป็นจำนวนเต็มด้านหน้าจุดทศนิยม ดังรูป 4.1
รูป 4.1 แสดงผลการกำหนดจำนวนตำแหน่งข้อมูลด้วย %7.2f
5. ค่าคงตัวและค่าคงที่
ค่าคงตัว (literal constant) หมายถึง ข้อมูลที่ระบุเป็นค่าอย่างใดอย่างหนึ่งในโปรแกรม และมีชนิดของข้อมูลตามค่าของข้อมูลนั้น เช่น
8,236 เป็นค่าคงตัวชนิดจำนวนเต็ม
5.85 และ 100.00 เป็นค่าคงตัวชนิดจำนวนจริง
‘A’ และ ‘O.K.” เป็นค่าคงตัวชนิดอักขระและสายอักขระตามลำดับ
นอกจากการใช้ค่าคงตัวแล้ว นักเขียนโปรแกรมยังสามารถกำหนดชื่อเพื่อใช้แทนค่าคงตัวในโปรแกรม ซึ่งต่อไปนี้จะเรียกชื่อนี้ว่า ค่าคงที่ (constants) โดยการใช้คำสั่งของตัวประมวลผลก่อนซี #define ตามตัวอย่างที่ 4.6
ตัวอย่างที่ 4.6 โปรแกรมแปลงอุณหภูมิ
/* 1 */ //Program: Degree.c/* 2 */ #define FACTOR 5 / 9/* 3 */ #define FBASE 32
/* 4 */ #include <stdio.h>
/* 5 */ void main() {
/* 6 */ float degF, degC;
/* 7 */ degF = 78.5;
/* 8 */ degC = (degF – FBASE) * FACTOR;
/* 9 */ printf(“%f in Fahrenheit ”, degF);
/* 10 */ printf(“is %f in Celsius. \n”, degC);
/* 11 */ degF = 100.00;
/* 12 */ degC = (degF – FBASE) * FACTOR;
/* 13 */ printf(“%f in Fahrenheit ”, degF);
/* 14 */ printf(“is %f in Celsius. \n”, degC);
/* 15 */}
|
ผลลัพธ์ คือ
| 78.500000 in Fahrenheit is 25.833334 in Celsius. |
บรรทัดที่ 2 และ 3 เป็นการเรียกใช้คำสั่งของตัวประมวลผลก่อนซี #define ซึ่งใช้สำหรับกำหนดให้ FACTOR และ FBASE มีค่าคงที่ที่มีค่าเป็น 5/9 และ 32 ตามลำดับ ในขั้นตอนการประมวลผลก่อน (preprocessing) ค่าคงที่ทั้งหมดจะถูกแทนที่ด้วยค่าที่กำหนดให้
บรรทัดที่ 11 ค่า 78.5 เป็นค่าคงตัวชนิดจำนวนจริงที่กำหนดให้เป็นค่าของตัวแปร degF
บรรทัดที่ 16 เราสามารถกำหนดให้ตัวแปร degF มีค่าเป็น 100.00 และเรียกใช้ค่าคงที่ FACTOR และ FBASE คำนวณอีกครั้งในบรรทัดที่ 17
การใช้ค่าคงที่ในโปรแกรมอย่างเหมาะสม จะช่วยให้สามารถเข้าใจความหมายของโปรแกรมได้ดียิ่งขึ้น และยังช่วยให้การปรับปรุงโปรแกรมทำได้โดยง่าย