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

א. תנאי פשוט

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

הצורת הבסיסית לכתיבת הוראות תנאי היא:

    (הוראה/הוראות ביצוע) (תנאי כל שהוא) IF

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

החלק השני של ההוראה (ELSE) אינו חייב להופיע במסגרת ההוראה, אלא ניתן להשתמש בו על פי הצורך. בפרק הקודם למדנו הוראות, אשר ביצוען אינו מותנה בתנאי כלשהוא, כגון: ADD A TO B, MOVE C TO D, OPEN INPUT FILE. מכאן שאנו מבחינים בשני סוגים עקריים של הוראות בשפת COBOL:

     
  1. הוראות ביצוע.

  2. הוראות תנאי.

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

תנאי פשוט

aIF A IS EQUAL TO B

bIF A IS LESS THEN B

c)  IF A IS GREATER THAN B

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

IF A IS EQUAL TO B DIVIDE C INTO D ELSE ADD A TO TOTAL

באופן מעשי, שתי בדיקות מופיעות בהוראה זו:

א. האם A שווה ל-B.

ב. האם A אינו שווה ל-B.

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

ב. כאשר מתקיים מצב של אי שוויון, לא תתבצע הוראת DIVIDE; אלא רק החלק השני של ההוראה, המופיע לאחר המלה ELSE, הוא שיתבצע, כלומר - פעולת החיבור (ADD). גם במקרה זה, ההוראה הבאה אשר תתבצע לאחר ביצוע פעולת החיבור תהיה ההוראה אשר תופיע לאחר בדיקת התנאי.

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

MOVE  NAME  TO NAME-OUT.

MOVE AMOUNT  TO  AMT-OUT.

IF AMT-OUT IS EQUAL TO ZEROS  MOVE ‘NO TRANS’ TO OUT-AREA.

WRITE  PRINT-REC.

במקרה זה, ההודעה “NO TRANS” תודפס אך ורק, אם המשתנה AMOUNT יכיל את הערך אפס. אחרת, תמשיך התכנית להתבצע ללא כל ביצוע הדפסה, ומכאן, שאין צורך להשתמש בצורה המירבית של משפט התנאי, הכולל את המלה ELSE.

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

פירוש

סימן

IS  LESS THAN

>

IS GREATER THAN

<

IS EQUAL TO

=

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

IF A > B ADD A TO C ELSE MULTIPLY B BY C.

או

IF A IS GREATER THAN B ADD A TO C ELSE MULTIPLY B BY C.

המשתנה C יוכפל במשתנה B, אם ורק אם התנאי הנבדק לא יתקיים, כלומר, אם המשתנה A שווה למשתנה B או קטן ממנו. רוב המהדרים של שפת COBOL דורשים מרווח אחד, לפחות, מכל צד של סימן התנאי < , > , =, ויש להקפיד על צורת רישום זו.

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

IF A = ‘123’ MOVE C TO D.

יוצאים מתוך ההנחה, שהמשתנה A הוא משתנה אלפאנומרי, הואיל והוא נבדק מול קבוע אלפאנומרי. מצב זה דומה למצב, המתקיים בהוראת MOVE, בו מועברים נתונים בין משתנים, או בין קבוע ומשתנה. אם B הוא משתנה מספרי (נומרי), המוגדר PICTURE 999, הרי שהוראת התנאי שתיכתב במקרה זה תהיה:

IF B = 123 MOVE E TO F.

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

בהוראה הבאה:        IF A = B PERFORM RTN1.

המשתנים A,B  חייבים להיות משתנים מספריים, או אלפאנומריים. בהשוואת ערכים מספריים כל המספרים הבאים, בצורה בה הם רשומים, הינם זהים:

012

12.00

12

12+

ברור, אם כן, שלמרות העובדה שהמספר 12.00 הוא בעל תבנית שונה מהמספר 012, הרי בהשוואה מתמטית התשובה שנקבל תהיה שהמספרים שווים.

באוופן דומה, אם נשווה בין שני המשתנים בעלי התכולה הבאה:

ABC

  ABC~ (מרווח = ~)

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

בהשוואת ערכים אלפאנומריים במסגרת הוראת תנאי, תתבצע ההשוואה בין המשתנים על פי בדיקת תו אחרי תו משמאל לימין; כל תו נבדק על פי תצוגתו הבינארית. כך קורה שמרווח, שהוא בעל תצוגה ביבארית נמוכה, "קטן" יותר מכל אות, ספרה או סימן מיוחד. האות "A" הינה בעלת ערך נמוך יותר מהאות "B", וכו'.  

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

ערך גדול     ~ABC…Z0123…9      ערך קטן

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

ABCD < BBCD

BBCD < ZBCD

ZBCD < 1BCD

ABCD < ACCD

~BCD < ABCD

~BCD < ABCD

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

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

א. אם A < B אז חבר את המשתנה C למשתנה D והעבר את הקבוע 2 למשתנה ITEM1.

ב. אם A אינו קטן מ-B, אז חבר את המשתנה E למשתנה C. בכל מקרה, העבר את הקבוע אפס למשתנהITEM2 .

סדרת הוראות אלה באה לידי ביטוי בדוגמא הבאה:

IF A < B                    

THEN                       

ADD C TO D.

MOVE 2 TO ITEM1.

ELSE                        

ADD E TO C.

MOVE 0 TO ITEM2.

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

IF A = B THEN NEXT SENTENCE

ELSE ADD A TO D.

משמעות ההוראה היא, שאם A = B, לא תתבצע כל הוראה, אלא ההוראה הבאה לאחר הוראת התנאי; אחרת המשתנה A מתחבר למשתנה D, ולאחר מכן מתבצעת ההוראה הבאה. ניתן להשתמש בהוראת הסרק NEXT SENTENCE גם במסגרת חלקה השני של הוראת התנאי, במסגרת ELSE, אולם לשימוש זה אין כל משמעות. לדוגמא, שתי ההוראות הבאות זהות מבחינת פעילותון:

IF C = D ADD A TO B ELSE NEXT SENTENCE

IF C = D ADD A TO B.

המשפט ELSE NEXT SENTENCE הוא אינו הכרחי, כי כש-C אינו שווה ל-D, ממילא מתבצעת ההוראה הבאה. בקיצור, משפט ELSE שימושי רק כשיש לבצע פעולה מסויימת או פעולות מסויימות כשהתנאי אינו מתקיים.

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

 

נושאים

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

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