Translate

วันอาทิตย์ที่ 18 พฤษภาคม พ.ศ. 2557

ประวัติภาษาc++

ภาษา C


                 ภาษาซี เป็นการเขียนโปรแกรมพื้นฐาน สามารถประยุกต์ใช้กับงานต่างๆได้มากมาย ระบบปฏิบัติการคอมพิวเตอร์ ทางคณิตศาสตร์ โปรแกรมทางไฟฟ้า อิเล็กทรอนิกส์ ไมโครคอนโทรลเลอร์ เช่นโปรแกรมvisual  express โปรแกรม MATLAB (The MathWorks - MATLAB and Simulink for Technical Computing) และโปรแกรมอื่นๆอีกมากมายซึ่งเวลาใช้สามารถพิมพ์ชุดคำสั่งภาษาซีเพิ่มเข้าไปในโปรแกรมคำนวณทางคณิตศาสตร์ ประมวลผลทางสัญญาณไฟฟ้า ทางไฟฟ้าสื่อสารก็ได้ ทำให้ประสิทธิภาพของงานที่ทำดียิ่งขึ้นครับ และยังมีโปรแกรมอื่นๆ ที่มีภาษาซีประยุกต์ใช้กันอีกมากมาย ไม่สามารถนำมากล่าวได้หมด ถึงแม้ว่าภาษาซีอาจจะดูเก่าไปสำหรับคนอื่น แต่ผมว่าควรศึกษาภาษาซีที่เป็นรากฐานของภาษาอื่นๆเสียก่อน เพราะภาษาC++  จาวา (Java) ฯลฯ และ ระบบลีนุกซ์ เป็นระบบที่ถูกพัฒนามาจากระบบยูนิกซ์ซึ่งก็เป็นที่รู้กันทั่วไปว่า ภาษาคู่บารมีของระบบปฏิบัติการตระกูลยูนิกซ์มีการพัฒนามาจากภาษาซีเช่นกัน
                ภาษาซีเป็นภาษาที่บางคนเรียกว่าภาษาระดับกลาง คือไม่เป็นภาษาระดับต่ำแบบแอสเซมบลีหรือเป็นภาษาสูงแบบ เบสิค โคบอล ฟอร์แทรน หรือ ปาสคาล เนื่องจากคุณสามารถจะจัดการเกี่ยวกับเรื่องของพอยน์เตอร์ได้อย่างอิสระ และบางทีคุณก็สามารถควบคุมฮาร์ดแวร์ผ่านทาง ภาษาซี ได้ราวกับคุณเขียนมันด้วยภาษาแอสเซมบลี ด้วยข้อดีเหล่านี้เองทำให้โปรแกรมที่ถูกเขียนด้วยภาษาซีมีความเร็วในการปฏิบัติงานสูงกว่าภาษาทั่วๆไป แต่ก็ต้องแลกกับการเรียนรู้และการฝึกฝนอย่างหนัก


ประวัติภาษาซี

                ภาษาซีเป็นภาษาที่ถือว่าเป็นทั้งภาษาระดับสูงและระดับต่ำ ถูกพัฒนาโดยเดนนิส ริดชี (Dennis Ritche) แห่งห้องทดลองเบลล์ (Bell Laboratories) ที่เมอร์รีฮิล มลรัฐนิวเจอร์ซี่ โดยเดนนิสได้ใช้หลักการของภาษา บีซีพีแอล (BCPL : Basic Combine Programming Language) ซึ่งพัฒนาขึ้นโดยเคน ทอมสัน (Ken Tomson) การออกแบบและพัฒนาภาษาซีของเดนนิส ริดชี มีจุดมุ่งหมายให้เป็นภาษาสำหรับใช้เขียนโปรแกรมปฏิบัติการระบบยูนิกซ์ และได้ตั้งชื่อว่า ซี (C) เพราะเห็นว่า ซี (C) เป็นตัวอักษรต่อจากบี (B) ของภาษา BCPL ภาษาซีถือว่าเป็นภาษาระดับสูงและภาษาระดับต่ำ ทั้งนี้เพราะ ภาษาซีมีวิธีใช้ข้อมูลและมีโครงสร้างการควบคุมการทำงานของโปรแกรมเป็นอย่างเดียวกับภาษาของโปรแกรมระดับสูงอื่นๆ จึงถือว่าเป็นภาษาระดับสูง ในด้านที่ถือว่าภาษาซีเป็นภาษาระดับต่ำ เพราะภาษาซีมีวิธีการเข้าถึงในระดับต่ำที่สุดของฮาร์ดแวร์ ความสามารถทั้งสองด้านของภาษานี้เป็นสิ่งที่เกื้อหนุนซึ่งกันและกัน ความสามารถระดับต่ำทำให้ภาษาซีสามารถใช้เฉพาะเครื่องได้ และความสามารถระดับสูง ทำให้ภาษาซีเป็นอิสระจากฮาร์ดแวร์ ภาษาซีสามารถสร้างรหัสภาษาเครื่องซึ่งตรงกับชนิดของข้อมูลนั้นได้เอง ทำให้โปรแกรมที่เขียนด้วยภาษาซีที่เขียนบนเครื่องหนึ่ง สามารถนำไปใช้กับอีกเครื่องหนึ่งได้ ประกอบกับการใช้พอยน์เตอร์ในภาษาซี นับได้ว่าเป็นตัวอย่างที่ดีของการเป็นอิสระจากฮาร์ดแวร์

วิวัฒนาการของภาษาซี

ค.ศ. 1970 มีการพัฒนาภาษา B โดย Ken Thompson ซึ่งทำงานบนเครื่อง DEC PDP-7 ซึ่ง ทำงานบนเครื่องไมโครคอมพิวเตอร์ไม่ได้ และยังมีข้อจำกัดในการใช้งานอยู่ (ภาษา B สืบทอดมาจาก ภาษา BCPL ซึ่งเขียนโดย Marth Richards)

ค.ศ. 1972 Dennis M. Ritchie และ Ken Thompson ได้สร้างภาษา C เพื่อเพิ่มประสิทธิภาพ ภาษา B ให้ดียิ่งขึ้น ในระยะแรกภาษา C ไม่เป็นที่นิยมแก่นักโปรแกรมเมอร์โดยทั่วไปนัก

ค.ศ. 1978 Brian W. Kernighan และ Dennis M. Ritchie ได้เขียนหนังสือเล่มหนึ่งชื่อว่า The C Programming Language และหนังสือเล่มนี้ทำให้บุคคลทั่วไปรู้จักและนิยมใช้ภาษา C ในการเขียน โปรแกรมมากขึ้น

แต่เดิมภาษา C ใช้ Run บนเครื่องคอมพิวเตอร์ 8 bit ภายใต้ระบบปฏิบัติการ CP/M ของ IBM PC ซึ่งในช่วงปี ค. ศ. 1981 เป็นช่วงของการพัฒนาเครื่องไมโครคอมพิวเตอร์ ภาษา C จึงมี บทบาทสำคัญในการนำมาใช้บนเครื่อง PC ตั้งแต่นั้นเป็นต้นมา และมีการพัฒนาต่อมาอีกหลาย ๆ ค่าย ดังนั้นเพื่อกำหนดทิศทางการใช้ภาษา C ให้เป็นไปแนวทางเดียวกัน ANSI (American National Standard Institute) ได้กำหนดข้อตกลงที่เรียกว่า 3J11 เพื่อสร้างภาษา C มาตรฐานขึ้นมา เรียนว่า ANSI C

