Want a free e-mail ? Click here !

Page นี้จะมีรายละเอียดเกี่ยวกับการเขียนโปรแกรมมากมาย เพราะฉะนั้น เรา...
( 3 )

ตอนนี้มาพูดถึงเนื้อหาเริ่มที่จะลึกๆ ลงไปบ้าง ผู้ที่กำลังเข้ามาครั้งแรกสามารถดูบทเรียนก่อนๆได้ที่ข้างล่างนี้นะครับ ตรง prevoius title 1 และ 2 ถ้ามีอะไรไม่เข้าใจ post message ไว้นะครับ และอย่าลืมแสดงความคิดเห็นบ้าง อย่าปล่อยให้พื้นที่ post message หรือ guestbook หรือ e-mail มันเหงา ! มันกะลังคอยคนเขียนอะไรไปหามันบ้าง


Previous title : 1. เริ่มต้นกับภาษา C เริ่มต้นจริง ๆ นะครับ
Previous tisle : 2. C ขั้นพื้นฐาน (สำหรับผู้เริ่มต้น)

Today's Title : 3. ว่ากันด้วยเรื่องตัวอักษร

Next update title : 4. แล้วต่อด้วย pointer คืออะไร ?

3. ว่ากันด้วยเรื่องตัวอักษร

สำหรับภาษา C นั้นฟังก์ชั้นมาตรฐานที่ใช้ในการอ่านค่าจากคีย์บอร์ดคือ getchar(); รูปแบบการใช้คือ c=getchar( ); เมื่อ c ต้องถูกประกาศตัวแปรเป็นแบบ char (ลองเขียนโปรแกรมดูเองนะครับ) และฟังก์ชันสำหรับแสดงตัวอักษรที่หน้าจอคือ putchar( ); ใช้ว่า putchar(ชื่อตัวแปรชนิด char) เราสามารถใช้ putchar หรือ printf ในการพิมพ์ค่าไปสู่หน้าจอก็ได้ครับ ถ้ายังไม่เข้าใจมาดูโปรแกรมตัวอย่างดีกว่า

โปรแกรม #3

1:#include <stdio.h>
2:main()
3:{
4: char c;
5: c=getchar();
6: while ( c != 'q' )
7: {
8: putchar(c);
9: c=getchar();
10: }
11:}

ตกลงกันก่อนว่า ตัวเลข 1: หรือ 2: ไปจนถึง 10: นั้นไม่ต้องพิมพ์ลงไปนะครับ ผมใช้ช่วยการการอธิบายเท่านั้น โดยถือว่า 1: ก็คือบรรทัดที่ 1 นะครับ ลองสั่ง run โปรแกรมนี้ดู จะพบว่าโปรแกรมจะรออ่านค่าจากคีย์บอร์ดทีละตัวเมื่อเรากดอะไรก็ตาม มันก็จะแสดงให้เราเห็นด้วย จนกว่าเราจะกดตัว q และกด enter มันถึงจะออกมาจากโปรแกรม เป็นไงล่ะ !

บางคนเห็นบรรทัดแรกแล้วงง ว่าทำไมต้องมีตัวนี้ด้วย ไอ้ตัวที่มี # นำหน้านั้นน่ะเค้าเรียกว่า pre-processer มีประโยชน์ต่อการเขียนโปรแกรมมากทีเดียว โดยคำสั่ง #include <stdio.h> นี้จะหมายความว่าให้นำเอาไฟล์ stdio.h เข้ามารวมไว้ในโปรแกรมของเราด้วย (เพราะคำสั่ง putchar และ getchar อยู่ในไฟล์นี้) บรรทัดที่ 2 และ 3 คงไม่ต้องบอกนะครับ ส่วนบรรทัดที่ 4 ก็กำหนดให้ตัวแปร c ให้เก็บข้อมูลแบบตัวอักษร บรรทัดที่ 5 กำหนดให้รอรับอักษรจากแป้นพิมพ์แล้วนำไปกำหนดไว้ในตัวแปร c จากนั้นเป็นการทดสอบว่าค่า c ไม่เท่ากับ q หรือเปล่า ถ้าไม่เท่ากับให้ทำตามคำสั่งในบล๊อคย่อย แต่ถ้าสมมุติเท่ากับ q แล้วโปรแกรมก็จะหลุดออกมาแลย แบบนี้อาจจะงง สรุปคำสั่งได้ว่า
1. อ่านค่า c
2. ทดสอบว่า c ใช่ตัว 'q' หรือเปล่า
3. ถ้าไม่ใช้ให้ลงมาในลูป {.....} ก็คือพิมพ์ค่า c แล้วอ่านค่า c อีกครั้งหนึ่ง
4. ย้อนกลับไปที่ประโยค while อ่านค่า c ต่อ
5. ทดสอบค่า c เช่นนี้เรื่อยไป จนกว่าค่า c มีค่าคือ 'q' จะกระโดดออกจากการวนลูป
6. จบโปรแกรม

