ממבחניםC שאלות ++. תכנות מונחה עצמים ו C++ (40 נקודות) בשאלה זאת עליכם לסייע בכתיבת תוכנית לניהול צי רכב של חברת השכרה. סעיף א' (10 נקודות): עליכם לכתוב.

Slides:



Advertisements
Similar presentations
Object Oriented 33 MCSD DORON AMIR
Advertisements

ממיבחניםC שאלות ++.
תוכנה 1 סמסטר א ' תשע " ב תרגול מס ' 7 * מנשקים, דיאגרמות וביטים * לא בהכרח בסדר הזה.
מבוא למדעי המחשב לתעשייה וניהול
בתרגול הקודם הורשה: –ניתן להרחיב רק מחלקה אחת –כל מה שלא private – עובר בהורשה –המילה השמורה super –יצירת היררכיה –Object היא שורש ההיררכיה –דריסה אופרטור.
 שאלות ממבחנים - C++.  מבנה הנתונים תור ( queue ) הוא מבנה הדומה למחסנית ( stack ) שנלמדה בקורס. לתור ניתן להוסיף איברים ( ע " י פעולה הנקראת enqueue.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
Class template Describing a generic class Instantiating classes that are type-specific version of this generic class Also are called parameterized types.
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
תכנות תרגול 7 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא.
תכנות תרגול 6 שבוע : חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה n n.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
1 Formal Specifications for Complex Systems (236368) Tutorial #5 Refinement in Z: data refinement; operations refinement; their combinations.
תרגול חזרה. מבנה האובייקט תאר את מבנה האובייקט כולל מבנה טבלאות הפונקציות הוירטואליות עבור התכנית הבאה struct A { int x; virtual void a() {}; }; struct.
1 ++C: יוצרים, הורסים ואופרטורים. 2 המחלקה Stack תזכורת class Stack { private: int* array; int size, top_index; public: Result init (int size) ; void.
Formal Specifications for Complex Systems (236368) Tutorial #6 appendix Statecharts vs. Raphsody 7 (theory vs. practice)
Class Array template The array class defined in last week manipulate array of integer If we need to define class of array for float, double data type,
תכנות תרגול 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 תרגול
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site : T.A. :Emilia Katz.
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
תרגול 10: הכרות עם ++C ++C כ- C משופר
תכנות תרגול 5 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
תוכנה 1 - תרגול שיעור 10 Pointers (2) שולי לב יהודי
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
1 Abstract Classes האם קיים אובייקט בשם רהיט? האם קיים אובייקט בשם כלי תחבורה? האם קיים אובייקט בשם כלי כתיבה? האם קיים אובייקט בשם אדם? האם קיים אובייקט.
Structure. מה לומדים היום ? דרך לבנות מבנה נתונים בסיסי – Structure מייצר " טיפוס " חדש מתאים כאשר רוצים לאגד כמה משתנים יחד דוגמאות : עובד : שם, טלפון,
המשך תכנות מונחה עצמים 1. היום בתרגול  הורשה  שיטות מיוחדות  פולימורפיזם 2.
פיתוח מערכות מידע Class diagrams Aggregation, Composition and Generalization.
1 מבוא למדעי המחשב הרצאה 21: Queue, Iterator & Iterable.
 Client, Supplier ומה שביניהם ( ADT!).  שאלה 1: יצירת ADT עבור מעגל במישור נניח שלקוח מעוניין בפעולות הבאות : הזזת מעגל וחישוב שטח מעגל. הספק יספק ללקוח.
קורס תכנות שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 12. ספריות.
Dynamic Allocation. Malloc - Reminder void* malloc(unsigned int nBytes); Used to dynamically allocate nBytes in memory Returns a pointer to the allocated.
Operator Overloading Moshe Fresko Bar-Ilan University Object Oriented Programing
מבנה נתונים ואלגוריתמים ) לשעבר - עיבוד מידע( ד"ר אבי רוזנפלד ד"ר אריאלה ריכרדסון.
1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.
1 נתבונן בפונקציה הבאה public static int min(int[] a,int n) { int min = a[0]; for (int i = 1; (i < n ) && (i < a.length) ; i++) if (min > a[i]) min = a[i];
 שאלות ממבחנים - C++.  בשאלה זאת עליכם לסייע בכתיבת תוכנית לניהול צי רכב של חברת השכרה.  סעיף א ' (10 נקודות )  סעיף א ' (10 נקודות ): עליכם לכתוב.
עקרונות תכנות מונחה עצמים תרגול 11: OOP in C++. Outline  Where do the objects live ?  Inheritance  Slicing  Overriding vs Shadowing.
האוניברסיטה העברית בירושלים
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
Object Oriented Programming
Tirgul 12 Trees 1.
Object Oriented Programming
תכנות מכוון עצמים ו- C++ יחידה 11 תבניות - templates
Object Oriented Programming
Object Oriented Programming
מבוא למדעי המחשב סיבוכיות.
הקצאות דינאמיות בשילוב מבנים
מבוא לתכנות מונחה עצמים Object Oriented Programming
מצביעים קרן כליף.
ממשקים - interfaces איך לאפשר "הורשה מרובה".
שאלה 1.
ניתוח מערכות מידע תכנות ב C#
תכנות מכוון עצמים ו- C++ יחידה 06 העמסת אופרטורים
מבוא כללי למדעי המחשב תרגול 6
מבוא לתכנות מונחה עצמים Object Oriented Programming
תוכנה 1 תרגול 13 – סיכום.
Engineering Programming A
פולימורפיזם מתקדם ממשקים בC# עריכה ועיצוב: קרן הרדי
Presentation transcript:

ממבחניםC שאלות ++

תכנות מונחה עצמים ו C++ (40 נקודות) בשאלה זאת עליכם לסייע בכתיבת תוכנית לניהול צי רכב של חברת השכרה. סעיף א' (10 נקודות): עליכם לכתוב 3 מחלקות (ממשקים ומימושים) עבור 3 סוגי מכוניות שהחברה משכירה: Sedan (מכונית פרטית), Truck (מסחרית), ו- AllTerrain (רכב שטח), כולן יורשות ממחלקת בסיס אבסטרקטית משותפת Car (שגם אותה יש לכתוב). דרישות: א. לכל מכונית יש מספר רישוי ייחודי ב. לכל מכונית ניתן לדעת אם היא פנויה או בהשכרה אצל לקוח, וניתן לשנות מצב זה מבחוץ. ג. ניתן להשוות מכוניות לפי מספר הרישוי ד. כל אובייקט מכונית יוכל להכין מעצמו עותק, באמצעות פונקצית מחלקה Clone, גם אם טיפוס האובייקט ידוע רק בזמן ריצה (כלומר – פולימורפיזם). הפונקציה תחזיר את כתובת המכונית החדשה.

class Car { int serNum; bool vacant; public: Car(int sn) : serNum(sn), vacant(true) {} virtual ~Car() {} bool operator==(const Car &car) const { return serNum == car.serNum; } void Rent() { vacant = false; } void Return() { vacant = true; } bool IsVacant() const {return vacant; } virtual Car* Clone() const = 0; }; פתרון סעיף א':

class Sedan: public Car{ public: Sedan(int num) : Car(num) {} virtual Car* Clone() const { return new Sedan(*this); } }; class Truck: public Car{ public: Truck(int num) : Car(num){} virtual Car* Clone() const { return new Truck(*this); } }; class AllTerrain: public Car{ public: AllTerrain(int num) : Car(num){} virtual Car* Clone() const { return new AllTerrain(*this); } };

סעיף ב' (10 נקודות): נתונה המחלקה Customer (לקוח) שהממשק שלה: class Customer{ string name; int id; const Car *pRentedCar; public: Customer(const string& n, int i); void RentCar(const Car& car); void ReturnCar(); }; עליכם לכתוב ממשק למחלקה Branch (סניף של החברה). אין צורך לממש את המחלקה Customer.

דרישות: 1.כל סניף יחזיק מערך של כלי הרכב שברשותו. המערך יכלול כלי רכב מכל 3 הסוגים. מספר כלי הרכב המקסימלי בסניף נתון ע"י קבוע. 2.לכל סניף יש שם ומספר סידורי. 3.כל סניף יוכל: 1)לבדוק אם כלי רכב נתון פנוי. אם כלי הרכב לא ברשימה, זה ייחשב כאילו הוא אינו פנוי. 2)לקבל כלי רכב חדש - הפונקציה המתאימה תיצור עותק של כלי הרכב 3)להוציא כלי רכב מהמלאי 4)להעביר כלי רכב לסניף אחר 5)לקבל כלי רכב מסניף אחר 6)להשכיר כלי רכב ללקוח 7)להחזיר כלי רכב מלקוח 8)ניתן לבנות סניף חדש בעזרת שם הסניף ומספרו 4.הנחיות נוספות: 1)עבור הדרישות הנ"ל, פרט לדרישה 1, אם כלי הרכב הנדון לא נמצא בסניף, יש להתריע על כישלון הפעולה. 2)אם לא ניתן להוסיף מכונית מפאת חוסר מקום, הפונקציה המתאימה צריכה להתריע על כישלון הפעולה. 3)עבור כל אחת מהדרישות, הפונקציה המתאימה צריכה להיות יחידה, כלומר, אמורה לטפל בכל שלושת טיפוסי כלי הרכב 4)כל הדרישות הנ"ל ימומשו ע"י פונקציות מחלקה.

