Скачать презентацию מבוא לשפת C תרגול 5 ביטויים לוגיים Скачать презентацию מבוא לשפת C תרגול 5 ביטויים לוגיים

95161deab66d065d74b0d52371efacbf.ppt

  • Количество слайдов: 40

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

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

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

 משפט if • אחד השימושים של ביטוים לוגים הינו משפט . if • משפט 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 חידה: שלילה כפולה • מה תדפיס התוכנית הבאה? ; int a, b, c ; 7 = a ; b = !a ; c = !!a ; ) printf(“%d, %dn”, a, b, c 8 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול

 תקן את התוכנית : • מצא שלוש שגיאות בתוכנית הבאה #include <stdio. h> תקן את התוכנית : • מצא שלוש שגיאות בתוכנית הבאה #include 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”); איננה שגיאת קומפילציה, אבל if השמה בתוך factor = 0; Warning מזהה בתור Visual Studio else factor += 10; printf("The final grade is %d. n", grade + factor); כנ"ל שימוש במשתנים לא return 0; מאותחלים } ? • אילו מהשגיאות הן שגיאות קומפילציה 5תרגול © מבוא למדעי המחשב. כל הזכויות שמורות 9

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

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

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

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

 האופרטור : ? • תחביר : 3 expr 1 ? expr 2 : האופרטור : ? • תחביר : 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 חידה: מספיק לדעת חצי? • התבוננו בתוכנית הבאה: ; 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 מנצלת את העובדות שהכרנו חישוב מקוצר • במקרה של אלגברה בוליאנית, שפת 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, שלב הקלט • ראשית, נבקש מהמשתמש להקליד את הערכים. ; 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 כזכור, תו בודד )ערך שלב החישוב: ועכשיו, בשפת 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 + שלב החישוב: תיקון קל )’+‘ == 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תרגול והתוצאה: 72 מבוא למדעי המחשב. כל הזכויות שמורות© 5תרגול

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

switch משפטי switch משפטי

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

 משפטי switch • המבנה הכללי של משפטי switch הוא: 1. הביטוי חייב להיות משפטי 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 מתבצע באופן הבא: הסבר – משפטי 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 במחשבון 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 דוגמה: ברירת מחדל switch (op) { : : case ‘*’: result = x * y; break; case ‘/’: result = x / y; break; default: printf(“Error, unknown operator. ”); return 1; } 5תרגול © מבוא למדעי המחשב. כל הזכויות שמורות 35

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

 דוגמה: שתי אפשרויות זהות • בדוגמה זו, סימן ) x אות X קטנה( דוגמה: שתי אפשרויות זהות • בדוגמה זו, סימן ) 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 <stdio. h> int main(void) דוגמה נוספת – תחרות בין מסעדות הגורמה בטכניון #include 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 - Gn"); printf("Student house press - Sn"); printf("Chemical Engineering - Cn"); printf("if you want to end the voting please press qn"); . . . המשך בעמוד הבא 5תרגול © מבוא למדעי המחשב. כל הזכויות שמורות 38

 המשך גורם לקוד הבא להתבצע while. כל עוד התנאי מתקיים while( (c=getchar()) != המשך גורם לקוד הבא להתבצע 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( המשך 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