תרגול LM - לבגרויות


תרגול 1 לבגרויות NotebookLM. לוגיקה לולאות פעולות מערכים ועצמים

קובץ תרגול 1 - חלק א’: לוגיקה, תבניות ומספרים. חלק ב’ עצמים

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

הכנה לבגרות: תרגול לוגיקה ומבני נתונים - חלק א’

שאלה 1: מכונת המזל של קזינו דמוקלס (תבניות בלולאות)

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

כאשר מוזן למכונה מספר שלם חיובי (num), המכונה מבצעת שני ניתוחים מרכזיים:

  1. טווח ספרות: חישוב ההפרש בין הספרה הגדולה ביותר המופיעה במספר לבין הספרה הקטנה ביותר המופיעה בו.
  2. “התאמת אורך”: בדיקה האם הטווח שחושב זהה לכמות הספרות הכוללת של num.

לדוגמה: עבור המספר 905:

  • הספרה הגדולה ביותר היא 9.
  • הספרה הקטנה ביותר היא 0.
  • טווח הספרות הוא \(9 - 0 = 9\).
  • כמות הספרות היא 3.
  • מאחר ש-9 אינו שווה ל-3, המספר אינו מקיים את תנאי “התאמת האורך”.

א. כתבו פעולה חיצונית ששמה DigitsRange בשפת Java או digitsRange בשפת C#, המקבלת מספר שלם חיובי – num ומחזירה את טווח הספרות שלו (ההפרש בין הספרה הגדולה ביותר לקטנה ביותר המופיעה במספר).

ב. כתבו פעולה חיצונית ששמה CheckLengthMatch בשפת Java או checkLengthMatch בשפת C#, המקבלת מספר שלם חיובי – num. הפעולה תחזיר true אם טווח הספרות של num (כפי שחושב בסעיף א) שווה לכמות הספרות של num. אחרת היא תחזיר false.

הערה: ניתן להניח שקיימת פעולת עזר `CountDigits(num)` המחזירה את מספר הספרות ב-`num`.
חובה להיעזר בפעולה שכתבתם בסעיף א.

שאלה 2: המספרים ה’נרקיסיסטיים’ במערך (מערך, שימוש בפעולות עזר)

מתמטיקאים וחובבי חידות עוסקים בחקר מספרים יוצאי דופן. מספר שלם חיובי – num ייקרא “מספר נרקיסיסטי” אם מתקיים התנאי: מחברים את כל הספרות של num כשהן מועלות בחזקת כמות הספרות שיש ב-num, והסכום שמתקבל שווה ל-num.

לדוגמה: המספר 407 הוא נרקיסיסטי, כי כמות הספרות היא 3, ומתקיים: \(4^3 + 0^3 + 7^3 = 64 + 0 + 343 = 407\).

נתון מערך של מספרים שלמים – arr מטיפוס int.

א. נתונות שתי פעולות עזר שאינכם נדרשים לכתוב:

  1. CountDigits(num): מקבלת מספר שלם ומחזירה את מספר הספרות שבו.
  2. Power(base, exponent): מקבלת בסיס וחזקה ומחזירה את תוצאת החזקה.

כתבו פעולה חיצונית ששמה IsNarcissistic בשפת Java או isNarcissistic בשפת C#, המקבלת מספר שלם חיובי – num (הגדול מ־0) ומחזירה true אם המספר הוא “מספר נרקיסיסטי”, ואחרת מחזירה false.

ב. כתבו פעולה חיצונית ששמה CountNarcArray בשפת Java או countNarcArray בשפת C#

  • הפעולה מקבלת את המערך – arr, ומחזירה את כמות המספרים הנרקיסיסטיים המופיעים במערך.
  • הערה: חובה להיעזר בפעולה שכתבתם בסעיף א.

שאלה 3: יעילות - חידת אוזיריס (Ozirim)

נוסע יקר, אתה ניצב מול פתחו של מקדש רע, אל השמש והסדר. על קירות האבן חקוקות אלפי ספרות, וכל אחת מהן שומרת סוד קדום. לכל מספר \(n\) יש את “חותם האוזיריס” שלו – \(O(n)\), אשר מסמל את מכפלת כל ספרותיו. למשל, חותם האוזיריס של המספר 123 הוא: \(O(123) = 1 \times 2 \times 3 = 6\).

הכוהנים הקדומים האמינו כי סכום כל החותמות עד 2025 פותח את השער להכיל את הידע הנצחי.

אם כן, עליך למצוא את: \(O(1) + O(2) + O(3) + \dots + O(2025)\)

אך החידה, נוסע יקר! האגדה מספרת, שמי שמוצא את כל החותמות יזכה לקללתו של רע!

פעל ביעילות!!!

א. כתבו פעולה חיצונית ששמה DigitProduct בשפת Java או digitProduct בשפת C#, המקבלת מספר שלם חיובי – num ומחזירה את “חותם האוזיריס” שלו (מכפלת כל ספרותיו).

ב. כתבו פעולה חיצונית ששמה CalculateOzirimSum בשפת Java או calculateOzirimSum בשפת C#, המקבלת מספר שלם חיובי – N ומחזירה את סכום כל חותמות האוזיריס של המספרים מ-1 ועד N.

הערה: חובה להיעזר בפעולה שכתבתם בסעיף א.

<!-- הפעולה:
```csharp
public static long CalculateOzirimSum(int N)
``` -->

