2 - Technion
Download
Report
Transcript 2 - Technion
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