class Branch { static const int MAX_CARS = 100; Car* cars[MAX_CARS]; string name; int number; public: // functionality Branch(string name,int number); // 8 ~Branch(); bool isCarVacant(const Car& car) const; // 1 void addCar(const Car& car); // 2 void removeCar(const Car& car); // 3 void transferTo(Branch& branch, const Car& car); // 4 void transferFrom(Branch& branch, const Car& car); // 5 void rentCar(Customer& customer, Car& car); // 6 void returnCar(Customer& customer, Car& car); // 7 }; class BranchException : public exception {}; פתרון סעיף ב':

סעיף ג' (20 נקודות): יש לממש את הפונקציות האחראיות לפעולות 2), 4), 5), 6), ו 8) הנחיות: 1)יתכן צורך להגדיר משתני עזר ו/או פונקציות עזר נוספות במחלקות השונות. אם מגדירים פונקצית עזר, אין צורך לממש אותה, אלא רק לכתוב אב-טיפוס ולהסביר מה היא עושה. 2)אין להגדיר פונקציות או משתני מחלקה שלא מתחייבים מהדרישות, או מהנחייה 1) 3)אין להשתמש במבנים מ STL (פרט, אולי, ל string)

class Branch { static const int MAX_CARS = 100; Car* cars[MAX_CARS]; string name; int number; int findCarIndex(const Car& car); bool contains(const Car& car); int findEmptySlot();... }; class CarAlreadyInBranch: public BranchException {}; class CarNotFound : public BranchException {}; class BranchFull : public BranchException {}; class CarNotRented : public BranchException {}; class CarAlreadyRented : public BranchException {}; פתרון סעיף ג': נוסיף למחלקה שתי פונקציות עזר, ואת הגדרת החריגות המדויקות שנזדקק להן במימוש.

int Branch::findCarIndex(const Car& car) { for(int i=0; i<MAX_CARS; i++) { if (cars[i] && *cars[i] == car){ return i; } throw CarNotFound(); } bool Branch::contains(const Car& car) { try { findCarIndex(car); return true; } catch (CarNotFound&) { return false; } int Branch::findEmptySlot() { for(int i=0; i<MAX_CARS; i++) { if (!cars[i]) { return i; } throw BranchFull(); } מימוש פונקציות העזר (לא נדרש בפתרון) לשימוש בחריגות יתרונות: פונקציות התלויות בפונקציות העזר לא יצטרכו לבדוק בצורה מפורשת את ערך ההחזרה אין צורך להשתמש בערכי מספרים מיוחדים למצבי השגיאה

Branch::Branch(string name, int number) : name(name), number(number) { for (int i=0; i<MAX_CARS; i++) { cars[i] = NULL; } 8) ניתן לבנות סניף חדש בעזרת שם הסניף ומספרו

void Branch::addCar(const Car& car) { if (contains(car)){ throw CarAlreadyInBranch(); } int index = findEmptySlot(); cars[index] = car.Clone(); return; } 2) לקבל כלי רכב חדש - הפונקציה המתאימה תיצור עותק של כלי הרכב

void Branch::transferTo(Branch& branch, const Car& car) { removeCar(car); branch.addCar(car); } 4) להעביר כלי רכב לסניף אחר 5) לקבל כלי רכב מסניף אחר void Branch::transferFrom(Branch& branch,const Car& car){ branch.transferTo(*this, car); }

void Branch::rentCar(Customer& customer, Car& car) { int index = findCarIndex(car); if (!isCarVacant(car)) { throw CarAlreadyRented(); } cars[index]->Rent(); customer.RentCar(car); } 6) להשכיר כלי רכב ללקוח

