Presentation is loading. Please wait.

Presentation is loading. Please wait.

Www.cs.tau.ac.il/courses/cs4math/09b מבוא כללי למדעי המחשב שיעור שלישי: בקרת זרימה.

Similar presentations


Presentation on theme: "Www.cs.tau.ac.il/courses/cs4math/09b מבוא כללי למדעי המחשב שיעור שלישי: בקרת זרימה."— Presentation transcript:

1 www.cs.tau.ac.il/courses/cs4math/09b מבוא כללי למדעי המחשב שיעור שלישי: בקרת זרימה

2 תזכורת: שימוש במשתנים מהו משתנה מהו משתנה הגדרת משתנים הגדרת משתנים טיפוס ושם, int, float, double, char. char c=‘a’; int i;. טיפוס ושם, int, float, double, char. char c=‘a’; int i;. קלט/פלט של משתנים קלט/פלט של משתנים printf,scanf. פורמטים: %d,%f, %g, %e, %c, %lf (for scanf). printf,scanf. פורמטים: %d,%f, %g, %e, %c, %lf (for scanf). printf(“%g”, average); scanf(“%d”, &hours); printf(“%g”, average); scanf(“%d”, &hours); פעולות על משתנים פעולות על משתנים השמה: c = a; b=5;. השמה: c = a; b=5;. פעולות חשבון: +, -, *, /, %. פעולות חשבון: +, -, *, /, %. תשומת-לב לדיוק וטווח. למשל 0=3/4. תשומת-לב לדיוק וטווח. למשל 0=3/4. להקפיד לא לחלק באפס (זה גורם לתוכנית לעוף). להקפיד לא לחלק באפס (זה גורם לתוכנית לעוף).

3 תזכורת: דוגמא להדפסת משתנים #include #include int main() { double a,b,c; a = 2.51; b = 2; c = a*b; printf(“%g * %g = %g\n", a,b,c); return 0; } הפלט: 5.022.51 * 2 =

4 #include #include int main() { double cels, fahr; printf("Please enter a fahrenheit temperature:\n"); scanf("%lf",&fahr); cels = 5*(fahr-32)/9; printf("This is equal to %f degrees celsius\n", cels); return 0; } תזכורת: תוכנית לתרגום מפרנהייט לצלזיוס הגדרת המשתנים קליטת ערך למשתנה הדפסת התוצאה

5 charתזכורת: פירוט על הטיפוס charתזכורת: פירוט על הטיפוס גם char (תו) נשמר בזיכרון המחשב כמספר. גם char (תו) נשמר בזיכרון המחשב כמספר. יש לקומפיילר טבלה של 256 תווים אפשריים (טבלת ASCII). כדי לשמור תו, הוא שומר בזיכרון את המספר הסידורי של התו הזה בטבלה. יש לקומפיילר טבלה של 256 תווים אפשריים (טבלת ASCII). כדי לשמור תו, הוא שומר בזיכרון את המספר הסידורי של התו הזה בטבלה. כל תו נשמר בתא ("בית") בודד. כל תו נשמר בתא ("בית") בודד. למשל האותיות 'A’-’Z’ נמצאות לפי הסדר במקומות 65-90, למשל האותיות 'A’-’Z’ נמצאות לפי הסדר במקומות 65-90, האותיות 'a’-’z’ לפי הסדר במקומות 97-122, והספרות '0'-'9' לפי הסדר במקומות 48-57 בטבלה. גם רווח ו- ‘\n’ הם תווים (במקומות 32 ו-10 בטבלה). האותיות 'a’-’z’ לפי הסדר במקומות 97-122, והספרות '0'-'9' לפי הסדר במקומות 48-57 בטבלה. גם רווח ו- ‘\n’ הם תווים (במקומות 32 ו-10 בטבלה). char c=‘A’; מתורגם ע"י הקומפיילר ל- char c=65; char c=‘A’; מתורגם ע"י הקומפיילר ל- char c=65;

6 תזכורת: תווים מיוצגים כמספרים - דוגמא #include<stdio.h> int main() { char i = ‘A'; printf(“i as a character is: %c\n", i); printf("i as an integer is: %d\n", i); printf("The character after %c is: %c\n", i, i+1); return 0; } i as a character is: A i as an integer is: 65 The character after A is: B זה כמו char i=65; פורמט ההדפסה קובע אם להדפיס כתו או כמספר

7 שאלות נוספות על השיעור הקודם?

8 עוד על משתנים כמה נקודות לגבי scanf כמה נקודות לגבי scanf רישום מקוצר של פעולות חשבון רישום מקוצר של פעולות חשבון עוד על יצוג משתנים במחשב עוד על יצוג משתנים במחשב עוד על טיפוסי משתנים עוד על טיפוסי משתנים

9 scanf כמה נקודות נוספות לגבי מה שמופיע בין המרכאות ב - scanf הוא מה ש - scanf מצפה לקרוא. מה שמופיע בין המרכאות ב - scanf הוא מה ש - scanf מצפה לקרוא. אפשר למשל לרשום scanf(“%d,%d”); ואז המחשב יצפה לשני מספרים מופרדים ע"י פסיק. אפשר למשל לרשום scanf(“%d,%d”); ואז המחשב יצפה לשני מספרים מופרדים ע"י פסיק. כשקולטים מספרים, המחשב מצפה לרווח או ירידת שורה ביניהם ויודע לדלג על רווחים וירידות שורה ולקרוא את המספר הבא. כשקולטים תו, אם נקליד רווח התו שיקלט הוא תו הרווח. כשקולטים מספרים, המחשב מצפה לרווח או ירידת שורה ביניהם ויודע לדלג על רווחים וירידות שורה ולקרוא את המספר הבא. כשקולטים תו, אם נקליד רווח התו שיקלט הוא תו הרווח.

10 דוגמאות לקלט תקין scanf(“%d,%d”, &i,&j); 12, 34 scanf(“%d,%d”, &i,&j); 12, 34 scanf(“%d%d”, &i,&j); 12 34 scanf(“%d%d”, &i,&j); 12 34 scanf(“%c%c”, &tav1, &tav2); ab scanf(“%c%c”, &tav1, &tav2); ab

11 scanf עוד תכונה של אם מקלידים יותר קלט ממה שהפונקציה ציפתה לו, אז המשך הקלט יקרא ע"י פקודת ה- scanf הבאה. אם מקלידים יותר קלט ממה שהפונקציה ציפתה לו, אז המשך הקלט יקרא ע"י פקודת ה- scanf הבאה. scanf(“%d”, &i); 12 34 scanf(“%d”, &i); 12 34 scanf(“%d”, &j); scanf(“%d”, &j); לכן אם נקיש Enter בין שתי פקודות קלט של תווים, התו השני שיקרא הוא תו ירידת-השורה ('\n'). לכן אם נקיש Enter בין שתי פקודות קלט של תווים, התו השני שיקרא הוא תו ירידת-השורה ('\n'). scanf(“%c”, &tav1); a scanf(“%c”, &tav1); a scanf(“%c”, &tav2); scanf(“%c”, &tav2); עכשיו tav1 מכיל ‘a’ ו- tav2 מכיל ‘\n’ (לא נוכל להכניס תו נוסף). עכשיו tav1 מכיל ‘a’ ו- tav2 מכיל ‘\n’ (לא נוכל להכניס תו נוסף).

12 scanf עוד תכונה של אז אם רוצים לקלוט כמה תווים רצופים, אפשר לכתוב את הכל בשורה אחת ורק אחריה להקיש Enter: אז אם רוצים לקלוט כמה תווים רצופים, אפשר לכתוב את הכל בשורה אחת ורק אחריה להקיש Enter: scanf(“%c”, &tav1); ab scanf(“%c”, &tav1); ab scanf(“%c”, &tav2); scanf(“%c”, &tav2); או לחליפין לגרום ל-scanf לדלג על ירידת-השורה: או לחליפין לגרום ל-scanf לדלג על ירידת-השורה: scanf(“%c”, &tav1); a scanf(“%c”, &tav1); a scanf(“\n%c”, &tav2); b scanf(“\n%c”, &tav2); b עכשיו tav1 מכיל ‘a’ ו- tav2 מכיל ‘b’. עכשיו tav1 מכיל ‘a’ ו- tav2 מכיל ‘b’.

13 אפשרות נוספת לקלט/פלט של תווים יש שתי פונקציות נוספות לקלט/פלט של תווים שכדאי להכיר: getchar, putchar. יש שתי פונקציות נוספות לקלט/פלט של תווים שכדאי להכיר: getchar, putchar. עבור משתנה char c, השימוש בהן שקול לשימוש ב- printf ו-scanf. עבור משתנה char c, השימוש בהן שקול לשימוש ב- printf ו-scanf. putchar(c); שקול ל- printf(“%c”,c);. putchar(c); שקול ל- printf(“%c”,c);. c=getchar(); שקול ל- scanf(“%c”,&c);. c=getchar(); שקול ל- scanf(“%c”,&c);.

