הקצאות דינאמיות בשילוב מבנים

Slides:



Advertisements
Similar presentations
ממיבחניםC שאלות ++.
Advertisements

מבוא למדעי המחשב לתעשייה וניהול דוגמאות ותרגול נוסף במערך חד ממדי הרצאה 12.
הרצאה 04 הקצאות דינאמיות קרן כליף.
הקצאות דינאמיות קרן כליף.
Pointers הרצאה קריטית. השאלות הפתוחות מה זה ה- & שמופיע ב scanf מדוע כשמעבירים מחרוזת ל scanf אין צורך ב & האם ניתן להכריז על מערך שגדלו אינו ידוע בתחילת.
1 מבוא למדעי המחשב הקצאה דינאמית. 2 הקצאת זיכרון דינאמית  כאשר אנו משתמשים במערכים, אנו מקצים אוטומטית את הזיכרון המקסימלי שנצטרך.  בפועל, אנו משתמשים.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תרגול חזרה. מבנה האובייקט תאר את מבנה האובייקט כולל מבנה טבלאות הפונקציות הוירטואליות עבור התכנית הבאה struct A { int x; virtual void a() {}; }; struct.
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
תכנות תרגול 14 שבוע:
תכנות תרגול 10 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
מבוא למדעי המחשב תרגול 6 - מערכים שעת קבלה : יום שני 11:00-12:00 דוא " ל :
תכנות תרגול 5 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא כללי למדעי המחשב הקצאת זיכרון דינאמית
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
מבוא למדעי המחשב תרגול 12 – הקצאת זיכרון דינאמית שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Void*, pointer to functions, variadic functions קרן כליף.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
מבנה נתונים ואלגוריתמים ) לשעבר - עיבוד מידע( ד"ר אבי רוזנפלד ד"ר אריאלה ריכרדסון.
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
תכנות מכוון עצמים ו- C++ יחידה 11 תבניות - templates
Formal Specifications for Complex Systems (236368) Tutorial #1
הרצאה 10 פונקציות עם מספר משתנה של פרמטרים
מבוא למדעי המחשב סיבוכיות.
מערכים ומצביעים הקצאה דינאמית של מערכים דו-מימדיים
לולאות קרן כליף.
מיונים וחיפושים קרן כליף.
מבוא למדעי המחשב – סמסטר א' תשע"ב
ניתוח זמן ריצה (על קצה המזלג)
הקצאות דינאמיות בשילוב מבנים
הקצאות דינאמיות בשילוב מבנים
מצביעים קרן כליף.
תירגול 14: מבני נתונים דינאמיים
הרצאה 06 רשימות מקושרות קרן כליף.
תכנות מכוון עצמים ושפת JAVA
Static and enum קרן כליף.
קורס תכנות – סמסטר ב' תשס"ח
תכנות מכוון עצמים ושפת JAVA
הקצאות דינאמיות קרן כליף.
פונקציות קרן כליף.
מבנים קרן כליף.
תכנות מכוון עצמים בשפת JAVA
פרוקטוז, C6H12O6 , חד-סוכר מיוחד
ניתוח זמן ריצה (על קצה המזלג)
מצביעים קרן כליף.
פונקציות קרן כליף.
הקצאת זיכרון דינאמית מבוא כללי למדעי המחשב
מערכים ומטריצות קרן כליף.
Engineering Programming A
תכנות מכוון עצמים ושפת JAVA
מבוא כללי למדעי המחשב תרגול 6
מבוא למדעי המחשב – סמסטר א' תשע"ד
מחרוזות קרן כליף.
מערכים של מצביעים הקצאה דינאמית
תכנות מכוון עצמים ו- C++ יחידה 02 העמסת פונקציות, ערכי ברירת מחדל, enum, קימפול מותנה קרן כליף.
תירגול 8:מצביעים והקצאה דינאמית
שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב
Presentation transcript:

הקצאות דינאמיות בשילוב מבנים הקצאות דינאמיות בשילוב מבנים קרן כליף

ביחידה זו נלמד: דוגמאות משולבות למבנים והקצאות דינאמיות 2 © Keren Kalif

אין שום שינוי פרט לטיפוס ב- new הקצאת מערך של מבנים #include <iostream> using namespace std; struct Point { int x, y; }; void main() int size; Point* points; cout << "How many points? “; cin >> size; points = new Point[size]; if (!points) cout << "ERROR! Out of memory!\n”; return; } cout << "\nPoints are:\n"; for (int i=0 ; i < size ; i++) cout << "(" << points[i].x << ", " << points[i].y << ")\n"; cout << "\nPlease enter " << size << " points: \n"; cout << "Point #" << i+1 << ": "; cin >> points[i].x >> points[i].y; delete []points; אין שום שינוי פרט לטיפוס ב- new 3 © Keren Kalif

4 דרכים שונות להגדרת מערך מערך של Student בגודל הידוע בזמן קומפילציה Student arr[3]; מערך של Student בגודל שאינו ידוע בזמן קומפילציה cin >> size; Student* arr = new Student[size]; מערך של מצביעים ל- Student בגודל הידוע בזמן קומפילציה Student* arr[3]; מערך של מצביעים ל- Student בגודל שאינו ידוע בזמן קומפילציה Student** arr = new Student*[size]; 4 © Keren Kalif

דרכים להגדרת מערך (1) מערך של Student בגודל הידוע בזמן קומפילציה Student arr[3]; במקרה זה כל איברי המערך נמצאים על ה- stack מימוש זה בזבזני במידה ולא נשתמש בכל איברי המערך יעיל מבחינת ביצועים (אין הקצאות דינאמיות) Student[]: arr[0]: name arr[0]: id arr[1]: name arr[1]: id arr[2]: name arr[2]: id 5 © Keren Kalif

דרכים להגדרת מערך (2) מערך של Student בגודל שאינו ידוע בזמן קומפילציה cin >> size; Student* arr = new Student[size]; במקרה זה רק כתובת ההתחלה של המערך נמצאת על ה- stack, בעוד המבנים עצמם נמצאים על ה- heap גם מימוש זה בזבזני במידה ולא נשתמש בכל איברי המערך יעיל מבחינת ביצועים (יש רק הקצאה אחת) Student: name “yoyo” 2220 id 111 2230 “gogo” 2236 222 2246 Student*: arr 2220 1000 int: size 2 1004 6 © Keren Kalif

דרכים להגדרת מערך (3) מערך של מצביעים ל- Student בגודל הידוע בזמן קומפילציה Student* arr[3]; במקרה זה יש מערך של 3 כתובות על ה- stack, והמבנים עצמם יוקצו דינאמית על ה- heap בעת הצורך, או יצביעו למבנים קיימים מימוש זה אופטימלי מבחינת מקום, כלומר נקצה מקום לנתוני המבנה רק בעת הצורך. פחות יעיל מבחינת ביצועים (כל אחד מהאיברים מוקצה דינאמית) Student: name “yoyo” 2200 id 111 Student*[]: arr 2200 1000 5400 NULL Student: name “gogo” 5400 id 222 7 © Keren Kalif

דרכים להגדרת מערך (4) מערך של מצביעים ל- Student בגודל שאינו ידוע בזמן קומפילציה cin >> size; Student** arr = new Student*[size]; על ה- stack תהיה רק כתובת ההתחלה של מערך הכתובות מערך הכתובות יוקצה על ה- heap שכן גודלו אינו ידוע בזמן קומפילציה Student: name “yoyo” 2200 id 111 Student**: arr 4400 1000 int: size 2 1004 Student**: arr ??? 1000 int: size 2 1004 Student: name “gogo” 5400 id 222 Student*[]: students ??? 4400 Student*[]: students 2200 4400 5400 8 © Keren Kalif

מערך מבנים בתוך מבנה בדוגמא הבאה יש לנו את המבנה "כיתה" שמכיל מערך של MAX_STUDNETS סטודנטים בכל איבר במערך יהיו נתונים של סטודנט כלומר, גודל המערך קבוע - כמות הסטודנטים המקסימלית בכל כיתה זהה 9 © Keren Kalif

דוגמא – כיתה עם סטודנטים void printClass(Class c) { cout << "The teacher is " << c.teacherName << " and the " << c. registeredStudents << " students are:\n", for (int i=0 ; i < c. registeredStudents ; i++) cout << " " < i+1 << "- Name: " << c.students[i].name << "\tId: " << c.students[i].id << endl; } void main() Class c = {"Keren", 0}; char answer; bool fContinue = true; cout << "Enter name and id for each student:\n"; do { cout << "Enter another student? "; cin >> answer; if (answer == 'n' || answer == 'N') fContinue = false; else cout << "Student #" << c.registeredStudents+1 << ": "; cin >> c.students[c.registeredStudents].name >> c.students[c.registeredStudents].id; c.registeredStudents++; } while (fContinue && c.registeredStudents < MAX_STUDENTS); printClass(c); } // main דוגמא – כיתה עם סטודנטים #include <iostream> using namespace std; const int MAX_STUDENTS=10; struct Student { char name[10]; int id; }; struct Class char teacherName[10]; int registeredStudents; Student students[MAX_STUDENTS]; 10 © Keren Kalif

