วันพุธที่ 8 กรกฎาคม พ.ศ. 2552

คำสั่งภาษา ซี

คำสั่งภาษา ซี


C is case Sensitive. หมายความถึง ว่าในภาษา C นั้น อักษรตัวใหญ่ กับตัวเล็ก มีความหมายที่แตกต่างกัน คือ เราสามารถใช้ A เป็นตัวแปร ซึ่งจะเป็นตัวแปรคนละตัวกับ aEvery Statement is definited by a semicolon หมายความว่าทุกข้อความที่เป็นคำสั่งในภาษา C นั้นจะลงท้ายด้วยเครื่องหมาย semicolon (;)
ตัวอย่างของโปรแกรม#include/* This is my first program. */main(){ clrscr(); printf("Hello,world \n"); printf("Press any key to stop \n"); getch();} /*end of main*/
จากตัวอย่างข้างต้นเราสามารถอธิบายได้หลายอย่าง ให้สังเกต ณ บรรทัดแรกที่เขียนว่า #include บรรทัดนี้กำลังจะบอกเราว่าให้เรานั้นไปเอาไฟล์ที่มีสกุล .h นั้นมาเป็นส่วนหนึ่งของโปรแกรมเรา ซึ่งส่วนนี้ในทุกโปรแกรมจะต้องมี ส่วนไฟล์ที่เราไปเอามานั้นคือ header file ที่มีชื่อว่า stdio.h ถ้าจะจำกันให้ง่ายนั้นมันย่อมาจาก standard Input Output คือเป็นไฟล์ที่ใช้จัดการกับการ รับค่า และ แสดงค่าของโปรแกรม จากโครงสร้างในส่วนต้นนี้คือก่อนที่จะถึงตรงส่วนของคำว่า main() เราจะเรียกส่วนนี้ว่า Preprocessor บรรทัดถัดมาเขียนว่า /*........*/ ในส่วนนี้เราเรียกว่าส่วนของการ comment คือให้เราเขียนข้อความอะไรก็ได้ลงไปซึ่ง อาจจะเป็นการอธิบายโปรแกรมเป็นต้น ในที่นี้เราเขียนว่า This is my first program คือเป็นการบอกว่านี่คือโปรแกรมแรกของฉัน บรรทัดถัดมาเขียนว่า main() ข้อความนี้เขียนเพื่อบอกให้รู้ว่าหลังจากคำนี้จะมีเครื่องหมาย { และจะจบด้วยเครื่องหมาย } ข้อความหรือคำสั่งที่อยู่ระหว่างเครื่องหมาย { และ } ทั้งหมดนั้นเป็นคำสั่งที่ใช้ในส่วนของ main โปรแกรม ในทุกโปรแกรมจะต้องมีส่วนของ main ปรากฎอยู่เพราะเมื่อเราสั่ง compile โปรแกรม ตัว compile จะทำการวิ่งไปหา main ทุกครั้งเสมอ C a collection of functions one of which must be main() function คำกล่าวนี้บอกเราว่า การโปรแกรม C ประกอบไปด้วย function ซึ่ง function หนึ่งที่จะต้องมี ก็คือ ฟังก์ชัน main() ตอนนี้เราได้เข้ามาสู่ main() เรียบร้อยแล้ว บรรทัดแรกใน main function คือ clrscr(); สังเกตได้ว่าข้อความนี้จบลงด้วย เครื่องหมาย semicolon แสดงว่าข้อความนี้เป็นคำสั่ง และขอบอกไว้เลยว่าคำสั่ง clrscr(); นี้คือ คำสั่ง clear screen นั่นเองคือ เมื่อ โปรแกรมได้ run มาถึงส่วนนี้และได้ทำคำสั่งนี้หน้าจอที่ปรากฎจะถูก clear เพื่อรอทำคำสั่งต่อไป คำสั่งถัดมาคือ print("....ข้อความ..... \n"); ความจริงแล้วคำสั่ง printf(อ่านว่า พริ้นซ์-เอฟ) มีอยู่หลายรูปแบบแต่เดี๋ยวเราค่อยๆดู กันไปก่อนในแบบแรกนี้คือว่า คำสั่งนี้จะทำการพิ่มพ์ ข้อความที่ปรากฎอยู่ระหว่างเครื่องหมาย " และ " ออกมาบนหน้าจอในที่นี้จะ พิมพ์คำว่า Hello,world ปรากฎขึ้นบนหน้าจอ ส่วนเครื่องหมาย \n ที่ปรากฎอยู่นั่นเป็นเครื่องหมาย tab ซึ่งมีอยู่หลายรูปแบบ เช่นเดียวกันในที่นี้ \n หมายความว่า หลังจากพิมพ์ข้อความแล้วให้ cursor ย้ายไปขึ้นบรรทัดใหม่ บรรทัดถัดมาก็จะมีความหมายเช่นเดียวกับบรรทัดแรกคือ จะพิมพ์คำว่า Press any key to stop จากนั้น cursor ก็จะวิ่งไปขึ้นบรรทัดใหม่เพราะตัว tab \n ที่ผ่านมาคือคำสั่ง printf จะเห็นได้ว่าเป็นคำสั่งประเภท output คือสั่งพิมพ์ออกทางหน้าจอ ต่อมาจะมีคำสั่ง Input บ้าง นี่คือ คำสั่ง getch(); เป็นคำสั่งสำหรับรับค่าจากทาง keyboard เข้ามา ซึ่งจริงๆแล้วรูปแบบของคำสั่งก็มีหลายรูปแบบเช่นกัน แต่ในที่นี้ ที่เราจะต้องใช้คำสั่งนี้ก็เพื่อว่า เมื่อเราพิมพ์ข้อความทั้งสองข้างต้นไปแล้วให้ผู้ใช้ กดปุ่มใดๆก็ได้เพื่อจบโปรแกรม บรรทัดต่อมามีเครื่องหมาย } เป็นการแสดงว่าจบโปรแกรมในส่วนของ main ส่วนข้อความ /* end of main */ ที่ปรากฎก็คือ comment เช่นเดียวกับที่ได้อธิบายไปข้างต้นแล้ว เราจะสังเกตได้ว่า เมื่อมีเครื่องหมาย ปีกกาเปิด ก็ต้องมีเครื่องหมาย ปีกกาปิด เสมอ และอยู่กันเป็นคู่ๆด้วย ขอให้ทุกคนลองดัดแปลงโปรแกรมข้างต้นและสังเกตความเปลี่ยนแปลงที่เกิดขึ้นเช่น อาจจะเปลี่ยนข้อความในระหว่างเครื่องหมาย " และ " ใน printf หรือลองตัดเครื่องหมาย \n ออก หรือ ลองเปลี่ยน \n เป็น \t หรือ \r ดูว่าจะเกิดอะไรขึ้น หรือลองลบคำสั่ง getch(); ทิ้งไป แล้วดูว่าจะเกิดอะไรขึ้น

ชนิดของข้อมูล (Data types)


