Presentation is loading. Please wait.

Presentation is loading. Please wait.

תכנות תרגול 12 שבוע : 22.1.06. מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.

Similar presentations


Presentation on theme: "תכנות תרגול 12 שבוע : 22.1.06. מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים."— Presentation transcript:

1 תכנות תרגול 12 שבוע : 22.1.06

2 מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המילה typedef היא לאפשר למתכנת לתת שמות חדשים לטיפוסי משתנים קיימים. מטרת המילה typedef היא לאפשר למתכנת לתת שמות חדשים לטיפוסי משתנים קיימים.

3 מבנים נניח שאנו כותבים תוכנית שמטרתה היא לחשב ערכים באמצעות מספרים מרוכבים a+bi נניח שאנו כותבים תוכנית שמטרתה היא לחשב ערכים באמצעות מספרים מרוכבים a+bi הכי נוח לנו הוא אם כמו שהיה לנו טיפוס למספר ממשי (double) אז יהיה לנו גם טיפוס למספר מרוכב. השימוש במבנים מאפשר זאת. הכי נוח לנו הוא אם כמו שהיה לנו טיפוס למספר ממשי (double) אז יהיה לנו גם טיפוס למספר מרוכב. השימוש במבנים מאפשר זאת.

4 Syntax מבנים הגדרת מבנה : הגדרת מבנה : struct complex { double real; double image; }; הגדרת משתנים מסוג זה הגדרת משתנים מסוג זה struct complex c; struct complex* pc; ה members של המבנה

5 Syntax מבנים struct complex { double real; double image; }; int main() { struct complex c; struct complex* pc; c.real = 5; c.image = 7; } real image 5 7 c

6 Syntax מבנים struct complex { double real; double image; }; int main() { struct complex c; struct complex* pc; c.real = 5; c.image = 7; pc = &c; pc->real = 3; pc->image = 4; } real image 5 7 c 6024 pc 6024 3 4

7 Syntax מבנים struct complex { double real; double image; }; סיכום : לגישה ל members של c נשתמש בנקודה. לגישה ל members של pc נשתמש ב <-

8 #include struct complex{ double real; double im; }; void PrintComplex (struct complex num); void ScanComplex(struct complex *p_num); int main() { struct complex x; ScanComplex(&x); PrintComplex(x); return 0; }

9 void PrintComplex (struct complex num) { printf(“%lf + %lf i\n”, num.real, num.im); } void ScanComplex(struct complex *p_num) { scanf(“%lf%lf”, &(p_num->real), &(p_num->im)); }

10 תרגיל כתבו פונקציה המקבלת שני מספרים מרוכבים, מחברת ביניהם ומחזירה את הסכום. כתבו פונקציה המקבלת שני מספרים מרוכבים, מחברת ביניהם ומחזירה את הסכום. כתבו פונקציה המחשבת את הערך המוחלט של מספר מרוכב ומחזירה את הערך הזה. כתבו פונקציה המחשבת את הערך המוחלט של מספר מרוכב ומחזירה את הערך הזה.

11 double AbsComplex(struct complex a) { return sqrt(a.real * a.real + a.im * a.im); } struct complex Add(struct complex a, struct complex b) { struct complex s; s.real = a.real + b.real; s.im = a.im + b.im; return s; } שימוש בפונקציות x = Add(x,y); ab = AbsComplex(x); העברה לפי ערך !

12 מבנים ושימוש ב - typedef struct complex { double real; double image; }; int main() { struct complex c={5,7}; struct complex* pc; } struct complex { double real; double image; }; typedef struct complex complex_t; int main() { complex_t c={5,7}; complex_t* pc; } typedef struct complex complex_t; טיפוס קיים שם חדש לטיפוס קיים

13 double AbsComplex(complex_t a) { return sqrt(a.real * a.real + a.im * a.im); } complex_t Add(complex_t a, complex_t b) { complex_t s; s.real = a.real + b.real; s.im = a.im + b.im; return s; }

14 double AbsComplex(complex_t* pa) { return sqrt(pa->real*pa->real + pa->im*pa->im); } complex_t Add(complex_t* pa, complex_t* pb) { complex_t s; s.real = pa->real + pb->real; s.im = pa->im + pb->im; return s; }

15 מערכים ומבנים מאחר ומבנים מגדירים סוג חדש של משתנים הרי מאחר ומבנים מגדירים סוג חדש של משתנים הרי שכמו לסוגים רגילים נרצה ליצור מערכים עבור סוגים אלו real 5 7 image 2 1 7 2 1 8 complex_t arr[SIZE]={{5,7},{2,1},{7,2},{1,8}}; arr

