שאלות ראיון עבודה - תוכנה
רוב השאלות בתוכנה מתבססות על ידע של מבני נתונים ומערכות
הפעלה.
שאר השאלות תלויות בתחום המשרה.
שאלות
- מהם העקרונות הבסיסיים של Object Oriented
Programming?
- כתוב פונקציה בשפת
C המבצעת חיפוש בינארי במערך ממוין.
מהי הסיבוכיות של החיפוש?
- ישנו זיכרון משותף לשני מעבדים.
- האם יש בעיה בגישה לזיכרון המשותף?
- כתוב פונקצית גישה לזיכרון המשותף.
- ישנם 2 משתנים
A ו-B.
כתוב
פונקציה בשפת
C המחליפה את הערכים בשני הרגיסטרים, ללא
שימוש בזיכרון נוסף.
- כיצד ניתן לחשב את ערכי הפונקציה
y = n5+n3
, בצורה המהירה ביותר,
כאשר
n
הוא מסוג
int
בתחום 0..255 ו-y
הוא מסוג
float?
- כיצד ניתן למיין מערך באורך
N,
בצורה המהירה ביותר, אם כל איבר במערך הוא מסוג
unsigned char.
- כתוב פונקציה המממשת את סידרת פיבונצ'י:
- 0 = F0
- 1 = F1
- Fn = Fn-1 +Fn-2
כתוב מימוש רקורסיבי ורגיל.
- מה היתרונות ומה החסרונות בשימוש ברקורסיה.
- כתוב פונקציה המבצעת חיפוש ברשימה מקושרת לא
ממוינת.
מה הסיבוכיות של החיפוש?
- כיצד מתבצעת פסיקה (interrupt)
במעבד?
- כיצד ניתן לשנות את הקוד הבא, כך שיבוצע מהר
יותר?
for(i=0; i<5;
i++)
{
func_a(i); }
- נתון מספר בן 16 סיביות. צריך לכתוב פונקצית היפוך של הסיביות
של המספר, באופן המהיר ביותר.
לדוגמא: 0000111101010101 יהפוך ל-1010101011110000.
תשובות
- ריכוזיות
- ריכוז הפונקציות והנתונים של אובייקט אחד.
תורשה
- הורשת תכונות הקלאס לקלאס יותר ספציפי.
פולימורפיזם - קריאה לקלאסים יורשים, כמו לקלאס הבסיס.
-
int
bin_search(int x, int a[], int N)
{
int low=0;
int high=N-1;
int mid;
for(mid=N/2; low<high; mid/=2)
{
if( a[low+mid]<x )
low = low+mid;
elseif( a[low+mid]>x )
high = low+mid;
else // a[low+mid]==x
return (low+mid);
}
return -1; // not found
}
-
- קיימת בעיה כאשר שני המעבדים ניגשים באותו
זמן לזיכרון המשותף.
-
-
void swap(int *a,
int *b)
{
*a += *b;
*b = *a-*b; // a+b-b=a
*a -= *b // a+b-a=b
}
- כיוון ש-n יכול לקבל
רק 256 ערכים, ניתן להשתמש ב-Lookup table -
זהו מערך באורך 256 ערכים, בו ישמרו התוצאות
המחושבות מראש. הגישה למערך תהיה בסיבוכיות של
(1)O .
- כיוון שלכל מספר במערך יש רק 256 ערכים
אפשריים, ניתן להשתמש ב-Bucket sort:
- נגדיר מערך ביניים בן 256 ערכים (דליים).
- נעבור על המערך המקורי ועבור כל מספר,
נקדם באחד את ערך הדלי המתאים.
- נעבור על מערך הביניים ועבור כל דלי שיש
בו ערכים, נכתוב את המספר במערך המקורי.
-
// Recursive
int fibo( int n )
{
int f;
if( n<2 )
f = n;
else
f = fibo(n-1)+fibo(n-2);
return f;
}
// Non recursive
int fibo( int n )
{
int f=1;
int f0=0;
int tmp;
if( n<2 )
f = n;
else
for(int i=0; i<n-2; i++)
{
tmp = f;
f = f+f0;
f0 = tmp;
}
return f;
}
- יתרונות: רקורסיה דורשת פחות קוד, ויותר
אינטואיטיבי, (בעיני חלק מהאנשים).
חסרונות: רקורסיה דורשת הרבה זיכרון ומעמיסה על
המחסנית.
-
struct Leaf {
int val;
struct Leaf *prev;
struct Leaf *next;
};
struct List {
struct Leaf *head;
struct Leaf *tail;
};
struct Leaf *list_search(struct
List *list, int val)
{
struct Leaf *leaf;
for(leaf=list->head; leaf->val!=val;
leaf=leaf->next)
if( leaf==list->tail &&
leaf->val!=val )
return -1;
return leaf->val;
}
- פסיקה במעבד מתבצעת כאשר דגל אפשור הפסיקות 1=IE
וכאשר מתקבלת בקשת פסיקה.
רגיסטר הדגלים נדחף למחסנית.
רגיסטר Program counter) PC)
מקבל את הערך המתאים מטבלת הפסיקות.
- כדי לבצע את הלולאה מהר יותר, יש לבצע:
- פריסת הלולאה (loop unrolling)
תחסוך את התקורה שבביצוע הלולאה:
func_a(0);
func_a(1);
func_a(2);
func_a(3);
func_a(4);
- הגדרת הפונקציה כ-inline (רק
ב-++C) או כמאקרו תחסוך את התקורה
שבקפיצה לפונקציה וחזרה ממנה.
- ניתן להשתמש ב-Lookup Table בן 256
ערכים, כדי להפוך את הביטים של הבייט התחתון ולשים אותם בבייט
העליון ולהשתמש בו שוב כדי להפוך את הביטים של הבייט העליון ולשים
אותם בבייט התחתון.
שאלות ראיון עבודה,
תכונות אישיות, חידות הגיון
שאלות חומרה,
שאלות עיבוד
אותות
אינדקס חברות/משרות:
יוקנעם,
מת"מ,
הרצליה,
עתידים,
רחובות
|