การเขียนโปรแกรมภาษาปาสคาล

ภาษาปาสคาล เรียกโปรแกรมย่อยว่า Procedure ซึ่งเป็นโปรแกรมเล็ก ๆ ภายในโปรแกรมใหญ่ทั้งหมด แต่โปรแกรมหลักจะมีความเป็นอิสระในตัวเอง ส่วน Procedure จะเป็นอิสระและจบในตัวเอง แต่จะถูกเรียกใช้จากโปรแกรมหลัก หรือ Procedure อื่น ๆ

วัตถุประสงค์ของการสร้างโปรแกรมย่อย
1. เป็นส่วนโปรแกรมที่ใช้ซ้ำกันในหลาย ๆ แห่ง และจะแยกออกมาทำเป็นโปรแกรมย่อย
2. เป็นคำที่สร้างขึ้นใหม่ เพื่อเก็บไว้ใช้ต่อไป
3. เมื่อต้องการเขียนโปรแกรมเป็น Module จุดประสงค์ของการเขียนโปรแกรมเป็น Module ก็เพื่อตรวจหาที่ผิดได้ง่าย ดังนั้น โปรแกรมย่อยหนึ่ง ๆ ก็คือ Module ๆ หนึ่ง
4. เพื่อสนองความต้องการของการเขียนโปรแกรมจากบนลงล่าง

รูปแบบของ Procedure


PROCEDURE ชื่อ Procedure (อากิวเมนต์);
VAR ชื่อตัวแปรที่จะใช้ใน Procedure;
BEGIN
คำสั่ง;
END;

     การเรียกใช้ Procedure จากโปรแกรมหลัก ทำได้โดยการเรียกชื่อของ Procedure โดยถือว่า Procedure เป็นคำสั่ง ๆ หนึ่ง เช่น ถ้าโปรแกรมใหญ่มี Procedure yyy; ในโปรแกรมหลักจะเรียกใช้ Procedure ได้โดยใช้คำสั่งภายในโปรแกรมหลักว่า yyy;

ตัวอย่าง

PROGRAM EXAM16;
VAR I:INTEGER;
PROCEDURE MMM;
BEGIN
WRITELN(‘THIS IS MMM PROCEDURE’);
END;
PROCEDURE NNN;
VAR J:INTEGER;
BEGIN
FOR J:=1 TO I DO
WRITELN(‘THIS IS NNN PROCEDURE’);
WRITELN(‘END OF NNN LOOP’);
WRITELN(‘NOW CALL MMM FROM NNN’);
MMM;
END;
BEGIN {MAIN}
WRITELN(‘THIS IS MAIN PROGRAM’);
WRITELN(‘ENTER NUMBER’);
READLN(I);
WRITELN;
WRITELN(‘NOW CALL NNN FROM MAIN’);
NNN;
WRITELN;
WRITELN(‘NOW CALL MMM FROM MAIN’);
MMM;
READLN;
END.
FUNCTION

     ภาษาปาสคาลจัดให้ฟังก์ชันเป็นรูปแบบหนึ่งของโปรแกรมย่อย เทียบเท่า Procedure ดังนั้น Function และ Procedure จึงมีลักษณะคล้ายกัน คือ เป็นส่วนหนึ่งของ program ใหญ่ ที่เขียนแยกออกไปจากโปรแกรมหลัก มีความสมบูรณ์ในตัวเอง และสามารถส่งผ่านค่าของตัวแปรระหว่างโปรแกรมหลักกับ Function หรือระหว่าง Procedure กับ Function

รูปแบบ

FUNCTION ชื่อฟังก์ชัน (อากิวเมนต์) : Type;
VAR ชื่อตัวแปรที่ใช้เฉพาะในฟังก์ชัน
BEGIN
คำสั่งต่าง ๆ ;
END;

เปรียบเทียบ FUNCTION กับ PROCEDURE

1. ช่วยให้การเขียนโปรแกรมแบบ top-down design ง่ายและสะดวก
2. ช่วยให้หน่วยย่อย ๆ ของโปรแกรมเป็นอิสระต่อกัน
3. สามารถเรียกใช้ส่วนของโปรแกรมที่ทำงานซ้ำ ๆ กันได้โดยไม่ต้องเขียนโปรแกรมส่วนนั้นซ้ำ ๆ กันหลายครั้ง
4. เพื่อช่วยให้ตรวจสอบจุดต่างๆ ภายในโปรแกรม หรือทำให้การคำนวณที่ใช้สูตรต่าง ๆ ภายในโปรแกรมง่ายขึ้น
5. เพื่อช่วยให้เกิดคำสั่งใหม่ ๆ (function) และส่วนของ program (Procedure) ที่สามารถนำไปใช้กับโปรแกรมอื่น ๆ ได้
6. Procedure จะเป็นส่วนของโปรแกรมใหญ่ที่เขียนขึ้นเพื่อทำงานเฉพาะอย่าง ส่วน Function จะเป็นโปรแกรมย่อยเหมือนเป็นการสร้างคำใหม่ขึ้นมา
7. Procedure จะถูกเรียกใช้จากโปรแกรมหลักหรือจาก Procedure อื่น ๆ ด้วยกันได้โดยที่แต่ละ Procedure ทำงานเป็นอิสระต่อกัน ส่วน Function จะถูกใช้ทำงานภายในโปรแกรมหลักหรือภายใน Procedure ส่วนมากเป็นการสร้างคำเพื่อใช้ในการคำนวณที่ซับซ้อน หรือเป็นคำที่ใช้กำหนดเงื่อนไขในการดำเนินการต่าง ๆ ภายในโครงสร้างของโปรแกรมใหญ่ทั้งหมด

ตัวอย่าง


