פרק 10 הוראות תנאי.

ב. הוראת תנאי PERFORM ... UNTIL

עד כאן ראינו את השימוש בהוראת IF לצורך ביצוע הוראות מסויימות, בתנאי שתנאים מסוימים קיימים. קיים מצב, שבו נרצה לבצע עיבוד קטע מסויים של תכנית בעזרת הוראת PERFORM, וזאת רק בתנאי שתנאי מסויים מתקיים; או, לחילופין, לבצע את הקטע הנ"ל מספר מסויים של פעמים, וזאת עד שתנאי מסויים מתקיים. לביצוע כזה של קטע תכנית מספר פעמים קוראים לולאה (LOOP), וניתן להפעילה בעזרת ההוראה PERFORM ... UNTIL. דוגמא: אם נרצה לקרוא רשומת קלט אחת, ולכתוב חמש רשומות בגין כל  רשומה אחת שקראנו, נשתמש בתכנית הבאה:

PROCEDURE DIVISION.

OPEN INPUT FILE1, OUTPUT OUT-FILE.

READ FILE1 AT END MOVE 1 TO EOF.

PERFORM CALC-RTN UNTIL EOF = 1.

CLOSE FILE1, OUT-FILE.

CALC-RTN.

MOVE ZEROS TO CTR1.

MOVE ITEM-IN TO ITEM-OUT.

PERFORM WRITE-RTN UNTIL CTR1 = 5.

READ FILE1 AT END MOVE 1 TO EOF.

WRITE-RTN.

WRITE ITEM-IN.

ADD 1 TO CTR1.

הוראת PERFORM ... UNTIL קובעת: האם יש לבצע פעם נוספת את קטע התכנית האמור, או - לחילופין- אם יש לסיים את התכנית. CTR1 מקבל את הערך ההתחלתי אפס. האינפורמציה מועברת מהמשתנה ITEM-IN למשתנה ITEM-OUT. הוראת PERFORM מפעילה את קטע התכנית WRITE-RTN. רשומה נכתבת לפי ITEM-OUT, והמונה CTR1 גדל ב-1. ברגע זה CTR1 = 1. הואיל והמשתנה CTR1 אינו שווה ל-5, קטע התכנית WRITE-RTN מבוצע שוב. הרשומה השנייה נכתבת על פי CARD-OUT, ומתווסף למשתנה CTR1 עוד 1. כרגע הוא מכיל 2. תהליך זה ממשיך ומתבצע, עד שהמשתנה CTR1 מכיל את הערך 5. הואיל והמשתנה CTR1 כבר מכיל את הערך 5, חוזר הפיקוח להוראה שלאחר הוראת PERFORM - דבר המביא לקריאת רשומה נוספת מקובץ FILE1. שים לב, כי בקידוד מלא של התכנית יש להגדיר את המשתנה CTR1 בקטע שטחי העבודה

שים לב, כי בקטע הראשי של התכנית, הוראת  PERFORM ... UNTIL עצמה נמצאת תחת פיקוח הוראת PERFORM . זהו קטע התכנית הראשי, המפעיל את קטע התכנית CALC-RTN, וזאת עד אשר EOF= 1. מכאן, שהקטע CALC-RTN , המפעיל קטע אחר , מופעל בעצמו על ידי הוראת PERFORM . תהליך זה של קטע, המפעיל קטע ובעצמו מופעל על ידי קטע אחר, הינו תהליך רגיל של כתיבת תכנית. 

נסכם, אם כך, את סדרת ההוראות, אשר בדרך כלל מתבצעות בזמן ביצוע לולאות:

     
  1. יש לטעון את השדה, אשר אותו בודקים, בערך התחלתי מתאים.

  2. כתיבת ההוראה: .(תנאי) UNTIL (קטע תכנית) PERFORM  

  3. לאחר הוראת PERFORM חייבות לבוא הוראות, המעבירות פיקוח לקטע אחר בתכנית.

  4. קידוד קטע התכנית, אשר מתבצע במסגרת הלולאה.

  5. שינוי המשתנה, המשמש כתנאי לביצוע הלולאה, כך שיקרב אותו אל התנאי הנבדק. מצב זה, הוא המאפשר לסיים את הלולאה ולהפוך אותה לולאה סופית.

