לפתח פונקציה שפותרת משוואה ריבועית. פונקציה הנדרשת אמורה לקבל 5 פרמטרים:
3 הראשונים הם מקדמים של משוואה: a, b, c
2 פרמטרים האחרונים הם המצביעים שמצביעים על משתנים. פונקציה מקבלת אותם על-מנת תוך כדי החישובים לשים לתוכם ערכי השורשים של משוואה.
פונקציה מחזירה מספר שורשים של משוואה ( 0, 1 או 2 )
אב טיפוס של פונקציה הוא:
int Equat2( double a, double b, double c,
double *px1, double *px2 );
לפתח פונקציה שעושה את אותה עבודה רק את המשתנים עבור ערכי השורשים היא מקבלת כייחוסים (reference ) במילים אחרות, אב- טיפוס של פונקציה הוא:
int Equat2( double a, double b, double c,
double &rx1, double &rx2 );
חשוב ! לתת את אותו שם לשתי הפונקציות ולשים אותן במסגרת של תכנית אחת כדי לוודא שעמסת פונקציות פועלת כסדרה. לוודא גם ששתי הפונקציות מגיעות לאותן תוצאות.
במחלקת Date לפתח פונקציה הברה (member function) בשם Prev שמשנה את התאריך שנמצא בשדות של this ביום אחד אחורה ( הפוכה לפונקציה Next ).
להוסיף למחלקת Date ( דפים 20-21 ) ארבעה בנאיים שאותם למדתם בהרצאה.
לוודא שמחלקה פועלת ואחרי זה להחליף בנאי ברירת מחדל:
Date::Date( void ): day(1), month(1), year(1900) { }
בגרסה חדשה: במקום לאתחל שדות ע"י תאריך 01/01/1900 מאתחלת אותם כתאריך נוכחי של המחשב
לתשומת לב ! כדי להתניען בקובץ time.h
מועד ההגשה: שבוע מס' 5
לפתח מחלקת Point שמאפיינת נקודה על השטח עם שתי קוורדינטות מסוג double. במחלקה זו יש לפתח שלושה בנאיים, פונקציות גישה. בנוסף לזה יש לפתח
פונקצית קלט שקולטת שתי קוורדינטות ע"י דיאלוג ברור
פונקצית פלט שמייצגת אובייקט מסוג Point כשתי קוורדינטות בתוך סוגריים עם נקודה-פסיק בינהן
פונקציה שמחשבת מרחק בין נקודה של this לנקודה שבאה לפונקציה בתור פרמטר
לפתח אפליקציה שקולטת שלוש נקודות כלשהן, מציגה אותן על המסך ומחפשת מהו זוג הנקודות הקרובות ביותר.
במחלקת SString לפתח פונקציה (member) שסופרת מספר "מילים" במחרוזת. נגדיר ש-"מילה" זוהי חלק המחרוזתבין 2 סימני
הפרדה (למשל רווחים ). נגדיר גם שאב-טיפוס של פונקציה הנדרשת הוא:
int SString::NumOfWords( void );
נא לפתח את הפונקציה ע"י פונקציה סטנדרטית strtok שהוכרזה ב-<string.h>
במחלקת SString לפתח פונקציה (member) שמחזירה את ה"מילה" הנדרשת ממחרוזת. אב-טיפוס של פונקציה להגדיר כך:
SString SString::Word( int k );
פונקציה Word מקבלת פרמטר שמציין מספר ה"מילה" הנדרשת ( 0, 1, 2, ..... ) במחזירה אותה כאובייקט מסוג SString.
במקרה שאין מספר מילה כזה במחרוזת ההחזר מכיל מחרוזת ריקה.
נא לפתח ע"י פונקציה סטנדרטית strtok.
מועד ההגשה: שבוע מס' 7
במחלקת SString לפתח אופרטורים הבאים:
אופרטור "+" ( שלוש גרסאות: SString + SString, SString + char*, char* + SString )
אופרטור "=+" ( שתי גרסאות: SString += char*, SString += SString )
אופרטור השמה ( שתי גרסאות: SString = char*, SString = SString )
אופרטור פלת >>
אופרטורים השוואה ( ==, =!, <, >, =<, => )
אופרטור [] שמבאי תו מן המחרוזת שמספרו צויין קאינדקס
תכנה שבודקת מחלקת SString שניתנה בשקפים לשנות לעבודה עם אופרטורים בלבד
מועד ההגשה: שבוע מס' 8
במחלקת Date לפתח אופרטורים ופונקציה הבאים:
לצרכים אלו להוסיף למחלקת Date הגדרות הבאות:
תאריך ג'וליאני זהו פורמת של תאריך שהוגדר כמספר ימים שעברו מתאריך בסיסי.
לדוגמה: אם תאריך בסיסי הוא 01/01/1970 אז תאריך ג'וליאני של יום 01/01/1971 הוא 365, של יום 03/01/1971 – 367 וכן
הלאה.
typedef long JDate; // אליאס להבנה יותר טובה
class Date
{
private:
JDate DateToJulian( void ) const;
void JulianToDate( JDate );
. . .
};
const int BaseYear = 1970; // base date 01/01/1970
int IsLeapYear( int y ); // is year no. y leap ?
int DaysInYear( int y ); // number of days in year no. y
int DaysInMonth( int m, int y );// number of days in month no. m in year no. y
תוספות למחלקת Date שנותנת להתקדם עם עמסת אופרטורים ניתן להוריד כאן
מועד ההגשה: שבוע מס' 9
לפתח מחלקת Rect שמייצגת מלבן ע"י שתי נקודות
class Rect
{
private:
Point rl;
Point rb;
. . .
};
יש להשתמש במחלקת Point מתרגיל 4 עם תוספות הבאות:
בכל מהבנאיים של Point להוסיף פלט שנותן את סוג הבנאי
לפתח מפרק עם פלט בתוכו
במחלקת Rect יש לפתח :
בנאי ברירת מחדל, שני בנאיים מאתחלים, בנאי מעתיק. בכל הבנאיים לבצע פלט
מפרק עם פלט בתוכו
פונקציה חברה שמקבלת פרמטר מסוג Point ובודקת האם נקודה נמצת בתוך המלבן של this
מחלקות Point ו-Rect מאפשרות לבדוק סדר עבודה בנאיים ומפרקים במקרה של הרכב. לצורך הבדיקה יש להוריד קובץ עם פונקציה ראשית (main) ולארגן פרוייקט.
להפעיל אותו ולוודא שבנאיים ומפרקים במחלקות Point ו-Rect עובדים כצפוי
מועד ההגשה: שבוע מס' 10
נתנו שתי מחלקות שמאפיינות צורות גיאומטריות:
class Circle // עגול
{
protected:
float x0, y0; // קואורדינטות מרכז העגיל
float r; // רדיוס העגול
public:
Circle( float X = 0, float Y = 0, float R = 1 ):
x0( X ), y0( Y ), r( R ) {} // בנאי
float Area( void ) const { return 3.14 * r * r; } // שטח העגול
void Read( void ) // קלט העגול
{
cout << “x0=”; cin >> x0;
cout << “y0=”; cin >> y0;
cout << "r="; cin >> r;
}
void Write( void ) const // פלט העגול
{
сout << "Circle:" << endl;
cout << “x0=” << x0 << endl;
cout << “y0=” << y0 << endl;
cout << "r=" << r << endl;
}
};
class Rectangle // מלבן
{
protected:
float x0, y0; // קואורדינטות של פינה שמלית עליונה
float width; // רוחב המלבן
float height; // גובה המלבן
public:
Rectangle( float X = 0, float Y = 0, float W = 0, float H = 0 ):
x0( X ), y0( Y ), width( W ), height( H ) {} // בנאי
float Area( void ) const { return width * height; } // שטח המלבן
};
להפוך שתי מחלקות הבודדות האלה למערכת מחלקות פולימורפית שבה הוגדרה מחלקה בסיסית אבסטרקטית משותפת לפי תרשים להלן:
במערכת זו יש
מועד ההגשה: שבוע מס' 11
ביישום שפותח בתרגיל מס' 9 לשנות מכולה פולימורפית: במקום מערך להשתמש במכולה של STL. יש לעבוד עם vector.
כדי למצוא צורה גאומטרות עם שטח מקסימשלי למיין את vector ע"י אלגוריתם sort שנמצא ב- <agorithm>
לשייך מחלקות Shape , Rectangle, Circle למרחב שמות BTech
מועד ההגשה: שבוע אחרון
ניתנו שני קבצי ASCII: stud.txt שמכיל נתונים אישיים של סטודנטים ו-teach.txt עם נתונים של מרצים.
מבנה של קובץ stud.txt
קובץ בנוי כך שנתונים של כל סטודנט נמצאים בשלוש שורות: בשורה ראשונה – שם פרטי ושם משפחה, בשורה שנייה – קוד של כיתה בפורמט YYCC, איפה YY- שנת לימוד ו-CC – מספר הכיתה, ובשורה שלישית – תאריך לידה של סטודנט בפורמט DD/MM/YYYY.
אחרי כל שלוש שורות ישנה שורה ריקה (שורת הפרדה).
דוגמה של קוד הכיתה: ערך 0201 מאפיין את כיתה מספר 1 של שנה ב'
מבנה של קובץ teach.txt
קובץ בנוי כך שנתונים של כל מרצה נמצאים בשלוש שורות: בשורה ראשונה - – שם פרטי ושם משפחה, בשורה שנייה שם המקצוע ובשורה שלישית - תאריך לידה של מרצה בפורמט DD/MM/YYYY.
אחרי כל שלוש שורות ישנן שתי שורות ריקות (שורות הפרדה).
יש לפתח תוכנית שמבצעת שלבים הבאים:
הקמת מכולה פולימורפית ריקה בשם PersonList מסוג כלשהו (למשל: מערך דינמי, רשימה מקושרת, תור ) וקריאת תוכן של קבצי stud.txt ו-teach.txt לתוך עצמים והכנסת את העצמים ל-PersonLst. כתוצאה מתהליך זה במכולה PersonLst מתקבלת רשימה של כל המרצים והסטודנטים ביחד
קליטת תאריך כלשהו מן המקלדת ואיתור במכולה PersonList את כל הסטודנטים ומרצים שיום הולדתם נופל על התאריך שהוקלד. יש להכניס את הנתונים של מרצים וסטודנטים שאותרו שנולדו בתאריך שהוקלד לרשימה מקושרת חדשה בשם BirthDayLst.
הצגת דוח נתונים שהוכנסו לרשימה BirthDayLst. בדוח יש להציג את התאריך שהוקלד ואת כל הפרטים האישיים של כל המרצים וסטודנטים. בנוסף לזה להציג עבור כל מרצה וסטודנט מ-BirthDayLst גיל נכון לים הפקת דוח. אותו דוח יש לשלוח לקובץ פלט.
המטרה של התרגיל להוכיח שליטתו של סטודנט בטכנולוגיה מונחה עצמים. לכן לצורך העניין יש לשים דגש על פיתוח בתוך מחלקות.
ניתוח ופיתוח המחלקות כדי להתחיל לפני פיתוח של יישום עצמו.
תכנות מונחה עצמים דורשת ממנתחי ומפתחי המחלקות לא להתאים את המחלקות לצורך יישום הנוכחי בלבד אך להתייחס למחלקות ככלי פיתוח רב שימושים ולנסות להשלים כל מחלקה כך שתאפיין כמה שיותר טוב את המוסגים ועצמים מעולם המציאותי.
יש להגדיר PersonLst כמכולה מטיפוס <vector<T ששייך ל-STL.
יש להגדיר BirthDayLst כמכולה מטיפוס <list<T ששייך ל-STL.
בעבודה עם תאריכים ניתן ורצוי להשתמש במחלקת Date שפותחה בתרגילים הקודמים.
להגדרת שדות ומשתנים שמכילים מחרוזות ניתן ורצוי להשתמש במחלקת SString פותחה בתרגילים הקודמים או במחלקת string של STL.
ניתן לפתח את התרגיל בזוגות.
יש להוריד קבצי הקלט ( נתונים של סטודנטים ומרצים ) לצורך התרגיל.
יש לבצע קלט ופלט אך ורק באמצעות מחלקות של I/O streams שנמצאות ב-STL.
תוצאות הגשת התרגילים נכונות ל- 16/11/2003
-->