פתרון בגרות במדעי המחשב 899371 – קיץ תשפ״ג 2023

פתרון מקורי לאתר shioorim.co.il | נכתב ע״י נהוראי אלבז

הפתרון כתוב ב־C# ומתמקד בדרך הפתרון, בטבלאות מעקב ובמימושים אפשריים.

שאלה 1

סעיף א – טבלת מעקב מלאה

המערך ההתחלתי הוא:

אינדקס 0123456
ערך 3496842

בטבלת המעקב הערך שמופיע עם קו מחיקה הוא הערך הישן, והערך שאחריו הוא הערך החדש לאחר ההחלפה.

i i<7 sum arr[i]
1 true 3 4 4 1
2 true 4 9 9 5
3 true 9 6 6 -3
4 true 6 8 8 2
5 true 8 4 4 -4
6 true 4 2 2 -2
7 false 2 -

לכן תוכן המערך לאחר ביצוע קטע התוכנית:

arr = { 3, 1, 5, -3, 2, -4, -2 }

סעיף ב

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

arr = { 1, 2, 3, 4, 5 }

לאחר הרצת הקוד יתקבל:

arr = { 1, 1, 1, 1, 1 }

שאלה 2

צריך להחזיר אמת אם מתקיים לפחות אחד מן התנאים: ממוצע גדול מ־5, רוב היריות הן 6 ומעלה, או שיש לפחות ירייה אחת בציון 10.

public static bool Success(int num)
{
    int sum = 0;
    int countSixOrMore = 0;
    bool hasTen = false;

    for (int i = 0; i < num; i++)
    {
        int score = int.Parse(Console.ReadLine());
        sum += score;

        if (score >= 6)
            countSixOrMore++;

        if (score == 10)
            hasTen = true;
    }

    double avg = (double)sum / num;

    return avg > 5.0 || countSixOrMore > num / 2 || hasTen;
}

שאלה 3

נבנה מספר תלת־ספרתי. בכל ספרה נציב 1 אם יש זכאות, אחרת 2.

public static int Discounts(int age, int num, bool city)
{
    int result = 0;

    if (age >= 70)
        result += 100;
    else
        result += 200;

    if (num >= 3)
        result += 10;
    else
        result += 20;

    if (city)
        result += 1;
    else
        result += 2;

    return result;
}

שאלה 4

סעיף א – הפעולה Deltas

אם isLonger == true נסכום רק ימים שבהם הזמן גדל לעומת היום הקודם. אם הוא false נסכום רק ימים שבהם הזמן קטן.

public int Deltas(bool isLonger)
{
    int sum = 0;

    for (int i = 1; i < this.arr.Length; i++)
    {
        if (isLonger && this.arr[i] > this.arr[i - 1])
            sum += this.arr[i] - this.arr[i - 1];

        if (!isLonger && this.arr[i] < this.arr[i - 1])
            sum += this.arr[i - 1] - this.arr[i];
    }

    return sum;
}

סעיף ב – הפעולה Improving

public bool Improving()
{
    return this.Deltas(false) > this.Deltas(true);
}

שאלה 5

סעיף א – המכונית שנכנסה ראשונה

public static void First(Parking[] cars)
{
    int firstIndex = 0;

    for (int i = 1; i < cars.Length; i++)
    {
        if (cars[i].GetIn().Before(cars[firstIndex].GetIn()))
            firstIndex = i;
    }

    Console.WriteLine(cars[firstIndex].GetId());
}

סעיף ב(1) – סך דקות החניה במחלקה Parking

public int Total()
{
    return this.inTime.Diff(this.outTime);
}
אם בשמות התכונות במחלקה שלכם משתמשים ב־in ו־out או ב־GetIn/GetOut, יש להתאים את שמות המשתנים. העיקרון הוא להחזיר את ההפרש בדקות בין זמן הכניסה לזמן היציאה.

סעיף ב(2) – סך התשלום של כל המכוניות

public static int SumMoney(Parking[] cars)
{
    int sum = 0;

    for (int i = 0; i < cars.Length; i++)
    {
        int minutes = cars[i].Total();

        if (minutes > 120)
            sum += minutes - 120;
    }

    return sum;
}

שאלה 6

סעיף א

המסר המקורי הוא Study, והמסר המוצפן הוא dyutS.

לכן המערך המפענח הוא:

arr = { 3, 4, 2, 1, 0 }

סעיף ב

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

public static string OriginalText(string str, int[] arr)
{
    string[] original = new string[str.Length];

    for (int i = 0; i < str.Length; i++)
    {
        original[arr[i]] = str[i].ToString();
    }

    string result = "";

    for (int i = 0; i < original.Length; i++)
    {
        result += original[i];
    }

    return result;
}