Download presentation
Presentation is loading. Please wait.
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
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.