Skip to content

ตัวแปรชุด และสายอักขระ

Author: Nagorn Phongphasura


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

Array

โดย Array ใน C จะเป็นการใช้การเรียงตำแหน่งแบบ 0-indexed นั่นคือ ช่องแรกจะเป็นลำดับที่ 0 หรือเมื่อเขียนเป็นโค้ด จะแทนด้วย arr[0] ซึ่งหากสร้าง Array ขนาด \(10\) ขึ้นมา เราจะสามารถเก็บค่าได้ตั้งแต่ช่อง arr[0] จนถึง arr[9] ซึ่งก็คือ จะเก็บได้ \(10\) ค่าพอดี แต่เราจะไม่สามารถเข้าถึงช่องที่ arr[10] ได้ เพราะเป็นช่วงนอกขอบเขต (Out of bounds) ซึ่งการเรียก Input/Output สำหรับ Array นั้น ก็เหมือนกับการใช้ตัวแปรทั่วไปเลย

ตัวอย่าง Code การใช้ Array

int arr[10]; // สร้างชุดข้อมูลเป็นจำนวนเต็ม เก็บ 10 ช่อง (0-9)
for (int i = 0; i <= 9; i++) { // วนตั้งแต่ 0-9
    scanf("%d", &arr[i]); // รับ Input ตัวที่ i
}
for (int i = 0; i <= 9; i++) { // วนตั้งแต่ 0-9
    printf("%d", arr[i]); // พิมพ์ค่าออกมา
    printf(" "); // คั่นด้วยช่องว่าง
}

เพิ่มเติม

  • การประกาศ Array ในฟังก์ชัน (เช่น main) ค่าเริ่มต้นของแต่ละตัว จะไม่ได้เป็น 0 แต่กลับเป็นค่า Random แทน ซึ่งเราสามารถแก้ได้ดังนี้
    int arr[100];
    for (int i = 0; i < 100; i++) arr[i] = 0;
    
  • การประกาศ Array นอกฟังก์ชัน จะทำให้ค่าเริ่มต้นของแต่ละตัว เท่ากับ 0 เช่น
    #include <stdio.h>
    
    int arr[100]; // ทุกตัวใน Array มีค่าเป็น 0
    
    int main() {
        // ...
    }
    
  • เราสามารถประกาศ Array ด้วยขนาดตามค่าของตัวแปรได้ เช่น
    #include <stdio.h>
    
    int main() {
        int n;
        scanf("%d", &n);
        int arr[n];
    }
    

String

นอกจากนี้ ใน C ก็ยังมี String หรือ สายอักขระ ซึ่งก็คือ ข้อความนั่นแหละ

การประกาศ String ใน C จะไม่มี Variable Type ที่ชื่อว่า String แต่จะเป็น "Array of Char" แทน นั่นคือ เป็นชุดข้อมูลที่เป็นตัวอักษรนั่นเอง โดยเช่นเดียวกันกับ Array ทั่วไป เราจะไม่สามารถเก็บค่าในช่องสุดท้ายของ String ได้ และสมมติถ้าเรารับ Input มาเป็น String แล้ว อักขระถัดมาหลังจากตัวสุดท้ายของข้อความที่รับเข้ามา จะเป็น '\0' หรือ "Null Character"

การประกาศก็จะง่าย ๆ เลย เราก็แค่เขียนว่า char str[10] // ไม่ให้ข้อความยาวเกิน 10

แต่การรับ Input ของ String จะแตกต่างจากการรับ Input ปกติ โดยการรับ Input ของ String เราจะไม่ต้องใส่เครื่องหมาย & ด้านหน้าชื่อตัวแปร และจะใช้ Format Specifier เป็น %s แทน

ตัวอย่าง Code การใช้ String

char str[15]; // ประกาศข้อความยาวไม่เกิน 14 ตัวอักษร
scanf("%s", str); // ใช้ %s และไม่ต้องใส่ &
printf("%s", str); // พิมพ์ String ออกมา

char จะเก็บในรูปแบบของตัวเลข ซึ่งตัวเลขแต่ละตัว จะหมายถึงตัวอักษรตัวใดตัวหนึ่ง ตามตาราง Ascii

เราสามารถประกาศตัวแปรประเภท string ได้อีกวิธีหนึ่ง คือ

char str[15] = "Hello, World!"; // ความยาวตัวอักษร ต้อง "น้อยกว่า" ความยาวของ Array นั่นคือในกรณีนี้ จะต้องยาวไม่เกิน 14 ตัวอักษร

2D Array

และ Array นอกจากจะทำด้วย Variable ต่าง ๆ ได้ เราเองก็สามารถทำ "Array of Array" ซึ่งเนื่องจากเราเก็บเป็น Array ของ Array ทำให้เป็นเหมือนกับการเก็บแถว หลาย ๆ แถว กลายเป็นตาราง 2 มิติ เราจึงเรียกมันว่า 2D Array นั่นเอง

การประกาศ 2D Array ทำได้ง่าย ๆ โดยการเรียก int arr[10][10] จะได้เป็นตารางขนาด \(10\) X \(10\) และการเรียก Input/Output ก็เหมือนกัน Array ทั่วไปเลย

ตัวอย่าง Code การใช้ 2D Array

int arr[10][10]; // ประกาศตารางขนาด 10 x 10
for (int i = 0; i <= 9; i++) { // วนตามแต่ละแถว
    for (int j = 0; j <= 9; j++) { // วนตามแต่ละหลัก
        scanf("%d", &arr[i][j]); // รับค่าช่องที่ i, j
    }
}
for (int i = 0; i <= 9; i++) { // วนตามแต่ละแถว
    for (int j = 0; j <= 9; j++) { // วนตามแต่ละหลัก
        printf("%d", arr[i][j]); // พิมพ์ค่าออกมา
        printf(" ") // ตั่นด้วยช่องว่าง
    }
    printf("\n"); // ขึ้นบรรทัดใหม่ เมื่อจบแถวนั้นแล้ว
}

โจทย์

Problem Source Difficulty Solution
Matrix Addition PROG Very Easy View
Character Checker PROG Very Easy View
Trik PROG ? View
Ptice PROG ? View
Pet PROG ? View
Kemija PROG ? View
BUKA PROG ? View
3-11 (three-eleven) PROG ? View
ลูบไล้ (looblike) PROG ? View
สามเหลี่ยมใหญ่ (bigtriangle) PROG ? View
แชมป์นักจำ (Memory Champion) PROG ? View