שחזורי ראיונות עבודה -> a job interview at zon-networks ( founders of Jungo
  • a job interview at zon-networks ( founders of Jungo
  • ע"י: admin
    Thanks for your lovely site. I have been today in a job interview at zon-networks ( founders of Jungo ). here is the exam : given the folowing code , Need to implement the attrib_t struct and attrib_get function My Answer : #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <string.h> // need to Implement this struct typedef struct attrib_t { char attrib[100]; char value[100]; struct attrib_t* Next; } att; // need to Implement this function char *attrib_get(attrib_t **a,char *attrib) { attrib_t *pAtt = *a; while(pAtt) { if(!strcmp(pAtt->attrib,attrib)) return pAtt->value; move_to_next(&pAtt); } } void move_to_next(attrib_t **a) { } void attrib_set(attrib_t **a,char *attrib,char *value) { } void attrib_free(attrib_t **a) { } void main() { attrib_t *a =NULL; attrib_set(&a,"user","jhon"); attrib_set(&a,"mail","jhonSmith@gmail.com"); attrib_set(&a,"user","Smith"); printf("user = %s\nmail = %s" , attrib_get(&a,"user") , attrib_get(&a,"mail")); attrib_free(&a); } // RUN //user = Smith //mail = jhonSmith@gmail.com Hope this help - please let me know if you have any question ? Thanks
  • ע"י: 1_אורח_כללי
    char* newPDes = malloc(sizeof(char) * strlen(pSrc) + 1); סתם נקודה קטנה של תקניות אני חושב שחסרים לך סוגריים ב SIZEOF כי אתה לוקח גודל של char ובמקום להכפיל אותו ב (strlen(pSrc) + 1) אתה מכפיל אותו רק ב strlen(pSrc) ואז מוסיף לכל זה את הקבוע 1 (כפל קודם לחיבור בסדר הפעולות מן הסתם) אתה יכול לטעון שאין פה טעות כי char הוא ממילא בגודל בית אחד אבל לפי ההגיון הזה גם היית יכול בכלל לא להשתמש ב sizeof(char) כי אנחנו כאילו יודעים מה הגודל. מה שנקרא אם כבר אז כבר
  • ע"י: 1_אורח_כללי
    אני ממש לא אחד ששמח על כשלונם של אחרים, אבל במקרה הזה I'll make an exception בחיים לא ראיתי יחס מחפיר כזה לעובדים.
  • ע"י: 1_אורח_כללי
    האתר שלהם (http://www.zon-networks.com) לא עובד כבר כמה ימים, אז נראה שהם סוף-סוף נסגרו.
  • ע"י: 1_אורח_כללי
    מה זאת אומרת פיטרו את כל המתכנתים? החברה נסגרה?
  • ע"י: 1_אורח_כללי
    לכל מי שהיה בראיון שם ולא עבר, סתם שתדעו, שהם פיטרו את כל המתכנתים שלהם לפני מספר שבועות. זה היחס שהייתם מקבלים אם הייתם מתחילים לעבוד שם.
  • ע"י: 1_אורח_כללי
    ביטלתי את הראיון שקבעו לי שם לאור התגובות שקראתי פה. תודה רבה לכולם, חסכתם לי זמן יקר. אני ממליץ לכולם לעשות כמוני, אין טעם לעבוד בחברה לחוצה כל כך שאחרי שאתה עובר ראיונות קשים מאוד שמוכיחים שאתה תותח אז שולחים אותך לCTO שישגע אותך וינסה להוכיח לך שאתה פחות טוב ממנו בC. נו באמת.. יש גבול. אותי הם הפסידו מראש לא אגש לשם, מאידך לא נראה לי שאני הפסדתי משהו.
  • ע"י: 1_אורח_כללי
    הייתי שם גם כן ונכשלתי, יש פתרון משמעותית יותר פשוט ממה שהוצג פה עד עכשיו void str_cpy(char **dst, char *src) { *dst = realloc(*dst, strlen(src) + 1); strcpy(*dst, src); } void str_cat(char **dst, char *src) { *dst = realloc(*dst, strlen(src) + strlen(*dst) + 1); strcat(*dst, src); }
  • ע"י: 1_אורח_כללי
    תראה הסיכוי הוא לא גדול, אבל תמיד כדאי לנסות... אני עברתי את כל השלבים עד הראיון עם ה CTO שאותו לא עברתי... לדעתי כדאי שתלך, במיוחד שאני רואה שאנשים שחזרו כאן את המבחנים בצורה טובה אז אתה יכול אפילו להגיע מוכן... תהנה!
  • ע"י: 1_אורח_כללי
    אני בוגר טכניון טרי. אין לי נסיון ב-C, רק בקורסים כמו מערכות הפעלה, מת"מ וכו'. יש לי שנתיים נסיון בC# באינטל אך לפי מה שאני רואה פה זה ממש לא יעזור לי... למה הם מזמנים אותי לראיון? למה נסיון רב (*רב*) ב-C אינו חלק מדרישות המשרה הרשמיות?? לפי מה שראיתי פה אין לי סיכוי קלוש אפילו לעבור את השלב הראשון... מה דעתכם?
  • ע"י: 1_אורח_כללי
    הייתי בראיון ועברתי את שני השלבים הראשונים. ביקשו ממני לממש את שני הפונקציות בשלב הראשון, בשלב השני ביקשו לצמצמם אותם לפחות מחמש שורות. ואז העבירו אותי לראיון עם הCTO. הוא הושיב אותי ליד מחשב ופתח שני חלונות אחד LINUX BASH עם עץ של תוכנה והשני התצוגה של התוצאה (תוכנה בWINDOWS). הוא ביקש ממני לתקן את התוכנה כך שהוסיף שדה חדש עם ערך. אין לי שום מושג בUI מעולם לא כתבתי UI ולא הצגתי את עצמי כאיש UI. יש לי 25 שנות נסיון בתוכנת זמן אמת מערכות הפעלה וLINUX. אחרי הGREP הראשון שבו ניסתי לאתר את אחד השדות דבר שלקח לי פחות מדקה הוא פסל אותי. הוא אמר לי ואני מצטט: "אנחנו מחפשים אנשים שעובדים סטרקה סטרקה מהר". כזאת שחצנות וחוסר כבוד לא ראיתי מזמן. לפני מספר ימים הם פסלו חבר שלי שלומד לדוקטורט במחשבים. הם מנצלים את המצב בשוק ומרשים לעצמם דברים שבזמן אחר הם לא היו מעיזים. עדיף לעבוד בשמירה ולא לעבוד בחברה כזאת.
  • ע"י: 1_אורח_כללי
    נראה שמה שמעניין אותם זה מקרי הקצה והסגנון - NULL == p ולא p == NULL - במקום להשתמש ב-free ו-malloc אולי str_free ו-str_alloc כדי לשמור על סגנון החבילה - קבלת NULL pointers כפרמטרים - Out of memory כשמבצעים הקצאת זכרון חדשה והטיפול בזה
  • ע"י: עתיד
    מישהו היה בראיון האישי ? מה שאלו ?
  • ע"י: 1_אורח_כללי
    יש לך מושג איך לממש את str_free ו- str_print? האם מימוש אפשרי הוא: str_free { free(a); } נראה לי פשוט מידי...
  • ע"י: פוקי
    מה שנמצא אצלי בהערות בMAIN יהיה נחמד אם אתם תרשם לאתר ולא תגיבו בתור אורח ככה כשהבן אדם הבא שיסתכל על השרשור הזה וירצה לדעת על הראיון וישאל שאלות אתה תקבל הודעה על זה שהגיבו לנושא הזה ותוכל לעזור לו כמו שאני עוזר לך pay it forward
  • ע"י: 1_אורח_כללי
    אתה זוכר במקרה את השמות של הפונקציות האחרות ב- main?
  • ע"י: פוקי
    לא הגעתי לשלב הבא הגעתי המזכירה הושיבה אותי מול מחשב עם NOTEPAD שבו יש את הMAIN והINCLUDES שתיארתי. וליד המחשב דף עם הוראות באנגלית (עם שגיאות GRAMMAR). יש לך חצי שעה פחות או יותר ואז המזכירה מדפיסה את זה ,שולחת אותך למטבח והיא נכנסת לחדר ויוצאת אחרי חצי דקה ואומרת לך אם אתה ממשיך בתהליך או לא אני מניח שבהמשך היית צריך לממש עוד 2 פונקציות מהMAIN
  • ע"י: 1_אורח_כללי
    האם שאלת המימוש של strcpy ו- strcat היתה השאלה היחידה ששאלו אותך? איך התנהל הראיון? :-)
  • ע"י: פוקי
    טוב למי שזה מעניין כנראה הבעיה הייתה שהשתמשתי בstrdup שנמצא בstring.h אבל זה לא פונקציה סטנדרטית בכל מקרה הנה קוד מעודכן כאשר אני מניח שהפונקציות מקבלות מצביע לזכרון שאני עשיתי לו malloc אפשר גם להחזיק מבנה נתונים שמחזיק את כל הפוינטרים לזכרון שעשיתי malloc ואז לפי זה לדעת אם לשחרר או לא. #include <stdlib.h> #include <stdio.h> #include <string.h> void str_cpy(char** ppDes, const char* pSrc){ if(NULL == pSrc){ free(*ppDes); *ppDes = NULL; return; } char* newPDes = malloc(sizeof(char) * strlen(pSrc) + 1); if(NULL == newPDes){ printf("str_cpy: couldn't allocate memory"); }else{ strcpy(newPDes,pSrc); if(NULL != *ppDes){ free(*ppDes); } *ppDes = newPDes; } } void str_cat(char** ppDes, const char* pSrc){ if(NULL == *ppDes){ str_cpy(ppDes ,pSrc); return; } int desLen = strlen(*ppDes); if(NULL == pSrc){ return; } int srcLen = strlen(pSrc); char* newPDes = malloc(sizeof(char) * (desLen + srcLen + 1)); if(NULL == newPDes){ printf("str_cat: couldn't allocate memory"); }else{ strcpy(newPDes,*ppDes); strcpy(newPDes + desLen,pSrc); free(*ppDes); *ppDes = newPDes; } } int main(){ char* a = NULL; str_cpy(&a,"That this"); str_cpy(&a,a+5); str_cat(&a," is a test"); //str_print printf("%s\n",a); //str_free }
  • ע"י: פוקי
    נתנו לי במבחן לממש שתי פונקציות str_cpy ו str_cat בnotepad כאשר נתון main ו 3 include-ים אני קיבלתי את הרושם שמה שלא בסדר בקוד שלי קשור לinclude-ים הבעייה שאני רואה זה ה-free שאני עושה לchar* מישהו רואה משהו אחר? משהו שדי הפריע לי זה שהתיאור של הבעיה היה רשום עם מלא שגיאות מבחינת האנגלית. הנה שחזור של מה שיצא לי בערך אם אני זוכר נכון: #include <stdlib.h> #include <stdio.h> #include <string.h> void str_cpy(char** ppDes, const char* pSrc){ char* pTmpDes = *ppDes; *ppDes = strdup(pSrc); free(pTmpDes); } void str_cat(char** ppDes, const char* pSrc){ int desLen = strlen(*ppDes); int srcLen = strlen(pSrc); char* newPDes = malloc(sizeof(char) * (desLen + srcLen + 1)); if(NULL == newPDes){ printf("str_cat: couldn't allocate memory"); }else{ strcpy(newPDes,*ppDes); strcpy(newPDes + desLen,pSrc); free(*ppDes); *ppDes = newPDes; } } int main(){ char* a = NULL; str_cpy(&a,"That this"); str_cpy(&a,a+5); str_cat(&a," is a test"); //str_print printf("%s\n",a); //str_free }
  • ע"י: פוקי
    Thanks for your lovely site. I have been today in a job interview at zon-networks ( founders of Jungo ). here is the exam : given the folowing code , Need to implement the attrib_t struct and attrib_get function My Answer : #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <string.h> // need to Implement this struct typedef struct attrib_t { char attrib[100]; char value[100]; struct attrib_t* Next; } att; // need to Implement this function char *attrib_get(attrib_t **a,char *attrib) { attrib_t *pAtt = *a; while(pAtt) { if(!strcmp(pAtt->attrib,attrib)) return pAtt->value; move_to_next(&pAtt); } } void move_to_next(attrib_t **a) { } void attrib_set(attrib_t **a,char *attrib,char *value) { } void attrib_free(attrib_t **a) { } void main() { attrib_t *a =NULL; attrib_set(&a,"user","jhon"); attrib_set(&a,"mail","jhonSmith@gmail.com"); attrib_set(&a,"user","Smith"); printf("user = %s\nmail = %s" , attrib_get(&a,"user") , attrib_get(&a,"mail")); attrib_free(&a); } // RUN //user = Smith //mail = jhonSmith@gmail.com Hope this help - please let me know if you have any question ? Thanks הפונקציות חייבות לקבל פוינטר כפול או שהם מקבלות פוינטר רגיל ומשתמשים בפוינטר כפול בתוך הפונקציה? כלומר החתימה של הפונקציה void move_to_next(attrib_t **a) נתונה לך ואתה רק צריך לממש או שאתה החלטת? מה הכוונה נתון בנוסף define MAX_ATTRIBUTE 2? תודה
  • ע"י: 1_אורח_כללי
    אז ככה לגביי הראיון השני יש עידכון קטן נתון בנוסף define MAX_ATTRIBUTE 2 בנוסף בהסבר לפונקציה SET ישנו תוספת שאומרת לשמור על הסדר ממויין ושוב היחידה שעונה על השאלות זה המזכירה שלא כל כך מבינה ולפי מה שנאמר לי המיון הוא לפי ה ATTRIBUTE כלומר email before user ברשימה (לא בטוח שזו היתה כוונת המשורר:) ) מה שאומר שהרשימה צריכה להיות בעלת 2 מאפיינים (email and user) (אבל יש מצב שלא כל כך הבנתי מה הם רצו אז קחו את זה בחשבון) בקיצור תהנו
  • ע"י: 1_אורח_כללי
    http://www.codeproject.com/KB/trace/linkedlists.aspx מסביר למה טוב pointer to pointer.
  • ע"י: יאירזס
    איציק, כל מילה בסלע. ממה שאני קורא כאן, שיטת הראיונות של זון היא כמו בג'נגו (או כמו שהיה שם כשאני התראיינתי). לטעמי - חברה שמסרבת במוצהר להגיד מה היא עושה עד ראיון שלישי, כפי שכתבו כאן בתגובות אינה חברה שהייתי רוצה לעבוד בה, גם בזמנים קשים. אני מודע לכך שיש כאן בוגרים ללא נסיון תעסוקתי, או כאלה שבאמת באמת באמת לחוצים על כסף ולא יכולים לחכות קצת בלי עבודה ורק להם הייתי ממליץ לשקול לעבוד בזון.
  • ע"י: 1_אורח_כללי
    התכוונתי לא שני פוינטרים במקום באחד. אלא בפויטנר לפוינטר (פויטנר כפול)
  • ע"י: 1_אורח_כללי
    החלק השני לא קשה כמו שאתה אומר . פשוט צריך להקפיד על סינטקס נכון וכתיבה נכונה .למשל בדיקת NULL אחרי MALLOC , (לכתוב : לא לכתוב ככה: if (elem !=NULL . אלא ככה: if (NULL != elem להקפיד שהhead יישמר וכו' אני אכתוב את הטריק. מדובר בטריק ממש מפגר. בוא נגיד שאם לא נתקלת בבעיה הזו מקודם סיכוייך לפתור אותו די קלושים.וזה ממש לא אומר כלום על כישוריך. אבל זה מה שם שהם חושבים. הם רוצים שתכתוב רשימה מקושרת בשימוש שני פוינטרים במקום באחד (תחפש בגוגל, יש מלא דוגמאות לפיתרון הבעייה). ככה זה חוסך לך את כל בדיקת מקרי הקצה. הבן ישפריץ ניטים ויתפוס ממך תותח על. לאחר מכן יש ראיון עם 2 שחצנים שבחיים שלי לא ראיתי אנשים כל כך ממורמרים שמבקשים ממך לממש strcpy ואז אחר כך לממש strcat , אתה צריך לעשות את זה ממש ממש מהר. כל השהיה הכי קטנה ונפסלת.ובאמצע הם מלחיצים אותך ומתחילים לבלבל אותך בשאלות (איפה המשתנה נשמר , באיזה סגמנט בזיכרון ועוד שאלות בסגנון כאלה ). בקיצור, לא מחפשים שם מהנדס אלא מתכנת קוף שיודע רק לכתוב קוד ולא לחשוב. שילכו לספארי. אני מקווה מאוד שתקבל מהם הצעה , תתקשר לחברות האחרות שאתה בתהליכים איתם , תגיד שקיבלת הצעה, הם יביאו לך גם ואז תגיד לzon שאתה לא רוצה ללכת אליהם. דבר אחרון שאני אגיד וחומר למחשבה - משהו שפוטר גם בחברה בה עבדתי שהוא ממש ממש ממש תותח ואני ממש מחזיק ממנו. הבן אדם פריק של לינוקס וכתב מערכת הפעלה בעצמו (!!) לא התקבל לשם.. נראה לי זה אומר משהו על תהליך הגיוס שלהם. בהצלחה.
  • ע"י: 1_אורח_כללי
    איך אפשר ליצור עם מישהו מכם קשר ישיר?
  • ע"י: 1_אורח_כללי
    החלק השני יותר קשה ממה שזה נראה. צריך לוודא שאף שגיאה לא תעלה (גם לא הקטנה שבקטנות) וכותבים את הכול בNOTEPAD. חוץ מזה, יש טריק שהם מחפשים כדי שתחשב ל"מתכנת האולטימטיבי". אני לא אכתוב אותו כי אם כולם ידעו אותו, הם פשוט ישנו את הבעיה. צריך רק לזכור שיש דרך לפתור את הבעיה בצורה יותר יעילה.
  • ע"י: 1_אורח_כללי
    a=&(a->next) עושה את כל העבודה
  • ע"י: 1_אורח_כללי
    אני עברתי את השלב הזה. בשלב הבא מושיבים אותך מול notepad ומבקשים ממך לממש עוד פונקציות שבשלב הראשון ניתנו לך כ API קיים. הפונקציות הן: 1. attrib_set , שאמורה לקבל key מסויים (attrib) ולעדכן את ה value במידה וה attrib קיים ואם לא אז להוסיף אותו. 2. attr_delete שאמורה למחוק את כל הרשימה 3. attr_next אמורה לקבל פוינטר לאיבר ברשימה ולהחזיר פוינטר לבא אחריו. הפונקציה עם הבשר היא attrib_set. לדעתי לא משימה קשה במיוחד, הבעיה היא שהם בוחנים גם את סגנון הכתיבה מעבר לביצוע. הקוד צריך להיות אלגנטי וקצר ככל האפשר. וגם לא לשכוח לבדוק האם ה malloc מחזיר 0 ואם כן לבצע exit.
  • ע"י: משתמשותיק
    האם עברת את השלב הראשון?