PROGRAM EX17;
USES CRT;
VAR X,Y,Z:INTEGER;
PROCEDURE SW (VAR N1,N2:INTEGER);
VAR T:INTEGER;
BEGIN
T:=N1;
N2:T;
END;
FUNCTION MAX (N1,N2:INTEGER):INTEGER;
BEGIN
IF N1>N2 THEN MAX:=N1
ELSE MAX:=N2;
END;
BEGIN {MAIN PROGRAM}
WRITE(‘ENTER TWO NUMBER :’);
READLN(X,Y);
SW(X,Y);
WRITELN(‘X= ‘,X,’Y= ‘,Y);
Z:=MAX(X,Y);
WRITELN(‘MAX VALUE BETWEEN X AND Y= ‘,Z);
END.

อธิบาย
1. รูปแบบของ Procedure ต่างจาก Function คือ Procedure SW จะระบุค่าอาร์กิวเมนต์ 2 ตัวแปร คือ N1 และ N2 เป็นตัวแบบจำนวนเต็ม เพื่อรับค่าพารามิเตอร์ X,Y แต่ฟังก์ชัน MAX จะระบุอาร์กิวเมนต์ 2 ตัวแปร คือ N1 และ N2 เหมือนกัน เป็นแบบจำนวนเต็ม เพื่อรับค่าพารามิเตอร์ X,Y และระบุว่าผลลัพธ์ของ MAX เป็นจำนวนเต็ม คือผลลัพธ์ของค่าสูงสุดเท่ากับ X หรือ Y
2. ฟังก์ชัน MAX จะถูกอ้างอิงภายใน Begin…End; จากตัวอย่างของฟังก์ชัน ใช้คำนวณค่าของ MAX และส่งกลับไปยัง Main Program ที่เรียกใช้ฟังก์ชันนี้อยู่
3. การเรียกใช้ Procedure แล Function ต่างกันคือ ชื่อของ Procedure จะถูกเรียกใช้เหมือนคำสั่ง ๆ หนึ่ง แต่ฟังก์ชันจะถูกเรียกใช้ในรูปของนิพจน์หรือเป็นส่วนหนึ่งของคำสั่งอื่น ๆ
4. การส่งผ่านค่าพารามิเตอร์ X,Y ไปยัง Procedure SW คือเมื่อส่งค่า X,Y ไปแล้วค่า X,Y จะถูกสลับค่า ได้ X,Y ใหม่มาในโปรแกรมหลัก แต่การส่งผ่านค่า parameter X,Y ไปยังฟังก์ชัน MAX จะไม่มีการเปลี่ยนค่า X,Y (N1 และ N2) เพียงแต่นำเอาไปคำนวณหาค่า MAX ซึ่งจะได้ผลลัพธ์ 1 ค่า คือ ชื่อของฟังก์ชัน MAX ที่กลับมาเป็นค่าของตัวแปร Z ในโปรแกรมหลัก ส่วนตัวแปร X,Y ในโปรแกรมหลักมีค่าเท่าเดิม

ตัวอย่าง

PROGRAM EXAM17;
USES CRT;
VAR Y:INTEGER;
PROCEDURE HEAD1(N:INTEGER);
VAR I:INTEGER;
BEGIN
WRITELN(‘BANGNA COMMERCIAL COLLEGE’);
FOR I:=1 TO N DO
WRITELN(‘------------------------------------------------‘);
END;
BEGIN {MAIN PROGRAM}
CLRSCR;
WRITELN(‘CALL PROCEDURE FIRST TIME’);
HEAD1(2);
WRITELN(‘CALL PROCEDURE SECOND TIME’);
Y:=3;
HEAD1(Y);
WRITELN(‘END PROGRAM’);
END.

ผลลัพธ์

CALL PROCEDURE FIRST TIME
BANGNA COMMERCIAL COLLEGE
-----------------------------------------------
-----------------------------------------------
CALL PROCEDURE SECOND TIME
BANGNA COMMERCIAL COLLEGE
-----------------------------------------------
-----------------------------------------------
-----------------------------------------------
END PROGRAM

ตัวอย่าง

PROGRAM EXAM18;
USES CRT;
VAR A,B:INTEGER;
PROCEDURE HEAD2(M,N:INTEGER);
VAR I:INTEGER;
BEGIN
FOR I:=1 TO M DO
WRITELN(‘**********************************’);
WRITELN(BANGNA COMMERCIAL COLLEGE’);
FOR I:=1 TO N DO
WRITELN(‘**********************************’);
END;
BEGIN {MAIN PROGRAM}
CLRSCR;
HEAD2(3,2);
END.

ผลลัพธ์

*************************************
*************************************
*************************************
BANGNA COMMERCIAL COLLEGE
*************************************
*************************************

ตัวอย่าง

PROGRAM EXAM;
USES CRT;
VAR ANS:CHAR;
I:INTEGER;
NAME,CODE:ARRAY[1..20] OF STRING;
TEST,MID,FINAL:ARRAY[1..20] OF INTEGER;
PROCEDURE ENTERDATA;
BEGIN
CLRSCR;
FOR I:=1 TO 20 DO
BEGIN
WRITE(‘ENTER CODE :’);READLN(CODE[I]);
WRITE(‘ENTER NAME :’);READLN(NAME[I]);
WRITE(‘ENTER TEST :’);READLN(TEST[I]);
WRITE(‘ENTER MIDTERM :’);READLN(MID[I]);
WRITE(‘ENTER FINAL :’);READLN(FINAL[I]);
END;
END;
PROCEDURE MENU;
BEGIN
CLRSCR;
WRITELN;WRITELN;WRITELN;WRITELN;WRITELN;
WRITELN(‘MAIN MENU’:30);
WRITELN(‘***************’:30);
WRITELN(‘1.TEST’:30);
WRITELN(‘2.MIDTERM’:30);
WRITELN(’3.FINAL’:30);
WRITELN(‘4.QUIT’:30); WRITELN; WRITELN;
WRITELN(‘ENTER YOUR CHOICE:’);READLN(ANS);
CASE ANS OF
‘1’ : BEGIN
CLRSCR; WRITELN; WRITELN; WRITELN;
WRITELN(‘CODE NAME TEST’:45);
FOR I:=1 TO 3 DO
BEGIN
WRITELN(CODE[I]:25,NAME[I]:10,TEST[I]:10);
END;
WRITELN; WRITELN; WRITELN;
WRITELN(‘…PRESS ENDTER…’:45);READLN;
END;
‘2’ : BEGIN
CLRSCR; WRITELN; WRITELN; WRITELN;
WRITELN(‘CODE NAME MIDTERM’:45);
FOR I:=1 TO 3 DO
BEGIN
WRITELN(CODE[I]:25,NAME[I]:10,MID[I]:10);
END;
WRITELN; WRITELN; WRITELN;
WRITELN(‘…PRESS ENDTER…’:45);READLN;
END;
‘3’ : BEGIN
CLRSCR; WRITELN; WRITELN; WRITELN;
WRITELN(‘CODE NAME FINAL’:45);
FOR I:=1 TO 3 DO
BEGIN
WRITELN(CODE[I]:25,NAME[I]:10,FINAL[I]:10);
END;
WRITELN; WRITELN; WRITELN;
WRITELN(‘…PRESS ENDTER…’:45);READLN;
END;
‘4’ : CLRSCR;END;
END;
BEGIN
ENTERDATA;
MENU;
MENU;
MENU;
MENU;
END.

คำสั่ง GOTOXY
     เป็นคำสั่งตั้ง cursor ที่ตำแหน่งบนหน้าจอ

รูปแบบ

GOTOXY(Row,Column)

ตัวอย่าง

PROGRAM EXAM19;
USES CRT;
VAR A,B,D:INTEGER;
BEGIN
CLRSCR;
GOTOXY(15,5);
WRITELN(‘ENTER TWO NUMBER’);
GOTOXY(15,7);
READ(A,B);
D:=A+B;
GOTOXY(15,10);
WRITELN(‘SUM OF A AND B = ‘,D);
END.

โกลบอลและโลคอล (Global and Local)
     โกลบอล (Global) หมายถึง ค่าใด ๆ ที่เรากำหนดไว้ในส่วนข้อกำหนดของโปรแกรมหลัก คำใดก็ตามไม่ว่าจะเป็นตัวแปร ค่าคงที่ ชื่อแบบข้อมูล หรือโปรแกรมย่อย ที่กำหนดไว้ในส่วนของข้อกำหนดของโปรแกรมหลัก ถือเป็นส่วนกลาง นำไปใช้ได้ทั้งโปรแกรมหลักและโปรแกรมย่อย
     โลคอล (Local) หมายถึง ค่าใด ๆ ที่เรากำหนดไว้ส่วนข้อกำหนดของโปรแกรมย่อย รวมทั้งที่กำหนดในส่วนหัว คือ จะใช้ได้ในโปรแกรมย่อยนั้นหรือโปรแกรมย่อยรองลงไปของโปรแกรมย่อยนั้นเท่านั้น ส่วนโปรแกรมหลักและโปรแกรมย่อยอื่นจะนำไปใช้ไม่ได้

ตัวอย่าง แสดงโกลบอลและโลคอล

PROGRAM AA;
VAR NUM:INTEGER;
PROCEDURE A;
BEGIN
NUM:=NUM*10;
WRITELN(‘NUM*10 = ‘,NUM);
END;
VAR ANY:INTEGER;
PROCEDURE B;
VAR NUM,CNTR:INTEGER;
BEGIN
NUM:=124;
WRITELN(‘NUM = ‘,NUM);
CNTR:=122;
WRITELN(‘CNTR =’,CNTR);
END;
BEGIN {MAIN PROGRAM}
NUM:=5;
WRITELN(‘IN MAIN’,’NUM = ‘,NUM);
A;
B;
WRITELN(‘BACK TO MAIN NUM = ‘,NUM);
END.

ผลที่ได้จาการ RUN

NUM*10 = 50
NUM = 124
CNTR = 122
BACK TO MAIN NUM = 50

อธิบาย
- NUM ที่กำหนดในโปรแกรมหลักเป็นโกบอล คือให้ค่าและ output ในโปรแกรมหลักและให้ค่าและ output ใน program ย่อย A
- NUM, cntr ที่กำหนดใน program ย่อย B เป็นโลคอล B ซึ่งโปรแกรมหลักหรือโปรแกรมย่อยอื่น ๆ จะนำไปใช้ไม่ได้ แต่ชื่อ NUM ซ้ำกับ NUM ในโปรแกรมหลัก จึงถือว่าเป็นคนละ NUM กัน ที่โปรแกรมหลัก NUM=5 แต่พอถึง A นำมาคูณ 10 ได้ 50 เมื่อถึง B ให้ค่าใหม่เป็น 124 เมื่อกลับมาโปรแกรมหลักก็เป็น 124 แต่ยังเป็น 50 เพราะเป็น NUM คนละตัวกัน
- ก่อน procedure B ได้กำหนดตัวแปร ANY ซึ่งเป็นโกบอล แต่ใช้ใน procedure A ไม่ได้ใช้ได้ใน procedure B และโปรแกรมหลัก
- เพราะฉะนั้น B เรียกใช้ A แต่ A เรียกใช้ B ไม่ได้ และทั้ง A,B เรียกใช้ AA ไม่ได้ เพราะเป็นโปรแกรมหลัก

5.1 ตัวแปรชุด  (arrays  variables)
ตัวแปรชุด คือ ตัวแปรชนิดหนึ่งที่ใช้ชื่อเพียงชื่อเดียวแต่มีตัวเลขแสดงตำแหน่งกำกับไว้  (subscript)  เพื่อเป็นการบอกว่าเป็นสมาชิกของตัวแปรชุดตัวที่เท่าไหร่
5.1.1 ประเภทของตัวแปรชุด มีดังนี้
1) ตัวแปรชุด  1  มิติ  (one dimension arrays  หรือ  single dimension arrays) ตัวแปรชุด  1  มิติ คือ ตัวแปรชุดที่มีตัวเลขกำกับ  (subscript)  เพียง  1  ตัว เช่น  a[20], b[100],  name[30]  และ  salary[20]  เป็นต้น
2) ตัวแปรชุดหลายมิติ  (multi-dimension  arrays) ตัวแปรชุดหลายมิติ คือ ตัวแปรชุดที่มีตัวเลขกำกับ  (subscript)  ตั้งแต่  2  ตัวขึ้นไป โดยมากจะสนใจศึกษาตัวแปรชุดที่มีตัวเลขกำกับ 2  ตัว และ  3  ตัว ดังนี้
    • ตัวแปรชุด  2  มิติ  (two  dimension  arrays) คือ ตัวแปรชุดที่มีตัวเลขกำกับ  (subscript)  เพียง 2 ตัว เช่น   a[2][4], b[3][4], name[5][30]  เป็นต้น
    • ตัวแปรชุด  3  มิติ  (three  dimension  arrays) คือ ตัวแปรชุดที่มีตัวเลขกำกับ  (subscript)  เพียง 3 ตัว เช่น a[2][3][4], b[3][4][5]  เป็นต้น
