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