ค.ศ. 1983 Bjarne Stroustrup แห่งห้องปฏิบัติการเบล (Bell Laboratories) ได้พัฒนาภาษา C++ ขึ้นรายละเอียดและความสามารถของ C++ มีส่วนขยายเพิ่มจาก C ที่สำคัญ ๆ ได้แก่ แนวความคิดของการเขียนโปรแกรมแบบกำหนดวัตถุเป้าหมายหรือแบบ OOP (Object Oriented Programming) ซึ่งเป็นแนวการเขียนโปรแกรมที่เหมาะกับการพัฒนาโปรแกรมขนาดใหญ่ที่มีความสลับซับซ้อนมาก มีข้อมูลที่ใช้ในโปรแกรมจำนวนมาก จึงนิยมใช้เทคนิคของการเขียนโปรแกรมแบบ OOP ในการพัฒนาโปรแกรมขนาดใหญ่ในปัจจุบันนี้


รูปแบบของการเขียนโปรแกรม

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

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 เป็นอย่างไร ทำไมต้องจอง ก็ขอบอกว่า เวลาที่เราประกาศตัวแปรชนิดใดก็ตามก็จะทำการไปหาเนื้อที่ในหน่วยความจำ ขนาดเท่าๆ กับ ชนิดข้อมูลที่เรากำหนดเอาไว้ ซึ่ง ถ้าเราประกาศตัวแปร 2 ตัว ไม่จำเป็นว่าตัวแปรสองตัวนี้จะถูกจองตรงเนื้อที่ที่มันติดกัน แต่ ถ้าเราจองเนื้อที่เป็นแบบ array นั่นหมายความถึงว่า ทุกๆ สมาชิกที่เป็นสมาชิกของ array จะถูกจองเนื้อที่ติดๆกันไป ตามขนาดความยาวของ array นั้น นั่นเอง ถ้าใครยังไม่เข้าใจก็เดี๋ยวจะมีการพูดถึง array อีกในตอนหลังตอนนี้ มาดูก่อนว่า ถ้าเราจะเก็บ string ที่มีข้อความว่า TOUCHAKORN จะต้องเก็บอย่างไร
T
O
U
C
H
A
K
O
R
N
NULL Character

การประกาศตัวแปร

