Presentation is loading. Please wait.

Presentation is loading. Please wait.

תכנות תרגול 9 שבוע : 19.4.05. מערכים int a; a=5; int a[10]; a[2] = 5; 5 a a[0] a[1] a[2] a[9]  5 משתנה בודד מערך גישה למשתנה השלישי במערך.

Similar presentations


Presentation on theme: "תכנות תרגול 9 שבוע : 19.4.05. מערכים int a; a=5; int a[10]; a[2] = 5; 5 a a[0] a[1] a[2] a[9]  5 משתנה בודד מערך גישה למשתנה השלישי במערך."— Presentation transcript:

1 תכנות תרגול 9 שבוע : 19.4.05

2 מערכים int a; a=5; int a[10]; a[2] = 5; 5 a a[0] a[1] a[2] a[9]  5 משתנה בודד מערך גישה למשתנה השלישי במערך

3 int main() { int i=0; int i=0; int a[100]; int a[100]; for (i=0;i<100;i++) for (i=0;i<100;i++) scanf (“%d”,&a[i]); scanf (“%d”,&a[i]); for (i=99;i>=0;i--) for (i=99;i>=0;i--) printf (“%d”,a[i]); printf (“%d”,a[i]);} קלט פלט

4 מערכים - אתחול int a[10] = {1,2,3}; int a[10] = {0}; a[0] a[1] a[2] a[9]  1 2 3 0 a[0] a[1] a[2] a[9]  0 0 0 0

5 מערכים נכתוב תוכנית שזורקת קובייה 6000 פעמיים ונספור כמה פעמיים יצא כל מספר.

6 #include #include #define SIZE 7 int main() { int face, roll, frequency[ SIZE ] = { 0 }; int face, roll, frequency[ SIZE ] = { 0 }; srand( time(NULL) ); srand( time(NULL) ); for ( roll = 1; roll <= 6000; roll++ ) { for ( roll = 1; roll <= 6000; roll++ ) { face = rand() % 6 + 1; face = rand() % 6 + 1; ++frequency[ face ]; ++frequency[ face ]; } printf( "%s%17s\n", "Face", "Frequency" ); printf( "%s%17s\n", "Face", "Frequency" ); for ( face = 1; face <= SIZE - 1; face++ ) for ( face = 1; face <= SIZE - 1; face++ ) printf( "%4d%17d\n", face, frequency[ face ] ); printf( "%4d%17d\n", face, frequency[ face ] ); return 0; return 0;}

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

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

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

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

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

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

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

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

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

16 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); }

17 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

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

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

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

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

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

23 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);

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

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

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

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

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

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

30 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

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

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

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

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

35 מחרוזות מחרוזת – מחרוזת זה מערך של תווים אשר מסתיים ב ‘\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

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

37 #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

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

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

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

41 נניח שהמערכים הם מחרוזות ! אפשר להעביר לפונקציה רק מצביע לתחילת המערך ( המחרוזת ) אפשר להעביר לפונקציה רק מצביע לתחילת המערך ( המחרוזת ) 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)

42 #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)); } בדיקת תת המחרוזת נניח שהמערכים הם מחרוזות !

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

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

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


Download ppt "תכנות תרגול 9 שבוע : 19.4.05. מערכים int a; a=5; int a[10]; a[2] = 5; 5 a a[0] a[1] a[2] a[9]  5 משתנה בודד מערך גישה למשתנה השלישי במערך."

Similar presentations


Ads by Google