ชนิดของข้อมูลประกอบไปด้วย
character (char) ใช้ 1 byte บน Dos มีค่า -128 ถึง127 นิยมใช้เก็บตัวอักษร 1 ตัวอักษร
integer (int) ใช้ 2 byte มีค่า -32768 ถึง 32767 และยังมี long ซึ่งคล้าย integer แต่เก็บด้วย ช่วงตัวเลขที่ยาวกว่าจึงกินเนื้อที่ ถึง 4 byte
float ใช้ 2 byte ใช้เก็บตัวเลขทศนิยม และยังมี double ซึ่งคล้าย float แต่เก็บด้วยช่วงตัวเลขที่ยาวกว่าจึงกินเนื้อที่ถึง 4 byte
ในภาษา C จะไม่มีชนิดข้อมูลเป็น string แต่จะใช้ สายของอักษร หรือ Array ของ Char แทน ความจริงแล้วชนิดของข้อมูลยังสามารถจำแนกไปได้อีกมาก แต่ในที่นี้ขอแนะนำเพียงเท่านี้ก่อน ก็เพียงพอ

Derive Data Type



- Array - recore [structure] ที่กล่าวมาข้างต้นว่าถ้าพบข้อความ เช่น "This is a book" ในการโปรแกรมทั้งข้อความนี้เราเรียกว่า string และเนื่องจากในภาษา C ไม่มีตัวแปร String ทำให้เราต้องใช้ Array มาจัดการ นั่นคือเมื่อ C มองเห็น string จะจอง พื้นที่ในหน่วยความจำเป็น Array ของ Character บางคนอาจจะสงสัยว่าการจองพื้นที่ในหน่วยความจำของ Array เป็นอย่างไร ทำไมต้องจอง ก็ขอบอกว่า เวลาที่เราประกาศตัวแปรชนิดใดก็ตาม C ก็จะทำการไปหาเนื้อที่ในหน่วยความจำ ขนาดเท่าๆ กับ ชนิดข้อมูลที่เรากำหนดเอาไว้ ซึ่ง ถ้าเราประกาศตัวแปร 2 ตัว ไม่จำเป็นว่าตัวแปรสองตัวนี้จะถูกจองตรงเนื้อที่ที่มันติดกัน แต่ ถ้าเราจองเนื้อที่เป็นแบบ array นั่นหมายความถึงว่า ทุกๆ สมาชิกที่เป็นสมาชิกของ array จะถูกจองเนื้อที่ติดๆกันไป ตามขนาดความยาวของ array นั้น นั่นเอง ถ้าใครยังไม่เข้าใจก็อย่าเพิ่งตกใจเพราะเดี๋ยวจะมีการพูดถึง array อีกในตอนหลังตอนนี้ มาดูก่อนว่า ถ้าเราจะเก็บ string ที่มีข้อความว่า APICHAT จะต้องเก็บอย่างไร
A
P
I
C
H
A
T
NULL Character

Variable declaration