ในภาษา 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 );
                }


                ดูโปรแกรมแล้วพบว่านี่คือโปรแกรมที่จะทำการบวกเลข จำนวนคือ 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 ( " 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 คล้ายกับบรรทัดก่อนหน้าแต่เราใส่เครื่องหมาย - เพื่อให้มันพิมพ์ชิดซ้าย

Input command
คำสั่งในการ input ที่ใช้ง่ายๆก็คือ คำสั่ง
                scanf(" ตัวกำหนดชนิดข้อมูล",&ตัวแปร);
ยกตัวอย่างเช่น ต้องการรับค่า จำนวนเต็ม มาใส่ไว้ในตัวแปรที่ชื่อ number จะสั่งดังนี้
                int number;
                scanf("%d",&number); สำคัญอย่าลืมเครื่องหมาย &
และหากรับตัวแปร 2 ตัว โดย รับค่า จำนวนเต็มไว้ในตัวแปรชื่อ num1 และ รับค่า จำนวนจริง ไว้ในตัวแปร num2 ทำได้โดย
                int num1,num2;
                scanf("%d %f",&num1,&num2);
หากต้องการรับข้อความ Touchakorn ซึ่งก็คือ 10 character ทำได้โดย
                char name[10];
                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 เฉยๆ โดยไม่ใส่ index ให้มันมันก็จะทำการชี้ไปที่ที่อยู่ของตัวแปรนั้นนั่นเอง จากนั้นจึงเป็นเหตุผลว่าทำไมคำสั่ง scanf ที่รับตัวแปรที่เป็น array ของ character เราจึงไม่ต้องใส่เครื่องหมาย อยากจะบอกแค่นี้แหละ แต่ตอนนี้ก็ต้องถือว่าเรามีความรู้เรื่อง array กันบ้างแล้วไม่มากก็น้อย ขอย้ำว่าเป็นเฉพาะตอนรับ array ของ character(หรือในความหมายคือการรับ string นั่นแหละ เนื่องจากในภาษาซีไม่มีตัวแปรชนิด string จึงจำเป็นต้องใช้ตัวแปรที่เป็น array ของ character มาแทน ) เท่านั้นนะ ที่ไม่ต้องใส่ & หน้าตัวแปรในคำสั่ง scanf อย่าเข้าใจผิดหากเป็นตัวแปรชนิดอื่นก็ทำไปตามกฎ

คำสั่ง for loop
                for(ตัวนับ= i;เงื่อนไขที่จะให้ยังทำงานอยู่ใน loop; การเพิ่มหรือการลดตัวนับ)
                {
                                statement ;
                }
                ก่อนอื่นต้องขออธิบายก่อนว่านี่คือโครงสร้างของ for loop โดยขอให้สังเกตบรรทัดแรกตรงที่มีคำสั่ง for แล้วให้ดูในวงเล็บ ปรากฎว่าตามรูปแบบมาตรฐานนั้น ในส่วนของวงเล็บหลังคำว่า for จะประกอบไปด้วย 3 ส่วน ส่วนแรกก็คือ การกำหนดค่าเริ่มต้นให้กับตัวนับ อาจจะงงว่าตัวนับที่พูดถึงคืออะไร ใน for loop นั้น จำเป็นจะต้องมีตัวนับอยู่ด้วยเสมอ ซึ่งตัวนับนี้ จะเป็นตัวบอกเราว่า loop ของเรานั้นทำการวนซ้ำมาเป็นรอบที่เท่าไรแล้ว และในส่วนแรกนี้เราจำเป็นจะต้องมีการกำหนด ค่าเริ่มต้นให้กับตัวนับก่อน ในส่วนที่สอง เงื่อนไขที่จะให้ยังทำงานอยู่ใน loop นี้ โดยส่วนใหญ่จะเป็นการกำหนดว่าเมื่อตัวนับมีการวนซ้ำ ถึงจำนวนรอบเท่านั้นเท่านี้ก็จะให้หลุดจาก loop ในส่วนที่สาม การเพิ่มหรือการลดตัวนับ ตรงนี้สำคัญ ซึ่งจะเป็นส่วนที่ทำให้ ตัวนับของเรามีการเพิ่มค่าหรือลดค่า ในแต่ละรอบของการวนซ้ำเช่นอาจเพิ่มทีละหนึ่ง หรือ เพิ่มทีละเป็นต้นหรืออาจจะลดทีละ 1 หรือลดทีละ 3 ก็แล้วแต่โปรแกรมจะกำหนด หลังจากวงเล็บที่อยู่หลัง for ก็จะมีเครื่องหมาย ปีกกาเพื่อให้เข้าสู่ส่วนของคำสั่ง ที่จะต้องทำหลังจากบรรทัด for ก็มาถึง statement ซึ่งจะเป็นส่วนที่ให้เราเขียนคำสั่งว่า ในแต่ละรอบนั้น เราจะให้โปรแกรมทำงานอะไร ซึ่งก็อาจมีได้หลายคำสั่ง บรรทัดสุดท้ายก็คือ ปีกกาปิดเพื่อจบโครงสร้าง for loop

ตัวอย่าง การบวกเลขตั้งแต่ ถึง 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 เราจะทำ
ตัวอย่าง การแสดงเฉพาะเลขคี่ที่อยู่ในช่วงตั้งแต่ ถึง 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 เราจะทำอย่างไร
ตัวอย่าง การแสดงเฉพาะเลขคู่ที่อยู่ในช่วงตั้งแต่ ถึง 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 จะทำได้อย่างไร

ตัวอย่าง การแสดงเฉพาะเลขคู่(ถอยหลัง)ที่อยู่ในช่วงตั้งแต่ ถึง 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 นี้จะวิ่งไปเรื่อยๆ ไม่มีวันหยุดนั่นเอง

ภาษาซี มีลักษณะเด่น(ข้อดี) ดังนี้
  - เป็นภาษาคอมพิวเตอร์ที่มีการพัฒนาขึ้นใช้งานเพื่อเป็นภาษามาตรฐานที่ไม่ขึ้นกับโปรแกรมจัดระบบงานและไม่ขึ้นกับฮาร์ดแวร์
  - เป็นภาษาคอมพิวเตอร์ที่อาศัยหลักการที่เรียกว่า "โปรแกรมโครงสร้างจึงเป็นภาษาที่เหมาะกับการพัฒนาโปรแกรมระบบ
  - เป็นคอมไพเลอร์ที่มีประสิทธิภาพสูง ให้รหัสออบเจ็กต์สั้น ทำงานได้รวดเร็ว เหมาะกับงานที่ต้องการ     ความรวดเร็วเป็นสำคัญ
  - มีความคล่องตัวคล้ายภาษาแอสแซมบลี ภาษาซีสามารถเขียนแทนภาษาแอสแซมบลีได้ดี ค้นหาที่ผิดหรือ แก้โปรแกรมได้ง่าย ภาษาซีจึงเป็นภาษาระดับสูงที่ทำงานเหมือนภาษาระดับต่ำ
  - มีความคล่องตัวที่จะประยุกต์เข้ากับงานต่างๆ ได้เป็นอย่างดี การพัฒนาโปรแกรม เช่น เวิร์ดโพรเซสซิ่ง สเปรดชีต ดาตาเบส ฯลฯ มักใช้ภาษาซีเป็นภาษาสำหรับการพัฒนา
  - เป็นภาษาที่มีอยู่บนเกือบทุกโปรแกรมจัดระบบงาน มีในเครื่องไมโครคอมพิวเตอร์ตั้งแต่ 8 บิต ไปจนถึง 32 บิต เครื่องมินิคอมพิวเตอร์ และเมนเฟรม
  - เป็นภาษาที่รวมข้อดีเด่นในเรื่องการพัฒนา จนทำให้ป็นภาษาที่มีผู้สนใจมากมายที่จะเรียนรู้หลักการของภาษา  และวิธีการเขียนโปรแกรม ตลอดจนการพัฒนางานบนภาษานี้

ข้อเสีย
 - เป็นภาษาที่เรียนรู้ยาก
 - การตรวจสอบโปรแกรมทำได้ยาก
 - ไม่เหมาะกับการเขียนโปรแกรมที่เกี่ยวข้องกับการออกรายงานที่มีรูปแบบซับซ้อนมากๆ

ตัวอย่างโปรแกรม
                #include<stdio.h>                
                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 ที่ผ่านมาคือคำสั่ง print f จะเห็นได้ว่าเป็นคำสั่งประเภท output คือสั่งพิมพ์ออกทางหน้าจอ ต่อมาจะมีคำสั่ง Input บ้าง นี่คือ คำสั่ง getch(); เป็นคำสั่งสำหรับรับค่าจากทาง keyboard เข้ามา ซึ่งจริงๆแล้วรูปแบบของคำสั่งก็มีหลายรูปแบบเช่นกัน แต่ในที่นี้ ที่เราจะต้องใช้คำสั่งนี้ก็เพื่อว่า เมื่อเราพิมพ์ข้อความทั้งสองข้างต้นไปแล้วให้ผู้ใช้ กดปุ่มใดๆก็ได้เพื่อจบโปรแกรม


                บรรทัดต่อมามีเครื่องหมาย } เป็นการแสดงว่าจบโปรแกรมในส่วนของ main ส่วนข้อความ /* end of main */ ที่ปรากฎก็คือ commentเช่นเดียวกับที่ได้อธิบายไปข้างต้นแล้ว เราจะสังเกตได้ว่า เมื่อมีเครื่องหมาย ปีกกาเปิด ก็ต้องมีเครื่องหมาย ปีกกาปิด เสมอ และอยู่กันเป็นคู่ๆด้วย





อ้างอิงจาก

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

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