Download presentation
Presentation is loading. Please wait.
1
תכנות תרגול 11 שבוע : 7.6.06
2
מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המילה typedef היא לאפשר למתכנת לתת שמות חדשים לטיפוסי משתנים קיימים. מטרת המילה typedef היא לאפשר למתכנת לתת שמות חדשים לטיפוסי משתנים קיימים.
3
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
4
Syntax מבנים struct complex { double real; double image; }; לגישה ל members של c נשתמש בנקודה לגישה ל members של pc נשתמש ב <-
5
תרגיל כתוב פונקציה המקבלת שני מספרים מרוכבים ומחברת ביניהם ומחזירה את הסכום כתוב פונקציה המקבלת שני מספרים מרוכבים ומחברת ביניהם ומחזירה את הסכום כתוב פונקציה המחשבת את הערך המוחלט של מספר מרוכב ומחזירה את הערך הזה כתוב פונקציה המחשבת את הערך המוחלט של מספר מרוכב ומחזירה את הערך הזה
6
double AbsComplex(struct complex a) { return a.im * a.im + a.real * a.real; } struct complex Add(struct complex a, struct complex b) { struct complex s; s.im = a.im + b.im; s.real = a.real + b.real; return s; } שימוש בפונקציות x = Add(x,y); ab = AbsComplex(x); העברה לפי ערך !
7
מבנים ושימוש ב - 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; טיפוס קיים שם חדש לטיפוס קיים
8
double AbsComplex(complex_t a) { return a.im * a.im + a.real * a.real; } complex_t Add(complex_t a, complex_t b) { complex_t s; s.im = a.im + b.im; s.real = a.real + b.real; return s; }
9
double AbsComplex(complex_t* pa) { return pa->im * pa->im + pa->real * pa->real; } complex_t Add(complex_t* pa, complex_t* pb) { complex_t s; s.im = pa->im + pb->im; s.real = pa->real + pb->real; return s; }
10
מערכים ומבנים מאחר ומבנים מגדירים סוג חדש של משתנים הרי מאחר ומבנים מגדירים סוג חדש של משתנים הרי שכמו לסוגים רגילים נרצה ליצור מערכים עבור סוגים אלו real 5 7 image 2 1 7 2 1 8 complex_t arr[SIZE]={{5,7},{2,1},{7,2},{1,8}} arr
11
תרגיל כתוב פונקציה המקבלת מערך של מספרים מרוכבים ומחזירה את האינדקס של האיבר בעל הערך המוחלט המקסימאלי
12
פתרון int MaxAbs(complex_t *arr,int n) { int i,maxIn; double maxAbs=-1; for (i=0;i<n;i++) if (maxAbs < AbsComplex(arr[i])) { maxAbs = AbsComplex(arr[i]); maxIn = i; } return maxIn; }
13
שימוש של מבנה בתוך מבנה מבנה שהגדרנו יכול לשמש אותנו גם כ -member של מבנה אחר. למשל מבנה של נקודה יכול לשמש אותנו בבואנו להגדיר מבנה של משולש. struct point{ double x; double y; }; typedef struct point point_t; struct triangle { point_t x; point_t y; point_t z; };
14
הקצאת זיכרון דינאמית הזיכרון המקסימאלי ששימש את התוכנית שלנו עד היום היה קבוע מראש. לפני הרצת התוכנית, לאחר שהתוכנית עברה את שלב התרגום, כל המערכים שבתוכנית גודלם נקבע ואינו ניתן לשינוי במהלך ריצת התוכנית ! בעיות אפשריות : אם הגדרנו מערך בגודל 100 לשמור את ציוני כל הסטודנטים וכעת מגיע סטודנט נוסף מה נעשה ? התוכנית כבר כתובה ולא ניתן לשנות את גודל המערך !
15
הקצאת זיכרון דינאמית C מאפשרת לנו להקצות זיכרון תוך כדי ריצת התוכנית וכך להגדיר מערכים ומבנים אחרים בצורה דינאמית int main() { int a[10]; a[6] = 7; } 10 ints int main() { int *a; a = (int*) malloc(sizeof(int) * 10); a[6] = 7; } a 10 ints 6024
16
שחרור זיכרון שהוקצה דינאמית כל שטח זיכרון שהוקצה ע " י המתכנת צריך להיות משוחרר בסיום השימוש בו. לכן חייבים תמיד להחזיק את כתובת האזור שהוקצה על מנת שנוכל לשחרר אותו בסיום השימוש. כל שטח זיכרון שהוקצה ע " י המתכנת צריך להיות משוחרר בסיום השימוש בו. לכן חייבים תמיד להחזיק את כתובת האזור שהוקצה על מנת שנוכל לשחרר אותו בסיום השימוש. int main() { int *a; a = (int*) malloc(sizeof(int) * 10); a[6] = 7; free(a); } a 6024
17
הפונקציות נמצאות ב - stdlib.h הפונקציות נמצאות ב - stdlib.h void *malloc(size_t size); void *malloc(size_t size); –Allocate size bytes. Successful call return base address; otherwise NULL is returned. void *calloc(size_t n,size_t size_el) void *calloc(size_t n,size_t size_el) –Allocate an array on n elements each in size of size_el. Each bit is initialized to zero. Successful call return base address; otherwise NULL is returned. void free(void *ptr) void free(void *ptr) –Deallocate the memory pointed by ptr which must be a base address of previously allocated memory void *realloc(void *,size_t size) void *realloc(void *,size_t size) –Reallocate a memory block of size size.
18
רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע את הוספת האיברים בצורה נוחה יותר. מבנה זה נקרא רשימה מקושרת. איבר מידע מצביע לאיבר מצביע לראש הרשימה איבר מידע מצביע לאיבר איבר מידע מצביע לאיבר איבר מידע מצביע לאיבר איבר מידע מצביע לאיבר 5 71 8
19
struct list { int data; int data; struct list *next; struct list *next;}; typedef strcut list Item; מידע מצביע לאיבר פעולות על הרשימה : יצירה והריסה של רשימה ספירת מספר האיברים ברשימה חיבור שתי רשימות מחיקה / הוספה של איבר לרשימה הדפסת רשימה
20
רשימות מקושרות ב -C נחזיק מצביע אשר יהיה מצביע לראש הרשימה וישב ב main-. תהיה לנו פונקצית הוספה אשר תוסיף איברים לרשימה בסוף הרשימה. הפונקציה תדע לקבל מצביע לראש הרשימה וערך להוספה ותוסיף את האיבר בסוף הרשימה.
21
איבר מידע מצביע לאיבר 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); } מצביע לראש הרשימה
22
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;}
23
איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 7 איבר מידע מצביע לאיבר 5 רשימות מקושרות ב -C int main() { Item *L_head = NULL; … L_head = Delete(L_head,3); } מצביע לראש הרשימה
24
Item *Delete(Item * head,int value) { Item* curr = head; Item* prev = head; if (curr->value == value) { curr = curr->next; free(head); return curr; } האיבר למחיקה הוא הראשון
25
while (curr != NULL) { if (curr->value == value) { prev->next = curr->next; free(curr); return head; } prev = curr; curr = curr->next; } return head; } חיפוש ומחיקת איבר
26
void PrintList(Item *head) { if (head == NULL) { printf("\n"); return; } else { printf("%d ",head->data); PrintList(head->next); return; } הדפסת רשימה
27
כתוב פונקציה המקבלת מצביע לרשימה וסופרת כמה איברים יש ברשימה כתוב פונקציה המקבלת מצביע לרשימה וסופרת כמה איברים יש ברשימה
28
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); }
29
כתוב פונקציה המקבלת מצביעים לשתי רשימות מקושרות ומחברת אותן. כתוב פונקציה המקבלת מצביעים לשתי רשימות מקושרות ומחברת אותן. איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 7 איבר מידע מצביע לאיבר 5 רשימה 1 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 5 רשימה 2 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 7 איבר מידע מצביע לאיבר 5 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 5
30
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; }
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.