นอกจากนี้ถ้าจะให้โปรแกรมสั้นลงเราสามารถเขียนโปรแกรมสั้นๆ ได้ดังนี้

โปรแกรม #4

1:#include <stdio.h>
2:main()
3:{ char c;
4: while (( c = getchar()) != 'q') putchar(c); }

สั้นไหมครับ แต่การเขียนแบบนี้อาจจะงงได้สำหรับผู้ที่ไม่เคยชิน ลองไล่ดูประโยคดูนะครับ การทำงานเหมือนกันเปี๊ยบเลย

ในเมื่อมีตัวอักษรแล้ว ต่อมาก็ต้องมีข้อความใช่ไหม ข้อความคืออะไร ข้อความก็คือตัวอักษรโดดหลายตัวมารวมกันเราเรียกตรงนี้ว่า string ในภาษาปาสคาลจะมีตัวแปรประเภทหนึ่งคือตัวแปรสตริงโดยเฉพาะ ผู้ใช้ปาสคาลอย่าพึ่งสับสนนะครับ เพราะผมจะบอกว่าในภาษา C จะไม่มีตัวแปรประเภทนี้ แต่ภาษา C ใช้ตัวแปรประเภท char แทน หลายคนเริ่มสงสัยว่าตัวแปรประเภท char มันเก็บอักษรได้ตัวเดียวนี่นา ก็ถูกครับ แต่เราสามารถระบุให้มันเก็บเป็นข้อความได้โดยใช้ตัวที่เรียกว่า อาร์เรย์ (Array) ผู้ใช้ปาสคาลคงอ๋อแล้วใช่ไหม เพราะความยืดหยุ่นของภาษา C นี่เองทำให้เราสามารถใช้ array ร่วมกับตัวแปรได้หลายชนิด ซึ่งมีประโยชน์ (อย่างมาก) ในการเขียนโปรแกรมจำพวกเกม

สิ่งที่ควรรู้ก็คือ การระบุค่าของตัวแปรเราจะใช้ char line[25]; ก็หมายความว่าตัวแปร line นี้เก็บข้อมูลแบบตัวอักษรได้ 24 ตัวอักษร ย้ำว่า 24 ตัวอักษรนะครับ ที่เป็นอย่างนี้ เพราะภาษา c จะกำหนดไว้ว่า ไบต์(หรือที่เก็บตัวอักษร)สุดท้ายของข้อความต้องเก็บเป็นรหัส \0 เสมอ ซึ่งค่า \0 นี้ก็คืออักษร null ของรหัสแอสกี ( รหัส ASCII 00 ) ซึ่งก็คือความว่างเปล่านั่นเอง ลองมาดูโปรแกรมตัวอย่างกันอีกทีนะ

โปรแกรม #5

1:#include <stdio.h>
2:main()
3:{
4: char line[51];
5: int i=0;
6: while (i<51 && (line[i] = getchar()) != '\n') i=i+1;
7: if (i<51) line[i]='\0';
8: printf(" %s \n",line);
9: i=i-1;
10: while( i>=0) {
11: putchar(line[i]);
12: i=i-1;
13: }
14:}