14 כתיבה מקוצרת של פעולות חשבון אם משנים ערך של משתנה ע"י פעולה על הערך הקודם שהיה בו אז אפשר לכתוב את זה בקיצור: אם משנים ערך של משתנה ע"י פעולה על הערך הקודם שהיה בו אז אפשר לכתוב את זה בקיצור: במקום: במקום:a=a+5; אפשר לכתוב: אפשר לכתוב: a+=5; a+=5; כך גם לגבי *, -, /, % לדוגמא: כך גם לגבי *, -, /, % לדוגמא: i*=2; b-=10; c%=5; d/=3;

15 כתיבה מקוצרת של פעולות הגדלת הערך של משתנה ב-1: במקום לרשום i=i+1; או i+=1; אפשר לרשום עוד יותר בקיצור: במקום לרשום i=i+1; או i+=1; אפשר לרשום עוד יותר בקיצור:i++;או:++i; ההבדל בין שתי האפשרויות: ההבדל בין שתי האפשרויות: בפעולה j=i++; קודם מתבצעת ההשמה ורק אחריה ההגדלה ב-1. אם לפני הפעולה i הכיל 5 אז בסופה i יכיל 6 ו- j יכיל 5.בפעולה j=i++; קודם מתבצעת ההשמה ורק אחריה ההגדלה ב-1. אם לפני הפעולה i הכיל 5 אז בסופה i יכיל 6 ו- j יכיל 5. בפעולה j=++i; קודם מתבצעת ההגדלה ב-1 ורק אחריה ההשמה. אם לפני הפעולה i הכיל 5 אז בסופה i ו- j יכילו 6.בפעולה j=++i; קודם מתבצעת ההגדלה ב-1 ורק אחריה ההשמה. אם לפני הפעולה i הכיל 5 אז בסופה i ו- j יכילו 6.

16 כתיבה מקוצרת של פעולות הקטנת ערך משתנה ב-1 יכולה להיעשות באופן דומה, על-ידי: הקטנת ערך משתנה ב-1 יכולה להיעשות באופן דומה, על-ידי:i--;או:--i;

17 קצת על יצוג ערכי משתנים במחשב 0001000100 ??? ???10001001110 01000101001

18 קצת על יצוג מספרים במחשב מספרים מיוצגים במחשב ביצוג בינארי ("בסיס 2"), כלומר רק ע"י אפסים ואחדות (יש זרם/אין זרם). מספרים מיוצגים במחשב ביצוג בינארי ("בסיס 2"), כלומר רק ע"י אפסים ואחדות (יש זרם/אין זרם). היצוג הרגיל של מספרים הוא בבסיס 10 (ספרות 0-9). היצוג הרגיל של מספרים הוא בבסיס 10 (ספרות 0-9). במספר בסיס 10, הספרה הימנית ביותר מייצגת אחדות, הסיפרה הבאה מייצגת עשרות, הספרה הבאה מאות, וכן הלאה. למשל: 75698 במספר בסיס 10, הספרה הימנית ביותר מייצגת אחדות, הסיפרה הבאה מייצגת עשרות, הספרה הבאה מאות, וכן הלאה. למשל: 75698 בבסיס 2 יש רק שתי ספרות: 0 ו-1. הספרה הכי ימנית מייצגת אחדות, הספרה הבאה מייצגת כפולות של 2, הספרה הבאה כפולות של 4, וכן הלאה. למשל: 101110 בבסיס 2 יש רק שתי ספרות: 0 ו-1. הספרה הכי ימנית מייצגת אחדות, הספרה הבאה מייצגת כפולות של 2, הספרה הבאה כפולות של 4, וכן הלאה. למשל: 101110

19 יצוג בינארי - דוגמאות המספר 0 בבסיס 2 הוא 0 בבסיס 10. המספר 0 בבסיס 2 הוא 0 בבסיס 10. המספר 1 בבסיס 2 הוא 1 בבסיס 10. המספר 1 בבסיס 2 הוא 1 בבסיס 10. המספר 10 בבסיס 2 הוא 2 בבסיס 10: המספר 10 בבסיס 2 הוא 2 בבסיס 10: 0*1+1*2=2 המספר 11 בבסיס 2 הוא 3 בבסיס 10: המספר 11 בבסיס 2 הוא 3 בבסיס 10: 1*1+1*2=3 המספר 111 בבסיס 2 הוא 7 בבסיס 10: המספר 111 בבסיס 2 הוא 7 בבסיס 10: 1*1+1*2+1*4=7

