1 יסודות מדעי המחשב
Transcription
1 יסודות מדעי המחשב
יסודות מדעי המחשב 1 בשפת Java חלק ב' ד"ר מיכל ארמוני – ראש צוות הכתיבה יעל בילצ'יק )סופרין( נעה גרדוביץ עדי גרין אתי מנשה ייעוץ :ד"ר דוד גינת מהדורת עיצוב תשס"ז 2006 אוניברסיטת תל-אביב החוג להוראת המדעים מטה מל"מ המרכז הישראלי להוראת המדעים ע"ש עמוס דה-שליט משרד החינוך האגף לתכנון ולפיתוח תכניות לימודים יסודות מדעי המחשב 1בשפת Java חלק ב' ד"ר מיכל ארמוני יעל בילצ'יק )סופרין( נעה גרדוביץ עדי גרין אתי מנשה ייעוץ :ד"ר דוד גינת כל הזכויות שמורות © 2006 "השראה" הוצאה לאור ,ת"ד ,19022חיפה 34341 טל' ,8254752-04 :פקס8254752-1534 : E-Mail: books@hashraa.co.il www.hashraa.co.il השראה הוצאה לאור מהדורה ראשונה 2006 אין לשכפל ,להעתיק ,לצלם ,לתרגם ,להקליט ,לאחסן במאגר מידע כלשהו ,לשדר או לקלוט בכל דרך או בכל אמצעי אלקטרוני ,אופטי או מכני )לרבות צילום ,הקלטה ,אינטרנט ,מחשב ודואר אלקטרוני( ,כל חלק שהוא מהחומר שבספר זה .שימוש מסחרי מכל סוג בחומר הכלול בספר זה אסור בהחלט ,אלא ברשות מפורשת בכתב מהמו"ל ומהגורמים המפורטים להלן. © כל הזכויות שמורות אוניברסיטת תל-אביב ומשרד החינוך פתח דבר יחידות הלימוד "יסודות מדעי המחשב 1ו "2-מיועדות להקניית מושגי יסוד ועקרונות שעליהם מושתת התחום מדעי המחשב .פרקי יחידות הלימוד משלבים שני ערוצים – ערוץ תיאורטי וערוץ יישומי .הערוץ התיאורטי מתמקד בחשיבה אלגוריתמית ופיתוח וניתוח אלגוריתמים ,שהם מתכונים לביצוע משימות .הערוץ היישומי כולל יישום של האלגוריתמים בשפת התכנות ,Javaשהיא שפה מונחית עצמים. ספר זה כולל את היחידה "יסודות מדעי המחשב ."1היחידה מציגה בעיות ראשונות ופתרונותיהן, המיועדים לביצוע למחשב .הבעיות נקראות בעיות אלגוריתמיות ,ופתרונותיהן – אלגוריתמים. האלגוריתמים מיושמים באמצעות תוכניות מחשב .במהלך הלימוד מוצגים המרכיבים הבסיסיים של אלגוריתמים ותוכניות מחשב .ההצגה משולבת בפיתוח וניתוח אלגוריתמים ,וכוללת התייחסות מצומצמת למושג עצמים .הפיתוח של אלגוריתמים נעשה בשלבים ,תוך שימת דגש על ניתוח בעיה והתייחסות להיבטים של נכונות ויעילות .כמו כן ,מושם דגש על מבנים תבניתיים בפתרונות אלגוריתמיים ,הנקראים תבניות. ספר זה פותח על בסיס ספר הלימוד "יסודות מדעי המחשב "1שפותח במכון ויצמן למדע בסוף שנות ה .90-בספר הקודם נעשה היישום של אלגוריתמים באמצעות שפת התכנות ,Pascalשהיא שפה פרוצדורלית .בספר זה נעשה היישום בשפת ,Javaשהיא מונחית עצמים .העקרונות האלגוריתמיים בשני הספרים זהים ,וכך גם הנושאים בשמונת הפרקים הראשונים של שני הספרים .שני הפרקים האחרונים בספר זה מציגים מבוא ראשוני לעצמים )משולב בנושאים האלגוריתמיים של הפרקים האחרונים בספר הקודם( .בספר "יסודות מדעי המחשב "2מורחב המבט על עצמים ,אלגוריתמים ותבניות. תודות .ספר זה פותח בתמיכת מפמ"ר מדעי המחשב במשרד החינוך ,ד"ר אבי כהן ,וחברי שתי ועדות המקצוע האחרונות להוראת מדעי המחשב – הועדה בראשות פרופ' עמיהוד אמיר והועדה )הנוכחית( בראשות פרופ' יהודית גל-עזר .תודתנו נתונה להם על תמיכתם והערותיהם .בנוסף ,לאורך הספר משולבת התייחסות מפורשת לתבניות בפיתוח וניתוח אלגוריתמים .ההתייחסות מבוססת על הספר "תבניות במדעי המחשב" שפותח בשנת 2001על-ידי חברי קבוצת הוראת מדעי המחשב בחוג להוראת המדעים באוניברסיטת תל-אביב .ארנה מילר ,אחת מחברות הקבוצה ,אף חקרה בצורה מסודרת את הנושא של הוראה מוכוונת תבניות ,ושיתפה את חברות צוות הכתיבה מניסיונה .תודתנו נתונה לה על כך. תוכן העניינים פרק – 1מבוא11 .................................................................................. 1.1מהו מחשב?......................................................................................... 11 1.2חומרה................................................................................................. 13 1.3תוכנה16 .................................................................................................. 1.4התפתחות המחשבים ומדעי המחשב........................................................ 20 התפתחות הנדסית וטכנולוגית – חומרה20 ....................................................... התפתחות הנדסית וטכנולוגית – תוכנה....................................................... 22 התפתחות מדעית.................................................................................... 22 סיכום........................................................................................................ 23 שאלות נוספות............................................................................................ 24 פרק – 2פתרון בעיות אלגוריתמיות...................................................... 25 2.1אלגוריתמים25 .......................................................................................... 2.2תבניות................................................................................................ 36 סיכום........................................................................................................ 37 שאלות נוספות............................................................................................ 38 פרק – 3מודל חישוב בסיסי41 ................................................................ 3.1צעדים ראשונים :הוראת פלט ,הוראת קלט ומשתנים.................................... 41 3.2הוראת השמה51 ....................................................................................... 3.3טבלת מעקב......................................................................................... 58 3.4החלפה בין ערכי משתנים65 ........................................................................ 3.5טיפוסים............................................................................................... 68 3.6קבועים................................................................................................ 73 סיכום........................................................................................................ 74 סיכום מרכיבי שפת Javaשנלמדו בפרק 77 .......................................................3 שאלות נוספות............................................................................................ 80 תבניות – פרק ...................................................................................3 87 החלפת ערכים בין שני משתנים......................................................... 87 היפוך סדר האיברים בסדרה............................................................. 91 ממוצע של סדרת מספרים................................................................ 93 הזזה מעגלית בסדרה...................................................................... 96 פרק – 4הרחבה בפיתוח אלגוריתמים................................................... 99 4.1מבט נוסף אל התהליך של פיתוח אלגוריתם ויישומו..................................... 99 המחלקה המתמטית................................................................................. 105 4.2פעולות חלוקה בשלמים.......................................................................... 106 עוד על פעולת השארית113 ............................................................................. המרת ערך שלם לממשי115 ............................................................................ פירוק מספר דו-ספרתי לספרותיו................................................................ 118 4.3הטיפוס התווי123 ........................................................................................ המרה מתו המייצג ספרה לערך מספרי מתאים128 .............................................. סיכום........................................................................................................ 129 סיכום מרכיבי שפת Javaשנלמדו בפרק 130 .......................................................4 שאלות נוספות............................................................................................ 131 תבניות – פרק ...................................................................................4 135 חלוקת כמות פריטים לקבוצות בגודל נתון............................................ 135 פירוק מספר חיובי לספרותיו............................................................. 138 בניית מספר................................................................................... 141 פרק – 5ביצוע מותנה145 ........................................................................ 5.1הוראה לביצוע בתנאי145 .............................................................................. הוראה לביצוע בתנאי במבנה ...íà ......................................... ...úøçà 145 הוראה לביצוע בתנאי במבנה 155 ...................................................... ...íà התניית ביצוע של יותר מהוראה אחת.......................................................... 162 ביטויים בוליאניים הכוללים תווים166 ................................................................. 5.2תנאי מורכב.......................................................................................... 171 הקשר 172 .....................................................................................íâå הקשר .......................................................................................åà 177 תנאים מורכבים מעורבים.......................................................................... 185 5.3קינון של הוראה לביצוע בתנאי................................................................. 186 * 5.4הוראת שרשרת לביצוע בתנאי197 .................................................................. * 5.5הוראת בחירה....................................................................................... 203 סיכום........................................................................................................ 210 סיכום מרכיבי שפת Javaשנלמדו בפרק 211 .......................................................5 שאלות נוספות............................................................................................ 213 תבניות – פרק ...................................................................................5 219 מציאת מקסימום ומינימום בסדרה219 ...................................................... סידור ערכים בסדרה225 ........................................................................ ערכים עוקבים................................................................................ 228 זוגיות מספר230 ................................................................................... מחלק של מספר............................................................................. 232 פרק – 6נכונות אלגוריתמים............................................................... 235 סיכום........................................................................................................ 245 פרק – 7ביצוע חוזר247 ........................................................................... 7.1ביצוע חוזר באורך ידוע מראש.................................................................. 247 7.2מציאת מקסימום או מינימום.................................................................... 267 7.3מציאת מקום מקסימום או מינימום............................................................ 271 7.4ביצוע חוזר בתנאי.................................................................................. 274 ביצוע חוזר עם זקיף................................................................................. 274 ביצוע חוזר עם תנאי כניסה כלשהו.............................................................. 282 ביצוע חוזר אינסופי294 ................................................................................... 7.5משתנים מטיפוס בוליאני......................................................................... 299 7.6הקשר הלוגי 307 .............................................................................(not) àì 7.7קינון הוראות לביצוע חוזר310 ........................................................................ סיכום........................................................................................................ 317 סיכום מרכיבי שפת Javaשנלמדו בפרק 319 .......................................................7 תבניות – פרק ...................................................................................7 321 מנייה וצבירה................................................................................. 321 ממוצע של סדרת מספרים................................................................ 332 מציאת מקסימום או מינימום בסדרה337 ................................................... מציאת ערך נלווה למקסימום או למינימום בסדרה................................. 342 איסוף בקיזוז.................................................................................. 347 פירוק מספר חיובי לספרותיו............................................................. 352 בניית מספר................................................................................... 354 האם כל הערכים בסדרה מקיימים תנאי?356 ............................................. האם קיים ערך בסדרה המקיים תנאי?................................................ 359 מציאת כל הערכים בסדרה המקיימים תנאי363 .......................................... מעבר על זוגות סמוכים בסדרה......................................................... 366 פרק – 8יעילות של אלגוריתמים369 .......................................................... סיכום........................................................................................................ 382 פרק – 9המחלקה מחרוזת ) (Stringומבוא לעצמים................................. 383 9.1היכרות ראשונית עם המחלקה .......................................................String 383 9.2ביצוע פעולות על מחרוזות....................................................................... 386 שרשור מחרוזות...................................................................................... 391 ומה בפנים? פעולות המסתכלות אל תוך הקנקן............................................. 393 9.3השמת מחרוזות.................................................................................... 396 סיכום........................................................................................................ 408 רשימת פעולות על מחרוזות410 ........................................................................... פרק – 10מערכים............................................................................ 413 10.1מערך ואיברי מערך.............................................................................. 413 10.2חריגה מגבולות מערך434 ........................................................................... 10.3קשרים בין מערכים.............................................................................. 438 עיבוד מערכים במקביל ובקצב זהה438 .............................................................. עיבוד מערכים במקביל ,בקצב לא זהה439 ......................................................... 10.4מערך מונים........................................................................................ 442 10.5מערך צוברים...................................................................................... 446 10.6יעילות מקום....................................................................................... 447 10.7בחירה אקראית................................................................................... 454 סיכום........................................................................................................ 460 סיכום מרכיבי שפת Javaשנלמדו בפרק 461 .....................................................10 תבניות – פרק .................................................................................10 463 מערך מונים................................................................................... 463 מערך צוברים................................................................................. 466 חישוב שכיח471 ................................................................................... הזזה מעגלית בסדרה...................................................................... 474 הזזה של תת-סדרה........................................................................ 477 היפוך סדר הערכים בסדרה.............................................................. 479 פרק – 6נכונות אלגוריתמי לאור ההיסטוריה הקצרה של מדעי המחשב ישנ אינספור דוגמאות של תוכניות שגויות ,אשר לא מעט מה הסתיימו בכי רע .אחת הדוגמאות הוא סיפורה של ספינת חלל אמריקנית מסדרת מרינר שנשלחה אל כוכב הלכת ונוס .הספינה אבדה כתוצאה משגיאה בתוכנית המחשב שהופקדה על בקרת הטיסה ,ומיליוני דולרי ירדו לטמיו. חלק לא מבוטל מ המחקר במדעי המחשב מוקדש לתחו הנקרא "הוכחת נכונות של תוכניות". מטרתה של הוכחת נכונות של תוכנית היא אימות מלא של הטענה שהתוכנית מציגה עבור כל קלט את הפלט הדרוש. חוקרי פיתחו ומפתחי שיטות שונות להוכחת נכונות של תוכניות .שיטות אלה ה מתמטיות באופיי ונשענות על תיאוריות מתמטיות מורכבות למדי .חומר הלימוד של "יסודות מדעי המחשב" איננו ד בהוכחת נכונות של תוכניות ,כיוו שהדבר מחייב ידע מתמטי שאיננו נרכש בביתספר תיכו. א ההתייחסות לנכונות של תוכניות חשובה לאור חומר הלימוד כולו ,כבר ע פיתוח תוכניות ראשונות .לכ ,אנו מציגי נושא זה כבר עתה ,בצורה פשוטה ואינטואיטיבית. אלגורית )תוכנית( לפתרו בעיה אלגוריתמית נתונה הוא נכו א ביצועו מביא להצגת הפלט הדרוש עבור כל קלט חוקי )כלומר ,כל קלט המתאי להגדרת הבעיה( מספר האפשרויות השונות לקלטי חוקיי הוא )בדר כלל( רב ,ולעיתי רבות אפילו אינסופי ,ולכ לא מתקבל על הדעת להיווכח בנכונותו של אלגורית עלידי בדיקת הפלט עבור כל קלט אפשרי. בפרקי הלימוד של "יסודות מדעי המחשב" אנו בודקי את נכונותו של אלגורית עלידי בדיקת הפלט עבור דוגמאות שונות של קלט. בפרק 4הצגנו בדיקת נכונות עבור דוגמאות קלט מגוונות; כלומר ,דוגמאות קלט אשר מאפייניה מבטאי את מגוו הקלטי האפשריי .עתה ,נחדד בנקודה של בדיקת נכונות ,ונשתמש בדר כלל במושג דוגמאות קלט מייצגות. דוגמאות קלט מייצגות ה דוגמאות קלט אשר כל אחת מה מייצגת קבוצת קלטי .בחירה ממצה של דוגמאות קלט מייצגות היא בחירה המבטאת חלוקה ממצה של הקלטי האפשריי לקבוצות מיוצגות. בפתרו הבעיה הבאה נמחיש בחירה ממצה של דוגמאות קלט מייצגות ,ונראה שימוש בדוגמאות הקלט המייצגות כדי לזהות שגיאה בתוכנית ולתקנה. הוראת המדעים ,אוניברסיטת תל-אביב -235- מדעי המחשב 1 בעיה בחירת דוגמת, הדגמה של חלוקת הקלטי לקבוצות אשר מאפייניה שוני:מטרת הבעיה ופתרונה ושימוש בדוגמאות הקלט המייצגות כדי לאמת נכונותה של תוכנית וכדי,קלט מייצגת לכל קבוצה .לתקנה במידת הצור :נתונה התוכנית הבאה /* שתי אותיות לועזיות גדולות:קלט הודעה האם האותיות עוקבות זו לזו:פלט */ public class Letters { public static void main(String[] args) { char letter1, letter2; letter1 = In.readChar("insert a capital letter, avoid the letter Z"); letter2 = In.readChar("insert another capital letter, avoid the letter Z"); if (letter2 == letter1 + 1) { System.out.println("one of the letters follows the other in the ABC"); } else { System.out.println("These are not consecutive letters of the ABC"); } }// main } // class Letters מדעי המחשב -236- אביב- אוניברסיטת תל,הוראת המדעים ביצוע התוכנית יביא להצגת הודעת פלט מתאימה רק עבור חלק מ הקלטי האפשריי. חלקו את הקלטי האפשריי לקבוצות ,בחרו דוגמת קלט מייצגת לכל קבוצה ,ותארו עבור אילו דוגמאות תוצג הודעה מתאימה ועבור אילו דוגמאות תוצג הודעה לא מתאימה .אחרכ ,תקנו את התוכנית כ שעבור כל קלט תוצג הודעה מתאימה. ? מכותרת התוכנית וממשפטי הפלט נית לראות שמטרת התוכנית היא לבדוק הא שתי האותיות הנתונות כקלט ה אותיות לועזיות עוקבות .מהי חלוקה מתאימה של הקלטי האפשריי לקבוצות? מתאי לחלק את הקלטי האפשריי לשתי הקבוצות הבאות: .1קלטי בה האותיות הנתונות ה אותיות לועזיות עוקבות. .2קלטי בה האותיות הנתונות אינ אותיות לועזיות עוקבות. ? החלוקה המתוארת אכ מבטאת אבחנה בי קלטי אשר לה מאפייני שוני .הא חלוקה זו מספיקה? הא לא קיימי קלטי בעלי מאפייני שוני בקבוצות אלו? למשל ,הקלט B Cשיי לקבוצה הראשונה ,בה האותיות הינ לועזיות עוקבות .ג הקלט C Bשיי לקבוצה הראשונה ,א לשני קלטי אלה מאפייני שוני .בקלט B Cהאות השנייה עוקבת לאות הראשונה ,ואילו בקלט C Bהאות הראשונה עוקבת לאות השנייה. שימו ♥ :נית ג לחלק את קבוצת הקלטי השנייה באופ דומה ,א חלוקה זו איננה נחוצה :כיוו שהאותיות אינ עוקבות ,הרי סדר הופעת בקלט איננו משנה. א כ ,נקבל את החלוקה הבאה של הקלטי האפשריי לשלוש קבוצות: 1א .האות השנייה עוקבת לאות הראשונה. 1ב .האות הראשונה עוקבת לאות השנייה. .2שתי האותיות אינ עוקבות. ? חילקנו את הקלטי האפשריי חלוקה ממצה לקבוצות .מה תהיה בחירה ממצה של דוגמאות קלט מייצגות עבור הבעיה הנתונה? בחירה ממצה של דוגמאות קלט מייצגות תהיה בחירת דוגמת קלט מכל קבוצה .למשל ,קבוצת דוגמאות הקלט הבאות מבטאת בחירה ממצה) X Y :מייצגת את קבוצת הקלטי 1א(; ) E Dמייצגת את קבוצת הקלטי 1ב(; ) D Oמייצגת את קבוצת הקלטי (2 ? עבור אלו מדוגמאות הקלט המתוארות תוצג הודעת פלט מתאימה? הוראת המדעים ,אוניברסיטת תל-אביב -237- מדעי המחשב עבור דוגמת הקלט הראשונה ) (X Yוהשלישית ) (D Oתוצג הודעת פלט מתאימה .א עבור דוגמת הקלט השנייה ) (E Dתוצג הודעת פלט לא מתאימה! עבור דוגמה זו תוצג ההודעה: These are not consecutive letters of the ABC הודעה לא מתאימה תוצג ,בעצ ,עבור כל קלט מהקבוצה 1ב ,המיוצגת עלידי דוגמת הקלט השנייה. ? כיצד נית לתק את התוכנית ,כ שתציג פלט דרוש עבור כל קלט חוקי? כלומר ,כ שג עבור קלטי מ הקבוצה השנייה תוצג הודעה מתאימה? יש להרחיב את הביטוי הבוליאני שבמשפט .ifהביטוי הבוליאני שבתוכנית הנתונה כולל רק את האפשרות שהאות השנייה בקלט היא אות עוקבת לאות הראשונה בקלט .יש להרחיב ביטוי זה כ שיכלול ג את האפשרות שהאות הראשונה בקלט היא אות עוקבת לאות השנייה. לכ ,הביטוי הבוליאני שבתוכנית המתוקנת יהיה: )(letter2 == letter1 + 1) || (letter1 == letter2 + 1 התוכנית המתוקנת תהיה: */ קלט :שתי אותיות לועזיות גדולות פלט :הודעה האם האותיות עוקבות */ public class Letters { )public static void main(String[] args { ;char letter1, letter2 קלט // letter1 = In.readChar("insert a capital letter, avoid the letter ;)"Z letter2 = In.readChar("insert another capital letter, avoid the ;)"letter Z ) )if ( (letter2 == letter1 + 1) || (letter1 == letter2 + 1 { System.out.println("one of the letters follows the other in ;)"the ABC } else { System.out.println("These are not consecutive letters of the ;)"ABC } }// main } // class Letters סוף פתרון בעיה הוראת המדעים ,אוניברסיטת תל-אביב -238- 1 מדעי המחשב נית ללמוד לקח מ הפתרו לדוגמה של בעיה :1 השגיאה שהופיעה בתוכנית הנתונה נובעת מכ שמפתח התוכנית לא ביצע ניתוח מלא של כל אפשרויות הקלט השונות .מפתח התוכנית לא הבחי בכ שהמשמעות של אותיות לועזיות עוקבות, איננה רק האפשרות ש"האות השנייה עוקבת לאות הראשונה" ,אלא ג האפשרות ש"האות הראשונה עוקבת לאות השנייה" .זיהוי השגיאה ותיקונה התאפשר הודות לחלוקה ממצה של הקלטי האפשריי לקבוצות ,אשר הביאה לבחירה ממצה של דוגמאות קלט מייצגות. שימו ♥ :הבדיקה בעזרת דוגמאות קלט מייצגות אינה מוכיחה נכונות ,אלא מסייעת באיתור שגיאות ,ומקטינה מאוד את ההסתברות לטעות ,א תמיד ייתכ )בייחוד בתוכניות גדולות מאוד( שנפספס תתמקרה מסוי ,משו שאי בידינו מתכו לקביעת חלוקה ממצה לקבוצות. כיו בכל חברת תוכנה יש צוות בודקי אשר כל תפקידו הוא לוודא כי התוכנה עובדת כשורה עבור כל קלט אפשרי .חשיבות בדיקות אלה גבוהה ונועדה על מנת להימנע מהפסדי ולעיתי ג מנזקי משמעותיי הרבה יותר ,כמו פגיעה בחיי אד )למשל בתוכנות רפואיות(. במרבית חברות התוכנה מער הבדיקות מבוסס ג הוא על סימולציה ,כלומר ,על בחירה מתוחכמת של דוגמאות קלט מייצגות ובדיקת התוכניות עליה ,בחירה שיכולה להיות מורכבת מאוד ומסובכת מאוד בתוכניות גדולות ומורכבות .ע זאת ,יש ג חברות )בעיקר דווקא חברות לתכנו ופיתוח חומרה( המשתמשות בכלי הוכחה )הנשעני על תורות מתמטיות( .הסיבה למיעוט יחסי של השימוש בכלי ההוכחה הוא הקושי של כלי מסוג זה הקיימי כיו להתמודד בצורה נוחה ע תוכניות גדולות .הסיבה שה משמשי יותר בתעשיית החומרה הוא שהרבה יותר יקר לייצר מחדש רכיב חומרה ,א מתגלית בו טעות אחרי שלב הייצור ,מאשר לתק ולהפי( גרסה חדשה של תוכנה, שהתגלתה בה טעות. שאלה 6.1 נתו הלוח הבא ,אשר בכל משבצת בו מופיע מספר של: 2 1 4 3 קטע התוכנית הבא ,אשר הקלט שלו הוא שניי מ המספרי המופיעי בלוח ,יציג כפלט הודעה. הוראת המדעים ,אוניברסיטת תל-אביב -239- מדעי המחשב ;)"num1 = In.readInt("insert first number ;)"num2 = In.readInt("insert second number )if (num1 == num2 + 2 { ;)"System.out.println("The numbers appear at the same column } else { ;)"System.out.println("The numbers don’t appear at the same column } א .בחרו שתי דוגמאות קלט ,אשר עבור כל אחת מה תוצג הודעה מתאימה אחרת .תארו את המאפייני של שתי קבוצות הקלטי אליה שייכות הדוגמאות שבחרת. ב .בחרו דוגמת קלט שעבורה תוצג הודעה לא מתאימה ,ותארו את המאפיי של קבוצת הקלטי שעבור תוצג הודעה לא מתאימה. ג .שנו את הביטוי הבוליאני שבקטע התוכנית לביטוי בוליאני אחר ,שעבורו תוצג תמיד הודעה מתאימה .נסחו את הביטוי החדש כביטוי פשוט. שאלה 6.2 הקלט לקטע התוכנית הבא הוא מספר של כלשהו .מטרת קטע התוכנית הבא הוא להציג כפלט ער שסימנו כסימ המספר הנתו בקלט וגודלו הוא ריבוע המספר הנתו בקלט .למשל ,עבור הקלט 10 הפלט הנדרש הוא ,100ועבור הקלט -10הפלט הנדרש הוא .-100 שימו ♥ :בקטע התוכנית נעשה שימוש במחלקה המתמטית ובפעולה Math.powהשייכת למחלקה זו ,שנלמדו בפרק .4 ;)".readInt("insert a numberמnum = I ;)s = Math.pow(num, 2 ;)System.out.println(s קטע התוכנית שגוי. א .תנו דוגמת קלט מייצגת שעבורה יתקבל הפלט הדרוש. א .תנו דוגמת קלט מייצגת שעבורה לא יתקבל הפלט הדרוש. ב .תארו את קבוצת הקלטי שעבור לא יתקבל הפלט הדרוש. ג .תקנו את קטע התוכנית ,כ שעבור כל קלט יתקבל הפלט הדרוש. הוראת המדעים ,אוניברסיטת תל-אביב -240- מדעי המחשב שאלה 6.3 נתו קטע התוכנית הבא אשר הקלט שלו הוא ארבע אותיות לועזיות גדולות. ;)"letter1 = In.readChar("insert a capital letter ;)"letter2 = In.readChar("insert a capital letter ;)"letter3 = In.readChar("insert a capital letter ;)"letter4 = In.readChar("insert a capital letter ))if ((letter1 == letter2) && (letter3 == letter4 { ;)"System.out.println("All letters are equal } else { ;)"System.out.println("Not all letters are equal } א .תנו שתי דוגמאות קלט שונות אשר עבור כל אחת מה תתקבל הודעה לא מתאימה. ב .תארו את קבוצת הקלטי שעבור תתקבל הודעה לא מתאימה. ג .שנו את הביטוי הבוליאני שבקטע התוכנית כ שעבור כל קלט תתקבל הודעה מתאימה. שאלה 6.4 לפניכ תוכנית בשפת .Javaהתוכנית קולטת תו כקלט .מטרת התוכנית היא לבדוק הא התו מייצג מספר .א כ ,יוצג כפלט המספר הבא אחריו .אחרת ,תוצג הודעה כי התו אינו מספר. הראו שלוש דוגמאות קלט מייצגות לתוכנית זו והסבירו עבור כל דוגמה איזו קבוצה היא מייצגת. מצאו את השגיאה בתוכנית ותקנו אותה. */ התוכנית קולטת תו אם התו מייצג מספר התוכנית מציגה כפלט את המספר הבא אחריו בכל מקרה אחר מוצגת ההודעה "לא מספר" */ public class NextNumber { )public static void main (String[] args { הגדרת משתנים // תו הקלטchar character; // קלט // ;)"character = In.readChar("Insert a character הוראת המדעים ,אוניברסיטת תל-אביב -241- מדעי המחשב פלט // )'if (character >= '0' && character <= '9 { ;) )System.out.println( (char)(character + 1 } else { ;)"System.out.println("Not a number } } // main } // class NextNumber ראינו עד כה בפרק זה ניתוח של תוכנית נתונה ,שמטרתה ברורה .א בפיתוח תוכנה קורה לא פע שיש לשלב תוכניות אשר אינ מתועדות כראוי ומטרת איננה ברורה .במקרי כאלו יש לזהות קוד כל את מטרת התוכנית הנתונה. זיהוי מטרת תוכנית נתונה מתבצע על ידי בחינת פלט התוכנית עבור דוגמאות קלט שונות, והכללת היחס בי הקלט לפלט. נדגי זאת בעזרת שתי השאלות הבאות. שאלה 6.5 נתו קטע התוכנית הבא שהקלט שלו הוא מספר לא שלילי ,והמשתני בו ה מטיפוס ממשי. שימו ♥ :בקטע התוכנית נעשה שימוש במחלקה המתמטית ,ובפעולה sqrtשל המחלקה המתמטית, שנלמדו בפרק ,4וכ בפעולה Math.floorאשר מקבלת מספר ממשי ומחזירה את החלק השל שלו )למשל ,ער הביטוי ) Math.floor(5.8שווה ל(5.0 ;)"num = In.readDouble("insert a number ;)sqrtNum = Math.sqrt(num ;)fraction = sqrtNum – Math.floor(sqrtNum )if (fraction > 0 { ;)"System.out.println("1 } else { ;)"System.out.println("0 } הוראת המדעים ,אוניברסיטת תל-אביב -242- מדעי המחשב א .תנו דוגמת קלט שעבורה יהיה הפלט .1 ב .תנו דוגמת קלט שעבורה יהיה הפלט .0 ג .תארו את מטרת קטע התוכנית תו חלוקת הקלטי האפשריי לשתי קבוצות ותיאור הפלט עבור הקלט בכל קבוצה. שאלה 6.6 נתו קטע התוכנית הבא ,שהקלט שלו הוא ארבעה מספרי שלמי שוני .כל המשתני בקטע התוכנית ה מטיפוס של. ;)".readInt("insert a numberמnum1 = I ;)".readInt("insert a numberמnum2 = I ;)".readInt("insert a numberמnum3 = I ;)".readInt("insert a numberמnum4 = I )if (num1 > num2 { ;max1=num1 } else { ;max1 = num2 } // if )if (num3 > num4 { ;max2 = num3 } else { ;max2 = num4 } // if )if (max1 > max2 { ;)System.out.println(max1 } else { ;)System.out.println(max2 } // if הוראת המדעים ,אוניברסיטת תל-אביב -243- מדעי המחשב .20 30 40 50 ו40 30 20 10 : מהו הפלט עבור כל אחת מדוגמאות הקלט הבאות.א .5 תנו שלוש דוגמאות קלט שונות של מספרי חיוביי שהפלט עבור הוא.ב ? מהי מטרת קטע התוכנית.ג 6.7 שאלה :Java לפניכ תוכנית בשפת /* התוכנית קולטת שלושה מספרים שלמים התוכנית */ public class What { public static void main (String[] args) { // הגדרת משתנים int num1, num2, num3; // משתני הקלט int temp; // משתנה עזר //קלט num1 = In.readInt("Insert first number"); num2 = In.readInt("Insert second number"); num3 = In.readInt("Insert third number"); if (num1 > num2) { temp = num1; num1 = num2; num2 = temp; } if (num2 > num3) { temp = num2; num2 = num3; num3 = temp; } // פלט System.out.println(num1 + "," + num2 + "," + num3); } // main } // class What מדעי המחשב -244- אביב- אוניברסיטת תל,הוראת המדעים א .כתבו במשפט אחד מהי לדעתכ מטרת התוכנית. ב .הציעו חלוקה ממצה של הקלטי האפשריי לקבוצות. ג .בחרו דוגמאות קלט מייצגות עלפי החלוקה שהצעת בסעי) א' ,וציינו את הפלט עבור כל אחת מה. ד .הא התוכנית משיגה את מטרתה? א כ ,הסבירו מדוע; א לא ,תקנו אותה. סיכום בפרק זה הרחבנו והעמקנו בנושא נכונות של אלגורית )תוכנית(. אלגורית נכו" הוא אלגורית אשר ביצועו מביא להשגת המטרה עבור כל קלט חוקי )המתאי להגדרת הבעיה(. לא מתקבל על הדעת להיווכח בנכונות של אלגורית עלידי בניית טבלת מעקב עבור כל קלט אפשרי. לכ ,אנו בוחרי בצורה ממצה דוגמאות מייצגות של קלט ובודקי את מהל ביצוע האלגורית עבור דוגמאות קלט אלה. דוגמאות קלט מייצגות ה דוגמאות קלט אשר כל אחת מה מייצגת קבוצת קלטי בעלת מאפייני שוני. בחירה ממצה של דוגמאות קלט מייצגות היא בחירה המבטאת חלוקה ממצה של הקלטי האפשריי לקבוצות מייצגות. לפעמי נתונות תוכניות או תתתוכניות אשר מטרת אינה ברורה .זיהוי מטרת תוכנית נתונה מתבצע על ידי בחינת פלט התוכנית עבור דוגמאות קלט שונות ,והכללת היחס בי הקלט לפלט. הוראת המדעים ,אוניברסיטת תל-אביב -245- מדעי המחשב פרק – 7ביצוע חוזר עד כה הכרנו בעיות אשר פתרונ כלל ביצוע של כמה תתמשימות שונות ,באופ סדרתי .כלומר ,כל תתמשימה בסדרה בוצעה פע אחת )וא זו משימה שביצועה תלוי בתנאי ,ייתכ שלא בוצעה אפילו פע אחת( .אול ,ישנ בעיות אשר לצור פתרונ יש לבצע תתמשימה אחת ,או כמה תתמשימות, יותר מפע אחת ,ואולי ג מספר רב של פעמי .בפרק זה נכיר אלגוריתמי אשר מורי על חזרה שוב ושוב של ביצוע של תתמשימה )או תתמשימות( .אלגוריתמי אלה כוללי הוראה לביצוע חוזר של קבוצת הוראות. בסעי 7.1נכיר אלגוריתמי שבה מבנה הביצוע החוזר הוא פשוט .באלגוריתמי אלה מספר הפעמי של הביצוע החוזר נקבע לפני תחילת ביצועו. בסעי 7.4נכיר אלגוריתמי שבה מבנה הביצוע החוזר מורכב יותר .באלגוריתמי אלה מספר הפעמי של הביצוע החוזר לא נקבע מראש ,אלא תלוי בתנאי אשר נבדק שוב ושוב במהל הביצוע החוזר. 7.1ביצוע חוזר באורך ידוע מראש בעיה 1 מטרת הבעיה ופתרונה :הצגת אלגורית הכולל הוראה לביצוע חוזר באור ידוע מראש. עלינו להמיר רשימת מחירי מייצוג בדולרי לייצוג בשקלי .פתחו ויישמו אלגורית אשר הקלט שלו הוא שער ההמרה מדולרי לשקלי ואחריו רשימה של עשרה מחירי הנתוני בדולרי .הפלט שלו הוא הער בשקלי של כל אחד מעשרת המחירי .הפלט עבור כל מחיר צרי להינת מייד אחרי קליטתו ,לפני קליטת המחיר הבא. פירוק הבעיה לתתמשימות .1קליטת שער ההמרה מדולרים לשקלים .2קליטת כל אחד מ 10-המחירים הדולרים ,חישוב ערכו בשקלים ,והצגה כפלט של הערך המחושב. ? נית לפרט את התתמשימה השנייה יותר .כיצד? התתמשימה השנייה מורכבת בעצ מביצוע חוזר ,עשר פעמי ,של התתמשימות הבאות: הוראת המדעים ,אוניברסיטת תל-אביב -247- מדעי המחשב .2.1קליטת מחיר דולרי .2.2חישוב ערכו של המחיר בשקלים .2.3הצגה כפלט של הערך המחושב דר אחת להורות על ביצוע חוזר ,עשר פעמי ,של התתמשימות שניסחנו ,היא כמוב לכתוב אות עשר פעמי ,כ: .2.1קליטת מחיר דולרי .2.2חישוב ערכו של המחיר בשקלים .2.3הצגה כפלט של הערך המחושב .2.4קליטת מחיר דולרי .2.5חישוב ערכו של המחיר בשקלים .2.6הצגה כפלט של הערך המחושב . . . .2.28 קליטת מחיר דולרי .2.29 חישוב ערכו של המחיר בשקלים .2.30 הצגה כפלט של הערך המחושב כמוב ,זהו ניסוח מסורבל .עבור רשימה של עשרה מחירי נכתבות שלושי הוראות .עבור רשימה של מאה מחירי יכתבו 300הוראות .ובעצ ,עבור רשימות מחירי באורכי שוני ייכתבו אלגוריתמי שבה מספר הוראות שונה .כלומר ,לא רק שמדובר באלגוריתמי ארוכי מאוד ,אלא שעבור שינוי קט בהגדרת הבעיה )מספר המחירי( ,יש צור לבצע שינוי משמעותי באלגורית. הא נית להימנע מ הסירבול המתואר? הא נית לכתוב אלגורית שבו יהיה אותו מספר הוראות עבור רשימות מחירי באורכי שוני? אכ נית ,באמצעות הוראה לביצוע חוזר של קבוצת הוראות .בפתרו הבעיה הנוכחית ,שבה יש להמיר עשרה מחירי נית להשתמש בהוראה הבאה לביצוע חוזר: :íéîòô 10 òöá ÷éøìåã øéçî èåì íéì÷ùá øéçîä ìù åëøò úà áùç áùåçîä êøòä úà èìôë âöä הוראת המדעים ,אוניברסיטת תל-אביב -248- מדעי המחשב עבור רשימה של 100מחירי נית לכתוב אלגורית הכולל הוראה לביצוע חוזר במבנה זהה ,אלא שבו מספר הפעמי המצוי בכותרת ההוראה הוא 100במקו .10 שימו ♥ לעימוד בהוראה לביצוע חוזר .בהוראה זו )כמו בהוראה לביצוע בתנאי( אנו מזיזי פנימה את קבוצת ההוראה לביצוע חוזר. בחירת משתני נשתמש במשתני הבאי מטיפוס ממשי: – dollarPriceישמור מחיר דולרי – shekelPriceישמור את ערכו בשקלי של המחיר השמור בdollarPrice – rateישמור את שער ההמרה מדולרי לשקלי. האלגורית rate-á äøîä øòù èåì÷ .1 .2 :íéîòô 10 òöá dollarPrice-á øéçî èåì÷ .2.1 -á íùäå dollarPrice-á øåîùä øéçîä ìù íéì÷ùá åëøò úà áùç .2.2 shekelPrice shekelPrice ìù åëøò úà èìôë âöä .2.3 יישו האלגורית הוראה לביצוע חוזר במבנה של ...íéîòô øôñî òöá מיושמת ב Javaעל ידי משפט .for משפט forמשתמש במשתנה בקרה ,אשר שולט על ביצוע הלולאה .למשל ,א ברצוננו לבצע קבוצת הוראות 10פעמי ,כפי שברצוננו לעשות בפתרו בעיה זו ,נכתוב משפט forמהצורה הבאה: )for (i = 1; i <= 10; i++ { ההוראות לביצוע } משתנה הבקרה במשפט זה הוא .iערכו מאותחל ל) 1כפי שמורה משפט ההשמה ,i = 1המהווה את הרכיב הראשו בסוגריי( .בכל פע אחרי שסדרת ההוראות לביצוע מתבצעת פע אחת ערכו של משתנה הבקרה גדל ב) 1על כ מורה הרכיב השלישי בסוגריי ,(i++ :והביצוע החוזר יימש כל עוד ערכו של iקט או שווה ל) 10כפי שמורה התנאי ,i <= 10הרכיב השני בסוגריי(. הוראת המדעים ,אוניברסיטת תל-אביב -249- מדעי המחשב א כ ,בתחילת הביצוע של משפט ה i ,forיאותחל ל .1אחרי שקבוצת ההוראות לביצוע תבוצע פע אחת ,ערכו יגדל ל .2אחרי שקבוצת ההוראות תבוצע פע שנייה ,ערכו יגדל ל .3אחרי שקבוצת ההוראות תבוצע פע עשירית ,ערכו כבר יהיה ,11ואז יסתיי הביצוע החוזר ,משו שערכו של התנאי i <= 10יהיה .false באופ כללי ,בביצוע משפט ,forמוש ער תחילי במשתנה הבקרה על פי הרכיב הראשו במשפט. לאחר מכ מתבצעת בדיקת התנאי ,המתואר ברכיב השני .א ערכו של התנאי הוא trueמתבצעות ההוראות לביצוע .בתו ביצוע קבוצת ההוראות גדל ערכו של משתנה הבקרה לפי השינוי המוגדר ברכיב השלישי .כעת מתבצעת שוב בדיקת התנאי .א ערכו של התנאי הוא trueמתבצעת שוב קבוצת ההוראות וכ הלאה ,עד אשר ערכו של התנאי הוא falseואז מסתיי הביצוע. באופ דומה ,נית היה לבחור ג במשפט forהבא ליישו ההוראה לביצוע חוזר שבאלגורית: )for (i = 0; i < 10; i++ { הוראות לביצוע } ג במקרה זה ההוראות לביצוע מתבצעות 10פעמי :פע אחת כאשר ערכו של iשווה ל ,0פע שנייה כאשר ערכו שווה ל ,1פע שלישית כאשר ערכו שווה ל ,2ובפע העשירית ואחרונה כאשר ערכו של iשווה ל .9כאשר ערכו של iגדל שוב ,ומגיע ל ,10התנאי להמש הביצוע כבר לא מתקיי, והביצוע החוזר מסתיי. שימו ♥ :ההוראה i++היא למעשה הוראת השמה מקוצרת .היא שקולה להוראת ההשמה .i = i + 1נית להשתמש בהוראה זו בכל מקו בתוכנית ,לאו דווקא במשפט .for התוכנית המלאה */ הקלט :שער ההמרה מדולרים לשקלים ורשימה של 10מחירים בדולרים הפלט :הערכים השקליים של 10המחירים הנתונים בדולרים */ public class Convertor { )public static void main (String [] args { קבוע :מספר המחירים הנקראים מהקלט// הוראת המדעים ,אוניברסיטת תל-אביב ;final int HOW_MANY=10 שער ההמרה// ;double rate מחיר בדולרים// ;double dollarPrice -250- מדעי המחשב מחיר בשקלים// ;double shekelPrice משתנה בקרה// ;int i קלט // ;)"1. rate = In.readDouble("Insert the rate // ההוראה לביצוע חוזר )2. for (i = 1; i <= HOW_MANY; i++ { ;)"2.1. dollarPrice = In.readDouble("Insert price in Dollars ;2.2. shekelPrice = dollarPrice * rate ;)2.3. System.out.println("Price in Shekels is " + shekelPrice }// for }// main }// Convertor מעקב בטבלת מעקב הכוללת משפט forנכלול עמודה עבור משתנה הבקרה של המשפט .בתוכנית לפתרו בעיה ,1ערכו של משתנה הבקרה ,i ,גדל ב 1אחרי כל ביצוע של קבוצת המשפטי לביצוע הכלולה במשפט .forערכו בביצוע החוזר הראשו הוא 1וערכו בביצוע החוזר האחרו הוא .10 נעקוב אחר ביצוע התוכנית עבור הקלט הבא :שער ההמרה הוא ,3ועשרת המחירי להמרה ה: .10.1 5 18.2 120.3 200.01 50.3 60 71.05 61.03 100 כדי להימנע מהצגת טבלה ארוכה מדי ,תכלול הטבלה הבאה מעקב רק אחרי עיבוד שני המחירי הראשוני ושני המחירי האחרוני שבקלט. פלט Insert the rate Insert price in dollars shekel dollar rate ? ? ? ? ? 3 ? ? 3 ? 10.1 3 1 30.3 10.1 3 1 30.3 10.1 3 1 i<=10 המשפט לביצוע i ? ? rate=In.readDouble("Insert 1 )"the rate true 1 )for (i = 1; i <= 10; i++ 2 dollarPrice 2.1 = price In.readDouble("Insert ;)"in dollars * shekelPrice = dollarPrice 2.2 ;rate Price in Shekels is 30.3 הוראת המדעים ,אוניברסיטת תל-אביב System.out.println("Price in Shekels is " + ;)shekelPrice -251- מדעי המחשב 2.3 2 for (i = 1; i <= 10; i++) 2 2.1 dollarPrice = true 3 10.1 30.3 2 3 5 30.3 2 3 5 15 2 3 5 15 3 71.05 213.15 In.readDouble("Insert price in dollars"); 2.2 shekelPrice = dollarPrice * Insert price in dollars rate; 2.3 System.out.println("Price in Shekels is " + shekelPrice); Price in Shekels is 15 . . . 2 for (i = 1; i <= 10; i++) 9 2.1 dollarPrice = 9 3 61.03 213.15 9 3 61.03 183.09 9 3 61.03 183.09 3 61.03 183.09 true In.readDouble("Insert price in dollars"); 2.2 shekelPrice = dollarPrice * Insert price in dollars rate; 2.3 System.out.println("Price in Shekels is " + shekelPrice); 2 for (i = 1; i <= 10; i++) 10 2.1 dollarPrice 10 3 100 183.09 10 3 100 300 10 3 100 300 3 100 300 true =In.readDouble("Insert price in dollars"); 2.2 shekelPrice = dollarPrice * Price in Shekels is 183.09 Insert price in dollars rate; 2.3 System.out.println("Price in Shekels is " + shekelPrice); 2 for (i = 1; i <= 10; i++) 11 false Price in Shekels is 300 . ולבדיקת התנאי של משתנה הבקרהi שימו לב לשינויי שחלי בערכו של משתנה הבקרה 1 סוף פתרון בעיה מדעי המחשב -252- אביב- אוניברסיטת תל,הוראת המדעים נציג את המושגי החדשי שהכרנו בפתרו לדוגמה של בעיה .1 באלגורית לפתרו הבעיה כללנו הוראה לביצוע חוזר במבנה ...íéîòô øôñî òöá כדי לציי ביצוע חוזר של תתמשימה .הוראה זו מורה על ביצוע חוזר של קבוצת הוראות מספר פעמי .הוראה לביצוע חוזר היא הוראת בקרה. הוראה לביצוע חוזר נקראת ג לולאה ) ,(loopוקבוצת ההוראות לביצוע הכלולות בה נקראת גו הלולאה. בדומה לכתיבה של הוראה לביצוע בתנאי ג כתיבה של הוראה לביצוע חוזר נעשית תו הקפדה על עימוד מתאי :קבוצת ההוראות שיש לחזור על ביצוע מוזזת פנימה. בשפת Javaמיושמת הוראה לביצוע חוזר במבנה זה על ידי משפט .for זהו המבנה הכללי של משפט forבשפת :Java )שינוי משתנה הבקרה ;התנאי להמשך הביצוע ;אתחול משתנה הבקרה( for { הוראות לביצוע } אתחול משתנה הבקרה :הוראת השמה הקובעת ער התחלתי למשתנה הבקרה. התנאי להמש הביצוע :ביטוי בוליאני שמהווה את התנאי השולט על הביצוע החוזר .התנאי נבדק אחרי האתחול ,ונבדק שוב בכל פע שמסתיי ביצוע של קבוצת ההוראות לביצוע .כל עוד התנאי מתקיי הביצוע החוזר ממשי .כאשר ערכו של התנאי הוא falseהביצוע החוזר מסתיי. שינוי משתנה הבקרה :השינוי שחל במשתנה הבקרה בכל פע שמסתיי שלב ביצוע נוס. בטבלת מעקב אחר תוכנית הכוללת משפט forאנו כוללי עמודה עבור משתנה הבקרה ועמודה עבור התנאי של משתנה הבקרה. משתנה הבקרה במשפט forהוא בדר כלל מטיפוס של .מאחר שבמקרי רבי תפקידו של משתנה הבקרה הוא רק לשלוט על המשפט ,forואי בו שימוש בחלקי התוכנית האחרי ,שפת Java מאפשרת להצהיר על משתנה הבקרה בתו הוראת ה ,forכלומר ,נוכל לכתוב: ) for (int i = 1; i <= 10; i++ הוראת המדעים ,אוניברסיטת תל-אביב -253- מדעי המחשב ע זאת ,כדי שהתוכנית תהיה קריאה ובהירה מוטב לנהוג כ רק כאשר אי למשתנה זה תפקיד מעבר למשפט .for שאלה 7.1 בנו טבלת מעקב אחר מהל ביצוע התוכנית ) Convertorלפתרו בעיה (1עבור הקלט שבו שער ההמרה הוא 4.5ועשרת המחירי להמרה ה: 5.05 18.01 17.03 20.9 101 105 213.05 16.1 17.2 18.3 פרטו בטבלה רק את השורות המתאימות לעיבוד שני הקלטי הראשוני ושני הקלטי האחרוני )בדומה לנעשה בפתרו בעיה .(1 שאלה 7.2 נסחו עבור כל אחת מ הבעיות האלגוריתמיות הבאות קבוצת תתמשימות לביצוע חוזר: א .הקלט הוא 20מרחקי ,נתוני במיילי ,והפלט הוא 20המרחקי בקילומטרי ) 1מייל = 1.6 קילומטר(. ב .הקלט הוא עשר אותיות מ ה ,ABCהשונות מהאות ,Zוהפלט הוא עשר האותיות שעוקבות לאותיות הנתונות. ג .הקלט הוא 40זוגות של ציוני )זוג ציוני עבור כל תלמיד( ,והפלט הוא רשימה של ארבעי מספרי :כל מספר הוא ממוצע של זוג הציוני המתאי לו. שאלה 7.3 לפניכ קטע תוכנית: ;)'System.out.print('X )for (i = 0; i < 10; i++ { ;)"*"(System.out.print } ;)'System.out.print('X מהו פלט קטע התוכנית? שאלה 7.4 פתחו ויישמו אלגורית אשר הקלט שלו הוא תו ,והפלט שלו הוא שכפול של התו הנקלט חמישי פעמי .למשל ,עבור הקלט Aיהיה הפלט ) AAA...AAחמישי פעמי(. בשלב החלוקה לתתמשימות הקפידו על ניסוח תתמשימה לביצוע חוזר. הוראת המדעים ,אוניברסיטת תל-אביב -254- מדעי המחשב שאלה 7.5 פתחו ויישמו אלגורית אשר הקלט שלו הוא 20מספרי שלמי חיוביי דוספרתיי ,והפלט שלו הוא סכו הספרות של של כל אחד מהמספרי הנתוני. למשל ,א הקלט הוא: 11 17 99 10 20 30 10 20 30 10 20 30 10 10 20 20 30 30 88 15 הפלט המתאי הוא: 2 8 18 1 2 3 1 2 3 1 2 3 1 1 2 2 3 3 16 6 בשלב החלוקה לתתמשימות הקפידו על ניסוח תתמשימה לביצוע חוזר ,ובשלב הבדיקה הקפידו על בדיקה מסודרת באמצעות טבלת מעקב. בפתרו בעיה 1מספר הפעמי לביצוע חוזר נקבע עוד לפני תחילת ביצוע התוכנית .במקרי רבי, ייתכ כי מספר הפעמי לביצוע חוזר ידוע לפני שמתחיל ביצועה של ההוראה לביצוע חוזר ,א לא לפני תחילת ביצוע התוכנית .כלומר ,הוא תלוי בקלט .מקרה כזה מודג בבעיה הבאה: בעיה 2 מטרת הבעיה ופתרונה :הצגת ביצוע חוזר שאורכו נקבע על פי נתו קלט. פתחו אלגורית שיקבל כקלט מספר של ,Nויציג על המס שורה של כוכביות באור .N פירוק הבעיה לתתמשימות .1קליטת אורך הרשימה .2הדפסת כוכביות לפי המספר הנקלט רשימת המשתני עד עתה השתמשנו בתנאי לסיו הביצוע החוזר במספרי קבועי .בבעיה זו אנו נדרשי לקבל כקלט את מספר הפעמי שתתבצע הלולאה ,ולכ התנאי להמש הביצוע צרי להיות תלוי בערכו של משתנה. – numOfTimesמספר הפעמי שיש לצייר כוכבית – iמשתנה הבקרה של הלולאה האלגורית numOfTimes-ì íìù øôñî èåì÷ .1 .2 :íéîòô numOfTimes òöá '*' ñôãä .2.1 הוראת המדעים ,אוניברסיטת תל-אביב -255- מדעי המחשב יישו האלגורית בפתרו בעיה ,1כאשר רצינו לבצע קבוצת משימות 10פעמי יישמנו זאת על ידי משפט for שכותרתו )for(i = 1; i <= 10; i++ )או על ידי המשפט שכותרתו ) ,for(i = 1; i <= HOW_MANY; i++כאשר HOW_MANYהוא קבוע שערכו .(10 כעת אנחנו רוצי לבצע את הוראה numOfTimes 2.1פעמי .לכ נייש את ההוראה לביצוע חוזר על ידי משפט forשכותרתו: )for(i = 1; i <= numOfTimes; i++ התוכנית המלאה public class Stars { )public static void main (String [] args { ;int numOfTimes ;)"numOfTimes = In.readInt("Insert a number please )for (int i = 1; i <= numOfTimes; i++ { ;)'*'(System.out.print } // for } // main } // Stars סוף פתרון בעיה 2 בתוכנית Starsראינו שימוש בנתו קלט לקביעת מספר הפעמי של ביצוע לולאה .בפיתוח אלגוריתמי בהמש נשתמש בכ פעמי רבות. דר הבעיה הבאה נכיר שני סוגי של משתני המשמשי בפתרו בעיות רבות ,ותבנית העבודה אית היא שימושית מאוד .כפי שנראה ,תבנית העבודה ע משתני כאלה מערבת שימוש בהוראות לביצוע חוזר. הוראת המדעים ,אוניברסיטת תל-אביב -256- מדעי המחשב בעיה 3 מטרת הבעיה ופתרונה :הצגת מונה וצובר ואופ העבודה אית. פתחו ויישמו אלגורית אשר הקלט שלו הוא מספר חיובי של ,ולאחריו רשימה של מספרי ממשיי ,שאורכה שווה לער הקלט הראשו .הפלט שלו הוא ממוצע המספרי ברשימה ומספר המספרי ברשימה שערכ עולה על .50 למשל ,עבור הקלט: 23.4 100 95 78 64.15 75 90.3 54.2 67 20 הפלט המתאי הוא66.7 8 : משו שממוצע המספרי הוא ,66.7ו 8מתוכ ה גדולי מ.50 פירוק הבעיה לתתמשימות .1קליטת אורך הרשימה .2קליטת רשימת הערכים ,סיכומם ,ומניית מספר הערכים הגבוהים מ50- .3חישוב ממוצע הערכים .4הצגה כפלט של הממוצע שחושב ושל מספר הערכים הגבוהים מ50- ? כדי לחשב את הממוצע יש לסכ את הערכי הנתוני בקלט ,ובנוס יש למנות כמה מהערכי הנתוני בקלט ה גבוהי מ .50נית לבצע ה את פעולת הסיכו וה את פעולת המנייה תו כדי קריאת נתוני הקלט .כיצד נית לבטא זאת כהוראה לביצוע חוזר? נית לבצע את פעולת הסיכו על ידי הוספת כל ער שנקרא לסכו מצטבר ,לפני קריאת הער הבא. בדומה ,נית לבצע את פעולת המנייה על ידי השוואת כל ער שנקרא מהקלט ל ,50והגדלת מונה מתאי בכל פע שהער שנקלט עולה על .50לכ ,את תתמשימה 2נוכל לבצע על ידי ביצוע חוזר של קבוצת ההוראות הבאה: .2.1קליטת ערך .2.2הוספת הערך שנקלט לסכום המצטבר .2.3השוואת הערך שנקלט ל .50-אם גבוה מ ,50-הגדלת ערכו של מונה למניית מספר הערכים הגבוהים מ.50- בחירת משתני מ התתמשימות לביצוע חוזר נית להסיק שיש להשתמש במשתנה אשר בו יישמר ער תור שנקרא מהקלט ,במשתנה שיצבור את סכו הערכי ,ובמשתנה שימנה את מספר הערכי הגבוהי מ.50 לכ ,ניעזר במשתני הבאי: הוראת המדעים ,אוניברסיטת תל-אביב -257- מדעי המחשב – lengthמטיפוס של ,ישמור את אור רשימת המספרי – numמטיפוס ממשי ,ישמור ער תור הנקרא מהקלט – sumמטיפוס ממשי ,צובר שישמור את סכו הערכי – averageמטיפוס ממשי ,ישמור את ממוצע הערכי – counterLargeמטיפוס של ,מונה שישמור את מספר הערכי הגבוהי מ50 שימו ♥ :המשתני sum ,num ,averageה מטיפוס ממשי ,כיוו שערכי הקלט בבעיה ה ממשיי .לעומת counterLargeהוא מטיפוס של כיוו שהוא משמש למנייה. יישו האלגורית את ההוראה לביצוע חוזר נוכל לנסח באופ הבא: :íéîòô length òöá .1 ÷num-á éùîî êøò èåì .2 sum-á øåîùä øáèöîä íåëñì num ìù åëøò úà óñåä .3 íà .3.1 50-î ìåãâ num ìù åëøò counterLarge ìù åëøò úà 1-á ìãâä שימו ♥שקבוצת ההוראות לביצוע חוזר )גו הלולאה( כוללת הוראה לביצוע בתנאי. ? אילו הוראות יש להוסי לפני ההוראה לביצוע חוזר? כדי שהצבירה והמנייה יתבצעו באופ נכו ,עלינו לאתחל נכונה את הערכי של sumושל .counterLargeעל פי תפקיד של שני המשתני באלגורית יש לאתחל את ערכיה ל.0 הוראת המדעים ,אוניברסיטת תל-אביב -258- מדעי המחשב :הנה האלגורית המלא 0-ì sum úà ìçúà .1 0-ì counterLarge úà ìçúà .2 length-á íìù éáåéç êøò èåì÷ .3 :íéîòô length òöá .4 num-á éùîî êøò èåì÷ .4.1 sum-á øåîùä øáèöîä íåëñì num ìù åëøò úà óñåä .4.2 50-î ìåãâ num ìù åëøò íà .4.3 counterLarge ìù åëøò úà 1-á ìãâä .4.3.1 average-á íùäå sum/length éãé ìò íéëøòä òöåîî úà áùç .5 average ìù åëøò úà èìôë âöä .6 counterLarge ìù åëøò úà èìôë âöä .7 התוכנית המלאה /* רשימת ערכים ממשיים:קלט 50- ממוצע הערכים ומספר הערכים הגבוהים מ:פלט */ public class CalcAvgAndCountLargerThan50 { public static void main (String [] args) { // הצהרה על קבוע בתוכנית final int LIMIT = 50; // הצהרה על משתנים בתוכנית int length; //אורך רשימת הקלט double num; //ערך קלט תורן double sum = 0; // צובר double average; // ממוצע int counterLarge = 0; //50-מונה למספר הערכים הגבוהים מ length = In.readInt("Insert length of input list"); // מדעי המחשב ההוראה לביצוע חוזר -259- אביב- אוניברסיטת תל,הוראת המדעים )for (int i = 1; i <= length; i++ { ;)"num = In.readDouble("Insert number ;sum = sum + num )if (num > LIMIT { שקול ל// counterLarge=counterLarge+1 - ;counterLarge++ }// if }// for ;average = sum / length ;)System.out.println("Average is " + average System.out.println(counterLarge + " numbers are larger then " + ;)LIMIT }// main }// CalcAvgAndCountLargerThan50 סוף פתרון בעיה 3 באלגורית לפתרו בעיה 3משמש המשתנה sumכצובר של הערכי הנתוני. צובר הינו משתנה אשר תפקידו לצבור ערכי .למשל ,נית להשתמש בצובר לסכימת ערכי. המשתנה counterLargeמשמש באלגורית לפתרו בעיה 3כמונה של מספר הערכי הגבוהי מ50 מבי הערכי הנתוני. מונה הינו משתנה אשר תפקידו למנות מספר פעמי שהתרחש אירוע מסוי )למשל ,מספר הפעמי שנקרא נתו קלט( .כיוו שהשימוש במונה הוא לספירה ,מונה הוא משתנה מטיפוס של. בתוכנית לפתרו בעיה 3מופיעי המשפטי המבטאי את פעולות הצבירה והמנייה בגו הלולאה, לאחר משפט הקלט. המשפט המבטא את פעולת הצבירה בגו הלולאה הוא: ;sum = sum + num המשפט המבטא את פעולת המנייה בגו הלולאה הוא: ;counterLarge++ מאחר שתחזוקה של מונה או צובר מערבת ביצוע של פעולות עדכו חוזרות ונשנות ,מתבצעות בדר כלל פעולות צבירה ומנייה בגו הלולאה. שימו ♥ שבשני המקרי מתווס ער למשתנה המשמש כצובר או מונה .במקרה של צובר מתווס לצובר ער ששיי לקבוצת הערכי המצטברי .במקרה של מונה מתווס למונה הער .1 הוראת המדעים ,אוניברסיטת תל-אביב -260- מדעי המחשב באלגורית בו יש שימוש בצובר או במונה יש לאתחל את הצובר או את המונה .בתוכנית לפתרו הבעיה מאותחלי הצובר sumוהמונה counterLargeל.0 איתחול של צובר או מונה הוא השמת ער אשר מתאי לתחילת תהלי הצבירה או המנייה. מונה מאותחל בדר כלל ל .0הער התחילי המתאי לצובר תלוי במהות הצבירה המתבצעת בו. למשל ,צובר השומר סכו מצטבר יאותחל ל.0 שאלה 7.6 שנו את המשפטי שבגו הלולאה שבתוכנית לפתרו בעיה 3כ שיחושב ממוצע הערכי הגבוהי מ .50 שאלה 7.7 לפעמי נית להשתמש בערכו של מונה לחישוב מספר הנתוני שה בעלי מאפיי הפו למאפיי של הנתוני הנימני באמצעות המונה .למשל ,נניח שבבעיה 3יש להציג כפלט ג את מספר הערכי הקטני או שווי ל.50 דר אחת לחישוב מספר זה היא באמצעות שימוש במונה חדש ) counterSmallנוס ל ,(counterLargeאשר ערכו יוגדל ב 1בכל פע שנקרא מהקלט ער הקט או שווה ל.50 א בעצ אי צור במונה נוס .נית לבצע את החישוב אחרי תו ביצוע הלולאה ,באמצעות המונה counterLargeהמופיע כבר בתוכנית .כיצד? הוסיפו לתוכנית את ההוראה או ההוראות המתאימות. שאלה 7.8 ציינו עבור כל אחת מ הבעיות האלגוריתמיות הבאות הא נחו ,לפתרונה צובר ,מונה ,או א אחד מהשניי: א .קלט :רשימת מחירי פלט :ס כל המחירי ב .קלט :רשימת מחירי פלט :מספר המחירי הגבוהי מ100 ג .קלט:רשימת מחירי פלט :מספר המחירי שמרכיב האגורות בה שונה מ0 ד .קלט :רשימת מספרי פלט :הער המוחלט של כל אחד מהמספרי ה .קלט :רשימת מספרי פלט :הממוצע של הערכי המוחלטי של המספרי. הוראת המדעים ,אוניברסיטת תל-אביב -261- מדעי המחשב שאלה 7.9 יש לקלוט סדרה של תווי ,אשר אורכה שמור במשתנה ,listSizeולמנות את מספר התווי שה אותיות גדולות ) (capital lettersב.ABC בחרו משתני ,כתבו הוראה לביצוע חוזר אשר לפניה אתחול מתאי ,ויישמו אותה על ידי משפט .for שאלה 7.10 מטרת קטע התוכנית הבא היא מניית מספר תווי קלט אשר שוני מ האות .Aהמשתני counter ו listSizeה מטיפוס של והמשתנה letterהוא מטיפוס תווי. ; __________ = int counter )for (int i = 1; i <= listSize; i++ { ;)"= In.ReadChar ("Insert char letter )____________( if { __________ } }// for " System.out.println("There are " + counter + "letters different than A ;)+ counter קטע התוכנית כולל לולאה. א .כמה פעמי תתבצע הלולאה עבור הער 10ב?listSize ב .כמה פעמי תתבצע הלולאה עבור הער 1ב?listSize ג .השלימו את קטע התוכנית. שאלה 7.11 נתונה התוכנית הבאה: */ קלט :טור של 15תווים מטופס ספורטוטו פלט______________________________________: */ public class Toto { )public static void main (String [] args { ;final int NUM_OF_GAMES = 15 ;int d = 0 ;char score הוראת המדעים ,אוניברסיטת תל-אביב -262- מדעי המחשב )for (int i = 0; i < NUM_OF_GAMES; i++ { ;)"score = In.readChar("Insert the score )'if (score == 'X { ;d++ } // if } // for ;)System.out.println(d } // main } // Toto קלט התוכנית הוא טור בטופס הספורטוטו .כלומר 15 ,תווי שכל אחד מה מציי תוצאת משחק ),1 2או .(X א .מהו הפלט עבור הקלט?12X12X12X12X12X : ב .הא התוכנית כוללת מונה או צובר? א כ ,מהו או מה? ג .כמה פעמי תתבצע לולאת התוכנית? ד .הביאו דוגמת קלט אשר הפלט עבורה הוא .0 ה .הביאו דוגמת קלט אשר הפלט עבורה הוא .15 ו .מה מאפיי את הקלטי אשר הפלט עבור הוא ?1 ז .מה ערכי הפלט האפשריי? ח .מהי מטרת התוכנית? בחרו ש משמעותי למשתנה .d שאלה 7.12 פתחו ויישמו אלגורית אשר הקלט שלו הוא מספר המציי אור של רשימה ואחריו רשימה באור הנתו של מספרי ממשיי .הפלט שלו הוא סכו החלקי השלמי של המספרי הממשיי הנתוני. בדוגמאות שראינו עד כה שימש צובר לצבירת סכו .א נית להשתמש בצובר ג לצבירת מכפלה. כאשר צובר משמש לצבירת מכפלה הוא מאותחל לער שונה מ .0שימו לב לכ בשאלה הבאה: שאלה 7.13 פתחו ויישמו אלגורית שיקבל כקלט רשימה של 50מספרי ויציג כפלט את מכפלת של המספרי הקטני מ.10 להעמקה בתבניות מנייה וצבירה פנו לעמוד .321בעיה 3השתמשה ג בתבנית ממוצע .להעמקה בתבניות ממוצע עבור סדרה שיכולה להכיל יותר מ 3ערכי פנו לעמוד .332 הוראת המדעים ,אוניברסיטת תל-אביב -263- מדעי המחשב בעיה 4 מטרת הבעיה ופתרונה :עוד על הוראה לביצוע חוזר באור ידוע מראש :הצגת הוראה לביצוע חוזר המבצעת עיבוד על איברי תחו ,והדגמת שימוש במשתנה הבקרה בתו גו הלולאה. פתחו ויישמו אלגורית ,שיקבל כקלט מספר של ,ויציג כפלט את כל המספרי השלמי החיוביי הקטני מהמספר הנתו .למשל ,עבור הקלט ,5הפלט המתאי הוא4 : 3 2 .1 פירוק הבעיה לתתמשימות ברצוננו לקלוט מספר של ,num ,ולבצע הצגה כפלט של num−1ערכי ,מ 1עד .num−1א כ, החלוקה לתתמשימות היא ברורה למדי: .1קליטת מספר מהקלט .2הצגה כפלט של כל הערכים החיוביים והשלמים שקטנים מהמספר שנקלט ברור כי לש ביצוע תתמשימה 2נזדקק להוראה לביצוע חוזר ,שתתבצע num−1פעמי. בחירת משתני ברור כי נזדקק למשתנה עבור הער הנקרא מהקלט .סביר כי נהיה ג זקוקי למשתנה כלשהו ,עבור האיבר התור להצגה .משתנה זה יאותחל ל 1ויקוד בסיו כל סיבוב בלולאה ב ,1עד אשר ערכו יגיע ל.num אבל ,איננו זקוקי למשתנה נוס' ,כי תיאור זה מתאי בדיוק למשתנה הבקרה של ההוראה לביצוע חוזר! לכ ,נקבל את רשימת המשתני הבאה: – numמטיפוס של ,לשמירת הער הנקרא מהקלט – iמשתנה הבקרה האלגורית כאמור ,תתמשימה 2משרה הוראה לביצוע חוזר .למעשה ,בהוראה זו אנו מעונייני לעבור על תחו של ערכי )מהער 1ועד הער (num−1ולבצע עיבוד עבור כל ער בתחו )במקרה זה ,להציגו כפלט(. כדי לבטא זאת ,ננסח את ההוראה לביצוע חוזר בצורה שונה מעט מזו שראינו באלגוריתמי קודמי בפרק. num-ì íìù øôñî èåì÷ .1 .2 :òöá num-î ïè÷ä íìù éáåéç i øôñî ìë øåáò i ìù åëøò úà èìôë âöä .2.1 הוראת המדעים ,אוניברסיטת תל-אביב -264- מדעי המחשב יישו האלגורית את הוראה 2באלגורית שכתבנו נייש על ידי משפט .forזהו משפט forהדומה מאוד לאלה שראינו בתוכניות קודמות בפרק ,רק שבו משתנה הבקרה אינו משמש רק כדי לשלוט על ביצוע הלולאה .יש התייחסות למשתנה הבקרה ג בתו גו הלולאה ,ולא רק בשלושת הרכיבי שבכותרת הלולאה. התוכנית המלאה */ קלט :מספר שלם פלט :כל המספרים השלמים והחיוביים הקטנים מהמספר הנתון */ public class PrintNumbers { )public static void main(String[] args { ערך הנקרא מהקלט // ;int num ;)"num=In.readInt("Insert a number )for (int i = 1; i < num; i++ { ;)System.out.print(i } // for } // main } // PrintNumbers סוף פתרון בעיה 4 שאלה 7.14 על פי הגדרת בעיה ,4יכול להינת כנתו ראשו בקלט כל מספר של .תארו את מהל ביצוע התוכנית PrintNumbersא הער הראשו בקלט הוא המספר השל .0תארו את מהל הביצוע של התוכנית א הער הראשו בקלט הוא המספר השל .-2 שאלה 7.15 פתחו אלגורית שמקבל כקלט מספר חיובי של ,nמחשב את ! ,nומציג את הער שחושב כפלט. ישמו את האלגורית בשפת .Java להזכירכ n! :היא מכפלת המספרי מ 1עד ,nכלומר.n! = 1⋅2⋅…⋅n : הוראת המדעים ,אוניברסיטת תל-אביב -265- מדעי המחשב שאלה 7.16 1 1 1 פתחו אלגורית שמקבל כקלט מספר חיובי של , nומחשב את הסכו . + + ... + :ישמו את 1 2 n האלגורית בשפת .java כזכור ,הרכיב השלישי במשפט forהוא משפט השמה ,המתאר את השינוי של משתנה הבקרה בתו כל סיבוב בלולאה .עד עתה כתבנו תוכניות שבה משתנה הבקרה גדל ב 1בתו כל סיבוב של הלולאה. אבל ,לעיתי נרצה לקד את משתנה הבקרה ב 3 ,2או אפילו פי .2שפת Javaמאפשרת לנו לתאר שינויי כאלה ,פשוט על ידי כתיבת משפט השמה מתאי .הנה מספר דוגמאות לכותרות משפטי for כאלה: )for(int i = small; i < big; i = i + 2 )for(int i = small; i < big; i = i * 2 )for(int i = big; i > small; i-- )כפי שוודאי הבנת i--,היא דר מקוצרת לכתוב.( i = i - 1: במקרי רבי ,אכ מתאי לבצע עדכוני שוני של משתנה הבקרה ,כפי שמדגימות השאלות הבאות. שאלה 7.17 לפניכ קטע תוכנית הכתוב בjava )for (int i = 1; i <= 50; i = i * 2 { ;)System.out.println(i } א .עקבו בעזרת טבלת מעקב אחר קטע התוכנית? מה יודפס? ב .נניח כי במקו הער 50מופיע ער חיובי של כלשהו .N ,תארו מה מבצע קטע התוכנית ,כתלות בער .N שאלה 7.18 פתחו אלגורית ,אשר מקבל כקלט מספר של ,ומציג כפלט את כל המספרי הזוגיי החיוביי הקטני מהמספר שנקרא. הוראת המדעים ,אוניברסיטת תל-אביב -266- מדעי המחשב 7.2מציאת מקסימום או מינימום שתיי מהבעיות הבסיסיות ביותר במדעי המחשב ה חישוב הער הגדול ביותר או הקט ביותר ברשימה של ערכי נתוני .פתרונ מהווה תבנית שימושית מאוד .בסעי זה נערו היכרות ע בעיות אלו ונראה כי כאשר אור הרשימה ידוע נית לפתור אות בעזרת הוראה לביצוע חוזר באור ידוע מראש. בעיה 5 מטרת הבעיה ופתרונה :הצגת אופ חישוב הער הגדול ביותר ברשימת ערכי נתוני שאורכה נתו א הוא. מנהל סני הבנק החליט לבדוק מהו סכו הכס הגדול ביותר השמור בחשבונות של לקוחות הסני. פתחו אלגורית אשר קולט את מספר החשבונות בסני ,ולאחר מכ את סכו הכס הנמצא בכל חשבו וחשבו )כמספר ממשי( .פלט האלגורית יהיה הסכו הגבוה ביותר .ישמו את האלגורית בשפת .Java ניתוח הבעיה בעזרת דוגמאות נניח לרגע כי מדובר בסני בנק ייחודי ,בו מתנהל חשבו אחד בלבד .ברור כי סכו הכס בחשבו זה הוא הגדול ביותר .מייד אחרי שנקלט סכו הכס בחשבו היחיד בסני ,אפשר להכריז עליו כעל הסכו הגדול ביותר. א בסני מתנהלי שני חשבונות ,ברור כי יש להשוות בי סכו הכס בחשבו הראשו ,לבי זה שבחשבו השני .הסכו הגדול מבי אלה הוא ג הגדול ביותר בסני כולו. א בסני מתנהלי שלושה חשבונות ,יש להשוות קוד בי שני הסכומי הראשוני הנקראי מהקלט .את הסכו השלישי יש להשוות לגדול מבי השניי. א כ ,הרעיו המרכזי בפתרו הבעיה הוא בעצ לזכור בכל זמ) מהל הביצוע ,מיהו הער הגדול ביותר מבי אלה שכבר נקלטו .ער זה יושווה תמיד לער הבא שנקרא מהקלט ,ויתעדכ בהתא לתוצאת ההשוואה. פירוק הבעיה לתתמשימות את הרעיו שתיארנו נוכל לבטא באמצעות התתמשימה הבאה ,אשר על ביצועה יש לחזור לאחר כל קליטת ער נוס: השוואת הסכום האחרון שנקלט לסכום הגדול ביותר שנקלט עד כה ועדכון הסכום הגדול ביותר שנקרא עד כה על פי תוצאת ההשוואה הוראת המדעים ,אוניברסיטת תל-אביב -267- מדעי המחשב בחירת משתני נזדקק למשתנה שיזכור את מספר ערכי הקלט )מספר החשבונות( ,ולמשתנה לשמירת הער התור בקלט .בנוס נזדקק למשתנה כדי לזכור את הער הגדול ביותר מבי אלה שנקלטו .נבחר את המשתני הבאי מטיפוס של: – howManyמספר הערכי ברשימת הנתוני ,מספר החשבונות בסני – balanceהער התור ברשימת ערכי הקלט – maxלשמירת הסכו הגדול ביותר מבי אלה שנקלטו האלגורית maxיאותחל לסכו הראשו ברשימה ,כיוו שמייד אחרי שנקרא הסכו הראשו ,הוא בוודאי הגדול ביותר מבי כל הסכומי שנקראו .כעת יש לקרוא את כל הסכומי האחרי ,בעזרת הוראה לביצוע חוזר .לאחר כל קליטה של סכו נוס ,יש להשוות את הסכו החדש שנקלט לסכו הגדול ביותר שנקרא עד כה )השמור ב .(maxא הסכו החדש גדול מזה השמור ב ,maxיישמר ב maxהסכו החדש. ? כמה פעמי צרי להתבצע גו ההוראה לביצוע חוזר? הסכו הראשו נקרא מהקלט עוד לפני הביצוע החוזר ,לצור האתחול של המשתנה .maxלכ , הלולאה צריכה להתבצע רק howMany–1פעמי ,כדי לקלוט ולעבד את ערכי הקלט הנותרי. הנה האלגורית המלא: howMany-á úåðåáùçä øôñî úà èåì÷ .1 balance-á ïåùàøä íåëñä úà èåì÷ .2 max-á balance ìù åëøò úà íùä .3 .4 òöá :íéîòô howMany-1 balance-á àáä íåëñä úà èåì÷ .4.1 .4.2 íà max < balance max-á balance ìù åëøò úà íùä .4.2.1 max ìù åëøò úà èìôë âöä .5 הוראת המדעים ,אוניברסיטת תל-אביב -268- מדעי המחשב יישו האלגורית */ קלט :מספר חשבונות בנק ,ורשימת הסכומים בחשבונות אלה פלט :הסכום הגבוה ביותר ברשימה */ public class FindMax { )public static void main (String [] args { ;int howMany מספר הערכים ברשימה // ;int balance הסכום התורן // ;int max הסכום הגבוה ביותר מבין אלה שנקלטו// ;)"1. howMany = In.readInt("Insert the amount of accounts ;)"2. balance = In.readInt("Insert the first balance אתחול המקסימום לסכום הראשון// ;3. max = balance )4. for(int i = 2; i <= howMany; i++ { ;)4.1. balance = In.readInt("Insert balance of account " + i הסכום הנוכחי גדול מהמקסימום הנוכחי// )4.2. if (balance > max { ;4.2.1. max = balance } // if } // for ;)5. System.out.println("The maximum is " + max }// main }// FindMax סוף פתרון בעיה 5 שאלה 7.19 בנו טבלת מעקב אחר מהל ביצוע התוכנית FindMaxלפתרו בעיה 5עבור הקלט: 5 3 2 4 6 -9 כמה פעמי במהל ביצוע התוכנית על קלט זה מוש ער במשתנה ?max שאלה 7.20 בפתרו בעיה 5אותחל maxלערכו של הנתו הראשו ברשימה .הא הפתרו היה נכו לו maxהיה מאותחל לער קבוע כלשהו ,למשל ?0 הוראת המדעים ,אוניברסיטת תל-אביב -269- מדעי המחשב שאלה 7.21 נתו קטע התוכנית החלקי הבא לחישוב המספר הקט) ביותר ברשימת מספרי שליליי נתונה ,אשר אורכה שמור במשתנה .len _____________ = min ;)"len = In.readInt("Insert the list size )for (int i = 1; i <= len; i++ { _________________________ _________________________ _________________________ } ;)System.out.println("The minimum is: " + min השלימו את קטע התוכנית )הוסיפו משתנה או משתני במידת הצור(. במשפט הראשו אתחלו את minלער קבוע כלשהו )ולא לער הראשו ברשימה(. שאלה 7.22 פתחו ויישמו אלגורית שמקבל כקלט רשימה של ציוני במדעי המחשב של 40תלמידי .הפלט הוא הציו הגבוה ביותר מבי התלמידי שנכשלו במבח )ציו נכשל הוא ציו הנמו מ.(55 שימו לב :כא הציו התור הנקרא מהקלט אינו מושווה בכל מקרה למקסימו הנוכחי ,אלא רק כאשר הוא קט מ.55 כפי שראינו בתרגילי הקודמי ,ישנ דרכי שונות לאתחול בתבנית מציאת מקסימו )וכמוב ,כ ג לגבי תבנית מציאת מינימו( .המשתנה ששומר את המקסימו התור ,צרי בכל שלב לשמור את האיבר הגדול ביותר מבי האיברי שהושוו עד כה .בדר כלל נעדי לאתחל את המשתנה הזה להיות האיבר הראשו ברשימה .אכ ,אחרי שנקלט איבר אחד בלבד בוודאי שהוא הגדול מבי כל אלה שנקלטו .א ישנ מיקרי שעובדה זו אינה מספיקה ולא נוכל להשתמש באתחול כזה .כ ,למשל, בשאלה :7.22בשאלה זו אנו מעונייני למצוא מקסימו רק מבי ציוני הנכשלי ולא מבי כל הציוני שבקלט .כלומר ,לא כל איבר שנקלט צרי להיות מושווה לצור מציאת מקסימו .בפרט, לא בטוח שהאיבר הראשו הוא ציו נכשל וייתכ שהוא בכלל לא מועמד למקסימו .לכ יהיה זה שגוי לקבוע אותו כמקסימו התחלתי. במקרי כאלה נוכל להשתמש בקצוות של טווח הערכי האפשריי .למשל ,א מדובר בציוני, ערכ יכול לנוע מ 0עד .100במקרה כזה ,נכו יהיה לאתחל את המקסימו התור ל) 0ואת המינימו התור ל .(100כיוו שברור שהער הראשו שנשווה למקסימו התור ערכו הוא לפחות ,0 הרי שמייד אחרי ההשוואה הראשונה המקסימו התור יכיל את האיבר הראשו שהושווה. שימו ♥ :לא תמיד ידועי ערכי קצה לטווח הערכי האפשריי )ראו את שאלה !(7.20 להעמקה בתבניות מציאת מקסימום ומציאת מינימום פנו לעמוד .337 הוראת המדעים ,אוניברסיטת תל-אביב -270- מדעי המחשב 7.3מציאת מקום מקסימום או מינימום בסעי זה נכיר בעיות הדומות לבעיית מציאת מקסימו או מינימו ,א מעט יותר מורכבות .ג פתרונותיה מהווי תבניות שימושיות. בעיה 6 מטרת הבעיה ופתרונה :הצגת אופ חישוב מקומו של הער הגדול ביותר והקט ביותר ברשימת ערכי נתוני. בנג MP3שמורי 100שירי .לכל שיר מספר ייחודי משלו בי 1ל .100על צג המכשיר מוצגי מספריה של השיר הארו ביותר והקצר ביותר שנמצאי בו .עליכ לפתח אלגורית שיאפשר את הצגת המידע הזה .כלומר ,האלגורית יקבל כקלט את רשימת אורכי 100השירי במכשיר ,ופלט האלגורית יהיה מספרו של השיר הארו היותר ,ומספרו של השיר הקצר ביותר. כמוב שלצור פתרו הבעיה יש למצוא את השיר הארו ביותר ואת השיר הקצר ביותר .כלומר ,יש למצוא ברשימת אורכי השירי ער מקסימלי וער מינימלי .אבל ,בבעיה זו עלינו לשמור ,מלבד הער המקסימלי והער המינימלי ,ג את מקומ של ערכי אלה ברשימה. פירוק הבעיה לתתמשימות את הרעיו המרכזי בפתרו נוכל לבטא באמצעות התתמשימה הבאה ,אשר על ביצועה יש לחזור לאחר כל קליטת ער נוס: השוואת אורך השיר האחרון שנקלט לאורך השיר הגדול ביותר שנקלט עד כה ולאורך השיר הקצר ביותר שנקלט עד כה ,ובהתאם לתוצאת ההשוואה עדכון ערך המקסימום ומקום המקסימום ועדכון ערך המינימום ומקום המינימום. בחירת משתני – currentSongLengthמטיפוס ממשי ,ישמור את אור השיר הנוכחי. – longestמטיפוס ממשי ,ישמור את אור השיר הארו ביותר שנקלט עד כה. – shortestמטיפוס ממשי ,ישמור את אור השיר הקצר ביותר שנקלט עד כה. – placeLongestמטיפוס של ,ישמור את מקומו של השיר הארו ביותר שנקלט עד כה. – placeShortestמטיפוס של ,ישמור את מקומו של השיר הקצר ביותר שנקלט עד כה. שימו ♥ לבחירת טיפוסי המשתני :המשתני longestו shortestאשר שומרי את האור המקסימלי והאור המינימלי ,חייבי להיות מאותו טיפוס כמו הערכי ברשימת הקלט ,וכיוו שכא הוראת המדעים ,אוניברסיטת תל-אביב -271- מדעי המחשב המשתני, לעומת. בחרנו בטיפוס ממשי,(מדובר באורכי שירי )שיכולי להיות לא שלמי . ולכ ה מטיפוס של, שומרי מקו ברשימהplaceShortest וplaceLongest האלגורית currentSongLength-á ïåùàøä øéùä êøåà úà èåì÷ .1 longest-á currentSongLength ìù åëøò úà íùä .2 shortest-á currentSongLength ìù åëøò úà íùä .3 1 êøòä úà placeLongest-ì íùä .4 1 êøòä úà placeShortest-ì íùä .5 : íéîòô 99 òöá .6 currentSongLength-á àáä øôñîä úà èåì÷ .6.1 currentSongLength > longest íà .6.2 longest-á currentSongLength úà íùä .6.2.1 placeLongest-á éçëåðä øéùä ìù åîå÷î úà íùä .6.2.2 currentSongLength < shortest íà .6.3 shortest-á currentSongLength úà íùä .6.3.1 placeShortest-á éçëåðä øéùä ìù åîå÷î úà íùä .6.3.2 placeShortest ìù åëøò úàå placeLongest ìù åëøò úà èìôë âöä .7 וplaceLongest דאגנו לאתחל ג את,shortest וlongest בדיוק כמו שדאגנו לאתחל את:♥ שימו , אותחל לאורכו של השיר הראשו ולכ בהתאLongest . באופ עקבי,placeShortest וshortest כ ג לגבי האתחול של .(1 ל, אותחל למקו הראשו )כלומרplaceLongest .placeShortest יישו האלגורית ? כיצד נדע מהו מקומו של שיר נתו ? משתנה, פעמי99 כדי שהלולאה תתבצע.forלש כ נוכל להשתמש במשתנה הבקרה של משפט ה . וערכו של משתנה הבקרה יהיה בדיוק מספרו של השיר התור,100 עד2הבקרה יתקד מ מדעי המחשב -272- אביב- אוניברסיטת תל,הוראת המדעים התוכנית המלאה /* MP3 השירים במכשיר100 רשימת אורכי:קלט ומספרו של השיר הקצר ביותר, מספרו של השיר הארוך היותר:פלט */ public class Mp3 { public static void main (String [] args) { final int NUM_OF_SONGS=100; // הגדרת קבוע – מספר השירים בנגן double currentSongLength; //אורך השיר הנוכחי double shortest; // אורך השיר הקצר ביותר double longest; //אורך השיר הארוך ביותר int placeLongest, placeShortest; // מקומם של השיר הקצר והארוך currentSongLength = In.readDouble("Insert the length of the first song"); // המינימום ומקומם,איתחולם של המקסימום longest = currentSongLength; shortest = currentSongLength; placeLongest = 1; placeShortest = 1; // כיוון שהשיר הראשון כבר נקלט2-הלולאה מתחילה מ for(int i = 2; i <= NUM_OF_SONGS; i++) { currentSongLength = In.readDouble("Insert the length of song " + i); if (currentSongLength > longest) { longest = currentSongLength; placeLongest = i; } // if if (currentSongLength < shortest) { shortest = currentSongLength; placeShortest = i; } // if } // for מדעי המחשב -273- אביב- אוניברסיטת תל,הוראת המדעים System.out.println("The number of the longest song is" + ;)placeLongest System.out.println("The number of the shortest song is" + ;)placeShortest } // main }// class Mp3 סוף פתרון בעיה 6 שאלה 7.23 פתחו אלגורית שיקבל כקלט מספר חיובי של ,המציי את מספר שחקני מכבי ת"א ,ואחר כ יקלוט רשימה של נתוני קליעות של השחקני :עבור כל שחק ייקלט מספרו )המספר שעל החולצה שלו( ,ומספר הנקודות שקלע במהל העונה .פלט האלגורית יהיה מספרו של השחק שקלע הכי הרבה במהל העונה. שימו ♥ :במקרה זה ,משתנה הבקרה אינו מצביע על ה"מקו" התור )כלומר ,מספר השחק התור ( .את המקו התור יש לקרוא מהקלט. להעמקה בתבניות מציאת ערך נלווה למקסימום ומציאת ערך נלווה למינימום פנו לעמוד .342 7.4ביצוע חוזר בתנאי לצור פתרו הבעיות שראינו עד כה נית היה להשתמש בהוראה לביצוע חוזר אשר מספר הסיבובי בה נקבע לפני תחילת הביצוע החוזר :בפתרו בעיה 1מספר הפעמי לביצוע חוזר היה ער קבוע של התוכנית ,וכ ג בפתרו שנית לבעיה .6בפתרו בעיה 2מספר הפעמי לביצוע חוזר נקרא מהקלט, וכ ג בפתרונות שניתנו לבעיות 4 ,3ו.5 בסעי זה נכיר בעיות אשר בפתרונ לא נית לקבוע לפני תחילת הביצוע החוזר את מספר הפעמי לביצוע חוזר .בפתרו בעיות אלה מהל הביצוע החוזר נקבע בהתא לתנאי .הביצוע החוזר מתבצע שוב ושוב כל עוד התנאי מתקיי .הביצוע החוזר מסתיי כאשר התנאי לא מתקיי. ביצוע חוזר עם זקיף בסעי זה נראה בעיות דומות לאלו שראינו בסעיפי הקודמי .הדמיו מתבטא בכ שג בבעיות אלו מתבצע עיבוד של רשימת נתוני קלט .ההבדל נעו ,באור הרשימה המעובדת .בבעיות שהוצגו עד כה, אור הרשימה היה קבוע של התוכנית או נקרא מהקלט .בבעיות שיוצגו בסעי זה אור הרשימה אינו ידוע כלל .במקו זאת ,האיבר האחרו בקלט הוא איבר מיוחד המסמ את סופה של רשימת ערכי הקלט. הוראת המדעים ,אוניברסיטת תל-אביב -274- מדעי המחשב בעיה 7 מטרת הבעיה ופתרונה :הצגת הוראה לביצוע חוזר בתנאי ע שימוש בזקי. צבי עובד בשעות אחה"צ בחלוקת משלוחי פרחי .הוא מעוניי להיעזר במחשב הנייד שהוא נושא עימו כדי לחשב בסיו יו העבודה את סכו הטיפי שהרוויח במהל היו .בכל פע שצבי מקבל טיפ הוא מקיש את הסכו שקיבל .בסיו יו העבודה הוא מקיש .-1פתחו אלגורית המקבל כקלט את רשימת הטיפי שקיבל צבי ,המסתיימת בער ,-1ומחשב את סכו הטיפי הכולל .ישמו את האלגורית בשפת .Java ניתוח הבעיה בעזרת דוגמאות שאלה 7.24 תארו את הפלט עבור כל אחד מ הקלטי הבאי )משמאל לימי (: א12 10 7 9 -1 . ב20 -1 . פירוק הבעיה לתתמשימות בניתוח ראשוני של הבעיה נית לראות שיש להשתמש בביצוע חוזר של שתי התתמשימות: .1קליטת מספר .2הוספת המספר לסכום )תוך שימוש בצובר( לו הקלט היה כולל בתחילתו את מספר הערכי בסדרה הנתונה ,היינו מפתחי אלגורית דומה לאלגוריתמי שבסעיפי הקודמי ,תו שימוש בהוראה במבנה øôñî òöá .íéîòôאבל מספר הערכי בסדרה לא נתו בתחילת הקלט )כלומר ,אי אנו יודעי מראש כמה שליחויות ביצע צבי באותו היו( .במקו זה מופיע בסו הקלט הער -1המציי "סו קלט" .כיצד נשתמש בסימו זה בהוראה לביצוע חוזר? נשתמש בער -1כדי להחליט על סיו ביצוע חוזר של התתמשימות שתיארנו .כלומר ,לאחר קליטה של טיפ תור ,יושווה ער הטיפ לער .-1א הוא שונה מ 1-הרי הוא נתו קלט רגיל ,ולכ יש להוסיפו לסכו המצטבר .אחרת ,יש לסיי את הביצוע החוזר. בחירת משתני – tipמטיפוס של ,ישמור את הטיפ למשלוח הנוכחי. – sumמטיפוס של ,ישמור את סכו הטיפי. הוראת המדעים ,אוניברסיטת תל-אביב -275- מדעי המחשב האלגורית ננסח את הרעיו שתיארנו: :òöá -1 åððéà èì÷ðù ïåøçàä êøòä ãåò ìë øáèöîä íåëñì èì÷ðù ïåøçàä êøòä úà óñåä øáèöîä íåëñä ìù åëøò úà èìôë âöä בהוראה לביצוע חוזר מסוג זה נבדק תנאי לפני כל סיבוב בלולאה .במקרה זה התנאי הוא êøòä .-1 åððéà èì÷ðù ïåøçàäא התנאי מתקיי מתבצע סיבוב נוס בלולאה .כאשר התנאי לא מתקיי, כלומר הער שנקלט הוא אכ ,-1מסתיי הביצוע החוזר. ? בי ההוראות האלו לא נמצאת עדיי הוראת לקליטת הטיפ התור .היכ נמק את הוראת הקלט? יש לבצע את קליטת הטיפ התור לפני השוואתו לסימ .-1לכ ,את הער הראשו יש לקרוא מהקלט עוד לפני ההוראה לביצוע חוזר .קליטת הערכי הבאי )עד לקליטת סימ סו הקלט( תהיה ההוראה האחרונה בגו הלולאה ,כלומר ,מייד כאשר מסתיי עיבוד איבר קלט תור ,ולפני שנבדק קיו התנאי ביחס לאיבר הקלט החדש ,מתבצעת קליטה של איבר הקלט החדש. הנה האלגורית המלא: 0-ì sum äðúùîä úà ìçúà .1 tip-á íìù øôñî èåì÷ .2 .3 :òöá tip ≠ -1 ãåò ìë tip êøòä úà sum-ì óñåä .3.1 tip-á íìù øôñî èåì÷ .3.2 sum ìù åëøò úà èìôë âöä .4 יישו האלגורית את ההוראה במבנה ...ãåò ìë ,òöáנייש ב Javaעל ידי משפט .whileמשפט whileכולל תנאי בוליאני שקיומו קובע את המש ביצוע הלולאה. הוראת המדעים ,אוניברסיטת תל-אביב -276- מדעי המחשב /* (-1)- סדרת מספרים שלמים חיוביים המסתיימת ב:קלט סכומם של המספרים שנקלטו:פלט */ public class sumOfTips { public static void main (String [] args) { int tip; // הטיפ מהמשלוח הנוכחי int sum; // סכום הטיפים המצטבר 1. sum = 0; 2. tip = In.readInt("Insert your first tip for today. End the list of tips with -1"); 3. while (tip != -1) { 3.1. sum = sum + tip; 3.2. tip = In.readInt("Insert the next tip. End the list of tips with -1"); } // while 4. System.out.println("You have earned " + sum + "shekels"); }// main }// sumOfTips מעקב :12 6 3 -1 עבור הקלטsumOfTips נעקוב אחר מהל ביצוע התוכנית . אנו כוללי עמודה עבור התנאי הבוליאני שבכותרת המשפטwhile בטבלת מעקב הכוללת משפט המשפט הבא לביצוע 1 sum = 0; 2 tip = In.readInt("Insert your first tip sum ? ? ? 0 12 0 12 0 tip!= -1 Insert your first tip for today. End the list of tips with -1 tip for today. End the list of tips with -1"); 3 while (tip!= -1) מדעי המחשב -277- פלט true אביב- אוניברסיטת תל,הוראת המדעים 3.1 3.2 sum = sum + tip; tip = In.readInt("Insert the next 12 12 6 12 Insert the next tip. End the list of tip. End the list of tips with -1"); tips with -1 while (tip != -1) 6 12 3.1 sum = sum + tip; 6 18 3.2 tip = In.readInt("Insert the next 3 18 3 true Insert the next tip. End the list of tip. End the list of tips with -1"); tips with -1 3 while (tip!= -1) 3 18 3.1 sum = sum + tip; 3 21 3.2 tip = In.readInt("Insert the next -1 21 true Insert the next tip. End tip. End the list of tips with -1"); the list of tips with -1 3 4 while (tip!= -1) System.out.println("You have earned -1 21 -1 21 false You have " + sum + "shekels"); earned 21 Shekels 7 סוף פתרון בעיה :7 נציג את המבנה החדש שהכרנו בפתרו לדוגמה של בעיה .בתנאי מבטאת ביצוע חוזר של תת משימה התלוי בקיו תנאי הוראה לביצוע חוזר ...òöá ...ãåò ìë הוראה כזאת נכתבת במבנה תנאי הכניסה והתנאי להמש הביצוע החוזר נקרא,ג הוראה כזאת נקראת לולאה .ללולאה מדעי המחשב -278- אביב- אוניברסיטת תל,הוראת המדעים הוראה לביצוע חוזר בתנאי מיושמת ב Javaעל ידי משפט .while המבנה הכללי של משפט whileהוא: )ביטוי בוליאני( while { גו הלולאה :משפט או משפטי לביצוע } ביצוע משפט whileמתחיל בחישוב ערכו של הביטוי הבוליאני .א ערכו trueמתבצע גו הלולאה .בתו ביצוע גו הלולאה מחושב הביטוי הבוליאני שוב .א ערכו trueמתבצע גו הלולאה שוב .תהלי זה נמש כל עוד ערכו של הביטוי הבוליאני הוא .trueכאשר ערכו הוא falseמסתיי ביצוע משפט ה.while בטבלת מעקב אחר מהל ביצוע תוכנית הכוללת משפט whileאנו כוללי עמודה עבור תנאי הכניסה ללולאה. נית לתאר משפט whileבאמצעות תרשי הזרימה הבא: התנאי מתקיים משפט/ים ביטוי בוליאני התנאי לא מתקיים כאמור ,השוני בי בעיה 7לבעיות הקודמות לה בפרק הוא בהגדרת הקלט .בבעיות הקודמות נית מראש אור רשימת איבר הקלט ,ואילו בבעיה 7סיו רשימת הקלט מסומ על ידי סימ מיוחד ).(-1 סימ כזה נקרא זקי'. זקי הינו נתו קלט חריג ,שתפקידו לסמ את סו סדרת ערכי הקלט .הזקי אינו חלק מסדרת הנתוני ,ואי לעבד אותו כמו שאר איברי הסדרה. הוראת המדעים ,אוניברסיטת תל-אביב -279- מדעי המחשב למשל ,בפתרו בעיה ,7לא הוספנו את הער -1לסכו איברי הסדרה ,כיוו שהזקי אינו נחשב כחלק מהסדרה! השוני בהגדרת הקלט משפיע ג על מבנה הלולאה .הבדל ברור אחד הוא שבפתרו בעיה 7השתמשנו בהוראה לביצוע חוזר בתנאי ,שיושמה על ידי משפט ,whileבעוד שבפתרו הבעיות הקודמות השתמשנו בהוראות לביצוע חוזר באור ידוע מראש ,שיושמו על ידי משפטי .forא יש הבדל נוס – האופ שבו משולבות הוראות הקלט בתו הלולאה: בלולאות בה השתמשנו בפתרו בעיות קודמות ,גו הלולאה כלל הוראת קלט ומיד לאחריה הוראה לעיבוד הקלט .מבנה זה של גו הלולאה התאי לבעיות בה היה צרי לעבד כל אחד ואחד מאיברי הקלט באופ אחיד. בבעיות דוגמת בעיה ,7עיבוד איברי הקלט אינו אחיד :העיבוד של הזקי שונה מהעיבוד של איברי אחרי בקלט .דרוש מבנה המאפשר לקרוא איבר קלט ולעבד אותו רק אחרי שבוצעה בדיקה כי הוא אינו הזקי .לכ ,בפתרו בעיות בה הגדרת הקלט כוללת זקי ,מתבצעת הוראת קלט ראשונה לפני הלולאה .גו הלולאה כולל קוד כל הוראה לעיבוד הקלט ,ואחריה הוראת קלט. המבנה הכללי של הוראה לביצוע חוזר לעיבוד רשימת קלט המסתיימת בזקי: ÷ïåúð èåì ãåò ìë :òöá óé÷æä åððéà èì÷ðä ïåúðä èì÷ðä ïåúðä úà ãáò ÷ïåúð èåì באופ זה ,הנתו החדש ייבדק תמיד מייד לאחר קליטתו. שאלה 7.25 נתו קטע התוכנית הבא ,הקלט הוא רשימת תווי ,המהווה מילה באנגלית אשר בסופה הזקי '*'. ;int i = 0 ;char letter ;)"letter = In.readChar("Insert the first letter of the word )'*' =! while (letter { ;i = i + 1 ;)"letter = In.readChar("Insert the next letter of the word } ;)System.out.println(i מהי מטרת קטע התוכנית? הוראת המדעים ,אוניברסיטת תל-אביב -280- מדעי המחשב שאלה 7.26 פתחו אלגורית אשר הקלט שלו הוא רשימת ציוני )נתוני כמספרי שלמי( בי 0ל 100אשר בסופה הזקי ,101והפלט שלו הוא מספר הציוני ברשימה הגדולי או שווי ל .60ישמו את האלגורית בשפת .Java שאלה 7.27 אלו ובני מתחרי על תפקיד יושב ראש ועדת קישוט של הכיתה ,מועמד זוכה א יותר מחצי מ הבוחרי הצביעו עבורו .פתחו ויישמו אלגורית אשר הקלט שלו הוא סדרה של התווי AוA) B עבור אלו B ,עבור בני( ,המבטאת את קולות הבוחרי ,ומסתיימת בזקי ' .'#הפלט שלו הוא הודעה הא אלו זכה או לא זכה ברוב קולות )כלומר ,ביותר מחצי מקולות הבוחרי(. למשל ,עבור הקלט ABBAABBAA#הפלט המתאי הוא wins ,Alonועבור הקלט ABBABBAA#הפלט המתאי הוא .Alon didn’t win להעמקה בתבנית איסוף בקיזוז פנו לעמוד .347 שאלה 7.28 בבחירות לוועד חיות היער מועמדות שלוש חיות :העכבר ,שמספרו ,1האריה ,שמספרו ,2והנמלה, שמספרה .3פתחו אלגורית אשר הקלט שלו הוא רשימת קולות הבוחרי )כל קול הוא אחד מ המספרי 2 ,1או (3אשר בסופה הזקי .0הפלט הוא הודעה המתארת עד כמה צריכות חיות היער להיזהר :א האריה קיבל פחות מ 30%מהקולות עליה להיזהר מאוד ,א האריה קיבל בי 31%ל 70%מהקולות עליה להיזהר קצת ,וא האריה קיבל יותר מ 71%מהקולות ה יכולות להיות רגועות ואינ צריכות להיזהר כלל .ישמו את האלגורית בשפת .Java שאלה 7.29 פתחו אלגורית אשר הקלט שלו הוא סדרת תווי המהווה מילה באנגלית ,ומסתיימת בזקי '*'. הפלט שלו הוא מילת הקלט ,כשהיא מוצפנת באופ הבא :כל אות במילה מוחלפת באות העוקבת לה "בצורה מעגלית" ב) ABCכלומר ,כל אות מלבד האות Zמוחלפת באות העוקבת לה ב ,ABCוהאות Zמוחלפת באות .(Aלמשל ,עבור הקלט * ZEBRAהפלט הוא .AFCSB ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -281- מדעי המחשב ביצוע חוזר עם תנאי כניסה כלשהו בעיה 8 מטרת הבעיה ופתרונה :הצגת שימוש בהוראה לביצוע חוזר בתנאי כניסה כלשהו שאינו תלוי בזקי. בתוכנית "הנוסע המתמיד" של חברת התעופה "שחקי" נית לצבור מרחקי טיסה .נוסע אשר צובר למעלה מ 3000קילומטרי זוכה בכרטיס טיסה חינ להונולולו. פתחו ויישמו אלגורית אשר הקלט שלו הוא רשימת מרחקי הטיסה של נוסע אשר זכה בכרטיס חינ )כלומר ,ידוע שכבר צבר יותר מ 3000ק"מ( .הפלט שלו הוא :מספר המרחקי המופיעי ברצ מתחילת הרשימה אשר סכומ המצטבר עולה על ,3000ומספר הקילומטרי שנשארו לנוסע מעבר ל 3000כיתרה לצבירות הבאות. למשל עבור הקלט 800 1000 700 150 500 :הפלט המתאי הוא ,5 150משו שרק סכומ של כל חמשת המרחקי עולה על ,3000ואחרי שמופחת מסכו המרחקי הער 3000נשארת יתרה של .150 ניתוח הבעיה בעזרת דוגמאות שאלה 7.30 מהו הפלט המתאי עבור כל אחד מ הקלטי הבאי: א.600 600 800 1000 200 . ב. 900 800 1200 300 700 . ? ברור שבפתרו הבעיה יש לצבור את המרחקי הנתוני .כלומר ,יש לבצע לולאה שבה ייקלט מרחק נתו ויתווס לצובר .א כמה פעמי יש לבצע זאת? בניגוד לבעיות בסעיפי הקודמי ,בה אור רשימת איברי הקלט היה נתו ,או שנית לנו סימ מיוחד לסיו הקלט )זקי( ,בבעיה זו יש לקלוט מרחקי ולהוסיפ לצובר כל עוד ערכו של הצובר איננו גדול מ .3000ברגע שערכו של הצובר גדול מ 3000אי צור להמשי בפעולות הקליטה והצבירה .מכא ,שיש לבצע את פעולות הקליטה והצבירה רק כל עוד מתקיי התנאי הבא: 3000-ì äååù åà ïè÷ øáöðä ÷çøîä הוראת המדעים ,אוניברסיטת תל-אביב -282- מדעי המחשב פירוק הבעיה לתתמשימות כל עוד המרחק הנצבר קט או שווה ל 3000יש לחזור על ביצוע התתמשימות הבאות: קליטת מרחק נתון הוספת המרחק הנתון לצובר הגדלה ב 1-של "מונה המרחקים" המונה המוזכר בתתמשימה האחרונה ימנה את מספר המרחקי שנצברו בצובר .כאשר יסתיי ביצוע הלולאה ,ישמור מונה זה את מספר המרחקי שנצברו עד שהסכו המצטבר עלה על .3000 בחירת משתני – distמטיפוס ממשי ,ישמור מרחק תור בקלט – sumמטיפוס ממשי ,צובר שישמור את סכו המרחקי המצטבר – counterמטיפוס של ,מונה שישמור את מספר המרחקי שנצברו האלגורית 0-ì sum úà ìçúà .1 úà ìçúà .2 .3 0-ì counter :òöá 3000-ì äååù åà ïè÷ sum ãåò ìë dist-á ÷çøîä úà èåì÷ .3.1 sum-ì dist úà óñåä .3.2 counter úà 1-á ìãâä .3.3 counter ìù åëøò úà èìôë âöä .4 .5 sum−3000 ùøôää úà èìôë âöä יישו האלגורית */ קלט :רשימת מרחקי טיסה שנצברו על ידי נוסע מתמיד ,שצבר יותר מ 3000-ק"מ פלט :מספר המרחקים הראשונים שסכומם גדול מ ,3000-וההפרש בין סכומם ל3000- */ public class distanceSum { )public static void main (String [] args { קבוע ,המרחק הדרוש // הוראת המדעים ,אוניברסיטת תל-אביב ;final int DISTANCE = 3000 -283- מדעי המחשב double sum = 0; //סכום מרחקים מצטבר int counter = 0; //מונה מרחקים שנצברו double dist; //מרחק טיסה double left; //3000-היתרה מעבר ל 1. while (sum <= DISTANCE) { 1.1. dist = In.readDouble("Insert next flight distance"); 1.2. sum += dist; //sum = sum + dist :דרך מקוצרת לכתוב 1.3. counter ++; //counter = counter+1 :דרך מקוצרת לכתוב } // while 2. System.out.println("The number of distances which sum to more than " + DISTANCE + " is " + counter); 3. left = sum - DISTANCE; 4. System.out.println("The passenger has " + left + " kilometers left"); } // main } // distanceSum מעקב :1000 700 1500 :נעקוב אחר מהל ביצוע התוכנית עבור הקלט המשפט הבא לביצוע sum counter dist sum<=DISTANCE left 0 0 ? ? ? true ? 1 while (sum <= DISTANCE) 0 0 ? 1.1 dist=In.readDouble("Insert 0 0 1000 ? next flight distance"); 1.2 sum += dist; 1000 0 1000 ? 1.3 counter++; 1000 1 1000 ? 1 while (sum <= DISTANCE) 1000 1 1000 1.1 dist=In.readDouble("Insert 1000 1 700 next flight distance"); true פלט Insert next flight distance ? ? Insert next flight distance מדעי המחשב -284- אביב- אוניברסיטת תל,הוראת המדעים 1.2 sum += dist; 1700 1 700 ? 1.3 counter++; 1700 2 700 ? 1 while (sum <= DISTANCE) 1700 2 700 1.1 dist=In.readDouble("Insert 1700 2 1500 true ? Insert ? next flight distance"); next flight distance 1.2 sum += dist; 3200 2 1500 ? 1.3 counter++; 3200 3 1500 ? 1 while (sum <= DISTANCE) 3200 3 1500 2 System.out.println("The 3200 3 1500 false ? The number ? number of distances which of sum to more than " + distances DISTANCE + " is " + which sum counter); to more than 3000 is 3 3 left = sum-DISTANCE; 3200 3 1500 200 4 System.out.println("The 3200 3 1500 200 passenger has " + left + " The passenger kilometers left"); has 200 kilometers left ולכ הער השמור במשתנה,שימו ♥ שבכל ביצוע חוזר של הלולאה נקלט מרחק טיסה אחד . הוא בעצ מספר הפעמי שמתבצעת הלולאהcounter 8 סוף פתרון בעיה 7.31 שאלה :( עבור הקלט8 )לפתרו בעיהDistanceSum בנו טבלת מעקב אחר ביצוע התוכנית 500 1200 800 300 300 ?כמה פעמי יתבצע גו הלולאה מדעי המחשב -285- אביב- אוניברסיטת תל,הוראת המדעים שאלה 7.32 נסחו תנאי כניסה בוליאני מתאי עבור כל אחד מ התיאורי הבאי של ביצוע חוזר: א .סכימת משקלי מכוניות )לצור מעבר במעבורת( כל עוד הסכו אינו עולה על 100טו . ב .סכימת המספרי החיוביי השלמי המתחילי ב 1עד אשר הסכו גדול מער הנתו כקלט. ג .קריאת אותיות עד אשר נקלטות 10אותיות .A שימו ♥ שבסעי א מתואר הביצוע החוזר במתכונת של כל עוד ובסעיפי ב וג מתואר הביצוע החוזר במתכונת של עד אשר. שאלה 7.33 בכל אחד מ הסעיפי הבאי מופיע קטע תוכנית הכולל משפט whileאשר חסר בו תנאי כניסה. השלימו את תנאי הכניסה בהתא למטרת קטע התוכנית ,ובנו טבלת מעקב אחר ביצוע הקטע השל. א .מטרת הקטע :הצגה כפלט של המספר הזוגי הקט ביותר אשר גדול מנתו הקלט ,כאשר נתו הקלט הוא מספר חיובי. ;)"num = In.readInt("Insert a number ;i = 0 )_____________( while { ;i = i + 2 } ;)System.out.println(i בנו טבלת מעקב אחר ביצוע קטע התוכנית השל עבור הקלט .9 ב .מטרת הקטע :הצגה כפלט של מכפלת שני נתוני הקלט ,שה מספרי שלמי חיוביי ;)"x = In.readInt("Insert a number ;)"y = In.readInt("Insert a number ;counter = 0 ;sum = 0 )______________( while { ;sum = sum + x ;counter = counter + 1 } ;)System.out.println(sum בנו טבלת מעקב אחר ביצוע קטע התוכנית השל עבור הקלט .4 3 הוראת המדעים ,אוניברסיטת תל-אביב -286- מדעי המחשב שאלה 7.34 נתו קטע התוכנית הבא אשר הקלט שלו הוא מספר חיובי של: ;)"limit = In.readInt("Insert a number ;s = 0 ;c = 0 )while (s < limit { ;c = c + 1 ;s = s + c } ;)System.out.println(c קטע התוכנית כולל מונה cוצובר .sהצובר צובר את ערכיו של המונה במהל הביצוע החוזר. א .מהו הפלט עבור הקלט ?1מהו הפלט עבור הקלט ?11 ב .ציינו שני קלטי שוני שעבור יהיה הפלט .5מהו מספר הפעמי של הביצוע החוזר עבור קלטי אלה? ג .מהי מטרת קטע התוכנית? היעזרו בטבלת מעקב כדי לענות על סעיפי א וב. שאלה 7.35 נתו קטע התוכנית הבא ,אשר הקלט שלו הוא מספר חיובי של ,כאשר TOP_LIMITהוא קבוע שערכו :100 ;)"num = In.readInt("Insert a number ;= 1 mult ;i = 0 ))while ((i<num) && (mult < TOP_LIMIT { ;i = i + 1 ;mult = mult * i } ;)System.out.println(mult קטע התוכנית הנתו כולל צובר ) (multאשר צובר ער של מכפלה ,והוא מאותחל לער .1 א .מהו הפלט עבור הקלט ? 2ומהו הפלט עבור הקלט ?5 ב .מהו הקלט שעבורו יהיה הפלט ?24ומהו מספר הפעמי של הביצוע החוזר עבור קלט זה? ג .מהי מטרת קטע התוכנית? היעזרו בטבלת מעקב כדי לענות על סעיפי א וב. הוראת המדעים ,אוניברסיטת תל-אביב -287- מדעי המחשב שאלה 7.36 פתחו אלגורית אשר הקלט שלו הוא מספר חיובי של ,והפלט שלו הוא החזקה הקטנה ביותר של 2 אשר גדולה מנתו הקלט .למשל :עבור הקלט 7הפלט הדרוש הוא ) 8כי ,(23=8ועבור הקלט 8הפלט הדרוש הוא ) 16כי .(24=16ישמו את האלגורית בשפת .Java במהל הפיתוח הקפידו על ניסוח תתמשימות לביצוע חוזר ,וניסוח תנאי לביצוע חוזר. שימו ♥שבאלגורית זה יש להשתמש בצובר של מכפלה. בלולאות whileשראינו עד כה תנאי הכניסה היו דומי למדי זה לזה .ה כללו תמיד השוואה בי משתנה ,אשר ערכו גדל במהל הביצוע חוזר של הלולאה ,לבי חס )אשר נשמר במשתנה או נקבע מפורשות( .הביצוע החוזר הסתיי כאשר ערכו של המשתנה גדל ועבר את החס )או השתווה לחס(. אבל ,תנאי כניסה כאלה ה רק סוג אחד של תנאי כניסה ללולאה .בפתרו הבעיה הבאה נראה דוגמה לתנאי כניסה מסוג אחר. בעיה 9 מטרת הבעיה ופתרונה :הצגת תבנית פירוק מספר של חיובי כלשהו לספרותיו. פתחו ויישמו אלגורית אשר הקלט שלו הוא מספר של חיובי והפלט שלו הוא מספר ספרות המספר. למשל :עבור הקלט 31הפלט הדרוש הוא 2ועבור הקלט 15568הפלט הדרוש הוא .5 בפרקי קודמי כבר עסקנו בפירוק של מספר של לספרותיו ,אבל כאשר מספר ספרות המספר היה קט וידוע .בבעיה הנתונה מספר הספרות איננו ידוע ויכול להיות גדול מאד. פירוק הבעיה לתתמשימות מה יהיו התתמשימות לביצוע חוזר עבור מניית ספרות המספר? ומה יהיה התנאי לחזרה על ביצוע תתמשימות אלה? נוכל "לקצ ",את ספרות המספר אחת אחת ולמנות את מספר הספרות הנקצצות .נעשה זאת באמצעות תתמשימות לביצוע חוזר הכוללות קיצו ,ספרה מ המספר והגדלת מונה ב .1קיצו ,ספרה יתבצע על ידי חלוקה בשלמי של המספר ב .10חלוקה זו תביא לקיצו ,הספרה הימנית ביותר. למשל ,במקו המספר 534יתקבל המספר .53 א כ ,ננסח את התתמשימות הבאות לביצוע חוזר: .1קיצוץ הספרה הימנית ביותר .2הגדלה ב 1-של מונה הספרות הוראת המדעים ,אוניברסיטת תל-אביב -288- מדעי המחשב כל עוד המספר הנותר במהל הביצוע, כלומר,",יש לבצע תתמשימות אלו כל עוד "יש מה לקצ .0-î ìåãâ (øúåðä) øôñîä : התנאי לביצוע חוזר יהיה, לכ.0החוזר גדול מ בחירת משתני :נבחר שני משתני מטיפוס של וספרותיו נקצצות, ישמור את המספר הנית כקלט− num מונה שישמור את מספר הספרות שנקצצו− digits האלגורית 0-ì digits úà ìçúà .1 num-á éáåéç íìù øôñî èåì÷ .2 :òöá 0-î ìåãâ num ìù åëøò ãåò ìë .3 10-á num ìù íéîìùá ä÷åìç éãé ìò num ìù úéðîéä äøôñä úà õö÷ .3.1 digits úà 1-á ìãâä .3.2 digits ìù åëøò úà èìôë âöä .4 יישו האלגורית /* מספר חיובי שלם:קלט מספר הספרות במספר הנתון:פלט */ public class digitCount { public static void main (String [] args) { int digits = 0; // מספר הספרות int num; // המספר המעובד 1. num = In.readInt("Insert a number"); 2. while (num > 0) { 2.1. num = num / 10; 2.2. digits++; } 3. System.out.println("The number of digits is " + digits); }// main }//digitCount מדעי המחשב -289- אביב- אוניברסיטת תל,הוראת המדעים מעקב נעקוב אחר מהל ביצוע התוכנית digitCountעבור הקלט :153 פלט Insert a number num>0 digits num המשפט הבא לביצוע ? ? 0 0 ? 153 ;)"num=In.readInt("Insert a number 1 true 0 153 )while(num > 0 2 0 15 ;num = num / 10 2.1 1 15 ;digits++ 2.2 1 15 )while (num > 0 2 1 1 ;num = num / 10 2.1 2 1 ;digits++ 2.2 2 1 )while (num > 0 2 2 0 ;num = num / 10 2.1 3 0 ;digits++ 2.2 3 0 )while (num > 0 2 3 0 System.out.println("The number of 3 true true false The number of digits is 3 ;)digits is " + digits סוף פתרון בעיה 9 להעמקה בתבניות פירוק מספר לספרותיו ובניית מספר פנו לעמוד 352ו ,354בהתאמה . שאלה 7.37 א .שנו את התוכנית digitCountלפתרו בעיה ,9כ שהפלט יכלול את סכו ספרות המספר ,למשל, עבור הקלט 153הפלט המתאי הוא .9 ב .שנו את התוכנית digitCountלפתרו בעיה ,9כ שהפלט יכלול רק את מספר הספרות האי זוגיות במספר הנתו .למשל ,עבור הקלט 150הפלט המתאי הוא .2 שאלה 7.38 נתו קטע התוכנית החלקי הבא ,אשר הקלט שלו הוא שני מספרי שלמי חיוביי xו y -ומטרתו היא הצגה כפלט של שארית החלוקה בשלמי של xב) yכלומר ,תוצאת החישוב .(x % yבקטע התוכנית מתבצע החישוב הדרוש באמצעות פעולת חיסור. השלימו את קטע התוכנית. הוראת המדעים ,אוניברסיטת תל-אביב -290- מדעי המחשב ;)"x = In.readInt("Insert a number ;)"y = In.readInt("Insert a number )_____________( while { ;x = x – y } ;)____________(System.out.println שאלה 7.39 שנו את הקטע הנתו בשאלה 7.38כ שיציג ג את מנת החלוקה של xב) ,yכלומר ,את תוצאת החישוב .(x / yיש לבצע את החישובי הדרושי באמצעות פעולות חיבור וחיסור בלבד! שאלה 7.40 שני תלמידי המשחקי אחד נגד השני מותחי בתחילת המשחק קו באור Nסנטימטרי ).(N > 1 השחקני מחליפי תורי לסירוגי .כל שחק בתורו מקצר את הקו לחצי מאורכו .השחק אשר מקצר בתורו את הקו לאור של פחות מסנטימטר אחד מנצח במשחק. למשל ,א אורכו של הקו הוא 8ס"מ ,השחק הראשו יקצר את הקו ל 4ס"מ ,השחק השני יקצר את הקו ל 2ס"מ ,השחק הראשו יקצר את הקו ל 1ס"מ והשחק השני יקצר את הקו ל 0.5ס"מ וינצח במשחק. פתחו ויישמו אלגורית אשר הקלט שלו הוא אורכו התחילי של הקו ,והפלט שלו הוא הודעה מיהו השחק המנצח )הראשו או השני(. שאלה 7.41 במשחק אסימוני מניח שחק 2אסימוני בתור הראשו 4 ,אסימוני בתור השני 8 ,אסימוני בתור השלישי ,וכ הלאה – בכל תור מוכפל מספר האסימוני. נתו קטע התוכנית הבא אשר הקלט שלו הוא מספר האסימוני התחילי של השחק ,והפלט שלו צרי להיות המספר הסידורי של התור אשר בו לא נית להמשי לשחק לפי השיטה המתוארת .למשל ,עבור הקלט )מספר אסימוני תחילי( ,9הפלט הדרוש הוא ,3כיוו שאחרי הנחת 2אסימוני בתור הראשו ו 4אסימוני נוספי בתור השני יוותרו לשחק רק 3אסימוני )ולא 8אסימוני ,כפי שנדרש לתור השלישי( .קטע התוכנית שגוי. המספר הסידורי של התור הנוכחיint turn = 0; // מספר אסימונים למשחק בתור הנוכחי// ;int tokensInCurrentTurn = 0 סכום אסימונים כולל בתורות שהתבצעו עד כה int totalPlayedTokens = 0; // מספר אסימונים תחילי// ;int startTokens ;)"startTokens = In.readInt("insert number of tokens to start with )while (totalPlayedTokens <= startTokens { ;turn = turn + 1 הוראת המדעים ,אוניברסיטת תל-אביב -291- מדעי המחשב ;tokensInCurrentTurn = tokensInCurrentTurn * 2 ;totalPlayedTokens = totalPlayedTokens + tokensInCurrentTurn } ;)"System.out.println("The game cannot go on after " + turn + "turns ציינו מהי השגיאה ותקנו אותה. שאלה 7.42 בצלחת פטרי החיידקי מכפילי את עצמ פי 5בכל דקה ,עד אשר מספר עובר ס מסוי הנקרא "ס ההכפלה". פתחו אלגורית אשר הקלט שלו הוא שני נתוני :מספר חיידקי תחילי בצלחת ,וס ההכפלה. הפלט שלו הוא מספר החיידקי שיהיו בצלחת בדקה שבה יעבור מספר את ס ההכפלה .ישמו את האלגורית בשפת .Java ראינו עד כה את המבני ) íéîòô øôñî òöáאו ...(òöá ...ìë øåáòו...ãåò ìë ...òöáלביצוע חוזר של תתמשימה .לעיתי נוהגי לכנות את המבנה הראשו בש "לולאת "for ואת המבנה השני בש "לולאת ."whileמתי נבחר להשתמש במבנה הראשו ומתי נעדי את המבנה השני? ♦ כאשר אפשר לחשב לפני ביצוע לולאה את מספר הפעמי שהיא תתבצע ,נעדי לש הנוחות ולש הבהירות להשתמש בלולאת .for ♦ כאשר אי אפשר לחשב לפני ביצוע לולאה את מספר הפעמי שהיא תתבצע ,בי א הסיו נשלט על ידי זקי או על ידי תנאי אחר ,נשתמש בלולאת .whileהמבנה של לולאת whileמבהיר כי ביצועה תלוי בתנאי ,והתנאי עצמו קל לזיהוי. בחירה נכונה בהוראה לביצוע חוזר מבהירה לקורא התוכנית הא מספר הפעמי לביצוע ידוע מראש, וא לא ,על פי מה הוא נקבע .לכ ,בחירה נכונה של הוראה לביצוע חוזר מסייעת לקריאות ובהירות התוכנית. שאלה 7.43 כתבו לולאה להצגת פלט של 50כוכביות. א .כתבו לולאת forלהצגת הפלט הדרוש. ב .כתבו לולאת whileלהצגת הפלט הדרוש. ג .איזה מ הפתרונות פשוט יותר? שאלה 7.44 א .כתבו לולאת forהמציגה כפלט את 20הכפולות החיוביות הראשונות של ) 5כלומר ,הפלט הוא 15 … 100 10 .(5 הוראת המדעים ,אוניברסיטת תל-אביב -292- מדעי המחשב ב .כתבו לולאת forנוספת המבצעת אותו דבר אבל בעלת כותרת שונה וגו לולאה שונה. ג .כתבו לולאת whileהמבצעת אותו דבר. שאלה 7.45 ציינו עבור כל אחת מ הבעיות הבאות הא לפתרונה מתאי יותר להשתמש בלולאת forאו בלולאת .whileנמקו את תשובותיכ. א .הקלט :מספר של חיובי .numהפלט :רשימת המספרי השלמי החיוביי מ 1עד .num ב .הקלט :מספר של חיובי .numהפלט :רשימת המספרי השלמי השליליי מ -1עד .-num ג .הקלט :מספר של חיובי .numהפלט :רשימת המספרי השלמי החיוביי מ 1עד המספר הקט ביותר kאשר עבורו מתקיי .1+2+…+k > num שתי השאלות הבאות מתייחסות להשוואה בי אותיות ב .ABCהכוונה ב"אות מוקדמת" היא לאות הקרובה יותר לתחילת ה ,ABCוב"אות מאוחרת" הכוונה היא לאות הקרובה יותר לסו הABC )למשל B ,מוקדמת יותר מ Eו Fמאוחרת יותר מ.(C שאלה 7.46 עבור כל אחת מ הבעיות הבאות ציינו הא לפתרונה מתאי יותר להשתמש בלולאת forאו בלולאת .whileנמקו בקצרה את תשובותיכ. שימו ♥ :בעיות אלו מתאימות לתבניות מקסימו ,מינימו ,מקו המקסימו ומקו המינימו, א לא תמיד גודל התחו בו מופעלת התבנית ידוע מראש. א .הקלט הוא סדרת אותיות מה ABCשבסופה '*' ,והפלט הוא האות המאוחרת ביותר שמופיעה בקלט. ב .הקלט הוא מספר של חיובי המציי אור סדרה ואחריו סדרת אותיות מה ABCבאור המצוי , והפלט הוא האות המוקדמת ביותר שמופיעה בקלט. ג .הקלט הוא כמו הקלט לסעי ב ,והפלט הוא המקו הסידורי של ההופעה הראשונה )אולי יש יותר מאחת( של האות המאוחרת ביותר שמופיעה בקלט. ד .הקלט הוא כמו הקלט לסעי ב ,והפלט הוא המקו הסידורי של ההופעה האחרונה )אולי יש יותר מאחת( של האות המוקדמת ביותר שמופיעה בקלט. ה .מה ההבדלי ביישו האלגורית בי סעי ג לד? שאלה 7.47 פתחו אלגורית אשר הקלט שלו הוא סדרת אותיות מ ה ABCשמסתיימת ב ,'*'-והפלט שלו הוא האות המאוחרת ביותר מבי האותיות Bעד Iהמופיעות בקלט. הוראת המדעים ,אוניברסיטת תל-אביב -293- מדעי המחשב למשל ,עבור הקלט * SCHOOLהפלט המתאי הוא .Hאמנ ,ישנ בקלט אותיות מאוחרות יותר מ ,Hלמשל ,Sא אותיות אלו לא כלולות בסדרת האותיות Bעד .I הניחו שבקלט מופיעה לפחות אות אחת בתחו Bעד .Iישמו את האלגורית בשפת .Java ביצוע חוזר אינסופי כאמור ,ההוראות לביצוע חוזר שהוצגו בשלושת הסעיפי הראשוני ,היו תמיד באור ידוע מראש. כמוב ,עבור לולאות כאלו ,התשובה לשאלה "כמה פעמי יתבצע גו הלולאה" היא פשוטה מאוד. אבל ,כאשר מדובר בהוראה לביצוע חוזר בתנאי ,התשובה לשאלה זו אינה תמיד פשוטה ,כפי שמדגימה הבעיה הבאה. בעיה 10 מטרת הבעיה ופתרונה :דיו בחישוב מספר הפעמי שמתבצעת לולאה ,והצגת לולאה אינסופית. נתונה התוכנית הבאה )מטרתה מתוארת בהערה בתחילת התוכנית(: */ קלט :מספר חיובי שלם פלט :כל המספרים האי-זוגיים החיוביים הקטנים מן המספר הנתון */ public class OddNumbers { )public static void main (String [] args { המספר הנתון int limit; // המספר האי-זוגי החיובי הראשוןint oddN = 1; // ;)"1) limit = In.readInt("Insert a number 2) System.out.println("The odd numbers that are smaller ;)" than the given number are: )3) while (oddN != limit { ;)" " 3.1) System.out.print(oddN + ;3.2) oddN = oddN + 2 } } //main }// OddNumbers חשבו את מספר הפעמי שתתבצע הלולאה שבתוכנית עבור קלט נתו .L הוראת המדעים ,אוניברסיטת תל-אביב -294- מדעי המחשב ניתוח הבעיה בעזרת דוגמאות כדי לבטא בצורה כללית )עבור קלט (Lאת מספר הפעמי שתתבצע לולאת התוכנית נחשב את מספר הפעמי של ביצוע הלולאה עבור דוגמאות קלט שונות: עבור הקלט 1לא יתבצע גו הלולאה אפילו פע אחת ,כיוו שערכי limitו oddN-שווי כבר בפע הראשונה בה מחושב תנאי הכניסה ללולאה. עבור הקלט ,5נבח את מספר הפעמי של ביצוע הלולאה באמצעות טבלת מעקב: פלט oddN!=limit true 1 true 3 false limit oddN 5 1 המשפט הבא לביצוע 5 1 )while (oddN != limit 3 5 1 ;)" " System.out.print(oddN + 3.1 5 3 ;oddN = oddN + 2 3.2 5 3 )while (oddN != limit 3 5 3 ;)" " System.out.print(oddN + 3.1 5 5 ;oddN = oddN + 2 3.2 5 5 )while (oddN != limit 3 עבור הקלט 5יתבצע גו הלולאה פעמיי ויוצג הפלט.1 3 : באופ דומה נוכל לראות שעבור הקלט 15יתבצע גו הלולאה 7פעמי ,ויוצג הפלט: 1 3 5 7 9 11 13 ? ננסה להכליל ,על פי הדוגמאות שבחנו ,את מספר הפעמי שהלולאה תתבצע עבור קלט איזוגי שערכו .Lמהו הביטוי הכללי? עבור קלט איזוגי שערכו Lהלולאה תתבצע (L-1)/2פעמי. ? ניסחנו ביטוי כללי של מספר הפעמי לביצוע הלולאה עבור קלטי איזוגיי .הא קיי ביטוי כללי דומה עבור קלטי זוגיי? נבח את מספר הפעמי של ביצוע הלולאה עבור הקלט 2באמצעות טבלת מעקב: הוראת המדעים ,אוניברסיטת תל-אביב -295- מדעי המחשב פלט oddN!=limit true 1 true 3 true limit oddN 2 1 המשפט הבא לביצוע 2 1 )while (oddN != limit 3 2 1 ;)" " System.out.print(oddN + 3.1 2 3 ;oddN = oddN + 2 3.2 2 3 )while (oddN != limit 3 2 3 ;)" " System.out.print(oddN + 3.1 2 5 ;oddN = oddN + 2 3.2 2 5 )while (oddN != limit 3 קטענו את מילוי הטבלה לפני סיו ביצוע המעקב המלא .נית לראות שעבור הקלט 2מוצג הפלט 3 אשר אי להציגו ,כיוו שהוא מספר איזוגי שאיננו קט מ הקלט! כאשר מחושב הביטוי הבוליאני ) oddN != limitתנאי הכניסה ללולאה( בפע השנייה ,ערכו של oddNהוא ,3וערכו של limitהוא ,2ולכ ערכו של הביטוי הבוליאני הוא trueומוצג הער 3כפלט. ערכו של OddNגדל )ב (2בכל סיבוב בלולאה ,ולכ הלולאה תתבצע ג פע שלישית ויוצג הפלט .5 בעצ ,הלולאה תתבצע שוב ושוב ,וערכו של הביטוי הבוליאני יהיה תמיד ,trueכיוו שערכו של oddN רק יל ויגדל .מכא ,שהלולאה תתבצע אינסו' פעמי. הלולאה תתבצע אינסו פעמי ג עבור הקלט ,4ועבור הקלט ,6ובעצ ,עבור כל קלט זוגי .זאת משו שעבור קלט זוגי יתקיי תנאי הכניסה ללולאה שוב ושוב וא פע לא יהיה מצב של שוויו בי ערכו של ) limitשהוא מספר זוגי( וערכו של ) oddNשיהיה תמיד מספר איזוגי(. כיוו שעבור קלט זוגי הלולאה תתבצע אינסו פעמי ,הרי יוצגו כפלט מספרי איזוגיי שאי להציג ,ולכ לא רק שהתוכנית אינה מסתיימת ,היא ג מציגה פלט שגוי! ? כיצד נית לתק את התוכנית ולדאוג לכ שהלולאה תתבצע מספר מתאי של פעמי ג עבור קלט זוגי? נית לשנות את תנאי הכניסה ללולאה ל ,oddN < limitובכ לדאוג שביצוע הלולאה יסתיי לאחר הצגת המספר האיזוגי הגדול ביותר שעדיי קט מהקלט. הוראת המדעים ,אוניברסיטת תל-אביב -296- מדעי המחשב יישו האלגורית המתוק) */ קלט :התוכנית תקלוט מספר חיובי שלם פלט :כל המספרים האי-זוגיים החיוביים שקטנים מן המספר הנתון */ public class OddNumbers { )public static void main (String [] args { ;int limit ;int oddN = 1 ;)"1) limit = In.readInt("Insert a number 2) System.out.println("The odds numbers that are smaller ;)" than the given number are: )3) while (oddN < limit { ;)" " 3.1) System.out.print(oddN + ;3.2) oddN = oddN + 2 } } //main }// OddNumbers סוף פתרון בעיה 10 התוכנית שהוצגה בבעיה 10כללה לולאה אשר התבצעה כדרוש עבור כל קלט איזוגי ,א ביצועה נמש אינסו פעמי עבור כל קלט זוגי. לולאה אשר מתבצעת אינסו פעמי עבור קלט כלשהו נקראת לולאה אינסופית .בחומר הלימוד של "יסודות מדעי המחשב" תוכניות אשר כוללות לולאה אינסופית נחשבות כתוכניות שגויות. בפיתוח אלגורית קורה לעיתי שנכתבת לולאה אינסופית .לולאה כזו עלולה להתבצע אינסו פעמי רק עבור חלק מ הקלטי .לכ ,חשוב להקפיד לבדוק לולאת אלגורית עבור בחירה ממצה של דוגמאות קלט מייצגות ,כפי שעשינו בפתרו בעיה .10בפתרו זה בדקנו תחילה את הלולאה עבור דוגמה של קלט איזוגי ,וראינו שעבורה מושגת המטרה .אחר כ בדקנו עבור דוגמה של קלט זוגי ונוכחנו שהלולאה אינסופית. הוראת המדעים ,אוניברסיטת תל-אביב -297- מדעי המחשב שאלה 7.48 ציינו עבור כל אחת מ הלולאות הבאות א היא לולאה אינסופית. א הלולאה סופית )כלומר ,איננה אינסופית( ציינו את מספר הפעמי שהיא תתבצע .היעזרו בטבלת מעקב לביצוע החישובי הדרושי. ב. א. ;int i = 0 ;int j = 0 )while (i < 30 )while (j < 50 { { ;j = j - 10 ;i = i + 4 } ג. } ד. ;int j = 0 ;int k = 0 )while (Math.abs(j) < 30 )for (int j = 1; j < 10; j++ { { ;k = k + 11 ;j = j - 10 } ה. } ו. numהוא מספר של חיובי כלשהו numהוא מספר של חיובי כלשהו ;)"num = In.readInt("insert number ;)"num = In.readInt("insert number )while (num != 10 )while (num != 0 { { ;)System.out.println(num ;)System.out.println(num ;num = num + 1 ;num = num - 1 } } שאלה 7.49 נתו קטע התוכנית הבא אשר הקלט שלו הוא מספר של חיובי: ;)"num = In.readInt("insert a number )while (num != 0 { ;num = num % 3 ;)System.out.println(num } הלולאה בקטע התוכנית תתבצע מספר סופי של פעמי עבור חלק מ הקלטי ,ומספר אינסופי של פעמי עבור שאר הקלטי .לכ ,הלולאה שבקטע התוכנית היא לולאה אינסופית. א .תנו דוגמת קלט שעבורה תתבצע הלולאה מספר סופי של פעמי. מה מאפיי את הקלטי שעבור תתבצע הלולאה מספר סופי של פעמי? כמה פעמי תתבצע הלולאה עבור קלטי אלה? הוראת המדעים ,אוניברסיטת תל-אביב -298- מדעי המחשב ב .תנו דוגמת קלט שעבורה תתבצע הלולאה מספר אינסופי של פעמי. מה מאפיי את הקלטי שעבור תתבצע הלולאה מספר אינסופי של פעמי? שאלה 7.50 נתו קטע התוכנית הבא אשר הקלט שלו הוא שני מספרי שלמי: ;)"x = In.readInt("insert a number ;)"y = In.readInt("insert a number )while (x != y { ;y = y - 1 ;x = x + 1 } ;)System.out.println(x א .תנו שתי דוגמאות קלט שונות שעבור לא יתבצע גו הלולאה. ב .תנו שתי דוגמאות קלט שונות שעבור יתבצע גו הלולאה בדיוק פע אחת. ג .תנו שתי דוגמאות קלט שונות שעבור יתבצע גו הלולאה בדיוק חמש פעמי. ד .תנו שתי דוגמאות קלט שונות שעבור יתבצע גו הלולאה אינסו' פעמי. ה .נניח שערכו של xהוא .0עבור אילו ערכי של yיתבצע גו הלולאה אינסו' פעמי? 7.5משתנים מטיפוס בוליאני בסעי זה נכיר משתני מטיפוס בוליאני ,כלומר ,משתני היכולי לשמור בתוכ אחד משני הערכי trueאו .falseמשתני כאלה יכולי להשתלב בביטויי בוליאניי ולכ ה שימושיי מאוד בהוראות לביצוע בתנאי ובהוראות לביצוע חוזר בתנאי ,כפי שנדגי בהמש הסעי. בעיה 11 מטרת הבעיה הבאה :הצגת משתנה מטיפוס בוליאני. פתחו אלגורית שהקלט שלו הוא מספר של גדול מ 1ולאחריו רשימה ,המסתיימת בספרה ,0של מספרי שלמי נוספי הגדולי מ .1א המספר הראשו שנקרא הוא זוגי ,אז הפלט הוא כל מספר ומספר מרשימת המספרי כשהוא מוכפל ב .2א המספר הראשו שנקרא הוא איזוגי אז הפלט הוא כל מספר ומספר מרשימת המספרי כשהוא מוכפל ב.3 למשל עבור הקלט 9 2 4 6 0 :הפלט המתאי הוא .6 12 18 ועבור הקלט 8 2 4 6 0 :הפלט המתאי הוא .4 8 12 הוראת המדעים ,אוניברסיטת תל-אביב -299- מדעי המחשב פירוק הבעיה לתתמשימות ננסח רעיו לפירוק ראשוני לתתמשימות לפתרו הבעיה: .1קליטת מספר בnum- .2עבור כל מספר ברשימה בדיקה האם numזוגי .אם כן ,הצגה כפלט של המספר הנקלט כפול ,2אחרת ,הצגה כפלט של המספר הנקלט כפול 3 נסתכל על התתמשימה השנייה :כפי שהיא מנוסחת ,עבור כל מספר ברשימה אנו בודקי שוב הא numזוגי או לא ,למרות שבעצ התשובה לשאלה זו תהיה זהה בכל פע. לכ ,כדאי לבדוק רק פע אחת הא numזוגי או לא. הנה פירוק שני לתתמשימות לפתרו הבעיה: .1קליטת מספר בnum- .2אם numזוגי .2.1עבור כל מספר ברשימה הצגה כפלט של המספר הנקלט כפול 2 .3אחרת )אם numאי-זוגי( .3.1עבור כל מספר ברשימה הצגה כפלט של המספר הנקלט כפול 3 אמנ ,כעת אנו בודקי רק פע אחת הא numזוגי או לא ,אבל א נסתכל על התתמשימה השנייה והתתמשימה השלישית נראה ששתיה כוללות קליטה של רשימת המספרי .כלומר ,באלגורית המושרה על ידי הפירוק הזה ,ולאחר מכ ג בתוכנית ליישו האלגורית ,הוראות הקלט יופיעו פעמיי. פירוק בהיר יותר לתתמשימות הוא הפירוק הבא: .1קליטת מספר .2בדיקה האם המספר שנקלט זוגי ושמירת תוצאת הבדיקה .2.1ביצוע עבור כל מספר ברשימה .2.1.1אם תוצאת הבדיקה חיובית )כלומר ,המספר הראשון שנקלט זוגי( .2.1.1.1הצגה כפלט של המספר הנוכחי כפול 2 .2.1.2אחרת )כלומר ,המספר הראשון שנקלט אי-זוגי( .2.1.2.1הצגה כפלט של המספר הנוכחי כפול 3 בפירוק זה נבדקת הזוגיות של ער הקלט הראשו רק פע אחת .ג המעבר על רשימת הערכי מתואר רק פע אחת .עבור כל ער קלט ברשימה ,ההחלטה על הער המוצג כפלט תלויה בתוצאת הבדיקה שבוצעה קוד לכ . הוראת המדעים ,אוניברסיטת תל-אביב -300- מדעי המחשב בחירת משתני מהו טיפוס הער המתאי לשמירת תוצאת בדיקת הזוגיות של הער הראשו בקלט? הערכי האפשריי לתשובה לשאלה הא הער הוא זוגי ה כ) ולא .טיפוס המתאי לערכי מסוג זה הוא טיפוס בוליאני .כזכור מפרקי קודמי ,ער מטיפוס בוליאני יכול להיות אחד משני הערכיtrue : או .false עד כה ראינו ביטויי מטיפוס בוליאני ,ששימשו אותנו לתיאור תנאי .אבל ,נית ג להצהיר על משתני מטיפוס בוליאני ,ולשלב ג אות בביטויי בוליאניי .א נשמור את תוצאת בדיקת הזוגיות של ער הקלט הראשו במשתנה בוליאני ,נוכל להשתמש במשתנה זה כתנאי בהוראה לביצוע בתנאי שעוברת על רשימת איברי הקלט ומעבדת אות. א כ ,נשתמש במשתני הבאי: − numמטיפוס של ,ישמור את ער הקלט הראשו – numInListמטיפוס של ,ישמור את ער הקלט התור מהרשימה – isEvenמטיפוס בוליאני ,ישמור את תוצאת בדיקת הזוגיות של num האלגורית מאחר שהרשימה מסתיימת בזקי ,נשתמש בהוראה לביצוע חוזר בתנאי התלוי בזקי. num-á øôñî èåì÷ .1 isEven-á ä÷éãáä úàöåú úà øåîùå éâåæ num íàä ÷åãá .2 numInList-á äîéùøá ïåùàøä øôñîä úà èåì÷ .3 .4 :òöá numList ≠ 0 ãåò ìë .4.1 íà true àåä isEven ìù åëøò numInList*2 úà èìôë âöä .4.1.1 .4.2 úøçà numInList*3 úà èìôë âöä .4.2.1 numInList-á äîéùøá àáä øôñîä úà èåì÷ .4.3 יישו האלגורית הצהרה על משתנה מטיפוס בוליאני נעשית באמצעות ש הטיפוס .booleanלכ ,נית להצהיר על המשתנה isEvenבאופ הבא: ;boolean isEven הוראת המדעים ,אוניברסיטת תל-אביב -301- מדעי המחשב כמו כל משתנה בתוכנית ,ג למשתני מטיפוס בוליאני אפשר לבצע השמה .הביטוי שבצד ימי של משפט ההשמה צרי להיות ביטוי בוליאני .אנו מעונייני שהמשתנה isEvenישמור את תוצאת בדיקת הזוגיות של ער הקלט הראשו ,ולכ נוכל לכתוב את ההוראה הבאה לביצוע בתנאי: )if(num % 2 == 0 { ;isEven = true } else { ;isEven = false } במקרה האחד אנחנו משימי למשתנה isEvenאת הער הבוליאני trueובמקרה האחר את הער הבוליאני .false אבל ,מאחר שבצד ימי של משפט השמה למשתנה בוליאני אפשר לכתוב כל ביטוי בוליאני ,ולאו דווקא את הביטויי הפשוטי trueאו ,falseנוכל ג לכתוב את משפט ההשמה הבא: ;)isEven = (num % 2 == 0 בעקבות ביצוע ההשמה שלעיל ,יוש למשתנה isEvenהער trueא numזוגי ,ואחרת יוש בו הער .false אנו מעונייני לשלב את המשתנה isEvenבביטוי הבוליאני בהוראה לביצוע בתנאי .נוכל לכתוב כ: )if (isEven == true אבל ,מאחר שערכו של ביטוי בוליאני הוא trueאו ,falseוכ ג ערכו של משתנה בוליאני ,הרי שמשתנה בוליאני כבר מהווה בעצמו ביטוי בוליאני )בדיוק כמו שמשתנה של מהווה כבר בעצמו ביטוי חשבוני( .לכ ,נוכל ג לכתוב: )if (isEven הוראת המדעים ,אוניברסיטת תל-אביב -302- מדעי המחשב התוכנית המלאה /* 0- שמסתיימת ב1- מספר שלם ולאחריו רשימת מספרים שלמים גדולים מ:קלט ואחרת יוצגו,2- אם המספר הראשון זוגי יוצגו המספרים ברשימה מוכפלים ב:פלט 3-המספרים ברשימה מוכפלים ב */ public class IfEven { public static void main (String [] args) { int num; //המספר הראשון בקלט int numInList; //מספר תורן ברשימת הקלט boolean isEven // האם המספר הראשון זוגי // קליטת המספר הראשון ובדיקה האם הוא זוגי 1. num = In.readInt("Insert the first number "); 2. isEven = (num % 2 == 0); 3. numInList = In.readInt("Insert a number. Enter 0 to finish the list"); 4. while (numInList != 0) { 4.1. if (isEven) { 4.1.1. System.out.println(numInList * 2); } // if 4.2. else { 4.2.1. System.out.println(numInList * 3); } // else 4.3. numInList = In.readInt("Insert the next number. Enter 0 to finish the list"); } // while }// main }// IfEven מדעי המחשב -303- אביב- אוניברסיטת תל,הוראת המדעים מעקב .7 2 4 0 נעקוב אחר מהל ביצוע התכנית עבור הערכי המשפט הבא לביצוע 1 num=In.readInt("Insert the first numInList numInList!=0 ? ? num isEven ? 7 ? ? 7 false 7 false 7 false number"); 2 isEven =(num % 2 == 0) 3 numInList=In.readInt("Insert a 2 number. Enter 0 to finish the list"); פלט Insert the first number Insert a number. Enter 0 to finish the list 4 while (numInList != 0) 2 4.1 if (isEven) 2 7 false 4.2. System.out.println( 2 7 false 6 1 numInList * 3); 4.3 numInList=In.readInt("Insert the 4 7 false Insert the next number. Enter 0 to finish the list 7 false true next number. Enter 0 to finish the list"); 4 while (numInList != 0) 4 4.1 if (isEven) 4 7 false 4.2. System.out.println( 4 7 false 12 1 numInList * 3); 4.3 numInList=In.readInt("Insert the 0 7 false Insert the next number. Enter 0 to finish the list 7 false true next one. Enter 0 to finish the list"); 4 while (numInList != 0) 0 false 11 סוף פתרון בעיה מדעי המחשב -304- אביב- אוניברסיטת תל,הוראת המדעים בפתרו הבעיה השתמשנו במשתנה מטיפוס בוליאני: משתנה בוליאני שומר ערכי מטיפוס בוליאני ,כלומר אחד משני הערכי trueאו .false למשתנה בוליאני נית להשי ער של ביטוי בוליאני כלשהו. נית לשלב משתנה בוליאני בתו תנאי בוליאני. מתאי להשתמש במשתנה בוליאני כדי לזכור תוצאה של בדיקה. ב Javaמשמשת המילה השמורה booleanלהצהרה על משתנה בוליאני. בדומה למשתני מטיפוסי אחרי ,נית לבצע אתחול של משתנה בוליאני תו כדי הצהרה ,למשל: ;boolean boolVariable = true למשתנה בוליאני נוהגי לעיתי לקרוא דגל ) .(flagכאשר ערכו של המשתנה ,trueהוא משול לדגל מור ,המסמ מעבר אפשרי .כאשר ער המשתנה falseהוא משול לדגל מורד ,המסמ כי אי אפשרות מעבר. שאלה 7.51 בנו טבלת מעקב אחר מהל ביצוע התכנית IfEvenלפתרו בעיה 11עבור הקלט .4 5 7 0 שאלה 7.52 בקטע התוכנית הבא המשתנה lengthשומר מספר חיובי של המבטא אור רשימה .מתבצע קלט של רשימת תוצאות הטלה של קובייה )תוצאת הטלה של קובייה היא מספר של בי 1ל .(6רשימת התוצאות עלולה לכלול מספרי שגויי )כלומר ,שאינ בי 1ל .(6המשתנה validהוא מטיפוס בוליאני ושאר המשתני ה מטיפוס של. ;i = 1 ;s = 0 ;valid = true ))while(valid && (i <= length { ;)" dice = In.readInt("Insert the dice number ))if((dice >= 1) && (dice <= 6 { ;s = s + dice } // if else הוראת המדעים ,אוניברסיטת תל-אביב -305- מדעי המחשב { ;valid = false } // else ;i = i + 1 } // while )if (valid { ;)System.out.println(s } else { ;)System.out.println(dice } א .תארו את הפלט עבור הקלט.3 1 2 3 : ב .תארו את הפלט עבור הקלט.3 1 0 3 : ג .מהו תפקיד המשתנה הבוליאני ?valid ד .מהי מטרת קטע התוכנית? שאלה 7.53 פתחו אלגורית שהקלט שלו הוא רשימה של 20מספרי חיוביי .הקלט נחשב חוקי א כל המספרי בו ה זוגיי .האלגורית בודק הא הקלט חוקי .א הקלט חוקי האלגורית מציג כפלט את סכו המספרי שבקלט ,ואחרת תוצג הודעה כי הקלט איננו חוקי .ישמו את האלגורית בשפת .Java הדרכה :השתמשו במשתנה בוליאני שיאותחל ל .trueא יימצא בקלט מספר איזוגי יוש במשתנה זה הער .false הבעיה המוצגת בשאלה 7.53מתאימה לתבנית האם כל הערכים בסדרה מקיימים תנאי? להעמקה בתבנית פנו לעמוד .356 שאלה 7.54 פתחו אלגורית שהקלט שלו הוא סיסמה ,המורכבת מרשימת אותיות לועזיות המסתיימת ב'*'. הפלט הוא הודעה המציינת הא הסיסמה תקינה .סיסמה תקינה כוללת לפחות 6תווי ,כאשר לפחות אחד מה אמור להיות אות קטנה )מה (abcולפחות אחד מה צרי להיות אות גדולה )מה .(ABCישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -306- מדעי המחשב שאלה 7.55 בקטע התוכנית הבא lengthמכיל מספר של חיובי .הקלט לקטע התוכנית הוא סדרה באור lengthשל מילי בנות שלוש אותיות כל אחת. מטרת קטע התוכנית היא להציג כל מילה בסדרה בסדר אותיות הפו ,כל עוד אותיות המילה שונות זו מזו .ברגע שנקלטת מילה שבה לפחות שתי אותיות זהות יש לעצור את מהל הביצוע. המשתנה diffהוא מטיפוס בוליאני ,המשתני lengthו iמטיפוס של והמשתני ו let3ה מטיפוס תווי. let2 ,let1 __________ = diff ;i = 1 )________________(while { ;)"let1 = In.readChar("Insert the first letter of the word ;)"let2 = In.readChar ("Insert the second letter of the word ;)"let3 = In.readChar ("Insert the third letter of the word )_______________( if { ;)System.out.println(let3 + " " + let2 + " " + let1 } else { ________ = diff } } // while השלימו את קטע התוכנית. 7.6הקשר הלוגי (not) àì הביטויי הבוליאניי שהכרנו עד כה ה ביטויי פשוטי וביטויי מורכבי .הביטויי הבוליאניי הפשוטי שהכרנו כוללי קבועי ) trueאו ,(falseמשתני בוליאניי ,או ביטויי השוואה בי ערכי בעזרת פעולות השוואה .ביטויי בוליאניי מורכבי מתקבלי על ידי קישור של ביטויי פשוטי באמצעות קשרי לוגיי .עד כה הכרנו שני קשרי לוגיי (or) åà :ו.(and) íâå קשר לוגי נוס ,הוא הקשר àì נכיר כעת ָ ) .(notכשמו כ הוא – הוא מבטא שלילה ,היפו התנאי. בניגוד לקשרי שהכרנו עד כה ,הקשר àìמופעל על ביטוי בוליאני אחד ,ולא על שניי. הוראת המדעים ,אוניברסיטת תל-אביב -307- מדעי המחשב הנה טבלת האמת של הקשר àì ,כאשר bהוא ביטוי בוליאני: b àì b true false false true עדיפותו של הקשר àì גבוהה מעדיפות של הקשרי íâåו.åà בשפת Javaהקשר àì נכתב על ידי סימ קריאה. דוגמאות נניח ש aהוא משתנה מטיפוס של ו bהוא משתנה מטיפוס בוליאני ♦ ערכו של הביטוי הבוליאני !trueהוא .false ♦ ערכו של הביטוי הבוליאני ) !(a == 1הוא falseכאשר ערכו של aשווה ל ,1ו trueאחרת. ♦ ערכו של הביטוי הבוליאני !bהוא falseכאשר ערכו של bהוא .trueכאשר ערכו של bהוא ,false ערכו של הביטוי !bהוא .true שאלה 7.56 נניח שהמשתני aו bה מטיפוס של .עבור כל ביטוי מ הביטויי הבוליאניי הבאי ,תנו דוגמה של ערכי המשתני שעבור יהיה ערכו של הביטוי ,trueודוגמה של ערכי המשתני שעבור יהיה ערכו של הביטוי .false א. )!(a != b ב. )!(Math.abs(a) == a שאלה 7.57 נניח שהמשתני aו bה מטיפוס של והמשתנה cהוא מטיפוס בוליאני .עבור כל ביטוי מ הביטויי שבמשפטי ההשמה הבאי ,תנו דוגמה של ערכי המשתני שעבור יוש ב cהער ,true ודוגמה של ערכי המשתני שעבור יוש ב cהער .false א. ))c =(x == Math.sqrt(x ב. ))c =(c && (a == b ג. ))c =(!((a + b)>= 5 הוראת המדעים ,אוניברסיטת תל-אביב -308- מדעי המחשב שאלה 7.58 במשחק הניחושי מקיש אחד המשתתפי מספר בתחו ,1-100והמשתת השני צרי לנחש אותו, בתו המשחק יודיע המחשב למשתת השני בכמה ניסיונות הצליח לנחש. לפניכ קטע תוכנית ב .Javaהשלימו את הקטע כ שיבצע את הנדרש: ;)"num = In.readInt("First player, Insert your number, between 1 and 100 ;____________ = int numOfGuesses ;___________ = boolean found )while (!found { ;numOfGuesses++ ;)"guess = In.readInt("Insert your guess please )____________( if { ;)" !!System.out.println("Good ;found = true } )______________( else if { ;)"System.out.println("Your guess is too big } else { ;)"System.out.println("Your guess is too small } } // while ;)"System.out.println("It took you " + _______________ + " guesses שאלה 7.59 הבעיה עוסקת בהצפנת הודעות .הודעה היא סדרת מילי ,כ שכל מילה היא רצ אותיות מ הABC ובי כל שתי מילי מופיע סימ קריאה )!( .הצפנת הודעה מתבצעת באופ הבא :בכל מילה איזוגית )כלומר ,המילה הראשונה ,השלישית ,החמישית וכו'( מוחלפת כל אות באות העוקבת לה ב,ABC בכל מילה זוגית )כלומר ,המילה השנייה ,הרביעית ,השישית וכו'( מוחלפת כל אות באות הקודמת לה ב .ABCסימני הקריאה נותרי במקומ ללא שינוי. כלומר ,תחילה יש להצפי כל אות נתונה לאות העוקבת לה ב ABCולאחר כל קריאה של סימ קריאה יש להפו את "כיוו ההצפנה" )מעוקבת ב ABCלקודמת ,או מקודמת ב ABCלעוקבת(. הוראת המדעים ,אוניברסיטת תל-אביב -309- מדעי המחשב למשל ,הצפנת ההודעה ! DING!DING!DONGתהיה .EJOH!CHMF!EPOH לש הפשטות נניח שהאותיות Aו Zאינ נכללות בהודעה. פתחו ויישמו אלגורית אשר הקלט שלו הוא מספר המציי אור של הודעה )כלומר ,מספר התווי בהודעה( ואחריו ההודעה עצמה )הנקלטת תו אחר תו( .הפלט שלו הוא ההודעה כשהיא מוצפנת באופ שתואר לעיל. הדרכה :השתמשו באלגורית במשתנה מטיפוס בוליאני לשמירת "כיוו ההצפנה" .אתחלו את ערכו של משתנה זה ל ,trueולאחר כל סימ קריאה הפכו את ערכו באמצעות הקשר .àì הקשר הבוליאני àì משמש בתבנית האם קיים ערך בסדרה המקיים תנאי? להעמקה בתבנית זו פנו לעמוד .359 7.7קינון הוראות לביצוע חוזר בהוראה לביצוע חוזר ,גו הלולאה יכול להכיל הוראות שונות .ייתכ כי בי הוראות אלו יש ג הוראות לביצוע חוזר .בכ מתקבל מבנה מקונ ,הכולל הוראה לביצוע חוזר בתו הוראה לביצוע חוזר .הדבר דומה לקינו של הוראות לביצוע בתנאי ,שהכרנו בפרק .5בסעי זה נראה כי מבנה מקונ של הוראות לביצוע חוזר הוא שימושי מאוד בפתרו בעיות מסויימות. בעיה 12 מטרת הבעיה ופתרונה :הצגת הוראה מקוננת לביצוע חוזר. פתחו ויישמו אלגורית אשר הפלט שלו הוא לוח הכפל ,מוצג באופ הבא: 1 2 3 ….… 10 2 4 6 ….… 20 3 6 9 ….… 30 ………….. ………….. 10….….. 100 בבעיה הנתונה אי קלט .מוגדר פלט בלבד .הפלט הוא טבלת המספרי של לוח הכפל .טבלה זו מכילה 100מספרי ,המסודרי בעשר שורות ובעשרה טורי. הוראת המדעים ,אוניברסיטת תל-אביב -310- מדעי המחשב פירוק הבעיה לתתמשימות דר אחת להצגת לוח הכפל היא על ידי אלגורית שבו 10לולאות ,אשר כל אחת מה תציג כפלט שורה של 10מספרי. כלומר ,נקבל את הפירוק הבא לתתמשימות: .1הצגה כפלט בשורה אחת של המספרים 1עד 10 .2הצגה כפלט בשורה אחת של המספרים 1עד ,10מוכפלי ב2 .3הצגה כפלט בשורה אחת של המספרים 1עד ,10מוכפלי ב3 . . . .10הצגה כפלט בשורה אחת של המספרים 1עד ,10מוכפלי ב10 זהו ניסוח מסורבל וארו .בנוס ,ניסוח זה אינו כללי :כדי להציג טבלה בעריכה שונה או טבלה חלקית )למשל ,רק את חמש השורות הראשונות( ,יש לכתוב אלגורית שונה .בנוס ,קשה להכליל את האלגורית הזה לבעיה מעט שונה ,בה גודל הטבלה )מספר השורות ומספר העמודות( מתקבל כקלט ואינו ידוע בעת כתיבת האלגורית. הא נית לכתוב אלגורית פשוט ,קצר יותר ,ובצורת ניסוח כללית יותר? כ ! בכל אחת מהלולאות המפורטות מתואר ביצוע חוזר של תתמשימה .א בעצ נית להתייחס לכל לולאה כאל תתמשימה כוללת יותר ,אשר ג על ביצועה יש לחזור 10פעמי. כלומר ,נית לתאר זאת על ידי תתהמשימה הבאה ,שאותה יש לבצע 10פעמי: הצגה כפלט של השורה הבאה בתור בטבלה כאשר הצגה של שורה בטבלה א היא מבוטאת על ידי תתמשימה שיש לבצעה 10פעמי: הצגה כפלט של האיבר הבא בתור בשורה בחירת משתני מאחר שיש לנו צור בשתי הוראות לביצוע חוזר )האחת בתו השנייה( שאורכ ידוע מראש ,נזדקק לשני משתני הבקרה מטיפוס של i :ו.j האלגורית :òöá 10 ãò 1-î i øåáò .1 :òöá 10 ãò 1-î j øåáò .1.1 i*j éåèéáä êøò úà èìôë âöä .1.1.1 äøåù øåáò .1.1.2 הוראת המדעים ,אוניברסיטת תל-אביב -311- מדעי המחשב יישו האלגורית /* 10*10 התוכנית מציגה כפלט את לוח הכפל של */ public class MultTable { public static void main (String [] args) { final int TABLE_DIMENSION = 10; 1. System.out.println("Mult Table"); 2. for (int i = 1; i <= TABLE_DIMENSION; i++) { 2.1. for (int j = 1; j <= TABLE_DIMENSION; j++) { 2.1.1. System.out.print ((i * j) + " "); } // for j 2.2. System.out.println();// מעבר לשורת הפלט הבאה } // for i } // main } // MultTable מעקב המשפט הבא לביצוע i j ? ? 1 System.out.println("Mult Table"); 2 for (int i = 1; i <= 10; i++) 1 ? 2.1 for (int j = 1; j <= 10; j++) 1 1 2.1.1 System.out.print ((i * j) + " ") 1 1 2.1 for (int j = 1; j <= 10; j++) 1 2 2.1.1 System.out.print ((i * j) + " ") 1 2 2.1 for (int j = 1; j <= 10; j++) 1 3 2.1.1 System.out.print ((i * j) + " ") 1 3 פלט Mult Table 1 2 3 . . . מדעי המחשב -312- אביב- אוניברסיטת תל,הוראת המדעים 10 2 4 90 100 10 1 )for (int j = 1; j <= 10; j++ 2.1 10 1 )" " System.out.print ((i * j) + 2.1.1 ;)""(System.out.println 2.2 10 2 )for (int i = 1; i <= 10; i++ 2 1 2 )for (int j = 1; j <= 10; j++ 2.1 1 2 )" " System.out.print ((i * j) + 2.1.1 2 2 )for (int j = 1; j <= 10; j++ 2.1 2 2 )" " System.out.print ((i * j) + 2.1.1 10 10 )for (int i = 1; i <= 10; i++ . . . 2 9 10 )for (int j = 1; j <= 10; j++ . . . 2.1 9 10 )" " System.out.print ((i * j) + 2.1.1 10 10 )for (int j = 1; j <= 10; j++ 2.1 10 10 )" " System.out.print ((i * j) + 2.1.1 ;)""(System.out.println 2.2 סוף פתרון בעיה 12 בפתרו בעיה 12היה מתאי לנסח ביצוע חוזר של תתמשימה ,אשר כללה בתוכה ביצוע חוזר של תתמשימה מצומצמת יותר .כדי לנסח ביצוע חוזר של תת משימה שכוללת בתוכה ביצוע חוזר של תת משימה מצומצמת יותר ,מתאי להשתמש במבנה מקונ של לולאות. במבנה מקונ של לולאות נכללת לולאה פנימית בגו הלולאה של לולאה חיצונית. בביצוע המבנה המקונ ,מבוצעת הלולאה הפנימית כולה במהל ביצוע אחד של גו הלולאה החיצונית. בפתרו בעיה 12הביצוע חוזר של הלולאה החיצונית כלל 10ביצועי חוזרי של גו הלולאה הפנימית .כיוו שהלולאה החיצונית מתבצעת 10פעמי ,הרי מספר הפעמי הכולל שיתבצע גו הלולאה הפנימית הוא .(10*10=100) 100 הוראת המדעים ,אוניברסיטת תל-אביב -313- מדעי המחשב שימו ♥ :קינו אינו מוגבל רק להוראות לביצוע חוזר שאורכ ידוע מראש .ההוראה החיצונית יכולה להיות ג הוראה לביצוע חוזר שתלויה בתנאי ,וכ ג ההוראה הפנימית. בכתיבת מבנה מקונ של לולאות נקפיד על עימוד .כיוו שהלולאה הפנימית היא חלק מגו הלולאה החיצונית ,ניישר את הלולאה הפנימית ע ההוראות של גו הלולאה החיצונית .הדבר דומה לעימוד שבמבנה המקונ של ביצוע בתנאי. שאלה 7.60 נניח שבאלגורית דומה לאלגורית המתואר בבעיה ,12משתנה הבקרה של הלולאה החיצונית,i , יתחיל מהער ,2ויגדל בכל ביצוע של הלולאה ב ,1עד הגיעו לער .6מה יהיה הפלט של אלגורית זה? ומה יהיה מספר הפעמי הכולל שיתבצע גו הלולאה הפנימית שבו? שאלה 7.61 תארו עבור כל אחד מקטעי התוכניות הבאי את פלט קטע התוכנית ואת מספר הפעמי הכולל שמתבצע גו הלולאה הפנימית: א. ב. )for (int i = 1; i <= 5; i++ )for (int i = 1; i <= 5; i++ { { )for (int j = 1; j <= 5; j++ )for (int j = 1; j <= i; j++ { { ;)"*"(System.out.print ;)"*"(System.out.print } } ;)(System.out.println ;)(System.out.println } } ד. ג. )for (int i = 1; i <= 5; i++ )for (int i = 1; i <= 5; i++ { { )for (int j = 1; j <= 5; j++ )for (int j = 5; j >= i; j-- { { ;)"*"(System.out.print ;)System.out.print(j } } ;)(System.out.println ;)(System.out.println } } הוראת המדעים ,אוניברסיטת תל-אביב -314- מדעי המחשב שאלה 7.62 עבור כל אחד מהסעיפי הבאי פתחו ויישמו אלגורית אשר הפלט שלו הוא כפי שמופיע בתיאור הסעי .בכל אחד מהאלגורית מותר לכתוב רק הוראה אחת המדפיסה תו או ספרה ,והוראה אחת למעבר שורה בפלט )מכא נובע כי עליכ להשתמש בלולאות מקוננות(: ב. א. ד. ג. * ***** ***** 1 ** **** **** 12 *** *** *** 123 **** ** ** 1234 ***** * * 12345 ** *** **** ***** ז. ו. ה. ח. 1 12345 55555 11111 22 1234 4444 2222 333 123 333 333 4444 12 22 44 55555 1 1 5 שאלה 7.63 בכיתה 40תלמידי ,כל תלמיד לומד 20מקצועות .לפניכ תוכנית המחשבת עבור כל תלמיד את ממוצע ציוניו: */ קלט 20 :הציונים עבור כל אחד מ 40-תלמידי הכיתה פלט :הממוצע של כל תלמיד ותלמיד */ public class Grades { )public static void main (String [] args { ;final int STUDENT_NUM = 40 הוראת המדעים ,אוניברסיטת תל-אביב -315- מדעי המחשב ;final int GRADE_NUM = 20 ;double grade ;double sum ;double average )for(int i = 1; i <= STUDENT_NUM; i++ { )for(int j = 1; j <= GRADE_NUM; j++ { ;)(grade = In.readInt ;sum += grade } // for j } // for i } // main } // Grades המשפטי הבאי חסרי בתוכנית הנתונה ,היכ צרי לשלב את המשפטי האלה כדי שהתוכנית תבצע את הנדרש? א. ;sum = 0 ב. ;)System.out.println(sum / 20 שאלה 7.64 פתחו אלגורית שמקבל כקלט מספר חיובי של ,numולאחריו numסדרות באור לא ידוע של מספרי חיוביי שלמי ,כאשר כל סדרה מסתיימת ב .-1האלגורית יציג כפלט את אורכה של הסדרה הארוכה ביותר .ישמו את האלגורית בשפת .Java שאלה 7.65 במפעל לייצור נעליי עובדי רבי .פתחו אלגורית שיקבל כקלט את מספר העובדי במפעל ,ואחר כ רשימה של כל המשכורות של השנה האחרונה ) 12משכורות( לכל אחד מעובדי המפעל .האלגורית יחשב וידפיס את המשכורת האחרונה של העובד המסכ שסכו משכורותיו כל השנה היה הנמו ביותר .ישמו את האלגורית בשפת .Java בעזרת החומר הנלמד בפרק 7נית לפתור ג בעיות המשתמשות בתבניות מציאת כל הערכים בסדרה המקיימים תנאי ומעבר על זוגות סמוכים בסדרה .להעמקה בתבניות אלו פנו לעמוד 363ו ,366בהתאמה. הוראת המדעים ,אוניברסיטת תל-אביב -316- מדעי המחשב סיכום בפרק זה למדנו כיצד להורות על ביצוע חוזר של תתמשימה .הדבר נעשה באמצעות הוראה לביצוע חוזר שהיא הוראת בקרה הנקראת ג לולאה. הכרנו שני מבני של הוראה לביצוע חוזר :הוראה לביצוע חוזר באור ,ידוע מראש ,והוראה לביצוע חוזר בתנאי. הוראה לביצוע חוזר באור ,ידוע מראש נכתבת בצורה: òöá X :íéîòô òåöéáì úåàøåä או ìë øåáò ... íåçúá øáéà :òöá òåöéáì úåàøåä במבנה הראשו ,סדרת ההוראות לביצוע מתבצעת Xפעמי. במבנה השני ,נסרקי איבריו של התחו המוגדר ,ועבור כל אחד מה מבוצעת סדרת ההוראות לביצוע. הוראה לביצוע חוזר בתנאי נכתבת בצורה: ãåò ìë ><éàðú :òöá òåöéáì úåàøåä התנאי המתואר נקרא תנאי הכניסה ללולאה .כל עוד התנאי מתקיי ,סדרת ההוראות לביצוע מתבצעת שוב ושוב .כאשר התנאי לא מתקיי ,מסתיימת ההוראה לביצוע חוזר. בכתיבת הוראה לביצוע חוזר )באור ידוע מראש או בתנאי( אנו מקפידי על עימוד :קבוצת ההוראות אשר יש לחזור על ביצוע כתובות כשה "מוזזות פנימה" קבוצת ההוראות אשר יש לחזור על ביצוע נקראת גו' הלולאה. כאשר מספר הפעמי לביצוע חוזר אינו ידוע מראש )לפני תחילת ביצוע הלולאה( ,והוא תלוי בתנאי, נשתמש בהוראה לביצוע חוזר בתנאי .בכל מקרה אחר נשתמש בהוראה לביצוע חוזר באור ידוע מראש .בכ נסייע ביצירת תוכניות קריאות ובהירות. בי ההוראות לביצוע חוזר בתנאי הבחנו בסוג מסוי :הוראות לביצוע חוזר התלויות בזקי'. הוראת המדעים ,אוניברסיטת תל-אביב -317- מדעי המחשב זקי' הוא סימ מיוחד המציי את סו רשימת איברי הקלט .הזקי אינו נחשב כחלק מהקלט .לכ , בהוראה לביצוע חוזר שנועדה לעיבוד רשימת קלט שמסתיימת בזקי ,יש לוודא לפני עיבוד איבר הקלט התור כי הוא אינו הזקי .זיהוי הזקי צרי להביא לסיו הביצוע החוזר. הוראה לביצוע חוזר משמשת ,בי השאר לביצוע פעולות צבירה ומנייה .צבירה נעשית באמצעות צובר, ומנייה באמצעות מונה. צובר הינו משתנה שתפקידו לצבור ערכי )למשל ,נתוני או תוצאות חישוב( .צובר יכול לשמש לפעולות צבירה שונות )למשל ,סכו מצטבר או מכפלה מצטברת(. מונה הינו משתנה אשר תפקידו למנות אירועי )למשל ,מספר הופעות של נתוני או מספר חישובי מבוצעי( .מאחר שהשימוש במונה הוא לצור ספירה הרי הוא בדר כלל מטיפוס של. באלגוריתמי בה יש שימוש במונה או צובר יש להקפיד על אתחול עבור .באתחול יוש למונה או לצובר ער התחלתי המתאי להגדרת תפקיד. הוראות לביצוע חוזר משמשות ג לפתרו בעיות בה נדרש למצוא איבר מקסימלי או איבר מינימלי בתו קבוצת איברי ,או את מקומו של האיבר המקסימלי )או המינימלי( בקבוצת איברי סדורה. כאשר אלגורית כולל לולאה ,נית לחשב את מספר הפעמי שהלולאה תתבצע .מספר זה תלוי בדר כלל בקלט לאלגורית. יתכ שעבור קלטי מסוימי תתבצע הלולאה אינסו פעמי .לולאה כזאת נקראת לולאה אינסופית. אנו מחשיבי לולאה אינסופית כלולאה שגויה. בפרק הבא נדגיש את החשיבות של פתרו בעיות באמצעות אלגוריתמי שבה מספר הפעמי לביצוע חוזר הוא קט ככל האפשר. משתנה בוליאני הוא משתנה שיכול לקבל אחד משני הערכי trueו .falseנית להשתמש במשתני בוליאניי בתו ביטויי בוליאניי. הקשר הלוגי àì לקשרי íâå משמש ליצירת ביטויי בוליאניי מורכבי מביטויי פשוטי יותר )בדומה ו .(åàהוא מופעל על ביטוי בוליאני והוא הופ את ערכו הלוגי )מ trueל,false ולהיפ( .עדיפותו של הקשר הלוגי àìגבוהה מעדיפות של הקשרי íâåו.åà הוראה שנמצאת בתו הוראה לביצוע חוזר יכולה להיות בעצמה הוראה לביצוע חוזר .בכ מתקבל קינו) של הוראות לביצוע חוזר. הוראת המדעים ,אוניברסיטת תל-אביב -318- מדעי המחשב סיכום מרכיבי שפת Javaשנלמדו בפרק 7 הוראה לביצוע חוזר באור ,ידוע מראש מיושמת ב Javaעל ידי משפט .for המבנה הכללי של משפט forהוא: )שינוי משתנה הבקרה ; התנאי להמשך הביצוע ;אתחול משתנה הבקרה( for { הוראות לביצוע } כל עוד התנאי להמש הביצוע )שתלוי בדר כלל בערכו של משתנה הבקרה( מתקיי ,ביצוע הלולאה ממשי ,כלומר ,מתבצעת סדרת ההוראות לביצוע .סדרת הוראות זו נקראת גו' הלולאה. משתנה הבקרה הוא בדר כלל מטיפוס של .א אי בו שימוש מעבר לתחו הלולאה נית להצהיר עליו בתו הלולאה ,למשל כ: )for(int i = 1; i <= 10; i++ הוראה לביצוע חוזר בתנאי מיושמת ב Javaעל ידי משפט .while המבנה הכללי של משפט whileהוא: )ביטוי בוליאני( while { הוראות לביצוע } ביצוע משפט whileמתחיל בחישוב ערכו של הביטוי הבוליאני .א ערכו trueמתבצעות ההוראות לביצוע )גו הלולאה( .בתו ביצוע המשפט מחושב ערכו של הביטוי הבוליאני שוב .א ערכו true מתבצעות שוב ההוראות לביצוע ,וכ הלאה ,כל עוד ערכו של הביטוי הבוליאני הוא .trueכאשר ערכו falseמסתיי ביצוע משפט ה.while ההצהרה על משתנה בוליאני נעשית בשפת Javaבאמצעות המילה השמורה ,booleanלמשל כ: ;boolean flag הקשר àìנכתב ב Javaבאמצעות הסימ ! ,למשל כ: )!(x==5 הוראת המדעים ,אוניברסיטת תל-אביב -319- מדעי המחשב תבניות – פרק 7 מנייה וצבירה נתבונ בשתי הבעיות האלגוריתמיות הבאות: בעיה :1עליה על מתק "רכבת הרי" מותרת רק לילדי שגובה עולה על 1.40מטר וגיל עולה על .8כתבו אלגורית שהקלט שלו 40זוגות ערכי המייצגי את הגובה והגיל של 40 ילדי ,והפלט שלו הוא מספר הילדי הרשאי לעלות למתק. בעיה :2מנהל האתר הביתספרי "ישראלנד" מעוניי לדעת מהו מספר הכניסות לאתר ביממה. כתבו אלגורית שהקלט שלו הוא סדרה של קודי משתמשי ,המסתיימת בזקי ,0והפלט שלו הוא מספר הכניסות לאתר ביממה. בשתי הבעיות האלגוריתמיות עלינו למנות )לספור( ערכי .בבעיה 1יש למנות את מספר הילדי הרשאי לעלות למתק "רכבת הרי" ובבעיה 2יש למנות את מספר הכניסות לאתר ביממה. מנייה היא אחת התבניות השימושיות ביותר בפיתוח אלגוריתמי .השימוש בתבנית זו נעשה בכל פע שיש למנות כמות הופעות של ער.$ נתבונ בשני האלגוריתמי הבאי ,הפותרי את שתי הבעיות שלעיל: 0-ì count úà ìçúà .1 0-ì count úà ìçúà .1 :íéîòô 40 òöá .2 code-á ùîúùî ãå÷ èåì÷ .2 age-á ìéâå height-á äáåâ èåì÷ .2.1 .2.2 íâå height > 1.4 íà :òöá code <> 0 ãåò ìë .3 1-á count úà ìãâä .3.1 age > 8 1-á count úà ìãâä .2.2.1 count ìù åëøò úà èìôë âöä .3 code-á ùîúùî ãå÷ èåì÷ .3.2 count ìù åëøò úà èìôë âöä .4 בשני האלגוריתמי ערכו של המונה ) (countמאותחל לפני הלולאה ל 0ובגו הלולאה גדל ערכו של המונה ב .1שימו לב כי בפתרו לבעיה 1מספר הפעמי שמבוצע גו הלולאה ידוע מראש )(40 ואילו בפתרו לבעיה 2מספר הפעמי שמבוצע גו הלולאה אינו ידוע מראש )סדרת נתוני הקלט מסתיימת ע קליטת הזקי .(0 הוראת המדעים ,אוניברסיטת תל-אביב -321- מדעי המחשב עתה נתבונ בשתי הבעיות האלגוריתמיות הבאות: בעיה :3כתבו אלגורית שהקלט שלו הוא 15מספרי ממשיי והפלט שלו הוא סכו המספרי החיוביי. בעיה :4בתחרות הרמת משקולות משקלה של המשקולת ההתחלתית הוא 20ק"ג .כל המתחרי בתחרות מסוגלי להרי משקולת זו .ע התקדמות התחרות נוספות עוד ועוד משקולות למשקולת ההתחלתית .כתבו אלגורית שהקלט שלו הוא סדרה של זוגות נתוני :הנתו הראשו הוא משקל המשקולת אותה מוסיפי למשקל המצטבר שהרי מתחרה ,והנתו השני הוא התו ''y א המתחרה הצליח להרי את המשקל המצטבר כולל המשקולת החדשה ,והתו ' 'nא לא הצליח .התו ' 'nיופיע רק בזוג הנתוני האחרו .הפלט של האלגורית הוא המשקל המצטבר של המשקולות שהמתחרה הצליח להרי. בשתי הבעיות האלגוריתמיות עלינו לצבור )בדוגמה זו ,לחשב סכו( ערכי .בבעיה 3יש לצבור מספרי חיוביי ובבעיה השנייה יש לצבור את משקלי המשקולות .תבנית הצבירה ,בדומה לתבנית מנייה ,הינה תבנית שימושית ביותר בפיתוח אלגוריתמי .השימוש בתבנית זו נעשה בכל פע שיש לצבור סדרת ערכי בצורה כלשהי ,למשל על ידי סכו או על ידי מכפלה. נתבונ בשני האלגוריתמי ,הפותרי את שתי הבעיות שלעיל: 0-ì sum úà ìçúà .1 .2 20-ì sum úà ìçúà .1 :íéîòô 15 òöá -á êùîä åúå weight-á úìå÷ùî ì÷ùî èåì÷ .2 continuation num-á éùîî øôñî èåì÷ .2.1 íà .2.2 .3 :òöá continuation <> ‘n’ ãåò ìë weight úà sum -ì óñåä .3.1 num > 0 åúå weight-á úìå÷ùî ì÷ùî èåì÷ .3.2 num úà sum -ì óñåä .2.1.1 continuation-á êùîä sum ìù åëøò úà èìôë âöä .4 sum ìù åëøò úà èìôë âöä .3 בשני האלגוריתמי ערכו של הצובר ) (sumמאותחל לפני הלולאה לער $תחילי ,ולהבדיל ממונה, ער $זה אינו בהכרח .0בפתרו לבעיה 3ערכו מאותחל ל 0ובפתרו לבעיה 4ערכו מאותחל ל.20 בגו הלולאה משתנה ערכו של הצובר בער $כלשהו ,השונה מ) 1שימו לב כי ייתכ שערכו של הצובר עלול לקטו במהל $הצבירה ,למשל ,במקרה של צבירת ערכי שליליי(. נציג כעת את מאפייני שתי התבניות .ראשית ,נציג את מאפייני התבנית מנייה ואחר כ $נציג את מאפייני התבנית צבירה .עבור כל אחת מהתבניות נראה אלגורית עבור ביצוע חוזר באור $הידוע מראש וכ אלגורית לביצוע חוזר בתנאי. הוראת המדעים ,אוניברסיטת תל-אביב -322- מדעי המחשב מנייה:ש התבנית condition תנאי מנייה, סדרת ערכי הקלט,limit סדרת נתוני הקלט$ אור:נקודת מוצא limit סדרת קלט שאורכה$ מתו,condition מנייה של ערכי הקלט המקיימי את התנאי:מטרה :אלגורית 0-ì count úà ìçúà .1 :íéîòô limit òöá .2 element-á êøò èåì÷ .2.1 condition úà íéé÷î element íà .2.2 1-á count úà ìãâä .2.2.1 :Javaיישו ב count = 0; for (i = 1; i <= limit; i++) { element = In.readInt(); if (condition) { count++; } } מדעי המחשב -323- אביב- אוניברסיטת תל,הוראת המדעים מנייה:ש התבנית conditionToCount תנאי מנייה, ערכי הקלט,conditionToEnd תנאי סיו:נקודת מוצא של ערכי הקלט המקיימי את,conditionToEnd ביצועה תלוי בתנאי$ שמש, מנייה:מטרה conditiontoCount התנאי :אלגורית 0-ì count úà ìçúà .1 element-á êøò èåì÷ .2 :òöá conditionToEnd íéé÷úî àì ãåò ìë conditionToCount úà íéé÷î element .3 íà .3.1 1-á count úà ìãâä 3.1.1 element-á êøò èåì÷ .3.2 :Javaיישו ב count = 0; element = In.readInt(); while (!conditionToEnd) { if (conditionToCount) { count++; } element = In.readInt(); } מדעי המחשב -324- אביב- אוניברסיטת תל,הוראת המדעים ישנ שתי צורות בסיסיות של צבירה :צבירת סכו וצבירת מכפלה .אנו נראה תחילה את התבניות של צבירת סכו שמש $ביצועה ידוע מראש וצבירת סכו שמש $ביצועה תלוי בתנאי. ש התבנית :צבירת סכו נקודת מוצא :אור $סדרת נתוני הקלט ,limitער $תחילי של הצובר ,initialערכי הקלט ,תנאי צבירה condition מטרה :צבירה אל הער initial $של סכו ערכי הקלט המקיימי את התנאי ,conditionמתו$ סדרת קלט שאורכה limit אלגורית: initial-ì sum úà ìçúà .1 :íéîòô limit òöá .2 element-á êøò èåì÷ .2.1 íà .2.2 condition úà íéé÷î element element ìù åëøò úà sum-ì óñåä .2.2.1 יישו ב:Java ;sum = initial )for (i = 1; i <= limit; i++ { ;)(element = In.readInt )if (condition { ;sum += element } } הוראת המדעים ,אוניברסיטת תל-אביב -325- מדעי המחשב צבירת סכו:ש התבנית תנאי, ערכי הקלט,initial תחילי של הצובר$ ער,conditionToEnd תנאי סיו:נקודת מוצא conditionToSum צבירה של ערכי,initial $ אל הער,conditionToEnd ביצועה תלוי בתנאי$ שמש, צבירת סכו:מטרה conditionToSum הקלט המקיימי את התנאי :אלגורית initial-ì sum úà ìçúà .1 element-á êøò èåì÷ .2 :òöá conditionToEnd íéé÷úî àì ãåò ìë .3 conditionToSum úà íéé÷î element íà .3.1 element ìù åëøò úà sum-ì óñåä .3.1.1 element-á êøò èåì÷ .3.2 :Javaיישו ב sum = initial; element = In.readInt(); while (!conditionToEnd) { if (conditionToSum) { sum += element; } element = In.readInt(); } מדעי המחשב -326- אביב- אוניברסיטת תל,הוראת המדעים עתה נראה את התבנית של צבירת מכפלה שמש $ביצועה ידוע מראש ושל צבירת מכפלה שמש$ ביצועה תלוי בתנאי. ש התבנית :צבירת מכפלה נקודת מוצא :אור $סדרת נתוני הקלט ,limitער $תחילי של הצובר ,initialערכי הקלט ,תנאי צבירה condition מטרה :צבירת מכפלה אל הער initial $של ערכי הקלט המקיימי את התנאי ,conditionמתו$ סדרת קלט שאורכה limit אלגורית: initial-ì mult úà ìçúà .1 :íéîòô limit òöá .2 element-á êøò èåì÷ .2.1 íà .2.2 condition úà íéé÷î element mult-á äìôëîä úà íùäå element-á mult úà ìôëä .2.2.1 יישו ב:Java ;mult = initial )for (i = 1; i <= limit; i++ { ;)(element = In.readInt )if (condition { ;mult *= element } } הוראת המדעים ,אוניברסיטת תל-אביב -327- מדעי המחשב ש התבנית :צבירת מכפלה נקודת מוצא :תנאי סיו ,conditionToEndער $תחילי של הצובר ,initialערכי הקלט ,תנאי צבירה conditionToMult מטרה :צבירת מכפלה ,שמש $ביצועה תלוי בתנאי ,conditionToEndאל הער ,initial $של ערכי הקלט המקיימי את התנאי conditionToMult אלגורית: initial-ì mult úà ìçúà .1 element-á êøò èåì÷ .2 :òöá conditionToEnd íéé÷úî àì ãåò ìë .3 íà .3.1 úà íéé÷î element conditionToMult mult-á äìôëîä úà íùäå element-á mult úà ìôëä .3.1.1 element-á êøò èåì÷ .3.2 יישו ב:Java ;mult = initial ;)(element = In.readInt )while (!conditionToEnd { )if (conditionToMult { ;mult *= element } ;)(element = In.readInt } שימו ♥ :ערכו של initialחייב להיות שונה מ ,0שהרי מכפלת 0בכל מספר תשאיר את ערכו של הצובר .0ערכו של הצובר יכול להיות שלילי ,וערכו של הצובר עשוי לקטו א ערכו של element גדול מ 0וקט מ) 1כלומר ,הוא שבר( ,או א נצברי ג ערכי שליליי. ועוד שימו ♥ :הבעיה האלגוריתמית אינה חייבת לכלול תנאי למנייה ולצבירה ),condition conditionToSumו .(conditionToMultייתכנו מקרי ,כפי שאכ ראינו בבעיות האלגוריתמיות 2ו ,4שהמנייה והצבירה מתבצעות ללא תנאי. שאלה 1 א .ישמו את פתרונותיה של ארבע הבעיות האלגוריתמיות 14בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -328- מדעי המחשב ב .בהתייחס לבעיה :1שנו את התוכנית כ $שתציג כפלט את מספר הילדי שאינ רשאי לעלות למתק "רכבת הרי". ג .בהתייחס לבעיה :2שנו את התוכנית כ $שתציג כפלט את מספר הכניסות לאתר ביממה רק עבור המשתמשי שהקוד שלה בי 100ל.200 ד .בהתייחס לבעיה :3הרחיבו את התוכנית כ $שתציג כפלט ג את סכו המספרי השליליי. ה .בהתייחס לבעיה :4הרחיבו את התוכנית כ $שתציג כפלט ג את מספר המשקולות הכולל שהמתחרה הצליח להרי. שאלה 2 נתונה סדרת הקלט הבאה0 : 14 -6 15 2 -3 א .מה יוצג כפלט עבור כל אחד מהשימושי השוני בתבניות: .1מנה את האיברים האי-חיוביים בסדרת הקלט שאורכה êøòä úà èìôë âöäå 6 ìá÷úäù .2מנה את האיברים הזוגיים בסדרת הקלט המסתיימת בזקיף êøòä úà èìôë âöäå 0 ìá÷úäù .3חשב את הסכום המצטבר של האיברים המתחלקים ב 3-בסדרת הקלט שאורכה 6 ìá÷úäù êøòä úà èìôë âöäå .4חשב את הסכום המצטבר של 7עם כל האיברים בסדרת הקלט המסתיימת בזקיף 0 ìá÷úäù êøòä úà èìôë âöäå .5חשב את המכפלה המצטברת של האיברים האי-זוגיים בסדרת הקלט המסתיימת בזקיף ìá÷úäù êøòä úà èìôë âöäå 5 .6חשב את המכפלה המצטברת של 4בכל האיברים בסדרת הקלט המסתיימת בזקיף ìá÷úäù êøòä úà èìôë âöäå 15 ב .ישמו כל אחד מ השימושי בשפת .Java שאלה 3 א .בכיתה בת 41תלמידי קיימו בחירות לנציג מועצת תלמידי .שני תלמידי הציגו את מועמדות וכל תלמיד בכיתה הצביע עבור אחד המועמדי .נתו אלגורית שהקלט שלו הוא סדרה באור 41 $של המספרי 1ו 2המייצגי את מספרי המועמדי ,והפלט שלו הוא מספרו של המועמד שזכה ברוב קולות. 0-ì count1 úà ìçúà .1 0-ì count2 úà ìçúà .2 .3 :íéîòô 41 òöá candidate-á ãîòåî ìù øôñî èåì÷ .3.1 הוראת המדעים ,אוניברסיטת תל-אביב -329- מדעי המחשב 1-ì äååù candidate íà .3.2 1-á count1 úà ìãâä .3.2.1 .3.3 úøçà 1-á count2 úà ìãâä .3.3.1 count1 > count2 íà .4 "úåìå÷ áåøá äëæ 1 øôñî ãîòåî" èìôë âöä .4.1 .5 úøçà "úåìå÷ áåøá äëæ 2 øôñî ãîòåî" èìôë âöä .5.1 באלגורית הנתו ישנו שילוב בשימוש של שני מוני :ציינו מה ומהו תפקיד של אחד מה. ב .נתו אלגורית חלקי ,השקול לאלגורית הנתו ,א $משתמש במונה אחד .השלימו: .1מנה את האיברים ה________ בסדרת הקלט שאורכה úà count-á íùäå 41 ìá÷úîä êøòä .2 íà ________ "úåìå÷ áåøá äëæ 1øôñî ãîòåî" èìôë âöä .2.1 .3 úøçà "úåìå÷ áåøá äëæ 2 øôñî ãîòåî" èìôë âöä .3.1 שאלה 4 א .בסופרמרקט השכונתי בודקי מדי יו את הפדיו היומי ואת מספר הקוני .פתחו אלגורית שהקלט שלו הוא סדרת מספרי המייצגת את תשלומי הקוני ,שבסיומה הזקי ,-1והפלט שלו הוא מספר הקוני באותו יו והודעה המציינת א ביו זה ס $הפדיו מקניות בסכומי הגבוהי מ ) 500עלה על ס $הפדיו מקניות בסכומי שאינ גבוהי מ .) 500ישמו את האלגורית בשפת .Java ב .ציינו באילו תבניות השתמשת בסעי א וכיצד שילבת ביניה. שאלה 5 תתסדרה תחילית של המספרי הטבעיי היא סדרה מהצורה .1, 2, 3, … nבניסיו לבחו את "כוחה של המכפלה לעומת הסכו" הטילה המורה על תלמידיה לסכ את ערכיה של תתסדרות תחיליות של המספרי הטבעיי וכ להכפיל את ערכיה. א .פתחו אלגורית שאינו מקבל קלט ,והפלט שלו הוא האור $הקט ביותר של תתסדרה תחילית של המספרי הטבעיי ,שעבורה ערכה של המכפלה המצטברת יהיה לפחות פי 100 מערכו של הסכו המצטבר .ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -330- מדעי המחשב ב .בפתרו בעיה זו יש שימוש בצובר מכפלה .מהו ערכו התחילי של צובר זה? הסבירו. ג .ציינו באילו תבניות נוספות השתמשת וכיצד שילבת ביניה. שאלה 6 לקראת בחינות בגרות בית הספר מעוניי לתת שיעורי תגבור ל 75תלמידי משתי כיתות שונות. שיעורי התגבור יכולי להתקיי לאחר הלימודי ,בימי ראשו ושלישי .כדי להיער $הוחלט להעביר שאלו ,שבעזרתו נית יהיה לקבוע כמה תלמידי רוצי שיעורי תגבור ומהו היו המועד על רוב .כל תלמיד רש בשאלו את מספר כיתתו ) 1או (2ואת מספר היו שאותו הוא מעדי ) 1או .(3תלמיד שאינו מעוניי בתגבור רש את מספר כיתתו ואת המספר .0 כתבו אלגורית ,שהקלט שלו הוא הערכי שרשמו 75התלמידי ,והפלט שלו כולל את: .1מספר התלמידי המעונייני בשיעורי תגבור. .2היו בשבוע שמרבית התלמידי מעדיפי. .3מספר החדרי הדרושי לשיעורי התגבור )בכל חדר ילמדו 15תלמידי לכל היותר(. .4מספר הכיתה שבה נרשמו פחות תלמידי לשיעורי התגבור. א .ישמו את האלגורית בשפת .Java ב .ציינו באילו תבניות השתמשת וכיצד שילבת ביניה. שאלה 7 א .פתחו אלגורית אשר מקבל כקלט סדרת גילאי של זוגות נשואי )גיל הבעל וגיל האישה(. סו הקלט יצוי על ידי זוג הערכי .0 0הפלט יהיה אחוז הזוגות ,שבה גיל האישה גבוה מגילו של הבעל .ישמו את האלגורית בשפת .Java ב .ציינו באילו תבניות השתמשת וכיצד שילבת ביניה. שאלה 8 א .פתחו אלגורית אשר מקבל כקלט רשימת מספרי שלמי תלתספרתיי המסתיימת במספר שאינו תלתספרתי ,והפלט שלו הוא כמות המספרי שספרת העשרות שלה זוגית או שסכומ של ספרות המספר הוא איזוגי .ישמו את האלגורית בשפת .Java ב .ציינו באילו תבניות השתמשת וכיצד שילבת ביניה. הוראת המדעים ,אוניברסיטת תל-אביב -331- מדעי המחשב ממוצע של סדרת מספרים נתבונ בבעיה האלגוריתמית הבאה: כתבו אלגורית שהקלט שלו כולל 31מספרי המייצגי את הטמפרטורה בכל אחד מימי חודש יולי ,והפלט שלו הוא ממוצע הטמפרטורות בחודש זה. לפתרו הבעיה עלינו לחשב ממוצע של ערכי מספריי .בפרק 3היכרנו את התבנית ממוצע של סדרת מספרים ,עבור סדרה בת שני מספרי .עתה נרחיב את התבנית עבור סדרת מספרי באור $כלשהו .כדי לחשב ממוצע של סדרת מספרי יש לחשב תחילה את הסכו הכולל של איברי הסדרה ולאחר מכ לחלקו במספר הערכי בסדרה .התבנית של ממוצע ,כפי שמשמשת בפתרו בעיה זו ,דומה לחישוב הממוצע שהוצג בפתרו בעיה 3בפרק הלימוד. נתבונ בשני האלגוריתמי הבאי ,הראשו לפתרו הבעיה שלעיל ,והשני הוא האלגורית שנית בפרק 7כפתרו לבעיה :3 0-ì sum úà ìçúà .1 .2 :íéîòô 31 òöá temperature-á éìåé ùãåçá íåé ìù äøåèøôîè èåì÷ .2.1 temperature ìù åëøò úà sum ìù åëøòì óñåä .2.2 sum/31 éðåáùçä éåèéáä ìù åëøò úà average-á íùä .3 average ìù åëøò úà èìôë âöä .4 0-ì sum úà ìçúà .1 0-ì counterLarge úà ìçúà .2 length-á íìù éáåéç êøò èåì÷ .3 .4 :íéîòô length òöá num-á éùîî êøò èåì÷ .4.1 sum-á øåîùä øáèöîä íåëñì num ìù åëøò úà óñåä .4.2 .4.3 íà 50-î ìåãâ num ìù åëøò counterLarge ìù åëøò úà 1-á ìãâä .4.3.1 average-á íùäå sum/length éãé ìò íéëøòä òöåîî úà áùç .5 average ìù åëøò úà èìôë âöä .6 counterLarge ìù åëøò úà èìôë âöä .7 הוראת המדעים ,אוניברסיטת תל-אביב -332- מדעי המחשב בשני האלגוריתמי אותחל ערכו של sumל 0ואז חושב הסכו המצטבר בתו .sum $בתו הביצוע החוזר מתבצעת חלוקה של sumבמספר הערכי שסוכמו .עבור הבעיה הנתונה מספר הערכי שסוכמו הוא ,31כמספר הימי בחודש יולי .בפתרו בעיה 3שהוצגה בפרק הלימוד מספר הערכי המסוכמי הוא .Length נציג את מאפייני התבנית לחישוב ממוצע עבור ביצוע חוזר התלוי בתנאי .שימו לב כי האלגורית של התבנית משלב במקביל תבנית צבירה )כדי לסכו את הערכי( ותבנית מנייה )כדי לדעת כמה ערכי נצברו(. ש התבנית :ממוצע של סדרת מספרי נקודת מוצא :תנאי סיו ,conditionToEndערכי הקלט ,תנאי conditionToInclude מטרה :חישוב ממוצע ,שביצועו תלוי בתנאי ,conditionToEndשל ערכי הקלט המקיימי את התנאי conditionToInclude אלגורית: 0-ì count úà ìçúà .1 0-ì sum úà ìçúà .2 element-á êøò èåì÷ .3 :òöá conditionToEnd íéé÷úî àì ãåò ìë .4 conditionToInclude úà íéé÷î element íà .4.1 1-á count úà ìãâä .4.1.1 element úà sum ìù åëøòì óñåä .4.1.2 element-á êøò èåì÷ .4.2 sum / count éðåáùçä éåèéáä ìù åëøò úà average-á íùä .5 יישו ב:Java ;count = 0 ;sum = 0 ;)(element = In.readInt )while (!onditionToEnd { )if (conditionToInclude { ;count++ ;sum += element } ;)(element = In.readInt } ;average = (double) sum / count הוראת המדעים ,אוניברסיטת תל-אביב -333- מדעי המחשב בדומה לדר $בה נהגנו עבור תבניות מנייה וצבירה נית ג כא להציג תתתבנית המתאימה לביצוע חוזר שאורכו ידוע מראש .במקרה של ביצוע חוזר שאורכו ידוע מראש )והוא שווה ל(limit אי צור $במניית הערכי .ולכ האלגורית הוא פשוט יותר: .1חשב את הסכום המצטבר של איברי סדרת הקלט שאורכה limit limit-á áùåçù øáèöîä íåëñä úà ÷ìç .2 שימו ♥ :עבור התבנית של ממוצע של סדרת מספרי יש להניח שבקלט יש לפחות ער $אחד המקיי את התנאי ,וזאת כדי להימנע מחלוקה ב.0 ועוד שימו ♥ :בדומה לתבניות מנייה וצבירה ,ג בתבנית ממוצע נית להשתמש ללא תנאי ) ,(conditionToIncludeכלומר לחשב את ממוצע כל האיברי בסדרה. שאלה 9 א .ישמו את האלגורית לפתרו הבעיה של הטמפרטורה הממוצעת בחודש יולי בשפת .Java ב .שנו את התוכנית שכתבת בסעי א כ $שתחשב את הטמפרטורה הממוצעת רק עבור הימי שבה הטמפרטורה הייתה מעל 30מעלות צלסיוס. ג .מעונייני להשוות בי הטמפרטורה הממוצעת בחודש יולי בשנה זו לבי הטמפרטורה הממוצעת בחודש יולי בשנה הקודמת ,ולהציג כפלט הודעה המציינת באיזו שנה מבי השתיי הטמפרטורה הממוצעת הייתה גבוהה יותר .הקלט כולל קוד כל את הערכי הנתוני עבור חודש יולי בשנה זו ,ואחר כ $את הנתוני עבור חודש יולי בשנה הקודמת .השלימו את האלגורית החלקי: úà áùç .1הממוצע של סדרת ערכי הקלט שאורכה ______ -á åúåà íùäå averageCurrentYear úà áùç .2הממוצע של סדרת ערכי הקלט שאורכה ______ -á åúåà íùäå averageLastYear .3 íà ________ ________ èìôë âöä .3.1 .4 íà úøçà ________ ________ èìôë âöä .4.1 .5 úøçà ________ èìôë âöä .5.1 הוראת המדעים ,אוניברסיטת תל-אביב -334- מדעי המחשב שאלה 10 באוניברסיטת "בית הסטודנט" הוחלט כי בקורס אשר בו ממוצע ציוני הבחינה של הסטודנטי הוא מתחת ל 55ייער $מבח חוזר .נתו אלגורית חלקי שהקלט שלו הוא סדרת ציוני הסטודנטי בקורס מסוי ,רשימה המסתיימת בזקי ,-1והפלט שלו הוא הודעה הא יש לקיי מבח חוזר. ________ .1 ________ .2 mark-á êøò èåì÷ .3 .4 :òöá -1-î äðåù mark ãåò ìë ________ .4.1 mark-á êøò èåì÷ .4.2 ________ éðåáùçä éåèéáä ìù åëøò úà average-á íùä .5 ________ íà .6 ________ .6.1 א .השלימו את האלגורית. ב .נית לכתוב את האלגורית בעזרת תבנית .השלימו: ______________ úà áùç .1סדרת ערכי הקלט המסתיימת על ידי הזקיף .-1 .2 íà ________ ________ .2.1 ג .ישמו את האלגורית בשפת .Java שאלה 11 בשירות המטאורולוגי מחשבי בכל שנה את ממוצע המשקעי החודשי. א .כתבו אלגורית שהקלט שלו הוא 12מספרי המייצגי את כמות המשקעי בכל אחד מחודשי השנה ,והפלט שלו הוא ממוצע המשקעי לחודש. ב .הרחיבו את האלגורית כ $שיציג כפלט ג את ממוצע ששת החודשי הראשוני בשנה ואת ממוצע ששת החודשי האחרוני בשנה. ג .ישמו את האלגורית בשפת .Java שאלה 12 במפעל מסוי התבקש מנהל מחלקת משאבי אנוש לבדוק הא גיל הממוצע של הנשי במפעל נמו $מגיל הממוצע של הגברי במפעל. הוראת המדעים ,אוניברסיטת תל-אביב -335- מדעי המחשב א .כתבו אלגורית שהקלט שלו הוא 100זוגות נתוני המייצגי את מי העובד )' – 'mגבר'f' , אישה( ושנת הלידה של העובד ,והפלט שלו הוא הודעה מתאימה של מנהל מחלקת משאבי האנוש לאחר הבדיקה. ב .הרחיבו את האלגורית שכתבת בסעי א כ $שיציג כפלט את מספר העובדי הכולל שאמור לצאת לגמלאות ב 5השני הקרובות )הניחו כי גברי יוצאי לפנסיה בגיל 67ונשי בגיל .(62 ג .ישמו את האלגורית בשפת .Java ד .ציינו באילו תבניות השתמשת וכיצד שילבת ביניה. הוראת המדעים ,אוניברסיטת תל-אביב -336- מדעי המחשב מציאת מקסימום או מינימום בסדרה נתבונ בבעיה האלגוריתמית הבאה: למכרז זורמות הצעות כספיות שונות .ההצעה הכספית הגבוהה ביותר היא זו הזוכה במכרז .כתבו אלגורית שהקלט שלו הוא סדרה המסתיימת בזקי ,0של מספרי המייצגי את ההצעות הכספיות ,והפלט שלו הוא סכומה של ההצעה הזוכה .הניחו שבקלט יש לפחות הצעה אחת וכ הניחו שקיימת הצעה יחידה שזוכה. לפתרו הבעיה עלינו לחשב את הער $המקסימלי מבי סדרת הערכי המספריי הנקלטי .בפרק 5הראינו את התבנית של מציאת מקסימום ומינימום בסדרה בת שניי או שלושה ערכי .עתה נרחיב את התבנית עבור סדרה באור $כלשהו .התבנית של מציאת מקסימום ומינימום בסדרה, כפי שמשמשת בפתרו בעיה זו ,דומה לתבנית מציאת מקסימום ומינימום בסדרה שהוצגה בבעיה 5בפרק הלימוד. נתבונ בשני האלגוריתמי הבאי ,הראשו לפתרו הבעיה שלעיל ,והשני הוא האלגורית שנית בפרק 7לפתרו בעיה :5 max-á øéçî úòöä èåì÷ .1 price-á øéçî úòöä èåì÷ .2 .3 :òöá price ≠ 0 ãåò ìë .3.1 íà price > max price ìù åëøò úà max-á íùä .3.1.1 price-á øéçî úòöä èåì÷ .3.2 max ìù åëøò úà èìôë âöä .4 howMany-á úåðåáùçä øôñî úà èåì÷ .1 balance-á ïåùàøä íåëñä úà èåì÷ .2 max-á balance ìù åëøò úà íùä .3 .4 :íéîòô howMany-1 òöá balance-á àáä íåëñä úà èåì÷ .4.1 .4.2 íà max < balance max-á balance ìù åëøò úà íùä .4.2.1 max ìù åëøò úà èìôë âöä .5 הוראת המדעים ,אוניברסיטת תל-אביב -337- מדעי המחשב בשתי הבעיות נדרשנו למצוא את הער $הגדול ביותר בסדרת ערכי .בשלב ראשו ,קבענו באופ שרירותי כי הער $של המשתנה הראשו הוא המקסימלי ולכ נשמר ערכו במשתנה .maxלאחר מכ ,נבדקו על פי סדר קליטת ערכיה של שאר נתוני הקלט .עבור כל נתו קלט שערכו גדול יותר מהמקסימו הנוכחי ,הוחל ערכו של maxבערכו של נתו הקלט .באופ דומה ,ע שינויי קלי ,עובד האלגורית עבור מציאת הער $הקט ביותר בסדרה. נפריד את מאפייני התבנית מציאת מקסימום ומינימום בסדרה לשתי תתתבניות :ראשית ,נציג את מאפייני התבנית מציאת מקסימום בסדרה ואחר כ $נציג את מאפייני התבנית מציאת מינימום בסדרה .עבור התבנית מציאת מקסימום נתייחס לביצוע חוזר באור $הידוע מראש ואילו עבור התבנית מציאת מינימום נתייחס לביצוע חוזר התלוי בתנאי .באופ דומה נית ,עבור כל אחת מהתבניות ,לטפל במקרה שאליו לא התייחסנו. ש התבנית :מציאת מקסימו בסדרה נקודת מוצא :אור $סדרת נתוני הקלט ,limitערכי הקלט מטרה :מציאת הער $הגדול ביותר בסדרת ערכי הקלט שאורכה הוא limit אלגורית: max-á êøò èåì÷ .1 òöá .2 limit - 1 :íéîòô element-á êøò èåì÷ .2.1 íà 2.2 element > max element ìù êøòä úà max-á íùä 2.2.1 יישו ב:Java ;)(max = In.readInt )for (i = 2; i <= limit; i++ { ;)(element = In.readInt )if (element > max { ;max = element } } הוראת המדעים ,אוניברסיטת תל-אביב -338- מדעי המחשב ש התבנית :מציאת מינימו בסדרה נקודת מוצא :תנאי סיו ,conditionToEndMinSearchערכי הקלט מטרה :מציאת הער $הקט ביותר מבי ערכי הקלט ,עד אשר מתקיי התנאי conditionTtoEndMinSearch אלגורית: min-á êøò èåì÷ .1 element-á êøò èåì÷ .2 :òöá conditionToEndMinSearch íéé÷úî àì ãåò ìë .3 íà .3.1 element < min íùä .3.1.1 êøò èåì÷ .3.2 min-á ìù êøòä úà element element-á יישו ב:Java ;)(min = In.readInt ;)(element = In.readInt )while (!conditionToEndMinSearch { )if (element < min { ;min = element } ;)(element = In.readInt } שימו ♥ :לפני ההוראה לביצוע חוזר כבר נקראי שני ערכי מהקלט .אנו נניח שהתנאי לסיו ) (conditionToEndMinSearchיכול להתקיי עבור האיבר השני ואיל .$לכ ,למשל ,א תנאי הסיו מבטא קריאת זקי ,הרי שסדרת הקלט מכילה לפחות איבר אחד. ועוד שימו ♥ :א בקלט יש שני ערכי או יותר השווי למקסימו )או למינימו( אז האלגוריתמי עבור התבניות מציאת מקסימום ומציאת מינימום מוצאי את המופע הראשו" של המקסימו )או המינימו( בנתוני הקלט. הוראת המדעים ,אוניברסיטת תל-אביב -339- מדעי המחשב שאלה 13 א .השלימו את השימוש בתבנית עבור בעיית המכרז: מצא מקסימום בסדרת ערכי הקלט ______________ èìôë åëøò úà âöäå ב .ישמו את האלגורית של המכרז בשפת .Java ג .הרחיבו את האלגורית כ $שיוצג כפלט ג סכו ההצעה השנייה בגודלה .ישמו את האלגורית המתקבל בשפת .Java שאלה 14 מדעני העוסקי בתחו המטאורולוגיה החליטו לגלות מהי הטמפרטורה הנמוכה ביותר ומהי הטמפרטורה הגבוהה ביותר בצהרי היו בחודש נובמבר באזור הקוטב הצפוני ,בו הטמפרטורה תמיד מתחת ל 0מעלות צלסיוס .לצור $כ ,$המדעני מדדו את הטמפרטורה במש 30 $יו במהל $חודש נובמבר ,מדי יו ביומו ,בשעה 12:00בצהריי. נתו אלגורית שגוי ,שהקלט שלו הוא 30ערכי הטמפרטורות והפלט שלו הוא הער $הנמו$ ביותר והער $הגדול ביותר: 0-ì maxTemperature úà ìçúà .1 0-ì minTemperature úà ìçúà .2 .3 :íéîòô 30 òöá temperature-á úéîåé äøåèøôîè êøò èåì÷ .3.1 temperature > maxTemperature íà .3.2 temperature úà maxTemperature-á íùä .3.2.1 .3.3 úøçà temperature < minTemperature íà temperature úà minTemperature -á íùä .3.3.1 âöä .4 èìôë "äøåèøôîèä äëåîðä øúåéá ùãåçá øáîáåð "àéä minTemperature âöä .5 èìôë "äøåèøôîèä ääåáâä øúåéá ùãåçá øáîáåð "àéä maxTemperature א .הסבירו במלי מדוע האלגורית שגוי. ב .תקנו את האלגורית. שאלה 15 קבוצת אנשי מוגדרת כ"הומוגנית" א טווח הגילאי של חבריה אינו עולה על 5שני ,אחרת הקבוצה מוגדרת כ"הטרוגנית". הוראת המדעים ,אוניברסיטת תל-אביב -340- מדעי המחשב א .כתבו אלגורית שהקלט שלו הוא מספר האנשי בקבוצה ,n ,ולאחר מכ סדרה של nמספרי המייצגי את גילאי החברי בקבוצה .הפלט שלו הוא הודעה הא הקבוצה "הומוגנית" או "הטרוגנית". ב .ציינו באילו תבניות השתמשת בכתיבת האלגורית וכיצד שילבת ביניה. ג .ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -341- מדעי המחשב מציאת ערך נלווה למקסימום או למינימום בסדרה היכרנו את התבנית של מציאת מקסימו או מינימו בסדרה אול לעיתי אנו מעונייני לאו דווקא בערכי של המקסימו והמינימו אלא ,למשל ,במיקומ היחסי בקלט .דוגמה למקרה כזה הוא מציאת היו בחודש ינואר בו ירדה כמות משקעי מקסימלית. נתבונ בבעיה האלגוריתמית הבאה: נרחיב את בעיית המכרז שהוצגה בסעי הד בתבנית מציאת מקסימום ומינימום בסדרה כ$ שהקלט הוא סדרה של זוגות נתוני ,כאשר כל זוג מכיל את הקוד של מגיש ההצעה )מספר של( ואת סכו ההצעה הכספית .הסדרה מסתיימת ע קליטת הזקי 0כאיבר שני בזוג .הפלט של האלגורית הוא הקוד של מגיש ההצעה הזוכה . לפתרו הבעיה עלינו לחשב את ההצעה המקסימלית מבי סדרת ההצעות הכספיות הנתונות בקלט ,אבל אנו נדרשי בנוס $לשמור ג את קוד מגיש ההצעה .התבנית של מציאת ערך נלווה למקסימום ולמינימום בסדרה ,כפי שמשמשת בפתרו בעיה זו ,דומה לתבנית מציאת ערך נלווה למקסימום ולמינימום בסדרה שהוצגה בבעיה 6בפרק הלימוד. נתבונ בשני האלגוריתמי הבאי ,האחד לפתרו הבעיה שלעיל ,והשני הוא האלגורית שנית בפרק 7לפתרו בעיה :6 äòöä ùéâî ãå÷ èåì÷ .1 øéçî úòöä èåì÷ .2 winCode-á max-á äòöä ùéâî ìù óñåð ãå÷ èåì÷ .3 úôñåð øéçî úòöä èåì÷ .4 .5 code-á price-á :òöá price ≠ 0 ãåò ìë .5.1 íà price > max ìù åëøò úà íùä .5.1.1 max-á íùä .5.1.2 winCode-á äòöä ùéâî ãå÷ èåì÷ .5.2 øéçî úòöä èåì÷ .5.3 ìù åëøò úà code code-á price-á ìù åëøò úà èìôë âöä .6 הוראת המדעים ,אוניברסיטת תל-אביב price winCode -342- מדעי המחשב currentSongLength-á ïåùàøä øéùä êøåà úà èåì÷ .1 longest-á currentSongLength ìù åëøò úà íùä .2 shortest-á currentSongLength ìù åëøò úà íùä .3 1 êøòä úà placeLongest-ì íùä .4 1 êøòä úà placeShortest-ì íùä .5 .6 : íéîòô 99 òöá currentSongLength-á àáä øôñîä úà èåì÷ .6.1 .6.2 íà currentSongLength > longest longest-á currentSongLength úà íùä .6.2.1 placeLongest-á éçëåðä øéùä ìù åîå÷î úà íùä .6.2.2 .6.3 íà currentSongLength < shortest shortest-á currentSongLength úà íùä .6.3.1 placeShortest-á éçëåðä øéùä ìù åîå÷î úà íùä .6.3.2 .7 placeShortest ìù åëøò úàå placeLongest ìù åëøò úà èìôë âöä בשתי הבעיות נדרשנו למצוא ער $נלווה לער $הגדול ביותר בסדרת ערכי .בבעיה הנתונה בתחילת הסעי הער $הנלווה הוא קוד מגיש ההצעה ובבעיה 6בפרק הלימוד הער $הנלווה הוא מקומו של השיר הארו $ביותר. כדי למצוא את הער $הנלווה לער $הגדול ביותר בסדרת ערכי נתבסס על התבנית למציאת מקסימו :בכל פע שנעדכ את ערכו של ) maxוכמוב ג באתחול( נשמור במשתנה נוס את ערכו של הער $הנלווה ל .maxבאופ דומה ,ע שינויי קלי ,מתבצע האלגורית עבור מציאת הער $הנלווה לער $הקט ביותר בסדרה. בתבנית של מציאת ער $נלווה למקסימו ולמינימו בסדרה נדגי כער $הנלווה את מקו המקסימו או המינימו ,אבל כאמור ,ער $נלווה יכול להיות כל ער $שהוא ,כמו הקוד הנלווה להצעה ,בבעיה שלעיל. נפריד את מאפייני התבנית מציאת ערך נלווה למקסימום ולמינימום בסדרה לשתי תת תבניות :ראשית ,נציג את מאפייני התבנית מציאת ערך נלווה למקסימום בסדרה ואחר כ$ נציג את מאפייני התבנית מציאת ערך נלווה למינימום בסדרה .עבור התתתבנית הראשונה נתייחס לביצוע חוזר באור $הידוע מראש ,ואילו עבור השנייה נתייחס לביצוע חוזר התלוי בתנאי. משו הדמיו בי שתי התתתבניות ,קל לפתח אלגורית מתאי למקרה האחר ,עבור כל אחת מה. הוראת המדעים ,אוניברסיטת תל-אביב -343- מדעי המחשב נלווה למקסימו בסדרה$ מציאת ער:ש התבנית ערכי הקלט,limit סדרת נתוני הקלט$ אור:נקודת מוצא limit הגדול ביותר בסדרת ערכי הקלט שאורכה הוא$ מציאת מקו הער:מטרה :אלגורית max-á êøò èåì÷ .1 1-ì placeOfMax úà ìçúà .2 :íéîòô limit -1 òöá .3 element-á êøò èåì÷ .3.1 element > max íà .3.2 element ìù êøòä úà max-á íùä .3.2.1 èì÷á element ìù åîå÷î úà placeOfMax-á íùä 3.2.2 :Javaיישו ב max = In.readInt(); placeOfMax = 1; for (i = 2; i <= limit; i++) { element = In.readInt(); if (element > max) { max = element; placeOfMax = i; } } מדעי המחשב -344- אביב- אוניברסיטת תל,הוראת המדעים נלווה למינימו בסדרה$ מציאת ער:ש התבנית ערכי הקלט,conditionToEnd תנאי סיו:נקודת מוצא עד אשר מתקיי התנאי, הקט ביותר מבי ערכי הקלט$ מציאת מקו הער:מטרה conditionTtoEnd :אלגורית min-á êøò èåì÷ .1 1-ì placeOfMin úà ìçúà .2 element-á êøò èåì÷ .3 2-ì currentPlace úà ìçúà .4 :òöá conditionToEnd íéé÷úî àì ãåò ìë .5 element < min íà .5.1 element ìù êøòä úà min-á íùä .5.1.1 currentPlace ìù êøòä úà placeOfMin-á íùä .5.1.2 1-á currentPlace úà ìãâä .5.2 element-á êøò èåì÷ .5.3 :Javaיישו ב min = In.readInt(); placeOfMin = 1; element = In.readInt(); currentPlace = 2; while (!conditionToEnd) { if (element < min) { min = element; placeOfMin = currentPlace; } currentPlace++; element = In.readInt(); } מדעי המחשב -345- אביב- אוניברסיטת תל,הוראת המדעים שימו ♥ :לפני ההוראה לביצוע חוזר כבר נקראי שני ערכי מהקלט .אנו נניח שהתנאי לסיו ) (conditionToEndיכול להתקיי עבור האיבר השני ואיל .$לכ ,למשל ,א תנאי הסיו מבטא קריאת זקי ,הרי שסדרת הקלט מכילה לפחות איבר אחד. לא פע מופיע הער $המינימלי או המקסימלי בסדרה יותר מפע אחת .בתבנית המוצגת מחושב מקו המופע הראשו" של הער $המקסימלי או המינימלי .שינוי מזערי באלגורית יאפשר את חישוב מקו המופע האחרו" .שאלה 16מתייחסת לנקודה זאת .ע ההתקדמות בחומר הלימוד נתייחס ג לסוגיית מציאת כל המופעי של הער $המקסימלי או המינימלי. שאלה 16 א .ישמו את האלגורית המורחב של המכרז בשפת .Java ב .עתה ,הניחו שבקלט יש שתי הצעות זוכות ,כלומר שהער $הגבוה ביותר של הצעה הוצע על ידי שני מגישי .שנו את האלגורית ,ואחר כ $את התוכנית שכתבת בסעי א ,כ $שיוצג כפלט הקוד של מגיש ההצעה השנייה )במקו של הראשונה(. שאלה 17 חנוכייה אופיינית היא חנוכייה בת 9קני ,שאחד מה גבוה מ השאר ומשמש כשמש .חנוכיה כזו נחשבת "סימטרית" א השמש ממוק במרכז החנוכיה )ארבעה קני ממוקמי מימינו של השמש וארבעה ממוקמי משמאלו( .חנוכיה כזו נחשבת "צידית" א השמש ממוק בקצה אחד שלה )שאר הקני ממוקמי משמאלו של השמש ,או מימינו(.בכל מקרה אחר ,נחשבת החנוכיה "מיוחדת". א .כתבו אלגורית שהקלט שלו הוא 9מספרי המייצגי את גבהי הקני של חנוכייה אופיינית, ונתוני לפי סדר מיקומ )משמאל לימי( ,והפלט שלו הוא הודעה המציינת את סוג החנוכיה. ב .ישמו את האלגורית בשפת .Java שאלה 18 בשכבת כיתות י' נער $מבח משווה במדעי המחשב .המבח נבדק על ידי המורי ,וציוני התלמידי נרשמו בטופס ריכוז בו כל תלמיד מיוצג על ידי מספר סידורי .כל מורה התבקש למסור למרכז המגמה את הציו הגבוה ביותר בכיתה ומספרו הסידורי של התלמיד שקיבל ציו זה ,וכ את הציו הנמו $ביותר בכיתה ומספרו הסידורי של התלמיד שקיבל ציו זה )המורה ידווח על תלמיד אחד מכל קטגוריה ,ג א יש יותר מתלמיד אחד שקיבל את הציו הגבוה ביותר בכיתה או יותר מתלמיד אחד שקיבל את הציו הנמו $ביותר בכיתה(. א .כתבו אלגורית שהקלט שלו הוא מספר התלמידי nבכיתה מסוימת ,ואחריו סדרה של n ציוני התלמידי בכיתה ,והפלט שלו הוא הציו הגבוה ביותר בכיתה ומספרו הסידורי של התלמיד שקיבל ציו זה ,והציו הנמו $ביותר בכיתה ומספרו הסידורי של התלמיד שקיבל ציו זה. ב .הרחיבו את האלגורית כ $שיציג כפלט ג את הציו השני בגודלו. ג .ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -346- מדעי המחשב איסוף בקיזוז נתבונ בבעיה האלגוריתמית הבאה: באוניברסיטה נער $סקר לבדיקת ההשערה" :מספר הסטודנטיות הלומדות קורסי המשלבי מחשב קט יותר ממספר הסטודנטי בקורסי אלה" .כתבו אלגורית שהקלט שלו הוא סדרה באור 100 $שאיבריה ה התו ' 'fאו התו ' ,'mהמייצגת את מינ )' 'mסטודנט 'f' ,סטודנטית( של 100סטודנטי הלומדי קורסי המשלבי מחשב .הפלט הוא הודעה הא ההשערה נכונה או אינה נכונה ביחס לנתוני. בפתרו הבעיה אי חשיבות למספר הסטודנטי ומספר הסטודנטיות הלומדי קורסי המשלבי מחשב .לכ אי צור $במנייה רגילה .במקרה זה מתאי יותר למנות תו $כדי קיזוז .כלומר ,נגדיר מונה יחיד ,שערכו יגדל בכל פע שנקלוט סטודנט ,וערכו יקט בכל פע שנקלוט סטודנטית. בסיו התהלי $יהיה במונה ההפרש בי מספר הסטודנטי למספר הסטודנטיות .נבדוק את ערכו של המונה :א ערכו חיובי ההשערה נכונה .אחרת ,ההשערה אינה נכונה .ג עבור שאלה 7.27 בפרק הלימוד נית לכתוב אלגורית המתבסס על איסו בקיזוז. נתבונ בשני האלגוריתמי הבאי ,האחד לפתרו הבעיה שלעיל ,והשני לפתרו שאלה :7.27 0-ì count úà ìçúà .1 0-ì count úà ìçúà .1 :íéîòô 100 òöá .2 vote-á øçåá ìå÷ èåì÷ .2 gender-á èðãåèñä ïéî èåì÷ .2.1 'm' -ì äååù gender íà .2.2 :òöá vote <> '#' ãåò ìë .3 'A' -ì äååù vote íà .3.1 1-á count úà ìãâä .3.1.1 1-á count úà ìãâä .2.2.1 úøçà .3.2 úøçà 2.3 1-á count úà ïè÷ä .2.3.1 íà .3 1-á count úà ïè÷ä .3.2.1 0-î ìåãâ count "äðåëð äøòùää" èìôë âöä .3.1 vote-á øçåá ìå÷ èåì÷ .3.3 íà .4 úøçà .4 "äðåëð àì äøòùää" èìôë âöä .4.1 0-î ìåãâ count "äëæ ïåìà" èìôë âöä .4.1 úøçà .5 "äëæ àì ïåìà" èìôë âöä .4.2 התבנית של איסוף בקיזוז מתאימה ג לקיזוז באמצעות צבירה ולא רק לקיזוז באמצעות מנייה. בהמש $נראה שאלות ,שבה יש צור $לאסו בקיזוז באמצעות צבירה. הוראת המדעים ,אוניברסיטת תל-אביב -347- מדעי המחשב נפריד את מאפייני התבנית איסוף בקיזוז לשתי תתתבניות :ראשית ,נציג את מאפייני התבנית איסוף בקיזוז באמצעות מנייה ואחר כ $נציג את מאפייני התבנית איסוף בקיזוז באמצעות צבירה .עבור התבנית הראשונה נתייחס לביצוע חוזר באור $הידוע מראש ואילו עבור השנייה נתייחס לביצוע חוזר התלוי בתנאי .כבמקרי קודמי ,עבור כל אחת מהתבניות נית לפתח אלגוריתמי מתאימי ג למקרה האחר. ש התבנית :איסו בקיזוז באמצעות מנייה נקודת מוצא:אור $סדרת נתוני הקלט ,limitערכי הקלט ,תנאי לקיזוז conditionToDecrease מטרה :איסו בקיזוז באמצעות מנייה של ערכי הקלט ,מתו $סדרה שאורכה ,limitכשהקיזוז מתבצע על פי התנאי conditionToDecrease אלגורית: 0-ì count úà ìçúà .1 :íéîòô limit òöá .2 element-á êøò èåì÷ .2.1 íà .2.2 conditionToDecrease úà íéé÷î àì element 1-á count úà ìãâä .2.2.1 úøçà .2.3 1-á count úà ïè÷ä .2.3.1 יישו ב:Java ;count = 0 )for (i = 1; i <= limit; i++ { ;)(element = In.readInt )if (!conditionToDecrease { ;count++ } else { ;count-- } } הוראת המדעים ,אוניברסיטת תל-אביב -348- מדעי המחשב שונה, שליטה בקיזוז, ותפקידו, הוא הכרחיcondition בתבנית איסוף בקיזוז התנאי:♥ שימו בתבניותconditionToMult אוconditionToSum ,conditionToCount מתפקיד התנאי .מנייה וצבירה . ביצועה תלוי בתנאי$ עבור שמש,עתה נראה את התבנית של איסו בקיזוז באמצעות צבירה איסו בקיזוז באמצעות צבירה:ש התבנית תנאי,initial צבירה התחלתי$ ער, ערכי הקלט,conditionToEnd תנאי סיו:נקודת מוצא conditionToDecrease לקיזוז הביצוע תלוי$ כאשר מש,initial $ איסו בקיזוז באמצעות צבירה של ערכי הקלט אל הער:מטרה conditionToDecrease והקיזוז מתבצע על פי התנאי,conditionToEnd בתנאי :אלגורית initial-ì sum úà ìçúà .1 element-á êøò èåì÷ .2 :òöá conditionToEnd íéé÷úî àì conditionToDecrease element úà íéé÷î àì ìù åëøò úà sum-ì element ãåò ìë .3 íà .3.1 óñåä .3.1.1 úøçà .3.2 element ìù åëøò úà sum-î úçôä .3.2.1 element-á êøò èåì÷ .3.3 :Javaיישו ב sum = initial; element = In.readInt(); while (!conditionToEnd) { if (!conditionToDecrease) { sum += element; } else { sum -= element; } element = In.readInt(); } מדעי המחשב -349- אביב- אוניברסיטת תל,הוראת המדעים שאלה 19 ישמו את הפתרו לבעיית הסקר באוניברסיטה בשפת .Java שאלה 20 נתונה סדרת ההוראות הבאה ,שיש בה שימוש בתבנית איסוף בקיזוז: .1אסוף בקיזוז באמצעות מנייה את איברי סדרת הקלט שאורכה ,8תוך קיזוז האיברים האי-זוגיים ìá÷úîä êøòä úà èìôë âöä .2 א .תנו דוגמה לסדרת נתוני קלט של מספרי חיוביי שעבורה יוצג כפלט הער.3 $ ב .הסבירו בקצרה מהי מטרת ההוראה. ג .השלימו את סדרת ההוראות הבאה ,השקולה לסדרה הנתונה ,א $משתמשת בתנאי לקיזוז אחר: .1אסוף בקיזוז באמצעות מנייה את איברי סדרת הקלט שאורכה ,8תוך קיזוז האיברים הזוגיים ____________ úà èìôë âöä .2 שאלה 21 נתו אלגורית שהקלט שלו הוא סדרת מספרי ממשיי: sum úà ìçúà .1ל0 num-á éùîî øôñî èåì÷ .2 .3 :òöá num ≠ 0 ãåò ìë num > 0 íà .3.1 num ìù åëøò úà sum-ì óñåä .3.1.1 .3.2 úøçà num ìù åëøò úà sum-î úçôä .3.2.1 num-á øôñî èåì÷ .3.3 sum ìù åëøò úà èìôë âöä .4 א .תנו שתי דוגמאות קלט שונות לסדרות נתוני קלט של מספרי ממשיי ,שעבור יוצג כפלט הער.0 $ ב .הסבירו בקצרה מהי מטרת האלגורית. ג .כתבו הוראה השקולה לאלגורית תו $שימוש בתבנית .השלימו: אסוף בקיזוז באמצעות צבירה ל _______-של איברי סדרת הקלט המסתיימת בזקיף ,0תוך קיזוז ________________ הוראת המדעים ,אוניברסיטת תל-אביב -350- מדעי המחשב שאלה 22 א .כתבו אלגורית שהקלט שלו הוא יתרת לקוח של בנק בתחילת החודש ,ואחריו סדרה של מספרי ,המסתיימת ב .0כל מספר מייצג את סכו הפעולה :סכו חיובי מציי הפקדת הסכו בחשבו הבנק וסכו שלילי מציי משיכת הסכו מחשבו הבנק .הפלט של האלגורית הוא היתרה של הלקוח בסו החודש. ב .ישמו את האלגורית בשפת .Java שאלה ) 23שאלה זו מתאימה לאחר לימוד סעי – 7.7קינו הוראות לביצוע חוזר( מבח במתכונת של שאלו אמריקני הועבר ל 30סטודנטי של הקורס "דיוק בתשובות" .במבח 20שאלות .ניקוד תשובות התלמידי התבצע באופ הבא :כל תשובה נכונה זיכתה ב 5נקודות וכל תשובה שגויה גרמה להפחתה של 3נקודות )בכל מקרה ,לא נית לקבל ציו נמו $מ.(0 א .כתבו אלגורית ,שהקלט שלו הוא 20התשובות הנכונות ואחריה תשובות של 30הסטודנטי בקורס ) 20תשובות לכל סטודנט( .הפלט הוא מספר הסטודנטי שציונ "עובר" )לפחות .(55 ב .הרחיבו את האלגורית שכתבת בסעי א כ $שיציג כפלט ג את אחוז התלמידי שקיבלו 0 במבח. ג .הרחיבו את האלגורית שכתבת בסעי ב כ $שיציג כפלט ג את הציו הגבוה ביותר בבחינה ואת הציו הנמו $ביותר בבחינה )שאינו .(0 ד .ציינו מה התבניות המשמשות לפתרו וכיצד שילבת ביניה". ה .ישמו את האלגורית שכתבת בסעי ג בשפת .Java שאלה (*) 24 נתוני ארבעה ביטויי בוליאניי המשתמשי בתבניות ,הבודקי אותו תנאי ,עבור סדרת קלט נתונה: -î ìá÷úîä êøòä .1איסוף בקיזוז באמצעות צבירה של איברי סדרת הקלט שאורכה ,10 תוך קיזוז האיברים הזוגיים àåäזוגי -î ìá÷úîä êøòä .2מנייה של האיברים האי-זוגיים בסדרת הקלט שאורכה àåä 10זוגי -î ìá÷úîä êøòä .3צבירת סכום איברי סדרת הקלט שאורכה àåä 10זוגי -î ìá÷úîä êøòä .4צבירת סכום האיברים האי-זוגיים בסדרת הקלט שאורכה àåä 10 זוגי א .תנו דוגמה לסדרת מספרי שלמי חיוביי שעבורה הער $של כל אחד מהביטויי הבוליאניי יהיה .true ב .נסחו במלי את התנאי שמבטאי הביטויי הבוליאניי. ג .ישמו כל אחד מהשימושי השוני כקטעי תוכניות בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -351- מדעי המחשב פירוק מספר חיובי לספרותיו בפרק 4היכרנו את התבנית של פירוק מספר דוספרתי חיובי לספרותיו .עתה נרחיב את התבנית עבור מספר של חיובי באור $כלשהו .פירוק המספר מתבסס על רעיו של הפרדת ספרת האחדות מהמספר ,כ $שהמספר שנותר קט פי ,10וחוזר חלילה עד שלא נותרות ספרות במספר. נראה את מאפייני התבנית פירוק מספר חיובי לספרותיו: ש התבנית :פירוק מספר חיובי לספרותיו נקודת מוצא :מספר של חיובי num מטרה :הצגה כפלט של ספרותיו של num אלגורית: òöá 0-î äðåù num ãåò ìë .1 úà èìôë âöä .2ספרת האחדות של num 10 éô num úà ïè÷ä .3 יישו ב:Java )while (num != 0 { ;)System.out.println(num % 10 ;num /= 10 } שימו ♥ :באלגורית של התבנית הצגנו כפלט את ספרותיו של ,numאול נית כמוב לבצע פעולות אחרות על ספרות המספר ,כגו :מנייה ,צבירה ,ועוד .השאלות הבאות מתייחסות לבעיות אלגוריתמיות בה נדרשות פעולות אחרות על ספרות המספר. שאלה 25 א .פתחו אלגורית שהקלט שלו הוא מספר של חיובי ,והפלט שלו הוא מספר הספרות במספר. ישמו את האלגורית בשפת .Java ב .הרחיבו את האלגורית שכתבת בסעי א כ $שיציג כפלט ג את סכו הספרות האיזוגיות במספר . ג .הרחיבו את האלגורית שכתבת בסעי ב כ $שיציג כפלט ג הודעה המציינת א יש במספר יותר ספרות המתחלקות ב 3ללא שארית מאשר ספרות שאינ מתחלקות ב .3ישמו את האלגורית המלא בשפת .Java ד .ציינו באילו תבניות השתמשת בכתיבת האלגורית המלא וכיצד שילבת ביניה. הוראת המדעים ,אוניברסיטת תל-אביב -352- מדעי המחשב שאלה 26 לפניכ קטע תוכנית בשפת ,Javaשהקלט שלו הוא מספר של חיובי ,והפלט שלו אמור להיות מספר הספרות במספר .קטע התוכנית שגוי. ;)(num = In.readInt ;sum = num % 10 )while ((num / 10) > 0 ;sum += num % 10 ;)System.out.println(sum א .הביאו דוגמת קלט שעבורה יתקבל הפלט הדרוש. ב .הביאו דוגמת קלט שעבורה לא יתקבל הפלט הדרוש. ג .הסבירו במלי מדוע קטע התוכנית שגוי. ד .תקנו את קטע התוכנית כ $שישיג את מטרתו עבור כל קלט חוקי. שאלה 27 א .כתבו אלגורית שהקלט שלו הוא מספר של וחיובי numומספר חדספרתי placeהמייצג מקו .הפלט שלו הוא הספרה הנמצאת במקו placeבמספר ) numמיקו הספרות מתחיל מימי"( .א אי במספר placeספרות יוצג כפלט הער.-1 $ למשל ,עבור הקלט 17489 2יוצג כפלט הער ,8 $ועבור הקלט 17489 6יוצג כפלט הער. -1 $ ב .ישמו את האלגורית בשפת .Java שאלה 28 ספרת שורש של מספר היא ספרה בי 1ל 9המתקבלת מתהלי $של חיבור חוזר של ספרות המספר עד אשר מתקבל מספר חדספרתי .למשל ,ספרת השורש של המספר 30486היא ,2כיוו שסכו ספרות המספר המקורי הוא 20וסכו הספרות של 20הוא .2 א .כתבו אלגורית שהקלט שלו הוא מספר של חיובי והפלט שלו הוא ספרת השורש של המספר הנתו. ב .ישמו את האלגורית בשפת .Java שאלה 29 א .כתבו אלגורית שהקלט שלו הוא מספר של חיובי והפלט שלו הוא ההפרש בי הספרה הגדולה ביותר במספר לבי הספרה הקטנה ביותר במספר. ב .ציינו באילו תבניות השתמשת בכתיבת האלגורית וכיצד שילבת ביניה. ג .ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -353- מדעי המחשב בניית מספר בפרק 4היכרנו את התבנית של בניית מספר כאשר התמקדנו בבניית מספר דוספרתי משתי ספרות .עתה נרחיב את התבנית לבניית מספר של באור $כלשהו מספרות הנקלטות בזו אחר זו. כדי להרכיב מספר מספרות צרי $בכל שלב בלולאה להגדיל את המספר פי 10ולחבר לו את ספרת הקלט החדשה .כ $עד לסיו הקלט. נית להרחיב את התבנית ,למשל ,על ידי בניית מספר ממספרי דוספרתיי ,ואז בכל שלב יגדל המספר פי 100ויתווס לו המספר הדוספרתי התור מהקלט. נציג עבור התבנית בניית מספר אלגורית עבור ביצוע חוזר באור $הידוע מראש .נית להתאימו ג למקרי בה סיו הבנייה תלוי בתנאי. ש התבנית :בניית מספר נקודת מוצא :אור $סדרת נתוני הקלט ,limitספרות הקלט מטרה :בניית מספר מספרות הקלט אלגורית: 0-ì num úà ìçúà .1 :íéîòô limit òöá .2 digit-á äøôñ èåì÷ .2.1 num * 10 + digit éðåáùçä éåèéáä ìù êøòä úà num-á íùä .2.2 יישו ב:Java ;num = 0 )for (i = 1; i <= limit; i++ { ;)(digit = In.readInt ;num = num * 10 + digit } שאלה 30 נתו האלגורית הבא: digit-á äøôñ èåì÷ .1 limit-á øôñî èåì÷ .2 0-ì num úà ìçúà .3 .4 :íéîòô limit òöá הוראת המדעים ,אוניברסיטת תל-אביב -354- מדעי המחשב num * 10 + digit éðåáùçä éåèéáä ìù êøòä úà num-á íùä .4.1 num úà èìôë âöä .4.2 א .מה יהיה הפלט עבור הקלט ?5 3 ב .תנו דוגמה לקלט שעבורו הפלט יהיה .6 ג .הסבירו בקצרה מהי מטרת האלגורית. שאלה 31 א .כתבו אלגורית שהקלט שלו הוא מספר של וחיובי ,numספרה digitומקו .placeהפלט שלו הוא המספר שמתקבל מהחלפת הספרה הנמצאת במקו ) placeמימי( במספר num בספרה .digit למשל ,עבור הקלט 78342 4 6יוצג כפלט הער ,76342 $ועבור הקלט 13608 1 9יוצג כפלט הער.13608 $ ב .ישמו את האלגורית בשפת .Java שאלה 32 א .כתבו אלגורית שהקלט שלו הוא מספר של וחיובי numוהפלט שלו הוא המספר המתקבל מ numעל ידי היפו $סדר ספרותיו. ב .ציינו באילו תבניות השתמשת בכתיבת האלגורית וכיצד שילבת ביניה. ג .ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -355- מדעי המחשב האם כל הערכים בסדרה מקיימים תנאי? נתבונ בבעיה האלגוריתמית הבאה: במסגרת הפעילות של עידוד "הקורא הצעיר" הוחלט להעניק פרס לביתספר שבו כל תלמידיו קראו לפחות ספר קריאה אחד במהל $חופשת הקי ./פתחו אלגורית שהקלט שלו הוא מספר הספרי שקרא כל אחד מתלמידי ביתספר "אמירי" שבסיומה הזקי ) -1עבור תלמיד שלא קרא כלל ספרי ייקלט הער ,(0 $והפלט שלו הוא הודעה המציינת א הפרס יוענק לביתהספר. לפתרו הבעיה עלינו לעבור על כל נתוני הקלט ,כלומר ,לבדוק עבור כל תלמיד הא קרא ספרי קריאה במהל $החופשה או לא .אבל ,א קיי לפחות תלמיד אחד שלא קרא ספר קריאה אז לביתהספר לא יוענק הפרס ולכ אי טע להמשי $ולבדוק את מספר ספרי הקריאה שקראו שאר תלמידי ביתהספר .אלגורית זה הוא תיאור של התבנית האם כל הערכים בסדרה מקיימים תנאי? .ג עבור שאלה 7.53בפרק הלימוד נית לכתוב אלגורית המתבסס על תבנית זו. נתבונ בשני האלגוריתמי הבאי ,הראשו לפתרו הבעיה שלעיל ,והשני לפתרו שאלה :7.53 true-ì allReaders úà ìçúà .1 books-á ãéîìúì äàéø÷ éøôñ øôñî èåì÷ .2 .3 :òöá true àåä allReaders ìù åëøò íâå books ≠ -1 ãåò ìë 0 àåä books ìù åëøò íà .3.1 false êøòä úà allReaders-á íùä .3.1.1 .3.2 úøçà books-á ãéîìúì äàéø÷ éøôñ øôñî èåì÷ .3.2.1 true àåä allReaders ìù åëøò íà .4 "ñøôä ÷ðòåî íéøéîà øôñä-úéáì" èìôë âöä .4.1 allEven úà ìçúà .1לtrue sum úà ìçúà .2ל0 1-ì howMany úà ìçúà .3 .4 :òöá true àåä allEven ìù åëøò íâå howMany ≤ 20 ãåò ìë num-á éáåéç øôñî èåì÷ .4.1 1-á howMany ìù åëøò úà ìãâä .4.2 .4.3 íà numמספר אי-זוגי false êøòä úà allEven-á íùä .4.3.1 .4.4 úøçà num-á sum úà ìãâä .4.4.1 הוראת המדעים ,אוניברסיטת תל-אביב -356- מדעי המחשב allEven íà .5 sum ìù åëøò úà èìôë âöä .5.1 .6 úøçà "é÷åç åðéà èì÷ä" èìôë âöä .6.1 משמעות התבנית האם כל הערכים בסדרה מקיימים תנאי? היא בדיקה של קיו תנאי עבור כל ערכי הסדרה .מתבצעת סריקה של ערכי הקלט בזה אחר זה ,וא אחד הערכי אינו מקיי את התנאי אי טע בהמש $הסריקה .בבעיה הנתונה א ערכו של booksשווה ל 0אז נמצא תלמיד שלא קרא א לא ספר קריאה אחד ולכ אי צור $להמשי $בסריקה .בשאלה 7.53א בקלט יש מספר איזוגי אז אי טע להמשי $בבדיקת שאר ערכי המספרי. נציג את מאפייני התבנית האם כל הערכים בסדרה מקיימים תנאי? עבור סדרה שאורכה ידוע מראש .נית להתאי את האלגורית למקרה שבו אור $הסדרה אינו ידוע מראש ,בדומה לאלגורית שנית לבעיה שלעיל. ש התבנית :הא כל הערכי בסדרה מקיימי תנאי? נקודת מוצא :אור $סדרת נתוני הקלט ,limitערכי הקלט ,תנאי condition מטרה :חישוב הער true $א כל הערכי בסדרה מקיימי את התנאי conditionוהערfalse $ א קיי ער $אחד בסדרה שאינו מקיי את התנאי אלגורית: true-ì all úà ìçúà .1 1-ì howmany úà ìçúà .2 :òöá true àåä all ìù åëøò íâå howmany ≤ limit ãåò ìë .3 element-á êøò èåì÷ .3.1 1-á howMany ìù åëøò úà ìãâä .3.2 íà .3.3 condition úà íéé÷î åðéà element false êøòä úà all-á íùä .3.3.1 יישו ב:Java ;all = true ;howmany = 1 ))while ((howmany <= limit) && (all { ;)(element = In.readInt ;howmany++ elementאינו מקיים את התנאי if (condition)// { ;all = false } } הוראת המדעים ,אוניברסיטת תל-אביב -357- מדעי המחשב התבנית האם כל הערכים בסדרה מקיימים תנאי? מחשבת ער $בוליאני שערכו trueאו .false אנו משתמשי במשתנה בוליאני allשערכו התחילי הוא ,trueכלומר ,ההנחה התחילית היא שכל ערכי הסדרה אכ מקיימי את התנאי .א במהל $הסריקה אחד הערכי אינו מקיי את התנאי אז ההנחה התחילית שלנו מתבדה ולכ ערכו של allמקבל ער false $ו הסריקה מסתיימת. שאלה 33 א .רשמו הוראה השקולה לאלגורית של "הקורא הצעיר" תו $שימוש בתבנית החדשה .השלימו: האם כל הערכים בסדרת הקלט המסתיימת ב _________-מקיימים את התנאי________? ב .ישמו את האלגורית בשפת .Java שאלה 34 א .כתבו אלגורית שהקלט שלו הוא מספר של וחיובי numוהפלט שלו הוא ההודעה "ספרות זהות" א כל ספרות המספר זהות וההודעה "ספרות שונות" א לא כל הספרות זהות. ב .ציינו באילו תבניות השתמשת בכתיבת האלגורית וכיצד שילבת ביניה. ג .ישמו את האלגורית בשפת .Java שאלה 35 לפניכ קטע תוכנית בשפת ,Javaשהקלט שלו הוא סדרה של מספרי שלמי וחיוביי .סו הקלט מצוי על ידי המספר .-1קטע התוכנית אמור להציג כפלט את ההודעה "כל המספרי ה כפולות של "6א 6מחלק של כל המספרי בסדרת הקלט .קטע התוכנית שגוי. ;)(num = In.readInt )while (num != -1 { )ok = (num % 6 == 0 ;)(num = In.readInt } )if (ok { ;)"System.out.println ("All numbers are multiples of 6 } א .תנו דוגמה לסדרת קלט )לפחות 5ערכי( עבורה לא נית להבחי שקטע התוכנית שגוי. ב .תנו דוגמה לסדרת קלט )לפחות 5ערכי( עבורה נית להבחי שקטע התוכנית שגוי. ג .הסבירו במילי מדוע קטע התוכנית שגוי. ד .תקנו את קטע התוכנית כ $שיבצע את מטרתו עבור כל סדרת קלט. הוראת המדעים ,אוניברסיטת תל-אביב -358- מדעי המחשב האם קיים ערך בסדרה המקיים תנאי? נתבונ בשתי הבעיות האלגוריתמיות הבאות: בעיה :1כתבו אלגורית ,שהקלט שלו הוא סדרה של 15מספרי שלמי ,והפלט שלו הוא הודעה המציינת א קיי בסדרת הקלט מספר שלילי. בעיה :2כתבו אלגורית ,שהקלט שלו הוא סדרה של תווי ,המסתיימת בזקי '*' ,והפלט שלו הוא הודעה המציינת א נקלטה בסדרת התווי אחת מאותיות ה ABCאו אחת מאותיות ה .abc לפתרו שתי הבעיות עלינו לעבור על נתוני הקלט עד למציאת ער $המקיי את התנאי .בבעיה 1 התנאי הוא הא ער $הקלט הוא מספר שלילי ובבעיה 2התנאי הוא הא נקלטה אחת מאותיות ה ABCאו אחת מאותיות ה .abcא קיי ער $אחד המקיי את התנאי אז יש להפסיק את הסריקה כי ער $מתאי כבר נמצא .אלגורית זה הוא תיאור של התבנית האם קיים ערך בסדרה המקיים תנאי?. נתבונ בשני האלגוריתמי לפתרו בעיה 1ובעיה :2 false-ì found úà ìçúà .1 1-ì howmany úà ìçúà .2 .3 :òöá false-ì äååù found ìù åëøò íâå howmany ≤ 15 ãåò ìë num-á íìù øôñî èåì÷ .3.1 1-á howmany ìù åëøò úà ìãâä .3.2 num < 0 íà .3.3 true êøòä úà found-á íùä .3.3.1 found íà .4 "èì÷ä úøãñá éìéìù øôñî íéé÷" èìôë âöä .4.1 .5 úøçà "èì÷ä úøãñá éìéìù øôñî íéé÷ àì" èìôë âöä .5.1 false-ì found úà ìçúà .1 ch-á åú èåì÷ .2 .3 ìë ch ≠ '*' ãåò הוראת המדעים ,אוניברסיטת תל-אביב :òöá false àåä found ìù åëøò íâå -359- מדעי המחשב (ch ≤ 'Z' íâå ch ≥ 'A' ) åà (ch ≤= 'z' íâå ch ≥ 'a') íà .3.1 true êøòä úà found-á íùä .3.1.1 úøçà .3.2 ch-á åú èåì÷ .3.2.1 found íà .4 "èì÷ä úøãñá abc-á åà ABC-á úåà úîéé÷" èìôë âöä .4.1 úøçà .5 "èì÷ä úøãñá abc-á åà ABC-á úåà úîéé÷ àì" èìôë âöä .5.1 נציג את מאפייני התבנית האם קיים ערך בסדרה המקיים תנאי? עבור סדרה שאורכה אינו בדומה, הסדרה ידוע מראש$ נית להתאי את האלגורית למקרה שבו אור.ידוע מראש . שלעיל1 לאלגורית שנית לבעיה ? בסדרה המקיי תנאי$ הא קיי ער:ש התבנית condition תנאי, ערכי הקלט,toEnd תנאי לסיו הסדרה:נקודת מוצא אfalse $ והערcondition בסדרה המקיי את התנאי$ א קיי ערtrue $ חישוב הער:מטרה כל הערכי בסדרה אינ מקיימי את התנאי :אלגורית false-ì found úà ìçúà .1 element-á êøò èåì÷ .2 :òöá false àåä found ìù åëøò íâå íéé÷úî àì toEnd éàðúä ãåò ìë .3 condition úà íéé÷î element íà .3.1 true êøòä úà found-á íùä .3.1.1 úøçà .3.2 element-á êøò èåì÷ .3.2.1 :Javaיישו ב found = false; element = In.readInt(); while (!toEnd && !found) { if (condition) // מקיים את התנאיelement { found = true; } element = In.readInt(); } מדעי המחשב -360- אביב- אוניברסיטת תל,הוראת המדעים משמעות התבנית האם קיים ערך בסדרה המקיים תנאי? היא בדיקה של קיו תנאי עבור ערכי בסדרה .מתבצעת סריקה של ערכי הקלט בזה אחר זה ,וא אחד הערכי אכ מקיי את התנאי אי טע בהמש $הסריקה .התבנית מחשבת ער $בוליאני שערכו trueאו .falseלכ ,אנו משתמשי במשתנה בוליאני foundשערכו התחילי הוא .falseכלומר ,ההנחה התחילית היא שאי ער $בסדרה המקיי את התנאי .א במהל $הסריקה אחד הערכי אכ מקיי את התנאי אז ההנחה התחילית שלנו מתבדה ,מאחר שמצאנו ער $המקיי את התנאי .לכ foundיקבל ער$ trueוהסריקה תסתיי. שאלה 36 א .כתבו הוראה השקולה לאלגוריתמי של כל אחת מהבעיות 1ו 2תו $שימוש בתבנית האם קיים ערך בסדרה המקיים תנאי? .השלימו: בעיה :1 .1 íà קיים ערך בסדרת הקלט שאורכה________ המקיים ________ "èì÷ä úøãñá éìéìù øôñî íéé÷" èìôë âöä .1.1 .2 úøçà "èì÷ä úøãñá éìéìù øôñî íéé÷ àì" èìôë âöä .2.1 בעיה :2 íà .1קיים ערך בסדרת הקלט שמסתיימת ב _________-המקיים ________ "èì÷ä úøãñá abc-á åà ABC-á úåà úîéé÷" èìôë âöä .1.1 .2 úøçà "èì÷ä úøãñá abc-á åà ABC-á úåà úîéé÷ àì" èìôë âöä .2.1 ב .ישמו את האלגוריתמי לפתרו הבעיות 1ו 2בשפת .Java ג .עבור כל אחד מהאלגוריתמי נית לכתוב אלגורית שקול תו $שימוש בתבנית האם כל הערכים בסדרה מקיימים תנאי? .השלימו את ההוראות הבאות עבור בעיה ,1וכתבו הוראות מתאימות ,המשתמשות בתבנית זו ,לבעיה .2 בעיה :1 .1 àì íà כל הערכים בסדרה שאורכה________ מקיימים את התנאי _____________ "èì÷ä úøãñá éìéìù øôñî íéé÷" èìôë âöä .1.1 .2 úøçà "èì÷ä úøãñá éìéìù øôñî íéé÷ àì" èìôë âöä .2.1 הוראת המדעים ,אוניברסיטת תל-אביב -361- מדעי המחשב שאלה 37 א .כתבו אלגורית ,שהקלט שלו מספר של חיובי והפלט שלו הוא הודעה המציינת א קיימת במספר הספרה .0 ב .שנו את האלגורית שכתבת בסעי א כ $שיציג הודעה המציינת א קיימת ספרה זוגית במספר .ציינו איזו תבנית שילבת בפתרו הבעיה. שאלה 38 בכיתה י' המורה העלתה הצעה לעשות קומזי /לגיבוש 39תלמידי הכיתה .ההצעה תתקבל רק א א תלמיד לא יתנגד להגיע לקומזי ./כל תלמיד התבקש לרשו על ד את האות ' 'yא הוא מסכי להצעה או את האות ' 'nא הוא מתנגד להצעה .יש לכתוב אלגורית ,שהקלט שלו הוא סדרה של 39תווי כאשר התו ' 'yמייצג את הסכמת התלמיד להצעה והתו ' 'nמייצג את התנגדות התלמיד להצעה .הפלט הוא הודעה המציינת א ההצעה התקבלה או לא. לפניכ שני אלגוריתמי לפתרו הבעיה: אלגורית :1 íà .1קיים ערך בסדרת הקלט שאורכה 39המקיים את התנאי ) answerשווה ל- '('n "äìá÷úä àì äòöää" äòãåää úà èìôë âöä .1.1 .2 úøçà "äìá÷úä äòöää" äòãåää úà èìôë âöä .2.1 אלגורית :2 .1 íà כל הערכים בסדרת הקלט שאורכה 39מקיימים את התנאי ) answerשווה ל('y' - "äìá÷úä äòöää" äòãåää úà èìôë âöä .1.1 .2 úøçà "äìá÷úä àì äòöää" äòãåää úà èìôë âöä .2.1 ישמו את שני האלגוריתמי בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -362- מדעי המחשב מציאת כל הערכים בסדרה המקיימים תנאי נתבונ בשתי הבעיות האלגוריתמיות הבאות: בעיה :1כתבו אלגורית ,שהקלט שלו הוא סדרה של 25זוגות מספרי שלמי ,והפלט שלו הוא כל זוגות המספרי המקיימי את היחס של מספרי עוקבי. בעיה :2כתבו אלגורית ,שהפלט שלו הוא כל המספרי מ 1עד 100המקיימי את הכללי של " 7בו" ,כלומר :מתחלקי ב 7ללא שארית או כוללי את הספרה .7 לפתרו שתי הבעיות עלינו לעבור על כל הערכי בסדרה ולהציג כפלט את כל הערכי המקיימי את התנאי .בבעיה 1התנאי הוא יחס של עוקב בי כל זוג מספרי ברשימה ובבעיה 2התנאי הוא קיו הכללי של " 7בו" .יש דמיו מסוי בי תבנית זו לשתי התבניות האחרונות ,א $במקרה זה איננו יכולי להפסיק את הסריקה לפני שנגיע אל סיו סדרת הקלט .אלגורית זה הוא תיאור של התבנית מציאת כל הערכים בסדרה המקיימים תנאי. נתבונ בשני האלגוריתמי לפתרו בעיה 1ובעיה :2 .1 :íéîòô 25 òöá num2-áå num1-á íéîìù íéøôñî âåæ èåì÷ .2 .2.1 íà num1ו num2-הם ערכים עוקבים åà num2ו num1-הם ערכים עוקבים num1 ìù íéëøòä úà èìôë âöä .2.1.1ושל num2 .1 :òöá 100-î ïè÷ä íìù éáåéç i øôñî ìë øåáò .1.1 íà 7מחלק של åà iספרת העשרות של iשווה ל åà 7-ספרת האחדות של iשווה ל7- i ìù êøòä úà èìôë âöä .1.1.1 בתבנית מציאת כל הערכים בסדרה המקיימים תנאי מתבצעת סריקה של כל ערכי הקלט בזה אחר זה .בכל פע שנמצא ער $שמקיי את התנאי מבצעי עליו פעולה כגו הצגה כפלט ,מנייה, פעולה חשבונית. נציג את מאפייני התבנית מציאת כל הערכים בסדרה המקיימים תנאי עבור סדרה שאורכה אינו ידוע מראש .נית להתאי את האלגורית למקרה שבו אור $הסדרה ידוע מראש ,בדומה הוראת המדעים ,אוניברסיטת תל-אביב -363- מדעי המחשב לאלגורית שנית לבעיה 1ו 2שלעיל .מאפייני התבנית מוגדרי לפי ביצוע פעולת קלט עבור כל איבר שנמצא מקיי את התנאי .נית להתאימ למקרה בו נדרשת פעולה אחרת ,כפי שקורה בכמה מהשאלות הבאות. ש התבנית :מציאת כל הערכי בסדרה המקיימי תנאי נקודת מוצא :תנאי לסיו הסדרה ,toEndערכי הקלט ,תנאי condition מטרה :הצגה כפלט של כל ערכי הקלט המקיימי את התנאי condition אלגורית: element-á êøò èåì÷ .1 :òöá íéé÷úî àì toEnd éàðúä ãåò ìë .2 íà .3.1 condition úà íéé÷î element element ìù åëøò úà èìôë âöä .3.1.1 element-á êøò èåì÷ .3.2 יישו ב:Java ;)(element = In.readInt )while (!toEnd { )if (condition { ;)System.out.println(element } ;)(element = In.readInt } שאלה 39 א .רשמו הוראה השקולה לאלגורית לפתרו בעיה 1תו $שימוש בתבנית .השלימו: מצא את כל הערכים בסדרת הקלט שאורכה ________ המקיימים את התנאי ________ ב .ישמו את האלגורית בשפת .Java ג .רשמו הוראה השקולה לאלגורית לפתרו בעיה 2תו $שימוש בתבנית .השלימו: מצא את כל הערכים בסדרת הקלט שאורכה ________ המקיימים את התנאי ________ ד .ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -364- מדעי המחשב שאלה 40 תלמידי שכבה י' בביתספר "היובל" השתתפו בתחרויות יו ספורט היתולי ,במהלכו כל משתת צבר נקודות .תוצאתו של תלמיד שלא השתת היא .0למע גיבוש הכיתות הוחלט להעניק "יו כי" לכיתות שבה השתתפו כל התלמידי בתחרויות של יו הספורט. נתו אלגורית חלקי ,שהקלט שלו הוא תוצאות התחרויות של כל אחת מ 10הכיתות בבית הספר .לכל כיתה נקלטת סדרת התוצאות של כל התלמידי עד לקליטת הזקי .-1הפלט של האלגורית הוא מספרי הכיתות שזכו ב"יו כי". .1 :òöá 10-ì äååù åà ïè÷ä íìùå éáåéç i ìë øåáò ________-ì prize úà ìçúà .1.1 result-á ãéîìú úàöåú èåì÷ .1.2 .1.3 :òöá ________ íâå ________ ãåò ìë ________ íà .1.3.1 false êøòä úà prize-á íùä .1.3.1.1 .1.3.2 úøçà ________ .1.3.2.1 ________ íà .2 ________ èìôë âöä .2.1 א .השלימו את האלגורית. ב .ציינו מה התבניות המשולבות באלגורית. ג .בהנהלת ביתהספר החליטו להעניק פרס נוס "גיבושו" לכיתה שתלמידיה צברו את מירב הנקודות בתחרות .הרחיבו את האלגורית כ $שיציג כפלט את מספר הכיתה שזכתה בפרס "גיבושו" .איזו תבנית שילבת עתה בפתרו הבעיה האלגוריתמית? ד .ישמו את האלגורית בשפת .Java שאלה 41 א .כתבו אלגורית ,שהקלט שלו הוא סדרה של מספרי חיוביי )סו הסדרה מצוי ע"י מספר שלילי( ,והפלט שלו הוא כל המספרי המתחלקי בסכו ספרותיה וכמות המספרי המקיימי תנאי זה. לדוגמה :עבור סדרת הקלט :4000 110 550 83 103 18 -7המספרי 110 550 18ו- 4000מתחלקי בסכו ספרותיה ,לכ הפלט הוא רשימת המספרי 18 550 110 4000 והודעה המציינת כי כמות המספרי המתחלקי בסכו ספרותיה4 : ב .ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -365- מדעי המחשב מעבר על זוגות סמוכים בסדרה נתבונ בשתי הבעיות האלגוריתמיות הבאות: בעיה :1כתבו אלגורית ,שהקלט שלו הוא סדרה של 18מספרי שלמי ,והפלט שלו הוא הודעה הא הסדרה מסודרת בסדר עולה ממש. בעיה :2כתבו אלגורית ,שהקלט שלו הוא סדרה של מספרי שלמי חיוביי ,המסתיימת ע קליטת הזקי ,0והפלט שלו הוא סדרה שבה מכפלות כל זוגות המספרי הזוגיי הנקלטי זה אחר זה בסמיכות .לדוגמה ,עבור הקלט 3 5 6 4 8 9 4 2 0 :תוצג כפלט הסדרה,24 32 8 : המתקבלת ממכפלת 6ב ,4מכפלת 4ב 8ומכפלת 4ב.2 לפתרו שתי הבעיות יש לעבור על כל זוגות הערכי הסמוכי בסדרה .בבעיה 1יש לבדוק עבור כל זוג ערכי סמוכי א הוא מקיי את היחס של הער $הראשו )משמאל( קט יותר מהער $השני. בבעיה 2יש להציג כפלט את המכפלות של זוגות מספרי סמוכי שאיבריה זוגיי .זה הוא, למעשה ,תיאור של התבנית מעבר על זוגות סמוכים בסדרה. נתבונ בשני האלגוריתמי הבאי לפתרו בעיות 1ו:2 true-ì ordered úà ìçúà .1 1-ì howmany úà ìçúà .2 beforeLast-á íìù øôñî èåì÷ .3 .4 ìë true àåä ordered ìù åëøò íâå howmany < 18 ãåò last-á íìù øôñî èåì÷ .4.1 beforelast ≥ last íà .4.2 false êøòä úà ordered-á íùä .4.2.1 .4.3 úøçà last ìù êøòä úà beforeLast-á íùä .4.3.1 .5 íà ordered "ùîî äìåò øãñá úøãåñî äøãñä" äòãåää úà èìôë âöä .5.1 .6 úøçà "ùîî äìåò øãñá úøãåñî äðéà äøãñä" èìôë âöä .6.1 beforeLast-á íìù øôñî èåì÷ .1 last-á íìù øôñî èåì÷ .2 .3 :òöá last<>0 ãåò ìë הוראת המדעים ,אוניברסיטת תל-אביב -366- מדעי המחשב .3.1 àåä beforeLast íàמספר זוגי íâå àåä lastמספר זוגי éåèéáä ìù êøòä úà èìôë âöä .3.1.1 êøòä úà beforeLast-á íùä .3.2 last-á íìù øôñî èåì÷ .3.3 beforeLast * last éðåáùçä last ìù בפתרו בעיות אלגוריתמיות רבות יש לבצע פעולות על זוגות ערכי הסמוכי בסדרה .עבור סדרת נתוני קלט באור limit $יש בס $הכול limit-1זוגות ערכי סמוכי .למעשה נית להסתכל על כל זוג ערכי סמוכי כאל פריט אחד .הרעיו שבבסיס של שני האלגוריתמי הוא שבכל שלב המשתני beforeLastו lastמכילי איברי זוג סמו .$המעבר לזוג הבא מתבצע כbeforeLast :$ מקבל את ערכו של ) lastכלומר ,האיבר שקוד היה איבר שני בזוג הוא עכשיו איבר ראשו בזוג הסמו ($וב lastנקלט ער $נוס .כ $עד לסיו הקלט. לש המחשה נדגי בתבנית הצגה כפלט של סכו זוגות ערכי סמוכי בסדרה .נית כמוב לבצע פעולות אחרות על ערכי כל זוג ,כגו מנייה ,צבירה ועוד .בהמש $נדגי כמה מהאפשרויות השונות דר $שאלות. נציג את מאפייני התבנית מעבר על זוגות סמוכים בסדרה עבור סדרה שאורכה ידוע מראש. אפשר לערו $התאמות למקרה בו אור $סדרת הקלט אינו ידוע מראש ,כמו בבעיה 2לעיל. ש התבנית :מעבר על זוגות סמוכי בסדרה נקודת מוצא :אור $סדרת נתוני הקלט ,limitערכי הקלט מטרה :הצגה כפלט של סכומי כל זוגות הערכי הסמוכי בסדרת הקלט שאורכה limit אלגורית: beforeLast-á êøò èåì÷ .1 íéîòô limit-1 òöá .2 last-á êøò èåì÷ .2.1 beforeLast + last éðåáùçä éåèéáä ìù êøòä úà èìôë âöä .2.2 last ìù êøòä úà beforeLast-á íùä .2.3 יישו ב:Java ;)(beforeLast = In.readInt )for (i = 1; i <= limit-1; i++ { ;)(last = In.readInt ;)System.out.println(beforeLast + last ;beforeLast = last } הוראת המדעים ,אוניברסיטת תל-אביב -367- מדעי המחשב שימו ♥ :אנו מניחי שבסדרת הקלט לפחות שני ערכי. שאלה 42 ישמו את האלגוריתמי של שתי הבעיות הנתונות בשפת . Java שאלה 43 א .כתבו אלגורית ,שהקלט שלו הוא 25תווי והפלט שלו הוא כל הזוגות הסמוכי בסדרת הקלט שמכילי אותיות קטנות ב abcעוקבות .ישמו את האלגורית בשפת .Java ב .ציינו באילו תבניות נוספות השתמשת בכתיבת האלגורית וכיצד שילבת ביניה. שאלה 44 כתבו אלגורית שהקלט שלו הוא סדרת מספרי שלמי המסתיימת בזקי ,-1והפלט הוא כל המספרי בקלט השווי לסכו שני המספרי הקודמי לה בסדרה )שני המספרי הראשוני לא יודפסו(. למשל ,עבור סדרת הקלט הבאה )משמאל לימי( 4 9 2 11 13 0 13 5 6 89 -1 :יוצגו כפלט המספרי.11 13 13 : ישמו את האלגורית בשפת .Java שאלה 45 כתבו תוכנית בשפת ,Javaשהקלט שלה הוא מספר של וחיובי numוהפלט שלה הוא הודעה הא ספרות המספר מסודרות בסדר עולה ממש. ציינו באילו תבניות נוספות השתמשת בכתיבת התוכנית וכיצד שילבת ביניה. הוראת המדעים ,אוניברסיטת תל-אביב -368- מדעי המחשב פרק – 8יעילות של אלגוריתמי אלגוריתמי נבחני על פי מספר קני מידה .קנה המידה החשוב ביותר הוא נכונות .כלומר השגת המטרה )מת הפלט הנכו( עבור כל קלט חוקי .קנה מידה נוס הוא יעילות. יעילות של אלגורית )תוכנית( נמדדת על פי "משאבי המחשב" הדרושי לביצוע האלגורית. משאבי אלה ה גודל המקו )בזיכרו( והזמ הדרוש לביצוע האלגורית. גודל המקו נמדד ,בעיקר ,על פי מספר המשתני של האלגורית. זמ הביצוע נקבע על פי מספר פעולות היסוד שיתבצעו במהל ביצוע האלגורית. פעולות היסוד ה :פעולת קלט ,פעולת פלט ופעולות חישוב. למעשה ,בצורה פשטנית נאמר שכל הוראה באלגורית כוללת פעולת יסוד אחת ,ומכא ,מדידת זמ הביצוע של אלגורית נעשית על פי מספר ההוראות שיתבצעו במהל ביצוע האלגורית )בזמ הרצתו על המחשב(. שימו ♥ :המדד הוא מספר ההוראות שיתבצעו ולא מספר ההוראות באלגורית! מספר ההוראות באלגורית אינו מעיד בהכרח על מספר ההוראות שיתבצעו במהל ביצוע האלגורית .בפרט ,עבור אלגורית הכולל לולאה ,ייתכ שמספר ההוראות שבו הוא מועט ,א מספר ההוראות שיתבצעו הוא רב ,כי כל הוראה בלולאה יכולה להתבצע כמה פעמי .נפרט נקודה זו במהל הפרק. מדידת זמ הביצוע לא נעשית על פי הזמ בפועל שאורכת ריצת תוכנית המיישמת את האלגורית .יש לכ כמה סיבות: .1ישנ מחשבי מהירי יותר ומהירי פחות .מכיוו שפעולות היסוד נמשכות זמ שונה ממחשב למחשב ,זמ ההרצה בפועל של אותה תוכנית יכול להיות שונה ממחשב למחשב. .2ג א נרי %את התוכנית על אותו מחשב כמה פעמי יתכ שבכל פע ההרצה תיקח פרק זמ שונה ,כתלות בעומס המחשב באותו הזמ .נית לדמות זאת לזמ המתנה במסעדה: זמ ההמתנה קצר יותר כאשר במסעדה פחות אורחי .בדומה ,זמ ההמתנה לסיו ריצת תוכנית קצר יותר כאשר ישנ מעט תוכניות נוספות אשר רצות במקביל על המחשב. .3ג המהדר )הקומפיילר( שבו השתמשנו כדי להדר את התוכנית משפיע על מהירותה של תוכנית .מהדרי שוני מביאי ליצירת תוכניות )בשפת מכונה( שונות ולכל אחת מה זמ ריצה שונה במקצת ,ג א ה מורצות על אותו המחשב ובאותה השעה. הוראת המדעים ,אוניברסיטת תל-אביב -369- מדעי המחשב בפרק זה נתמקד בזמ הביצוע של אלגורית ,ונכיר אלגוריתמי שוני לפתרו אותה הבעיה ,אשר נבדלי זה מזה בזמ הביצוע ,לפעמי בצורה משמעותית .למדד המקו נתייחס בפרק .10 נמחיש את ההבדל בי זמני הביצוע של שני אלגוריתמי שוני באמצעות בעיה שאנו נתקלי בה מדי פע בחיי יו(יו ,והיא ג אחת מבעיות היסוד במדעי המחשב .הבעיה היא בעיית חיפוש ברשימה ממוינת: קלט :רשימה של שמות ממויני לפי סדר הא"ב )למשל ,מדרי טלפוני או ד קשר(. פלט :הודעה מתאימה א ש מסוי מופיע ברשימה. נית לחפש את הש המבוקש בשתי דרכי: הדר הראשונה ,היא על ידי חיפוש סדרתי ,כלומר ,מעבר על פני הרשימה ,ש אחרי ש ,עד שיימצא הש המבוקש ,או עד שיתברר שהש לא מופיע ברשימה .ברשימות ארוכות מאד ,למשל כמו ספר טלפוני ,חיפוש כזה עלול לקחת הרבה מאד זמ. א תיזכרו כיצד את מחפשי בספר טלפוני תיווכחו שלחיפושי ברשימות ארוכות אנו משתמשי בדר כלל בחיפושי לא סדרתיי ,למשל ,החיפוש הלאסדרתי הבא :נתבונ בש המופיע באמצע הרשימה ,ונשווה אותו לש המבוקש ,א השמות זהי – סיימנו את תהלי החיפוש ,אחרת ,נבדוק איפה עלינו להמשי את החיפוש :אחרי הש המבוקש )כלומר ,בחציה השני של הרשימה( או לפניו )בחציה הראשו של הרשימה( .א הש המבוקש מופיע בסדר הא"ב אחרי הש האמצעי נמשי את תהלי החיפוש רק בחצי השני )כיוו שהרשימה ממוינת ,לא ייתכ שיהיה בחצי הראשו( ,וא הש המבוקש מופיע בסדר הא"ב לפני הש האמצעי נמשי את התהלי רק בחצי הראשו .תהלי החיפוש ימשי בדיוק באותו אופ :בדיקת הש האמצעי והשוואתו לש המבוקש ,ובהתא לתוצאת ההשוואה המש חיפוש במחצית התחו המתאימה ,וכ הלאה עד מציאת הש או עד שהסתיי התהלי )והש לא נמצא( .חיפוש זה נקרא חיפוש בינארי ,כיוו שהוא מבוסס על הקטנת תחו החיפוש לחצי מגודלו אחרי כל השוואה של הש המבוקש לש נבחר )האמצעי בתחו החיפוש(. נדגי זאת: לפנינו רשימה ממוינת של מספרי: 1, 3, 5, 6, 7, 9, 12, 13, 15, 19, 20, 24, 25, 27, 31, 35, 36 וברצוננו לחפש בתוכה את המספר .27 בשיטת החיפוש הסדרתי ,דרושות לנו 14פעולות השוואה עד שנמצא את המספר המבוקש )כי 27 נמצא במקו ה( 14ברשימה(. נבדוק מה קורה בשיטת החיפוש הבינארי: ♦ נתבונ במספר האמצעי ברשימה .15 ,כיוו שהמספר המבוקש גדול ממנו ,נמשי את החיפוש מימינו. ♦ כעת אנו מתמקדי ברשימת המספרי.19, 20, 24, 25, 27, 31, 35, 36 : הוראת המדעים ,אוניברסיטת תל-אביב -370- מדעי המחשב ♦ נתבונ במספר האמצעי ברשימה זו) 25 ,למעשה ,אור הרשימה זוגי ולכ שני מספרי נמצאי באמצע הרשימה; בחרנו שרירותית את הקט מביניה( .כיוו שהמספר המבוקש גדול ממנו, נמשי את החיפוש מימינו. ♦ כעת אנו מתמקדי ברשימת המספרי.27, 31, 35, 36 : ♦ נתבונ במספר האמצעי ברשימה זו) 31 ,ג הפע ,זהו למעשה המספר הקט מבי שני המספרי שבאמצע הרשימה( .כיוו שהמספר המבוקש קט ממנו ,נמשי את החיפוש משמאלו. ♦ כעת אנו מתמקדי ברשימת המספרי .27 :זו רשימה בת מספר אחד ,השווה בדיוק למספר המבוקש ,ולכ סיימנו את תהלי החיפוש. בס הכל ביצענו ארבע השוואות )ע המספרי 31 ,25 ,15ו(.(27 בהשוואה לחיפוש הסדרתי ההבדל הוא משמעותי! כאשר רשימת השמות ארוכה ,יש חשיבות רבה לבחירת הדר שתאפשר את ביצוע משימת החיפוש בזמ קצר עד כמה שנית .זמ החיפוש נקבע בעיקר על פי מספר ההשוואות )של הש המבוקש לש נבחר( המתבצעות במהל החיפוש .לכ נעדי לבחור בדר אשר בה יתבצעו פחות השוואות .עבור רשימה ע 1000שמות ,מספר ההשוואות בחיפוש הסדרתי עלול להיות קרוב ל( ,1000כיוו שייתכ שהש המבוקש נמצא בקצה הרשימה .לעומת זאת ,בחיפוש בינארי באותה רשימה מספר ההשוואות לא יעלה ,בכל מקרה ,על 10השוואות .לכ ,עבור בעיית החיפוש הנתונה ,חיפוש בינארי יעיל הרבה יותר .בפרקי הבאי נכיר חיפוש בינארי ביתר פירוט. ישנ אנשי הסוברי שמחשבי הינ כה מהירי עד שאי משמעות למושג "זמ ביצוע של אלגורית )או תוכנית(" ולהשוואה בי זמני הביצוע של אלגוריתמי שוני .לדעה זו אי כל בסיס. קיימות בעיות אשר עבור זמ הריצה של תוכנית יכול להיות דקות רבות ,שעות וא ימי )למשל, תוכניות לחיזוי מזג אויר( .עבור בעיית החיפוש שהצגנו ,זמ הריצה של תוכנית המבצעת חיפוש סדרתי ברשימה בת 10,000,000שמות עלול להיות מספר דקות .לעומת זאת ,זמ הריצה של תוכנית המבצעת חיפוש בינארי באותה רשימה ובאותו המחשב לא יעלה על מספר שניות. כזכור ,זמ הביצוע של אלגורית נמדד על פי מספר ההוראות שיתבצעו במהל ביצוע האלגורית. מספר זה תלוי )בדר כלל( בקלט של האלגורית. למשל ,בבעיית החיפוש ,הקלט לאלגורית הוא רשימת השמות הממוינת והש שיש לחפש .מספר ההוראות שיתבצעו תלוי באור רשימת השמות :ככל שהרשימה תהיה ארוכה יותר ייתכנו יותר השוואות ,כלומר ,יתבצעו יותר פעולות השוואה. בפתרו הבעיה הבאה נראה דוגמה לאלגורית אשר זמ הביצוע שלו תלוי בערכו של הקלט. הוראת המדעים ,אוניברסיטת תל-אביב -371- מדעי המחשב בעיה 1 מטרת הבעיה ופתרונה :הצגת שלושה אלגוריתמי שוני לפתרו בעיה ,הנבדלי זה מזה במידת יעילות )מבחינת זמ ביצוע( .באלגוריתמי היעילי יותר נעשה ניצול טוב של מאפייני קלט(פלט. פתחו אלגורית אשר הקלט שלו הוא מספר של גדול מ( ,1והפלט שלו הוא המחלקי של המספר הנתו .המחלקי של מספר של חיובי ה כל המספרי השלמי החיוביי המחלקי את המספר ללא שארית .לכ למשל ,עבור הקלט 6הפלט הדרוש הוא.1 2 3 6 : ישמו את האלגורית בשפת .Javaתארו את זמ ביצוע האלגורית על ידי הערכת מספר ההוראות שיתבצעו במהל ביצוע האלגורית. בדיקת דוגמאות קלט שאלה 8.1 ציינו מהו הפלט המתאי עבור כל אחד מהקלטי הבאי: א12 . ב29 . ג30 . תחו המספרי השלמי אליו שייכי המחלקי שיש להציג הוא התחו שבי 1לבי המספר הנתו כקלט .כלומר ,כל מחלק הוא שווה ל( 1או גדול מ( ,1והוא קט מהמספר הנתו או שווה לו .יש להציג כל מספר בתחו אשר מחלק את המספר הנתו ללא שארית. ? כיצד נית לחשב את המספרי הדרושי לפלט? הנה רעיו ראשו :נסרוק את תחו המספרי בי 1לבי המספר הנתו ,ונבדוק עבור כל מספר בתחו הא הוא מחלק את המספר הנתו ללא שארית. ננסח זאת ניסוח ראשוני: סריקת כל המספרים החיוביים בין 1ועד למספר הנתון כקלט ,ובדיקה עבור כל מספר האם הוא מחלק את המספר הנתון .אם כן ,הצגתו כפלט. הוראת המדעים ,אוניברסיטת תל-אביב -372- מדעי המחשב ? הרעיו המתואר מציג תת(משימה לביצוע חוזר .מהי תת(משימה זו? הרעיו המתואר כולל ביצוע חוזר של התת(משימה הבאה ,עבור כל מספר בתחו שבי 1למספר הנתו: אם המספר מחלק את המספר הנתון ,הצגתו כפלט. ננסח אלגורית לביטוי הרעיו המתואר. בחירת משתני משתני האלגורית ה: – numמטיפוס של ,לשמירת את נתו הקלט. – iמטיפוס של ,משתנה בקרה של ההוראה לביצוע חוזר. האלגורית אלגורית :1 num-á éáåéç íìù øôñî èåì÷ .1 .2 ìë øåáò íà .2.1 :òöá åì äååù åà num-î ïè÷ä i éáåéç íìù øôñî úéøàù àìì num úà ÷ìçî i .2.1.1 i ìù åëøò úà èìôë âöä שימו ♥ :מתאי להשתמש כא בהוראה לביצוע חוזר ,שמספר הסיבובי בה מחושב מראש )הממומשת בשפת Javaעל ידי לולאת .(forבהוראה אנו מפרטי את תחו הערכי הנסרק באמצעות משתנה הבקרה של הלולאה ).(i באלגורית נעשה שימוש במשתנה הבקרה בגו הלולאה .גו הלולאה כולל בדיקה הא ערכו של משתנה הבקרה ,i ,הוא מחלק של .numכיוו שבמהל ביצוע הלולאה ערכי משתנה הבקרה משתני מ( 1עד ,numהרי בדיקת החלוקה מתבצעת עבור כל מספר של בתחו 1עד .num הוראת המדעים ,אוניברסיטת תל-אביב -373- מדעי המחשב יישו האלגורית הנה התוכנית המיישמת את אלגורית :1 */ קלט :מספר שלם חיובי פלט :כל המחלקים של המספר הנתון */ public class Divisors_1 { )public static void main (String [] args { המספר הנתון // ;int num משתנה הבקרה // ;int i ;)"num = In.readInt("Insert a number Please ;) " System.out.println( "The divisors of " + num + " are )for(i = 1; i <= num ; i++ { )if (num % i == 0 { ;)System.out.println(i } // if } // for } // main } // Divisors_1 ניגש עתה לחישוב זמ ביצוע האלגורית על ידי הערכת מספר ההוראות שיתבצעו במהל הביצוע. כדי לבצע את ההערכה נתמקד במרכיב העיקרי באלגורית המשפיע על מספר ההוראות שיתבצעו. ? מהו המרכיב העיקרי באלגורית המעיד על מספר ההוראות שיתבצעו? באלגורית אשר אינו כולל הוראה לביצוע חוזר )לולאה( אי בעצ מרכיב בולט .מספר ההוראות שיתבצעו במהל ביצוע האלגורית הוא לכל היותר כמספר ההוראות באלגורית .לעומת זאת, באלגורית הכולל לולאה ,הוראה זו היא המרכיב העיקרי המעיד על מספר ההוראות שיתבצעו .זאת כיוו שייתכ שהלולאה תתבצע מספר רב של פעמי ,ובכל ביצוע חוזר יתבצעו שוב כל ההוראות שבגו הלולאה. מכיוו שייתכ שהלולאה תתבצע מספר רב של פעמי ,הרי מספר ההוראות שיתבצעו במהל ביצוע האלגורית עשוי להיות גדול בהרבה ממספר ההוראות שכתובות באלגורית .למשל במהל ביצוע הוראת המדעים ,אוניברסיטת תל-אביב -374- מדעי המחשב אלגורית 1עבור הקלט ,1000תתבצע ההוראה לביצוע בתנאי שבגו הלולאה 1000פעמי .מספר זה גדול בהרבה ממספר ההוראות שבאלגורית. בדר כלל הלולאה תתבצע מספר שונה של פעמי עבור קלטי שוני .לכ ,כדי לתאר בצורה כללית את מספר הפעמי שלולאה תתבצע ,יש לבטא מספר זה על פי הקלט. ? מהו מספר הפעמי שתתבצע הלולאה באלגורית 1עבור קלט שערכו ? N מספר הפעמי שהלולאה באלגורית 1יתבצע עבור קלט שערכו Nהוא .Nהלולאה תתבצע פע אחת עבור כל אחד מהערכי N ,... ,3 ,2 ,1של משתנה הבקרה . i כיוו שלולאה היא המרכיב העיקרי באלגורית המעיד על מספר הפעולות שיתבצעו ,נהוג להתייחס למספר הפעמי שהלולאה תתבצע כמדד לחישוב זמ הביצוע .לכ ,נאמר שתוצאת חישוב זמ הביצוע של אלגורית 1היא שלולאת האלגורית תתבצע Nפעמי עבור קלט שערכו .N ננסה לראות א ביכולתנו לפתח אלגורית יעיל יותר מאלגורית 1מבחינת זמ הביצוע. ? הא נית לפתח אלגורית שבו תהיה לולאה שתתבצע פחות מ( Nפעמי עבור קלט שערכו ? N כ .נית לפתח אלגורית ובו לולאה "יעילה" יותר .נראה זאת כעת. אחד המאפייני של חלוקה בי מספרי שלמי היא שהמחלקי של מספר של חיובי numאינ גדולי מ( ,num/2מלבד המספר numעצמו .נית לראות זאת בדוגמאות הקלט שנבדקו בשאלה .8.1 לכ ,בעצ ,נית להרי %את משתנה הבקרה בלולאה שבאלגורית רק עד ל( .num/2נבטא רעיו זה באלגורית ,2שהוא אלגורית יעיל יותר לפתרו הבעיה. אלגורית :2 num-á éáåéç íìù øôñî èåì÷ .1 .2 ìë øåáò íà .2.1 :òöá åì äååù åà num/2-î ïè÷ä i éáåéç íìù øôñî úéøàù àìì num úà ÷ìçî i .2.1.1 i ìù åëøò úà èìôë âöä num ìù åëøò úà èìôë âöä .3 אמנ ,הוצאנו את הצגתו כפלט של numאל מחו %ללולאה ,א עיקר העבודה נעשית בלולאה. באלגורית ,2תתבצע הלולאה רק N/2פעמי עבור קלט שערכו .Nזהו שיפור משמעותי ,במיוחד עבור קלטי שערכ גדול )למשל .(10,000 הוראת המדעים ,אוניברסיטת תל-אביב -375- מדעי המחשב התוכנית ליישו אלגורית 2תהיה: */ קלט :מספר שלם חיובי פלט :כל המחלקים של המספר הנתון */ Divisors_2 public class { )public static void main (String [] args { המספר הנתון // ;int num משתנה הבקרה // ;int i ;)"num = In.readInt("Insert a number Please ;) " System.out.println( "The divisors of " + num + " are )for(i = 1; i <= num / 2 ; i++ { )if (num % i == 0 { ;)System.out.println(i } // if } // for ;)System.out.println(num } // main } // Divisors_2 שיפרנו את הפתרו הראשו .הא נוכל להמשי ולשפר ג את הפתרו השני? ? הא נית לפתח אלגורית שבו תהיה לולאה שתתבצע פחות מ( N/2פעמי עבור קלט שערכו ? N כ .נית לפתח אלגורית ובו לולאה "יעילה" יותר. לכל מספר של kשהוא מחלק של ,numיש "ב(זוג" של ,num/kשג מחלק את ) .numשהרי .(num = k⋅num/kא באלגורית ,עבור כל מחלק kשנמצא ,נציג כפלט ג את ,num/kלא נצטר לעבור על כל המחלקי של ,numאלא רק עד מחצית )שהרי הצגנו כבר את "בני(הזוג"(. ? היכ נמצא קו המחצית של המחלקי? כלומר ,מתי עלינו להפסיק את החיפוש כדי לא להציג מחלקי כפולי? הוראת המדעים ,אוניברסיטת תל-אביב -376- מדעי המחשב התשובה היא . numזה נובע מהאבחנה הבאה :עבור כל זוג מחלקי kו( ,num/kלפחות אחד מה אינו גדול מ( . numמדוע? משו שא שניה גדולי מ( , numאז מכפלת גדולה מ( .!numא כ ,עבור כל מספר ,numא נסרוק את כל המספרי מ( 1עד , numונציג כפלט עבור כל מחלק ג את "ב(זוגו" המחלק ,למעשה נציג את כל המחלקי של .num ? מהו ב זוגו של ? num זהו , numמשו שמכפלתו של numבעצמו שווה ל(.num לכ ,משו שב(זוגו של num הוא num עצמו ,עלינו לשי לב לא להציג את numפעמיי כפלט. לדוגמה :א num = 100אז . num = 10כל מחלקיו של 100הקטני מ( 10ה ,4 ,2 :ו(" .5בני זוג" ה 25 ,50 :ו( ,20בהתאמה .א נוסי לה את num = 10 נקבל את הרשימה המלאה של כל המחלקי של .100 לכ ,בעצ ,נית להרי %את משתנה הבקרה בלולאה שבאלגורית עד ל( num בלבד .נבטא רעיו זה באלגורית ,3שהוא אלגורית יעיל יותר משני האלגוריתמי האחרי. אלגורית :3 num-á éáåéç íìù øôñî èåì÷ .1 .2 ìë øåáò íà .2.1 .3 íà num num -î ïè÷ä i éáåéç íìù øôñî :òöá úéøàù àìì num úà ÷ìçî i .2.1.1 i ìù åëøò úà èìôë âöä .2.1.2 num/i ìù åëøò úà èìôë âöä úéøàù àìì num úà ÷ìçî num ìù åëøò úà èìôë âöä .3.1 כאמור ,הוצאנו מחו %ללולאה את הבדיקה של , numכדי שלא נציג את ערכו פעמיי כפלט במקרה שהוא מחלק את .numלעומת זאת ,אי צור לטפל מחו %בלולאה ב( numעצמו ,כמו באלגורית הקוד ,משו שהוא ב הזוג של ,1ולכ יוצג כפלט בסיבוב הראשו בלולאה. הוראת המדעים ,אוניברסיטת תל-אביב -377- מדעי המחשב כעת ביצענו שיפור משמעותי יותר מאלגורית .2עבור קלטי גדולי מאד המספר N קט משמעותית מהמספר .N/2למשל ,א Nהוא ,10,000באלגורית 2יהיו 5000סיבובי בלולאה, בעוד שבאלגורית 3יהיו 100סיבובי בלבד! נסו לייש בעצמכ את האלגורית בשפת .Java סוף פתרון בעיה 1 נסכ את הנלמד מפתרו בעיה :1 ♦ באלגורית שאינו כולל לולאה מספר הפעולות שיתבצעו הוא לכל היותר כמספר ההוראות באלגורית. ♦ באלגורית שכולל לולאה ,מספר ההוראות שיתבצעו עשוי להיות גדול בהרבה ממספר הוראות האלגורית .מספר ההוראות שיתבצעו תלוי במספר הפעמי שהלולאה תתבצע .לכ ,מספר הפעמי שהלולאה תתבצע משמש כמדד לזמ ביצוע האלגורית. ♦ מספר הפעמי שהלולאה תתבצע תלוי )בדר כלל( בערכו של הקלט ,ומבוטא על פי ערכו. בפתרו בעיה 1פיתחנו תחילה אלגורית אחד ,ואחר כ פיתחנו אלגורית שני ,אשר היה יעיל יותר מבחינת מספר הפעמי של ביצוע הלולאה ,כלומר ,מבחינת זמ הביצוע ,ולבסו מצאנו אלגורית יעיל יותר ג ממנו .בפיתוח האלגורית השני ניצלנו את המאפיי שאיברי הפלט ,הלא ה כל המחלקי של נתו הקלט ,Nאינ גדולי מ( ,N/2מלבד Nעצמו .בפיתוח האלגורית השלישי, היעיל מבי השלושה ,ניצלנו את המאפיי שאיברי הפלט ,פרט ל( Nעצמו ,ניתני לחלוקה לזוגות כ שמכפלת איברי כל זוג שווה ל( Nובכל זוג איבר אחד קט מ( . Nהמאפיי האחרו איפשר לנו לכתוב לולאה אשר תתבצע N פעמי בלבד ,במקו הלולאה המקורית שמתבצעת Nפעמי. ♦ פיתוח אלגורית יעיל יותר נעשה תו ניתוח וניצול טוב של מאפייני קלט(פלט .שימוש טוב במאפייני קלט(פלט חשוב לפיתוח לולאה אשר תתבצע מספר מועט ככל האפשר של פעמי. כלומר ,השקעת מאמ %בניתוח מעמיק של הבעיה יכולה להתבטא אחר כ באלגורית שהוא משמעותית יעיל יותר. ♦ במהל פתרו בעיה אלגוריתמית נשתדל לפתח אלגורית יעיל ככל האפשר מבחינת זמ הביצוע. כלומר ,אלגורית שהלולאות שבו יתבצעו מספר פעמי מועט )לולאות "יעילות"( עד כמה שנית. הוראת המדעים ,אוניברסיטת תל-אביב -378- מדעי המחשב שאלה 8.2 ציינו עבור כל אחד מהקלטי הבאי את מספר הפעמי שתתבצע הלולאה ,בכל אחד משלושת האלגוריתמי שפיתחנו: א1000 . ב2000 . שאלה 8.3 בקטע התוכנית הבא מחושבת המכפלה של שני נתוני קלט חיוביי שלמי ,תו שימוש בפעולת חיבור בלבד: ;)"x = In.readInt("Insert an integer number ;)"y = In.readInt("Insert another one ;sum = 0 )for(i = 1; i <= x ; i++ { ;sum = sum + y } ;)System.out.println( "The product is " + sum ידוע שאחד מנתוני הקלט גדול באופ משמעותי מהשני ,א לא ידוע א זה הנתו הראשו או השני. השתמשו במאפיי זה של הקלט כדי לשנות את קטע התוכנית הנתו כ שיהיה יעיל ככל שנית. הדרכה :שימו לב שיש חשיבות לבחירת המשתנה אשר על פיו נקבע מספר הפעמי שתתבצע הלולאה. מהו מספר הפעמי שתתבצע הלולאה של קטע התוכנית הנתו ,ומהו מספר הפעמי שתתבצע הלולאה של קטע התוכנית החדש? שאלה 8.4 פתחו אלגורית )מבלי ליישמו( יעיל ככל האפשר אשר הקלט שלו הוא שני מספרי שלמי גדולי מ( 1שאינ מחלקי זה את זה ,והפלט שלו הוא כל המספרי השלמי החיוביי המחלקי את שני מספרי הקלט .תארו ,על פי ערכו של הקלט ,את מספר הפעמי שתתבצע לולאת האלגורית. שאלה ) 8.5מתקדמת( נניח שבבעיה 1הפלט הדרוש הוא כל המספרי השלמי החיובי שאינ מחלקי את נתו הקלט .N מה יהיה מספר הפעמי של ביצוע הלולאה באלגורית לפתרו הבעיה החדשה? הוראת המדעים ,אוניברסיטת תל-אביב -379- מדעי המחשב שאלה 8.6 יש לפתח אלגורית אשר הקלט שלו הוא מספר של חיובי ,Nוהפלט שלו הוא כל המספרי )השלמי החיוביי( אשר קטני מ( ,Nוהשורש שלה הוא מספר של. למשל ,עבור הקלט 50הפלט יהיה .1 4 9 16 25 36 49 האלגורית הבא ,הכולל משתני מטיפוס של הוא פתרו אפשרי: num-á éáåéç íìù øôñî èåì÷ .1 .2 ìë øåáò íà .2.1 :òöá num-î ïè÷ù i éáåéç íìù øôñî íìù øôñî àåä i ìù ùøåùä .2.1.1 i ìù åëøò úà èìôë âöä א .מהו מספר הפעמי שתתבצע הלולאה של האלגורית הנתו? ב .ישמו על ידי ביטוי בוליאני בשפת Javaאת התנאי "השורש של iהוא מספר של" ג .נית לכתוב אלגורית אשר זמ הביצוע שלו יהיה קצר בהרבה מהאלגורית הנתו ,וזאת על ידי "ייצור" מספרי הפלט ,באמצעות העלאה בריבוע של כל המספרי השלמי אשר ריבוע קט מ הקלט. האלגורית החלקי הבא מבוסס על הרעיו המתואר: num-á éáåéç íìù øôñî èåì÷ .1 ìë øåáò .1.1 .1.1.1 :òöá ___________-î ïè÷ä i éáåéç íìù øôñî i2 ìù åëøò úà èìôë âöä השלימו את האלגורית ,ותארו את מספר הפעמי שתתבצע הלולאה של אלגורית זה. כל האלגוריתמי שניתחנו עד עתה בפרק כללו לולאה שמספר הביצועי שלה מחושב מראש ובה הור %משתנה הבקרה מ( 1עד ער כלשהו בקפיצות של .1לכ קל היה לחשב את מספר הפעמי של ביצוע הלולאה. בלולאות מורכבות יותר ,בה ערכו ההתחלתי של משתנה הבקרה אינו ,1והשינוי בערכו בי סיבוב לסיבוב הוא לאו דווקא ,1חישוב מספר הסיבובי עלול להיות מסוב יותר .בלולאת ,whileשבה אי משתנה בקרה ,חישוב זמ הביצוע יכול להיות א מורכב יותר .יש לספור את מספר הפעמי של ביצוע הלולאה תו מעקב אחר שינוי ערכי משתני ,המעודכני בגו הלולאה ומופיעי בתנאי הכניסה ללולאה. הוראת המדעים ,אוניברסיטת תל-אביב -380- מדעי המחשב שאלה 8.7 יש לפתח ולייש אלגורית אשר הקלט שלו הוא שני מספרי שלמי חיוביי ,כ שהמספר השני גדול מהראשו .הפלט הדרוש הוא הכפולות של המספר הראשו אשר קטנות מהמספר השני או שוות לו .למשל ,עבור הקלט ,200 1000יהיה הפלט .200 400 600 800 1000 משפטי התוכנית הבאי ה יישו של אלגורית לפתרו הבעיה: ;)"x = In.readInt("Insert an integer number ;)"y = In.readInt("Insert another one ;i = x )for (i = x; i <= y; i++ { )if (i % x == 0 { ;)System.out.println(i } // if } // for א .כמה פעמי תתבצע הלולאה עבור הקלט ?200 1000 ב .תארו בצורה כללית את מספר הפעמי שתתבצע הלולאה ,על פי ערכי נתוני הקלט xו(.y ג .בפתרו המוצג iגדל בקפיצות של .1נית לשפר את יעילות הפתרו הנתו ,תו שינוי הקפיצות של iלקפיצות גדולות מ( ,1קפיצות אשר מתאימות למרחק בי זוג מספרי פלט עוקבי )שימו לב שהמרחק בי כל זוג מספרי פלט עוקבי הוא אחיד( .כתבו פתרו יעיל יותר המבוסס על הרעיו המתואר ,ותארו את מספר הפעמי שתתבצע לולאת הפתרו החדש. שאלה 8.8 נתונה לולאת forהבאה: )for (i = 1 ; i <= 30000 ; i++ { )if (i % 500 == 0 { ;)System.out.println(i } // if } // for א .מהו מספר הפעמי שתתבצע הלולאה? ב .מהי מטרת הלולאה? ג .כתבו לולאה יעילה הרבה יותר להשגת אותה המטרה .מהו מספר הפעמי שתתבצע הלולאה היעילה שכתבת? פי כמה מספר זה קט מתשובתכ בסעי א'? הוראת המדעים ,אוניברסיטת תל-אביב -381- מדעי המחשב סיכום בפרקי הקודמי בחנו אלגוריתמי על פי קנה המידה נכונות .בפרק זה הכרנו קנה מידה חדש – יעילות. יעילות של אלגורית נמדדת על פי "משאבי המחשב" הדרושי לביצוע האלגורית .משאבי אלה ה גודל המקו בזיכרו והזמ הדרוש לביצוע. גודל המקו ,נמדד בעיקר על פי מספר המשתני של האלגורית. זמ הביצוע נקבע לפי מספר פעולות היסוד שיתבצעו במהל ביצוע האלגורית. פעולות היסוד ה :פעולות קלט ,פעולות פלט ופעולות חישוב .בצורה פשטנית נית לומר ,שכל הוראה באלגורית כוללת פעולת יסוד אחת ,ומכא – מדידת זמ הביצוע של אלגורית נעשית על פי מספר ההוראות שיתבצעו במהל ביצוע האלגורית )בזמ הריצה(. באלגורית אשר אינו כולל לולאה מספר ההוראות שיתבצעו במהל הביצוע הוא לכל היותר כמספר ההוראות באלגורית. לעומת זאת ,באלגורית הכולל לולאה ,מספר ההוראות שיתבצעו במהל הביצוע אינו נקבע על פי מספר ההוראות באלגורית ,אלא על פי מספר הפעמי שהלולאה תתבצע .מספר זה יכול להיות תלוי בקלט של האלגורית ולכ הוא מבוטא על פי הקלט. כאשר נתוני שני אלגוריתמי שוני לפתרו בעיה ,משווי את יעילות מבחינת זמ הביצוע על פי מספר פעמי שהלולאות שבה יתבצעו במהל ביצוע כל אלגורית. בפיתוח אלגורית נשתדל לבחור לולאות שיתבצעו מספר פעמי מועט עד כמה שנית ,כלומר לולאות "יעילות" ככל האפשר .בחירת לולאה יעילה נעשית תו ניתוח וניצול טוב של מאפייני הקשר בי הקלט לפלט. הוראת המדעים ,אוניברסיטת תל-אביב -382- מדעי המחשב פרק – 9המחלקה מחרוזת ) (Stringומבוא לעצמי בתוכניות שכתבנו עד כה השתמשנו בטיפוסי שוני המוגדרי בשפת :Javaשל ,ממשי ,תווי ובוליאני .יכולנו להגדיר משתני מטיפוסי אלו ,ולבצע עליה פעולות שונות )קלט ,פלט ,חישובי וכו'( .ע זאת ,מרבית התוכניות שכתבנו התייחסו ג למחרוזות ,סדרות של תווי .עד עתה השתמשנו במחרוזות כאשר רצינו להדפיס הודעות למשתמש ותחמנו אות במירכאות ,למשל ,בהוראה: ;)"System.out.println("Please insert two numbers ההודעה " "Please insert two numbersהיא מחרוזת. הנה דוגמאות נוספות למחרוזות בשפת :Java "?"" ,"J" ,"453" ,"Hello, How Are You )האחרונה היא מחרוזת ריקה ,שאינה מכילה א תו(. לעיתי נוח להתייחס למחרוזות במפורש ולבצע עליה פעולות נוספות ,פרט להדפסה .בפרק זה נראה כיצד נית לקלוט מחרוזות מהמשתמש ,לשמור אות ,ולבצע עיבודי על מחרוזות .א עד עתה יכולנו לקלוט מספרי או תווי בודדי בלבד ,עכשיו נוכל לבקש מהמשתמש להקיש את שמו ,כתובתו וכדומה ,ולבצע פעולות שונות על המחרוזות הנקלטות .דר! ההיכרות ע מחרוזות נערו! ג היכרות ראשונית ע מחלקות ועצמי. 9.1היכרות ראשונית עם המחלקה String בשפת Javaלא מוגדר טיפוס פשוט עבור מחרוזות ,בדומה לטיפוסי אחרי שראינו .אבל ,בשפת Javaמוגדרת המחלקה ,Stringובה נוכל להיעזר כאשר נרצה להשתמש במחרוזות. למעשה ,נית להתייחס אל מחלקה כאל טיפוס חדש בשפה ,המאפשר הצהרה ושימוש במשתני מטיפוס זה .למשל ,א Stringהיא מחלקה בשפה ,אפשר לכתוב: ;String s1, s2 בדומה להצהרה על משתני מטיפוס רגיל )למשל ,של או תווי(. נהוג לקרוא למשתני של טיפוסי חדשי כאלה מופעי של המחלקה Stringאו עצמי של המחלקה .Stringכפי שנראה מיד ,השימוש בעצמי שונה מעט משימוש במשתני רגילי .בפרק זה נכיר ,בעזרת המחלקה ,Stringמושגי בסיסיי הקשורי לשימוש במחלקות ובעצמי .ביחידת ההמש! )"יסודות מדעי המחשב ("2תלמדו כיצד להגדיר בעצמכ מחלקות חדשות. הוראת המדעים ,אוניברסיטת תל-אביב -383- מדעי המחשב אמנ ,הצהרה על עצמי דומה להצהרה על משתני מטיפוסי רגילי .אבל ,שלא כמו עבור משתני מטיפוסי רגילי ,בדר! כלל הצהרה על עצ חדש אינה מספיקה! עלינו להקצות מקו חדש בזיכרו עבור עצ זה .עבור משתני רגילי ,הקצאת המקו בזיכרו נעשית אוטומטית ע ההצהרה עליה .אי זה כ! עבור עצמי .בהמש! הפרק נראה כיצד מבוצעת הקצאת שטח עבור עצמי. בשפת Javaמחרוזת היא עצ ,כלומר ,מופע של המחלקה ) (classמחרוזת .נית להצהיר על מחרוזות בדומה להצהרת משתני רגילי. כדי שנית יהיה להשתמש בעצ מהמחלקה מחרוזת ,יש להקצות עבורו שטח זיכרו. בעיה 1 מטרת הבעיה ופתרונה :הצגת שימוש בסיסי במחלקה מחרוזת. פתחו ויישמו אלגורית שיקבל כקלט את שמכ ,וידפיס על המס! את המחרוזת Your name is ומיד אחריה את הש שנקלט. בחירת משתני ? באיזה טיפוס נשתמש כדי לשמור את הש שנקלט? כיוו שעלינו לקלוט מילה ,נשתמש במחלקה מחרוזת .א כ! ,רשימת המשתני תכלול את העצ nameמהמחלקה מחרוזת. האלגורית: name-ì úæåøçî èåì÷ .1 "Your name is " èìôë âöä .2 name úà èìôë âöä .3 יישו האלגורית עד כה ראינו כיצד לקלוט ערכי של טיפוסי פשוטי – שלמי ,ממשיי ותווי .ביצוע קלט של מחרוזת נעשה בצורה דומה .את הוראה 1נוכל לממש על ידי המשפט: ;)(name = In.readString בדומה להוראות קלט אחרות בה השתמשנו ,א נרצה לצר הנחיה למשתמש לגבי מהות הקלט לו מצפה התוכנית ,נכתוב את ההודעה המתאימה בתו! הסוגריי. הוראת המדעים ,אוניברסיטת תל-אביב -384- מדעי המחשב שימו ♥ :כמו הוראות קלט של ערכי מטיפוסי פשוטי ,ג הוראת קלט של מחרוזת היא למעשה הוראת השמה .בעת ביצוע ההוראה ;)( name = In.readStringנקראת מחרוזת מהקלט ,ונוצר עצ חדש מהמחלקה מחרוזת ,שהוקצה עבורו מקו בזיכרו כחלק מפעולת הקלט .עצ זה שומר את מחרוזת הקלט .הפעולה ,In.readStringמחזירה הפניה לשטח הזיכרו החדש שהוקצה .בעקבות ההשמה מפנה nameאל אותו שטח זיכרו ,ודר! nameנית להגיע אל אותו שטח ולבצע עליו פעולות שונות .בהמש! הפרק נעמיק בהשמה של מחרוזות. משו שפעולת קליטת מחרוזת מבצעת הקצאת שטח בזיכרו עבור המחרוזת הנקלטת אי צור! במקרה זה להקצות שטח זיכרו עבור מחרוזת זו ע הצהרתה. התוכנית המלאה */ קלט :שם ,הנקלט כמחרוזת פלט :השם ,מלווה בהודעה מקדימה */ public class YourName { )public static void main (String [] args { הצהרה על עצם מהמחלקה מחרוזת // ;String name הוראת קלט +הקצאת מקום בזיכרון // ;)"name = In.readString("Insert your name פלט // ;)System.out.println("your name is: " + name } // main } // class YourName סוף פתרון בעיה 1 נית לבצע קלט של מחרוזת באמצעות הפעולה .In.readString נית להעביר לפעולת הקלט מחרוזת שתנחה את המשתמש לגבי הקלט שהוא מתבקש לתת. פעולת הקלט מקצה שטח עבור המחרוזת החדשה. הוראת המדעים ,אוניברסיטת תל-אביב -385- מדעי המחשב 9.2ביצוע פעולות על מחרוזות כש שעל ערכי ומשתני של טיפוסי פשוטי ,כגו charו( ,intאפשר לבצע פעולות שונות )למשל ,פעולות חשבוניות או פעולות השוואה( ,נרצה לבצע פעולות שונות ג על מופעי של מחלקות, הטיפוסי החדשי בשפה .כאשר מוגדרת מחלקה בשפה ,מוגדרות איתה ג פעולות שנית לבצע על עצמי של המחלקה. כדי לבצע פעולה של מחלקה על עצ מהמחלקה יש לכתוב ראשית את שמו ,אחריו את הסימ נקודה, ולאחר מכ את ש הפעולה לביצוע .למשל ,אחת מהפעולות המוגדרות עבור המחלקה מחרוזת היא הפעולה ,lengthהמחשבת את אורכה של מחרוזת מסוימת .א s1הוא עצ של המחלקה מחרוזת, אז הביטוי )( s1.lengthמפעיל את הפעולה lengthעל העצ s1ומחזיר את תוצאת ההפעלה, כלומר את אורכה של המחרוזת .s1בכל הפעלה של פעולה של המחלקה מחרוזת נשתמש בסימו הנקודה ,כדי לציי את העצ שעליו היא מופעלת. הסוגריי שאחרי ש הפעולה נועדו להעברת ערכי )פרמטרי( לה נזקקת הפעולה .במקרה של הפעולה lengthאי צור! בהעברת ער! ,ולכ הסוגריי נותרי ריקי .בהמש! הפרק נכיר פעולות נוספות ,אשר מצפות לקבל ערכי מסוימי לצור! הפעלת. בעיה 2 מטרת הבעיה ופתרונה :הדגמת השימוש בפעולות על מחרוזות .הכרת הפעולות lengthו( .charAt פתחו ויישמו אלגורית אשר יקבל כקלט מחרוזת .א אור! המחרוזת הוא זוגי יוצג כפלט התו הראשו במחרוזת ,וא אור! המחרוזת הוא אי(זוגי יוצג התו האחרו במחרוזת. למשל ,עבור הקלט shalomיוצג התו .'s' :ועבור הקלט dogיוצג התו.'g' : שימו ♥ :בשפת Javaמיקו התווי במחרוזת מתחיל מ( .0כלומר ,התו הראשו במחרוזת נמצא במקו ,0התו השני במחרוזת הוא במקו ,1השלישי במקו ,2וכ הלאה. ? א התו הראשו נמצא במקו ,0באיזה מקו נמצא התו האחרו? נתבונ למשל במחרוזת " "abcdשאורכה .4התו האחרו בה הוא ' 'dוהוא נמצא במקו .3 מיקו התווי במחרוזת מתחיל מ(.0 בכל מחרוזת ,א נסמ את אור! המחרוזת ב( ,lenאז התו האחרו במחרוזת נמצא במקו .len −1 הוראת המדעים ,אוניברסיטת תל-אביב -386- מדעי המחשב בחירת משתני נשתמש במשתני הבאי: – strעצ מהמחלקה מחרוזת – letterהאות המבוקשת ,מטיפוס char – lenלשמירת אור! המחרוזת ,מטיפוס של האלגורית str-ì úæåøçî èåì÷ .1 len-á str úæåøçîä ìù äëøåà úà íùä .2 .3 íà éâåæ len str-á 0 íå÷îá àöîðä åúä úà letter-á íùä 3.1 .4 úøçà str-á len−1 íå÷îá àöîðä åúä úà letter-á íùä 4.1 letter ìù åëøò úà èìôë âöä .5 יישו האלגורית ? כדי לבדוק את אורכה של המחרוזת נשתמש בפעולה ,lengthבאיזו פעולה נשתמש כדי לדעת מהו התו שנמצא במקו מסוי במחרוזת? במחלקה מחרוזת מוגדרות פעולות נוספות ואחת מה היא הפעולה ) .charAt(kפעולה זו מקבלת כפרמטר )בתו! הסוגריי( מספר של ,kומחזירה את התו שנמצא במקו ה( kבמחרוזת עבורה הופעלה .לכ ,למשל ,כדי לדעת מהו התו שנמצא במקו 0 במחרוזת strנכתוב ).str.charAt(0 התוכנית המלאה */ קלט :מחרוזת פלט :התו הראשון או האחרון במחרוזת ,בהתאם לאורכה )זוגי או אי-זוגי( */ public class IsEven { )public static void main (String[] args { ;String str ;int len ;char letter הוראת המדעים ,אוניברסיטת תל-אביב -387- מדעי המחשב ;)"str = In.readString("Insert a string please ;)(len = str.length )if (len % 2 == 0 { ;)letter = str.charAt(0 } else { ;)letter = str.charAt(len - 1 } ;)System.out.println("The letter is " + letter } // main } // class IsEven סוף פתרון בעיה 2 בסו הפרק תוכלו למצוא טבלה המפרטת את הפעולות השכיחות המוגדרות ב( Javaעבור עצמי מהמחלקה .String העמודה הימנית בטבלה מתארת את ש הפעולה ואת רשימת הפרמטרי שהיא מצפה לקבל )בתו! סוגריי( .כפי שראינו זה עתה ,הפעולה הראשונה בטבלה ,length ,אינה מצפה לקבל ער! כלשהו, ולכ הסוגריי ריקי .לעומתה ,הפעולה השנייה ,charAt ,מצפה לקבל פרמטר אחד מטיפוס של, והפעולה השלישית indexOf ,מצפה לקבל עצ מהמחלקה מחרוזת ,או תו. העמודה השלישית מתארת את טיפוס הער! המוחזר כתוצאת הפעולה .בדומה לפעולות המתמטיות שלמדנו בפרק ,4ג כא יש לשי לב לטיפוס הער! המוחזר ולוודא התאמה בינו לבי הפעולות המבוצעות עליו .למשל ,א נבצע השמה של ער! מוחזר מפעולה על מחרוזת לתו! משתנה ,עלינו לוודא התאמה בי טיפוס הער! המוחזר לטיפוס המשתנה אליו מתבצעת ההשמה. חלק מהגדרת המחלקה מחרוזת כוללת הגדרה של פעולות הניתנות לביצוע על מחרוזת. הפעלת פעולה של המחלקה מחרוזת על עצ מהמחלקה מחרוזת נכתבת כ!: )פרמטרי(ש הפעולה.ש העצ יש לבדוק היטב בתיאור הפעולה אילו ערכי היא מצפה לקבל ומה טיפוס הער! שהיא מחזירה. הוראת המדעים ,אוניברסיטת תל-אביב -388- מדעי המחשב בעיה 3 מטרת הבעיה ופתרונה :הדגמת השימוש בפעולת השוואת מחרוזת של המחלקה ,Stringושילוב מחרוזות בתבנית מנייה. פתחו ויישמו אלגורית אשר הקלט שלו הוא רשימת מחרוזות שמסתיימת במחרוזת ""STOP )זקי ( ,והפלט הוא מספר המחרוזות ברשימה. למשל ,עבור הקלט "abc", "dog", "shalom", "people", "STOP" :הפלט המתאי הוא .4 פירוק הבעיה לתתמשימות למעשה ,האלגורית צרי! לבצע מנייה ,בדומה לאלגוריתמי אחרי שפיתחנו בפרקי אחרי .לכ, נית פשוט לכתוב את רשימת התת(משימות הבאה: .1מניית מספר המחרוזות שבקלט .2הצגה כפלט של מספר המחרוזות שנמנו תת(משימה 1תבוצע בדומה למשימות מנייה אחרות ,ההבדל הוא כמוב בטיפוס הערכי הנמני – מחרוזת במקרה זה – ובאופ ביצוע הפעולות עליה .בשלב יישו האלגורית נראה כיצד לעשות זאת. בחירת משתני – strהמחרוזת התורנית מהקלט ,עצ מהמחלקה מחרוזת – counterלמניית מספר המחרוזות ,מטיפוס של האלגורית 0-ì counter úà ìçúà .1 str-ì úæåøçî èåì÷ .2 .3 ãåò ìë ":òöá str ≠"STOP 1-á counter ìù åëøò úà ìãâä .3.1 str-ì úæåøçî èåì÷ .3.2 counter ìù åëøò úà èìôë âöä .4 הוראת המדעים ,אוניברסיטת תל-אביב -389- מדעי המחשב יישו האלגורית ? כיצד נבדוק הא המחרוזת הנקלטת שווה למחרוזת "?"STOP הפעולה equalsבודקת הא שתי מחרוזות שוות זו לזו .נשתמש בה ,כפי שמתואר בטבלה שבסו הפרק. התוכנית המלאה */ קלט :רשימת מחרוזות המסתיימת בזקיף פלט :מספר המחרוזות ברשימה */ public class HowManyStrings { )public static void main (String[] args { הגדרת משתנים ואתחולם // ;String str ;int counter = 0 לולאת זקיף // ;)"str = In.readString("Insert a string please כל עוד המחרוזת strשונה מwhile (! str.equals("STOP")) //"STOP"- { ;counter++ ;)"str = In.readString("Insert another string please } // while ;)" System.out.println(counter + " Strings } // main } // class HowManyStrings שימו ♥ :כפי שהסברנו קוד ,הוראת הקלט של מחרוזת מקצה בכל פע מקו בזיכרו עבור המחרוזת החדשה .לכ למעשה ,העצ strמפנה בכל פע אל מקו אחר בזיכרו ,משו שבכל פע ההשמה המתבצעת אליו מתייחסת לשטח זיכרו אחר. סוף פתרון בעיה 3 הוראת המדעים ,אוניברסיטת תל-אביב -390- מדעי המחשב שאלה 9.1 פתחו ויישמו אלגורית שיקבל כקלט מילה באנגלית ויציג אותה פעמיי ,פע באותיות גדולות ופע באותיות קטנות .למשל ,עבור הקלט Memoryהפלט יהיה MEMORY :ומיד אחר(כ! .memory שאלה 9.2 פתחו אלגורית שיקבל כקלט מחרוזת ותו .פלט האלגורית יהיה מספר ההופעות של התו הנתו בתו! המחרוזת הנתונה .ישמו את האלגורית בשפת .Java הדרכה :מאחר שנית לברר את אור! המחרוזת הנתונה נית להשתמש בהוראה לביצוע חוזר שמספר הסיבובי בה ידוע מראש )לולאת .(for שאלה 9.3 פתחו אלגורית המקבל כקלט רשימת מחרוזות המסתיימת במחרוזת "***". פלט האלגורית יהיה המחרוזת הארוכה ביותר ברשימה .ישמו את האלגורית בשפת .Java שרשור מחרוזות פעולה נוספת ושימושית מאוד על מחרוזות היא פעולת השרשור .פעולה זו מקבלת שתי מחרוזות ויוצרת מחרוזת חדשה ,המורכבת מהמחרוזת הראשונה כשאחריה מוצמדת המחרוזת השנייה .היא אינה משנה את המחרוזות המקוריות. בשפת Javaמתבצע שרשור בעזרת סימ הפעולה .+כלומר ,א s1ו( s2ה מחרוזות ,אז ער! הביטוי s1+s2הוא השרשור של s1ו( .s2למשל ,א ב( s1נמצאת המחרוזת " "heוב( s2נמצאת המחרוזת " ,"lloאז s1+s2היא המחרוזת החדשה "."hello שימו ♥ :פעולת השרשור אינה פעולה של המחלקה מחרוזת ולכ אופ הפעלתה שונה מזה של פעולות כמו charAt ,lengthאו פעולות אחרות של המחלקה .היא אינה מופעלת על עצ של המחלקה ,ולכ אי שימוש בסימ הנקודה .אופ הפעלת פעולת השרשור על מחרוזות דומה לאופ הפעלת פעולות על טיפוסי רגילי בשפה. למעשה ,כבר השתמשנו פעמי רבות בפעולת השרשור על מחרוזות .כזכור ,עד כה השתמשנו במחרוזות בהוראות הדפסה כגו ;)"System.out.println("hello לעיתי ,פקודות ההדפסה היו מעט יותר מורכבות .למשל ; )System.out.println("The number is: " + number או אפילו הוראת המדעים ,אוניברסיטת תל-אביב -391- מדעי המחשב System.out.println("There are " + bags + " bags, " + left + " are left ;)"over. בכל ההוראות האלו הפעולה printlnמקבלת מחרוזת להדפסה .בראשונה מבי דוגמאות ההדפסה שלעיל ,זוהי המחרוזת " ."helloבדוגמאות האחרות מועברות לפעולה printlnמחרוזות שהתקבלה כתוצאה מהפעלת פעולה ,פעולה שמחזירה מחרוזת .כ! למשל ,המחרוזת שקיבלה printlnבכל אחת משתי הדוגמאות האחרות ,התקבלה כתוצאה מהפעלת הפעולה ) +פע אחת בדוגמה הראשונה ,וארבע פעמי בשנייה(. למשל ,א ערכו של המשתנה numberהוא ,3אז המחרוזת שהועברה להדפסה בהוראה הראשונה היא שרשור של המחרוזת " "The number is:ע המחרוזת " ,"3כלומר המחרוזת "The ".number is: 3 שימו ♥ :מאחר שבמשתנה numberיש ער! מטיפוס של ,הרי שטר ביצוע פעולת השרשור התבצעה באופ אוטומטי פעולת הסבה של הער! המספרי למחרוזת המתאימה לו .כ! קורה תמיד כאשר אנו מבקשי לשרשר מחרוזת ע ער! מטיפוס שאינו מחרוזת :לפני ביצוע פעולת השרשור מתבצעת באופ אוטומטי פעולת הסבה של הערכי שאינ מחרוזות למחרוזות .לכ ,הפעולה + מתבצעת כפעולת שרשור של מחרוזות ולפעולה printlnמועברת מחרוזת אחת ,שהיא תוצאת השרשור. שרשור מחרוזות נית לבצע בעזרת הפעולה ,+כ!: מחרוזת + 2מחרוזת1 פעולת השרשור יוצרת מחרוזת חדשה ,ודואגת להקצות עבורה מקו .היא אינה משפיעה על המחרוזות המקוריות. לפני ביצוע שרשור של מחרוזת ע ער! שאינו מחרוזת ,הער! שאינו מחרוזת מוסב באופ אוטומטי למחרוזת. שאלה 9.4 פתחו אלגורית שיקבל כקלט 100זוגות של מחרוזות .עבור כל זוג מחרוזות תוצג כפלט מחרוזת שהיא שרשור של שתי המחרוזות )כלומר ,בס! הכל יוצגו 50מחרוזות( .ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -392- מדעי המחשב ומה בפנים? פעולות המסתכלות אל תוך הקנקן למרות שכל מחרוזת היא עצ אחד ,כמה מ הפעולות המוגדרות על עצמי של המחלקה מחרוזת מאפשרות להתייחס באופ מפורש ג לתווי שמרכיבי מחרוזת .פעולות כאלו ,כמו הפעולה charAtשכבר היכרנו ,מסייעות מאוד בפתרו בעיות שונות ,כפי שמדגימה הבעיה הבאה: בעיה 4 מטרת הבעיה ופתרונה :הדגמת השימוש בפעולות המגלות מידע על רכיביה של מחרוזת. פתחו אלגורית שהקלט שלו הוא מחרוזת המהווה משפט באנגלית ,והפלט הוא האות האחרונה של המילה הראשונה במשפט ,ומספר המילי במשפט. למשל ,עבור הקלט welcome to Israel and have a nice day! :הפלט המתאי הוא .e 8 ישמו את האלגורית בשפת .Java ניתוח הבעיה בעזרת דוגמאות נתבונ במשפט שנית כדוגמה.welcome to Israel and have a nice day! : ? כיצד נית לדעת כמה מילי יש במשפט הנתו? כיוו שלפני כל מילה ,חו* מהראשונה ,יש רווח ,נוכל למנות את מספר הרווחי במחרוזת ולהוסי .1 למשל ,במשפט ! welcome to Israel and have a nice dayיש 7רווחי ,ולכ 8מילי) .זאת בהנחה שבי מילה למילה יש רווח אחד בלבד!( ? מהי האות האחרונה במילה הראשונה? האות האחרונה במילה הראשונה היא האות שנמצאת מיד לפני הרווח הראשו. פירוק הבעיה לתתמשימות לש פתרו הבעיה נפתור את התת(משימות הבאות: .1קליטת המחרוזת .2מניית מספר הרווחים במחרוזת שנקלטה .3חישוב מספר המילים במחרוזת .4מציאת הרווח הראשון במחרוזת .5מציאת התו שנמצא מיד לפני הרווח הראשון במחרוזת .6הצגה כפלט של מספר המילים במחרוזת ושל התו שנמצא בתת-משימה 5 הוראת המדעים ,אוניברסיטת תל-אביב -393- מדעי המחשב בחירת משתני – sentenceמחרוזת לשמירת המשפט שנקלט – numOfSpacesשל ,מונה את מספר הרווחי במשפט – numOfWordsשל ,שומר את מספר המילי במשפט – placeOfFirstSpaceשל ,שומר את מיקומו של הרווח הראשו )לפניו נמצאת האות המבוקשת( האלגורית sentence-á èôùî èåì÷ .1 0-ì numOfSpaces ìù åëøò úà ìçúà .2 .3 ìë øåáò íà .3.1 :òöá úæåøçîä êøåàî ïè÷ù i éìéìù-éà íìù øôñî çååø àåä sentence úæåøçîá i-ä íå÷îá àöîðù åúä .3.1.1 1-á numOfSpaces ìù åëøò úà ìãâä numOfSpaces+1 êøòä úà numOfWords-á íùä .4 placeOfFirstSpace-á íùäå ïåùàøä çååøä ìù åîå÷î úà àöî .5 sentence-á placeOfFirstSpace-1 íå÷îá úàöîðù úåàä úà èìôë âöä .6 numOfWords ìù åëøò úà èìôë âöä .7 יישו האלגורית את הוראה 3.1אפשר לייש בעזרת הפעולה .charAtאבל ,נשי לב שהפעולה charAtמחזירה ער! מטיפוס charולא מטיפוס מחרוזת ,ולכ יש להשוות את הער! המוחזר ממנה לתו רווח )ולא למחרוזת המכילה את התו היחיד רווח( .א כ! ,את הוראה 3.1נייש כ!: )' '==)if (sentence.charAt(i ליישו הוראה 5נשתמש בפעולה .indexOfכפי שמתואר בטבלה שבסו הפרק ,פעולה זו יכולה לקבל תו או מחרוזת .לכ נעביר לה את התו רווח והיא תחזיר את מקומו במחרוזת ,כמספר של: )' '(sentence.indexOf שימו ♥ :יש תמיד לדאוג להתאמה בי טיפוסי הערכי בה אנו משתמשי לבי אלו המתוארי בכותרת הפעולה. הוראת המדעים ,אוניברסיטת תל-אביב -394- מדעי המחשב התוכנית המלאה /* משפט באנגלית:קלט האות האחרונה במילה הראשונה ומספר המילים במשפט:פלט */ public class HowManyWords { public static void main (String[] args) { String sentence; int placeOfFirstSpace; int numOfSpaces = 0; int numOfWords; sentence = In.readString("Enter a sentence, with exactly one space between words"); // מניית הרווחים במשפט for (int i = 0 ; i < sentence.length() ; i++) { if (sentence.charAt(i) == ' ') { numOfSpaces++; } // if } // for numOfWords = numOfSpaces + 1; // מציאת מקומו של הרווח הראשון placeOfFirstSpace = sentence.indexOf(' '); System.out.println("The last letter of the first word is: " + sentence.charAt(placeOfFirstSpace - 1)); // כמה מילים במשפט System.out.println("There are " + numOfWords + " words"); }//main }// class HowManyWords 4 סוף פתרון בעיה מדעי המחשב -395- אביב- אוניברסיטת תל,הוראת המדעים שאלה 9.5 פתחו ויישמו אלגורית שהקלט שלו הוא תו ומחרוזת והפלט הוא הודעה הא התו נמצא במחרוזת או לא. שאלה ) 9.6בגרות (1995 פתחו ויישמו אלגורית שקולט מחרוזת .האלגורית מציג כפלט כל תו במחרוזת פעמיי ,פרט לתו '*' )כוכבית( אשר ג א הוא כלול במחרוזת הוא לא מוצג כלל .הפלט מוצג בשורה אחת. למשל ,עבור הקלט AB*3B*? :הפלט יהיה ??.AABB33BB שאלה 9.7 פתחו ויישמו אלגורית שמקבל כקלט רשימה של 100מחרוזות .האלגורית מחשב בכמה מחרוזות מתו! ה( 100התו הראשו שווה לתו האחרו ,ומציג כפלט את הער! שחישב. שאלה 9.8 פתחו אלגורית שהקלט שלו הוא שלוש מחרוזות ,והפלט שלו הוא שלוש המחרוזות לפי סדר מילוני. ישמו את האלגורית בשפת .Java למשל ,עבור הקלט good, today, apple :הפלט המתאי הואtoday : good .apple 9.3השמת מחרוזות עד כה ראינו כיצד לבצע פעולות קלט ופלט של מחרוזות ,והשתמשנו בפעולות שונות על מחרוזות, פעולות שמחזירות לנו מידע על המחרוזת .בעיבוד של משתני רגילי ,אחת מהפעולות השימושיות ביותר היא הוראת השמה .בסעי זה נדו בביצוע השמה עבור מחרוזות ,כלומר בהשמה של מחרוזת אל מחרוזת. למעשה ,כפי שכבר נאמר ,ג הוראת קלט של מחרוזת היא הוראת השמה .למשל ,בהוראה ;)(str = In.readString הפעולה In.readStringמחזירה הפניה לשטח הזיכרו החדש שהוקצה עבור מחרוזת הקלט. בעקבות ההשמה מפנה strאל אותו שטח זיכרו ,ודר! strנית להגיע אל אותו שטח ולבצע עליו פעולות שונות. בסעי זה נראה כיצד לבצע השמה של מחרוזות ,שאינה הוראת קלט או הוראת הקצאה ואתחול. הוראת המדעים ,אוניברסיטת תל-אביב -396- מדעי המחשב בעיה 5 מטרת הבעיה הבאה :הצגת השמת מחרוזת למחרוזת והדגמה נוספת של השימוש בפעולות של המחלקה .String נאמר שכתובת דואר אלקטרוני היא חוקית א היא מקיימת את התנאי הבאי: מתחילה באות לועזית ,מורכבת מרצ לא ריק של תווי שאחריו מגיע התו '@' ,אחריו שוב רצ לא ריק של תווי, אחריו התו ','. ולאחריו עוד רצ לא ריק של תווי. כתובת ישראלית מסתיימת במחרוזת "".il בקביעת חוקיות של כתובת דואר אי משמעות להבדל בי אותיות גדולות וקטנות. למשל ,המחרוזת d@ccv.hhhהיא כתובת דואר אלקטרוני חוקית ,וכ! ג .ILייי@ ,tשהיא כתובת ישראלית .לעומת ,המחרוזות הבאות אינ כתובות חוקיות.cc :יח@ח )לא מתחילה באות לועזית(, ) tr@.ilרצ התווי שבי התו '@' לבי התו ' '.הוא ריק() rt@jjj ,לא מכילה את התו '('. ) sda.asd@sadהתו ' '.מופיע לפני התו '@'(. פתחו אלגורית המקבל כקלט מחרוזת .נית להניח כי במחרוזת המתקבלת התו ' '.לא מופיע יותר מפע אחת וכ! ג התו '@' .האלגורית מציג כפלט את המחרוזת שנקלטה ,בצירו הודעה המבהירה א המחרוזת מהווה כתובת דואר אלקטרוני חוקית ,וא כ ,הא זוהי כתובת ישראלית. ישמו את האלגורית בשפת התכנות .Java ניתוח הבעיה בעזרת דוגמאות הכתובת tr@xxx.ILהיא חוקית וישראלית .ג הכתובת tr@xxx.ilהיא חוקית וישראלית .אכ ,אי משמעות לשימוש באותיות קטנות או גדולות – ההבדל ביניה אינו משפיע על קביעת חוקיות המחרוזת וג לא על סיווגה ככתובת ישראלית .אבל ,הפלט אינו לגמרי זהה בשני המקרי :אמנ, בשני המקרי נציג הודעה כי המחרוזת חוקית וישראלית ,א! במקרה הראשו נציג את המחרוזת tr@xxx.ILובמקרה השני את המחרוזת .tr@xxx.il כיוו שלצור! בדיקת חוקיות המחרוזת והקביעה א היא ישראלית או לא אי משמעות להבדל בי אותיות גדולות לקטנות ,נוכל לפשט את הבדיקה א נבצע אותה על מחרוזת זהה למחרוזת הקלט פרט לכ! שהיא אחידה ,כלומר ,מורכבת רק מאותיות גדולות או רק מאותיות קטנות .נחליט כי המחרוזת האחידה תורכב כולה מאותיות קטנות .את מחרוזת הקלט נשמור כמו שהיא ,כדי שנוכל להציגה כפלט. הוראת המדעים ,אוניברסיטת תל-אביב -397- מדעי המחשב קל לבדוק א התו הראשו הוא אות לועזית .ברגע שבדיקה זו הצליחה ,כבר ברור שהמילה אינה מתחילה בתו '@' ,כלומר ,שהרצ שלפני התו '@' אינו ריק. פירוק הבעיה לתתמשימות .1קליטת מחרוזת .2יצירת מחרוזת זהה לזו שנקלטה ,פרט לכך שבמקום כל אות גדולה מופיעה האות הקטנה המתאימה לה .3בדיקה שהתו הראשון הוא אות לועזית .4בדיקה שהתוים '@' ו '.'-מופיעים במחרוזת .5בדיקה שהתו ' '.מופיע אחרי התו '@' ,אך לא מיד אחריו .6בדיקה שהרצף אחרי התו ' '.אינו ריק .7עבור מחרוזת חוקית :בדיקה אם היא ישראלית .8הצגה כפלט של המחרוזת ושל הודעה מלווה מתאימה בחירת משתני בשאלה מתוארי כמה תנאי בה צריכה לעמוד מחרוזת חוקית .מספיק שאחד מה לא מתקיי, כדי לקבוע שהמחרוזת אינה חוקית .נוכל להיעזר במשתנה בוליאני :כל עוד לא מצאנו בעיה בכתובת הדואר האלקטרוני ערכו של המשתנה יהיה .trueכאשר נמצא שגיאה באחד התנאי נציב בו .false ההודעה לפלט תוצג על פי ערכו של המשתנה. בנוס נזדקק לשתי מחרוזות :האחת לשמירת מחרוזת הקלט המקורית ,והשנייה לשמירת המחרוזת האחידה. כדי לבדוק את חוקיות המחרוזת נשתמש בשני משתני שלמי שישמרו את מקו התווי '@' ו('.'. לבסו ,נקדיש משתנה ג לאור! המחרוזת שנקרא מהקלט .כ! נוכל לחשב את האור! פע אחת, ולהשתמש בער! המשתנה בכל הפעמי בה נזדקק לאור! המחרוזת. – isLegalמשתנה בוליאני )"דגל"( ,שיעיד הא הכתובת היא חוקית או לא – strמחרוזת לשמירת הכתובת הנקלטת – lowerCaseStrמחרוזת זהה למחרוזת הקלט פרט לכ! שבמקו כל אות גדולה נמצאת האות הקטנה המתאימה לה – atPlaceמספר של ,לשמירת מקומו של התו '@' – dotPlaceמספר של ,לשמירת מקומו של התו ''. – lenאור! מחרוזת הקלט הוראת המדעים ,אוניברסיטת תל-אביב -398- מדעי המחשב האלגורית true-ì isLegal êøò úà ìçúà .1 str-ì úáåúë èåì÷ .2 äìåãâ úåà ìë íå÷îáù êëì èøô ,str-áù úæåøçîì ääæ ,äùãç úæåøçî øåö .3 lowerCaseStr-á äúåà íùäå ,äì äîéàúîä äðè÷ä úåàä úàöîð úéìâðà úåà àì àéä äðåùàøä úåàä íà .4 false-ì isLegal êøò úà äðù .4.1 úæåøçîá íéòéôåî íðéà '@' åúä åà '.' åúä íà .5 false-ì isLegal êøò úà äðù .5.1 úøçà åéøçà ãééî àì êà '@' åúä éøçà òéôåî '.' åúä false-ì isLegal êøò úà äðù .6 íà .6.1 .6.1.1 (len – 1 íå÷îá) úæåøçîá ïåøçà òéôåî '.' åúä íà .7 false-ì isLegal êøò úà äðù .7.1 true-ì äååù isLegal ìù åëøò íà .8 úé÷åç úáåúëä éë äòãåä èìôë âöä .8.1 ".il" úæåøçîä íä íéðåøçàä íéååúä úùåìù úéìàøùé úáåúëä éë äòãåä èìôë âöä íà .8.2 .8.2.1 úøçà .8.3 úéìàøùé äðéà úáåúëä éë äòãåä èìôë âöä .8.3.1 úøçà .9 úé÷åç úáåúëä éë äòãåä èìôë âöä .9.1 מדעי המחשב -399- אביב- אוניברסיטת תל,הוראת המדעים יישו האלגורית כדי לבדוק הא התווי ' '.ו( '@' מופיעי במחרוזת ,strוא כ – הא מיקומ תקי ,נשתמש בפעולה str.indexOfהמקבלת תו ,ומחזירה את מקומו במחרוזת .str כדי ליצור ממחרוזת הקלט )השמורה ב( (strמחרוזת חדשה הזהה לה ,פרט לכ! שכל אות גדולה הוחלפה באות הקטנה המתאימה לה ,נשתמש בפעולה .str.toLowerCaseכמו כל פעולה הפועלת על מחרוזות ,ג הפעולה toLowerCaseאינה משנה את המחרוזת עליה היא מופעלת ,כלומר ,היא אכ יוצרת מחרוזת חדשה .כמו כל פעולה שיוצרת מחרוזת חדשה ,הפעולה toLowerCaseדואגת להקצות מקו עבור המחרוזת החדשה. אנו מעונייני שדר! המשתנה lowerCaseStrנית יהיה להגיע למחרוזת החדשה .לכ נשתמש במשפט השמה ,ונשי את הער! המוחזר מהפעולה str.toLowerCaseל( ,lowerCaseStrכ!: ;)(lowerCaseStr = str.toLowerCase בעקבות הוראה זאת העצ lowerCaseStrמפנה אל שטח בזיכרו ,בו שמורה מחרוזת חדשה ,הזהה למחרוזת הקלט ,פרט לכ! שבמקו כל אות גדולה נמצאת האות הקטנה המתאימה לה .במחרוזת המקורית ,השמורה ב( strלא חל כל שינוי. לא היינו צריכי להקצות במפורש שטח זיכרו לעצ ,lowerCaseStrמפני שההקצאה עבור השטח אליו הוא מפנה בוצעה בתו! הפעולה .toLowerCase התוכנית המלאה */ התוכנית מקבלת כקלט מחרוזת ,מציגה אותה כפלט ,ומציגה גם הודעה המבהירה אם זו מחרוזת דואר אלקטרוני חוקית ,ואם כן ,האם היא כתובת ישראלית */ public class EmailAddress { )public static void main (String[] args { מחרוזת הקלט // ;String str // ;String lowerCaseStr מחרוזת זהה למחרוזת הקלט ,פרט לכך שאותיות גדולות מוחלפות בקטנות שומר מיקום התו '@' // ;int atPlace שומר מיקום התו '// '. ;int dotPlace דגל חוקיות הכתובת // ;boolean isLegal = true אורך המחרוזת שנקלטה // הוראת המדעים ,אוניברסיטת תל-אביב -400- ;int len מדעי המחשב // קלט מחרוזת ושמירת אורכה str = In.readString("Insert an e-mail address, with only one . and one @"); len = str.length(); // יצירת המחרוזת החדשה ושמירתה lowerCaseStr = str.toLowerCase(); // בדיקה שהתו הראשון הוא אות לועזית if (!(str.charAt(0) >= 'a' && str.charAt(0) <= 'z')) { isLegal = false; } // if // '@'-' ו.' מציאת מקום התווים atPlace = lowerCaseStr.indexOf('@'); dotPlace = lowerCaseStr.indexOf('.'); if ((dotPlace == -1)||(atPlace == -1)) // אחד משני התווים חסר { isLegal = false; } else { if ((dotPlace < atPlace)|| (dotPlace == atPlace + 1)) { // הסדר בין התווים שגוי או שהם מופיעים ברצף isLegal = false; } } // else // ' אינו ריק.' בדיקה שרצף התווים שאחרי התו if (dotPlace == len - 1) { isLegal = false; } // הפלט if (isLegal) { System.out.println(str + " is a legal Email address"); // .il- האם שווים ל,בדיקת שלושת התווים האחרונים במחרוזת if (lowerCaseStr.IndexOf(".il") == len - 3) מדעי המחשב -401- אביב- אוניברסיטת תל,הוראת המדעים { ;)"System.out.println("Email address is Israeli } else { ;)"System.out.println("Email address is not Israeli } )}// if (isLegal else { ;)"System.out.println(str + " is not a legal Email address } } // main } // EmailAddress סוף פתרון בעיה 5 השמת מחרוזות נכתבת כהוראת השמה רגילה: ;string1 = string2 בעקבות ביצוע ההשמה ,מפנה string1אל אותו שטח זיכרו שאליו מפנה .string2לכ ,אי צור! לבצע קוד הקצאת זיכרו עבור .string1 בעיה 6 מטרת הבעיה ופתרונה :הדגמת בניית מחרוזת בשלבי .היכרות ע הפעולה .new פתחו אלגורית אשר הקלט שלו הוא מחרוזת .הפלט יהיה מחרוזת חדשה ,הזהה למחרוזת המקורית ,פרט לכ! שמופיעה בה האות cבכל מקו שבו הופיעה האות bאו Bבמחרוזת המקורית. למשל ,עבור המחרוזת " "abcdהפלט יהיה המחרוזת "."accd שימו ♥ :פרט לשינוי המתואר ,המחרוזת החדשה צריכה להיות זהה למקורית .בפרט ,לא נית להפו! בה אותיות גדולות לקטנות או להפ!. פירוק הבעיה לתתמשימות .1קליטת מחרוזת .2בניית המחרוזת החדשה .3הדפסת המחרוזת החדשה הוראת המדעים ,אוניברסיטת תל-אביב -402- מדעי המחשב את תת(משימה 2נוכל לפרק באופ הבא: .2.1יצירת מחרוזת חדשה ואתחולה למחרוזת ריקה .2.2בנייה הדרגתית של המחרוזת החדשה ,תו בכל פעם את תת(משימה 2.2נוכל לייש על ידי הוראה לביצוע חוזר ,בה מספר הפעמי לביצוע ידוע מראש ונקבע על פי אור! המחרוזת. בחירת משתני – strהמחרוזת שמתקבלת כקלט – new_strהמחרוזת החדשה האלגורית str-ì úæåøçî èåì÷ .1 ä÷éø úæåøçîë new_str úà ìçúà .2 .3 ìë øåáò :òöá str-á character åú åà 'b'-ì äååù character íà .3.1 .3.1.1 ''B 'c' åúä úà new_str-ì øùøù úøçà .3.2 .3.2.1 character åúä úà new_str-ì øùøù new_str úà èìôë âöä .4 יישו האלגורית בפתרו בעיה זו אנו מצהירי לראשונה על מחרוזת שתקבל את ערכה הראשוני לא על ידי הוראת קלט ולא על ידי השמה אלא על ידי אתחול )הוראה .(2משו כ! ,בניגוד לפתרונות הקודמי בה הקצאת השטח עבור המחרוזת נעשתה באופ סמוי )על ידי פעולת הקלט או על ידי פעולות אחרות המייצרות מחרוזות( בפתרו זה נדאג אנו להקצאת שטח עבור המחרוזת. הקצאה מקו לעצ מתבצעת על ידי הפעולה .newלמשל ,כדי להקצות מקו בזיכרו לעצ מהמחלקה מחרוזת נכתוב: str ;)(String str = new String הוראה זו מצהירה על העצ ומקצה לו מקו בזיכרו. כזכור ,עבור משתני רגילי נית לבצע אתחול תו! כדי הצהרה .ג עצמי נית לאתחל תו! כדי הצהרה ,על ידי העברת ער! לפעולה .newלמשל ,ההוראה הוראת המדעים ,אוניברסיטת תל-אביב -403- מדעי המחשב ;)"String str = new String("abc מצהירה על עצ של המחלקה מחרוזת בש ,strמקצה לו מקו בזיכרו ,ומאתחלת את ערכו ,כ! שכעת הוא שומר בתוכו את המחרוזת "."abc לא במקרה הוראת אתחול זו דומה להשמה .למעשה ,פעולת ,newמיד אחרי שהיא מקצה שטח בזיכרו ,היא מחזירה ער! ,שהוא הפניה לשטח הזיכרו שהוקצה. ההוראה )" str = new String("abcהיא אכ הוראת השמה ,בה מוש הער! המוחזר מהפעולה newב( .strכעת str ,מפנה אל השטח שהוקצה עבורו בזיכרו ,ובכל פע שנתייחס בתוכנית לעצ strונבצע עליו פעולות שונות ,ה יתבצעו על שטח הזיכרו המתאי. בדומה להשמת ער! ראשוני לתו! משתני ,ג הקצאת מקו בזיכרו לעצמי ,ואתחול המקו הזה לא חייבי להיעשות מיד ע ההצהרה .למשל ,נית לכתוב את ההוראות הבאות: ;String str ;)"str = new String("abc ע זאת ,בדיוק כמו שעבור משתני העדפנו לאתחל משתנה כמה שיותר מוקד ,מיד כשידוע ער! מתאי לאתחול ,ולא לדחות את האתחול ,כ! ג לגבי עצמי בכלל ,ומחרוזות בפרט. ביישו האלגורית לפתרו בעיה ,2האתחול כמחרוזת ריקה )הוראה (2יכול להתבצע יחד ע הקצאת המקו עבור המחרוזת ,כלומר ,בעזרת הפעולה ,newכ!: ;)""(new_str = new String את ערכו של כל תו תור במחרוזת נוכל לדעת )לצור! הוראה (3.1בעזרת הפעולה .charAt בהוראות 3.1.1ו( 3.2.1עלינו לשרשר תו נוס למחרוזת .נוכל להשתמש לש כ! בפעולת השרשור על מחרוזות .לכ ,למשל ,את הוראה 3.1.1נוכל לייש כ!: ;'new_str = new_str +'c שימו ♥ :פעולת השרשור היא פעולה שמחזירה מחרוזת .כמו כל פעולה שמחזירה מחרוזת ,פעולת השרשור אינה משנה את המחרוזות עליה היא פועלת ,אלא יוצרת מחרוזת חדשה )כמוב ,אחרי שדאגה להקצות מקו עבורה( ,השווה לשרשור המחרוזות המקוריות. נניח למשל ,שב( new_strנמצאת המחרוזת " ."adמה קורה בעת ביצוע הוראת ההשמה שלעיל? פעולת השרשור מקבלת שתי מחרוזות )במקרה זה new_str ,והמחרוזת " ,"cאחרי המרת התו ''c למחרוזת( ,יוצרת ,תו! הקצאת מקו מתאי בזיכרו ,מחרוזת חדשה שמכילה את שרשור שתי המחרוזות ,כלומר את המחרוזת " ."adcהיא מחזירה את המחרוזת החדשה. בפעולת ההשמה מושמת אותה מחרוזת חדשה אל .new_strכלומר ,במקו ש( new_strיפנה אל המחרוזת המקורית )" ,("adהוא מצביע כעת אל השטח החדש בזיכרו .מה קרה לעצ שהוא המחרוזת המקורית? נית לומר שהוא הל! לאיבוד .בכ! פעולת השמה של מחרוזות אינה שונה הוראת המדעים ,אוניברסיטת תל-אביב -404- מדעי המחשב מפעולת השמה רגילה של משתני :ג כאשר אנו מבצעי השמה כגו ,x = yכאשר xו( yמשתני רגילי ,ערכו המקורי של xאובד ,והער! החדש ,הלא הוא ערכו של ,yמחלי אותו. כאשר נשרשר למחרוזת תו נוס ,אותו תהלי! יחזור על עצמו :הקצאת שטח למחרוזת חדשה שהיא שרשור של המחרוזת המקורית והתו החדש ,והשמה ,הגורמת ל( new_strלהצביע על המחרוזת החדשה. א כ! ,בבנייה הדרגתית של מחרוזת ,כפי שתואר לעיל ,לא יהיה זה מדויק לומר שאותה מחרוזת צומחת כל פע בתו נוס .למעשה ,נוצרת סדרה של מחרוזות :בכל פע נוצרת מחרוזת חדשה ,ארוכה בתו אחד ,והיא תופסת את מקומה של המחרוזת הקודמת. התוכנית המלאה */ קלט :מחרוזת פלט :מחרוזת זהה למקורית ,פרט לכך שכל ' 'Bאו ' 'bמוחלף ב'c'- */ public class ReplaceCForB { )public static void main (String[] args { ;String str מחרוזת הקלט // המחרוזת החדשה // ;String new_str קלט // ;)"str = In.readString("Insert a string please בניית המחרוזת החדשה // אתחול המחרוזת החדשה למחרוזת ריקה new_str = new String("");// סריקת מחרוזת הקלט תו אחר תוfor(int i = 0; i<str.length(); i++)// { ))'if ((str.charAt(i) == 'b') || (str.charAt(i) == 'B { החלפת ' 'Bאו ' 'bבnew_str = new_str + 'c'; // 'c'- } else { העתקת התו המקורי new_str = new_str + str.charAt(i); // } } // for פלט // ;)System.out.println("The new String is: " + new_str } // main } // class ReplaceCForB סוף פתרון בעיה 6 הוראת המדעים ,אוניברסיטת תל-אביב -405- מדעי המחשב הקצאת שטח זיכרו למחרוזת נית לבצע בעזרת הפעולה .new נית להעביר לפעולה newער! לאתחול המחרוזת החדשה. כאשר אנו נדרשי לבנות מחרוזת חדשה בשלבי ,תו אחרי תו נית לעשות זאת באופ הבא :ליצור מחרוזת חדשה ולאתחל אותה כמחרוזת ריקה )""(; באמצעות הוראה לביצוע חוזר, לבצע בכל פע שרשור של המחרוזת הנוכחית ע תו מתאי ,והחלפת המחרוזת הנוכחית במחרוזת החדשה ,שהתקבלה מפעולת השרשור. שאלה 9.9 פתחו ויישמו אלגורית שהקלט שלו הוא מחרוזת המהווה משפט משובש :במקו כל רווח מופיע הסימ .$האלגורית מייצר מחרוזת חדשה ובה המשפט התקני ,ומציג אותו כפלט .ישמו את האלגורית בשפת .Java שאלה 9.10 ר וד המציאו שפה מוצפנת .המשפטי הניתני להצפנה כוללי מילי ורווחי בלבד ,כאשר כל מילה נכתבת רק באותיות לועזיות קטנות. ההצפנה מתבצעת באופ הבא :כל רווח מוחל בסימ '@' ,ולאחר כל אות מופיעה האות הלועזית הגדולה המתאימה לה. למשל ,המשפט good morningמוצפ כ! .gGoOoOdD@mMoOrRnNiInNgG פתחו אלגורית המקבל משפט כקלט ומציג כפלט את המשפט המוצפ המתאי לו .ישמו את האלגורית בשפת .Java שאלה 9.11 פתחו אלגורית שמקבל כקלט מחרוזת ,מייצר מחרוזת חדשה שבה סדר התווי הפו! ביחס למחרוזת המקורית ,ומציג את המחרוזת החדשה כפלט .בנוס ,האלגורית בודק א שתי המחרוזות )המקורית וההפוכה( שוות זו לזו .במילי אחרות ,האלגורית בודק א המחרוזת המקורית היא פלינדרו .האלגורית מציג כפלט הודעה מתאימה לתוצאת הבדיקה. למשל ,עבור הקלטdog : עבור הקלטaba : יהיה הפלט.god – not a palindrome : יהיה הפלט.aba – a palindrome : ישמו את האלגורית בשפת .Java שאלה 9.12 תלמידי הכיתה התעניינו לדעת למי יש סבתא ע הש הכי ארו! .פתחו אלגורית אשר יקבל כקלט את מספר התלמידי בכיתה ,ואחר כ! רשימה שאורכה כמספר תלמידי הכיתה ,של שמות הסבתות הוראת המדעים ,אוניברסיטת תל-אביב -406- מדעי המחשב של תלמידי הכיתה ,כמחרוזות .פלט האלגורית יהיה הש הארו! ביותר .ישמו את האלגורית בשפת .Java שאלה 9.13 כתובת אתר אינטרנט של חברה מסחרית בינלאומית בנויה בדר! כלל מ( 3חלקי המופרדי בנקודות: .comש החברהwww. פתחו אלגורית המקבל כקלט כתובת של אתר של חברה מסחרית בינלאומית ,במבנה שתואר לעיל, ומציגה כפלט את ש החברה .ישמו את האלגורית בשפת .Java הדרכה :השתמשו בפעולה substringשבטבלת הפעולות אשר בסו הפרק. שאלה 9.14 כתובת אתר אינטרנט של חברה מסחרית שאינה בינלאומית בנויה בדר! כלל מ( 3חלקי המופרדי בנקודות: סיומת המדינה.ש החברהwww. פתחו אלגורית המקבל כקלט רשימת כתובות של אתרי חברות מסחריות לאומיות )כל אחת מה במבנה שתואר לעיל( ,המסתיימת במחרוזת " ,"endומציגה כפלט עבור כל חברה את שמה ואת סיומת המדינה שלה .ישמו את האלגורית בשפת .Java שאלה 9.15 יואב ועומרי המציאו משחק .כל אחד בתורו רוש משפט המתחיל במילה האחרונה של המשפט מהתור הקוד .המשפט הראשו במשחק יתחיל במילה " ."startלמשל: start the game game is one of the best ways to kill the time time is money פתחו אלגורית המסייע למשחקי :האלגורית מקבל כקלט את מספר התורות המבוקש .בתחילת כל תור הוא מציג את המילה בה צרי! להתחיל המשפט הבא ,ולאחר מכ הוא מקבל כקלט את המשפט החדש .המשחק מסתיי כאשר מספר התורות הגיע לחס המבוקש ,או כאשר המשפט שבחר אחד השחקני מתחיל במילה שגויה .ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -407- מדעי המחשב סיכום בפרק זה למדנו כיצד לבצע עיבוד של מחרוזות. בשפת Javaמחרוזת אינה טיפוס פשוט ,כמו intאו .charהטיפוס החדש מוגדר בשפה כמחלקה בש ,Stringומחרוזות ה עצמי של מחלקה זו. למעשה ,כבר הכרנו והשתמשנו במחלקות שונות כגו מחלקת המתמטיקה ששימשה אותנו לצור! ביצוע פעולות מתמטיות שונות ,או המחלקה Systemששימשה אותנו להוראות פלט )כמו .(System.out.printlnאבל ,בפרק זה הכרנו והגדרנו לראשונה מופעי של מחלקה ,עצמי ,שה, כאמור ,מעי משתני של הטיפוס החדש .בפרק זה ג הפעלנו לראשונה פעולות של מחלקה על עצ מהמחלקה .השימוש בעצמי שונה מהשימוש במשתני מהטיפוסי המוכרי לנו. הצהרה על עצ ממחלקה מסוימת דומה להצהרה על משתנה מטיפוס סטנדרטי )כגו intאו .(char למשל, ;string str בניגוד להצהרה על משתני מטיפוסי סטנדרטיי ,אחרי הצהרה על עצ צרי! ג לבצע עבורו הקצאת שטח זיכרו ,+על ידי הפעולה .newהפעולה newמשמשת ג לאתחול עצ ,תו! כדי הצהרה עליו או לאחר מכ. למשל ,ההוראה הבאה מקצה מקו עבור sומאתחלת אותו כ! שישמור את המחרוזת ": "ab ;)"s = new String("ab מיקו התווי במחרוזת מתחיל מ( .0בפרט ,בכל מחרוזת ,א נסמ את אור! המחרוזת ב( ,lenאז התו האחרו במחרוזת נמצא במקו ,len −1והתו הראשו נמצא במקו ה(.0 במחלקה Stringמוגדרות פעולות שנית +לבצע על מחרוזות ,כלומר ,על עצמי של המחלקה. לכל פעולה המוגדרת במחלקה יש חוקי משלה :איזה סוגי ערכי )פרמטרי( היא מצפה לקבל, ומאיזה טיפוס הער! המוחזר ממנה .חשוב לוודא התאמה בי טיפוסי הפרמטרי המועברי לפעולה לאלה אות היא מצפה לקבל ,ובי טיפוס הער! המוחזר ממנה לפעולות המתבצעות עליו .למשל ,א אנו מבצעי השמה של הער! המוחזר מפעולה לתו! משתנה ,יש לוודא התאמה בי הטיפוס של המשתנה לטיפוס הער! המוחזר. כדי לציי ביצוע פעולה של עצ מהמחלקה משתמשי בסימו +הנקודה :ראשית נכתב ש העצ, אחריו נכתבת נקודה ,לאחר מכ נכתב ש הפעולה לביצוע ,ומייד אחר כ! מפורטי בסוגריי הערכי המועברי לפעולה .למשל str.length() ,או ).str.charAt(5 הוראת המדעים ,אוניברסיטת תל-אביב -408- מדעי המחשב עבור עצמי של המחלקה Stringמוגדרות פעולות רבות ,המשמשות אותנו ביישו אלגוריתמי הקשורי למחרוזות .למחלקה זו פעולות רבות נוספות ,פרט לאלו שהוצגו בפרק ,ולא נרחיב עליה את הדיבור כא .תוכלו למצוא הרחבה על כל אחת מהפעולות בקישור הזה: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html ביחידה זו נשתמש רק בפעולות אות למדנו בפרק זה. כל הפעולות שמחזירות מחרוזת ,אינ משנות את המחרוזת עבורה הופעלו .ה יוצרות מחרוזת חדשה ומבצעות כבר הקצאת שטח עבורה. לביצוע קלט של מחרוזת השתמשנו בפעולה .In.readStringג פעולה זו מקצה שטח זיכרו עבור המחרוזת החדשה. בעקבות ביצוע השמה של מחרוזת אל מחרוזת ,string1 = string2 ,מפנה string1אל אותו שטח זיכרו שאליו מפנה .string2לכ ,אי צור! לבצע קוד הקצאת זיכרו עבור .string1 בנוס לפעולות הסטנדרטיות על מחרוזות ,למדנו בפרק זה על פעולת השרשור .פעולה זו מקבלת שתי מחרוזות ויוצרת מחרוזת חדשה שהיא שרשור של שתי המחרוזות .זוהי פעולה שימושית מאוד לצור! הדפסה .פעולת השרשור אינה פעולה של המחלקה Stringולכ בכתיבתה אי שימוש בסימו הנקודה .סימ פעולת השרשור הוא הסימ .+ ביחידת ההמש! )"יסודות מדעי המחשב ("2נלמד להגדיר מחלקות בעצמנו ,ולא רק להשתמש במחלקות קיימות. הוראת המדעים ,אוניברסיטת תל-אביב -409- מדעי המחשב רשימת פעולות על מחרוזות הפעולה תיאור הפעולה טיפוס התוצאה פעולה המחזירה את אורכה של המחרוזת )מספר התווי במחרוזת(. של דוגמאות הער ,המוחזר הפעולה )(s1.length )(length כאשר ב( s1נמצאת המחרוזת 3 ""dog )(s2.length כאשר ב( s1נמצאת המחרוזת 0 "" )charAt(int index )indexOf(String s )indexOf(char c פעולה המחזירה את התו הנמצא במחרוזת במקו )s1.charAt(2 תו כאשר ב( s1נמצאת המחרוזת )אינדקס( הנתו. ""shalom פעולה המקבלת מחרוזת ,או תו ומחזירה את המקו )"s1.indexOf("pl הראשו שממנו מופיעה המחרוזת הנתונה או התו הנתו בתו! המחרוזת שעליה מופעלת הפעולה .א כאשר ב( s1נמצאת המחרוזת ''a 3 ""people של )'s1.indexOf('o כאשר ב( s1נמצאת המחרוזת המחרוזת או התו לא מופיעי ,יוחזר הער! .(1 2 ""people )s1.equals(s2 )equals(String s פעולה המקבלת מחרוזת, כאשר ב( s1נמצאת המחרוזת ומחזירה trueא המחרוזת " "loveוב( s2נמצאת המחרוזת ""Love שעליה הופעלה הפעולה בוליאני והמחרוזת הנתונה שוות זו )s1.equals(s2 לזו בדיוק .אחרת ,היא כאשר ב( s1נמצאת המחרוזת " "loveוב( s2נמצאת מחזירה .false המחרוזת ""love הוראת המדעים ,אוניברסיטת תל-אביב -410- מדעי המחשב false true פעולה המקבלת מחרוזת, ומשווה בינה לבי המחרוזת שעליה הופעלה הפעולה .א ה שוות זו לזו מוחזר הער! )compareTo(String s .0א המחרוזת עליה )s1.compareTo(s2 מופעלת הפעולה קודמת כאשר ב( s1נמצאת המחרוזת " "aaוב( s2נמצאת המחרוזת למחרוזת הנתונה ,על פי סדר מילוני ,יוחזר מספר של שלילי .א המחרוזת הנתונה קודמת על פי סדר מילוני של ""ab מספר חיובי כלשהו למחרוזת שעליה מופעלת הפעולה ,יוחזר מספר של חיובי. )(toLowerCase פעולה שיוצרת ומחזירה מחרוזת שזהה למחרוזת עליה היא מופעלת ,פרט לכ! שבמקו כל אות לועזית גדולה נמצאת האות הקטנה המתאימה לה. )(s1.toLowerCase מחרוזת כאשר ב( s1נמצאת המחרוזת ""Peace המחרוזת החדשה ""peace פעולה שיוצרת ומחזירה )(toUpperCase )substring(int k מחרוזת שזהה למחרוזת עליה היא מופעלת ,פרט לכ! שבמקו כל אות לועזית גדולה נמצאת האות הקטנה המתאימה לה. פעולה שיוצרת ומחזירה מחרוזת שזהה לתת(מחרוזת המתחילה מהמקו ה( kשל המחרוזת עליה היא מופעלת, ועד סופה הוראת המדעים ,אוניברסיטת תל-אביב -411- מחרוזת מחרוזת )(s1.toUpperCase המחרוזת כאשר ב( s1נמצאת המחרוזת החדשה ""Peace ""PEACE )s1.substring(4 המחרוזת כאשר ב( s1נמצאת המחרוזת החדשה ""GoodBye ""Bye מדעי המחשב substring(int k, )int s פעולה שיוצרת ומחזירה מחרוזת שזהה לתת(מחרוזת המתחילה מהמקו ה( kשל המחרוזת עליה היא מופעלת, ואורכה הוא ,s-kכלומר, היא מסתיימת במקו ה( כאשר ב( s1נמצאת המחרוזת המחרוזת החדשה ""GoodBye Israel ""Bye Is )s1.substring(4,10 מחרוזת )(s-1 הוראת המדעים ,אוניברסיטת תל-אביב -412- מדעי המחשב פרק – 10מערכי האלגוריתמי שפיתחנו לפתרו בעיות שונות בפרקי הקודמי היו שוני ומגווני .בפרט ,ה היו שוני זה מזה בכמות המידע הנקלט בה ,כלומר ,בגודל הקלט .אבל ,בכל האלגוריתמי שהצגנו עד כה ,ג כאשר כמות המידע הנקלט )הקלט( הייתה גדולה ,הרי כמות המידע שצרי היה לשמור או לזכור במהל ביצוע האלגורית היתה קטנה .למשל ,כאשר רצינו לחשב ממוצע של 100מספרי קלט, שמרנו א ורק את סכומ המצטבר ונתו קלט תור ,ולא את כל 100נתוני הקלט .בכל האלגוריתמי שפיתחנו עד כה השתמשנו במספר משתני מצומצ ,ולכל משתנה הוגדר תפקיד ייחודי משלו. בפרק זה יוצגו בעיות אשר לצור פתרונ יש לשמור מספר גדול של נתוני ,ויש קשר בי הנתוני הנשמרי :ה בעלי משמעות דומה וניתני לתיאור כאוס סדור של איברי מאותו טיפוס .אוס סדור כזה של איברי נקרא "מער". 10.1מערך ואיברי מערך בעיה 1 מטרת הבעיה ופתרונה :הצגת שימוש במער לפתרו בעיה אלגוריתמית. פתחו אלגורית המקבל כקלט את זמני ההקפה של כל אחד מארבעי משתתפי מרו" הקרטינג. האלגורית מציג כפלט את מספר המשתתפי שביצעו הקפה בזמ נמו מהזמ הממוצע של כלל המשתתפי .ישמו את האלגורית בשפת .Java ניתוח הבעיה בעזרת דוגמאות שאלה 10.1 מהו הפלט כאשר נתוני 40זמני הקפה ,עשרי מה שווי ל ,4.50#עשרה שווי ל ,4.20#ועשרה שווי ל?4.60# פירוק הבעיה לתתמשימות בפרק 7כבר ראינו כיצד לחשב ממוצע של רשימת ערכי קלט: .1קליטת נתוני הקלט וצבירתם .2חלוקת הסכום המצטבר במספר ערכי הקלט הוראת המדעים ,אוניברסיטת תל-אביב -413- מדעי המחשב ? במהל צבירת הנתוני לצור חישוב הממוצע נוס לצובר ערכו של כל נתו נקרא ,א הנתו איננו נשמר .לאחר קליטת כל נתוני הקלט נית לחשב את הממוצע ,א ערכי הקלט עצמ אינ שמורי. אבל ,כדי למנות את מספר הנתוני שמתחת לממוצע יש לשמור את ערכי הקלט עד לאחר חישוב הממוצע ,משו שרק לאחר חישוב הממוצע ,אפשר להשוות כל אחד מערכי הקלט לממוצע .כיצד נרחיב את התת#משימות המתוארות כ שיתייחסו ג למציאת ערכי הקלט הקטני מהממוצע? .1קליטת נתוני הקלט ,שמירתם וצבירתם .2חלוקת הסכום המצטבר במספר ערכי הקלט .3השוואת כל ערך קלט לממוצע ,ומנייתו אם הוא קטן מהממוצע בחירת משתני ישנ 40נתוני קלט ,ועלינו לשמור כל אחד מה בנפרד .הא נצהיר על 40משתני ,כל אחד בנפרד? מכיוו שלכל אחד מנתוני הקלט איפיו דומה ,מתאי לקשר יחד .נית להתייחס אל נתוני הקלט כאל סדרת ערכי בת 40איברי דומי ,ולפיכ לשמור אות בסדרת משתני .הער הנקלט ראשו יישמר במשתנה הראשו בסדרה ,הער הנקלט שני יישמר במשתנה השני בסדרה ,וכ הלאה .הקישור בי המשתני יתבצע על ידי מת ש לסדרה ,ופנייה לכל אחד מהמשתני על פי מקומו הסידורי בסדרה .סדרה כזאת של משתני מקושרי נקראת מער. מער )(array הינו אוס סדור של איברי מאותו טיפוס .נית להתייחס לכל אחד מאיברי המער כמו למשתנה לכל דבר .כלומר ,נית לשמור בו ערכי ולקרוא את הערכי השמורי בו. מקומו הסידורי של איבר במער מצוי על#ידי מציי ).(index א כ ,בבעיה זו אנו זקוקי למער בעל ארבעי איברי ,איבר אחד עבור כל אחד מארבעי זמני ההקפה הנתוני .הטיפוס של כל איבר יהיה ממשי .נקרא למער לשמירת זמני ההקפה . scores לכ ,זוהי רשימת המשתני לה נזדקק: – scoresמער של 40איברי ממשיי ,לשמירת כל זמני ההקפה – sumOfScoresמטיפוס ממשי ,ישמור את סכו זמני ההקפות הנתוני בקלט – averageScoreממוצע זמני ההקפה ,מטיפוס ממשי – belowAverageCounterלמניית מספר הזמני שערכ הוא מתחת לממוצע ,מטיפוס של. הוראת המדעים ,אוניברסיטת תל-אביב -414- מדעי המחשב האלגורית 0-ì sumOfScores úà ìçúà .1 0-ì belowAverageCounter úà ìçúà .2 :òöá íéèì÷ðä íéëøòä øôñîì 1 ïéá íìù i ìë øåáò .3 scores êøòîá i-ä øáéàá íùäå i-ä äô÷ää ïîæ úà èåì÷ .3.1 i-ä äô÷ää ïîæ úà sumOfScores-á øåîùä êøòì óñåä .3.2 -á íùäå èì÷ä éëøò øôñîá sumOfScores-á øåîùä êøòä úà ÷ìç .4 averageScore .5 :òöá íéèì÷ðä íéëøòä øôñîì 1 ïéá íìù i ìë øåáò averageScore-î ìåãâ scores êøòîá i-ä øáéàä ìù åëøò íà .5.1 1-á belowAverageCounter ìù åëøò úà äìòä .5.1.1 belowAverageCounter ìù åëøò úà èìôë âöä .6 יישו האלגורית בשפת Javaנית להגדיר מער שאיבריו ה מכל טיפוס נתוני שהוא ,למשל ,מער שאיבריו ה מטיפוס של ,או מער שאיבריו ה מטיפוס תו .לצור פתרו בעיה זו אנו נדרשי להגדיר מער מטיפוס ממשי ,כלומר ,שאיבריו ה מטיפוס ממשי .ההצהרה על מער של מספרי ממשיי נעשית באופ הבא: ;double[] scores שימו ♥ :ההצהרה דומה להצהרה על משתנה מטיפוס ממשי ,ורק תוספת הסוגריי המרובעי )][( מבהירה כי אי הכוונה כא למשתנה יחיד מטיפוס ממשי אלא לעצ שהוא מער שאיבריו ה מטיפוס ממשי. א ההצהרה אינה מספיקה .עלינו להקצות מקו חדש בזכרו עבור אוס האיברי שבמער ,על ידי ההוראה ,newהמוכרת לנו מפרק .9כמוב ,בעת ההקצאה עלינו לציי את מספר האיברי במער ,כי יש לכ השפעה על גודל שטח הזיכרו שיש להקצות. א כ ,הגדרת עצ מתאי ,שהוא מער מטיפוס ממשי ,והקצאת מקו בזכרו עבורו )תו ציו מספר האיברי שהוא אמור להכיל( תיעשה כ: ;]double[] scores = new double[40 כזכור ,הפעולה newמחזירה הפניה לשטח הזיכרו שהוקצה .לכ ,למעשה scores ,מפנה כעת אל השטח שהוקצה עבורו בזיכרו. נשתמש בקבוע על מנת להגדיר את מספר האיברי ,וכ תיראה ההגדרה: ;final int NUM_OF_RUNNERS = 40 ;]double[] scores = new double[NUM_OF_RUNNERS הוראת המדעים ,אוניברסיטת תל-אביב -415- מדעי המחשב יש להדגיש כי בשפת ,Javaכאשר מוקצה שטח זיכרו עבור מער של איברי מטיפוס פשוט ,מתבצע ג אתחול אוטומטי של כל איבריו .איברי מער מספרי )שלמי או ממשיי( יאותחלו ל ,0#איברי מער בוליאני יאותחלו ל ,false#ואיברי מער תווי יאותחלו לתו מיוחד ,שנקרא תו ריק. בשפת Javaהאיבר הראשו במער הוא במיקו 0מתחילת המער ולכ פניה לאיבר הראשו תיעשה באמצעות המציי ,0כ .scores[0] :האיבר השני נמצא במיקו 1מתחילת המער ולכ פנייה אליו תיעשה באמצעות המציי ,1כ .scores[1] :האיבר האחרו ברשימה ,איבר מספר ,40נמצא במיקו 39מתחילת המער ונפנה אליו על ידי ] .scores[39באופ כללי ,ציו איברי מער בשפת Javaמתחיל תמיד מ ,0#ופנייה לאיבר הנמצא במיקו iמתחילת מער anArrayנכתבת כ .anArray[i] :איבר זה הוא האיבר ה i+1#ברשימת האיברי. נמחיש את המער scoresבעזרת האיור הבא: ]scores[39 ]scores[1 ]scores[19 … ]scores[0 … לכל עצ שהוא מער מוגדרת בשפה תכונה בש lengthהשומרת את גודל המער ,כלומר ,את מספר האיברי שהוא מכיל .לתכונה זו נוכל לגשת באמצעות סימו הנקודה ,בדומה לאופ שבו הפעלנו פעולות של עצ .למשל scores.length ,היא תכונת האור של המער ,scoresוערכה שווה ל.40# תכונת האור של מער היא קבועה ואינה ניתנת לשינוי .כלומר ,נוכל לשלב אותה בתו ביטויי שוני בתוכנית ,למשל ,x = scores.length + 1א לא נוכל להציבה בצד שמאל של הוראת השמה .כ למשל ,הוראה כמו scores.length = 3היא שגויה .א כ scores.length ,הוא בעצ קבוע לכל דבר )בדומה לקבוע ,(NUM_OF_RUNNERSא הוא מקושר לעצ ,scoresאפילו שיי אליו ,ונית לגשת אליו רק דר העצ ,scoresכפי שמביע סימו הנקודה. שימו ♥ :ג כדי להשתמש בפעולה של עצ וג כדי לגשת לתכונה שלו אנו משתמשי בסימו הנקודה ,א הפניה לפעולה תלווה תמיד בסוגריי )אולי ריקי ,א הפעולה אינה מצפה לקבל פרמטרי( ,ואילו פנייה לתכונה ,בדומה לפנייה למשתנה רגיל ,היא ללא סוגריי. באלגורית לפתרו בעיה 1כללנו הוראה לביצוע חוזר באור ידוע מראש ,למעבר על כל איברי המער בזה אחר זה .נוכל להשתמש בתכונת האור של המער הנסרק כדי לשלוט על מספר הסיבובי בלולאה .כלומר ,נוכל לקבוע מראש את מספר הסיבובי בלולאה ל.scores.length# מאחר שהתכונה lengthשומרת את מספר האיברי במער ,נית ג לומר שאיברי המער נמצאי בו מהמקו 0ועד המקו .length-1א כ ,נאתחל את משתנה הבקרה של הלולאה ל ,0#והלולאה תסתיי כאשר ערכו יגיע ל) scores.length-1#אפשר כמוב ג לקבוע את ער הסיו של משתנה הבקרה ל.(NUM_OF_RUNNERS–1# הוראת המדעים ,אוניברסיטת תל-אביב -416- מדעי המחשב התוכנית המלאה /* זמני ההקפה של ארבעים משתתפי מרוץ קרטינג:קלט מספר המשתתפים שביצעו הקפה בזמן נמוך מהממוצע הקבוצתי:פלט */ public class BelowAverage { public static void main (String[] args) { // הגדרת קבוע final int NUM_OF_RUNNERS = 40; // הגדרת משתנים double[] scores = new double[NUM_OF_RUNNERS]; // מערך זמני ההקפה double sumOfScores = 0; // צובר זמני ההקפה double averageScore; // ממוצע זמני ההקפה int belowAverageCounter = 0; // מונה // קלט וצבירה 1. for (int i = 0; i < scores.length; i++) { 1.1. scores[i] = In.readDouble("Insert score: "); 1.2. sumOfScores = sumOfScores + scores[i]; } // for // חישוב ממוצע 2. averageScore = sumOfScores/scores.length; // מניית הנמוכים מהממוצע 3. for (int i = 0; i < scores.length; i++) { 3.1. if (scores[i] < averageScore) { 3.1.1. belowAverageCounter++; } // if } // for // פלט 4. System.out.println(belowAverageCounter + " participants are below average"); } // main } //class BelowAverage מדעי המחשב -417- אביב- אוניברסיטת תל,הוראת המדעים מעקב 4.50 4.10 … 4.20 נעקוב באופ חלקי אחר מהל ביצוע התכנית עבור הקלט .168.8 נניח שסכו זמני ההקפות הוא משפט לביצוע scores[i] > i scores[0] … scores[39] sumOfScores belowAverage averageScore averageScore ? ? ? 0 ? 0 1. 0 ? ? 0 ? 0 1.1 0 4.50 ? 0 ? 0 1.2 0 4.50 ? 4.50 ? 0 1 1 4.50 ? 4.50 ? 0 1.1 1 4.50 ? 4.50 ? 0 1.2 1 4.50 ? 8.60 ? 0 . . . 1 . . . . . . . . . . . . . . . . . . 49 4.50 ? 164.6 ? 0 1.1 49 4.50 4.20 164.6 ? 0 1.2 49 4.50 4.20 168.8 ? 0 2. 49 4.50 4.20 168.8 4.22 0 3. 0 4.50 4.20 168.8 4.22 0 3.1 0 4.50 4.20 168.8 4.22 0 3. 1 4.50 4.20 168.8 4.22 0 3.1 1 4.50 4.20 168.8 4.22 0 3.1.1 1 4.50 4.20 168.8 4.22 1 . . . 3 . . . . . . . . . . . . . . . . . . 39 4.50 4.20 168.8 4.22 1 3.1 39 4.50 4.20 168.8 4.22 1 3.1.1 39 4.50 4.20 168.8 4.22 2 4. 39 4.50 מדעי המחשב . . . . . . 4.20 false true true 168.8 4.22 -418- פלט Counter 2 אביב- אוניברסיטת תל,הוראת המדעים Insert score: Insert score: Insert score: 2 particip ants are below average שימו ♥ :המעקב אחר הערכי השמורי באיבר של המער זהה למעקב אחר הערכי השמורי במשתנה. סוף פתרון בעיה 1 בפתרו הבעיה הכרנו שימוש במער עבור שמירת נתוני שנית להתייחס אליה כאל אוס סדור של איברי מאותו טיפוס .נית להתייחס אל איבר במער כאל משתנה .כלומר ,נית לשמור בו ערכי ולקרוא את הערכי השמורי בו .מקומו הסידורי של איבר במער מצוי על#ידי מציי ).(index באלגורית לפתרו בעיה זו הכרנו דר נוחה לסרוק מער ולבצע עיבוד על כל איבריו ,באמצעות הוראה לביצוע חוזר ,שמספר הסיבובי בה ידוע מראש ,ושווה למספר האיברי במער )במילי אחרות ,לאורכו של המער(. נסכ את המושגי הבסיסיי שהכרנו בפתרו בעיה ,1הנוגעי למערכי ולעבודה עימ בשפת :Java מער בשפת Javaהוא עצ המוגדר בשפה. משו שזהו עצ ,אחרי ההצהרה על מער ,צרי לבצע עבורו הקצאת מקו בזיכרו ,על ידי ההוראה .newבעקבות ההקצאה מפנה ש המער אל שטח הזיכרו שהוקצה עבורו. בשפת ,Javaמייד אחרי הקצאת שטח זיכרו עבור מער של איברי מטיפוס פשוט ,מתבצע ג אתחול אוטומטי של כל איבריו .איברי מער מספרי )שלמי או ממשיי( יאותחלו ל ,0#איברי מער בוליאני יאותחלו ל ,false#ואיברי מער תווי יאותחלו לתו הריק. ציו איברי מער מתחיל תמיד מ .0#פנייה לאיבר הנמצא במיקו iמתחילת מער anArray נכתבת כ .anArray[i] :איבר זה הוא האיבר ה i+1#ברשימת האיברי. לכל עצ שהוא מער יש תכונה השומרת את אורכו ) .(lengthנית להשתמש בה כדי לדעת את מספר האיברי במער ,א לא נית לשנותה .נוח להשתמש בתכונה זו כדי לקבוע את מספר הפעמי לביצוע בהוראות לביצוע חוזר שסורקות את כל איברי המער. פנייה לתכונת האור נעשית על ידי סימו הנקודה ,למשל כ.anArray.length : בתוכנית שבפתרו בעיה 1הצהרנו על המער scoresוהקצינו לו מקו בזיכרו באופ הבא: ;]double[] acores = new double[NUM_OF_RUNNERS ננסח זאת באופ כללי: הוראת המדעים ,אוניברסיטת תל-אביב -419- מדעי המחשב הצהרה על מער מטיפוס כלשהו נכתבת בשפת Javaכ: ;שם המערך ][ טיפוס ש הטיפוס ,ולאחריו סוגריי מרובעי )המצייני שזוהי הצהרה על מער של איברי מהטיפוס, ולא של משתנה פשוט( ,ואז שמו של המער. הקצאת שטח למער מתבצעת על ידי ההוראה newשאחריה מופיע טיפוס איברי המער, ואחריו מופיע בסוגריי מרובעי מספר איברי המער: ;]מספר הערכים[ טיפוס new כזכור ,נית לצר את ההצהרה וההקצאה להוראה אחת: ;]מספר הערכים[ טיפוס = newשם המערך ][ טיפוס ונית ג לבצע בנפרד: ;שם המערך ][ טיפוס ;]מספר הערכים[ טיפוס = newשם המערך כדי להמחיש את המושגי החדשי נתבונ בדוגמה הבאה: בשורה הבאה יש הצהרה על מער מטיפוס של ,והקצאת שטח המספיק ל5#איברי. ;]int[] arr = new int[5 א כ ,המער arrמורכב בעצ מחמישה תאי בזיכרו: ]arr[4 ]arr[3 ]arr[2 ]arr[1 ]arr[0 arr האיבר הראשו במער arrהוא ] ,arr[0האיבר השני הוא ] ,arr[1וכ הלאה .האיבר האחרו הוא ].arr[4 על כל איבר במער arrנית לבצע כל פעולה שנית לבצע על כל משתנה מטיפוס של .למשל: ♦ השמה: ;arr[4] = num ♦ קלט: ;)"arr[i] = In.readInt("Insert a number ♦ פלט: ;)]System.out.println(arr[i נראה כיצד ייראה המער arrלאחר ביצוע ההוראות הבאות: ;arr[0] = 9 ;arr[1] = 7 ;arr[2] = 2 * 4 ;]arr[3] = 4 + arr[1 ;]arr[4] = arr[2] + arr[3 הוראת המדעים ,אוניברסיטת תל-אביב -420- מדעי המחשב ]arr[4 ]arr[3 ]arr[2 ]arr[1 ]arr[0 19 11 8 7 9 arr שאלה 10.2 נניח כעת שבמרו" הקרטינג משתתפי רק שלושה מתחרי ,כלומר ,ערכו של הקבוע NUM_OF_RUNNERSהוא .3הקלט לתוכנית )כלומר,זמני ההקפה שלה( הוא .4.20 4.80 4.40 :בנו טבלת מעקב לתוכנית BelowAverageועקבו אחר מהל ביצוע האלגורית לפי הנתוני החדשי. מהו הפלט המתקבל? שאלה 10.3 הוסיפו הוראה או הוראות לתוכנית BelowAverageכ שהפלט יהיה רשימת זמני ההקפות הנמוכי מהממוצע. שאלה 10.4 נתו קטע התוכנית הבא: ;int a1,a2 ;]int[] arr = new int[4 ;arr[0] = 2 ;)"a1 = In.readInt("Insert a number ;)"arr[2] = In.readInt("Insert a number ;)"a2 = In.readInt("Insert a number ;]arr[3] = 2 * arr[2 ;]arr[1] = a2 + arr[2 ;a1 = a[1] + a[2] + a1 ;)System.out.println(a1 + " " + a2 )for (i = 0; i < arr.length; i++ { ;)]System.out.println(arr[i } בנו טבלת מעקב אחר מהל ביצוע קטע התוכנית עבור הקלט.1 2 3 : מה יהיה פלט קטע התוכנית עבור הקלט הנתו? שאלה 10.5 נתונה הצהרת המער הבאה: ;]int[] temp = new int[10 א .כתבו לולאה להשמת הער 0בכל אחד מאיברי המער. הוראת המדעים ,אוניברסיטת תל-אביב -421- מדעי המחשב ב .כתבו לולאה לקליטת עשרה נתוני קלט בעשרת איברי המער. ג .כתבו לולאה להכפלה ב 2#של ערכו של כל איבר במער. ד .כתבו לולאה להצגה כפלט של חצי מערכו של כל איבר במער. שאלה 10.6 פתחו אלגורית אשר הקלט שלו הוא רשימה של עשרה ציוני ,והפלט שלו הוא רשימת הכוללת לכל ציו את מרחקו מהציו הממוצע .מרחקו של ציו מהציו הממוצע הוא ציו ממוצע −ציו ,כלומר, הער המוחלט של ההפרש בי הציו לציו הממוצע .ישמו את האלגורית בשפת .Java שימו ♥ :חשוב להבחי בי ערכו של איבר לבי ערכו של המציי של איבר ,כפי שמראה הדוגמה הבאה. נניח שנתו המער arrהבא: ]arr[2 ]arr[1 ]arr[0 1 0 -1 arr ערכו של האיבר הראשו הוא ,-1ערכו של האיבר השני הוא 0וערכו של האיבר השלישי הוא .1 נתו משתנה ,iמטיפוס של ,ונתו קטע התוכנית הבא: ;1. i = 0 ;)]2. System.out.println(i + " " + arr[i ;3. i = i + 1 ;)]4. System.out.println(i + " " + arr[i ;5. arr[i] = arr[i] + 1 ;)]6. System.out.println(i + " " + arr[i הנה טבלת המעקב אחר מהל ביצוע ההוראות שבקטע התוכנית: פלט 0 -1 1 0 1 1 ]arr[2 ]arr[1 ]arr[0 i 1 1 0 0 -1 -1 ? 0 1 0 -1 0 1 0 -1 1 1 0 -1 1 1 1 -1 1 1 1 -1 1 מספר שורה המשפט הבא לביצוע i = 0 System.out…(i + " " + )]arr[i i = i + 1 System.out…(i + " " + )]arr[i הוראת המדעים ,אוניברסיטת תל-אביב arr[i] = arr[i] + 1 System.out…(i + " " + )]arr[i -422- 1. 2. 3. 4. 5. 6. מדעי המחשב בקטע התוכנית הזה תפקידו של המשתנה iהוא להיות מציי של איברי המער ,arrכלומר ,משתנה שבאמצעותו פוני אל איברי המער .כפי שנית לראות מטבלת המעקב ערכו של iאינו שווה בהכרח לערכו של האיבר שנמצא במקו ה ,i#כלומר ל.arr[i]# בפרט ,שינוי בערכו של האיבר שנמצא במקו ה i#אינו משפיע על ערכו של ,iכפי שמדגימות בקטע תוכנית זה הוראת ההשמה שבשורה 5והוראת הפלט שבשורה .6 שאלה 10.7 כתבו קטע תוכנית המצהיר על מער מטיפוס של בגודל ,10ומציב בכל תא ער מספרי ששווה לריבוע מקומו הסידורי .למשל ,בתא 0יהיה הער 0ובתא 5יהיה הער .25 שאלה 10.8 במער tשלהל שמורי ערכי שלמי: ]int[] t = new int[20 א .מה מטרת משפט forהבא: )for (int i = 0; i < t.length; i++ { )if (t[i] > i { ;)System.out.println(i } } ב .כתבו משפט forאשר יציג כפלט את מקומ במער )כלומר ,את מצייניה( של כל האיברי במער שערכ כפול )כלומר ,שווה לפי שניי( ממקומ הסידורי במער. שאלה 10.9 בתוכנית הבאה נעשה שימוש במער של תווי: */ קלט :עשר אותיות לועזיות פלט: _________________________________ */ public class Letters { )public static void main (String[] args { ;]char[] letters = new char[10 )for (int i = 0; i < letters.length; i++ { הוראת המדעים ,אוניברסיטת תל-אביב -423- מדעי המחשב ;)"letters[i] = In.readChar("Insert a character } // for )for (int i = 0; i < letters.length; i++ { ) ]== letters[letters.length -1 ]if (letters[i { ;)System.out.println(i } // if } // for } // main } // Letters א .מהו פלט התוכנית עבור הקלט?ABBASABABA : ב .מהי מטרת התוכנית? מלאו את תיאור הפלט בהערה שבראש התוכנית. ג .מדוע נחו" שימוש במער להשגת המטרה שתיארת בסעי ב? בדוגמאות שראינו עד כה ההצהרה על מער לוותה בהקצאה מיידית של מקו עבורו ,בעזרת הפעולה .newע זאת ,הזכרנו שהקצאת המקו בזיכרו יכולה להתבצע ג מאוחר יותר .לעיתי ,אכ נרצה לדחות את ההקצאה ,למשל ,כאשר לא ידוע מראש גודל המער ,והוא תלוי בקלט לתוכנית ,כפי שמדגימה הבעיה הבאה. בעיה 2 מטרת הבעיה ופתרונה :הצגת מער שאורכו אינו ידוע מראש. למבח הקבלה לכיתה המדעית יתקבלו רק התלמידי אשר ציוניה מעל הציו הממוצע של הכיתה. פתחו אלגורית אשר קולט את מספר הניגשי למבח ,ואחר כ קולט את רשימת הציוני של הנבחני .פלט האלגורית יהיה מספר התלמידי המתקבלי לכיתה .ישמו את האלגורית בשפת .Java נית להניח כי לפחות תלמיד אחד ניגש למבח. פירוק הבעיה לתתמשימות התהלי המבוקש כמעט זהה לזה שבפתרו בעיה :1עלינו לקלוט נתוני ולשמור אות ,לחשב את הממוצע ,ולמנות את מספר הנתוני במער הגדולי מהממוצע) .שלא כמו בבעיה ,1ש היה עלינו למנות את מספר הנתוני הקטני מהממוצע(. אבל ,ההבדל העיקרי בי בעיה זו לבעיה 1היא שכעת לא ידוע מראש מספר הנתוני ,ולכ צרי קוד כל לקרוא ער זה מהקלט. הוראת המדעים ,אוניברסיטת תל-אביב -424- מדעי המחשב בהתא לכ ,נקבל את הפירוק הבא לתת#משימות: .1קליטת מספר הניגשים למבחן .2קליטת הציונים ,שמירתם וצבירתם .3חלוקת הסכום המצטבר במספר הנבחנים .4השוואת כל ציון לממוצע ,ומנייתו אם הוא גדול מהממוצע בחירת משתני נשתמש במשתני הבאי: – numOfStudentsמטיפוס של ,לשמירת מספר התלמידי הנבחני – gradesמער באור numOfStudentsמטיפוס ממשי ,לשמירת הציוני – sumOfGradesמטיפוס ממשי ,ישמור את סכו הציוני – averageGradeממוצע הציוני ,מטיפוס ממשי – aboveAverageGradeלמניית מספר הציוני מעל לממוצע ,מטיפוס של. האלגורית האלגורית כמעט זהה לאלגורית שהוצג בפתרו בעיה :1 שאלה 10.10 כתבו את האלגורית לפתרו בעיה .2היעזרו באלגורית שנית לפתרו בעיה ,1ושנו אותו כ שיכלול הוראת קלט של מספר התלמידי הנבחני ,יתייחס למשתני שנבחרו ,ויית את הפלט המבוקש. יישו האלגורית הנה קטע התוכנית המטפל בהצהרה על המער ,קליטת מספר התלמידי ,והקצאת מקו בזיכרו עבור המער: ;int numOfstudents ;int[] grades ;)" numOfstudents = In.readInt("Insert number of students: ;]grades = new int[numOfstudents מיד אחרי שמוקצה למער מקו מתאי בזיכרו ,התכונה lengthשל המער שומרת את אורכו. שאלה 10.11 השלימו את התוכנית לפתרו הבעיה. סוף פתרון בעיה 2 הוראת המדעים ,אוניברסיטת תל-אביב -425- מדעי המחשב שאלה 10.12 כתבו קטע תוכנית המקבלת כקלט מספר של ,חיובי וזוגי ,ומקצה מער מטיפוס של בגודל הער שנקלט .לאחר מכ התוכנית משימה באיברי המער הנמצאי במחצית הראשונה של המער את המספר ,0ובאיברי המער הנמצאי במחצית השנייה של המער את המספר .1 בדוגמאות שראינו עד כה איברי מער נסרקו באופ רצי ,האחד אחרי השני .לעיתי ,נרצה לסרוק איברי מער באופ לא רצי .למשל ,נניח ש arr#הוא מער של עשרה איברי ויש להציג כפלט את ערכיה של כל האיברי שבמקומות הזוגיי במער .ג עבור סריקה כזאת נוכל להשתמש בהוראה לביצוע חוזר באור ידוע מראש ,א נקד את משתנה הבקרה של הלולאה בדילוגי של :2 )for (int i = 0; i < arr.length; i = i + 2 { ;)]System.out.println(arr[i } שאלה 10.13 נתו המער arrהמכיל מאה איברי מטיפוס של. א .תארו את מטרת הלולאה הבאה: )for (int i = 0; i < arr.length; i++ { )if (array[i] % 5 == 0 { ;)]System.out.println(array[i } } ב .תארו את מטרת הלולאה הבאה: )for (int i = 0; i < array.length; i++ { )if (i % 5 == 0 { ;)]System.out.println(array[i } } ג .כתבו לולאה יעילה יותר )כלומר ,שמספר הסיבובי בה קט יותר( להשגת המטרה של סעי ב. הוראת המדעים ,אוניברסיטת תל-אביב -426- מדעי המחשב בבואנו לכתוב הוראה לביצוע חוזר המבצעת סריקה ועיבוד של איברי מער ,נתאי את סוג ההוראה להגדרת הסריקה שצריכה להתבצע. א ידועי מראש ה המציי ממנו צריכה הסריקה להתחיל וה המציי בו היא אמורה להסתיי, והסריקה עצמה היא בדילוגי ידועי ,נשתמש בהוראה לביצוע חוזר שמספר הסיבובי בה ידוע מראש )המיושמת על ידי לולאת .(for א סיו הסריקה תלוי בקיו תנאי ,נשתמש בהוראה לביצוע חוזר בתנאי )המיושמת על ידי לולאת .(while שאלה 10.14 במער sערכי מטיפוס תו. א .תארו את מטרת קטע התוכנית הבא: ;int i = 0 ;int len = s.length )]while (s[i] < s[len - 1 { ;i = i + 1 } ;)System.out.println(i ב .תארו את מטרת קטע התוכנית הבא: ;int c = 0 ;int len = s.length )for (int i = 0; i < len; i++ { ) )]if ( (i % 10 == 0) && (s[i] < s[len - 1 { ;c = c + 1 } } ;)System.out.println(c ג .לולאת ה for#שבקטע התוכנית בסעי ב מתבצעת מספר פעמי השווה לאור המער .sכתבו לולאה שמבצעת אותה המשימה ,א שמספר הסיבובי בה יהיה הרבה יותר קט. הוראת המדעים ,אוניברסיטת תל-אביב -427- מדעי המחשב בעיה 3 מטרת הבעיה ופתרונה :שימוש במער לצור תיאור מבנה ,ושימוש בביטוי חשבוני כמציי של איבר. נתאר משחק על לוח הכולל שורה של שלושי משבצות אשר בחלק מצויי מוקשי .המשבצות ממוספרות מ 1#עד .30 שחק מתקד לאור הלוח על ידי הטלת קובייה ,שעל פיאותיה הספרות 1עד .6א המספר המתקבל מהטלת הקובייה מוביל למשבצת שיש בה מוקש ,השחק נשאר במקומו .א המספר המתקבל מהטלת הקובייה מוביל למשבצת פנויה השחק יכול להתקד. פתחו אלגורית אשר הקלט שלו הוא תיאור הלוח ,נתו על ידי שלושי תווי שערכיה ') 'Tעבור משבצת פנויה( או ') 'Fעבור מוקש( ,ואחריו מספר המציי את מספר המשבצת עליה מוצב השחק. פלט האלגורית הוא הטלות הקובייה אשר עבור יוכל השחק להתקד .הניחו שהשחק מוצב על משבצת שמספרה בי 1ל .24#ישמו את האלגורית בשפת התכנות .Java ניתוח הבעיה בעזרת דוגמאות נתבונ בלוח הבא ,כאשר הסימו ☺ מציי את מיקו השחק והסימו ☼ מציי מוקש: ☼ …… ☼ ☼ ☼ ☺ בלוח זה ,השחק יכול לקד את הכלי עבור כל אחת מ ההטלות 5 ,3 ,1 :או ,6א לא יוכל לקד אותו עבור ההטלות 2או .4 פירוק הבעיה לתתמשימות הנה חלוקה ראשונית של פתרו הבעיה לתת#משימות: .1קליטה ושמירה של מצב הלוח ומקום השחקן על הלוח .2חישוב הטלות הקובייה המותרות להתקדמות והצגתן כפלט בחירת משתני את לוח המשחק נתאר על ידי מער של ערכי בוליאניי בגודל ,30שמצייני איבריו נעי בי 0ל.29# כל איבר במער ישמור את מצב המשבצת המתאימה בלוח .הער trueיתאר משבצת פנויה ,ואילו הער falseיתאר מוקש .בנוס נזדקק למשתנה שיציי את מיקו השחק על הלוח. א כ ,אלה יהיו המשתני בה נשתמש: – boardמער של 30איברי מטיפוס בוליאני – pawnמטיפוס של ,לשמירת מיקו השחק על הלוח הוראת המדעים ,אוניברסיטת תל-אביב -428- מדעי המחשב למשל ,עבור הדוגמה שלעיל ,המער boardייראה כ: ][28] [29 true ][27 false true … ][10 ][9 ][8 ][7 ][6 ][5 ][4 ][3 ][2 ][1 ][0 … true true true false true false true true true true false והמשתנה pawnיכיל את הער ) 1כיוו שהשחק נמצא על המשבצת השנייה(. ההתייחסות לאיברי המער היא בעזרת מציי ,למשל ,הער בתא ] board[pawnמבטא את מצב המשבצת בה נמצא השחק. שימו ♥ :אמנ ,לוח המשחק ממוספר מ 1#עד ,30אבל המער המתאר אותו ממוספר מ 0#עד .29 לכ ,ערכי המשתנה pawnיהיו בתחו 0עד .29 האלגורית ? כיצד נשתמש במער boardכדי לחשב את ההטלות שעבור יוכל השחק להתקד? כדי לחשב את ההטלות שעבור יוכל השחק להתקד יש לבדוק את מצב של שש המשבצות העוקבות למשבצת בה נמצא השחק .כיוו שהמשבצת בה נמצא השחק מתוארת על ידי האיבר ] board[pawnבמער ,שש המשבצות העוקבות מיוצגות על ידי ששת האיברי הבאי לפי הסדר: ].board[pawn+6] , ... ,board[pawn+2] ,board[pawn+1 עבור כל איבר מששת האיברי האלה יש לבדוק א הוא מייצג משבצת פנויה )כלומר ,ערכו הוא .(trueא כ ,יש להציג כפלט את הטלת הקובייה אשר מביאה אליו את השחק. למשל ,א ערכו של ] board[pawn+3מבטא משבצת פנויה ,יוצג 3כפלט ,כיוו שהטלת 3בקובייה מביאה את השחק למשבצת פנויה. .1 :òöá êøòîä ìãåâ ãò 0-î íìù i ìë øåáò çåìä ìù i-ä úöáùîä áöî úà èåì÷ .1.1 ï÷çùä íå÷éî úà èåì÷ .2 .3 :òöá 6 ãò 1-î íìù i ìë øåáò .3.1 íà ä÷éø ï÷çùä íå÷éîî i ÷çøîá úöáùîä i ìù åëøò úà èìôë âöä .3.1.1 הוראת המדעים ,אוניברסיטת תל-אביב -429- מדעי המחשב התוכנית המלאה /* - ל1 משבצות ומיקום משבצת עליה מוצב שחקן )בין30 תיאור לוח משחק בן:קלט (24 הטלות קובייה אשר מביאות את השחקן למשבצת פנויה:פלט */ public class MineBoardGame { public static void main (String[] args) { // הגדרת קבוע final int BOARD_SIZE = 30; // הגדרת משתנים boolean[] board = new boolean[BOARD_SIZE]; char cellStatus; int pawn; // קלט הלוח System.out.println("Insert the board details: Insert F for a cell with a mine, and T for a free cell"); for (int i = 0; i < board.length; i++) { cellStatus = In.readChar("Insert status of cell number " + (i+1)); board[i] = (cellStatus == 'T'); } // קלט מיקום השחקן והתאמתו לאופן שמירת הלוח pawn = In.readInt("Insert the pawn place:"); pawn = pawn - 1; // פלט System.out.println("The rolls that lead to an empty place are: "); for (int i = 1; i <= 6; i++) { if (board[pawn + i]) { מדעי המחשב -430- אביב- אוניברסיטת תל,הוראת המדעים ;)System.out.println(i } // if } // for }// main } //class MineBoardGame שימו ♥ :בלולאה הראשונה השתמשנו במציי iכדי לעדכ את מצב המשבצת התורנית בלוח .על מנת להודיע למשתמש את מספר המשבצת שאת מצבה עליו להזי השתמשנו בביטוי ,i + 1 שמתאי בי מצייני המער )הנעי בי 0ל (29#לאופ הספירה של הלוח )מ 1#עד .(30למשל ,בסיבוב הראשו של הלולאה ,כאשר ערכו של iהוא ,0מוצגת ההודעה Insert status of cell number 1 בלולאה השנייה השתמשנו כמציי בביטוי .pawn + iהביטוי pawn + iמבטא מקו במער שמרחקו מהמקו pawnהוא .i ? לאחר קליטת מקו השחק ,מדוע מוש במשתנה pawnהער הנקלט רק לאחר הקטנתו ב?1# המשתמש בתכנית יזי את מיקו השחק על הלוח כמספר של בי 1ל .30#לעומת זאת ,ערכי המשתנה pawnצריכי להתאי לאופ מספור המער ,מ 0#עד .29 סוף פתרון בעיה 3 שאלה 10.15 בנו טבלת מעקב אחר מהל ביצוע התכנית MineBoardGameלפתרו בעיה 3עבור הקלט: TTFFTFTFT ...T2 כלומר ,יש מוקש במשבצת השלישית והרביעית ,ומהמשבצת השישית ואיל ,יש מוקש בכל משבצת זוגית .השחק נמצא במשבצת השנייה. מהו הפלט המתקבל? שאלה 10.16 הרחיבו את האלגורית לפתרו בעיה 3כ שיציג כפלט לא רק את ההטלות שמאפשרות לשחק להתקד ,אלא ג את המשבצות אליה הטלות אלו מובילות .למשל ,עבור הקלט שבשאלה הקודמת יכלול הפלט החדש ג את הרשימה7 : .5 שאלה 10.17 נניח שנכתבו משפטי ההצהרה הבאי: ;]int[] arr = new int[100 ;int position ;int counter = 0 הוראת המדעים ,אוניברסיטת תל-אביב -431- מדעי המחשב לאיברי המער arrהושמו ערכי ,ולמשתנה positionנקלט ער חיובי של בתחו 1עד .79 א .תארו את מטרת קטע התוכנית הבא: ) ]if (arr[position] == arr[position - 1 { ;)"System.out.println("previous one is equal } ) ]if (arr[position] == arr[position + 1 { ;)"System.out.println("next one is equal } ב .תארו את מטרת קטע התוכנית הבא: )for (int i = 0; i < 10; i++ { ) ]if (arr[position] == arr[position + i { ;counter = counter + 1 } } ;)System.out.println(counter ג .כתבו לולאה שמטרתה הצגה כפלט של מצייניה של איברי המער ,מבי 20האיברי העוקבי ל , arr[position]#אשר ערכ גדול מערכו של ].arr[position ד .כתבו לולאה שמטרתה הצגה כפלט של מצייניה של איברי המער ,מבי 20האיברי העוקבי ל , arr[position]#אשר ערכ גדול בדיוק ב 1מערכו של ]. arr[position שאלה 10.18 פתחו ויישמו אלגורית אשר הקלט שלו הוא רצ של 20תווי ,והפלט שלו הוא מספר הזוגות של תווי עוקבי ששווי לזוג התווי האחרו. למשל ,עבור הקלט abcabacadcababddaaabהפלט הוא 4כיוו שהזוג האחרו הוא ,abויש עוד ארבעה זוגות השווי ל.ab# שימו ♥ :עבור קלט של 20תווי זהי הפלט צרי להיות ) 19כיוו שכל הזוגות ,מהראשו ועד הזוג הלפני אחרו ,שווי לזוג האחרו(. הוראת המדעים ,אוניברסיטת תל-אביב -432- מדעי המחשב שאלה 10.19 במשחק נתו לוח הכולל שורה של 25משבצות אשר בכל אחת מה רשו מספר של בי 0ל .5#על הלוח מוצב שחק בי המשבצות העשירית והחמש#עשרה. השחק מטיל קובייה כדי לנסות ולהתקד על הלוח .א המספר המתקבל בהטלת הקובייה מוביל למשבצת אשר המספר הרשו בה קט או שווה למספר המתקבל בקובייה ,השחק מקד את הכלי למשבצת זו .אחרת ,השחק נסוג אחורה מספר משבצות השווה למספר המתקבל בקובייה. פתחו אלגורית אשר הקלט שלו הוא תיאור הלוח ,נתו על#ידי 25מספרי )שערכיה נעי בי 0ל# ,(5ואחריו מקו השחק על הלוח וערכה של הטלת הקובייה .הפלט שלו הוא מקומו החדש של השחק על הלוח .ישמו את האלגורית בשפת .Java שימו ♥ :יש להתאי בי מיקו המשבצת כפי שנקלוט )בי 1ל (25#לבי מציי המער ,בי 0ל.24# שאלה 10.20 מה יהיה פלט קטע התוכנית הבא? ;]int[] arr = new int[10 )for (int i = 0; i < arr.length / 2; i++ { ;arr[i * 2] = i } שאלה 10.21 המער arrהוא מער מאור 10המכיל מספרי שלמי .תארו מה יהיה הפלט של קטע התוכנית הבא. )for (int i = 0; i < arr.length; i++ { ;]arr[i] = arr[arr.length - i } שאלה 10.22 א .המער arrהוא מער מאור 10המכיל מספרי שלמי .תארו מה יהיה הפלט של קטע התוכנית הבא. )for (int i = 0; i < arr.length - 1; i++ { ;]arr[i + 1] = arr[i } הוראת המדעים ,אוניברסיטת תל-אביב -433- מדעי המחשב ב .תקנו את קטע התוכנית כ שיבצע הזזה של ערכי התאי במער בצורה מעגלית ,כלומר ,התא השני יכיל את ערכו המקורי של התא הראשו ,התא השלישי יכיל את ערכו המקורי של התא השני ,וכ הלאה ,והתא הראשו – יכיל את ערכו המקורי של התא האחרו. שאלה 10.23 א .חברי קבוצת "סיורי הגליל" הולכי תמיד בטור ,זה אחר זה .לאחר עשרי דקות הליכה ,הראשו בטור נעצר וממתי עד שהטור כולו עובר אותו ,ואז מצטר לטור שוב כאחרו .פתחו אלגורית המקבל כקלט את מספר חברי הקבוצה ,ולאחר מכ את רשימת השמות של חברי הקבוצה ,על פי הסדר בו ה מתחילי את הטיול .פלט האלגורית יהיה סדר חברי הקבוצה לאחר שעה ורבע של הליכה .ישמו את האלגורית בשפת התכנות .Java ב .חברי קבוצת "סיורי הגליל למתחילי" הולכי תמיד בטור ,כאשר ראשו נמצא המדרי ,ובסו נמצאי החובש ,המלווה והמאס .בקדמת הטור צועדות הבנות ואחריה צועדי הבני .רק הבני מחליפי מקומותיה כל עשרי דקות כפי שתואר עבור קבוצת "סיורי הגליל". פתחו אלגורית המקבל כקלט את מספר הבני ומספר הבנות בקבוצה ,ורשימה של שמות חברי הקבוצה ,על פי הסדר בו ה מתחילי את הטיול .פלט האלגורית יהיה סדר חברי הקבוצה לאחר שעה ורבע של הליכה .ישמו את האלגורית בשפת התכנות .Java שאלה 10.24 פתחו אלגורית המקבל כקלט סדרת מספרי בסדר עולה ,ולאחר קליטתה מסדר ושומר את הסדרה הנתונה בסדר יורד .ישמו את האלגורית בשפת התכנות .Java 10.2חריגה מגבולות מערך ? בהגדרת בעיה 3נכללה הנחה כי השחק מוצב על משבצת שמספרה בי 1ל .24 #מדוע הנחה זו חשובה? נניח כי השחק עומד על משבצת שערכה גבוה מהמספר ,24למשל .25 ,הטלת הקובייה נותנת מספר כלשהו בי 1ל .6#א הטלת הקובייה תית את המספר ,6השחק ינסה לנוע 6צעדי קדימה ,החל מהמשבצת ה .25#כ יגיע השחק למשבצת מספר .31א משבצת זו אינה קיימת ואינה חוקית בתנאי המשחק! ניסיו להתייחס במהל ביצוע תוכנית בשפת ,Javaלתא שאיננו קיי במער )למשל ],(board[30 יגרו להפסקת פעולתה של התוכנית ,ולהצגת הודעת שגיאה על חריגה מגבולות המער .חריגה מגבולות המער היא שגיאת ריצה ,המתגלה בזמ ביצוע התוכנית ולא בזמ ההידור. הוראת המדעים ,אוניברסיטת תל-אביב -434- מדעי המחשב שאלה 10.25 נוסי לפתרו בעיה 3משתנה בש ,limitמטיפוס של ,אשר ישמש כער סופי למשתנה הבקרה של הלולאה השנייה )לולאת הצגת הפלט(. נשתמש ב limit#כדי להרחיב את משפטי התוכנית ) MineBoardGameלפתרו בעיה ,(3כ i שהתוכנית תאפשר לקלוט עבור מיקו השחק ער בי 1ל) 29#במקו 24כמו בבעיה המקורית(, ובכל זאת בלולאה השנייה לא תהיה חריגה מגבולות המער. לפני הלולאה השנייה נוסי הוראה לביצוע בתנאי: )_______________( if _______________ else _______________ וכותרת הלולאה השנייה תהיה: )for (int i = 1; i <= limit; i++ השלימו את ההוראה לביצוע בתנאי ,כ שהתוכנית תבצע את הדרוש. שאלה 10.26 נתו המער arrשהצהרתו היא: ;]int[] arr = new int[8 וערכי איבריו ה: ]arr[7 ]arr[6 ]arr[5 ]arr[4 ]arr[3 ]arr[2 ]arr[1 ]arr[0 7 6 7 5 40 30 20 10 א .מה יהיה פלט הלולאה הבאה? )for (int i = 0; i < arr.length - 1; i++ { )]if (i == arr[i] || i == arr[i + 1 { ;)System.out.println(i } } הוראת המדעים ,אוניברסיטת תל-אביב -435- מדעי המחשב ? מה יהיו ערכי המער אחרי ביצוע הלולאה הבאה.ב for (int i = 0; i < arr.length; i++) { if (arr[i] == (10 * i)) { arr[i] = arr[i] + 1; } else { arr[i] = arr[i] - 1; } } ? עבור אילו מארבעת הלולאות הבאות תהיה חריגה מגבולות המער.ג .1 for (int i = 0; i < arr.length; i++) { arr[i] = arr[i + 1]; } .2 for (int i = 0; i < arr.length - 1; i++) { arr[i] = arr[i - 1]; } .3 for (int i = 0; i < arr.length - 1; i++) { arr[i] = arr[i] * 2; } .4 for (int i = 0; i < arr.length - 1; i++) { arr[i] = arr[i * 2]; } מדעי המחשב -436- אביב- אוניברסיטת תל,הוראת המדעים שאלה 10.27 השאלה מתייחסת למער arrב 8האיברי שהוגדר בשאלה הקודמת. כתבו הוראה לביצוע חוזר אשר בה יושוו ערכיה של כל זוג איברי שכני במער )] arr[0ע ] arr[1] ,arr[1ע ] arr[6] , ... ,arr[2ע ] ,(arr[7ויחושב מספר זוגות האיברי השכני שערכיה שווי זה לזה. שימו ♥ :לא לחרוג מגבולות המער. שאלה 10.28 על אלי הוטל לכתוב תוכנית המגדירה מער ב 50תאי ,ומציבה בה את הערכי … 0.5 1 1.5 2 2.5 3 3.5 אלי כתבה: ;]double arr[] = new int[50 )for (int i = 0; i < arr.length * 2; i++ { ;arr[i] = i/2 } הא קטע התוכנית נכו? א איננו נכו – תקנו את השגיאות כ שתושג המטרה המבוקשת. שאלה ) 10.29מבגרות קי" (2002 לפניכ קטע תוכנית: )for (int i = 0; i < n - 2; i++ { )]if (a[i] + 2 == a[i + 2 { ;)]System.out.println(i + " " + a[i } } aהוא המער הבא בגודל :10 9 1 6 5 4 2 20 5 18 3 a: א .עקבו בעזרת טבלת מעקב אחר קטע התוכנית עבור n=10ועבור המער aהנתו ,ורשמו מה יהיה הפלט. ב .הסבירו מדוע קבע כותב קטע התוכנית שהגבול העליו של הלולאה יהיה n - 2ולא .n הוראת המדעים ,אוניברסיטת תל-אביב -437- מדעי המחשב 10.3קשרים בין מערכים בדוגמאות שראינו עד כה השתמשנו במער יחיד .לעיתי פתרו בעיה מצרי יותר ממער אחד. בסעי זה נראה פתרונות אלגוריתמיי המשתמשי ביותר ממער אחד .בחלקו הראשו של הסעי נציג עיבוד של כמה מערכי במקביל ,בקצב זהה ,ובחלקו השני נעסוק ג בעיבוד של כמה מערכי, שאינו נעשה באותו קצב התקדמות. עיבוד מערכים במקביל ובקצב זהה השאלה הבאה עוסקת בניתוח קטע תוכנית המעבד במקביל שני מערכי ,ופתרו השאלה שאחריה מצרי שימוש בשלושה מערכי. שאלה 10.30 m1ו m2#ה שני מערכי שהוצהרו באופ הבא: ;final int SIZE = 10 ;]int m1[] = new int[SIZE ;]int m2[] = new int[SIZE נתוני שני קטעי התוכניות הבאי אשר אמורי להציג כפלט הא שני המערכי מכילי בדיוק את אות איברי ,באותו סדר. II I ;boolean compare = false ;boolean compare = false )for (int i = 0; i < SIZE; i++ )for (int i = 0; i < SIZE; i++ { { )]if (m1[i] == m2[i )]compare = (m1[i] == m2[i { } // for compare = true )if (compare } // if { } // for )if (compare { System.out.println("The arrays ;)"are equal System.out.println("The arrays } ;)"are equal else { } else System.out.println("The arrays { ;)"are not equal System.out.println("The arrays } ;)"are not equal } הוראת המדעים ,אוניברסיטת תל-אביב -438- מדעי המחשב שני קטעי התוכניות שגויי .ענו על הסעיפי הבאי ביחס לכל אחד מהקטעי: א .הביאו דוגמה לערכי של איברי שני המערכי עבור קטע התוכנית משיג את מטרתו. ב .הביאו דוגמה לערכי של איברי שני המערכי עבור קטע התוכנית אינו משיג את מטרתו, והסבירו מדוע זה קורה. ג .תקנו את קטע התוכנית כ שישיג את מטרתו. שאלה 10.31 כיתה י' 5ניגשה למבח .לאחר המבח הוחלט כי הכיתה כולה תיגש למבח נוס ,והציו הגבוה מבי שני ציוני המבחני יהיה הציו הקובע. פתחו אלגורית הקולט את מספר התלמידי בכיתה ,ולאחר מכ קולט את ציוני המבח הראשו למער arrואת ציוני המבח השני למער .brrהאלגורית ימלא מער crrכ שיכיל את הציו הקובע לכל אחד מתלמידי הכיתה ,ויציג כפלט עבור כל אחד מהתלמידי את ציו המבח הראשו ,ציו המבח השני והציו הקובע ,בליווי הודעות מתאימות .ישמו את האלגורית בשפת .Java עיבוד מערכים במקביל ,בקצב לא זהה בעיה 4 מטרת הבעיה ופתרונה :הצגת עיבוד של כמה מערכי במקביל ,בקצב לא זהה. פתחו אלגורית המקבל כקלט מספר חיובי של ,numולאחר מכ קורא מהקלט numמספרי שלמי לתו מער .arrהאלגורית מעתיק מהמער arrאת המספרי החיוביי למער brrואת המספרי השליליי למער ,crrתו שמירה על סדר המספרי .ישמו את האלגורית בשפת .Java ניתוח הבעיה בעזרת דוגמאות נניח כי הקלט הוא .6 1 -2 3 4 -2 המער arrישמור בתוכו 6מספרי שלמי .בעקבות ההעתקה הדרושה יכיל המער brrשלושה איברי 3 ,1 :ו .4#המער crrיכיל שני איברי -1 :ו.-2# אנו רואי כי לא רק שלכל מער מועתק מספר שונה של איברי ,אלא שקצב ההתקדמות על המערכי הללו שונה :ייתכ כי נסרוק כמה איברי במער ,arrא לא נתקד כלל באחד המערכי אליה מתבצעת ההעתקה .למשל ,בדוגמת הקלט שלעיל ,בזמ שבמער arrנסרקי האיברי השלישי והרביעי ,בזה אחר זה ,אי כלל התקדמות במילוי המער .crr הוראת המדעים ,אוניברסיטת תל-אביב -439- מדעי המחשב פירוק הבעיה לתתמשימות .1קליטת מספר הערכים לעיבוד .2קליטת רשימת הערכים ושמירתה במערך arr .3ביצוע במקביל של סריקת המערך arrומילוי המערכים brrוcrr- בחירת משתני כדי לסרוק את המערכי בקצב לא זהה ,עלינו לשמור שלושה מצייני שוני ,אחד עבור כל מער: המציי של המער arrיסרוק את איברי המער בזה אחר זה .המציי של מער brrוהמציי של המער crrיצביעו בכל רגע על המקו הפנוי הבא במער המתאי ,כדי שהעתקת האיבר הבא תתבצע במקו הנכו. המציי של המער arrיקוד ב 1#בכל פע שנסיי עיבוד של איבר תור במער ונתקד לאיבר האיבר הבא. כל אחד מהמצייני האחרי ,של המער brrושל המער ,crrיקוד ב 1#רק אחרי ביצוע העתקה למער אליו הוא מתייחס. נשתמש במשתני הבאי: – sizeמספר הערכי לעיבוד – arrמער מטיפוס של ,בגודל size – brrמער מטיפוס של ,בגודל size – crrמער מטיפוס של ,בגודל size – indexArrמטיפוס של ,יציי את מיקו האיבר התור במער arr – indexBrrמטיפוס של ,יציי את המקו הפנוי הבא במער brr # indexCrrמטיפוס של ,יציי את המקו הפנוי הבא במער crr האלגורית size-ì íìù éáåéç êøò èåì÷ .1 .2 :òöá size -1 ãò 0-î íìù i ìë øåáò arr[i] ì ïåúð èåì÷ .2.1 0-ì indexBrr úà ìçúà .3 0-ì indexCrr úà ìçúà .4 .5 :òöá size -1 ãò 0-î íìù indexArr ìë øåáò הוראת המדעים ,אוניברסיטת תל-אביב -440- מדעי המחשב íà .5.1 arr[indexArr]>0 brr[indexBrr]-ì arr[indexArr] ìù åëøò úà ÷úòä .5.1.1 1-á indexBrr ìù åëøò úà ìãâä .5.1.2 úøçà .5.2 crr[indexCrr]-ì arr[indexArr] ìù åëøò úà ÷úòä .5.2.1 1-á indexCrr ìù åëøò úà ìãâä .5.2.2 יישו האלגורית שאלה 10.32 ישמו את האלגורית לפתרו בעיה 4בשפת .Java סוף פתרון בעיה 4 שאלה 10.33 פתחו אלגורית אשר מקבל כקלט מספר חיובי של ,ולאחר מכ קולט רשימת מספרי שאורכה כער הנתו הראשו .האלגורית ישמור את המספרי הנקלטי בשני מערכי שוני ,מער אחד עבור מספרי זוגיי ,ומער שני עבור מספרי אי#זוגיי .האלגורית יציג כפלט את כל הערכי שברשימה :ראשית את כל המספרי הזוגיי ,על פי סדר קליטת ,ואחר#כ את כל המספרי האי# זוגיי ,על פי סדר קליטת .ישמו את האלגורית בשפת .Java שאלה 10.34 נניח ש arr1#ו arr2#ה שני מערכי מטיפוס של ,שאורכ אינו בהכרח שווה .כתבו קטע תוכנית אשר מעתיק למער שלישי ,arr3רק את האיברי אשר נמצאי ג ב arr1#וג ב.arr2# למשל ,א ב arr1#וב arr2#נמצאי הערכי הבאי: 4 3 11 73 9 8 36 arr1 12 8 8 77 4 arr2 אז ב arr3#יהיו הערכי הבאי: 0 0 0 0 0 8 4 arr3 הדרכה :יש להשתמש בקינו של הוראות לביצוע חוזר. הוראת המדעים ,אוניברסיטת תל-אביב -441- מדעי המחשב 10.4מערך מונים בפרק 7למדנו על משתנה מסוג מונה .למדנו כי מונה הוא משתנה אשר תפקידו למנות מספר של אירועי שמתרחשי )כמו למשל ,הופעות של נתוני או מספר חישובי מבוצעי( .כיוו שהשימוש במונה הוא לצור ספירה ,מונה הוא משתנה מטיפוס של .לעיתי יש לתחזק במקביל כמה מוני, בעלי תכונות דומות .לש כ נית להשתמש במער של מוני ,כפי שמדגימה הבעיה הבאה .העבודה ע מער מוני היא תבנית שימושית לפתרו בעיות אלגוריתמיות. בעיה 5 מטרת הבעיה ופתרונה :הצגת מער מוני ושימוש בו בתוכנית "כוכב נולד" יש Nמועמדי ,ולכל מועמד מספר סידורי בי 1ל .N#הצופי בבית נתבקשו לבחור את אחד המועמדי ולהצביע עבורו .בכל תוכנית המועמד שמקבל את מספר הקולות הקט ביותר עוזב את התוכנית .פתחו אלגורית אשר מקבל כקלט את מספר המועמדי )מספר חיובי של( ,ואחר כ קולט רשימה של הצבעות של הצופי ,המסתיימת במספר .-1האלגורית מודיע כפלט מי המועמד אשר קיבל את מספר הקולות הקט ביותר .ישמו את האלגורית בשפת התכנות .Java פירוק הבעיה לתתמשימות .1קליטת מספר מועמדים .2קליטת הצבעות למועמדים תוך מניה של ההצבעות עבור כל מועמד .3מציאת המונה בעל הערך המינימלי והצגה כפלט של המועמד אליו הוא מתאים בחירת משתני כדי לבצע את תת#משימה 2עלינו לתחזק במקביל כמה מוני ,מונה לכל מועמד .כלומר ,מספר המוני שווה למספר המועמדי .כמוב שאי אנו יכולי להצהיר על מונה נפרד לכל מועמד :מספר המועמדי כלל אינו ידוע מראש ,ואפילו א היה ידוע ,ייתכ כי הוא גדול למדי .בכל מקרה ,הצהרה על מונה נפרד לכל מועמד הופכת את התוכנית למסורבלת ,קריאה פחות ,וקשה יותר לשינוי )למשל, א מספר המועמדי משתנה(. לכ ,נשמור את המוני כמער שאורכו כמספר המועמדי. נזדקק למשתני הבאי: – numOfSingersמטיפוס של ,שומר את מספר המתמודדי בתחרות – votesמער מטיפוס של ,מער מוני ,באור ,numOfSingersלמניית ההצבעות עבור כל מועמד ומועמד הוראת המדעים ,אוניברסיטת תל-אביב -442- מדעי המחשב – voteמטיפוס של ,שומר הצבעה תורנית מהקלט – minמטיפוס של ,לשמירת ההצבעה המצטברת הנמוכה ביותר – minSingerמטיפוס של ,שומר את מספר המתמודד שקיבל מספר הצבעות נמו ביותר האלגורית לצור ביצוע תת#משימה 2יש להשתמש בביצוע חוזר ,אשר בכל סיבוב בו תיקלט הצבעה נוספת מהקלט ,ובהתא לערכה יגדל ערכו של המונה המתאי .מאחר שמספר ההצבעות אינו ידוע מראש, וסו רשימת ההצבעות מצוי על ידי זקי ,נשתמש בביצוע חוזר בתנאי ,המתייחס לזקי . לצור ביצוע תת#משימה 3נחפש את האיבר הקט ביותר במער המוני. שימו ♥ :יש להציג כפלט את מספרו הסידורי של המתמודד שקיבל את מספר הקולות הקט ביותר, ולא את מספר הקולות שקיבל .לכ ,בעצ ,נשתמש בתבנית של מציאת מקו המינימו. numOfSingers-á íéããåîúîä øôñî úà èåì÷ .1 vote-á ãîòåî øôñî èåì÷ .2 ãåò ìë .3 vote ≠ -1 :òöá vote øôñî ããåîúî ìù (êøòîá) äðåîä úà 1-á äìòä .3.1 vote-á ãîòåî øôñî èåì÷ .3.2 ïåùàøä ããåîúîä ìù äðåîä êøòì min úà ìçúà .4 1-ì minSinger úà ìçúà .5 :òöá numOfSingers ãò 2-î íìù i ìë øåáò .6 .6.1 íà min-î ïè÷ i øôñî ããåîúî ìù äðåîä êøò i øôñî ããåîúî ìù äðåîä êøò úà min-á íùä .6.1.1 minSinger-á i úà íùä .6.1.2 minSinger êøò úà èìôë âöä .7 יישו האלגורית חשוב לשי לב כי המספרי הסידוריי של המועמדי מתחילי מ ,1#בעוד שמספור איברי המער מתחיל מ .0#לכ למשל ,היישו של הוראה 3.1באלגורית הוא ;votes[vote – 1]++ והיישו של הוראה 6.1הוא if (votes[i – 1] < min הוראת המדעים ,אוניברסיטת תל-אביב -443- מדעי המחשב התוכנית המלאה /* מספר המועמדים בתוכנית "כוכב נולד" והצבות הצופים למועמדים:קלט המספר הסידורי של המתמודד המפסיד:פלט */ public class IsraeliIdol { public static void main (String[] args) { // הגדרת משתנים int numOfSingers; int[] votes; int vote; int min; int minSinger; // קליטת מספר מועמדים והקצאת גודל מערך מתאים numOfSingers = In.readInt("Insert number of contestants: "); votes = new int[numOfSingers]; // קליטת בחירת הצופים בלולאת זקיף vote = In.readInt("Insert a vote, end the list of votes with -1 "); while (vote != -1) { // הוספת קול נוסף למונה המתאים votes[vote - 1]++; vote = In.readInt("Insert a vote, end the list of votes with -1 "); } // אתחול משתני מינימום ומקום המינימום min = votes[0]; minSinger = 1; // חיפוש ערך מינימלי ושמירת ערכו וערך המציין שלו for(int i = 2; i <= numOfSingers; i++) { if (votes[i - 1] < min) { min = votes[i - 1]; minSinger = i; } // if } // for // פלט מדעי המחשב -444- אביב- אוניברסיטת תל,הוראת המדעים System.out.println("contestant number " + minSinger + " is going ;)"home } //main } //class IsraeliIdol שימו ♥ :כש שיש לאתחל משתנה מסוג מונה לאפס ,כ ג יש לאתחל כל איבר ואיבר במער מוני ל .0#אי אנו מבצעי אתחול כזה במפורש ,משו שאנו מסתמכי על כ שבשפת Javaאיבריו של מער מטיפוס מספרי מאותחלי אוטומטית ל ,0#מייד אחרי שמוקצה שטח עבור המער. ועוד שימו ♥ :את תבנית מציאת מקו המינימו נית ג לייש בצורה מעט שונה ,הנוחה לעבודה ע מערכי .למעשה ,ביישו זה נשמר רק מקו האיבר המינימלי ולא ערכו ,ואנו מסתמכי על כ שבמער ,קל לברר את ערכו של איבר ,כאשר ידוע המציי שלו:. חיפוש ערך מינימלי ושמירת ערך המציין שלו // )for(int i = 2; i <= numOfSingers; i++ { )]if (votes[i - 1] < votes[minSinger { ;minSinger = i } // if } // for ;)"System.out.println("contestant number " + minSinger + " is going home סוף פתרון בעיה 5 להעמקה בתבנית מערך מונים פנו לעמוד .463 שאלה 10.35 עקבו אחר התכנית IsraeliIdolבעזרת טבלת מעקב ,עבור הקלט 4 2 3 1 1 2 4 4 2 -1 )משמאל לימי(. שאלה 10.36 בכיתה נערכו הצבעה לנציג הכיתה למועצת תלמידי .כל תלמיד הזי למחשב את בחירתו על פי המפתח הבא :עבור רותי מוז הער ,1עבור אלי – הער ,2עבור אביב – הער ,3ועבור אופיר – הער .4 פתחו אלגורית המקבל כקלט את מספר התלמידי בכיתה ,ואת רשימת ההצבעות )הצבעה אחת עבור כל תלמיד בכיתה( ומציג כפלט את מספר המועמד המנצח .ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -445- מדעי המחשב שאלה 10.37 בספריית הווידיאו יש לכל סרט קוד ב 4ספרות .הספרה השמאלית ביותר מסמנת את קוד המחלקה )בי 1ל ,(6#שתי הספרות האמצעיות מסמנות את קוד הסרט )בי 1ל (99#והספרה הימנית ביותר מסמנת את מספר העותקי בספריה )בי 1ל.(9# פתחו אלגורית המקבל כקלט רשימה של הקודי של כל הסרטי בספריה ,המסתיימת במספר .0 פלט האלגורית הוא הקוד של המחלקה שבה יש את מספר הסרטי הגדול ביותר. ישמו את האלגורית בשפת התכנות .Java בשאלה 10.37יש למצוא איבר שכיח במער .להעמקה בתבנית חישוב שכיח פנו לעמוד .471 10.5מערך צוברים באותו אופ בו מימשנו מער של מוני ,נית לממש מער של צוברי .במער צוברי כל איבר הוא צובר בפני עצמו ,א יש קשר בי משימות הצבירה עליה אחראיי הצוברי השוני במער .לצור פתרו השאלה הבאה יש להשתמש במער צוברי ,שהעבודה עימו מהווה א היא תבנית שימושית. שאלה 10.38 במשחק הקלפי קירטטה משתתפי ארבעה שחקני בעלי מספרי סידוריי מ 1#עד ,4במש כמה סבבי .בכל סבב מוכרזי השחקני שזכו במקו הראשו )המנצח( ,במקו שני ובמקו שלישי. השחק הנותר נחשב כמפסיד .המנצח במקו הראשו מקבל 7נקודות ,השחק שבמקו השני מקבל 3נקודות ,השחק שבמקו השלישי אינו מקבל נקודות והמפסיד מאבד 4נקודות. המנצח במשחק כולו הוא זה שקיבל את מירב הנקודות בסיו כל הסבבי. פתחו אלגורית אשר מקבל כקלט את מספר הסבבי ,ולאחר מכ מקבל עבור כל סבב את מספרי השחקני שהגיעו למקו הראשו ,השני ,והשלישי .האלגורית מציג כפלט את מספרו של השחק המנצח במשחק .ישמו את האלגורית בשפת .Java שימו ♥ :מאחר שנית ג לאבד נקודות ,הרי ייתכ ששחק יגיע למספר נקודות שלילי. להעמקה בתבנית מערך צוברים פנו לעמוד .466 הוראת המדעים ,אוניברסיטת תל-אביב -446- מדעי המחשב 10.6יעילות מקום בכל הבעיות שפתרנו בפרק זה נעזרנו במער ,ועבור כל בעיה ראינו את נחיצות השימוש במער במהל הפתרו .בסעי הבא נתמקד באבחנה בי בעיות אשר בפתרונ נחו" מער לבי בעיות אשר נית לפתור אות ג ללא מער ,ונבי מדוע לא כדאי להשתמש במער א אי בו צור. בעיה 6 מטרת הבעיה ופתרונה :הצגת המדד של יעילות מקו ,והשוואה בי אלגוריתמי ביחס ליעילות מקו .מבט נוס אל יעילות מבחינת זמ ביצוע. ערוצי הכבלי עורכי מדי פע סקרי כדי לברר את אחוזי הצפייה בתוכניותיה השונות .פרסו תוצאות סקר כזה כולל רשימת תוכניות יחד ע אחוז צפייה בכל תוכנית. א .פתחו אלגורית אשר הקלט שלו הוא מספר של תוכניות )של וחיובי( ,ולאחר מכ רשימה שאורכה כער הנתו הראשו ,של אחוזי צפייה בתוכניות .הפלט הוא מספר התוכניות שאחוז הצפייה בה גבוה מממוצע אחוזי הצפייה. ב .פתחו אלגורית אשר הקלט שלו הוא מספר של תוכניות )של וחיובי( ,ולאחר מכ רשימה שאורכה כער הנתו הראשו ,של אחוזי צפייה בתוכניות .הפלט הוא מספר התוכניות שאחוז הצפייה בה גבוה מ.20%# ג .הא תשובתכ לסעי א תשתנה א ידוע כי רשימת אחוזי הצפייה נתונה בסדר יורד )כלומר, תחילה נתו אחוז הצפייה בתוכנית האהודה ביותר ,אחר#כ אחוז הצפייה התוכנית האהודה הבאה ,וכ הלאה ,עד אחוז הצפייה בתוכנית שנצפית הכי פחות( נתחיל בסעי א. הבעיה המוגדרת בסעי א זהה לחלוטי לבעיה .2יש לקלוט אור של רשימת נתוני לא ריקה ,לקלוט את הרשימה עצמה ,לחשב את ממוצע הערכי ,ולמנות את הערכי הגדולי מהממוצע .מאחר שכבר פתרנו בעיה זהה לה ,לא נחזור כעת על הפתרו בפירוט ,רק נזכיר שהפתרו משתמש במער לשמירת ערכי הקלט )במקרה זה ,רשימת אחוזי הצפייה(. נעבור כעת לסעי ב. ניתוח הבעיה בעזרת דוגמאות נניח כי הקלט הוא .4 21 13 18 31במקרה זה הפלט הוא ,2כי אחוז הצפייה בשתי תוכניות )הראשונה והרביעית( גבוה מ .20%#אי אנו נדרשי לחשב ממוצע של אחוזי הצפייה. הוראת המדעים ,אוניברסיטת תל-אביב -447- מדעי המחשב פירוק הבעיה לתתמשימות נית להציג פירוק הדומה לפירוק המתאי לסעי א: .1קליטת מספר התוכניות .2קליטת אחוזי הצפיה ושמירתם .3השוואת כל אחוז צפיה ל 20-ומנייתו אם הוא גדול מ20- פירוק זה אכ משרה צור במער .קוד כל נשמרי הנתוני ,ואחר כ ה מעובדי )במקרה זה, מושווי ל 20#ונמני בהתא לתוצאת ההשוואה(. ? הא נית להציג פירוק פשוט יותר ,שאינו מחייב שימוש במער? כ! נית לעבד כל נתו נקלט מייד ע קליטתו ,להשוותו ל ,20#ולהחליט א למנות אותו או לא, ובעצ אי צור בשמירת ערכי הקלט לאחר מכ .לכ נקבל את הפירוק הבא לתת#משימות: .1קליטת מספר התוכניות .2קליטת אחוזי הצפיה ,ועבור כל אחוז צפייה נקלט ,השוואתו ל 20-ועדכון המונה בהתאם בחירת משתני מאחר שכאמור ,אי צור במער ,נשתמש במשתני הבאי: – rateמטיפוס ממשי ,ישמור את אחוז הצפייה התור בקלט. – above20Counterמטיפוס של ,מונה לשמירת מספר אחוזי הצפייה הגבוהי מ.20# האלגורית úåéðëåúä øôñî úà èåì÷ .1 0-ì above20Counter ìù åëøò úà ìçúà .2 .3 :òöá úåéðëåúä øôñî ãò 0-î íìù i ìë øåáò rate-á ïøåúä äééôöä æåçà úà èåì÷ .3.1 íà .3.2 .3.2.1 20 < rate 1-á above20Counter ìù åëøò úà ìãâä above20Counter ìù åëøò úà èìôë âöä .4 א כ ,למרות שהבעיה המוגדרת בסעי א והבעיה המוגדרת בסעי ב נראות דומות ,הרי שלצור פתרו סעי א יש צור במער ,ואילו לצור פתרו סעי ב אי צור במער. הוראת המדעים ,אוניברסיטת תל-אביב -448- מדעי המחשב מדוע יש בכ חשיבות? כידוע ,בעת ביצוע תוכנית אשר יש בה שימוש במער ,מוקצה שטח זיכרו המספיק עבור כל איברי המער .מספר תאי הזיכרו המוקצי למער הינו מרכיב משמעותי בקביעת גודל הזיכרו הכולל הדרוש לביצוע התוכנית .כיוו שמשאבי הזיכרו של המחשב מוגבלי ,נשתדל לפתח אלגוריתמי אשר גודל המקו הדרוש לביצוע הוא מצומצ במידת האפשר .כלומר ,נשתדל לפתח אלגוריתמי יעילי עד כמה שנית מבחינת מקו בזיכרו .זאת בנוס להקפדה על יעילות מבחינת זמ ביצוע ,כפי שהוצג בפרק .8 כאשר ידועי שני אלגוריתמי שוני לפתרו אותה בעיה ,אשר באחד מה יש שימוש במער ובשני אי שימוש במער ,נאמר שהאלגורית השני יעיל יותר מבחינת מקו בזיכרו. נעבור לפתרו סעי ג. ניתוח הבעיה בעזרת דוגמאות ג בסעי זה יש לפתח אלגורית הפותר את הבעיה שהוצגה בסעי א .אבל ,שלא כמו בסעי א ,נתו לנו מאפיי נוס של הקלט :רשימת אחוזי הצפייה נתונה בסדר יורד . למשל ,הנה קלט העונה להגדרת הבעיה.5 41 30 29 15 3 : ממוצע הערכי הנתוני הוא .23.6הערכי הגבוהי מ הממוצע ה 30 ,41ו .29#נית לראות כי מאחר שרשימת הערכי נתונה בסדר יורד ,הרי כל הערכי הגבוהי מ הממוצע נמצאי בתחילת הרשימה. בדיוק כמו בסעי א ,את ההשוואה לממוצע נית לבצע רק לאחר חישוב הממוצע ,כלומר רק לאחר קליטת כל הערכי. ? הא נית לפתור סעי זה ללא מער? לא .מאחר שההשוואה לממוצע יכולה להיעשות רק אחרי סיו הקלט ,יש לשמור את כל הערכי הנקלטי ,ולש כ נחו" מער. ? הא נוכל בכל זאת לשפר את הפתרו ,תו שימוש במאפיי הקלט הנוס ? בעזרת דוגמת הקלט שניתחנו ראינו כי הערכי הגדולי מ הממוצע נמצאי כול בתחילת הרשימה, ולכ ג יישמרו ראשוני ,בשלב שמירת הקלט .לכ ,בשלב ההשוואה לממוצע לא נצטר לעבד שוב את כל ערכי הקלט ,אלא רק את אלה המופיעי בהתחלה. לכ ,במקו להשתמש בהוראה לביצוע חוזר באור ידוע מראש ,שתעבור על כל האיברי שנשמרו, נוכל להשתמש בהוראה לביצוע חוזר בתנאי .התנאי יאפשר את המש ביצוע הלולאה כל עוד האיבר התור גדול מהממוצע. הוראת המדעים ,אוניברסיטת תל-אביב -449- מדעי המחשב ניתוח זה מראה כי הפתרו שנית לא יהיה יעיל יותר מהפתרו של סעי א מבחינת מקו בזיכרו, אבל יהיה בו שיפור מבחינת יעילות זמ :מניית הערכי הגדולי מהממוצע תצרי מעבר רק על חלק מהאיברי שנשמרו ולא על כול. פירוק הבעיה לתתמשימות בהתא לניתוח שערכנו ,נפרק את הבעיה באופ הבא: .1קליטת מספר התוכניות .2קליטת אחוזי הצפייה ,שמירתם וצבירתם .3חישוב הממוצע .4מעבר על הערכים הגדולים מן הממוצע ,תוך כדי מנייתם .5הצגת ערך המונה בחירת משתני – numOfProgramsמטיפוס של ,לשמירת מספר התוכניות – ratingמער מטיפוס ממשי ב numOfProgramsאיברי ,לשמירת אחוזי הצפייה הנתוני ,שיהיו מסודרי בו בסדר יורד – sumOfRatingמטיפוס ממשי ,צובר שישמור את סכו אחוזי הצפייה – averageOfRatingמטיפוס ממשי ,לשמירת ממוצע אחוזי הצפייה – aboveAverageCounterמטיפוס של ,מונה את אחוזי הצפייה הגבוהי מאחוז הצפייה הממוצע. האלגורית 0-ì sumOfRating úà ìçúà .1 0-ì aboveAverageCounter úà ìçúà .2 numOfPrograms-á úåéðëåúä øôñî úà èåì÷ .3 :òöá numOfPrograms - 1 ãò 0-î íìù i ìë øåáò .4 rating[i]-á i-ä äééôöä æåçà úà èåì÷ .4.1 rating[i] êøòä úà sumOfRating øáåöì óñåä .4.2 averageOfRating-á íùäå sumOfRating / numOfPrograms úà áùç .5 0 êøòä úà i-á íùä .6 :òöá rating[i] > averageOfRating ãåò ìë .7 1-á aboveAverageCounter äðåîä ìù åëøò úà ìãâä .7.1.1 i ìù åëøò úà 1-á ìãâä .7.1.2 aboveAverageCounter ìù åëøò úà èìôë âöä .8 הוראת המדעים ,אוניברסיטת תל-אביב -450- מדעי המחשב שימו ♥ להבדל בי אופי השימוש בתנאי rating[i] > averageOfRatingבאלגורית לפתרו סעי א לבי אופי השימוש בו באלגורית המתואר כא .כא זהו תנאי כניסה להוראה לביצוע חוזר ,בעוד שבאלגורית לפתרו סעי א הוא תנאי השולט על הוראה לביצוע בתנאי. שאלה 10.39 מדוע מובטח כי ההוראה לביצוע חוזר בתנאי ,המונה את הערכי הגבוהי מהממוצע ,אינה לולאה אינסופית )במילי אחרות ,מדוע מובטח כי תנאי הכניסה יתקיי בשלב כלשהו?(? התוכנית המלאה */ קלט :מספר של תוכניות )שלם חיובי( ורשימת אחוזי צפייה בתוכניות ,נתונים בסדר יורד פלט :מספר אחוזי הצפייה הגבוהים מאחוז הצפייה הממוצע */ public class AboveAverage { )public static void main (String[] args { הגדרת משתנים // מספר התוכניות // ;int numOfPrograms מערך אחוזי הצפייה // ;double[] rating צובר אחוזי הצפייה // ;double sumOfRating = 0 ממוצע אחוזי הצפייה // ; double averageOfRating מונה הגבוהים מהממוצע // ;int aboveAverageCounter = 0 קלט וצבירה // numOfPrograms = In.ReadInt("How many programs? Insert a positive ;)"integer ;]rating = new double[numOfPrograms )for (int i = 0; i < numOfPrograms; i++ { ;)"rating[i] = In.readInt("Insert rating percentage ;]sumOfRating = sumOfRating + rating[i } // for חישוב ממוצע // ;averageOfRating = sumOfRating / numOfPrograms מניית הגבוהים מהממוצע // ;int i = 0 )while(rating[i] > averageOfRating הוראת המדעים ,אוניברסיטת תל-אביב -451- מדעי המחשב { ;i++ ;aboveAverageCounter++ } // while פלט // " System.out.println("The rating of " + aboveAverageCounter + ;)"programs is above average } // main } //class AboveAverage סוף פתרון בעיה 6 מפתרו בעיה 6למדנו לקח חשוב: יש לנצל עד כמה שנית את מאפייני הקלט#פלט כדי לנסח אלגורית יעיל ,ה מבחינת מקו בזיכרו וה מבחינת זמ ביצוע. ייתכנו שתי בעיות אלגוריתמיות הנראות דומות ,לפחות במבט ראשו ,אשר פתרונות יעילי עבור נבדלי זה מזה ה מבחינת מקו וה מבחינת זמ .בפרט ,יתכ שעבור פתרו בעיה אחת נחו" מער ועבור פתרו הבעיה האחרת לא נחו" מער. שאלה 10.40 נתונה רשימת קלט של 40ציוני .סמנו הא לביצוע כל אחד מהחישובי הבאי נחו" או לא נחו" מער: א .מספר הציוני הגבוהי מ ....................................................... 80#נחו" מער /לא נחו" מער ב .מספר הציוני השווי לציו הראשו ברשימה .................................נחו" מער /לא נחו" מער ג .מספר הציוני הגבוהי מ הציו האחרו ברשימה ...........................נחו" מער /לא נחו" מער ד .מספר הציוני הנמוכי מ הציו הלפני אחרו ברשימה ....................נחו" מער /לא נחו" מער ה .מספר הציוני הנמוכי מ הציו הראשו ומ הציו האחרו .............נחו" מער /לא נחו" מער ו .מספר הציוני הנמוכי מממוצע הציוני ........................................נחו" מער /לא נחו" מער ז .מספר הציוני הגבוהי מהממוצע של שני הציוני הראשוני ...........נחו" מער /לא נחו" מער ח .מספר הציוני הגבוהי מהממוצע של שני הציוני האחרוני ...........נחו" מער /לא נחו" מער שאלה 10.41 בבעיה 3בפרק הקלט כלל רשימה של 30תווי )' 'Tאו ' ('Fאשר ציינו מצב לוח ,ואחר כ מספר שציי מקו של שחק על לוח .בפתרו הבעיה נעשה שימוש במער ב 30איברי לשמירת מצב הלוח. נניח שמקו השחק על הלוח יינת כקלט לפני הרשימה המתארת את מצב הלוח )ולא אחריה( .הא ג במקרה זה נחו" מער? הסבירו את תשובתכ. הוראת המדעים ,אוניברסיטת תל-אביב -452- מדעי המחשב שאלה 10.42 עודד המציא משחק חדש .הוא מציג לפני חבריו קופסת מטבעות סגורה .כל אחד מחבריו רוש ניחוש של מספר המטבעות בקופסה .לאחר מכ עודד סופר את מספר המטבעות בקופסה .המטבעות מחולקי בי כל מי שניחש את המספר המדויק של המטבעות .שארית המטבעות נשארת אצל עודד. א .פתחו אלגורית אשר מקבל כקלט מספר המציי את מספר החברי המשתתפי במשחק ,אחר# כ את רשימת הניחושי ,ניחוש עבור כל חבר המשתת במשחק ,ולבסו את מספר המטבעות שבקופסה .פלט האלגורית הוא מספריה הסידוריי ברשימה של החברי שניחשו את מספר המטבעות המדויק ,וכ מספר מטבעות שיקבל כל זוכה. ישמו את האלגורית בשפת .Java שימו ♥ :היזהרו מחלוקה ב!0# ב .ענו על סעי א כאשר סדר נתוני הקלט שונה :תחילה נתו מספר המטבעות שבקופסה ,אחריו מספר המשתתפי במשחק ,ולבסו רשימת הניחושי. שאלה 10.43 בכספת של בנק שמורי יהלומי על מדפי הממוספרי מ 1#עד .100 נתונה כקלט רשימת ערכי המבטאי את מצב מדפי הכספת ,כ שהער ה i#ברשימה מבטא את מצב המד ה) i#מכיל יהלומי או לא מכיל יהלומי(. ציינו עבור כל אחד מהחישובי הבאי הא נחו" או לא נחו" מער לצור ביצועו .נמקו את תשובותיכ. א .מספר המדפי המכילי יהלומי ,ומספר המדפי ללא יהלומי ......נחו" מער /לא נחו" מער נימוק: ב .מספר המדפי שמצב שווה למצב המד השני ................................נחו" מער /לא נחו" מער נימוק: ג .מספר המדפי שמצב שווה למצב המד האחרו ............................נחו" מער /לא נחו" מער נימוק: ד .מספר הסידורי של המדפי שמצב שווה למצב המד השני ...........נחו" מער /לא נחו" מער נימוק: ה .מספר הסידורי של המדפי שמצב שווה למצב המד האחרו .......נחו" מער /לא נחו" מער נימוק: הוראת המדעים ,אוניברסיטת תל-אביב -453- מדעי המחשב 10.7בחירה אקראית הגרלת מספרי אקראיי הינה פעולה שימושית מאוד במדעי המחשב .למשל ,בתחו בדיקות התוכנה ,השימוש במספרי אקראיי מאפשר בדיקת תוכנה על אוס קלטי גדול ואקראי שנוצר אוטומטית .ג בתחו ההצפנה מספרי אקראיי ה שימושיי מאוד .בסעי זה נכיר מחלקה המוגדרת בשפת Javaומאפשרת עבודה נוחה ע מספרי אקראיי. בעיה 7 מטרת הבעיה ופתרונה :הצגת מחלקת מספרי אקראיי ואופ השימוש בה. ששת חברי קבוצה בצופי מצאו דר חדשה להגרלה .ה מחלקי ביניה את המספרי מ 1#עד ,6 ומטילי קובייה עד אשר מספר כלשהו מוגרל פעמיי .החבר בעל המספר שהוגרל פעמיי הוא הזוכה .פתחו אלגורית אשר מדמה את תהלי זריקת הקובייה ומדפיס את המספר הזוכה .ישמו את האלגורית בשפת התכנות .Java בבעיה זו אנו מתבקשי לדמות הטלת קובייה במהל ביצוע התוכנית ולא לקבל את תוצאות הטלת הקובייה כקלט .מטרת הטלת קובייה היא למעשה ,בחירת מספר אקראי בי 1ל.6# פירוק הבעיה לתתמשימות נפרק את הבעיה באופ הבא: .1הגרלת מספרים בין 1ל ,6-עד אשר מוגרל מספר בתחום פעם שנייה .2הצגה כפלט של המספר שהוגרל פעמיים בחירת משתני כיוו שעלינו למנות את מספר הפעמי שהוגרל כל מספר בתחו ,יש לתחזק במקביל 6מוני )מוני אלה ימנו רק עד ,2כלומר ,יוכלו לקבל את הערכי 1 ,0או .(2לש כ ניעזר במער מוני .בנוס , עלינו להמשי ולהגריל מספרי כל עוד לא הוגרל מספר אחד פעמיי .לש כ נשתמש במשתנה בוליאני אשר יאותחל ל false#ויקבל ער trueכאשר אחד המספרי מוגרל פע שנייה. א כ ,המשתני העיקריי בה נשתמש ה: – diceRollsמער מוני ,למניית ההגרלות של כל מספר בי 1ל.6# – stopמשתנה בוליאני ,יציי הא הוגרל אחד המספרי פעמיי. – currentRollשל ,לשמירת תוצאת ההגרלה הנוכחית. הוראת המדעים ,אוניברסיטת תל-אביב -454- מדעי המחשב האלגורית false-ì stop úà ìçúà .1 .2 :òöá (íééîòô åäùìë øôñî ìøâåä àì) false àåä stop ìù åëøò ãåò ìë currentRoll-á íùäå 6-ì 1 ïéá øôñî ìøâä .2.1 1-á currentRoll-ì íéàúîä äðåîä ìù åëøò úà ìãâä .2.2 2-ì äååù currentRoll-ì íéàúîä äðåîä ìù åëøò íà .2.3 true-ì stop ìù åëøò úà äðù .2.3.1 currentRoll úà èìôë âöä .3 שאלה 10.44 הסבירו מדוע הוראה 2היא הוראה לביצוע חוזר סופית. יישו האלגורית כדי לייש את הוראה 2.1עלינו לבצע הגרלה של מספר אקראי ,בי 1ל .6#נוכל לבצע הגרלה כזאת ב# Javaבעזרת מחלקת מספרי אקראיי.Random : בעזרת עצ מהמחלקה Randomנית לבצע הגרלות של ערכי בכל תחו שנבחר .כמוב ,כדי שנוכל להשתמש בעצ מהמחלקה עלינו להצהיר עליו ולהקצות לו מקו בזיכרו ,למשל כ: ;)(Random rnd = new Random הוראה זו מצהירה על עצ מהמחלקה ,Randomבש ,rndומקצה לו מקו בזיכרו. כעת ,כשיש בידינו עצ מהמחלקה Randomאנו יכולי להגריל בעזרתו מספר של על ידי הפעלת הפעולה nextIntשל העצ .פעולה זו מקבלת פרמטר יחיד ,שהוא ער של המתאר את טווח המספרי להגרלה .א הער שמועבר לפעולה הוא ,nיוגרל מספר של בתחו שבי 0ל .n-1#מאחר שזו פעולה של העצ ,יש להשתמש בסימו הנקודה כדי להפעילה. למשל ,בעקבות ביצוע ההוראה ;) num = rnd.nextInt(6יוש במשתנה numמספר כלשהו בי 0 ל.5# ? כיצד נדמה הטלת קובייה? כלומר ,כיצד נגריל מספר בי 1ל?6# נעביר לפעולה nextIntאת הער ,6על מנת לקבל מספר אקראי בי 0ל .5#כדי "לתרג" את הער שהתקבל לער אפשרי עבור הטלת קובייה ,נוסי לו את הער .1כ יהיה בידינו מספר אקראי בי 1 ל . 6# ? כיצד נקשר בי הער המוגרל למונה המתאי לו במער? הוראת המדעים ,אוניברסיטת תל-אביב -455- מדעי המחשב מאחר שמיקו האיברי במער מתחיל מ ,0#הרי שהאיבר הנמצא במקו 0מונה את מספר ההטלות של המספר ,1האיבר הנמצא במקו 1מונה את מספר ההטלות של המספר ,2וכ הלאה ,עד לאיבר האחרו ,הנמצא במקו 5ומונה את מספר ההטלות של המספר .6כלומר ,כדי להשתמש בער שהוגרל כמציי מתאי במער ,יש להפחית מערכו .1 לכ ,במקרה זה ,נוח לוותר על התרגו מהער המוגרל )בי 0ל (5#לער אפשרי להטלת קובייה )בי 1 ל ,(6#ולהשתמש בער המוגרל ישירות כמציי למער. בתוכנית זו עלינו לבצע הגרלות חוזרות ונשנות .אבל ,לאחר שהקצינו לעצ מהמחלקה מקו בזיכרו ,אנו יכולי להשתמש בו שוב ושוב להגרלות נוספות )אפילו מתו תחומי שוני(. Random עלינו להצהיר בתחילת התוכנית על כוונתנו להשתמש במחלקה ,Randomכפי שאנו עושי כאשר ברצוננו להשתמש במחלקה .Mathההצהרה נכתבת באופ הבא: ;import java.util.Random התוכנית המלאה */ התוכנית מדמה סדרת הטלות קובייה עד שאחד המספרים מוגרל פעם שנייה פלט :המספר שהוגרל פעמיים */ ;import java.util.Random הודעה כי אנו מתכוונים להשתמש בגוף התוכנית במחלקה Random public class ScoutDiceGame { )public static void main (String[] args { הגדרת משתנים // ;boolean stop = false מערך מונים int[] diceRolls = new int[6]; // תוצאת הטלת קוביה // ;int currentRoll = 0 עצם להגרלה // ;)(Random rnd = new Random ביצוע הטלות חוזרות כל עוד לא הוגרל מספר פעמיים // )while (!stop { הטל קובייה // ;)currentRoll = rnd.nextInt(6 הוסף 1למונה מתאים // ;diceRolls[currentRoll]++ הוראת המדעים ,אוניברסיטת תל-אביב -456- מדעי המחשב בדוק האם המספר הוגרל בפעם השנייה // ;)stop = (diceRolls[currentRoll] == 2 } // while פלט// System.out.println("number " + (currentRoll + 1) + " is the ;)"winner } // main } // class ScoutDiceGame שימו ♥ :אמנ ויתרנו על התרגו בי הער המוגרל לער אפשרי להטלת קובייה ,כדי שנוכל להשתמש בער המוגרל ישירות כמציי למער ,אבל ההתאמה עדיי נדרשת לצור הצגה ברורה של הפלט .לכ ,לפני הצגת הער הזוכה מוגדל ערכו ב) 1#בתו ההוראה .(System.out.println סוף פתרון בעיה 7 נסכ את המושגי החדשי שהוצגו בפתרו בעיה :7 בשפת Javaמוגדרת מחלקה למספרי אקראיי הנקראת .Randomבאמצעות עצ מהמחלקה נית להגריל מספרי אקראיי בתחו מבוקש .כדי להשתמש במחלקה בתו תוכנית Javaצרי לשלב את ההוראה הבאה בתוכנית: ;import java.util.Random לפני ביצוע הגרלות יש להצהיר על עצ מהמחלקה Randomולהקצות עבורו מקו בזיכרו, למשל כ: ;)( Random rnd = new Random הפעולה nextIntשל עצ מהמחלקה Randomמקבלת כפרמטר מספר של חיובי nומחזירה איבר אקראי בתחו 0עד .n-1מאחר שזו פעולה של עצ ,יש להפעילה באמצעות סימו הנקודה, למשל כ: )rnd.nextInt(6 נית לשלב את הפעולה בתו ביטויי חשבוניי ,כ שערכ יהיה ער אקראי בתחו רצוי. באמצעות עצ מהמחלקה ,Randomשהוקצה עבורו מקו בזיכרו ,נית לבצע הגרלות חוזרות ונשנות ,ג מתחומי שוני. נחזור ונדגי את המושגי החדשי שהוצגו בפתרו בעיה :7 ? כיצד נדע מה טווח הערכי האפשריי עבור ביטוי הכולל הגרלה של מספר אקראי? הוראת המדעים ,אוניברסיטת תל-אביב -457- מדעי המחשב נתבונ בביטוי לדוגמה ונבדוק מה טווח הערכי האפשריי עבורו: rnd.nextInt(11)+100 הפעולה ) rnd.nextInt(11מחזירה מספר אקראי של בטווח שבי 0ל.10-לאחר מכ נוס לער המוגרל המספר .100לכ ,א יוגרל המספר 0ער הביטוי כולו הוא ,100וא יוגרל המספר 10ער הביטוי כולו הוא .110לפיכ טווח הערכי האפשריי עבור הביטוי הוא בי 100ל.110 # ? כיצד נגריל מספר בטווח הערכי בי 400ל?500# תחילה נבדוק כמה מספרי יש בי 400ל .500#בתחו זה יש 101מספרי )מדוע?(. א כ ,עלינו להגריל אחד מתו 101מספרי ,וזאת נעשה בעזרת הפעולה ).rnd.nextInt(101 באופ זה יוגרל מספר בי 0ל .100#כעת ,כדי לקבל מספר בתחו שבי 400ל ,500#עלינו להוסי לער המוגרל .400אכ ,א יוגרל 0נקבל לאחר ההוספה את הער ,400וא יוגרל 100נקבל לאחר ההוספה את הער .500לכ ,הביטוי המתאי הוא: rnd.nextInt(101)+400 שאלה 10.45 העצ rndהוא עצ המחלקה ,Randomשכבר הוקצה עבורו מקו בזיכרו. א .מהו טווח הערכי האפשריי למשתנה השל numבעקבות ביצוע ההוראה הבאה? ;num = rnd.nextInt(6) + 1 ב .מהו טווח הערכי האפשריי שיוצגו על המס בעקבות ביצוע ההוראה הבאה? ;))System.out.println(rnd.nextInt(10 ג .מהו טווח הערכי האפשריי שיוצגו על המס בעקבות ביצוע ההוראה הבאה? ;)System.out.println(rnd.nextInt(11) + 100 ד .תארו את ערכי הפלט האפשריי שיוצגו למס בעקבות ביצוע ההוראה הבאה: )for (int i = 0; i < 100; i++ { ;)" " System.out.print(rnd.nextInt(50) + } שאלה 10.46 העצ rndהוא עצ המחלקה ,Randomשכבר הוקצה עבורו מקו בזיכרו. מהו טווח הערכי האפשריי עבור כל אחד מהביטויי הבאי? א. )rndNum.nextInt(100 _________________________ ב. rndNum.nextInt(100) + 1 _________________________ הוראת המדעים ,אוניברסיטת תל-אביב -458- מדעי המחשב ג. )rndNum.nextInt(100 + 1 _________________________ ד. rndNum.nextInt(101) + 100 _________________________ ה. rndNum.nextInt(100) + 200 _________________________ ו. rndNum.nextInt(50) + 7 _________________________ שאלה 10.47 בכל אחד מהסעיפי הבאי תארו ביטוי ,המתייחס לעצ rndNumמהמחלקה ,Randomכ שער הביטוי הוא בתחו המבוקש. א .מספר אקראי של בי 0ל9# _________________________ ב .מספר אקראי של בי 10ל100# _________________________ ג .מספר אקראי של בי 100ל500# _________________________ ד .מספר אקראי של וזוגי בי 0ל_________________________ 100# שאלה 10.48 בפתרו בעיה 7השתמשנו במער מוני ,א בכל מהל הביצוע ערכיו לא עברו א פע את הער ,2 ושינוי אחד הערכי במער ל 2#הביא לסיו האלגורית .שנו את הפתרו כ שבמקו מער מטיפוס של ,ישתמש במער מטיפוס בוליאני .ישמו את הפתרו החדש בשפת .Java שאלה 10.49 טורניר השש#בש מתחיל ,א איבדת את הקוביות! פתחו אלגורית אשר מקבל כקלט סדרה של הקשות על המקש רווח ,ובעקבות כל הקשה הוא מדמה הטלת שתי קוביות ומציג כפלט את תוצאות ההטלה .בנוס ,א תוצאת ההטלה היא צמד המספרי 5ו) 6#כלומר ,בקובייה אחת תוצאת ההטלה 5ובשנייה ,6או ההפ( האלגורית מציג כפלט את ההודעה שש-בש .הקשה על כל מקש אחר פרט למקש רווח מביאה לסיו הביצוע .ישמו את האלגורית בשפת .Java שאלה 10.50 פתחו אלגורית הקולט מספר חיובי של ,ואחר כ מדמה סדרת הטלות קובייה ,שאורכה כער המספר שנקלט .פלט האלגורית הוא מספר הפעמי שהוגרלה כל אחת משש התוצאות האפשריות להטלת קובייה .ישמו את האלגורית בשפת התכנות .Java שאלה 10.51 בפרק ,7בשאלה 7.56הוצג משחק ניחושי .במשחק זה השחק צרי לנחש נכונה מספר בי 1ל,100# שנבחר קוד לכ על ידי שחק נוס .שנו את קטע התוכנית שהוצג בשאלה 7.56כ שהמספר הסודי יוגרל כעת בתחילת הביצוע ולא ייבחר על ידי שחק אחר. הוראת המדעים ,אוניברסיטת תל-אביב -459- מדעי המחשב בעזרת החומר הנלמד בפרק 10נית לפתור ג בעיות המשתמשות בתבניות הזזה מעגלית בסדרה הזזה של תת-סדרה ,ו#היפוך של תת-סדרה .להעמקה בתבניות אלו פנו לעמוד 477 ,474ו,479# בהתאמה. סיכום בפרק זה הוצגו בעיות שפתרונ מצרי שמירה של סדרת ערכי מאותו טיפוס .נית לשמור סדרה כזאת כמער ). (array מער הוא אוס סדור של משתני מאותו טיפוס ,הקשורי זה לזה ולה ש משות . איבר במער הוא משתנה לכל דבר ,כלומר ,נית לשמור בו ערכי ולקרוא את הערכי השמורי בו. שמו של איבר במער מורכב מש המער ,וממספרו הסידורי של האיבר במער .למשל.arr[3] , במקרה זה ,ש המער הוא arrו 3#הוא המציי )אינדקס( שמפנה אותנו לאיבר שנמצא במקו מספר 3במער. באלגוריתמי רבי נוח לבצע סריקה של מער ,תו עיבוד איבריו ,באמצעות הוראה לביצוע חוזר. א נדרשת סריקה מלאה ,של כל איברי המער ,הרי מספר הסיבובי ידוע מראש ,ושווה לאור המער .ג סריקה לא רציפה ,אבל במרווחי ידועי מראש ,ניתנת לביצוע בעזרת הוראה לביצוע חוזר שמספר הסיבובי בה ידוע מראש. א הסריקה אינה רציפה ומתבצעת בדילוגי שאינ קבועי ,או א ביצועה תלוי בתנאי ,נשתמש בהוראה לביצוע חוזר בתנאי. בטבלת מעקב אחר מהל ביצוע תוכנית הכוללת מער נכלול עמודות נפרדות עבור איברי שוני של המער. מער יכול לתפקד כמער מוני או כמער צוברי ,במקרי בה יש צור לתחזק במקביל כמה צוברי או מוני בעלי אופי משות . בעת ביצוע תוכנית אשר יש בה שימוש במער ,מוקצי תאי עבור כל איבר במער .כיוו שמשאבי הזיכרו של המחשב מוגבלי ,נשתדל לפתח אלגוריתמי אשר גודל המקו הדרוש לביצוע הוא מצומצ ככל האפשר. ייתכנו שני אלגוריתמי שוני לפתרו אותה בעיה ,אשר באחד יש שימוש במער ובשני אי .נאמר שהאלגורית השני יותר יעיל מבחינת מקו. הוראת המדעים ,אוניברסיטת תל-אביב -460- מדעי המחשב יש לנצל עד כמה שנית את מאפייני הקלט#פלט כדי לנסח אלגורית יעיל ,ה מבחינת מקו בזיכרו וה מבחינת זמ ביצוע. ייתכנו שתי בעיות אלגוריתמיות הנראות דומות ,לפחות במבט ראשו ,אשר פתרונות יעילי עבור נבדלי זה מזה ה מבחינת מקו וה מבחינת זמ .בפרט ,יתכ שעבור פתרו בעיה אחת נחו" מער ועבור פתרו הבעיה האחרת לא נחו" מער. סיכום מרכיבי שפת Javaשנלמדו בפרק 10 הצהרה על מער בשפת Javaנכתבת כ: ;שם המערך ][ טיפוס ראשית ,ש הטיפוס ,ולאחריו סוגריי מרובעי )המצייני שזוהי הצהרה על מער של איברי מהטיפוס ,ולא של משתנה פשוט מטיפוס זה( ,ואז שמו של המער. לפני שימוש במער מוצהר יש לבצע עבורו הקצאת שטח זיכרו .הקצאת שטח למער מתבצעת על ידי הפעולה newשאחריה מופיע טיפוס איברי המער ,ואחריו מופיע בסוגריי מרובעי מספר איברי המער: ;]מספר הערכים[ טיפוס new נית לצר את ההצהרה וההקצאה להוראה אחת: ;]מספר הערכים[ טיפוס = newשם המערך ][ טיפוס בשפת ,Javaכאשר מוקצה שטח זיכרו עבור מער של איברי מטיפוס פשוט ,מתבצע ג אתחול אוטומטי של כל איבריו .איברי מער מספרי )שלמי או ממשיי( יאותחלו ל ,0#איברי מער בוליאני יאותחלו ל ,false#ואיברי מער תווי יאותחלו לתו הריק. בשפת Javaמספור האיברי במער מתחיל מ ,0#ולכ ] arr[0מפנה אותנו לאיבר הראשו במער, ו arr[3]#מפנה אותנו לאיבר הרביעי במער. לכל מער מוגדרת תכונת אור בש ,lengthהשומרת את אורכו .תכונה זו מקבלת את ערכה בעת הקצאת שטח זיכרו עבור המער ,ואינה ניתנת לשינוי לאחר מכ .הפנייה לתכונה נעשית באמצעות סימו הנקודה ,למשל כ .arr.length :אי להוסי סוגריי ,משו שזו אינה פעולה! יש להקפיד על פנייה לאיבר באמצעות מציי שערכו איננו חורג מתחו הערכי המותר ,כלומר ,נע בי 0לבי ) -1אור המער( .חריגה מגבולות המער תגרו לעצירת התכנית ,עקב שגיאת ריצה. סריקת איברי מער יכולה להיעשות באמצעות לולאת ,forא ידועות מראש נקודות ההתחלה והסיו של הסריקה ,ומרווחי הדילוג )עבור סריקה לא רציפה( .בלולאה כזאת ,משתנה הבקרה של הלולאה משמש ג כמציי ,לציו מקומו של האיבר הנסרק במער .משתנה הבקרה מאותחל בתחילת הוראת המדעים ,אוניברסיטת תל-אביב -461- מדעי המחשב הלולאה למציי של האיבר ממנו מתחילה הסריקה ,וערכו מקוד בכל צעד בער הרצוי )לסריקה רציפה הוא מקוד ב 1#בכל פע( ,עד שיגיע למקומו של האיבר בו מסתיימת הסריקה. לסריקה רציפה של כל איברי המער ,נית להיעזר בתכונת האור ,כ שערכי משתני הבקרה ינועו מ# 0עד ל -1)#אור המער( ,ויגדלו ב 1#בכל סיבוב. לסריקה שאינה רציפה ,ובמרווחי שאינ ידועי מראש ,או לסריקה התלויה בתנאי ,יש להשתמש בלולאת .while בשפת Javaנית לבצע הגרלת מספר אקראי באמצעות המחלקה .Random כדי להשתמש במחלקה Randomבתו תוכנית Javaצרי לשלב את ההוראה הבאה בתוכנית: ;import java.util.Random לפני ביצוע הגרלות יש להצהיר על עצ מהמחלקה ולהקצות לו מקו בזיכרו ,כ: ;)( = new Randomשם העצם Random הגרלת איבר אקראי של בתחו שבי 0ל n#מתבצעת על ידי הפעלת הפעולה ) nextInt(nעל עצ מהמחלקה .Randomהפעולה מופעלת באמצעות סימו הנקודה )למשל כ ),(rnd.nextInt(5 ומחזירה ער אקראי של בתחו המבוקש. נית לשלב פעולת הגרלת איבר בתו ביטויי חשבוניי ,כ שערכ יהיה ער אקראי בתחו רצוי. באמצעות עצ מהמחלקה ,Randomשהוקצה עבורו מקו בזיכרו ,נית לבצע הגרלות חוזרות ונשנות ,ג מתחומי שוני. הוראת המדעים ,אוניברסיטת תל-אביב -462- מדעי המחשב תבניות – פרק 10 מערך מונים נתבונ בבעיה האלגוריתמית הבאה: כתבו אלגורית שהקלט שלו הוא 58ספרות והפלט שלו הוא מספר הפעמי שהופיעה כל ספרה בקלט. למעשה ,עבור פתרו הבעיה האלגוריתמית אנו צריכי 10מוני – מונה לכל ספרה .כדי להימנע מסירבול ,נגדיר מער CountDigitsArrבגודל .10מצייני המער ה מ 0ועד ,9ולכ כל תא במער מייצג את המונה של המציי .כ ,למשל ,תפקידו של התא ] countDigitsArr[3הוא למנות את מספר הפעמי שמופיעה הספרה 3בקלט .באופ כללי תפקידו של התא ] countDigitsArr[digitהוא למנות את מספר הפעמי שמופיעה הספרה digitבקלט .זהו אלגורית המתבסס על התבנית מערך מונים .התבנית של מערך מונים ,כפי שמשמשת בחלקו הראשו של פתרו בעיה זו ,דומה לחלקו הראשו של הפתרו שהוצג בבעיה 5בפרק .10 נתבונ בחלק הראשו של כל אחד משני האלגוריתמי הללו ,לפתרו הבעיה שלעיל ולפתרו בעיה 5בפרק :10 .1 :íéîòô 58 òöá digit-á äøôñ èåì÷ .1.1 1-á countDigitsArr[digit] úà ìãâä .1.2 numOfSingers-á íéããåîúîä øôñî úà èåì÷ .1 vote-á ãîòåî øôñî èåì÷ .2 .3 ãåò ìë vote ≠ -1 :òöá vote øôñî ããåîúî ìù äðåîä úà 1-á äìòä .3.1 vote-á ãîòåî øôñî èåì÷ .3.2 בשני קטעי האלגוריתמי האלה נית לזהות תבנית מנייה ,אלא שהיא מופעלת על כמה מוני הפועלי במקביל ,ושמורי במער אחד. נציג את מאפייני התבנית מערך מונים ,עבור ביצוע חוזר התלוי בתנאי .נית להתאי את מאפייני התבנית למקרי בה מש הביצוע ידוע מראש ,בדומה לקטע האלגורית לפתרו הבעיה שהוצגה לעיל. הוראת המדעים ,אוניברסיטת תל-אביב -463- מדעי המחשב ש התבנית :מער מוני נקודת מוצא :תנאי סיו ,toEndסדרת ערכי ,ביטוי חשבוני whichCounterהמקשר בי ער בסדרה למציי של המער מטרה :בניית מער מוני עבור ערכי הסדרה ,כאשר מש הבנייה תלוי בביטוי .toEnd אלגורית: 0-ì countElements êøòîä éøáéà úà ìçúà .1 äøãñá àáä êøòä úà íùä .2 element-á :òöá toEnd éàðúä íéé÷úî àì ãåò ìë .3 1-á countElements[whichCounter] úà ìãâä .3.1 äøãñá àáä êøòä úà íùä .3.2 element-á יישו ב:Java ;הערך הבא בסדרה = element )while (!toEnd { ;countElements[whichCounter]++ ;הערך הבא בסדרה = element } שימו ♥: ♦ התבנית כללית ואינה מפרטת מהיכ מגיעי איברי הסדרה .ערכי אלה יכולי ,למשל, להתקבל כקלט או מקריאת ערכי מער אחר. ♦ המשתנה elementמתייחס לאיבר התור בסדרה .למרות שאי זה מופיע במפורש באלגורית שנית עבור התבנית וביישו שלו ,הרי פעולת המנייה תלויה ב :elementהביטוי whichCounterתלוי ב elementומקשר בי ערכו לער של מציי במער .הנה כמה דוגמאות לביטויי אפשריי עבור :whichCounter • ) elementכלומר ,הער הבא בסדרה משמש כמציי למער ,בדומה לפתרו של הבעיה שהוצגה בתחילת הסעי.($ • ספרת העשרות של .element • ) element - 1בדומה לביטוי המשמש לגישה למער בפתרו בעיה 5בפרק .(10 ♦ בדומה לתבנית מנייה ,ג התבנית של מערך מונים כוללת אתחול של המוני ל .0אי לכ התייחסות ביישו ,משו שבשפת Javaמתבצע אתחול אוטומטי של איברי מער שלמי ל.0 הוראת המדעים ,אוניברסיטת תל-אביב -464- מדעי המחשב שאלה 1 א .ישמו את הפתרו המלא לבעיית מניית מופעי הספרות בשפת .Java ב .שנו את התוכנית שכתבת בסעי $א כ שהקלט שלה יהיה 58מספרי מהתחו 1עד ,10 והפלט שלה יהיה מספר הפעמי שהופיע כל אחד מהמספרי .מהו הביטוי החשבוני בו השתמשת כדי לקשר בי ער תור למציי במער? ג .שנו את התוכנית שכתבת בסעי $א כ שהקלט שלה יהיה 58מספרי שלמי חיוביי .הפלט שלה יהיה עבור כל אחת מהספרות 0עד 9את מספר הפעמי שהופיעה כספרת האחדות של מספר בקלט .מהו הביטוי החשבוני בו השתמשת כדי לקשר בי ער תור למציי במער? שאלה 2 נתו המער arrובו ערכי שלמי ונתו קטע התוכנית הבא: ;]int[] counts = new int[2 )for (i = 0; i < arr.length; i++ { ;]element = arr[i ;counts[element % 2]++ } )for (i = 0; i < counts.length; i++ { ;)]System.out.println(counts[i } א .מה יוצג כפלט עבור המער arrהבא: ]arr[7 ]arr[6 ]arr[5 ]arr[4 ]arr[3 ]arr[2 ]arr[1 ]arr[0 6 89 34 11 5 198 68 90 ב .תנו דוגמה למער arrבגודל ,10שעבורו יוצגו כפלט הערכי.7 3 : ג .מהי מטרת קטע התוכנית? ד .הציעו קטע תוכנית השקול לקטע התוכנית הנתו ללא שימוש בתבנית מערך מונים .ציינו באילו תבניות השתמשת עבור כתיבת קטע התוכנית. שאלה 3 א .כתבו אלגורית ,שהקלט שלו הוא סדרת תווי המסתיימת בתו '*' והפלט שלו הוא מספר המופעי של כל אחת מאותיות ה) abcכלומר ,אותיות הא"ב האנגלי הקטנות(. ב .מהו הביטוי החשבוני בו השתמשת עבור התאמת אותיות ה abcלמצייני המער? ג .ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -465- מדעי המחשב מערך צוברים נתבונ בשתי הבעיות האלגוריתמיות הבאות: בעיה :1תלמידי שכבה י' בבית הספר "נו$י" ,המונה 7כיתות ,החליטו על מבצע לסיוע למשפחות נזקקות :כל תלמיד בשכבה יעבוד בעבודות מזדמנות )כגו שטיפתמכוניות ,בייביסיטר וכו'( ,ואת הסכו שירוויח יעביר לקופת הכיתה .בסו $החודש יעבירו הנציגי מכל אחת מהכיתות דיווח של הסכו המצטבר שנאס $אל נציג השכבה .נציג השכבה יעביר את הסכו הכולל לנציג ועד השכונה .יש לציי כי כל התלמידי בשכבה נרתמו להצלחת המבצע .כתבו אלגורית שהקלט שלו הוא 247זוגות מספרי עבור כל תלמידי השכבה ,כאשר המספר הראשו מייצג את מספר הכיתה של התלמיד והמספר השני מייצג את הסכו שהעביר התלמיד לקופת הכיתה .הפלט של האלגורית הוא הסכו המצטבר של כל אחת מהכיתות וכ הסכו הכולל שהצטבר בשכבה. בעיה :2בחנות הנעליי "נעל לכל" מעונייני לדעת מהו הפדיו היומי מס כל המכירות בכל אחת מ 5המחלקות בחנות )המחלקות ממוספרות מ 1עד .(5כתבו אלגורית שהקלט שלו הוא סדרה של זוגות מספרי ,כאשר המספר הראשו בכל זוג מייצג את מספר המחלקה והמספר השני מייצג את המחיר של סכו הקניה של לקוח .סו $הקלט יסומ על ידי זוג שהמספר הראשו בו הוא .0הפלט של האלגורית הוא התפלגות המכירות לפי מחלקות )כלומר ,עבור כל מחלקה הפדיו היומי הכולל שלה(. עבור הפתרונות של שתי הבעיות האלגוריתמיות דרושי לנו כמה צוברי .בבעיה 1אנו צריכי שבעה צוברי עבור הסכומי המצטברי לכל אחת מהכיתות ,ובבעיה 2אנו צריכי חמישה צוברי )צובר סכו מכירות לכל מחלקה( .כדי להימנע מסירבול ,נגדיר מער שגודלו כמספר הצוברי הנדרש ) 7עבור בעיה 1ו 5עבור בעיה .(2בבעיה 1מצייני המער מייצגי את מספרי הכיתות ,ובבעיה 2ה מייצגי את מספרי המחלקות .כל תא במער מייצג צובר המתאי למציי .זהו אלגורית המתבסס על התבנית מערך צוברים .הרעיו בבסיסה של התבנית מערך צוברים דומה לתבנית של מער המוני .ההבדל הוא באופי הפעולה על כל תא במער :מנייה במער המוני לעומת צבירה במער הצוברי. נתבונ בשני האלגוריתמי הבאי ,הראשו לפתרו בעיה 1והשני לפתרו בעיה :2 .1 :íéîòô 247 òöá -á ãéîìú çéååøäù óñë íåëñå classNum-á äúéë øôñî èåì÷ .1.1 sumStudent sumStudent-á sumClasses[classNum-1] úà ìãâä .1.2 הוראת המדעים ,אוניברסיטת תל-אביב -466- מדעי המחשב 0-ì sumTotal úà ìçúà .2 :òöá 6 ãò 0 íåçúá íìù i ìë øåáò .3 sumClasses[i] :àåä i+1 äúéëì øáèöîä íåëñä :èìôë âöä .3.1 sumClasses[i]-á sumTotal úà ìãâä .3.2 sumTotal àåä äáëùì øáèöîä íåëñä :èìôë âöä .4 price-á çå÷ì ìù äéð÷ä íåëñå departmentNum-á ä÷ìçî øôñî èåì÷ .1 :òöá 0-î äðåù departmentNum ãåò ìë .2 price-á sumDepartments[departmentNum-1] úà ìãâä .2.1 price-á çå÷ì ìù äéð÷ä íåëñå departmentNum-á ä÷ìçî øôñî èåì÷ .2.2 :òöá 4 ãò 0 íåçúá íìù i ìë øåáò .3 sumDepartments[i] :àåä i+1 ä÷ìçîì éîåéä ïåéãôä :èìôë âöä .3.1 אלא שהיא מופעלת על כמה צוברי,בשני קטעי האלגוריתמי האלה נית לזהות תבנית צבירה . ושמורי במער אחד,הפועלי במקביל נית להתאי. עבור סדרת ערכי שאורכה ידוע מראש,נציג את מאפייני התבנית מערך צוברים התבנית.1 בדומה לפתרו בעיה,את מאפייני התבנית למקרי בה מש הביצוע תלוי בתנאי א נית להציג מאפייני של תבנית דומה המתייחסת לצבירה על,מתייחסת לצבירה על ידי סכו .ידי מכפלה מדעי המחשב -467- אביב- אוניברסיטת תל,הוראת המדעים ש התבנית :מער צוברי נקודת מוצא :אור סדרת הערכי ,limitסדרת ערכי ,ביטוי חשבוני whichSumהמקשר בי ער בסדרה למציי של המער מטרה :בניית מער צוברי עבור ערכי הסדרה ,שאורכה limit אלגורית: íéøáåöä êøòî éëøò úà ìçúà .1 :íéîòô limit òöá .2 element-á äøãñá àáä êøòä úà íùä .2.1 value-á äøéáöì êøòä úà íùä .2.2 value ìù åëøò úà sumElements[whichSum]-ì óñåä .2.3 יישו ב:Java )for (i = 1; i <= limit; i++ { ;הערך הבא בסדרה = element ;הערך לצבירה = value ;sumElements[whichSum] += value } שימו ♥ :ג התבנית של מערך צוברים ,הוצגה באופ כללי ,כ שהיא מתאימה למגוו בעיות: ♦ לא נקבעו במפורש הערכי לאתחול .במקרה הפשוט ,מאותחלי כל הצוברי ל .0במקרה כזה ,ביישו בשפת Javaאי צור לבצע אתחול מפורש ,משו שב Javaמתבצע אתחול אוטומטי של איברי מער שלמי ל.0 ♦ בדומה לתבנית מערך מונים ,ג התבנית של מערך צוברים אינה מפרטת מהיכ מגיעי איברי הסדרה .ערכי אלה יכולי ,למשל ,להתקבל כקלט או מקריאת ערכי מער אחר. ♦ התבנית של מערך צוברים ג אינה מפרטת כצד מחושבי הערכי לצבירה .ג ערכי אלה יכולי ,למשל ,להתקבל כקלט או מקריאת ערכי מער אחר ,וייתכ כי נית לחשב ,עבור כל איבר ,elementבעזרת ביטוי חשבוני מסוי התלוי ב ,elementאת ער הצבירה המתאי לו .value ♦ כמו בתבנית מערך מונים ,ג בתבנית של מערך צוברים המשתנה elementמתייחס לאיבר התור בסדרה ,ולמרות שאי זה מופיע במפורש באלגורית שנית עבור התבנית וביישו שלו, הרי פעולת הצבירה תלויה ב :elementהביטוי whichSumתלוי ב elementומקשר בי ערכו לער של מציי במער. הוראת המדעים ,אוניברסיטת תל-אביב -468- מדעי המחשב שאלה 4 ישמו את שני האלגוריתמי עבור בעיות 1ו 2בשפת .Java שאלה 5 לאור הצלחת המבצע לסיוע למשפחות נזקקות החליטה הנהלת ביתהספר "נו $י" להעניק יו טיול לנגב לתלמידי הכיתה שאספה את הסכו המירבי .יש להרחיב את האלגורית כ שיוצג כפלט ג מספר הכיתה שזכתה ביו הטיול .א יש יותר מכיתה אחת שאספה את הסכו המירבי יוענק יו טיול לכול. נתו האלגורית הבא לפתרו הבעיה: 0-ì sumClasses êøòîä éøáéà úà ìçúà .1 .2 :íéîòô 247 òöá -á ãéîìú çéååøäù óñë íåëñå classNum-á äúéë øôñî èåì÷ .2.1 sumStudent sumStudent-á sumClasses[classNum-1] úà ìãâä .2.2 0-ì sumTotal úà ìçúà .3 .4 :òöá 6 ãò 0 íåçúá íìù i ìë øåáò sumClasses[i] :àåä i+1 äúéëì øáèöîä íåëñä :èìôë âöä .4.1 sumClasses[i]-á sumTotal úà ìãâä .4.2 sumTotal àåä äáëùì øáèöîä íåëñä :èìôë âöä .5 sumClasses[0]-ì max úà ìçúà .6 .7 :òöá 6 ãò 0 íåçúá íìù i ìë øåáò sumClasses[i] > max íà .7.1 sumClasses[i] ìù êøòä úà max-á íùä .7.1.1 .8 :òöá 6 ãò 0 íåçúá íìù i ìë øåáò maxì äååù sumClasses[i] ìù åëøò íà .8.1 áâðì ìåéè íåéá äëåæ i+1 øôñî äúéë :èìôë âöä .8.1.1 א .ציינו מה התבניות המשולבות באלגורית. ב .ישמו את האלגורית בשפת ) Javaכזכור ,אי צור לייש את שלב אתחול המער(. שאלה 6 בחנות הנעליי "נעל לכל" מעונייני לדעת את הפדיו מס כל המכירות בכל אחד מימות השבוע. יש לכתוב אלגורית שהקלט שלו הוא סדרות של ספרי ממשיי )המסתיימות בזקי – (0 $סדרה הוראת המדעים ,אוניברסיטת תל-אביב -469- מדעי המחשב עבור כל יו מהימי א' עד ו' .המספרי הממשיי מייצגי את סכומי הקניות של הלקוחות. הפלט של האלגורית הוא התפלגות המכירות לפי ימי )כלומר ,עבור כל יו הפדיו הכולל שלו(. נתו האלגורית הבא לפתרו הבעיה: 0-ì sumDays êøòîä éøáéà úà ìçúà .1 .2 :òöá 5 ãò 0 íåçúá íìù day ìë øåáò price-á äéð÷ íåëñ èåì÷ .2.1 .2.2 :òöá 0-î äðåù price ìù åëøò ãåò ìë price-á sumDays[day] úà ìãâä .2.2.1 price-á äéð÷ íåëñ èåì÷ .2.2.2 .3 :òöá 5 ãò 0 íåçúá íìù day ìë øåáò sumDays[day] àåä day+1 íåé øåáò éîåéä ïåéãôä :èìôë âöä .3.1 א .באלגורית ישנו שימוש בתבנית מערך צוברים .הציעו אלגורית השקול לאלגורית הנתו ללא שימוש בתבנית מערך צוברים .ציינו באילו תבניות השתמשת עבור כתיבת האלגורית. ב .ישמו את האלגורית הנתו בשפת ) Javaכזכור ,אי צור לייש את שלב אתחול המער(. שאלה 7 א .במוסד לביטוח רפואי בוצע מחקר על צריכת 150תרופות על ידי החולי המבוטחי .לכל תרופה מספר סידורי בי 1ל .150פתחו אלגורית ,שהקלט שלו הוא סדרת שלשות של ערכי ,כאשר כל שלשה מייצגת גיל של מבוטח ,מספר סידורי של התרופה שנצרכה והכמות שלה )מספר יחידות( .סדרת הקלט מסתיימת ע קליטת הזקי -1 $כגיל המבוטח .הפלט של האלגורית הוא קבוצת הגילאי הצורכת כמות תרופות כוללת גדולה ביותר ,מבי 4קבוצות הגילאי הבאות :קבוצת גילאי 0עד ,10קבוצת גילאי 11עד ,30קבוצת גילאי 31עד ,50 קבוצת גילאי 51ומעלה .ייתכ שיותר מקבוצת גיל אחת צורכת את כמות התרופות הכוללת הגדולה ביותר. שימו לב :לצור פתרו סעי $זה אי צור להבחי בי סוגי התרופות השוני. ב .הרחיבו את האלגורית כ שיוצגו כפלט ג מספרי התרופות שלא נצרכו כלל. ג .ציינו באילו תבניות השתמשת בכתיבת האלגורית וכיצד שילבת ביניה. ד .ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -470- מדעי המחשב חישוב שכיח נתבונ בבעיה האלגוריתמית הבאה: כתבו אלגורית שהקלט שלו הוא 58ספרות והפלט שלו הוא הספרה שהופיעה בקלט הכי הרבה פעמי .א יש יותר מספרה אחת כזאת ,יש להציג את כול. לצור פתרו הבעיה צרי קוד כל למנות את מספר המופעי של כל אחת מהספרות .לש כ, נשתמש בתבנית מערך מונים .לאחר מכ ,עלינו לחשב את הער המקסימלי מבי ערכי המוני. זהו למעשה הער השכיח ,כלומר הער שהופיע מספר פעמי רב ביותר .לצור כ נוכל להשתמש בתבנית של מציאת מקסימום בסדרה ,כדי למצוא את הער המקסימלי ,ולאחר מכ להשתמש בתבנית של מציאת כל הערכים בסדרה המקיימים תנאי ,כאשר התנאי הוא שוויו לער המקסימלי ,תו הצגה כפלט של מצייני הערכי שנמצאו .יש לשי לב ,שעלינו לבצע שינויי קלי בתבניות מציאת מקסימום בסדרה ומציאת כל הערכים בסדרה המקיימים תנאי מאחר שהערכי בסדרה אינ נקראי מהקלט ,אלא שמורי במערך מונים. הנה האלגורית המלא: .1 :íéîòô 58 òöá digit-á äøôñ èåì÷ .1.1 1-á countDigitsArr[digit] úà ìãâä .1.2 countDigitsArr[0] úà max-á íùä .2 .3 :òöá 9 ãò 0 íåçúá íìù i ìë øåáò max-î ìåãâ countDigitsArr[i] íà .3.1 countDigitsArr[i] ìù êøòä úà max-á íùä .3.1.1 .4 :òöá 9 ãò 0 íåçúá íìù i ìë øåáò max-ì äååù countDigitsArr[i] íà .4.1 íéîòô äáøä éëä äòéôåä i äøôñ :èìôë âöä .4.1.1 נציג את מאפייני התבנית חישוב שכיח עבור ביצוע חוזר שאורכו ידוע מראש .נית להתאי את מאפייני התבנית לביצוע חוזר התלוי בתנאי. הוראת המדעים ,אוניברסיטת תל-אביב -471- מדעי המחשב חישוב שכיח:ש התבנית המקשר ביwhichSum ביטוי חשבוני, סדרת ערכי,limit אור סדרת הערכי:נקודת מוצא ער בסדרה למציי של המער limit שאורכה הוא, הצגה כפלט של הער השכיח או הערכי השכיחי בסדרת הקלט:מטרה :אלגורית íéðåîä êøòî éëøò úà ìçúà .1 :íéîòô limit òöá .2 element-á äøãñá àáä êøòä úà íùä .2.1 1-á sumElements[whichCount] úà ìãâä .2.2 countElements[0] ìù åëøòì max úà ìçúà .3 :òöá countElements êøòîä êøåà ãò 1-î íåçúá íìù i ìë øåáò .4 countElements[i] > max íà .4.1 countElements[i] ìù êøòä úà max-á íùä .4.1.1 :òöá countElements êøòîä êøåà ãò 1-î íåçúá íìù i ìë øåáò .5 max-ì äååù countElements[i] ìù åëøò íà 5.1 i úà èìôë âöä .5.1.1 :Javaיישו ב for (i = 1; i <= limit; i++) { element = ;הערך הבא בסדרה sumElements[whichCount]++; } max = countElements[0]; for (i = 1; i < countElements.length; i++) { if (countElements[i] > max) { max = countElements[i]; } } for (i = 0; i < countElements.length; i++) { if (countElements[i] == max) { System.out.println(counts[i]); } } מדעי המחשב -472- אביב- אוניברסיטת תל,הוראת המדעים שימו ♥ :באלגורית של התבנית בחרנו להציג כפלט את הער השכיח או הערכי השכיחי אבל נית לבצע על ערכי אלו פעולות חישוביות שונות כגו מנייה ,צבירה וכו'. שאלה 8 המורה אמיר החליט לבצע כמה עיבודי סטטיסטיי על ציוני 40תלמידיו ב"יסודות מדעי המחשב" .אמיר חילק את ציוני התלמידי ,הנעי בי 0ל ,100ל 10קבוצות באופ הבא: קבוצת הציוני בי 0ל) 10קבוצת ציוני ראשונה( ,קבוצת הציוני בי 11ל) 20קבוצת ציוני שנייה( וכ הלאה עד קבוצת הציוני בי 91ל) 100קבוצת ציוני עשירית(. א .כתבו אלגורית ,שהקלט שלו הוא ציוני 40התלמידי והפלט שלו הוא מספר התלמידי בכל קבוצת ציוני ,וכ קבוצת הציוני השכיחה )תיתכ יותר מקבוצה אחת(. ב .הרחיבו את האלגורית שכתבת בסעי $א כ שיציג כפלט את טווח הציוני ,כלומר ,ההפרש בי הציו הגבוה ביותר במבח לבי הציו הנמו ביותר במבח .ציינו באילו תבניות נוספות השתמשת וכיצד שילבת ביניה. ג .הרחיבו את האלגורית שכתבת בסעי $ב כ שיציג כפלט הודעה הא הציוני מתפלגי סימטרית ,כלומר ,מספר התלמידי בקבוצה הראשונה שווה למספר התלמידי בקבוצה העשירית ,מספר התלמידי בקבוצה השנייה שווה למספר התלמידי בקבוצה התשיעית וכ הלאה .ציינו באילו תבניות נוספות השתמשת וכיצד שילבת ביניה. ד .הרחיבו את האלגורית שכתבת בסעי $ג כ שא הציוני מתפלגי סימטרית ,על האלגורית להציג הודעה הא הציוני מתפלגי סימטרית בצורת פעמו ,כלומר ,הערכי ב 5קבוצות הציוני הראשונות מהווי סדרה עולה ממש ,והערכי ב 5קבוצות הציוני האחרונות מהווי סדרה יורדת ממש .ציינו באילו תבניות נוספות השתמשת וכיצד שילבת ביניה. ה .ישמו את האלגורית המורחב שכתבת בסעי $ד בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -473- מדעי המחשב הזזה מעגלית בסדרה בפרק 3הראינו את התבנית הזזה מעגלית בסדרה עבור סדרה בת שני ערכי .עתה נרחיב את התבנית עבור סדרת ערכי באור כלשהו .נזכיר כי ישנ שני סוגי הזזות מעגליות :הזזה מעגלית שמאלה והזזה מעגלית ימינה. נפריד את מאפייני התבנית הזזה מעגלית בסדרה לשתי תתתבניות :ראשית נציג את מאפייני התבנית הזזה מעגלית שמאלה בסדרה ואחר כ נציג את מאפייני התבנית הזזה מעגלית ימינה בסדרה. ש התבנית :הזזה מעגלית שמאלה בסדרה נקודת מוצא :סדרת ערכי במער elementsשאורכו length מטרה :הזזה מעגלית שמאלה של ערכי המער אלגורית: elements[0] úà temp-á íùä .1 0 íåçúá íìù i ìë øåáò .2עד :òöá length-2 elements[i+1] ìù êøòä úà elements[i]-á íùä .2.1 temp ìù êøòä úà elements[length-1]-á íùä .3 יישו ב:Java ;]temp = elements[0 )for (i = 0; i <= elements.length - 2; i++ { ;]elements[i] = elements[i + 1 } ;elements[elements.length - 1] = temp הוראת המדעים ,אוניברסיטת תל-אביב -474- מדעי המחשב ש התבנית :הזזה מעגלית ימינה בסדרה נקודת מוצא :סדרת ערכי במער elementsשאורכו length מטרה :הזזה מעגלית ימינה של ערכי המער אלגורית: elements[length-1] úà temp-á íùä .1 øåáò .2 (ãøåé øãñá) 1 ãò length-1 íåçúá íìù i ìë :òöá elements[i-1] ìù êøòä úà elements[i]-á íùä .2.1 temp ìù êøòä úà elements[0]-á íùä .3 יישו ב:Java ;]temp = elements[elements.length - 1 )for (i = elements.length -1; i >= 1; i-- { ;]elements[i] = elements[i - 1 } ;elements[0] = temp שימו ♥ :לש פשטות ,התבנית מניחה שאיברי הסדרה המיועדי להזזה נמצאי במער ,elementsהאחד אחרי השני .אבל ,ייתכ שהסדרה שבה נדרש לבצע הזזה מעגלית היא תתסדרה )רצופה או לא רצופה( של איברי המער .שאלה 10מתייחסת לבעיה כזאת. שאלה 9 נתו אלגורית ,שהקלט שלו הוא 6מספרי שיישמרו במער ,numbersומספר של חיובי :num .1 :òöá 6 ãò 1 íåçúá íìù i ìë øåáò numbers[i]-á íìù øôñî èåì÷ .1.1 num-á éáåéç íìù øôñî èåì÷ .2 .3 :íéîòô num òöá .3.1הזזה מעגלית שמאלה במערך numbers א .נקלטו הערכי הבאי למער 21 34 9 78 6 4 :numbers .1מה יהיה הפלט של האלגורית עבור הקלט 5ל?num .2מה יהיה הפלט של האלגורית עבור הקלט 35ל?num הוראת המדעים ,אוניברסיטת תל-אביב -475- מדעי המחשב ב .מהו מספר הפעמי שמתבצעת פעולת התבנית :הזזה מעגלית שמאלה? ג .כתבו אלגורית יעיל יותר ,השקול לאלגורית הנתו כ שפעולת התבנית :הזזה מעגלית שמאלה תתבצע מספר קט יותר של פעמי .ציינו באיזו תבנית השתמשת עבור כתיבת האלגורית היעיל. ד .ישמו את האלגורית היעיל בשפת .Java שאלה 10 א .כתבו אלגורית ,שהקלט שלו הוא 16מספרי למער ,והפלט שלו הוא ערכי המער לאחר הזזה מעגלית שמאלה עבור סדרת המספרי הנמצאי במקומות האיזוגיי במער והזזה מעגלית ימינה עבור סדרת המספרי הנמצאי במקומות הזוגיי במער. ב .ישמו את האלגורית בשפת .Java הוראת המדעים ,אוניברסיטת תל-אביב -476- מדעי המחשב הזזה של תת-סדרה הזזה של תת-סדרה היא תבנית הנחוצה בהקשרי רבי בעיבוד סדרות .הזזה של תת-סדרה היא תבנית הזזה ליניארית )לא מעגלית( של תתסדרה של ערכי אל מקו אחד שמאלה או אל מקו אחד ימינה .הנה שתי דוגמאות בולטות לשימוש בתבנית :הוצאת ער ממקו kבסדרה ו"צמצומה לשמאל" ,כלומר ,הזזה במקו אחד שמאלה של כל האיברי מהמקו k+1וימינה; "ריווח הסדרה ימינה" על ידי הזזה של הערכי החל מהמקו ה k+1ימינה כדי לפנות מקו להכנסה של איבר חדש לסדרה במקו ה .kבמקרה של "צמצו לשמאל" מתבצעת פעולת "הוצאה" של ער מהמקו ה kלפני ההזזה ,ובמקרה של "ריווח ימינה" תתבצע פעולת "הכנסה" של ער חדש למקו ה kאחרי ההזזה .באופ דומה נית לבצע "צמצו לימי" ו"ריווח שמאלה". נפריד את מאפייני התבנית הזזה של תת-סדרה לשתי תתתבניות :ראשית נציג את מאפייני התבנית הזזה של תת-סדרה שמאלה ואחר כ נציג את מאפייני התבנית הזזה של תת-סדרה ימינה. ש התבנית :הזזה של תתסדרה שמאלה נקודת מוצא :סדרת ערכי במער elementsבאור ,lengthמקו kבמער )(0 ≤ k <length-1 מטרה :הזזה שמאלה של התתסדרה הנמצאת במקומות k+1..length-1למקומות k..length-2 אלגורית: :òöá length-2 ãò k-î íåçúá íìù i ìë øåáò .1 elements[i+1] ìù êøòä úà elements[i]-á íùä .2 יישו ב:Java )for (i = k; i <= elements.length - 2; i++ { ;]elements[i] = elements[i + 1 } הוראת המדעים ,אוניברסיטת תל-אביב -477- מדעי המחשב ש התבנית :הזזה של תתסדרה ימינה נקודת מוצא :סדרת ערכי במער elementsבאור ,lengthמקו kבמער )(0 < k ≤ length-1 מטרה :הזזה ימינה של התתסדרה הנמצאת במקומות 0 .. k-1למקומות 1 .. k אלגורית: .1 :òöá (ãøåé øãñá) 1 ãò k-î íåçúá íìù i ìë øåáò elements[i-1] ìù êøòä úà elements[i]-á íùä .1.1 יישו ב:Java )for (i = k; i >= 1; i-- { ;]elements[i] = elements[i - 1 } שאלה 11 ברשימת החולי המוזמני לרופא מומחה נקבעה לכל מוזמ פגישה ,החל מהשעה 16:00ועד השעה ,20:00כאשר לכל מוזמ מוקדש פרק זמ של חצי שעה. מקרה בהול גר להכנסת חולה חדש לרשימה בשעה ,18:30ולכ יש לעדכ אצל המזכירה הרפואית את רשימת המוזמני ,המסודרת לפי סדר פגישת המיועדת ע הרופא. א .כתבו אלגורית ,שהקלט שלו הוא הרשימה התחילית של מספרי הזהות של 9החולי המוזמני וכ את מספר הזהות של החולה החדש ,והפלט שלו הוא רשימת מספרי הזהות של החולי ,על פי הסדר לאחר העדכו ,כאשר לכל חולה מוצגת ג שעת הפגישה המיועדת לו ע הרופא. ב .ישמו את האלגורית בשפת .Java שאלה 12 ב"מכרז המבטיח" מנהלי רישו של הצעות רכישה ל 5מערכות ישיבה לסלו .המידע נשמר עבור 20ההצעות הגבוהות ביותר וה מסודרות לפי סדר יורד. א .כתבו אלגורית ,שהקלט שלו הוא 20הסכומי של ההצעות הגבוהות שהתקבלו עד כה ,וכ סכו של הצעה חדשה ,והפלט שלו הוא 20ההצעות הגבוהות ביותר לאחר העדכו של ההצעה החדשה. ב .ציינו באילו תבניות השתמשת וכיצד שילבת ביניה? ג .הרחיבו את האלגורית כ שיציג כפלט את הסכומי של הזוכי ב 5מערכות הישיבה לסלו. ציינו באיזו תבנית נוספת השתמשת וכיצד שילבת אותה באלגורית. הוראת המדעים ,אוניברסיטת תל-אביב -478- מדעי המחשב היפוך סדר הערכים בסדרה בפרק 3הראינו את התבנית היפוך סדר הערכים בסדרה עבור סדרה בת שני ערכי .עתה נרחיב את התבנית עבור סדרת ערכי באור כלשהו. לצור היפוך סדר הערכים בסדרה אפשר להחלי $בי הער הראשו בסדרה לבי הער האחרו בסדרה ,להחלי $בי הער השני בסדרה לבי הער הלפני אחרו בסדרה וכ הלאה. נציג את מאפייני התבנית היפוך סדר האיברים בסדרה: ש התבנית :היפו סדר האיברי בסדרה נקודת מוצא :סדרת ערכי במער elements מטרה :היפו סדר הערכי במער ,שאורכו length אלגורית: úà limit-á íùä .1מנת החלוקה של lengthפריטים לשתי קבוצות :òöá limit-1 ãò 0-î íåçúá íìù i ìë øåáò .2 .2.1החלף את הערכים של ] elements[iושל ]elements[length-i-1 שימו ♥ :ההחלפה מתבצעת עד מחצית אור סדרת הערכי .א אורכה אינו זוגי ,אז האיבר האמצעי אינו מוחל $ע א $איבר ,ונשאר במקומו ,כפי שאכ צרי להיות. שאלה 13 א .כתבו אלגורית ,שהקלט שלו הוא 15מספרי למער ,המסודרי בסדר עולה ,והפלט שלו הוא ערכי המער לאחר היפוכ. ב .שנו את האלגורית שכתבת בסעי $א כ שיהפו את הסדר של 12האיברי הראשוני במער .שלושת הערכי הגדולי ביותר במער יישארו במקומ .הפלט יהיה ערכי המער לאחר ההיפו. ג .נית לבצע את האלגוריתמי שבסעיפי א וב ללא שימוש בתבנית היפוך סדר הערכים בסדרה .כתבו את האלגוריתמי המתאימי. הוראת המדעים ,אוניברסיטת תל-אביב -479- מדעי המחשב