วันเสาร์ที่ 29 สิงหาคม พ.ศ. 2552

ภาษาซีอ่อนๆ












Basic

C Programming Language









































































































































































ข้อควรรู้ของภาษา

C
   
 

C

is case Sensitive.


หมายความถึง

ว่าในภาษา C นั้น อักษรตัวใหญ่ กับตัวเล็ก มีความหมายที่แตกต่างกัน คือ

เราสามารถใช้ A เป็นตัวแปร ซึ่งจะเป็นตัวแปรคนละตัวกับ a


Every Statement is definited by a semicolon หมายความว่าทุกข้อความที่เป็นคำสั่งในภาษา

C นั้นจะลงท้ายด้วยเครื่องหมาย semicolon (;)





ตัวอย่างของโปรแกรม


#include<stdio.h>


/* This is my first program. */


main()


{


       clrscr();


       printf("Hello,world

\n");


       printf("Press any

key to stop \n");


       getch();


} /*end of main*/








จากตัวอย่างข้างต้นเราสามารถอธิบายได้หลายอย่าง




       ให้สังเกต ณ บรรทัดแรกที่เขียนว่า

#include<stdio.h> บรรทัดนี้กำลังจะบอกเราว่าให้เรานั้นไปเอาไฟล์ที่มีสกุล

.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)
   


ชนิดของข้อมูลประกอบไปด้วย





  1. character

    (char) ใช้ 1 byte บน Dos มีค่า -128 ถึง127 นิยมใช้เก็บตัวอักษร 1

    ตัวอักษร


  2. integer

    (int) ใช้ 2 byte มีค่า -32768 ถึง 32767 และยังมี long ซึ่งคล้าย

    integer แต่เก็บด้วย ช่วงตัวเลขที่ยาวกว่าจึงกินเนื้อที่ ถึง 4 byte



  3. float

    ใช้ 2 byte ใช้เก็บตัวเลขทศนิยม และยังมี double ซึ่งคล้าย float แต่เก็บด้วยช่วงตัวเลขที่ยาวกว่าจึงกินเนื้อที่ถึง

    4 byte


  4. ในภาษา

    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




character


integer


float


double




char


int


float


double







รูปแบบของการประกาศคือ










                     Keyword       

list of variable ;


ตัวอย่างเช่น

เราจะประกาศตัวแปรชื่อ chr1 และ chr2 เป็นตัวแปรชนิด Character เราจะใช้ว่า











                     char                 chr1 ,

chr2 ;


ข้อสังเกต

เราจะเห็นได้ว่าหลังการประกาศตัวแปรจะมีเครื่องหมาย ; แสดงว่าการประกาศตัวแปรก็เป็น

C Statement (คำสั่ง)เช่นกัน


ทดลองสังเกตตัวอย่างต่อไปนี้


#include <stdio.h>


/* 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 <stdio.h>


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




backspace


form feed


newline


carriage return


horizontal tab


double quote


single quote


null


blackslash


vertical tab


bell


octal 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

<stdio.h>


#include <stdlib.h>


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 <stdlib.h> ด้วยเพราะทั้ง 2 ฟังก์ชันนั้นอยู่ใน library

นี้




นอกจากคำสั่ง

scanf , gets แล้วยังมีอีกหลายคำสั่งมากมายเช่น getchar( ),getche( ),

getch( ) เป็นต้นซึ่งทั้ง 3 อันหลังนี้ก็มีคุณสมบัติแตกต่างกัน คือ



getchar(

) จะรับตัวอักษรทางแป้นพิมพ์โดยจะรับเพียง 1 ตัวเท่านั้นและมีการแสดงตัวอักษรนั้นทางจอภาพด้วย


getche( ) จะรับตัวอักษร 1 ตัวจากทางแป้นพิมพ์และจะแสดงตัวอักษรนั้นทางจอภาพด้วยเช่นกันแต่เมื่อป้อนเสร็จไม่ต้องกด

Enter ซึ่งจะคล้ายกับ getchar( ) แต่ getchar( ) นั้นเมื่อป้อนตัวอักษรเสร็จแล้วจะต้องกด

Enter ด้วยเพื่อทำงานต่อไป


getch( ) จะคล้ายกับ getche( ) จะแตกต่างตรงที่จะไม่แสดงตัวอักษรที่รับทางแป้นพิมพ์ออกทางจอภาพ.



วิธีใช้ของทั้ง

3 ฟังก์ชันคล้ายกันก็คือ ประกาศตัวแปร char สมมติชื่อ ch จากนั้นก็เรียกฟังก์ชันตามปกติดังนี้


#include <stdio.h>


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


#include<stdio.h>


main()


{


   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


#include<stdio.h>


main()


{


   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


#include<stdio.h>


main()


{


   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



#include<stdio.h>


main()


{


   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
นั่นแหละ(มันเป็นตัวอย่างเอาไว้หากิน!!!)

#include<stdio.h>

main()

{

       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

#include<stdio.h>

main()

{

   int   i ;

   i=1;

   while(i<=100){

          printf("Odd
number is %d\n",i);       

          i=i+2;


   }

}

ดูตัวอย่าง
การแสดงเฉพาะเลขคู่ที่อยู่ในช่วงตั้งแต่ 1 ถึง 100

#include<stdio.h>

main()

{

   int   i ;

   i=2;

   while(i<=100){

          printf("Odd
number is %d\n",i);    

          i=i+2;
   

   }

}

ดูตัวอย่าง
การแสดงเฉพาะเลขคู่(ถอยหลัง)ที่อยู่ในช่วงตั้งแต่ 1 ถึง 100


#include<stdio.h>

main()

{

   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
เราสามารถเขียนโปรแกรมได้ดังนี้

#include<stdio.h>

main(){

    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 นั้นไปทันที เช่น


#include<stdio.h>

main(){

    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 ไปเลย

          แต่ถ้าลองมาดูโปรแกรมอีกโปรแกรมดังต่อไปนี้

#include<stdio.h>

main(){

    int x=100;

    if(x<70){

         printf("Less
than 70\n");

    }elseif(x<110){

         printf("Less
than 110\n");

    }else{

         printf("More
than 110");

    }

}

ซึ่งเมื่อรันโปรแกรมข้างต้น เรากำหนดค่า 100 ให้กับตัวแปร x จากนั้นโปรแกรมจะทำการตรวจสอบในเงื่อนไขแรกตามลำดับ
พบว่า x<70 นั้นไม่จริง โปรแกรมจึงเข้ามาตรวจที่เงื่อนไขที่สองคือ
x<110 ปรากฎว่าเงื่อนไขนี้เป็นจริงนั้นคือ 100<110 ทำให้โปรแกรมมาทำ
statement ที่อยู่ในเครื่องหมายปีกกากับเงื่อนไขที่มันเป็นจริง นั่นคือ
โปรแกรมจะพิมพ์คำว่า Less than 110 จากนั้นโปรแกรมก็จะหลุดออกจาก โครงสร้าง
if ทันที

          อีกตัวอย่างที่น่าติดตามก็คือ
การตรวจสอบว่าค่าที่กำหนดให้มีค่าอยู่ระหว่างค่าที่เรากำหนดหรือไม่ เช่น
การตรวจสอบว่า x ที่เรากำหนดนั้นมีค่าอยู่ระหว่าง 50 ถึง 100 หรือไม่
การเขียนเงื่อนไขในการตรวจสอบสามารถทำได้ดังนี้

#include<stdio.h>

main(){

    int x=70;

    if( x>50 && x<100 ){

         printf("TRUE\n");

    }else{

         printf("FALSE\n");

    }

}

จากโปรแกรมนี้เรากำหนดค่า x=70 จากที่เราทราบแล้วว่า ถ้าเงื่อนไขใน if
(..................) เป็นจริงเท่านั้นจึงจะทำคำสั่งที่อยู่ติดกับเงื่อนไขนั้น
ในที่นี้เราพบว่าเงื่อนไขเรามีอยู่สองเงื่อนไขนั้นคือ x>50 และ x<100
โดยเราทำการเชื่อมเงื่อนไขทั้งสองด้วย
&& (and)
นั่นหมายความว่า เงื่อนไข x>50
ต้องจริง และ เงื่อนไข x<100 ก็ต้องจริง เท่านั้นจึงจะทำ
statement printf("TRUE\n"); แต่ถ้าเราเชื่อมเงื่อนไขสองเงื่อนไขด้วย
|| (หรือ)
นั่นหมายความว่าเมื่อมีสองเงื่อนไข เงื่อนไขหนึ่งในสองเงื่อนไขนั้นเป็นจริง
ประโยคเงื่อยไขนั้นก็จะเป็นจริง เช่น

#include<stdio.h>

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 เป็นคะแนนที่เราได้ โปรแกรมจะสามารถเขียนได้ดังนี้


#include<stdio.h>

main(){

   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 แทนนั่นเองครับ


 
 

 



 
   
 

 



 
 



 







 








































     







 
     


























   
   

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

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

DEVELOPER ZOne