לחץ ▶ Run כדי להדר ולהריץ את הקובץ. אם התוכנית תבקש קלט, תוכל להקליד אותו כאן למטה.
מבוא למדעי המחשב מ'/ח' - 234114 / 234117 - מועד ב' אביב תשפ"ו
משך הבחינה שלוש שעות - אין חומר עזר - 4 שאלות, 25 נקודות לשאלה.
תרגול. אינו מבחן אמיתי של הטכניון. נבנה על ידי Claude.
---
לכל סעיף ציינו סיבוכיות זמן וסיבוכיות מקום נוסף בסימון Theta, כפונקציה של n.
הניחו כי malloc פועלת בזמן Theta(1) ותופסת מקום כגודל ההקצאה, וכי printf, free ו-sqrt הן Theta(1).
א.
void f1(int n) {
for (int i = 1; i < n; i *= 2)
for (int j = 0; j < i; j++)
printf("*");
}
ב.
int f2(int n) {
if (n <= 1)
return 1;
int* a = malloc(n * sizeof(int));
if (!a)
return 0;
int r = f2(n / 2) + f2(n / 2);
free(a);
return r;
}
ג.
void f3(int n) {
for (int i = n; i > 1; i = i / 2)
for (int j = 1; j < n; j *= 2)
printf("*");
}
---
נתונים שני מערכים באורך n. המערך b הוא תמורה של 0..n-1 (כל ערך מופיע בדיוק פעם אחת).
על הפונקציה לסדר מחדש את a כך שבסיום יתקיים a_new[i] = a_old[b[i]] לכל i, במקום, ולהחזיר את מספר המחזורים בתמורה b.
מותר לשנות את b.
דוגמה: a = {10,20,30,40}, b = {1,0,3,2} -> מחזיר 2, a = {20,10,40,30}
דרישות סיבוכיות: זמן Theta(n) - מקום נוסף Theta(1)
אין להקצות זיכרון דינמי ואין להשתמש בפונקציות ספרייה.
נתונה מחרוזת s של אותיות אנגליות קטנות. יש לכתוב אל p את תת-הסדרה הקטנה ביותר לקסיקוגרפית של s שמכילה כל אות המופיעה ב-s בדיוק פעם אחת, ולהחזיר את אורכה.
דוגמה: s = "cbacdcbc" -> מחזיר 4, p = "acdb"
דרישות סיבוכיות: זמן Theta(n) - מקום נוסף Theta(1)
אין להקצות זיכרון דינמי ואין להשתמש בפונקציות ספרייה.
על הפונקציה להחזיר את הסכום המרבי של תת-מערך רציף ולא ריק של arr.
רקורסיה בלבד, ללא לולאות, ללא פונקציית מעטפת. מותרות פונקציות עזר רקורסיביות.
דוגמה: arr = {-2,1,-3,4,-1,2,1,-5,4} -> 6 (התת-מערך {4,-1,2,1})
דרישות סיבוכיות: אין דרישת סיבוכיות
אין להקצות זיכרון דינמי ואין להשתמש במשתנים גלובליים או סטטיים.
main./grade.