03הרצאה בקרת זרימה: לולאות
כליף קרן
לולאותהצגת הפתרון תרשים זרימהכתיבת הפתרון בפסאודו-קוד
2 © Keren Kalif
ביחידה זו נלמד:
בהינתן מספר שלם חיובי כלשהו, נרצה למצוא את סכוםספרותיו
:דוגמאות◦347 3+4+7=14◦2251 2+2+5+1=10
חישוב סכום ספרותיו של מספר
3 © Keren Kalif
"תן ספרה ימנית" 7 347דוגמא: ◦
"קצץ ספרה ימנית"
34 347דוגמא: ◦0קיצוץ מספר חד ספרתי מחזיר את הערך ◦
אסטרטגיית הפעולה: לעבור על כל אחת מספרות המספרולהוסיף אותה לסכום
מאחר ובכל שלב יש לנו גישה רק לספרה הימנית ביותר, יהיה ◦עלינו לקצץ אותה כדי להגיע לספרה שלידה
כאשר נסיים לקצץ את כל הספרות )כלומר הערך שישאר לנו יהיה ◦(, נדע שסיימנו את העבודה0
חישוב סכום ספרותיו של מספר – ההוראות בהן מותר להשתמש
4 © Keren Kalif
מדוע לדעתכם יש את הפקודות "תן/קצץ ספרה ימנית", ואין
פעולות מקבילות עבור הספרה ?השמאלית
חישוב סכום ספרותיו תרשים זרימהשל מספר –
5 © Keren Kalif
Xנשים לב שערכו המקורי של נהרס
זוהי הנקודה בה אנו מחליטים האם לבצע את כל התהליך פעם נוספת, או לצאת
חישוב סכום ספרותיו תרשים זרימהשל מספר –
6 © Keren Kalif
Xבמקרה זה שמרנו את ערכו של X וכך ערכו המקורי של tempב-
נשמר
sum=0הגדר 1.
Xקלוט מספר לתוך 2.
temp=Xהגדר 3.
:temp > 0כל עוד 4.)a -תן ספרה ימנית מtemp -והוסף אותה ל sum)b -קצץ מtempספרה ימנית
sumהצג את 5.
כתיבה פורמאליתחישוב סכום ספרותיו של מספר –
7 © Keren Kalif
הרצה יבשה:
sum = 0
X = 472
temp = 472
sum = 2sum = 9sum = 13
temp = 47temp = 4temp = 0
שימוש במושג "כל עוד" מעיד על קטע שיש לחזור
עליו
יש לקלוט מספרים עדאשר יקלט מספר
שלילי. יש להציג את ממוצע המספרים )לא כולל המספר השלילי
שהוכנס(.
חישוב ממוצע
8 © Keren Kalif
זוהי הנקודה בה אנו מחליטים האם לבצע את כל התהליך פעם נוספת, או
לצאת
ניתן לחזור למעלה אך ורק לפעולה שהינה בדיקת
תנאי
חישוב ממוצע - מתוקן
9 © Keren Kalif
מה יקרה אם כבר במספר הראשון יוקלד ערך שלילי?
מדוע ניתן לחזור למעלה אך ורק לפעולה שהינה בדיקת תנאי?
על מנת לקדם את הלולאה לסיום!
נשים לב שבתצורה זו עלינו לשכפל את פעולת הקליטה
לפני ובתוך הלולאה
10 © Keren Kalif
(2חישוב ממוצע - מתוקן )
counter=0, sum=0הגדר 1.
Xקלוט מספר 2.
:X ≥ 0כל עוד 3.)a הוסף אתX -ל sum)b הגדל אתcounter -1 ב)c -קלוט מספר נוסף לX
:0 הוא counterאם ערכו של 4.)a"הצג: "לא הוקלדו מספרים חיוביים
אחרת: 5.)a הצג את תוצאת החישובsum/counter
חישוב ממוצע: כתיבה פורמאלית
11 © Keren Kalif
הרצה יבשה, למשל -: 2 1 7עבור
counter = 0
sum = 0
X = 7
sum = 7sum = 9
counter = 1counter = 2
X = 2 X = 1-
נשים לב: בכתיבה פורמאלית ניתן לחזור רק לקטע כתוב שוב בתור סעיף 2המתחיל ב"כל עוד", ולכן סעיף
3C
יש לייצר 123למשל, עבור 321את המספר
גם במקרה זה צריך לבודדאת כל אחת מהספרות ולכן
נשתמש בפעולות "תן/קצץ ספרה ימנית"
ניתן להשתמש גם בפעולותחשבון בסיסיות )כפל,
חיבור וכד'(
יצירת המספר ההופכי
12 © Keren Kalif
newNum = 0הגדר 1.
Xקלוט מספר לתוך 2.
temp = Xהגדר 3.
:temp > 0כל עוד 4.)a -תן ספרה ימנית מ temp -והוסף אותה מימין ל newNum)b -קצץ ספרה ימנית מtemp
newNumהצג את 5.
ובכתיבה פורמאלית
13 © Keren Kalif
נשים לב שכאשר מבקשים מאיתנו לייצר מספר, "הצמד ספרה לימין אין ברשותנו את הפעולה:
המספר"...
הרצה יבשה:
newNum = 0
X = 123
temp = 123temp = 12temp = 1temp = 0
newNum = 03newNum = 032newNum = 0321
כאשר רוצים להוסיף ספרה מימין למספר, כלומר להכניסספרת אחדות חדשה, יש לבצע את הפעולות הבאות:
)כדי לייצר מקום לספרת האחדות 10הכפל את המספר פי ◦החדשה(
הוסף את הספרה החדשה◦
3 נרצה להוסיף את הספרה 65דוגמא: עבור המספר :653מימין, כלומר כדי לייצר את מספר
◦65*10 = 650◦650 + 3 = 653
הוספת ספרה מימין למספר
14 © Keren Kalif
יצירת המספר - מתוקןההופכי
15 © Keren Kalif
newNum = 0הגדר 1.
Xקלוט מספר לתוך 2.
temp = Xהגדר 3.
:temp > 0כל עוד 4.)a הכפל את הערך שלnewNum 10 פי )b -תן ספרה ימנית מtemp -והוסף אותה ל newNum)c -קצץ ספרה ימנית מtemp
newNumהצג את 5.
ובכתיבה פורמאלית
16 © Keren Kalif
הרצה יבשה:
newNum = 0
X = 123
temp = 123temp = 12temp = 1temp = 0
newNum = 30newNum = 32newNum = 321newNum = 3newNum = 320
כאשר מוסיפים ספרה משמאלו של מספר יש לקחתבחשבון איזה מיקום היא תופסת: אחדות / עשרות /
מאות וכד'
3 להוסיף את הספרה 47דוגמא: אם רוצים למספר 300משמאלו, למעשה יש להוסיף את הערך
◦47 + 300 = 347אם נרצה להוסיף ספרה נוספת משמאל, היא כבר תהייה ◦
במיקום של האלפים
הוספת ספרות משמאל למספר
17 © Keren Kalif
תוך כדי הוספת ספרות משמאלו: 724נייצר את המספר ◦4 2 7
0בהתחלה המספר יהיה4 נוסיף למספר את הערך
◦4*100 = 4*1 = 4 20נוסיף למספר את הערך
◦2*101 = 2*10 = 20 700נוסיף למספר את הערך
◦7*102 = 7*100 = 700 724המספר המתקבל הוא
הוספת ספרות משמאל למספר - דוגמא
18 © Keren Kalif
הרצה יבשה:
724המספר: 24המספר: 4המספר: 0המספר:
ניתן לזהות את החוקיות שהוספת ספרה משמאל היא למעשה חזקה
בכל 1, שגדלה ב- 10כלשהי של פעם
יש לקלוט מספר ולייצר מספר המכיל רק את הספרותשערכן זוגי
246 יווצר המספר 123467דוגמא: עבור המספר:הכלים העומדים לרשותינו הן הפעולות
"תן/קצץ ספרה ימנית" ◦פעולות חשבון◦בדיקה האם ערך הוא זוגי◦
במקרה זה עלינו להוסיף ספרות משמאלו של המספרהמיוצר
יצירת מספר המכיל רק את הספרות הזוגיות
19 © Keren Kalif
יצירת מספר המכיל רק את הספרות הזוגיות
20 © Keren Kalif
ייצור הערך המתאים להוספה למספר
רק locationנכפיל את במידה והוספנו ספרה,
כהכנת התשתית לספרה הבאה
location=1, newNum=0הגדר 1.
Xקלוט ערך לתוך 2.
temp=Xהגדר 3.
:temp > 0כל עוד 4.)a תן ספרה ימנית שלtemp:ואם זוגית בצע ,
.i הכפל את הספרה פיlocation -והוסף אותה ל newNum.ii הכפלlocation 10 פי
)b -קצץ ספרה ימנית מtemp
newNumהצג את 5.
ובכתיבה פורמאלית
21 © Keren Kalif
הרצה יבשה:
location = 1
X = 258
newNum = 0
temp = 258
newNum = 8newNum = 28
location = 10location = 100
temp = 25 temp = 2 temp = 0
מספרים הזהים בכמות הספרות שלהם, ולייצר 2יש לקלוט מספר חדש כך שהספרות בו הם מיזוג הספרות של שני
המספרים:ספרה ראשונה )משמאל( מהמספר הראשון וספרה שניה מהמספר ◦
השניספרה שלישית מהמספר הראשון וספרה רביעית מהמספר השני◦וכו'◦
:דוגמא3871 יש לייצר את המספר 81 ו- 37עבור המספרים ◦
:מאחר וניתן לבודד ספרות מימין אסטרטגיית הפעולה לשמאל, בניית המספר החדש תתבסס על הוספת ספרות
משמאל, כאשר מתחילים דווקא מהמספר השני
מיזוג ספרות של שני מספרים זהים באורכם
22 © Keren Kalif
תרשים זרימה
23 © Keren Kalif
num1קלוט מספר ל- 1.
num2קלוט מספר ל- 2.
newNum=0הגדר 3.
location=1הגדר 4.
:num2 > 0כל עוד 5.)a -בודד ספרה ימנית מnum2 -הכפל אותה ב ,location -והוסף ל
newNum)b הכפל אתlocation 10 פי)c -בודד ספרה ימנית מnum1 -הכפל אותה ב ,location -והוסף ל
newNum)d הכפל אתlocation 10 פי)e -קצץ ספרה ימנית מnum2)f -קצץ ספרה ימנית מnum1
newNumהצג את 6.
ובכתיבה פורמאלית
24 © Keren Kalif
הרצה יבשה:
num1 = 37
newNum = 0
location = 1
num2 = 81
newNum = 1newNum = 71
location = 10
newNum = 871newNum = 3871
location = 100
num1 = 3num1 = 0
num2 = 8num2 = 0
location = 1000location = 10000
.קלוט מהמשתמש מספר והצג את הספרה הגדולה ביותר
:דוגמאות4 יוצג 1234עבור ◦9 יוצג 8997עבור ◦2 יוצג 1212עבור ◦
אסטרטגיית הפעולה: נאתחל את המקסימום עם ערךהספרה הראשונה )הימנית( ונבודד כל פעם ספרה אחרת. אם הספרה הנוכחית גדולה מהספרה המקסימלית שראינו
עד כה, נעדכן אותה.
מציאת הספרה הגדולה ביותר
25 © Keren Kalif
26 © Keren Kalif
תרשים זרימה
numקלוט מהמשתמש מספר לתוך 1.
ואתחל אותה בספרה הימנית של maxDigitהגדר את 2.num
numקצץ ספרה ימנית מ- 3.
(:num>0 ספרות )numכל עוד נותרו ב- 4.)a -תן ספרה ימנית מnum ואחסן אותה בתוך temp)b אםtemp > maxDigit:
.i :עדכןmaxDigit = temp
)c -קצץ ספרה ימנית מnum
maxDigitהצג את 5.
ובכתיבה פורמאלית
27 © Keren Kalif
הרצה יבשה:
num = 387
temp = 8
maxDigit = 7
num = 38num = 3num = 0
maxDigit = 8
temp = 3
מספרים )שאינם בהכרח באותו האורך(, 2יש לקלוט ולהגיד לאיזה מספר יש יותר ספרות, וכמה ספרות יותר יש
בו.
:דוגמא 2 יש 1234 יש לאמר שבמספר 99 והמספר 1234עבור המספר ◦
ספרות יותר מאשר במספר השני.
:אסטרטגיית הפעולהנקצץ ספרות משני המספרים בו-זמנית עד אשר לאחד יגמרו ◦
הספרות. נתחיל לספור את כמות הספרות שיש לקצץ למספר שנותר עד ◦
אשר יגמרו גם לו הספרות.
זיהוי מספר יותר ארוך
28 © Keren Kalif
תרשים זרימה
29 © Keren Kalif
מאחר ובסוף יש להציג גם מי המספר שיש בו יותר ספרות יש צורך לשמור את
tempהמספרים המקוריים ולעבוד עם
כאשר מגיעים לפה בלפחות אחד מהמספרים כבר אין ספרות, לכן בוודאות
ניכנס מקסימום לאחת מהלולאות שסופרות, מבלי צורך לבדוק מהו המספר
שנותרו בו ספרות
נרצה לקלוט מספר מהמשתמש, ולהציג כוכביות בכמותשל המספר שנקלט
:הפעולות שעומדות לרשותינו הן"הדפס כוכבית אחת"◦פעולות חשבוניות◦
ניתן להבחין שבתרגיל זה יש תהליך שחוזר על עצמו, והואהצגת כוכבית.
צריך לדאוג שתהליך זה יקרה בדיוק כמות מסוימת שלפעמים
הצגת כמות כלשהי של כוכביות
30 © Keren Kalif
תרשים זרימה
31 © Keren Kalif
counter מכיל את כמות הכוכביות שהוצגו עד כה, 0ולכן בהתחלה מאותחל ל-
התהליך יחזור כל עוד לא הצגנו את כל כמות הכוכביות
המבוקשת
לאחר הצגת כוכבית, נעדכן ע"י הגדלתו ב- counterאת
1
Xקלוט מספר 1.
counter=0הגדר 2.
:counter < Xכל עוד 3.)aהצג כוכבית)b הגדל אתcounter -1 ב
ובכתיבה פורמאלית
32 © Keren Kalif
הרצה יבשה:
X = 3
counter = 0
המיוחד בדוגמא זו הוא שעם תחילת הלולאה, כבר ידועה כמות הסיבובים שהיא תבצע.
למקרה זה יש את הפורמט שמוצג בשקף הבא..
counter = 1counter = 2counter = 3
* * *
Xקלוט מספר 1.
:X...1 בטווח iעבור 2.)aהצג כוכבית
(2ובכתיבה פורמאלית )
33 © Keren Kalif
באופן 1 גדל ב-iבצורת כתיבה זו ערכו של עד שערכו מגיע 1אוטומטי בכל פעם, החל מ-
כוללXלהיות
הרצה יבשה:
X = 3
i = 1i = 2i = 3
* * *
-יש לקלוט מהמשתמש מספר ולהציג את כל המספרים מ עד למספר זה.1
זוהי למעשה בדיוק אותה בעיה כמו מקודם, רק הפעםבמקום להדפיס כוכבית, יש להדפיס מספר.
הצגת כל המספרים
34 © Keren Kalif
קלוט מספרX עבורi 1 בטווח...X:
iהצג את ◦
:נקפיד על פשטות הטקסט, ונשתמש במושגים הבאים– עבור תהליך שחוזר על עצמו כל עוד התנאי כל עוד <תנאי> ◦
מתקיים– עבור תהליך שחוזר על עצמו בטווח <התחלה>...<סוף> iעבור ◦
כמות ידועה של פעמים
– עבור ביצוע פעולות בעת קיום תנאי מסוייםאם <תנאי> אחרת ◦
נקפיד על כתיבה מדורגת )אינדנטציה( המשקפת אתמבנה התוכנית
כתיבה פורמלית - דגשים
35 © Keren Kalif
כאשר מספר הסיבובים אינו ידוע מראש, למשל כאשרתלויים בקלט של המשתמש כל פעם נשתמש במבנה "כל
עוד...
כאשר מספר הסיבובים ידוע עם תחילת הלולאה נשתמש בטווח...", שכן מבנה זה כולל בתוכו את iבמבנה "עבור
אתחול וקידום המונה
כללי אצבע לשאלות עם לולאות
36 © Keren Kalif
לולאותהצגת הפתרון תרשים זרימהכתיבת הפתרון בפסאודו-קוד
37© Keren Kalif
ביחידה זו למדנו: