
95161deab66d065d74b0d52371efacbf.ppt
- Количество слайдов: 40
מבוא לשפת C תרגול 5: ביטויים לוגיים ומשפטי תנאי )חזרה והרחבה( מבוסס על השקפים שחוברו ע"י שי ארצי, גיתית רוקשטיין, איתן אביאור וסאהר אסמיר עבור הקורס "מבוא למדעי המחשב" נכתב ע"י טל כהן, עודכן ע"י יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל
תוכנייה • • • 2 חזרה קצרה על התרגול הקודם חישוב מקוצר משפטי if מקוננים דוגמאות משפטי switch מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
ייצוג ערכי אמת • • 3 לכל ביטוי לוגי יש ערך אמת. ערך האמת הוא true או ") false נכון" או "שגוי"(. אם לביטוי יש ערך אמת , true נהוג לומר שהביטוי "מתקיים". בשפת : C – ערך מספרי 0 מייצג . false – ערך מספרי שונה מ-0 )ובפרט, הערך 1( מייצג . true מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
משפט if • אחד השימושים של ביטוים לוגים הינו משפט . if • משפט if מאפשר לגרום לתוכנית להתנהג שונה בהתאם לתנאי מסוים. תנאי הינו ביטוי כלשהו • המבנה הכללי של משפט : if { )תנאי( if פקודות לביצוע אם התנאי מתקיים אם if או else מכיל רק פקודה } אחת – אפשר לא לכתוב את הסוגריים המסולסלים { else פקודות לביצוע אם התנאי לא מתקיים } else הינו חלק אופציונאלי 4 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
הרכבת ביטוי לוגי - פעולות השוואה • פעולות השוואה בין ביטויים: ==, =>, =<, >, <, =! שווה, גדול-שווה, קטן-שווה, גדול, קטן, שונה – זכרו את ההבדל בין "==" )השוואה( לבין "=" )השמה(! • אם ההשוואה מצליחה, לביטוי יש ערך 1 )כלומר, . (true • אחרת, לביטוי יש ערך 0 )כלומר, . (false 5 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
הרכבת ביטוי לוגי - אופרטורים בוליאניים • אופרטור "וגם": , x && y מתקיים רק אם גם x וגם y הם ) true כלומר, שונים מאפס(. • אופרטור "או": , x || y מתקיים אם לפחות אחד משני הביטויים x ו- y הוא ) true כלומר, שונה מאפס(. • האופרטור שלילה )" " , !x : ("not הופך" את ערך האמת של ביטוי: – אם האופרטור פועל על 0, התוצאה היא 1. – אם האופרטור פועל על ערך שונה מ-0, התוצאה היא 0. 6 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
אופרטורים בוליאניים - טבלת אמת • טבלת אמת מציינת לכל סט פרמטרים אפשרי את ערך הביטוי הלוגי: !x x || y x && y y x 1 0 0 1 1 0 לא 0 0 0 1 0 0 לא 0 0 1 1 לא 0 • x ו- y יכולים להיות ביטוי כלשהו: קבוע, משתנה, ביטוי לוגי, ביטוי מתמטי. 7 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
חידה: שלילה כפולה • מה תדפיס התוכנית הבאה? ; int a, b, c ; 7 = a ; b = !a ; c = !!a ; ) printf(“%d, %dn”, a, b, c 8 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
תקן את התוכנית : • מצא שלוש שגיאות בתוכנית הבאה #include
אופרטורים וביטוים – חזרה והרחבה
מהו אופרטור? • אופרטור ) (operator הוא פעולה של , C המקבלת ערך יחיד, זוג או שלושה ערכים ומחזירה ערך כלשהו. • ערכים שהאופרטור מקבל נקראים אופרנדים ) : (operands 5+ X left operand right operand ‘+’ operator • כל אופרנד יכול להיות ערך קבוע, משתנה, הערך המוחזר של פונקציה או ביטוי מורכב כלשהו: ; 1 < ) y = scanf(“%d”, &x ; ) z += ((x + y) * 3) != (x – y 11 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
מהו ביטוי? • ביטוי ) (expression הינו הרכבה של אחד או יותר אופרטורים: )001 < (x > 0) && (x 1 + 8* y = x • בשביל לחשב ביטוי מחשבים כל אחד מהאופרטורים המרכיבים אותו לפי סדר הקדימויות. • חישוב של כל אופרטור נותן ערך שנשמר במקום זמני בזיכרון ונהרס כאשר לא צריכים אותו יותר. • דוגמה: מה עושים הביטויים הבאים: ; int a, b, c, d, num_of_positive האם מותר להוריד את ; 0= a=b=c=d הסוגריים בביטוי הזה? ; ) scanf(“%d%d”, &a, &b, &c, &d ; )0> num_of_positive = (a>0) + (b>0) + (c>0) + (d 21 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
סוגי אופרטורים • אופרטור אונארי ) (unary operator מקבל ערך יחיד. – לדוגמה: ++, --, !, ) sizeof , (type • אופרטור בינארי ) (binary operator מקבל שני ערכים. – לדוגמה: +, -, %, ||, &&, <, >, ==, =, =+ • אופרטור טרנארי ) (ternary operator מקבל שלושה ערכים. – ב- C קיים רק אופרטור טרנארי אחד: ": ? " 31 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
האופרטורים שלמדנו ו- side effects • ישנם אופרטורים שחוץ מלחשב את הערך, גם משנים את האופרנדים שלהם. • השפעה זו נקראת תוצאת לוואי ) (side effect של האופרטור. • אופרטורים ללא : side effects – פעולות חשבון: +, -, /, *, % – אופרטורים לוגיים: <, >, =<, =>, ==, =!, &&, ||, ! – אופרטור המרה: ) (type – אופרטור למציאת גודל המשתנה: sizeof • אופרטורים עם ) side effects שמשנים אחד האופרנדים(: – השמה: =, =+, =-, =/, =*, =% מהו הערך המתקבל מהחישוב של – קידום/נסיגה: ++, -- כל אחד מהאופרטורים? 41 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
האופרטור : ? • תחביר : 3 expr 1 ? expr 2 : expr • אם 1 expr הוא TRUE אז הערך של הביטוי כולו הוא 2 , expr אחרת 3. expr • דוגמה 1 – חישוב : maximum ; max = (x > y) ? x : y • דוגמה 2 – שינוי של אות קטנה לאות גדולה: ; char ch ; )” printf(“Enter a lettern ; ) scanf(“%c”, &ch ; ch = (ch>=’a’ && ch<=’z’) ? (ch - ‘a’ + ‘A’) : ch 51 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
חישוב מקוצר
חידה: מספיק לדעת חצי? • התבוננו בתוכנית הבאה: ; 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 %dn”, z • האם אפשר )לפעמים( לדעת מה תדפיס התוכנית, מבלי לדעת איזה ערך יזין המשתמש עבור ? y – כלומר, לדעת את ערכו של z על-סמך x בלבד? 71 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
חידה: כנ"ל, באלגברה בוליאנית? • בכפל, ניתן לדעת את התוצאה אם יודעים שאחד הגורמים הוא 0 – וזאת, מבלי לדעת מהו הגורם השני. • ומה לגבי אלגברה בוליאנית? • מהו הערך של הביטוי הבא: )8< (1>3) && (x==y) && (x<12) && (17<19) && (y – האם יש טעם לחשב את כל הביטוי מהתחלה ועד הסוף? • מהו הערך של הביטוי הבא: )8< (x!=x) || (x==x) || (x<12) || (17<19) || (y – האם יש טעם לחשב את כל הביטוי מהתחלה ועד הסוף? 81 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
חישוב מקוצר • במקרה של אלגברה בוליאנית, שפת C מנצלת את העובדות שהכרנו בשקפים הקודמים. להזכירכם, החישוב של האופרטורים || ו -&& מתבצע משמאל לימין • אופרטור ”||“ ) : (OR – אם האופרנד השמאלי הינו , true לא מתבצע חישוב של האופרנד הימני. התוצאה שווה ל-1 בכל מקרה. • אופרטור ”&&“ ) : (AND – אם האופרנד השמאלי הינו , false לא מתבצע חישוב של האופרנד הימני. התוצאה שווה ל-0 בכל מקרה. • חישוב מקוצר זה נקרא ) lazy evaluation או short-circuit . (evaluation 91 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
חידה: השפעת חישוב מקוצר • מה תדפיס התוכנית הבאה: • אם המשתמש סיפק את הערך "7" עבור ? x • אם המשתמש סיפק את הערך "3 -"? • אם המשתמש סיפק את הערך "2 -"? 02 מבוא למדעי המחשב. כל הזכויות שמורות© ; int x ; ) scanf(“%d”, &x { )0 =! if (x ; 2 =+ x { ) if (x || ++x ; ++ x } } ; ) printf(“%dn”, x 5תרגול
תכנות מחשבון • כעת ננסה לתכנת "מחשבון כיס". • המשתמש יזין: – מספר ) , (x – פעולת חשבון )+ או – או * או /(, – מספר נוסף ) (y • התוכנית תדפיס את תוצאת הפעולה על x ועל . y 12 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
שלב הקלט • ראשית, נבקש מהמשתמש להקליד את הערכים. ; double x, y, result ; char op פעולת scanf אחת יכולה לשמש לקליטת כמה ערכים )ללא Enter ביניהם(. ; )” : printf(“Operation ; ) scanf(“%lf%c%lf”, &x, &op, &y 22 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
שלב החישוב • • אם הפעולה היא חיבור, נבצע חיבור. אחרת, אם הפעולה היא חיסור, נבצע חיסור. אחרת, אם הפעולה היא כפל, נבצע כפל. אחרת, אם הפעולה היא חילוק, נבצע חילוק. • ועכשיו, בשפת . . . C 32 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
שלב החישוב: ועכשיו, בשפת C )’+‘ == if (op כזכור, תו בודד )ערך מסוג (char מיוצג בין גרשיים בודדים )ולא מרכאות כפולות(. ; 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 ; 1 return } 42 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
שלב החישוב: תיקון קל )’+‘ == if (op ; result = x + y מה שינינו? רק את הרווחים השונים בין הפקודות. )’–‘ == else if (op מבחינת שפת , C אין שום הבדל. מבחינת הקריאות, יש הבדל של עולם ומלואו. . . ; result = x – y )’*‘ == else if (op ; result = x * y )’/‘ == else if (op ; result = x / y { else ; )”. printf(“Error, unknown operator ; 1 return } 52 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
הדפסת התוצאה • ועכשיו, לאחר שחישבנו את התוצאה, צריך רק להדפיס אותה: ; ) printf(“%lf %c %lf = %lfn”, x, op, y, result ; 0 return 62 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
והתוצאה: 72 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
חידה • האם תוכלו להרחיב את המחשבון כך שיכלול גם פעולת חזקה? • מקובל לסמן את החזקה בעזרת התו ^. • שימו לב: אין פעולת חזקה כחלק מובנה של שפת !C • רמז: בספריה הסטנדרטית math. h קיימת הפונקציה ). pow(x, y 82 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
switch משפטי
אם. . . ואם לא. . . • בתוכנית המחשבון נתקלנו במצב שהוא, למעשה, נפוץ למדי: • רצף של בדיקות ערך עבור משתנה יחיד. – במקרה זה, המשתנה , op מטיפוס . char • היות שמצבים אלה נפוצים כאמור, יש בשפת C מבנה מיוחד שנועד להקל על הטיפול בהם: משפטי . switch 03 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
משפטי switch • המבנה הכללי של משפטי switch הוא: 1. הביטוי חייב להיות מטיפוס שלם ) int או long או . (char 2. כל ערך של case חייב להיות קבוע )לא משתנה( 3. ערך של case לא יכול להופיע יותר מפעם אחת 13 מבוא למדעי המחשב. כל הזכויות שמורות© ) switch (expression { : 1 case v ; op 1 a ; op 1 b : ; break : 2 case v ; op 2 a ; op 2 b : ; break : : } 5תרגול
הסבר – משפטי switch • בעת ריצת התוכנית, משפט switch מתבצע באופן הבא: • א. מחשבים את ערך הביטוי ). (value • ב. משווים את value לערך ה- case הראשון )1. (v – אם הם שווים: מבצעים את הפעולות op 1 b , op 1 a וכו', עד ל-. break – יוצאים ממשפט ה-. switch • ג. משווים את value לערך ה- case השני )2. (v – אם הם שווים: מבצעים את הפעולות op 2 b , op 2 a וכו', עד ל-. break – יוצאים ממשפט ה-. switch • וכו'. . . • אין הגבלה על מספר סעיפי ה- case בתוך ה-. switch 23 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
במחשבון switch- למשל: שימוש ב switch (op) { case ‘+’: result = x + y; break; case ‘–’: result = x – y; break; case ‘*’: result = x * y; break; case ‘/’: result = x / y; break; } 5תרגול © מבוא למדעי המחשב. כל הזכויות שמורות 33
ברירת מחדל • ומה אם אף אחת מהאפשרויות לא מתאימה? • בגרסת ה- , if-else-if פשוט היה בסוף else ללא תנאי נוסף. – התאים ל"כל מקרה אחר". • במשפטי , switch ניתן להוסיף סעיף default אחרי ה- case האחרון. – יתאים ל"כל מקרה אחר". 43 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
דוגמה: ברירת מחדל switch (op) { : : case ‘*’: result = x * y; break; case ‘/’: result = x / y; break; default: printf(“Error, unknown operator. ”); return 1; } 5תרגול © מבוא למדעי המחשב. כל הזכויות שמורות 35
שתי אפשרויות, אותה התוצאה • במשפטי , switch ניתן לציין שעבור שתי אפשרויות שונות, אנו מעוניינים באותה התוצאה. • השיטה: שתי שורות case בזו אחר זו )או יותר משתיים. . . (. – אחרי הראשונה, לא מציינים אף פקודה וגם לא . break – אחרי השניה, ממשיכים כרגיל. 63 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול
דוגמה: שתי אפשרויות זהות • בדוגמה זו, סימן ) x אות X קטנה( יכול לשמש כתחליף לסימן הכפל *. 73 מבוא למדעי המחשב. כל הזכויות שמורות© { ) switch (op : ’+‘ case ; result = x + y ; break : ’–‘ case ; result = x – y ; break : ’ case ‘x : ’*‘ case ; result = x * y ; break : ’/‘ case : : } 5תרגול
דוגמה נוספת – תחרות בין מסעדות הגורמה בטכניון #include
המשך גורם לקוד הבא להתבצע while. כל עוד התנאי מתקיים while( (c=getchar()) != 'q') { switch (c) { case 'g': case 'G': Gscore++; break; case 's': case 'S': Sscore++; break; case 'c': case 'C': Cscore++; break; default: printf("Please don't invent new restaurants!n"); } /* end of switch */ } /* end of while */ . . . המשך בעמוד הבא 5תרגול © מבוא למדעי המחשב. כל הזכויות שמורות 39
המשך printf("n. The scores of the restaurants are as follows: n"); printf("Greg Coffee: %dn", Gscore); printf("Student house: %dn", Sscore); printf("Chemical Engineering: %dn", Cscore); if (Sscore>Gscore && Sscore>Cscore) printf("Impossible. . . Logical error!!! n"); } /* end of main */ 5תרגול © מבוא למדעי המחשב. כל הזכויות שמורות 40