ג. נתחו את יעילות הפעולה שכתבתם בסעיף ב’ מבחינת סיבוכיות זמן ריצה, וציינו את הסיבוכיות במונחי \(O\) (Big O) ביחס ל-N. הסבירו בקצרה מדוע זו הסיבוכיות.

הכנה לבגרות: תרגול לוגיקה ומבני נתונים - חלק ב’

שאלה 4: מערכת ניהול מונים חכמים

הרשות המקומית “עוז” מנהלת את צריכת המים באמצעות מערכת של “מונים חכמים” המודדים את כמות המים שצרך משק בית מסוים בשעה האחרונה. המדידות נשמרות במחלקה MeterReading.

למחלקה MeterReading ארבע תכונות:

  • id – מספר מזהה של המונה (שלם).
  • currentValue – כמות הצריכה בשעה האחרונה (שלם, ביחידות של ליטרים מעוקבים).
  • maxThreshold – ערך סף מקסימלי שאינו אמור להיחצות בצריכה רגילה (שלם).
  • isFaulty – דגל בוליאני המציין אם המונה אובחן כפגום (או אם נרשמה חריגה קיצונית).

הניחו שפעולות get/Get ו-set/Set קיימות עבור תכונות המחלקה.

classDiagram class MeterReading{ - int id - int currentValueeee - int maxThreshold - bool isFaulty + MeterReading(id: int, value: int, threshold: int) + checkFault() bool }

א. כתבו פעולה בונה במחלקה MeterReading המקבלת את מספר המונה – id (מטיפוס שלם), את הצריכה הנוכחית – currentValue (מטיפוס שלם), ואת הסף המקסימלי – maxThreshold (מטיפוס שלם). הפעולה תאתחל את התכונות המתאימות. התכונה isFaulty מאותחלת ל-false.

ב. כתבו פעולה פנימית במחלקה MeterReading ששמה checkFault בשפת Java או CheckFault בשפת C#, שאינה מקבלת פרמטרים. הפעולה בודקת אם הצריכה הנוכחית (currentValue) עולה על maxThreshold או אם הצריכה הנוכחית היא שלילית (מה שמעיד על תקלה במכשיר). אם התנאי מתקיים, הפעולה תעדכן את התכונה isFaulty ל-true ותחזיר true. אחרת, הפעולה תחזיר false.

שאלה 5: ניתוח נתוני המונים (מערך של עצמים)

נתון מערך מלא – readings מטיפוס MeterReading, המכיל את כל קריאות המונים שנאספו במערכת במהלך שבוע. המערך אינו ממוין.

א. כתבו פעולה חיצונית ששמה CountFaultyIDs בשפת Java או countFaultyIDs בשפת C#, המקבלת את המערך – readings. הפעולה מחזירה את כמות המונים שנקבעו כפגומים (isFaulty = true).

הערה: חובה להיעזר בפעולה שכתבתם בסעיף 4.ב. יש להניח שהפעלת הפעולה בסעיף 4.ב על כל עצם במערך מעדכנת את מצבו.

ב. כתבו פעולה חיצונית ששמה GetExtremeFaulty בשפת Java או getExtremeFaulty בשפת C#, המקבלת את המערך – readings. הפעולה מחזירה את מספר הזיהוי (id) של המונה הפגום שבו נמדדה הצריכה הנוכחית השלילית הקיצונית ביותר (הערך השלילי בעל הערך המוחלט הגדול ביותר).

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

שאלה 6: אימות קוד מקצוע ייחודי (לולאות מקוננות)

מערכת הרישום לקורסים באוניברסיטה דורשת מכל קוד מקצוע להיות ייחודי. קוד מקצוע (courseId) מטיפוס שלם נחשב “ייחודי חלוקתית” אם כל אחד ממחלקיו החיוביים והשלמים (חוץ ממנו) מופיע בו כספרה בודדת, לפחות פעם אחת.

לדוגמה: עבור קוד המקצוע 24:

  • המחלקים (חוץ מ-24) הם: 1, 2, 3, 4, 6, 8, 12.
  • במספר 24 מופיעות הספרות 2 ו-4.
  • המחלק 1 לא מופיע, המחלק 3 לא מופיע, המחלק 6 לא מופיע וכו’.
  • לכן 24 אינו “ייחודי חלוקתית”.

עבור קוד המקצוע 90918:

  • המחלקים הם: 1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90, 101, 182, וכו’.
  • המחלקים החד-ספרתיים (חוץ מהמספר עצמו) הם: 1, 2, 3, 5, 6, 9.
  • כל המחלקים 1, 2, 3, 5, 6, 9 מופיעים כספרות במספר 90918.
  • לכן 90918 הוא “ייחודי חלוקתית”.

נתונות פעולות עזר שאינכם נדרשים לכתוב: DigitExists(num, digit): מקבלת מספר שלם חיובי num וספרה digit (בין 0 ל-9), ומחזירה true אם digit מופיעה ב-num.

כתבו פעולה חיצונית ששמה CheckDivisorAppearance בשפת Java או checkDivisorAppearance בשפת C#, המקבלת מספר שלם חיובי – num. הפעולה מחזירה true אם כל המחלקים החיוביים והשלמים החד-ספרתיים של num (חוץ מ-num עצמו) מופיעים כספרות במספר num. אחרת היא מחזירה false.

הערה: יש להתייחס רק למחלקים שהם קטנים מ-10. חובה להיעזר בפעולה הנתונה DigitExists.