ในภาษา C หากต้องการใช้ตัวแปร จะต้องทำการประกาศตัวแปรไว้ที่ส่วนบนก่อนที่จะถึงบรรทัดที่เป็นประโยคคำสั่งการประกาศตัวแปรจะเป็นการบอก compiler ว่าตัวแปรของเรานั้นเป็นตัวแปรชนิดใด
Datatype
Keyword
characterintegerfloatdouble
charintfloatdouble รูปแบบของการประกาศคือ
Keyword list of variable ;ตัวอย่างเช่น เราจะประกาศตัวแปรชื่อ chr1 และ chr2 เป็นตัวแปรชนิด Character เราจะใช้ว่า
char chr1 , chr2 ; ข้อสังเกต เราจะเห็นได้ว่าหลังการประกาศตัวแปรจะมีเครื่องหมาย ; แสดงว่าการประกาศตัวแปรก็เป็น C Statement (คำสั่ง)เช่นกัน
ทดลองสังเกตตัวอย่างต่อไปนี้#include /* my second program */main(){ int First , Second , Sum; /* variable declaration */ First = 10 ; Second = 20 ; Sum = First + Second ; printf( " The sum of %d and %d is %d " , First , Second , Sum );} ดูโปรแกรมแล้วพบว่านี่คือโปรแกรมที่จะทำการบวกเลข 2 จำนวนคือ 10 และ 20 โดย การเก็บค่า 10 เอาไว้ในตัวแปรชื่อ First และเก็บค่า 20 ไว้ในตัวแปร Second จากนั้นก็ทำการบวกทั้งสองค่าโดยเก็บผลลัพธ์ที่ได้ไว้ในตัวแปรที่ชื่อว่า Sum จากนั้นทำการ แสดงค่าของทั้ง 3 ตัวแปรออกมาทางจอภาพอธิบายโปรแกรมโดยละเอียด จะได้ว่า ที่บรรทัด int First , Second , Sum ; นั้นเราได้สั่งให้มีการประกาศตัวแปรชนิด integer 3 ตัวคือ First , Second และ Sumบรรทัดถัดมา คือ First = 10 ; เป็นการกำหนดค่า จำนวนเต็ม 10 ให้กับตัวแปรที่เป็นจำนวนเต็ม (integer) ส่วนนี้สำคัญคือ เรากำหนดตัวแปรเป็น integer นั่นก็คือ ตัวแปรชนิดนี้จะเก็บเฉพาะค่าที่เป็นจำนวนเต็มเท่านั้น หากเราใส่ค่า 10.2 ให้กับตัวแปร ตัวแปรนั้นก็ยังคงเก็บเลขจำนวนเต็มอยู่เสมอบรรทัดถัดมา คือ Second = 20 ; ก็คือการกำหนดค่า 20 ให้กับตัวแปร Secondบรรทัดถัดมา คือ Sum = First + Second ; คือการนำค่าของ 2 ตัวแปรมาบอกกันและเก็บไว้ที่ตัวแปร Sumบรรทัดต่อมาคือ printf( " The sum of %d and %d is %d " , First , Second , Sum ); จะต้องอธิบายกันยาวหน่อยดังนี้ฟังก์ชัน printf( ) ฟังก์ชัน printf( ) มีรูปแบบดังนี้
printf ( " control string " , variable list ); โดย control string อาจจะเป็นตัวอักษร ข้อความ หรือ ตัวกำหนดชนิดข้อมูล (Specifier) ซึ่งใช้กำหนดชนิดข้อมูลที่จะพิมพ์ ตัวกำหนดข้อมูลที่ควรทราบมีดังนี้
ตัวกำหนดชนิดข้อมูล
ความหมาย
%c%d%f%lf %s%%
แทนตัวอักษรแทนเลขจำนวนเต็ม แทนเลขทศนิยม ( float )แทนเลขทศนิยม (double)แทนสตริงก์แทนเครื่องหมาย %ส่วน variable list ก็คือ list ของตัวแปร จากตัวอย่างprintf( " The sum of %d and %d is %d " , First , Second , Sum );พบว่า เรามี ตัวกำหนดชนิดข้อมูลคือ %d ซึ่งแทนชนิดข้อมูลที่เราจะพิมพ์คือ integer ซึ่ง %d ตัวแรกจะใช้แทนค่าของ First ตัวที่สองจะใช้แทนค่าของ Second ตัวที่สามจะใช้แทนค่าของ Sumจากโปรแกรมข้างต้นผล run ที่ออกมาจะปรากฎดังนี้The sum of 10 and 20 is 30นอกจากนี้เรายังพบว่าเรายังสามารถกำหนดลักษณะการพิมพ์ได้ดังต่อไปนี้#include main(){ int a; float b ; a = 50 ; b = 10.583 ; printf ( " a = %d \n " , a ) ; printf ( " b = %f \n " , b ) ; printf ( " a = %05d \n " , a ); printf ( " b = %10.4f \n " , b ); printf ( " b = % -10.4f \n " , b ); } พบว่า ผล run ที่ได้คือ a = 50 b = 10.583000 พบว่าแสดงทศนิยม 6 หลัก เป็นปกติa = 00050 พบว่า a มีความยาว 5 ตำแหน่ง นับจากซ้ายb = ___10.5830 พบว่า เราสั่งให้ %10.4 คือ การสั่งให้มีความยาวทั้งหมด 10 ตำแหน่ง รวมด้วยการมีทศนิยม 4 ตำแหน่งb = 10.5830 คล้ายกับบรรทัดก่อนหน้าแต่เราใส่เครื่องหมาย - เพื่อให้มันพิมพ์ชิดซ้ายสังเกตได้ว่าในส่วน control string นี้จะลงท้ายด้วย \n เขาเรียกว่าเป็น backslash character constant ซึ่งเป็นการกำหนดให้ขึ้นบรรทัดใหม่ แต่ยังมีอีกหลายรูปแบบที่น่าสนใจดังนี้
สัญลักษณ์
ความหมาย
\b\f\n\r\t\"\'\o\ \\v\a\N\XN
backspaceform feednewlinecarriage returnhorizontal tabdouble quotesingle quotenullblackslashvertical tabbelloctal number (N=octal constant)hexadecimal constant (N = hexadecimal constant)
ขอบอกว่าที่ใช้อยู่จริงๆ ก็มีแค่ \n \t \o เท่านั้นส่วนอื่นๆ ถ้าต้องการใช้จริงๆ ค่อยมาเปิดตำราอ่านเอาเองนะ
เมื่อมาถึงจุดนี้สรุปการใช้คำสั่ง printf อย่างคร่าวๆ คือ1. ถ้าต้องการแค่พิมพ์ข้อความขึ้นบนหน้าจอหรือที่เรียกว่า prompt เพื่อให้ผู้ใช้รู้ว่าจะต้องเติมข้อมูลอะไรลงไป หรือเพียงต้องการพิมพ์ Title ของโปรแกรมที่เราเขียนเท่านั้น เช่น เราต้องการเขียนว่า First Program Version 1.1 เราก็จะใช้ คำสั่ง printf("First Program Version 1.1"); หรือ เราต้องการให้ผู้ใช้ใส่ชื่อของผู้ใช้เองลงในโปรแกรม ก็สั่ง printf("Please Enter your Name : "); ซึ่งเหตุผลที่จะต้องมีข้อความนี้เพราะ แน่นอนว่าเมื่อเรา Run โปรแกรมขึ้นมาแล้วปรากฎว่าไม่มีข้อความนี้ แสดงอยู่ แล้วผู้ใช้จะไปทราบได้อย่างไรว่า จะต้องใส่ชื่อของตนเองลงไป2. ถ้าต้องการพิมพ์ ข้อความ แล้วตามด้วย ค่า ที่เราคำนวณได้ หรือ ค่า ที่เก็บไว้ในตัวแปร นั้นๆ เราสามารถทำได้ง่ายๆ ยกตัวอย่างเช่น เรามีตัวแปร width ที่เก็บค่าความยาว และตัวแปร high ที่เก็บค่าความสูง และเราต้องการสั่งพิมพ์ข้อความที่ว่า "This table is width ........... feet " ตรงส่วนที่เว้นไว้คือ ให้แสดงค่าความกว้างที่เก็บอยู่ในต้วแปรชื่อ width ดังนั้นเราสามารถสั่งได้โดย printf("This table is width %d feet",width); ในคำสั่งนี้จะเห็นได้ว่าประกอบไปด้วย 2 ส่วนคือส่วนสีแดง และส่วนสีน้ำเงิน มาดูในส่วนสีแดง พบว่ามีสัญลักษณ์ %d ซึ่งกล่าวไว้ตั้งแต่ต้นแล้วว่า เป็นการแทนเลขจำนวนเต็ม เมื่อตัว compile มองมาในคำสั่ง และเห็นตัว %d เข้าแล้ว มันจะไปมองหาตัวแปรในส่วนของสีน้ำเงินทันทีเพื่อทำการเอาค่าจากตัวแปรในสีน้ำเงินมาแสดงทับตัว %d ตัวอย่างเช่น int width = 6;printf("This table is width %d feet",width);เมื่อ Run โปรแกรมแล้วจะแสดงข้อความดังนี้ This table is width 6 feetต่อไปถ้าเราต้องการแสดงค่า 2 ค่า เช่น แสดงทั้งความกว้างและความยาวทำได้โดยint width = 6;int high =4;printf("This table is width %d feet and high %d feet",width,high);เมื่อ compile ตัว compile มองเห็น %d ตัวแรกมันก็จะมองไปหาตัวแปรตัวแรกในส่วนที่สอง(ส่วนสีน้ำเงิน)ทันทีนั่นก็คือ width จากนั้นเมื่อมันเห็น %d ตัวที่สอง มันก็จะมองไปหาตัวแปรตัวที่สองในส่วนที่สอง(ส่วนสีน้ำเงิน)นั่นคือ high ในทันทีตัวอย่างต่อไป ถ้าต้องการแสดงค่า พื้นที่ของ โต๊ะตัวนี้นั่นก็คือ กว้าง คูณ ยาว เราสามารถสั่งพิมพ์ได้ดังนี้printf("Area of this table is %d",width*high); ในที่นี้ ส่วนสีน้ำเงินคือ กว้าง*ยาว ถือได้ว่าเป็นค่า 1 ค่า ดังนั้นเมื่อ compiler มองเห็น %d ในส่วนสีแดง ก็จะมองหาค่าค่าแรกในส่วนสีน้ำเงิน นั่นคือ ค่าของ กว้าง*ยาว มาใส่แทน %d ในทันทีโดยคร่าวๆ แล้ว คำสั่ง printf มีการใช้เพียงเท่านี้ แต่ความจริงแล้วยังมีลูกเล่นอีกมากมาย แต่ไม่ขอพูดในที่นี้
ถึงเวลานี้เรารู้จักชนิดของตัวแปร รู้จักการแสดงข้อความออกทางหน้าจอเรียบร้อยแล้ว ต่อไปเราจะมาศึกษากันว่าหากต้องการรับค่าจาก keyboard จะต้องทำอย่างไร

Input Command



