מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן אביאור וסאהר אסמיר עבור הקורס "מבוא למדעי המחשב"

Slides:



Advertisements
Similar presentations
Completeness and Expressiveness. תזכורת למערכת ההוכחה של לוגיקה מסדר ראשון : אקסיומות 1. ) ) (( 2. )) ) (( )) ( ) ((( 3. ))) F( F( ( 4. ) v) ( ) v ((
Advertisements

ממיבחניםC שאלות ++.
תוכנה 1 סמסטר א ' תשע " ב תרגול מס ' 7 * מנשקים, דיאגרמות וביטים * לא בהכרח בסדר הזה.
מבוא למדעי המחשב לתעשייה וניהול
©Silberschatz, Korth and Sudarshan4.1Database System Concepts סכימה לדוגמא.
מתמטיקה בדידה תרגול 3.
מבוא למדעי המחשב תרגול 2 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
חורף - תשס " ג DBMS, Design1 שימור תלויות אינטואיציה : כל תלות פונקציונלית שהתקיימה בסכמה המקורית מתקיימת גם בסכמה המפורקת. מטרה : כאשר מעדכנים.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
שאלות חזרה לבחינה. שאלה דיסקים אופטיים מסוג WORM (write-once-read-many) משמשים חברות לצורך איחסון כמויות גדולות של מידע באופן קבוע ומבלי שניתן לשנותו.
תכנות תרגול 4 שבוע : לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
תכנות תרגול 2 שבוע : שבוע שעבר כתבו תוכנית המגדירה שלושה משתנים מאתחלת אותם ל 1 2 ו 3 ומדפיסה את המכפלה שלהם את ההפרש שלהם ואת הסכום שלהם.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא למדעי המחשב תרגול מספר 3.
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
מבוא למדעי המחשב תרגול 4 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
1 מבוא למדעי המחשב ביטויים. 2 ביטויים expressions ביטויים (expressions) הינם יצורים תחביריים בעלי טיפוס וערך. הגדרה אינדוקטיבית של ביטויים : קבועים הם.
מבוא כללי למדעי המחשב שיעור שלישי: בקרת זרימה.
מבוא למדעי המחשב תרגול מספר 4. בפעם הקודמת... מזהים טיפוסים טווח ייצוג קבועים.
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
מבני בקרה מבוא לתכנות למנע " ס - שבוע מספר 3 - מאיר קומר - סמסטר ב ' - תשס " ו הסתעפות “ אם השמאל ואימנה ואם הימין ואשמאילה ”
מבוא לשפת C תרגול 12: עוד רקורסיה
מנפה שגיאות - DEBUGGER מבוא למדעי המחשב (234114) רועי מלמד
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
ערכים עצמיים בשיטות נומריות. משוואה אופינית X מציין וקטור עצמי מציינת ערך עצמי תואם לוקטור.
קורס תכנות – סימסטר ב ' תשס " ח שיעור שישי: מערכים
מבוא כללי למדעי המחשב שיעור רביעי: לולאות
מבוא למדעי המחשב תרגול מספר.
©Silberschatz, Korth and Sudarshan4.1Database System Concepts SQL n מבנה שאילתה n פונקציות צבירה.
תכנות תרגול 5 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
יחס סדר חלקי.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Last time on Clang משתנה: "פתק" המשמש את המחשב לשמירת מידע. לכל משתנה יש שם וטיפוס כללים לשמות משתנים –חייבים להכיל רק אותיות, מספרים ו '_' –חייבים להתחיל.
תרגול 5: ביטויים לוגיים ומשפטי תנאי (חזרה והרחבה)
1 compute תנאים פשוטים בעזרת compute לוגי לדוגמא: compute q1 = w > 80. Freq var = q1.
מבוא למדעי המחשב, סמסטר א ', תשע " א תרגול מס ' 1 נושאים  הכרת הקורס  פסאודו - קוד / אלגוריתם 1.
Markov Decision Processes (MDP) תומר באום Based on ch. 14 in “Probabilistic Robotics” By Thrun et al. ב"הב"ה.
תרגול 2: ייצוג מספרים - המשך
מתמטיקה בדידה תרגול 2.
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
מבוא למדעי המחשב תרגול מספר 4. בפעם הקודמת... מזהים טיפוסים טווח ייצוג קבועים.
1 מבוא למדעי המחשב backtracking. 2 מוטיבציה בעיית n המלכות: נתון: לוח שחמט בגודל. המטרה: לסדר על הלוח n מלכות כך שאף אחת לא תאיים על השנייה. דוגמא: עבור.
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
Structure. מה לומדים היום ? דרך לבנות מבנה נתונים בסיסי – Structure מייצר " טיפוס " חדש מתאים כאשר רוצים לאגד כמה משתנים יחד דוגמאות : עובד : שם, טלפון,
1 תרגול 2 – מבוא לתכנות JAVA. היום בתרגול : 2  משתנים וטיפוסים  אופרטורים  פונקציות מתמטיות מהמחלקה Math  המרת טיפוסים  תנאים  Debugger.
פיתוח מערכות מידע Class diagrams Aggregation, Composition and Generalization.
Practice session 3 תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי ) שיטות חישוב : Applicative & Normal Evaluation Partial Evaluation.
1 המרכז להוראת המדעים © האוניברסיטה העברית בירושלים עוברים לג ' אווה.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 7. סברוטינות subroutines.
Practice session 3.  תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי )  שיטות חישוב : Applicative & Normal Evaluation.
הרצאה 3 מבוא למדעי המחשב לתעשייה וניהול הודעות : הודעות : או דרך moodle – ושם לפנות ל : אתר מכון טל החומר.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
1 חלק XQuery :IV XML Query. 2 ביבליוגרפיה - DTD 3 ביבליוגרפיה – books.xml TCP/IP Illustrated Stevens W. Addison-Wesley Advanced Programming in.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 6. מפעל השעווה – לולאות  עד עכשיו  טיפלנו בייצור נרות מסוג אחד, במחיר אחיד  למדנו להתמודד עם טיפול במקרים שונים.
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
מחרוזות – הטיפוס String
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Operators Overloading
Formal Specifications for Complex Systems (236368) Tutorial #1
מבוא למדעי המחשב סיבוכיות.
SQL בסיסי – הגדרה אינדוקטיבית
מבוא כללי למדעי המחשב שיעור 2
תיכון אהל שם, רמת גן קורס PHP – הרצאה מס' 10
Computer Programming תרגול 3 Summer 2016
Engineering Programming A
Presentation transcript:

מבוא לשפת C תרגול 4: ביטויים לוגיים ומשפטי תנאי מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן אביאור וסאהר אסמיר עבור הקורס "מבוא למדעי המחשב" נכתב ע"י טל כהן, עודכן ע"י יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©2 תוכנייה חזרה קצרצרה על התרגול הקודם ביטויים לוגיים משפטי if

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©3 טיפוסי משתנים בשבוע שעבר פגשנו מבחר טיפוסים שונים למשתנים: * זהו הגודל ש-Turbo C מקצה עבור משתנים מסוג זה. מהדרים שונים יכולים להקצות גדלים שונים! למשל, במהדרים רבים int הוא בן 4 בתים. קלט/פלט ע"י* sizeofסוג המידע הנשמרשם הטיפוס %d או %c1מספרים שלמיםchar %d2מספרים שלמיםint %ld4מספרים שלמיםlong int %f4מספרים עם שבריםfloat %lf8מספרים עם שבריםdouble

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©4 char: מספר או תו? תזכורת:ערך משתנה char הינו אוסף של סיביות ( כמו כל משתנה אחר ) אפשר לפרש אותו כמספר בין -128 ל-127. אפשר גם לפרש אותו כאחד מ-256 תווי ASCII. כאשר מדפיסים משתנה char עם %c, תוכן המשתנה מתורגם לתו. כאשר קולטים משתנה char עם %c, scanf קולטת תו אחד, מתרגמת אותו לסיביות לפי טבלת ASCII ושומרת את התוצאה בתוך המשתנה. עבור כל פעולה אחרת (+, -, *,/,%, הדפסה/קלט עם %d וכו') מתייחסים למשתנה char כאל מספר!

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©5 שימוש בתווים בתוכנית ניתן לקבוע את ערכו של משתנה מסוג char לא רק בעזרת השמת ערך מספרי, אלא גם בעזרת השמת תו: char ch = 'B'; פעולה זאת לא באמת קובעת את ch להיות "תו", אלא ערכו נקבע להיות שווה לערך ASCII של B. כעת אם נדפיס את ch עם %c באמת נקבל B על המסך: printf("Numeric value is %d, character is %c", ch, ch); ידפיס: Numeric value is 66, character is B גרש ולא מרכאות !

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©6 סדר פעולות ואופרטורים ראינו שבשפת C מוגדר "סדר פעולות". –למשל, כפל קודם לחיבור. הכרנו כמה אופרטורים מיוחדים: –% - מודולו, שארית חלוקה (רק למספרים שלמים!). –++ - קידום משתנה (לפני או אחרי שם המשתנה, עם השפעות שונות) –-- - נסיגה של משתנה (כנ"ל) אופרטור נוח נוסף הינו השמה מקוצרת: +=, -=, וכו' –משמעותו של x+=y; הינה ;x=x+y, וכו'

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©7 המרת טיפוסים פגשנו שני סוגי המרות: –המרה אוטומטית – מתבצעת עבורנו מבלי שנבקש –המרה מכוונת – מתבצעת על-פי בקשה מפורשת המרה אוטומטית מתבצעת כשאנו מנסים להפעיל אופרטור על שני ערכים מטיפוסים שונים. המרה מכוונת נקראת לעיתים cast או type-cast. משתמשים בה כאשר תוצאה המתקבלת ע"י המרה אוטומטית היא לא התוצאה רצויה. –למשל בשביל לקבל תוצאה עם שארית בחלוקה של שלמים –אופן הכתיבה: (type)expression

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©8 המרת טיפוסים - דוגמה מה בעצם מתרחש בדוגמה הבאה? int a = 1,b = 2; double result = (double) a / b; 1.לפעולת cast יש קדימות על פעולת החלוקה, לכן קודם כל מתבצעת המרה מכוונת של ערך המשתנה a מ-int ל-double. 2.על מנת לבצע חלוקה, ערכים משני הצדדים חייבים להיות מאותו טיפוס. לכן מתבצעת המרה אוטומטית של ערך המשתנה b מ- int ל-double. 3.מתבצעת חלוקה: 1.0/2.0= תוצאת החלוקה של שני double הינה double. לכן אין צורך בהמרה נוספת ומתבצעת השמה.

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©9 מצא את ה-BUG מצא שלוש שגיאות בתוכנית הבאה: #include int main(void) { char c="Y"; int price = ; double half_price = (double)(price/2); printf("UPPER CASE: %c, lower case: %c\n", c, c-’A’+’a’); printf("Half price of 1,999,999 is %.2lf\n", half_price); return 0; } אילו מהשגיאות תתגלו בשלב הקומפילציה? מה עושה החישוב הזה?

ביטויים לוגיים

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©11 מהם ביטויים לוגיים? במהלך הפעולה של תוכנית, לעיתים קרובות נרצה שהתוכנית תקבל החלטה לפי ערכים שונים. למשל, "אם x>54, הדפס 'הצלחת', אחרת הדפס 'נכשלת'." החלטות יכולות להתקבל על-סמך ביטויים לוגיים, שהם: –השוואה בין מספרים (למשל, "אם x שווה בדיוק ל-100") –השוואה יחסית בין מספרים (למשל, "אם x>54") –צירוף בין כמה ביטויים פשוטים יותר (למשל, "אם x>54 וגם homework>60")

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©12 ייצוג ערכי אמת לכל ביטוי לוגי יש ערך אמת. ערך האמת הוא true או false ("נכון" או "שגוי"). למשל, לביטוי “x>54” יש ערך אמת true אם x גדול מ-54, וערך אמת false אחרת. אם לביטוי יש ערך אמת true, נהוג לומר שהביטוי "מתקיים". בשפות תכנות מתקדמות יש טיפוס מיוחד לערכי אמת. בשפת C הייצוג פשוט יותר: –ערך מספרי 0 מייצג false. –ערך מספרי שונה מ-0 (ובפרט, הערך 1) מייצג true.

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©13 פעולות השוואה כאופרטורים כעת אפשר לראות כיצד פעולות השוואה בין ערכים פועלות: אם ההשוואה מצליחה, לביטוי יש ערך 1 (כלומר, true). אחרת, לביטוי יש ערך 0 (כלומר, false). למשל, מה תדפיס התוכנית הבאה? int x = 79; int passing = (x > 54); printf(“Passing status: %d\n”, passing); למעשה, זו אינה תוכנית מלאה אלא קטע קוד. לעיתים קרובות נסתפק בהצגת קטע הקוד המהווה את "לב" התוכנית במקום להציג את התוכנית כולה.

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©14 אפשר להשוות כל מיני דברים... ההשוואות שהצגנו עד כה היו השוואות בין משתנים לקבועים (למשל, בין x ל-54). למעשה, ניתן להשוות בין כל צמד ביטויים. למשל, כל אלה הם ביטויים לוגיים תקינים: x + 5 > 3 * y 35 > 42 x < x + 1 וכן הלאה... האם תוכלו לדעת מה ערכו של כל ביטוי? שימו לב לחשיבות סדר הפעולות בחישוב ביטוי זה!

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©15 אופרטורים להשוואה ראינו את האופרטורים, להשוואה מסוג "גדול מ-" או "קטן מ-". אופרטורים נוספים: גדול-או-שווה: x >= y (בכתיבה מתמטית, x ≥y) קטן-או-שווה: x <= y (בכתיבה מתמטית, x≤ y) שווה בדיוק: x == y. שונה: x != y (בכתיבה מתמטית, x  y).

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©16 זהירות! ההבדל בין השמה להשוואה שימו לב: בהשוואה משתמשים בסימן "שווה" כפול. שימוש בסימן שווה יחיד פירושו השמה ולא השוואה! x = 3; ← Set the value of x to 3 x == 3 ←Logical expression, equals “1” if x is exactly 3, “0” otherwise. קל להתבלבל בין השניים; שימוש שגוי יוביל לתוצאות לא צפויות...

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©17 שילוב בין כמה השוואות נניח שאנו רוצים לבדוק אם ערך המשתנה temp נמצא בין 0 ל-100. –(אם למשל temp מייצג את טמפרטורת המים, נדע שהם במצב נוזלי). האם התוכנית הבאה תעבוד? double temp; int is_liquid; printf(“Enter temprature: ”); scanf(“%lf”, &temp); is_liquid = (0 < temp < 100); printf(“Is liquid (1=yes, 0=no): %d\n”, is_liquid);

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©18 והתוצאה... מצויין. מה קורה פה!?

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©19 הסבר כזכור, פעולת השוואה מניבה ערך מספרי: –1 אם ההשוואה "הצליחה", –0 אם ההשוואה "נכשלה". לכן, הביטוי 0 < temp < 100 עבור temp= חושב כך: 0 < < 100 ראשית, מחשבים את 0 < temp. ההשוואה מתקיימת, כלומר התוצאה היא 1. כעת, מחשבים את 1 < והתוצאה היא כמובן שוב 1!

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©20 אלגברה בוליאנית אם השיטה הקודמת נכשלה, כיצד ניתן לבצע כמה השוואות? התשובה: אלגברה בוליאנית. אופרטורים באלגברה בוליאנית מאפשרים "להשוות" בין ערכים בוליאניים. למעשה, אנחנו רוצים לחשב את: "temp>0 וגם temp<100" האופרטור "וגם" הוא אופרטור בוליאני ה"מקשר" בין שני ביטויים לוגיים. בשפת C, אופרטור זה נכתב: &&

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©21 התוכנית המתוקנת double temp; int is_liquid; printf(“Enter temprature: ”); scanf(“%lf”, &temp); is_liquid = (0 < temp) && (temp < 100); printf(“Is liquid (1=yes, 0=no): %d\n”, is_liquid);

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©22 אופרטורים בוליאניים אופרטור "וגם", x && y, מתקיים רק אם גם x וגם y הם true (כלומר, שונים מאפס). אופרטור "או", x || y, מתקיים אם לפחות אחד משני הביטויים x ו-y הוא true (כלומר, שונה מאפס). – כלומר או x, או y, או שניהם true. xyx && yx || y לא טבלה זאת נקראת טבלת אמת

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©23 עוד אופרטור בוליאני האופרטור הבוליאני האחרון הוא ! ("not"). אופרטור זה "הופך" את ערך האמת של ביטוי. –כמו סימן מינוס במתמטיקה, שהופך חיובי לשלילי ולהיפך. אם האופרטור פועל על 0, התוצאה היא 1. אם האופרטור פועל על ערך שונה מ-0, התוצאה היא 0. למשל: int test = 85; int homework = 65; int passing = !(test < 55 || homework < 80);

משפטי if

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©25 משפטי if: מוטיבציה עד כה, השתמשנו בתוצאות של ביטויים לוגיים פשוט כדי להדפיס ערכים (0 או 1 עבור false או true, בהתאמה). אבל כזכור, רצינו לגרום לתוכנית להתנהג באופן שונה על-פי בדיקות שונות. למשל, "אם x>54, הדפס 'הצלחת', אחרת הדפס 'נכשלת'." ניתן לבצע זאת בשפת C בעזרת משפטי if. –נקראים לעיתים "משפטי תנאי".

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©26 משפטי if מבנה משפט if הוא פשוט: if (expression) statement; expression הוא ביטוי כלשהו... –הסוגריים חייבים להופיע סביב הביטוי, הם חלק ממבנה פקודת if. אם הביטוי שונה מאפס, תתבצע הפקודה statement. אם הביטוי שווה לאפס, הפקודה statement לא תתבצע והתוכנית תמשיך לפקודה שבאה אחרי if. למשל: if (x < 55) printf(“You have failed!”); חשוב לזכור שזהו ביטוי המחושב ל-1 או 0. באופן כללי ניתן לשים ב-if כל ערך או ביטוי מספרי!

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©27 עוד דוגמא double temp; int is_liquid; printf(“Enter temprature: ”); scanf(“%lf”, &temp); is_liquid = (0 < temp) && (temp < 100); if (is_liquid) printf(“In liquid state.”); if (temp < 0) printf(“Frozen.”); if (temp > 100) printf(“Boiled.”);

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©28 עוד דוגמא int grade; printf(“Enter test grade: ”); scanf(“%d”, &grade); if (grade < 55) printf(“Failed.”); if (grade >= 55) printf(“Passed.”); שתי הבדיקות (השוואות של grade לקבוע 55) משלימות זו את זו: אם אחת מתקיימת, השניה בהכרח נכשלת, ולהיפך. מצבים כאלה (אם... אחרת...) הם מאוד נפוצים.

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©29 אם... אחרת... בגלל שמצבים של תנאים משלימים הם נפוצים, ישנו מבנה מיוחד בשפת C החוסך את הצורך בשתי בדיקות נפרדות. המבנה הוא: if (expression) statement 1 ; else statement 2 ; אם expression מתקיים, תבוצע הפקודה statement 1. אחרת, תבוצע הפקודה statement 2. בכל מקרה תבוצע רק אחת (ובדיוק אחת) משתי האפשרויות!

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©30 למשל... int grade; printf(“Enter test grade: ”); scanf(“%d”, &grade); if (grade < 55) printf(“Failed.”); else printf(“Passed.”); זוהי גרסה גם קלה יותר לכתיבה וגם קלה יותר להבנה, של הדוגמא הקודמת. הבדיקה מתבצעת רק פעם אחת!

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©31 שבירת שורות ארוכות משפטי if בכלל, ומשפטי if…else בפרט, עשויים ליצור שורות ארוכות בתוכנית. מומלץ לפרק שורות כאלה לחלקים, למשל כך: if (grade < 55) printf(“Failed.”); else printf(“Passed.”); הרווח משמאל שורות ה-statement נקרה הזחה (indentation). הוא מקל על הבנת התוכנית: במקרה זה, פקודה מוזחת היא פקודה שלא בהכרח תתבצע; היא לא חלק מחויב מרצף פעולת התוכנית.

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©32 עוד על הזחה חשוב להדגיש שמבחינת המהדר, –לא חשוב היכן "תשברו שורה", –אין כל משמעות מעשית להזחה. ההזחה נועדה לעזור לנו, בני-האדם, הקוראים את הקוד. היא הופכת את הקוד לקל יותר להבנה. בתרבות התכנות, הזחה אינה אופציונלית: ללא הקפדה על הזחה, קשה מאוד להבין תוכניות! –וקשה מאוד לתת להן ציונים גבוהים...

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©33 יותר מפעולה אחת לעיתים נרצה שאם תנאי כלשהו מתקיים, תבוצע יותר מפקודה אחת. למשל, מה תדפיס התוכנית הבאה? int grade = 25; printf(“The grade is %d\n”, grade); if (grade > 54) printf(“Passed.\n”); printf(“Very good!\n”); מה קורה פה!?

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©34 הסבר פשוט... כמו שאמרנו, מבחינת המהדר אין חשיבות למקום בו אתם "שוברים שורה". עם הזחה נכונה, התוכנית הקודמת נראית בעצם כך: int grade = 25; printf(“The grade is %d\n”, grade); if (grade > 54) printf(“Passed.\n”); printf(“Very good!\n”); כעת קל לראות שה-printf האחרון מתבצע בכל מקרה – הוא כלל לא קשור ל-if!

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©35 בכל זאת, יותר מפעולה אחת אז איך אפשר לבצע יותר מפעולה אחת בעזרת פקודת if? התשובה: שימוש בסוגריים מסולסלים. בעזרת סוגריים מסולסלים, ניתן "לקבץ" כמה statements כך שיתבצעו יחדיו, בהתאם לתנאי של ה-if. למשל: int grade = 25; printf(“The grade is %d\n”, grade); if (grade > 54) { printf(“Passed.\n”); printf(“Very good!\n”); }

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©36 אפשר גם ב-else... if (grade > 54) { printf(“Passed.\n”); printf(“Very good!\n”); } else { printf(“Failed.\n”); printf(“What a pity!\n”); } קבוצת פקודות בתוך סוגריים מסולסלים נקראת לעיתים "בלוק".

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©37 אפשר גם עבור פקודה בודדת... אפשר להשתמש בסוגריים מסולסלים גם כדי להקיף פקודה בודדת. לדעת רבים, התוצאה ברורה וקריאה יותר. למשל: if (grade < 55) { printf(“Failed.”); } else { printf(“Passed.”); }

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©38 סגנונות כתיבה יש מתכנתים שמעדיפים לפתוח את הסוגריים באותה שורה: if (grade < 55) { printf(“Failed.”); } else { printf(“Passed.”); } זוהי העדפה סגנונית – שתי השיטות קבילות, כל עוד שומרים על הזחה מדויקת. למהדר זה לא משנה כלום!

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©39 הזחה שגויה מה תבצע התוכנית הבאה עבור grade=40? if (grade < 55) if (grade > 52) grade = 55; /* factor */ else printf(“Passed without factor.”); else שייך ל-if האחרון! לכן התוכנית תדפיס “Passed without factor.” – לא מה שציפינו. תוצאה של הזחה שגויה יכולה להיות תוכנית שגויה. יש להקפיד על הזחה נכונה! כך ב-C כותבים הערות – טקסט שעוזר לנו להבין את התוכנית ושהמהדר מתעלם ממנו

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©40 תיקון איך אפשר לגרום ל-else להיות שייך לא ל-if האחרון? ע"י סוגריים מסולסלים: if (grade < 55) { if (grade >= 53) grade = 55; } else printf(“Passed without factor.”); עכשיו התוכנית תדפיס “Passed without factor.” רק כאשר grade>=55.

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©41 חידה קטע הקוד הבא מגיע מתוכנת בקרה של מטוס קל. אם הגובה הוא מעל 10,000 רגל, והמהירות קטנה מ-100 קמ"ש, יש סכנת התרסקות ומדפיסים אזהרה. האם תוכלו למצוא דרך פשוטה יותר לכתוב את הקוד? if (altitude > 10000) { if (airspeed < 100) { printf(“Warning! Crash danger!”); } שימו לב להזחה הכפולה!

4 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©42 עוד חידה באותה תוכנת בקרה למטוס, המשתנה visibility מציין את מידת הראות. הערך הוא תמיד אי-שלילי (אפס או יותר). אם הראות שווה לאפס, מדליקים מנורה אדומה. האם תוכלו למצוא דרך חלופית לכתוב את הקוד? איזו שיטת כתיבה עדיפה לדעתכם? if (visibility == 0) { turn_on_red_light(); }