ตัวแปรชุด และสายอักขระ
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 แทน ซึ่งเราสามารถแก้ได้ดังนี้
- การประกาศ Array นอกฟังก์ชัน จะทำให้ค่าเริ่มต้นของแต่ละตัว เท่ากับ 0 เช่น
- เราสามารถประกาศ Array ด้วยขนาดตามค่าของตัวแปรได้ เช่น
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 |