
j, כי i כבר תפוס בלולאה החיצונית. בכל שורה מודפסות 20 כוכביות, ואחר כך יורדת שורה.הטקסט המלא של הדקות הראשונות בהרצאה «לולאות מקוננות - Nested Loops» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
בתהליך הלמידה של תכנות והפיכה למתכנת יש איזשהו מחסום שמתכנתים מתחילים תמיד נתקלים בו וזה בעצם מחסום האלגוריתמיקה שאנחנו רוצים לעבור בקורס הזה.
אחד מהדברים היותר מורכבים במחסום הזה והיותר קשים למעבר הוא הנושא של לולאות מקוננות. לולאה מקוננת זאת לולאה בתוך לולאה אחרת.
אם יש לנו לולאה בתוך לולאה ונחשב ללולאה מקוננת, אנחנו צריכים להבין מה בעצם קורה פה, איך המחשב עובד במצב הזה, וזה לא משנה מהם הסוגים של הלולאות.
יכולה להיות לנו לולאת for ובתוכה לולאת while, או לולאת do while ובתוכה לולאת for, או לולאת while ובתוכה לולאת do while, ולא משנה מה הסוגים. ברגע שיש לנו לולאה שאחת מהפקודות שנמצאות בתוכה זאת לולאה אחרת, הדבר נחשב ללולאה המקוננת.
רמה האלגוריתמית פה, האלגוריתמית פה עולה לרמה קצת יותר מורכבת וחשוב שמתכנתים מתחילים יבינו מה קורה כאן ויתמודדו עם זה ויעברו על המכשול הזה.
אם מתכנתים סגורים על המכשול הזה של עולאות מקוננות אז הדרך שלהם לתכנות ופיתוח נפתחת ובעצם כמות נכבדת מהיכולות התכנותיות שלהם כבר נפתרה מבחינת האלגוריתמיקה עצמה.
אז בואו נראה כמה דוגמאות ללולה המקוננת ואיך אנחנו צריכים לחשוב בכיוון הזה. אז דוגמה ראשונה, אנחנו רוצים לקלוט מהמשתמש מספרים שוב ושוב עד שהוא מכניס, בוא נניח 0 או מספר שלילי, ועבור כל מספר שהוא מכניס, שהוא אמור להיות מספר חיובי, אנחנו רוצים להציג
כוכביות כאורך המספר. אז למה הדבר הזה הוא לולאה מקוננת? כי דבר ראשון אנחנו רוצים לקלוט שוב ושוב מספרים מהמשתמש עד שהוא מכניס 0 או מספר שלילי.
הלולאה המתאימה כאן היא כמובן לולאת while, כי אנחנו לא יודעים כמה פעמים המשתמש הולך להכניס מספרים חיוביים, ועבור כל מספר כזה אנחנו רוצים להציג רצף של כוכביות, בשביל זה אנחנו צריכים עוד לולאה.
בואו נעשה את זה. אז נאמר למשתמש enter numbers for ending enter a non-positive number. מיד לאחר מכן יש לנו את המספר n, את המשתנה, ויש לנו כאן צורך ב-next int, קלטנו את זה מהיוזר.
לאחר מכן אנחנו רוצים לולאה שרצה כל עוד n גדול מ-0. מה אנחנו רוצים לעשות כל עוד n גדול מ-0? ויש לנו פה לולאת 4 נוספת והנה הלולאה המקוננת שלנו וזה נקרא באנגלית נסטד לופ.
אז בנסטד לופ שלנו אנחנו רוצים להתחיל i שווה ל-1 כל עוד i קטן או שווה ל-n, i++. בואו נציג כוכבית, בואו נראה תשורה בסוף ואנחנו רוצים שוב פעם לקלוט מהיוזר מספר בכדי לדעת האם אנחנו ממשיכים או מפסיקים.
בואו נריץ את זה ונראה שיש לנו פה בקשה לקבל מספרים. יוזר מכניס 12 והוא רואה 12 כוכביות האמת אני רציתי אותן בשורה אז בואו נתקן את זה ונריץ שוב פעם 12 והנה 12 כוכביות 20 והנה 20 כוכביות 5 והנה 5 כוכביות בואו ניתן כוכבית אחת, הנה שתי כוכביות והנה תשע כוכביות וכן הלאה.
יוזר מכניס אפס והתוכנית מסתיימת. אז כאן חשוב לנו לראות שכל פעם שהלולאה הפנימית מתחילה להתבצע, במקרה הזה זה לולאת פור, ההתחול שלה מתחיל מההתחלה, כי אנחנו למדנו שהתחול מתבצע רק פעם אחת, אבל הוא לא מתבצע פעם אחת בחיי התוכנית, הוא מתבצע פעם אחת בחיי הלולאה.
אז כל פעם שהלולאה מתחילה מחדש, חלק האידחול מתבצע שוב, i מקבל 1, ואנחנו מתחילים מחדש את הלולאה. כל עוד i קטן מ-n, ה-n כמובן יכול להיות מספר אחר שיתקבל כאן.
זאת דוגמה ראשונה ללולאה מקוננת. בואו נראה דוגמה נוספת, אבל הפעם עם לולאות קצת אחרות. אז בואו ניגש ונגדיר שאנחנו רוצים לקבל מהמשתמש 10 משכורות, ועבור כל משכורת אנחנו רוצים להציג כמה מס צריך לשלם על המשכורת הזאת, שזה בעצם 10%.
למה יש לנו פלולה מקוננת? כי יכול להיות שאחת המשכורות שהיוזר יכניס היא לא חוקית. לא חוקי מבחינתנו זה קטן מאפס. במידה והמשכורת לא חוקית אנחנו לא מוכנים לקבל את המשכורת, הלא חוקית ואנחנו רוצים שהיוזר יכניס לנו שוב פעם את המשכורת אבל אנחנו לא יודעים כמה פעמים
הוא יכול לטעות ולכן הבקשה החוזרת הזאת של משכורת שוב ושוב היא עוד לולאה שנמצאת בתוך הלולאה הגדולה של ה-10 משכורות. אז בואו נרוץ בלולאה הראשונה i שווה ל-1 כל עוד i קטן שווה ל-10 i++ ואנחנו רוצים לומר למשתמש enter salary, נשרשר כאן את i, לא צריך כאן את ה-ln הזה,
ואנחנו רוצים לקלוט את המשכורת. יש לנו פה את ה-salary שווה console.next-double במקרה הזה. כאן יכול להיות שהמשתמש כבר תאר ומכניס לנו משכורת מינוס 1000.
אנחנו לא מוכנים לקבל מינוס 1000, אבל ספציפית לגבי המשכורת הזאת אנחנו רוצים לתקן אותו ולבקש שוב ושוב ושוב משכורת חוקית. זה כמובן לולאת while, מפני שאנחנו רוצים להציג הודעות שגיאה ולבקש שוב.
כל עוד salary קטן מ-0, בואו נציג לו איזושהי הודעת שגיאה. salary can't be negative, please enter again.
נגיד salary again, again את ה-salary, לא צריך פה את ה-ln הזה. ושוב פעם אנחנו רוצים לקחת את הפקודה הזאת ולקלוט שוב פעם משכורת מהמשתמש. רק אחרי שעברנו את הלולה הפנימית בהצלחה, אנחנו רוצים להציג 10% tax ease,