Java/מערכים: הבדלים בין גרסאות בדף

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