Java/מערכים: הבדלים בין גרסאות בדף
תוכן שנמחק תוכן שנוסף
מ ←קלט: typo |
Johnny Zoo (שיחה | תרומות) מ מעבר לתגי source במקום pre |
||
שורה 18:
==מערכים ולולאות==
באופן טבעי, מבנהו של המערך מביא לכך שהשימוש בו כרוך יד ביד עם לולאות, בדרך כלל - לולאות for. הבה נראה דוגמה פשוטה לקטע קוד שמדפיס מערך שגודלו 5. נניח כי קיים מערך מסוג int בשם arr, אליו הכנסנו ערכים שונים, וכעת אנו מעוניינים להדפיסו. נראה דרך אחת לעשות זאת:
<source lang = "java">
System.out.print(arr[0]+" ");
System.out.print(arr[1]+" ");
שורה 25:
System.out.print(arr[4]);
System.out.println();
</
ניכר שזוהי שיטה מסורבלת ולא נוחה, ואפילו לא אפשרית, כאשר מדובר במערך גדול. הבה נראה דרך מוצלחת יותר:
<source lang = "java">
for(int i=0; i<5; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
</
במקום להשתמש במספר מפורש עבור איבר מסויים במערך - השתמשנו במשתנה, שעובר על כל איברי המערך, בזה אחר זה. מעבר כזה מכונה לפעמים [[w:he:איטרציה|איטרציה]]. למעשה, כמעט כל פעולה הקשורה במערך תסתייע גם בלולאה.
שורה 40:
===קלט===
ישנן כמה דרכים להזין מידע למערך. את הדרך הראשונה כבר ראינו - להכניס מידע בזמן האתחול. דרך פשוטה אחרת היא הזנה של המידע כמו במשתנים רגילים: {{קוד בשורה|<nowiki>arr[i] = value;</nowiki>}}, כאשר arr הוא שם המערך, i הוא מספר התא, ו-value - הערך אותו אנחנו רוצים להכניס. נראה דוגמה להכנסת מידע למערך:
<source lang = "java">
double[] arr = new double[30];
Scanner s = new Scanner(System.in);
שורה 47:
arr[i]=s.nextDouble();
}
</
===פלט===
פלט של המערך מתבצע תמיד בצורה של תא אחרי תא, כפי שכבר ראינו. לא ניתן להדפיס מערך בשלמותו על ידי פקודה בודדת. נראה דוגמה לקטע קוד שמטרתו לחשב את הממוצע של איברי המערך, אליו הכנסנו קודם את הנתונים.
<source lang = "java">
double average=0;
for(int i=0; i<30; i++) {
שורה 58:
average=average/30;
System.out.println("Average is "+average);
</
===העתקה===
גם העתקה של מערך צריכה להתבצע תא אחרי תא. שימו לב: מאחר שמערך הוא אובייקט, ניתן לכתוב פקודה כמו {{קוד בשורה|<nowiki>arr2=arr;</nowiki>}} (בהנחה ששני אלו הם מערכים) - התוכנית תרוץ כשורה, ואם נבדוק את תוכן המערכים, נראה ש-arr ו-arr2 אכן זהים. עם זאת, ההעתקה אינה אמיתית - arr2 יכיל רק '''הפנייה''' למערך arr. אם נשנה ערך של תא מסויים במערך arr - הוא ישתנה ב-arr2. לכן, אין להשתמש בשיטת ההעתקה הזו. שימוש בה יכול להביא לתקלות רבות. בדוגמה הבאה אנו מעתיקים את הערכים שבמערך המקורי למערך חדש, arr2, שכל נתון בו שווה לחצי מהערך המקביל במערך המקורי.
<source lang = "java">
double[] arr2 = new double[30];
for(int i=0; i<30; i++) {
arr2[i]=arr[i]*0.5;
}
</
==מערכים משוכללים יותר==
שורה 85:
{{קוד|<nowiki>String[][] music = new String[5][13];</nowiki>}}
גישה לתאי המערך תתבצע גם היא באופן דומה למה שכבר ראינו. נראה קטע קוד שמדפיס את כל איברי המערך:
<source lang = "java">
for(int i=0; i<5; i++) {
for(int j=0; j<13; j++) {
שורה 92:
System.out.println();
}
</
כמו שניתן לראות, בצורה מקבילה ללולאות בהן משתמשים עם מערכים חד-מימדיים, במערך דו מימדי נוח להשתמש בשתי לולאות, אחת בתוך השנייה.
====מערכים לא אחידים====
הדרך שראינו קודם להכריז על מערך דו-מימדי היא הפשוטה ביותר, אך איננה הדרך היחידה לעשות זאת. נראה דרכים נוספות:
<source lang = "java">
String[][] music = {{"Album 1", "Song", "Another song"},
{"Album 2", "First Song", "Second song"},
{"Album 3", "First Song", "Second song", "Third song"},
{"Album 4"}};
</
כאן נוצר מערך בגודל שנקבע לפי המשתנים אותם הכנסנו אליו. מערך זה אינו בהכרח ריבועי - מספר האיברים בכל מערך חד-מימדי הוא שונה. כמו במערכים חד מימדיים שנוצרים בדרך זו, גם במערכים דו-מימדיים ניתן ליצור מערך בצורה כזו רק בעת איתחולו. שימו לב כי כל מערך חד-מימדי נכתב בתוך זוג צומדיים נפרדים, המופרדים בפסיק. דרך זו היא מוגבלת: ניתן לאתחל כך מערך רק אם עושים זאת בד בבד עם ההכרזה עליו. לא ניתן להכניס בצורה הזו ערכים למערך אחרי יצירתו - ההכרזה עליו, וזאת אפילו אם המערך לא אותחל עדיין.
שורה 114:
{{קוד|<nowiki>music[1] = new String[13];</nowiki>}}
וכנהוג במערכים, נוח הרבה יותר לעשות זאת בעזרת לולאה:
<source lang = "java">
for(int i=0; i<5; i++)
music[i] = new String[13];
</
חשוב - גישה למערך שהוכרז אך לא אותחל תביא לתקלת זמן ריצה (ולקריסת התוכנית) - יש לשים לב ולהימנע מטעויות כאלה.
שורה 125:
* הנתון שמוחזר הוא מספר שלם, ששווה לגודל המערך. יש לזכור שמיספור איברי המערך מתחיל ב-0, ולכן האינדקס (כלומר, המספר הסידורי) של האיבר האחרון אינו גודל המערך, אלא גודל המערך פחות אחד.
נראה דוגמה לשימוש ב-length:
<source lang = "java">
for(int i=0; i<music.length; i++) {
for(int j=0; j<music[i].length; j++) {
שורה 132:
System.out.println();
}
</
זוהי דוגמה כמעט זהה לזו שכבר ראינו, שמדפיסה את כל איברי המערך הדו-מימדי music, אך כאן ניתן להדפיס (כמעט) בבטחה את המערך גם אם איננו יודעים בוודאות את הגדלים. נזכיר כי אם הכרזנו על מערך ולא אתחלנו אותו - התוכנית תקרוס.
|