יסודות התכנות בשפת C#‎ · פרק 8 — מערך חד-ממדי⌂📚🏠
פרק 8

מערך חד-ממדי

8.1 הקדמה

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

כשאנו רוצים להגדיר מערך עלינו לקבוע את הדברים הבאים:

אפשר לראות במערך קבוצה של משתנים מאותו טיפוס, המסודרים בשורה אחת כך:

0000000000arr[0]arr[1]arr[2]arr[3]arr[4]arr[5]arr[6]arr[7]arr[8]arr[9]arr

בדוגמה שבתמונה מופיע מערך מטיפוס int ששמו arr, ואורכו 10. כל תא מתאי המערך הוא משתנה העומד בפני עצמו.

נשים לב לדברים הבאים:

8.2 הגדרת מערכים והטיפול במערכים

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

כלל: אם אורך המערך הוא N, פירוש הדבר שלאיבר האחרון במערך יש אינדקס שערכו N-1. כלומר האיבר האחרון במערך הוא arr[N-1].

לכן, כדי לפנות לאחד התאים (משתנה ממשתני המערך) נכתוב את שם המערך ואת המספר הסידורי, ונטפל בכל תא כאילו הוא משתנה העומד בפני עצמו.

דוגמה 8.1
אם הגדרנו מערך בשם marks מטיפוס מספרים שלמים ובאורך 7, ובנינו אותו (נלמד זאת בעוד מעט), נקבל:
האינדקס01234560000000marks[0]marks[1]marks[2]marks[3]marks[4]marks[5]marks[6]marksמספר האינדקס

כדי לשנות את ערך התא שהאינדקס שלו 2, נפנה אליו ונטפל בו בעזרת שם המערך ומספר האינדקס שלו, ואז נוכל לטפל בו כפי שאנו מטפלים במשתנה הרגיל שהכרנו קודם. למשל, נשים את הערך 70 בתוך התא הזה בעזרת:

marks[2] = 70 ;
האינדקס012345600700000marks[0]marks[1]marks[2]marks[3]marks[4]marks[5]marks[6]marksמספר האינדקס

ואם נבצע את הפקודה הבאה:

marks[6] = marks[2] + 3 ;

נקבל את התוצאה הבאה:

האינדקס0123456007000073marks[0]marks[1]marks[2]marks[3]marks[4]marks[5]marks[6]marksמספר האינדקס

איך בונים מערך?:

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

int[] arr = new int[10];

בדוגמה זו בנינו מערך בשם arr, שאורכו 10 תאים.

תחילה הגדרנו את טיפוס המערך, והוא int[ ], כלומר מערך של מספרים שלמים, אחר כך נתנו למערך שם, arr, ואז בנינו את המערך בזיכרון בעזרת הפקודה new וקבענו שאורכו 10 תאים (ממספר אינדקס 0 עד 9).

0000000000arr[0]arr[1]arr[2]arr[3]arr[4]arr[5]arr[6]arr[7]arr[8]arr[9]arr

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

הערה: מערך הוא עצם של מחלקת מערכים, ולכן עלינו לבנות (ליצור) את העצם הזה בעזרת הפקודה new.

עשינו זאת קודם כשטיפלנו במחלקה Random.

תזכורת: אם רצינו להגדיר עצם שמגריל מספרים אקראיים בשם dealer מן המחלקה Random, כתבנו את הדברים הבאים:
Random dealer = new Random( );

ואז השתמשנו בפעולה Next כדי לקבל מספרים אקראיים, למשל:

int x = dealer.Next(1,7) ;

x יכול להכיל 1 או 2 או 3 או 4 או 5 או 6.

כלל: כדי ליצור מערך נכתוב את הדברים הבאים:
הטיפוס[ ]שםהמערך;שםהמערך= newהטיפוס[אורךהמערך];

ואפשר לעשות זאת בשורה אחת כך:

הטיפוס[ ]שםהמערך= newהטיפוס[אורךהמערך];

המערכים הם מחלקות לפי הטיפוס.
מערך מטיפוס מספרים שלמים הוא מן המחלקה int[ ].
מערך מטיפוס מספרים עשרוניים הוא מן המחלקה double[ ].
מערך מטיפוס תווים הוא מן המחלקה char[ ].
מערך מטיפוס מחרוזות הוא מן המחלקה string[ ].
מערך מטיפוס בוליאני הוא מן המחלקה bool[ ].

אפשר גם לבנות מערכים עם ערכים התחלתיים ולהגדיר אותם כך:

int[] a = new int[] { 100, 97, 92, 100, 100 };

במקרה זה נקבל מערך בשם a, שאורכו 5 איברים (תאים), ובו הערכים הנתונים למעלה.

012341009792100100aהאינדקס

אפשר לקלוט את ערכי התאים במערך מן המשתמש (כל תא הוא כמו משתנה העומד בפני עצמו), בעזרת שם המערך ומספר האינדקס של התא, למשל:

arr[0] = int.Parse(Console.ReadLine( ));

זה קולט מן המשתמש מספר שלם ושם אותו בתא הראשון של המערך, וכך אפשר לקלוט את כל תאי המערך (נסתייע בפקודות לולאה).

5294321924arr[0]arr[1]arr[2]arr[3]arr[4]arr[5]arr[6]arr[7]arr[8]arr[9]arr

8.3 החשיבות של השימוש במערכים

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

דוגמה 8.2
(פתרון בלי שימוש במערכים).

כתוב תוכנית שקולטת 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]);
    }
}

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

int n1, n2, n3;for (int i = 1; i <= 3; i++){ ni = int.Parse(Console.ReadLine()); n[i] = int.Parse(Console.ReadLine());}

8.4 הפעולה Length

הפעולה Length היא פעולה שפועלת על מערכים אחרי הצבת הנקודה. פעולה זו מחזירה לנו את אורך המערך, והיא מקלה עלינו את כתיבת תנאי הלולאה עד שמגיעים לתא האחרון במערך.

דוגמה 8.3
int i;int[] arr = new int[10];for(i=0;i<arr.Length;i++)ערכו 10
שאלה 8.1: כתוב תוכנית שמגדירה מערך בן 12 תאים וממלאת כל תא בריבוע של האינדקס של אותו תא (ריבוע המספר הסידורי של האינדקס של כל תא), ואז מדפיסה את התאים האלה.
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]);
}

בהרצת התוכנית נקבל את התוצאה הבאה:

Select Microsoft Visual Studio Debug Console
0|1|4|9|16|25|36|49|64|81|100|121|
שאלה 8.2: כתוב תוכנית שקולטת מן המשתמש מספר טבעי המייצג את מספר האיבר בסדרת פיבונאצ׳י. על התוכנית להדפיס את כל האיברים מן האיבר הראשון (אינדקס 0) עד האיבר שהמשתמש הכניס את מספרו הסידורי.

הדפס בין האיברים פסיק (,) אבל אחרי האיבר האחרון מופיעה נקודה (.)
שאלה 8.3: כתוב תוכנית שקולטת ממשתמש 8 מספרים שלמים ושומרת אותם במערך בשם arr. על התוכנית להדפיס את המספרים בסדר הפוך לסדר הכנסתם.
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]);
}

תוצאת הרצת התוכנית:

Microsoft Visual Studio Debug Console
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|
שאלה 8.4: כתוב תוכנית שקולטת מן המשתמש עשרה מספרים שלמים וחיוביים (העובדה שהם חיוביים מקלה על השאלה) ושומרת אותם במערך בשם arr. על התוכנית:
(א) לבנות מערך חדש שמכיל את אותם מספרים של המערך הקודם, אבל מסודרים בסדר עולה.
(ב) לסדר את המספרים השמורים במערך arr בסדר עולה, בלי להגדיר מערך חדש.

8.5 מערך מונים

אפשר להשתמש במערכים כמונים (counters), כך שכל תא במערך הוא מונה של ערך מסוים, ואפשר לחלק את המקרים לשני סוגים:

  1. מונה: מונים שמתקדמים באחד בכל פעם.
  2. צובר: מונים שמתקדמים בערך מסוים, שיכול להיות קבוע או לא קבוע (מונים מצטברים).
שאלה 8.5: התלמיד מוחמד, התלמיד עבד והתלמידה מרים מתחרים על ראשות הכיתה. מספר המצביעים הוא מספר התלמידים בכיתה. כתוב תוכנית שמגדירה מערך ובו מספר הקולות של כל מועמד אחרי ספירת הקולות. על התוכנית להדפיס את התוצאות על המסך.
const int Mohammad = 0 ;
const int Abd = 1 ;
const int Mriam = 2 ;
MohammadAbdMriam012000Votesהאינדקס

דוגמאות: מערך מונים (מתקדמים באחד):

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

מספר הסטודנטים הוא 33, ומספריהם הסידוריים הם מ-1 עד 33.

ידוע שהנוכחות בהרצאות היא חובה וחשובה, וסטודנט אינו יכול לגשת לבחינה הסופית אם שיעור הנוכחות שלו בהרצאות נמוך מ-80%.

על התוכנית לרשום את מספר ההיעדרויות של כל סטודנט במהלך הסמסטר במקצוע זה, ולהדפיס על המסך מי הם הסטודנטים שאינם יכולים לגשת לבחינה הסופית ועליהם לחזור על המקצוע בסמסטר הבא, כי נוכחותם הייתה נמוכה מ-80%.

הסבר והבהרה של אסטרטגיית הפתרון:

סטודנט 1סטודנט 2סטודנט 3....סטודנט 32סטודנט 330000000std[0]std[1]std[2]....std[31]std[32]שיטה 1
לא בשימושסטודנט 1סטודנט 2....סטודנט 31סטודנט 32סטודנט 330000000std[0]std[1]std[2]....std[31]std[32]std[33]שיטה 2
דוגמה 8.5
(מערך מונים מצטברים)

כתוב תוכנית שעוקבת אחר מספר הנקודות של הקבוצות בליגת גביע הקיץ בכדורגל. נניח שמספר הקבוצות הוא 4, ולכן יש לנו 6 מחזורים. על התוכנית לשאול על כל הקבוצות מהי תוספת הנקודות בכל מחזור, ולעדכן את המערך המתאים שמכיל את הנקודות של כל קבוצה.

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

הנקודות מחושבות כך:
ניצחון (w) = 3 נקודות.
תיקו (d) = 1 נקודה.
הפסד (l) = 0 נקודות.

בכל מחזור נשאל על כל קבוצה מה תוצאת המשחק שלה במחזור זה (כלומר לולאה של 6 פעמים (מחזורים)).

אחרי שנמלא את התוצאות בכל המחזורים עלינו לחפש את המנצחת ואת המפסידה (חיפוש הערך הגדול ביותר במערך והערך הקטן ביותר במערך), ולהדפיס את המספר הסידורי של המנצחת ומספר נקודותיה ואת המספר הסידורי של המפסידה ומספר נקודותיה.
המאם ותד (أ. همام وتد) — כל זכויות הספר שמורות למחבר. הספר נכתב בערבית, ותרגם אותו לעברית פהד גאנם. המהדורה העברית מתפרסמת באישור המחבר, עם תיקונים שאישר. ליצירת קשר עם המחבר: hammam4112@gmail.com