Microsoft PowerPoint - lec6.ppt

מסמכים קשורים
Microsoft PowerPoint - lec9.ppt

Microsoft PowerPoint - lec9.ppt

תכנות מונחה עצמים א' – תש"ע

מבוא למדעי המחשב

מבוא למדעי המחשב

Microsoft PowerPoint - lec10.ppt

Microsoft PowerPoint - rec3.ppt

PowerPoint Presentation

Slide 1

PowerPoint Presentation

Slide 1

PowerPoint Presentation

Microsoft PowerPoint - rec1.ppt

PowerPoint Presentation

מבוא למדעי המחשב

מהוא לתכנות ב- JAVA מעבדה 3

אוניברסיטת בן גוריון בנגב תאריך המבחן: שקולניק אלכסנדר שם המרצה: מר בשפת JAVA מבוא לתכנות מבחן ב: מס' הקורס : הנדסת תעשיה וניהול מ

אוניברסיטת בן גוריון בנגב תאריך המבחן: שם המרצה: מר אלכסנדר שקולניק, בשפת JAVA מבחן ב: מבוא לתכנות מס' הקורס : מיועד לתלמידי : הנד

מבוא לתכנות ב- JAVA תרגול 11

סדנת תכנות ב C/C++

תרגול 1

מבוא למדעי המחשב

מקביליות

Microsoft PowerPoint - lec2.ppt

שאלהIgal : מערכים דו מימדיים רקורסיה:

Slide 1

מקביליות

מבוא לתכנות ב- JAVA תרגול 7

פתרון מוצע לבחינת מה"ט ב_שפת c מועד ב אביב תשע"ט, אפריל 2019 מחברת: גב' זהבה לביא, מכללת אורט רחובות שאלה מספר 1 מוגדרת מחרוזת המורכבת מהספרות 0 עד 9.

הגשה תוך שבוע בשעת התרגול

תרגול 1

מספר מחברת: עמוד 1 מתוך 11 ת"ז: תשע"א מועד ב סמסטר א' תאריך: 00:11 שעה: 0 שעות הבחינה: משך כל חומר עזר אסור בשימוש בחינה בקורס: מבוא למדעי ה

Microsoft Word B

Slide 1

PowerPoint Presentation

מבוא למדעי המחשב

אוניברסיטת חיפה החוג למדעי המחשב מרצה: שולי וינטנר מתרגלים: נעמה טוויטו, מחמוד שריף מבוא למדעי המחשב סמסטר א' תשע"ב בחינת סיום, מועד א', הנחי

מקביליות

