מבוא למדעי המחשב מ'/ח' — 234114 תחזית 09/12 · Moed Bet · Spring 2026 · practice
3:00:00
gcc 13.2 · -std=c99 0/80
1
לחץ ▶ Run כדי להדר ולהריץ את הקובץ. אם התוכנית תבקש קלט, תוכל להקליד אותו כאן למטה.
גודל טקסט

מבוא למדעי המחשב מ'/ח'

234114 / 234117  ·  מועד ב׳  ·  סמסטר אביב תשפ"ו
משך הבחינה: שלוש שעות חומר עזר: אין 4 שאלות · 25 נקודות לשאלה
תרגול מדומה — תחזית 9 מתוך 12 למועד ב׳ אביב 2026. אינו מבחן אמיתי של הטכניון.

שאלה 1 25 נק' — סיבוכיות

לכל סעיף ציינו סיבוכיות זמן וסיבוכיות מקום נוסף, בסימון Θ, כפונקציה של n. חובה לפשט את הביטוי ככל שניתן. הניחו כי סיבוכיות הזמן והמקום של printf ו-free היא Θ(1), וכי סיבוכיות הזמן של malloc(n) היא Θ(1) וסיבוכיות המקום שלה היא Θ(n). הניחו כי sqrt פועלת בזמן Θ(1).

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

א.

void f1(int n) {
    for (int i = 1; i < n; i++) {
        int j = i;
        while (j > 1)
            j /= 2;
        printf("*");
    }
}

ב.

void f2(int n) {
    int i = 0;
    while (i * i < n) {
        for (int j = 0; j < i; j++)
            printf("*");
        i++;
    }
}

ג.

int g(int n) {
    int s = 0;
    for (int i = 0; i < n; i++)
        s += i;
    return s;
}

void f3(int n) {
    for (int i = 0; i < g(n); i++)
        printf("*");
}

שאלה 2 25 נק'

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

int examT_q2(int arr[], int n);

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

קלטפלטהסבר
arr = {9,1,1,1,3,3,3}, n = 70היחיד בהתחלה
arr = {1,1,1,9,3,3,3}, n = 73היחיד באמצע
arr = {1,1,1,3,3,3,9}, n = 76היחיד בסוף
arr = {2,5,5,5}, n = 40שלישייה אחת בלבד
  • ניתן להניח כי הקלט תקין, כי n mod 3 == 1 וכי המבנה אכן כמתואר.
  • אין לשנות את תוכן המערך ואין להקצות זיכרון דינמי.
  • רמז: לפני הערך היחיד כל שלישייה מתחילה באינדקס המתחלק ב-3; אחריו ההיסט משתנה. יש ליישר את נקודת האמצע לתחילת שלישייה לפני ההשוואה.
דרישות סיבוכיותזמן Θ(log n)מקום נוסף Θ(1)

שאלה 3 25 נק'

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

תת-מחרוזת של s היא רצף רציף ולא ריק של תווים ב-s.

int examT_q3(char* s, int k);

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

קלטפלטהסבר
s = "abc", k = 13"a", "b", "c"
s = "abc", k = 22"ab", "bc"
s = "aaa", k = 16כל תת-מחרוזת
s = "aabbcc", k = 28—
  • אין לשנות את תוכן המחרוזת s, אפילו לא באופן זמני.
  • ניתן להניח כי הקלט תקין, כי k ≥ 1 וכי s אינה ריקה.
  • מערך בגודל קבוע (26 תאים) נחשב מקום Θ(1).
  • רמז: "בדיוק k" קל יותר לחשב כהפרש של שתי כמויות מסוג "לכל היותר".
דרישות סיבוכיותזמן Θ(n)מקום נוסף Θ(1)

שאלה 4 25 נק' — רקורסיה

נתון מערך arr של מספרים שלמים באורך n.

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

int examT_q4(int* arr, int n);

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

קלטפלטarr לאחר הקריאה
arr = {3,2,1}, n = 31{1,2,3}
arr = {5,4,3,2,1}, n = 52{1,2,3,4,5}
arr = {1,2,3}, n = 30{1,2,3}
arr = {5,1,2,3,4}, n = 54{1,2,3,4,5}
  • על הפונקציה להיות רקורסיבית בלבד, ללא שימוש בלולאות — בכל הפונקציות שתכתבו, כולל מציאת המינימום.
  • אסור להשתמש בפונקציית מעטפת — examT_q4 עצמה חייבת לקרוא לעצמה.
  • אין להקצות זיכרון דינמי; המיון חייב להתבצע במקום.
  • אין דרישות סיבוכיות בשאלה זו.

איך עובדים כאן

  • כתבו בעורך שמשמאל. שלושה קבצים, לשונית לכל שאלה. אל תשנו את main.
  • הרץ בדיקות מריץ את הפונקציה שלכם מול מקרי הבדיקה של השאלה — כולל בדיקות של האילוצים (לולאות ברקורסיה, שינוי הקלט, פונקציית מעטפת).
  • סיבוכיות אינה נבדקת אוטומטית. פתרון שעובר את כל הבדיקות בסיבוכיות שגויה — נכשל בשאלה.
  • בסיום לחצו סיום והגשה, שמרו את קובץ ההגשה, ובקשו מ-Claude ציון עם /grade.