Document

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‬‬