20 יצוג מספרים במחשב – יצוג בינארי ספרה בינארית בודדת (0 או 1) נקראת גם "ביט". ספרה בינארית בודדת (0 או 1) נקראת גם "ביט". שמיניית ביטים נקראת גם "בייט" או "בית". שמיניית ביטים נקראת גם "בייט" או "בית". בבית אחד אפשר לייצג ערכים בין 0 ל- 255. בבית אחד אפשר לייצג ערכים בין 0 ל- 255. משתנה מסוג char תופס בית אחד בזיכרון. משתנה מסוג char תופס בית אחד בזיכרון. int ו- float משתמשים ברוב הקומפיילרים והמחשבים ב-4 בתים. int ו- float משתמשים ברוב הקומפיילרים והמחשבים ב-4 בתים. double משתמש ברוב הקומפיילרים והמחשבים ב-8 בתים. double משתמש ברוב הקומפיילרים והמחשבים ב-8 בתים.

21 עוד על יצוג בינארי הסימן של מספר (שלילי/חיובי) נקבע ע"י הביט הראשון במקום שהוקצה לו בזיכרון (1 – שלילי, 0 - חיובי). הסימן של מספר (שלילי/חיובי) נקבע ע"י הביט הראשון במקום שהוקצה לו בזיכרון (1 – שלילי, 0 - חיובי). עבור שלמים זה באמצעות שיטת "משלים ל-2", שלא נפרט לגביה.עבור שלמים זה באמצעות שיטת "משלים ל-2", שלא נפרט לגביה. מספר ממשי מיוצג למעשה ע"י שני מספרים שלמים: מספר אחד מורכב מהספרות הראשונות שלו שאינן אפס, והמספר השני הוא המיקום שלהן אחרי/לפני הנקודה. מספר ממשי מיוצג למעשה ע"י שני מספרים שלמים: מספר אחד מורכב מהספרות הראשונות שלו שאינן אפס, והמספר השני הוא המיקום שלהן אחרי/לפני הנקודה. כששומרים בזיכרון תו, למעשה נשמר מספר בין 0 ל-255 שמייצג אותו. כששומרים בזיכרון תו, למעשה נשמר מספר בין 0 ל-255 שמייצג אותו.

22 משתנים ללא סימן אם משתנה שלם ישמש בודאות למספרים חיוביים בלבד, ניתן לרשום לפני ההגדרה שלו unsigned. אם משתנה שלם ישמש בודאות למספרים חיוביים בלבד, ניתן לרשום לפני ההגדרה שלו unsigned. זה מגדיל את הטווח האפשרי שלו פי 2. זה מגדיל את הטווח האפשרי שלו פי 2. unsigned int i=3999999999; unsigned int i=3999999999; ההדפסה נעשית עם %u. כשעובדים עם משתנה ללא סימן יש להקפיד כמובן להכניס לתוכו רק ערכים חיוביים. כשעובדים עם משתנה ללא סימן יש להקפיד כמובן להכניס לתוכו רק ערכים חיוביים.

23 כמה טיפוסים בסיסיים נוספים long – מספר שלם, בחלק מהקומפיילרים והמחשבים הטווח שלו גדול יותר מ- int. long – מספר שלם, בחלק מהקומפיילרים והמחשבים הטווח שלו גדול יותר מ- int. short – מספר שלם. ברוב הקומפיילרים והמחשבים הטווח שלו קטן יותר מ-int, בדרך-כלל בין 2 15 - לבין 2 15. מאפשר לחסוך זיכרון כשעובדים עם מספרים קטנים. short – מספר שלם. ברוב הקומפיילרים והמחשבים הטווח שלו קטן יותר מ-int, בדרך-כלל בין 2 15 - לבין 2 15. מאפשר לחסוך זיכרון כשעובדים עם מספרים קטנים. long double – מספר ממשי עם דיוק וטווח גדולים יותר (בתלות במחשב ובקומפיילר). long double – מספר ממשי עם דיוק וטווח גדולים יותר (בתלות במחשב ובקומפיילר). השימוש בטיפוסים אלה פחות נפוץ. השימוש בטיפוסים אלה פחות נפוץ.

