29
תתתתת תתתתתתת תתתתתת תתתת תתתתת

שאלות מבחינות קודמות

  • Upload
    selene

  • View
    35

  • Download
    0

Embed Size (px)

DESCRIPTION

שאלות מבחינות קודמות. יואב ציבין. שאלה 4, 25 נק' (3.2.00). כתבו פונקציה המקבלת מערך וגודלו ומחזירה TRUE אם יש במערך שני איברים שווים בערכם (מחזירה FALSE אחרת). השתדלו למצוא פתרון יעיל מבחינת סיבוכיות זמן. typedef enum {FALSE,TRUE} bool ; bool Yesh1( int ar[], int len) { int i; - PowerPoint PPT Presentation

Citation preview

Page 1: שאלות מבחינות קודמות

שאלות מבחינות קודמות

יואב ציבין

Page 2: שאלות מבחינות קודמות

(3.2.00 נק' )25, 4שאלה

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

אחרת(. השתדלו FALSEבערכם )מחזירה למצוא פתרון יעיל מבחינת סיבוכיות זמן.

typedef enum {FALSE,TRUE} bool;bool Yesh1(int ar[], int len) {

int i;merge_sort(ar, len);for (i=1; i<len; i++)

if (a[i-1]==a[i]) return TRUE;return FALSE;

}

Page 3: שאלות מבחינות קודמות

סעיף בבמערך דו-מימדי הוא ארבעה תאים סמוכים בצורת ריבוע

ריבוע. כתבו פונקציה המקבלת טבלה( table) ומחזירה TRUE אם

יש בטבלה לפחות שני ריבועים שונים בעלי אותו סכום של איבריהם. ריבועים שונים יכולים להיות חופפים חלקית.

:דוגמא

.10בכל אחד משלושת הריבועים סכום האיברים הוא

typedef int table[N][M];61

21223

3423

Page 4: שאלות מבחינות קודמות

המשך סעיף ב

bool Yesh2(table t) {int helper[N-1][M-1];int i,j;for (i=0; i<N-1; i++)

for (j=0; j<N-1; j++)helper[i][j] =

t[i][j]+ t[i+1][j]+ t[i][j+1]+ t[i+1][j+1];

return Yesh1(&helper[0][0], (N-1)*(M-1) );}

Page 5: שאלות מבחינות קודמות

נקודות(15 )08/02/01מבחן

נתון:

. m ומספר שלם n, את אורכו aמערך שלמים

ממוין בסדר לא יורד.aידוע שהמערך

כתוב פונקציה שעונה על השאלה הבאה:

האיברים של הקבוצה כל מכיל את aהאם המערך

.O(1), זכרון נוסף O(n)דרישות סיבוכיות: זמן

int f4(int a[], int n, int m) {

int i=0, j=1;

while (i<n && j<=m) {

if (a[i] > j*j) return 0;

if (a[i] == j*j) {

++i;

++j;

} else ++i;

}

return (j>m);

}

2 2 2 21 ,2 ,3 , m

Page 6: שאלות מבחינות קודמות

נקודות(15 )09/07/01מבחן a הוא מערך שלמים באורך n -ידוע ש .n.אי-זוגי

בסדר הבא משמאל לימין:aהבא כך שידפיס את אברי הרקורסיבי נק') השלימו את הקוד 8א. ( a[0], a[n-1], a[1], a[n-2], …, a[(n-1)/2]

אחד בלבד.)simple statement( בכל מלבן יש לכתוב פסוק פשוט void extreme_to_middle(int a[], int n) if (n== ) { return;

} return;}

בסדר הבא משמאל לימין:aהבא כך שידפיס את אברי הרקורסיבי נק') השלימו את הקוד 7 ב. ( a[(n-1)/2], a[(n-1)/2 - 1], a[(n-1)/2 + 1], …, a[0], a[n-1]

  אחד בלבד.)simple statement(בכל מלבן יש לכתוב פסוק פשוט

void middle_to_extreme(int a[], int n) if (n== ) {

return;}

  return;}

Page 7: שאלות מבחינות קודמות

(28.2.00 נק' )25, 4שאלה מערךA בגודל size של מספרים שלמים חיוביים

כך i < size-1 ≥ 0 אם קיים אינדקס מאוזןהינו שווה לסכום A[i] עד ל A[0]שסכום כל האיברים מ

.A[size-1] עד A[i+1]האיברים מ כלומר

האינדקסi אינדקס האיזון נקרא. כתוב פונקציה המקבלת מערךA של מס' שלמים

חיוביים וגודלו ומחזירה את אינדקס האיזון אם המערך אחרת.1מאוזן ו -

1

0 1

[ ] [ ]i size

j j i

A j A j

Page 8: שאלות מבחינות קודמות

סעיף ב מערךA מאוזן אם 1- של מספרים חיוביים הוא

הוא מאוזן. מערךA של מספרים חיוביים הוא k מאוזן )לכל-

