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