פרק
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,
ולפי סדר אחר - קטע זה לא יתבצע. ואמנם קיים
סדר מודרג של ביצוע התנאים הנ"ל.
סדר
בדיקת התנאים בתנאי מורכב
|
-
תנאים,
הקשורים בינהם בבדיקת המלה AND
,
מתבצעים ראשונים.
-
תנאים,
הקשורים ביניהם בבדיקת המלה OR
,
מתבצעים אחרונים.
-
בזמן
צירוף תנאי 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
|
קודם | תחילת הדף | הבא
שאלות
להערכה עצמית >>
|
פרק 1 - מבוא לתכנות COBOL.
פרק 2 - ארגון נתונים
פרק 3 - חטיבת הזיהוי
(IDENTIFICATION DIVISION)
פרק 4 - חטיבת הסביב
(ENVIRONMENTAL DIVISION)
פרק 5 - חטיבת הנתונים
(DATA DIVISION)
פרק 6 - חטיבת הביצוע
(PROCEDURE DIVISION)
פרק 7 - הוראת MOVE
פרק 8 - קטעי האחסון לעבודה
פרק 9 - הוראות אריתמטיות
פרק 10- הוראות תנאי
פרק 11 - רישומים נוספים בחתיבת הנתונים
פרק 12 - עריכת פלט מודפס
פרק 13 - הוראות מיוחדות לעריכת הדפסה
פרק 14 - הוראת DISPLAY ו-ACCEPT
|