25
ממדי- מערך דוJava

מערך דו ממדי

Embed Size (px)

Citation preview

Page 1: מערך דו ממדי

מערך דו-ממדי

Java

Page 2: מערך דו ממדי

מערכת שעות

נניח קיומה של מערכת שעות שבועית לכיתהאחת

שעות 7 ימי-לימוד, ובכל יום 5בשבוע ישנם לכל היותר. בכל שעה – שם מקצוע לימוד.

?כיצד נשמור את נתוני המערכת

Page 3: מערך דו ממדי

מערכת השעות

חמישי רביעי שלישי שני ראשוןתנ"ך מתמטיקה סביבה מתמטיקה ספרות 1שיעור תנ"ך מתמטיקה אנגלית מתמטיקה תנ"ך 2שיעור

סביבה לשון אנגלית סביבה ספורט 3שיעור לשון אנגלית תלמוד ספרות מתמטיקה 4שיעור

מחנך קולנוע ספורט קולנוע לשון 5שיעור קולנוע מוסיקה קולנוע אנגלית 6שיעור

מוסיקה מוסיקה תלמוד אנגלית 7שיעור

Page 4: מערך דו ממדי

האם מערך חד-ממדי יתאים?

-אם נכניס את כל שמות השיעורים למערך חדממדי, האם נוכל להגיע בקלות, לדוגמה, לשיעור השני ביום שלישי? קיימת בוודאי דרך שימושית

יותר לארגון המידע.

13 12 11... מוסיקה מוסיקה תלמוד ...

Page 5: מערך דו ממדי

נבנה מערכת אינדקסים כפולה:7 עד1, שעות מ-5 עד 1ימים מ-

5 4 3 2 1תנ"ך מתמטיקה סביבה מתמטיקה ספרות 1תנ"ך מתמטיקה אנגלית מתמטיקה תנ"ך 2

סביבה לשון אנגלית סביבה ספורט 3לשון אנגלית תלמוד ספרות מתמטיקה 4

מחנך קולנוע ספורט קולנוע לשון 5קולנוע מוסיקה קולנוע אנגלית 6

מוסיקה מוסיקה תלמוד אנגלית 7Week[3][4]

Page 6: מערך דו ממדי

גישה אל תא במערך

אם הטבלה כולה נקראתWeek ,נרצה ,לדוגמה, שהשיעור השני ביום שלישי ייקרא

