การเขียนโปรแกรมด้วยภาษา C อาจารย์สมเกียรติ ช่อเหมือน สาขาวิชาวิศวกรรมซอฟต์แวร์ คณะวิทยาศาสตร์และเทคโนโลยี (tko@webmail.npru.ac.th)
เนื้อหาที่สนใจ ภาษาซี (C Language) โครงสร้างภาษาซี การแยกไฟล์ของภาษาซี Preprocessor Commands & macro definitions ฟังก์ชันและการค่าส่งกลับ (Functions & Return Value) ตัวแปรและค่าคงที่ (Variables & Typed constant) คำสั่งและนิพจน์ (statement & Expressions) การแยกไฟล์ของภาษาซี ตัวแปลภาษาซี เครื่องมือที่รองรับการเขียนภาษาซี (IDEs for C/C++ Programming) ตัวอย่างการเขียนโปรแกรมภาษาซี http://1.bp.blogspot.com/-tw1caa8lBus/Vphe8RV3rwI/AAAAAAAAAKM/wAhp-ds7iQM/s1600/8.png
ภาษา C ภาษาซีเป็นภาษาที่นิยมในการเขียนโปรแกรมพื้นฐาน สามารถประยุกต์ใช้กับงานต่างๆ ได้แก่ ระบบปฏิบัติการคอมพิวเตอร์ การคำนวณทางคณิตศาสตร์ โปรแกรมทางไฟฟ้า อิเล็กทรอนิกส์และ ไมโครคอนโทรลเลอร์ ภาษาซีที่เป็นรากฐานของภาษาอื่นๆ ภาษาซีเป็นภาษาเชิงคำสั่ง https://th.wikipedia.org/wiki/ภาษาซี
โครงสร้างของโปรแกรมภาษาซี Preprocessor Commands Functions Variables Statements & Expressions Comments http://siwanatsirilert57170112.blogspot.com/2015/05/c-dennis-ritchie-c-b-ken-thomson-bcpl.html
Preprocessor Commands จัดการค่าเริ่มต้นของโปรแกรมจาก source code ก่อน compile จริง ดึงข้อมูลจากไฟล์อื่นมาใช้แทน เครื่องหมาย # หน้า คําสั่ง preprocessor directives https://www.codingunit.com/cplusplus-tutorial-preprocessor-directives
Preprocessor Commands https://www.tutorialspoint.com/cprogramming/c_preprocessors.htm http://marcuscode.com/lang/cpp/preprocessor-directives http://www.cs.science.cmu.ac.th/person/areerat/204216/LectureNote/CompilerDirective.pdf
Source file inclusion (#include) #include การรวมไฟล์อื่นเข้ากับ source program รูปแบบการใช้ดังนี้ #include <filename> หรือ #include “filename” เป็นไฟล์ข้อความ (text file) < > หมายถึง ไฟล์ใน system.s จากโฟลเดอร์ (C:\TC\INCLUDE) “” หมายถึง ไฟล์ใน directory เดียวกับ source code #include <stdio.h> includes stdio.h from include folder #include <iostream> includes cpp class library header iostream #include<my.cpp> includes my.cpp file from include folder #include “my.h” includes my.h file from current working folder #include “myfolder/abc.h” includes abc.h file from the myfolder which is available in current working folder https://www.codingunit.com/cplusplus-tutorial-preprocessor-directives
macro definitions (#define, #undef) การกำหนดค่าคงที่ด้วยสัญลักษณ์ (Symbolic Constant) คือ การตั้งชื่อให้กับข้อมูลที่มีค่าคงที่หรือ แทนคำสั่ง เพื่อสะดวกในการอ้างถึงและแก้ไขข้อมูล มักนิยมใช้เป็นตัวพิมพ์ใหญ่เพื่อให้แตกต่างจากตัวแปร รูปแบบ #define identifier replacement เช่น #define PI 3.1414 #define STR1 .C Programming Language #define PR printf
Predefined Macros
Conditional inclusions (#ifdef, #ifndef, #if, #endif, #else and #elif) คำสั่งที่ถูกใช้เพื่อตรวจสอบว่า macro directives ได้ถูกสร้างก่อนหน้านี้แล้วหรือไม่ และไม่สำคัญไม่ว่าค่ามันจะเป็นอะไร
Line control (#line) คำสั่งที่อนุญาติให้เราสามารถควบคุมว่าโปรแกรมจะแสดงข้อผิดพลาดอย่างไร
Error directive (#error) Error directive ถูกใช้เพื่อหยุดการคอมไพล์ในบางโอกาส มักจะถูกใช้กับ conditional directives ถ้ามีเงื่อนไขที่ตรง
ฟังก์ชัน (Functions) ฟังก์ชันหลัก ค่าเริ่มต้นของโปรแกรมภาษาซี ฟังก์ชันย่อย ฟังก์ชันพื้นฐาน ฟังก์ชันที่สร้างขึ้นเพื่อใช้งาน ประโยชน์ของฟังก์ชัน นำกลับมาใช้ซ้ำได้ ลดความซ้ำซ้อนในการเขียนโปรแกรม การแยกส่วนประกอบของโปรแกรม http://marcuscode.com/lang/c/functions
ฟังก์ชันหลัก Main() ภาษา C มีฟังก์ชันหลัก ชื่อ main() ฟังก์ชันหลักทำหน้าที่เป็นจุดเริ่มต้นสำหรับการรันโปรแกรม ควบคุมการทำงานของโปรแกรมด้วยการเรียกไปยังฟังก์ชันอื่น ๆ โปรแกรมมักจะหยุดการทำงานเมื่อสิ้นสุดการทำงานหลัก เมื่อมีการตรวจพบข้อผิดพลาดบางอย่าง อาจบังคับให้โปรแกรมสิ้นสุดลง http://www.businessnewsdaily.com/4686-how-to-start-a-business.html https://sunisara.wordpress.com/2012/05/25/
ฟังก์ชันที่สร้างขึ้นเพื่อใช้งาน 1 http://marcuscode.com/lang/c/functions
ค่าส่งกลับ (Return Value) ฟังก์ชันจะส่งค่ากลับไปให้กับฟังก์ชั่นที่เรียก ผ่านชื่อฟังก์ชัน ผลลัพธ์ของฟังก์ชัน (output) คำสั่ง return ค่าที่ต้องการส่งกลับ ระบุประเภทของผลลัพธ์ที่จะส่งค่ากลับ http://www.kktrade.co.th/kkicube/faq.php
ฟังก์ชันในภาษา C ฟังก์ชันรับข้อมูลและฟังก์ชันแสดงผลข้อมูล NetCDF-C Libraries http://www.unidata.ucar.edu/software/netcdf/docs/winbin.html
การประกาศตัวแปร (Variables) ตัวแปรและค่าคงที่ ประเภทของตัวแปร ขอบเขตของตัวแปร เฉพาะส่วน (local variable) ส่วนรวม (global variable) การกำหนดค่าตัวแปร https://www.codecademy.com/en/forum_questions/53a6b2c48c1ccc0d3d0039eb https://www.codecademy.com/en/forum_questions/514900b642e721e65d0003f1
ตัวแปรและค่าคงที่ ค่าคงที่ (constant) ไม่สามารถเปลี่ยนแปลงค่าในภายหลังได้ ตัวแปร (Variables) สามารถเปลี่ยนแปลงค่าได้ ใช้สำหรับเก็บข้อมูลในหน่วยความจำ ใช้ชื่ออ้างถึงข้อมูล (identifier) ตัวแปรถูกใช้เพื่อเก็บค่าของข้อมูลชนิดต่างๆ ได้ สามารถสร้างตัวแปรได้เป็นจำนวนมากโดยมีชื่อที่แตกต่างกัน รูปแบบของการประกาศตัวแปรในภาษา C type identifier; type identifier = value; http://www.whatprogramming.com/Java/java-variable-types-and-scope/ http://www.tenouk.com/Module8.html
ชนิดของตัวแปร ตัวแปรที่มีเครื่องหมาย * ไม่ใช่ตัวแปรของภาษา C ตามมาตรฐาน ANSI C http://www.mcuthailand.com/articles/mcs/Constant.html
ค่าคงที่ (Typed constant) รูปแบบ const data_type identifier = value; ประกาศค่าคงที่เหมือนกับตัวแปร แต่มีคำสั่ง const นำหน้า ทีที่สร้าง ค่าของข้อมูลอาจเป็นค่าคงที่หรือตัวแปรก็ได้ int i ; // สร้างตัวแปรชื่อ i สำหรับเก็บข้อมูลจำนวนเต็ม char data ; // สร้่างตัวแปรชื่อ data สำหรับเก็บข้อมูลชนิดตัวอักษร float num ; // สร้างตัวแปรชื่อ num สำหรับเก็บข้อมูลชนิดทศนิยม int num = 1 ; // สร้างตัวแปรชื่อ num สำหรับเก็บข้อมูลจำนวนเต็ม และมีค่าเริ่มต้นเท่ากับ 1 char font = 'A' ; // สร้างตัวแปรชื่อ font สำหรับเก็บข้อมูลชนิดตัวอักษร และมีค่าเริ่มต้นเป็น ASCII คือ A int x = 0xFF ; // สร้างตัวแปรชื่อ x สำหรับเก็บข้อมูลจำนวนเต็ม และมีค่าเริ่มต้นเป็น 0xFF อยู่ในรูปฐานสิบหก unsigned int x,y,z ; // สร้างตัวแปร 3 ตัว ชื่อ x, y และ z สำหรับเก็บข้อมูลจำนวนเต็ม แบบไม่คิดเครื่องหมาย http://www.mcuthailand.com/articles/mcs/Constant.html
executable statement & Expressions เครื่องคอมพิวเตอร์จะทำตามคำสั่ง (Statements) ในโปรแกรมที่สร้างขึ้น โปรแกรมคอมพิวเตอร์ ประกอบไปด้วยคำสั่งต่าง ๆ แต่ละคำสั่งจะเขียนด้วยตัวอักษรพิมพ์เล็ก ใช้เครื่องหมาย ; เพื่อให้รู้ว่าจบคำสั่ง นิพจน์ (Expressions) หมายถึง การนำตัวแปร (variables) หรือค่าคงที่ (constant) มาสัมพันธ์กันด้วยสัญลักษณ์ต่างๆ เช่น เครื่องหมายทางคณิตศาสตร์ (เช่น + - * / ) เครื่องหมายเปรียบเทียบ (เช่น > = <) เครื่องหมายตรรกะ (เช่น OR, NOR)
Expression statements http://www.cprogrammingexpert.com/C/Tutorial/fundamentals/expression_statement.aspx
คำสั่ง (Statements) Statement คือคำสั่งที่ใช้สั่งให้คอมพิวเตอร์ทำงานต่างๆ ซึ่งแบ่งออกได้เป็น 3 ประเภทคือ Expression Statement (operation) เครื่องหมายทางคณิตศาสตร์ (เช่น + - * / ) เครื่องหมายเปรียบเทียบ (เช่น > = <) เครื่องหมายตรรกะ (เช่น OR, NOR) Compound Statement {} Control Statement (if else, case, while, do while, for)
นิพจน์ (Expressions) การแทนค่า หรือการหาค่าของ data เช่น ตัวเลขหรือตัวแปร ประกอบด้วยสมาชิกเพียงตัวเดียว เช่นค่า constant ตัวแปร ประกอบด้วยตัวแปรหลายตัว สัมพันธ์กันด้วยเครื่องหมาย (operator) ตัวดำเนินการแบ่งออกได้เป็นหลายชนิดได้ดังนี้ Arithmetic operator Unary operator Relational and logical operator Assignment operator Condition operator
คำอธิบาย (Comments) //แบบบรรทัดเดียว /* แบบหลายบรรทัด */
C-Tokens คำที่ภาษาซี สงวนไว้ในการประมวลผล ไม่สามารถนำไปตั้งชื่อตัวแปรหรือฟังก์ชันได้ ตัวอย่างเช่น http://swamios.com/basic-elements/
การแยกไฟล์ของภาษาซี ไฟล์นามสกุล *.c เริ่มต้นที่ฟังก์ชัน main() สร้างฟังก์ชันหรือไลบรารีจัดเก็บไว้ในแต่ละไฟล์ได้ จัดเก็บไว้ภายในโฟลเดอร์เดียวกัน เรียกใช้ผ่านการประกาศไว้ก่อนฟังก์ชัน main() เรียกใช้ผ่านชื่อไฟล์ เรียกใช้ผ่านชื่อฟังก์ชัน สามารถรับส่งค่าระหว่างฟังก์ชันได้
ตัวอย่างการเขียนโปรแกรม
ตัวแปลภาษา ชุดแปลโปรแกรมของกนู (GNU Compiler Collection) หรือ (GCC) เป็นชุดโปรแกรมแปลโปรแกรมสำหรับแปลภาษาโปรแกรมต่าง ๆ พัฒนาโดยโครงการกนู (GNU) และแจกจ่ายเป็นซอฟต์แวร์เสรี โดยชุด GCC ถือว่าเป็นชุดคอมไพเลอร์มาตรฐานในระบบปฏิบัติการแบบยูนิกซ์ อย่างเช่น ลินุกซ์ หรือ Mac OS X เป็นต้น ชื่อเดิมของ GCC คือ GNU C Compiler เนื่องจากในระยะแรกถูกพัฒนาขึ้นเป็นคอมไพเลอร์ของภาษาซีเท่านั้น https://th.wikipedia.org/wiki/ชุดแปลโปรแกรมของกนู
เครื่องมือที่รองรับการเขียนภาษาซี การวิเคราะห์ภาษาที่ใช้จากนามสกุลของไฟล์ แล้วเรียกพรีโพรเซสเซอร์คอมไพเลอร์ แอสเซมเบลอร์ และ ลิงเกอร์ ตามลำดับ
Best IDEs for C/C++ Programming 1. Netbeans for C/C++ Development 2. Code::Blocks 3. Eclipse CDT(C/C++ Development Tooling) 4. CodeLite IDE 5. Bluefish Editor 6. Brackets Code Editor 8. Atom Code Editor 9. Sublime Text Editor 10. JetBrains CLion 11. Microsoft’s Visual Studio Code Editor 12. KDevelop 13. Geany IDE 14. Ajunta DeveStudio 15. The GNAT Programming Studio 16. Qt Creator 17. Emacs Editor 18. VI/VIM Editor http://www.tecmint.com/best-linux-ide-editors-source-code-editors/ http://ccm.net/download/c-c-21
ตัวอย่างโปรแกรมที่เขียนด้วยภาษาซี for( i = 0; i<9 && winner==0; i++){ clrscr(); printf("\n\n"); printf("\t\t\t\t %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("\t\t\t\t---+---+---\n"); printf("\t\t\t\t %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("\t\t\t\t %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); player = i%2 + 1; do{ printf("\n\t\tPlayer %d, please enter the number [your] %c: ", player,(player==1)?'X':'O'); scanf("%d", &go); row = --go/3; column = go%3; }while(go<0 || go>9 || board[row][column]>'9'); board[row][column] = (player == 1) ? 'X' : 'O'; if((board[0][0] == board[1][1] && board[0][0] == board[2][2]) || (board[0][2] == board[1][1] && board[0][2] == board[2][0])) winner = player; else for(line = 0; line <= 2; line ++){ if((board[line][0] == board[line][1] && board[line][0] == board[line][2])|| (board[0][line] == board[1][line] && board[0][line] == board[2][line])) winner = player; } clrscr(); printf("\n\n"); printf("\t\t\t\t %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("\t\t\t\t---+---+---\n"); printf("\t\t\t\t %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("\t\t\t\t %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); if(winner == 0) printf("\n\t\t\tHow boring, it is a draw\n"); else printf("\n\t\tCongratulations, player %d, YOU ARE THE WINNER!\n", winner); } #include "stdio.h" #include "conio.h" void main(){ int i = 0; int player = 0; int go = 0; int row = 0; int column = 0; int line = 0; int winner = 0; char board[3][3] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'} }; http://cpe-programming.blogspot.com/2012/10/xo.html http://www.comscidev.com/howto/ตัวอย่างภาษาซี/
สรุป การเขียนโปรแกรมด้วยภาษาซี จำเป็นต้องเข้าใจโครงสร้างและองค์ประกอบของโค้ด การแยกและประกอบส่วนของโปรแกรม โดยเขียนแยกแต่ละไฟล์แล้วเรียกใช้งานได้ ภาษาซีถือเป็นภาษาที่มีโครงสร้างชัดเจนและเป็นพื้นฐานในการเขียนโปรแกรมคอมพิวเตอร์ของภาษาต่างๆ