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

ד. תנאי מורכב

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

בעזרת התנאי המורכב ניתן לבצע פעולה, אם תנאי אחד מתוך סדרת תנאים קיים. כל תנאי מתוך סדרת התנאים, אשר בהוראת IF, מופעל על ידי COBOL בעזרת המלה OR (או). תבנית ההוראה במקרה זה הינה כדלקמן:

(תנאי) OR .... (תנאי) OR  (תנאי) OR  (תנאי) IF

(הוראה/הוראות ביצוע) 

     (הוראה/הוראות ביצוע) ELSE

 

דוגמא

IF A = B OR B > C PERFORM RTN5.

IF A < C OR A = D MOVE A TO B ELSE  PERFORM ERR-RTN.

כמות התנאים, הנבדקים בהוראה אחת, אינה מוגבלת. באופן מעשי, המגבלה הקיימת הינה מיגבלת מחשב זה או אחר, המגביל אותנו בכמות השורות, שלאורכן הוראה אחת יכולה להשתרע.

אנו רואים, כי בתבנית זו של הוראת התנאי המורכב מופיעה המלה IF פעם אחת בלבד. נראה, כי ההוראה הבאה בלתי נכונה:

IF A = B OR IF B = C PERFORM PARA-5.

וזאת משום שהמלה IF מופיעה יותר מפעם אחת.

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

IF A = 7 OR 8 PERFORM RTN5.

אולם זו אינה טעות לרשום גם בצורה הבאה:

IF A = 7 OR A = 8 PERFORM RTN5.

על ידי שימוש במלה OR, כל אחד מהתנאים שייבדק ויתברר נכון, יגרום להוראת הביצוע להתבצע. אם אף אחד מהתנאים אינו מתקיים, תתבצע הוראת הביצוע שלאחר משפט ELSE (אם קיים).

נתבונן בזזוגמא הבאה

IF A < D OR A = E  ADD A TO B  

ELSE PERFORM ERR-RTN.

אנו רואים, כי הקטע ERR-RTN יתבצע, רק אם המשתנה A גדול או שווה למשתנה D, והמשתנה A אינו שווה למשתנה E אחרת, תתבצע הוראת הביצוע של חיבור המשתנה A למשתנה B.

דוגמא

נניח, שהמשתנה A הינו משתנה נומרי בעל שתי ספרות, ללא נקודה עשרונית. נרצה לבצע את הקטע TENS-RTN רק בתנאי, שהמשתנה A הינו מכפלה של המספר 10 . בכדי לבצע לולאה זו, נוכל לרשום הוראת UNTIL .... PERFORM, כפי שרשום להלן:

MOVE 90 TO CTR.

PERFORM BEGIN UNTIL CTR = 0.

BEGIN.

IF A = CTR PERFORM TENS-RTN.

SUBTRACT 10 FROM CTR.

המשתנים A ו-CTR  מוגדרים בחטיבת הנתונים, והשימוש במסגרת זו הינו חוקי. אם נרצה לרשום אותן ההוראות בצורת רישום שונה, נוכל להשתמש בצורה הבאה:

IF A = 10 OR A = 20 OR A = 30 OR A = 40 OR A = 50

OR A = 60 OR A = 70 OR A = 80 OR A = 90

PERFORM TENS-RTN.

קיים מצב, אשר בו נרצה לבדוק במסגרת תנאי מורכב סדרה של תנאים ולבצע פעולה כלשהי, בתנאי שכל התנאים במסגרת הסדרה הנבדקת יתקיימו; ולא נסתפק בתנאי אחד בלבד. במקרה זה נשתמש במלה AND המקבילה למלה העברית גם. תבנית הוראת IF, במקרה זה, תהיה כדלקמן:

(תנאי) AND .... (תנאי) AND  (תנאי) AND  (תנאי) IF

(הוראה/הוראות ביצוע) 

     (הוראה/הוראות ביצוע) ELSE

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

דוגמא

נניח שנרצה לבצע את קטע התכנית PRINT-RTN, אם כל התנאים הבאים יתקיימו:

A = B, C = D,E = F , אחרת נפעיל את קטע התכנית STAR-1. כלומר, אם אחד התנאים או יותר לא יתקיים, יש להפעיל את STAR-1. במקרה זה נשתמש בהוראה הבאה:

IF A = B AND C = D AND E = F PERFORM PRINT-RTN

ELSE PERFORM STAR-1.

