[0]zero-index clytie0x/zero-index

0.3 โปรแกรมแรก Hello World

โปรแกรมแรกของคนเรียนเขียนโปรแกรมแทบทุกคนบนโลก คือสั่งให้คอมพิวเตอร์พิมพ์คำว่า Hello, World! ออกมา ถ้าทำหน้านี้ได้ แปลว่าเครื่องพร้อม และน้องพร้อมเริ่มเรียนจริงแล้ว

ขั้นที่ 1 สร้างไฟล์

  1. เปิด Code::Blocks
  2. เมนู File > New > Empty file
  3. บันทึกทันทีก่อนพิมพ์อะไร กด Ctrl+S เลือกโฟลเดอร์ C:\code ตั้งชื่อ hello.c แล้วกด Save

ต้องบันทึกเป็น .c ก่อนพิมพ์

ถ้ายังไม่บันทึก Code::Blocks ไม่รู้ว่าไฟล์นี้เป็นภาษาอะไร ตัวหนังสือจะไม่มีสี และกดรันไม่ได้ พอบันทึกเป็น .c แล้ว ลองพิมพ์อะไรสักอย่าง จะเห็นคำสำคัญเปลี่ยนสี

ขั้นที่ 2 พิมพ์โค้ด

พิมพ์เองทีละตัว อย่าก๊อปวาง

#include <stdio.h>

int main()
{
    printf("Hello, World!\n");
    return 0;
}

ขั้นที่ 3 รัน

กด F9 (หรือเมนู Build > Build and run)

Code::Blocks จะแปลโค้ดด้วย gcc ได้ไฟล์ hello.exe แล้วเปิดหน้าต่างสีดำขึ้นมารันให้

Hello, World!

Process returned 0 (0x0)   execution time : 0.012 s
Press any key to continue.
หน้าต่างสีดำที่ขึ้น Hello, World!
  • บรรทัดแรกคือสิ่งที่โปรแกรมของเราพิมพ์
  • สองบรรทัดล่าง Code::Blocks เติมให้เอง บอกว่าโปรแกรมจบแล้ว และใช้เวลาเท่าไร ตอนส่งโจทย์จริง grader ไม่เห็นสองบรรทัดนี้ grader คือโปรแกรมที่ตรวจคำตอบอัตโนมัติในการแข่งขัน มันรันโค้ดของเราแล้วเทียบสิ่งที่พิมพ์ออกมากับคำตอบ
  • กดปุ่มอะไรก็ได้เพื่อปิดหน้าต่าง

ถ้าเห็น Hello, World! แปลว่าผ่านแล้ว

โค้ดแต่ละบรรทัดทำอะไร

#include <stdio.h> // (1)!

int main() // (2)!
{ // (3)!
    printf("Hello, World!\n"); // (4)!
    return 0; // (5)!
}
  1. ดึงชุดคำสั่งเรื่องรับและแสดงผล (standard input output) มาใช้ ถ้าไม่มีบรรทัดนี้ จะใช้ printf ไม่ได้
  2. main คือจุดเริ่มของโปรแกรม รันเมื่อไรจะเริ่มทำที่นี่เสมอ ทุกโปรแกรมต้องมี main หนึ่งตัว
  3. ปีกกาเปิดและปิดครอบคำสั่งทั้งหมดที่เป็นของ main
  4. printf พิมพ์ข้อความในเครื่องหมายคำพูดออกจอ \n คือขึ้นบรรทัดใหม่ และทุกคำสั่งต้องจบด้วย ;
  5. บอกว่าโปรแกรมจบแบบปกติ เลข 0 นี้คือที่มาของ Process returned 0 ในหน้าต่างดำ

กดที่วงกลมตัวเลขในโค้ดเพื่อดูคำอธิบายแต่ละบรรทัด

ลองเปลี่ยนดู

  1. เปลี่ยนข้อความเป็นชื่อตัวเองแบบตัวอังกฤษ เพราะหน้าต่างดำแสดงภาษาไทยเพี้ยน แล้วกด F9 อีกครั้ง
  2. ลบ \n ออก แล้วรัน สังเกตว่าบรรทัด Process returned ไปต่อท้ายตรงไหน
  3. เพิ่ม printf อีกบรรทัด ให้พิมพ์ข้อความสองบรรทัด

ลองทำให้พัง

เขียนโปรแกรมแล้วเจอ error เป็นเรื่องปกติที่สุด คนเขียนเก่งไม่ใช่คนที่ไม่เจอ error แต่คือคนที่ อ่าน error ออก ลองทำให้พังทีละแบบ แล้วกลับมาแก้ให้ถูกก่อนลองแบบถัดไป

เวลามี error ดูที่แท็บ Build messages ด้านล่างของ Code::Blocks จะบอกชื่อไฟล์ เลขบรรทัด และข้อความ ดับเบิลคลิกที่บรรทัดสีแดงจะกระโดดไปที่จุดนั้นในโค้ด

แท็บ Build messages ที่มี error สีแดง

แบบที่ 1 ลืม ;

ลบ ; หลัง printf(...) แล้วกด F9

hello.c:5:30: error: expected ';' before 'return'
    5 |     printf("Hello, World!\n")
      |                              ^
      |                              ;
    6 |     return 0;

อ่านแบบนี้

  • hello.c:5:30 คือไฟล์ hello.c บรรทัดที่ 5 ตัวอักษรที่ 30
  • expected ';' before 'return' คือ ควรมี ; ก่อนคำว่า return
  • compiler ถึงกับวาด ^ ชี้ และบอกว่าควรใส่ ; ตรงนั้น

แบบที่ 2 ลืม #include <stdio.h>

ลบบรรทัดแรกทิ้ง แล้วกด F9

hello.c:4:5: error: implicit declaration of function 'printf'
note: include '<stdio.h>' or provide a declaration of 'printf'

compiler ไม่รู้จัก printf เพราะเราไม่ได้ดึง stdio.h มา และมันบอกวิธีแก้มาให้เลยว่า include <stdio.h>

เว็บอื่นอาจบอกว่าแค่เตือน

compiler รุ่นเก่าแค่เตือนเรื่องนี้แล้วยอมรันต่อ แต่ GCC 14 ที่มากับ Code::Blocks 25.03 ถือเป็น error ถ้าไปเจอตัวอย่างในเว็บอื่นที่ไม่ตรงกับเครื่องเรา ให้เชื่อสิ่งที่เครื่องเราบอก

แบบที่ 3 กดรันซ้ำตอนหน้าต่างดำยังเปิดอยู่

กด F9 ให้หน้าต่างดำขึ้น อย่าเพิ่งปิด แล้วกลับไปที่ Code::Blocks กด F9 อีกครั้ง

ld.exe: cannot open output file hello.exe: Permission denied
collect2.exe: error: ld returned 1 exit status

hello.exe ตัวเก่ายังรันอยู่ Windows เลยไม่ยอมให้เขียนทับ แก้ด้วยการปิดหน้าต่างดำก่อนแล้วค่อยรันใหม่ error นี้เจอบ่อยมาก จำไว้ว่าไม่ได้แปลว่าโค้ดผิด

สรุป

  • ไฟล์ภาษา C ต้องลงท้ายด้วย .c และบันทึกก่อนเริ่มพิมพ์
  • F9 คือแปลแล้วรัน
  • error บอกเลขบรรทัดเสมอ อ่านจากบรรทัดแรกของ error ก่อน
  • ทุกคำสั่งจบด้วย ;

กลับไปเช็กรายการ ผ่านบทนี้เมื่อ ถ้าครบทุกข้อ พร้อมไปบทที่ 1 แล้ว