תכנות מונחה עצמים ב – C++ - המחלקה להנדסת חשמל ומחשבים

‫מעודכן לסימסטר א' תשע"ה‬
‫הפקולטה למדעי ההנדסה‬
‫המחלקה להנדסת חשמל ומחשבים‬
‫מעבדת מיקרו מחשבים מתקדמת )‪(36114693‬‬
‫ניסוי מס' ‪2‬‬
‫‪OOP‬‬
‫)מדריך מעבדה‪ :‬אלכס רייזנסון ‪([email protected]‬‬
‫‪ .1‬הקדמה‬
‫‪ C++‬הינה שפת תכנות המיישמת ‪.)Object Oriented Programming( OOP‬‬
‫הרעיון הכללי שהביאה תפיסת ‪ OOP‬הוא כתיבת ה‪( METHODS-‬פונקציות) תוך‬
‫הצמדתם ל‪( INSTANCES-‬פרטי מידע)‪ .‬בשפת ‪ C‬ההיסטורית (‪ )ANSI C‬אנו‬
‫בונים פונקציות‪ ,‬לאחר מכן‪ ,‬וללא קשר מגדירים נתונים‪ ,‬ועקרונית אין הגבלה אילו‬
‫פונקציות להפעיל על איזה נתון‪ .‬לעומת זאת ב‪ OOP-‬בכלל וב‪ C++-‬בפרט כל נתון‬
‫מוגדר לצורך משימות מסוימות‪ ,‬לכן אין טעם לאפשר הפעלת כל הפונקציה עליו‪,‬‬
‫אלא מוטב להגדיר את פונקציות בתוכנית פר נתון‪ .‬בגישה זו לכל נתון נבנה סדרה‬
‫של שירותים (‪ )METHODS‬עבורו‪ .‬לנתון ‪ +‬שירותים נקרא אובייקט (‪,)OBJECT‬‬
‫ומעתה ואילך נוכל להכליל את ה"ישות" הזו בכל תוכנית שנרצה לבנות בעתיד‪.‬‬
‫האובייקט מגדיר הן את פרטי המידע שלו‪,‬והן את השירותים שמטפלים בהם‪.‬‬
‫‪ .2‬מטרות הניסוי‬
‫‪ 1.1‬הכרת מחלקות ‪,‬עצמים וההיררכיה של מחלקות;‬
‫‪ 1.1‬הקצאה דינאמית של זיכרון;‬
‫‪ 1.1‬שימוש במקימים ומפרקים;‬
‫‪ 1.1‬הכרת תכונת כמוס (‪;)Encapsulation‬‬
‫‪ 1.1‬הכרת תכונת התורשה;‬
‫‪ 1.1‬הכרת תכונת ריבוי‪-‬הצורתיות;‬
‫‪ 1.1‬הכרת תכונת העמסת פונקציות;‬
‫‪ 1.1‬הכרת תכונת העמסת הפועלים;‬
‫‪ 1.1‬שימוש בפונקציות ידידות;‬
‫‪ 1.11‬לימוד והכרת סביבת העבודה וכלי הפיתוח שישמשו לתכנות;‬
‫‪ 1.11‬עבודה עם פונקציות ‪ MEX‬של ‪.MATLAB‬‬
‫‪ .3‬ספרות מומלצת‬
‫אתר של מעבדה מיקרו‪-‬מתקדמת ‪.http://www.ee.bgu.ac.il/~adcomplab‬‬
‫‪1‬‬
‫מעודכן לסימסטר א' תשע"ה‬
‫‪1. H. M. Deitel, and P. J. Deitel. C++ how to program, Upper Saddle‬‬
‫‪River, NJ,Prentice Hall (2001). BGU Library: QA 76.73.C153D45.‬‬
‫‪2. G. Voss. Object-Oriented Programming: An Introduction. McGraw-Hill‬‬
‫‪Osborne Media, (1991).‬‬
‫‪ .4‬הציוד הנדרש‬
‫‪ .1.1‬מחשב ‪.PC‬‬
‫‪ .1.1‬מערכת הפלה ‪ Windows‬או ‪.Linux‬‬
‫‪ .1.1‬כל סוג של ‪.toolchain C++‬‬
‫‪ .5‬שאלות הכנה‬
‫ענה בהרחבה על שאלות הכנה‪:‬‬
‫‪ .1.1‬הגדר את המושגים הבאים‪ :‬מחלקות ‪ ,Classes -‬תורשה – ‪ ,Inheritance‬ריבוי‬
‫צורתיות – ‪.Polymorphism‬‬
‫‪ .1.1‬מהי החשיבות שבהסתרת מידע ומהם האמצעים העוזרים לנו ליישם זאת? מהן‬
‫ההרשאות השונות האפשריות לחברים במחלקה?‬
‫‪ .1.1‬מה זה פעולת העמסה (‪ )overloading‬אופרטורים? תן הסבר מפורט עם‬
‫דוגמאות‪.‬‬
‫‪ .1.1‬לשתיים מתוך פונקציות החבר של המחלקה יש תפקיד מיוחד – למקים‬
‫‪ Constructor‬ולמפרק ‪ .Destructor‬מה תפקידן וכיצד מגדירים אותן?‬
‫‪ .1.1‬מהי הקצאת זיכרון דינאמית? מהם הכלים המאפשרים לנו הקצאה דינאמית‬
‫מהם היתרונות וחסרונות שבהקצאה הדינאמית? איפה במרחב זכרון מחשב‬
‫נשמרים נתונים מסוג זה?‬
‫‪ .6‬מהלך הניסוי‬
‫‪ ‬מאחר ולמרבית הסטודנטים זו ההתנסות הראשונה בכתיבת מונחה עצמים‪,‬‬
‫הניסוי מורכב מכתיבת מספר תכניות כאשר רמת הקושי עלה בהדרגה‪ .‬מומלץ‬
‫לכתוב את התכניות על‪-‬פי סדר הופעתן בדפי הניסוי‪.‬‬
‫‪ ‬לפני שניגשים לכתוב יש לשבת ולתכנן את היישום מרמת האלגוריתמים ועד‬
‫לממשק‪.‬‬
‫‪ ‬חשוב מאוד לרשום הערות רבות בגוף התוכנית ‪.‬עם זאת אין טעם להסביר‬
‫דברים מובנים מאליהם ‪.‬יש להסביר את מהות הקוד ולא" לתרגם "אותו ‪.‬‬
‫‪2‬‬
‫מעודכן לסימסטר א' תשע"ה‬
‫לדוגמא ‪ -‬אין צורך לרשום הערה מעין זו" ‪:‬זוהי לולאה שרצה בין ‪ 1‬ל‪,11-‬‬
‫במקום זאת יש לרשום מה הלולאה עושה ‪,‬כגון‪" :‬לולאה לסריקת כל האותיו"‪.‬‬
‫‪ ‬יש לתת שמות הגיוניים למשתנים ‪,‬פונקציות ואובייקטים ‪,‬כך שמתוך השם‬
‫יהיה ניתן להבין מהי מהות המשתנה או האובייקט‪.‬‬
‫‪ ‬נא להקפיד להימנע מלהשתמש במשתנים גלובליים ‪.‬משתנים כאלה מהווים‬
‫סיכון לקיום התוכנית‪ .‬רצוי להגיע למצב בו התוכנית תשתמש במשתנים‬
‫לוקליים בלבד ‪.‬משתנים אלה יועברו ממקום למקום מבלי שניתן יהיה לשנותם‬
‫מחוץ לעצמים ‪,‬פרוצדורות או פונקציות‪.‬‬
‫‪ .1.1‬תישם שלוש שיטות לאכסון נתונים‪:‬‬
‫‪ .1.1.1‬הכן מחלקה בשם ‪ ARRAY_OF_INT‬המחביאה טבלת שלמים בגודל‬
‫‪ .11‬הגדר שרות ‪ PRINT‬המדפיס את תוכן המערך ‪ARRAY_OF_INT‬‬
‫הגדר שרות בשם )‪ SET(i,j‬המעביר ערך ‪ i‬לכניסה ‪ j‬במערך‪ .‬הכן תכנית‬
‫ראשית בה מוגדר אובייקט מתאים ‪.‬הגדר תפריט המאפשר להוסיף נתון‬
‫למערך ‪,‬להציג את המערך ולצאת מהתכנית‪.‬‬
‫‪ .1.1.1‬צור עצם מסוג ‪ CVector‬המכיל מערך דינאמי של ‪( int‬מצביע המצביע‬
‫לכל גודל אפשרי של מערך)‪ .‬צור שרות ‪ SET‬ו‪ PRINT-‬בדומה לתרגיל‬
‫הקודם‪ .‬בשרות ‪ SET‬נדרשת הגדלה אוטומטית של המערך אם האינדקס‬
‫גדול מגודל המערך‪.‬‬
‫‪ .1.1.1‬צור עצם מסוג ‪ CVector‬המכיל מערך דינאמי של ‪ int‬דו‪-‬ממדי (מצביע‬
‫המצביע למערך של מצביעים)‪ .‬צור שרות ‪ SET‬ו‪ PRINT-‬בדומה‬
‫לתרגילים הקודם‪ .‬בשרות ‪ SET‬נדרשת הגדלה אוטומטית של מספר שלם‬
‫של שורות המערך אם האינדקס גדול מגודל המערך‪.‬‬
‫בונוס‪ :‬להעמיס אופרטורים ][ ו‪ <<-‬בנוסף לשרותים ‪ SET‬ו‪PRINT-‬‬
‫לצורת עבודה יותר נחה ואינטויטיבית‪ .‬לדוגמא‪:‬‬
‫;‪CVector myvector‬‬
‫;‪myvector[5] = 10‬‬
‫‪// prints content of vector‬‬
‫‪ .1.1‬נתון מעגל הבאה‪:‬‬
‫‪3‬‬
‫;‪cout << myvector‬‬
‫מעודכן לסימסטר א' תשע"ה‬
‫כאשר ‪ C = aaa nF ,R = 100 Omh‬ו‪( .L = bbb mH-‬ת‪.‬ז‪ .‬של בן זוג אחד הוא‬
‫‪ xxxxxaaa‬ות‪.‬ז‪ .‬של בן זוג שני הוא ‪.)yyyyybbb‬‬
‫כתוב תוכנה שתחשב ‪ VC , VR‬ו‪ , V L -‬כאשר ‪ . V  V0 cos wt‬אמפליטודה ותדר‬
‫של מקור מתח ‪ V‬ניתנים לקביעה ע''י משתמש וארכים התחלתיים הם ‪-‬‬
‫‪ . f  100Hz - V0  3V‬התוכנה תציג תוצאות בשני אופני תצוגה – ע''י מספר‬
‫מורכב וע''י אמפליתודה ופאזה – לפי בחירת המשתמש‪.‬‬
‫לצורך ביצוע עבודה יש להגדיר מחלקה ‪ Complex‬שתאפשר עבודה עם‬
‫מספרים מורכבים‪ .‬בנוסף לכך יש להגדיר שתי מחלקות ‪ PassiveElement‬ו‪-‬‬
‫‪ ,RCL‬כאשר בעזרת מחלקה ‪ PassiveElement‬ניתן ליצר עצמים ‪ C ,R‬ו‪L-‬‬
‫ומחלקה ‪ RCL‬מתארת תכונות של כל המעגל‪.‬‬
‫תרגיל מכיל שני חלקים‪:‬‬
‫‪ )1‬חלק ‪ ,MATLAB‬בו יש לממש מערכת לקליטת נתונם ואופן עבודה‬
‫בתחילת ההרצה ותצוגת נתונים שהתקבלו אחרי חישובים‪.‬‬
‫‪ )1‬חלק ‪ ,++C‬המקבל נתונים מ‪ MATLAB-‬מחשב נתונים לפי אופן עבודה‬
‫ומחזיר אותם ל‪ MATLAB -‬לצורך תצוגה‪.‬‬
‫למימוש חלק ‪ ++C‬כתוב שירותים הבאים‪:‬‬
‫• שירות ‪ Norm‬של מחלקה ‪ Complex‬שתאפשר חישוב אמפליטודה של מספר‬
‫מורכב;‬
‫• שירות ‪ Arg‬שתאפשר חישוב של פאזה;‬
‫• שרות ‪ Set‬שתאפשר קליטה של ארך חדש של ‪ C ,R‬או ‪;L‬‬
‫• שרות ‪ Calc‬שתאפשר ‪ VC , VR‬ו‪; V L -‬‬
‫‪4‬‬
‫מעודכן לסימסטר א' תשע"ה‬
‫• שרות ‪ Print‬שתאפשר הצגת התוצאות בשני אופני תצוגה – ע''י מספר מורכב‬
‫או ע''י אמפליטודה ופאזה;‬
‫• שירות ‪ FreqRes‬שתאפשר חישוב של תדר תהודה (‪)Frequency Resonant‬‬
‫למעגל‪.‬‬
‫• שירות ‪ Save‬שתאפשר הדפסת התוצאות תוך יצור שני קבצי ‪ .dat‬כאשר אחד‬
‫המכיל אוסף אמפליטודות ושני אוסף פאזות‪ .‬צרף סרטוטי ‪ Bode‬מ‪-‬‬
‫‪( MATLAB‬גם של אמפליטודה וגם של פאזה) לדו''ח מסכם כאשר תצוגה‬
‫של סקלה תדרים היא בסקלה לוגריתמית‪.‬‬
‫ממש תוכנה כפונקציה ‪ .MEX‬הוסיף הוראות הפעלה ובחירת אופן הפעלה כ‪-‬‬
‫‪ in-line help‬של פונקציה ‪.MATLAB‬‬
‫‪ .1.1‬תיצור מחלקה בסיסית ‪ CPerson‬המכילה שדות‪ :‬שם פרטי ‪ ,‬שם משפחה‪ ,‬ת‪.‬ז‪.‬‬
‫ותאריך לידה‪ .‬המחלקה צריכה להכיל שני שירותים ‪ Set -‬ו‪ Print-‬המאפשרים‬
‫להדקן שדות ולהדפיס אותם‪ .‬הדפסה צריכה להכיל שתי אפשרויות להדפיס‬
‫הכול או להדפיס רק שורה ספציפית‪ .‬על בסיס מחלקה זאת יש ליצור שתי‬
‫מחלקות נוספות ‪ CStudent‬ו‪ .CTeacher-‬תוסיף למחלקה ‪ CStudent‬מערך‬
‫מסוג ‪( CCourse‬מחלקה או ‪ )struct‬עם שדות – שם קורס וציון‪ .‬תוסיף‬
‫שירותים הבאים‪:‬‬
‫• הוספת הקורס;‬
‫• הוספת ציון הקורס;‬
‫• הדפסת רשימת הקורסים עם ציונים;‬
‫הערה‪ :‬יש לעבוד עם מערך דינאמי‪.‬‬
‫למחלקה ‪ CTeacher‬תוסיף שדה מסוג ‪ CRaiting‬עם שדות – ‪,easiness‬‬
‫‪ helpfulness‬ו‪ .clarity-‬תוסיף שירותים שמאפשרים להתקן ולהדפיס פרמטרים‬
‫הללו‪.‬‬
‫כתוב תוכנה שתייצר מערך מסוג ‪ CStudent‬המכיל שני סטודנטים ותמלא‬
‫פרטים הרלוונטיים‪ .‬תייצר מערך ‪ CTeacher‬המכיל שלושה מדריכים ותמלא‬
‫פרטיים הרלוונטיים‪ .‬תדפיס נתונים שייכים לסטודנטים‪ ,‬תדפיס נתונים שיכים‬
‫למדריכים‪.‬‬
‫‪ .1.1‬בשאלה זאת יש ליצור תוכנה שתאפשר קריאת תמונה‪ ,‬תצוגתה‪ ,‬הפעלת סט‬
‫מסננים על התמונה‪ ,‬שמירה והצגה של תמונה אחרי סינון‪ .‬לצורך מימוש של‬
‫‪5‬‬
‫מעודכן לסימסטר א' תשע"ה‬
‫שאלה יש להיעזר בתוכנת ‪ MATLAB‬שמאפשרת קריאה‪ ,‬שמירה ותציגה של‬
‫קבצי תמונות בצורה נוחה‪ .‬יחד עם זאת יש לממש פונקציה ‪,imagefilt‬‬
‫המיושמת כקובץ ‪ .MEX‬התוכנית צריכה לאפשר טעינת תמונה ממקום מוגדר‬
‫בדיסק קשיח (תיקיה שמכילה) ולשמור תמונה במקום מוגדר‪ .‬במסגרת עבודה‬
‫צריך לבצע‪:‬‬
‫‪ ‬קריאת תמונה בפורמט ‪ bmp‬בגוון שחור לבן בגודל ‪ 111x111‬בעזרת‬
‫‪;MATLAB‬‬
‫‪ ‬עיבוד תמונה בעזרת קונבולוציה עם אחד מהגרעינים שמוצגים למטה (יש‬
‫להעברם מ‪:)MATLAB-‬‬
‫‪.1.1.1‬‬
‫‪Averaging‬‬
‫‪.1.1.1‬‬
‫‪4-neighbour Laplacian‬‬
‫;‬
‫;‬
‫‪.1.1.1‬‬
‫‪Gaussian Smoothing‬‬
‫‪.1.1.1‬‬
‫‪Unsharp Filter‬‬
‫;‬
‫;‬
‫‪;median filter 3x3 .1.1.1‬‬
‫‪.1.1.1‬‬
‫‪Sobel filters for edge detection‬‬
‫;‬
‫‪ ‬שמירת לקובץ ‪;bmp‬‬
‫‪6‬‬
‫מעודכן לסימסטר א' תשע"ה‬
‫בתחילת עבודה יש להגדיר מחלקה ‪ ,Image‬המכילה שירותים הבאים‪:‬‬
‫‪;Constructor(int numRows, int numCols) .1‬‬
‫‪;void setImageInfo(int numRows, int numCols, int maxVal) .1‬‬
‫‪;void getImageInfo(int &numRows, int &numCols, int &maxVal) .1‬‬
‫‪;int getPixelVal(int row, int col) .1‬‬
‫‪;void setPixelVal(int row, int col, int value); .1‬‬
‫‪.1‬‬
‫‪void getSubImage(int upperLeftRow, int upperLeftCol,‬‬
‫;)‪int lowerRightRow, int lowerRightCol, Image& oldImage‬‬
‫ומשתנים‪:‬‬
‫‪// number of rows .1‬‬
‫;‪;int N‬‬
‫‪// number of columns .1‬‬
‫;‪;int M‬‬
‫;‪;int **pixelVal‬‬
‫‪//2D array .1‬‬
‫לצורך בדיקות יש להשתמש בתמונות ‪ Lena‬ו‪ Baboon-‬בפורמט ‪111x111‬‬
‫פיקסלים בגוון שחור לבן‪.‬‬
‫נא לשים לב להגשת העבודות בהתאם לדרישות המפורטות לעיל‪.‬‬
‫בדו"ח מסכם יש לענות על שאלות הכנה‪ .‬בנוסף יש להסביר מבנה ואופן הפעלה של‬
‫תוכנית ומחלקות שהוגדרו לצורך ביצוע משימה‪.‬‬
‫‪ .7‬הציון‬
‫להלן האופן בו יורכב הציון על ניסוי זה‪:‬‬
‫‪1%‬‬
‫שאלות הכנה‬
‫מהלך הניסוי‬
‫‪11%‬‬
‫נוחות משתמש‪ ,‬הגשת הדו'ח‬
‫‪11%‬‬
‫ביצוע שאלה ראשונה במלואה‬
‫‪11%‬‬
‫(לפי ההוראות הניסוי)‬
‫ביצוע שאלה שנייה במלואה‬
‫‪11%‬‬
‫(לפי ההוראות הניסוי)‬
‫ביצוע שאלה שלישית במלואה‬
‫‪11%‬‬
‫(לפי ההוראות הניסוי)‬
‫ביצוע שאלה רביעית במלואה‬
‫‪11%‬‬
‫(לפי ההוראות הניסוי)‬
‫והגנה על ניסוי‬
‫כתיבה נכונה ובהירה של הקוד‬
‫(הערות שמות משתנים‬
‫הגיוניים וכו'‪ .‬נוחות משתמש‪,‬‬
‫מקוריות ‪,‬עיצוב ויצירתיות‬
‫סה"כ‬
‫‪11%‬‬
‫‪111%‬‬
‫בהצלחה !!!‬
‫‪7‬‬