במקרה זה, אם לכל התנאים התשובה הינה חיובית, יתבצע הקטע PRINT-RTN. אם לאחד התנאים התשובה תהיה שלילית, יתבצע הקטע STAR-1.

יש מקרים, בהם קיים צורך בשימוש בשתי צורות התנאי המורכב יחד, גם במלה AND וגם במלה OR.

דוגמא

כתוב קטע תכנית, המבצע את קטע התכנית CALC-RTN, אם המשתנה A מכיל מספר בין 10 ל-20 (כולל את 10 ואת 20). צא מתוך ההנחה, שהמשתנה A הוגדר במסגרת חטיבת הנתונים. במבט ראשון נראה, שיש צורך בשימוש במשפט המורכב הבא:

IF A = 10 OR A = 11 OR A = 12 … OR A = 20

PERFORM CALC-RTN.

אם נכתוב בצורה זו, אנו חייבים לצאת מתוך ההנחה (שאינה הכרחית), שהמשתנה A מוגדר כמספר שלם, אשר אינו יכול להכיל שבר עשרוני. במקרה זה, אם A = 10.3 הרי שהוא בין הערכים 10 ו-20, אבל משפט התנאי המורכב שכתבנו לא יתקיים. מאותה הסיבה לא נוכל לרשום את המשפט הבא:

IF A > 9 AND A <21 PERFORM CALC-RTN.

זאת הואיל והמספר 9.8 כלול במסגרת התנאי, אבל אינו מספר בין 10 ל-20. מכאן, שנוכל לרשום את ההוראה, אם תכיל את התנאים הבאים:

א. A = 10

ב. או A > 10  AND A < 20

ג. או A = 20

במקרה זה ההוראה תירשם כדלקמן:

IF A = 10 OR A > 10 AND A < 20 OR A = 20

PERFORM CALC-RTN.

סדר בדיקת התנאי בהוראת תנאי מורכב

בזמן שימוש בהוראת תנאי אחת במילים AND, OR, נשאלת השאלה, מהו סדר בדיקת התנאים לצורך ביצוע ההוראה.

התבונן בדוגמא הבאה

IF A = B OR C = D AND E = F PERFORM PARA1.

הנחה: A = 2, B = 2, C = 3, D = 4, E = 5, F = 6

בהסתמך על הדוגמא, מה יהיו התנאים שהקטע PARA1 יתבצע?

נניח, שבדיקת התנאים היא כדלקמן:

א. IF A = B OR C = D

ב. וגם E = F

אם זאת ההוראה לבדיקת התנאים, קיימות שתי אפשרויות, שהקטע PARA1 יתבצע.

א. A = B  וגם E = F.

ב. C = D וגם E = F.

הואיל והמשתנה E אינו שווה למשתנה F, לא יתבצע הקטע PARA1 בכל מקרה. אולם ניתן להניח, שבדיקת התנאים הינה אחרת, והיא כדלקמן:

א. A = B.

ב. או C = D AND E = F

גם במקרה זה קיימים שני תנאים לכך, שהקטע PARA1 יתבצע

א. אם A = B 

ב. אם  C = Dוגם E = F.

הואיל והתנאי הראשון,A = B , מתקיים, הרי שהקטע PARA1 יבוצע בכל מקרה, אפילו אם התשובה לתנאי השני תהיה שלילית.

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

 סדר בדיקת התנאים בתנאי מורכב

  1. תנאים, הקשורים בינהם בבדיקת המלה AND , מתבצעים ראשונים.

  2. תנאים, הקשורים ביניהם בבדיקת המלה OR , מתבצעים אחרונים.

  3. בזמן צירוף תנאי AND  ו -OR יחד, הוראות התנאי הקשורות במלה AND . יתבצעו ראשונות, על פי סדר הופעתן במשפט משמאל  ימין, ולאחר מכן יבוצעו התנאים הקשורים במלה OR , וגם הם יבוצעו על פי סדר הופעתם משמאל לימין.

אם כך, הדוגמא צריכה להיות מובנת בצורה הבאה:

א. IF C = D AND E = F  

ב. או (OR) A = B   

ולפי האמור לעיל, הקטע PARA1 אמנם יבוצע, מאחר שמתקיים התנאי A = B.

דוגמא

נבקש להדפיס את המשתנה A, אם הוא בעל ערך בין 10 ו-100 (כולל), הווה אומר: אם הוא שווה או גדול מעשר, וגם שווה או קטן ממאה. נבחן את ההוראה הבאה - אם היא מבצעת את תנאי הדוגמא:

