Presentation is loading. Please wait.

Presentation is loading. Please wait.

מבוא כללי למדעי המחשב תרגול. הבית האדום כתובת : רחוב קוקוריקו 2 הבית הירוק כתובת : רחוב קוקוריקו 4 הבית הצהוב כתובת : רחוב קוקוריקו 1 הבית הורוד כתובת.

Similar presentations


Presentation on theme: "מבוא כללי למדעי המחשב תרגול. הבית האדום כתובת : רחוב קוקוריקו 2 הבית הירוק כתובת : רחוב קוקוריקו 4 הבית הצהוב כתובת : רחוב קוקוריקו 1 הבית הורוד כתובת."— Presentation transcript:

1 מבוא כללי למדעי המחשב תרגול

2 הבית האדום כתובת : רחוב קוקוריקו 2 הבית הירוק כתובת : רחוב קוקוריקו 4 הבית הצהוב כתובת : רחוב קוקוריקו 1 הבית הורוד כתובת : רחוב קוקוריקו 3 מה הכתובת של “ הבית האדום ?” 2 מי גר בבית מספר 2? רמי יוסי שמעון אבנר רמי מי גר ב “ בית האדום ?” רמי

3 כתובת : 2000 מה הכתובת של ?a 2000 מה נמצא בתא 2000? a 80 3 7 5 מה נמצא ב a? 5 5 b c d כתובת : 1000 כתובת : 3000 כתובת : 4000

4 מצביעים לכל משתנה שמוגדר בתוכנית יש כתובת לכל משתנה שמוגדר בתוכנית יש כתובת הכתובת שלו היא מיקומו בזכרון הכתובת שלו היא מיקומו בזכרוןלמשל כאשר משכנים מספר מסוג int אזי צורכים 4 bytes. int a; a 5000

5 מצביעים int a; int b; a = 5; b = 7; a 5000 b 5004 5 7

6 מצביעים int a, b; int *p1; int *p2; a = 5; b = 7; p1 = &a; p2 = &b; a 5000 b 5004 5 7 p1 7026 p2 7030 5000 5004

7 מצביעים int a, b; int *p1; int *p2; a = 5; b = 7; p1 = &a; p2 = &b; a 5000 b 5004 5 7 p1 7026 p2 7030 5000 5004 *p1 = 2; *p2 = *p1;

8 מצביעים int a, b; int *p1; int *p2; a = 5; b = 7; p1 = &a; p2 = &b; a 5000 b 5004 2 2 p1 7026 p2 7030 5000 5004 *p1 = 2; *p2 = *p1;

9 תרגיל הגדר שני משתנים a ו b. אתחל אותם לערכים כלשהם. לאחר מכן הגדר שני משתנים להחזקת הכתובות שלהם הדפס את הכתובות שלהם ואת הערכים שנמצאים בכתובות האלו. להדפסת מצביע נשתמש בפורמט %p.

10 #include int main() { int a=10,b=2; int *p1,*p2; p1 = &a; p2 = &b; printf(“%p %p \n”,p1,p2); printf(“%d %d \n”,*p1,*p2); return 0; } 0012F60 0012F54 10 2 פלט

11 מצביעים עד היום הפונקציות שלנו ידעו לקבל ערכים של משתנים ולהשתמש בהם. הן לא ידעו לקבל משתנים ולשנות את הערכים שלהם ( מלבד פונקציה אחת !) הפונקציות שלנו ימשיכו לקבל ערכים בלבד, רק שכעת אנו יכולים להעביר להם בתור ערך כתובת של משתנה !

12 5 3 printf 3 a 2020 5 b 2034 int a=3,b=5; printf(“%d %d”,a,b) אין צורך לדעת את כתובותיהם של a ואת b, אלא רק את ערכיהם

13 scanf a 2020 b 2034 int a,b; scanf(“%d %d”,&a,&b) צריך לדעת את כתובותיהם של a ו b, ולא את ערכיהם 3 5

14 int main() { int a; scanf(“%d”,&a); } a 5000 scanf *pa = ערך מהמשתמש

15 void swap (int q,int p) { int temp =p; p = q; q = temp; } int main() { int a=10,b=2,x=3,y=5; … swap(x, y); … swap(a, b); }

16 void swap (int *p,int *q) { int temp = *p; *p = *q; *q = temp; } int main() { int a=10,b=2,x=3,y=5; … swap(&x,&y); … swap(&a,&b); } x 5000 y 5004 3 5 p 7026 q 7030 5000 5004 7034 temp 3 5 3