5.1.2 การประกาศตัวแปรชุด  (declaration of arrays)  สามารถทำได้ดังนี้
1) การประกาศตัวแปรชุด  1  มิติ  (declaration  of  one dimension arrays)
clip_image002
โดยที่
type คือ ชนิดของตัวแปรชุด เช่น  int, float, char, double  เป็นต้น
arrayname คือ ชื่อตัวแปรชุด ตั้งขึ้นตามหลักการตั้งชื่อตัวแปร
size คือ ขนาดของตัวแปรชุดเป็นตัวเลขจำนวนเต็ม
2) การประกาศตัวแปรชุด  2  มิติ  (declaration  of  two  dimension  arrays)
clip_image004
โดยที่
type คือ ชนิดของตัวแปรชุด เช่น  int, float, char, double  เป็นต้น
arrayname คือ ชื่อตัวแปรชุด ตั้งขึ้นตามหลักการตั้งชื่อตัวแปร
n คือ ตัวเลขที่ใช้แสดงตำแหน่งแถว (row) มีค่าตั้งแต่  0, 1, 2, …, n-1
คือ ตัวเลขที่ใช้แสดงตำแหน่งคอลัมน์ (column) มีค่าตั้งแต่  0, 1,  2, …, m-1
วิธีการหาจำนวนสมาชิกทั้งหมดของตัวแปรชุด  1  มิติ และ  2  มิติ
การหาจำนวนสมาชิกทั้งหมดของตัวแปรชุด สามารถคำนวณได้จากสูตรดังนี้
กรณีตัวแปรชุด  1  มิติ
จำนวนสมาชิกทั้งหมดของตัวแปรชุด  =  ขนาดของตัวแปรชุด  (size)
กรณีตัวแปรชุด  2  มิติ
จำนวนสมาชิกทั้งหมดของตัวแปรชุด  =  n*m
3) การประกาศตัวแปรชุด  3  มิติ  (declaration  of  three  dimension  arrays)
type  arrayname  [n] [m] [p];
โดยที่
type คือ ชนิดของตัวแปรชุด เช่น  int, float, char, double  เป็นต้น
arrayname คือ ชื่อตัวแปรชุดตั้งขึ้นตามหลักการตั้งชื่อตัวแปร
คือ ตัวเลขกำกับตัวที่  1  มีค่าตั้งแต่  0, 1, 2, …., n-1
m คือ ตัวเลขกำกับตัวที่  2  มีค่าตั้งแต่  0, 1, 2, …., m-1
คือ ตัวเลขกำกับตัวที่  3  มีค่าตั้งแต่  0, 1, 2, …., p-1
.1.3 การกำหนดค่าเริ่มต้นให้กับตัวแปรชุด  (initializing  arrays)
1) การกำหนดค่าตัวเลขให้กับตัวแปรชุด
รูปแบบที่ 1 (กรณีตัวแปรชุด  1  มิติ)
type  arrayname[size]  =  { value list };
รูปแบบที่ 2 (กรณีตัวแปรชุด  2  มิติ)
type  arrayname[n][m]  =  { value list };
โดยที่
value  list คือ ค่าคงที่ชนิดตัวเลขที่ต้องการกำหนดให้ตัวแปรชุด ถ้ามีหลายค่าให้ใช้เครื่องหมาย  ,  (comma)  คั่นระหว่างค่าคงที่แต่ละค่า
โดยค่าคงที่ทั้งหมดจะต้องอยู่ภายใต้เครื่องหมาย  {   }
2) การกำหนดค่าคงที่ชนิดสตริงให้กับตัวแปรสตริง
รูปแบบที่ 1 (กรณีตัวแปรชุด 1 มิติ)
char arrayname[size] = “string  constant”;
รูปแบบที่ 2 (กรณีตัวแปรชุด 2 มิติ)
char arrayname[n][m] = {“string  constant”};
โดยที่
string  constants คือ ค่าคงที่ชนิดสตริงที่ต้องการกำหนดให้ตัวแปรชุด ถ้ามีหลายค่าจะต้องใช้เครื่องหมาย  ,  (comma)  คั่นระหว่างค่าคงที่แต่ละค่า
5.1.4 การนำข้อมูลเข้าไปเก็บและการแสดงผลลัพธ์ของข้อมูลในตัวแปรชุด
โดยปกติเราจะใช้คำสั่ง  for  หรือ  while  หรือ  do  while  คำสั่งใดคำสั่งหนึ่งมาช่วยในการนำข้อมูลเข้าเก็บและแสดงผลลัพธ์ข้อมูลในตัวแปรชุด ส่วนมากนิยมใช้คำสั่ง  for  มากกว่าคำสั่งอื่นทั้งนี้เนื่องจากตัวแปรชุดนั้นเราสามารถทราบขนาดที่แน่นอนได้ ทำให้กำหนดจำนวนรอบการทำงานได้
ผลลัพธ์ที่ได้จากโปรแกรม
clip_image005
คำอธิบายโปรแกรม 
จากโปรแกรมตัวอย่างที่  5.1  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่  6 ประกาศตัวแปร  index  เป็นชนิดจำนวนเต็ม และ  scores  เป็นตัวแปรชุด  1  มิติ ชนิดจำนวนเต็มมีสมาชิก  5  ตัว
บรรทัดที่  7  ถึง  11 กำหนค่าจำนวนเต็มให้กับตัวแปรชุด  scores[0]  ถึง  scores[4]
บรรทัดที่  13 คำสั่ง  for  ทำหน้าที่วนรอบทำงานซ้ำ  5  ครั้ง เพื่อช่วยพิมพ์คะแนนนักเรียนที่เก็บไว้ในตัวแปรชุด  scores[0]  ถึง  scores[4]
บรรทัดที่  14  และ  15 ฟังก์ชัน  printf( )  เพื่อแสดงคะแนนของนักเรียนแต่ละคนออกที่จอภาพซึ่งเก็บไว้ในตัวแปรชุด  scores[0]  ถึง  scores[4]  หลังจากนั้นจะหยุดรอรับค่าใด ๆ จากคีย์บอร์ด ซึ่งถ้ากด  enter  ก็จะกลับสู่โปรแกรม
บรรทัดที่  16 ส่งค่า  0  (ศูนย์) กลับให้กับฟังก์ชัน  main( )
ข้อสังเกต ฟังก์ชัน  main( )  ของโปรแกรมตัวอย่างที่  5.1  เป็นฟังก์ชันที่ต้องการให้ส่งค่ากลับ ในการเขียนโปรแกรมจะต้องมีการใช้ฟังก์ชัน  return( )  ซึ่งถ้าไม่ใช้เวลาที่เรา  compile  โปรแกรม จะมีคำเตือนให้เราทราบทุกครั้ง  แต่โปรแกรมก็สามารถ  run  ได้
ผลลัพธ์ที่ได้จากโปรแกรม
clip_image006
คำอธิบายโปรแกรม
จากโปรแกรมตัวอย่างที่  5.2  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังน
ี้
บรรทัดที่  3  คำสั่ง  #include <stdlib.h>  ให้การสนับสนุนฟังก์ชัน  atoi( )  และฟังก์ชัน  atof( )  สำหรับโปรแกรมนี้ ในบรรทัดที่  10   และ  14  ตามลำดับ
บรรทัดที่  5 ประกาศตัวแปร  num  เป็นตัวแปรชุด  1  มิติ ชนิด  float มีสมาชิก 100 ตัว
บรรทัดที่  7  ประกาศตัวแปร  numstr  เป็นตัวแปรชุด  1  ติ ชนิด char มีสมาชิก 20 ตัว
บรรทัดที่  10  ฟังก์ชัน  atoi( )  ใช้เปลี่ยน  string  เป็นตัวเลขจำนวนเต็ม จากฟังก์ชัน  gets( )  รับตัวอักขระมาเก็บไว้ในตัวแปร  numstr  แล้วเปลี่ยนค่า  string  ของตัวแปร  numstr  ไปเก็บไว้ในตัวแปร  n  โดยใช้ฟังก์ชัน  atoi( )
บรรทัดที่  12  คำสั่ง  for  ช่วยในการเก็บข้อมูลไว้ในตัวแปรชุด  num  ซึ่งมีจำนวนรอบของการทำงานเท่ากับจำนวนสมาชิกของตัวแปรชุด คือ  n  รอบ
บรรทัดที่  14 ฟังก์ชัน  atof( )  ใช้เปลี่ยน  string  เป็นตัวเลขทศนิยม ซึ่งมีการทำงานคล้ายกับฟังก์ชัน  atoi( )  ในบรรทัดที่  10
บรรทัดที่  15  คำสั่ง  sum = sum + num[i];  เป็นการบวกสะสมค่าตัวแปรชุด
บรรทัดที่  18  ถึง  21  คำสั่ง  average = sum/n;  เป็นการคำนวณค่าเฉลี่ยของตัวแปรชุด แล้วแสดงผลค่าตัวแปร  n  ตัวแปร  sum  และตัวแปร  average  ออกจอภาพ
บรรทัดที่  22  หยุดรอรับค่าใด ๆ จากคีย์บอร์ด ซึ่งถ้าเรากด  enter  ก็จะกลับสู่โปรแกรม
ผลลัพธ์ที่ได้จากโปรแกรม
clip_image007
คำอธิบายโปรแกรม
จากโปรแกรมตัวอย่างที่  5.4  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่  3  คำสั่ง  #include <stdlib.h>  ให้การสนับสนุนฟังก์ชัน  atoi( )  เพื่อเปลี่ยนข้อมูลสตริงเป็นชนิดจำนวนเต็ม ซึ่งเรียกใช้ฟังก์ชันนี้ ในบรรทัดที่  10
บรรทัดที่  11  คำสั่ง  for  เพื่อนำค่าสตริงที่รับเข้ามาไปเก็บไว้ในตัวแปรชุด  province[i]  ในคำสั่งบรรทัดที่  13
บรรทัดที่  15  คำสั่ง  for  เพื่อนำค่าสตริงที่เก็บไว้ในตัวแปร  province[i]  ออกแสดงที่จอภาพ ตามคำสั่ง บรรทัดที่  16
บรรทัดที่  17  หยุดรอรับค่าใด ๆ จากคีย์บอร์ด ซึ่งถ้าเรากด  enter  ก็จะกลับสู่โปรแกรม
5.2.1 การประกาศตัวแปรสตริง  1  มิติ
เนื่องจากตัวแปรสตริง คือตัวแปรชุดที่มีชนิดเป็น  char  ดังนั้นจึงสามารถประกาศตัวแปรสตริงได้ดังนี้
char  stringname[size];
หรือ
                      char  stringname[size]  =  “string  constant”;
โดยที่
stringname คือ ชื่อตัวแปรสตริง ตั้งขึ้นตามหลักการตั้งชื่อตัวแปร
string  constant   คือ ค่าคงที่ชนิดสตริง โดยต้องเขียนอยู่ภายใต้เครื่องหมาย   “  “  เสมอ
size คือ ขนาดของตัวแปรสตริง ควรกำหนดให้เนื้อที่ทั้งหมดที่ใช้เก็บข้อมูลมีขนาดเกินค่าคงที่สตริงที่ยาวที่สุดไปอย่างน้อย  1  byte  ในทางปฏิบัตินิยมกำหนดขนาดให้มาก ๆ ไว้ก่อน ส่วนจะใช้เนื้อที่ครบทั้งหมดหรือไม่ ไม่มีผลอะไรในโปรแกรม
ตัวอย่างการประกาศตัวแปรสตริง  1  มิติ
1)  char  name[26];  /*  ประกาศตัวแปรสตริง  name  มีขนาด  26 bytes  */
2)  char  name[26],  address[41];
/*  ประกาศตัวแปรสตริง  name  มีขนาด  26 bytes  และตัวแปรสตริง  address  มีขนาด  41  bytes    ตามลำดับ  */
3)  char  str[9]  =  “COMPUTER”;
/*  ประกาศตัวแปรสตริง  str  มีขนาด  9  bytes  และกำหนดข้อความให้สตริง  */
แต่ถ้าเราเขียนคำสั่งเป็น  char  str[8]  =  “COMPUTER”;  จะเกิด  error  ขึ้นเพราะความกว้างของตัว แปรสตริงน้อยกว่าคงที่สตริงอยู่  1  byte  ดังนั้นจะต้องกำหนดขนาดให้เกินค่าคงที่สตริงไว้อย่างน้อย  1  byte  เสมอ
4)  char  city[80]  =  “Bangkok, Thailand”;
/*  ประกาศตัวแปรสตริง city มีขนาด  80 bytes  และกำหนดข้อความให้สตริง  */
5.2.2 การประกาศตัวแปรสตริง  2  มิติ
char  stringname[n][m] 
หรือ
char  stringname[n][m]   =  {“string  constant1”,
“string  constant2 “,…,”string  constanN };
โดยที่
stringname คือ ชื่อตัวแปรสตริง ตั้งขึ้นตามหลักการตั้งชื่อตัวแปร
n, m คือ จำนวนแถวและจำนวนคอลัมน์ตามลำดับ
string constant1,  string constant2,…., string constantN คือ ค่าคงที่ชนิดสตริงตัวที่  1, 2, …., N  ตามลำดับ ซึ่งจะต้องเขียนอยู่ภายใต้เครื่องหมาย  “….”  เสมอ
ตัวอย่างการประกาศตัวแปรสตริง  2  มิติ
1) char name[3] [20]; 
/* ตัวแปรสตริง name 2 มิติ มีขนาด 3*20 = 60 bytes*/
2)  char  name[3] [20]  =  {“KANNIKAR”,”SURAPORN”,”THAITANA”};
/*  ประกาศตัวแปรสตริง name  2  มิติ มีขนาด  3*20  =  60  bytes  และกำหนดค่าสตริง  KANNIKAR, SURAPORN  และ  THAITANA ให้กับตัวแปรสตริง  name[0],  name[1]  และ  name[2]  ตามลำดับ  */
5.3 ฟังก์ชันที่ใช้งานเกี่ยวกับสตริง  (string  functions)
นภาษา  C มีฟังก์ชันที่ใช้จัดการเกี่ยวกับค่าคงที่สตริง และตัวแปรสตริงอยู่หลายฟังก์ชันดังนี้
•  ฟังก์ชัน  strlen( )
•  ฟังก์ชัน   strcmp( )
•  ฟังก์ชัน  strcpy( )
•  ฟังก์ชัน  strcat( )
โดยก่อนที่จะใช้ฟังก์ชันเหล่านี้จะต้องมีการใช้คำสั่ง # include<string.h>เข้ามาในโปรแกรมด้วยจึงจะสามารถทำงานได้
5.3.1 ฟังก์ชัน  strlen( )
                        strlen( )  เป็นฟังก์ที่ใช้นับความยาวของค่าคงที่สตริง หรือตัวแปรสตริง
รูปแบบการใช้
strlen(string  variable);
หรือ
            strlen(“string  constant”);
โดยที่
string  variable  และ  string  constant คือ ตัวแปรสตริง และค่าคงที่สตริง ตามลำดับ ใช้อย่างใดอย่างหนึ่งเท่านั้น
เช่น  strlen(“computer”);  หรือ  char  name[20]=  “KANNIKAR” ;  strlen(name);  เป็นต้น
ลักษณะของฟังก์ชัน  strlen( )  นี้เป็นฟังก์ชันที่มีการส่งค่ากลับเป็นตัวเลขจำนวนเต็ม  (integer)  มายังชื่อฟังก์ชัน ดังนั้นจึงนิยมกำหนดตัวแปรชนิด  int  ขึ้นมา  1  ตัว เพื่อเก็บค่าความยาวของสตริงเอาไว้
เช่น
int  n;
char  s[80]=  “BANGKOK,  THAILAND” ;
n=strlen(s);  /*  กำหนดค่าความยาวของสตริงส่งกลับให้ตัวแปร  n  */
ผลลัพธ์ที่ได้จากโปรแกรม
clip_image008
คำอธิบายโปรแกรม
จากโปรแกรมตัวอย่างที่  5.5  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่  3 คำสั่ง  #incluce <string.h>  ในโปรแกรมตัวอย่างนี้ ให้การสนับสนุนฟังก์ชัน  strlen( )  สำหรับหาความยาวของตัวแปรสตริง ในบรรทัดที่ 11
บรรทัดที่  10  คำสั่ง  gets(s);  เป็นการรับข้อมูลสตริงไปเก็บไว้ในตัวแปรสตริง  s  ซึ่งตัวแปรสตริง  s  ได้ประกาศไว้ในบรรทัดที่  7
บรรทัดที่  11  คำสั่ง  n = strlen(s);  เป็นการกำหนดค่าความยาวของสตริง  s  ให้เก็บความยาวไว้ที่ตัวแปร  n
บรรทัดที่  12  ถึง  13  แสดงสตริงและความยาวของสตริงที่หาได้ ออกแสดงที่จอภาพ
บรรทัดที่  14  หยุดรอรับค่าใด ๆ จากคีย์บอร์ด ซึ่งถ้าเรากด  enter  ก็จะกลับสู่โปรแกรม
5.3.2 ฟังก์ชัน  strcmp( )
                        strcmp( )  เป็นฟังก์ชันที่ใช้เปรียบเทียบข้อมูลชนิดสตริง  2  ค่า ว่ามีค่าเท่ากัน หรือมากกว่า หรือน้อยกว่าอย่างใดอย่างหนึ่ง ซึ่งการเปรียบเทียบสตริงจะใช้ค่ารหัส  ASCII  เปรียบเทียบทีละตัวอักขระ
รูปแบบการใช้
strcmp(str1var,  str2var);
หรือ
          strcmp(str1constant,  str2constant);
โดยที่
str1var,  str2var คือตัวแปรสตริงตัวที่  1  และ  2  ตามลำดับ
Str1constant,  str2constant คือ ค่าคงที่สตริงค่าที่  1  และ  2  ตามลำดับ
ผลการเปรียบเทียบระหว่าง  str1constant,  และ  str2constant  มีดังนี้
ถ้า  str1constant  >  star2constant  จะได้ค่ามากกว่าศูนย์
ถ้า  str1constant  <  star2constant  จะได้ค่าน้อยกว่าศูนย์
ถ้า  str1constant  =  star2constant  จะได้ค่าเท่ากับศูนย์
ผลลัพธ์ที่ได้จากโปรแกรม
clip_image009
คำอธิบายโปรแกรม
จากโปรแกรมตัวอย่างที่  5.6  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่  3 คำสั่ง  #include <string.h>  ในโปรแกรมตัวอย่างนี้ ให้การสนับสนุนฟังก์ชัน  strcmp( )  สำหรับเปรียบเทียบข้อมูลชนิดสตริง  2  ค่า
บรรทัดที่  12  เป็นการตรวจสอบค่า  str1> str2  หรือไม่ โดยใช้ฟังก์ชัน  strcmp( )  ในบรรทัดที่  12  และ  14  (หรือค่าที่ได้จากฟังก์ชัน  strcmp( )  > 0  หรือไม่) ซึ่งถ้าใช่ก็ให้พิมพ์ข้อความบอก
บรรทัดที่  14  เป็นการตรวจสอบค่า  str1 == str2  หรือไม่ โดยใช้ฟังก์ชัน  strcmp( ) (หรือค่าที่ได้จากฟังก์ชัน  strcmp( )  == 0  หรือไม่) ซึ่งถ้าใช่ก็ให้พิมพ์ข้อความบอก
บรรทัดที่  15  และ  17  ถ้าไม่ใช่ทั้ง  2  กรณีที่กล่าวมาแสดงว่าค่าสตริงที่ตรวจสอบนั้น สตริงตัวแรกมีค่าน้อยกว่าสตริงตัวที่สอง ก็ให้พิมพ์ข้อความบอก
บรรทัดที่  15  หยุดรอรับค่าใด ๆ จากคีย์บอร์ด ซึ่งถ้าเรากด  enter  ก็จะกลับสู่โปรแกรม
ข้อสังเกต ฟังก์ชัน  strcmp( )  จะเปรียบเทียบสตริงด้วยค่ารหัส  ASCII  โดยเปรียบเทียบทีละตัวอักขระ
5.3.3 ฟังก์ชัน  strcpy( )
                        strcpy( )  เป็นฟังก์ชันที่ใช้คัดลอกข้อมูลจาก  string  ค่าหนึ่งไปยัง  string  อีกค่าหนึ่ง