IF A < 100 OR A = 100 AND A = 10 OR A > 10

PERFORM PRINT-RTN.

מתוך בחינת סדר בדיקת התנאים אנו רואים כי התנאים נבדקים כדלקמן (נזכור כי ראשית מבוצעות בדיקות תנאי AND, ולאחר מכן OR):

א. IF A = 100 AND A = 10 

ב. או A < 100

ג. או A > 10 

נבחין מיד, כי תנאי א. הינו תנאי בלתי אפשרי, הואיל והמשתנה A אינו יכול להיות גם שווה למאה וגם שווה לעשר. לפיכך, הואיל והוא בלתי אפשרי, ניתן להוציאו מההוראה, ותישאר ההוראה הבאה:

IF A < 100 OR A > 10 PERFORM PRINT-RTN.  

ברור, שהכתוב כאן אינו הפתרון לשאלה כפי שנשאלה, מאחר שכל ערך של המשתנה A יקיים את התנאי שביקשנו. אם A > 100 תתקבל תשובה חיובית הואיל והוא עונה לתנאי האם A > 10. אם A < 10 התשובה גם היא חיובית, הואיל והוא עונה לתנאי A < 100, מכאן, שיש לשנות את סדר כתיבת השאלות לסדר הבא:

א. IF A < 100 OR A = 100  

ב. וגם (AND)A = 10 OR A > 10

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

IF ( A < 100 OR  A = 100 ) AND ( A = 10 OR A > 10 )

PERFORM PRINT-RTN.

 זכור

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

שלילת תנאי מורכב

אם נרצה להשתמש בשלילת תנאי כלשהו צריך להימנע ממכשלה מסויימת.

דוגמא

רשום קטע תכנית, אשר יבצע PERFORM SOUTH, אם המשתנה A אינו שווה למספר 7 או 8. אחרת - בצע את הקטע PERFORM NORTH. ניתן לרשום זאת על פי הצורה הבאה:

IF A IS EQUAL TO 7 OR A IS EQUAL TO 8

PERFORM NORTH 

ELSE PERFORM SOUTH

אך אם נרצה להשתמש בתנאי שלילי, במחשבה ראשונה היינו רושמים: 

IF A IS NOT EQUAL TO 7 OR A IS NOT EQUAL TO 8

PERFORM SOUTH 

ELSE PERFORM NORTH.

בחינה של ההוראה הנ"ל תראה, שהכתיבה אינה נכונה. אחד התנאים חייב להתקיים עבור הקטע SOUTH.  נבדוק זאת:

א. A IS NOT EQUAL TO 7 

ב. או (OR)A IS NOT EQUAL TO 8.

נניח, שהמשתנה A מכיל את הערך 6. הקטע SOUTH יבוצע, וזאת על פי מה שביקשנו. אם A = 7, רצינו שהקטע שיבוצע יהיה NORTH, אולם תנאי א' לא מתקיים, מאחר ש-A = 7 , ואילו תנאי ב' מתקיים, הואיל והוא אינו שווה ל-8 (הוא שווה ל-7). רק תנאי אחד משני התנאים א' או ב' צריך להתמלא, כדי שיתבצע הקטע SOUTH; ותנאי ב' מספק לנו צורך זה. באופן דומה, רצינו שאם A = 8 הקטע NORTH יבוצע, אולם שוב יבוצע הקטע SOUTH, וזאת מאחר שתנאי א' יספק לנו ביצוע זה, היות ש-A = 8 , והוא עונה לתנאי א'.

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

( (תנאי) OR (תנאי) ) IF NOT

הרי שנקבל את התנאי הבא:

(תנאי) AND NOT (תנאי) IF NOT

על פי זה, בדוגמא הקודמת של שלילת התנאי A = 7 או A = 8 , יש להשתמש בצורת הרישום הבאה:

IF A IS NOT EQUAL TO 7 AND A IS NOT EQUAL TO 8

PERFORM SOUTH ELSE PERFORM NORTH.

רצוי, אם ניתן, במקרה של רישום הוראה IF עם תנאי מורכב, לרשום כל משפט בשורה נפרדת, לצורך קריאה בהירה יותר של המשפט ומניעת בלבול בהבנה. לדוגמא:

תבנית מועדפת

IF GROSS-PAY > TOTAL

ADD 50.00 TO COMMISSION

MULTIPLY GROSS-PAY BY TAX GIVING TOT1

ELSE

ADD 25.00 TO COMMISSION

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

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

 

נושאים

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

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