17 תרגיל כתבו פונקציה שמקבלת אורך ורוחב של מלבן ומחזירה את שטח המלבן ואת היקפו. void rectangle(int a,int b,int *area, int *circuit); int main() { int x, y; int area,circuit; scanf("%d %d",&x,&y); rect_area(x,y, &area,&circuit); printf(“Area is %d Circuit is %d\n", area, circuit); return 0; }

18 פתרון void rect_area(int a,int b,int *area,int *circuit) { *area = a * b; *circuit = 2 * (a + b); }

19 הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו יש כתובת a[0] a[1] a[2] a[9]  5 5000 5004 5008 כדי להגיע לכתובת של תא במערך פשוט נכתוב &a[2] אם נרצה את הכתובת של המערך עצמו אזי זה שם המערך

20 הקשר בין מערכים לפונקציות כיצד נכתוב פונקציה אשר תקבל כפרמטר מערך ? הפונקציה תקבל מערך ( את כתובתו ) ותדפיס אותו : void PrintArray(int a[],int size) { int i; for (i=0;i<size;i++) printf(“%d”,a[i]);}

21 הקשר בין מערכים לפונקציות הפונקציה תקלוט איברים לתוך מערך void GetArray(int a[],int size) { int i; for (i=0;i<size;i++) scanf(“%d”,&a[i]);}

22 void PrintArray(int a[],int size); int main() { int a[20]; GetArray(a,20); PrintArray(a,20); return 0; } void GetArray(int a[],int size);

23 rand() בשפת C ניתן לייצר מספרים פסאודו - אקראיים ע " י הפונקציה בשפת C ניתן לייצר מספרים פסאודו - אקראיים ע " י הפונקציה int rand(void); int rand(void); X = rand(); X = rand(); הפונקציה נמצאת ב -stdlib.h הפונקציה נמצאת ב -stdlib.h הפונקציה מחזירה מספר בטווח 0-RAND_MAX הפונקציה מחזירה מספר בטווח 0-RAND_MAX אם משתמשים ב -rand מוטב לבצע קריאה אחת ל -srand בתחילת התוכנית אם משתמשים ב -rand מוטב לבצע קריאה אחת ל -srand בתחילת התוכנית void srand(unsigned int); void srand(unsigned int);

24 שימוש ב - srand השימוש יהיה כך השימוש יהיה כך srand(time(NULL)); srand(time(NULL)); time פונקציה שמחזירה את הזמן ונמצאת בספרייה time.h time פונקציה שמחזירה את הזמן ונמצאת בספרייה time.h

25 rand איך נייצר ערכים אקראיים בטווח אחר מאשר 0-RAND_MAX? איך נייצר ערכים אקראיים בטווח אחר מאשר 0-RAND_MAX?

26 rand נשתמש בשארית נשתמש בשארית rand() % 10 /*randomly in 0 – 9*/ rand() % 10 /*randomly in 0 – 9*/ rand() % 10 + 1 /* randomly in 1 – 10*/ rand() % 10 + 1 /* randomly in 1 – 10*/

27 תרגיל כתבו את הפונקציות הבאות : פונקציה שממלא מערך במספרים אקראיים בטווח 1-100 פונקציה שממלא מערך במספרים אקראיים בטווח 1-100 פונקציה שמדפיסה מערך פונקציה שמדפיסה מערך פונקציה שהופכת את המערך ( רמז : השתמשו בפונקציה swap ) פונקציה שהופכת את המערך ( רמז : השתמשו בפונקציה swap )

28 פתרון מילוי מערך void fill_array(int arr[], int size) { int i; srand(time(NULL)); for (i = 0; i < size; i++) arr[i] = rand() % 100 + 1; }

29 פתרון הדפסת מערך void print_array(int arr[], int size) { int i; for (i = 0; i < size; i++) printf("%d ", arr[i]); printf("\n"); }

30 פתרון הפיכת מערך void reverse_array(int arr[], int size) { int i; for (i = 0; i < size/2; i++) swap(&arr[i], &arr[size - 1 - i]); }

31 #include void fill_array(int arr[], int size); void reverse_array(int arr[], int size); void print_array(int arr[], int size); void swap(int *a, int *b); int main() { int my_arr[15]; fill_array(my_arr, 15); print_array(my_arr, 15); reverse_array(my_arr, 15); print_array(my_arr, 15); return 0; }

32 חשבון מצביעים a[0] a[1] a[2] a[9]  5 5000 5004 5008 כדי להגיע לתא השלישי במערך נוכל לעשות a[2] או*(a+2)

33 void reverse_array(int *begin, int *end) { while (begin < end) { swap(begin, end); begin++; end--; } reverse_array(my_arr, my_arr + SIZE -1); חשבון מצביעים beginend ae e a d r

34 תרגיל כתוב פונקציה המקבלת שני מערכים ובודקת האם מערך אחד נמצא כתת מערך במערך השני. אם כן תחזיר מצביע למקום זה. אם לא אז יוחזר NULL. אם לא אז יוחזר NULL.

35 10011223144535152244535 קלט פלט &a[4] a b 2244535

36 int *findSubArray (int *array, int array_size, int *sub_array, int sub_size) { int i, j; for (i = 0; i <= array_size - sub_size; i++,array++) { for (j = 0; j < sub_size; ++j) if ( *(array + j) != sub_array[j] ) break; if (j == sub_size) return array; } return NULL; }

37 #include #include int *findSubArray (int *array, int array_size, int *sub_array, int sub_size); int main() { int array1[] = {1, 45, 67, 1001, -19, 67, 89, 1004, -867, 34, 3, -1900, 10029}, array2[] = {34, 3, -1900}, *position; array2[] = {34, 3, -1900}, *position; position = findSubArray (array1, sizeof (array1) / sizeof (int), array2, sizeof (array2) / sizeof(int)); array2, sizeof (array2) / sizeof(int)); printf ("array2 appears in array1 starting from place : %d.\n", (position == NULL)? -1 : position - array1 + 1); return 0; }

38 מחרוזות מחרוזת – מחרוזת זה מערך של תווים אשר מסתיים ב ‘\0’. char a[10] = “CS4Math”; printf(“%s”,a); הדפסה באמצעות %s ‘C’ ‘S’ ‘4’ ‘M’ ‘a’ ‘t’ ‘h’ ‘\0’ ‘$’ ‘^’ 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

39 מחרוזות הסיום ב ‘\0’ מאפשר לנו להעביר מחרוזות לפונקציות מבלי לציין את גודלם !!! פונקציה טיפוסית של מחרוזות תראה כך : void string_func(char *s) { … while (*s != ’\0’) … { מונע שינוי של המחרוזת

40 #include #include int strlen (char * str) { char *eos = str; while( *eos++ ) ; while( *eos++ ) ; return( eos - str - 1 ); return( eos - str - 1 );} int main() { char str[]=“LINUX"; printf("%d",strlen(str)); return 0; } מה קורה פה ? NUXIL‘\0’ str eos 100101102 103104105 106

41 דרכים נוספות להגדיר מחרוזות h p ello\0 hello s char *p = “hello”; char s[ ] = “hello”; קלט למחרוזת scanf(“%s”, str); עד לרווח

42 תרגיל כתבו פונקציה המקבלת שתי מחרוזות ובודקת האם הן זהות. אם כן, הפונקציה תחזיר 1. אם כן, הפונקציה תחזיר 1. אם לא, אז יוחזר 0.

43 #include #include int compare (char s1[ ],char s2[ ]) { intk; for ( k=0; s1[k] != ‘\0’ || s2[k] != ‘\0’; k++ ) if ( s1[k] != s2[k] ) return 0; return 1; } void main() { chars1[31],s2[31]; scanf(“%s%s”,s1,s2);printf(“%d\n”,compare(s1,s2));}

44 string.h הספריה מכילה בין השאר את הפונקציות הבאות לטיפול במחרוזות : strlen(s) – מחזירה את האורך של המחרוזת s. strlen(s) – מחזירה את האורך של המחרוזת s. strcpy(s,t) – מעתיקה את המחרוזת t ל -s. strcpy(s,t) – מעתיקה את המחרוזת t ל -s. strcmp(s,t) – משווה ביו המחרוזות s ו -t. strcmp(s,t) – משווה ביו המחרוזות s ו -t. strstr(s,t) – מחפשת את המחרוזת t בתוך המחרוזת s. strstr(s,t) – מחפשת את המחרוזת t בתוך המחרוזת s.

45 תרגיל כתבו פונקציה המקבלת כקלט מחרוזת ובודקת האם היא פלינדרום. הערה : ניתן להניח שאורך המחרוזת לכל היותר 100 תווים.

46 #include #include int main() { chars[101]; intk,len; scanf(“%s”,s); len = strlen(s); for ( k=0; k<len/2; k++ ) if ( s[k] != s[len-1-k] ) { printf(“The string is not a palindrome!\n”); return 0; } printf(“The string is a palindrome!\n”); return 0; }


Download ppt "מבוא כללי למדעי המחשב תרגול. הבית האדום כתובת : רחוב קוקוריקו 2 הבית הירוק כתובת : רחוב קוקוריקו 4 הבית הצהוב כתובת : רחוב קוקוריקו 1 הבית הורוד כתובת."

Similar presentations


Ads by Google