מערך חד-ממדי
8.1 הקדמה
מערך הוא קבוצה של משתנים מאותו טיפוס, המסודרים בזה אחר זה בזיכרון. אנו משתמשים במערך כדי לטפל בכמות גדולה של נתונים שאנו רוצים לשמור.
כשאנו רוצים להגדיר מערך עלינו לקבוע את הדברים הבאים:
- מספר התאים (כל תא הוא כמו משתנה) שבמערך (אורך המערך N)
- טיפוס הנתונים שנשמור במערך (טיפוס המערך, כגון: int, char, double…)
- שם המערך.
אפשר לראות במערך קבוצה של משתנים מאותו טיפוס, המסודרים בשורה אחת כך:
בדוגמה שבתמונה מופיע מערך מטיפוס int ששמו arr, ואורכו 10. כל תא מתאי המערך הוא משתנה העומד בפני עצמו.
נשים לב לדברים הבאים:
- לתא הראשון במערך יש המספר הסידורי אפס.
- לתא האחרון במערך יש המספר הסידורי 9 (N-1), כאשר 10 (N) הוא אורך המערך.
- כאשר בונים מערך בשפת סי שארפ, מקבלים אותו ובו ערכים התחלתיים של אפס, ואין צורך לתת לו ערכים התחלתיים או אפסים. זה שונה ממה שהכרנו במשתנים, שקיבלנו אותם כשהם מכילים ערכים חסרי משמעות.
- במערך int או double יש ערכים התחלתיים של אפסים.
- במערך char יש ערכים ריקים (
\0). - במערך string יש ערכים ריקים (null).
- במערך bool יש ערכי false.
8.2 הגדרת מערכים והטיפול במערכים
הפנייה למערך נעשית בעזרת שם המערך והאינדקס של האיבר, וראוי לשים לב שהאינדקס של מערכים בשפת סי שארפ מתחיל מ-0, כלומר arr[0] הוא האיבר הראשון במערך ו-arr[1] הוא האיבר השני במערך, וכן הלאה ....
arr[N-1].לכן, כדי לפנות לאחד התאים (משתנה ממשתני המערך) נכתוב את שם המערך ואת המספר הסידורי, ונטפל בכל תא כאילו הוא משתנה העומד בפני עצמו.
כדי לשנות את ערך התא שהאינדקס שלו 2, נפנה אליו ונטפל בו בעזרת שם המערך ומספר האינדקס שלו, ואז נוכל לטפל בו כפי שאנו מטפלים במשתנה הרגיל שהכרנו קודם. למשל, נשים את הערך 70 בתוך התא הזה בעזרת:
marks[2] = 70 ;
ואם נבצע את הפקודה הבאה:
marks[6] = marks[2] + 3 ;
נקבל את התוצאה הבאה:
איך בונים מערך?:
כדי ללמוד איך בונים מערך נסתכל בדוגמה הבאה:
int[] arr = new int[10];
בדוגמה זו בנינו מערך בשם arr, שאורכו 10 תאים.
תחילה הגדרנו את טיפוס המערך, והוא int[ ], כלומר מערך של מספרים שלמים, אחר כך נתנו למערך שם, arr, ואז בנינו את המערך בזיכרון בעזרת הפקודה new וקבענו שאורכו 10 תאים (ממספר אינדקס 0 עד 9).
כפי שאנו רואים, אנו מקבלים את המערך "מאופס".
new.עשינו זאת קודם כשטיפלנו במחלקה Random.
Random dealer = new Random( );
ואז השתמשנו בפעולה Next כדי לקבל מספרים אקראיים, למשל:
int x = dealer.Next(1,7) ;
x יכול להכיל 1 או 2 או 3 או 4 או 5 או 6.
ואפשר לעשות זאת בשורה אחת כך:
המערכים הם מחלקות לפי הטיפוס.
מערך מטיפוס מספרים שלמים הוא מן המחלקה int[ ].
מערך מטיפוס מספרים עשרוניים הוא מן המחלקה double[ ].
מערך מטיפוס תווים הוא מן המחלקה char[ ].
מערך מטיפוס מחרוזות הוא מן המחלקה string[ ].
מערך מטיפוס בוליאני הוא מן המחלקה bool[ ].
אפשר גם לבנות מערכים עם ערכים התחלתיים ולהגדיר אותם כך:
int[] a = new int[] { 100, 97, 92, 100, 100 };במקרה זה נקבל מערך בשם a, שאורכו 5 איברים (תאים), ובו הערכים הנתונים למעלה.
אפשר לקלוט את ערכי התאים במערך מן המשתמש (כל תא הוא כמו משתנה העומד בפני עצמו), בעזרת שם המערך ומספר האינדקס של התא, למשל:
arr[0] = int.Parse(Console.ReadLine( ));
זה קולט מן המשתמש מספר שלם ושם אותו בתא הראשון של המערך, וכך אפשר לקלוט את כל תאי המערך (נסתייע בפקודות לולאה).
8.3 החשיבות של השימוש במערכים
מערכים משמשים לשמירת נתונים רבים ולטיפול בנתונים אלה בעזרת פקודות לולאה, דבר שאי אפשר לעשות בלי מערכים. אפשר להבהיר זאת בדוגמה הבאה:
כתוב תוכנית שקולטת 10 אותיות מן המשתמש ומדפיסה אותן כך:
(1) בשורה אחת, אות ליד אות, באותו סדר שבו נקלטו מן המשתמש.
(2) בשורה אחת מתחת לשורה הקודמת, אבל נדפיס את האותיות בסדר הפוך לסדר קליטתן מן המשתמש.
public static void Main (string[] args)
{
char a,b,c,d,e,f,g,h,i,j;
Console.Write("Give me a letter: ");
a=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
b=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
c=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
d=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
e=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
f=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
g=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
h=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
i=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
j=char.Parse(Console.ReadLine());
Console.WriteLine("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}",a,b,c,d,e,f,g,h,i,j);
Console.WriteLine("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}",j,i,h,g,f,e,d,c,b,a);
}אבל אם נכתוב את הפתרון בעזרת מערכים, הוא ייראה כך:
using System;
class Hammam
{
public static void Main (string[] args)
{
char[] w = new char[10];
int i;
for(i=0;i<10;i++)
{
Console.Write("Give me a letter: ");
w[i]=char.Parse(Console.ReadLine());
}
for(i=0;i<10;i++)
Console.Write(w[i]);
Console.WriteLine();
for(i=9;i>=0;i--)
Console.Write(w[i]);
}
}אם כן, השימוש במערכים מאפשר לנו להשתמש בפקודות לולאה, כי אנו יכולים פשוט לשנות את האינדקס לכל תא, ואילו במשתנים איננו יכולים לצרף אינדקס, וטעות לעשות זאת.
8.4 הפעולה Length
הפעולה Length היא פעולה שפועלת על מערכים אחרי הצבת הנקודה. פעולה זו מחזירה לנו את אורך המערך, והיא מקלה עלינו את כתיבת תנאי הלולאה עד שמגיעים לתא האחרון במערך.
static void Main(string[] args)
{
int i;
int[] arr = new int[12]; //from 0 to 11
for (i = 0; i < arr.Length; i++)
arr[i] = (int)Math.Pow(i,2);
for(i=0; i< arr.Length ; i++)
Console.Write("{0}|",arr[i]);
}בהרצת התוכנית נקבל את התוצאה הבאה:
0|1|4|9|16|25|36|49|64|81|100|121|
הדפס בין האיברים פסיק (,) אבל אחרי האיבר האחרון מופיעה נקודה (.)
static void Main(string[] args)
{
int i;
int[] arr = new int[8];
for(i=0;i<arr.Length;i++)
{
Console.Write("Insert a number: ");
arr[i] = int.Parse(Console.ReadLine());
}
for(i=arr.Length-1; i>=0; i--)
Console.Write("{0}|",arr[i]);
}תוצאת הרצת התוכנית:
Insert a number: 70 Insert a number: 100 Insert a number: -90 Insert a number: 11 Insert a number: 48 Insert a number: 98 Insert a number: 500 Insert a number: -4 -4|500|98|48|11|-90|100|70|
(א) לבנות מערך חדש שמכיל את אותם מספרים של המערך הקודם, אבל מסודרים בסדר עולה.
(ב) לסדר את המספרים השמורים במערך arr בסדר עולה, בלי להגדיר מערך חדש.
8.5 מערך מונים
אפשר להשתמש במערכים כמונים (counters), כך שכל תא במערך הוא מונה של ערך מסוים, ואפשר לחלק את המקרים לשני סוגים:
- מונה: מונים שמתקדמים באחד בכל פעם.
- צובר: מונים שמתקדמים בערך מסוים, שיכול להיות קבוע או לא קבוע (מונים מצטברים).
const int Mohammad = 0 ; const int Abd = 1 ; const int Mriam = 2 ;
דוגמאות: מערך מונים (מתקדמים באחד):
מספר הסטודנטים הוא 33, ומספריהם הסידוריים הם מ-1 עד 33.
ידוע שהנוכחות בהרצאות היא חובה וחשובה, וסטודנט אינו יכול לגשת לבחינה הסופית אם שיעור הנוכחות שלו בהרצאות נמוך מ-80%.
על התוכנית לרשום את מספר ההיעדרויות של כל סטודנט במהלך הסמסטר במקצוע זה, ולהדפיס על המסך מי הם הסטודנטים שאינם יכולים לגשת לבחינה הסופית ועליהם לחזור על המקצוע בסמסטר הבא, כי נוכחותם הייתה נמוכה מ-80%.
הסבר והבהרה של אסטרטגיית הפתרון:
- לולאה של 14 פעמים (14 שבועות), ובכל פעם נשאל מי הם הסטודנטים הנעדרים, ולפי ההיעדרויות נקדם את המונים.
- על הסטודנט להשתתף ב-12 מפגשים לפחות, כלומר נדפיס את המספר הסידורי של הסטודנטים שיש להם 3 היעדרויות ויותר (מותרות שתי היעדרויות, אבל 3 היעדרויות אסורות והסטודנט לא יוכל לגשת לבחינה).
כתוב תוכנית שעוקבת אחר מספר הנקודות של הקבוצות בליגת גביע הקיץ בכדורגל. נניח שמספר הקבוצות הוא 4, ולכן יש לנו 6 מחזורים. על התוכנית לשאול על כל הקבוצות מהי תוספת הנקודות בכל מחזור, ולעדכן את המערך המתאים שמכיל את הנקודות של כל קבוצה.
בסוף התוכנית עלינו להדפיס מי הקבוצה המנצחת שקיבלה הכי הרבה נקודות, ומי הקבוצה המפסידה שקיבלה את המספר הקטן ביותר של נקודות.
הנקודות מחושבות כך:
ניצחון (w) = 3 נקודות.
תיקו (d) = 1 נקודה.
הפסד (l) = 0 נקודות.
בכל מחזור נשאל על כל קבוצה מה תוצאת המשחק שלה במחזור זה (כלומר לולאה של 6 פעמים (מחזורים)).
אחרי שנמלא את התוצאות בכל המחזורים עלינו לחפש את המנצחת ואת המפסידה (חיפוש הערך הגדול ביותר במערך והערך הקטן ביותר במערך), ולהדפיס את המספר הסידורי של המנצחת ומספר נקודותיה ואת המספר הסידורי של המפסידה ומספר נקודותיה.