1 / 44

Arrays

Arrays. 168 250 Computer Programming for Engineer โดย ดร . นวภัค เอื้ออนันต์ 30 สิงหาคม 2545. Array คืออ ะไ ร ? จำเป็นแค่ไหน ?. 1. Array คือ ตัวแปรที่เก็บข้อมูลแบบเป็นตาราง 2. ความสำคัญของ Array ในบางกรณีเราต้องเกี่ยวข้องกับข้อมูลแบบ

Download Presentation

Arrays

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Arrays 168 250 Computer Programming for Engineer โดย ดร. นวภัค เอื้ออนันต์ 30 สิงหาคม 2545

  2. Array คืออะไร? จำเป็นแค่ไหน? • 1. Array คือ ตัวแปรที่เก็บข้อมูลแบบเป็นตาราง • 2. ความสำคัญของ Array ในบางกรณีเราต้องเกี่ยวข้องกับข้อมูลแบบ • ตารางเช่น ตารางบัญชี ตารางคะแนนสอบซึ่งตัวแปรธรรมดาไม่สามารถจัดการได้ ลักษณะของตาราง ตารางมิติเดียว (1 Dimension) ตารางสองมิติ (2 Dimension) รายรับของร้านอาหารในคาเฟ่ต์ คนที่ คะแนนสอบ เดือนที่ 1 2 3 4 1 2 3 4 1 2 3 4 ร้านที่

  3. ตารางประกอบด้วย ตารางสองมิติ (2 Dimension) ตารางมิติเดียว (1 Dimension) ชื่อของตาราง คนที่ คะแนนสอบ รายรับของร้านอาหารในคาเฟ่ต์ หมายเลขสดมภ์ เดือนที่ 1 2 3 4 1 2 3 4 1 2 3 4 ร้านที่ ข้อมูลในตาราง หมายเลขช่อง หมายเลขแถว ข้อมูลในตาราง (มีหลายค่า)

  4. Array 1 มิติ เทียบได้กับตารางที่มีแถวเดียวหรือ column เดียว (ตารางมิติเดียว) ข้อมูล 1 ช่องเรียกว่า 1 element ชื่อของ Array Score Index (หมายเลขช่อง) 1 2 3 4 5 Score หมายเลข 3 มีค่า 64 Score หมายเลข 1 มีค่า 100 เวลาเราจะอ้างถึงข้อมูลใน Array 1 มิติ เราจะต้องบอก ชื่อของ Array และหมายเลขช่องเช่น score ช่องที่ 1มีค่า 100

  5. Array 2 มิติ เทียบได้กับตารางที่มีแถวมากกว่า 1 แถวและมีสดมภ์ (column) มากกว่า 1 สดมภ์ MyNumber ชื่อ Array 1 2 3 Row No. MyNumber แถว 2 สดมภ์ 5 มีค่า 1 MyNumber แถว 3 สดมภ์ 4 มีค่า 11 1 2 3 4 5 Column No. เวลาเราจะอ้างถึงข้อมูลใน Array 2 มิติเราจะต้องบอก ชื่อของ Array, หมายเลขแถว และหมายเลขสดมภ์

  6. การประกาศ Array เนื่องจาก array เป็นที่เก็บข้อมูลแบบตาราง ดังนั้นเวลาประกาศเราต้อง ระบุทั้งขนาดของ array (จำนวนช่อง) และชนิดข้อมูล การประกาศ Array 1 มิติ VAR ชื่อของ array : ARRAY [index เริ่มต้น .. index สุดท้าย] of ชนิดของ array; หรือ VAR ชื่อของ array : ARRAY [indextype] of ชนิดของ array; โดย index_type จะต้องเป็นข้อมูลที่มีลำดับเช่น integer, char หรือ enumerated data type อย่าลืมใส่ .. ระหว่าง index 2 ตัว ตัวอย่าง ได้ score เป็น array ขนาด 10 ช่อง Var score:array[1..10] of real; หมายเลข index เริ่มต้น หมายเลข index สุดท้าย

  7. ตัวอย่างการประกาศ Array 1 มิติ Var number:array[‘A’..’Z’] of integer; ใช้ตัวอักษรเป็น index ก็ได้ Var y:array[-5..10] of real; Index มีค่าเป็นลบก็ได้ Type month = 1..12; Var rainfall:array[month] of real; ใช้คำสั่ง Type ช่วยสร้าง index type Rainfall เป็น array ที่ใช้เก็บ ปริมาณน้ำฝนใน 12 เดือน การเรียกใช้ Array 1 มิติ เหมือนการใช้ตัวแปรทั่วไปแต่ต้องมีหมายเลข index บอกด้วย เช่น readln(score[2]) rainfall[4] := 588; n := 5; y[n+2] = 10; รับข้อมูลให้ score ช่องที่ 2 ตั้งค่าให้ rainfall เดือน 4 เป็น 588 เราสามารถใช้นิพจน์ทางคณิตศาสตร์หรือ ตัวแปร ในการแทน index ได้

  8. ตัวอย่างการใช้ Array 1 มิติ Program FindAverage; Var score:array[1..10] of real; i:integer; avg,sum:real; Begin writeln(‘Please enter student score’); for i := 1 to 10 do begin write(‘No.’,i,’:’); readln(score[i]); end; sum := 0; for i:=1 to 10 do sum := sum + score[i]; avg := sum/10; writeln(‘Average score = ‘,avg); End. กำหนด array ขนาด 10 ช่อง ชื่อ score เอาไว้เก็บคะแนนสอบ ของนักเรียน 10 คน ทำการวนรอบ 10 ครั้งเพื่ออ่านคะแนน ของนักเรียน 10 คน (รอบละคน) หาผลรวมของคะแนนทั้ง 10 คน ได้ค่าเฉลี่ยออกมา

  9. ตัวอย่างการใช้ Array 1 มิติที่ไม่ดี ตัวอย่างที่ไม่ดี ตัวอย่างที่ดี Program FindAverage; Var score:array[1..10] of real; i:integer; avg,sum:real; Begin writeln(‘Enter score’); readln(score[1]); readln(score[2]); readln(score[3]); readln(score[4]); readln(score[5]); readln(score[6]); readln(score[7]); readln(score[8]); readln(score[9]); readln(score[10]); Program FindAverage; Var score:array[1..10] of real; i:integer; avg,sum:real; Begin writeln(‘Enter score’); for i := 1 to 10 do begin write(‘No.’,i,’:’); readln(score[i]); end; โปรแกรมสั้น กว่ามาก สวยงาม ไม่ได้ใช้ประโยชน์จากการใช้ index ของ Array เต็มที่ ทำให้เขียนโปรแกรม ยาวมาก และไม่ยืดหยุ่น

  10. ตัวอย่างการใช้ Array 1 มิติ (ต่อ) Program Statistics; Var score:array[1..10] of real; i:integer; avg,sd,sum:real; Begin writeln(‘Please enter score’); sum := 0; for i := 1 to 10 do begin write(‘No.’,i,’:’); readln(score[i]); sum := sum + score[i]; end; avg := sum/10; sum := 0; for i:=1 to 10 do sum := sum + (score[i]-avg)* (score[i]-avg); sd := sqrt(sum/10); writeln(‘Average = ‘,avg:0:2,’ SD=‘,sd:0:2); End. ทำการวนรอบ 10 ครั้งเพื่ออ่านคะแนน ของนักเรียน 10 คน (รอบละคน)พร้อม ทั้งหาค่าเฉลี่ย ทั้งหาค่าความเบี่ยงเบน มาตราฐาน standard deviation

  11. ตัวอย่างการใช้ Array 1 มิติขั้นสุดยอด Program Histogram; Var histo:array[0..10] of int; score:array[1..100] of real; i : integer; Begin for i := 0 to 10 Do histo[i] := 0; writeln(‘Please enter score’); for i := 1 to 100 do begin write(‘No.’,i,’:’); readln(score[i]); histo[ round(score[i])] := histo[ round(score[i])] +1; end; for i:=0 to 10 do writeln(‘Number of student having score=‘,i,’ is ’,histogram[i]); End. ต้องการเขียนโปรแกรมเพื่อเก็บคะแนน ของ นักเรียน 100 คนโดยมีคะแนนเต็ม 10 พร้อมทั้งนับว่ามีกี่คนที่ได้ 0 คะแนน, 1 คะแนน, …, 10 คะแนน. (คือหา Histogram นั่นเอง) ก่อนเริ่มนับ ตั้งค่าให้ histo ทุกตัวเป็น 0 เพิ่มค่าให้ histo[ round(score[i])] ทีละ1 สังเกตการใช้ round(score[i]) มาเป็น index

  12. Top 10 ไวยากรณ์ที่นักศึกษาใช้ผิดบ่อยมาก ตัวอย่างที่ผิด ตัวอย่างที่ถูก Var x1,x2,x3,x4,x5,x6:real; Var x[1..6]: array of real; อย่างนี้ไม่ใช้ arrayแต่เป็นตัวแปร 6 ตัวคือ x1,x2,x3,x4,x5,x6 ได้ x เป็น array ขนาด 6 ช่อง x[4] := 20; x(4) := 20; ให้ใช้เครื่องหมาย [ ] ห้ามใช้เครื่องหมาย ( ) Var score:array[1:20] of real; x:real; Begin x := 10; score[x] = 35.5; score[2.0] := 20.5; Var score:array[1:20] of real; x:integer; Begin x := 10; score[x] := 35.5; score[2] := 20.5; Index ของ array ต้องใช้ให้ถูกชนิด และจะเป็น real หรือทศนิยมไม่ได้

  13. ตัวอย่างการใช้ Array 1 มิติ (ต่อ) Program Statistics; Var score:array[1..10] of real; i:integer; avg,sum,min,max:real; Begin writeln(‘Please enter score’); write(‘No.1:’);readln(score[1]); sum := score[1]; min:= score[1]; max:=score[1]; for i := 2 to 10 do begin write(‘No.’,i,’:’); readln(score[i]); sum := sum + score[i]; if (max<score[i]) then max := score[i]; if (min>score[i]) then min := score[i]; end; avg := sum/10; writeln(‘Average = ‘,avg:0:2,’ Max=‘,max:0:2,’ Min=‘,min:0:2); End. โปรแกรมหาค่าเฉลี่ย ค่าต่ำสุด และ ค่าสูงสุด ของคะแนนนักเรียน 10 คน ตั้งค่าเริ่มต้น อ่านข้อมูลจาก keyboard ปรับค่าค่าสูงสุดใหม่ถ้าค่าสูงสุด เดิมน้อยกว่าคะแนนใหม่ ปรับค่าค่าต่ำสุดใหม่ถ้าค่าต่ำสุด เดิมมากกว่าคะแนนใหม่ หาค่าเฉลี่ย

  14. ผลต่าง 3 ผลต่าง 2 ผลต่าง 1 ผลต่าง 5 ผลต่าง 8 ข้อควรระวังในการใช้งาน Array เนื่องจากขนาดของ Array มีจำกัด เราต้องระวังไม่ให้ index อยู่นอกช่วงที่กำหนดไว้ ตัวอย่าง ต้องการเขียนโปรแกรมหาค่าผลต่างที่มากที่สุดของค่าใน array ที่อยู่ติดกันเช่น มี Array ชื่อ score มีค่าดังนี้ผลต่างที่มากที่สุดคือ 8 Program MaxDif; Var score : array [1..6] of integer; i, max, d : integer; Begin for i := 1 to 6 do read(score[i]); writeln; max := 0; for i := 1 to 6 do begin d := abs(score[i+1] - score[i]); if max < d then max := d; End; writeln(‘Max = ’ ,max); End. Score[1] Score[2] Score[3] Score[4] Score[5] Score[6] โปรแกรมนี้มีที่ผิดที่หนึ่ง คือตรง For i := 1 to 6 และ Score[i+1] เพราะ เมื่อ i เป็น 6 จะทำให้ i + 1 เป็น 7 ซึ่งเกินขอบเขตของ index ของ score

  15. ข้อควรระวังในการใช้งาน Array (ต่อ) Program MaxDif; Var score : array [1..6] of integer; i, max, d : integer; Begin for i := 1 to 6 do read(score[i]); writeln; max := 0; for i := 1 to 5 do begin d := abs(score[i+1] - score[i]); if max < d then max := d; End; writeln(‘Max = ’ ,max); End. ที่ถูกคือแก้เป็น 5 เพื่อที่ i + 1 จะได้ไม่เกิน 6

  16. ตัวอย่างการใช้งาน Array 1 มิติ วิชาหนึ่งมีนักเรียน 20 คนจงเขียนโปรแกรมการตัดเกรดวิชานี้โดยเกณฑ์ดังนี้ ถ้า score >= 80 ได้ ‘A’ ถ้า 70 <= score < 80 ได้ ‘B’ ถ้า 60 <= score < 70 ได้ ‘C’ ถ้า 50 <= score < 60 ได้ ‘D’ ถ้าต่ำกว่านี้ได้ ‘F’ จากนั้นคำนวณว่าได้ เกรด ‘A’ กี่คน ‘B’ กี่คน ‘C’ กี่คน ‘D’ กี่คน ‘F’ กี่คน วิเคราะห์ 1. เราต้องสร้าง array ชื่อ score ที่เป็น real จำนวน 20 ช่องเอาไว้เก็บคะแนน 2. เราต้องสร้าง array ชื่อ grade ที่เป็น char จำนวน 20 ช่องเอาไว้เก็บเกรดของนักเรียนแต่ละคน 3. เราต้องสร้าง array ชื่อ count ที่มี index เป็น ‘A’..‘F’ เอาไว้นับจำนวนคนที่ได้แต่ละเกรด (ถึงแม้ว่า ตัว ‘E’ เราจะไม่ใช้)

  17. ตัวอย่างการใช้งาน Array 1 มิติ (ต่อ) writeln(‘Please enter student score : ’); For i := 1 to 20 Do Begin write(‘Student No : ’,i, ‘ score = ’); readln(score[i]); grade[i] := FindGrade(score[i]); writeln(‘Grade = ’,grade[i]); count[grade[i]] := count[grade[i]] + 1; End; For ch := ‘A’ to ‘F’ Do if ch <> ‘E’ then writeln(‘We have ’,ch, ‘ = ’,count[ch], ‘ students.’); End. Program Grading; Var score : array [1..20] of real; grade : array [1..20] of char; count : array [‘A’..‘F’] of integer; i : integer; ch : char; Function FindGrade(x:real):char; Begin if x>=80 then FindGrade := ‘A’ else if x >=70 then FindGrade := ‘B’ else if x >=60 then FindGrade := ‘C’ else if x >=50 then FindGrade := ‘D’ else FindGrade := ‘F’; End; Begin For ch := ‘A’ to ‘F’ Do count[ch] := 0;

  18. สรุปข้อแตกต่างระหว่าง Array กับตัวแปรธรรมดา 1. ตัวแปร เก็บข้อมูลได้ 1 ค่า ดังนั้นเวลาอ้างถึงตัวแปร จะใช้เฉพาะชื่อของตัวแปร 2. Array เก็บข้อมูลได้ หลายค่า และต้องใช้ทั้ง ชื่อของ Array และ index ในการอ้างถึงข้อมูลภายใน (array เหมือนเป็นหอพัก เวลาเราส่งจดหมาย หาเพื่อนในหอพัก จะต้องเขียนทั้งชื่อหอพักและหมายเลขห้องพักด้วย จดหมายถึงจะ ส่งได้ถูกที่)

  19. String : Array of Character ทำไมต้องมี string ข้อมูลประเภท stringหรือข้อความ จัดว่าเป็น Array ของข้อมูลประเภทตัวอักษรแบบหนึ่ง ทำไมเราไม่นิยมสร้าง array ของ char โดยตรงแทนการใช้ string - ถ้าเราจะสร้าง array ของ character โดยใช้คำสั่ง array เราจะต้องกำหนดขนาด ของ array ด้วย เช่น var myname : array [1..10] of char; ซึ่งถ้าเป็นแบบนี้ เวลาป้อนข้อมูลก็ต้องใช้ข้อความที่มีขนาดเท่ากับ ของ array เช่น myname := ‘abcedfghij’; - เราก็ไม่สามารถใช้ read หรือ readln กับ myname โดยตรงได้ ถ้าไม่เชื่อลอง readln(myname) ดู - ความยาวของ array เปลี่ยนแปลงไม่ได้ จะเห็นว่าการกำหนด array ของ char โดยตรง ยุ่งยากและมีข้อจำกัดมาก กำหนดขนาด 10 ตัวอักษร ต้องให้ขนาดเป็น 10 ตัวอักษร

  20. String : Array of Character String เป็นชนิดของข้อมูลแบบ array ของตัวอักษร แต่มีลักษณะพิเศษคือเราไม่ต้อง ระบุขนาดความยาวของ string ในตอนประกาศเช่น var name : string; เราสามารถใช้ assign statement ในการตั้งค่าให้ string เช่น name := ‘Tuksin’; หรือใช้ read หรือ readln ได้โดยตรง และ Pascal จะจำกัดขนาดของ string ไม่ให้เกิน 255 ตัวอักษร เราสามารถจะทราบขนาดความยาวของ string ได้โดยใช้ function length( ) เช่น writeln(length(name)); จะได้ 6 เป็นคำตอบสุดท้าย

  21. String กับการใช้งานแบบ array เนื่องจาก string คือ array ของ char ดังนั้นเราสามารถเข้าถึง ตัวอักษรแต่ละตัว ใน string ได้โดยใช้วิธีการอ้างถึง index แบบเดียวกับ array ได้ เช่น เมื่อให้ myname := ‘Tuksin’; จะได้ myname มีข้อมูลภายในดังนี้ myname ดังนั้น myname[1] จะได้ ‘T’ myname[5] จะได้ ‘i’ หมายเหตุ index ของตัวอักษรใน string จะเริ่มที่เลข 1 คืออักษรตัวแรก

  22. Top 10 สิ่งที่เข้าใจผิดบ่อยมาก ตัวเลข กับ ข้อความ (string)ที่เป็นตัวเลขเป็นข้อมูลคนละชนิดกัน เช่น Program NumberAndString; Var x:integer; y:string; Begin x := 12345; y := ‘12345’; 12345 คือตัวเลข ความหมายต่างกันโดยสิ้นเชิง ‘12345’ คือ string Function ที่ควรรู้สำหรับ string 1. concat(x1,x2,x3,…)เป็นการนำเอา string x1 x2x3 … มาต่อกัน เช่น myname := concat(‘Nawa’,‘pak’); จะได้ myname เป็น ‘Nawapak’ 2. copy(x,y,z)เป็นการคัดลอกตัวอักษร z ตัวจาก string x โดยเริ่มต้น ที่ตัวอักษรที่ y ใน string x เช่น text1 := ‘ABCDEFGH’; Text2 := copy(text1,4,3); จะได้ text2 เป็น ‘DEF’

  23. ตัวอย่างการใช้งาน String โปรแกรมนี้ทำหน้าที่รับ ข้อความเข้ามา แล้วแสดงผลเป็นข้อความที่กลับกัน เช่น เมื่อป้อน ABCD จะได้ DCBA ออกมา Program ReverseOrder; Var textin,textout:string; i , n: integer; Begin textout := ‘’; writeln(‘Please enter 1 word : ’); readln(textin); n := length(textin); for i := n downto 1 Do textout := textout + textin[i]; writeln(textout); End. ตั้งค่าเริ่มต้นให้ textout ความยาวของ textin นับถอยหลังแล้วนำตัวอักษร ตัวหลังของ textin ไปต่อ กับ textout สังเกตว่าเราใช้ operator การบวก + กับ string ได้ ซึ่งจะหมายถึงการเอา string มาต่อกัน

  24. ตัวอย่างการใช้งาน String(ต่อ) โปรแกรมนี้ใช้อ่านข้อความจาก keyboard แล้วทำการแปลง ตัวอักษรตัวพิมพ์เล็กให้เป็นตัวพิมพ์ใหญ่ทั้งหมด Program ChangeToUppercase; Var text,:string; i : integer; Begin writeln(‘Please enter 1 word : ’); readln(text); for i := 1 to length(text) Do if text[i]>=‘a’ and text[i] <= ‘z’ then text[i] := chr(ord(text[i])-32); writeln(text); End. วิธีการแปลงจากตัวอักษร เล็กไปตัวพิมพ์ใหญ่ให้ ลบเลขลำดับของตัว อักษรด้วย 32 ก่อนแปลง กลับเป็น char (เพราะว่า ‘A’ มีลำดับที่ 65 ส่วน ‘a’ มีลำดับที่ 97 ในตาราง ASCII ซึ่งห่างกัน 32)

  25. ตัวอย่างการใช้งาน String(ต่อ) โปรแกรมนี้ใช้นับจำนวนตัวอักษรในประโยคว่า มี A กี่ตัว B กี่ตัว C กี่ตัว จนถึง z กี่ตัว (นั่นคือ การคำนวณ Histogram ของตัวอักษรในคำนั่นเอง) Program CountChar; Var text : string; ch : char; i : integer; count : array [‘A’..’z’] of integer; Begin for ch := ‘A’ to ‘z’ Do count[ch] := 0; writeln(‘Please enter 1 sentence : ’); readln(text); For i := 1 to length(text) Do if (text[i]>=‘A’ and text[i]<=‘Z’) or (text[i] >= ‘a’ and text[i] <=‘z’) then count[text[i]] := count[text[i]]+1; For ch := ‘A’ to ‘z’ Do if count[ch] > 0 then writeln(‘We have ’,count[ch],‘ ’,ch); End. count เป็น array ใช้นับจำนวนตัวอักษร แต่ละสัญลักษณ์ ตั้งแต่ตัว ‘A’ ถึง ‘z’ ก่อนเริ่มนับเราต้อง set ให้ count ทุกตัว เป็น 0 (สังเกตการณ์ใช้ index แบบ char) ป้อนข้อความเข้ามา นับจำนวนตัวอักษรแต่ละสัญลักษณ์ (สังเกตการณ์ใช้ index) แสดงผล

  26. แบบฝึกหัดที่ 1 (Array 1 มิติ) ต้องการนับจำนวนตัวอักษร (เฉพาะตัวพิมพ์ใหญ่) โดยรับข้อมูลประเภทตัวอักษร ทาง keyboard แล้วให้นับว่ามี ตัว A กี่ตัว มี B กี่ตัว , … , มี Z กี่ตัว วิธีทำ ต้องสร้าง Array ที่ใช้เก็บจำนวนเต็มจำนวน 26 ช่องโดยใช้ตัวอักษร ‘A’ ถึง ‘Z’ เป็น index ของ Array 2 3 0 UpcaseSum 10 5 A B C Y Z ชื่อ Array ข้อสังเกตุ เราใช้ตัวอักษรเป็น index

  27. Array2 มิติ เนื่องจาก array 2 มิติเป็นที่เก็บข้อมูลแบบตารางที่มีทั้งสดมภ์ และ แถว ดังนั้นเวลาประกาศเราต้องระบุทั้งขนาดของ array ทั้งจำนวนสดมภ์ และจำนวน แถว และชนิดข้อมูล การประกาศ Array VAR ชื่อของ array : ARRAY [index type1, index type2] of ชนิดของ array; สำหรับ index ของสดมภ์ สำหรับ Index ของแถว โดย index_type จะต้องเป็นข้อมูลที่มีลำดับ (ordinal) เช่น integer, char หรือ enumerated data type ตัวอย่าง Var income:array[1..4,1..12] of integer; ได้ income เป็น array 2 มิติขนาด 4x12 ช่อง

  28. การเข้าถึงข้อมูลใน Array 2 มิติ เนื่องจาก array 2 มิติมีทั้งจำนวนแถวและจำนวนสดมภ์ ดังนั้นถ้าเราจะเข้าถึง ข้อมูลช่องใดช่องหนึ่งก็จะต้องระบุ หมายเลขแถว และ หมายเลขสดมภ์ ด้วย ตัวอย่าง กำหนดให้ Var income:array[1..4,1..12] of integer; โดย income เป็น array ที่ใช้บันทึกค่าเงินรายได้ของร้านค้า 4 ร้าน ในแต่ละเดือน เป็นการตั้งให้ income ร้านที่ 1 เดือนที่ 2 เป็น 2400 บ. income[1,2] := 2400; income[4,10] := 3000; writeln(income[4,10]); เป็นการตั้งให้ income ร้านที่ 4 เดือนที่ 10 เป็น 3000 บ. Array 2 มิติเหมือนเป็นตึกใหญ่ๆ เวลาเราจะไปหาเพื่อนในตึก เราจะต้องรู้ว่า เพื่อนอยู่ชั้นไหน (ชั้นที่ = แถวที่) ห้องที่เท่าไร (ห้องที่ = สดมภ์ที่)

  29. การเข้าถึงข้อมูลใน Array 2 มิติ หอพักแสนสุข ชั้น4 ชั้น 3 ชั้น 2 ชั้น 1 ห้อง 1 ห้อง 2 ห้อง 3 ห้อง 4 ห้อง 5 ถ้าจะไปหาเพื่อนในหอ ต้องบอกหมายเลข ชั้น และหมายเลขห้อง

  30. การป้อนข้อมูล Array 2 มิติ Array 2 มิติเหมาะกับข้อมูลประเภทตารางที่มีจำนวนแถวหลายแถวและสดมภ์หลายสดมภ์ เช่นตารางบัญชี เป็นต้น เนื่องจากเวลาใช้งาน array 2 มิติ เราต้องบอกหมายเลขแถวและสดมภ์ดังนั้นเราจึงนิยมใช้ตัวแปร 2 ตัวในการแทนหมายเลขแถวและสดมภ์ ตัวอย่างนี้ต้องการ เก็บข้อมูลรายได้ ของร้านค้า 4 ร้าน ในแต่ละเดือน ใน Array income Program InputToArray2D; Var income : array [1..4,1..12] of integer; i,j:integer; Begin Writeln(‘Please enter income :’); For i := 1 to 4 Do Begin Writeln(‘Shop No.’,i); For j := 1 to 12 Do Begin Write(‘Month :’,j); Readln(income[i,j]); End; End; ….. มี loop ซ้อนกัน 2 ชั้น Loop ใหญ่คือ Loop i โดย i เป็นตัวแปรใช้แทน index ของแถว ในที่นี้ หมายถึงหมายเลขร้านค้า สังเกตว่าค่าของตัวแปร i เริ่มที่ 1 สิ้นสุดที่ 4 Loop j เป็น Loop เล็ก โดย j ใช้แทน index ของ สดมภ์หรือหมายเลขเดือน โดยเริ่มจาก 1 ถึง 12

  31. การป้อนข้อมูล Array 2 มิติ (ต่อ) การทำงานของโปรแกรม InputToArray2D ผล Runหน้าจอภาพจะเป็นดังนี้ Please enter income: Shop No. 1 Month 1: 250 Month 2: 320 Month 3: 410 …ไปเรื่อยๆจนถึง… Month 12: 510 Shop No. 2 Month 1: 620 Month 2: 740 Month 3: 640 …. …. จนถึงร้านที่ 4 เดือนที่ 12 ช่วงนี้ i มีค่าเป็น 1(หมายถึงร้านค้าแรก) และ j เปลี่ยนค่าจาก 1 ถึง 12 (เดือน) ถัดมา i เป็น 2, … 3, …. จนถึง 4 หมายเหตุ ตัวเลขที่อยู่ในกรอบสี่เหลี่ยม หมายถึงตัวเลขที่ผู้ใช้ป้อนเข้ามา

  32. การป้อนข้อมูล Array 2 มิติแบบตาราง ในตัวอย่างที่แล้วการป้อนข้อมูลนั้นทำทีละค่า ซึ่งเสียเวลาและเปลืองบรรทัด ตัวอย่างข้างล่างนี้แก้ไขเพื่อให้ป้อนข้อมูลรวดเดียวบรรทัดละ 12 เดือน Program InputToArray2D; Var income : array [1..4,1..12] of integer; i,j:integer; Begin For i := 1 to 4 Do Begin Write(‘Shop No.’, i,‘ : ’ ); For j := 1 to 12 DoRead(income[i,j]); Writeln; End; ….. ใช้คำสั่ง read แทนที่จะเป็น readln ป้อนรวดเดียว 12 เดือนใน 1 บรรทัด ใช้ขึ้นบรรทัดใหม่ ผล Run Shop No.1 : 250 320 410 230 190 170 190 260 140 210 320 510 Shop No.2 : 620 740 640 599 385 710 420 450 390 400 420 480 Shop No.3 : …ไปเรื่อยๆจนครบ 4 ร้าน …..

  33. การแสดงผล Array 2 มิติแบบตาราง เราสามารถใช้ Loop ซ้อนกัน 2 ชั้นในการแสดงผลแบบตารางโดยให้ index ใน Loop ใหญ่ แทนแถว และ index ใน Loop เล็กแทนสดมภ์ … Writeln(‘ Income Table’); For i := 1 to 4 Do Begin Write(‘Shop ’,i, ‘ : ’); For j := 1 to 12 Do Write(income[i,j]:3,‘ ’); Writeln; End; ไว้เขียนชื่อตารางบรรทัดบนสุด แสดงตัวเลขอย่างน้อย 3 หลัก ใช้คำสั่ง write เพื่อแสดงค่าในบรรทัดเดียวกัน ใช้ขึ้นบรรทัดใหม่ ใส่ช่องว่างคั่นระหว่างตัวเลข ออกมาเป็นตารางอย่างสวยงาม ผล Run Income Table Shop 1 : 250 320 410 230 190 170 190 260 140 210 320 510 Shop 2 : 620 740 640 99 385 710 420 450 390 400 420 480 Shop 3 : 120 230 90 450 60 670 780 890 900 980 870 760 Shop 4 : 90 280 370 460 550 540 530 520 510 500 490 480

  34. การเขียน Procedure ที่มี Array 2 มิติเป็น parameter ถ้าต้องการส่ง array ใน main program ไปใช้ใน procedure เราต้องกำหนดให้ parameter ของ procedure เป็นแบบ variableparameter และเป็น array ที่ชนิดและขนาดเหมือนกับ array ใน mainprogram Array ใน main Program มี 2 ตัวคือ income และ Outcome ขนาด 4x12 Program InputToArray2; Var income,outcome:array[1..4,1..12] of integer; Procedure InputArray(var x:array [1..4,1..12] of integer); Var i,j:integer; Begin For i := 1 to 4 Do Begin Write(‘Row No.’, i,‘ : ’ ); For j := 1 to 12 DoRead(x[i,j]); Writeln; End; End; Begin Writeln(‘Income :’ ); InputArray(income); Writeln(‘Outcome :’); InputArray(outcome); …… ตัวแปรช่วย ใช้ variable parameter ที่เป็น Array ขนาดและชนิดเท่ากับของ Array ใน Main program ส่วนการป้อนข้อมูล การเรียกใช้งาน procedure

  35. การเขียน Procedure ที่มี Array 2 มิติเป็น parameter (ต่อ) แบบฝึกหัด จงเขียน Procedure ที่ใช้แสดงผล array 2 มิติแบบตารางที่มีขนาด 4x4 พร้อมทั้งแสดงผล Run (ระวัง คราวนี้ array มีขนาด 4x4 ไม่เหมือนในตัวอย่างที่แล้ว) Program DisplayArray; Var mytable : array [1..4,1..4] of real; i,j:integer; Procedure ShowArray( ) Begin End; Begin For i:=1 to 4 Do For j:= 1 to 4 Do mytable[i,j] := i+j; ShowArray(mytable); End.

  36. การเขียน Procedure ที่มี Array 2 มิติเป็น parameter (ต่อ) เฉลย Procedure ShowArray( var x:array [1..4,1..4] of real) Var i,j:integer; Begin For i:=1 to 4 Do Begin For j:=1 to 4 Do Write(x[i,j]:3:1,‘ ’); Writeln; End; End;ร ผล Run 2.0 3.0 4.0 5.0 3.0 4.0 5.0 6.0 4.0 5.0 6.0 7.0 5.0 6.0 7.0 8.0

  37. การหาผลรวมตามแนวแถว (แนวนอน) ของ Array 2 มิติ เ ราสามารถหาผลรวมของ array ตามแนวแถวได้โดยการให้ค่า index ของแถวมีค่าคงที่ ขณะที่ เพิ่มค่า index ตามแนวสดมภ์ไปเรื่อยๆขณะทำการหาผลรวม ตัวอย่าง ถ้าต้องการหา income รวมทั้งปีของร้านค้าแต่ละร้าน Program SumIncomeInYear; Var income : array [1..4,1..12] of real; Total : array [1..4] of real; i,j:integer; Begin …. (ใส่ code ในการป้อนข้อมูล array เอาเอง) For i:=1 to 4 do begin total[i] := 0; for j := 1 to 12 Do total[i] := total[i] + income[i,j]; writeln(‘Total Income of Shop No.’,i, ‘ = ’, total[i]:0:2, ‘ Baht.’); End. ใช้เก็บผลรวม income ของแต่ละร้าน Loop ใหญ่ ตัวแปร i ใช้เป็น index ของแถว (หมายเลขร้านค้า) อย่าลืมตอนเริ่มต้น ต้องตั้งค่าให้เป็น 0 ก่อน Loop เล็ก j เป็น index ของสดมภ์ คำสั่งนี้เป็นการบวกสะสมเงิน รายได้แต่ละเดือนเข้าไป

  38. การหาผลรวมตามแนวสดมภ์ (แนวตั้ง) ของ Array 2 มิติ เ ราสามารถหาผลรวมของ array ตามแนวสดมภ์ได้โดยการให้ค่า index ของสดมภ์มีค่าคงที่ ขณะที่ เพิ่มค่า index ตามแนวแถวไปเรื่อยๆขณะทำการหาผลรวม ตัวอย่าง ถ้าต้องการหา income รวมของทุกร้านในแต่ละเดือน Program SumIncomeInMonth; Var income : array [1..4,1..12] of real; sum : array [1..12] of real; i,j:integer; Begin …. (ใส่ code ในการป้อนข้อมูล array เอาเอง) For j:=1 to 12 do begin sum[j] := 0; for i := 1 to 4 Do sum[j] := sum[j] + income[i,j]; writeln(‘Total income in Month ’,i, ‘ = ’, sum[j]:0:2, ‘ Baht.’); End. ใช้เก็บผลรวม income ของแต่ละเดือน Loop ใหญ่ ตัวแปร j ใช้เป็น index ของสดมภ์ (หมายเลขเดือน) อย่าลืมตอนเริ่มต้น ต้องตั้งค่าให้เป็น 0 ก่อน Loop เล็ก i เป็น index ของแถว คำสั่งนี้เป็นการบวกสะสมเงิน รายได้แต่ละร้านเข้าไป

  39. ข้อแตกต่างระหว่างการหาผลรวมตามแนวแถวและแนวสดมภ์ข้อแตกต่างระหว่างการหาผลรวมตามแนวแถวและแนวสดมภ์ การหาผลรวมทั้งสองแบบมีการใช้คำสั่ง for 2 Loop ซ้อนกันแต่มีข้อแตกต่างกันคือ - การหาผลรวมในแนวแถวนั้น ตัวแปร index ของ Loop ใหญ่คือ i ซึ่งใช้เป็น index ของแถวของ array ในขณะที่ ตัวแปรของ Loop เล็กคือ j ใช้เป็น index ของสดมภ์ของ array - การหาผลรวมในแนวสดมภ์นั้น ตัวแปร index ของ Loop ใหญ่คือ j ซึ่งใช้เป็น index ของสดมภ์ของ array ในขณะที่ ตัวแปรของ Loop เล็กคือ i ใช้เป็น index ของแถวของ array ทำไมเป็นเช่นนี้ ลองหาคำตอบดูเอง !

  40. การหาผลรวมทั้งหมดของ Array 2 มิติ ตัวอย่าง ถ้าต้องการหา income รวมของทุกร้านทุกเดือนรวมกัน Program SumIncomeInMonth; Var income : array [1..4,1..12] of real; SumAll : real; i,j:integer; Begin …. (ใส่ code ในการป้อนข้อมูล array เอาเอง) SumAll := 0; For i:=1 to 4 Do For j := 1 to 12 Do SumAll := SumAll + income[i,j]; writeln(‘Total income of All = ’, SumAll:0:2, ‘ Baht.’); End. ใช้เก็บผลรวมของ income ทั้งหมด เมื่อเริ่มต้นอยู่นอก Loop เราตั้งค่าให้เป็น 0 ก่อนเพราะอะไรคิดดู การบวกแบบสะสม

  41. สุดยอดของการหาผลรวของ Array 2 มิติ Program SumIncomeInMonth; Var income : array [1..4,1..12] of real; total : array [1..4] of real; sum : array [1..12] of real; SumAll : real; i,j:integer; Begin Writeln(‘Please enter income :’); For i := 1 to 4 Do Begin Write(‘Shop No.’, i,‘ : ’ ); For j := 1 to 12 DoRead(income[i,j]); Writeln; End; SumAll := 0; For i :=1 to 4 Do total[i] := 0; For j :=1 to 12 Do sum[j] := 0; For i := 1 to 4 Do For j := 1 to 12 Do Begin total[i] := total[i] + income[i,j]; sum[j] := sum[j] + income[i,j]; SumAll := SumAll + income[i,j]; End; Writeln(‘Income of each shop in 1 year’); For i :=1 to 4 Do write(‘Shop ’,i, ‘ = ’,total[i]:0:2, ‘ ’); Writeln; Writeln(‘Income of all shops in each month’); For j :=1 to 12 Do write(‘Month ’, j , ‘=’,sum[j]:0:2,‘ ’); Writeln writeln(‘Total income of all = ’, SumAll:0:2, ‘ Baht.’); End.

  42. แบบฝึกหัดที่ 2 (Array 2 มิติ) ต้องการสร้าง Array 2 มิติขนาด 5 แถว 5column โดย 1. Array 4 แถวแรก 4 column แรกใช้เก็บเลขทั้งหมด 16 ตัว 2. Array แถวสุดท้าย ใช้เก็บผลรวมของเลขในแนวตั้ง 3. Array สดมภ์สุดท้าย ใช้เก็บผลรวมของเลขในแนวนอน 4. Array ช่องท้ายสุดเก็บผลรวมทั้งหมด จงเขียนโปรแกรมทดลองดู

  43. การใช้งาน Array 2 มิติหลาย Array Program Subtract2Array; Var a,b,c : array [1..5,1..6] of integer; i,j : integer; Begin For i :=1 to 5 Do Begin for j := 1 to 6 Do Read(a[i,j]); writeln; end; For i :=1 to 5 Do Begin for j := 1 to 6 Do Read(b[i,j]); writeln; end; For i :=1 to 5 Do for j := 1 to 6 Do c[i,j] := a[i,j] - b[i,j]; For i := 1 to 5 Do Begin For j := 1 to 6 Do write(c[i,j]:3,‘ ’); writeln; end; ต้องการนำค่าในตาราง 2 ตารางมาลบกัน ใช้สูตร c[i,j] := a[i,j] - b[i,j]; ป้อนค่า array a ป้อนค่า array b คำนวณค่า Array c แสดงผล Array c

  44. การคูณ Matrix 2 มิติ (ยาก!) สูตรการคูณ Matrix ทั่วไป (ในที่นี้ N = 2) Program Multiply2Matrix; Var a : array [1..3,1..2] of real; b : array[1..2,1..3] of real; c : array[1..3,1..3] of real; i,j,k : integer; Begin writeln(‘Please enter array a:’); For i :=1 to 3 Do Begin for j := 1 to 2 Do Read(a[i,j]); writeln; end; writeln(‘Please enter array b’); For i :=1 to 2 Do Begin for j := 1 to 3 Do Read(b[i,j]); writeln; end; For i :=1 to 3 Do For j := 1 to 3 Do Begin c[i,j] := 0; For k := 1 to 2 Do c[i,j] := c[i,j] + a[i,k]*b[k,j]; End; For i := 1 to 3 Do Begin For j := 1 to 3 Do write(c[i,j]:0:1,‘ ’); writeln; End; End.

More Related