Presentation is loading. Please wait.

Presentation is loading. Please wait.

תרגול 5: ביטויים לוגיים ומשפטי תנאי (חזרה והרחבה)

Similar presentations


Presentation on theme: "תרגול 5: ביטויים לוגיים ומשפטי תנאי (חזרה והרחבה)"— Presentation transcript:

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

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

3 מבוא למדעי המחשב. כל הזכויות שמורות ©
ייצוג ערכי אמת לכל ביטוי לוגי יש ערך אמת. ערך האמת הוא true או false ("נכון" או "שגוי"). אם לביטוי יש ערך אמת true, נהוג לומר שהביטוי "מתקיים". בשפת C: ערך מספרי 0 מייצג false. ערך מספרי שונה מ-0 (ובפרט, הערך 1) מייצג true. 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

4 משפט if אחד השימושים של ביטוים לוגים הינו משפט if.
פקודות לביצוע אם התנאי מתקיים } else { פקודות לביצוע אם התנאי לא מתקיים תנאי הינו ביטוי כלשהו אם if או else מכיל רק פקודה אחת – אפשר לא לכתוב את הסוגריים המסולסלים else הינו חלק אופציונאלי 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

5 הרכבת ביטוי לוגי - פעולות השוואה
פעולות השוואה בין ביטויים: ==, >=, <=, <, <, != שווה, גדול-שווה, קטן-שווה, גדול, קטן, שונה זכרו את ההבדל בין "==" (השוואה) לבין "=" (השמה)! אם ההשוואה מצליחה, לביטוי יש ערך 1 (כלומר, true). אחרת, לביטוי יש ערך 0 (כלומר, false). 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

6 הרכבת ביטוי לוגי - אופרטורים בוליאניים
אופרטור "וגם": x && y, מתקיים רק אם גם x וגם y הם true (כלומר, שונים מאפס). אופרטור "או": x || y, מתקיים אם לפחות אחד משני הביטויים x ו-y הוא true (כלומר, שונה מאפס). האופרטור שלילה ("not"): !x, "הופך" את ערך האמת של ביטוי: אם האופרטור פועל על 0, התוצאה היא 1. אם האופרטור פועל על ערך שונה מ-0, התוצאה היא 0. 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

7 אופרטורים בוליאניים - טבלת אמת
טבלת אמת מציינת לכל סט פרמטרים אפשרי את ערך הביטוי הלוגי: x ו-y יכולים להיות ביטוי כלשהו: קבוע, משתנה, ביטוי לוגי, ביטוי מתמטי. x y x && y x || y !x 1 לא 0 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

8 מבוא למדעי המחשב. כל הזכויות שמורות ©
חידה: שלילה כפולה מה תדפיס התוכנית הבאה? int a, b, c; a = 7; b = !a; c = !!a; printf(“%d, %d, %d\n”, a, b, c); 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

9 תקן את התוכנית מצא שלוש שגיאות בתוכנית הבאה:
#include <stdio.h> int main(void) { int grade, factor, need_factor; scanf("%d", &grade); need_factor = (grade <= 55); /* grade <= 55 gets 10 points factor */ if (need_factor = 0) printf(“No factor is required.\n”); factor = 0; else factor += 10; printf("The final grade is %d.\n", grade + factor); return 0; } אילו מהשגיאות הן שגיאות קומפילציה? השמה בתוך if איננה שגיאת קומפילציה, אבל Visual Studio מזהה בתור Warning כנ"ל שימוש במשתנים לא מאותחלים 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

10 אופרטורים וביטוים – חזרה והרחבה

11 מבוא למדעי המחשב. כל הזכויות שמורות ©
מהו אופרטור? אופרטור (operator) הוא פעולה של C, המקבלת ערך יחיד, זוג או שלושה ערכים ומחזירה ערך כלשהו. ערכים שהאופרטור מקבל נקראים אופרנדים (operands): X + 5 כל אופרנד יכול להיות ערך קבוע, משתנה, הערך המוחזר של פונקציה או ביטוי מורכב כלשהו: y = scanf(“%d”, &x) < 1; z += ((x + y) * 3) != (x – y); left operand right operand ‘+’ operator 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

12 מהו ביטוי? ביטוי (expression) הינו הרכבה של אחד או יותר אופרטורים:
(x > 0) && (x < 100) y = x*8 + 1 בשביל לחשב ביטוי מחשבים כל אחד מהאופרטורים המרכיבים אותו לפי סדר הקדימויות. חישוב של כל אופרטור נותן ערך שנשמר במקום זמני בזיכרון ונהרס כאשר לא צריכים אותו יותר. דוגמה: מה עושים הביטויים הבאים: int a, b, c, d, num_of_positive; a=b=c=d=0; scanf(“%d%d%d%d”, &a, &b, &c, &d); num_of_positive = (a>0) + (b>0) + (c>0) + (d>0); האם מותר להוריד את הסוגריים בביטוי הזה? 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

13 מבוא למדעי המחשב. כל הזכויות שמורות ©
סוגי אופרטורים אופרטור אונארי (unary operator) מקבל ערך יחיד. לדוגמה: ++, --, !, (type), sizeof אופרטור בינארי (binary operator) מקבל שני ערכים. לדוגמה: +, -, %, ||, &&, >, <, ==, =, += אופרטור טרנארי (ternary operator) מקבל שלושה ערכים. ב-C קיים רק אופרטור טרנארי אחד: ""?: 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

14 האופרטורים שלמדנו ו-side effects
ישנם אופרטורים שחוץ מלחשב את הערך, גם משנים את האופרנדים שלהם. השפעה זו נקראת תוצאת לוואי (side effect) של האופרטור. אופרטורים ללא side effects: פעולות חשבון: +, -, /, *, % אופרטורים לוגיים: >, <, <=, >=, ==, !=, &&, ||, ! אופרטור המרה: (type) אופרטור למציאת גודל המשתנה: sizeof אופרטורים עם side effects (שמשנים אחד האופרנדים): השמה: =, +=, -=, /=, *=, %= קידום/נסיגה: ++, -- מהו הערך המתקבל מהחישוב של כל אחד מהאופרטורים? 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

15 מבוא למדעי המחשב. כל הזכויות שמורות ©
האופרטור ?: תחביר : expr1 ? expr2 : expr3 אם expr1 הוא TRUE אז הערך של הביטוי כולו הוא expr2, אחרת expr3. דוגמה 1 – חישוב maximum: max = (x > y) ? x : y; דוגמה 2 – שינוי של אות קטנה לאות גדולה: char ch; printf(“Enter a letter\n”); scanf(“%c”, &ch); ch = (ch>=’a’ && ch<=’z’) ? (ch - ‘a’ + ‘A’) : ch ; 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

16 חישוב מקוצר

17 מבוא למדעי המחשב. כל הזכויות שמורות ©
חידה: מספיק לדעת חצי? התבוננו בתוכנית הבאה: int x, y, z; printf(“Enter value for x:”); scanf(“%d”, &x); printf(“Enter value for y:”); scanf(“%d”, &y); z = x * y; printf(“Result is %d\n”, z); האם אפשר (לפעמים) לדעת מה תדפיס התוכנית, מבלי לדעת איזה ערך יזין המשתמש עבור y? כלומר, לדעת את ערכו של z על-סמך x בלבד? 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

18 חידה: כנ"ל, באלגברה בוליאנית?
בכפל, ניתן לדעת את התוצאה אם יודעים שאחד הגורמים הוא 0 – וזאת, מבלי לדעת מהו הגורם השני. ומה לגבי אלגברה בוליאנית? מהו הערך של הביטוי הבא: (1>3) && (x==y) && (x<12) && (17<19) && (y<8) האם יש טעם לחשב את כל הביטוי מהתחלה ועד הסוף? (x!=x) || (x==x) || (x<12) || (17<19) || (y<8) 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

19 חישוב מקוצר במקרה של אלגברה בוליאנית, שפת C מנצלת את העובדות שהכרנו בשקפים הקודמים. אופרטור “||” (OR): אם האופרנד השמאלי הינו true, לא מתבצע חישוב של האופרנד הימני. התוצאה שווה ל-1 בכל מקרה. אופרטור “&&” (AND): אם האופרנד השמאלי הינו false, לא מתבצע חישוב של האופרנד הימני. התוצאה שווה ל-0 בכל מקרה. חישוב מקוצר זה נקרא lazy evaluation (או short-circuit evaluation). להזכירכם, החישוב של האופרטורים || ו-&& מתבצע משמאל לימין 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

20 חידה: השפעת חישוב מקוצר
מה תדפיס התוכנית הבאה: אם המשתמש סיפק את הערך "7" עבור x? אם המשתמש סיפק את הערך "-3"? אם המשתמש סיפק את הערך "-2"? int x; scanf(“%d”, &x); if (x != 0) { x += 2; if (x || ++x) { x++; } printf(“%d\n”, x); 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

21 מבוא למדעי המחשב. כל הזכויות שמורות ©
תכנות מחשבון כעת ננסה לתכנת "מחשבון כיס". המשתמש יזין: מספר (x), פעולת חשבון (+ או – או * או /), מספר נוסף (y) התוכנית תדפיס את תוצאת הפעולה על x ועל y. 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

22 printf(“Operation: ”); scanf(“%lf%c%lf”, &x, &op, &y);
שלב הקלט ראשית, נבקש מהמשתמש להקליד את הערכים. double x, y, result; char op; printf(“Operation: ”); scanf(“%lf%c%lf”, &x, &op, &y); פעולת scanf אחת יכולה לשמש לקליטת כמה ערכים (ללא Enter ביניהם). 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

23 מבוא למדעי המחשב. כל הזכויות שמורות ©
שלב החישוב אם הפעולה היא חיבור, נבצע חיבור. אחרת, אם הפעולה היא חיסור, נבצע חיסור. אחרת, אם הפעולה היא כפל, נבצע כפל. אחרת, אם הפעולה היא חילוק, נבצע חילוק. ועכשיו, בשפת C... 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

24 שלב החישוב: ועכשיו, בשפת C
if (op == ‘+’) result = x + y; else if (op == ‘–’) result = x – y; if (op == ‘*’) result = x * y; if (op == ‘/’) result = x / y; else { printf(“Error, unknown operator.”); return 1; } כזכור, תו בודד (ערך מסוג char) מיוצג בין גרשיים בודדים (ולא מרכאות כפולות). אם עוקבים אחרי כללי ההזחה באופן נוקשה, מתקבלת תוצאה קצת... מוזרה. 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

25 שלב החישוב: תיקון קל if (op == ‘+’) result = x + y;
else if (op == ‘–’) result = x – y; else if (op == ‘*’) result = x * y; else if (op == ‘/’) result = x / y; else { printf(“Error, unknown operator.”); return 1; } מה שינינו? רק את הרווחים השונים בין הפקודות. מבחינת שפת C, אין שום הבדל. מבחינת הקריאות, יש הבדל של עולם ומלואו... 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

26 מבוא למדעי המחשב. כל הזכויות שמורות ©
הדפסת התוצאה ועכשיו, לאחר שחישבנו את התוצאה, צריך רק להדפיס אותה: printf(“%lf %c %lf = %lf\n”, x, op, y, result); return 0; 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

27 מבוא למדעי המחשב. כל הזכויות שמורות ©
והתוצאה: 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

28 מבוא למדעי המחשב. כל הזכויות שמורות ©
חידה האם תוכלו להרחיב את המחשבון כך שיכלול גם פעולת חזקה? מקובל לסמן את החזקה בעזרת התו ^. שימו לב: אין פעולת חזקה כחלק מובנה של שפת C! רמז: בספריה הסטנדרטית math.h קיימת הפונקציה pow(x,y). 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

29 משפטי switch

30 מבוא למדעי המחשב. כל הזכויות שמורות ©
אם... ואם לא... ואם לא... ואם לא... בתוכנית המחשבון נתקלנו במצב שהוא, למעשה, נפוץ למדי: רצף של בדיקות ערך עבור משתנה יחיד. במקרה זה, המשתנה op, מטיפוס char. היות שמצבים אלה נפוצים כאמור, יש בשפת C מבנה מיוחד שנועד להקל על הטיפול בהם: משפטי switch. 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

31 משפטי switch המבנה הכללי של משפטי switch הוא: switch (expression) {
case v1: op1a; op1b; : break; case v2: op2a; op2b; } 1. הביטוי חייב להיות מטיפוס שלם (int או long או char). 2. כל ערך של case חייב להיות קבוע (לא משתנה) 3. ערך של case לא יכול להופיע יותר מפעם אחת 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

32 מבוא למדעי המחשב. כל הזכויות שמורות ©
הסבר – משפטי switch בעת ריצת התוכנית, משפט switch מתבצע באופן הבא: א. מחשבים את ערך הביטוי (value). ב. משווים את value לערך ה-case הראשון (v1). אם הם שווים: מבצעים את הפעולות op1a, op1b וכו', עד ל-break. יוצאים ממשפט ה-switch. ג. משווים את value לערך ה-case השני (v2). אם הם שווים: מבצעים את הפעולות op2a, op2b וכו', עד ל-break. וכו'... אין הגבלה על מספר סעיפי ה-case בתוך ה-switch. 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

33 למשל: שימוש ב-switch במחשבון
switch (op) { case ‘+’: result = x + y; break; case ‘–’: result = x – y; case ‘*’: result = x * y; case ‘/’: result = x / y; } 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

34 מבוא למדעי המחשב. כל הזכויות שמורות ©
ברירת מחדל ומה אם אף אחת מהאפשרויות לא מתאימה? בגרסת ה-if-else-if, פשוט היה בסוף else ללא תנאי נוסף. התאים ל"כל מקרה אחר". במשפטי switch, ניתן להוסיף סעיף default אחרי ה-case האחרון. יתאים ל"כל מקרה אחר". 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

35 מבוא למדעי המחשב. כל הזכויות שמורות ©
דוגמה: ברירת מחדל switch (op) { : case ‘*’: result = x * y; break; case ‘/’: result = x / y; default: printf(“Error, unknown operator.”); return 1; } 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

36 שתי אפשרויות, אותה התוצאה
במשפטי switch, ניתן לציין שעבור שתי אפשרויות שונות, אנו מעוניינים באותה התוצאה. השיטה: שתי שורות case בזו אחר זו (או יותר משתיים...). אחרי הראשונה, לא מציינים אף פקודה וגם לא break. אחרי השניה, ממשיכים כרגיל. 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

37 דוגמה: שתי אפשרויות זהות
switch (op) { case ‘+’: result = x + y; break; case ‘–’: result = x – y; case ‘x’: case ‘*’: result = x * y; case ‘/’: : } בדוגמה זו, סימן x (אות X קטנה) יכול לשמש כתחליף לסימן הכפל *. 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

38 דוגמה נוספת – תחרות בין מסעדות הגורמה בטכניון
#include <stdio.h> int main(void) { int Gscore=0, Sscore=0, Cscore=0; char c; printf("Enter your favorite restaurant in the Technion:\n"); printf("Greg Coffee (near Taub) press - G\n"); printf("Student house press - S\n"); printf("Chemical Engineering - C\n"); printf("if you want to end the voting please press q\n"); המשך בעמוד הבא... 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

39 המשך while( (c=getchar()) != 'q') { switch (c) { case 'g':
case 'G': Gscore++; break; case 's': case 'S': Sscore++; case 'c': case 'C': Cscore++; default: printf("Please don't invent new restaurants!\n"); } /* end of switch */ } /* end of while */ המשך בעמוד הבא... 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©

40 מבוא למדעי המחשב. כל הזכויות שמורות ©
המשך printf("\nThe scores of the restaurants are as follows:\n"); printf("Greg Coffee: %d\n", Gscore); printf("Student house: %d\n", Sscore); printf("Chemical Engineering: %d\n", Cscore); if (Sscore>Gscore && Sscore>Cscore) printf("Impossible... Logical error!!! \n"); } /* end of main */ 5 תרגול מבוא למדעי המחשב. כל הזכויות שמורות ©


Download ppt "תרגול 5: ביטויים לוגיים ומשפטי תנאי (חזרה והרחבה)"

Similar presentations


Ads by Google