24 משתנים קבועים לפעמים נירצה לשים במשתנה ערך קבוע (למשל פאי) שלא ישתנה במהלך התוכנית. לפעמים נירצה לשים במשתנה ערך קבוע (למשל פאי) שלא ישתנה במהלך התוכנית. נירצה לעשות זאת פשוט כדי להקל על הכתיבה: במקום לרשום כל פעם את הערך המספרי נוכל לרשום את שם המשתנה. נירצה לעשות זאת פשוט כדי להקל על הכתיבה: במקום לרשום כל פעם את הערך המספרי נוכל לרשום את שם המשתנה. במקרה כזה כדאי לציין שהערך לא יכול להשתנות ע"י המילה const. למשל: במקרה כזה כדאי לציין שהערך לא יכול להשתנות ע"י המילה const. למשל: const double pi=3.141592654; זה מונע מאיתנו לשנות את הערך בטעות (בתוכנית מורכבת עשויים להיות הרבה קבועים מוזרים). זה מונע מאיתנו לשנות את הערך בטעות (בתוכנית מורכבת עשויים להיות הרבה קבועים מוזרים).

25 בקרת זרימה

26 מה זאת בקרת זרימה? באופן רגיל התוכנית מתבצעת שורה-אחרי-שורה לפי הסדר ("זרימה רגילה"). באופן רגיל התוכנית מתבצעת שורה-אחרי-שורה לפי הסדר ("זרימה רגילה"). במקרים רבים, נירצה שהפקודות שיבוצעו יקבעו לפי הקלט שהתוכנית קיבלה (וחישובים שהיא ביצעה), בשונה מהביצוע הסדרתי הרגיל. במקרים רבים, נירצה שהפקודות שיבוצעו יקבעו לפי הקלט שהתוכנית קיבלה (וחישובים שהיא ביצעה), בשונה מהביצוע הסדרתי הרגיל. למשל, נירצה לטפל בצורה שונה בקלט שגוי. למשל, נירצה לטפל בצורה שונה בקלט שגוי. לשם כך יש פקודות שמאפשרות לקבוע מה יבוצע בהתאם לתנאים שנבחר. לשם כך יש פקודות שמאפשרות לקבוע מה יבוצע בהתאם לתנאים שנבחר.

27 בקרת זרימה – נושאים משפטי if-else. משפטי if-else. תנאים אפשריים. תנאים אפשריים. שילוב של תנאים. שילוב של תנאים. משפטי switch. משפטי switch.

28 if משפט מאפשר לבצע פקודה (או קבוצה של פקודות) בתלות בקיום של תנאי מסויים. מאפשר לבצע פקודה (או קבוצה של פקודות) בתלות בקיום של תנאי מסויים. המבנה: המבנה: if ( תנאי ) פקודה ; למשל: למשל: if (i % 2 == 0) printf (“i is even”); printf (“i is even”);

29 בקרת זרימה - דוגמא הדפסת המספר המקסימלי מבין שני מספרים שנקלטים #include #include int main() { int a, b, max; scanf(“%d%d”, &a, &b); max = a; if (max < b) max = b; printf(“The maximum is %d\n”, max); return 0; } max < bהפקודה הבאה מתבצעת רק אם

30 איזה תנאים אפשר לבטא == בודק שיוויון (הסימן = כבר משמש להשמה) יש פעולות השוואה רגילות:, =. =! בודק שוני (ההיפך משיוויון). למשל: if (a!=b) printf(“You entered the wrong number\n”); printf(“You entered the wrong number\n”);