Week[3][2[. כך, באמצעות שם הטבלה ושני אינדקסים

מספריים נוכל להגיע לכל שיעור במערכת. כמובן, עלינו להחליט מיהו האינדקס של הימים

ומי של השעות.

Page 7: מערך דו ממדי

Javaמימוש טבלה דו-ממדית ב-String[][] Week = new String[5][7[;

הסבר:מדובר במערך דו-ממדי (שני מערכות של סוגריים

מרובעים) של מחרוזות (שמות השיעורים). 5נחליט שהאינדקס השמאלי יהיה שייך ליום מ-

ימי-השבוע. האינדקס הימני – למספרו של שיעורי היום.7השיעור מתוך

]Week[5][4השיעור הרביעי ביום חמישי הוא אבל...

Page 8: מערך דו ממדי

כמו במערך חד-ממדיהאינדקס הראשון בכל ממד הוא אפס, ולכן...

ולכן תאי המערך שלנו הם:

יום ה'4 יום ד'3 יום ג'2 יום ב'1 יום א'01 – שיעור 0 Week[0][0[ Week[0][1[ Week[0][2[ Week[0][3[ Week[0][4[

2 – שיעור 1 Week[1][0[ Week[1][1[ Week[1][2[ Week[1][3[ Week[1][4[

3 – שיעור 2 וכן הלאה...

3

4

5

7 – שיעור 6 Week[6][0[ Week[4][6[

Page 9: מערך דו ממדי

הכנסת נתונים

Week[1,3] = “ספורט”;...וכן הלאה

מהסיבה שהאינדקסים הראשונים הם אפסים, זהו, למעשה, השיעור הרביעי ביום השני.

קצת מבלבל כעת, אבל נוכל לפתור בעיה קטנה זאת בהמשך.

Page 10: מערך דו ממדי

סדר האינדקסים משמעותי!

Week[1][6[

Week[2][3[ הוא שיעור הרביעי ביום שלישי .

Week[3][2[ הוא השיעור השלישי ביום רביעי.

אינדקס יום אינדקס שיעור

Page 11: מערך דו ממדי

מה יתרונה של שיטת אחסון נתונים זו?

לכל תא במערך יש כתובת חד-משמעית. לכל שניתאים – כתובת שונה. הכתובת משמעותית,

וקשורה קשר ישיר ליום ולשעה. כמו במערך חד-ממדי, אנו מסתפקים במתן שם

, ובהגדרת מס' השורות ומס' Weekלמערך עמודות.5 שורות ו-7העמודות שלו –

Java משתני-מחרוזת:35 יוצר שמות של Week[0][0], Week[0][1], Week[0][2… ,[

Page 12: מערך דו ממדי

דוגמה לשימוש במערך מערכת השעות

System.out.println(“Type day.”);nt D=input.nextInt();System.out.println(“Type hour.”);int H=input.nextInt();System.out.println(“On that hour you have

“ + Week[D-1][H-1] + “ class.”); מ-1שאלה: מדוע חיסרנו D-ומ H?

Page 13: מערך דו ממדי

1דוגמאות שימושיות

boolean[][] Meeting = new boolean[45][39];.המערך מתעד פגישות במועדון הכרויות בנות. 39 בנים ל-45במערך תאים לפגישות בין

12 אם בן מס' true יהיה ]Meeting[12][5ערכו של , אם עדיין לא false, ו-5כבר נפגש עם בת מס'

נפגשו.

Page 14: מערך דו ממדי

2דוגמאות שימושיות

int[][] ClassRoom= new int[6][5]; 6המערך מתעד את מספרי חדרי הכיתות עבור

שעות של יום לימודים אחד. ערכו 5כיתות ב- אם כיתה 11 יהיה ] ClassRoom[3][4של בחדר כיתה מס' 4 נמצאת בשעה מס' 3מס' 11.

Page 15: מערך דו ממדי

3דוגמאות שימושיות

int twoDice=new int [6][6]; המערך מתעד תוצאות סדרת הטלות של זוג

קוביות, כאשר אינדקס שמאלי שייך לקוביה א' (אדומה) ואינדקס ימני – לקוביה ב' (ירוקה). אם

את ערך התא 1, יש להגדיל ב-3-4הוטל הזוג twoDice[3][4[ בסוף סדרת ההטלות יכיל תא זה .

הופיע.3-4את מספר הפעמים שהזוג הוא זוג אחר, שבו קוביה א' היא 4-3הערה: הזוג

.4, וקוביה ב' היא 3

Page 16: מערך דו ממדי

איתחול מערך חד-ממדי

int[][] numbers = new int[6][6];

מספרים 36 עבור numbersאתחלנו מערך בשם מספרים.6 שורות של 6המסודרים ב-

Java התאים לערך אפס.36 מאתחלת את כל אם מדובר במערך של מחרוזות – ערך

.האיתחול של כל תא הוא מחרוזת ריקהכל הדוגמאות בשקפים הבאים – על

עמודות 6 שורות ו-6מערך זה, של של מספרים.

Page 17: מערך דו ממדי

פעולות בתאים בודדים

.5 ובעמודה 0 בתא בשורה 7הצבת

numbers[0][5] = 7;

קליטת ערך לתא הנמצא בדיוק משמאל לו.

numbers[0][4] = input.nextInt();

הדפסת סכום ערכי שני התאים.

System.out.println( Numbers[0][5] + Numbers[0][4] );

כל הדוגמאות – על מערך עמודות 6 שורות ו-6של

של מספרים.

Page 18: מערך דו ממדי

פעולות על כל תאי המערך

בדומה ללולאתfor שסייעה לנו לעבור על כל האינדקסים של מערך חד-ממדי, נשתמש כעת

לשם ביקור בכל אחד forבשתי לולאות מהתאים.

– נעבור, לפי הסדר, שורה שורה, ובכל שורה בכל תא:13משמאל לימין, ונציב

for (int x=0; x<6; x++)for (int y=0; y<6;y++)

numbers[x][y]=13;

כל הדוגמאות – על מערך עמודות 6 שורות ו-6של

של מספרים.

Page 19: מערך דו ממדי

סדר הביקור בתאים

כאשר ערכו שלx הוא אפס, תתבצע הלולאה , לפי הסדר:0הפנימית עבור כל תאי שורה

Numbers[0][0], Numbers[0][1], Numbers[0][2], Numbers[0][3], Numbers[0][4], Numbers[0][5]

כעת הופך ערךx-ושוב מתבצעת הלולאה 1 ל ,הפנימית על התאים:

Numbers[1][0], Numbers[1][1], Numbers[1][2], Numbers[1][3], Numbers[1][4], Numbers[1][5]

.5וכן הלאה, עד השורה האחרונה, שורה

כל הדוגמאות – על מערך עמודות 6 שורות ו-6של

של מספרים.

Page 20: מערך דו ממדי

יציאה אל מחוץ לגבולות המערך

כמו לגבי מערך חד-ממדי, גם במערך דו-ממדי אילנסות לגשת אל תאים שאינם במערך.

,]int[3][7 היא: Aאם, לדוגמה, הגדרת המערך אינה כתובת של תא במערך, ]A[3][3הרי שהכתובת

(הראשון 2 השורות מסתיימים ב-3כי האינדקסים של ).0הוא

]A[3][2 נמצאת במערך, אך היפוכה ]A[2][3הכתובת אינה נמצאת בו. יש לשים לב לסדר האינדקסים!

כל הדוגמאות – על מערך עמודות 6 שורות ו-6של

של מספרים.

Page 21: מערך דו ממדי

הדפסת טבלה

,ההוראה הבאה תדפיס את כל ערכי התאים במערךלפי סדר השורות, ובכל שורה לפי סדר העמודות, אך כל הערכים המודפסים יופיעו בשורת הדפסה

אחת:

for (int x=0; x<6; x++)for (int y=0; y<6;y++)

System.out.print(numbers[x][y] + “,”);

כל הדוגמאות – על מערך עמודות 6 שורות ו-6של

של מספרים.

Page 22: מערך דו ממדי

איך בכל זאת מדפיסים טבלה?

בלבד, עם ירידה לשורה 0נתחיל בהדפסת שורה מספרי השורה:6חדשה אחרי הדפסת

int x=0;for (int y=0; y<6;y++)

System.out.print(numbers[x][y] + “,”);System.out.println();נשים לב: הירידה לשורה חדשה תתבצע אחרי הדפסת

מספרי השורה – כלומר, פעם אחת בלבד.6

Page 23: מערך דו ממדי

הדפסת טבלה מלאה

נסגור את הוראות הדפסת השורה בבלוק, וכדי השורות, נפעיל מבחוץ על הבלוק עוד 6להדפיס את

לולאה:

for (int x=0; x<6; x++){ for (int y=0; y<6;y++)

System.out.print(numbers[x][y] + “,”); System.out.println(); }

מפקח על מספרי השורות

מבצע הדפסת שורה יחידה

עם ירידה לשורה חדשה בסוף

Page 24: מערך דו ממדי

סיכום מספרי שורה מבוקשת

int sum=0;

for (int y=0; y<6;y++(

sum = sum + numbers[3][y[;

System.out,println(sum(;

מספרי השורה 6נשים לב: די בלולאה אחת, עבור היחידה.

מספר השורה המבוקשת

Page 25: מערך דו ממדי

סיכום מספרי עמודה מבוקשת

int sum=0;

for (int x=0; x<6;x++(

sum = sum + numbers[x][5[;

System.out,println(sum(;

הפעם די בלולאה אחת – עבור מספרי השורות.

מספר העמודה המבוקשת