Presentation is loading. Please wait.

Presentation is loading. Please wait.

מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.

Similar presentations


Presentation on theme: "מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל."— Presentation transcript:

1 מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל

2 Tip & Puzzlesמבוא למדעי המחשב. כל הזכויות שמורות ©2 מתי לא שמים ; בשורות המתחילות ב- # #include #define N 5 לפני ואחרי { } int main() { return 0; } אחרי משפטי if, else, while, for, do, switch if (i == 0) return 0; אחרי case/default שמים ':'

3 Tip & Puzzlesמבוא למדעי המחשב. כל הזכויות שמורות ©3 מה תדפיס התוכנית? int main() { int i=0; while (i<10); i++; printf(“%d”, i); return 0; } תשובה: כלום כי היא תתקע בלולאה אינסופית.

4 Tip & Puzzlesמבוא למדעי המחשב. כל הזכויות שמורות ©4 תמיד שימו סוגריים מסולסלים – זה לא מזיק if (1 < 2) if (1 < 0) printf(“1 < 0”); else printf(“1 >= 2”); לא ידפיס כלום !!! (כי else תמיד מתיחס ל-if האחרון) int i, a1[10], a2[10]; for (i=0; i<10; i++) a1[i] = 0; a2[i] = 0; במקום לאתחל a2 באפסים, שם אפס ב-a2[10] (דריסת זיכרון)

5 Tip & Puzzlesמבוא למדעי המחשב. כל הזכויות שמורות ©5 תמיד שימו סוגריים מסולסלים – זה לא מזיק זה לא היה קורה אם היינו שמים סוגריים מסולסלים: if (1 < 2) { int i, a1[10], a2[10]; if (1 < 0) { for (i=0; i<10; i++) { printf(“1 < 0”); a1[i] = 0; } a2[i] = 0; } else { printf(“1 >= 2”); }

6 Tip & Puzzlesמבוא למדעי המחשב. כל הזכויות שמורות ©6 מערכים – טעויות נפוצות גודל של מערך חייב להיות קבוע! void f1(int n, int array[n]) /* שגיאת קומפילציה */ { int array2[n]; /* שגיאת קומפילציה */ } אינדקס של האיבר האחרון במערכך הינו size-1: int a[100]; a[99] = 5; /* גישה לאיבר האחרון */ a[100] = 13; /* גלישה מתחום המערך – דריסת זכרון */ אסור להגדיר משתנה/פונקציה בשם בו השתמשתם ב-define: #define n 100 void f2(int *array, int n); /* שגיאת קומפילציה */

7 Tip & Puzzlesמבוא למדעי המחשב. כל הזכויות שמורות ©7 טעות נפוצה: השמה במקום השוואה int main() { int i=0; if (i = 13) printf(“i equal 13”); else printf(“i not equal 13”); return 0; } הערך של הביטוי בתוך if שווה תמיד ל-13 לכן תמיד יודפס “i equal 13” (למרות ש-i שווה ל-0(

8 Tip & Puzzlesמבוא למדעי המחשב. כל הזכויות שמורות ©8 לא לשכוח break בתוך switch int main() { int x=2; switch (x) { case 2: printf(“Two\n”); case 3: printf(“Three\n”); } return 0; } ידפיס על המסך : Two Three

9 Tip & Puzzlesמבוא למדעי המחשב. כל הזכויות שמורות ©9 לא לשכוח '&' ב-scanf char c; int i; float f; double d; scanf(“%c %d %f %lf”, &c, &i, &f, &d); שימו לב: לכל טיפוס חייבים לשים % מתאים! אך לא לשים & כאשר קולטים מחרוזת עם %s: void scan_and_print(char* str) { scanf(“%s”, str); printf(“%s”, str); }

10 Tip & Puzzlesמבוא למדעי המחשב. כל הזכויות שמורות ©10 חלוקה של שלמים נותנת מספר שלם double d1 = 1/2; d1 יהיה שווה ל-0 ולא לחצי. תיקון אפשרי: double d1 = 1.0/2; אותה בעיה בחלוקה של integers: int a = 1, b = 2; double d2 = a/b; גם כאן d1 יהיה שווה ל-0 ולא לחצי. תיקון אפשרי: double d1 = ((double)a)/b;

11 Tip & Puzzlesמבוא למדעי המחשב. כל הזכויות שמורות ©11 תו vs מחרוזת של תו אחד לא נכון: char c = “A”; char *str = ‘B’; str[0] = “C”; נכון: char c = ‘A’; char *str = “B”; str[0] = ‘C’;

12 Tip & Puzzlesמבוא למדעי המחשב. כל הזכויות שמורות ©12 לא משווים מחרוזות עם == char *str1 = “abc”; char *str2 = “abc”; if (str1 == str2) printf(“abc is equal to abc\n”); else printf(“abc is NOT equal to abc\n”); לא נכון! ידפיס “abc is NOT equal to abc”, כי מתבצעת השוואה המצבעים. גם זה לא נכון (כי מתבצעת השוואה של תו הראשון בלבד): if (*str1 == *str2) השוואה נכונה: if (strcmp(str1, str2) == 0)

13 Tip & Puzzlesמבוא למדעי המחשב. כל הזכויות שמורות ©13 אורך המחרוזת vs גודל מערך המכיל אותה char name1[] = “Yuri”; מקצה מערך של 5 תווים, אורך מחרוזת הינו 4. char name2[1024] = “Yuri”; מקצה מערך של 1024 תווים, אורך מחרוזת עדיין 4. כל התווים חוץ מארבעה הראשונים מאותחלים ל-‘\0’. char name3[4]=“Yuri”; שם 5 תווים במערך של 4 תווים – דריסת זכרון! פונקציה strlen() מחזירה את אורך המחרוזת. לא כולל ‘\0’! כלומר strlen(name1) תחזיר 4 וגם strlen(name2) תחזיר 4

14 Tip & Puzzlesמבוא למדעי המחשב. כל הזכויות שמורות ©14 מהי סיבוכית של הפונקציה? int find_first_c(char* str, char c) { int i; for (i=0; i<strlen(str); i++) if (str[i] == c) return i; return -1; } תשובה: O(n 2 ). כי מחשבים את strlen(str) n פעמים. איך ניתן לתקן את הפונקציה בשביל שהסיבוכיות תהיה O(n)?

15 Tip & Puzzlesמבוא למדעי המחשב. כל הזכויות שמורות ©15 תיקון – אפשרות 1 int find_first_c(char* str, char c) { int i; int len=strlen(str); for (i=0; i<len; i++) if (str[i] == c) return i; return -1; }

16 Tip & Puzzlesמבוא למדעי המחשב. כל הזכויות שמורות ©16 תיקון – אפשרות 2 int find_first_c(char* str, char c) { int i; for (i=0; str[i] != ‘\0’; i++) if (str[i] == c) return i; return -1; }


Download ppt "מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל."

Similar presentations


Ads by Google