מבחן 7002 פרטים כלליים מועד הבחינה: בכל זמן מספר השאלון: 1 משך הבחינה: 3 שעות חומר עזר בשימוש: הכל )ספרים ומחברות( המלצות: קרא המלצות לפני הבחינה ובדי

שאלהIgal : מערכים דו מימדיים רקורסיה:

Slide 1

PowerPoint Presentation

אוניברסיטת חיפה החוג למדעי המחשב מבוא למדעי המחשב מועד א' סמסטר ב', תשע"ג, משך המבחן: שעתיים וחצי חומר עזר: אסור הנחיות: וודאו כי יש בידיכם

מבחן סוף סמסטר מועד א 15/02/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, דניאל גנקין הוראות: א. בטופס המבחן 7 עמודים ו 4 דפי נוסחאות. ב

Microsoft PowerPoint - Lecture1

יוםראשון, 02 ליולי 2014 סמסטר סוף מבחן )236703( עצמים מונחה תכנות - א' מועד 2014, אביב סמסטר קמחי יחיאל ד"ר מרצה: מסינג מיטל עבדאלקאדר, כרם גלעד, ערן

Microsoft PowerPoint - T-10.ppt [Compatibility Mode]

PowerPoint Presentation

מבחן סוף סמסטר מועד ב 28/10/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, גדי אלכסנדרוביץ הוראות: א. בטופס המבחן 6 עמודים (כולל דף זה) ו

Slide 1

Slide 1

Slide 1

אוניברסיטת חיפה החוג למדעי המחשב.5.6 מבוא למדעי המחשב סמסטר א' תשע"ז בחינה סופית מועד א', מרצה: שולי וינטנר מתרגלים: סמאח אידריס, ראמי עילבו

תוכנה 1 בשפת Java שיעור מספר 3: "חתיכת טיפוס"

Microsoft PowerPoint - rec8.ppt

PowerPoint Presentation

Microsoft Word - c_SimA_MoedB2005.doc

תרגול 1

אוניברסיטת חיפה החוג למדעי המחשב מרצה: שולי וינטנר מתרגלים: נעמה טוויטו, מחמוד שריף מבוא למדעי המחשב סמסטר א' תשע"ב בחינת סיום, מועד א', הנחי

תורת הקומפילציה

מתכונת עיצוב 3013

תרגול מס' 1

שעור 6

תרגול 1

עוצמת ההורשה מה הופך את ההורשה לכלי כל כך עוצמתי? מעבר לכך שהוא מקל בהגדרת מחלקות חדשות על סמך מחלקות קיימות, יש לנו אפשרות להתייחס לאובייקט מסויים בכ

Microsoft Word - דוגמאות ב

מבוא למדעי המחשב - חובלים

Tutorial 11

תרגול מס' 7 – חזרה על MST ואלגוריתם Dijkstra

Microsoft PowerPoint - 10_threads.ppt

מבוא למדעי המחשב - חובלים

תורת החישוביות תרגול הכנה לוגיקה ותורת הקבוצות מה יש כאן? בקורס תורת החישוביות נניח ידע בסיסי בתורת הקבוצות ובלוגיקה, והכרות עם מושגים בסיסיים כמו א"ב

Microsoft PowerPoint - YL-05.ppt

שאלהIgal : מערכים דו מימדיים רקורסיה:

Microsoft Word - Ass1Bgu2019b_java docx

Slide 1

מבוא למדעי המחשב

מבוא לאסמבלי

הגשה תוך שבוע בשעת התרגול

מבחן בפיתוח מערכות תוכנה בשפת Java ( )

תרגול מס' 4: המתרגם שימוש במחלקות קיימות מחרוזות, קבצים, וקבלת קלט מהמשתמש

מצגת של PowerPoint

1

Slide 1

שקופית 1

מבוא למדעי המחשב, סמסטר א', תשס"ח תרגול מס' 2

פתרון 2000 א. טבלת מעקב אחר ביצוע האלגוריתם הנתון עבור הערכים : פלט num = 37, sif = 7 r האם ספרת האחדות של sif שווה ל- num num 37 sif 7 שורה (1)-(2) (

פתרון וחקירת מערכות של משוואות לינאריות שאלות: 1( מצא אילו מהמערכות הבאות הן מערכות שקולות: 2x+ y= 4 x+ y= 3 x y = 0 2x+ y = 3 x+ 10y= 11 א. 2x 2y= 0

בס"ד תרגיל 3 מועד אחרון ל כללי בתרגיל זה עליכם לכתוב תוכנה שמדמה מאגר נתונים של חנות. את מוצרי החנות תייצגו באמצעות עצים ורשימות מקושרות יהיה עליכם לנ

תשע"דד אביב תוכנה 1 תרגיל מספר 4 עיבוד מחרוזות וקריאה מקבצים הנחיות כלליות: קראו בעיון את קובץ נהלי הגשת התרגילים אשר נמצא באתר הקורס..(

ייבוא וייצוא של קבצי אקסל וטקסט

מספר זהות: סמסטר ב' מועד א' תאריך: 11102/4// שעה: 9:22 משך הבחינה: 3 שעות חומר עזר: אין מותר השימוש במחשבון פשוט בחינה בקורס: מבני נתונים מרצה: הדר בי

איטרטורים: 1 תוכנה 1 סתיו תשע"ג תרגיל מספר 9 הנחיות כלליות: קראו בעיון את קובץ נהלי הגשת התרגילים אשר נמצא באתר הקורס. הגשת התרגיל תעשה במערכת ה moodl

ex1-bash

תמליל:

עיצוב על פי חוזה (Design by Contract) אוהד ברזילי אוניברסיטת תל אביב המצגת מכילה קטעים מתוך מצגת של פרופ' עמירם יהודאי ע"פ הספר: Object-Oriented Software Construction, 2nd edition, by Bertrand Meyer (Prentice Hall). כל הזכויות שמורות למחב רים

בנייה שיטתי ת של תוכנה מימוש מחלקות מצריך התייחסות לשיקולי יציבות ולנכונות איך מבצעים את המעבר בין ADT לבין מימוש המחלקה בשפת התכנות? איך מתמודדים עם שגיאות המתגלות בזמן ריצה? השיטה המוצגת כאן נקראת "עיצוב ע"פ חוזה" (DbC) 3 נכונות נכונות מוגדרת יחסית למפרט (specification) נתון P A Q בצורה מתמטית: התוכנית A רצה במצב מסוים, שבו מתקיים P, ומסתיימת במצב שבו מתקיים Q תוכנית כמתמיר מצבים תנאים חלשים: false A A true שני התנאים לעיל חלשים (טריויאלים) מכיוון שכל תוכנית A מקיימת אותם (רק השני מבטיח סיום) 4

P ו- Q כביטו יי ם בולאנים ניתן להכליל את P ו- Q בגוף התוכנית (כהערות) עליהם להיות ביטויים בולאנים שערכם TRUE גם אם אין תמיכה בשפת התכנות (או ע"י כלים חיצוניים) לשערוך P ו- Q יש להם חשיבות קונספטואלית גבוהה לנכונות התוכנה ויציבותה ניתן לספק עבור תנאים שמות לוגיים: Positive: m>0 Not_Void: p!=null 5 תנאי קדם ותנאי בתר precondition and postcondition עבור כל פונקציה נוכל להגדיר ביטויים בולאנים משני סוגים: תנאי קדם: ביטויים שעליהם להיות נכונים לפני ביצוע הפונקציה תנאי בתר: ביטויים שעליהם להיות נכונים בסיום ביצוע הפונקציה ביטוי $prev(exp) המתאר את ערכו של exp לפני תחילת ביצוע הפונקציה הביטוי $result המתאר את הערך המוחזר של הפונקציה 6

מחסנית ע"פ חוזה template<class T> class STACK1 public: /** Is stack empty? bool empty() const... // Same as count==0 /** Top element * @pre:!empty() T top() const... 7 מחסנית ע"פ חוזה /** Is stack full? bool full() const... /** Add x on top * @pre:!full() * @post:!empty() * @post: top() == x * @post: count == $prev(count) + 1 void push(t x)... 8

מחסנית ע"פ חוזה /** Remove top element * @pre:!empty() * @post:!full() * @post: count == $prev(count) - 1 void pop()... private: /** Number of stack elements int count; ; 9 החוזה תנאי הקדם מחייב את הלקוח (המחלקה הקוראת לפונקציה) תנאי הבתר מחייב את הספק (המחלקה המממשת את הפונקציה) הספק: "אם את מתחייבת לקרוא לי רק כאשר @pre מתקיים, אז אני מתחייב להביא את התוכנית למצב שבו בסוף ביצוע הפונקציה @post מתקיים" אם תנאי הקדם לא מתקיים הספק רשאי לעשות כרצונו 10

DbC in Eiffel בשפת :Eiffel תנאי הקדם מסומן במילה השמורה require תנאי הבתר במילה ensure ביטוי ה- $prev מסומן ע"י המילה השמורה old 11 דוגמא לקוח התחייבות קורא רק כשהמחסנית אינה מלאה רווח יודע שהפעולה בוצעה push ספק העצם החדש יוכנס לראש המחסנית פשטות במימוש 12

ניסוח החוזה הימנעי מבדיקות כפולות (תכנות מתגונן.(defensive programming גוף של פונקציה לעולם לא יבדוק את התנאי המקדים של הפונקציה אין לראות את החוזה כמנגנון לבדיקת תקינות הארגומנטים (אם כי הוא עשוי להכיל בדיקות כאלה) על החוזה אסור לשמש לשינוי מהלך התוכנית או לשינוי מצב התוכנית effect) (side השתמשי הפונקציות פשוטות אחריות ברורה 13 הפרת החוזה כאשר במ הלך ריצת התוכנית אחד הפרדיקטים הוא false אז: תנאי מקדים באג אצל הלקוח תנאי בתר באג אצל הספק 14

STACK2 template<class T> class STACK2 public: /** Allocate stack for maximum of n elements * @pre: positive_capacity: n >= 0 * @post: capacity_set: capacity == n * @post: array_allocated: representation.capacity >= n * @post: stack_empty: empty() STACK2(int n) : capacity(n), count(0), representation(capacity) 15 STACK2 /** The maximum number of stack elements const int capacity; /** Top element * @pre: not_empty:!empty() T top() const return representation[count-1]; 16

STACK2 /** Is stack empty? * @post: empty_definition: $result == (count == 0) bool empty() const return count == 0; /** Is stack full? * @post: full_definition: $result == (count == capacity) bool full() const return count == capacity; 17 STACK2 /** Add x on top * @pre: not_full:!full() * @post: not_empty:!empty() * @post: added_to_top: top() == x * @post: one_more_item: count == $prev(count)+1 * @post: in_top_array_entry:representation[count-1] == x void push(t x) representation.insert( representation.begin()+ count, x); count++; 18

STACK2 /** * @pre: not_empty:!empty() * @post: not_full:!full() * @post: one_fewer: count == $prev(count)-1 void pop() count--; private: /** The array used to hold elements vector<t> representation; /** Number of stack elements int count; ; 19 עוד ע ל ניסוח החוזה תנאי בתר החוזר על גוף הפונקציה אינו מיותר תנאי הקדם הוא חלק בלתי נפרד של ממשק המודול ובפרט צריך להיות חלק מהתיעוד לכותבי צד הלקוח ('המשתמשים') על תנאי הקדם להיות בלתי תלוי במימוש 20

מודו לים סובלני ים (tolerant) כאשר הספק בעצמו מ תמוד ד עם מקרי הקצה, הוא מחליש את תנאי הקדם, אבל יוצר בלבול בתחומ י האחריות וסיבוך בעיצוב המערכת מסננים (filters) חוצצים בין לקוחות לא זהירים ומודולים לא מוגנים בדוגמא הבאה STACK3 מגן על STACK2 מפני משתמשים לא זהירים השימוש בהאצלה (delegation) עשוי להיות מוחלף בירושה (inheritance) 21 STACK3 template<class T> class STACK3 public: /** Allocate stack for maximum of n elements, * if n>=0. Otherwise set error to * Negative_size. No precondition! 22 STACK3(int n): representation(null), error(noerror) if(n>=0) capacity = n; representation = new STACK2<T>(capacity); else error = Negative_size;

STACK3 /** * @post: error_code_if_impossible: * (n<0) == (error == Negative_size) * @post: no_error_if_possible: * (n>=0) == (error == NoError) * @post: capacity_set_if_no_error: * (error == NoError) => (capacity == n) * @post: allocated_if_no_error: * (error == NoError) => * representation!= NULL * @post: stack_empty_if_no_error: * (error == NoError) => empty() STACK3(int n); 23 STACK3 /** Top element if present, otherwise a new object with * the type s default value is allocated and returned, with * error set to Underflow. No precondition! * @post: error_code_if_impossible: * ($prev(empty())) == (error == Underflow) * @post: no_error_if_possible: * (!($prev(empty()))) == (error == NoError) T &top() const if (!empty()) assert(representation!=null); error = NoError; return representation->top(); else error=underflow; return new T(); 24

STACK3 /** Is stack empty? * @post: empty_definition: $result == (count() == 0) bool empty() const return (count() == 0) representation->empty(); /** Is stack full? * @post: full_definition: $result == (count == capacity) bool full() const return (count() == capacity) representation->full(); 25 STACK3 /** Add x on top if possible, otherwise set * error to Overflow. No precondition! void push(const T& x) if (full()) error = Overflow; else assert(representation!= NULL); representation->push(x); error = NoError; 26

STACK3 /** Add x on top if possible, otherwise set * @post: error_code_if_impossible: * ($prev(full()) == (error == Overflow) * @post: no_error_if_possible: *!($prev(full()) == (error == NoError) * @post: not_empty_if_no_error: * (error==noerror) =>!empty() * @post: added_to_top_if_no_error: * (error==0) => top() == x * @post: one_more_item_if_no_error: * (error==noerror) => * count() = $prev(count())+1 void push(const T& x); 27 STACK3 /** Remove top element if possible, * otherwise set error to Underflow * No precondition! void pop() if(empty()) error = Underflow; else asssert(representation!= NULL); representation->pop(); error = NoError; 28

STACK3 /** * @post: error_code_if_impossible: * $prev(empty() == (error == Underflow) * @post: no_error_if_possible: *!($prev(empty()) == (error == NoError) * @post: not_full_if_no_error: * (error==noerror) =>!full() * @post: one_fewer_if_no_error: * (error==noerror) => count() == $prev(count())-1 void pop(); enum ErrorCode NoError=0, Overflow, Underflow, Negative_size; ErrorCode error; 29 STACK3 private: int count() const return representation->count; /** unprotected stack used to hold elements STACK2<T> *representation; /** The maximum number of stack elements int capacity; 30

שמ ור ת המ חל קה השמורה של המחלקה class invariant מאפיין של מחלקה ביטוי בולאני שערכו TRUE 'בכל רגע נתון' על האינוריאנטה להשתמר ע"י כל הפעולות המיוצאות של המחלקה דוגמא: השמורה של STACK2 32

השמורה של STACK2 /** * @inv: count_non_negative: count >= 0 * @inv: count_bounded: capacity >= count * @inv: consistent_with_array_size: * capacity == representation.capacity() * @inv: empty_if_no_elements: * empty() == (count == 0) * @inv: item_at_top: * (count > 0) => * representation.at(count-1) == top() template<class T> class STACK2... 33 כלל ה שמורה.1.2 ביטוי I הוא שמורת מחלקה נכונה עבור מחלקה C אם מתקיימים שני התנאים הבאים: עבור כל הפעלה של בנאי של C עם ארגומנטים המקיימים את התנאי המקדים של פונקציית הבנאי, במצב שבו לכל השדות יש את ערכי ברירת המחדל שלהם, מתקבל בסופו של הבנאי מצב המקיים את I עבור כל הפעלה של מתודה מיוצאת של המחלקה עם ארגומנטים המקיימים את התנאי המקדים שלה במצב המקיים הן את I והן את תנאי הקדם של המתודה, מתקבל מצב המקיים את I 34

כלל ה שמורה לכל מחלקה יש בנאי, אם לא הוגדר כזה נקרא בנאי ברירת המחדל (הבנאי הריק חסר הארגומנטים) מצב של מחלקה מוגדר להיות אוסף ערכי כל השדות של המחלקה תנאי קדם עשוי להתייחס הן למצב של המחלקה והן לערכי הארגומנטים תנאי בתר עשוי להתייחס למצב המחלקה בסוף פעולת הפונקציה, למצב לפני פעולת הפונקציה (תוך שימוש ב ($prev וכן לערך המוחזר של הפונקציה (אם קיים, בעזרת ($result השמורה יכולה להתייחס רק למצב של המחלקה 35 כלל ה שמורה אף על פי שתנאי הקדם, הבתר והשמורה מכילים התייחסות לפונקציות, זו בעצם התייחסות עקיפה לשדות ניתן להתייחס אל השמורה כתנאי קדם ותנאי בתר של כל אח ת מהמתודות המיוצאות של המחלקה וכן כתנאי בתר של הבנאי השמורה מייצגת אחריות הן של הספק בלבד (כמו במקרה של תנאי בתר) 36

נכונות של מחלקה מחלקה C היא נכונה (לפי החוזה שלה) אם מתקיים: בעבור כל רוטינה מיוצאת R, ואוסף ארגומנטים חוקיים x מתקיים : R INV & pre ( x ) B INV & post R R R R 37 נכונות של מחלקה בעבור כל בנאי P, ואוסף ארגומנטים חוקיים מתקיים: כאשר: C הם ערכי ברירת המחדל של שדות Defaults C C היא השמורה של INV x P Defaults & pre ( x ) B INV & post C P P P P 38

תפק יד הבנאי לאחר שנק בעה השמורה של המחלקה, תפקידו של הבנאי להביא את המחלקה למצב שהיא מקיימת את השמורה שלה לדוגמא: השמורה והבנאי של המחלקה shifted_vector<t> - מחלקה המספקת מערך בעל תחום אינדקסים min עד max (אשר מקרה פרטי שלו זה 0 עד (capacity-1 39 shifted_vector<t> template <class T> class shifted_vector public: /** Allocate array with bounds * from `minindex' to `maxindex * (empty if `minindex' > `maxindex') * @inv: consistent_count: * count == upper - lower + 1 * @inv: non_negative_count: count >= 0 shifted_vector(int minindex, int maxindex)... 40

shifted_vector<t> /** * @pre: meaningful_bounds: maxindex>=minindex-1 * @post: exact_bounds_if_non_empty: * (maxindex>=minindex) => * ((lower==minindex) && (upper==maxindex)) * @post: conventions_if_empty: * (maxindex<minindex) => * ((lower==1) && (upper==0)) shifted_vector(int minindex, int maxindex)... 41 shifted_vector<t> /** Entry at index `i', if in interval * @pre: index_not_too_small: lower<=i * @pre: index_not_too_large: i<=upper T &operator[](int i)... 42

shifted_vector<t> /** Assign v to the entry at index `i', * if in interval * @pre: index_not_too_small: lower<=i * @pre: index_not_too_large: i<=upper * @post: element_replaced: item(i) == v void put(t& v, int i)... private: /** Minimum, maximum index; array size int lower, upper, count;... ; 43 השמורה וטיפ ו ס הנתונים המופש ט ראינו כי הגדרת טיפוס נתונים מופשט כוללת 4 חלקים: שם הטיפוס והפרמטרים הכלליים חתימת הפונקציות תנאים מקדימים לפונקציות אקסיומות נרצה לממש מחלקות לפי 4 החלקים המרכיבים את הטיפוס המופשט שאותו הן ממשות 44

סיווג הפע ולות על ADT תזכורת כאשר f היא פונקציה של טיפוס מופשט T מהצורה B..., f : A אזי f היא: x שאילתה (query,accesor) אם T מופיע רק בצד שמאל. ואז f תהיה שדה של המחלקה או מתודה שלה פקודה command) (transformer, אם f מופיעה משני צידי החץ. ואז f תהיה מתודת void (פרוצדורה) המשנה את המצב של המחלקה בנאי creator) (constructor, אם T מופיעה רק בצד ימין של החץ. ואז f תהיה בנאי של המחלקה 45 תנאים מקד ימ י ם ואקסיומ ות תנאי מקדים בטיפוס המופשט יופיע כתנאי מקדים של אחת המתודות של המחלקה אקסיומות המכילות פקודות (אולי בשילוב שאילתות) יופיעו כתנאי הבתר של הפרוצדורות המתאימות אקסיומות המכילות רק שאילתות יופיעו כתנאי בתר של המתודות המתאימות או (כאשר הן מכילות יותר משאילתה אחת ולפחות אחת מהן מומשה כשדה) כחלק מהשמורה אקסיומות המכילות בנאים יופיעו בתנאי הבתר של אותם בנאים 46

שמורו ת וטי פו סים מו פשטים נשווה בין האקסיומות של STACK ו המחלקה STACK2 לא כל אקסיומה ניתן לבטא ע"י שפת הטענות הבולאניות.(assertions) ניתן להשתמש בהערות מילוליות כמה מהטענות של החוזה אינן לקוחות מהאקסיומות כגון: 0=<count או count=<capacity שמורות מימוש מבטאות עקביות בין המימוש ובין הטיפוס המופשט 47 פונ קצ יי ת ההפשטה 48

פונ קצ יי ת ההפשטה פונקציית ההפשטה אינה חייבת להיות חד-חד ערכית. בדוגמא (STACK2) רואים שני עצמים במצב גשמי state) (concrete שונה הממופים לאותו מצב מופשט פונקציית ההפשטה אינה חייבת להיות מלאה. לא כל מצב גשמי של הייצוג מתאים למצב מופשט. לדוגמא: רק עצמים המקיימים את השמורה <= count; count <= capacity 0 ממופים למצב מופשט 49 נכונות המימו ש Abstract objects (instances of the ADT A) af ABST_1 ABST_2 a af a = a cf a CONC_1 cf CONC_2 תכנות מונחה עצמים בשפת + +C Concrete 50 objects (instances אוניברסיטת תל אביב of the class C)

שימוש ב assert #include<cassert> void assert(boolean_expression); משמשת לציין במפורש (שלא ע"י הערה) כי תנאי מסוים חייב להתקיים אחרת זוהי טעות מימוש לוגית לדוגמא בפונקציית push של :STACK3 assert(representation!= NULL); representation->push(x); error = NoError; השימוש ב assert מקובל אצל הלקוח שרוצה להצדיק את הלגיטימיות של הקריאה שהוא עומד לבצע 51 מספר שלם אי שלילי שערכו יורד בכל מחזור של הלולאה שמורת הלולא ה /** * @loop_variant: loop_variant * @loop_invariant: loop_invariant initialization_instructions while(as_long_as) ביטוי לוגי (assertion) שערכו תמיד נכון אולי ריק 52 loop_instructions

המחלק המשותף הגדול ביו תר /** Greatest common divisor of a and b * @pre: a>0 * @pre: b>0 * @post: returns the gcd of a and b int gcd(int a,b) int x, y;... see next slide 53 המחלק המשותף הגדול ביו תר /** * @loop_variant: max(x,y) * @loop_invariant: x>0 && y>0 * @loop_invariant: (x,y) have same gcd as (a,b) x=a; y=b; while(x!=y) if (x>y) x=x-y; else y=y-x; 54

הוספת טענות לק וד עוזרת לכתוב קוד נכון: תכנות ע"פ חוזה עוזרת לתיעוד: עדיפה על הערות מילוליות. שימוש בכלי עזר (כגון: javadoc ל short, java ל-,Eiffel ורבים אחרים ל ++C) כדי להוציא מהמחלקה את המידע הרלוונטי ללקוח (רק נתונים מיוצאים, רק ממשק ללא גופי פונקציות) עוזרת לבדיקת הקוד, ניפוי שגיאות ובקרת איכות מאפשרת לתוכנה סובלנות משתנה 55 doc++ ב STACK2 56

ניטור ב זמן ריצ ה מכיוון של ++C אין מנגנון מובנה לאכיפה של טענות (פרט ל assert של שפת C) אכיפת החוזה ושאר הטענות תלויה בכלים חיצוניים אחת הגישות היא להשתמש במחולל קוד, אשר קורא את כל הטענות המופיעות בקוד המקור (חוזים,,assert שמורות לולאה גם אם הן מופיעות כהערות) ומייצר עבורן קוד שיאכוף אותן בזמן ריצה כלי כזה עשוי להגדיר רמות אכיפה נדרשות (ב Eiffel יש 6 רמות) לכל מחלקה או מודול, ורק טענות המתאימות לרמת האכיפה יאכפו בזמן ריצה ב ++C הוספת השורה #define NDEBUG לפני שורת #include<cassert> תבטל את בדיקת ה assert בזמן ריצה 57 בטיחות מול יעילות ניטור ב זמן ריצ ה דיון debug vs. ) שלב הפיתוח מול שלב היצור (release חריגה מגבולות מער ך בשפת Eiffel בדיקת תנאי הקדם בלבד גורמת לתקורה של 50% בביצועים 58

שילוב טענות בקוד דיון ניטור לעומת אימות כח ביטוי לא כל טענה לוגית ניתן לבטא בשפת התכנות, לדוגמא: pop(push(x,s))=s פונקציות המופיעות בתוך טענות: האם הפונקציות אינן משנות את המצב של התוכנית (no side effect) האם הפונקציות עצמן נכונות מי מספר את הספר? שמורות ומצביעים מתי נבדוק שינוי בעצם מוצבע? 59 שמורו ת ומצב יעים /** Indirect invariant effect * @inv: forward==null * (forward->backward == this) class A B *forward; public: A() : forward(null) ; 60 /** Chain b1 to current instance void attach(b *b1) forward = b1; // Update b1's backward // reference for consistency if (b1!= NULL) b1->attach(this);

class B A *backward; שמורו ת ומצב יעים public: B() : backward(null) ; 61 /** Chain a1 to current instance void attach(a *a1) backward = a1; int main() A a1, a2; B b1; שמורו ת ומצב יעים a1.attach(&b1) b1.attach(null) // A s invariant // violation a2.attach(b1) // A s invariant // violation 62 תכנות מונחה עצמים בשפת + +C אוניברסיטת תל אביב