View
111
Download
3
Category
Preview:
DESCRIPTION
חשיבה תכנותית – חלק 3 בקרת זרימה: לולאות. קרן כליף. ביחידה זו נלמד:. לולאות הצגת הפתרון תרשים זרימה כתיבת הפתרון בפסאודו-קוד לולאות מקוננות. חישוב סכום ספרותיו של מספר. בהינתן מספר שלם חיובי כלשהו, נרצה למצוא את סכום ספרותיו דוגמאות: 347 3+4+7=14 2251 2+2+5+1=10. - PowerPoint PPT Presentation
Citation preview
קרן כליף
לולאותהצגת הפתרון תרשים זרימהכתיבת הפתרון בפסאודו-קודלולאות מקוננות
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.sum והוסף אותה ל- tempתן ספרה ימנית מ- 1. ספרה ימניתtempקצץ מ- 2.
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
counter=0, sum=0הגדר 1.
Xקלוט מספר 2.
:X ≥ 0כל עוד 3.)a הוסף אתX -ל sum)b הגדל אתcounter -1 ב)c -קלוט מספר נוסף לX
:0 הוא counterאם ערכו של 4.הצג: "לא הוקלדו מספרים חיוביים"1.
אחרת: 5.)a הצג את תוצאת החישובsum/counter
10 © 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את המספר
גם במקרה זה צריך לבודדאת כל אחת מהספרות ולכן
נשתמש בפעולות "תן/קצץ ספרה ימנית"
ניתן להשתמש גם בפעולותחשבון בסיסיות )כפל,
חיבור וכד'(
11 © Keren Kalif
newNum = 0הגדר 1.
Xקלוט מספר לתוך 2.
temp = Xהגדר 3.
:temp > 0כל עוד 4.newNum והוסף אותה מימין ל- tempתן ספרה ימנית מ- 1.tempקצץ ספרה ימנית מ- 2.
newNumהצג את 5.
12 © 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
13 © Keren Kalif
14 © Keren Kalif
newNum = 0הגדר 1.
Xקלוט מספר לתוך 2.
temp = Xהגדר 3.
:temp > 0כל עוד 4. 10 פי newNumהכפל את הערך של 1.newNum והוסף אותה ל- tempתן ספרה ימנית מ- 2.tempקצץ ספרה ימנית מ- 3.
newNumהצג את 5.
15 © Keren Kalif
הרצה יבשה:
newNum = 0
X = 123
temp = 123temp = 12temp = 1temp = 0
newNum = 30newNum = 32newNum = 321newNum = 3newNum = 320
כאשר מוסיפים ספרה משמאלו של מספר יש לקחתבחשבון איזה מיקום היא תופסת: אחדות / עשרות /
מאות וכד'
3 להוסיף את הספרה 47דוגמא: אם רוצים למספר 300משמאלו, למעשה יש להוסיף את הערך
◦47 + 300 = 347אם נרצה להוסיף ספרה נוספת משמאל, היא כבר תהייה ◦
במיקום של האלפים
16 © 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המספר המתקבל הוא
17 © Keren Kalif
הרצה יבשה:
724המספר: 24המספר: 4המספר: 0המספר:
ניתן לזהות את החוקיות שהוספת ספרה משמאל היא למעשה חזקה
בכל 1, שגדלה ב- 10כלשהי של פעם
יש לקלוט מספר ולייצר מספר המכיל רק את הספרותשערכן זוגי
246 יווצר המספר 123467דוגמא: עבור המספר:הכלים העומדים לרשותינו הן הפעולות
"תן/קצץ ספרה ימנית" ◦פעולות חשבון◦בדיקה האם ערך הוא זוגי◦
במקרה זה עלינו להוסיף ספרות משמאלו של המספרהמיוצר
18 © Keren Kalif
19 © Keren Kalif
ייצור הערך המתאים להוספה למספר
רק locationנכפיל את במידה והוספנו ספרה,
כהכנת התשתית לספרה הבאה
location=1, newNum=0הגדר 1.
Xקלוט ערך לתוך 2.
temp=Xהגדר 3.
:temp > 0כל עוד 4.)a תן ספרה ימנית שלtemp:ואם זוגית בצע ,
newNum והוסף אותה ל- locationהכפל את הספרה פי 1.
10 פי locationהכפל 2.
tempקצץ ספרה ימנית מ- 1.
newNumהצג את 5.
20 © 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עבור המספרים ◦
:מאחר וניתן לבודד ספרות מימין לשמאל, אסטרטגיית הפעולה בניית המספר החדש תתבסס על הוספת ספרות משמאל,
כאשר מתחילים דווקא מהמספר השני21 © Keren Kalif
22 © 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.23 © 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עבור ◦
אסטרטגיית הפעולה: נאתחל את המקסימום עם ערךהספרה הראשונה )הימנית( ונבודד כל פעם ספרה אחרת. אם הספרה הנוכחית גדולה מהספרה המקסימלית שראינו
עד כה, נעדכן אותה.
24 © Keren Kalif
25 © Keren Kalif
numקלוט מהמשתמש מספר לתוך 1.
ואתחל אותה בספרה הימנית של maxDigitהגדר את 2.num
numקצץ ספרה ימנית מ- 3.
(:num>0 ספרות )numכל עוד נותרו ב- 4.temp ואחסן אותה בתוך numתן ספרה ימנית מ- 1.:temp > maxDigitאם 2.
maxDigit = tempעדכן: 1.
numקצץ ספרה ימנית מ- 3.
maxDigitהצג את 5.
26 © Keren Kalif
הרצה יבשה:
num = 387
temp = 8
maxDigit = 7
num = 38num = 3num = 0
maxDigit = 8
temp = 3
מספרים )שאינם בהכרח באותו האורך(, 2יש לקלוט ולהגיד לאיזה מספר יש יותר ספרות, וכמה ספרות יותר יש
בו.
:דוגמא 2 יש 1234 יש לאמר שבמספר 99 והמספר 1234עבור המספר ◦
ספרות יותר מאשר במספר השני.
:אסטרטגיית הפעולהנקצץ ספרות משני המספרים בו-זמנית עד אשר לאחד יגמרו ◦
הספרות. נתחיל לספור את כמות הספרות שיש לקצץ למספר שנותר עד ◦
אשר יגמרו גם לו הספרות.27 © Keren Kalif
28 © Keren Kalif
מאחר ובסוף יש להציג גם מי המספר שיש בו יותר ספרות יש צורך לשמור את
tempהמספרים המקוריים ולעבוד עם
כאשר מגיעים לפה בלפחות אחד מהמספרים כבר אין ספרות, לכן בוודאות
ניכנס מקסימום לאחת מהלולאות שסופרות, מבלי צורך לבדוק מהו המספר
שנותרו בו ספרות
נרצה לקלוט מספר מהמשתמש, ולהציג כוכביות בכמותשל המספר שנקלט
:הפעולות שעומדות לרשותינו הן"הדפס כוכבית אחת"◦פעולות חשבוניות◦
ניתן להבחין שבתרגיל זה יש תהליך שחוזר על עצמו, והואהצגת כוכבית.
צריך לדאוג שתהליך זה יקרה בדיוק כמות מסוימת שלפעמים
29 © Keren Kalif
30 © Keren Kalif
counter מכיל את כמות הכוכביות שהוצגו עד כה, 0ולכן בהתחלה מאותחל ל-
התהליך יחזור כל עוד לא הצגנו את כל כמות הכוכביות
המבוקשת
לאחר הצגת כוכבית, נעדכן ע"י הגדלתו ב- counterאת
1
Xקלוט מספר 1.
counter=0הגדר 2.
:counter < Xכל עוד 3.)aהצג כוכבית)b הגדל אתcounter -1 ב
31 © Keren Kalif
הרצה יבשה:
X = 3
counter = 0
המיוחד בדוגמא זו הוא שעם תחילת הלולאה, כבר ידועה כמות הסיבובים שהיא תבצע.
למקרה זה יש את הפורמט שמוצג בשקף הבא..
counter = 1counter = 2counter = 3
* * *
Xקלוט מספר 1.
:X...1 בטווח iעבור 2.)aהצג כוכבית
32 © Keren Kalif
באופן 1 גדל ב-iבצורת כתיבה זו ערכו של עד שערכו מגיע 1אוטומטי בכל פעם, החל מ-
כוללXלהיות
הרצה יבשה:
X = 3
i = 1i = 2i = 3
* * *
-יש לקלוט מהמשתמש מספר ולהציג את כל המספרים מ עד למספר זה.1
זוהי למעשה בדיוק אותה בעיה כמו מקודם, רק הפעםבמקום להדפיס כוכבית, יש להדפיס מספר.
33 © Keren Kalif
קלוט מספרX עבורi 1 בטווח...X:
iהצג את ◦
:נקפיד על פשטות הטקסט, ונשתמש במושגים הבאים– עבור תהליך שחוזר על עצמו כל עוד התנאי כל עוד <תנאי> ◦
מתקיים– עבור תהליך שחוזר על עצמו בטווח <התחלה>...<סוף> iעבור ◦
כמות ידועה של פעמים
– עבור ביצוע פעולות בעת קיום תנאי מסוייםאם <תנאי> אחרת ◦
נקפיד על כתיבה מדורגת )אינדנטציה( המשקפת אתמבנה התוכנית
34 © Keren Kalif
כאשר מספר הסיבובים אינו ידוע מראש, למשל כאשרתלויים בקלט של המשתמש כל פעם נשתמש במבנה "כל
עוד...
כאשר מספר הסיבובים ידוע עם תחילת הלולאה נשתמש בטווח...", שכן מבנה זה כולל בתוכו את iבמבנה "עבור
אתחול וקידום המונה
35 © Keren Kalif
יש לקלוט מהמשתמש גובה ורוחב ולהציג מלבן שלכוכביות לפי הכמויות שנקלטו
יוצג המלבן הבא:5 ורוחב 3למשל עבור גובה * * * * *
* * * * * * * * * *
פעמים 3נשים לב שיש פה תהליך מרכזי שחוזר על עצמו והוא הדפסת שורה
בכל הדפסת שורה יש תהליך שחוזר על עצמו והואהדפסת כוכבית אחת ולבסוף ירידת שורה.
36 © Keren Kalif
37 © Keren Kalif
תהליך שחוזר על heightעצמו
פעמים
בתוך התהליך המרכזי, ישנו תהליך נוסף שחוזר
פעמיםwidthעל עצמו
height ו- widthקלוט 1.
:height...1 בטווח iעבור 2.)a עבורj 1 בטווח...width:
.iהדפס כוכבית
)bרד שורה
38 © Keren Kalif
הרצה יבשה:
width = 3
height = 2
*
i = 1
j = 1
* ** * *
i = 2
j = 2j = 3
jהספירה של מתחילה מההתחלה
יש לקלוט מהמשתמש אורך בסיס של משולש ולהציג משולשישר-זוית של כוכביות, מוצמד לשמאל, שבסיסו כגודל שנקלט.
יודפס המשולש הבא:4למשל, עבור בסיס בגודל ** ** * ** * * *
פעמים והוא 4נשים לב שיש פה תהליך מרכזי שחוזר על עצמו הדפסת שורה. העובדה שאורך השורות שונה אינה משנה!
בכל הדפסת שורה יש תהליך שחוזר על עצמו והוא הדפסתכוכבית אחת ולבסוף ירידת שורה.
39 © Keren Kalif
מאחר ובכל שורה כמות שונה של כוכביות, ננסה למצואאת החוקיות, ולכן נצייר את הטבלה הבאה:
:ניתן לזהות קשר בין מספר הכוכביות למספר השורהמספר הכוכביות הוא כמספר השורה
40 © Keren Kalif
# כוכביותבשורה
# שורה
1 1
2 2
3 3
4 4
5 5
** ** * ** * * ** * * * *
41 © Keren Kalif
הפעולות שבתוך חלק זה אמורות להדפיס שורה אחת כל
פעם. i למעשה מייצג את מספר
השורה שאנחנו כרגע מציירים.פעולה זו קובעת כמה כוכביות
יודפסו. מיצג i, מאחר ו- iבמקרה זה
את מספר השורה, שערכה זהה למספר הכוכביות בשורה.
basisקלוט 1.
:basis...1 בטווח iעבור 2.)a עבורj 1 בטווח...i:
.iהדפס כוכבית
)bרד שורה
42 © Keren Kalif
הרצה יבשה:
basis = 3
*
i = 1
j = 1
*** *
*
i = 2
j = 2j = 3
jהספירה של מתחילה
מההתחלה ורצה המעודכןiעד
i = 3
יש לקלוט מהמשתמש אורך בסיס של משולש ולהציגמשולש ישר-זוית של כוכביות, מוצמד לשמאל, שבסיסו
כגודל שנקלט, אבל הבסיס למעלה. יודפס המשולש הבא:4למשל, עבור בסיס בגודל
* * * ** * ** * *
פעמים 4גם בדוגמא זו יש תהליך מרכזי שחוזר על עצמו והוא הדפסת שורה. העובדה שאורך השורות שונה אינה
משנה!
43 © Keren Kalif
: כל פלט תמיד יוצג מלמעלה למטההגבלה .כלומר, חובה עלינו להתחיל לצייר מהשורה
הכוכביות עד האחרונה עם 4הראשונה עם .כוכבית אחת
מאחר ובכל שורה כמות שונה של כוכביות, ננסה למצואאת החוקיות, ולכן נצייר את הטבלה הבאה:
ניתן לזהות שמספר הכוכביות מהווה סדרה יורדת, החל.1מגודל הבסיס עד
.44לכן ננסה למספר את השורות באופן שונה © Keren Kalif
# כוכביותבשורה
# שורה
5 1
4 2
3 3
2 4
1 5
* * * * ** * * ** * ** * *
# כוכביותבשורה
# שורה
5 5
4 4
3 3
2 2
1 1
45 © Keren Kalif
קטן בכל iהפעם ערכו של basisסיבוב: החל מערכו של
.1עד שהוא מגיע להיות
הרצה יבשה:
basisקלוט 1.
:basis...1 בטווח iעבור 2.)a עבורj 1 בטווח...i:
.iהדפס כוכבית
)bרד שורה
46 © Keren Kalif
basis = 3
*
i = 3
j = 1
***
* *
i = 1
j = 2j = 3
i = 2
.יש לקלוט את רוחבו העליון של טרפז ואת רוחבו התחתון.ניתן להניח כי הרוחב העליון קצר מהרוחב התחתון.יש לצייר טרפז בהתאם לרוחבים שנקלטו:דוגמא
נצייר את הטרפז הבא:7 ורוחב תחתון 4עבור רוחב עליון ◦* * * * * * * * * * * * * * * * * * * * * *
וכך עד שיש שורה 5 כוכביות, בשניה 4כלומר, בשורה הראשונה ◦ כוכביות.7עם
נשים לב שציור הכוכביות בכל שורה אינו בהכרח מתחיל מתחילת ◦השורה!
47 © Keren Kalif
מאחר וכל שורה, פרט לאחרונה, אינה מתחילה צמודהלשמאל, יש למצוא דרך לצייר את הכוכביות יותר ימינה
בשורה. הדרך היא לצייר רווחים )תו שאינו נראה אך מקדם את
המיקום( לפני ציור הכוכביות.
ניתן לראות שאכן בצד שמאל הטרפז נראה תקין, אבל צידוהימני ישר, ולכן ננסה לשים רווח בין כל כוכבית
48 © Keren Kalif
---*-*-*-*--*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*
---****--*****-*************
,ניתן לראות שכל שורה מורכבת מכמות כלשהי של רווחיםואז זוגות של כוכבית+רווח, פרט לכוכבית האחרונה, שאין
מימינה רווח לצורך הכלליות, נצייר גם ליד הכוכבית האחרונה רווח )לא
ישנה את התצוגה על המסך מאחר ורווח הוא תו שאינו נראה(
49 © Keren Kalif
---*-*-*-*--*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*
---*-*-*-*---*-*-*-*-*--*-*-*-*-*-*-*-*-*-*-*-*-*-
נצייר טבלה שבנוסף לכמות הצמדים של כוכבית+רווחבכל שורה, מציינת כמה רווחים יש לצייר בתחילת השורה
50 © Keren Kalif
---*-*-*-*---*-*-*-*-*--*-*-*-*-*-*-*-*-*-*-*-*-*-
הצגת הפלט הוא תמיד מלמעלה למטה, ומשמאל לימין, לכן עלינו להקפיד על ציור הרווחים בתחילת
.כל שורה
צמדים של #כוכבית + רווח
רווחים #בשורה
# שורה
4 3 1
5 2 2
6 1 3
7 0 4
מאחר ויש סטיה קבועה בין מספר השורה לעמודההשמאלית, נשנה את מספור השורות:
51 © Keren Kalif
צמדים של #כוכבית + רווח
רווחים #בשורה
# שורה
4 3 1
5 2 2
6 1 3
7 0 4
---*-*-*-*---*-*-*-*-*--*-*-*-*-*-*-*-*-*-*-*-*-*-
צמדים של #כוכבית + רווח
רווחים #בשורה
# שורה
4 3 4
5 2 5
6 1 6
7 0 7
העמודות 2סכום השמאליות הינו
כגודל הרוחב התחתון
נזהה כי כמות הרווחים היא:
buttom - line
52 © Keren Kalif
בתוך התהליך המרכזי שחוזר על עצמו )הדפסת שורה(, יש שני
תהליכים: - הדפסת רווחים1- הדפסת צמדים של כוכבית+רווח2
צמדים של #כוכבית + רווח
רווחים #בשורה
# שורה
4 3 4
5 2 5
6 1 6
7 0 7
:buttom=7 ו- top=4למשל עבור
---*-*-*-*---*-*-*-*-*--*-*-*-*-*-*-*-*-*-*-*-*-*-
topקלוט מהמשתמש 1.
buttomקלוט מהמשתמש 2.
:top...buttom בטווח iעבור 3.)a עבורj 1 בטווח... buttom-i:
צייר רווח1.
:i...1 בטווח jעבור 1. צייר כוכבית ורווח1.
צייר ירידת שורה2.
53 © Keren Kalif
הרצה יבשה:
top = 4
i = 4
j = 1
i = 6
j = 3j = 2
i = 5
buttom = 7
*__ _ _ *_*_*__ _ *_*_*_*_*__ *_ *_*_*_*_*_*_*_ *_*_*_*_*_
i = 7
j = 4j = 5
מספרים והצג כמה ספרות מופיעות 2קרא מהמשתמש בשניהם
:דוגמאות מופיעות בשניהם3 ו- 7, כי הספרות 2 יוצג 7839 ו- 1734עבור ◦ מופיעה בשניהם3 כי הספרה 1 יוצג 33 ו- 112233עבור ◦
2:אסטרטגיות לפעולה עבור כל ספרה בראשון נבדוק האם מופיעה בשני. יש לוודא 1.
שהספרה טרם הופיעה בראשון כדי לא לבדוק פעמיים. המספרים.2( נבדוק האם היא מופיעה ב- 0-9עבור כל ספרה )2.
יותר פשוטה2אסטרטגיה
54 © Keren Kalif
9 עד 0עבור כל אחת מהספרות:בדוק האם הספרה מופיעה במספר הראשון◦אם כן, בדוק האם מופיעה במספר השני◦counterאם כן, עדכן את ◦
:בדיקה האם ספרה מופיעה במספרבידוד כל ספרה באמצעות "תן/קצץ ספרה ימנית" ובדיקה האם ◦
שווה לספרה המבוקשת
55 © Keren Kalif
יש לעבור על כל הספרות 9 ל- 0עבור כל ספרה בין המספר.
יש לעבור על כל ספרות 9 ל- 0מאחר ועבור כל ספרה בין המספר, יש להשתמש בפעולת הקיצוץ שהורסת את
המספר.לכן נעבוד עם משתנה עזר, כדי לשמור את המספר המקורי.◦
אם נזהה שאחת הספרות היא הספרה המבוקשת, איןצורך להמשיך ולבדוק את שאר הספרות, ולכן נתחזק
משתנה שתפקידו להעיד האם הספרה נמצאה במספר.56 © Keren Kalif
57 © Keren Kalif
בדיקה האם הספרה מופיעה במספר הראשון
אם מופיעה במספר הראשון נעבור לבדוק האם מופיעה
במספר שניאם אינה מופיעה במספר הראשון נעבור לבדוק את
הספרה הבאה
נשים לב שלפני פירוק המספר נשמור את ערכו, כדי שנוכל
להמשיך לעבוד איתו בסיבוב הבא.
58 © Keren Kalif
בדיקה האם הספרה מופיעה במספר השני
אם מופיעה גם במספר השני נגדיל את ה-
counter
אם אינה מופיעה גם במספר השני נעבור לבדוק את הספרה
הבאה
59 © Keren Kalif
מספרים ולהציג האם השני הוא תת-מספר 2יש לקלוט של הראשון
:דוגמאות יוצג "כן"23 ו- 1234עבור ◦ יוצג "לא"823 ו- 1234עבור ◦ יוצג "לא"144 ו- 1244עבור ◦
60 © Keren Kalif
נגדיר את הספרה הימנית שלnum2 -כ current -כל עוד לא סיימנו לעבור על כל הספרות בnum1 ועדיין לא
כתת-מספר:num2זיהינו את :num1 היא הספרה הימנית של currentנבדוק האם ◦
אם כן: נזיז אתcurrent -להיות הספרה השמאלית הבאה ב num2 אחרת: נחזיר אתcurrent להיות הספרה הימנית של num2num1קצץ ספרה ימנית מ- ◦
-אם לא נותרו ספרות בnum2 משמע הוא תת-מספר של num1
אחרת, אינו תת-מספר
61 © Keren Kalif
הרצה יבשה של הרעיון הכללי:
num1 = 1234num2 = 23
current
num1 = 123num1 = 12אם לא נותרו ספרות ב-
num2 משמע הוא num1תת-מספר של
num1 = 1
נגדיר את הספרה הימנית שלnum2 -כ current -כל עוד לא סיימנו לעבור על כל הספרות בnum1 ועדיין לא
כתת-מספר:num2זיהינו את :num1 היא הספרה הימנית של currentנבדוק האם ◦
אם כן: נזיז אתcurrent -להיות הספרה השמאלית הבאה ב num2 אחרת: נחזיר אתcurrent להיות הספרה הימנית של num2num1קצץ ספרה ימנית מ- ◦
-אם לא נותרו ספרות בnum2 משמע הוא תת-מספר של num1
אחרת, אינו תת-מספר
62 © Keren Kalif
הרצה יבשה של הרעיון הכללי:
num1 = 1234num2 = 53
current
num1 = 123num1 = 12num1 = 1num1 = 0
הזזת הסמן שמאלה משמע קיצוץ ספרה ימינית
num2הזזת הסמן לתחילתו של מרמזת שיש לשמור את ערכו המקורי
, ולכן יהיה שימוש num2של במשתנה עזר
: כיתבו את הרעיון בכתיבה תרגילפורמאלית
לולאותהצגת הפתרון תרשים זרימהכתיבת הפתרון בפסאודו-קודלולאות מקוננות
63© Keren Kalif
Recommended