16 מערכים ומבנים פונקציה להדפסת מערך פונקציה להדפסת מערך void PrintComplexArr(complex_t arr[],int n) { int i; for (i=0;i<n;i++) { PrintComplex(arr[i]); }

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

18 פתרון int MaxAbs(complex_t arr[],int n) { inti,maxIn; doublemaxAbs=-1; for (i=0;i<n;i++) if ( AbsComplex(arr[i]) > maxAbs ) { maxAbs = AbsComplex(arr[i]); maxIn = i; } return maxIn; }

19 רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע את הוספת האיברים בצורה נוחה יותר. מבנה זה נקרא רשימה מקושרת. איבר מידע מצביע לאיבר מצביע לראש הרשימה איבר מידע מצביע לאיבר איבר מידע מצביע לאיבר איבר מידע מצביע לאיבר איבר מידע מצביע לאיבר 5 71 8

20 struct list { int data; int data; struct list *next; struct list *next;}; typedef strcut list Item; מידע מצביע לאיבר פעולות על הרשימה : יצירה והריסה של רשימה ספירת מספר האיברים ברשימה חיבור שתי רשימות מחיקה / הוספה של איבר לרשימה הדפסת רשימה

21 רשימות מקושרות ב -C  נחזיק מצביע אשר יהיה מצביע לראש הרשימה וישב ב main-.  תהיה לנו פונקצית הוספה אשר תוסיף איברים לרשימה בסוף הרשימה.  הפונקציה תדע לקבל מצביע לראש הרשימה וערך להוספה ותוסיף את האיבר בסוף הרשימה.

22 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 7 איבר מידע מצביע לאיבר 5 רשימות מקושרות ב -C int main() { Item *L_head = NULL; L_head = Add(L_head,5); L_head = Add(L_head,3); L_head = Add(L_head,7); } מצביע לראש הרשימה

23 Item* Add(Item* L_head, int value) { Item* L_tail = L_head; Item* L_tail = L_head; Item* I_new = malloc(sizeof (Item)); Item* I_new = malloc(sizeof (Item)); I_new->value = value; I_new->value = value; I_new->next = NULL; I_new->next = NULL; if (L_tail == NULL) return I_new; while (L_tail->next != NULL) L_tail=L_tail->next; L_tail=L_tail->next; L_tail->next = I_new; L_tail->next = I_new; return L_head; return L_head;}

24 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 7 איבר מידע מצביע לאיבר 5 רשימות מקושרות ב -C int main() { Item *L_head = NULL; … L_head = Delete(L_head,3); } מצביע לראש הרשימה

25 Item *Delete(Item * head,int value) { Item* curr = head; Item* prev = head; if (curr->value == value) { curr = curr->next; free(head); return curr; } האיבר למחיקה הוא הראשון

26 while (curr != NULL) { if (curr->value == value) { prev->next = curr->next; free(curr); return head; } prev = curr; curr = curr->next; } return head; } חיפוש ומחיקת איבר

27 void PrintList(Item *head) { if (head == NULL) { printf("\n"); return; } else { printf("%d ",head->data); PrintList(head->next); return; } הדפסת רשימה

28 כתוב פונקציה המקבלת מצביע לרשימה וסופרת כמה איברים יש ברשימה כתוב פונקציה המקבלת מצביע לרשימה וסופרת כמה איברים יש ברשימה

29 int Count(Item * L) { int counter=0; while (L != NULL) { counter++; L=L->next; } return counter; } int CountR(Item * L) { if (L == NULL) return 0; return 1 + CountR(L->next); }

30 כתוב פונקציה המקבלת מצביעים לשתי רשימות מקושרות ומחברת אותן. כתוב פונקציה המקבלת מצביעים לשתי רשימות מקושרות ומחברת אותן. איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 7 איבר מידע מצביע לאיבר 5 רשימה 1 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 5 רשימה 2 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 7 איבר מידע מצביע לאיבר 5 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 5

31 Item* Meld(Item* L1,Item* L2) { Item* L1_head = L1; if (L1 == NULL) return L2; if (L2 == NULL) return L1; while (L1->next != NULL) L1=L1->next; L1->next = L2; return L1_head; }


Download ppt "תכנות תרגול 12 שבוע : 22.1.06. מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים."

Similar presentations


Ads by Google