Presentation is loading. Please wait.

Presentation is loading. Please wait.

תכנות תרגול 8 שבוע : 18.12.05. מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא.

Similar presentations


Presentation on theme: "תכנות תרגול 8 שבוע : 18.12.05. מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא."— Presentation transcript:

1 תכנות תרגול 8 שבוע : 18.12.05

2 מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. אתגר : כתוב תוכנית שקולטת 100 מספרים שלמים ומדפיסה אותם מהאחרון שנקלט לראשון. אתגר : כתוב תוכנית שקולטת 100 מספרים שלמים ומדפיסה אותם מהאחרון שנקלט לראשון. קלט : 1 2 3 4 5,..., 99 100 פלט : 100 99,..., 5 4 3 2 1

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

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

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

6 מצביעים 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;

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

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

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

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

11 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); } x 5000 y 5004 3 5 p 7026 q 7030 5000 5004 7034 temp 3 5 3

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

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

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

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

16 תרגיל 2 כתבו את הפונקציות הבאות : פונקציה שממלא מערך במספרים אקראיים פונקציה שממלא מערך במספרים אקראיים פונקציה שמדפיסה מערך פונקציה שמדפיסה מערך פונקציה שהופכת את המערך ( רמז : השתמשו בפונקציה swap ) פונקציה שהופכת את המערך ( רמז : השתמשו בפונקציה swap )

17 פתרון מילוי מערך void fill_array(int array[], int size) { int i; srand(time(NULL)); for (i = 0; i < size; i++) array[i] = rand()/327; }

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

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

20 #include #define SIZE 5 void fill_array(int array[], int size); void reverse_array(int array[], int size); void print_array(int array[], int size); void swap(int *a, int *b); int main() { int my_arr[SIZE]; fill_array(my_arr, SIZE); print_array(my_arr, SIZE); reverse_array(my_arr, SIZE); print_array(my_arr, SIZE); return 0; }

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

22 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

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

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

25 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; }

26 #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; }

27 מחרוזות מחרוזת – מחרוזת זה מערך של תווים אשר מסתיים ב ‘\0’. a[0] a[1] a[2] a[3] 5000 5001 5002 a[4] a[5] 5003 5004 5005 ‘S’ ‘h’ ‘a’ ‘i’ ‘\0’ char a[6] = “Shai”; printf(“%s”,a); הדפסה באמצעות %s

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

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

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

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

32 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++) { for (j = 0; j < sub_size; j++) if ( *(array + i + j) != sub_array[j] ) break; if (j == sub_size) return array+i; } return NULL; return NULL;}

33 נניח שהמערכים הם מחרוזות ! אפשר להעביר לפונקציה רק מצביע לתחילת המערך ( המחרוזת ) אפשר להעביר לפונקציה רק מצביע לתחילת המערך ( המחרוזת ) int *findSubArray(int *array, int array_size, int *sub_array, int sub_size) for (i = 0; i <= array_size – sub_size; i++) { for (j = 0; j < sub_size; j++) if ( *(array + i + j) != sub_array[j]) break; if (j == sub_size) return array+i; } while (*cp)

34 #include #include char * strstr ( char * str1, char * str2) { char *cp = str1; char *cp = str1; char *s1, *s2; char *s1, *s2; if ( !*str2 ) if ( !*str2 ) return(str1); return(str1); while (*cp) while (*cp) { s1 = cp; s1 = cp; s2 = str2; s2 = str2; while ( *s1 && *s2 && !(*s1-*s2) ) while ( *s1 && *s2 && !(*s1-*s2) ) s1++, s2++; s1++, s2++; if (!*s2) if (!*s2) return(cp); return(cp); cp++; cp++; } return(NULL); return(NULL);} void main() { char s1[]="I am a boy"; char s2[]="am"; printf("%s", strstr(s1,s2)); } בדיקת תת המחרוזת נניח שהמערכים הם מחרוזות !

35 תרגיל כתוב פונקציה לחישוב כמה מילים נמצאות בתוך מחרוזת רמז : המילים מופרדות על ידי רווחים ניתן להשתמש בפונקציה isspace(char c) שנמצאת ב #include ב #include

36 int word_cnt (const char *s) { int cnt = 0; const char *next = s + 1; if (*s == '\0') /*empty string*/ return 0; while(*next != '\0') { if (!isspace(*s) && isspace(*next)) cnt++;s++;next++;} if (!isspace(*s)) cnt++; return cnt; }

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


Download ppt "תכנות תרגול 8 שבוע : 18.12.05. מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא."

Similar presentations


Ads by Google