1 / 30

הרצאה 04 בקרת זרימה: לולאות 2

הרצאה 04 בקרת זרימה: לולאות 2. קרן כליף. ביחידה זו נלמד:. לולאות מקוננות הצגת הפתרון תרשים זרימה כתיבת הפתרון בפסאודו-קוד. ציור מלבן. יש לקלוט מהמשתמש גובה ורוחב ולהציג מלבן של כוכביות לפי הכמויות שנקלטו למשל עבור גובה 3 ורוחב 5 יוצג המלבן הבא: * * * * * * * * * *

phyre
Download Presentation

הרצאה 04 בקרת זרימה: לולאות 2

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. הרצאה 04בקרת זרימה: לולאות 2 קרן כליף

  2. ביחידה זו נלמד: • לולאות מקוננות • הצגת הפתרון תרשים זרימה • כתיבת הפתרון בפסאודו-קוד

  3. ציור מלבן • יש לקלוט מהמשתמש גובה ורוחב ולהציג מלבן של כוכביות לפי הכמויות שנקלטו • למשל עבור גובה 3 ורוחב 5 יוצג המלבן הבא: * * * * * * * * * * * * * * * • נשים לב שיש פה תהליך מרכזי שחוזר על עצמו 3 פעמים והוא הדפסת שורה • בכל הדפסת שורה יש תהליך שחוזר על עצמו והוא הדפסת כוכבית אחת ולבסוף ירידת שורה.

  4. תרשים זרימה תהליך שחוזר על עצמו height פעמים בתוך התהליך המרכזי, ישנו תהליך נוסף שחוזר על עצמו width פעמים

  5. ובכתיבה פורמאלית • קלוט width ו- height • עבור i בטווח 1...height: • עבור j בטווח 1...width: • הדפס כוכבית • רד שורה הרצה יבשה: width = 3 height = 2 i=1 i=2 j = 1 j = 2 j = 3 הספירה של j מתחילה מההתחלה * * * * * *

  6. ציור משולש מוצמד לשמאל • יש לקלוט מהמשתמש אורך בסיס של משולש ולהציג משולש ישר-זוית של כוכביות, מוצמד לשמאל, שבסיסו כגודל שנקלט. • למשל, עבור בסיס בגודל 4 יודפס המשולש הבא: * * * * * * * * * * • נשים לב שיש פה תהליך מרכזי שחוזר על עצמו 4 פעמים והוא הדפסת שורה. העובדה שאורך השורות שונה אינה משנה! • בכל הדפסת שורה יש תהליך שחוזר על עצמו והוא הדפסת כוכבית אחת ולבסוף ירידת שורה.

  7. ציור משולש מוצמד לשמאל: ניתוח הצורה • מאחר ובכל שורה כמות שונה של כוכביות, ננסה למצוא את החוקיות, ולכן נצייר את הטבלה הבאה: • ניתן לזהות קשר בין מספר הכוכביות למספר השורה: מספר הכוכביות הוא כמספר השורה * * * * * * * * * * * * * * *

  8. תרשים זרימה הפעולות שבתוך חלק זה אמורות להדפיס שורה אחת כל פעם. i למעשה מייצג את מספר השורה שאנחנו כרגע מציירים. פעולה זו קובעת כמה כוכביות יודפסו. במקרה זה i, מאחר ו- i מיצג את מספר השורה, שערכה זהה למספר הכוכביות בשורה.

  9. ובכתיבה פורמאלית • קלוט basis • עבור i בטווח 1...basis: • עבור j בטווח 1...i: • הדפס כוכבית • רד שורה הרצה יבשה: basis = 3 i=2 i=3 i=1 j = 3 j = 2 j = 1 הספירה של j מתחילה מההתחלה ורצה עד i המעודכן * * * * * *

  10. ציור משולש מוצמד לשמאל שבסיסו למעלה • יש לקלוט מהמשתמש אורך בסיס של משולש ולהציג משולש ישר-זוית של כוכביות, מוצמד לשמאל, שבסיסו כגודל שנקלט, אבל הבסיס למעלה. • למשל, עבור בסיס בגודל 4 יודפס המשולש הבא: * * * * * * * * * * • גם בדוגמא זו יש תהליך מרכזי שחוזר על עצמו 4 פעמים והוא הדפסת שורה. העובדה שאורך השורות שונה אינה משנה! הגבלה: כל פלט תמיד יוצג מלמעלה למטה. כלומר, חובה עלינו להתחיל לצייר מהשורה הראשונה עם 4 הכוכביות עד האחרונה עם כוכבית אחת.

  11. ציור משולש הפוך: ניתוח הצורה • מאחר ובכל שורה כמות שונה של כוכביות, ננסה למצוא את החוקיות, ולכן נצייר את הטבלה הבאה: • ניתן לזהות שמספר הכוכביות מהווה סדרה יורדת, החל מגודל הבסיס עד 1. • לכן ננסה למספר את השורות באופן שונה. * * * * * * * * * * * * * * *

  12. תרשים זרימה הפעם ערכו של i קטן בכל סיבוב: החל מערכו של basis עד שהוא מגיע להיות 1.

  13. ובכתיבה פורמאלית • קלוט basis • עבור i בטווח basis...1: • עבור j בטווח 1...i: • הדפס כוכבית • רד שורה הרצה יבשה: basis = 3 i= 3 i= 1 i=2 j = 1 j = 2 j = 3 * * * * * *

  14. ציור טרפז • יש לקלוט את רוחבו העליון של טרפז ואת רוחבו התחתון. • ניתן להניח כי הרוחב העליון קצר מהרוחב התחתון. • יש לצייר טרפז בהתאם לרוחבים שנקלטו. • דוגמא: • עבור רוחב עליון 4 ורוחב תחתון 7 נצייר את הטרפז הבא: * * * * * * * * * * * * * * * * * * * * * * • כלומר, בשורה הראשונה 4 כוכביות, בשניה 5 וכך עד שיש שורה עם 7 כוכביות. • נשים לב שציור הכוכביות בכל שורה אינו בהכרח מתחיל מתחילת השורה!

  15. ציור טרפז: ניתוח הבעיה • מאחר וכל שורה, פרט לאחרונה, אינה מתחילה צמודה לשמאל, יש למצוא דרך לצייר את הכוכביות יותר ימינה בשורה. • הדרך היא לצייר רווחים (תו שאינו נראה אך מקדם את המיקום) לפני ציור הכוכביות. • ניתן לראות שאכן בצד שמאל הטרפז נראה תקין, אבל צידו הימני ישר, ולכן ננסה לשים רווח בין כל כוכבית • ---*-*-*-* • --*-*-*-*-* • -*-*-*-*-*-* • *-*-*-*-*-*-* • ---**** • --***** • -****** • *******

  16. ציור טרפז: ניתוח הבעיה (2) • ניתן לראות שכל שורה מורכבת מכמות כלשהי של רווחים, ואז זוגות של כוכבית+רווח, פרט לכוכבית האחרונה, שאין מימינה רווח • לצורך הכלליות, נצייר גם ליד הכוכבית האחרונה רווח (לא ישנה את התצוגה על המסך מאחר ורווח הוא תו שאינו נראה) • ---*-*-*-*- • --*-*-*-*-*- • -*-*-*-*-*-*- • *-*-*-*-*-*-*- • ---*-*-*-* • --*-*-*-*-* • -*-*-*-*-*-* • *-*-*-*-*-*-*

  17. ציור טרפז: ניתוח הבעיה (3) • נצייר טבלה שבנוסף לכמות הצמדים של כוכבית+רווח בכל שורה, מציינת כמה רווחים יש לצייר בתחילת השורה • ---*-*-*-*- • --*-*-*-*-*- • -*-*-*-*-*-*- • *-*-*-*-*-*-*- הצגת הפלט הוא תמיד מלמעלה למטה, ומשמאל לימין, לכן עלינו להקפיד על ציור הרווחים בתחילת כל שורה.

  18. ציור טרפז: ניתוח הבעיה (4) • מאחר ויש סטיה קבועה בין מספר השורה לעמודה השמאלית, נשנה את מספור השורות: • ---*-*-*-*- • --*-*-*-*-*- • -*-*-*-*-*-*- • *-*-*-*-*-*-*- סכום 2 העמודות השמאליות הינו כגודל הרוחב התחתון נזהה כי כמות הרווחים היא: buttom - line

  19. בתוך התהליך המרכזי שחוזר על עצמו (הדפסת שורה), יש שני תהליכים: 1- הדפסת רווחים 2- הדפסת צמדים של כוכבית+רווח תרשים זרימה למשל עבור top=4 ו- buttom=7: • ---*-*-*-*- • --*-*-*-*-*- • -*-*-*-*-*-*- • *-*-*-*-*-*-*-

  20. ובכתיבה פורמאלית הרצה יבשה: top = 4 buttom = 7 • קלוט מהמשתמש top • קלוט מהמשתמש buttom • עבור i בטווח top...buttom: • עבור j בטווח 1...buttom-i: • צייר רווח • עבור j בטווח 1...i: • צייר כוכבית ורווח • צייר ירידת שורה i= 4 i= 7 i= 6 i= 5 j = 2 j = 1 j = 4 j = 5 j = 3 _ _ _ *_ *_ *_ *_ _ _ *_ *_ *_ *_ *_ _ *_ *_ *_ *_ *_ *_ *_ *_ *_ *_ *_ *_ *_

  21. קריאת 2 מספרים והצגה כמה ספרות מופיעות בשניהם • קרא מהמשתמש 2 מספרים והצג כמה ספרות מופיעות בשניהם • דוגמאות: • עבור 1734 ו- 7839 יוצג 2, כי הספרות 7 ו- 3 מופיעות בשניהם • עבור 112233 ו- 33 יוצג 1 כי הספרה 3 מופיעה בשניהם • 2 אסטרטגיות לפעולה: • עבור כל ספרה בראשון נבדוק האם מופיעה בשני. יש לוודא שהספרה טרם הופיעה בראשון כדי לא לבדוק פעמיים. • עבור כל ספרה (0-9) נבדוק האם היא מופיעה ב- 2 המספרים. • אסטרטגיה 2 יותר פשוטה

  22. הרעיון הכללי לפתרון • עבור כל אחת מהספרות 0 עד 9: • בדוק האם הספרה מופיעה במספר הראשון • אם כן, בדוק האם מופיעה במספר השני • אם כן, עדכן את counter • בדיקה האם ספרה מופיעה במספר: • בידוד כל ספרה באמצעות "תן/קצץ ספרה ימנית" ובדיקה האם שווה לספרה המבוקשת

  23. הרעיון הכללי לבדיקה הם ספרה מופיעה במספר • עבור כל ספרה בין 0 ל- 9 יש לעבור על כל הספרות המספר. • מאחר ועבור כל ספרה בין 0 ל- 9 יש לעבור על כל ספרות המספר, יש להשתמש בפעולת הקיצוץ שהורסת את המספר. • לכן נעבוד עם משתנה עזר, כדי לשמור את המספר המקורי. • אם נזהה שאחת הספרות היא הספרה המבוקשת, אין צורך להמשיך ולבדוק את שאר הספרות, ולכן נתחזק משתנה שתפקידו להעיד האם הספרה נמצאה במספר.

  24. תרשים זרימה (חלק 1) נשים לב שלפני פירוק המספר נשמור את ערכו, כדי שנוכל להמשיך לעבוד איתו בסיבוב הבא. בדיקה האם הספרה מופיעה במספר הראשון אם מופיעה במספר הראשון נעבור לבדוק האם מופיעה במספר שני אם אינה מופיעה במספר הראשון נעבור לבדוק את הספרה הבאה

  25. תרשים זרימה (חלק 2) בדיקה האם הספרה מופיעה במספר השני אם מופיעה גם במספר השני נגדיל את ה- counter בכל מקרה בסוף נעבור לבדוק את הספרה הבאה

  26. ובכתיבה פורמאלית • קלוט num1 ו- num2 • הגדר count=0 • עבור i בטווח 0...9: • בצע temp=num1 • הגדר found=false • כל עוד temp>0 וגם found=false: • אם ספרה ימנית של temp היא i: • בצע found=true • קצץ ספרה ימנית של temp • אם found=true: • בצע temp=num2 • הגדר found=false • כל עוד temp>0 וגם found=false: • אם ספרה ימנית של temp היא i: • בצע found=true • קצץ ספרה ימנית של temp • אם found=true: • הגדל את count ב-1 • הצג את count

  27. האם מספר הוא תת-מספר במספר אחר • יש לקלוט 2 מספרים ולהציג האם השני הוא תת-מספר של הראשון • דוגמאות: • עבור 1234 ו- 23 יוצג "כן" • עבור 1234 ו- 823 יוצג "לא" • עבור 1244 ו- 144 יוצג "לא"

  28. הרעיון הכללי לפתרון • נגדיר את הספרה הימנית של num2 כ- current • כל עוד לא סיימנו לעבור על כל הספרות ב- num1 ועדיין לא זיהינו את num2 כתת-מספר: • נבדוק האם current היא הספרה הימנית של num1: • אם כן: נזיז את current להיות הספרה השמאלית הבאה ב- num2 • אחרת: נחזיר את current להיות הספרה הימנית של num2 • קצץ ספרה ימנית מ- num1 • אם לא נותרו ספרות ב- num2 משמע הוא תת-מספר של num1 • אחרת, אינו תת-מספר הרצה יבשה של הרעיון הכללי: num2 = 23 num1 = 1234 num1 = 123 num1 = 12 num1 = 1 אם לא נותרו ספרות ב- num2 משמע הוא תת-מספר של num1 current

  29. תרגיל: כיתבו את הרעיון בכתיבה פורמאלית הרעיון הכללי לפתרון (2) • נגדיר את הספרה הימנית של num2 כ- current • כל עוד לא סיימנו לעבור על כל הספרות ב- num1 ועדיין לא זיהינו את num2 כתת-מספר: • נבדוק האם current היא הספרה הימנית של num1: • אם כן: נזיז את current להיות הספרה השמאלית הבאה ב- num2 • אחרת: נחזיר את current להיות הספרה הימנית של num2 • קצץ ספרה ימנית מ- num1 • אם לא נותרו ספרות ב- num2 משמע הוא תת-מספר של num1 • אחרת, אינו תת-מספר הזזת הסמן שמאלה משמע קיצוץ ספרה ימנית הרצה יבשה של הרעיון הכללי: הזזת הסמן לתחילתו של num2 מרמזת שיש לשמור את ערכו המקורי של num2, ולכן יהיה שימוש במשתנה עזר num2 = 53 num1 = 1234 num1 = 123 num1 = 12 num1 = 1 num1 = 0 current

  30. ביחידה זו למדנו: • לולאות מקוננות • הצגת הפתרון תרשים זרימה • כתיבת הפתרון בפסאודו-קוד

More Related