התבונן בקטע התכנות הבא, ובדוק, אם אתה מוצא שגיאה לוגית בקטע זה. המטרה: להוסיף את המשתנה FIELDA למשתנה SUM-TOTAL עשרפעמים.

MOVE 0 TO CTRA.

PERFORM ADD-RTN UNTIL CTRA = 10.

WRITE  TOTAL-REC.

ADD-RTN.

ADD FIELDA  TO  SUM-TOTAL.  

הבחנת, כנראה, שבקטע הקידוד ADD-RTN. אין כל מהלך, המשנה ומגדיל את המשתנה CTRA. משתנה זה, שהיה בעל ערך התחלתי של אפס, יישאר כזה ולא יגדל. קטע התכנות ADD-RTN. יתבצע, לאחר שהתנאי הנבדק CTR = 10 מקבל תשובה שלילית. מהלך זה יבוצע הרבה יותר פעמים מאשר ביקשנו באופן מעשי לבצע, וזאת הואיל וההוראה .ADD 1 TO CTRA אינה נכללת בקטע ADD-RTN. מצב זה נקרא לולאה אינסופית. באופן מעשי יארע הדבר הבא במחשבים מסויימים : השעון הפנימי הקיים במחשב יבחין בפעולה זו, שאינה מסתיימת, ויפסיק את מהלך התכנית. במחשבים, שמנגנון זה אינו קיים בהם, תמשיך פעולת הלולאה האינסופית, עד שהתכניתן יפסיק את מהלך התכנית. נניח שאנו רוצים לבצע חיקוי של הכפלת המשתנה A במשתנה B, על ידי ביצוע פעולות חיבור. לדוגמא, אם המספר שלוש מתחבר לעצמו ארבע פעמים, התוצאה היא 12 - תוצאה המקבילה לפעולת הכפל 4 * 3. אם נשתמש בהוראה PERFORM ... UNTIL נוכל לכתוב את קטע הקידוד הבא:

MOVE  ZEROS  TO TOTAL.

PERFORM RTN1 UNTIL A = 0.

WRITE ANS-REC.

RTN1.

ADD B TO TOTAL.

SUBTRACT 1 FROM A.

נניח ש A=3 ו-B=4, ונבדוק אם התוצאה המתקבלת היא TOTAL = 12.

התוצאה

TOTAL = 0

MOVE ZEROS TO TOTAL.

PERFORM RTN1 UNTIL A = 0

WRITE ANS-REC.

 

RTN1.

TOTAL = 4 

ADD B TO TOTAL.

A = 2

SUBTRACT 1 FROM A.

 TOTAL = 8

A = 1

 

TOTAL = 12

A = 0

 

כאן ביצוע הוראת PERFORM מסתיימת והוראה הבאה אחריה מתחילה להתבצע

תהליך זה הוא נכון עבור כל המספרים החיוביים והשלמים, אשר המשתנה B יכיל, שים לב, שאם במקרה B = 0, קטע הקידוד RTN1 פשוט לא יתבצע. בזמן ביצוע הוראת:

(תנאי) UNTIL  (קטע תכנית) PERFORM, אם התנאי מתקיים בפעם הראשונה שמגיעים להוראה זו - קטע התכנית המופעל אינו מתבצע.

הוראה PERFORM פשוטה

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

(שם קטע תכנית) PERFORM

הוראה זו תגרום לביצוע התהליך הבא:

     
  1. העברת פיקוח והפעלת קטע התכנית, ששמו רשום בהוראה.

  2. מעבר להוראה הבאה, שלאחר הוראת PERFORM .

לדוגמא

COMP-RTN.

IF CODE-X = 1 PERFORM CREDIT-RTN

ELSE PERFORM DEBIT-RTN.

WRITE DETAIL-REC.

READ FILE1 AT END MOVE 1 TO EOF.

COMP-RTN.

IF AMT1 = ZERO PERFORM ERR-RTN1.

IF AMT2 IS NEGATIVE PERFORM ERR-RTN2.

קודם | תחילת הדף | הבא

שאלות להערכה עצמית >>

 

נושאים

פרק 3 - חטיבת הזיהוי                               (IDENTIFICATION DIVISION)
פרק 6 - חטיבת הביצוע                               (PROCEDURE DIVISION)
פרק 14 - הוראת DISPLAY ו-ACCEPT

.איתן 2002. כל הזכויות שמורות למערכת המידע איתן ©