פתרון בגרות במדעי המחשב 899371 – קיץ תשפ״ג 2023
שאלה 1
סעיף א – טבלת מעקב מלאה
המערך ההתחלתי הוא:
| אינדקס | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
| ערך | 3 | 4 | 9 | 6 | 8 | 4 | 2 |
בטבלת המעקב הערך שמופיע עם קו מחיקה הוא הערך הישן, והערך שאחריו הוא הערך החדש לאחר ההחלפה.
| i | i<7 | sum | arr[i] |
|---|---|---|---|
| 1 | true | ||
| 2 | true | ||
| 3 | true | ||
| 4 | true | ||
| 5 | true | ||
| 6 | true | ||
| 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);
}
סעיף ב(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;
}