החיסרונות כאשר גודל המערך קבוע לא ניתן להגדיר כיתות בהן המספר המקסימלי של הסטודנטים שונה למשל עבור קורסים עם קבוצות לימוד קטנות, או עבור שיעור שהוא תרגול יתכן ו- numOfRegistered קטן משמעותית מ- MAX_STUDENTS ואז יש ביזבוז רב של מקום מבנה תופס יחסית הרבה מקום בזיכרון כי הוא מכיל אוסף של שדות 11 © Keren Kalif

הקצאת מערך מבנים בתוך מבנה בדוגמא הבאה יש לנו את המבנה "כיתה" שיכול להכיל מערך של תלמידים בכל איבר במערך יהיו נתונים של סטודנט מספר התלמידים המקסימלי אינו ידוע מראש וניתן ע"י המשתמש בזמן ריצה לכן מערך התלמידים שבתוך המבנה "כיתה" מוקצה דינאמית דוגמא, המשתמש בחר מערך בגודל 4, בכל איבר יהיו נתוני סטודנט 12 © Keren Kalif

דוגמא – הקצאת סטודנטים בכיתה (הקוד בלבד, כך שאפשר לראות אותו ) #include <iostream> using namespace std; struct Student { char name[10]; int id; } ; struct Class char teacherName[10]; int numOfStudents; Student* students; }; void main() Class c = {"Keren"}; cout << "How many students? “; cin >> c.numOfStudents; c.students = new Student[c.numOfStudents]; // check if allocation succeeded.. cout << "Enter name and id for each student:\n”; for (int i=0 ; i < c.numOfStudents ; i++) cout << "Student #” << i+1 << “: “; cin >> c.students[i].name >> c.students[i].id; } printClass(c); delete []c.students; void printClass(Class c) { cout << "The teacher is “ < c.teacherName << “ and the “ << c.numOfStudents << “ students are:\n”; for (int i=0 ; i < c.numOfStudents ; i++) cout << " “ << i+1 << “- Name: “ << c.students[i].name << “\tId: “ << c.students[i].id << endl; } 13 © Keren Kalif

