220 likes | 326 Views
תרגול סיכום וחזרה. שאלות ידע בסיסי. #include < stdio.h > int main() { int i =10, stop=0; while(!stop && ( i -- >= 0)) { stop=!(i%5); printf ("%d n",i ); } printf ("%d n",i ); return 0; }. חורף תשס"ט – מועד א. שאלות ידע בסיסי. #include <stdio.h>
E N D
שאלות ידע בסיסי... #include <stdio.h> int main() { inti=10, stop=0; while(!stop && (i-- >= 0)) { stop=!(i%5); printf("%d\n",i); } printf("%d\n",i); return 0; } חורף תשס"ט – מועד א
שאלות ידע בסיסי... #include <stdio.h> enum BOOL{TRUE,FALSE}; int main() { enum BOOL mybool; mybool=TRUE; if (mybool) printf("hello1\n"); else printf("hello2\n"); return 0; } חורף תשס"ט – מועד ב
שאלות ידע בסיסי... #include <stdio.h> int main() { int z=5; int x=1; int y=(--x)?(z--):(++z); printf("%d\n%d\n%d\n",x,y,z); return 0; }
שאלות ידע בסיסי... #include <stdio.h> int main() { inti='1'-1; for (i++;i<'9';i++) putchar(i); return 0; }
שאלות ידע בסיסי... #include <stdio.h> int main() { int y='\0'; switch(y) { case (0): printf("hello1\n"); case ('0'): printf("hello2\n"); case (1): } return 0; }
מצביעים • יש לנו שני אופרטורים חשובים : *ו- & • * - גורם לנו לרדת רמה – נותן את התוכן הנמצא בכתובת • & - מעלה אותנו רמה – נותן את כתובת המשתנה • חשוב לשים לב איפה מופיעה ה-*. אם היא מופיעה בהגדרת המשתנה או בחתימה של פונקציה, היא חלק מהטיפוסלדוג: int* x;int f(int *y); • שימו לב – אסור להשתמש במצביע לא מאותחל – לפני שהוא מצביע על משהו.לדוגמה:int *p;*p=3;
שאלות על מצביעים: #include <stdio.h> int g(int * x) { *x-=8; return 7; } int f(int x) { g(&x); printf("%d",x); return 5; } int main() { int x=9; f(x); printf("%d",x); return 0; }
מערכים • חשוב לזכור: שם המערך בעצם מצביע על התא הראשון במערך • אסור בתכלית האיסור לשנות את המקום אליו מצביע שם המערך – זה אפילו לא עובר קומפילציה! • לדוגמה:int A[6], B[6];A=B; • כאשר מבצעים sizeof על מערך מקבלים את מספר הבתים שכל המערך תופס. • אופרטור []:arr[i]*(arr+i) p[i]*(p+i)
שאלות על מערכים #include <stdio.h> int main() { int a[8]={1,2,3,4}; printf("%d", ((int)(sizeof(a)/sizeof(int)))); return 0; }
אביב תשס"ח – מועד א • בהנתן מערך של מספרים שלמים a[], נגדיר את מערך ההפרשים שלו, b[] כמערך שבתא ה-0 מכיל את האיבר הראשון של a (כלומר b[0]=a[0]), ובכל תא אחר i הוא מכיל את ההפרש בין האיבר a[i] לאיבר הקודם לו (כלומר b[i]=a[i]-a[i-1]). • לדוגמה, עבור המערך a[] = {1, -2, 5, 3, 6}מערך ההפרשים יהיה b[] = {1,-3, 7, -2, 3}
א. כתבו פונקציה שמקבלת את מערך ההפרשים b[] ואינדקס k" ומחזירה את תוכן המערך המקורי בתא בעל אינדקס k, כלומר a[k]. על הפונקציה לעמוד בסיבוכיות זמן O(k) ומקום O(1) int get(int b[],int k) {int sum = b[0]; int i; for (i = 1; i<=k; i++) sum+=b[i]; return sum; }
ב. לצורך הסעיף הבא נתונה פונקציית העזר int magicget (int b[], int k)המקבלת מערך הפרשים b[] ואינדקס k, ומחזירה את תוכן המערך המקורי a[k] בזמן O(logk), ומקום O(1). כתבו פונקציה המקבלת מערך הפרשים b[], את אורכו n, אינדקס k וערך x, ומשנה את המערך b[] כך שערך המערך המקורי בתא ה-k יהיה x, כלומר a[k]=xעל הפונקציה לעמוד בסיבוכיות זמן O(logk), וסיבוכיות מקום O(1).
void change(int b[],int n, int k, int x) { int old; if (k>=n) return; old = magicget(b,k); b[k] += x-old; if(k+1<n) b[k+1]-= x-old; } • חשוב לשים לב ל: • עמידה בדרישות הסיבוכיות • מקרי הקצה
ג. באמצעות שימוש בפונקציות change() ו-magicget() מהסעיפים הקודמים, ממשו את הפונקציה הבאה שמקבלת את מערך ההפרשים b, את אורכו n ושני אינדקסים i ו-j של תאים במערך, ומשנה את התוכן של b כך שהאיברים a[i] ו-a[j] במערך המקורי יתחלפו. דרישות סיבוכיות: זמן - O(logn), מקום – O(1).
void swap (int b[], int n, int i, int j) { int a_i, a_j; a _i= magicget(b,i); a_j=magicget(b,j); change(b,j,a_i); change(b.i,a_j); }
נתונים שני מערכים a ו-b המכילים מספרים שלמים הממויינים בסדר עולה. כתבו פונקציה המקבלת שני מערכים a ו-b מהסוג הנ"ל, בגודל n ו-m בהתאמה, ומספר שלם k ומחזירה 1 אם קיימים שני איברים כך שמתקיים . אחרת, על הפונקציה להחזיר 0. לדוגמה – עבור המערכים הפונקציה תחזיר 1 עבור k=5 ו-0 עבור k=4 דרישות סיבוכיות – זמן מקום a b
פתרון intis_diff(int a[], int n, int b[], int m, int k) { inti=0, j=0; while (i<n && j<m) { if (k==a[i]-b[j]) return 1; if (k<(a[i]-b[j])) j++; else i++; } return 0; }
מחרוזות • מחרוזות הן רצף תווים המסתיימים בתו המיוחד ‘\0’. • מחרוזות קבועות המופיעות בקוד נשמרות באיזור מיוחד אליו יש רק גישת קריאה. כל נסיון לכתוב לאיזור זה גורר שגיאת זמן ריצה. • מחרוזות שאינן קבועות יאוחסנו במערכים. שימו לב שאורכו של המערך יכול להיות הרבה יותר ארוך מהמחרוזת עצמה, אולם אותנו לא מעניין מה קורה אחרי ה-‘\0’
include <stdio.h> int main() { char a[] ="google"; *a='c'; printf("%s\n",a); printf("%s\n",a+3); return 0; }
#include <stdio.h> int main() { char * str1="hello"; char * str2="world"; str1[0]=str2[2]; printf("%s\n",str1); return 0; }
דברים חשובים שכדאי לדעת לפני שמתחילים לפתור שאלה ב... סיבוכיות חוקי לוגריתם: סכום סדרה חשבונית: סכום סדרה הנדסית: טורים נוספים: