פרק 5 - מערכים
דמיינו שצריך לשמור את הציונים של 30 תלמידים בכיתה. ליצור 30 משתנים נפרדים (grade1,
grade2, וכן הלאה) יהיה מסורבל מאוד, ובטח שיהיה קשה לעבור על כולם עם לולאה. במקום זאת,
נשתמש במערך - קופסה אחת גדולה שיכולה להחזיק הרבה ערכים מאותו סוג.
1. מהו מערך?
מערך הוא אוסף של תאים מאותו סוג. לכל תא יש מספר מקום שנקרא אינדקס.
ב-Java האינדקס הראשון הוא תמיד 0.
כלומר התא הראשון נמצא במקום 0, השני במקום 1 וכן הלאה.
2. יצירת מערך
int[] numbers = {10, 20, 30, 40};
כאן יצרנו מערך של מספרים שלמים בשם numbers.
3. גישה לאיבר במערך
System.out.println(numbers[0]);
System.out.println(numbers[2]);
numbers[0] הוא האיבר הראשון.
numbers[2] הוא האיבר השלישי.
4. שינוי ערך במערך
numbers[1] = 99;
5. מעבר על מערך עם לולאה
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
numbers.length נותן את מספר האיברים במערך.
6. מילוי מערך מקלט המשתמש
לרוב לא נדע מראש מה יהיו הערכים במערך - נרצה לקלוט אותם מהמשתמש, בעזרת Scanner שהכרנו
בפרק הקודם, יחד עם לולאה שממלאת תא אחר תא.
Scanner input = new Scanner(System.in);
int[] grades = new int[5];
for (int i = 0; i < grades.length; i++) {
System.out.print("הכנס ציון: ");
grades[i] = input.nextInt();
}
new int[5] יוצר מערך ריק בגודל 5, שכל תא בו מאותחל בינתיים ל-0.
בכל סיבוב הלולאה ממלאים תא אחד נוסף, לפי הערך של i.
7. תבניות אלגוריתמיות נפוצות
כמעט כל שאלה על מערכים בנויה מכמה תבניות בסיסיות שכדאי להכיר בעל-פה: חישוב סכום, מציאת האיבר הגדול ביותר, וספירת איברים שמקיימים תנאי.
int[] numbers = {7, 15, 3, 22, 9};
int sum = 0;
int max = numbers[0];
int countBig = 0;
for (int i = 0; i < numbers.length; i++) {
sum = sum + numbers[i];
if (numbers[i] > max) {
max = numbers[i];
}
if (numbers[i] > 10) {
countBig++;
}
}
System.out.println("סכום: " + sum);
System.out.println("מקסימום: " + max);
System.out.println("כמה גדולים מ-10: " + countBig);
סכום: צובר שמתחיל מ-0 ומצטבר בכל תא, בדיוק כמו שלמדנו עם לולאות.
מקסימום: משתנה שמתחיל בערך התא הראשון, ומתעדכן בכל פעם שנמצא תא גדול ממנו.
מונה: משתנה שגדל ב-1 רק כשמתקיים תנאי מסוים על התא הנוכחי.
8. שגיאות נפוצות
גישה לאינדקס שלא קיים: אם המערך בגודל 5 (אינדקסים 0 עד 4) וניגשים ל-numbers[5],
תתקבל שגיאת ArrayIndexOutOfBoundsException.
שכחתם לאתחל את המקסימום: אם max יתחיל מ-0 במקום מהתא הראשון, וכל הערכים
במערך שליליים, התוצאה תהיה שגויה.
🎓 זווית הבגרות
איך זה מופיע בבגרות: מערכים הם הנושא הכי נפוץ בחלק הראשון של הבגרות - כמעט תמיד בשילוב עם לולאה שעוברת על כל התאים.
סוג שאלה טיפוסי: שילוב של כמה תבניות יחד (סכום, מקסימום, מונה) באותה לולאה, בדיוק כמו הדוגמה למעלה, או כתיבת מתודה שמקבלת מערך ומחזירה ערך יחיד.
טעות נפוצה: לרוץ עד i <= arr.length במקום
i < arr.length - האינדקס האחרון החוקי הוא תמיד length - 1.
מה לזכור למבחן: לפני שמגישים תשובה, בדקו את גבולות הלולאה מול גודל המערך בפועל.
9. תרגול
מה יודפס למסך על ידי הקוד הבא?
int[] arr = {4, 8, 15, 16, 23};
int total = 0;
for (int i = 1; i < arr.length; i++) {
total = total + arr[i];
}
System.out.println(total);
מה יודפס למסך על ידי הקוד הבא? (ספירה - תבנית "מונה" על מערך)
int[] arr = {5, 8, 5, 3, 5, 9};
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 5) {
count++;
}
}
System.out.println(count);
מה יודפס למסך על ידי הקוד הבא? (שינוי ערכים במערך "במקום")
int[] arr = {1, 2, 3, 4};
for (int i = 0; i < arr.length; i++) {
arr[i] = arr[i] * 2;
}
System.out.println(arr[2]);
כתבו את האינדקס של האיבר הראשון במערך.
כתבו קוד שמדפיס את האיבר הראשון במערך arr.
כתבו את שורת היצירה של מערך שלמים ריק בשם scores בגודל 10.
בתוך לולאה, כתבו את שורת הקוד שמוסיפה את התא numbers[i] לצובר sum.