จะเห็นได้ว่าโปรแกรมยาวขึ้นและยุ่งยากขึ้น ไม่เป็นไรครับเรามีเวลาเหลือเฟือ ดูไปทีละนิดละกัน อ้ออีกอย่างหนึ่งตรงเลขบรรทัดนั้น เพื่อนๆคิดว่าควรจะใส่ดีหรือเปล่าครับ แสดงความคิดเห็นกันหน่อย และเนื่องจากข้อจำกัดของภาษา HTML ทำให้ไม่สามารถเว้นวรรคได้ตามต้องการขออภัยด้วยครับ เอาล่ะมาดูโปรแกรมกันดีกว่า โปรแกรมนี้จะทำการอ่านข้อมูล 1 ประโยค (จบประโยคโดยการกด ENTER ) และพิมพ์ประโยคเดิมออกมาทั้งเหมือนเดิมและสลับซ้ายขวา จากบรรทัดที่ 4 เรากำหนดให้ตัวแปร line เก็บข้อมูลแบบตัวอักษรได้ 50 ตัวนะครับ จากนั้นกำหนดให้ i เก็บข้อมูลตัวเลขและมีค่าเริ่มต้นเท่ากับ 0 ( ค่านี้เปลี่ยนแปลงได้ ) เราใช้ค่า i ในการบ่งบอกตำแหน่งที่อยู่ของตัวอักษรแต่ละตัวใน 1 ประโยค มากถึงบรรทัดที่ 6 อาจจะดูยุ่งยากสักนิด แต่บรรทัดนี้ จะอ่านค่าตัวอักษรทีละตัวไปเรื่อยๆ จนกว่าจะครบ 50 ตัว หรือเรากด ENTER สิ่งที่ควรรู้ในตอนนี้คือ สัญลักษณณ์ \n นั้นหมายถึงการกด enter หรือการขึ้นบรรทัดใหม่ บรรทัดที่ 7 คือเราจะใส่ค่า อักษรตัวสุดท้าย (51) ให้เป็น \0 คือการจบประโยคนั่นเอง จากนั้นจะเป็นการพิมพ์ค่าออกมาโดยใช้คำสั่ง printf สังเกตว่าเราไม่ต้องระบุตำแหน่งให้ line อีกแล้ว เพราะถ้าใช้โดดๆ แบบนี้จะหมายความถึงทั้งประโยคเลยครับ ( ส่วน line[5] หมายถึงอักษรตัวที่ 5 หรือแม้กระทั่ง line[i] ก็จะหมายถึงตัวอักษรตัวที่ i) ลงมาดูบรรทัดที่ 9 ที่เราให้ i=i-1 นั้นก็เพราะว่าตอนนี้ค่า i ของเราได้มาถึงตัวสุดท้ายของข้อความแล้ว สมมุติว่าเป็น 51 เมื่อผ่านบรรทัดนี้จะเหลือ 50 ที่เราทำเช่นนี้ก็เพราะต้องการที่จะพิมพ์ตัวอักษรแบบสลับซ้ายขวา ลองไล่ดูประโยค while ทั้งบล๊อคนะครับ จะเห็นได้ว่าจะพิมพ์ย้อนกลับมาจากตัวที่ 50 เป็นตัวที่ 49,48 มาเรื่อยๆ จน i=0 จึงออกจาก block มาตามเงื่อนไขที่ระบุไว้ใน while
เสริมนิดนึง ลืมพูดถึงไป ก็คือ #define จะระบุไว้ในส่วนไหนก็ได้แต่ต้องนอกบล๊อก { ... } ส่วนมากจะกำหนดไว้ที่หัวโปรแกรมพร้อมกับ #include, #define ก็คือการกำหนดค่าคงที่ที่จะใช้ในโปรแกรม ก็เหมือน const ในภาษาปาสคาลนั่นเอง เช่น เราจะกำหนดว่า #define MAX 90 และ #define MIN 1 ก็หมายความว่าให้ค่าคงที่ MAX มีค่าเท่ากับ 90 และค่าคงที่ MIN มีค่าเท่ากับ 1 ทั้ง 2 ตัวนี้จะมีค่าคงที่เสมอไม่ว่าจะเกิดอะไรขึ้น และไม่สามารถเปลี่ยนแปลงได้ในโปรแกรมครับ
ความสามารถของเรื่องสตริงหรือตัวอักษรและ array ไม่ได้มีเรื่องเท่านี้นะครับ คราวหน้าเราจะพูดถึงส่วนที่สำคัญ และนำมาใช้เรื่องนี้โดยตรงและยืดหยุ่นกว่าได้เช่นกัน นั่นก็คือเรื่อง ponter ครับ

เป็นไงบ้างครับ จบบทที่ 3 นั่งทำตอน 6 โมงเย็น upload มาไว้ตอนห้าทุ่ม หลังแข็งเหมือนกันนะเนี่ย ขอให้ฝันหวานเป็นภาษาซีนะครับ 5 5 5 :D noii99@hotmail.com

Post Message
มีข้อคิดเห็น / คำถาม / คำติชม เกี่ยวกับการเขียนโปรแกรม เชิญ Click Post ข้อความได้ที่นี่ครับ




If you enjoy with my Home Page,please CLICK our sponsor banners.Thanks !