รูปแบบที่ใช้
strcpy(str2,  str1);
โดยที่
str1 คือ ค่าคงที่สตริง หรือค่าตัวแปรสตริงที่ต้องการคัดลอก
str2 คือ ตัวแปรสตริงที่ใช้เก็บค่าที่คัดลอกมาจาก  str1
เช่น   char  s1[80],  s2[80];
strcpy(s1,”Computer”);
strcpy(s2,s1);
ผลลัพธ์ที่ได้จากโปรแกรม
clip_image011
คำอธิบายโปรแกรม
จากโปรแกรมตัวอย่างที่  5.7  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่  3 คำสั่ง  #include <string.h>  ในโปรแกรมตัวอย่างนี้ ให้การสนับสนุนฟังก์ชัน  strcpy( )  สำหรับคัดลอกข้อมูลจาก  string  ค่าหนึ่งไป  string  อีกค่าหนึ่ง ในบรรทัดที่  8  และ  9
บรรทัดที่  8 ฟังก์ชัน  strcpy( )  คัดลอกข้อความคำว่า  Hello, Thailand  ไปเก็บไว้ในตัวแปร  str1
บรรทัดที่  9 ฟังก์ชัน  strcpy( )  คัดลอกข้อความในตัวแปร  str1  ไปเก็บไว้ในตัวแปร
str2
บรรทัดที่  10  แสดงข้อความที่เก็บในตัวแปร  str2  แสดงที่จอภาพ
บรรทัดที่  11 หยุดรอรับค่าใด ๆ จากคีย์บอร์ด ซึ่งถ้ากด  enter  ก็จะกลับสู่โปรแกรม
5.3.4 ฟังก์ชัน  strcat( )
                        strcat( )  เป็นฟังก์ชันที่ใช้เชื่อมค่าคงที่ชนิดสตริง  2  ค่า เข้าด้วยกัน โดยผลลัพธ์จะเก็บเอาไว้ในตัวแปรสตริงตัวแรกเสมอ
รูปแบบการใช้
strcat(str1,str2);
โดยที่
str1 คือ ตัวแปรสตริงตัวที่  1  ใช้เก็บผลลัพธ์ของการเชื่อมสตริงทั้ง  2  ตัว
str2 คือ ตัวแปรสตริงตัวที่  2  หรือค่าคงที่สตริงก็ได้
เพื่อความเข้าใจเกี่ยวกับการทำงานของฟังก์ชัน  strcat( )  ได้ดียิ่งขึ้นควรศึกษาโปรแกรมตัวอย่างที่  5.8  ดังต่อไปนี้
ผลลัพธ์ที่ได้จากโปรแกรม
clip_image013
คำอธิบายโปรแกรม
จากโปรแกรมตัวอย่างที่  5.8  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่  3  คำสั่ง  #include <string.h>  ในโปรแกรมตัวอย่างนี้ ให้การสนับสนุนฟังก์ชัน  strcpy( )  และฟังก์ชัน  strcat( )  สำหรับเชื่อมค่าสตริง  2  ค่าเข้าด้วยกัน ในบรรทัดที่  8, 9  และ  10
บรรทัดที่  8  ฟังก์ชัน  strcpy( )  คัดลอกข้อความคำว่า  Computer  Programming Language 1  ไปเก็บไว้ในตัวแปร  str1
บรรทัดที่  9 ฟังก์ชัน  strcpy( )  คัดลอกข้อความคำว่า  is your course…   ไปเก็บไว้ในตัวแปร   str2
บรรทัดที่  10  ใช้ฟังก์ชัน  strcat( )  เพื่อเชื่อมต่อค่าคงที่ชนิดสตริง ในตัวแปร  str1  และ  str2  เข้าด้วยกัน แล้วแสดงผลออกจอภาพ ด้วยฟังก์ชัน  printf( )
บรรทัดที่  11  หยุดรอรับค่าใด ๆ จากคีย์บอร์ด ซึ่งถ้าเรากด  enter  ก็จะกลับสู่โปรแกรม
5.4 สรุปท้ายบท
ตัวแปรชุด คือ ตัวแปรชนิดหนึ่งที่ใช้ชื่อเพียงชื่อเดียวแต่มีตัวเลขแสดงตำแหน่งกำกับไว้  (subscript)  เพื่อเป็นการบอกว่าเป็นสมาชิกของตัวแปรชุดตัวที่เท่าไหร
ค่าคงที่สตริง คือ ตัวอักขระ  (characters)  ใด ๆ ที่เขียนอยู่ภายใต้เครื่องหมาย  “ “  (double  quotation) 
ตัวแปรสตริง คือ ตัวแปรชุดที่เก็บค่าคงที่ชนิดสตริง โดยมีชนิดของตัวแปรชุดเป็น  char
ฟังก์ชันที่ใช้งานเกี่ยวกับสตริง  (string  functions)  ที่สำคัญ ๆ มีดังนี้
1. strlen( )  เป็นฟังก์ที่ใช้นับความยาวของค่าคงที่สตริง หรือตัวแปรสตริง
2. strcmp( )  เป็นฟังก์ชันที่ใช้เปรียบเทียบข้อมูลชนิดสตริง  2  ค่า ว่ามีค่าเท่ากัน หรือมากกว่า หรือน้อยกว่าอย่างใดอย่างหนึ่ง ซึ่งการเปรียบเทียบสตริงจะใช้ค่ารหัส  ASCII  เปรียบเทียบทีละตัวอักขระ
3. strcpy( )  เป็นฟังก์ชันที่ใช้คัดลอกข้อมูลจาก  string  ค่าหนึ่งไปยัง  string  อีกค่าหนึ่ง
strcat( )  เป็นฟังก์ชันที่ใช้เชื่อมค่าคงที่ชนิดสตริง  2  ค่า เข้าด้วยกัน โดยผลลัพธ์จะเก็บเอาไว้ในตัวแปรสตริงตัวแรกเสมอ

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

ภาษาปาสคาล

โครงงานคอมพิวเตอร์