דוגמא – הקצאת סטודנטים בכיתה #include <iostream> using namespace std; struct Student { char name[10]; int id; } ; struct Class char teacherName[10]; int numOfStudents; Student* students; }; void printClass(Class c) { cout << "The teacher is “ < c.teacherName << “ and the “ << c.numOfStudents << “ students are:\n”; for (int i=0 ; i < c.numOfStudents ; i++) cout << " “ << i+1 << “- Name: “ << c.students[i].name << “\tId: “ << c.students[i].id << endl; } void main() Class c = {"Keren“}; cout << "How many students? “; cin >> c.numOfStudents; c.students = new Student[c.numOfStudents]; // check if allocation succeeded.. cout << "Enter name and id for each student:\n”; cout << "Student #” << i+1 << “: “; cin >> c.students[i].name >> c.students[i].id; printClass(c); delete []c.students; int:i ??? 3000 Class: char[10]:c.teacherName “keren” 3004 int: c.numOfStudents 2 Student*:c.students 2220 שינוי שם המורה בתוך הפונקציה לא ישנה את הנתון המקורי, אבל שינוי ערכים במערך הסטודנטים כן ישתנו. הזיכרון של printClass Student: name ??? 2220 id 2230 2236 2246 Student: name “yoyo” 2220 id 111 2230 “gogo” 2236 222 2246 זיכרון ה- heap int:i ??? 1000 Class: char[10]:c.teacherName “keren” 1004 int: c.numOfStudents Student*:c.students int:i ??? 1000 Class: char[10]:c.teacherName “keren” 1004 int: c.numOfStudents 2 Student*:c.students 2220 int:i ??? 1000 Class: char[10]:c.teacherName 1004 int: c.numOfStudents Student*:c.students int:i ??? 1000 Class: char[10]:c.teacherName “keren” 1004 int: c.numOfStudents 2 Student*:c.students 14 © Keren Kalif הזיכרון של ה- main