คำสั่งในการ input ที่ใช้ง่ายๆก็คือ คำสั่ง
scanf(" ตัวกำหนดชนิดข้อมูล",&ตัวแปร);
ยกตัวอย่างเช่น ต้องการรับค่า จำนวนเต็ม มาใส่ไว้ในตัวแปรที่ชื่อ number จะสั่งดังนี้ int number;scanf("%d",&number); สำคัญอย่าลืมเครื่องหมาย & และหากรับตัวแปร 2 ตัว โดย รับค่า จำนวนเต็มไว้ในตัวแปรชื่อ num1 และ รับค่า จำนวนจริง ไว้ในตัวแปร num2 ทำได้โดยint num1,num2;scanf("%d %f",&num1,&num2);หากต้องการรับข้อความ Apichat ซึ่งก็คือ 7 character ทำได้โดยchar name[7];scanf("%c",name);สังเกตไหมครับว่าที่คำสั่ง scanf อันหลังนี้ตรงตัวแปร name ทำไมไม่มีเครื่องหมาย & ปรากฎอยู่ นั่นก็เป็นเพราะว่าเราได้ทำการกำหนดตัวแปร name ไว้เป็นตัวแปร array ชนิด character ดังนั้นการที่เราเรียกชื่อตัวแปรที่เป็น array นั่นก็หมายความว่าเราได้ทำการเรียก"ที่อยู่" ของตัวแปรกลุ่มนั้นไว้แล้วจึงไม่จำเป็นต้องใส่เครื่องหมาย & แต่อย่างใด นั่นเป็นการแสดงให้เห็นว่า เมื่อเราเรียกคำสั่ง scanf ตัวคำสั่งนี้จะทำการยัดค่าที่ผู้ใช้ ใส่ให้เก็บไว้ในตัวแปรตามที่อยู่ที่ให้ไว้นั่นคือ
scanf("%d",&number);
ก็เป็นการยัดค่าตัวแปร integer(รู้ได้จาก %d) ไว้ในที่อยู่(&)ของตัวแปรที่ชื่อ number และเรายังรู้อีกว่าโดยปกติการกำหนดค่าให้กับตัวแปรที่เป็น array นั้นจำเป็นจะต้องมีการใส่ index ให้กับ ตัวแปรนั้นเสมอว่า จะเก็บไว้ใน array ช่องใด เช่นสมมติ ตัวแปรชนิด integer ชื่อ num[7] คือตัวแปรที่ชื่อ num ที่มีช่องสมาชิกย่อยทั้งหมด7ช่องด้วยกันโดย ตัวแปร num จะมีโครงสร้างดังนี้
num[0]
num[1]
num[2]
num[3]
num[4]
num[5]
num[6]และหากเราต้องการจะกำหนดค่าให้กับตัวแปร num ในแต่ละช่องสามารถทำได้โดย num[0]=10; หรือ num[1]=20; เป็นต้น นั่นคือการเขียนชื่อตัวแปรแล้วตามด้วย index ของตัวแปรนั้นว่าต้องการจะกำหนดค่า ของเราไว้ในช่องใดของ array num นั้น และที่เราต้องรู้อีกอย่างก็คือ หากเราเรียกชื่อตัวแปร array เฉยๆ โดยไม่ได้ทำการใส่ index ให้กับตัวแปรนั้นเช่นเราเรียก num นั่นจะกลายเป็นการชี้ไปยังที่อยู่ของตัวแปร num ที่อยู่ใน หน่วยความจำของเครื่อง ตอนนี้อยากให้มองหน่วยความจำ เป็นช่องๆที่เรียงติดกันยาวมาก และเดิมทีการที่เราประกาศตัวแปร ก็คือการที่ตัวชี้ชี้ลงไปยังช่องๆในหน่วยความจำนั้นอย่างสุ่มคือ เราก็ไม่รู้ว่าเมื่อเราประกาศตัวแปรแล้วมันจะไปชี้ที่ใดของหน่วยความจำมันจะทำการจองจำนวนช่องตามชนิดของตัวแปร เช่นถ้าประกาศตัวแปรชนิด integer มันอาจจะจองสัก 2 ช่องที่ติดกัน ถ้าประกาศตัวแปร double มันอาจจะจองสัก 4 ช่องติดกันเป็นต้น และหากเราจองตัวแปรชนิด array ที่เป็น integer ตามข้างต้น มันก็จะจองทั้งหมด 7 ช่องติดกัน โดยแต่ละช่องก็จะมีคุณสมบัติเป็นช่องของ integer ซึ่งอาจจะจอง2ช่อง ใน num[0] จนถึง num[6]โอ๋ย ! เผลอพูดเรื่อง array มาซะยืดยาว บางคนอาจเข้าใจบางคนอาจจะไม่เข้าใจ แต่จริงๆ แล้วในตอนนี้อยากจะบอกเพียงว่า หากเรียกชื่อตัวแปรที่เป็น array เฉยๆ โดยไม่ใส่ index ให้มันมันก็จะทำการชี้ไปที่ที่อยู่ของตัวแปรนั้นนั่นเอง ที่อยากจะบอก. จากนั้นจึงเป็นเหตุผลว่าทำไมคำสั่ง scanf ที่รับตัวแปรที่เป็น array ของ character เราจึงไม่ต้องใส่เครื่องหมาย & อยากจะบอกแค่นี้แหละ แต่ตอนนี้ก็ต้องถือว่าเรามีความรู้เรื่อง array กันบ้างแล้วไม่มากก็น้อย ขอย้ำว่าเป็นเฉพาะตอนรับ array ของ character(หรือในความหมายคือการรับ string นั่นแหละ เนื่องจากในภาษาซีไม่มีตัวแปรชนิด string จึงจำเป็นต้องใช้ตัวแปรที่เป็น array ของ character มาแทน ) เท่านั้นนะ ที่ไม่ต้องใส่ & หน้าตัวแปรในคำสั่ง scanf อย่าเข้าใจผิดหากเป็นตัวแปรชนิดอื่นก็ทำไปตามกฎซะนะ
คำสั่งที่ใช้ในการรับค่าจากแป้นพิมพ์คำสั่งต่อไป ก็ขอแนะนำคำสั่ง gets( ) เป็นคำสั่งที่ใช้รับค่า string จากแป้นพิมพ์ คำสั่งนี้อาจารย์สุรพล มักจะบังคับให้เด็กนักเรียนใช้มากกว่าคำสั่ง scanf เพราะท่านบอกว่าคำสั่งนี้มันปลอดภัยดี คือรับอะไรมามันก็จะเป็นการรับ string ทั้งสิ้น ไม่เหมือนกับคำสั่ง scanf ซึ่งจะต้องกำหนดชนิดตัวแปรที่รับเช่นต้องกำหนดว่ารับ %d ให้กับตัวแปรที่เป็น integer อาจารย์ท่านว่า หากคนที่ใช้โปรแกรมมันอุตริว่า เขาให้เต็มตัวเลข มันไปเติมเป็นตัวหนังสือซะ เดี๋ยวโปรแกรมมันจะผิดพลาดกันไปหมด แกเลยแนะนำให้ใช้คำสั่ง gets( ) ในการรับค่าแทน แล้วอยากจะแปลงค่า string ที่ได้ไปเป็นตัวแปรชนิดใด ค่อยใช้คำสั่งแปลงกัน เช่นเมื่อรับ string มาแล้วต้องการแปลงมันให้เป็น integer ก็สามารถใช้คำสั่ง atoi( ) ได้ จะขอยกตัวอย่างดังนี้
#include #include int x,y;char s[80];main(){ printf(" Enter first integer : "); gets(s); x=atoi(s); printf(" Enter second integer: "); gets(s); y=atoi(s); printf("the sum is %d",x+y);} ดูตัวอย่างนี้ให้ดี มีตัวแปรที่เป็นจำนวนเต็ม x และ y และมีตัวแปร character s ซึ่งเป็น array ของ character จากนั้นมีการเขียนข้อความให้ ผู้ใช้ใส่ค่าจำนวนเต็ม แต่ตอนรับค่านี่สิ ดันใช้คำสั่ง gets(s) ก็คือ รับค่าที่ผู้ใช้ใส่มาให้อยู่ในรูปของ string หรือ array ของ character ซะ จากนั้นค่อยใช้คำสั่ง atoi(s) เพื่อแปลงค่า string s ให้กลายเป็นค่าจำนวนเต็ม เก็บไว้ที่ตัวแปร x ซึ่งเป็นตัวแปรจำนวนเต็ม และ y ตามลำดับ จากนั้นจึงทำการพิมพ์ค่า ผลบวกของทั้งสองตัวแปรออกมาและนอกจากจะมีฟังก์ชัน atoi เพื่อแปลง string ไปเป็น integer แล้ว ยังมี atof เพื่อทำการแปลง string ไปเป็น float อีกด้วย ตัวชื่อฟังก์ชันก็สื่อความหมายให้เราเข้าใจดีอยู่แล้ว เช่น atoi ตัว a อาจหมายถึง alphabet หรือตัวอักษร to ก็อาจหมายถึง แปลงไปยัง ส่วน i ก็หมายถึง integer ดังนั้น atoi ก็สื่อความหมายชัดเจนดี ถ้าจะแปลงไปเป็น float ก็กลายเป็น atof แต่ที่สำคัญคือ ทั้ง atoi และ atof นั้นการที่เราจะเรียกใช้ได้ต้องทำการ include ด้วยเพราะทั้ง 2 ฟังก์ชันนั้นอยู่ใน library นี้
นอกจากคำสั่ง scanf , gets แล้วยังมีอีกหลายคำสั่งมากมายเช่น getchar( ),getche( ), getch( ) เป็นต้นซึ่งทั้ง 3 อันหลังนี้ก็มีคุณสมบัติแตกต่างกัน คือ
getchar( ) จะรับตัวอักษรทางแป้นพิมพ์โดยจะรับเพียง 1 ตัวเท่านั้นและมีการแสดงตัวอักษรนั้นทางจอภาพด้วยgetche( ) จะรับตัวอักษร 1 ตัวจากทางแป้นพิมพ์และจะแสดงตัวอักษรนั้นทางจอภาพด้วยเช่นกันแต่เมื่อป้อนเสร็จไม่ต้องกด Enter ซึ่งจะคล้ายกับ getchar( ) แต่ getchar( ) นั้นเมื่อป้อนตัวอักษรเสร็จแล้วจะต้องกด Enter ด้วยเพื่อทำงานต่อไปgetch( ) จะคล้ายกับ getche( ) จะแตกต่างตรงที่จะไม่แสดงตัวอักษรที่รับทางแป้นพิมพ์ออกทางจอภาพ.
วิธีใช้ของทั้ง 3 ฟังก์ชันคล้ายกันก็คือ ประกาศตัวแปร char สมมติชื่อ ch จากนั้นก็เรียกฟังก์ชันตามปกติดังนี้#include main(){char ch; printf("Input one character"); ch=getchar( ); หรือ ch=getche( ); หรือออาจจะเป็น ch=getch( ); printf("The character you type is %c \n",ch);} ขอให้ลองไปใช้กันดูโดยลองเปลี่ยนบรรทัดที่ 6 ของโปรแกรมข้างบนนี้เป็นทั้ง 3 แบบดูนะ อย่าเขียนทั้ง 3 แบบพร้อมๆกันหละเลือกเอาอันใดอันหนึ่งเท่านั้นนะOK. ขอสรุปช่วงนี้หน่อย ตอนนี้เรารู้จักวิธี แสดงข้อมูล และวิธีรับข้อมูล และได้รู้จัก array บ้างนิดหน่อยแล้ว ขอให้จดจำและสังเกตวิธีการใช้ อย่างแม่นยำและทดลองเขียนโปรแกรมเองให้มากๆ จึงจะจำและสามารถใช้ได้คล่อง จากประสบการณ์ที่เคยเป็น Teacher Assistance วิชา ที่มีการโปรแกรมภาษา C มาแล้วพบว่า ผู้ที่เรียนยังสับสนกับการใช้คำสั่ง printf ตรงที่ว่าจะต้องใส่ตัวแปรในคำสั่งด้วยหรือเปล่า หรือว่า ลืมใส่ %d %c เมื่อจำเป็นต้องใส่ อะไรทำนองเนี้ย ลองทบทวนดูนะข้างต้นเขียนไว้ละเอียดแล้วในระดับนึง ส่วนคำสั่ง scanf ก็จะมีปัญหากันมากเลย ตรงที่ลืมเครื่องหมาย & บ้าง หรือไปใส่เครื่องหมาย & ตรงที่ที่ไม่ควรใส่เช่นตรง array ของ character เนี่ยแหละที่เป็นปัญหาหากเราจะรับ string

