מערך דו ממדי

Preview:

Citation preview

מערך דו-ממדי

Java

מערכת שעות

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

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

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

מערכת השעות

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ומי של השעות.

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

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

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

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

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

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

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

יום ה'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[

הכנסת נתונים

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

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

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

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

Week[1][6[

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

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

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

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

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

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

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

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

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

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?

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

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

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

נפגשו.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

numbers[0][5] = 7;

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

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

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

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

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

של מספרים.

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

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

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

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

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

numbers[x][y]=13;

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

של מספרים.

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

כאשר ערכו של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של

של מספרים.

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

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

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

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

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

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

של מספרים.

הדפסת טבלה

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

אחת:

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

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

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

של מספרים.

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

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

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

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

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

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

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

לולאה:

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

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

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

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

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

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

int sum=0;

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

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

System.out,println(sum(;

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

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

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

int sum=0;

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

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

System.out,println(sum(;

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

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