לולאות כפולות
לעיתים קרובות, נדרש לבצע שתי לולאות אחת בתוך השניה. כלומר, לולאה שבתוכה יש עוד לולאה. לולאה פנימית וחיצונית.
דוגמא לשימוש בלולאות כפולות:
כתוב תת-תוכנית המדפיסה משולש ישר-זווית מכוכביות. תת-התוכנית קולטת את מספר הכוכביות בשורה האחרונה.
לדוגמא, אם המספר שנקלט הוא 6 הפלט שיתקבל הוא:
* ** *** **** ***** ****** |
פתרון:
program TRIANGLE; var N:integer ; (* משתנה הקלט- מספר הכוכביות בשורה האחרונה *) I,J: integer; (* מוני הלולאות *) procedure MAKE_TRIANGLE; { תת-תוכנית להדפסת משולש מכוכביות} begin { קלט} write(' הקש את מספר הכוכביות בשורה האחרונה '); readln(N); (* מספר הכוכביות בשורה האחרונה הוא מספר השורות*) { הלולאה הכפולה } (* הוא מונה הלולאה החיצונית הסופרת את השורות I *) (* הוא מונה הלולאה החיצונית הסופרת את מספר הכוכביות בכל שורה J *) for I:=1 to N do (* לולאה חיצונית *) begin for J:=1 to I do (* לולאה פנימית *) write (' * '); writeln; (* לקפוץ שורה בסיום כל שורת כוכביות *) end; end; (************* התוכנית הראשית ****************) begin MAKE_TRIANGLE; end.
להורדת הדוגמא לחץ כאן
דוגמת ריצה:
בלולאה הפנימית J הולך מ-1 ועד I בכל פעם שלולאה זו מתבצעת. כאשר I שווה 1 אזי ההוראה write בלולאה הפנימית מבוצעת פעם אחת.
בסיום הלולאה הפנימית הסמן קופץ לשורה הבאה. כאשר I שווה 2, הלולאה הפנימית מבצעת את ה-write פעמיים, (כי J הולך מ-1 עד 2) ואז בסיומה הסמן קופץ לשורה הבאה (בגלל ה-writeln) כך הלאה עד ש-I שווה 6 והלולאה החיצונית מסתיימת והתוכנית קופצת להוראה שאחרי הלולאה החיצונית וכך גם מסתיימת תת-התוכנית.
דוגמא:
נכתוב תת תוכנית שמבצעת חזקה של מספר שלם במספר שלם.
חזקה היא כפל של מספר בעצמו כמספר הפעמים הרשום בחזקה.
פתרון:
תת התוכנית מתאימה גם לבסיס שלילי.
בתנאי היציאה מלולאת repeat, נרשם I<1 ולא I=0. יש להימנע ככל האפשר מהצבת שוויון לבדו. יכול להיות שבמהלך הכתיבה וניפוי התוכנית משגיאות, נפלה טעות ולעולם לא יתקיים השוויון.
אך הסימן קטן (>) כולל תחום רחב מאוד שימנע לולאה שלא נגמרת.
לולאה שאינה נגמרת היא טעות לוגית ולא תתגלה על ידי המהדר! לולאה שביצועה אינו נגמר נקראת לולאה אינסופית! |