2011/09/04

Object Pascal - เก็บตก #1

สวัสดีครับ
คิดว่าหลาย ๆ คนอาจจะลองทำโจทย์ดูแล้ว แต่อาจจะไม่ออก
ผมต้องขอโทษจริง ๆ ครับ ลืมบอกคำสั่งที่สำคัญไป

อย่างแรกคือ ความยาวของ String เราจะใช้ ฟังก์ชัน Length หาความยาวเช่น
var S: string = 'Test String';
Write(Length(S));
จะได้ผลออกมาว่า 11

สำหรับการประกาศ String ที่มีการกำหนดขนาด เช่น
var S: string[40];
ค่าอักขระ แต่ละตัวจะเป็น #0 ทั้งหมด
เราสามารถเช็คได้ว่า string มีตัวอักษรทั้งหมดกี่ตัวโดยการตรวจสอบค่า #0 เช่น



ส่วนการบ้านข้อ 20 ขอเปลี่ยนโจทย์หน่อยละกัน ให้ง่ายกว่าเดิม
ขอเปลี่ยนเป็น
20) ให้รับค่าเข้าไป 10 ค่า แล้วหาค่าที่ซ้ำกันอย่างน้อยครึ่งหนึ่ง เช่น
1 2 3 4 4 4 4 5 6 4 คำตอบคือ 4
1 5 6 6 6 8 7 4 2 3 คำตอบคือ none เพราะไม่มีค่าที่ซ้ำกันเกินครึ่ง


2011/09/03

Object Pascal - Array

สวัสดีครับ กลับมาวันเสาร์ตามสัญญา

วันนี้เราจะมาดูกันว่า Array คืออะไร !!!!

Array คือตัวแปรแถวลำดับ...
ถ้าจะให้พูดง่าย ๆ ก็คือตัวแปรที่มีชนิดเดียวกันหลาย ๆ ตัว นั้นเอง

สมมติว่า ถ้าจะเก็บค่าคะแนนสอบของนักเรียน 100 คน เราจะต้องประกาศตัวแปร 100 ตัวแปรหรอ !!!!
เราจึงจะใช้ตัวแปรแบบ Array มาแก้ปัญหานี้กัน

วิธีการประกาศก็ง่ายแสนง่าย ลองดูตัวอย่างกัน

var
  Score: array[0..99] of Integer;

จากภาพ เป็นการประกาศตัวแปรชื่อ Score เป็นตัวแปร Array ที่มีสมาชิก 100 ตัว มี Index ตั้งแต่ 0 ถึง 99 เก็บข้อมูลจำนวนเต็ม

ลองดูที่ 0..99 เลขข้างหน้า (0) คือ Index เริ่มต้น เลขข้างหลังคือ Index สุดท้าย เราสามารถเริ่มที่อะไรก็ได้ ไม่จำเป็นต้องเป็น 0 เช่น

var
  Arr1: array[6..20] of Integer;
  Arr2: array[-10..5] of Double;

Arr1 มีสมาชิก 20 - 6 + 1 = 15 ตัว
Arr2 มีสมาชิก 5 - (-10) + 1 = 16 ตัว

เวลาจะเรียกใช้ Array ก็เรียกเป็น
Arr[Index] เช่น

var
  Arr: array[1..3] of Integer;
  I: Integer;


begin
  Arr[1] := 50;
  I := 2;
  Arr[I] := 300;
  Arr[3] := I;
  Writeln(Arr[1]], ' ', Arr[2], ' ', Arr[3]);
end.


เอาหล่ะ ลองมาดู Array 2 มิติกันบ้างดีกว่า

วิธีการประกาศจะมี 2 แบบ คือ


วีธีการเรียกใช้จึงต่างกัน


แล้ว 2 แบบนั้น มันต่างกันยังไง ?
  Arr1 เป็น Array 2 มิติ ของ จำนวนเต็ม ขนาด 6 x 4
  Arr2 เป็น Array 1 มิติ ของ Array 1 มิติ ของ จำนวนเต็ม
