Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול 10 13.12.2010.

Similar presentations


Presentation on theme: "1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול 10 13.12.2010."— Presentation transcript:

1 1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול 10 13.12.2010

2 מטרת התרגול רשימה מקושרת 2 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

3 רשימת מעגלים במהלך השיעור נבנה תוכנית אינטראקטיבית אשר מתחזקת רשימה של מעגלים במישור ומבצעת עליה שאילתות  התוכנית תציג למשתמש את התפריט הבא ותמתין לבחירת המשתמש  התוכנית תצא במידה והמשתמש ביקש  אחרת, בהתאם לבחירת המשתמש, התוכנית תוסיף מעגל, תסיר מעגל, תדפיס את רשימת המעגלים, או תבצע שאילת חיפוש 3 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

4 שלד התוכנית שלד התוכנית יכיל לולאה אינסופית אשר בכל איטרציה : – תדפיס את התפריט למסך ותקלוט את בחירת המשתמש – אם המשתמש בחר ‘a’, התוכנית תקלוט את המעגל ( מרכז + רדיוס ) ותקרא לפונקציה AddCircle ע " מ להוסיף את המעגל לרשימה – אם המשתמש בחר ‘d’, התוכנית תקלוט את המעגל ( מרכז + רדיוס ) ותקרא לפונקציה RemoveCircle ע " מ להסיר את המעגל מהרשימה – אם המשתמש בחר ‘p’, התוכנית תדפיס את הרשימה בעזרת הפונקציה PrintList – אם המשתמש בחר ‘s’, התוכנית תקלוט נקודה במישור ותבדוק בעזרת הפונקציה IsPointContained אם קיים מעגל אשר מכיל אותה – אם המשתמש בחר ‘q’, התוכנית תנקה את הרשימה בעזרת הפונקציה FreeList ותצא מימוש השלד לא מעניין ( נתון בתוכנית המצורפת למצגת ) ולכן נתמקד במימוש הפונקציות הקשורות ברשימה 4 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

5 הגדרת הרשימה הגדירו מבנה אשר מייצג נקודה במישור ( קוארדינטות x ו - y) הגדירו מבנה אשר מייצג מעגל ( נקודת center ו -radius) הגדירו איבר של רשימת מקושרת אשר מכיל את המעגל שהוגדר מקודם 5 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

6 הגדרת הרשימה 6 typedef struct { int x; int y; } Point2D; typedef struct { Point2D center; int radius; } Circle; typedef struct _node { Circle circle; struct _node* next; } Node; Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

7 AddCircle 7 ממשו את הפונקציה : int AddCircle(Node** phead, Circle c) – הפונקציה מקבלת מצביע למצביע של ראש הרשימה כאשר ייתכן שהרשימה ריקה (*phead == NULL) – הפונקציה מקצה איבר Node עבור המעגל ומוסיפה אותו לסוף הרשימה הקיימת – הפונקציה תחזיר FALSE ( קבוע מוגדר ) במידה והקצאת הזיכרון נכשלה ו -TRUE אחרת Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

8 AddCircle 8 int AddCircle(Node** phead, Circle c) } Node* newNode, *p; // Create new list node newNode = (Node*)malloc( sizeof(Node)); if (newNode == NULL) return FALSE; newNode->circle = c; newNode->next = NULL; // Add new node to list if (*phead == NULL) // List is empty { *phead = newNode; return TRUE; } for (p = *phead; p->next != NULL; p = p->next); p->next = newNode; return TRUE; } Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

9 AddCircle ( הערת אגב ) האם ניתן להכניס איבר לרשימה מבלי לטפל באיבר הראשון באופן מיוחד? 9 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

10 AddCircle ( הערת אגב ) 10 int AddCircle(Node ** phead, Circle c) } Node* newNode, **p; // Create new list node newNode = (Node*)malloc( sizeof(Node)); if (newNode == NULL) return FALSE; newNode->circle = c; newNode->next = NULL; // Add new node to list for (p = phead; *p != NULL; p = &((*p)->next)); *p = newNode; return TRUE; } Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

11 RemoveCircle 11 ממשו את הפונקציה : void RemoveCircle(Node** phead, Circle c) – הפונקציה מקבלת מצביע למצביע של ראש הרשימה כאשר ייתכן שהרשימה ריקה (*phead == NULL) – הפונקציה מסירה מהרשימה את האיבר שמכיל את המעגל המבוקש במידה והוא קיים. במידה ולאחר ההסרה מתקבלת רשימה ריקה מאיברים אז *phead מקבל את הערך NULL – הניחו שקיימת פונקציה אשר בודקת אם שני מעגלים שווים ( מחזירה TRUE\FALSE בהתאם ) int IsEqual(Circle c1, Circle c2) Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

12 RemoveCircle 12 void RemoveCircle(Node** phead, Circle c) } Node * prev, *p; if (*phead == NULL) // List is empty – do nothing return ; if (IsEqual (c, (*phead)->circle)) // If circle is in list head { p = *phead; *phead = (*phead)->next; free(p); return; } // Search circle in rest of the list prev = *phead; p = prev->next; while (p != NULL) { if (IsEqual(c, p->circle)) // Found circle { prev->next = p->next; free(p); p = prev; } prev = p; p = p->next; } Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

13 PrintList 13 ממשו את הפונקציה : void PrintList(Node* p) – הפונקציה מקבלת מצביע לראש הרשימה כאשר ייתכן שהרשימה ריקה (p == NULL) – הפונקציה עוברת על הרשימה ומדפיסה כל מעגל בשורה נפרדת Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

14 PrintList 14 void PrintList(Node * p) } int idx = 0; printf("\nCircle list: \n"); for (; p != NULL; p = p->next) { printf("\t%d) Center = (%d, %d), Radius = %d\n”, ++idx, p->circle.center.x, p->circle.center.y, p->circle.radius); } Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

15 FreeList 15 ממשו את הפונקציה : void FreeList(Node * p) – הפונקציה מקבלת מצביע לראש הרשימה כאשר ייתכן שהרשימה ריקה (*p == NULL) – על הפונקציה לנקות את הרשימה באופן רקורסיבי Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

16 FreeList 16 void FreeList(Node * p) } if (p == NULL) return; FreeList(p->next); free(p); } Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

17 IsPointContained 17 ממשו את פונקציית השאילתא : int IsPointContained(Node* phead, Point2D point) – הפונקציה מקבלת רשימת מעגלים ונקודה ומחזירה TRUE במידה וקיים מעגל ברשימה אשר מכיל את הנקודה ו -FALSE אחרת – הניחו שקיימת פונקציה אשר מחשבת את המרחק בין שתי נקודות float dist(Point2D p1, Point2D p2) Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

18 IsPointContained 18 int IsPointContained(Node* p, Point2D point) } for (; p != NULL; p = p->next) { if ( (float)p->circle.radius >= dist(p->circle.center, point) ) return TRUE; } return FALSE; } Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

19 עבודת בית שנו את הפונקציה AddCircle כך שהרשימה תהיה ממוינת ע " פ ציר ה -x של מרכז המעגל שנו את התוכנית כך שהרשימה תהיה מעגלית שנו את התוכנית כך שהרשימה תהיה דו כיוונית ממשו את השאליתא הבאה : – התוכנית תקלוט מעגל מהמשתמש והשאילתא תחזיר כן במידה והמעגל נחתך עם מעגל כלשהו ברשימה 19 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel


Download ppt "1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול 10 13.12.2010."

Similar presentations


Ads by Google