หน้าหลัก รายวิชาคอมพิวเตอร์ การเขียนโปรแกรมภาษา C (ปวช. 2)

การเขียนโปรแกรมภาษา C (C Programming)

หลักสูตรประกาศนียบัตรวิชาชีพ (ปวช. 2) สาขาวิชาเทคโนโลยีสารสนเทศ / คอมพิวเตอร์ธุรกิจ รหัสวิชา 20901-2005 จำนวน 2.0 หน่วยกิต ปูพื้นฐานการเขียนโปรแกรมเชิงโครงสร้าง สถาปัตยกรรมหน่วยความจำ พร้อมสื่อการสอน ใบงาน และเอกสารประเมินวิทยฐานะ ว.PA ครบวงจร

สมรรถนะวิชาชีพ หลักสูตร ปวช. 2
4 หน่วยการเรียนรู้หลัก
16 บทเรียนเจาะลึก
32+ แล็บฝึกปฏิบัติการ
สื่อ & แผน ว.PA พร้อมใช้งาน
4
หน่วยการเรียนรู้เข้มข้น
16
บทเรียนพร้อมคำอธิบาย
32+
แบบฝึกหัด & ข้อสอบปฏิบัติ
100%
สื่อพร้อมส่งงานวิชาการ / ว.PA
ศูนย์ดาวน์โหลดเอกสารวิชาการและสื่อนวัตกรรม (ภาษา C ปวช. 2)
รวบรวมไฟล์ต้นฉบับ สื่อการสอน สไลด์ ซอร์สโค้ดภาษา C (.c) และแผนการจัดการเรียนรู้มาตรฐาน สอศ. สำหรับครูและนักศึกษา
ตรวจสอบความถูกต้องทางวิชาการแล้ว
ประมวลรายวิชา (Syllabus)
เอกสารโครงสร้างรายวิชาภาษา C คำอธิบายรายวิชา จุดประสงค์ K-P-A ตารางจัดการเรียนรู้ 16 สัปดาห์ และเกณฑ์การวัดประเมินผล 100 คะแนน
ชุดใบงานฝึกปฏิบัติ 8 ชุด
ใบงานและแบบฝึกหัดการเขียนโปรแกรมภาษา C เชิงปฏิบัติการ 8 ฉบับ พร้อมเกณฑ์การให้คะแนนรูบริกส์ (Rubric) และแนวทางการเขียนโค้ดเฉลยสำหรับครู
เปิดดูชุดใบงานและเฉลย
แพ็กเกจซอร์สโค้ดภาษา C (.zip)
ไฟล์โค้ดภาษา C (.c) ครบทั้ง 16 บทเรียน มีการจัดระเบียบโครงสร้าง คอมเมนต์อธิบายอย่างละเอียด นำไปคอมไพล์บน GCC/Dev-C++ ได้ทันที
ดาวน์โหลด ZIP (16 ไฟล์)
สไลด์บรรยายอิเล็กทรอนิกส์
ชุดสไลด์สรุปเนื้อหาสำคัญ ผังงาน (Flowchart) สถาปัตยกรรมหน่วยความจำ พอยน์เตอร์ และ Syntax Cheatsheet สะดวกต่อการจัดกิจกรรมในห้องเรียน
คู่มือโครงงานคอมพิวเตอร์
แนวทางการพัฒนาโครงงานระบบสารสนเทศด้วยภาษา C ขนาดเล็ก รูปแบบรายงาน 5 บท และแบบฟอร์มการนำเสนอโครงงานเชิงประยุกต์
สารบัญบทเรียนภาษา C
หน่วยที่ 1: โครงสร้างและ I/O
บทที่ 1: วิวัฒนาการภาษา C บทที่ 2: main() และ printf() บทที่ 3: ตัวแปรและชนิดข้อมูล บทที่ 4: scanf() และตัวดำเนินการ
หน่วยที่ 2: โครงสร้างควบคุม
บทที่ 5: ตรรกศาสตร์และการเปรียบเทียบ บทที่ 6: if-else และ switch-case บทที่ 7: การวนซ้ำ for/while/do-while บทที่ 8: ลูปซ้อนลูปและ break/continue
หน่วยที่ 3: อาร์เรย์และพอยน์เตอร์
บทที่ 9: อาร์เรย์ 1 มิติ (1D Arrays) บทที่ 10: อาร์เรย์ 2 มิติ (2D Arrays) บทที่ 11: อักขระและสตริง (string.h) บทที่ 12: ตัวชี้หน่วยความจำ (Pointers)
หน่วยที่ 4: ฟังก์ชัน ไฟล์ & โครงงาน
บทที่ 13: ฟังก์ชันแบบแยกส่วน บทที่ 14: โครงสร้าง struct & typedef บทที่ 15: การจัดการไฟล์ (File I/O) บทที่ 16: โครงงานประยุกต์ Capstone
หน่วยที่ 1: โครงสร้างภาษา C และการประมวลผลพื้นฐาน

บทที่ 1: วิวัฒนาการและสถาปัตยกรรมภาษา C (C Language Architecture)

History, Compiling Process & Development Tools
2 คาบ (100 นาที)
K: เข้าใจประวัติและขั้นตอนการคอมไพล์ซอร์สโค้ดสู่ Machine Code P: ติดตั้งและตั้งค่าสภาพแวดล้อม Dev-C++ / VS Code GCC ได้ A: ตระหนักถึงความแม่นยำในการจัดโครงสร้างโปรแกรมภาษา C

ภาษา C (C Programming Language) พัฒนาขึ้นในปี ค.ศ. 1972 โดย Dennis Ritchie ณ Bell Labs เป็นภาษาประเภท High-Level ที่มีความสามารถในการเข้าถึงฮาร์ดแวร์ระดับต่ำได้ดี (Middle-level language) จึงนิยมใช้สร้างระบบปฏิบัติการ (Windows, Linux), ไดรเวอร์ และระบบสมองกลฝังตัว (Embedded Systems)

ขั้นตอนการแปลงโปรแกรมภาษา C สู่ไฟล์ที่ทำงานได้ (Executable .exe):

  • 1. Preprocessing: จัดการคำสั่งที่ขึ้นต้นด้วย # เช่น ดึงไลบรารี #include <stdio.h>
  • 2. Compiling: ตรวจสอบไวยากรณ์และแปลงซอร์สโค้ดเป็นภาษาแอสเซมบลี (Assembly)
  • 3. Assembling: แปลงโค้ดแอสเซมบลีเป็น Machine Code (.obj หรือ .o)
  • 4. Linking: เชื่อมโยง Object file เข้ากับ Library functions กลายเป็นไฟล์ 실행 (.exe)
C Program Source
/* โปรแกรมแรก: การจัดโครงสร้างโปรแกรมภาษา C */
#include <stdio.h>