אבל מה אם נרצה להקצות מערך ולהשתמש רק בחלק מהאיברים? החיסרון במימוש המחזיק מערך של סטודנטים, בין אם הוקצה דינאמית או לא, הוא כאשר לא מנצלים את כל איברי המערך, ואז יש ביזבוז זיכרון לכן נקצה מערך של מצביעים למבנים בגודל המקסימלי שאנחנו רוצים, וכל איבר שיהיה בשימוש יצביע למבנה שיוקצה דינאמית 15 © Keren Kalif

הקצאת מערך של מצביעים למבנים בתוך מבנה בדוגמא הבאה יש לנו את המבנה "כיתה" שיכול להכיל אוסף של תלמידים מספר הסטודנטים המקסימלי ידוע מראש ויש מערך של מצביעים ל"סטודנט" בתחילה רשומים לכיתה 0 סטודנטים, וכל פעם נוסיף סטודנט נוסף לכיתה כל איבר יהיה מצביע ל"סטודנט". כל עוד לא נרשם סטודנט המצביע הוא NULL דוגמא: כיתה שיכולים להיות בה מקסימום 4 סטודנטים לאחר רישום סטודנט 16 © Keren Kalif

דוגמא – רישום סטודנטים לכיתה void main() { bool fExit=false; char answer; Class c = {"Keren”, 0}; do { if (c.registeredStudents == MAX_STUDENTS) cout << "Class is full!\n”; break; } cout << "Register a student (Y/N)? “; cin >> answer; if (answer == 'N') fExit = true; else c.students[c.registeredStudents] = new Student; cout << "Enter name and id: "; cin >> c.students[c.registeredStudents]->name >> c.students[c.registeredStudents]->id; c.registeredStudents++; } while (fExit==false); printClass(c); for (int i=0 ; i < c.registeredStudents ; i++) delete c.students[i]; 17 © Keren Kalif דוגמא – רישום סטודנטים לכיתה בדיקה אם יש מקום לסטודנט נוסף (הקוד בלבד, כך שאפשר לראות אותו ) #include <iostream> using namespace std; const int MAX_STUDENTS=2; struct Student { char name[10]; int id; } ; struct Class char teacherName[10]; int registeredStudents; Student* students[MAX_STUDENTS]; }; void printClass(Class c) cout << "The teacher is “ < c.teacherName << “ and the “ << c.registeredStudents << “ students are:\n”; for (int i=0 ; i < c.registeredStudents ; i++) cout << " “ << i+1 << “- Name: “ << c.students[i]->name << “\tId: “ << c.students[i]->id << endl; } פניה לאיבר הפנוי הבא בעזרת registeredStudents מערך של מצביעים פניה לשדות איברי המערך בעזרת <- (כי הם מצביעים)

דוגמא – רישום סטודנטים לכיתה void main() { bool fExit=false; char answer; Class c = {"Keren“, 0}; do { if (c.registeredStudents == MAX_STUDENTS) cout << "Class is full!\n”; break; } cout << "Register a student (Y/N)? “; cin >> answer; if (answer == 'N') fExit = true; else c.students[c.registeredStudents] = new Student; cout << "Enter name and id: “; cin >> c.students[c.registeredStudents]->name >> c.students[c.registeredStudents]->id; c.registeredStudents++; } while (fExit==false); printClass(c); for ( ; ; ) delete c.students[i]; Class: char[10]:c.teacherName “Keren” 1000 int: c.registeredStudents Student*[] :c.students 2200 NULL Class: char[10]:c.teacherName “Keren” 1000 int: c.registeredStudents 1 Student*[] :c.students 2200 5300 Class: char[10]:c.teacherName “Keren” 1000 int: c.registeredStudents 2 Student*[] :c.students 2200 5300 Class: char[10]:c.teacherName “Keren” 1000 int: c.registeredStudents Student*[] :c.students NULL Class: char[10]:c.teacherName “Keren” 1000 int: c.registeredStudents 1 Student*[] :c.students 2200 NULL Class: char[10]:c.teacherName ??? 1000 int: c.registeredStudents Student*[] :c.students הזיכרון החלקי של ה- main #include <iostream> using namespace std; const int MAX_STUDENTS=2; struct Student { char name[10]; int id; } ; struct Class char teacherName[10]; int registeredStudents; Student* students[MAX_STUDENTS]; }; void printClass(Class c) cout << "The teacher is “ < c.teacherName << “ and the “ << c.registeredStudents << “ students are:\n”; for (int i=0 ; i < c.registeredStudents ; i++) cout << " “ << i+1 << “- Name: “ << c.students[i]->name << “\tId: “ << c.students[i]->id << endl; } Y Student: name 2200 id Student: name “momo” 2200 id 1111 Student: name “gogo” 5300 id 2222 Student: name 5300 id i=2 i=1 i=0 זיכרון ה- heap int i=0 i < c.registeredStudents i++ 18 © Keren Kalif

הקצאת מערך של מצביעים למבנים בתוך מבנה בדוגמא הבאה יש לנו את המבנה "כיתה" שיכול להכיל אוסף של תלמידים מספר הסטודנטים המקסימלי אינו ידוע מראש וניתן ע"י המשתמש בזמן ריצה בתחילה רשומים לכיתה 0 סטודנטים, וכל פעם נוסיף סטודנט נוסף לכיתה בכל איבר יהיה מצביע ל"סטודנט". כל עוד לא נרשם סטודנט המצביע הוא NULL דוגמא: כיתה שהמשתמש החליט שיכולים להיות בה מקסימום 4 סטודנטים: לאחר רישום סטודנט 19 © Keren Kalif

דוגמא – רישום סטודנטים לכיתה דינאמית (1) #include <iostream> using namespace std; struct Student { char name[10]; int id; } ; struct Class char teacherName[10]; int numOfStudents; int registeredStudents; Student** students; }; void printClass(Class c) cout << "The teacher is “ < c.teacherName << “ and the “ << c.registeredStudents << “ students are:\n”; for (int i=0 ; i < c.registeredStudents ; i++) cout << " “ << i+1 << “- Name: “ << c.students[i]->name << “\tId: “ << c.students[i]->id << endl; } מערך בגודל שאינו ידוע עדיין ושכל איבר בו יהיה מצביע: כוכבית אחת כי זהו מערך שמוקצה דינאמית, כדי להכיל את כתובת תחילת המערך כוכבית שניה כי כל איבר במערך הוא כתובת 20 © Keren Kalif

דוגמא – רישום סטודנטים לכיתה דינאמית (2) void main() { bool fExit=false; char answer; Class c = {"Keren“, 0}; cout << "How many max students? "; cin >> c.numOfStudents; c.students = new Student*[c.numOfStudents]; // check if allocation succeeded do { if (c.registeredStudents == c.numOfStudents) cout << "Class is full!\n"; break; } cout << "Register a student (Y/N)? “; cin >> answer; if (answer == 'N') fExit = true; else c.students[c.registeredStudents] = new Student; cout << "Enter name and id: "; cin >> c.students[c.registeredStudents]->name >> c.students[c.registeredStudents]->id; c.registeredStudents++; } while (fExit==false); printClass(c); for (int i=0 ; i < c.registeredStudents ; i++) delete c.students[i]; delete []c.students; קבלת מספר הסטודנטים המקסימלי מהמשתמש הקצאת מערך של מצביעים לסטודנט שיחרור כל אחד מאיברי המערך שיחרור מערך המצביעים שגם הוקצה דינאמית (כמו בדוגמא "מערך של מערכים") 21 © Keren Kalif

השוואה בזכרון בין מערך מבנים למערך מצביעים נניח כי מבנה Student תופס 16 בתים בזכרון נניח כי יש כיתה עם פוטנציאל ל- 100 סטודנטים, אבל בפועל רשומים רק 40 מערך מבנים מערך מצביעים גודל הזכרון למבנים 16x100 = 1600 16 x 40 = 640 גודל הזכרון למצביעים 4 x 100 = 400 סה"כ הזכרון שבשימוש 1600 1040 סה"כ הזכרון המבוזבז 16x60 = 960 4 x 60 = 240 22 © Keren Kalif

ולסיום.. http://rlv.zcache.com/programmer_joke_superior_intelligence_ornament-r09ddf4dc720c4e978a0389e668525a88_x7s2y_8byvr_512.jpg 23 © Keren Kalif

ביחידה זו למדנו: דוגמאות משולבות למבנים והקצאות דינאמיות 24 © Keren Kalif

תרגיל 1: הגדר את המבנה Point אשר נתוניו הם x ו- y הגדר את המבנה Polygon אשר נתוניו הם מספר הקודקודים שלו וכן מערך לקודקודים הגדר ב- main 3 נקודות ואתחל את ערכיהן הגדר פוליגון ושאל את המשתמש לכמות קודקודיו 3 הקודקודים הראשונים יהיו 3 הנקודות שהוגדרו מקודם, ושאר הקודקודים יוגרלו הדפס את נתוני הפוליגון 25 © Keren Kalif

תרגיל 2: הגדר את המבנה Person ששדותיו הם שם (הגודל אינו מוגבל) ות.ז. הגדר את המבנה Family שנתוניו הם אבא ואמא (מטיפוס Person), וכן מערך של 10 מצביעים ל- Person שייצג את הכמות המקסימלית של ילדים במשפחה כתוב פונקציות לקליטת הנתונים כתוב פונקציות להדפסת הנתונים כתוב main הבודק את התוכנית יש להקפיד על מודולריות! 26 © Keren Kalif

תרגיל 3 (1): כתוב את המבנה Friend המכיל שם ואת המרחק ממנו הוא גר ממני (בק"מ) את אוסף החברים שלי נפריד לקבוצות לפי המרחק שבו הם גרים ממני: חברים שניתן ללכת אליהם ברגל: גרים עד 2 ק"מ ממני חברים שניתן לרכוב אליהם באופניים: גרים עד 5 ק"מ ממני חברים שצריך לנסוע אליהם באוטו: גרים במרחק הגדול מ- 5 ק"מ ממני 27 © Keren Kalif

תרגיל 3 (2): עבור מערך החברים הבא: נייצר את 3 המערכים הבאים: תרגיל 3 (2): עבור מערך החברים הבא: נייצר את 3 המערכים הבאים: ולבסוף נחזיר מערך שיכיל את הכתובות של מערכים אלו: {"toto", 2} {"koko", 4} {"yoyo", 1} {"momo", 6} {"gogo", 3} NULL חברים שניתן ללכת אליהם חברים שניתן לרכוב אליהם חברים שצריך לנהוג אליהם 28 © Keren Kalif

תרגיל 3 (3): כתוב פונקציה המקבלת מערך של חברים וגודלו תרגיל 3 (3): כתוב פונקציה המקבלת מערך של חברים וגודלו הפונקציה תייצר מערך בגודל 3, שכל איבר בו יהיה כתובת של מערך של מצביעים לחברים לפי ההגדרות הנ"ל הפונקציה תמלא את המערכים המתאימים ותחזיר מערך זה שימו לב: מערכי החברים מכילים רק מצביעים לאיברים מהמערך המקורי שהתקבל כפרמטר (אין סיבה לשכפל את הנתונים). כדי לציין סיומו של מערך חברים שנוצר בפונקציה, יש לשים NULL באיבר האחרון 29 © Keren Kalif

תרגיל 3 (4): הגדר ב- main מערך שאיבריו מטיפוס Friend, ושלח אותו לפונקציה שהגדרת הדפס את החברים לפי החלוקה לקבוצות 30 © Keren Kalif