Instructions
User Manual: Pdf
Open the PDF directly: View PDF
.
Page Count: 8
| Download | |
| Open PDF In Browser | View PDF |
שפת – C++תרגיל 3 Template class, exceptions, Move Semantics, STL and Multithreading יום חמישי 10.09.15עד שעה 23:55 תאריך הגשה: יום שישי 11.09.15עד שעה 12:55 הגשה מאוחרת )בהפחתת 10נקודות(: יום חמישי 10.09.15עד שעה 23:55 תאריך ההגשה של הבוחן: .1הנחיות חשובות: .1 .2 .3 .4 .5 .6 בכל התרגילים יש לעמוד בהנחיות הגשת התרגילים וסגנון כתיבת הקוד .שני המסמכים נמצאים באתר הקורס – הניקוד יכלול גם עמידה בדרישות אלו. בכל התרגילים עליכם לכתוב קוד ברור .בכל מקרה בו הקוד שלכם אינו ברור מספיק עליכם להוסיף הערות הסבר בגוף הקוד .יש להקפיד על תיעוד ) (documentationהקוד ובפרט תיעוד של כל פונקציה. במידה ואתם משתמשים בעיצוב מיוחד או משהו לא שגרתי ,עליכם להוסיף הערות בקוד המסבירות את העיצוב שלכם ומדוע בחרתם בו. חל איסור להגיש קובץ כלשהוא בלינק הרגיל בכל התרגילים במידה ויש לכם הארכה ואתם משתמשים בה, מי שיגיש קבצים בשני הלינקים מסתכן בהורדת ציון . )גם אם לינק ההגשה באיחור טרם נפתח( משמעותית. אין להגיש קבצים נוספים על אלו שתדרשו. Wallולוודא שהתוכנית מתקמפלת ללא אזהרות, Wextra pthread Wvla עליכם לקמפל עם הדגלים למשל ,בכדי ליצור תוכנית מקובץ מקור תכנית שמתקמפלת עם אזהרות תגרור הורדה בציון התרגיל. בשם ex1.cיש להריץ את הפקודה: g++ std=c++11 Wextra Wall pthread Wvla ex1.cpp o ex1 .7עליכם לוודא שהתרגילים שלכם תקינים ועומדים בכל דרישות הקימפול והריצה במחשבי בית הספר מבוססי חובה להריץ את התרגיל במחשבי בית הספר לפני מעבדי ) bit64מחשבי האקווריום ,לוי ,השרת .(river ” ) .ניתן לוודא שהמחשב עליו אתם עובדים הנו בתצורת bit64באמצעות הפקודה “uname a ההגשה ווידוא כי הארכיטקטורה היא ,64למשל אם כתוב (x86_64 .8לאחר ההגשה ,בדקו הפלט המתקבל בקובץ ה PDFשנוצר מה presubmission scriptבזמן ההגשה .באם ישנן שגיאות ,תקנו אותן על מנת שלא לאבד נקודות. )הציון יתחיל מ,50 שימו לב ! תרגיל שלא יעבור את ה presubmission scriptציונו ירד משמעותית ולא יהיה ניתן לערער על כך. ויוכל לרדת( .9בדיקת הקוד לפני ההגשה ,גם על ידי קריאתו וגם על ידי כתיבת בדיקות אוטומטיות ) (testsעבורו היא אחריותכם .חישבו על מקרי קצה לבדיקת הקוד. לאחר מועד הגשת התרגיל ירוצו הבדיקות האוטמטיות ותקבלו פירוט על הטסטים בהם .10הגשה מתוקנת נפלתם .לשם שיפור הציון יהיה ניתן להגיש שוב את התרגיל לאחר תיקוני קוד קלים ולקבל בחזרה חלק . פרטים מלאים יפורסמו בפורום ואתר הקורס מהנקודות .2הנחיות חשובות לכלל התרגילים בקורס C++ .1 .2 .3 .4 .5 .6 .7 הקפידו להשתמש בפונקציות ואובייקטים של ) C++למשל (new, delete, coutעל פני פונקציות של C )למשל .(malloc, free, printfבפרט השתמשו במחלקה ) stringב (std::stringולא . דC במחרוזת של )* (char יש להשתמש בספריות סטדנרטיות של C++ולא של Cאלא אם כן הדבר הכרחי )וגם אז עליכם להוסיף הערה המסבירה את הסיבות לכך(. הקפידו על עקרונות – Information Hidingלדוגמא ,הקפידו כי משתני המחלקות שלכם מוגדרים כמשתנים פרטיים ).(private הקפידו לא להעתיק by valueמשתנים כבדים ,אלא להעבירם )היכן שניתן( .by reference על שימוש במילה השמורה constבהגדרות הפונקציות והפרמטרים שהן מקבלות. הקפידו מאוד פונקציות שאינן משנות פרמטר מסויים – הוסיפו constלפני הגדרת הפרמטר. מתודות של מחלקה שאינן משנות את משתני המחלקה – הוסיפו constלהגדרת המתודה. שימו לב :הגדרת משתנים /מחלקות ב C++כקבועים הוא אחד העקרונות החשובים בשפה. הקפידו על השימוש ב ,staticבמקומות המתאימים )הן במשתנים והן במתודות( השתמשו ב valgrindכדי לבדוק שאין לכם דליפות הקפידו לשחרר את כל הזיכרון שאתם מקצים ) (. זיכרון .3מידע חשוב נוסף: .1ניתן להתחבר באמצעות SSHלמחשבי בית הספר )למשל לשם בדיקת הקוד לפני הגשה מהבית( http://wiki.cs.huji.ac.il/wiki/Connecting_from_outside .2עליכם להכיר את ספריית הקלטפלט של שפת Cובייחוד את השימוש בפונקציות printfוscanf http://www.cplusplus.com/reference/clibrary/cstdio .1הנחיות ספציפיות לתרגיל זה: .1 .2 .3 .4 .5 בתרגיל זה הינכם רשאים )ואף נדרשים( להשתמש ב ,STLלדוגמא vectorיכול לעזור. . ו delete בתרגיל זה חל איסור על שימוש ב new עליכם להתמודד עם כישלון הקצאות זיכרו באמצעות מנגנון ה .exceptionsהחריגות שאתם זורקים ,צריכות לרשת מ std::exceptionולהיות אינפורמטיביות. הוסיפו לתיעוד כל פונקציה איזו שגיאה היא זורקת ובאילו מצבים ,תעדו גם אם השגיאה עלולה להיזרק מפונקציה מובנית או מספרייה שאתם משתמשים בה. תרגיל זה הוא בעצם הרחבה ועדכון של תרגיל ,1ועל כן בכדי לחסוך בזמן פיתוח מומלץ להשתמש בקוד שימו לב שאתם לא גוררים טעויות מתרגיל 1לתרגיל שכתבתם לתרגיל 1ולהרחיב/לעדכן אותו .עם זאת, . זה : ד Matrix .4 (1רקע (aמחלקה גנרית של מטריצה ,כלומר איברי המטריצה הם מטיפוס גנרי .המחלקה תוכל גם לשמש כקונטיינר לכל טיפוס שהוא )בדומה ל std::vectorו std::listהגנריים המסוגלים להכיל איברים מכל טיפוס שהוא( המייצג מספרים עם פעולות חשבון מוגדרות מראש ,המחלקה תדע לבצע פעולות חישוב של מטריצות .עליכם לכתוב את הקובץ Matrix.hppשיכיל את ההצהרה והמימוש של המחלקה הגנרית .Matrix (bניתן ליצור מטריצה מכל טיפוס Tאשר יש לו מימוש לאופרטורים==,= ,* ,+= ,= , ,+ ,וכן מימוש של בנאי האפס )מקבל 0כארגומנט וייוצר את איבר האפס של המחלקה( .למשל int << ו או .doubleלכל טיפוס עשויה להיות דרך שונה לחישוב פעולות החשבון ,לייצוג כמחרוזת ,ואיבר אפס משלו. (2יישום הממשק Matrix (cבקובץ Matrix.hppעליכם להגדיר את המחלקה ,Matrixשתתאר מטריצה גנרית ,שאיבריה מטיפוס כל שהוא )כפי שהוגדר לעיל(. (dהמימושים לפונקציות המחלקה יהיו בקובץ .Matrix.hppויכללו את הפונקציות הבאות: ● בנאי ברירת מחדל )ללא ארגומנטים( המחזיר מטריצה ממימד 1x1המכילה את איבר ה.0 ● בנאי המקבל את מימדי המטריצה ● )Matrix(unsigned int rows, unsigned int cols ומאתחל מטריצה בגודל הנתון המכילה את איברי האפס. בנאי העתקה. ● בנאי העברה )(move constructor ● בנאי הממש את החתימה הבאה: )Matrix(unsigned int rows, unsigned int cols, const vector& cells ומאתחל מטריצה בגודל הנתון המכילה את איברי הוקטור הנתון .סדר האיברים בווקטור תואם את סדר המעבר על איברי המטריצה באמצעות האיטרטור )ראו להלן(. ● .destructor ● אופרטור השמה ) '='( לשם ביצוע פעולת השמת מטריצה .אופרטור זה מאפשר שינוי של המטריצה המיוצגת על ידי האובייקט שמשמאל לסימן ה׳=׳ ,כך שתהייה זהה למטריצה המיוצגת על ידי האובייקט המועבר כפרמטר )מימין לסימון ה׳=׳( .זכרו :פעולת ההשמה גורמת להיווצרות עותק זהה ובלתי תלוי. 1 ● אופרטור חיבור ) ' ('+לשם ביצוע פעולות חיבור מטריצות. ● אופרטור חיסור ) ''( לשם ביצוע פעולות חיסור מטריצות. 1 ● אופרטור כפל )'*'( לשם ביצוע פעולות כפל מטריצות . ● אופרטורי השוואה )'==' ו '!='( לשם ביצוע פעולת השוואת מטריצות. חשבו למה הורדנו בתרגיל זה את הדרישה לממש את האופרטורים '=*'.'-=','+=', ● פונקצית שחלוף בשם .transהפונקציה אינה משנה את האובייקט עליו היא הופעלה ,אלא מחזירה אובייקט חדש. ● פונקצית עקבה בשם traceהמחזירה ערך מטיפוס המטריצה. ● מימוש אופרטור '<<' לשם הדפסת המטריצה עם אובייקט ostreamבאופן הבא :כל שורת ערכים מודפסת בשורה נפרדת ,ו tabמפריד בין הערכים .ראו את הפלט לדוגמה של פתרון בית הספר והשוו בעזרת diffכדי לוודא שהמחרוזת אותה אתם מדפיסים היא נכונה. ● אופרטור)( המקבל כפרמטרים ) (unsigned int,unsigned intומחזיר את הערך בתא ] .[row,colיש לממש גרסאת constו nonconstלאופרטור זה )חישבו מה צריך להיות ערך ההחזרה בכל אחד מהמקרים(. ● איטרטורים :עליכם לממש את הפונקציות beginו endכך שהן יחזירו ערכים להיות ) constכלומר המתאימים לאיטרטור העובר על כל המטריצה .על איטרטור זה את ה conceptשל ההוא איננו מאפשר לשנות את איברי המטריצה( ועליו לממש ) BidirectionalIteratorחפשו באינטרנט את הממשק התואם לסטנדרט .(c++11 כלומר ,יש לממש את המתודות הבאות: ■ מתודה בשם )( beginהמחזירה איטרטור על כל תאי המטריצה לפי הסדר הרגיל ,המתחיל בתחילת המטריצה: )(0,0)->(0,1)->...->(0,col-1)->(1,0)->....->(row-1,col-1 ■ מתודה בשם )( endהמחזירה איטרטור המצביע לסוף המטריצה כמקובל בסטדנדט. ● פונקצית )( rowsופונקציית )( ,colsהמחזירות בהתאם את מספר השורות והעמודות במטריצה. ● בנוסף תוכלו להוסיף עוד פונקציות ציבוריות או פרטיות כרצונכם ,לפי מה שנראה לכם שימושי למחלקה. (eטיפים והנחיות: ● המימוש הפנימי של המטריצה ישפיע על מימוש הדרישות לעיל ,ובחירה נכונה יכולה לחסוך לכם מעט עבודה. ● כל הפונקציות המתאימות מבצעות את הפעולה המתמטית המקבילה להגדרתם. ● בכל מקרה בו לא ניתן לבצע את הפעולה עליכם לזרוק חריגה עם הסבר מתאים )למשל קריאה לפונקציית traceכשהמטריצה אינה ריבועית( ● באופרטור '=' מתבצע עדכון האובייקט השמאלי .חישבו היטב מה קורה מבחינת הזכרון כאשר המטריצה משנה את מימדיה עקב פעולה זו. ● הממשק המדויק )החתימות של הפונקציות( לא מוכתב לכם ונתון להחלטתכם ,אבל ברוב המקרים ישנה דרך עיקרית אחת שהיא הטובה ביותר להגדרת הפונקציה .חישבו למשל על: ○ הפונקציה להיות מוגדרת כ .const האם על ○ האם הארגומנט צריך להיות מועבר by referenceאו ,by valueאו אולי כדאי להשתמש במצביע .האם האגרומנט צריך להיות מוגדר כ ?const ○ האם ערך ההחזרה צריך להיות מוגדר כ ,constוהאם הוא מועבר by referenceאו .by value ○ חישבו איך האופרטור שאתם מממשים פועל על טיפוסים מובנים בשפה ונסו להתחקות אחרי זה במימוש שלכם עבור המטריצה. כמו כן ,עליכם לוודא שהממשק שלכם תואם את הדרייבר GenericMatrixDriverשמסופק לכם. . cpp (3מימוש טיפוס Complex (aמימשנו עבורכם את המחלקה Complexבקובץ Complex.cppלפי הממשק הנתון בקובץ .Complex.hזוהי מחלקת מספרים מורכביםאשר תוכלו לבדוק באמצעותה את המימוש שלכם למטריצה הגנרית. (bאין להגיש קבצים אלו. (4התמחות ).(specialization (aבנוסף למימוש הגנרי של המחלקה ,Matrixעליכם להוסיף לקובץ Matrix.hppגם מימוש ספציפי ,המחשבת את הצמוד 2של המטריצה )הכוונה למטריצה מימוש אלטרנטיבי לפונקציה trans אחד: צמודה הרמטית ולא קלאסית( ,עבור המקרה בו הטיפוס של האיברים הוא .Complex (5תיכנות מקבילי: (aבתרגיל זה עליכם לספק מימוש מקבילי לאופרטורים +ו *. (bרקע עיבוד מקבילי הוא עיבוד בו זמנית של מטלה מסוימת על ידי מספר מעבדים או מספר ליבות, כאשר היא מפוצלת בהתאם ,כדי להגיע לתוצאות מהר יותר משיטה של עיבוד טורי .הרעיון מבוסס על העובדה שניתן בדרך כלל לפצל את תהליך הפתרון של בעיה כלשהי למספר מטלות קטנות יותר, שאותן ניתן לבצע בוזמנית ,עם מידה מסוימת של תיאום. בתרגיל זה נתרגל מעט תיכנות מקבילי ונטעם על קצה המזלג את היתרונות והחסרונות שלו. (cעליכם להגדיר בקובץ Matrix.hppמתודה סטטית בשם setParallelהמקבלת ארגומנט מסוג .bool של פעולות הכפל/חיבור , במידה והארגומנט הוא ,trueלאחר הקריאה למתודה עם הערך true מטריצות יתבצעו באמצעות תכנות מקבילי .קריאה למתודה עם ארגומנט falseתחזיר את המחלקה להתנהגות הדיפולטיבית שלה ,בה יתבצעו פעולות כפל/חיבור באופן טורי )כרגיל(. (dבעקבות כל קריאה למתודה שמשנה את התנהגות המחלקה עליכם להדפיס את ההודעה הבאה: Generic Matrix mode changed to (parallel|nonparallel) mode. יחסית למצב הנוכחי. ההודעה תודפס רק אם היה שינוי בהתנהגות המחלקה 2 https://en.wikipedia.org/wiki/Conjugate_transpose (eעל מנת להקל עליכם ובכדי שהביצועים שלכם יהיו דומים ,אתם נדרשים לשמור על הכללים הבאים: ● המתודות אותן יש לממש גם במוד מקבילי ,הן אופרטורי הכפל )*( והחיבור ) (+בלבד. ● על מנת למנוע הסתבכויות מיותרות ,עליכם להשתמש באלגוריתם הנאיבי של כפל מטריצות 3 , Iterative Algorithmגם למימוש הטורי )רגיל( וגם למימוש המקבילי. ● בכל הפעולות הנ"ל על התכנות המקבילי להתבצע עבור כל שורה במטריצת התוצאה במקביל )כלומר ,שימוש ב threadנפרד לכל חישוב שורה במטריצת תוצאה(. (6השוואת עיבוד מקבילי וטורי: (aבחלק זה של התרגיל אנו נשווה את התנהגות של התכנות המקבילי אל התכנות הטורי ,וננסה לזהות חלק מהיתרונות והחסרונות שלהם. (bלשם כך מסופקים לכם: ● קובץ בשם ParllelChecker.cpp ● 2קבצי קלט המכילים נתונים באמצעותם תתבצע ההשוואה: ~slabcpp/www/sets/big.txt ~slabcpp/www/sets/small.txt ) big.txtקובץ גדול ואנו מציעים לקרוא אותו ישירות מהנתיב המסופק( (cאנו נשתמש ב ParllelCheckerעל מנת להשוות את זמן הריצה במצב העיבוד הטורי אל מול מצב העיבוד המקבילי ,עבור כל אחד מקבצי הקלט. (dאנו נעשה את ההשוואה הזו על 2קבצי הנתונים וננסה להבין האם יש הבדלים בניהם ומהם הגורמים לכך. : (eהוראות שימוש ● בצעו קומפילציה ו linkageעם הדגלים ':'O ++ std=c++11 Wextra Wall pthread Wvla g O –DNDEBUG ParllelChecker.cpp Complex.cpp o ParllelChecker הדגל Oאומר לקומפיילר לבצע אופטימיזציות על הקוד כך שירוץ מהר יותר. בדוגמא זו ביצענו את הקומפילציה וה linkageבשורה אחת ,הדבר אינו הכרחי )אך מפשט את החיים במקרה זה(. ● הריצו את התכנית שנוצרה על 2הקבצים של הנתונים וודאו שהיא פועלת בצורה תקינה וכי אתם מבינים כיצד להשתמש בה. (f סכמו את הערך המודפס עבור כל אחת מהפעולות בטבלה הבאה ,בקובץ ה.README small + * big + * מקבילי 3 https://en.wikipedia.org/wiki/Matrix_multiplication_algorithm#Iterative_algorithm טורי (gענו בקובץ ה READMEעל השאלות הבאות: (i האם יש הבדל בין 2הסטים של הנתונים? באיזה מצב התכנית רצה מהר יותר? ממה נובע הבדל זה? (iiהאם יש הבדל בין פעולות החיבור והחיסור ,אל מול הכפל? ממה נובע הבדל זה? דרייבר GenericMatrixDriver (7ה את המחלקה הגנרית באופן בסיסי (aלרשותכם דרייבר בשם GenericMatrixDriver.cppשבודק . שלכם .אתם מוזמנים להשתמש בו ולשנותו כרצונכם (bאתם מוזמנים לקמפל ולהריץ אותו ביחד עם הספריה שלכם. (cאין להגיש קובץ זה. .5חומר עזר: .1את פתרון הבית ספר ניתן למצוא ב: ~slabcpp/www/ex3/schoolSol.tar הריצו אותו כדי לראות איך התכנית צריכה להתנהג .2את קבצי התרגיל ניתן למצוא ב: ~slabcpp/www/ex3/ex3_files.tar בדקו את תכניתכם וודאו שהפלטים שלכם זהים לאלה של פתרון בית הספר .אתם יכולים לייצר קבצי קלט רבים נוספים כדי לבדוק מקרים נוספים ,ולהשוות את הפלט של התכנית שלכם עם פלטים של תלמידים אחרים ,או עם הפלט שנוצר כשאתם נותנים את הקלט הזה לקובץ הריצה של פתרון בית הספר. .3ביצוע overloadingב:++C http://www.cprogramming.com/tutorial/operator_overloading.html http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B http://www.cplusplus.com/reference/set/set/operators/ .6עבודה עם :valgring .1ישנו מבחר די גדול של תוכנות בשוק שמטרתם לסייע באיתור בעיות זיכרון בקוד לפני שחרורו אל הלקוח .אנו נשתמש בתוכנת ,valgrindשיחסית לתוכנה חינמית ,נותנת תוצאות מעולות. .2כדי להריץ את valgrindעליכם לבצע קומפילציה ו linkageלקוד שלכם עם הדגל ') 'gהן בשורת הקומפילציה והן בשורת ה .(linkageלאחר מכן הריצו :valgrind > valgrind leakcheck=full showpossiblylost=yes showreachable=yes –undefvalueerrors=yes GenericMatrixDriver .3אם קיבלתם הודעת שגיאה ,יתכן שתצטרכו לבצע שינוי הרשאות: > chmod 777 GenericMatrixDriver .4כמובן שאם valgrindדיווח על בעיות עם הקוד שלכם ,עליכם לתקן אותן. .5היעזרו ב tutorialהקצרצר של valgrindשבאתר הקורס. .7הגשה: .1עליכם להגיש קובץ tarבשם ex3.tarהמכיל את כל הקבצים הנמצאים בשימוש המחלקה שלכם ואת הקבצים הבאים: ● Matrix.hpp ● קובץ Makefileהתומך בפקודות הבאות: ○ make Matrixיצירת .Matrix.hpp.gch ○ make cleanניקוי כל הקבצים שנוצרו באמצעות פקודות ה.makefile ○ הרצת makeללא פרמטרים תהיה שקולה לפקודה '.'make Matrix ● READMEעם התשובות לשאלות של העיבוד המקבילי. ● במקרה שההגשה היא הגשה באיחור. רק extension.pdf אין להגיש את הקבצים הבאים: Complex.h, Complex.cpp, GenericMatrixDriver.cpp, ParllelChecker.cpp שימו לב! אל אף שאתם יכולים להוסיף קבצים נוספים כרצונכם ,המנעו מהוספת קבצים לא רלוונטים )גם אנו נוריד נקודות למי שיגיש קבצים שאין בהם בכדי להקל על הבודקים ,וגם בכדי שציונכם לא יפגע מכך(. . כל צורך .2ניתן ליצור קובץ tarכדרוש על ידי הפקודה: >tar cvf ~slabcpp/www/codingStyleCheck
Source Exif Data:File Type : PDF File Type Extension : pdf MIME Type : application/pdf PDF Version : 1.4 Linearized : Yes Page Count : 8EXIF Metadata provided by EXIF.tools