การเขียนโปรแกรมด้วยภาษา 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> #include <iostream> #include<my.cpp>
includes stdio.h from include folder includes cpp class library header iostream includes my.cpp file from include folder
#include “my.h” #include “myfolder/abc.h”
includes my.h file from current working folder 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) • • • •
ภาษา C สามารถประกาศค่าคงที่ได้ รูปแบบ 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() ได้ฟังก์ชันเดียว สร้างฟังก์ชันหรือไลบรารีจัดเก็บไว้ในแต่ละไฟล์ได้ จัดเก็บไว้ภายในโฟลเดอร์เดียวกัน เรียกใช้ผ่านการประกาศไว้ก่อนฟังก์ชัน 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â&#x20AC;&#x2122;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
ตัวอย่างโปรแกรมที่เขียนด้วยภาษาซี #include "stdio.h" #include "conio.h"
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---+---+---\n"); printf("\t\t\t\t %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); player = i%2 + 1;
void main(){ int i = 0; int player = 0; int go = 0; do{ printf("\n\t\tPlayer %d, please enter the number [your] %c: ", int row = 0; int column = 0; player,(player==1)?'X':'O'); scanf("%d", &go); int line = 0; row = --go/3; int winner = 0; column = go%3; char board[3][3] = }while(go<0 || go>9 || board[row][column]>'9'); { board[row][column] = (player == 1) ? 'X' : 'O'; {'1','2','3'}, if((board[0][0] == board[1][1] && board[0][0] == board[2][2]) || {'4','5','6'}, (board[0][2] == board[1][1] && board[0][2] == board[2][0])) {'7','8','9'} 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---+---+---\n"); 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); }
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; }
http://cpe-programming.blogspot.com/2012/10/xo.html
http://www.comscidev.com/howto/ตัวอย่างภาษาซี/
สรุป • การเขียนโปรแกรมด้วยภาษาซี จาเป็นต้องเข้าใจโครงสร้างและ องค์ประกอบของโค้ด • การแยกและประกอบส่วนของโปรแกรม โดยเขียนแยกแต่ละไฟล์แล้ว เรียกใช้งานได้ • ภาษาซีถือเป็นภาษาที่มีโครงสร้างชัดเจนและเป็นพื้นฐานในการเขียน โปรแกรมคอมพิวเตอร์ของภาษาต่างๆ