int main(void) {
    // แสดงข้อความต้อนรับนักศึกษา ปวช. 2
    printf("========================================\n");
    printf("ยินดีต้อนรับสู่ห้องปฏิบัติการภาษา C (ปวช. 2)\n");
    printf("สาขาวิชาเทคโนโลยีสารสนเทศ วิทยาลัยอาชีวศึกษา\n");
    printf("========================================\n");

    return 0; // คืนค่า 0 บ่งบอกว่าระบบทำงานสำเร็จสมบูรณ์
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
========================================
ยินดีต้อนรับสู่ห้องปฏิบัติการภาษา C (ปวช. 2)
สาขาวิชาเทคโนโลยีสารสนเทศ วิทยาลัยอาชีวศึกษา
========================================
กฎเหล็กของภาษา C: ภาษา C เป็น Case-Sensitive (พิมพ์เล็กพิมพ์ใหญ่มีความหมายต่างกัน) และทุกคำสั่งต้องปิดท้ายด้วยเครื่องหมายเซมิโคลอน ; (Semicolon) เสมอ มิฉะนั้นคอมไพเลอร์จะแจ้งข้อผิดพลาด error: expected ';'
ใบกิจกรรมฝึกปฏิบัติการ 1.1
ให้นักศึกษาเขียนโปรแกรมพิมพ์ข้อมูลประวัติส่วนตัว ได้แก่ ชื่อ-สกุล, ระดับชั้น ปวช. 2, สาขาวิชา และวิทยาลัยที่ศึกษา โดยจัดเป็นกรอบสวยงาม 4 บรรทัด
C Solution Guide
#include <stdio.h>

int main(void) {
    printf("****************************************\n");
    printf("* ชื่อ: นายสมชาย สดใส\n");
    printf("* ระดับชั้น: ปวช. 2 สาขาเทคโนโลยีสารสนเทศ\n");
    printf("* แผนกวิชาคอมพิวเตอร์ วิทยาลัยอาชีวศึกษา\n");
    printf("****************************************\n");
    return 0;
}
หน่วยที่ 1: โครงสร้างภาษา C และการประมวลผลพื้นฐาน

บทที่ 2: ฟังก์ชัน main() และการแสดงผลด้วย printf() (Formatted Output)

Main Function Structure, printf() & Escape Sequences
2 คาบ (100 นาที)
K: เข้าใจบทบาทของฟังก์ชัน main() และ Format Specifiers P: ใช้ฟังก์ชัน printf() ร่วมกับ Escape Sequences ได้ถูกต้อง A: ออกแบบข้อความผลลัพธ์บนคอนโซลที่อ่านง่ายเป็นระเบียบ

ทุกโปรแกรมในภาษา C จะเริ่มต้นทำงานที่ฟังก์ชัน main() เสมอ การส่งออกข้อมูลทางหน้าจอใช้ฟังก์ชันมาตรฐาน printf() ซึ่งต้องประกาศ #include <stdio.h>

รหัสควบคุมการแสดงผลและ Escape Sequences ที่สำคัญ:

  • \n : ขึ้นบรรทัดใหม่ (Newline)
  • \t : เลื่อนระยะแท็บแนวนอน (Horizontal Tab)
  • %% : พิมพ์เครื่องหมายเปอร์เซ็นต์ %
  • Format Specifiers: %d (จำนวนเต็ม), %f (ทศนิยม), %c (อักขระ 1 ตัว), %s (ข้อความสตริง)
C Program Source
#include <stdio.h>

int main(void) {
    int student_code = 6720901;
    char grade_char = 'A';
    float gpa = 3.85f;

    printf("--- รายงานข้อมูลการลงทะเบียน (ปวช. 2) ---\n");
    printf("รหัสนักศึกษา:\t%d\n", student_code);
    printf("กลุ่มเรียน:\t%s\n", "ทส.2/1");
    printf("ระดับผลการเรียน:\t%c\n", grade_char);
    printf("เกรดเฉลี่ย (GPA):\t%.2f (คะแนนดีเด่น)\n", gpa);

    return 0;
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
--- รายงานข้อมูลการลงทะเบียน (ปวช. 2) ---
รหัสนักศึกษา:	6720901
กลุ่มเรียน:	ทส.2/1
ระดับผลการเรียน:	A
เกรดเฉลี่ย (GPA):	3.85 (คะแนนดีเด่น)
Pro-Tip การจัดทศนิยม: การใส่ %.2f จะปัดเศษทศนิยมแสดงผล 2 ตำแหน่ง หากต้องการกำหนดความกว้างขั้นต่ำของช่อง เช่น 8 ตัวอักษร สามารถใส่ %8.2f ช่วยให้ตัวเลขตรงหลักกันอย่างสวยงาม
ใบกิจกรรมฝึกปฏิบัติการ 1.2
ให้นักศึกษาเขียนโปรแกรมแสดงผลใบเสร็จรายการอุปกรณ์การเรียน 3 รายการ โดยใช้ \t จัดคอลัมน์รายการและราคาให้ตรงกัน
C Solution Guide
#include <stdio.h>

int main(void) {
    printf("รายการ\t\tจำนวน\tราคา(บาท)\n");
    printf("------------------------------------\n");
    printf("สมุดกราฟ\t\t2\t40.00\n");
    printf("ปากกา Stylus\t1\t120.00\n");
    printf("แฟลชไดรฟ์ 64GB\t1\t250.00\n");
    printf("------------------------------------\n");
    printf("ยอดรวมทั้งสิ้น:\t\t410.00 บาท\n");
    return 0;
}
หน่วยที่ 1: โครงสร้างภาษา C และการประมวลผลพื้นฐาน

บทที่ 3: ตัวแปร ชนิดข้อมูลพื้นฐาน และ sizeof (Variables & Data Types)

Fundamental Types, Memory Sizes & Type Casting
2 คาบ (100 นาที)
K: จำแนกชนิดข้อมูล int, float, double, char และขนาดไบต์ P: ประกาศตัวแปร ตรวจสอบขนาดด้วย sizeof และแปลงชนิดข้อมูล (Type Casting) A: เลือกชนิดข้อมูลที่ประหยัดหน่วยความจำอย่างคุ้มค่า

ภาษา C เป็นภาษา Statically-Typed คือต้องระบุชนิดข้อมูล (Data Type) อย่างชัดเจนขณะประกาศตัวแปร เพื่อให้คอมไพเลอร์จัดสรรพื้นที่ในหน่วยความจำได้อย่างถูกต้อง:

  • char (1 byte): เก็บอักขระเดี่ยวตามรหัส ASCII (ช่วงค่า -128 ถึง 127 หรือ 0 ถึง 255)
  • int (4 bytes): เก็บจำนวนเต็ม ช่วงประมาณ -2,147,483,648 ถึง 2,147,483,647
  • float (4 bytes): เก็บจำนวนจริงทศนิยมความละเอียดเดี่ยว (Single Precision ~6-7 หลัก)
  • double (8 bytes): เก็บจำนวนจริงทศนิยมความละเอียดคู่ (Double Precision ~15 หลัก)

คำสั่ง sizeof(type) ใช้ตรวจสอบขนาดของชนิดข้อมูลหรือตัวแปรในหน่วยความจำเป็นจำนวนไบต์

C Program Source
#include <stdio.h>

int main(void) {
    int age = 17;
    float weight = 65.50f;
    double bank_balance = 15420.75;
    char grade = 'A';

    printf("=== ตรวจสอบขนาดของชนิดข้อมูลในหน่วยความจำ ===\n");
    printf("char:   %zu ไบต์\tค่า: %c\n", sizeof(char), grade);
    printf("int:    %zu ไบต์\tค่า: %d\n", sizeof(int), age);
    printf("float:  %zu ไบต์\tค่า: %.2f\n", sizeof(float), weight);
    printf("double: %zu ไบต์\tค่า: %.2lf\n", sizeof(double), bank_balance);

    // การแปลงชนิดข้อมูล (Type Casting)
    int score_mid = 38, score_fin = 45;
    float average = (float)(score_mid + score_fin) / 2.0f;
    printf("คะแนนเฉลี่ย (แปลง int -> float): %.2f\n", average);

    return 0;
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
=== ตรวจสอบขนาดของชนิดข้อมูลในหน่วยความจำ ===
char:   1 ไบต์	ค่า: A
int:    4 ไบต์	ค่า: 17
float:  4 ไบต์	ค่า: 65.50
double: 8 ไบต์	ค่า: 15420.75
คะแนนเฉลี่ย (แปลง int -> float): 41.50
ข้อควรระวังเรื่อง Integer Division: ในภาษา C การนำจำนวนเต็มหารจำนวนเต็ม เช่น 5 / 2 จะได้ผลลัพธ์เป็น 2 (ตัดเศษทิ้ง) ต้องแปลงตัวแปรตัวใดตัวหนึ่งเป็น float ก่อนเสมอ เช่น (float)5 / 2 จึงจะได้ 2.5
ใบกิจกรรมฝึกปฏิบัติการ 1.3
ให้นักศึกษาเขียนโปรแกรมคำนวณอายุและขนาดหน่วยความจำของตัวแปร โดยรับปีเกิด พ.ศ. 2550 คำนวณอายุในปี พ.ศ. 2567 พร้อมแสดงขนาดของตัวแปรอายุด้วย sizeof
C Solution Guide
#include <stdio.h>

int main(void) {
    int birth_year = 2550;
    int current_year = 2567;
    int age = current_year - birth_year;

    printf("ปีเกิด: พ.ศ. %d\n", birth_year);
    printf("ปีปัจจุบัน: พ.ศ. %d\n", current_year);
    printf("อายุ: %d ปี (กินหน่วยความจำ %zu ไบต์)\n", age, sizeof(age));
    return 0;
}
หน่วยที่ 1: โครงสร้างภาษา C และการประมวลผลพื้นฐาน

บทที่ 4: การรับข้อมูลด้วย scanf() และตัวดำเนินการคณิตศาสตร์ (Input & Math Operators)

Formatted Input with scanf(), Address Operator & Arithmetic
2 คาบ (100 นาที)
K: เข้าใจการทำงานของฟังก์ชัน scanf() และเครื่องหมายแอมเพอร์แซนด์ (&) P: รับข้อมูลตัวเลขและอักขระ พร้อมคำนวณนิพจน์คณิตศาสตร์ได้ A: ระมัดระวังข้อผิดพลาดของ Input Buffer ในการรับข้อมูล

ฟังก์ชัน scanf() ทำหน้าที่รับข้อมูลจากแป้นพิมพ์ โดยมีข้อกำหนดสำคัญคือ ต้องส่งตำแหน่งหน่วยความจำ (Memory Address) ของตัวแปรด้วยการใส่เครื่องหมาย & (Address-of Operator) นำหน้าชื่อตัวแปร เช่น &age

ตัวดำเนินการคณิตศาสตร์พื้นฐาน:

  • บวก +, ลบ -, คูณ *, หาร /
  • หารเอาเศษ (Modulo) % : ใช้ได้เฉพาะกับจำนวนเต็ม (int) เท่านั้น เช่น 10 % 3 = 1
  • เพิ่มค่า/ลดค่า 1: ++ และ --
C Program Source
#include <stdio.h>

int main(void) {
    float unit_price = 120.0f; // จำลองค่ารับเข้า
    int quantity = 5;          // จำลองค่ารับเข้า

    float subtotal = unit_price * quantity;
    float vat = subtotal * 0.07f;
    float net_total = subtotal + vat;

    printf("--- ใบเสร็จชำระเงินสหกรณ์วิทยาลัย (ปวช. 2) ---\n");
    printf("ราคาสินค้าต่อหน่วย: %8.2f บาท\n", unit_price);
    printf("จำนวนสินค้า:       %8d ชิ้น\n", quantity);
    printf("ยอดรวมก่อนภาษี:     %8.2f บาท\n", subtotal);
    printf("ภาษีมูลค่าเพิ่ม (7%%): %8.2f บาท\n", vat);
    printf("ยอดสุทธิชำระ:      %8.2f บาท\n", net_total);

    return 0;
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
--- ใบเสร็จชำระเงินสหกรณ์วิทยาลัย (ปวช. 2) ---
ราคาสินค้าต่อหน่วย:   120.00 บาท
จำนวนสินค้า:              5 ชิ้น
ยอดรวมก่อนภาษี:       600.00 บาท
ภาษีมูลค่าเพิ่ม (7%):    42.00 บาท
ยอดสุทธิชำระ:        642.00 บาท
ข้อควรระวัง: การลืมใส่ & ใน scanf("%d", age); เป็นข้อผิดพลาดที่พบบ่อยที่สุด จะทำให้เกิดข้อผิดพลาด Segmentation Fault / Access Violation เพราะโปรแกรมพยายามเขียนข้อมูลลงตำแหน่งหน่วยความจำที่ไม่ได้รับอนุญาต
ใบกิจกรรมฝึกปฏิบัติการ 1.4
ให้นักศึกษาเขียนโปรแกรมคำนวณพื้นที่รูปสามเหลี่ยม: พื้นที่ = 0.5 * ฐาน * สูง โดยรับค่าฐานและสูงเป็นเลขทศนิยม และแสดงผลลัพธ์ทศนิยม 2 ตำแหน่ง
C Solution Guide
#include <stdio.h>

int main(void) {
    float base = 12.5f;
    float height = 8.0f;
    float area = 0.5f * base * height;

    printf("ฐาน: %.2f ซม.\n", base);
    printf("สูง: %.2f ซม.\n", height);
    printf("พื้นที่รูปสามเหลี่ยม = %.2f ตร.ซม.\n", area);
    return 0;
}
หน่วยที่ 2: โครงสร้างควบคุมและการตัดสินใจ

บทที่ 5: ตัวดำเนินการเปรียบเทียบและตรรกศาสตร์ (Relational & Logical Operators)

Relational Operators, Boolean Logic & Truth Tables in C
2 คาบ (100 นาที)
K: เข้าใจตรรกะค่าความจริง 1 (True) และ 0 (False) ในภาษา C P: สร้างนิพจน์เงื่อนไขที่ใช้ &&, || และ ! ได้อย่างแม่นยำ A: รอบคอบในการประเมินเงื่อนไขและจัดลำดับความสำคัญ

ในภาษา C ยุคดั้งเดิมไม่มีชนิดข้อมูล Boolean โดยเฉพาะ แต่จะใช้ตัวเลขจำนวนเต็ม:

  • 0 : แทนค่าความจริงเป็น เท็จ (False)
  • ตัวเลขอื่นที่ไม่ใช่ 0 (ส่วนใหญ่ใช้ 1) : แทนค่าความจริงเป็น จริง (True)

ตัวดำเนินการเปรียบเทียบ: ==, !=, >, <, >=, <=

ตัวดำเนินการตรรกศาสตร์: และ &&, หรือ ||, นิเสธ !

C Program Source
#include <stdio.h>

int main(void) {
    int midterm = 35;
    int attendance_pct = 85;

    int is_eligible = (midterm >= 30) && (attendance_pct >= 80);

    printf("--- ตรวจสอบสิทธิ์การสอบปลายภาค (ปวช. 2) ---\n");
    printf("คะแนนเก็บกลางภาค: %d คะแนน\n", midterm);
    printf("เวลาเรียนสะสม:     %d%%\n", attendance_pct);
    printf("ค่าความจริง (1=ผ่าน, 0=ไม่ผ่าน): %d\n", is_eligible);

    if (is_eligible) {
        printf("ผลการประเมิน: นักศึกษามีสิทธิ์เข้าสอบปลายภาคเรียน\n");
    } else {
        printf("ผลการประเมิน: หมดสิทธิ์สอบ (มส.)\n");
    }

    return 0;
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
--- ตรวจสอบสิทธิ์การสอบปลายภาค (ปวช. 2) ---
คะแนนเก็บกลางภาค: 35 คะแนน
เวลาเรียนสะสม:     85%
ค่าความจริง (1=ผ่าน, 0=ไม่ผ่าน): 1
ผลการประเมิน: นักศึกษามีสิทธิ์เข้าสอบปลายภาคเรียน
ข้อผิดพลาดร้ายแรงที่สุดในภาษา C: การเขียน if (x = 5) แทน if (x == 5) เครื่องหมาย = ตัวเดียวคือการกำหนดค่า (Assignment) ซึ่งจะได้ผลลัพธ์เป็น 5 (จริงเสมอ) ทำให้เงื่อนไขทำงานผิดพลาดตลอดเวลา
ใบกิจกรรมฝึกปฏิบัติการ 2.1
ให้นักศึกษาเขียนโปรแกรมตรวจสอบปีอธิกสุรทิน (Leap Year) ค.ศ. 2024 โดยใช้ตัวดำเนินการตรรกศาสตร์ && และ ||
C Solution Guide
#include <stdio.h>

int main(void) {
    int year = 2024;
    int is_leap = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);

    if (is_leap) {
        printf("ปี ค.ศ. %d เป็นปีอธิกสุรทิน (มี 366 วัน)\n", year);
    } else {
        printf("ปี ค.ศ. %d เป็นปีปกติสุรทิน (มี 365 วัน)\n", year);
    }
    return 0;
}
หน่วยที่ 2: โครงสร้างควบคุมและการตัดสินใจ

บทที่ 6: การตัดสินใจแบบเงื่อนไข if-else และ switch-case (Branching Logic)

Conditionals, Multi-way Selection & switch Statement
3 คาบ (150 นาที)
K: เข้าใจความแตกต่างระหว่าง if-else ladder และ switch-case P: เขียนโปรแกรมจำแนกเกรดและสร้างเมนูด้วย switch-case ได้ถูกต้อง A: วางเส้นทางการตัดสินใจอย่างครอบคลุมกรณี default

โครงสร้างแบบเลือกทำในภาษา C แบ่งออกเป็น 2 รูปแบบหลัก:

  • if - else if - else: เหมาะสำหรับเงื่อนไขที่มีการเปรียบเทียบช่วงตัวเลข เช่น การตัดเกรด
  • switch - case: เหมาะสำหรับการเปรียบเทียบค่าคงที่ที่แน่นอน เช่น เมนูตัวเลือก 1, 2, 3 หรือตัวอักษร 'A', 'B' แต่ละ case ต้องปิดท้ายด้วย break; เสมอ
C Program Source
#include <stdio.h>

int main(void) {
    int total_score = 84;

    printf("--- ผลการเรียนรายวิชาภาษา C (ปวช. 2) ---\n");
    if (total_score >= 80) {
        printf("คะแนน %d -> ระดับผลการเรียน 4 (ดีเยี่ยม)\n", total_score);
    } else if (total_score >= 70) {
        printf("คะแนน %d -> ระดับผลการเรียน 3 (ดี)\n", total_score);
    } else if (total_score >= 60) {
        printf("คะแนน %d -> ระดับผลการเรียน 2 (ปานกลาง)\n", total_score);
    } else if (total_score >= 50) {
        printf("คะแนน %d -> ระดับผลการเรียน 1 (ผ่านเกณฑ์)\n", total_score);
    } else {
        printf("คะแนน %d -> ระดับผลการเรียน 0 (ไม่ผ่านเกณฑ์)\n", total_score);
    }

    int menu = 2;
    printf("\nเลือกเมนูระบบ: %d\n", menu);
    switch (menu) {
        case 1: printf("-> [1] ลงทะเบียนเรียน ปวช. 2\n"); break;
        case 2: printf("-> [2] บันทึกคะแนนและประเมินผล ว.PA\n"); break;
        case 3: printf("-> [3] ออกรายงานเกรดเฉลี่ยประจำห้อง\n"); break;
        default: printf("-> เมนูไม่ถูกต้อง\n");
    }

    return 0;
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
--- ผลการเรียนรายวิชาภาษา C (ปวช. 2) ---
คะแนน 84 -> ระดับผลการเรียน 4 (ดีเยี่ยม)

เลือกเมนูระบบ: 2
-> [2] บันทึกคะแนนและประเมินผล ว.PA
Pro-Tip switch-case: ตัวแปรในคำสั่ง switch(variable) ต้องเป็นชนิด int หรือ char เท่านั้น ไม่สามารถใช้ float, double หรือ string ได้
ใบกิจกรรมฝึกปฏิบัติการ 2.2
ให้นักศึกษาเขียนโปรแกรมคำนวณส่วนลดตามยอดซื้อสินค้า: ยอดต่ำกว่า 500 ไม่ลด, 500-999 ลด 5%, 1,000-2,499 ลด 10%, 2,500 ขึ้นไป ลด 15% พร้อมแสดงยอดสุทธิ
C Solution Guide
#include <stdio.h>

int main(void) {
    float amount = 1850.0f;
    float discount = 0.0f;

    if (amount >= 2500.0f) discount = amount * 0.15f;
    else if (amount >= 1000.0f) discount = amount * 0.10f;
    else if (amount >= 500.0f) discount = amount * 0.05f;

    printf("ยอดซื้อ:  %.2f บาท\n", amount);
    printf("ส่วนลด:   %.2f บาท\n", discount);
    printf("ยอดสุทธิ: %.2f บาท\n", amount - discount);
    return 0;
}
หน่วยที่ 2: โครงสร้างควบคุมและการตัดสินใจ

บทที่ 7: โครงสร้างการวนซ้ำ for, while และ do-while (Repetition Structures)

Counted & Conditional Iterations in C
3 คาบ (150 นาที)
K: แยกแยะความแตกต่างระหว่าง for, while และ do-while P: ใช้คำสั่งวนลูปประมวลผลข้อมูลและตารางสูตรคูณได้ A: ระมัดระวังเงื่อนไขหยุดเพื่อไม่ให้เกิด Infinite Loop

โครงสร้างการวนซ้ำในภาษา C มี 3 รูปแบบ:

  • for loop: for (initial; condition; update) เหมาะสำหรับกรณีที่ทราบจำนวนรอบแน่นอน
  • while loop: while (condition) ตรวจสอบเงื่อนไขก่อนเข้าทำงาน
  • do-while loop: do { ... } while (condition); ทำงานในบล็อกอย่างน้อย 1 ครั้งแน่นอน ก่อนที่จะตรวจเงื่อนไข
C Program Source
#include <stdio.h>

int main(void) {
    printf("=== ตารางสูตรคูณแม่ 8 ===\n");
    for (int i = 1; i <= 12; i++) {
        printf("8 x %2d = %2d\n", i, 8 * i);
    }

    int sum = 0, n = 1;
    while (n <= 10) {
        sum += n;
        n++;
    }
    printf("\nผลรวมตัวเลข 1 ถึง 10: %d\n", sum);

    int attempts = 1;
    do {
        printf("ตรวจสอบสิทธิ์ครั้งที่ %d: สำเร็จ\n", attempts);
        attempts++;
    } while (attempts <= 1);

    return 0;
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
=== ตารางสูตรคูณแม่ 8 ===
8 x  1 =  8
8 x  2 = 16
...
8 x 12 = 96

ผลรวมตัวเลข 1 ถึง 10: 55
ตรวจสอบสิทธิ์ครั้งที่ 1: สำเร็จ
อย่าลืมเซมิโคลอนใน do-while: คำสั่ง do { ... } while (condition); ต้องมีเครื่องหมาย ; ปิดท้ายบรรทัดเสมอ แตกต่างจาก for และ while ทั่วไป
ใบกิจกรรมฝึกปฏิบัติการ 2.3
ให้นักศึกษาเขียนโปรแกรมคำนวณผลบวกของเลขคู่ตั้งแต่ 2 ถึง 50 ด้วย for loop และแสดงผลลัพธ์
C Solution Guide
#include <stdio.h>

int main(void) {
    int sum_even = 0;
    for (int i = 2; i <= 50; i += 2) {
        sum_even += i;
    }
    printf("ผลรวมเลขคู่ 2 ถึง 50 เท่ากับ: %d\n", sum_even);
    return 0;
}
หน่วยที่ 2: โครงสร้างควบคุมและการตัดสินใจ

บทที่ 8: ลูปซ้อนลูปและคำสั่งควบคุม break, continue (Nested Loops & Jump Controls)

Nested Loops, Pattern Generation & Loop Breaking
2 คาบ (100 นาที)
K: เข้าใจการทำงานของลูปชั้นนอก (Outer) และลูปชั้นใน (Inner) P: ใช้ break หยุดลูป และ continue ข้ามรอบได้ถูกต้อง A: พัฒนาอัลกอริทึมการพิมพ์รูปทรงเรขาคณิตด้วยลูปซ้อนลูป

ลูปซ้อนลูป (Nested Loops) คือการใส่โครงสร้างลูปไว้ภายในลูปอื่น มักใช้กับงานประมวลผลตาราง เมทริกซ์ หรือการพิมพ์รูปทรง:

  • ในการวน 1 รอบของลูปนอก ลูปในจะทำงานจนครบทุกรอบก่อนเสมอ
  • break: สั่งหยุดและออกจากลูปที่คำสั่งนั้นสังกัดอยู่ทันที
  • continue: ข้ามคำสั่งที่เหลือในรอบปัจจุบัน และเริ่มการวนรอบถัดไปทันที
C Program Source
#include <stdio.h>

int main(void) {
    int rows = 5;

    printf("=== การพิมพ์รูปทรงสามเหลี่ยมพีระมิด (ปวช. 2) ===\n");
    for (int i = 1; i <= rows; i++) {
        for (int space = 1; space <= (rows - i); space++) {
            printf(" ");
        }
        for (int star = 1; star <= (2 * i - 1); star++) {
            printf("*");
        }
        printf("\n");
    }

    printf("\nค้นหาตัวเลขเป้าหมาย 7:\n");
    for (int i = 1; i <= 10; i++) {
        if (i == 7) {
            printf("พบเลข %d แล้ว! สั่ง break ออกจากลูป\n", i);
            break;
        }
    }

    return 0;
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
=== การพิมพ์รูปทรงสามเหลี่ยมพีระมิด (ปวช. 2) ===
    *
   ***
  *****
 *******
*********

ค้นหาตัวเลขเป้าหมาย 7:
พบเลข 7 แล้ว! สั่ง break ออกจากลูป
Pro-Tip: คำสั่ง break จะพาออกจากลูปชั้นในสุดเพียงชั้นเดียวเท่านั้น หากต้องการออกจากลูปทั้ง 2 ชั้นพร้อมกัน ต้องใช้ตัวแปร flag หรือใช้คำสั่ง return ในฟังก์ชัน
ใบกิจกรรมฝึกปฏิบัติการ 2.4
ให้นักศึกษาเขียนโปรแกรมพิมพ์แม่สูตรคูณตั้งแต่แม่ 2 ถึงแม่ 4 โดยใช้ลูปซ้อนลูป
C Solution Guide
#include <stdio.h>

int main(void) {
    for (int m = 2; m <= 4; m++) {
        printf("--- แม่ %d ---\n", m);
        for (int i = 1; i <= 12; i++) {
            printf("%d x %2d = %2d\n", m, i, m * i);
        }
        printf("\n");
    }
    return 0;
}
หน่วยที่ 3: โครงสร้างข้อมูล อาร์เรย์ สตริง และพอยน์เตอร์

บทที่ 9: อาร์เรย์ 1 มิติ (1D Arrays & Linear Data Processing)

One-Dimensional Arrays, Indexing, Sum & Search
2 คาบ (100 นาที)
K: เข้าใจแนวคิดอาร์เรย์และตำแหน่งดัชนี (Index เริ่มต้นจาก 0) P: ประกาศ กำหนดค่า และประมวลผลค่าเฉลี่ย/ค่าสูงสุดในอาร์เรย์ได้ A: ตระหนักถึงความปลอดภัยของขนาดอาร์เรย์ (Array Bound Check)

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

  • การประกาศตัวแปร: data_type array_name[size]; เช่น int scores[5];
  • การเข้าถึงข้อมูลใช้ดัชนี (Index) เริ่มต้นจาก 0 ถึง size - 1
  • การคำนวณสถิติ เช่น ผลรวม, ค่าเฉลี่ย, ค่าสูงสุด-ต่ำสุด ทำได้สะดวกด้วยการใช้ for loop
C Program Source
#include <stdio.h>

int main(void) {
    int scores[5] = {78, 85, 92, 64, 88};
    int total = 0;
    int max = scores[0];

    printf("=== รายงานคะแนนสอบนักศึกษา ปวช. 2 (1D Array) ===\n");
    for (int i = 0; i < 5; i++) {
        printf("คนที่ %d: %d คะแนน\n", i + 1, scores[i]);
        total += scores[i];
        if (scores[i] > max) {
            max = scores[i];
        }
    }

    float avg = (float)total / 5.0f;
    printf("-----------------------------------\n");
    printf("คะแนนรวมทั้งหมด: %d คะแนน\n", total);
    printf("คะแนนเฉลี่ย:     %.2f คะแนน\n", avg);
    printf("คะแนนสูงสุด:     %d คะแนน\n", max);

    return 0;
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
=== รายงานคะแนนสอบนักศึกษา ปวช. 2 (1D Array) ===
คนที่ 1: 78 คะแนน
คนที่ 2: 85 คะแนน
คนที่ 3: 92 คะแนน
คนที่ 4: 64 คะแนน
คนที่ 5: 88 คะแนน
-----------------------------------
คะแนนรวมทั้งหมด: 407 คะแนน
คะแนนเฉลี่ย:     81.40 คะแนน
คะแนนสูงสุด:     92 คะแนน
อันตรายเรื่อง Array Index Out of Bounds: ในภาษา C จะ ไม่มีการตรวจสอบขอบเขตของอาร์เรย์ หากเข้าถึง scores[10] โปรแกรมอาจอ่านค่าขยะในหน่วยความจำหรือทำให้โปรแกรมแครชทันที
ใบกิจกรรมฝึกปฏิบัติการ 3.1
ให้นักศึกษาเขียนโปรแกรมค้นหาตัวเลขในอาร์เรย์ (Linear Search) โดยกำหนดอาร์เรย์ตัวเลข 5 ตัว แล้วค้นหาว่ามีเลข 92 อยู่ในดัชนีใด
C Solution Guide
#include <stdio.h>

int main(void) {
    int data[5] = {15, 42, 92, 68, 77};
    int target = 92;
    int found_idx = -1;

    for (int i = 0; i < 5; i++) {
        if (data[i] == target) {
            found_idx = i;
            break;
        }
    }

    if (found_idx != -1) {
        printf("พบตัวเลข %d ที่ตำแหน่งดัชนี [%d]\n", target, found_idx);
    } else {
        printf("ไม่พบตัวเลขเป้าหมายในอาร์เรย์\n");
    }
    return 0;
}
หน่วยที่ 3: โครงสร้างข้อมูล อาร์เรย์ สตริง และพอยน์เตอร์

บทที่ 10: อาร์เรย์ 2 มิติและเมทริกซ์ (2D Arrays & Matrix Processing)

Two-Dimensional Arrays, Nested Iterations & Tables
2 คาบ (100 นาที)
K: เข้าใจโครงสร้างตาราง แถว (Row) และคอลัมน์ (Column) P: ใช้ลูปซ้อนลูปประมวลผลตารางคะแนนและบวกเมทริกซ์ได้ A: จัดระเบียบข้อมูลหลายมิติอย่างมีประสิทธิภาพ

อาร์เรย์ 2 มิติ (2D Array) เปรียบเสมือนตารางที่มีแถวแนวนอน (Rows) และแถวแนวตั้ง (Columns):

  • การประกาศ: data_type array_name[rows][cols];
  • การอ้างอิง: array_name[row_index][col_index]
  • การเข้าถึงข้อมูลทุกช่อง นิยมใช้ Nested for loops โดยลูปนอกควบคุมแถว (row) และลูปในควบคุมคอลัมน์ (col)
C Program Source
#include <stdio.h>

int main(void) {
    // ตารางคะแนนนักศึกษา 3 คน x 3 รายวิชา
    int grades[3][3] = {
        {80, 85, 90},
        {70, 75, 72},
        {88, 92, 95}
    };

    printf("--- ตารางคะแนนนักศึกษา ปวช. 2 (2D Array) ---\n");
    printf("ลำดับ  | วิชา 1 | วิชา 2 | วิชา 3 | รวมคะแนน\n");
    printf("--------------------------------------------\n");

    for (int r = 0; r < 3; r++) {
        int sum_row = 0;
        printf("คนที่ %d | ", r + 1);
        for (int c = 0; c < 3; c++) {
            printf("%6d | ", grades[r][c]);
            sum_row += grades[r][c];
        }
        printf("%6d คะแนน\n", sum_row);
    }

    return 0;
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
--- ตารางคะแนนนักศึกษา ปวช. 2 (2D Array) ---
ลำดับ  | วิชา 1 | วิชา 2 | วิชา 3 | รวมคะแนน
--------------------------------------------
คนที่ 1 |     80 |     85 |     90 |    255 คะแนน
คนที่ 2 |     70 |     75 |     72 |    217 คะแนน
คนที่ 3 |     88 |     92 |     95 |    275 คะแนน
การจองหน่วยความจำแบบ Row-Major Order: ในภาษา C อาร์เรย์ 2 มิติจะถูกจัดเก็บในหน่วยความจำเรียงต่อกันไปทีละแถว (Row by Row) ในแถบ RAM ยาวต่อเนื่องกัน
ใบกิจกรรมฝึกปฏิบัติการ 3.2
ให้นักศึกษาเขียนโปรแกรมบวกเมทริกซ์ขนาด 2x2 สองเมทริกซ์ (A + B = C) และแสดงผลลัพธ์เมทริกซ์ C
C Solution Guide
#include <stdio.h>

int main(void) {
    int A[2][2] = {{1, 2}, {3, 4}};
    int B[2][2] = {{5, 6}, {7, 8}};
    int C[2][2];

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            C[i][j] = A[i][j] + B[i][j];
            printf("%4d ", C[i][j]);
        }
        printf("\n");
    }
    return 0;
}
หน่วยที่ 3: โครงสร้างข้อมูล อาร์เรย์ สตริง และพอยน์เตอร์

บทที่ 11: อักขระและสตริง (Characters & String Handling with string.h)

Character Arrays, Null Terminator '\0' & string.h Library
3 คาบ (150 นาที)
K: เข้าใจสตริงในฐานะ Array of Characters ที่ปิดท้ายด้วย '\0' P: ใช้ฟังก์ชัน strlen, strcpy, strcat, strcmp ได้อย่างถูกต้อง A: ระมัดระวังปัญหา Buffer Overflow ในการจัดการข้อความ

ในภาษา C ไม่มีชนิดข้อมูล string ในตัว แต่สตริงคือ อาร์เรย์ของตัวอักษร (char array) ที่ปิดท้ายด้วย Null Terminator ('\0') เสมอ เพื่อบอกจุดสิ้นสุดของข้อความ

ไลบรารี #include <string.h> รวบรวมฟังก์ชันจัดการข้อความมาตรฐาน:

  • strlen(str) : หาความยาวของสตริง (ไม่นับ '\0')
  • strcpy(dest, src) : คัดลอกข้อความจาก src ไปยัง dest
  • strcat(dest, src) : นำข้อความ src ไปต่อท้าย dest
  • strcmp(str1, str2) : เปรียบเทียบข้อความ (คืนค่า 0 เมื่อข้อความเหมือนกันทุกตัวอักษร)
C Program Source
#include <stdio.h>
#include <string.h>

int main(void) {
    char first_name[30] = "Somchai";
    char last_name[30] = "Sukjai";
    char full_name[70] = "";

    // 1. คัดลอกและต่อข้อความ
    strcpy(full_name, first_name);
    strcat(full_name, " ");
    strcat(full_name, last_name);

    printf("--- ข้อมูลนักศึกษา ปวช. 2 ---\n");
    printf("ชื่อ-นามสกุล:    %s\n", full_name);
    printf("ความยาวตัวอักษร: %zu ตัว\n", strlen(full_name));

    // 2. เปรียบเทียบข้อความ
    if (strcmp(first_name, "Somchai") == 0) {
        printf("ตรวจสอบ: ชื่อตรงกับฐานข้อมูลทะเบียนวิทยาลัย\n");
    }

    return 0;
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
--- ข้อมูลนักศึกษา ปวช. 2 ---
ชื่อ-นามสกุล:    Somchai Sukjai
ความยาวตัวอักษร: 14 ตัว
ตรวจสอบ: ชื่อตรงกับฐานข้อมูลทะเบียนวิทยาลัย
ทำไมต้องเผื่อขนาดอาร์เรย์ +1?: หากต้องการเก็บชื่อยาว 10 ตัวอักษร ต้องประกาศอาร์เรย์อย่างน้อยขนาด 11 ช่อง (char name[11];) เพื่อให้มีที่ว่างสำหรับเก็บอักขระปิดท้าย '\0' เสมอ
ใบกิจกรรมฝึกปฏิบัติการ 3.3
ให้นักศึกษาเขียนโปรแกรมตรวจสอบรหัสผ่าน โดยรับรหัสผ่านเปรียบเทียบกับคำว่า "admin1234" ด้วยฟังก์ชัน strcmp() และแจ้งเตือนผลการเข้าสู่ระบบ
C Solution Guide
#include <stdio.h>
#include <string.h>

int main(void) {
    char password[20] = "admin1234";

    if (strcmp(password, "admin1234") == 0) {
        printf("เข้าสู่ระบบแผนกวิชาสำเร็จ (Access Granted)\n");
    } else {
        printf("รหัสผ่านไม่ถูกต้อง (Access Denied)\n");
    }
    return 0;
}
หน่วยที่ 3: โครงสร้างข้อมูล อาร์เรย์ สตริง และพอยน์เตอร์

บทที่ 12: ตัวชี้ตำแหน่งหน่วยความจำ (Pointers Architecture & Dereferencing)

Pointer Fundamentals, Address Operator (&) & Dereferencing (*)
3 คาบ (150 นาที)
K: เข้าใจสถาปัตยกรรม Memory Address และหลักการของพอยน์เตอร์ P: ประกาศตัวแปรพอยน์เตอร์ ชี้ตำแหน่ง และเข้าถึงค่าด้วย * (Dereference) A: ปฏิบัติการจัดการหน่วยความจำด้วยความรอบคอบและปลอดภัย

พอยน์เตอร์ (Pointer) คือหนึ่งในคุณสมบัติที่ทรงพลังที่สุดของภาษา C พอยน์เตอร์คือ ตัวแปรพิเศษที่ทำหน้าที่เก็บตำแหน่งที่อยู่ (Memory Address) ของตัวแปรอื่น ในหน่วยความจำ RAM:

  • &var (Address-of Operator): ดึงตำแหน่งหน่วยความจำของตัวแปร var
  • int *ptr; : ประกาศตัวแปรพอยน์เตอร์ชื่อ ptr ที่ชี้ไปยังข้อมูลชนิด int
  • *ptr (Dereferencing Operator): การเข้าถึงหรือแก้ไข "ค่าที่อยู่ในตำแหน่ง" ที่ ptr ชี้ไป
C Program Source
#include <stdio.h>

int main(void) {
    int score = 85;
    int *ptr = &score; // ptr เก็บตำแหน่งของ score

    printf("=== การทำงานของพอยน์เตอร์ในหน่วยความจำ RAM ===\n");
    printf("1. ค่าของตัวแปร score:          %d\n", score);
    printf("2. ตำแหน่งหน่วยความจำ (&score):    %p\n", (void*)&score);
    printf("3. ค่าที่เก็บในพอยน์เตอร์ ptr:        %p\n", (void*)ptr);
    printf("4. ค่าที่ ptr ชี้ไป (*ptr):           %d\n", *ptr);

    // แก้ไขค่าของ score ทางอ้อมผ่านพอยน์เตอร์
    *ptr = 95;
    printf("\n--- หลังแก้ไขค่าผ่าน *ptr = 95 ---\n");
    printf("ค่าของตัวแปร score ปัจจุบัน:     %d คะแนน\n", score);

    return 0;
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
=== การทำงานของพอยน์เตอร์ในหน่วยความจำ RAM ===
1. ค่าของตัวแปร score:          85
2. ตำแหน่งหน่วยความจำ (&score):    0061FF1C
3. ค่าที่เก็บในพอยน์เตอร์ ptr:        0061FF1C
4. ค่าที่ ptr ชี้ไป (*ptr):           85

--- หลังแก้ไขค่าผ่าน *ptr = 95 ---
ค่าของตัวแปร score ปัจจุบัน:     95 คะแนน
Pro-Tip: หากประกาศพอยน์เตอร์แล้วยังไม่ได้กำหนดเป้าหมาย ควรตั้งค่าเป็น NULL เสมอ เช่น int *ptr = NULL; เพื่อป้องกันการเกิด Wild/Dangling Pointer ที่ชี้สุ่มในระบบ
ใบกิจกรรมฝึกปฏิบัติการ 3.4
ให้นักศึกษาเขียนโปรแกรมเพิ่มคะแนนพิเศษ 10 คะแนนให้กับตัวแปร midterm = 40 โดยสั่งเพิ่มค่าผ่านตัวแปรพอยน์เตอร์
C Solution Guide
#include <stdio.h>

int main(void) {
    int midterm = 40;
    int *p = &midterm;

    *p += 10; // เพิ่มค่าผ่านพอยน์เตอร์
    printf("คะแนนเดิม: 40 | คะแนนหลังปรับปรุง: %d คะแนน\n", midterm);
    return 0;
}
หน่วยที่ 4: ฟังก์ชัน เรคคอร์ด ไฟล์ และโครงงานประยุกต์

บทที่ 13: การสร้างและเรียกใช้ฟังก์ชัน (User-defined Functions & Parameter Passing)

Modular Programming, Function Prototypes, Pass-by-Value & Pass-by-Reference
2 คาบ (100 นาที)
K: เข้าใจแนวคิด Modular Programming และ Prototype Declaration P: เขียนฟังก์ชันส่งค่ากลับ และฟังก์ชันสลับค่า (Swap) ด้วยพอยน์เตอร์ได้ A: นำหลักการ Don't Repeat Yourself (DRY) มาจัดระเบียบโค้ด

ฟังก์ชัน (Function) คือกลุ่มของชุดคำสั่งที่ตั้งชื่อไว้ เพื่อให้สามารถเรียกใช้งานซ้ำๆ ได้ การส่งผ่านพารามิเตอร์มี 2 รูปแบบหลัก:

  • Pass by Value: ส่งสำเนาของค่าข้อมูลเข้าไป การแก้ไขค่าในฟังก์ชัน จะไม่มีผล ต่อตัวแปรต้นทาง
  • Pass by Reference (ผ่าน Pointer): ส่งตำแหน่งหน่วยความจำ (Address) เข้าไป การแก้ไขค่าผ่าน *ptr ในฟังก์ชัน จะส่งผลต่อตัวแปรต้นทางจริง เช่น ฟังก์ชัน swap(&x, &y)
C Program Source
#include <stdio.h>

// Function Prototype
float calculate_bmi(float weight, float height_m);
void swap_scores(int *a, int *b);

int main(void) {
    // 1. ทดสอบ Pass by Value
    float bmi = calculate_bmi(68.0f, 1.75f);
    printf("ดัชนีมวลกาย (BMI): %.2f\n", bmi);

    // 2. ทดสอบ Pass by Reference ด้วยพอยน์เตอร์
    int score_a = 75, score_b = 90;
    printf("\nก่อนสลับค่า: score_a = %d, score_b = %d\n", score_a, score_b);
    swap_scores(&score_a, &score_b);
    printf("หลังสลับค่า:  score_a = %d, score_b = %d\n", score_a, score_b);

    return 0;
}

float calculate_bmi(float weight, float height_m) {
    return weight / (height_m * height_m);
}

void swap_scores(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
ดัชนีมวลกาย (BMI): 22.20

ก่อนสลับค่า: score_a = 75, score_b = 90
หลังสลับค่า:  score_a = 90, score_b = 75
ทำไมต้องมี Function Prototype?: ในภาษา C หากเขียนฟังก์ชันไว้ใต้ main() จะต้องประกาศหัวข้อฟังก์ชัน (Prototype) ไว้ด้านบนก่อน เพื่อให้คอมไพเลอร์ทราบจำนวนและชนิดของพารามิเตอร์
ใบกิจกรรมฝึกปฏิบัติการ 4.1
ให้นักศึกษาเขียนฟังก์ชัน int find_max(int a, int b) ส่งคืนค่าตัวเลขที่มีค่ามากกว่าระหว่างตัวเลข 2 จำนวน
C Solution Guide
#include <stdio.h>

int find_max(int a, int b) {
    return (a > b) ? a : b;
}

int main(void) {
    printf("ค่าสูงสุดระหว่าง 48 และ 92 คือ: %d\n", find_max(48, 92));
    return 0;
}
หน่วยที่ 4: ฟังก์ชัน เรคคอร์ด ไฟล์ และโครงงานประยุกต์

บทที่ 14: ข้อมูลโครงสร้างแบบเรคคอร์ด (Structures: struct & typedef)

User-Defined Types, struct Syntax, typedef & Struct Arrays
2 คาบ (100 นาที)
K: เข้าใจความแตกต่างระหว่าง Array (ข้อมูลชนิดเดียว) กับ struct (ข้อมูลต่างชนิด) P: นิยาม struct, ใช้ typedef และสร้างอาร์เรย์ของ struct ได้อย่างถูกต้อง A: ออกแบบโครงสร้างข้อมูลที่สอดคล้องกับระเบียนข้อมูลในชีวิตจริง

โครงสร้างข้อมูล struct (Structure) ช่วยให้เราสามารถสร้างชนิดข้อมูลใหม่ที่รวบรวมตัวแปรต่างชนิดกัน (เช่น รหัสนักศึกษา, ชื่อ, คะแนนสอบ) ให้อยู่รวมกันเป็นระเบียนเดียว (Record):

  • การประกาศ: struct Student { char id[15]; char name[50]; float gpa; };
  • การใช้ typedef: ช่วยให้เรียกชื่อชนิดข้อมูลได้สั้นลง เช่น Student s1; โดยไม่ต้องพิมพ์คำว่า struct นำหน้าทุกครั้ง
  • การเข้าถึงฟิลด์ข้อมูลภายใน ใช้เครื่องหมายจุด (Dot Operator) s1.name
C Program Source
#include <stdio.h>
#include <string.h>

typedef struct {
    char id[15];
    char name[40];
    float midterm;
    float final_exam;
    float total;
    char grade[5];
} Student;

int main(void) {
    Student s1;
    strcpy(s1.id, "672090101");
    strcpy(s1.name, "สมชาย ภูวนารถ");
    s1.midterm = 42.5f;
    s1.final_exam = 46.0f;
    s1.total = s1.midterm + s1.final_exam;
    strcpy(s1.grade, (s1.total >= 80) ? "4.0" : "ผ่านเกณฑ์");

    printf("=== ทะเบียนประวัตินักศึกษา ปวช. 2 (struct) ===\n");
    printf("รหัสประจำตัว:   %s\n", s1.id);
    printf("ชื่อ-นามสกุล:   %s\n", s1.name);
    printf("คะแนนเก็บกลางภาค: %.1f คะแนน\n", s1.midterm);
    printf("คะแนนสอบปลายภาค: %.1f คะแนน\n", s1.final_exam);
    printf("คะแนนรวมสุทธิ:    %.1f / 100\n", s1.total);
    printf("ระดับผลการเรียน:  %s\n", s1.grade);

    return 0;
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
=== ทะเบียนประวัตินักศึกษา ปวช. 2 (struct) ===
รหัสประจำตัว:   672090101
ชื่อ-นามสกุล:   สมชาย ภูวนารถ
คะแนนเก็บกลางภาค: 42.5 คะแนน
คะแนนสอบปลายภาค: 46.0 คะแนน
คะแนนรวมสุทธิ:    88.5 / 100
ระดับผลการเรียน:  4.0
Pro-Tip: หากต้องการส่ง struct เข้าฟังก์ชัน ควรส่งผ่านพอยน์เตอร์ void print_student(Student *s) และเข้าถึงฟิลด์ด้วยเครื่องหมายลูกศร s->name เพื่อประหยัดพื้นที่หน่วยความจำไม่ต้องสำเนาข้อมูลทั้งก้อน
ใบกิจกรรมฝึกปฏิบัติการ 4.2
ให้นักศึกษาสร้าง struct Product สำหรับร้านค้าสหกรณ์ (รหัสสินค้า, ชื่อสินค้า, ราคา) และสร้างตัวแปรสินค้า 1 รายการพร้อมแสดงผล
C Solution Guide
#include <stdio.h>

typedef struct {
    int code;
    char name[30];
    float price;
} Product;

int main(void) {
    Product p = {101, "สมุดบันทึกรายวิชา", 35.0f};
    printf("[%d] %s - ราคา %.2f บาท\n", p.code, p.name, p.price);
    return 0;
}
หน่วยที่ 4: ฟังก์ชัน เรคคอร์ด ไฟล์ และโครงงานประยุกต์

บทที่ 15: การจัดการไฟล์ข้อมูลเบื้องต้น (File Handling & Persistence)

File Streams, fopen, fclose, fprintf, fscanf & Error Checking
2 คาบ (100 นาที)
K: เข้าใจโหมดการเปิดไฟล์ ("r", "w", "a") และโครงสร้างตัวแปร FILE* P: เขียนข้อมูลลงไฟล์และอ่านข้อมูลจาก Text File ได้อย่างถูกต้อง A: ปิดไฟล์ด้วย fclose() เสมอเพื่อป้องกันข้อมูลเสียหายและหน่วยความจำรั่วไหล

การเก็บข้อมูลในตัวแปรจะหายไปเมื่อปิดโปรแกรม การใช้งาน ไฟล์ข้อมูล (File Handling) ช่วยให้ข้อมูลถูกบันทึกลงฮาร์ดดิสก์อย่างถาวร:

  • โครงสร้างตัวแปรไฟล์: FILE *fp;
  • การเปิดไฟล์: fp = fopen("filename.txt", "mode"); โดยโหมดสำคัญได้แก่:
    • "w" : สร้างไฟล์ใหม่เพื่อเขียน (ถ้ามีไฟล์เดิมอยู่แล้วจะเขียนทับ)
    • "r" : เปิดไฟล์เพื่ออ่านข้อมูล
    • "a" : เปิดไฟล์เพื่อเขียนต่อท้าย (Append)
  • การเขียนและอ่าน: fprintf(fp, ...) และ fscanf(fp, ...)
  • การปิดไฟล์: fclose(fp);
C Program Source
#include <stdio.h>

int main(void) {
    // 1. เขียนข้อมูลนักศึกษาลงไฟล์ text
    FILE *fp_write = fopen("students_record.txt", "w");
    if (fp_write != NULL) {
        fprintf(fp_write, "672090101 Somchai 88.5\n");
        fprintf(fp_write, "672090102 Kanda   95.0\n");
        fclose(fp_write);
        printf("บันทึกข้อมูลลงไฟล์ students_record.txt สำเร็จ\n");
    }

    // 2. อ่านข้อมูลกลับมาจากไฟล์ text
    FILE *fp_read = fopen("students_record.txt", "r");
    if (fp_read != NULL) {
        char id[15], name[30];
        float score;

        printf("\n--- ข้อมูลที่อ่านได้จากไฟล์ฐานข้อมูล ---\n");
        while (fscanf(fp_read, "%s %s %f", id, name, &score) == 3) {
            printf("รหัส: %s | ชื่อ: %-10s | คะแนน: %.1f คะแนน\n", id, name, score);
        }
        fclose(fp_read);
    }

    return 0;
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
บันทึกข้อมูลลงไฟล์ students_record.txt สำเร็จ

--- ข้อมูลที่อ่านได้จากไฟล์ฐานข้อมูล ---
รหัส: 672090101 | ชื่อ: Somchai    | คะแนน: 88.5 คะแนน
รหัส: 672090102 | ชื่อ: Kanda      | คะแนน: 95.0 คะแนน
ตรวจสอบ NULL ก่อนเสมอ: ก่อนใช้งานไฟล์ต้องตรวจสอบว่า fp != NULL หรือไม่ หากเปิดไฟล์ไม่สำเร็จ (เช่น ไม่มีไฟล์อยู่จริง หรือไม่มีสิทธิ์เข้าถึง) จะทำให้โปรแกรมหยุดทำงานทันที
ใบกิจกรรมฝึกปฏิบัติการ 4.3
ให้นักศึกษาเขียนโปรแกรมบันทึกข้อความบันทึกประจำวัน (Log) ต่อท้ายไฟล์ activity.log ด้วยโหมด "a"
C Solution Guide
#include <stdio.h>

int main(void) {
    FILE *fp = fopen("activity.log", "a");
    if (fp != NULL) {
        fprintf(fp, "[INFO] นักศึกษา ปวช. 2 เข้าสู่ระบบทดสอบโปรแกรม\n");
        fclose(fp);
        printf("บันทึกประวัติการใช้งานเรียบร้อย\n");
    }
    return 0;
}
หน่วยที่ 4: ฟังก์ชัน เรคคอร์ด ไฟล์ และโครงงานประยุกต์

บทที่ 16: โครงงานประยุกต์พัฒนาระบบสารสนเทศ C Capstone Project (ปวช. 2)

Integration Capstone: Academic Performance & Grading System
3 คาบ (150 นาที)
K: บูรณาการองค์ความรู้ภาษา C ทั้ง 4 หน่วยการเรียนรู้สู่โครงงานจริง P: พัฒนาระบบที่มีการใช้ struct, array, ฟังก์ชัน และออกรายงานสถิติ A: มุ่งมั่นสร้างสรรค์ผลงานโปรแกรมคอมพิวเตอร์ตามมาตรฐานวิชาชีพ

โครงงานประยุกต์ (Capstone Project) สำหรับนักศึกษาระดับ ปวช. 2 เป็นการนำทักษะการคิดเชิงตรรกะ โครงสร้างควบคุม อาร์เรย์ struct และฟังก์ชัน มารวมเข้าด้วยกันเพื่อสร้างระบบสารสนเทศ:

  • 1. Data Architecture: นิยาม struct สำหรับระเบียนข้อมูลนักศึกษา
  • 2. Business Logic: ฟังก์ชันคำนวณคะแนนรวมและตัดเกรด
  • 3. Reporting Module: ฟังก์ชันพิมพ์ตารางสรุปผลสัมฤทธิ์ทางการเรียนและการคำนวณค่าเฉลี่ยทั้งชั้นเรียน
C Program Source
#include <stdio.h>

typedef struct {
    char id[15];
    char name[30];
    float total_score;
    char grade[5];
} StudentRecord;

int main(void) {
    StudentRecord class_list[3] = {
        {"672090101", "สมชาย สุขเกษม", 94.5f, "4"},
        {"672090102", "กานดา มณีรัตน์", 99.5f, "4"},
        {"672090103", "วิศวะ พัฒนาการ", 75.0f, "3"}
    };

    printf("==================================================\n");
    printf(" รายงานสรุปผลสัมฤทธิ์รายวิชา: 20901-2005 การเขียนโปรแกรมภาษา C\n");
    printf(" ระดับชั้น ปวช. 2 สาขาวิชาเทคโนโลยีสารสนเทศ\n");
    printf("==================================================\n");
    printf("%-12s | %-18s | %-8s | %-5s\n", "รหัส", "ชื่อ-สกุล", "คะแนนรวม", "เกรด");
    printf("--------------------------------------------------\n");

    float sum = 0.0f;
    for (int i = 0; i < 3; i++) {
        printf("%-12s | %-18s | %8.1f | %-5s\n",
               class_list[i].id, class_list[i].name, class_list[i].total_score, class_list[i].grade);
        sum += class_list[i].total_score;
    }

    printf("--------------------------------------------------\n");
    printf("จำนวนนักศึกษาทั้งหมด: 3 คน\n");
    printf("คะแนนเฉลี่ยทั้งชั้นเรียน: %.2f คะแนน\n", sum / 3.0f);
    printf("==================================================\n");

    return 0;
}
ผลลัพธ์การรันโปรแกรม (Terminal Output)
==================================================
 รายงานสรุปผลสัมฤทธิ์รายวิชา: 20901-2005 การเขียนโปรแกรมภาษา C
 ระดับชั้น ปวช. 2 สาขาวิชาเทคโนโลยีสารสนเทศ
==================================================
รหัส          | ชื่อ-สกุล            | คะแนนรวม | เกรด 
--------------------------------------------------
672090101    | สมชาย สุขเกษม      |     94.5 | 4    
672090102    | กานดา มณีรัตน์      |     99.5 | 4    
672090103    | วิศวะ พัฒนาการ      |     75.0 | 3    
--------------------------------------------------
จำนวนนักศึกษาทั้งหมด: 3 คน
คะแนนเฉลี่ยทั้งชั้นเรียน: 89.67 คะแนน
==================================================
เกณฑ์การประเมินโครงงานระดับ ปวช. 2 (ว.PA): เน้นการประเมินการออกแบบระบบที่สอดคล้องกับสภาพจริง ความถูกต้องของตรรกะโปรแกรม การจัดรูปแบบโค้ดที่สะอาดตามระเบียบมาตรฐาน และความสามารถในการแก้ปัญหาเชิงระบบ
กิจกรรมโครงงานประยุกต์ปลายภาคเรียน (C Capstone Lab)
ให้นักศึกษารวมกลุ่ม 2-3 คน พัฒนาระบบสารสนเทศขนาดเล็กด้วยภาษา C เช่น ระบบจัดการคลังสินค้า, ระบบบันทึกการเข้าเรียน, หรือระบบคำนวณภาษีร้านค้า โดยมีการใช้ struct และฟังก์ชันอย่างน้อย 3 ฟังก์ชัน
C Solution Guide
// หัวข้อโครงงานที่แนะนำสำหรับ ปวช. 2:
// 1. ระบบบันทึกและคำนวณสถิติงานบริการคอมพิวเตอร์
// 2. โปรแกรมคิดเงินและตัดสต็อกร้านค้าสหกรณ์วิทยาลัย
// 3. ระบบคำนวณและประเมินเวลาเรียนประจำสัปดาห์

ประมวลรายวิชา (Course Syllabus) - การเขียนโปรแกรมภาษา C (ปวช. 2)

การเขียนโปรแกรมภาษา C (C Programming)

รหัสวิชา 20901-2005 | ระดับชั้น ปวช. 2 | 2.0 หน่วยกิต (40-72 คาบ/ภาคเรียน)
มาตรฐานและสมรรถนะรายวิชา: สมรรถนะวิชาชีพ ปวช. 2 สามารถวิเคราะห์ขั้นตอนวิธี เขียนโปรแกรมภาษา C โครงสร้างควบคุม จัดการหน่วยความจำด้วยพอยน์เตอร์ และพัฒนาโครงงานซอฟต์แวร์ประยุกต์
โครงสร้างการจัดการเรียนรู้ 4 หน่วยหลัก:
หน่วยที่ชื่อหน่วยการเรียนรู้เวลา (ชม.)คะแนน
1โครงสร้างภาษา C และการประมวลผลพื้นฐาน (บท 1-4)815
2โครงสร้างควบคุมและการตัดสินใจ (บท 5-8)1220
สอบวัดผลกลางภาคเรียน220
3โครงสร้างข้อมูล อาร์เรย์ สตริง และพอยน์เตอร์ (บท 9-12)1015
4ฟังก์ชัน เรคคอร์ด ไฟล์ และโครงงานประยุกต์ (บท 13-16)815
สอบวัดผลปลายภาคเรียน / โครงงาน215
รวมทั้งสิ้น40100

สไลด์บรรยายอิเล็กทรอนิกส์ - ภาษา C (ปวช. 2)

ชุดสไลด์บรรยายอิเล็กทรอนิกส์วิชาการเขียนโปรแกรมภาษา C สำหรับครูใช้สอนและนักศึกษาใช้ทบทวน ประกอบด้วย:

  • Slide Deck 1: Architecture & I/O Functions (45 สไลด์)
  • Slide Deck 2: Control Structures, Loops & Flowcharts (50 สไลด์)
  • Slide Deck 3: Arrays, Strings & Pointer Architecture (62 สไลด์)
  • Slide Deck 4: Modular Functions, Structs & File Operations (55 สไลด์)
ตัวอย่างโค้ดและผังงานทั้งหมดในสไลด์ สอดคล้องกับตัวอย่างโค้ดในเว็บไซต์นี้ 100% สามารถดาวน์โหลดซอร์สโค้ดไฟล์ .zip ด้านล่างไปเปิดควบคู่ได้ทันที

คู่มือโครงงานคอมพิวเตอร์ภาษา C (ปวช. 2)

โครงสร้างรายงานโครงงาน 5 บท (ตามมาตรฐาน สอศ.)
  1. บทที่ 1 บทนำ: ความเป็นมาและความสำคัญ, วัตถุประสงค์, ขอบเขตของโครงงาน, ประโยชน์ที่คาดว่าจะได้รับ
  2. บทที่ 2 เอกสารและทฤษฎีที่เกี่ยวข้อง: โครงสร้างภาษา C, โครงสร้างข้อมูล struct, การจัดการไฟล์ text
  3. บทที่ 3 วิธีการดำเนินงาน: ผังงานรวมของระบบ (System Flowchart), ฟังก์ชันที่ออกแบบ, แผนปฏิบัติงาน
  4. บทที่ 4 ผลการดำเนินงาน: หน้าจอส่วนติดต่อผู้ใช้แบบ Console UI, ผลการทดสอบกรณีทดสอบ
  5. บทที่ 5 สรุปผลและข้อเสนอแนะ: สรุปผลสัมฤทธิ์ ปัญหาและอุปสรรค แนวทางการพัฒนาต่อยอด
คัดลอกโค้ดสำเร็จ!