תכנות מונחה עצמים ו C++ (35 נקודות) מערכים בטוחים עליכם לממש מחלקות גנריות עבור "מערכים בטוחים". מערך בטוח הוא מערך המכיל מידע על אורכו, המאפשר הגנה מפני גלישה בשימוש. הגנריות מתבטאת בעובדה שהמימוש מאפשר ליצור מערכים שונים עבור סוגי עצמים שונים. למשל, הפקודה array vec(12) class arrayBase תיצור מערך של double בגודל 12. כדי למנוע שכפול קוד ע"י הקומפיילר (לכל instance של ה-template), יש לאסוף את החלקים המשותפים במחלקת בסיס class arrayBase ואח"כ לבצע הורשה: template class array: public arrayBase {...} יש לממש מחלקות כדי שהתוכנית למטה תתבצע כפי שנדרש. שימו לב: בראש הקוד הושמטו שמות המחלקות; עליכם להשלים את הקוד. מומלץ לקרוא את כל הקוד לפני פתרון השאלה. סעיף א (15 נקודות): הגדרת המחלקות הגדירו את המחלקות 1T, 2T, 3T, ו-T4 עם מתודות סבירות לשימוש קל ונוח במערכים (כולל קלט/פלט). שימו לב כי יש להגדיר את כל שדות הנתונים ולהצהיר על כל הפונקציות הנדרשות. אין צורך לממש שום פונקציה. הגדירו גם את המחלקה לטיפול בחריגות. סעיף ב (20 נקודות): מימוש (חלק מהפונקציות של) המחלקות ממשו את הפונקציות הבאות בכל מחלקה בה הן מופיעות: בנאים (constructors) - אין צורך לאפס ערכים לא מאותחלים, הורסים (destructors), אופרטור פלט (operator<<), ופעולת אינדקס (operator[]). טפלו נכון בשגיאות.

