Software Engineering 094219, spring 2014 Introduction Practical session # 1 1 Administrative Stuff מטרת הקורס: לימוד כתיבת תכנה ,בניגוד לכתיבת תכנית -בעזרת מתודולוגיה "תכנות מונחה עצמים" ( )OOPושפת תכנות C++המיישמת מתודולוגיה זו. אתר הקורס (מכיל גם את הסילבוס): http://moodle.technion.ac.il/course/view.php?id=1204 מרצה: פרופ' אורן קורלנד מתרגלים: ויטאלי מירקיס (מתרגל אחראי) אירה קרייזלמן 2 שעות קבלה וחדרים מופיעים באתר הקורס Practical session #01 Administrative Stuff 3 5תרגילי בית. משקל שיעורי הבית 20%מהציון הסופי. עבור כל תרגילי הבית יפתח פורום באתר לצורך עדכונים. שעות קבלה מפורסמים באתר הקורס .מקרה הצורך ובתאום מראש אפשר לקבוע שעות קבלה במועדים אחרים. אין להפנות שאלות על תרגילי בית למתרגלים באי-מייל. כמו כן ,קיימים באתר חומרי עזר לעבודה עם סביבת Dev C++ שאלות והבהרות בנוגע לתרגיל בית – נא להפנות רק למתרגל האחראי על אותו תרגיל הבית. שאלות ובעיות אישיות (מילואים ,מחלה) – נא להפנות רק למתרגל האחראי. בהצלחה בקורס! Development environment - Dev C++ את סביבת העבודה יש להוריד מאתר: http://orwelldevcpp.blogspot.co.il/ כאשר יש לבחור את הקובץ: The setup which includes TDM-GCC x64 4.8.1 באתר ישנו קובץ הגדרות מומלצות. כמו כן באתר ישנן הוראות לעבודה נכונה עם הסביבה: 4 פתיחת פרויקט והוספת קבצים. ניפוי שגיאות קומפילציה. חיפוש שגיאות זמן ריצה . debugging - לפני תחילת עבודה על התרגיל בית יש לקרוא בתשומת לב את כל ההוראות ולעבוד לפיהם. ) Software (and not a program development process ניתוח דרישות – הבנת מטרות ותפקידי המערכת. תכן – הגדרת מבנה המערכת על כל חלקיה ומקרי הקצה האפשריים. קידוד -תרגום תוצאת השלב הקודם לשפת התוכנה .כולל תיקון שגיאות קומפילציה. ניפוי שגיאות זמן ריצה – . debuggingשגיאת זמן ריצה היא מצב של התנהגות שלא לפי הדרישות. בדיקות – בדיקת עמידה בדרישות על שלל מקרי הקצה! תחזוקה -שינוים ועדכונים כתוצאה משינוי דרישות לאורך השימוש .שלב זה לא מיושם כמובן בקורס אך קיים במציאות. כשלון בשלב מסוים יתבטא תמיד ולרוב בשלבים הבאים יגרור חזרה אחורה בתהליך .לכן השלבים המוקדמים 5חשובים ביותר! ניתוח דרישות Requirements תכן Design קידוד Coding תיקון שגיאות זמן ריצה Debugging בדיקות Testing תחזוקה Maintenance Compilation in C++ קומפיילר = מתרגם את השפה העילית לשפת קומפילציה כוללת שלושהC++ ב.מכונה :שלבים עיקריים Implementation Files (.cc,.cpp) Interface files (.h,.hpp) .# מתחילות בprecompiler הפקודות ל כל- ) .cpp( קומפילציה של קבצי קוד מקור.2 ) בהם הוא.h( עם קבצי הממשקcpp קובץ .o נוצר קובץ-.cpp מכל קובץ.משתמש .) object file ( precompiler Each implementation merged with its interface object שלב בו קבצי- ) linkage ( קישור.3 .מקושרים לקובץ הרצה יחיד compiler Object files (.o) precompiler - עיבוד קדם קומפילציה.1 linker Runfile (.exe) 6 Compilation errors שלבי הקומפילציה ושגיאות: •בשלב הראשוני ( קומפילציה – ראה שקף קודם ): לקמפל קובץ יחיד השגיאות הן בעיקר שגיאות סינטקס (תחביר). •בשלב הקישור השגיאות הן בעיקר נובעות מחוסר התאמה בין הכרזה והגדרה ( .) definition and declaration למשל ה linkerמחפש את הקוד של פונקציה שקראנו לה ולא מוצא. •בייחוד כשיש הרבה שגיאות קומפילציה מומלץ להפריד בין 2השלבים .סביבת העבודה מאפשרת לקמפל קובץ בנפרד ( כלומר ללא קישור) ורק לאחר מכן ניתן לעשות קומפילציה של הכל ביחד ( כולל קישור ). 7 לקמפל הכל מחדש .כלומר קבצי .oישנים נמחקים ונוצרים מחדש +קישור. לקמפל הכל .מה שכבר קומפל בעבר ולא השתנה -נשאר Example בד"כ הכרזת הפונקציה תהיה בקובץ נפרד עם סיומת ( .hשקף )6 8 Compilation errors - example •קראו את תיאור השגיאה ונסו להבין את הסיבה. •התחילו מהשגיאות הראשונות ושימו לב לשורות המסומנות. •זכרו שהקומפיילר אינו "מבין" את הקוד ,הוא בסה"כ מנסה לזהות את הביטוים החוקיים בשפה בתוך הקוד. •שימו לב !! טעות במקום אחד עלולה לגרום להרבה שגיאות קומפילציה ותיקון יחיד עשוי להספיק. •קומפיילר אינו אויב! להיפך ,הבנה ותשומת לב לסיבות לשגיאה מביאה להבנת השפה ומה שעומד מאחורי הסינטקס (התחביר). 9 Compilation errors – linker error example הכרזת הפונקציה הינה: ;) void Sort( int array[], int size ואילו הגדרת הפונקציה: ) ][void Sort( int array { //code... } אם נקרא לפונקציה לפי ההכרזה נקבל הודעה השגיאה: סיבת השגיאה :הקומפילר יחפש הגדרה לכל פונקציה שתקראו (כי הוא צריך לייצר קוד מכונה עבורה ) .זיהוי של פונקציה נעשה הן עפ"י השם והן עפ"י רשימת הפרמטרים .לכן מבחינתו מימשנו פונקציה אחרת. 11 Debugging = looking for runtime errors הצלחה בתהליך קומפילציה אינה מבטיחה כלל ,שהתוכנית תתנהג בהתאם לדרישות. סטיה מהדרישות בזמן ריצה נקראת BUG -ותהליך חיפוש השגיאות אלה ,נקרא: .debugging שגיאת זמן ריצה יכולה להתבטא בתוצאות ריצה שגויות או בנפילת התוכנית .נפילה בד"כ מעידה על טעות חמורה בשימוש בזיכרון ומחייבת התייחסות מתאימה. יש לשים לב :לעיתים התנהגות בזמן debuggingתהיה שונה מאשר בריצה רגילה, זאת משום ש debuggerעצמו משפיע על אופן הביצוע של התוכנית .במקרה כזה אין ברירה ,אלא להשתמש בשיטות אחרות (כגון סגירת חלק מהקוד החשוד בהערה או הדפסות ). 12 Debugging = looking for runtime errors בין אם השגיאה גרמה לנפילה ובין אם להתנהגות שונה מהמצופה ,נרצה: •לעצור את התוכנית באמצע :שמים נקודת עצירה= Breakpoint בשורה שמעניינת אותנו או שהחל ממנה נרצה להריץ את התוכנית בצורה מבוקרת. >1. #include <iostream 2. {)(3. int main 4. 5. ; int * x 6. •לבצע את הקוד שורה שורה: 7. ”!std::cout<<"Hello World נותן שליטה על ביצוע של כל פקודה 8. ;<<std::endl !Boom ואפשרות לראות התנהגות (למשל אם 9. התוכנית מתרסקת ניתן לראות בדיוק באיזו 10. ; )std::cout<<(*x שורה זה קורה). 11. 12. ; return 0 •לראות את ערכי המשתנים. } 13. What did we do ?wrong לפרטים איך עושים את הנ"ל ב - Dev C++יש לקרוא את המדריך באתר! 13 Testing 14 בדיקות הן חלק בלתי נפרד מניפוי שגיאות. בפרט נכונות התוכנית נבדקת ע"י עמידה בדרישות כולל כל מקרי הקצה. לכן מומלץ להשקיע בחיפוש וטיפול במקרי הקצה אפילו אם הם לא מוזכרים במפורש בדרישות (או בתרגיל בית .) בפרט בדיקת תרגילי הבית צריכה לכלול התאמה בין הפלט שהתוכנית שלכם נותנת לקלט מסוים לבין הפלט הנכון (שינתן לכם מראש). I/O Redirection on Windows אחרי שהתוכנית עברה קומפילציה ,נוצר קובץ הרצה .קובץ זה ניתן להריץ בלחיצת עכבר כפולה ,או דרך ( command lineשורת פקודה) .השקפים הבאים מתייחסים להרצה דרך . command line לכל תוכנית שרצה (ב Windowsבמקרה שלנו ,אבל גם במערכות הפעלה אחרות) –ישנם 3ערוצי תקשורת למערכת הפעלה: [ ]1קלט סטנדרטי [ ]2פלט סטנדרטי [ ]3שגיאה סטנדרטי. כברירת מחדל ]1[ ,מחובר למקלדת ו ]3[,]2[ -מחוברים אל הצג. [2] stdout [3] stderr 15 Program/ Command [1] stdin )>>Std. Output redirection (>, o הרצה רגילה: D:\my_directory>main.exe !Hello World oהרצה עם הכוונת פלט .הסימן < יגרום למערכת ההפעלה לשנות את ערוץ הפלט הסטנדרטי ולהפנות אותו לקובץ ,להרצה נוכחית .דוגמא: D:\my_directory>main.exe <output_file נדפיס את תוכן D:\my_directory> more output_file הקובץ שיצרנו !Hello World o o o 16 אם הקובץ output_fileלא קיים ,ייוצר קובץ חדש. אם קובץ זה קיים ,תכולתו תידרס (כל תוכנו ימחק). משמעות התווים << זהה ל < -פרט לכך שקובץ הפלט לא יידרס (התוצאה תתווסף לסופו) .דוגמא (בהמשך לדומא קודמת): D:\my_directory>main.exe <<output_file D:\my_directory> more output_file !Hello World !Hello World Std Error redirection (2>,2>>) : כדי שתכיל כתיבה גם לערוץ השגיאות,•כעת נשנה את התוכנית std::cout<<"Hello World!" <<std::endl; std::cerr<<"This is an error" << std::endl; : תיתן כעת פלט למסך,•הפקודה מהשקף הקודם D:\my_directory>main.exe <output_file This is an error : למשל,) (בלי רווח2 < עלינו להשתמש ב,•כדי להפנות את ערוץ השגיאות לקובץ D:\my_directory>main.exe 2<error_file Hello World! D:\my_directory> more error_file This is error .) (בלי רווח2 << :•ניתן להוסיף לסוף קובץ השגיאה ע"י הסימן : למשל,•ניתן להפריד את שני הערוצים לשני קבצים שונים D:\my_directory>main.exe 2<error_file < output_file D:\my_directory> more output_file Hello World! D:\my_directory> more error_file This is an error 17 ) > ( Std. Input redirection הסימן > יגרום למערכת ההפעלה לשנות את ערוץ הקלט ממקלדת לקובץ .כלומר, מקור הקלט יהפוך להיות קובץ .דוגמא ,התוכנית מכילה את השורות הבאות: ;)int iNum(0 ;std::cin >> iNum ;std::cout << "The number is: " << iNum << std::endl לדוגמא :ניצור קובץ טקסט (למשל ב ) Notepadשיכיל את הספרה ,5נקרא לקובץ .input D:\my_directory>main.exe < input The number is: 5 – Multiple redirectionניתן להפנות מספר ערוצים באותה פקודה .דוגמא: D:\my_directory>main.exe < input > output • • • 18
© Copyright 2024