บทที่ 2 แนะนำภาษา C Basic C Program
แนะนำภาษา C ขั้นตอนการพัฒนาโปรแกรม โครงสร้างโปรแกรมภาษา C ตัวแปรและตัวดำเนินการ การแสดงผลและรับค่า ข้อผิดพลาดที่เกิดขึ้นบ่อย
ภาษาซี C Programming Language ถูกออกแบบและสร้างขึ้นในปี พ.ศ. 2515 (1972) โดย Dennis Ritchie เป็นภาษาเชิงโครงสร้าง (structured programming) โดยมีการนิยามและเรียกใช้ฟังก์ชัน มีโครงสร้างและลำดับการเขียนที่มีความยืดหยุ่น สามารถเข้าถึงอุปกรณ์ฮาร์ดแวร์ได้โดยตรง สามารถขยายโปรแกรมเป็น C++
ขั้นตอนการพัฒนาโปรแกรม เขียนซอร์สโค้ด (source code) ผ่านโปรแกรมประเภท Text Editor หรือ IDE (Integrated Development Environment) สำหรับโปรแกรมภาษาซี โดยให้บันทึกเป็นไฟล์ นามสกุล .C ซอร์สโค้ดจะต้องเป็นไปตามโครงสร้างประโยคของภาษา C คอมไพล์โปรแกรม หากซอร์สโค้ดถูกต้อง จะได้ออบเจ็คไฟล์ (นามสกุล .OBJ หรือ .O) ลิงค์ออบเจ็คไฟล์เข้าด้วยกัน กลายเป็นไฟล์ที่มีภาษาเครื่อง ที่สามารถนำมารันได้ นามสกุล .EXE สำหรับ Windows ไฟล์ที่มีสิทธิ execute สำหรับ Linux (หรือ Unix)
ขั้นตอนการพัฒนาโปรแกรมภาษาซี Compiler (c-free, gcc, dev-c++) Source Code ( file.c ) Object code (file.o) Preprocessing & Compilation Linker Linking ไฟล์ภาษาเครื่อง หรือ ไฟล์โปรแกรม(ไฟล์ที่ทำงานได้) Machine code / Program / executable file ( file.exe )
3 ขั้นตอนของการพัฒนาโปรแกรม (1) ขั้น 1: Preprocessing ทำงานโดยโปรแกรมที่เรียกว่า preprocessor ทำการแก้ไขโค๊ดในหน่วยความจำหลัก (RAM) โดยทำการแก้ไขตามข้อความในซอคโค๊ด นำช่องว่างและ comments ออกจากโค๊ด โค๊ดที่อยู่ในฮาร์ดดิสไม่มีการเปลี่ยนแปลง
3 ขั้นตอนของการพัฒนาโปรแกรม (2) ขั้น 2: Compilation ทำงานโดยโปรแกรมที่ชื่อว่า compiler ทำการแปลโค๊ดที่ได้จากขั้นที่ 1 มาอยู่ในรูปของ object code หรือ machine code ซึ่งเป็นภาษาเครื่อง ทำการตรวจสอบหา ข้อผิดพลาด syntax และ warnings ทำการบันทึกผลที่ได้ลงไปในฮาร์ดดิส หากมีการสั่ง หากที่ข้อผิดพลาดเกิดขึ้น จะไม่มีการสร้างไฟล์ object ออกมา ไฟล์ object จะถูกสร้างขึ้นหากมี warnings แต่ต้องไม่มี errors ใดๆ
3 ขั้นตอนของการพัฒนาโปรแกรม (2) ขั้น 3: Linking รวม object ของโปรแกรมกับ object อื่นๆ เพื่อสร้างเป็นโปรแกรมที่สามารถรันได้ Object code อื่นๆได้มาจาก Run-Time Library หรือ ไลบรารี่อื่นๆ หรือ object code ที่มีการสร้างขึ้นมาก่อนหน้านี้ บันทึกโปรแกรมที่สามารถรันได้ลงฮาร์ดดิส หากมีข้อผิดพลาด (errors) ใดๆ เกิดขึ้น (หา library ไม่พบ, เขียนไฟล์ลงดิสก์ไม่ได้, ฯลฯ) จะไม่มีการสร้างโปรแกรมที่รันได้ (executable file) เมื่อสำเร็จ ผลลัพธ์ จะได้ไฟล์โปรแกรมที่รันได้ (EXE file)
ขั้นตอนการพัฒนาโปรแกรม Hardware OS Source Code -------------------------- Compiler Linker Library ---------------- Object File --.obj Executable File --.exe มีการแปล Source Code ทั้งหมดก่อนได้ Object File นำมาประกอบกับ Code บางส่วนที่เตรียมไว้แล้ว (Library) ได้ผลลัพธ์เป็น machine language (Executable File)
ขอบเขตของฟังก์ชัน main โปรแกรมแรกกับภาษา C Pre-processor # include <stdio.h> int main (void) { // My first program printf(“Hello World!!!”); system(“PAUSE”); return 0; } ฟังก์ชัน main comment คำอธิบายโปรแกรม คำสั่ง ขอบเขตของฟังก์ชัน main เป็นโปรแกรมสั่งพิมพ์ข้อความ Hello World!!!
ส่วนต่างๆ ในโปรแกรมภาษาซี Comment ส่วนหัวและ/หรือส่วนอื่นๆของโปรแกรม ส่วนของ preprocessors int main ( void ) { ส่วนของโปรแกรม return 0 ; }
Comment คำอธิบายโปรแกรม ใช้อธิบายหน้าที่การทำงานของโปรแกรม ฟังก์ชัน หรือคำสั่ง เพื่อความง่ายในการทำความเข้าใจ เขียนด้วยภาษาอะไรก็ได้ (ภาษาไทยก็ได้) ไม่มีผลกระทบกับการทำงานของโปรแกรม ในขณะทดลองแก้ไขโปรแกรม ส่วนใดต้องการข้ามไป ใช้ comment ปิดไว้ก่อน ไม่ต้องลบ code ออกทั้งหมด เผื่อต้องการเรียกกลับมาใช้ใหม่ได้ เราสามารถเขียนคำอธิบายโปรแกรมได้สองแบบ คือ // คำอธิบายเริ่มต้นจากจุดนี้ ไปจนหมดบรรทัด /* คำอธิบายเริ่มต้นจากจุดนี้ ไปจนถึงเครื่องหมายจบ แม้จะข้ามบรรทัดไปก็ตาม */
ส่วนของ Preprocessor บรรทัดที่เริ่มต้นด้วย เครื่องหมาย # เรียกว่า preprocessor ตัวอย่างเช่น #define symbol another_symbol ใช้ในการแทนที่คำที่กำหนด (symbol) ทุกคำในซอร์สโค้ดด้วยคำที่กำหนด (another_symbol) มักใช้ในการกำหนดค่าคงที่ เพื่อสะดวกต่อการแก้ไข เช่น ในไฟล์ซอร์สโค้ดมีโค้ดที่เกี่ยวกับกับเลข 50 ซึ่งใช้ในการตัดเกรด ซึ่งมีการใช้ในหลายจุดของโปรแกรม เราใช้ #define เพื่อให้ง่ายต่อการเปลี่ยนแปลง #define FAIL_SCORE 50
ส่วนของ Preprocessor #include <stdio.h> ซึ่งเป็นตัวบอกว่าให้นำ header file ของมาตราฐานการส่งรับข้อมูล ใน stdio.h เข้ามาในโปรแกรมด้วย เนื่องจากจำเป็นต้องใช้ โดย header file ตัวนี้มีข้อมูลของคำสั่ง printf() ที่ใช้ในโปรแกรมของเรา
stdio.h เป็น header file ของไลบรารี่ของฟังก์ชันที่ช่วยให้เราสามารถเขียนโปรแกรมได้โดยไม่จำเป็นต้องเขียนโปรแกรมเดิมๆหลายๆครั้ง เนื่องจากฟังก์ชันบางตัวนั้นมีขนาดยาวและมีความซับซ้อน การที่ไม่ต้องเขียนฟังก์ชันเหล่านี้เองทำให้การเขียนโปรแกรมง่ายและเร็วขึ้น การใช้งานฟังก์ชันเหล่านี้ยังเป็นการทำให้ง่ายต่อการเรียนรู้โปรแกรม เนื่องจากทำให้อ่านโปรแกรมง่าย
int main ( void ) ทุกๆโปรแกรมจะต้องมีฟังก์ชันที่ชื่อว่า main. เพราะนี้เป็นส่วนแรกที่โปรแกรมจะเริ่มทำงาน ฟังก์ชัน main( ) ถูกกำหนดขึ้นให้เป็นส่วนแรกของโปรแกรมที่จะถูกรันเพื่อให้สะดวกแก่การอ่านโปรแกรม ทุกโปรแกรมต้องมีฟังก์ชันที่มีชื่อนี้ และต้องมีเพียงฟังก์ชันเดียวเท่านั้นเพื่อให้โปรแกรมสามารถ compile และทำงานได้
วงเล็บที่ตามหลังคำสงวน “main” บอกให้ทราบว่านี้คือฟังก์ชัน int main ( void ) คำสงวน “int” ที่นำหน้า main( ) เป็นตัวบอกว่าฟังก์ชันจะมีการส่งค่าออกเป็นชนิดตัวเลขจำนวนเต็ม (int มาจาก integer) เมื่อจบฟังก์ชัน วงเล็บที่ตามหลังคำสงวน “main” บอกให้ทราบว่านี้คือฟังก์ชัน คำสงวน “void” บอกให้ทราบว่าฟังก์ชันดังกล่าวไม่มีการรับค่าเข้าจากภายนอก (parameter/argument) int main( ) มีความหมายเดียวกับ int main(void)
ส่วนของโปรแกรม วงเล็บปีกกาเปิด { บอกให้ทราบว่าส่วนของฟังก์ชันหรือขอบเขตของโค๊ดเริ่มต้นที่ใด วงเล็บปีกกาปิด } บอกให้ทราบว่าส่วนของฟังก์ชันหรือขอบเขตของโค๊ดสิ้นสุดที่ใด เครื่องหมาย ; บอกให้ทราบว่าคำสั่งหนึ่งจบลง (ต้องใส่ไว้หลังคำสั่งทุกคำสั่ง มิฉะนั้นจะเกิด syntax error การย่อหน้าในการเขียนโปรแกรมเป็นลักษณะการเขียนโปรแกรมที่ดี เพื่อให้สะดวกต่อการหาขอบเขตของคำสั่ง
printf (“Hello World!!!”) ; บรรทัดนี้เป็นส่วนคำสั่งของภาษาซี เป็นการเรียกใช้ฟังก์ชันชื่อว่า printf ( ) โดยมีการส่งผ่านค่าเข้าไปในฟังก์ชัน หนึ่งค่า “Hello World!!!” เป็น ค่าชนิด string argument (parameter): ค่าที่ส่งผ่านเข้าไปในฟังก์ชั่น
return 0 ; เนื่องจากฟังก์ชัน main() มีการส่งค่ากลับมา ก่อนจะจบฟังก์ชันจึงต้องมีการใช้คำสั่ง return ตามด้วยตัวเลขที่จะส่งกลับไป โดยค่าที่ส่งกลับไปจะถูกส่งไปให้ระบบปฏิบัติการ (operating systems) ค่า 0 เป็นตัวบอกว่าโปรแกรมทำงานเสร็จสิ้นสมบูรณ์ ยังไม่ต้องกังวลกับเรื่องนี้ตอนนี้ เพียงให้จำว่าต้องใส่คำสั่งนี้ไว้ในตอนท้ายของฟังก์ชัน main() ทุกครั้ง
ตัวอย่างโปรแกรม ผลการรันโปรแกรม จงแสดงผลลัพธ์ของโปรแกรม # include <stdio.h> int main (void) { printf(“My name is Tommy \n”); return 0; } ผลการรันโปรแกรม My name is Tommy
ทดสอบความเข้าใจ จงเขียนโปรแกรมแสดงชื่อ นามสกุล พร้อมกับรหัสนักศึกษา # include <stdio.h> int main (void) { printf(“Tommy Kim\n 53102999\n”); return 0; } ผลการรันโปรแกรม: Tommy Kim 53102999
ตัวแปรและตัวดำเนินการ
ชนิดข้อมูลพื้นฐาน ภาษา C เป็นภาษาที่เข้มงวดกับเรื่องชนิดข้อมูล int ตัวเลขจำนวนเต็ม float ตัวเลขทศนิยม double ตัวเลขทศนิยมที่มีความจุเป็น 2 เท่า char ตัวอักษร ชนิดข้อมูลบางตัว อาจทำงานร่วมกับตัวปรับปรุง signed, unsigned, short และ long char a character int an integer, in the range -32,767 to 32,767 long int a larger integer (up to +-2,147,483,647) float a floating-point number double a floating-point number, with more precision and perhaps greater range than float (From the ranges listed above, we can determine that type int must be at least 16 bits, and that type long int must be at least 32 bits. But neither of these sizes is exact; many systens have 32-bit ints, and some systems have 64-bit long ints.)
ข้อมูล โปรแกรมส่วนใหญ่เกี่ยวข้องกับการประมวลผลข้อมูล ข้อมูลภายในโปรแกรม ค่าคงที่ ตัวแปร ข้อมูลจากภายนอก การกด keyboard ไฟล์ ระบบเครือข่าย อื่นๆ
ค่าคงที่ Constant Value ตัวเลขจำนวนเต็ม (ฐานสิบ Decimal) เช่น 10, 20, -5 เลขฐาน 16 (Hexadecimal) เช่น 0x32, 0x5FB (ขึ้นต้นด้วย 0x) เลขฐาน 8 (Octal) เช่น 013, 041, 07 (ขึ้นต้นด้วยศูนย์) ตัวเลขทศนิยม เช่น 7.2, 5.6, 0.002, 2e-3, -3.14159e2, -314.159 ตัวอักษร เช่น 'c' ,'1', '5' , ' ' (space), ‘$' ตัวอักษรพิเศษที่ขึ้นต้นด้วย \ เช่น '\t' อักขระพิเศษสามารถยกเลิกความพิเศษได้โดยใช้ \ นำหน้า เช่น '\\' คืออักขระ \ ข้อความ String (ไม่ใช่ข้อมูลชนิดพื้นฐาน) เช่น "Hello" ข้อความว่างเปล่า "" ข้อความที่มีตัวอักษรว่าง(space)หนึ่งตัว " "
ข้อมูลตัวอักษร Character ขนาดหนึ่งไบต์ เก็บค่าเป็นจำนวนเต็มได้ 256 ค่า (0_255 หรือ -128_127) ค่าจำนวนคือรหัสของตัวอักษร ตามมาตรฐานASCII เรียกว่ารหัสแอสกี้ (ASCII)
ตัวแปร Variable ใช้หน่วยความจำของคอมพิวเตอร์ในการจดจำข้อมูล ยากที่จะอ้างอิงตำแหน่งในหน่วยความจำ เราจึงใช้ชื่อของตัวแปรในการอ้างอิง ตัวแปรต้องถูกประกาศก่อนการใช้งาน การประกาศตัวแปร ประกอบด้วย ชนิดข้อมูล ชื่อตัวแปร (อาจจะมีการกำหนดค่าเริ่มต้นด้วย) และตามด้วย ; (semi-colon) เช่น int x; หรือ int x = 2; ชื่อตัวแปร เป็นการประกอบกันระหว่าง ตัวอักษร ตัวเลข เครื่องหมาย _ (underscore) ทั้งนี้ห้ามขึ้นต้นด้วยตัวเลข และไม่เป็นคำสงวน
ตัวอย่างการประกาศใช้งานตัวแปร ประกาศตัวแปร c มีชนิดเป็นตัวอักษร 1 ตัว char c; ประกาศตัวแปร count มีชนิดเป็นเลขจำนวนเต็มพร้อมทั้งกำหนดให้มีค่าเท่ากับ 8 int count=8; ประกาศตัวแปร price มีชนิดเป็นเลขทศนิยม float price;
ตัวอย่างการประกาศตัวแปร ประกาศตัวแปรชื่อ happy มีชนิดเป็นตัวอักษร 1 ตัว พร้อมทั้งกำหนดให้มีค่าเป็นตัวอักษร C ( capital letter พิมพ์ใหญ่ ) char happy=‘C’; ประกาศตัวแปร easy มีชนิดเป็นเลขจำนวนเต็มพร้อมทั้งกำหนดให้มีค่าเท่ากับ 5 และ ตัวแปร Easy มีชนิดเป็นเลขจำนวนเต็มพร้อมทั้งกำหนดให้มีค่าเท่ากับ 10 int easy=5, Easy=10; หรือ int easy=5; int Easy=10; ประกาศตัวแปรชื่อ test มีชนิดเป็นเลขทศนิยมมีค่าเท่ากับ 7.5 float test=7.5;
การตั้งชื่อตัวแปร อักษรตัวแรกจะต้องเป็นตัวอักษรภาษาอังกฤษหรือเครื่องหมาย _ (underline character) สามารถตั้งชื่อตัวแปรโดยใช้ตัวเลขร่วมกับตัวอักษรภาษาอังกฤษ ได้แต่ห้ามใช้ตัวเลขเป็นตัวอักษรตัวแรก ตัวอักษรภาษาอังกฤษตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ถือเป็นคนละตัวกัน เช่น name กับ NAME
การตั้งชื่อตัวแปร ห้ามตั้งชื่อซ้ำกับคำสงวน (Keywords) ซึ่งเป็นคำที่มีอยู่แล้วในภาษาC auto default float register struct volatile break do for return switch while case double goto short typedef char else if signed union const enum int sizeof unsigned continue extern long static void
ตัวอย่าง คำต่อไปนี้สามารถนำมาตั้งเป็นชื่อตัวแปรได้หรือไม่ number 2value grade1 student_id float _score $age Number-person
ตัวอย่างการใช้งานตัวแปร #include <stdio.h> #define NUM 5 int main(){ int x = NUM; float y; y = x + NUM; printf("%.1f\n", y); return 0; } NUM ไม่ใช่ตัวแปร แต่จะถูกแทนด้วย 5 ก่อนการคอมไพล์ x เป็นตัวแปร ชนิดจำนวนเต็ม ค่า y ถูกกำหนดค่าโดยเครื่องหมาย = ด้านซ้ายเป็นตัวแปร ด้านขวาเป็นการคำนวณตัวเลข ผลลัพธ์ของการคำนวณ เป็นไปตามชนิด ข้อมูลของตัวถูกดำเนินการที่ใหญ่สุด int + float => float
ตัวดำเนินการทางคณิตศาสตร์ Arithmetic Operators ตัวดำเนินการทางคณิตศาสตร์ มี 5 ตัว คือ บวก ลบ คูณ หาร มอดูลัส ( + - * / % ตามลำดับ) มอดูลัสคือการหาเศษของการหาร ใช้ได้กับจำนวนเต็มเท่านั้น มอดูลัส คือ เครื่องหมายที่ให้ผลลัพธ์เป็น เศษของการหาร คือ 13%5 ได้ 3 ผลลัพธ์ของนิพจน์ จะมีชนิดข้อมูล ตามชนิดข้อมูลที่ใหญ่ที่สุดของตัวถูกดำเนินการ int x =6; float y = 2.0; x*5 ผลลัพธ์ที่ได้คือ นิพจน์ของ int x/5 ผลลัพธ์ที่ได้คือ นิพจน์ของ int (เลขทศนิยมจะหายไป) x*y ผลลัพธ์ที่ได้ คือ นิพจน์ของ float
ตัวอย่าง C = 5 จากคำสั่งต่อไปนี้ จงหาค่าของตัวแปร c int a,b,c; a = 2; c = a + b; จงหาค่าของตัวแปร c C = 5
ตัวอย่าง b=6 or b=9 a=2 or a=5 จากคำสั่งต่อไปนี้ จากคำสั่งต่อไปนี้ int a,b; a = 2; a = 5; b = a + 4; จงหาค่าของตัวแปร b จากคำสั่งต่อไปนี้ int a; a = 2; a = a + 3; จงหาค่าของตัวแปร a b=6 or b=9 a=2 or a=5
ตัวดำเนินการทางคณิตศาสตร์ (Arithmetic Operator) เครื่องหมาย ความหมาย + บวก - ลบ * คูณ / หาร % หารเอาเศษ (Modulo) ++ เพิ่มค่าครั้งละ 1 -- ลดค่าครั้งละ 1
ลำดับของตัวดำเนินการ ก่อน เครื่องหมาย ทิศการทำงาน () ซ้ายไปขวา * / % ซ้ายไปขวา + - ซ้ายไปขวา หลัง
การกำหนดค่า และลำดับของการดำเนินการ ลำดับของตัวดำเนินการ จะเกิดขึ้นตามระดับของตัวดำเนินการ คูณ และหาร จะกระทำก่อนบวกและลบ ถ้าระดับเท่ากัน จึงคำนวนจากซ้ายไปขวา เพื่อป้องกันความสับสน ควรใช้ ( ) เพื่อระบุว่าตัวดำเนินการใดต้องทำก่อน เช่น (sum/4) + (max*lowest) เป็นต้น นิพจน์ทางขวามือของเครื่องหมาย = ต้องถูกประเมิน answer = sum / 4 + MAX * lowest; 4 1 3 2 ผลลัพธ์ของนิพจน์ถูกนำไปบันทึกในตัวแปรทางซ้ายมือ
ตัวอย่าง จงหาค่าของนิพจน์ต่อไปนี้ 10/5 _____________ 3/9 _____________ 7/2 _____________ 7.0/2 _____________ 21%4 _____________ 10%7 _____________ 10%2 _____________ 3%7 _____________ 2 3 3.5 1
ตัวอย่าง. จงหาค่าของนิพจน์ต่อไปนี้ ตัวอย่าง. จงหาค่าของนิพจน์ต่อไปนี้ 4 10 + 2 * 3 * -1 _____________ 2 * 5 % 8 + -7 _____________ (3 + 5/2)*(7 - 3 - 5%2) _____________ -5 15 5 * 3
กำหนดให้ x, y และ z เป็นตัวแปรจำนวนเต็ม จงหาค่าของตัวแปร x, y และ z หลังจากส่วนของโปรแกรมข้างล่างนี้ทำงานเสร็จ int x = 7; int y = 2; int z = 4;z x = x / y; y = z; y = z % 6; z = z / 2; ก. x=7 y=2 z=4 ข. x=3 y=4 z=2 ค. x=3 y=4 z=4 ง. x=7 y=2 z=2
ตัวอย่าง ความแตกต่างของเครื่องหมาย = และ == เครื่องหมาย = เป็นตัวกำหนดค่า เครื่องหมาย == เป็นเครื่องหมายเปรียบเทียบ ตัวอย่างเช่น หมายถึง เป็นการกำหนดค่าให้กับตัวแปร point ให้มีค่าเท่ากับ 30 หมายถึง เป็นการตรวจสอบว่าค่า point มีค่าเท่ากับ 30 หรือไม่ point = 30; point == 30;
ตัวดำเนินการเพิ่มค่าและตัวดำเนินการลดค่า (Increment & Decrement) ตัวดำเนินการ ++ จะบวกหนึ่งเข้ากับตัวแปรที่ถูกดำเนินการ ตัวดำเนินการ -- จะลบหนึ่งออกจากตัวแปรที่ถูกดำเนินการ
ตัวอย่าง จงเขียนผลลัพธ์ของโปรแกรมต่อไปนี้ ตัวอย่าง จงเขียนผลลัพธ์ของโปรแกรมต่อไปนี้ b= 3 a= 3 b= 4 c=3 //increment.c #include <stdio.h> int main() { int a = 2,b,c; b = ++a; printf(“b= %d a= %d\n”,b,a); c = b++; printf(“b= %d c= %d\n”,b,c); return 0; }
การแปลงชนิดข้อมูล การแปลงชนิดข้อมูล เกิดขึ้นได้ 3 ทางด้วยกัน ทางที่ 1 การแปลงผ่านเครื่องหมาย = int a = 3; double y=a; printf("y %f",y); // 3.000 ทางที่ 2 การแปลงเมื่อเกิดการดำเนินการ เมื่อ a * b โดย a และ b เป็น int int a = 3,b,c; float y=1.5; printf("%f",(a*y)); //4.5000 ทางที่ 3 การแปลงผ่านการทำคาสติ้ง (Casting)
//cast.c #include <stdio.h> int main() { int a =10, b=4; double x1,x2,x3; printf("a/b= %d \n",(a/b)); x1=a/b; printf("x1= %f \n",x1); x2= (double)(a/b); printf("x2= %f \n",x2); x3= (double)a/b; printf("x3= %f \n",x3); return 0; }
ตัวดำเนินการประกอบ (Compound Operator) เป็นรูปย่อของตัวดำเนินการและตัวแปรที่ถูกดำเนินการ ตัวอย่างเช่น x = x + 1; เขียนแทนได้ด้วย x += 1; a = a - b; เขียนแทนได้ด้วย a -= b; x = x * 2; เขียนแทนได้ด้วย x *= 2; y = y / 5; เขียนแทนได้ด้วย y /= 5;
ตัวอย่าง num2=11 จากคำสั่งต่อไปนี้ จงหาค่าของตัวแปร num2 int num1 = 3,num2 = 1; num1 *= 4; num2 += num1 - 2; จงหาค่าของตัวแปร num2 num2=11
ขอบเขตของตัวแปร ตัวแปรถูกประกาศได้ทั้งภายนอก และภายในฟังก์ชัน ตัวแปรที่ถูกประกาศภายในฟังก์ชัน ถูกสร้างขึ้น เมื่อฟังก์ชันเริ่มทำงาน ถูกทำลาย เมื่อฟังก์ชันจบการทำงาน เป็นที่รู้จัก ภายในเครื่องหมาย { และ } ของฟังก์ชันที่มีการประกาศเท่านั้น ไม่สามารถอ้างอิงจากฟังก์ชันอื่นได้ แม้ว่า ตัวแปรนั้นยังไม่ได้ถูกทำลาย ตัวแปรที่ถูกประกาศภายนอกฟังก์ชัน (ในเบื้องต้น นศ. ไม่ควรใช้ตัวแปรลักษณะนี้) ถูกสร้างขึ้น และดำรงอยู่ ตลอดการทำงานของโปรแกรม เป็นที่รู้จัก ในทุกๆ ฟังก์ชันภายในไฟล์เดียวกัน สามารถรู้จักกันต่างไฟล์ได้ โดยใช้ตัวปรับปรุง extern
ตัวอย่างการใช้ตัวแปรภายใน // internal.c #include <stdio.h> void my_func(); int main() { double x = 1.1; my_func(); printf(“In main x = %f\n”,x); return 0; } void my_func() double x; x = 2.5; printf(“In my_func x = %f\n”,x);
ตัวอย่างการใช้ตัวแปรภายนอก //external.c #include <iostream.h> double x; void my_func(); int main() { x = 1.1; my_func(); printf(“In main x = %f\n”,x); return 0; } void my_func() x = 2.5; printf(“In my_func x = %f\n”,x);
ตัวแปรภายในที่มีชื่อเดียวกับตัวแปรภายนอก // variable.c #include <stdio.h> double x; void my_func(); int main() { double x = 1.1; my_func(); printf(“In main x = %f\n”,x); return 0; } void my_func() x = 2.5; printf(“In my_func x = %f\n”,x);
การแสดงผลและการรับค่า นิพจน์กับการแสดงผลและการรับค่า การแสดงผล การรับค่า
นิพจน์กับการแสดงผลและรับค่า คอมพิวเตอร์สามารถแสดงผลได้หลายรูปแบบเช่น ข้อความ ภาพ เสียง การเขียนโปรแกรมชั้นตอนเป็นการแสดงผลด้วยข้อความ ภาษา C ไม่ว่าจะเป็นการแสดงผลหรือรับค่าเบื้องต้น จะทำผ่านข้อความ สิ่งที่ต้องการแสดงผลต้องแปลงจากนิพจน์ต่างๆ ไปเป็นข้อความ สิ่งที่ต้องการนำเข้าจะต้องแปลงจากข้อความเป็นนิพจน์
นิพจน์กับการแสดงผล ฟังก์ชัน printf ถูกเรียกด้วย printf(“%d”, x) x ตัวแปรหรือค่าคงที่ใน RAM (ถูกประกาศผ่าน int x;) และปัจจุบันเก็บค่าในเลขฐาน 2 แปลงตัวแปร x ตามรูปแบบที่กำหนด เพื่อเปลี่ยนให้เป็นข้อความ แล้วนำไปแสดงผลบนหน้าจอ 10
นิพจน์กับการรับค่า ฟังก์ชัน printf ถูกเรียกด้วย scanf(“%d”, &x) x 10 แปลงข้อความที่ได้รับเป็น ชนิดตามรูปแบบที่กำหนด และกำหนดให้นำค่าไปใส่ตัวแปร x x ตัวแปรหรือค่าคงที่ใน RAM (ถูกประกาศผ่าน int x;) และปัจจุบันเก็บ เลขฐาน 2 โปรแกรมหยุดรอรับค่าจากผู้ใช้ ผู้ใช้พิมพ์ 1 และ 0 ซึ่งเป็นข้อความปรากฏบนหน้าจอ ข้อความถูกส่งไปยัง scanf เมื่อผู้ใช้กด Enter
การแสดงผล ใช้ฟังก์ชัน printf ในการรับค่า เช่น printf(“ %s has %d \n”, name, salary); %s และ %d เรียกว่า รหัสรูปแบบ หรือ format code พารามิเตอร์ตัวแรกคือรูปแบบของผลลัพธ์ตามด้วยนิพจน์ 0 หรือมากกว่า โดยให้มีจำนวนเท่ากับ format code ที่ระบุไว้ในรูปแบบ นิพจน์ที่กำหนดหลังรูปแบบ จะต้องมีชนิดตรงหรือเทียบเท่าตามระบุไว้ใน format code
การรับค่า ใช้ฟังก์ชัน scanf ในการรับค่า เช่น scanf(“%d”, &x); โดยพารามิเตอร์ตัวแรกคือ รูปแบบ และตัวหลังคือตัวแปร (เป็นนิพจน์ไม่ได้) ที่มีชนิดตรงหรือเทียบเท่ากับที่ระบุไว้ใน format code ตัวแปรที่ตามหลังจะต้องมีการระบุเครื่องหมาย & ยกเว้นสำหรับข้อความเท่านั้น
Escape sequence หรือ รหัสควบคุม สำหรับอักขระพิเศษ \a เสียง beep \t แท็ปในแนวนอน (tab) \n ขึ้นบรรทัดใหม่ (new line) \” Double Quote “ \’ Single Quote ‘ //print.c #include<stdio.h> int main(){ printf("Welcome\t\tto my program\n"); printf("C language is\teasy\n\n"); printf("\"Good bye\"\n"); return 0; }
ตัวอย่าง จงเพิ่มเติมโปรแกรมเพื่อรับค่า น้ำหนัก (weight)แล้วแสดงผลลัพธ์ //input.c #include<stdio.h> int main(){ char name[100]; int salary; printf("Please enter your name: "); scanf("%s", name); printf("Please enter your salary: "); scanf("%d", &salary); printf("%s gets %d\n", name, salary); } จงเพิ่มเติมโปรแกรมเพื่อรับค่า น้ำหนัก (weight)แล้วแสดงผลลัพธ์
Format Code ที่ควรรู้ %c = อักขระ หรือ ตัวอักษรหนึ่งตัว (character) %d = ตัวเลขจำนวนเต็ม (decimal integer) %f = เลขทศนิยม (floating-point number) %.2f = เลขทศนิยม 2 ตำแหน่ง %o = เลขฐานแปด (octal number) %s = ข้อความ (string)
Example #include<stdio.h> int main() { int a = 14, b = 3; int i = 10, j = 2, k = 5, x = 4, y = 5; /*Difference between / and % */ printf("Difference between / and %\n"); printf("a = %3d , b = %3d \n",a,b); printf("a/b = %3d \n",a/b); printf("a%%b = %3d \n\n",a%b); return 0; }
Example #include<stdio.h> int main() { int a = 14, b = 3; int i = 10, j = 2, k = 5, x = 4, y = 5; /*Using casting*/ printf("Using casting\n"); printf("(float) a/b = %f\n\n",(float)a/b); return 0; }
Example #include<stdio.h> int main() { int a = 14, b = 3; int i = 10, j = 2, k = 5, x = 4, y = 5; /*Precedence of arithmetic operators*/ printf("Precedence of arithmetic operators\n"); printf("i = 10, j = 2, k = 5, x = 4, y = 5\n"); printf("i+j*k = %d\n",i+j*k); printf("(i+j)*k = %d\n",(i+j)*k); printf("i+(j*k) = %d\n",i+(j*k)); printf("x*y+i/10*k-8 = %d\n",x*y+i/10*k-8); return 0; } Precedence of arithmetic operators i = 10, j = 2, k = 5, x = 4, y = 5 i+j*k = 20 (i+j)*k = 60 i+(j*k) = 20 x*y+i/10*k-8 = 17 20 + 5 - 8
All integer numbers except 0 mean “true” (1) #include <stdio.h> int main () { int i,j; printf("Enter the value of i: "); scanf("%d",&i); printf("\nEnter the value of j: "); scanf("%d",&j); /* Logical Operator */ printf("\nUsing Logical Operator\n"); printf(" i&&j is %d\n",i&&j); printf(" i||j is %d\n",i||j); printf(" !i is %d\n",!i); printf(" !j is %d\n",!j); return 0; } Example All integer numbers except 0 mean “true” (1)
กรณีศึกษาข้อผิดพลาดที่เกิดขึ้น Case 1: ลืมปิดปีกกาของ main Case 2: พิมพ์คำว่า #include ผิด Case 3: พิมพ์ stdio.h ผิด Case 4: พิมพ์ชื่อฟังก์ชัน main ผิด Case 5: ลืม ; Case 6: ลืม ; อีกครั้ง Case 7: ลืม ; หลาย ๆ จุด Case 8: ลืมประกาศตัวแปร 68
กรณีศึกษาข้อผิดพลาดที่เกิดขึ้น (ต่อ) Case 9: ลืมปิดวงเล็บเวลาใช้ printf หรือ scanf Case 10: ลืมเปิดวงเล็บเวลาใช้ printf หรือ scanf Case 11: ลืมปิดเครื่องหมายคำพูด Case 12: ลืมเปิดเครื่องหมายคำพูด Case 13: ลืมเปิดวงเล็บเครื่องหมายคำพูด Case 14: เอาตัวแปรไปใส่ค่าคงที่ ข้อผิดพลาดบางอย่าง คอมไพเลอร์เตือนเราไม่ได้ 69
Case 1: ลืมปิดปีกกาของ main #include<stdio.h> main(){ ข้อความแสดงข้อผิดพลาด In function `main': syntax error at end of input การตีความ รูปแบบมีข้อผิดพลาดตอนท้ายของโปรแกรม
Case 2: พิมพ์คำว่า #include ผิด #inlude<stdio.h> main(){ } ข้อความแสดงข้อผิดพลาด Line 1: invalid preprocessing directive #inlude การตีความ ส่วนของ preprocessor ไม่ถูกต้อง ในส่วนของ #inlude
Case 3: พิมพ์ stdio.h ผิด #include<stio.h> main(){ } ข้อความแสดงข้อผิดพลาด Line 1: stio.h: No such file or directory. การตีความ ไม่มีไฟล์ที่กำหนด ให้ตรวจสอบชื่อไฟล์ให้ถูกต้อง
Case 4: พิมพ์ชื่อฟังก์ชัน main ผิด #include<stdio.h> man(){ } ไม่มีข้อผิดพลาดในการคอมไพล์ ผิดพลาดในขณะลิงค์ [Linker error] undefined reference to `WinMain@16' ld returned 1 exit status ไม่สามารถหา main ฟังก์ชันได้
Case 5: ลืม ; #inlude<stdio.h> main(){ int x } ข้อความแสดงข้อผิดพลาด In function main: Line 4: syntax error before '}' token การตีความ ไปยังบรรทัดที่ 4 และมองหาคำสั่งในบรรทัดก่อนหน้าว่าตกหล่น ; หรือไม่
Case 6: ลืม ; อีกครั้ง #inlude<stdio.h> main(){ int x x = 2; } ข้อความแสดงข้อผิดพลาด In function main: Line 4: syntax error before "x" การตีความ ไปยังบรรทัดที่ 4 และมองหาคำสั่งในบรรทัดก่อนหน้าว่าตกหล่น ; หรือไม่
Case 7: ลืม ; หลาย ๆ จุด ข้อความแสดงข้อผิดพลาด #inlude<stdio.h> main(){ int x x = 2 } ข้อความแสดงข้อผิดพลาด In function main: Line 4: syntax error before "x" คอมไพเลอร์บอกแค่อันเดียว ให้แก้ทีละจุด
Case 8: ลืมประกาศตัวแปร #inlude<stdio.h> main(){ x = 2; } ข้อความแสดงข้อผิดพลาด In function main: Line 3: `x' undeclared (first use in this function) การตีความ สังเกตจากหมายเลขบรรทัดจากนั้น ดูว่าตัวแปรใด ที่อยู่ภายใน ‘… ‘ ที่ถูกระบุว่า ไม่ได้ประกาศ (undeclared) ก่อนนำมาใช้งาน
Case 9: ลืมปิดวงเล็บเวลาใช้ printf หรือ scanf #inlude<stdio.h> main(){ printf("Hi\n"; } ข้อความแสดงข้อผิดพลาด In function main: Line 3: syntax error before ';' token การตีความ มีข้อผิดพลาดเกิดขึ้นที่บรรทัดที่ 3 และมีข้อผิดพลาดก่อน(syntax error befor)จะส่วนของโปรแกรม(token) ;
Case 10: ลืมเปิดวงเล็บเวลาใช้ printf หรือ scanf #inlude<stdio.h> main(){ printf"Hi\n"); } ข้อความแสดงข้อผิดพลาด In function main: Line 3: syntax error before string constant การตีความ บรรทัดที่ 3 มีรูปแบบผิดพลาดก่อนจะเริ่มชุดข้อความ “…”
Case 11: ลืมปิดเครื่องหมายคำพูด #inlude<stdio.h> main(){ printf("Hi\n); } ข้อความแสดงข้อผิดพลาด In function main: Line 3: missing terminating " character Line 4: syntax error before '}' token การตีความ บรรทัดที่ 3 ขาดเครื่องหมายปิดข้อความ (”) ทำให้เกิดข้อผิดพลาดอื่น ๆ ตามมาให้ทำการแก้ข้อผิดพลาดที่อยู่ตอนต้นสุดก่อน
Case 12: ลืมเปิดเครื่องหมายคำพูด #inlude<stdio.h> main(){ printf(Hi\n"); } In function main: Line 3: stray '\' in program Line 3: `Hi' undeclared (first use in this function) Line 3: syntax error before "n" Line 3: missing terminating " character การตีความ บรรทัดที่ 3 เนื่องจากตกเครื่องหมายคำพูดของข้อความ ทำให้คอมไพเลอร์ตีความ คำต่าง ๆ ในข้อความ และแสดงข้อผิดพลาดมากมาย เพราะคำเหล่านั้นไม่ตรงหลักการ
Case 13: ลืมเปิดวงเล็บเครื่องหมายคำพูด #include<stdio.h> main(){ printfHi\n"); } In function main: Line 3: stray '\' in program Line 3: `printfHi' undeclared (first use in this function) Line 3: syntax error before "n" Line 3: missing terminating " character ตีความ เช่นเดียวกับการลืมเครื่องหมายคำพูดแต่ยิ่งผิดพลาดมากกว่าเพราะทำให้คำสั่ง printf ผิดพลาดไปด้วย นั้นคือเป็นคำสั่งที่ไม่รู้จัก
Case 14: เอาตัวแปรไปใส่ค่าคงที่ #include<stdio.h> main(){ int x; 2 = x; } In function main: Line 4: invalid lvalue in assignment การตีความ บรรทัดที่ 4 การให้ค่าไม่ถูกต้องเนื่องจาก ค่าทางซ้าย(lvalue-left value)ควรเป็นตัวแปร
ข้อผิดพลาดบางอย่าง คอมไพเลอร์เตือนเราไม่ได้ int x; scanf("%d"); //very dangerous!! scanf("%d", x); //forgot & printf("%d"); printf("Hi", x);
สรุปกฎสำคัญ ซอร์สโค้ดเกิดจากการผสมคำและสัญลักษณ์ คอมไพล์และลิงค์ เป็นโปรแกรมที่บรรจุภาษาเครื่อง ค่าคงที่ในโปรแกรมอยู่ในรูปของตัวเลข ทศนิยม ตัวอักษร (ภายใต้เครื่องหมาย ' ') และ ข้อความ (ภายใต้เครื่องหมาย " ") ตัวแปรต้องถูกประกาศก่อนการใช้งาน โดยระบุชื่อ และชนิดของข้อมูล การใช้ชื่อของตัวแปรหลังการประกาศ เป็นการใช้ค่าข้อมูลที่ตัวแปรจำไว้ ฟังก์ชันมีสัญลักษณ์ระบุขอบเขต คือ { และ } คำสั่งต้องจบด้วยเครื่องหมาย ;
สรุปกฎสำคัญ การดำเนินการ ผลลัพธ์จะได้นิพจน์ตามชนิดข้อมูลของตัวถูกดำเนินการชนิดที่ใหญ่ที่สุด การใช้เครื่องหมาย = ทางซ้ายต้องเป็นตัวแปรเท่านั้น ทางขวาเป็นนิพจน์ที่มีชนิดเทียบเท่าหรือขยายให้เป็นชนิดเดียวกับตัวแปรได้ (ยกเว้นการใช้ casting) การเรียกใช้ฟังก์ชัน พารามิเตอร์จะต้องเป็นนิพจน์ชนิดเดียวกับที่ระบุไว้ในต้นแบบของฟังก์ชัน การเรียกใช้ฟังก์ชันที่มีการคืนค่า ถือเป็นนิพจน์ที่มีชนิดเดียวกับที่ระบุไว้ในต้นแบบของฟังก์ชัน และมีค่าข้อมูลเป็นค่าที่คืนกลับมา
สรุปกฎสำคัญ ตัวแปร ถือเป็นนิพจน์ แต่นิพจน์ไม่ใช่ตัวแปร การแสดงผลต้องกำหนดรูปแบบ และถ้าในรูปแบบนั้นมีการกำหนด Format Code พารามิเตอร์ที่ตามหลังรูปแบบ ต้องเป็น นิพจน์ ชนิดเดียวกันหรือเทียบเท่า การรับค่า พารามิเตอร์จะต้องเป็น ตัวแปร ที่มีชนิดตามที่ระบุไว้ใน Format Code และต้องมีการใส่ & หน้าตัวแปร (ยกเว้นตัวแปรแบบ string (ข้อความ) หรืออาร์เรย์)
เอกสารอ้างอิง คณาจารย์ผู้สอนวิชา Introduction to Computer Programming, เอกสารประกอบการบรรยายวิชา 241-101 Introduction to Computer Programming, คณะวิศวกรรมศาสตร์, มหาวิทยาลัยสงขลานครินทร์, 2551 อ.สุธน แซ่ว่อง, เอกสารประกอบการบรรยายอบรมภาษาซีเบื้องต้น, คณะวิศวกรรมศาสตร์, มหาวิทยาลัยสงขลานครินทร์, 30 มีนาคม 2552 Y. D. Liang, Supplement II.C:Dev-C++ Tutorial for Introduction to C++ Programming, http://www.bloodshed.net/dev/devcpp.html ดร. แสงสุรีย์ วสุพงศ์อัยยะ, เอกสารประกอบการบรรยายอบรมภาษาซีเบื้องต้น, คณะวิศวกรรมศาสตร์, มหาวิทยาลัยสงขลานครินทร์, 30 มีนาคม 2552 ปรับปรุงโดย ดร. อนันท์ ชกสุริวงค์ ผศ. ดร. สกุณา เจริญปัญญาศักดิ์ ผศ. มัลลิกา อุณหวิวรรธน์ ดร. วโรดม วีระพันธ์ 88