int main () { try { // משמעות + תוצאה T1 a1(12), a11(10); //בגודל 12 ו-10 double הגדרת 2 מערכים של T2 a2(10); // 10 בגודל int הגדרת מערך של a2 = a11; // Syntax error a1 = a11; // O.K. a1[5] = a2[4]; // O.K. cout << a1; // הדפסת מערך שלם const T1 ca1(a11); // הגדרת מערך קבוע עם אתחול ca1 = a11; // Syntax error ca1[2] = a11[3]; // Syntax error a11[3] = ca1[2]; // O.K. double c_array[] = {0.5, -7, 3.14, 0.3}; // "C הגדרת "מערך T1 a12(c_array, 4); // "C הגדרת מערך ואתחולו ע"י "מערך T3 a3; // בגודל 5double הגדרת מערך של T4 a4; // בגודל 8double הגדרת מערך של a3[1] = a4[2]; // O.K. a3 = a4; // Syntax error a4 = a3; // Syntax error a1 = a4; // O.K. return 0; } catch (Bad_Index exc) { cerr << exc; // Bad-Index value is... : פלט } typedef T1; typedef T2; typedef T3; typedef T4; more code?

typedef Array T1; typedef Array T2; typedef SizedArray T3; typedef SizedArray T4; class BadIndex { int index; public: BadIndex(int i):index(i){} friend ostream& operator<<(ostream& os, const BadIndex& b); }; ostream& operator<<(ostream& os, const BadIndex& b) { return os << “Array index “ << b.index << “ is out of bounds” << endl; } פתרון סעיפים א' ו-ב'

class ArrayBase { protected: int size; bool isLegal(int index) const { return index>=0 && index<size; } public: arrayBase(int sz): size(sz) { } int getSize() const { return size; } }; הגדרת המחלקה ArrayBase

template class Array: public ArrayBase { T* elements; void fillArray(T* data,int sz){ elements = new T[sz]; size = sz; for (int i=0;i<sz;i++) elements[i] = data[i]; } הגדרת המחלקה Array // to be continued (next slide)

public: Array(int sz):ArrayBase(sz), elements(new T[sz]) { } Array(const Array & array2) : ArrayBase(array2.size){ fillArray(array2.elements,size); } Array(T* array2, int sz):ArrayBase(sz) { fillArray(array2,size); } ~Array() { delete[] elements; } הגדרת המחלקה Array (המשך)

T& operator[](int i) { if (!isLegal(i)) throw BadIndex(i); return elements[i]; } const T& operator[](int i) const { if (!isLegal(i)) throw BadIndex(i); return elements[i]; } array& operator=(const array& other) { if (this == &other) return *this; delete[] elements; fillArray(other.elements,other.size()); return *this; } }; הגדרת המחלקה Array (סוף)

template ostream& operator & array) { for (int i=0;i< array.getSize();i++) out << array[i] << ' '; return out << endl; } template istream& operator>> (istream& in, Array & array) { for (int i=0;i<array.getSize();i++) in >> array[i]; return in; } פונקציות גלובליות רלוונטיות ל-Array

template class ArraySize: public Array { public: ArraySize():Array (SZ){}; }; הגדרת המחלקה array

חלק א' (15 נק') #include using namespace std; template class A { public: A() { cout << "A::A()" << endl;} A(const A& a) :i(a.i) { cout << "A::A(A&)" << endl;} private: T i; }; template class B { public: B(A aa): a(aa) { cout << "B::B(A)" << endl;} B(const B& b): a(b.a) { cout << "B::B(B&)" << endl;} A a; }; class C : public B { public: C(A aa): B (aa), a(aa) { cout << "C::C(A aa)" << endl;} ~C(){ cout << "C::~C()" << endl;} A a; }; רשמו את הפלט של התוכנית הבאה: void main() { cout << "--1--" << endl; A a; cout << "--2--" << endl; A a1; cout << "--3--" << endl; B b(a); cout << "--4--" << endl; B b1(b); cout << "--5--" << endl; C c(a); cout << "--6--" << endl; B & b2 = c; cout << "--7--" << endl; }