Structure Programming



อยากจะบอกว่าในส่วนนี้เราจะทำการเรียนรู้เกี่ยวกับโครงสร้างของการโปรแกรมที่มีลักษณะเป็นแบบ sequential lines นั่นคือ compiler จะทำงานโดยการเริ่มไล่จากบรรทัดบนสุดแล้วทำงานไล่ลงมาเป็นบรรทัดๆ ไปเรื่อยๆจนจบโปรแกรม ซึ่งจะต่างจากการทำงานของการโปรแกรมแบบ OOP (object oriented programming) ซึ่งในที่นี้เราจะไม่พูดถึง
ในการโปรแกรมนี้เราจำเป็นจะต้องรู้จัก โครงสร้างของ loop หรือการวนซ้ำก่อน ถามว่าทำไมจะต้องมีการวนซ้ำ ก็เป็นเพราะในการโปรแกรมส่วนใหญ่นั้นการวนซ้ำหรือ loop นี้มีความสำคัญหรือมีส่วนเกี่ยวข้องอยู่มาก เช่นหากเราต้องการจะ ทำการบวกเลขตั้งแต่ 1 ถึง 100 หากเรามานั่งเขียนหรือตั้งตัวแปรแล้วค่อยๆมาบวกกันเป็นคู่ๆ หรือบวกกันทีเดียวในบรรทัดเดียวก็อาจทำได้แต่มันก็ไม่สมควรหากเราต้องการบวกตัวเลขมากกว่า 100 เช่น 1000 เป็นต้นตัวอย่างที่ผิด เรากำหนดให้ n เป็นตัวแปรในการรับค่าคำตอบของการบวกกันของตัวเลข ตั้งแต่ 1 ถึง 100 เราจึงเขียนเป็นว่า
n=1+2+3+4+5+6+7+8+9+10+11+12+...+96+97+98+99+100;
ในส่วนที่ละไว้นั้น (... ) ในส่วนของการโปรแกรมเราจะต้องเขียนให้หมด ซึ่งถ้าเขียนหมดจริงๆ ก็ตายกันพอดีดังนั้น การวนซ้ำจึงเข้ามามีบทบาทในการทำ ก็เลยจะขออธิบายโครงสร้างก่อนก็แล้วกันคำสั่ง for loop
for(ตัวนับ= i;เงื่อนไขที่จะให้ยังทำงานอยู่ใน loop; การเพิ่มหรือการลดตัวนับ){ statement ;}ก่อนอื่นต้องขออธิบายก่อนว่านี่คือโครงสร้างของ for loop โดยขอให้สังเกตบรรทัดแรกตรงที่มีคำสั่ง for แล้วให้ดูในวงเล็บ ปรากฎว่าตามรูปแบบมาตรฐานนั้น ในส่วนของวงเล็บหลังคำว่า for จะประกอบไปด้วย 3 ส่วน ส่วนแรกก็คือ การกำหนดค่าเริ่มต้นให้กับตัวนับ อาจจะงงว่าตัวนับที่พูดถึงคืออะไร ใน for loop นั้น จำเป็นจะต้องมีตัวนับอยู่ด้วยเสมอ ซึ่งตัวนับนี้ จะเป็นตัวบอกเราว่า loop ของเรานั้นทำการวนซ้ำมาเป็นรอบที่เท่าไรแล้ว และในส่วนแรกนี้เราจำเป็นจะต้องมีการกำหนด ค่าเริ่มต้นให้กับตัวนับก่อน ในส่วนที่สอง เงื่อนไขที่จะให้ยังทำงานอยู่ใน loop นี้ โดยส่วนใหญ่จะเป็นการกำหนดว่าเมื่อตัวนับมีการวนซ้ำ ถึงจำนวนรอบเท่านั้นเท่านี้ก็จะให้หลุดจาก loop ในส่วนที่สาม การเพิ่มหรือการลดตัวนับ ตรงนี้สำคัญ ซึ่งจะเป็นส่วนที่ทำให้ ตัวนับของเรามีการเพิ่มค่าหรือลดค่า ในแต่ละรอบของการวนซ้ำเช่นอาจเพิ่มทีละหนึ่ง หรือ เพิ่มทีละ3 เป็นต้นหรืออาจจะลดทีละ 1 หรือลดทีละ 3 ก็แล้วแต่โปรแกรมจะกำหนด หลังจากวงเล็บที่อยู่หลัง for ก็จะมีเครื่องหมาย ปีกกาเพื่อให้เข้าสู่ส่วนของคำสั่ง ที่จะต้องทำหลังจากบรรทัด for ก็มาถึง statement ซึ่งจะเป็นส่วนที่ให้เราเขียนคำสั่งว่า ในแต่ละรอบนั้น เราจะให้โปรแกรมทำงานอะไร ซึ่งก็อาจมีได้หลายคำสั่ง บรรทัดสุดท้ายก็คือ ปีกกาปิดเพื่อจบโครงสร้าง for loopดูตัวอย่าง การบวกเลขตั้งแต่ 1 ถึง 100#includemain(){ int i,ans; ans=0; for(i=1;i<=100;i++){ ans=ans+i; } printf("answer is %d",ans);} ในที่นี้เราทำการกำหนดให้ตัวแปร i เป็นตัวแปรนับ ส่วน ans เป็นตัวแปรที่ใช้เก็บค่าคำตอบ ในบรรทัด for นั้นไม่มีปัญหาอะไรยกเว้น ที่เราเจอ i++ นั่นก็หมายถึง i+1 นั่นเอง คือ ใน loop นี้เราจะทำการเพิ่มตัวนับ i ไปทีละ 1 สมมตินะครับสมมติ ว่าหากเราต้องการจะ แสดงเฉพาะเลขคี่ที่อยู่ระหว่าง 1 ถึง 100 เราจะทำอย่างไร ดูต่อครับดูตัวอย่าง การแสดงเฉพาะเลขคี่ที่อยู่ในช่วงตั้งแต่ 1 ถึง 100#includemain(){ int i ; for(i=1;i<=100;i=i+2){ printf("Odd number is %d\n",i); }} นั่นคือเราก็วน loop เหมือนเดิมเพียงแต่ในแต่ละรอบนั้นเราทำการเพิ่มค่า i ไปทีละ 2 ซึ่งเดิมค่า i มีค่าเท่ากับ 1 พอ compiler มา check ว่า 1<=100 นั้นจริงไหม ปรากฎว่าจริงก็ให้ทำงานใน loop ต่อ โดยมีการเพิ่มค่า i=i+2 นั่นหมายความว่าตอนนี้ i มีค่าเป็น 1+2 ก็คือ 3 นั่นเอง ในรอบต่อมาเราก็แสดงค่า 3 ทำเช่นนี้ไปเรื่อยๆ เราก็จะได้เฉพาะเลขคี่ 1,3,5,7,...,99สมมตินะครับสมมติ ว่าหากเราต้องการจะ แสดงเฉพาะเลขคู่ที่อยู่ระหว่าง 1 ถึง 100 เราจะทำอย่างไร ดูต่อครับ ดูตัวอย่าง การแสดงเฉพาะเลขคู่ที่อยู่ในช่วงตั้งแต่ 1 ถึง 100#includemain(){ int i ; for(i=2;i<=100;i=i+2){ printf("Odd number is %d\n",i); }} เช่นเคยครับไม่ค่อยแตกต่างอะไรกับการ แสดงเฉพาะเลขคี่ แต่จะต่างกันตรงการเริ่มต้นค่าให้กับตัวนับครับ นั่นคือเราทำการเริ่มต้นค่า ตัวนับด้วย 2 นั่นคือตัวแปร i จะมีค่าเริ่มต้นเป็น 2 ในการวน loop รอบแรกครับจากนั้นก็เหมือนเดิมในแต่ละรอบ ค่า i จะถูกเพิ่มทีละ 2 ครับ ดังนั้นสุดท้ายเราก็จะได้ 2,4,6,8,10,...,100 ไปตามระเบียบและหากเราต้องการจะแสดงเฉพาะเลขคู่นี่แหละแต่ต้องการให้ แสดง ถอยหลัง คือ แสดง 100,98,96,94,...,8,6,4,2 จะทำได้อย่างไร
ดูตัวอย่าง การแสดงเฉพาะเลขคู่(ถอยหลัง)ที่อยู่ในช่วงตั้งแต่ 1 ถึง 100#includemain(){ int i ; for(i=100;i>=1;i=i-2){ printf("Odd number is %d\n",i); }}นั่นคือในบรรทัด for เรากำหนดค่าเริ่มต้นเป็น 100 ที่สำคัญคือเงื่อนไขเดิมเรากำหนดเป็น น้อยกว่าเท่ากับ แต่ในที่นี้เรากำหนดเป็นว่า i มากกว่าเท่า 1 loop จึงจะยังทำงานต่อ และที่สำคัญเช่นเดียวกันคือเราทำการลดค่า i ไปทีละ 2 ครับ เท่านี้เราก็จะได้ ค่า 100,98,96,...,4,2 แล้วครับ ขอให้ลองไล่โปรแกรมดูสักนิด แล้วก็จะเข้าใจโดยกระจ่างเองครับคำสั่ง while loop มีอีกหนึ่งโครงสร้างที่มีลักษณะคล้ายกับ for loop ที่อธิบายมาข้างต้น นั่นก็คือ while loop ก่อนอื่นต้องขอบอกถึง ความแตกต่าง ที่เห็นได้ชัดเจนระหว่าง for loop กับ while loop เสียก่อน นั่นคือ เราจะเห็นได้ว่า for loop นั้น เราจะมีการบอกถึง ค่าเริ่มต้น ค่าสิ้นสุด ของตัววิ่ง(จากข้างต้นก็คือตัว i นั่นเอง) แต่ while loop นั้นจะบอกแค่เงื่อนไขการจบเท่านั้น ซึ่งถ้าใน for loop นั้น เงื่อนไขการจบก็คือ การที่ตัววิ่ง วิ่งถึงค่าสิ้นสุด ก็จะหลุดออกจาก loop for แต่ while loop ก็มีลักษณะคล้ายกันแต่อาจจะไม่เหมือนกัน สักทีเดียว ลองมาดูกัน
while ( เงื่อนไขที่ทำให้ยังต้องเข้าไปใน loop ) { statement ;}เรามักจะแปลได้ว่า "ขณะที่(.....เงื่อนไข......ยังเป็นจริงอยู่) ก็เข้าไปทำคำสั่งหลังเครื่องหมาย { "ต่อไปนี้จะขอสร้างตัวอย่างขยายข้อความข้างบนหน่อย โดยเราจะสั่งให้มีการบวกเลขตั้งแต่ 1-100 เหมือนตัวอย่างใน for loop นั่นแหละ(มันเป็นตัวอย่างเอาไว้หากิน!!!)#includemain(){ int i , ans; i=1; /* initial variable */ ans=0; while ( i <= 100 ) { ans = ans + i ; i=i+1; /* increase variable */ } printf("answer is %d",ans); } จากตัวอย่างนี้ สิ่งที่สำคัญที่สุด ก็คือ การกำหนดค่าเริ่มต้นให้กับตัวแปร i , ans อันนี้สำคัญมากเราจะต้องกำหนดไว้เสมอ หากเราไม่กำหนดไว้ตั้งแต่เริ่มต้น โปรแกรมจะไปหยิบค่าอะไรก็ไม่รู้จากใน memory มาเก็บไว้ในตัวแปร i และ ans ซึ่งจะทำให้โปรแกรมของเราผิดพลาดทันที ส่วนใน while loop นั้นอธิบายได้ง่ายๆ ว่า ขณะที่ i ยังน้อยกว่าหรือเท่ากับ 100 อยู่ ก็ให้ทำคำสั่งหลังเครื่องหมาย { นั่นก็คือ ans=ans+i และจุดที่สำคัญอีกจุดหนึ่ง ไม่แพ้การ กำหนดค่าเริ่มต้นให้กับตัวแปร นั่นก็คือ บรรทัด i=i+1 ซึ่งเป็นการบอกว่าให้เพิ่มค่า i ไปทีละ 1 ในทุกๆรอบ หากขาดบรรทัดนี้ไป loop ของเรา จะวิ่งไม่หยุดหรือที่เรียกกันว่า infinite loop นั่นเอง เพราะหากเราไม่เพิ่มค่า i แล้ว ค่า i ตลอดโปรแกรมก็จะยังคงเท่ากับ 1เหมือนที่เรากำหนดไว้ตอนเริ่มต้น ดังนั้นเมื่อ compiler มาตรวจดูเงื่อนไขของ while loop ก็พบว่า ยังเป็นจริงอยู่ นั่นก็คือ 1 ยังคงน้อยกว่าหรือเท่ากับ 100 อยู่วันยังค่ำ นั่นก็คือ loop นี้จะวิ่งไปเรื่อยๆ ไม่มีวันหยุดนั่นเอง ถึงตอนนี้ขอให้ลองเปรียบเทียบตัวอย่างนี้กับตัวอย่างที่เป็น for loop ดูสิว่ามีอะไรแตกต่างกันบ้าง่ก่อนจะสรุปอะไรไปมากกว่านี้ ต้องบอกเลยว่า ทั้ง for loop และ while loop นั้นมีความคล้ายคลึงกันมากๆๆๆ หรืออาจจะมองเป็นสิ่งเดียวกันก็ได้ หรืออาจจะมองเป็นคนละสิ่งก็ได้ แล้วแต่ว่าเราจะกำหนดให้มันทำงานอย่างไรมากกว่า เหมือนกันอย่างไร นั่นคือ ใน for loop นั้นซึ่งมีโครงสร้างบรรทัดแรกดังนี้for(ตัวนับ= i; เงื่อนไขที่จะให้ยังทำงานอยู่ใน loop; การเพิ่มหรือการลดตัวนับ){เราจะพบว่าจะต้องมีการกำหนดค่าเริ่มต้นให้กับตัวนับหรือตัววิ่งนั่นเอง ซึ่งพบว่าใน while loop ข้างต้นเราก็ต้องกำหนดค่าเริ่มต้นให้กับ i ตอนก่อนเข้า loop เหมือนกัน และใน for loop ก็มีการกำหนดเงื่อนไขที่จะยังให้ทำงานอยู่ใน loop ซึ่งใน while loop ก็มีเช่นเดียวกัน ตรงข้อความหลัง while และในส่วนสุดท้ายของ for loop ซึ่งมีการกำหนดให้ เพิ่มตัวนับหรือลดตัวนับ ซึ่งก็ถือเป็นส่วนสำคัญของ while loop เช่นเดียวกันนั่นคือ บรรทัด i=i+1 จากบรรทัดข้างต้นนั่นเอง ต่อไปจะขอแปลงตัวอย่างทั้งหมดจาก for loop มาเป็น while loop ให้ดูกัน แล้วลองเปรียบเทียบกันเองนะครับว่าเหมือนหรือแตกต่างกันอย่างไรดูตัวอย่าง การแสดงเฉพาะเลขคี่ที่อยู่ในช่วงตั้งแต่ 1 ถึง 100#includemain(){ int i ; i=1; while(i<=100){ printf("Odd number is %d\n",i); i=i+2; }}ดูตัวอย่าง การแสดงเฉพาะเลขคู่ที่อยู่ในช่วงตั้งแต่ 1 ถึง 100#includemain(){ int i ; i=2; while(i<=100){ printf("Odd number is %d\n",i); i=i+2; }}ดูตัวอย่าง การแสดงเฉพาะเลขคู่(ถอยหลัง)ที่อยู่ในช่วงตั้งแต่ 1 ถึง 100#includemain(){ int i ; i=100; while (i>=1){ printf("Odd number is %d\n",i); i=i-2; }}
ประโยคเงื่อนไข (Condition statement) สำหรับประโยคเงื่อนไขนะครับ หลายคนอาจจะสงสัยว่า จะต้องใช้เมื่อไหร่ และจะใช้อย่างไร ก็คงจะตอบได้ว่า ประโยคเงื่อนไขนั้นเราจะใช้เมื่อเราต้องการจะตัดสินใจอะไรบางอย่างเช่นคำพูดที่เราพูดกันเรื่อยๆว่า ถ้าเป็นอย่างนี้แล้วให้เป็นอย่างนั้น
ถ้า คำพูดของเขาเป็นความจริง แล้ว ฉันก็จะไปกับเขา ไม่เช่นนั้น ฉันก็จะไม่ไป
จากประโยคที่ให้มานี้ เราจะพบว่าเงื่อนไขที่จะบอกว่า ฉันจะไปกับเขา หรือไม่ไปนั้น มันขึ้นกับว่า คำพูดของเขา จริงหรือเท็จ นั่นเอง ดังนัเน เงื่อนไขของข้อความนี้ก็คือ คำพูดของเขาเป็นความจริง ถ้าลองเขียนเป็นรูปแบบภาษาซีที่เกี่ยวข้องกับการตัดสินใจ ก็จะเขียนได้ว่าif (คำพูดของเขาเป็นความจริง){ ฉันก็จะไปกับเขา}else{ ฉันก็จะไม่ไป} เราลองมาดูอีกตัวอย่างให้ชัดๆไปเลย เช่น ถ้าเรามีเงินมากกว่า 100 บาท เราจะซื้อของขวัญ A แต่ถ้าน้อยกว่าเราก็จะซื้อของขวัญ B เราสามารถเขียนให้อยู่ในรูปภาษาซีได้ดังนี้if ( เงินที่มี > 100 ){ ซื้อของขวัญ A}else{ ซื้อของขวัญ B}
ดังนั้นจะขอสรุปเกี่ยวกับโครงสร้าง if-then-else ได้ดังนี้นะครับโครงสร้างที่ 1 if-then มีรูปแบบดังต่อไปนี้if( เงื่อนไขเป็นจริง ){ statement;} นั่นคือถ้าเงื่อนไขเป็นจริง ก็จะมาทำคำสั่งที่ statement; ถ้าเงื่อนไขนั้นไม่จริง ก็ไม่ต้องทำอะไร
โครงสร้างที่ 2 if-then-else มีรูปแบบดังต่อไปนี้if( เงื่อนไขเป็นจริง ){ statement1;}else{ statement2;} นั่นคือถ้าเงื่อนไขเป็นจริง ก็จะมาทำคำสั่งที่ statement1; ถ้าเงื่อนไขนั้นไม่จริง ก็จะมาทำ statement2;
โครงสร้างที่ 3 if-then-elseif- มีรูปแบบดังต่อไปนี้if( เงื่อนไขที่หนึ่งเป็นจริง){ statement1;}elseif( เงื่อนไขที่สองเป็นจริง ){ statement2;}else{ statement3;} นั่นคือถ้าเงื่อนไขที่หนึ่งเป็นจริง ก็จะมาทำคำสั่งที่ statement; แต่ถ้าไม่จริงให้มาตรวจสอบเงื่อนไขที่สองถ้าเงื่อนไขที่สองเป็นจริงให้ทำคำสั่ง statement2 แต่ถ้าไม่จริงให้หลุดมาทำ statement 3
ลองมาดูตัวอย่างกันสักหน่อยหากเราตรวจการดูค่าตัวแปร x ว่า ถ้า x มีค่าน้อยกว่า 100 ให้พิมพ์คำว่า Less than 100 ถ้า x ไม่น้อยกว่า 100 ให้พิมพ์คำว่า Not less than 100 เราสามารถเขียนโปรแกรมได้ดังนี้#includemain(){ int x=50; if (x<100){ printf("Less than 100 \n"); }else{ printf("Not less than 100 \n"); } } จากโค้ดข้างต้นนี้ เรากำหนดให้ x เป็นจำนวนเต็มมีค่าเท่ากับ 50 จากนั้นเรานำค่า x มาตรวจสอบเงื่อนไขว่า ถ้า x<100 ซึ่งเป็นความจริงเพราะ 50<100 ดังนั้นเงื่อนไขนี้เป็นจริง จึงมาทำคำสั่ง printf("Less than 100\n"); แต่หากเรากำหนดให้ x=200 แทนที่จะเป็น 50 เราก็จะพบว่า เงื่อนไข x<100 นั้นไม่เป็นจริง โปรแกรมจึงข้ามมาทำที่ขั้นตอนถัดไปคือ ไปที่ else และที่ else นี้ไม่มีเงื่อนไขใดๆในการตรวจสอบจึง พิมพ์ข้อความ Not less than 100 ออกทางหน้าจอ จากข้างต้นเราได้ข้อสังเกตว่า ถ้าเงื่อนไขแรกเป็นจริงแล้ว โปรแกรมจะทำข้อความที่อยู่ในเครื่องหมายปีกกาที่ติดกับเงื่อนไขนั้น และก็จะหลุดออกจาก โครงสร้าง if นั้นไปทันที เช่น
#includemain(){ int x=100; if(x>50){ printf("More than 50\n"); }elseif(x>80){ printf("More than 80\n"); }else{ printf("More than 50 and 80\n"); }}จากโปรแกรมนี้ผลที่ได้ปรากฎว่ามันจะพิมพ์เพียงข้อความเดียวคือ More than 50 ทั้งนี้เนื่องจากเมื่อเรากำหนดเงื่อนไขว่า x=100 และพอโปรแกรมตรวจสอบในเงื่อนไขแรกคือ x>50 ซึ่งเป็นจริง โปรแกรมจะมาทำข้อความภายในเครื่องหมาย {} ที่ติดกับเงื่อนไขเท่านั้น และจากนั้นจะหลุดออกจากโครงสร้าง if ไปเลย แต่ถ้าลองมาดูโปรแกรมอีกโปรแกรมดังต่อไปนี้#includemain(){ int x=100; if(x<70){>main(){ int x=70; if( x>50 && x<100 x="70">50 และ x<100>50 ต้องจริง และ เงื่อนไข x<100>main(){ int x=100; if(x>50 x>150){ printf("TRUE\n"); }else{ printf("FALSE\n"); } } จากโปรแกรมนี้เรากำหนดค่า x=100 ให้กับตัวแปร x และเงื่อนไขในโครงสร้าง if มี สองเงื่อนไขคือ x>50 หรือ x>150 นั่นหมายความว่า ถ้าเงื่อนไขใดเงื่อนไขหนึ่งเป็นจริงก็จะถือว่าเงื่อนไขทั้งหมดเป็นจริง ในโปรแกรมนี้ 100>50 นั่นหมายความว่าเงื่อนไขแรกเป็นจริง แต่เงื่อนไขที่สองคือ 100>150 อันนี้ไม่จริง แต่เนื่องจากเราเชื่อมสองเงื่อนไขด้วยสัญลักษณ์ (หรือ) จึงทำให้เงื่อนไขทั้งหมดเป็นจริง โปรแกรมนี้จึงพิมพ์คำว่า TRUE
ตัวอย่างสุดท้าย ปิดท้ายโครงสร้าง if นี้คือโปรแกรมตัดเกรด โปรแกรมยอดนิยมในการเขียนโครงสร้าง if นั่นคือ หากเรากำหนดกฎเกณฑ์ในการตัดเกรดดังนี้คือ
คะแนน
เกรด
80-100
A
70-79
B
60-69
C
50-59
D
น้อยกว่า 50
F

