Professional Documents
Culture Documents
Yl 05
Yl 05
הרצאה :5לולאות
נכתב על-ידי טל כהן ,נערך ע"י איתן אביאור © .כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל
לולאות
int i = 1, fact = 1, n;
if (scanf("%d", &n) < 1) {
printf(“Input Error\n”); • בדוק הצלחת הקלט
return 1;
}
if (n < 0 || n > 12) { /* int = 4B */
printf(“Input out of range\n”); • בדוק ערך בתחום
return 1; המתאים
}
while (i <= n) {
fact *= i;
i++;
}
• אלגוריתם:
– ספירת מספר המספרים ,וחישוב סכומם באופן איטרטיבי )על ידי
לולאה(.
– לאחר סיום הלולאה :הסכום מחולק במספר המספרים = הממוצע.
#include <stdio.h>
int main()
{
int sum = 0, n = 0, value;
printf("Please insert a natural number: ");
scanf("%d", &value); /* Successful? Never trust users */
while (value) {
sum += value;
n++;
printf("Please insert a natural number: ");
scanf("%d", &value); /* Successful? */
}
printf("\nThe mean of the %d numbers is %.2f.\n",
n, (double)sum / n);
return 0;
}
do {
printf("Please insert a natural number: ");
scanf("%d", &value);
if ( value > 0 ) { אבל בדיקת הערך מוכפלת
sum += value;
n++;
} נדירהdo-while בשימוש נכון לולאת
} while (value);
printf("\nThe mean of the %d numbers is %.2f.\n",
n, (double)sum / n);
return 0;
}
int n, i, fact;
int sum, i;
n
:∑
2
for (i = 1, sum = 0; i <= n; i++) i • חישוב הביטוי
sum += i * i; i =1
i =1
int sum, i;
• יש למצוא את המספר הקטן ביותר ,מתוך סדרת מספרים נתונה באורך .n
– נניח כי הערך של nנקלט )או חושב( לפני-כן.
• ניסיון ראשון:
;int min = 0
;int i
;int num
;)scanf("%d", &min
>#include <limits.h
;int min = INT_MAX, i
• בגלל חוסר הדיוק בייצוג מספרים ממשיים ,אנו עלולים "לפספס" את
הגבול המדויק של סיום הלולאה )בכל אחת מהשתיים לעיל!(.
;for (i = 0, x = 0.0 < i { )21; i++, x += 1.0/7.0 }
• כדי לוודא שאנו עוצרים את הלולאה נכון נעדיף איטרטורים שלמים.
– בדוגמה השלישית ,ככל שנתקדם ערכי xיסטו מהערכים המצופים
;statement
בדיוק אותו דבר!
{ )while (cond
;statement
)שימו לב בהמשך(
}
• continue
– מפסיק את ביצוע האיטרציה הנוכחית של גוף הלולאה ,בודק את התנאי
ומתחיל מייד את ביצוע האיטרציה הבאה.
• בלולאת forביטוי הקידום ) (exp3יבוצע בכל זאת ,כי הקידום שייך
לאיטרציה הבאה.
• break
– מפסיק את ביצוע גוף הלולאה ,ומדלג מייד לפסוק הבא לאחר הלולאה.
– כזכור ,פסוק breakמשמש גם בתוך מבנה – switchגם שם הוא
מפסיק את פעולת המבנה ,ומדלג מייד לפסוק הבא לאחריו.
• לולאה אינסופית היא לולאה )מכל סוג( בה ערך ביטוי הבקרה הינו
תמיד אמת )שונה מ.(0-
• התוכנית נתקעת בתוך הלולאה ,לא מתקדמת ,ולא מסתיימת.
#include <stdio.h>
int main() פלט מופיעים רק/פסוקי הקלט
{ פעם אחת בתוכנית
int sum = 0, cntr = 0; value;
do {
printf("Please insert a natural number: ");
if (scanf("%d", &value) < 1) {
printf(“Input Error\n”);
return 1;
}
אבל בדיקת הערך מוכפלת
if (value > 0) {
sum += value;
num ++;
} נדירהdo-while בשימוש נכון לולאת
} while (value);
printf("\nThe mean of the %d numbers is %.2f.\n",
num, (double)sum / num);
return 0;
}
#include <stdio.h>
int main()
{ "לולאה "אינסופית
int sum = 0, cntr = 0;
while (1) { מוגבל ללולאהvalue
int value;
printf("Please insert a natural number: ");
if (scanf("%d", &value) < 1) {
printf(“Input Error\n”); פלט/אין שכפול פסוקי הקלט
return 1;
}
if (value <= 0) break; בדיקת ערך יחידה
sum += value;
num ++;
} do-while לא צריך
printf("\nThe mean of the %d numbers is %.2f.\n",
num, (double)sum / num);
return 0;
}
;exp1
בדיוק אותו דבר! { )while (exp2
statement
בתנאי שstatement - ;exp3
! אינו מכיל continue }
;)scanf("%d", &n
{ )if (n == 1
;is_prime = 0
}
{ else
)for (i = 2; i < n; ++i
)if (n % i == 0
;is_prime = 0
}
משפט "אלגוריתם החילוק" )החלקי( קובע כי לכל שני מספרים טבעייםd ≠ 0 ,n : •
קיימים שני מספרים טבעיים r ,qכך ש:
– מתקייםn = q × d + r :
– מתקיים0 ≤ r < d :
– יש רק זוג אחד qו r-המקיים את שני התנאים הללו.
המספרים המשתתפים נקראים בשמות: •
– nמחולק )(dividend
– dמחלק )(divisor
)(quotient – qמנה
– rשארית )(remainder
ביצוע החישוב: •
– שיטה :1החסר את dמ n-שוב ושוב )כל עוד היתרה איננה שלילית(.
מספר החיסורים הוא המנה ,והיתרה היא השארית.
– שיטה :2בצע אלגוריתם חילוק מהיר ,למשל "חילוק ארוך" שלומדים בביה"ס.
• ניתן להרחיב את המשפט גם למספרים שליליים.
5הרצאה מבוא למחשב בשפת .Cכל הזכויות שמורות © 31
עוד קצת מתורת המספרים ...
המחלק המשותף הגדול ביותר ) (Greatest Common Divisorשל שני מספרים •
טבעיים nו m-מסומן ע"י.gcd(n, m) :