การประกาศ Array แบบที่ 2 จะดีกว่าแบบที่ 1 อยู่... ดีกว่ายังไง ? เดียวก่อนละกัน

มาดู Array หลาย ๆ มิติกันก่อนนะ
วิธีการประกาศ การใช้ก็เหมือน ๆ กัน




นอกจากนี้ String ก็ยังเหมือนกับ Array 1 มิติอีกแหน่ะ
หรือก็คือ String เป็น Array of Char ก็ว่าได้
การประกาศ String เราสามารถกำหนดได้ว่าจะให้ String นั้นเก็บค่าได้เท่าไร หรือจะไม่กำหนดก็ได้ เช่น

var
  Str1: string;
  Str2: string[16];

เราสามารถเรียกดูตัวอักขระ ในแต่ละตำแหน่งได้ เช่น Str1[3] ฯลฯ

เรายังสามารถประกาศตัวแปรแบบ Array[0..n-1] of Char แล้วใช้เป็น String ได้อีกด้วย
แต่ !!! ตัว Index เริ่มต้นจะต้องเป็น 0 เท่านั้น แต่จะมีความแตกต่างอยู่อย่างหนึ่งคือ
String จะมี Index เริ่มต้นที่ 1
ส่วน Array[0..n-1] of Char จะมี Index เริ่มต้นที่ 0
ลองดูตัวอย่างกันสักนิด


เราสามารถกำหนดให้ Str2 := ' ข้อความ' ได้
และยังให้ Str1 ที่มีชนิดตัวแปรเป็น string มารับข้อมูลจาก Str2 ได้เลย
แต่ไม่สามารถจะเขียนว่า Str2 := Str1 ได้
และถ้าเราประกาศตัวแปร Str1 เป็น string[80] เราก็ไม่สามารถที่จะให้ Str1 := Str2; ได้


วันนี้ขอจบแค่นี้ก่อน เดียวงงกว่าเดิมส่วนเรื่องที่ว่าการประกาศ Array แบบที่ 2 นั้นมันดียังไง ขอติดไว้ก่อน

ก่อนไปก็ฝากการบ้านไว้สักหน่อยดีกว่า หุหุ

13) ให้รับข้อความเข้ามา แล้วให้แสดงข้อความที่รับมาแบบย้อนจากหลังมาหน้า
เช่นรับเข้าไปว่า String ให้แสดงผลออกมาว่า gnirtS
14) ให้รับข้อความเข้ามาแล้วนับว่าในข้อความนั้นมีตัว i กี่ตัว ( ไม่ต้องนับตัว I ใหญ่ )
15) ให้รับคะแนนนักเรียนเข้ามา 10 คน ไปไว้ใน array ก่อน แล้วค่อยคำนวณหาค่าเฉลี่ย
16) ให้รับข้อความเข้ามาแล้วเปลี่ยนตัวอักษร '@' ให้เป็น ตัว 'a' แทน
17) ให้รับข้อความเข้ามาแล้วเปลี่ยนตัวอักษร '@' ให้เป็นคำว่า 'at' แทน
18) ให้รับค่าจำนวนเต็มเข้ามา 6 ตัว แล้วหาค่าที่มากที่สุด
19) ** ให้รับค่าจำนวนเต็มเข้ามา 10 ตัว แล้วเรียงลำดับข้อมูลจากมากไปน้อย
20) ** ให้รับค่าเข้าไป 10 ค่า แล้วหาค่าที่ซ้ำกันมากที่สุด (ฐานนิยม) (แก้โจทย์อยู่ใน เก็บตก #1)
21) * ให้รับข้อความเข้ามา แล้วแสดงข้อความ แต่ถ้าเจอคำว่า \n ให้ขึ้นบรรทัดใหม่
เช่น รับค่าเข้ามาเป็น
String Line 1\nLine 2\nNew Line
จะแสดงผลเป็น
String Line 1
Line 2
New Line

ลองไปทำกันดูนะครับ ส่วนข้อที่มี * ข้างหน้า จะค่อนข้างยากนิดนึง แต่ไม่เกินความรู้ตั้งแต่เรื่องแรก ๆ เลยครับ