นั่นหมายความว่าถ้าคะแนนของเราตกลงในช่วงคะแนนใด เราก็จะได้เกรดนั้น หากเรากำหนดให้ตัวแปร x เป็นคะแนนที่เราได้ โปรแกรมจะสามารถเขียนได้ดังนี้
#includemain(){ int x=74; if(x>=80 && x<=100){ printf("Grade is A\n"); }elseif(x>=70 && x<=79){ printf("Grade is B\n"); }elseif(x>=60 && x<=69){ printf("Grade is C\n"); }elseif(x>=50 && x<=59){ printf("Grade is D\n"); }else{ printf("Grade is F\n"); }} จากโปรแกรมข้างต้นนั้นเรากำหนดค่า 74ให้กับตัวแปร x สมมติเป็นคะแนนที่เราได้ จากนั้นโปรแกรมจะทำการตรวจสอบเงื่อนไขทีละเงื่อนไขจากบนลงล่างนั่นคือ x >=80 && x<=100 หมายความว่า x มีค่าตั้งแต่ 80 ถึง 100 จริงหรือไม่ ซึ่งปรากฎว่าไม่จริง จึงมาตรวจสอบเงื่อนไขที่สองคือ x >= 70 && x<=79 หมายความว่า x มีค่าตั้งแต่ 70 ถึง 79 จริงหรือไม่ ปรากฎว่าจริง เพราะ 74>=70 และ 74<=79 จริงทั้งสองเงื่อนไขทำให้เงื่อนไขนี้เป็นจริง ดังนั้นโปรแกรมจึงพิมพ์ค่า Grade is B ออกมาทางหน้าจอนั่นเอง จากโปรแกรมนี้เราสังเกตได้ว่าหากเราพิมพ์ค่าอื่นๆที่นอกเหนือจาก 50 ถึง 100 โปรแกรมจะให้เกรด F ในทันที นั่นหมายความว่าหากเราพิมพ์คะแนนเป็น 101 ก็จะไม่ได้เกรด A แต่จะเป็นเกรด F แทนนั่นเองครับ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น