פתרון סעיף א': A::A() A::A(A&) B::B(A) A::A(A&) C::C(A aa) A::A() A::A(A&) B::B(A) A::A(A&) B::B(B&) C::~C() --6--

חלק ב' (15 נק') הגדר מחלקה/מחלקות הנדרשות בקובץ Array.h על מנת שקטע הקוד הבא יעבור הידור (קומפילציה). שים לב: רק הצהרת המחלקה/ות נדרשת - ללא מימוש הפונקציות. יש להניח שבמימוש המחלקה ישנם מצביעים.

חלק ב' (15 נק') #include "Array.h" #include "iostream.h" class A { public: A(int aa = 0) : a(aa) {} private: int a; }; int main () { Array *a1 = new Array (3); // An array with 3 elements of type int Array arr[20]; // An array of 20 Arrays, each one of them // is of 100 elements of type double Array sum(100); // An Array of 100 elements of type double Array min(100); // An Array of 100 elements of type double sum[0] = 10; sum[1] = 20; sum[2] = 30; for (int i = 0; i < 20; i ++) { cin >> arr[i]; sum += arr[i]; } cout << “Sum is:” << sum << endl; min = arr[0]; for (i = 1; i < 20; i ++) if (arr[i] < min) min = arr[i]; cout << “Min is: ” << min << endl; if (min == arr[0]) cout <<“The first Array is the minimum” <<endl; const Array c_arr = sum; for (int i = 0; i < c_arr.size() ; i ++){ cout <<“Element #” << i << “: “ << c_arr[i] <<endl; } delete a1; Array arr_A(7); Array arr_A2 = arr_A; return 0; }

פתרון חלק ב' #ifndef __ARRAY_H_ #define __ARRAY_H_ template class Array { public: Array(int size=100); const T& operator[](int i) const; T& operator[](int i); Array& operator+=(const Array& arr); int size() const; Array(const Array& src); Array& operator=(const Array& src); ~Array(); private: //... };

פתרון חלק ב' (המשך) // the next operators are global functions template ostream& operator & arr); template istream& operator>>(istream& inp, Array & arr); // the next operators may be implemented as member functions template bool operator & left, const Array & right); template bool operator==(const Array & left, const Array & right); #endif //__ARRAY_H_