k>1אם הוא מאוזן )

-מאוזןA[i] (k-1) עד A[0]וגם המערך מ

-מאוזן A[size-1] (k-1) עד A[i+1]וגם המערך מ

הוא אינדקס האיזון(. i)כאשר

מאוזן3דוגמא למערך -

561111113441011156

|_______________| |__________| |___________________________| |________________|מאוזן1מאוזן -1 מאוזן -1מאוזן -1 -

|___________________________| |_____________________________________________|מאוזן2מאוזן -2 -

Page 9: שאלות מבחינות קודמות

סעיף ב

כתוב פונקציה רקורסיבית שמקבלת מערךA של מס' חיוביים, גודלו ומס' שלם k ,

0-מאוזן, ו- k הוא A אם 1הפונקציה מחזירה אחרת.

Page 10: שאלות מבחינות קודמות
Page 11: שאלות מבחינות קודמות

שאלות שפתרתי בהרצאה

Page 12: שאלות מבחינות קודמות

נקודות(13 )08/02/01מבחן הינו a[n-1] זוגי וש a[0]ידוע ש אי-זוגי.

כתוב פונקציה שמחזירה אינדקס :המקייםi)כלשהו(

הינו אי-זוגי. a[i +1] זוגי ושa[i]ש

int f(int a[ ], int n) { int low, mid, high; low = 0; high = n – 1; while( low < high-1 ) { mid = (low + high) / 2; if (a[mid] % 2 == 0)

low = mid; else high = mid; } return low;}

Page 13: שאלות מבחינות קודמות

int main(void) {

int y=100;

x = 200;

y = blabla(&x, &y);

printf(“x = %d, y = %d\n”, x, y);

x = 300;

y = 200;

blabla(&y, &x);

printf(“x = %d, y = %d\n”, x, y);

x = 500;

printf(“blabla(&x,&x)=%d.\n”, blabla(&x, &x));

return 0;

}

#include <stdio.h<

int x=1; 

int blabla(int *p1, int *p2) {

int y = 300;

*p2 = 400;

x = x + 300;

return (*p1 + 100);

}ששאלה

ממבחן08/02/01

נקודות(10)

x=500 , y=600

x=700 , y=200

blabla(&x,&x)=800

Page 14: שאלות מבחינות קודמות

נקודות(8 )29/01/03מבחן

void helper(int n, int m) { int i; if(n <= 1) { for(i = 0; i < m; i++) printf("%d", i); return; } helper(n/3, m*3);}

void f(int n) { helper(n, 1);}

helper(n/3, m*3);helper(n/3, m*3);helper(n/3, m*3);

מהי סיבוכיות הזמן והמקום שלf?

O(log n)מקום

O(logמקוםn)

O(n) זמן

O(n2) זמן

Page 15: שאלות מבחינות קודמות

נקודות(16 )08/07/02מבחן נתון מערךa באורך N.הממויין בסדר עולה ממש נתון מערך דו-מימדיb בגודל NxN שכל אחת

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

אינדקס השורה שמספר האיברים בה המופיעים הוא מקסימלי (במידה ויש מספר aגם במערך

שורות כאלו, יש להחזיר אינדקס כלשהו של אחת מהן).

סיבוכיות: זמןO(N2) זכרון נוסף ,O(1) #define N 10

int f(int a[N], int b[N][N]) { …}

בדומה למיזוג

Page 16: שאלות מבחינות קודמות

נקודות(12 )08/02/01מבחן

מוגדרת באופן הבא: הפונקציה

1)

שלםn>1ולכל (2

nf 11 f

1

1

*1n

i

infifnf

int f(int n) {

int sum=1,i;

if (n==1) return 1;

for (i=1; i<n; ++i)

sum += f(i) * f(n-i);

return sum;

}

Page 17: שאלות מבחינות קודמות

נקודות(8 )08/07/02מבחן מגדלי הנוי עם צבעים כרגיל, אסוק שחישוק גדול יונח על גבי

חישוק קטן.n=2

n=2

Page 18: שאלות מבחינות קודמות

פתרון

void colored_hanoi(int n, tower_t from, tower_t to_1, tower_t to_2, tower_t via) {

if (n == 0) return;

hanoi(2*n-2, from, via, to_1); move(from, to_1); move(from, to_2) colored_hanoi(n-1, via, to_1, to_2, from);}

Page 19: שאלות מבחינות קודמות

(2.10.2002 נק' )20, 4שאלה

כל השאלות מבחינות קודמות מופיעות באתר שלי

Page 20: שאלות מבחינות קודמות

המשך

Page 21: שאלות מבחינות קודמות

2המשך

Page 22: שאלות מבחינות קודמות

, 4חורף תשס"א – מועד ב, שאלה נק'16

השלם את המימוש הרקוסיבי שלpivot הפונקציה מחזירה את מספר האיברים

xהקטנים מ- סיבוכיות זמןO(n)

int pivot(int a[], int n, int x) {

if ( n==0 )

return 0;

if ( a[0] < x )

return 1 + pivot(a+1,n-1,x);

if ( a[n-1] >= x )

return pivot(a,n-1,x);

swap( &a[0], &a[n-1] );

return 1+pivot(a+1, n-2, x);

}

Page 23: שאלות מבחינות קודמות

(29.1.03 נק' )20, 1שאלה

Page 24: שאלות מבחינות קודמות

נקודות(15 )02/10/02מבחן #define ALPHABET 4#define N 5void vectors(int word[], int index, int used[]){ int i; if(index == N*ALPHABET) { print_array(word); return; } for(i = 0; i < ALPHABET; i++) { if(used[i] < N){ word[index] = i; used[i]++; permutations(word, index + 1, used); used[i]--; } }}

כתבו תוכנית המדפיסה את כל הוקטורים באורך

N*ALPHABET

מהספרות כל אחתשבהם 0ALPHABET-1

פעמים.N בדיוקמופיעה

int a[N*ALPHABET];int used[ALPHABET]={0};permutations(a,0,used);

הפעלה:

Page 25: שאלות מבחינות קודמות

נקודות(20 )28/02/00מבחן מטרת השאלה לכתוב תכנית שמחשבת מסלול במבוךמשבצת ההתחלה היא השמאלית-עליונהמשבצת הסוף היא הימנית-תחתונה כתבו את ההכרזה והאתחול של מערך דו-ממדי

( נק'3שמייצג את הטבלה שבדוגמא. (#define N 3#define M 6

int main() { int maze[N][M] = {

{0,0,0,1,1,0}, {0,0,0,1,1,0},{0,0,0,1,1,0} };

findPath(maze, 0, 0); return 0;}

Page 26: שאלות מבחינות קודמות

המשך28/02/00מבחן int findPath(int maze[N][M], int x, int y) {

int success=FALSE;

if (x < 0 || x >= N || y < 0 || y >= M) return FALSE;

if (maze[x][y] == 1) return FALSE;

maze[x][y]=1;

if ( (x==N–1 && y==M–1) ||

findPath(maze, x , y – 1) ||

findPath(maze, x - 1, y ) ||

findPath(maze, x + 1, y ) ||

findPath(maze, x , y + 1) ) {

printf(“%d, %d\n”, x, y);

success = TRUE;

{

maze[x][y]=0;

return success;

}

נקודות)3מה הפלט (

נקודות)3מה ייקרה אם נוריד שורה זו (

נקודות)3מה ייקרה אם נוריד שורה זו (

Page 27: שאלות מבחינות קודמות

(3.2.00 נק' )20, 1שאלה השלימו את שלד התכנית הנתון למטה. התכנית מקבלת כקלט

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

מסמן את סוף הסדרה )ואינו נחשב חלק ממנה(.0/1המספר מונה ואחריו –שבר מיוצג בקלט ע"י זוג מספרים שלמים חיוביים

מכנה , מופרדים ע"י '/'.:4/5 12/8 5/21 0/1 הקלט )משמאל לימין( דוגמא 2/7הפלט ניתן להניח שהקלט חוקי ושהמונה והמכנה הם מספרים חיוביים

שמסמן את סוף הסדרה(.0/1 )פרט למספר 0גדולים ממש מ-

Page 28: שאלות מבחינות קודמות

המשך

#include <stdio.h>

struct rational {

int num, denom;

};

typedef struct rational Rational;

/* functions declarations*/

Rational calc(void);

void printRational(Rational);

int main()

{

Rational res = calc();

printRational(res);

return 0;

}

Page 29: שאלות מבחינות קודמות

המשךint gcd(int a, int b) {…}

void printRational(Rational) {…}

Rational readRational(void) {…}

Rational reduceRational(Rational r) {

int cd = gcd(r.num, r.denom);

r.num /= cd; r.denum /= cd;

return r;

}

Rational multiplyRational(Rational r1, Rational r2) {

r1.num *= r2.num; r1.denum *= r2.denum;

return reduceRational(r1);

}

Rational calc(void) {…}