190 likes | 200 Views
מבוא למדעי המחשב. לולאות. לולאות. הרעיון - ביצוע של הוראה אחת, או סדרה של הוראות, מספר כלשהוא של פעמים : מספר הפעמים ידוע מראש (למשל – סיכום חמישה מספרים הנתונים בקלט). או מספר לא ידוע מראש של פעמים. התנאי לסיום הביצוע נקבע באופן דינאמי בזמן ריצת התכנית.
E N D
מבוא למדעי המחשב לולאות
לולאות הרעיון - ביצוע של הוראה אחת, או סדרה של הוראות, מספר כלשהוא של פעמים: • מספר הפעמים ידוע מראש (למשל – סיכום חמישה מספרים הנתונים בקלט). או • מספר לא ידוע מראש של פעמים. התנאי לסיום הביצוע נקבע באופן דינאמי בזמן ריצת התכנית.
תנאי הלולאה נבדק לפני ביצוע ההוראה שאחריו לולאות - מוטיבציה המטרה: ניסוח אלגוריתם לחישוב הערך של n! . n!=1*2*3*…*(n-1)*n אלגוריתם לחישוב n! : אתחל את result ל- 1 (האיבר הניטראלי לכפל) אתחל את i ל- 1 (מונה) כל עוד i קטן או שווה ל- n כפול את result ב- i הגדל את i ב- 1
כן לא לולאות – תיאור גרפי • לולאה יכולה להתבצע אפס פעמים (אם התנאי אינו מתקיים כבר בחישוב הראשון). • אין שום מניעה לכתוב תכנית שבה תבוצע לולאה אינסופית!
לולאות while תחביר: while (expression) statement • while – מילה שמורה • הסוגריים הם חלק מן התחביר • expression – ביטוי • statement – הוראה אחת (שיכולה להיות גם הוראה מורכבת).
לולאות while משמעות: while (expression) statement • expression משוערך. • אמת ← ההוראה statement מתבצעת והביצוע חוזר אל expression. שקר ← הבקרה מועברת אל ההוראה הבאה לאחר ה- while.
n! הוא מספר שלם לכל n, אבל ערכו גדל במהירות (מקום אחסון מספיק) לולאות while - דוגמא /* This program computes n!, the factorial of n */ #include <stdio.h> int main() { int n,i; double result=1; printf("Enter a natural number: "); if (scanf("%d", &n) != 1) { printf("Input error.\n"); return 1; } else if (n<0) { printf("Factorial is undefined for negative integers.\n"); return -1; } else { i=1; while (i<=n) { result *= i; i++; } printf("%d!=%.0f\n", n, result); } return 0; } • בקרת קלט: • האם המספר שלם? • האם המספר חיובי?
לולאות while - דוגמא /* This program computes n!, the factorial of n */ #include <stdio.h> int main() { int n,i; double result=1; printf("Enter a natural number: "); if (scanf("%d", &n) != 1) { printf("Input error.\n"); return 1; } else if (n<0) { printf("Factorial is undefined for negative integers.\n"); return -1; } else { i=1; while (i<=n) { result *= i; i++; } printf("%d!=%.0f\n", n, result); } return 0; }
לולאות while /* This program computes n!, the factorial of n */ #include <stdio.h> int main() { int n,i; double result=1; printf("Enter a natural number: "); if (scanf("%d", &n) != 1) { printf("Input error.\n"); return 1; } else if (n<0) { printf("Factorial is undefined for negative integers.\n"); return -1; } else { i=1; while (i<=n) { result *= i; i++; } printf("%d!=%.0f\n", n, result); } return 0; } • אתחול משתנה המשמש כמונה • תנאי הבודק את ערכו של המשתנה • גוף הלולאה • עדכון המשתנה
לולאות for תחביר: for (expr1 ; expr2 ; expr3) statement • for – מילה שמורה • הסוגריים הם חלק מן התחביר • כל expr – ביטוי • statement – הוראה אחת (שיכולה להיות גם הוראה מורכבת).
(*) בדיקת תנאי – ביטוי יחס (מחזיר ערך לוגי) (*) קידום – ביטוי השמה (*) אתחול – ביטוי השמה לולאות for for (expr1 ; expr2 ; expr3) statement שקול ל: expr1 while (expr2) { statement expr3 } (*) בדר"כ
(*) אתחול – ביטוי השמה (*) בדיקת תנאי – ביטוי יחס (מחזיר ערך לוגי) (*) קידום – ביטוי השמה לולאות for for (expr1 ; expr2 ; expr3) statement • מבחינה תחבירית, כל אחד משלושת הביטויים יכול להיות מושמט, אך סימני ה- ; הכרחיים. • מבחינה סמנטית, הלולאה תתבצע כל עוד expr2 משוערך כאמת (כלומר, ≠0). אם expr2 חסר, הוא מתפרש כאמת תמיד.
לולאות for - דוגמא /* This program computes n!, the factorial of n */ #include <stdio.h> int main() { int n,i; double result=1; printf("Enter a natural number: "); if (scanf("%d", &n) != 1) { printf("Input error.\n"); return 1; } else if (n<0) { printf("Factorial is undefined for negative integers.\n"); return -1; } else { for (i=1 ; i<=n ; i++) { result *= i; } printf(“%d!=%.0f\n", n, result); } return 0; }
לולאות for - דוגמא /* This program computes n!, the factorial of n */ #include <stdio.h> int main() { int n,i; double result; printf("Enter a natural number: "); if (scanf("%d", &n) != 1) { printf("Input error.\n"); return 1; } else if (n<0) { printf("Factorial is undefined for negative integers.\n"); return -1; } else { for (i=1 , result=1 ; i<=n ; i++) { result *= i; } printf(“%d!=%.0f\n", n, result); } return 0; }
לולאות for - דוגמא for (i=1 , result=1 ; i<=n ; i++) { result *= i; } ידוע: n! = 1*2*…*(n-1)*n = n*(n-1)*…*2*1 ההגדרה n! = n*(n-1)*…*2*1 מאפשרת לארגן את הלולאה בסדר הפוך, מ- n עד 1. יתרון: משתנה הקלט (n) יכול לשמש גם כמונה ← אין יותר צורך במשתנה i !!! for (result=1 ; n>0 ; n--) { result *= n; }
לולאות for - דוגמא /* This program computes n!, the factorial of n */ #include <stdio.h> int main() { int n; double result; printf("Enter a natural number: "); if (scanf("%d", &n) != 1) { printf("Input error.\n"); return 1; } else if (n<0) { printf("Factorial is undefined for negative integers.\n"); return -1; } else { printf("%d!=", n); for (result=1 ; n>0 ; n--) { result *= n; } printf(%.0f\n", result); } return 0; }
לולאות for - דוגמא /* This program computes n!, the factorial of n */ #include <stdio.h> int main() { int n; double result=1; printf("Enter a natural number: "); if (scanf("%d", &n) != 1) { printf("Input error.\n"); return 1; } else if (n<0) { printf("Factorial is undefined for negative integers.\n"); return -1; } else { printf(“%d!=“, n); for ( ; n>0 ; n--) { result *= n; } printf("%.0f\n", result); } return 0; }
while (n>0) result*=n--; לולאות for - דוגמא /* This program computes n!, the factorial of n */ #include <stdio.h> int main() { int n; double result=1; printf("Enter a natural number: "); if (scanf("%d", &n) != 1) { printf("Input error.\n"); return 1; } else if (n<0) { printf("Factorial is undefined for negative integers.\n"); return -1; } else { printf(“%d!=“, n); for ( ; n>0 ; ) { result *= n--; } printf("%.0f\n", result); } return 0; }
לולאות for - דוגמא /* This program computes n!, the factorial of n */ #include <stdio.h> int main() { int n; double result=1; printf("Enter a natural number: "); if (scanf("%d", &n) != 1) { printf("Input error.\n"); return 1; } else if (n<0) { printf("Factorial is undefined for negative integers.\n"); return -1; } else { printf(“%d!=“, n); while (n>0) result*=n--; printf("%.0f\n", n, result); } return 0; }