1 / 46

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

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

vance-ball
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

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

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

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

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

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

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

  10. #include <stdio.h> 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. int a=3,b=5; printf(“%d %d”,a,b) printf a 3 3 2020 b 5 5 2034 אין צורך לדעת את כתובותיהם שלa ואת b, אלא רק את ערכיהם

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

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

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

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

  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. הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו יש כתובת 5000 a[0] כדי להגיע לכתובת של תא במערך פשוט נכתוב &a[2] אם נרצה את הכתובת של המערך עצמו אזי זה שם המערך a[1] 5004 5 a[2] 5008  a[9]

  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 GetArray(int a[],int size); void PrintArray(int a[],int size); int main() { int a[20]; GetArray(a,20); PrintArray(a,20); return 0; }

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

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

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

  26. rand • איך נייצר ערכים אקראיים בטווח אחר מאשר 0-RAND_MAX? • נשתמש בשארית • rand() % 10 /*randomly in 0 – 9*/ • rand() % 10 + 1 /* randomly in 1 – 10*/

  27. תרגיל כתבו את הפונקציות הבאות: • פונקציה שממלא מערך במספרים אקראיים בטווח 1-100 • פונקציה שמדפיסה מערך • פונקציה שהופכת את המערך (רמז: השתמשו בפונקציה 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 <stdio.h> #include <stdlib.h> #include <time.h> 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[2] או *(a+2) 5000 a[0] a[1] 5004 5 a[2] 5008  a[9]

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

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

  35. קלט a b 1 3 100 11 22 22 445 445 35 35 15 22 445 35 &a[4] פלט

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

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

  40. #include <stdio.h> int strlen (char * str) { char *eos = str; while( *eos++ ) ; return( eos - str - 1 ); } int main() { char str[]=“LINUX"; printf("%d",strlen(str)); return 0; } מה קורה פה ? 100 101 102 103 104 105 106 L I N U X ‘\0’ eos str

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

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

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

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

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

  46. #include <stdio.h> #include <string.h> int main() { char s[101]; int k,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; }

More Related