1 / 46

מבני בקרה

מבני בקרה. מבני דו-ברירה לולאות מבני רב-ברירה. הוכן ע"י ד"ר דני קוטלר, המכללה האקדמית תל-חי. תפקידם של מבני בקרה. טיפול במצבים לא צפויים מראש חזרה על אותה פעולה מספר רב של פעמים בקרה על מצב המשתנים של התוכנית. סוגים של מבני בקרה. צומת: if if-else אופרטור התנאי לולאה: while for

Download Presentation

מבני בקרה

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. מבני בקרה מבני דו-ברירה לולאות מבני רב-ברירה הוכן ע"י ד"ר דני קוטלר, המכללה האקדמית תל-חי מבוא למדעי המחשב - שיעור 5

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

  3. סוגים של מבני בקרה • צומת: • if • if-else • אופרטור התנאי • לולאה: • while • for • do-while • צומת רב-ברירה: • switch-case מבוא למדעי המחשב - שיעור 5

  4. שיערוך • שיערוך – קביעת הערך המספרי של תנאי • דוגמאות: • while (i < 0) • if(isspace(c)) • המחשב מזהה את קיום התנאי לפי ערכו המספרי: • 0 : התנאי לא מתקיים • : התנאי מתקיים • ערך התנאי נקבע ע"י אופרטור תנאי או ערך מוחזר של פונקציה • לכל אופרטור תנאי יש כלל שיערוך מבוא למדעי המחשב - שיעור 5

  5. אופרטורי יחס • בודקים את היחס בין שני ביטויים מספריים • האופרטורים <, >, ,  • לביטוי expression1 < expression2 יהיה ערך: • 1 אם ערך הביטוי expression1 קטן משל expression2 • 0 אחרת • כנ"ל לגבי שאר האופרטורים מבוא למדעי המחשב - שיעור 5

  6. אופרטורי שוויון • בודקים שוויון בין שני ביטויים מספריים • האופרטורים ==, != • ערך הביטוי expression1 == expression2 • 1 אם ערך הביטוי expression1 שווה לשל expression2 • 0 אחרת • ערך הביטוי expression1 != expression2 • 1 אם ערך הביטוי expression1שונה משל expression2 • 0 אחרת מבוא למדעי המחשב - שיעור 5

  7. אופרטורים לוגיים • משמשים ליצירת ביטוי מורכב • האופרטור ||(או): expression1 || expression2 • 0 אם שיערוך שני הביטויים הוא 0 • 1 אחרת • האופרטור && (וגם): expression1 && expression2 • 1 אם שיערוך שני הביטויים שונה מ 0 • 0 אחרת • האופרטור ! (לא): !expression1 • 1 אם השיערוך של expression1הוא 0 • 0 אם השיערוך של expression1שונה מ 0 מבוא למדעי המחשב - שיעור 5

  8. דוגמה: is_alpha intis_alpha(char c) { return (‘a’<=c && c<=‘z’ || ‘A’<=c && c<=‘Z’); } && קודם ל || מבוא למדעי המחשב - שיעור 5

  9. דוגמה: האם המספר זוגי? intis_even(int n) { return !(n%2) ; } מבוא למדעי המחשב - שיעור 5

  10. פונקציה בוליאנית • שתי הדוגמאות האחרונות הן דוגמאות לפונקציות בוליאניות. • פונקציה בוליאנית היאפונקציה שמחזירה שני ערכים אפשריים • פונקציה בוליאנית נותנת תשובה לשאלה: האם תנאי או תכונה מסוימת מתקיימים? • הערכים המוחזרים האפשריים יהיו 0 או 1 (לפעמים, במקום 1, יוחזר ערך אחר השונה מ – 0) George Bool 1815 - 1864 מבוא למדעי המחשב - שיעור 4

  11. האם n ריבוע שלם? #define TRUE 1 #define FALSE 0 intissquare(unsigned n) { int i = 0; while(i*i < n) i++; if(i*i == n) returnTRUE; returnFALSE; } הגדרת קבועים בוליאניים משפרת את בהירות התוכנית אופרטור יחס אופרטור השואה מבוא למדעי המחשב - שיעור 5

  12. אופרטור התנאי ?: • במקרים מסויימים מאפשר לכתוב if-else בצורה מקוצרת • סינטקס : • ערך הביטוי הוא • expression2 - אם expression1 !=0 • expression3 - אם expression1 ==0 הביטוי המשוערך ערכים אפשריים expression1 ? expression2 : expression3 מבוא למדעי המחשב - שיעור 5

  13. דוגמה: פונקציה max int max(int a, int b) } return a>b ? a : b; { רווח אינו הכרחי מבוא למדעי המחשב - שיעור 5

  14. אפשר לקבץ כמה פקודות: #include<stdio.h> intis_even(intn) { return!(n%2) ; { // counts even and odd numbers int main() } intnum, even_count=0, odd_count=0; printf("enter positive integers (0 to stop): "); scanf("%d", &num); while(num>0) } is_even(num)?even_count++, printf("even\n"):(odd_count++, printf("odd\n")); scanf("%d",&num); { printf("%d even, %d odd, total: %d\n", even_count, odd_count, even_count+odd_count); return0; } שתי פקודות פסיק יש לשים סוגריים מבוא למדעי המחשב - שיעור 5

  15. דוגמה: הדפסת מספרים אקראיים /* random_numbers.c*/ #include<stdio.h> #include<stdlib.h> #define MAX_NUMS 100 /* number of random numbers to print */ int main() } inti = 0; /* loop counter */ printf("%d random numbers between 0 and %d:\n", MAX_NUMS, RAND_MAX); /* in stdlib.h */ while(i++ < MAX_NUMS) printf(i%10!=0?"%7d":"%7d\n", rand()); printf("\n"); return0; { 10 מספרים בשורה מבוא למדעי המחשב - שיעור 5

  16. לולאת for ביטוי אתחול ביטוי תנאי ביטוי עידכון • סינטקס: • אתחול - מתרחש פעם אחת לפני המעבר הראשון בלולאה • תנאי - תנאי הכניסה ללולאה • עידכון - מתבצע בסוף כל מעבר בלולאה for (expression1 ; expression2 ; expression3) { commands } פקודה או מספר פקודות מבוא למדעי המחשב - שיעור 5

  17. לולאת for (המשך) • ביטויי האתחול והעדכון יכולים לכלול כמה פקודות המופרד בפסיק (,). למשל... • האיתחול ו/או העידכון יכולים להיות חסרים. למשל... for (i=0 , j=n ; i<=j ; i++, j--) for ( ; (c=getchar())!=EOF ; ) inti=0; for ( ; i < SIZE; ++i) מבוא למדעי המחשב - שיעור 5

  18. לולאת for (המשך) • לולאות while ו for מבצעות פעולות דומות דוגמה: הלולאות הבאות שקולות i=0; j=n; while (i<=j) { commands i++; j--; } for (i=0 , j=n ; i<=j ; i++, j--) { commands } מבוא למדעי המחשב - שיעור 5

  19. 13 5 מספרים ראשוניים 29 2 11 31 23 7 3 19 • מספר ראשוני (באנגלית: prime) הוא מספר שלם חיובי המתחלק רק בעצמו וב 1 (עם זאת, 1 אינו נחשב למספר ראשוני) • כבר בימי קדם היה ידוע שיש אינסוף מספרים ראשוניים (ההוכחה הראשונה הידועה מיוחסת לאוקלידס) . • מעבר לעניין התאורטי הגדול במספרים ראשוניים, יש להם כיום שימוש נרחב בתורת הקודים ובתורת הצפינה (קריפטולוגיה) אוקלידס 325-265 לפנה"ס מבוא למדעי המחשב - שיעור 5

  20. דוגמה: פונקציה שבודקת אם מספר הוא ראשוני #define FALSE 0 #define TRUE 1 intis_prime(int n) { intdiv; if(n <= 1)/* 1 is not prime */ returnFALSE; for(div=2; div<=n/2; ++div) if(n%div== 0) /* found a divisor */ returnFALSE; /* not a prime */ returnTRUE;/* no divisors found - it's a prime */ } אין מחלקים בין n/2 ל n מבוא למדעי המחשב - שיעור 5

  21. דוגמה: תוכנית שמוצאת מספרים ראשוניים • /* primes_1.c */ • #include<stdio.h> • #defineMAX 10000 • #define FALSE 0 • #define TRUE 1 • intis_prime(int n); • int main() { • intnumber; // the number being checked • intpcount=1; // counts the primes • printf("\nThe primes up to %d are:\n 2", MAX); • for(number=3; number<=MAX; number+=2) • if(is_prime(number) == TRUE){ • ++pcount; /* one more prime was found */ • printf(pcount%10?"%7d":"%7d\n",number); • } • printf("\nTotal: %d primes up to %d\n", pcount, MAX); • return0; • } 2 הוא הראשוני הזוגי היחיד אין צורך לבדוק מספרים זוגיים מבוא למדעי המחשב - שיעור 5

  22. דוגמה: פונקציה יעילה יותר לבדיקת ראשוניות #include<math.h> intis_prime(int n) /* more efficient version */ { intdiv; introot=sqrt(n+1);/* highest divisor to check */ if(n <= 1)/* 1 is not prime */ returnFALSE; if(n == 2) returnTRUE; if(n%2 == 0)/* check if even */ returnFALSE; for(div=3; div<=root; div+=2) if(n%div== 0) return FALSE; returnTRUE; /* no divisor found - it's a prime */ } לא צריך לבדוק התחלקות במספרים זוגיים מבוא למדעי המחשב - שיעור 5

  23. הערות לתוכנית • למה בודקים רק עד ? • נניח ש n=ab, אז או ש a=b= או שלפחות אחד מ a או b קטן מ , כך שמספיק לבדוק עד כדי למצוא מחלק כלשהו של n. מבוא למדעי המחשב - שיעור 5

  24. הערות לתוכנית (המשך) • למה מחשבים ולא ? • הפונקציה sqrt מחזירה תוצאה מטיפוס double. התוצאה הזאת לא מדוייקת והיא עשוייה להיות קטנה במקצת מהשורש האמיתי של n. כאשר מציבים את התוצאה לתוך המשתנה root כל החלק שאחרי הנקודה העשרונית "נקטם" ואז נקבל תוצאה רחוקה מהתוצאה האמיתית. • למשל, אם n=25, sqrt(n) עשויה להחזיר משהו כמו 4.999999 ואז הערך של root יהיה 4 והפונקציה לא תגלה ש 5 הוא מחלק של 25 מבוא למדעי המחשב - שיעור 5

  25. הערות לתוכנית (המשך) • האם אפשר לוותר על המשתנה root ולכתוב במקום זה: for(div=3; div<=sqrt(n+1); div+=2)? • החישוב של sqrt(n+1) הוא חישוב מורכב שנמשך, יחסית, זמן רב. אם הוא יופיע בכותרת הלולאה, הוא יחושב שוב ושוב בכל פעם שהבקרה תחזור לתחילת הלולאה. ע"י הגדרת המשתנה root, החישוב הזה מבוצע רק פעם אחת, בכניסה לפונקציה. מבוא למדעי המחשב - שיעור 5

  26. מתי נשתמש ב while ומתי ב for? • במקרים רבים זה תלוי בטעמו האישי של המתכנת • שיקולים בעד while: • אם העידכון מתבצע בזמן בדיקת התנאי, למשל (c=getchar())!=EOF • אם תנאי הכניסה ללולאה הוא ארוך ומורכב • שיקולים בעד for: • אם יש פקודות איתחולועידכון קצרות וברורות • אם תנאי הכניסה ללולאה קצר מבוא למדעי המחשב - שיעור 5

  27. לולאת do-while • נשתמש בה כאשר מעבר אחד לפחות בלולאה הוא ודאי • סינטקס: do { commands … }while (expression); תנאי הכניסה ללולאה בפעם הבאה מבוא למדעי המחשב - שיעור 5

  28. דוגמה: חישוב ממוצע של מספרים #include<stdio.h> int main() } intcount=0; doublenumber, sum=0; do } scanf("%lf",&number); sum += number; count++; } while(number > 0); printf(count>1?"Average: %g\n":"Noinput.\n", sum/(count-1)); return0; { הקלט חייב לכלול לפחות מספר אחד גם ה 0 נספר הקלדת 0 עוצרת את התוכנית ה 0 אינו חלק מהמספרים מבוא למדעי המחשב - שיעור 5

  29. דוגמה: בדיקה האם המשתמש יודע מהו מספר ראשוני #include<stdio.h> #include<math.h> #define FALSE 0 #define TRUE 1 intis_prime(int n); int main() { intnum; printf("Please enter a prime number greater than 100\n"); do{ printf(“Remember, PRIME and GREATER THAN 100!\n"); scanf("%d", &num); } while(num<100 || !is_prime(num)); printf("VERY GOOD!\n"); return0; } כל עוד המשתמש טועה, הלולאה ממשיכה לרוץ מבוא למדעי המחשב - שיעור 5

  30. Short Circuit Evaluation do{ ... } while(num<100 || !is_prime(num)); אם num<100, האם is_prime(num) עדין יתבצע? while((c=getchar())!=EOF && ++count<N) אם c=EOF, האם ++count עדין יתבצע? מבוא למדעי המחשב - שיעור 5

  31. Short Circuit Evaluation (המשך) • בדיקה של תנאי מורכב נעשית משמאל לימין. • בדיקת התנאים היא חסכונית, כלומר, ברגע שידוע האם התנאי מתקיים או לא, שאר הבדיקות לא מתבצעות. • אם בדיקת התנאי כוללת גם פקודות לביצוע, יתכן שהן לא יתבצעו. מבוא למדעי המחשב - שיעור 5

  32. דוגמה: חישוב ממוצע #include<stdio.h> #define N 5 int main() } intcount=0; doublenumber, sum=0; printf("Enter positive numbers (0 to stop):\n"); do } scanf("%lf",&number); sum += number; } while(number > 0 && ++count<N); printf("Average: %g\n", sum/count); return0; { הקלט ייעצר גם אם יוקלדו יותר מ N מספרים ה 0 לא נספר מה יקרה אם נהפוך את סדר התנאים? מבוא למדעי המחשב - שיעור 5

  33. break • פקודה העוצרת את הלולאה, גם אם תנאי הכניסה ללולאה עדין מתקיים. • סינטקס: כנ"ל עבור לולאות for ו do-while • while (…) • { • if (…) • break; • … • } הלולאה עוצרת בנקודה הזאת מבוא למדעי המחשב - שיעור 5

  34. continue • פקודה שעוצרת את האיטרציה הנוכחית בלולאה. • סינטקס: כנ"ל עבור לולאות for ו do-while • while (…) • { • … • if (…) • continue; • commands • } הפקודות האלה לא מתבצעות במעבר הנוכחי בלולאה מבוא למדעי המחשב - שיעור 5

  35. מציאת ראשוניים (שידור חוזר) /* program: primes_3 */ /* Finds all the primes up to MAX */ #include<stdio.h> #include<math.h> #define MAX 1000000 #define FALSE 0 #define TRUE 1 int main() { int number; /* the number being checked */ intdiv; /* runs over possible divisors of number */ introot; /* root of the number checked for primality */ intpcount=1; /* counts the primes */ intis_prime; /* =TRUE if number is prime */ printf("\nThe primes up to %d are:\n 2", MAX); מבוא למדעי המחשב - שיעור 5

  36. מציאת ראשוניים (שידור חוזר) • for(number=3; number<=MAX; number+=2) • } • root= sqrt(number+1); • for(div=3, is_prime= TRUE; div <=root; div+=2) • if(number%div==0) /* number is not prime */ • } • is_prime=FALSE; • break; • } • if(is_prime==FALSE) • continue; • ++pcount; /* one more prime was found */ • printf(pcount%10?"%7d":"%7d\n", number); • { • printf("\nTotal: %d primes up to %d\n", pcount, MAX); • return0; • { אם נמצא מחלק, אין צורך להמשיך לבדוק אם המספר לא ראשוני, עוברים למספר הבא מבוא למדעי המחשב - שיעור 5

  37. תנאי רב-ברירה: switch-case • ביטוי if-else כולל שתי אפשרויות: • אם התנאי שבסוגריים מתקיים, מבוצעות הפעולות של ה if. • אם התנאי שבסוגריים לא מתקיים, מבוצעות הפעולות של ה else. • ביטוי switch-case מטפל במצבים שבהם יש יותר משתי אפשרויות. מבוא למדעי המחשב - שיעור 5

  38. תנאי רב-ברירה: switch-case ביטוי מספרי בעל ערך שלם • switch(expression) • { • casenum1: • commands1 • break; • casenum2: • commands2 • break; • case … • … • caselast_num: • last_commands • break; • default: • default_commands • } • סינטקס: הערכים השונים ש expression יכול לקבל יבוא תמיד בסוף, עבור המקרים שלא נכללו ב case-ים מבוא למדעי המחשב - שיעור 5

  39. תנאי רב-ברירה - הערות • Expression חייב להיות ביטוי מטיפוס שלם. • המספרים המפורטים ב case-ים חייבים להיות קבועים מספריים שלמים. • אם בסוף הפקודות של caseמסויים לא יופיע break, אז תהיה "גלישה" לפקודות של ה case הבא. כלומר, יבוצעו גם הפקודות של ה caseהבא. • ערך שלא מוזכר ברשימת ה case-ים יטופל בסעיף default. סעיף ה default יכול להיות ריק (default:;) מבוא למדעי המחשב - שיעור 5

  40. דוגמה: ימי השבוע #include<stdio.h> intmain() } intd; printf("enter a number between 1 and 7\n"); scanf("%d", &d); switch(d){ case1: printf("\nSunday\n"); break; case2: printf("\nMonday\n"); break; case3: printf("\nTuesday\n"); break; case 4: printf("\nWednesday \n"); break; ... המשתמש מקליד מספר בין 1 ל 7 והתוכנית מדפיסה את היום המתאים בשבוע case5: printf("\nThursday\n"); break; case6: printf("\nFriday\n"); case7: printf("\nSaturday\n"); break; default: printf("\nWrong input\n"); { return0; } case5: printf("\nThursday\n"); break; case6: printf("\nFriday\n"); break; case7: printf("\nSaturday\n"); break; default: printf("\nWrong input\n"); { return0; } ידפיס Friday ו Saturday מבוא למדעי המחשב - שיעור 5

  41. צירוף כמה ערכים • אפשר לכלול כמה ערכים עבור אותה רשימת פקודות. • דוגמה: משחק מזל. המשתמש "זורק" שתי קוביות • אם הסכום 3, 5, או 8 הוא מרוויח 3$ • אם הסכום 2, 7, 9, או 11 הוא מפסיד 2$ • אם הסכום 6 הוא מרוויח 1$ • עבור כל סכום אחר הוא לא מרוויח ולא מפסיד מבוא למדעי המחשב - שיעור 5

  42. דוגמה: משחק קוביות #include... int main() } int sum; srand(time(NULL)); printf("Press any key to throw two dice:\n"); getchar(); sum = rand()%6+1 + rand()%6+1; /* sum of two dice */ printf("%d\n", sum); switch (sum) { case3: case 5: case 8: printf("you win 3$\n"); break; case2: case 7: case 9: case 11: printf("you lose 2$\n"); break; case6: printf("you win 1$\n"); break; default: printf("you win or lose nothing\n"); { return0; } המתנה למשתמש שיקליד צרוף של כמה ערכים מבוא למדעי המחשב - שיעור 5

  43. דוגמה: mini calculator intcalculate(double a, double b, char op) } intis_op = TRUE;/* = TRUE if op is legal */ doubleresult; /* the result of the operation */ switch(op){ case('+'): result=a+b; break; case('-'): result=a-b; break; case('*'): result=a*b; break; case('/'): if(b == 0.0){ is_op= FALSE; printf("ERROR, DIVISION BY ZERO!!!\n"); { else result=a/b; break; default: is_op=FALSE; { if(is_op==TRUE) printf("\n%g %c %g = %g\n",a,op,b,result); returnis_op; { לפעמים כתיבת שתי פקודות בשורה אחת יכולה לתרום לבהירות התוכנית מבוא למדעי המחשב - שיעור 5

  44. mini calculator (המשך) • #include<stdio.h> • #define FALSE 0 • #define TRUE 1 • intcalculate(double a, double b, char op); • int main() • } • double first, second; // the two numbers • charop; // the character representing the operation • printf("\nEnter an operation between two numbers:\n" • "(no spaces are allowed), press q to quit\n"); • while(scanf("%lf%c%lf", &first, &op, &second)){ • if(calculate(first, second, op) == FALSE) • printf("Wrong expression, Please try again\n"); • else • printf("\nEnter an operation between two numbers:\n" • "(no spaces are allowed)\n"); • { • return0; • { הלולאה תרוץ כל עוד הקלט תקין מבוא למדעי המחשב - שיעור 5

  45. mini calculator - הערות • הפונקציה scanf מחזירה את מספר הקריאות המוצלחות שבוצעו, לכן הלולאה תעצור רק אם בניסיון לקרוא את המספר הראשון תהיה שגיאה, למשל, אם מוקש q במקום מספר. • אסור שיהיה רווח בין המספר הראשון לסימן הפעולה, אבל בין הפעולה למספר השני יכול להיות רווח 3+ 25 קלט תקין: קלט לא תקין: 3 + 25 מבוא למדעי המחשב - שיעור 5

  46. מה למדנו היום? • שיערוכים • אופרטור תנאי • לולאות: while, for, do • מציאת מספרים ראשוניים • break, continue • תנאי רב-ברירה (switch) מבוא למדעי המחשב - שיעור 5

More Related