31 - המשךif משפט - המשךif משפט אפשר גם להתנות ביצוע של קבוצת פקודות, על- ידי כתיבתן בתוך סוגריים מסולסלים ("בלוק"): אפשר גם להתנות ביצוע של קבוצת פקודות, על- ידי כתיבתן בתוך סוגריים מסולסלים ("בלוק"): if ((תנאי {פקודות}

32 if-else משפט אחרי משפט if ניתן לציין גם פקודה (או קבוצת פקודות) שתתבצע במקרה שהתנאי לא מתקיים. המבנה: אחרי משפט if ניתן לציין גם פקודה (או קבוצת פקודות) שתתבצע במקרה שהתנאי לא מתקיים. המבנה: if (תנאי) פקודה ; else פקודה; else פקודה; if (i % 2 == 0) printf (“i is even”); למשל: else printf(“i is odd”);

33 if-else משפט שוב, עבור קבוצה של פקודות, נשתמש בסוגריים מסולסלים. שוב, עבור קבוצה של פקודות, נשתמש בסוגריים מסולסלים.else{פקודות}

34 דוגמא: בדיקה אם מספר הוא זוגי # include int main() { int num; printf(“Enter an integer for checking parity\n”); scanf(“%d”, &num); if (num %2 == 0) printf(“This number is even\n”); else printf(“This number is odd\n”); return 0; }

35 תנאים אפשריים: שילוב של תנאים לפעמים נירצה לבדוק תנאי מורכב יותר, למשל ציון צריך להיות לפחות 0 וגם לכל היותר 100. לפעמים נירצה לבדוק תנאי מורכב יותר, למשל ציון צריך להיות לפחות 0 וגם לכל היותר 100. כדי לבדוק אם הערך שנמצא במשתנה grade הוא ציון חוקי אפשר לרשום שני if-ים "מקוננים": כדי לבדוק אם הערך שנמצא במשתנה grade הוא ציון חוקי אפשר לרשום שני if-ים "מקוננים": if (grade >= 0) if (grade <= 100) if (grade <= 100) printf(“The grade is in the right range\n”);

36 שילוב תנאים - פעולות לוגיות בהרבה מקרים נוח להשתמש בפעולות לוגיות, שיכולות לשלב שני תנאים. יש 3 פעולות לוגיות: AND, OR, NOT. בהרבה מקרים נוח להשתמש בפעולות לוגיות, שיכולות לשלב שני תנאים. יש 3 פעולות לוגיות: AND, OR, NOT. && - AND (וגם) – דורש ששני התנאים יתקיימו. && - AND (וגם) – דורש ששני התנאים יתקיימו. למשל אפשר לרשום: if ((grade >= 0) && (grade = 0) && (grade <= 100))במקום: if (grade >= 0) if (grade >= 0) if (grade <= 100) if (grade <= 100)

37 פעולות לוגיות - דוגמא #include #include int main() int main() { double exam, exercises, final; printf(“Enter your exam grade and exercises grade”); scanf(“%lf %lf”, &exam, &exercises); if ((exam >= 60) && (exercises >= 60)) { final = 0.9 * exam + 0.1 * exercises; final = 0.9 * exam + 0.1 * exercises; printf(“You passed – your grade is %g \n”, final); printf(“You passed – your grade is %g \n”, final);}else{ final = exam; final = exam; printf(“You failed – your grade is %g \n”, final); printf(“You failed – your grade is %g \n”, final);} return 0; } מניחים כאן שהקלט תקין. בדרך-כלל דווקא נירצה לבדוק את תקינות הקלט ולפעול אחרת אם הקלט לא תקין (למשל לתת הודעה למשתמש ולסיים). תוכנית לחישוב ציון סופי בקורס

38 שילוב תנאים - פעולות לוגיות נוספות || - OR (או) - דורש שלפחות אחד התנאים יתקיים. || - OR (או) - דורש שלפחות אחד התנאים יתקיים. למשל, התנאי הבא יתקיים תמיד: if ((a>0) || (a 0) || (a<=0)) ! - NOT (שלילה) - דורש שהתנאי לא יתקיים. ! - NOT (שלילה) - דורש שהתנאי לא יתקיים. למשל, התנאי הבא יתקיים תמיד: if (! (a != a)) סדר הקדימות הוא: NOT, AND, OR (NOT יבוצע ראשון). סדר הקדימות הוא: NOT, AND, OR (NOT יבוצע ראשון).

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

40 תנאים - המשך מה המשמעות של if (a) ? מה המשמעות של if (a) ? if (a!=0) בדיוק כמו כשרושמים פקודת השמה, מתקבל ערך ששווה לערך כשרושמים פקודת השמה, מתקבל ערך ששווה לערך ששמנו במשתנה. לכן הערך של (a=5) הוא 5. ששמנו במשתנה. לכן הערך של (a=5) הוא 5. לכן צריך להיזהר ולא לרשום = במקום == לכן צריך להיזהר ולא לרשום = במקום == אז מבחינת המחשב רשמנו תנאי שתמיד מתקיים מה המשמעות של if (a=5) ? מה המשמעות של if (a=5) ?

41 פעולות לוגיות – עוד על סדר הביצוע הפעולות האריתמטיות (+, -, *, /, %) מבוצעות תמיד לפני פעולות ההשוואה (==, > וכו') שמבוצעות לפני הפעולות הלוגיות && ו- ||. הפעולות האריתמטיות (+, -, *, /, %) מבוצעות תמיד לפני פעולות ההשוואה (==, > וכו') שמבוצעות לפני הפעולות הלוגיות && ו- ||. ל- ! (NOT) יש את הקדימות הגבוהה ביותר (עוד לפני פעולות אריתמטיות). ל- ! (NOT) יש את הקדימות הגבוהה ביותר (עוד לפני פעולות אריתמטיות). דוגמאות שתוצאתן היא "נכון": דוגמאות שתוצאתן היא "נכון": (5+4>8) (5+4>8) (!1 >= 0||1) (!1 >= 0||1) 0 >= 0 || 11 || 11 (כאמור, המחשב מתייחס למספר 1 כאל "תנאי נכון" ולמספר 0 כאל "תנאי לא נכון", וכך אפשר לבצע פעולות לוגיות גם על מספרים במקום על תנאים)

42 בחירה בין יותר משני מצבים כשיש בחירה בין מצבים רבים אפשר לרשום: כשיש בחירה בין מצבים רבים אפשר לרשום: if (תנאי) פקודה else if (תנאי) פקודה פקודה else if (תנאי) else if (תנאי) פקודה פקודה else else פקודה פקודה (ובמקום פקודה יכול להיות כמובן בלוק של פקודות)

43 בחירה בין יותר משני מצבים ה-else –ים מתייחסים ל- if-ים לפי סדר קירבה (מה- elseאחורה). למשל: ה-else –ים מתייחסים ל- if-ים לפי סדר קירבה (מה- elseאחורה). למשל: if (תנאי) פקודה else if (תנאי) if (תנאי) if (תנאי) פקודה פקודה else else פקודה פקודה else else פקודה פקודה הריווח עוזר לקריאות

44 בחירה בין יותר משני מצבים - דוגמא if (grade >= 90) printf(“A\n”);else if (grade >= 80) printf(“B\n”);else if (grade >= 70) printf(“C\n”);elseprintf(“Failed\n”); תרגום לציון אמריקאי

45 SWITCH בחירה בין יותר משני מצבים - אם התנאים הם השוואה לערכים קבועים מסויימים, אפשר להשתמש בפקודה נוחה יותר, במקום הרבה if-else-ים. אם התנאים הם השוואה לערכים קבועים מסויימים, אפשר להשתמש בפקודה נוחה יותר, במקום הרבה if-else-ים. בשקף הבא נדגים שימוש בפקודת switch, ולאחר מכן נתאר את חלקיה השונים. בשקף הבא נדגים שימוש בפקודת switch, ולאחר מכן נתאר את חלקיה השונים.

46 - דוגמאswitch - דוגמאswitch char grade; scanf(“%c”, &grade); switch (grade) { case ‘A’: printf(“90 – 100\n”); break; case ‘B’: printf(“80 – 89\n”); break; case ‘C’: printf(“70 -79\n”); break;default:printf(“Failed\n”);} מה עושה קטע התוכנית הזה? מתרגם ציון אמריקאי לטווח מספרים

47 - דוגמא: תרגום ציון אמריקאיswitch - דוגמא: תרגום ציון אמריקאיswitch char grade; scanf(“%c”, &grade); switch (grade) { case ‘A’: printf(“90 – 100\n”); break; case ‘B’: printf(“80 – 89\n”); break; case ‘C’: printf(“70 -79\n”); break;default:printf(“Failed\n”);} הביטוי שערכו נבדק – הוא יכול להיות כל ביטוי מטיפוס בדיד (תו או מספר שלם).

48 - דוגמא: תרגום ציון אמריקאיswitch - דוגמא: תרגום ציון אמריקאיswitch char grade; scanf(“%c”, &grade); switch (grade) { case ‘A’: printf(“90 – 100\n”); break; case ‘B’: printf(“80 – 89\n”); break; case ‘C’: printf(“70 -79\n”); break;default:printf(“Failed\n”);} הביטוי שערכו נבדק – הוא יכול להיות כל ביטוי מטיפוס בדיד (תו או מספר שלם). הבדיקה היא אם הביטוי הנ"ל שווה לאחד מהקבועים הרשומים (לפי הסדר)

49 - דוגמא: תרגום ציון אמריקאיswitch - דוגמא: תרגום ציון אמריקאיswitch char grade; scanf(“%c”, &grade); switch (grade) { case ‘A’: printf(“90 – 100\n”); break; case ‘B’: printf(“80 – 89\n”); break; case ‘C’: printf(“70 -79\n”); break;default:printf(“Failed\n”);} הביטוי שערכו נבדק – הוא יכול להיות כל ביטוי מטיפוס בדיד (תו או מספר שלם). הבדיקה היא אם הביטוי הנ"ל שווה לאחד מהקבועים הרשומים (לפי הסדר) אם נמצא שוויון, כל הפקודות משם והלאה מבוצעות (אפשריים גם בלוקים של פקודות)

50 - דוגמא: תרגום ציון אמריקאיswitch - דוגמא: תרגום ציון אמריקאיswitch char grade; scanf(“%c”, &grade); switch (grade) { case ‘A’: printf(“90 – 100\n”); break; case ‘B’: printf(“80 – 89\n”); break; case ‘C’: printf(“70 -79\n”); break;default:printf(“Failed\n”);} הביטוי שערכו נבדק – הוא יכול להיות כל ביטוי מטיפוס בדיד (תו או מספר שלם). הבדיקה היא אם הביטוי הנ"ל שווה לאחד מהקבועים הרשומים (לפי הסדר) אם נמצא שוויון, כל הפקודות משם והלאה מבוצעות (אפשריים גם בלוקים של פקודות) הפקודה הזו אומרת לא לבצע את הפקודות שמופיעות במקרים הבאים

51 - דוגמא: תרגום ציון אמריקאיswitch - דוגמא: תרגום ציון אמריקאיswitch char grade; scanf(“%c”, &grade); switch (grade) { case ‘A’: printf(“90 – 100\n”); break; case ‘B’: printf(“80 – 89\n”); break; case ‘C’: printf(“70 -79\n”); break;default:printf(“Failed\n”);} הביטוי שערכו נבדק – הוא יכול להיות כל ביטוי מטיפוס בדיד (תו או מספר שלם). הבדיקה היא אם הביטוי הנ"ל שווה לאחד מהקבועים הרשומים (לפי הסדר) אם נמצא שוויון, כל הפקודות משם והלאה מבוצעות (אפשריים גם בלוקים של פקודות) הפקודה הזו אומרת לא לבצע את הפקודות שמופיעות במקרים הבאים מבוצע אם לא נמצאה אף התאמה (זה חלק אופציונלי – לא חייבים לתת ברירת מחדל)

52 switch מבנה כללי של switch (ביטוי בדיד) { case קבוע1: פקודה או פקודות פקודה או פקודות break; (אופציונלי) case קבוע2 : פקודה או פקודות break; (אופציונלי) ….. default: (אופציונלי) פקודה או פקודות } בדיד – תוצאתו היא מס' שלם או תו

53 switch מבנה כללי של לא נשתמש ב- break כשנירצה לעשות אותו דבר בכמה מקרים. לדוגמא: לא נשתמש ב- break כשנירצה לעשות אותו דבר בכמה מקרים. לדוגמא: switch (tav) { case ‘0’: case ‘1’: case ‘2’: case ‘3’: case ‘4’: case ‘5’: case ‘6’: case ‘7’: case ‘8’: case ‘9’: printf(“It’s a digit\n”); printf(“It’s a digit\n”); break; break;default: printf(“It’s not a digit\n”); printf(“It’s not a digit\n”);} השורה תבוצע אם התו הוא סיפרה בכל מיקרה אחר

54 נקודה לתשומת לב כיוון ש- if, else, switch, case, default, ו- break הן פקודות C, לא ניתן להשתמש בהן כשמות של משתנים. כיוון ש- if, else, switch, case, default, ו- break הן פקודות C, לא ניתן להשתמש בהן כשמות של משתנים. מילים כאלה נקראות מילים שמורות, ונפגוש עוד כאלה בעתיד (שמות של פקודות שנילמד לא יוכלו לשמש כשמות של משתנים). מילים כאלה נקראות מילים שמורות, ונפגוש עוד כאלה בעתיד (שמות של פקודות שנילמד לא יוכלו לשמש כשמות של משתנים).

55 סיכום דיברנו היום על: מהי בקרת זרימה משפטי if-else תנאים לוגיים פעולות לוגיות פקודת switch


Download ppt "Www.cs.tau.ac.il/courses/cs4math/09b מבוא כללי למדעי המחשב שיעור שלישי: בקרת זרימה."

Similar presentations


Ads by Google