הרצאה 04 בקרת זרימה: לולאות 2
DESCRIPTION
הרצאה 04 בקרת זרימה: לולאות 2. קרן כליף. ביחידה זו נלמד:. לולאות מקוננות הצגת הפתרון תרשים זרימה כתיבת הפתרון בפסאודו-קוד. ציור מלבן. יש לקלוט מהמשתמש גובה ורוחב ולהציג מלבן של כוכביות לפי הכמויות שנקלטו למשל עבור גובה 3 ורוחב 5 יוצג המלבן הבא: * * * * * * * * * * - PowerPoint PPT PresentationTRANSCRIPT
04הרצאה 2בקרת זרימה: לולאות
כליף קרן
לולאות מקוננותהצגת הפתרון תרשים זרימהכתיבת הפתרון בפסאודו-קוד
2 © Keren Kalif
ביחידה זו נלמד:
יש לקלוט מהמשתמש גובה ורוחב ולהציג מלבן שלכוכביות לפי הכמויות שנקלטו
יוצג המלבן הבא:5 ורוחב 3למשל עבור גובה * * * * *
* * * * * * * * * *
פעמים 3נשים לב שיש פה תהליך מרכזי שחוזר על עצמו והוא הדפסת שורה
בכל הדפסת שורה יש תהליך שחוזר על עצמו והואהדפסת כוכבית אחת ולבסוף ירידת שורה.
ציור מלבן
3 © Keren Kalif
תרשים זרימה
4 © Keren Kalif
תהליך שחוזר על heightעצמו
פעמים
בתוך התהליך המרכזי, ישנו תהליך נוסף שחוזר
פעמיםwidthעל עצמו
height ו- widthקלוט 1.
:height...1 בטווח iעבור 2.)a עבורj 1 בטווח...width:
.iהדפס כוכבית
)bרד שורה
ובכתיבה פורמאלית
5 © Keren Kalif
הרצה יבשה:
width = 3
height = 2
*
i = 1
j = 1
* ** * *
i = 2
j = 2j = 3
jהספירה של מתחילה מההתחלה
יש לקלוט מהמשתמש אורך בסיס של משולש ולהציגמשולש ישר-זוית של כוכביות, מוצמד לשמאל, שבסיסו
כגודל שנקלט. יודפס המשולש הבא:4למשל, עבור בסיס בגודל
** ** * ** * * *
פעמים 4נשים לב שיש פה תהליך מרכזי שחוזר על עצמו והוא הדפסת שורה. העובדה שאורך השורות שונה אינה
משנה! בכל הדפסת שורה יש תהליך שחוזר על עצמו והוא
הדפסת כוכבית אחת ולבסוף ירידת שורה.
ציור משולש מוצמד לשמאל
6 © Keren Kalif
מאחר ובכל שורה כמות שונה של כוכביות, ננסה למצואאת החוקיות, ולכן נצייר את הטבלה הבאה:
:ניתן לזהות קשר בין מספר הכוכביות למספר השורהמספר הכוכביות הוא כמספר השורה
ציור משולש מוצמד לשמאל: ניתוח הצורה
7 © Keren Kalif
# כוכביותבשורה
# שורה
1 1
2 2
3 3
4 4
5 5
** ** * ** * * ** * * * *
תרשים זרימה
8 © Keren Kalif
הפעולות שבתוך חלק זה אמורות להדפיס שורה אחת כל
פעם. i למעשה מייצג את מספר
השורה שאנחנו כרגע מציירים.פעולה זו קובעת כמה כוכביות
יודפסו. מיצג i, מאחר ו- iבמקרה זה
את מספר השורה, שערכה זהה למספר הכוכביות בשורה.
basisקלוט 1.
:basis...1 בטווח iעבור 2.)a עבורj 1 בטווח...i:
.iהדפס כוכבית
)bרד שורה
ובכתיבה פורמאלית
9 © Keren Kalif
הרצה יבשה:
basis = 3
*
i = 1
j = 1
*** *
*
i = 2
j = 2j = 3
jהספירה של מתחילה
מההתחלה ורצה המעודכןiעד
i = 3
יש לקלוט מהמשתמש אורך בסיס של משולש ולהציגמשולש ישר-זוית של כוכביות, מוצמד לשמאל, שבסיסו
כגודל שנקלט, אבל הבסיס למעלה. יודפס המשולש הבא:4למשל, עבור בסיס בגודל
* * * ** * ** * *
פעמים 4גם בדוגמא זו יש תהליך מרכזי שחוזר על עצמו והוא הדפסת שורה. העובדה שאורך השורות שונה אינה
משנה!
ציור משולש מוצמד לשמאל שבסיסו למעלה
10 © Keren Kalif
: כל פלט תמיד יוצג מלמעלה למטההגבלה .כלומר, חובה עלינו להתחיל לצייר מהשורה
הכוכביות עד האחרונה עם 4הראשונה עם .כוכבית אחת
מאחר ובכל שורה כמות שונה של כוכביות, ננסה למצואאת החוקיות, ולכן נצייר את הטבלה הבאה:
ניתן לזהות שמספר הכוכביות מהווה סדרה יורדת, החל.1מגודל הבסיס עד
.לכן ננסה למספר את השורות באופן שונה
ציור משולש הפוך: ניתוח הצורה
11 © Keren Kalif
# כוכביותבשורה
# שורה
5 1
4 2
3 3
2 4
1 5
* * * * ** * * ** * ** * *
# כוכביותבשורה
# שורה
5 5
4 4
3 3
2 2
1 1
תרשים זרימה
12 © Keren Kalif
קטן בכל iהפעם ערכו של basisסיבוב: החל מערכו של
.1עד שהוא מגיע להיות
הרצה יבשה:
basisקלוט 1.
:basis...1 בטווח iעבור 2.)a עבורj 1 בטווח...i:
.iהדפס כוכבית
)bרד שורה
ובכתיבה פורמאלית
13 © Keren Kalif
basis = 3
*
i = 3
j = 1
***
* *
i = 1
j = 2j = 3
i = 2
.יש לקלוט את רוחבו העליון של טרפז ואת רוחבו התחתון.ניתן להניח כי הרוחב העליון קצר מהרוחב התחתון.יש לצייר טרפז בהתאם לרוחבים שנקלטו:דוגמא
נצייר את הטרפז הבא:7 ורוחב תחתון 4עבור רוחב עליון ◦* * * * * * * * * * * * * * * * * * * * * *
וכך עד שיש שורה 5 כוכביות, בשניה 4כלומר, בשורה הראשונה ◦ כוכביות.7עם
נשים לב שציור הכוכביות בכל שורה אינו בהכרח מתחיל מתחילת ◦השורה!
ציור טרפז
14 © Keren Kalif
מאחר וכל שורה, פרט לאחרונה, אינה מתחילה צמודהלשמאל, יש למצוא דרך לצייר את הכוכביות יותר ימינה
בשורה. הדרך היא לצייר רווחים )תו שאינו נראה אך מקדם את
המיקום( לפני ציור הכוכביות.
ניתן לראות שאכן בצד שמאל הטרפז נראה תקין, אבל צידוהימני ישר, ולכן ננסה לשים רווח בין כל כוכבית
ציור טרפז: ניתוח הבעיה
15 © Keren Kalif
---*-*-*-*--*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*
---****--*****-*************
,ניתן לראות שכל שורה מורכבת מכמות כלשהי של רווחיםואז זוגות של כוכבית+רווח, פרט לכוכבית האחרונה, שאין
מימינה רווח לצורך הכלליות, נצייר גם ליד הכוכבית האחרונה רווח )לא
ישנה את התצוגה על המסך מאחר ורווח הוא תו שאינו נראה(
(2ציור טרפז: ניתוח הבעיה )
16 © Keren Kalif
---*-*-*-*--*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*
---*-*-*-*---*-*-*-*-*--*-*-*-*-*-*-*-*-*-*-*-*-*-
נצייר טבלה שבנוסף לכמות הצמדים של כוכבית+רווחבכל שורה, מציינת כמה רווחים יש לצייר בתחילת השורה
(3ציור טרפז: ניתוח הבעיה )
17 © Keren Kalif
---*-*-*-*---*-*-*-*-*--*-*-*-*-*-*-*-*-*-*-*-*-*-
הצגת הפלט הוא תמיד מלמעלה למטה, ומשמאל לימין, לכן עלינו להקפיד על ציור הרווחים בתחילת
.כל שורה
של # צמדיםרווח + כוכבית
# רווחים בשורה
# שורה
4 3 1
5 2 2
6 1 3
7 0 4
מאחר ויש סטיה קבועה בין מספר השורה לעמודההשמאלית, נשנה את מספור השורות:
(4ציור טרפז: ניתוח הבעיה )
18 © 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
תרשים זרימה
19 © 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:
.iצייר רווח
)b עבורj 1 בטווח...i:.iצייר כוכבית ורווח
)cצייר ירידת שורה
ובכתיבה פורמאלית
20 © 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אסטרטגיה
מספרים והצגה כמה ספרות מופיעות בשניהם2קריאת
21 © Keren Kalif
9 עד 0עבור כל אחת מהספרות:בדוק האם הספרה מופיעה במספר הראשון◦אם כן, בדוק האם מופיעה במספר השני◦counterאם כן, עדכן את ◦
:בדיקה האם ספרה מופיעה במספרבידוד כל ספרה באמצעות "תן/קצץ ספרה ימנית" ובדיקה האם ◦
שווה לספרה המבוקשת
הרעיון הכללי לפתרון
22 © Keren Kalif
יש לעבור על כל הספרות 9 ל- 0עבור כל ספרה בין המספר.
יש לעבור על כל ספרות 9 ל- 0מאחר ועבור כל ספרה בין המספר, יש להשתמש בפעולת הקיצוץ שהורסת את
המספר.לכן נעבוד עם משתנה עזר, כדי לשמור את המספר המקורי.◦
אם נזהה שאחת הספרות היא הספרה המבוקשת, איןצורך להמשיך ולבדוק את שאר הספרות, ולכן נתחזק
משתנה שתפקידו להעיד האם הספרה נמצאה במספר.
הרעיון הכללי לבדיקה הם ספרה מופיעה במספר
23 © Keren Kalif
תרשים זרימה(1 )חלק
24 © Keren Kalif
בדיקה האם הספרה מופיעה במספר הראשון
אם מופיעה במספר הראשון נעבור לבדוק האם מופיעה
במספר שניאם אינה מופיעה במספר הראשון נעבור לבדוק את
הספרה הבאה
נשים לב שלפני פירוק המספר נשמור את ערכו, כדי שנוכל
להמשיך לעבוד איתו בסיבוב הבא.
תרשים זרימה(2 )חלק
25 © Keren Kalif
בדיקה האם הספרה מופיעה במספר השני
אם מופיעה גם במספר השני נגדיל את ה-
counter
בכל מקרה בסוף נעבור לבדוק את הספרה הבאה
ובכתיבה פורמאלית num2 ו- num1קלוט 1.count=0הגדר 2.:9...0 בטווח iעבור 3.
.a בצעtemp=num1
.b הגדרfound=false
.c כל עודtemp>0 וגם found=false:.I אם ספרה ימנית שלtemp היא i:
.A בצעfound=true
.II קצץ ספרה ימנית שלtemp
.d אםfound=true:.I בצעtemp=num2
.II הגדרfound=false.III כל עודtemp>0 וגם found=false:
.A אם ספרה ימנית שלtemp היא i:
found=trueבצע 1(.B קצץ ספרה ימנית שלtemp
.IV אםfound=true:.A הגדל אתcount-1 ב
countהצג את 4.26 © Keren Kalif
מספרים ולהציג האם השני הוא תת-מספר 2יש לקלוט של הראשון
:דוגמאות יוצג "כן"23 ו- 1234עבור ◦ יוצג "לא"823 ו- 1234עבור ◦ יוצג "לא"144 ו- 1244עבור ◦
האם מספר הוא תת-מספר במספר אחר
27 © Keren Kalif
נגדיר את הספרה הימנית שלnum2 -כ current -כל עוד לא סיימנו לעבור על כל הספרות בnum1 ועדיין לא
כתת-מספר:num2זיהינו את :num1 היא הספרה הימנית של currentנבדוק האם ◦
אם כן: נזיז אתcurrent -להיות הספרה השמאלית הבאה ב num2 אחרת: נחזיר אתcurrent להיות הספרה הימנית של num2num1קצץ ספרה ימנית מ- ◦
-אם לא נותרו ספרות בnum2 משמע הוא תת-מספר של num1
אחרת, אינו תת-מספר
הרעיון הכללי לפתרון
28 © 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
אחרת, אינו תת-מספר
(2הרעיון הכללי לפתרון )
29 © Keren Kalif
הרצה יבשה של הרעיון הכללי:
num1 = 1234num2 = 53
current
num1 = 123num1 = 12num1 = 1num1 = 0
הזזת הסמן שמאלה משמע קיצוץ ספרה ימנית
num2הזזת הסמן לתחילתו של מרמזת שיש לשמור את ערכו המקורי
, ולכן יהיה שימוש num2של במשתנה עזר
: כיתבו את הרעיון בכתיבה תרגילפורמאלית
לולאות מקוננותהצגת הפתרון תרשים זרימהכתיבת הפתרון בפסאודו-קוד
30© Keren Kalif
ביחידה זו למדנו: