1 / 16

תכנות בשפת סי תרגול 8

תכנות בשפת סי תרגול 8. תרגיל 1. נתונה הכרזת המשתנים הבאה בשפת C : int a, b, c[4]; אילו מבין השורות הבאות נכונות תחבירית ויעברו קומפילציה? אילו שורות ייצרו שגיאות, ואילו אזהרות? 1. *(c+3) = 8; 2. a = *(c+ *b); 3. *(c++) = 12; 4. c = b; 5. b = c;. תרגיל 1, המשך. תזכורת:

Télécharger la présentation

תכנות בשפת סי תרגול 8

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. תכנות בשפת סי תרגול 8

  2. תרגיל 1 • נתונה הכרזת המשתנים הבאה בשפת C: • int a, b, c[4]; • אילו מבין השורות הבאות נכונות תחבירית ויעברו קומפילציה? אילו שורות ייצרו שגיאות, ואילו אזהרות? 1. *(c+3) = 8; 2. a = *(c+ *b); 3. *(c++) = 12; 4. c = b; 5. b = c;

  3. תרגיל 1, המשך תזכורת: int a, b, c[4]; 6. a = (*c)++; 7. *(b+1) = (*c)++; 8. a = *b – *c; 9. *c = *(b++) 10. *(b++) = *(&a)

  4. תרגיל 2 • פונקציית main של תוכנית C מתחילה בשורות הבאות: void main() { int arr[20], *ptr, num; ptr = arr; • אילו מבין השורות הבאות נכונות תחבירית ויעברו קומפילציה? אילו שורות ייצרו שגיאות, ואילו אזהרות? • arr++; • arr = # • ptr;

  5. תרגיל 2, המשך תזכורת: void main() { int arr[20], *ptr, num; ptr = arr; 4. ptr = # 5. *ptr = 8; 6. *num = 8; 7. arr + 2 = 8; 8. &num = 8; 9. &num = &arr[5]; 10. num = *ptr;

  6. תרגיל 3 • מה תחזיר what בהפעלות הבאות: • what(“aaabbbcc”,”abc”) • what(“aaabbbcc”, “abcd”) • מה יעודה של הפונקציה what? #include <stdio.h> int what(char *st1, char *st2){ char *p = st1; if(*st2 || *st1){ if(*st1 == '\0') return 0; while(*st1 && *st2 && *st1==*st2) st1++; if(st1==p) return 0; return what(st1, st2+1); } else return 1; }

  7. תרגיל 4 • עבור 2 מערכים באורך זהה, ובעלי איבר אחרון שהוא -1, איזה ערך תחזיר 1what? int what1(int *arr1, int *arr2){ int tmp; if(*arr1==-1) return 0; tmp = what1(arr2 + 1, arr1 + 1); return *arr1 – tmp }

  8. תרגיל 4ב' intwhat2(int *arr1, int *arr2, int i){ int tmp; if(*arr1==-1) return 0; if(i) { tmp = what2(arr1 + 1, arr2 + 1, 1-i); return *arr1 – tmp; } else { tmp = what2(arr1 + 1, arr2 + 1, 1-i); return *arr2 –tmp; } } • עבור 2 מערכים באורך זהה, ובעלי איבר אחרון שהוא -1, וארגומנט נוסף 1, איזה ערך תחזיר what2?

  9. תרגיל 5- הכלת מחרוזות • צריך לממש את הפונקציה הבאה: • char* strstr(char *st1, char *st2) • הפונקציה מקבלת 2 מחרוזות כארגומנטים. • אם st2 מוכלת ב- st1, הפונקציה תחזיר מצביע לתו של st1 שממנו מתחילה המחרוזת המוכלת. • אם st2 איננה מוכלת ב- st1, אזי הפונקציה תחזיר NULL. • שימו לב– dog מוכלת ב- maddogs, ולא מוכלת ב- .adoog

  10. תרגיל 5 – פתרון איטרטיבי char* strstr(char *st1, char *st2) { int i = 0, st1_len, st2_len; st1_len = strlen(st1); st2_len = strlen(st2); while (st1_len – i >= st2_len) { if (inner_str(& (st1[i]), st2) return &(st1[i]); i++; } return NULL; } //returns 1 iff st1 begins with st2 int inner_str(char *st1, char *st2) { int i; for (i=0; st2[i] != ‘\0’; i++) { if (st1[i] != st2[i]) return 0; } return 1; }

  11. תרגיל 5 – פתרון רקורסיבי char* strstr(char *st1, char *st2) { int i = 0; if ( strlen(st1) < strlen(st2) ) return NULL; if (inner_str(st1, st2)) return st1; return strstr(&(st1[1]), st2); } //returns 1 iff st1 begins with st2 int inner_str(char *st1, char *st2) { if (st2[0] == ‘\0’) return 1; if (st1[0] != st2[0]) return 0; return inner_str(&(st1[1]), &(st2[1])); }

  12. תרגיל 6 #include <stdio.h> #include <stdlib.h> #define MAX 10 void main() { int *ptr, *arr]MAX[; int i, j; for (i=MAX-1 ; i>=0; i--) { arr[i] = (int*) malloc (i * sizeof(int)); if (arr[i]) for (j = 0; j < i; j++) * ( * (arr+i) + j) = j * i; ptr = * (arr + MAX – 1); while ( *ptr) printf ( “%d “, *ptr--); } • מה נכון עבור התוכנית? • התוכנית לא מדפיסה. • Run time error. • מדפיסה 9 8 7 6 5 4 3 2 1 0 • מדפיסה אינסוף אפסים • מדפיסה 0. • מדפיסה ערכים לא ידועים. • אף תשובה לא נכונה.

  13. תרגיל 7 • צריך לממש פונקציהvoid transpose(int** arr, int n) • arr – מערך דינאמי דו-מימדי בגודל n X n. (מייצג מטריצה ריבועית) • n – גודל המימד הריבועי של המטריצה. • הפונקציה תשנה את המערך הדו-מימדי ע"י ביצוע פעולת transpose עליו. • אם לפני הקריאה לפונקציה arr[i][j] = x ו – arr[j][i] = y, אזי אחרי סיום ריצת הפונקציה arr[i][j] = y ו – arr[j][i] = x. • שימו לב – השינוי הוא in-place.

  14. תרגיל 7 - פתרון void tranpose (int** arr, int n) { int i, j, tmp; for (i=0; i < n; i++) for (j=i+1; j < n; j++) { tmp = arr[i][j]; arr[i][j] = arr[j][i]; arr[j][i] = tmp; } }

  15. תרגיל 7ב' • צריך לממש פונקציהint** transpose2(int** arr, int n) • arr – מערך דינאמי דו-מימדי בגודל n X n. (מייצג מטריצה ריבועית) • n – גודל המימד הריבועי של המטריצה. • הפונקציה תייצר מערך דו-מימדי חדש, שערכי אבריו יהיו אברי המערך הדו-מימדי המקורי לאחר ביצוע פעולת transpose.

  16. תרגיל 7ב' - פתרון int** tranpose2 (int** arr, int n) { int i, j, tmp_arr; if (! tmp_arr = malloc(sizeof(int*) * n)) return NULL; for (i = 0; i < n; i++) { if (! tmp_arr[i] = malloc(sizeof(int) * n)) { for (j = 0; j < i; j++) free(tmp_arr[j]); free(tmp_arr); return NULL; } for (j = 0; j < n; j++) tmp_arr[i][j] = arr[i][j]; } transpose(tmp_arr, n); return tmp_arr; } היינו יכולים בשלב הזה לבצע את ה-Transpose בעצמנו, אבל העקרון המודולרי היה עובד גם עבור פעולות מסובכות יותר, כאלה שלא בהכרח היינו יודעים/רוצים לממש בעצמנו.

More Related