תרגול סיכום וחזרה
DESCRIPTION
תרגול סיכום וחזרה. שאלות ידע בסיסי. #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 - PowerPoint PPT PresentationTRANSCRIPT
תרגול סיכום וחזרה
שאלות ידע בסיסי...
#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; }
אבגדה
10109
987654
1010
987655
אבגדה
10109
987654
1010
987655
חורף תשס"ט – מועד א
שאלות ידע בסיסי...
#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;
}
אבגדה
hello1hello2hello1hello2
שגיאת זמן ריצה
שגיאת הידור
חורף תשס"ט – מועד ב
אבגדה
hello1hello2hello1hello2
שגיאת זמן ריצה
שגיאת הידור
שאלות ידע בסיסי...
#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;}
אבגדה
066
065
044
045
145
אבגדה
066
065
044
045
145
שאלות ידע בסיסי...
#include <stdio.h> int main(){
int i='1'-1;
for (i++;i<'9';i++)putchar(i);
return 0;
} אבגדה
0123456789
123456789
12345678
1357902468
אבגדה
0123456789
123456789
12345678
1357902468
שאלות ידע בסיסי...
#include <stdio.h>int main(){ int y='\0'; switch(y) {
case (0): printf("hello1\n"); case ('0'): printf("hello2\n"); case (1): } return 0;}
אבגדה
hello1hello2hello1hello2
לא יודפס כלום
שגיאת הידור
אבגדה
hello1hello2hello1hello2
לא יודפס כלום
שגיאת הידור
מצביעים
: ו-*יש לנו שני אופרטורים חשובים& גורם לנו לרדת רמה – נותן את התוכן הנמצא - *
בכתובתמעלה אותנו רמה – נותן את כתובת המשתנה - &-אם היא מופיעה *חשוב לשים לב איפה מופיעה ה .
בהגדרת המשתנה או בחתימה של פונקציה, היא חלק מהטיפוס
;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; }
אבגדה
79
11
71
19
15
אבגדה
79
11
71
19
15
מערכים
חשוב לזכור: שם המערך בעצם מצביע על התאהראשון במערך
אסור בתכלית האיסור לשנות את המקום אליו מצביעשם המערך – זה אפילו לא עובר קומפילציה!
:לדוגמה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;} אבגדה
328421
אבגדה
328421
אביב תשס"ח – מועד א
בהנתן מערך של מספרים שלמיםa[] נגדיר את , 0 כמערך שבתא ה-[]bשלו, מערך ההפרשים
(כלומר 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(1) ומקום O(k)על הפונקציה לעמוד בסיבוכיות זמן
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), ומחזירה את תוכן k ואינדקס []bהמקבלת מערך הפרשים
.O(1) , ומקום O(logk) בזמן a[k]המערך המקורי
, n, את אורכו []bכתבו פונקציה המקבלת מערך הפרשים כך שערך המערך []b, ומשנה את המערך x וערך kאינדקס
a[k]=x, כלומר x יהיה kהמקורי בתא ה-, וסיבוכיות 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(1), מקום – O(logn) זמן - דרישות סיבוכיות:
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);}
המכילים מספרים שלמים הממויינים בסדר b ו-aנתונים שני מערכים עולה.
m ו-n מהסוג הנ"ל, בגודל b ו-aכתבו פונקציה המקבלת שני מערכים אם קיימים שני איברים 1 ומחזירה kבהתאמה, ומספר שלם
.0כך שמתקיים . אחרת, על הפונקציה להחזיר לדוגמה – עבור המערכים
k=5 עבור 1הפונקציה תחזיר k=4 עבור 0ו-
דרישות סיבוכיות – זמן מקום
,i ja a b b
i ja b k
15820 21521a b
O n m
1O
פתרון
int is_diff(int a[], int n, int b[], int m, int k) {
int i=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;}
אבגדה
coogleogle
googlegle
cooglegle
שגיאת זמן ריצה
שגיאת הידור
אבגדה
coogleogle
googlegle
cooglegle
שגיאת זמן ריצה
שגיאת הידור
#include <stdio.h>int main(){
char * str1="hello";char * str2="world";
str1[0]=str2[2];printf("%s\n",str1);
return 0;}
אבגדה
hellolelloeello שגיאתזמן ריצה
שגיאת הידור
אבגדה
hellolelloeello שגיאתזמן ריצה
שגיאת הידור
דברים חשובים שכדאי לדעת לפני שמתחילים לפתור שאלה ב... סיבוכיות
חוקי לוגריתם:
סכום סדרה חשבונית:
סכום סדרה הנדסית:
log logi iii
a a
log logba b a
1
2n
n
a a nS
1 1
1
n
n
a qS
q
טורים נוספים:
1
2 3
1
1
1
1log
1 2 1
6
n
i
n
i
nk k
i
ni
n n ni n
i n