בית פורומים למתכנתים שבינינו

לימוד שפת קובול - COBOL:

שלום אורח. באפשרותך להתחבר או להירשם
הצג 15 הודעות בעמוד הוסף לדף האישי  דווח למנהל שלח לחבר
נשלח ב-27/7/2011 15:27 לינק ישיר 
לימוד שפת קובול - COBOL:

נלקח מהאתר: www.vlib.eitan.ac.il

פרק 1 מבוא לתכנות COBOL

 א. אופי השפה ה-COBOL

 

COBOL הינה שפת המחשב המסחרית הנפוצה ביותר כיום. הסיבות לעובדה זו נידונות בסעיף זה.

המלה COBOL הינה קיצור של המלים האנגליות 

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

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

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

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

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

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

השפה האנגלית, המשמשת לכתיבת COBOL, מאפשרת לכתוב תכניות בקלות רבה יותר. באופן דומה, ניתן גם לקרוא תכניות COBOL בקלות. תכניות כאלה ניתנות, באופן כללי, להבנה על ידי אנשים שאינם אנשי מחשבים מובהקים. מנהל-עסקים, שאינו יודע הרבה על מחשבים, יכול להבין טוב יותר את אופיה של מטלת-תכנות  (PROGRAMMING JOB), פשוט על ידי קריאתה של תכנית COBOL.

ב. תכנות מבני (STRUCTURED PROGRAMMING)

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

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

כאשר תכניתנים כותבים את תכניותיהם תוך שימוש בשיטות תכנות מבני, הם מחלקים את תכניותיהם ליחידות נפרדות או לקטעים נפרדים         (MODULES). להלן רשימה של כמה ממטרותיה של שיטה זו.

מטרות התכנות המבני:

  1. לפשט את תהליך ניפוי השגיאות (DEBUGGING).

  2. להקל על קידוד של בעיות ארוכות וסבוכות.

  3. לייעל את התכניות.

  4. להקל קריאת תכניות והבנתן.

 שיטות מקובלות בתכנות מבני

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

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

 גישת התכנות מלמעלה למטה (TOP-DOWN APPROACH)

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

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

לסיכום, אנו נמנעים מלהשתמש בהוראות GO TO בתכניותינו לצורך מעבר משגרה לשגרה (מקטע לקטע); השימוש בפקודה זו מותר רק בתוך השגרה עצמה.




תוקן על ידי אנוני_מוס ב- 27/07/2011 15:26:38



תוקן על ידי אנוני_מוס ב- 27/07/2011 16:18:12




דווח על תוכן פוגעני

סמל אישי
מנותק
נשלח ב-27/7/2011 15:27 לינק ישיר 
פרק 2 ארגון נתונים

 א. תיאור של קבצים, רשומות ושדות

חוקים למתן שמות למבני נתובים

קבצים, רשומות, פריטים מקובצים ופריטים בסיסיים הינם מבני נתונים, הניתנים להגדרה בתכנית COBOL. יש לתת להם שמות  (DATA-NAMES).

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

 חוקים למתן שמות-נתונים

  1. 1 עד 30 תווים.

  2. יכולים להכיל אותיות, ספרות ומקפים (-) בלבד.

  3. שם אינו יכול להתחיל או להסתיים במקף.

  4. האותיות, הספרות והמקפים חייבים להיות רצופים, ללא מרווחים ביניהם.

  5. חייב להכיל לפחות תו אלפאביתי אחד.

  6. אין לתת שם לנתון, שהוא זהה למלה שמורה ב-COBOL, כלומר מלה שיש לה משמעות מסויימת עבור המהדיר של  COBOL.

 

 דוגמאות לשמות חוקיים

DATE-IN

NAME

 LAST-NAME

AMOUNT1

AMOUNT-OF-TRANSACTION

 

 דוגמאות לשמות בלתי-חוקיים

השם

הסיבה לאי-חוקיותו
EMPLOYEE NAME

קיים רווח בין EMPLOYEE ל-NAME.

DISCOUNT-%

התו % הוא תו מיוחד ולכן בלתי חוקי בשם.

INPUT

היא מלה שמורה ב-COBOL.

123

שם נתון ב-COBOL חייב להכיל לפחות אות אחת .

 

ב. סוגי נתונים

קבועים מספריים

קבוע מספרי הוא קבוע המוגדר בחטיבת הביצוע                               (PROCEDURE DIVISION) ומשמש לביצוע פעולות אריתמטיות.

 חוקים לכתיבת קבועים מספריים

  1. ניתן לרשום עד 18 ספרות.

  2. ניתן לרשום סימן חיובי (+) או שלילי (-) משמאל למספר.

  3. ניתן לרשום נקודה עשרונית בתוך הקבוע. אסור לנקודה עשרונית זו להיות התו האחרון בקבוע.

 

שים לב, שהסימן חיובי או שלילי אינו חייב להופיע כחלק מן הקבוע, אך יכול להופיע. אם הסימן כלול בקבוע, עליו להופיע משמאל למספר. כלומר המספריס 16+ או 12- הינם קבועיס מספריים חוקיים,אך +16 או -12 אינם חוקיים. אם אין סימן משמאלו של המספר, המספר ייחשב חיובי.

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

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

 קבועים מספריים חוקיים

15.8+

381.58 -

 42

05.

97. -

נניח שברצוננו להוסיף 10.3 לשדה פלט, הנקרא TOTAL , והמוגדר בקטע FD (תיאור הקובץ) בחטיבת הנתונים. ההוראה הבאה הינה חוקית:

TOTAL = 5

...

.ADD  10.3  TO  TOTAL

' = DISPLAY  'TOTAL

DISPLAY  TOTAL

ניתן להשתמש בקבוע המספרי 10.3 לפעולות חשבוניות.

להלן מופיעים קבועים מספריים, שאינם חוקיים, ומוסברות הסיבות לחוסר חוקיותם:

הקבוע וסוג השגיאה

הקבוע

סוג השגיאה

1,000

 אין לשים פסיקים.

15.

 נקודה עשרונית אינה חוקית בתו  האחרון.

 $100.00

סימני $ אינם חוקיים.

38J

אין להכניס אותיות בקבוע מספרי.

-17.45 

הסימן חייב להופיע מצידו השמאלי  של המספר

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

קבועים שאינם מספריים

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

 חוקים לכתיבת קבועים לא מספריים

  1. הקבוע חייב להיות 'סגור' בין שני סימני ציטוט.

  2. כמות התווים בקבוע לא תעלה על 120 תווים, כולל מרווחים.

  3. ניתן .ולבנמש בכל סימן במערכת הסימנים של COBOL פרט לסימן הציטוט .

 

 להלן מספר קבועים לא מספריים חוקיים

'ABC 123'

'1,000 '

 'INPUT'

'$ 100.00'

'MESSAGE'

הדפסת קבוע מהקבועים שלמעלה תגרום הדפסת כל התווים שבין סימני הציטוט. כלומר יודפסו ABC 123 , CODE,1,000  וכו'. שים לב, שקבוע שאינו מספרי יכול להכיל כל ספרה, '123' הוא קבוע לא מספרי חוקי. יש להבחין בינו לבין הקבוע המספרי 123, המשמש לפעולות אריתמטיות.

 אם ,כרצוננו להציב את ההודעה INVALID RECORD בשדה פלט בשם MESSAGE-FIELD, לפני שאנו כותבים את רשומת הפלט, נכתוב את ההוראה הבאה ב-COBOL:

 .MOVE  ZEROS  TO  TOTAL

' = DISPLAY  'TOTAL

DISPLAY  TOTAL

משמעותה של הוראה זו היא, שהשדה TOTAL ימולא כולו באפסים. לקבוע המיוחד ZERO יש ערך של 'הכל אפסים' (או 'מלא באפסים'). המילים ZEROES, ZEROS, ZERO הינם קבועים מיוחדים שקולים, שיש להם אותו ערך. ניתן להחליפם וה בזה בתכנית  COBOL.

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

.MOVE  SPACES  TO CODE-OUT

' = DISPLAY  'CODE-OUT

DISPLAY  CODE-OUT

תגרום, שהשדה CODE-OUT ימולא ברווחים. המלה SPACES  הינה מלה שמורה ב- COBOL, שיש לה ערך של 'מלא ברווחים'. ניתן להחליפה בקבוע המיוחד השקול SPACE  .

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



חוקים לכתיבת קבועים מספריים

1. משתנים

הגדרה:

 נתונים, המשתנים במשך התכנית.

קבצים

רשומות

שדות

 

 מוגדרים על ידי שמות-נתונים.

2. קבועים

 הגדרה:

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

קבוע מספרי

קבוע, המשמש לפעולות חשבוניות (אריתמטיות) בחטיבת הביצוע.

קבוע שאינו מספרי

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

קבוע מיוחד

מלה שמורה ב- COBOL, שיש לה משמעות מיוחדת עבור המהדיר: ZEROS ; ZEROES ; ZERO וכן SPACES ;SPACE. 




תוקן על ידי אנוני_מוס ב- 27/07/2011 15:29:15




דדווח על תוכן פוגעני

סמל אישי
מנותק
נשלח ב-27/7/2011 15:30 לינק ישיר 
פרק 3 חטיבת הזיהיי (IDENTIFICATION DIVISION)

א. המבנה הבסיסי של תכנית COBOL

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

הערות

כוכבית (*) בטור 7 תציין, כי כל השורה הינה שורת העדה. שורות כאלה הינן שימושיות באספקת תיעוד על דרך עבודתה של התכנית.טורים 8-72 משתמשים לכתיבת כל שורות התכנית. עם זאת, שים לב כי טור  8 מסומן ב-A. וטור 12  מסומן ב-B. אלו הם טורי שוליים או מרווח.פקודות מסויימות חייבות להתחיל במרווח A. ופקודות אחרות- במרווח B.

פקודה צריכה להתחיל במרווח A, ניתן למעשה להתחילה בטורים 8,9,10  או 11 . בדרך כלל מתחילים לכתוב פקודה כזו בטור 8. פקודה שיש לקודדה החל ממרווח B , ניתן למעשה להתחילה בכל טור לאחר טור 11, כלומר ניתן להתחילה בטור 12,13,14 וכו'. שים לב: השוליים מציינים את נקודת ההתחלה של פקודות. פקודה, המתחילה במרווח  A, יכולה להתארך אל תוך מרווח B.

דוגמה 1

המלה AUTHOR (שם המחבר), שהיא שם סעיף בתכנית, חייבת להתחיל במרווח A. לאחריה ניתן לשים כל מידע שהוא במרווח B.

  28   24   20   16   12    87 
.NAMREHS YRELAV .ROHTUA  

 יתן לשים את האות A של המלה AUTHOR בטור 8 או במרווח A. המלה עצמה, עם זאת, ממשיכה אל תוך התחום של מרווח B . המידע המוכנס לאחר המלה AUTHOR, חייב להתחיל במרווח B, או אחרי טור 11 .בדוגמה שלנו, מתחילה ההצהרה הבאה בטור 16.

תכניות COBOL מתחלקות לחטיבות (DIVISIONS). לחטיבות אלה שמות קבועים: IDENTIFICATION (זיהוי); ENVIRONMENT (סביבה); DATA (נתונים) ו-PROCEDURE (ביצוע). על חטיבות אלה להופיע תמיד ובסדר זה, בכל תכנית. ניתן לחלק כל חטיבה לקטעים                (SECTIONS). לדוגמה, חטיבת הנתונים, המתארת את כל שטחי האחסון בהם משתמשת התכנית, מתחלקת לשני קטעים: FILE SECTION (קטע קבצים) ו WORKING-STORAGE SECTION (קטע אחסון לעבודה). כל קטע ניתן לחלוקה לסעיפים (PARAGRAPHS). כל יתר המשפטים, הכתובים בתכנית COBOL נחשבים הוראות (STATEMENTS).

חוקי מרווח (שוליים)

  1. חטיבות, סעיפים, שמות קטעים וFD- יתחילו במרווח A.

  2. כל שאר המשפטים וההוראות יתחילו במרווח B.

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

PROCEDURE DIVISION. 
             MOVE  TAX  TO  TOTAL.  ADD  1  TO  COUNTER

עם זאת, ולצורך הבהירות, אנו נסתפק בכתיבת הוראה אחת בלבד בכל שורה. שמות חטיבות וקטעים (DIVISIONS, SECTIONS) חייבים להופיע לבדם בשורה. עם זאת, שמות סעיפים (PARAGRAPHS) יכולים להופיע באותה שורה עם הוראות. יש לזכור, כי לאחר כל נקודה חייב לבוא רווח אחד לפחות.

ב. דרישות קידוד חטיבת הזיהוי

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

לחטיבת הזיהוי אין כל השפעה על ביצוע תכנית  COBOL. עם זאת, החטיבה חייבת להופיע בתכנית, כאמצעי זיהוי של המטלה (JOB) עבור המחשב.

חטיבת הזיהוי אינה מתחלקת לקטעים (SECTIONS). במקומם, יכולים להופיע הסעיפים הבאים:

PROGRAM-ID - זיהוי התכנית.

AUTHOR : שם המחבו.

INSTALLATION - המערכת שבה מורצת התכנית.

DATE-WRITTEN - תאריך-זכתיבה.

DATE-COMPILED - תאריך-הידור.

SECURITY - ביטחון.

REMARKS - העדות.

כמו כל שם חטיבה, יש לקודד את השם IDENTIFICATION DIVISION במרווח A  גם רשימת הסעיפים שלעיל תקודד במרווח A , ואחרי כל משפט או שם תופיע נקודה. הסעיף היחיד, שחייב להופיע בחטיבת הזיהוי, הוא סעיף PROGRAM-ID. השאר הם נתוני רשות, שאינם חייבים להופיע. כלומר, לכל תכנית חייב להיות שם. השם, המופיע לאחר PROGRAM-ID, נקרא שם חיצוני  (EXTERNAL-NAME), והוא מקודד

במרווח B . שמות חיצוניים ' יכולים להכיל אותיות, ספרות ומקפים עד לכמות מירבית של 30 תווים, אך רק 8 התווים הראשונים חייבים להיות ייחודיים לתכנית; כלומר,8  התווים הראשונים של השם החיצוני - הם המהווים למעשה את שם התכנית בפני המחשב. אם כן,2  השורות הראשונות בתכנית חייבות להיות חטיבת הזיהוי וזיהוי-התכנית:

IDENTIFICATION DIVISION. 
PROGRAM-ID.  SAMPLE1.

המשפט  PROGRAM-ID מסתיים בנקודה, ולאחריה רווח. השם החיצוני מקודד במרווח B , בהתאם לחוקים שפורטו לעיל. שים לב, שניתן היה לקודד את שני הפריטים בנפרד:

IDENTIFICATION DIVISION. 
PROGRAM-ID.  
            SAMPLE1.

היות והפריט  PROGRAM-ID הינו שם סעיף, ניתן להכניס את השם החיצוני SAMPLE1 באותה שורה – או בשורה הבאה. בכל מקרה, יש לשים נקודה אחרי שם סעיף (PROGRAM-ID) והשם החיצוני. שאר  שמות סעיפים שמנינו לעיל הינם לבחירה. אלו הם פריטים שימושיים, המספקים מידע בעל חשיבות על אופי התכנית, אך אינם הכרחיים.




דדווח על תוכן פוגעני

סמל אישי
מנותק
נשלח ב-27/7/2011 15:31 לינק ישיר 
פרק 4 חטיבת הסביבה (ENVIRONMENT DIVISION)

 א. קטע הרכב המערכה (CONFIGURATION SECTION)

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

חטיבת הסביבה מורכבת משני קטעים (SECTIONS):

קטעי חטיבת הסביבה

CONFIGURATION SECTION - קטע הרכב המעוכת

INPUT-OUTPUT SECTION : קטע קלט-פלט.

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

קטע הרכב המערכת (CONFIGURATION SECTION) של חטיבת הסביבה הוא קטע רשות (שאינו הכרחי), המציין: ( 1 ) את המחשב שבו נשתמש, כדי להעביר את התכנית הידור (COMPILATION), שיקרא מחשב המקור (SOURCE-COMPUTER)  (2)את המחשב, בו נשתמש, כדי לבצע או להריץ את התכנית –                             מחשב היעד OBJECT-COMPUTER .

שתי הכותרות SOURCE-COMPUTER ו- OBJECT-COMPUTER אינן הכרחיות בקטע הרכב המערכת. כזכור, כל שמות הקטעים בנוסף לשמות החטיבות, יקודדו במרווח A. לפיכך, הקטע CONFIGURATION SECTION יופיע לאחר הכותרת  ENVIRONMENT DIVISION, מקודד במסגרת מרווח A. SOURCE-COMPUTER                       ו-OBJECT-COMPUTER, שהינם שמות סעיפים (PARAGRAPHS), יקודדו אף הם במרווח A .

בכותרות SOURCE-COMPUTER ו-OBJECT-COMPUTER מפורטים:

  1. יצרן המחשב.

  2. מספר המחשב.

  3. דגם המחשב (אינו הכרחי).




 ב. קטע קלט-פלט (INPUT-OUTPUT SECTION)

קטע הקלט פלט של חטיבת הסביבה בא לאחר קטע הרכב המערכת, ומספק מידע על יחידות הקלט/פלט, בהם משתמשת התכנית. בפרק זה נדון בסעיף בקרת הקבצים (FILE-CONTROL) של קטע הקלט-פלט. בסעיף זה מוקצב שם לכל יחידה, בה תשתמש התכנית.  סעיף בקרת הקבצים מורכב ממשפטי SELECT. כל משפט SELECT מגדיר שם קובץ, ומשייך אליו יחידת קלט או פלט.

עיצוב המשפט נראה כך: 

(פירוט היחידה)  ASSIGN TO  (שם קובץ) SELECT

שמות קבצים

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

  1. 1 עד 30 תווים.

  2. ללא סימנים מיוחדים, פרט למקף.

  3. ללא רווחים בתוך שם הקובץ.

  4. תו אלפאביתי אחד לפחות - בהתחלה.

  5. יש לתת שמות בעלי משמעות.

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

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




דדווח על תוכן פוגעני

סמל אישי
מנותק
נשלח ב-27/7/2011 15:34 לינק ישיר 
פרק 5 - חטיבת הנתונים (DATA DIVISION)

 א. קטע הקבצים (FILE SECTION)

חטיבת הנתונים (DATA DIVISION)

חטיבת הנתונים בתכנית COBOL הינה החטיבה, המתארת ומגדירה את שדות הנתונים בשטח האחסון. יש להגדיר כל שטח אחסון, הדרוש לעיבוד הנתונים, באחד משני הקטעים, FILE SECTION (קטע קבצים) או WORKING-STORAGE SECTION (קטע שטח-אחסון לעבודה). כל תכנית, הקוראת נתונים כקלט ומייצרת נתוני פלט, זקוקה לקטע קבצים, כדי לתאר את הקלט והפלט. מאחר שכל תכנית מחשב קוראת נתונים, מעבדת אותם ויוצרת פלט, הפך קטע הקבצים לחלק הכרחי בכל תכנית. בהמשך נראה, כי קטע שטח-האחסון לעבודה הוא הקטע, בו מגדירים שדות, שאינם חלק משטחי אחסון הקלט או הפלט.

קטע הקבצים (FILE SECTION)

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

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

 חטיבת הנתונים יכולה להיות מורכבת מ-3 קטעים

  1. FILE SECTION (קטע הקבצים) - המגדיר את כל שטחי האחסון, שהם חלק מקובצי הקלט או הפלט.

  2. WORKING-STORAGE SECTION (קטע שטחי-אחסון לעבודה) . מקצה זיכרון במחשב לשדות שאינם חלק מהקלט או הפלט, אך בכל זאת דרושים לעבודת התכנית. כחלק מהגדרה זו נמצאים קבועים, שטחי עבודה, שטחי החזקה זמבית של נתונים (HOLD AREAS) וכוי.

  3. REPORT SECTION (קטע דיווח) - מתאר את העיצוב           (FORMAT) של דוחות, המיוצרים ע''י 'כותב הדוחות' של ה-COBOL. השימוש בסעיף זה מיועד.

 

למטרות עיבוד מיוחדות, ובמירב תכניות ה- COBOL הוא לא יופיע. יחידת לירוד זו אינה מטפלת בחטיבה זו של ה- COBOL - כותב הדוחות. הקטעים, הנכללים בחטיבת הנתונים של תכנית, חייבים להופיע בסדר לעיל. פרק זה ידון בקטע הקבצים , שהוא הקטע הראשון בחטיבת הנתונים. קטע שטחי-העיבוד, המופיע לאחר קטע הקבצים , יידון בסוף ,פרק זה. ברב תכניות ה- COBOL יופיעו קטעים אלה. כל משפטSELECT, המופיע בחטיבת הסביבה, מציין שם קובץ. על כן, יהיה עלינו לתאר בקטע הקבצים של חטיבת הנתונים קובץ אחד עבור כל משפטSELECT.

כפי שהוזכר, מתאר קטע הקבצים את שטחי הקלט והפלט בהם משתמשת התכנית. שטח קלט (INPUT-AREA) הנו שטח'אחסהן, השמור לקובץ קלט. הוראת READ בחטיבת הביצוע תעביר נתונים לשטח קלט זה. באופן דומה, שטח-פלט  (OUTPUT-AREA) הינו שטח אחסון, השמור לקובץ פלט. כאשר מתבצעת הוראת WRITE, יועברו כל הנתונים המאוחסנים בשטח זה אל יחידת הפלט שצויינה. שמות הקבצים והיחידות החיצוניות הוגדרו (בפקודת ASSIGN) במסגרת חטיבת הסביבה במשפט SELECT שטחי העבודה לקובצי קלט ופלט מוגדרים במסגרת קטע הקבצים (FILE SECTION) אשר בחטיבת הנתונים        (DATA DIVISION).

תיאור קובץ

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

.DATA DIVISION

.FILE SECTION

.FD FILE-1

...

.FD FILE-2

...

 

אחרי מילת המפתח FD - יופיע תמיד שם הקובץ, ולאחריו יופיעו מספר משפטים, בהם נדון בהמשך. מאחר שבדוגמה שלפנינו שלושה משפטיSELECT, חייבים להופיע שלושה קטעי FD בקטע הקבצים. הפריטיםDATA DIVISION וה-FILE SECTION מקודדים במרווח A . גם FD יקודד במרווח A . אולם שם הקובץ יקודד במרווח B . אחרי שם הקובץ לא תופיע נקודה. המשפט FD OUT-FILE , לדוגמה, מודיע למהדיר, כי אנו עומדים לתאר את הקובץ OUT-FILE . אנו משתמשים במספר הוראות, כדי לתאר קובץ. הוראות אלה יופיעו לאחר המשפט: (שם הקובץ) FD . אין לכתוב נקודה, אלא בסוף כל חלקי ההוראה.

 

 כללים לכתיבת שמות תיאורי הרשומה

  1. יש לרשום את FD במרוווז A.

  2. שאר הרישומים ירשמו במרווח B .

  3. אין לרשום נקודה עד למשפט האחרון.

  4. מותר לרשום פסיק בין משפט אחד לשני.

  5. אם נרשם פסיק הוא חייב להיות לפני מרווח אחד לפחות.

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

 


תוקן על ידי אנוני_מוס ב- 27/07/2011 15:35:17




דדווח על תוכן פוגעני

סמל אישי
מנותק
נשלח ב-27/7/2011 15:36 לינק ישיר 

ב. משפט תוויות הרשומה (LABEL RECORDS)

 

 משפט תוויות הרשומה (LABEL RECORDS)

    LABEL  RECORDS  ARE {OMITTED           {STANDARD                                                  

 

לא ניתן לקרוא נתונים על תקליט מגנטי או על סרט מגנטי, כפי שקוראים מספר על ידי התבוננות באותיות כתובות. הנתונים מאוחסנים כסיביות      (BITS) מגנטיות, שלא ניתן לראותן בעין חפשית. בדרך כלל, אנו יוצרים תוויות רשומה כרשומות הראשונה והאחרונה על קובץ תקליט מגנטי, או קובץ סרט מגנטי. רשומות אלה מכילות מידע מזהה על הקובץ. הואיל והנתובים על סרט או על תקליט אינם נראים לעין, ישמשו רשומות אלה לביקורת, האם נמצא הקובץ אותו אנחנו מחפשים על הסרט או התקליט, אם לאו. אנו יוצרים תוויות רשומה על קובצי פלט, כדי שנוכל לבדוק אותן בעתיד, כאשר אנו משתמשים באותו הקובץ כקלט. במילים אחרות, אנו יוצרים תוויות רשומה על קובצי פלט, ובודקים אותן, כאשר משתמשים בהם כקובצי קלט. מהדיר ה-COBOL מספק את השגרה לכתיבת תוויות רשומה על קובצי פלט, או לקריאתן מקובצי קלט, אם הוכנסה בקטע תיאור הקובץ (FD) ההוראה הבאה:

.LABEL  RECORDS  ARE  STANDARD


 למשפט זה שתי משמעויות

  1. הרשומה הראשונה בקובץ אינה רשומת נתונים, אלא תווית רשומה התחלתית תקנית , בת 80 תווים. באופן דומה, הרשומה האחרונה הינה תווית רשומה סופית .

  2. בקובצי קלט - על המחשב לבדוק תוויות אלה, ובקובצי פלט ' על המחשב לייצרן.

 

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

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

.LABEL  RECORDS  ARE  OMITTED

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

המשפט, המטפל בתוויות הרשומה, הוא הכרחי בכל תיאור קובץ (FD). ככלל, יש לציין כותרות 'STANDARD' עבור קובצי סרט מגנטי או תקליט. המשפט

LABEL  RECORDS  ARE  OMITTED

חייב להופיע במקדה של שימוש בקובצי רשומות יחידה.

 דוגמה 1

עבור קובצי הדפסה יש לכתוב את הקטע הבא:

FD  FILE-NAME-1

LABEL  RECORDS  ARE  OMITTED

 

 דוגמה 2

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

FD  FILE-NAME-2

LABEL  RECORDS  ARE  STANDARD




ג. משפט (RECORD CONTAINS)

 

משפט RECORD CONTAINS                                            (משפט זה הוא משפט רשות, לא חובה)

    CHARACTERS (קבוע מספרי) RECORD CONTAINS

משפטי  RECORD CONTAINS (הרשומה מכילה) מצביעים על אורכה של כל רשומה. קובץ הדפסה, למשל, יכול להכיל את ההצהרה הבאה:

 RECORD CONTAINS (133) CHARACTERS

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

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

ד. משפט הגוש מכיל (RECORD CONTAINS)

 

משפט BLOCK CONTAINS (הגוש מכיל)                               (משפט זה הוא משפט רשות, לא חובה)

     RECORDS (קבוע מספרי)BLOCK CONTAINS

 

משפט זה יופיע רק עבור תיאור קובץ סרט או תקליט מגנטי. קובצי סרט או תקליט מגנטי מחולקים לעתים קרובות לגושי רשומות, לצוהך ייעול הפעולות בהם. כל גוש (BLOCK) יכול להכיל מספר מסויים של רשומות, כדי לאפשר ניצול מרבי של שטח האחסון על הסרט או התקליט המגנטי. שים לב, כי המתכנת אינו מחליט, בדרך כלל, על גודל הגוש המיטבי, או גודם החלוקה לגושים (BLOCKING FACTOR), אלא מקבל נתון זה ממנתח המערכות. ציון המשפט    BLOCK CONTAINS לגבי קובצי סרט או תקליט מגנטי מאפשר למחשב לקרוא את גוש הרשומות המתאים.

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

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



תוקן על ידי אנוני_מוס ב- 27/07/2011 15:36:42




דדווח על תוכן פוגעני

סמל אישי
מנותק
נשלח ב-27/7/2011 15:37 לינק ישיר 

 ה. משפט (DATA RECORD(S

 

משפט (DATA RECORD(S                                                 (משפט זה הוא משפט רשות ,לא חובה)

    (שמות רשומות) שם רשומה [DATA RECORD(S) [IS ,ARE

 

המשפט (DATA RECORD(S (רשומת הנתונים) מגדיר רשומה אחת או יותר, המופיעות בקובץ. אם בקובץ מופיעה רשומה מסוג אחד בלבד, יש להשתמש במבנה  DATA RECORD IS על השם להיות כתוב לפי הכללים למתן שמות, תוך ציון שם הרשומה, והוא צריך להיות ייחודי. שם, המופיע כשם קובץ או שם רשומה בתכנית - אסור לו להופיע בשום תפקיד אחר. אם קיימות בקובץ מספר רשומות שונות, יש להשתמש במבנה

(..., רשומה-2, רשומה1- )  DATA RECORDS ARE  

משפט (DATA RECORD(S הוא פריט רשות בקטע תיאור הקובץ        (FD), ולאחריו תופיע נקודה, שכן הוא המשפט האחרון בקטע FD, שנדון בו. שים לב, שלא מופיעה כל נקודה נוספת בקטע FD.

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

משפט

פריט המשפט

דווח

חובה/רשות

שימוש

LABEL RECORD ARE

{ OMITTED   

STANDARD}

 חובה

 מזהה האם קיימות תויות הרשומה בדיסק 

RECORD CONTAINS

 CHARACTERS(קבוע מספרי)

 רשות

 מציין את כמות התווים ברשומה

 BLOCK CONTAINS

RECORDS(קבוע מספרי)

רשות

מציין את כמות הרשומות בגוש

DATA (RECORD(S

(שם רשומה)IS(שמות רשומות)ARE

רשות

מציין את שם/שמות הרשומה/רשומות הקיימות בקובץ



ו. משפטי PICTURE (תמונה)

 

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

 

 משפט PICTURE

  1.  מתאר את סוג הנתונים, המאוחסנים בפריט בסיסי.

  2. מתאר את גודל השדה.

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

 

 סוגי שדות – נתונים

  1.  אלפביתי. שדה, המורכב מאותיות או רווהים מסווג כאלפביתי.שדה-שם או כותרת ייחשב בדרך כלל לשדה אלפביתי.

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

  3. נומרי, או ספרתי. שדה, המכיל ספרות וסימן (חיובי (+) או שלילי (-)) בלבד, יסווג כשדה נומרי.

 תווים מציינים במשפטי PICTURE

 A - מציין אלפביתי.

X - מצין אלפאנומרי.

9 - מציין נומרי (ספרתי).

 

 שדה יהיה בעל PICTURE שכולו A-ים, למשל, אם הוא אלפביתי. אנו מציינים את גודל השדה על ידי מספד התווים (A,X, או 9), בהם אנו משתמשים ב- PICTURE. הבט, למשל, בדוגמה הבאה:

02  AMT  PICTURE  IS  99999.

המשפט:

02  ITEM1  PICTURE  IS  AAAA.

הסתכל במשפטים הבאים:

 01  REC-1.

   02  ITEM1  PICTURE  AAAA

   02  AMT     PICTURE  99999

   02  CDE     PICTURE  XX

תיאורו של שדה מספרי חייב להיות מורכב מרצף של תשיעיות בלבד. תיאור שדה אלפביתי יהיה מורכב מהאותיות A , ואילו תיאור השדה, היכול להכיל אותיות, מספרים או כל צירוף שלהם, יהיה מורכב מרצף של סימני X. שדות מספריים יכולים להכיל עד 18 ספרות. אם כן, משפט ה-PICTURE, המכיל את הספרה 9 עשרים פעמים, למשל, הינו בלתי חוקי. הסימון הבא להגדרת שדה אלפביתי בן 10 תווים . הינו חוקי:

04  NAME  PICTURE  A(10).

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

04 NAME PIC  A(10).

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

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

PIC A (25)

PIC X( 15 )

מספר התווים במשפט ה -PICTURE בקטע תיאור-הרשומה חייבים להסתכם במספר התווים באותה רשומה.

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

ז. השימוש בתווי מילוי FILLERS

 

נבחן את התכנון הבא של הרשומה

 

טורים 1-25     EMPLOYEE-NAME (שם  העובד) ,

טורים 26-30   אינם בשימוש

טורים 31-35 HOURS-WORKED (שעות העבודה)

טורים 36-80 אינם בשימוש

 

טורים 26-30 ו-36-80 איבם מכילים כל נתון משמעותי. עם זאת, יש לציין אותם כשדות בתיאור הרשומה. לו היינו אומרים (בצורה בלתי נכונה):

 

01 TIME-CARD.

02 EMPLOYEE-NAME  PIC A(25).

02 HOURS-WORKED  PIC 9(5).

 

 היה הדבר גורם לשתי שגיאות עיקריות:

  1. המחשב היה מניח, כי השדה כ - HOURS-WORKED בא מיד לאחרי השדה EMPLOYEE-NAME, הואיל והוא השדה, המופיע מיד לאחריו. פקודת READ, במקרה כזה, היתה ממקמת את טורים 30-26 באזוו האחסון, הנקרא                HOURS-WORKED.

  2. משפט ה-PICTURE צריך להסתכם ב-80 תווים, יולא ב-30, כמו כאן. כאן הגדרנו 30 תווים בלבד.

 

כדי לציין שדה, שאין בו נתון בעל משמעות, ניתן ב-COBOL להשתמש במלה השמורה FILLER, במקום ליצור שם משתנה מיוחד. שדה -FILLER, בעל משפט PICTURE מתאים, מציין שטח ברשומה, אשר איננו משתמשים בו כרגע. לא ניתן לגשת אל שדה FILLER, המציין שדה שאין משתמשים בו, בחטיבת הביצוע. המשפט .

MOVE  FILLER TO OUT-AREA, למשל, הוא בלתי חוקי. אם כן, קטע תיאור הרשומה מקודד, בדרך כלל, כך:

 

01 TIME-CARD.

02 EMPLOYEE-NAME  PIC A(25).

02 FILLER PIC X(5).

02 HOURS-WORKED  PIC 9(5).

02 FILLER PIC X(45).

 

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

ככלל, אנו מציינים שדה כמספרי (נומרי) באמצעות PICTURE 9, כאשר יש לבצע בו פעולות חשבוניות. כאשר אנו מציינים שדה בצורה זו, מותר לנתונים בשדה להיות מורכבים מספרות וסימן היובי או שלילי בלבד. רווח, למשל, אינו תו חוקי בשדה מספרי. שדה, המוגדר כמספרי, יכיל, אם כן, רק תווים מספריים חוקיים וסימן חיובי או שלילי. יצויין, כי שדה אלפאנומרי יכול להכיל כל נתון שהוא, כולל מספרים. כך  123 בשדה בשם FLDA, המתואר ע"י PICTURE XXX, הינו תוכן חוקי בהחלט. עם זאת, לא ניתן להשתמש ב-FLDA, על פי הגדרה זו, בפעולות חשבונ'ות. בפעולות חשבוניות ניתן להשתמש רק בשדות בעלי תצורה מספר'ת.

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

ח. נקודה עשרונית מוגדרת

 

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

נניח, כי שדה, המציין סכום כסף, והמכיל את הספרות 10000 , צריך להתפרש כ 100.00 . כלומר, על המחשב 'להניח', כי קיימת נקודה עשרונית. הנתון הינו בן 5 תווים, ואין נקודה עשרונית בתוך השדה; אך כוונתנו היא לשלוש ספרות של שלמים ושתי ספרות עשרוניות (המספד מאה). משפט PICTURE  המתאים יהיה, אם כן:

02  AMT   PIC 999V99

אם כן, השלמנו את משפטי תיאור הרשומה, הדרושים לתכניות COBOL בסיסיות. לכל קובץ, המצויין במשפט DATA RECORDS , יש לשייך רמה 01, ולתאר את הרמות הכפופות לו. יש לתאר את כל הרשומות בקובץ (בקטע FD) מסויים, לפני שעוברים לתיאור הקובץ (ה-FD) הבא.



ט.קטע האחסון לעבודה (WORKING-STORAGE SECTION)

 

זכור, כי בחטיבת הנתונים שני קטעים עיקריים: FILE SECTION - קטע הקבצים, ו-WORKING-STORAGE SECTION - קטע האחסון לעבודה. הסבר זה הינו היכרות ראשונית עם קטע האחסון לעבודה. הסבר רחב יותר מופיע בפרק 8.

כל שדה הדרוש לעיבוד, שאינו חלק מהקלט או מהפלט, ניתן להגדרה בקטע שטחי האחסון לעבודה..למשל, אם יש לתת לשדה ערך התחלתי 0, ולהגדיל את ערכו ב-1 רק כאשר תיקרא הרשומה האחרונה, ניתן להגדיר שדה זה  ב-WORKING-STORAGE SECTION . גם שטחים, הדרושים לאחסון תוצאות ביניים של עיבוד הנתונים, יוגדרו בקטע זה.

 כללים לשימיש בקטע שטחי האחסון לעבודה

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

  2. יש לקודד WORKING-STORAGE SECTION בשורה נפרדת, במרוח א,ולסיים בנקודה.

  3. הגדרה ראשונית של פריט מקובץ, אשר יתחלק לשטחי-אחסון נוספים. לדוגמה:

    .WORKING-STORAGE  SECTION

    .s 01 STORED-AREA

     
  4. הגדרת כל השדות הדרושים בתוך הגדרת 01 לעיל:

    .WORKING-STORAGE  SECTION

    .s 01 STORED-AREA

    .s 02 END-OF-FILE-SWITCH

    .s 02 GROSS-AMT

     
  5. יש לתת שמות לפריטים המקובצים והבסיסיים, לפי כללי מתן-שמות.

  6.  
  7. לכל פריט בסיסי בלתי תלוי - יש לכתוב משפט PICTURE :

    .WORKING-STORAGE  SECTION

    .s 01 STORED-AREA

    .s 02 END-OF-FILE-SWITCH    PIC 9

    .s 02 GROSS-AMT      PIC 999V99

     
  8. כל פריט בסיסי בלתי'תלוי יכול לקבל ערך התחלתי, אם דרוש כזה:

    .WORKING-STORAGE  SECTION

    .s 01 STORED-AREA

    .s 02 EOF-SWITCH PIC 9 VALUE ZERO

    .s 02 GROSS-AMT PIC 999V99 VALUE ZERO

 

אם אנו רוצים להשתמש בשדה EOF-SWITCH, לסמן מתי בוצעה קריאת הרשומה האחרונה, אנו יכולים להשתמש בו בחטיבת הביצוע כך:

.READ  FILE  AT  END  MOVE 1 TO  EOF-SWITCH

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



תוקן על ידי אנוני_מוס ב- 27/07/2011 15:37:46




דדווח על תוכן פוגעני

סמל אישי
מנותק
נשלח ב-27/7/2011 15:41 לינק ישיר 
פרק 6 - חטיבת הביצוע (PROCEDURE DIVISION)

מבוא

 

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

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

  1. לגשת לקובצי קלט ופלט.

  2. לקרוא ולכתוב מידע.

  3. לבצע פעולות הצבה והעברה פשוטות.

  4. לבצע פעולות שיום תכנית מסוימות                                       (END OF JOB OPERATIONS).

 

ידיעת סוגי הוראות אלה - תספיק כדי לכתוב תכנית בסיסית שלמה ב-COBOL. חטיבת הביצוע, כפי שתופיע בספר זה, תדגיש את הגישה המבנית לכתיבת תכניות COBOL. חטיבת הביצוע מתהלקת לסעיפים     (paragraphs). כל סעיף מגדיר שגרה (routine) עצמאית, או סדרח שגרות, שתוכנתו לבצע פעולה מסויימת. כל סעיף מתחלק בתוכולמשפטים או הוראות . כל הוראה, פרט להוראות הנודקות מצבים, מתחילה בפועל, או פעולה  VERB OPERATION. דוגמא להוראותREAD ,MOVE ,WRITE. ככלל, תסתיים הוראה בנקודה, שלאחריה רווח אחד לפחות. ניתן לכתוב מספר הוראות באותה שורה של טופס הקידוד, אך אין לשבור מילים באמצע, כאשר מגיעים לסוף השורה. כל ההוראות מתבצעות לפי סדר כתיבתן, אלא אם כן מעבירה הוראת -PERFORM את הביצוע לחלק אחר של התכנית.

 

 דוגמא

.MOVE NAME TO NAME-OUT

.MOVE AMT TO AMT-OUT

.WRITE DATA-REC

 

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

א. הוראת OPEN

 

לפני שניתן לקרוא או לכתוב קובץ קלט או פלט, יש לפתוח (OPEN) את הקובץ. הוראת OPEN מורה למחשב לגשת (ACCESS) אל הקובץ.

 

 תבנית הוראת OPEN בשפת COBOL

.[(OPEN [INPUT (file name)] , [OUTPUT (file name

 

אם כך, העיצוב המופיע לעיל מציין כי:

 
     
  1. OPEN ו-OUTPUT הינן מילות - COBOL שמורות, דרושות בהוראה זו. זאת הואיל והן מופיעות באותיות גדולות, כשתחתן קו.

  2. כל שמות קובצי הקלט והפלט (file names)ניתנים בידי המתכנת.

 

יש להגדיר שם קובץ ולשייך אליו מכשיר קלט/פלט עבור כל הוראתSELECT בחטיבת סביבה.

 

 דוגמא

.SELECT FILE-1 ASSIGN TO SYSRDR

.SELECT FILE-2 ASSIGN TO SYS008

 

שם הקובץ FILE-1 מופנה ליחידת הקלט/פלט שלו ע"י הצהרתSELECT. לכל שם קובץ, שאנו מציינים, יש לכתוב קטע תיאור-קובץ      (FD) בחטיבת הנתונים. מכאן, שיש לכתוב FD עבור FILE-1 וכן עבורFILE-2.

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

OPEN INPUT FILE-1,OUTPUT FILE-2.                              

הוראת - OPEN מאפיינת כל קובץ כקובץ קלט או פלט; היא גם מבצעת בפועל את הגישה אל המכשיר המתאים. לדוגמה, אם הקובץ IN-FILEהוא קובץ קלט בתכנית, תתבצע גישה אל כונן-הסרט המתאים, וזאת בזמן ביצוע הוראת OPEN, כדי לבדוק אם הוא במצב, המאפשר קריאת נתונים. אם לג, יעוכב הביצוע עד אשר המפעיל יביא את המכשיר למצב המתאים. בנוסף להבדלה בין קובצי פלט וקובצי קלט וגישה למכשירים המתאימים, מבצעת הוראת-OPEN מספר פעולות בדיקה. אם, לדוגמה, מצויינות תויות רשומה על קובץ סרט כתקניות, תתבצע בדיקה של תווית וו, כדי לוודא שמדובר בסרט הנכון. אם נציין את תוויות רשומה             כ-"STANDARD" בקובץ פלט, תיצור הוראת OPEN תווית רשומה מתאימה. עם זאת, יש להכניס את המידע עבור התווית ברשומת הבקרה.

לסיכום, הוראת OPEN מבצעת שתי פעולות בסיסיות:

  פעולות הוראת OPEN

     
  1. מאפיינת אילו מן הקבצים ישמשו כקובצי קלט, ואילו - כקובצי פלט.

  2. מאפשרת גישה אל הקבצים לצורך עיבוד.

 

לעתים קרובות, כותבים תכניות, המשתמשות במספר קובצי קלט או פלט. תכנית עדכון (UPDATE), למשל, עשויה למזג (MERGE) שני קובצי קלט בשם 1-FILE ו-2-FILE לקובץ אחד יחיד בשם 3-FILE, וכן להדפיס רשימת שגיאות בשם PRINT-FILE.

הוראת - OPEN של תכנית כזו תיראה כך:

OPEN INPUT FILE-1,FILE-2, OUTPUT FILE-3, PRINT-FILE.

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

OPEN INPUT FILE-1.           

OPEN INPUT FILE-2.           

OPEN OUTPUT FILE-3.       

OPEN OUTPUT PRINT-FILE.

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

ב. הוראת READ

 

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

 

 מבנה הוראת READ

.(הוראות) AT END  (שם-קובץ) READ 

 

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

 
     
  1. בהצהרת SELECT, המצביעה על שם הקובץ ויחידת הקלט/פלט, אליה שייך קובץ זה. אם, לדוגמה, מכשיר הקלט הוא קורא דיסקטים, תעביר הוראת-READ נתונים מרשומת קלט אשר על הדיסקט אל שטח נתוני הקלט אשר בזיכרון המחשב.

  2. קטע FD , המתאר את הקובץ.

  3. הוראת OPEN, המאפשרת גישה לקובץ.

 

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

OPEN, גם הוראה זו מבצעת מספר בדיקות. היא בודקת את אורכה של כל רשומת קלט, כדי להבטיח שהוא מתאים לאורך שצויין בחטיבת הנתונים. אם קיים חוסר התאמה - ייחשב הדבר כשגיאה בעלת האיפיון "אורך רשומה בלתי מתאים", וביצוע התכנית יופסק. הוראת READתשתמש גם בהצהרה CONTAINS BLOCK, אם צויינה, כדי לבדוק את התאמת החלוקה לגושים.  על אף העובדה, שמטרתה העיקרית של הוראת  READ הינה להעביר נתונים, הרי פעולות בדיקה אלה הינן חיוניות לביצוע התכנית.

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

MOVE 1 TO EOF AT END (שם-קובץ) READ   

 

 דוגמא

.READ FILE-1 AT END MOVE 1 TO EOF

בכל המחשבים קיים בקובץ סימון לגבי סוף הקובץ. סימון זה הוא שגורם לביצוע התנאי AT END .  יש לציין תנאי AT END בכל הוראת READ. כלומר, יש לציין למחשב, מה צריך לעשות כאשר נגמרים הנתונים. יש מקרים, בהם ניתן להשמיט את הוראת AT END , מקרים אלה הינם  מקרים מיוחדים, והם דנים בקבצים המאוחסנים בתקליטים מגנטיים       (DISK).

נתבונן בקטע הבא מחטיבת הנתונים:

FD   FILE-1                                                       

LABEL RECORDS ARE OMITTED,        

RECORD CONTAINS 20 CHARACTERS,

BLOCK CONTAINS 10 RECORDS,        

DATA RECORD IS REC.                         

01 REC.                                                           

02    NAME    PIC X(15).                           

02    AMT-OF-TRANS    PIC 9(5).             

נניח כי מתבצעת ההוראה: 

READ FILE-1 AT END MOVE 1 TO EOF.

15 התווים הראשונים של הנתונים מהסרט יושמו באחסון השדה, הנקראNAME.

5 התווים הבאים ימוקמו בשדה, הנקרא TRANS-OF-AMT. הסדר בו מצויינות ההצהרות ב- DIVISION DATA הוא בעל השיבות רבה . הנתונים מוכנסים אל השדות לפי הסדר, בו מופיעים שמותיהם. פקודתREAD תבצע גם פעולות בדיקה. אורך הגוש על הסרט ייבדק, אם הוא מכיל 200 תווים, או 10 רשומות, ברגע בו תתבצע קריאה של גוש. כל אי התאמה תגרום לשגיאת קלט/פלט מהסוג "אורך רשומה בלתי מתאים", אשר תגרום הפסקת הביצוע.

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

ג. הוראת PERFORM ... UNTIL

 

 עיצוב ההוראה

.(תנאי) UNTIL (שם-קטע) PERFORM

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

 דוגמא

.PERFORM CALC-RTN UNTIL EOF = 1

להזכירך: EOF הוא משתנה מיוחד בסעיף האחסון- לעבודה, המכיל אפס כערך התחלתי, ויכיל אחד רק כאשר יתקיים תנאי AT END. אם כן, הוראת PERFORM מורה למעשה, כי יש לבצע את כל ההוראות בקטעCALC-RTN, עד אשר אין יותר רשומות קלט לעיבוד. אז תחזור הבקרה להוראה שאחרי הוראת PERFORM.

סדר הצעדים מופיע כלהלן:

OPEN                                                       

READ                                                      

PERFORM                                              

CLOSE                                                    

STOP                                                        

CALC-RTN.                                                           

{תהליך הביצוע }

.READ FILE-1 AT END MOVE 1 TO EOF

הטווח (RANGE) של הוראת PERFORM כולל את כל ההוראות בקטע שצויין, עד אשר מופיע שם הקטע הבא, או עד שאין הוראות נוספות. בהוראת PERFORM...UNTIL מעורבת בדיקת-תנאי על ידי המחשב. כלומר, חייב להתקיים תנאי מסויים, כדי שהבקרה תחוור לביצוע בהוראה שלאחר PERFORM. הנקודה, בה נערכת הבדיקה, היא בעלת משמעות היונית. חשוב לציין, כי הבדיקה מתבצעת מיד בתחילת הביצוע, ולאהר מכן - שוב ושוב, בכל פעם שבה התבצע הסעיף שצוייך בשלמות.

תרשים התהליך הבא מסביר את אופי ביצוע הפעולה:

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

OPEN                     

PERFORM             

...

CALC-RTN.            

READ          

{processing}  

בדוגמה הקודמת, נקראה רשומת נתונים ביחידה הראשית, ואז הועברה הבקרה ליחידה CALC-RTN – שם עובדה הרשומה הראשונה, ולאחריה נקראה הרשומה הבאה, וכן הלאה. בדוגמה זו - היהידה הראשית אינה מכילה הוראת-READ. במקום זאת, קוראת השגרה CALC-RTNרשומה ומעבדת אותה בכל פעם. הצעדים, שיתבצעו בתכנית זו, זהים בדיוק למה שהתבצע בדוגמה הקודמת, פרט לרשומה האחרונה. ראינו אז, כי כאשר נעשה ניסיון לקרוא רשומת נתונים נוספת (ורשומות כאלה אינן בנמצא) יתבצע התנאי - AT END. בנקודה זו, הואיל והוראתREAD היא ההוראה האחרונה, מתבצעת בדיקה אם 1 = EOF. כאשר שוויון זה נכון, חוזרת הבקרה ליחידה הראשית. מה קורה במקרה שלעיל, כאשר נעשה ניסיון לקרוא רשומה - ואין כזו? מתבצע התנאי AT END, ו-EOF מושווה ל-1  . אולם הבדיקה להחזרת הבקרה אינה מתבצעת, אלא אחרי שבוצע כל הקטע. משמעות הדבר היא המשך הביצוע, למרות שאין רשומה נוספת. לאחר הביצוע פעם נוספת, תחזור הבקרה ליחידה הראשית. תוצאת התכנית הזו הינה, בדרך כלל, ביצוע עיבוד הרשומה האחרונה פעמיים, בקיצור, כאשר משתמשים בתבנית ההוראה הבאה:

.1 = EOF UNTIL (שם סעיף) PERFORM

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

אם כן, לכל תכניותינו תהייה הצורה הבאה:

OPEN

READ

1  = EOF UNTIL (שם סעיף) PERFORM

...

(שם סעיף)

...

.READ ... AT END MOVE 1 TO EOF


ד. הוראת STOP RUN ו CLOSE

 

נמשיך ונשתמש בדוגמא, אשר הופיעה בפרק הקודם.

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

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

הוראת  CLOSE

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

(שם(ות) הקובץ(ים))CLOSE   

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

.OPEN INPUT FILE-1, OUTPUT FILE-2

אולם, כדי לשחרר אותם, אומרים:

.CLOSE FIEL-1, FILE-2

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

CLOSE FILE-1, FILE-2, FILE-3.

 ו

CLOSE FILE-1.

CLOSE FILE-2.

.CLOSE FILE-3


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

הוראת  STOP RUN

הוראת STOP RUN מורה למחשב לסיים את עבודתו.

OPEN INPUT FILE-1, OUTPUT FILE-2.

READ FILE-1 AT END MOVE 1 TO EOF.

PERFORM CALC-RTN UNTIL EOF=1.

CLOSE FILE-1,FILE-2.

.STOP RUN


ההוראות ב-CALC-RTN יכללו:

     
  1. הוראות העיבוד לרשומה.

  2. הוראת READ לקריאת הרשומה הבאה.

  3. תנאי AT END, המורה למחשב להציב 1 ב-EOF.

 

 דוגמא

CALC-RTN.

.READ FILE-1 AT END MOVE 1 TO EOF

אנו מניחים, כי ב-CALC-RTN ברצוננו לעבד נתונים בדרך כלשהי, וליצור רשומות-פלט.. עתה, כאשר אנו יודעים לפתוח (OPEN) קובץ ולקרוא (READ) ממנו, נצטרך לאחסן נתונים בשטח הפלט; כך שכאשר נכתוב פקודת - WRITE ייכתב מידע כל שהוא בקובץ הפלט.

ה. הוראת MOVE פשוטה

 

 מבנה הוראת MOVE הוא כלהלן

.(שם-נתון-2) TO (שם-נתון-1) MOVE

 

כל שדה בזיכרון יכול להיות מועבר לשדה אחר באמצעות הוראת MOVE

PROCEDURE       DIVISION.

OPEN INPUT FILE-1, OUTPUT FILE-2.

READ FILE-1 AT END MOVE 1 TO EOF.

PERFORM CALC-RTN UNTIL EOF=1.

CLOSE FILE-1,FILE-2.

STOP RUN.

CALC-RTN.

MOVE NAME-IN TO NAME-OUT.

MOVE AMT-OF-CREDIT-IN TO AMT-OF-CREDIT-OUT.

.MOVE AMT-OF-DEBIT-IN TO AMT-OF-DEBIT-OUT


בהנחה, שהצהרת ה- PICTUREשל שדה הפלט זהה לזו של שדה הקלט, הוראת MOVE מעתיקה את נתוני הקלט אל שטח הפלט. יצויין, שהשיטה, בה מציינים שם בסיסי זהה לשדות שונים, תוך שינוי קידומת או תוספת, נחשבת שיטת תכנות טובה. כלומר, ההבחנה בין AMT-OF-CREDIT-IN, כשדה קלט, לבין AMT-OF-CREDIT-OUT. כשדה המתאים בפלט, הינה ברורה. שים לב שוב, כי CALC-RTN הינה שגרה נפרדת. היא מתבצעת אך ורק תחת שליטתה של הוראת PERFORM; כדי להשלים את CALC-RTN, עלינו לכתוב (WRITE) את הרשומה שנצטברה בשטח הפלט, ואז לקרוא את הרשומה הבאה מקובץ הקלט.

ו. הוראת הכתיבה WRITE

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

 להוראת WRITE המבנה הבא

.(שם-רשומה) WRITE

שם הרשומה מופיע ברמה 01, והוא מחולק, בדרך כלל, לשדות. הרשומה מתארת את תבנית FORMAT הפלט. בכל הוראת WRITE - אנו מורים למחשב לכתוב את הנתונים לפי התבנית שצויינה.

FD  FILE-1  LABEL RECORDS ARE OMITTED,

RECORD CONTAINS 25 CHARACTERS,

DATA RECORD IS REC-1.

01  REC-1.

02 NAME-OUT  PIC X(15).

02 AMT-OF-DEBIT-OUT  PIC 9(5).

02 AMT-OF-CREDIT-OUT  PIC 9(5).

כדי לכתוב מידע המאוחסן בחטיבת הנתונים יש לכתוב WRITE  REC-1ולא WRITE FILE-1. כאשר אנו כותבים או יוצרים מידע, אנו משתמשים בשם המופיע ברמה 01, בעוד שכאשר אנו קוראים מקובץ, אנו משתמשים בשם המופיע ב-FD. הפקודה WRITE  REC-1 מעבירה נתונים אל יחידת הפלט, בהתאם לתבנית, שפורטה בתיאור הרשומהREC-1. אם קיימת יותר מתבנית אחת של רשומות בקובץ, יש לציין את זו, שבה אנו מעוניינים בהוראת WRITE. לדוגמא, עיין בקטע הבא:

FD  PRINT-FILE  LABEL RECORDS ARE OMITTED,

RECORD CONTAINS 133 CHARACTERS,

DATA RECORD ARE HDR, DETAIL-REC.

01  HDR.

01 DETAIL-REC.

לפי התבנית הרצויה לנו, יש לכתוב WRITE HDR                         או WRITE DETAIL-REC כעת אנו יכולים לקודד תכנית לדוגמא בשלמותה על פי הדוגמאות שהוצגו בעמודים הקודמים; כאשר אנוזוכרים, כי לאחר עיבוד רשומה שלמה ויצירת רשומת פלט, יש לקרוא רשומת קלט נוספת:

PROCEDURE DIVISION.

OPEN INPUT FILE-1, OUTPUT FILE-2.

READ FILE-1 AT END MOVE 1 TO EOF.

PERFORM CALC-RTN UNTIL EOF=1.

CLOSE FILE-1,FILE-2.

STOP RUN.

CALC-RTN.

MOVE  NAME-IN TO NAME-OUT.

MOVE AMT-OF-CREDIT-IN TO AMT-OF-CREDIT-OUT.

MOVE AMT-OF-DEBIT-IN TO AMT-OF-DEBIT-OUT.

WRITE REC-1

.READ  FILE-1 AT END MOVE 1 TO EOF

 

סיכום הפרטים המופיעים בחטיבת הביצוע

  1. שמות סעיפים PARAGRAPH  יופיעו במרווח A. 

  2. כל ההוראות יקודדו במרווח B, או בצורה חופשית כחלק מתוך סעיף, או בהוראה בודדתי אחת.

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

  4. ברב התכניות המבניות תופיע יחידה ראשית כלהלן:

    OPEN INPUT (file) OUTPUT (file).

    READ (file) AT END MOE 1 TO EOF.

    PERFORM (paragraph) UNTIL EOF=1.

    CLOSE (files).

    .STOP RUN

  5. הסעיף שצויין בהוראת PERFORM מתבצע שוב ושוב, עד אשר אין יותר רשומות קלט.

  6. ההוראה האחרונה בסעיף, שצויין ע"י הוראת PERFORM, הינה בדרך כלל הוראת READ:

    CALC-RTN.

    .READ (file) AT END MOVE 1 TO EOF

קיימת שיטה, בה ניתן להשתמש, לשם הכנסת שורות הערה בתכניתCOBOL.

הערות COBOL

כוכבית (*) בטור 7 (טור ההמשך) של שורה - הופכת את כל אותה שורה לשורת הערה.






תוקן על ידי אנוני_מוס ב- 27/07/2011 15:41:08




דדווח על תוכן פוגעני

סמל אישי
מנותק
נשלח ב-27/7/2011 15:59 לינק ישיר 
פרק 7 - הוראת MOVE.

א. הסבר בסיסי.

 

המבבה הבסיסי להוראת MOVE הוא:

 שדה מקבל

שדה שולח

פועל

FIELDB

TO

FIELDA

MOVE

המלה MOVE בהוראת שפת קובול שלעיל נקראת הפועל (verb). כל הוראה, המופיעה בחטיבת הביצוע, כמו כל משפט באנגלית, חייבת להכיל פועל.  המשתנה FIELDA נקרא השדה השולח. תוכנו של שדה זה יועתק לשדה אחר (FIELDB) כתוצאה מביצוע הוראת MOVE.המשתנה FIELDB נקרא השדה המקבל. תוכנו של FIELDB יוחלף, כתוצאה מביצוע הוראת MOVE, בתוכנו של שדה אחר (FILEDA).לפיכך, תוצאת הביצוע של הוראת MOVE הינה ברורה: המידע, או התוכן, המאוחסן בשדה השולח,FIELDA יועתק בשדה המקבלFIELDB. שים לב, כי הוראת MOVE, כמו הוראות ביצוע אחרות, מופיעה רק בחטיבת הביצוע. לעומת זאת, FIELDAFIELDB, הינם שמות-המשתנים, ויש להגדירם בחטיבת הנתונים. זכור לך בוודאי, כי שמות המשתנים בחטיבת הנתונים מוגדרים על ידי משפטי PICTURE, המציינים את סוג הנתון בשדה (מספרי, אלפביתי או אלפאנומרי) ואת גודלו. כדי שתתבצע הוראת MOVE, שתעביר את תוכנו המדוייק של משתנה אחד למשתנה אחר - חייבים שני המשתנים להיות מוגדרים על ידי משפטי PICTURE זהים.

 

 דוגמא 1

TAXA PIC 9(3) (שדה מספרי בעל שלוש ספרות)

תוכן השדה: 123

TAXB PIC 9(3)

תוכן השדה: 456

MOVE  TAXA  TO  TAXB

' = DISPLAY  'TAXA

DISPLAY  TAXA

' = DISPLAY  'TAXB

DISPLAY  TAXB

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

 

 דוגמא 2

FIELDA  PIC X(4) (שדה אלפאנומרי, בן 4 תווים)

תוכן השדה: ABCD

 FIELDB  PIC X(4) (שדה אלפאנומרי, בן 4 תווים)

תוכן השדה: EFGH

MOVE  FIELDA  TO FIELDB

' = DISPLAY  'FIELDA

DISPLAY  FIELDA

' = DISPLAY  'FIELDB

DISPLAY  FIELDB

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

ב. המבנים השונים של הוראות MOVE.

 

עד כה, עסקנו בצורה אחת של הוראת MOVE :

 תבנית 1

  .(שם משתנה-2) TO (שם משתנה-1 ) MOVE

במקרה זה, על שם-משתנה-1 ושם-משתנה-2 להיות מוגדרים בחטיבת-הנתונים של התכנית. כדי שתוכנו של שם-משתנה-1 יועתק לשם-משתנה-2 במדוייק, חייבת להיות הגדרת PICTURE זהה לשני השדות.

צורה שנייה של הוראת MOVE היא זו:

 תבנית 2

   .(שם משתנה) TO (קבוע) MOVE

כזכור, קיימים שני סוגי קבועים: קבועים מספריים, וקבועים שאינם מספריים:

 קבועים – תזכורת

  קבוע מספרי

     
  1. 1 עד 18 ספרות

  2. נקודה עשרונית (אינה חייבת להופיע)

  3. סימן + או - (אינו חייב להופיע) .

 

  קבוע שאינו מספרי (אלפאנומרי)

     
  1. 1 עד 120  תווים.

  2. ניתן להשתמש בכל סימני COBOL (פרט למרכאות).

  3. הנתון כולו מופיע בין מרכאות.

 

 דוגמא 1

MOVE  123  TO  DEPT.

' = DISPLAY  'DEPT

DISPLAY  DEPT

 

 דוגמא 2

MOVE  'CODE1'  TO  CLASSIFICATION.

' = DISPLAY  'CLASSIFICATION

DISPLAY  CLASSIFICATION

למרות העובדה, שחובה להגדיר שמות-נתונים בחטיבת הנתונים, אין חובה להגדיר קבועים בכל מקום אחר  בתכנית-COBOL. אם משפט ה-PICTURE, השייך לשדה המקבל, הוא כנדרש, הקבוע יועתק אל השדה  המקבל במדוייק. חשוב לזכור, כי השדה המקבל הוא תמיד שם של משתנה. בדוגמא 1, המספר 123 הוא קבוע מספרי. אנו  יודעים, כי הוא קבוע ולא משתנה, כי הוא מורכב כולו מספרות, בעוד משתנה חייב להכיל אות אחת לפחות.  כדי להציב קבוע מספרי בתוך שדה, על שדה זה להיות בעל מבנה זהה לזה של הקבוע - כלומר, במקרה זה,  עליו להיות שדה מספרי. כך, בדוגמא 1 , משתנה DEPT, משפט - ה-PICTURE של DEPT צריך להיות 999,  כלומר שדה ספרתי באורך 3 תווים.

בדוגמא 2 – 'CODE1' הוא קבוע שאינו מספרי. אנו יודעים, כי הוא אינו שם משתנה, הואיל והוא נתון בין  גרשיים. כדי להעביר נתון זה אל שדה כלשהו, חייב השדה להיות בעל מבנה זהה לזה של הקבוע האלפאנומרי.כך, בדוגמא 2, חייב השדה CLASSIFICATION להיות בעל משפטPICTURE, המורכב מאותיות - X. כדי  שיוצב בו בדיוק  , 'CODE1' עליו להיות בעל PICTURE מהצורה X(5), כלומר שדה אלפאנומרי בן 5 תווים.

אם למשתנה  ADDRESS-1 מתאים משפט PICTURE עם תיאור XXX, ההוראה .  MOVE  123  TO  ADDRESS-1 הינה בעלת מבנה שגוי. זאת משום שהקבוע 123 אינו בעל אותו סוג-נתונים  כמו השדה המקבל. אם ל-  ADDRESS-1 מתאים המשפט PICTURE XXX, הקבוע צריך להיות לא-מספרי.  ננסח, אם כן, את ההוראה כך:

                           MOVE  '123'  TO  ADDRESS-1.

צורה שלישית של הוראת-MOVE היא זו:

 תבנית 3

    .(שם-משתנה) TO (קבוע מיוחד) MOVE  

כזכור, קבוע מיוחד הינו מלה שמורה ב-COBOL, כמו SPACES אוZERO, המציינת קבוע מחרוזתי מיוחד,  כגון תו-אפס או תווי רווח.

 דוגמא 3

MOVE  ZEROS  TO  TOTAL.

' = DISPLAY  'TOTAL.

DISPLAY  TOTAL.

 

 דוגמא 4

MOVE  SPACES  TO  HDR .

' = DISPLAY  'HDR

DISPLAY  HDR

בדוגמא 3 - ZEROS הוא הקבוע המיוחד, שמשמעותו - כל השדה ימולא בספרות-אפס. מאחר שאפס יכול  לשמש כספרה או כסימן אלפאנומרי, יכול המשתנה TOTAL להיות מספרי (אם יש לו משפט PICTURE מתאים של ספרות - 9 ) או אלפאנומרי (PICTURE של אותיות- X). בכל מקרה, התוכן של TOTAL יוחלף  כולו באפסים. גודל השדה TOTALאינו חשוב. השדה יתמלא כולו באפסים, ללא קשר עם גודלו.

בדוגמא 4 - ZEROS מציין - כל השדה רווחים. מאחר שרווח איבו תו ספרתי, על משפט ה-PICUTRE של  HDR להיות אותיות- X המציינות שדה אלפאנומרי, או אותיות- A, המציינות שדה אלפביתי - גם כאן אין  חשיבות לגודלו של HDR. כל השדה ימולא בתווי-רווח.

אם כן, קיימות 3 תבניות (או מבנים) של הוראת- MOVE :

                                   (שם-משתנה-1)  

(שם-משתנה-2 )     TO                (קבוע)   MOVE

                                        (קבוע מיוחד)     

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

ג. הצבה מספרית

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

  הוראת MOVE מספרית ניתנת לביצוע בשני אופנים

  1. הצבת שדה מספרי, בעל משפט PICTURE של ספרות- 9, לשדה מספרי אחר.

  2. הצבת קבוע מספרי בשדה מספרי.

בהוראה:   (משתנה-2) TO (משתנה-1) MOVE לשני השדות משפטיPICTURE מספריים.  בהנחה ששני השדות הם בעלי אורך זהה, יוחלף תוכנו של משתנה-2 בתוכן של משתנה-1, מבלי שישתנה תוכן השדה השולה (משתנה-1).

 דוגמא 1

FIELDA  PICTURE  999

 תוכן: 123

FIELDB  PICTURE  999

תוכן:456

 ההוראה: . MOVE  FIELDA  TO FIELDB

' = DISPLAY  'FIELDA

DISPLAY  FIELDA

' = DISPLAY  'FIELDB

DISPLAY  FIELDB

 

 דוגמא 2

FIELDC  PICTURE  99V99.

(נקודה עשרונית אחרי שתי הספרות הראשונות)

תוכן: 12.34

FIELDD  PICTURE  99V99.

תוכן: 45.67

ההוראה:  . MOVE  FIELDC  TO  FIELDD  

' = DISPLAY  'FIELDC

DISPLAY  FIELDC

' = DISPLAY  'FIELDD

DISPLAY  FIELDD

לעתים קרובות יש להעביר בתכנית COBOL תוכנו של שדה מספרי אחד לשדה מספרי אחר, כאשר לשני השדות אין הגדרת PICTURE זהה. ייתכן, שנרצה להעביר שדה קטן אל גדול ממנו, כדי לבצע עליו פעולה חשבונית, או שנרצה להעביר תוצאה, המופיעה בשטח עבודה, בדיוק של 3 ספרות אחרי הנקודה (999V), אל שדה פלט בעל דיוק דרוש של 2 ספרות בלבד לאחר הנקודה (99V). בשני מקרים אלה, לא תיצור הוראתMOVE העתקה מדויקת של תוכן השדה השולח בשדה המקבל, וזאת עקב השוני בהגדרת השדות.

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

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

 דוגמא 3

FIELD1  PICTURE  999

תוכן: 123

FILED2  PICTURE  9(4)

תוכן: 4567

נתבונן. בהוראה: MOVE  FIELD1  TO FIELD2.  

' = DISPLAY  'FIELD1

DISPLAY  FIELD1

' = DISPLAY  'FIELD2

DISPLAY  FIELD2

 דוגמא 4

FIELD3  PICTURE  999

תוכן: 012

 FIELD4  PICTURE  999

תוכן:34

ההוראה: MOVE  FIELD3  TO FIELD4.

' = DISPLAY  'FIELD3

DISPLAY  FIELD3

' = DISPLAY  'FIELD4

DISPLAY  FIELD4

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

 דוגמא 5

TAKE-HOME-PAY  PICTURE  9(4)

תוכן:  1000

AMT-OF-CHECK  PICTURE  9(3)

ההוראה: MOVE  TAKE-HOME-PAY  TO  AMT-OF-CHECK.

' = DISPLAY  'TAKE-HOME-PAY

DISPLAY  TAKE-HOME-PAY

' = DISPLAY  'AMT-OF-CHECK

DISPLAY  AMT-OF-CHECK

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

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

 דוגמא 6

FLDA  PIC  99V99

תוכן:12.34

FLDB  PIC  99V999

תוכן: 56.789

ההוראה: MOVE  FLDA  TO FLDB.  

' = DISPLAY  'FLDA

DISPLAY  FLDA

' = DISPLAY  'FLDB

DISPLAY  FLDB

 דוגמא 7

FLDC  PIC  V99

תוכן:  0.12

FLDD  PIC  V9

תוכן: 0.3

ההוראה: . MOVE  FLDC  TO  FLDD  

' = DISPLAY  'FLDC

DISPLAY  FLDC

' = DISPLAY  'FLDD

DISPLAY  FLDD

 דוגמא 8

FLDE  PIC  9(3)V9

תוכן: 23.41

 FLDF  PIC  99

תוכן: 00

ההוראה: MOVE  FLDE  TO FLDF.  

' = DISPLAY  'FLDE

DISPLAY  FLDE

' = DISPLAY  'FLDF

DISPLAY  FLDF 

הצורה השנייה של הוראת MOVE - מספרית היא:

 (משתנה) TO   (קבוע) MOVE

הקבוע והמשתנה - שניהם מספרים. שני הכללים שפורטו לעיל תקפים גם בסוג זה של הוראת-MOVE .

 דוגמא 9

FLD1  PIC  9(4)

ההוראה:  MOVE  123  TO  FLD1  

' = DISPLAY  'FLD1

DISPLAY  FLD1

 דוגמא 10

FLD2  PIC  99

ההוראה: MOVE  123  TO  FLD2.  

' = DISPLAY  'FLD2

DISPLAY  FLD2

 דוגמא 11

FLD3  PIC  99V999

 ההוראה:   MOVE  12.34  TO  FLD3.  

' = DISPLAY  'FLD3

DISPLAY  FLD3



ד. הצבה אלפאנומרית.

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

 הצבה אלפאנומרית פירושה:

  הצבה (MOVE) אלפאנומרית                            

  קבוע מספרי

     
  1.  העברה של שדה אלפאנומרי (שדה המכיל ספרות, רווחים ואותיות), המוגדר במשפט PICTURE באותיות X, לשדה אלפאנומרי אחר.

  2. העברה של קבוע אלפאנומרי לשדה אלפאנומרי.

  3. העברה של קבוע מספרי לשדה אלפאנומרי.

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

דוגמא 1

FLDA  PIC X(3)

תוכן: ABC

FLDB  PIC X(5)

תוכן: DEFGH

ההוראה: .MOVE  FLDA  TO  FLDB

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

א) האות A, שב-FLDA  מחליפה את האות D ב-FLDB .

ב) האות ,B שב-FLDA  מחליפה את האות E ב-FLDB.

ג) האות C, שב- FLDA מחליפה את האות F ב-FLDB.

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

ד) האות G ב-FLDB מוחלפת ברווח.

ה) האות H ב-FLDB מוחלפת ברווח.

 ב-FLDB מתקבלת התוצאה 'ABC  ' . כבמקרה הקודם, גם כאן לא נשמר שום חלק בשדה המקבל המקורי.

תוצאות זהות לנ"ל היינו מקבלים, לו נתבצעה,ההוראה .MOVE 'ABC'  TO  FLDB. החלפנו משתנה בקבוע שאינו מספרי, בעל תוכן זהה, והתוצאה זהה אף היא.

 

דוגמא 2

CDE  PICTURE  X(4)

 תוכן: NAME.

OUT-AREA  PICTURE  XXX

תוכן: תווי רווח

ההוראה: MOVE  CDE  TO  OUT-AREA.  

במקרה זה:

א) האות N שב- CDE מחליפה את תו-הרווח השמאלי ב-OUT-AREA

ב) האות  Aשב- CDE מחליפה את תו-הרווח ,האמצעי ב-OUT-AREA

ג) האות M שב-CDE מחליפה את תו'הרווח הימבי ב-OUT-AREA

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

 

דוגמא 3

FLDA  PIC  999

תוכן: 321

FLDB  PIC  XXXX

תוכן: DCBA  

הוראה: MOVE  FLDA  TO  FLDB   

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

א) הספרה 3 ב-  FLDAמחליפה את האות D ב-FLDB .

ב) הספרה 2 ב-  FLDAמחליפה את האות C ב-FLDB .

ג) הספרה 1 ב-  FLDAמחליפה את האות B ב-FLDB .

ד) תו רווח מחליף את האות A ב-  FLDB .

הבחנת בוודאי, כי הוראות MOVE אלפאנומריות מבצעות העברות נתונים משדה מספרי לשדה אלפאנומרי; אולם העברה הפוכה, של שדה אלפאנומרי לשדה מספרי, לא הוזכרה.

נניח כי נתון שדה FLDC, שמשפט ה- PICTURE שלו הוא באותיות - X, המכיל נתונים מספריים. האם אפשר להעביר את תוכנו אל תוך שדה מספרי? בדומה לכך, האם אפשר לבצע MOVE  '123'  TO  FLDD, אםFLDD מוגדר ע"י משפט PICTURE עם ספרות- 9?

במילים פשוטות, האם מותר להעביר שדות או קבועים אלפאנומריים לתוך שדות מקבלים מספריים?

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

פריטים מקובצים (GROUP ITEMS)

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

 דוגמא 

 02  DATE1.  

03   MONTH  PICTURE  99.        

03   YEAR  PICTURE  99.        

אם מעבירים את MONTH, או את YEAR, לשדה אחר, ההעברה תתבצע לפי כללי ההצבה המספרית. אבל אם ינסה המתכנת להעביר אתDATE1 כולו לשדה אחר, תיחשב ההעברה אלפאנומרית. להלן מופיעה טבלה, המפרטת הוראות- MOVE שונות. סימן V מסמן, שההצבה חוקית. סימן X מסמן, שהיא אסורה. כפי שתוכל לראות, קיימים שישה סוגי שדות-שולחים: שדות שולחים מספריים, אלפאבתיים, או אלפאנומריים, שיכולים להיות קבועים או משתנים. משתנה מספרי מוצב בדיוק באותה דרך כמו קבוע מספרי. השדות המקבלים מתחלקים לארבעה סוגים בלבד: מספרי, אלפבתי, אלפאנומרי או פריט מקובץ. אלה הם שדות-נתונים משתנים. קבוע, או קבוע מיוחד, אינו יכול לשמש שדה מקבל. יש לשים לב, שכאשר מתבצעת הצבה מסוג אחד של שדה לסוג אחר, תתבצע ההעברה תמיד לפי סוגו של השדה המקבל, אם היא חוקית.

מקובץ

אלפאנומרי

אלפביתי

מספרי

שדה שולח

V

V

 X

 V

 מספרי

V

 V

 V

 X

 אלפביתי

 V

V

V

X

אלפאנומרי

V

V

 X

V

(אפסים)ZEROS

 V

V

V

X

(רווחים)SPACES

V

V

V

X

מקובץ

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

ה. הוראת   (הצבה מתואמת)  MOVE CORRESPONDING.

הוראת MOVE  CORRESPONDING  היא הוראת-ברירה, שניתן להשתמש בה במקום הוראת MOVE בסיסית. מבנה ההוראה:

(פריט-מקובץ-2) TO (פריט-מקובץ-1) MOVE CORRESPONDING

                                             CORR         

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

דוגמא 1

MOVE CORRESPONDING  RECORD-1 TO  RECORD-2.

הוראת- MOVE כזו המופיעה בדוגמה, תגרום להעברת כל שדות הנתונים ב-RECORD-1 שיש להם שמות זהים לשדות מתאימים ב-RECORD-2, השדות בעלי השמות הזהים ב-RECORD-2 אינם חייבים להיות מסודרים לפי סדד מסויים. אם קיימים ב-RECORD-1שדות, שאין להם שדות מתאימים (בעלי שם זהה) ב-RECORD-2, לא יושפעו שדות אלה מביצוע ההוראה. השדות השולחים, כמו בכל הוראת הצבה, נשארים ללא שינוי. דיון מפורט יותר ברעיון של "שמות זהים" מובא בפרק 11 , בחלק הדן בסיווג שמות. עד לנקודה זו, השתמשנו בשמות שונים עבור שדות שונים. בשימוש בהוראת MOVE CORRESPONDING, אנו יכולים ליצור שדות בעלי שמות זהים בשתי רשומות שונות.  

תוכן אחרי MOVE

תוכן לפני MOVE

. RECORD-2

תוכן אחרי MOVE

תוכן לפני MOVE

. RECORD-1

A

P

.(NAME PIC X(6

ללא שינוי

A

.(NAME PIC X(6

0680

0579

.(DATEX PIC 9(4

ללא שינוי

10000

.AMT PIC 999V99

100.00

000.00

.AMT PIC 999V99

ללא שינוי

12345

.(TRANS PIC X(5

10

10

.DISC PIC V99

ללא שינוי

0680

.(DATEX PIC 9(4

אנו רואים, כי הוראת MOVE CORRESPONDING מבצעת למעשה סדרה של העברות פשוטות. כל השדות  ב-RECORD-1, אשר יש להם שדות בעלי שמות זהים ב-RECORD-2, מוצבים בשדות אלה NAME, AMT, ו-DATEX, שב-RECORD-2 אינם מופיעים בסדר זהה לזה שבRECORD-1, עם זאת, תועבר  תכולתם ל-RECORD-2 בלי שעובדה זו תשפיע על ההעברה.

שדות ב-RECORD-1, שאין להם פריטים מתאימים ב-RECORD-2, אינם מושפעים מביצוע ההוראה.  השדה DISC ב-RECORD-2 שומר על תוכנו המקורי, מאחר שאין שדה מתאים לו ב- RECORD-1.

פריטים ב-RECORD-1, אשר אין להם פריטים מתאימים בRECORD-2, אינם מועברים. השדה TRANS  ב-RECORD-1 לא יועבר, מאחר שאין שדה בשם זה ב-RECORD-2. בכל מקרה, נשארים פריטי הרשומה  השולחת ללא שינוי לאחר ביצוע ההוראות.

כל כללי ההצבה הרגילה חלים גם על הוראת  MOVE CORRESPONDINGלהצבות מספריות.  

  הצבות MOVE מספריות

  1. הנתונים מוצמדים לימין בשדה המקבל:                               לדוגמא, הצבת 075 בשדה מספרי בן 2  תווים - תיתן תוצאה 75 בשדה זה.

  2. אם השדה המקבל גדול מהשדה השולח, יוחלפו תווים מסדר גבוה (שמאליים) באפסים.  

    לדוגמא, הצבת 524 בשדה בן 4 תווים ספרתיים - תיתן 0524 בשדה זה.

 

  הצבה שאינה מספרית (אלפבתי או אלפאנומרי)

  1. הנתונים מוצמדים לשמאל השדה המקבל.                          לדוגמא, הצבת ABC לשדה (שאינו מספרי) בן שני תווים - תציב בשדה זה AB.

  2. אם השדה המקבל גדול מהשדה השולח, תווים מסדר נמוך (ימניים) יוחלפו בתווי-רווח.  

    לדוגמא, הצבת ABC בשדה שאינו מספרי, בן 4 תווים - תציב בשדה זה ~ABC . (~ =  מרווח)

אפשר להציב שדה מספרי בשדה אלפאנומרי, אך אין להציב שדה אלפאנומרי בשדה מספרי.  

 דוגמא 2

תוכן אחרי MOVE

OUT-RECתוכןIN-REC
Jan 7,2003

.(DATEX PIC X(10

Jan 7,2003

.(DATEX PIC X(10

23

.AMT PIC 99

023

.AMT PIC 999

040

.HRS PIC 999

40

.AMT PIC 999

בפרק 13 נראה, כי הוראת MOVE  CORRESPONDING משמשת במרבית המקרים לביצוע עריכה  (EDITING) של שדות, הנקראים על ידי המחשב.

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

נעיין בשטחי הקלט והפלט שלהלן:  

.RECORD-A

.(NAME PIC X(10

.DB-AMT PIC 99 

.CR-AMT PIC 99

.RECORD-B

.(NAME PIC X(10

.DB-AMT PIC 99 

.CR-AMT PIC 99

במקרה זה, השימוש בהוראת- MOVE  CORRESPONDING יהיה בלתי יעיל. מוטב פשוט להורות:

.MOVE  RECORD-A  TO  RECORD-B

זאת מאחר שכל הפריטים שב-RECORD-A  זהים בגודלם ובמקומם הסידורי ברשומה לפריטי RECORD-B.

ברירת ההצבה המתואמת (MOVE  CORRESPONDING) משמשת במקום סדרה של הוראות-MOVE    בסיסיות. כל השדות ברשומה השולחת מועברים לשדות בעלי שמות זהים ברשומה המקבלת. כל כללי הוראת  MOVE הרגילה נשמרים בשימוש בהוראת MOVE CORRESPONDING. יש להקפיד, כי השדות שאנו  מעוניינים בהצבתם בפריט המקובץ המקבל, יהיו בעלי אותו שם בדיוק כמו השדות המתאימים בפריט  השולח.

 הוראת  MOVE  CORRESPONDING תקציר

  1. מטרה: להחליף סדרה של הוראות-MOVE בסיסיות.

  2. תוצאה:

    • כל השדות בפריט השולח מועברים לשדות בעלי שם זהה

      בפריט המקבל.  

    • שדות בפריט המקבל, שאין להם שדות מתאימים בפריט

      השולח - נשארים ללא שינוי.

       

  3. כללים: כל הכללים של הוראות-MOVE בסיסיות - חלים גם כאן.

 הוראת הצבה (MOVE) רגילה - תקציר

  1. הוראת MOVE מספרית

    השדה השולח והשדה המקבל, שניהם מספריים.  

  2. כללים:

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

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

       

  3. הוראת MOVE, שאינה מספרית

    השדה המקבל אינו מספרי.  

    כללים

    מועבר משמאל לימין

    תווים מסדך נמוך, שלא התמלאו, יוחלפו בתווי רוווח.





דדווח על תוכן פוגעני

סמל אישי
מנותק
נשלח ב-27/7/2011 16:08 לינק ישיר 
פרק 8 קטעי האחסון לעבודה.

א. פריטים ומשפטי עצמאיים VALUE.

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

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

  בקטע שטחי-האחסון-לעבודה ישנם שני סוגי שדות

  1. פריטי מידע עצמאיים ברמה 77.

  2. פריטים מקובצים - המחולקים לפריטים עצמאיים בסיסיים.

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

WORKING-STORAGE             SECTION.      

01 WORK-AREAS.                                        

02 EOF                PIC 9            VALUE 0.

02 GROSS-AMT   PIC 999V99   VALUE 0.

השימוש בפריטים עצמאיים בקטע שטחי האחסון לעבודה

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

דוגמא 1

המחיר נטו (NET-PRICE) שווה למחיר היחידה (UNIT-PRICE), מוכפל בכמות (QTY), פחות סכום ההנחה (DISC-AMT).

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

הכפלה:

.MULTIPLY UNIT-PRICE BY QTY GIVING GROSS-AMT    

GROSS-AMT הוא המחיר ברוטו (לפני ההנחה). הוא צריך להוות פריט עצמאי המוגדר בקטע שטחי העבודה, מאחר שאינו חלק מהקלט, אלא תוצאת ביניים, שממנה מחשבים את המחיר נטו           (NET-PRICE).  

חיסור:

.SUBTRACT  DISC-AMT  FROM  GROSS-AMT  GIVING  NET-PRICE

הפריט העצמאי GROSS-AMT הוא אפוא שדה ביניים, הנוצר בעת ההכפלה, וממנו מיוצרת לבסוף תוצאת הפלט.

 

דוגמא 2

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

.MOVE  ZERO  TO CTR

.PERFORM BEGIN UNTIL EOF =  1

.MOVE CTR TO PRINT-A

.WRITE PRINT-REC

.BEGIN

.READ FILE-1 AT END MOVE 1 TO EOF

.ADD 1 TO CTR

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

  כללים לכתיבת פריטים עצמאיים

  1. כמו כל הקטעים, מקודד קטע שטחי-העבודה  במרווח-A.

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

  3. פריטי מידע עצמאיים יכולים לבוא כחלק מפריט מקובץ (או כפריטים מיוחדים ברמה 77 ).

  4. את הפריט המקובץ כותבים ברמה 01 במרווח-A. את הפריטים העצמאיים כותבים ברמות כלשהן, הכפופות לרמה 01.

  5. שמות-הנתונים בקטע זה תואמים את הכללים ליצירת שמות-נתונים (משתנים).

  6. לכל פריט עצמאי חייב להיות משפט PICTURE או PIC, המגדיר אותו:

X מציין נתונים אלפאנומריים.

A מציין נתונים אלפביתיים.

9 מציין נתונים מספריים.

דוגמא 

WORKING-STORAGE    SECTION.                       

01 WORK-AREAS.                                         

02 INTERMEDIATE-TOTAL   PIC 9(5)V99.

02 CONSTANT-1   PIC  X(4).                    

02 FLDA   PIC  X(3).                    

משפטי - VALUE.  

כמו בקטע הקבצים, גם כאן גודל השדה נקבע ע"י מספר האותיות A אוXאו הספרות 9.  

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

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

כדי להבטיח, שרשומות או שדות פלט, המפורטים בקטע הקבצים, יהיו ריקים עם תחילת התכנית, אנו מציבים בהם תווי רווח (SPACES) בחטיבת הביצוע, לפני התחלת העבודה. לעומת זאת, בקטע שטחי-העבודה, אנו יכולים לתת לפריט ערך התחלתי ע"י שימוש במשפטVALUE.

דוגמא 

WORKING-STORAGE    SECTION.                       

01 WORK-AREAS.                                                 

02 TOTAL   PIC 9(3) VALUE ZEROS.               

02 CONSTANT-1   PIC X(4) VALUE SPACES.              

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

  פריטים עצמאיים בקטע שטחי-ענודה

  1. כתיבת רמה 01 במרווח A -  מציינת למחשב, כי אנו עומדים להגדיר פריט-נתונים מקובץ. פריטים עצמאיים יכתבו ברמות, הכפופות לרמה 01.

  2. השם, הניתן על ידי המתכנת, מגדיר את השדה.

  3. גודלו ועיצובו של השדה מוגדרים במשפט PICTURE.

  4. ניתן לאחסן בשדה ערך התחלתי ע"י משפט VALUE .

משפט ה-VALUE יכיל קבוע או קבוע מיוחד, אשר יוצב בשדה. הוא צריך להיות מאותו סוג, שהוגדר במשפט ה-PICTURE. אם משפט ה-PICTURE הגדיר שדה מספרי, הערך צריך להיות קבוע מספרי, או אפס(ים) (ZEROS(S)).

דוגמא 

WORKING-STORAGE    SECTION.                       

01 WORK-AREAS.                                                 

02 TOTAL   PIC 9(4) VALUE ZERO.              

02 CONSTANT-1   PIC  9(5) VALUE 07600  . 

02 FICA   PIC  V9(4) VALUE .0617  .

שים לב: המשפט 02 TOTAL   PIC 9(4) VALUE ZERO. הינו שווה ערך להגדרת פריט ברמה 02 ללא משפט VALUE, ומתן ההוראה הבאה בחטיבת הביצוע: MOVE ZERO TO TOTAL. באופן דומה,המשפט 02 FICA   PIC  V9(4) VALUE .0617. זהה להכנסת ההוראה MOVE .0617 TO FICA., כאשר ל-FICA אין משפטVALUE. מאחר שמשפט VALUE מבצע את אותה פעולה כמו הוראת-MOVE, הרי שחלים עליו כל הכללים של הוראת-MOVE.

דוגמא 

02  FLDA  PIC 9(3)  VALUE  12.

הדוגמא לעיל זהה להצבת הערך 12 ב-FLDA. לפי כללי הוראת-MOVEמספרית (ראה פרק 7), יקבל FLDA את הערך 012. כדי להשיג בשדה המקבל תוכן זהה בדיוק לנתון המפורש, נשתמש, בדדך כלל, במשפטPICTURE, המגדירו באופן המתאים. כדי לקבל את הערך 12 - בFLDA, יש להגדירו ב-PICTURE 99 . גם החוקים של שדות אלפאנומריים תקפים לגבי פריטים עצמאיים בקטע שטחי-העבודה. אם לשדה מתאים משפט PICTURE אלפאנומרי או אלפביתי, על משפט ה-VALUE שלו (אם יש כזה) להכיל קבוע מפורש, שאינו מספרי.

דוגמא 

WORKING-STORAGE    SECTION.                       

01 WORK-AREAS.                                                 

02 DATEX   PIC X(5) VALUE 'APRIL'.

02 FLDB   PIC  X(3) VALUE SPACES .

תהיה זו שגיאה לומר, 02 FLDB   PIC  X VALUE 3 .. שדה, שהוגדר במשפט PICTURE X, צריך לקבל משפט-VALUE, שיכיל קבוע שאינו מספרי. המשפט הנכון יהיה:

02 FLDB   PIC  X  VALUE '3' .

באופן דומה, אין לומך 02 TOTAL PIC 99 VALUE  SPACES. מאחר שתו-רווה (SPACE) אינו תו מספרי חוקי. בקבועים מספריים ניתן להשתמש רק בספרות 0 עד 9, נקודה עשרונית, וסימני + או - . כדי לנקות שדה מספרי, אנו מציבים בו אפסים, ולא רווחים. המשפט שלעיל צריך להיות:

02 TOTAL PIC 99 VALUE  ZERO.

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

WORKING-STORAGE  SECTION.

01  WORK-AREAS.                                 

02  TOTAL  PIC 9(5)  VALUE  ZERO.

              ...                    

PROCEDURE  DIVISION.                 

              ...                        

.ADD 5800 TO TOTAL       

בנקודה זו יש ל-TOTAL ערך של 05800, ולא אפס. לעומת זאת, אם לא הצבנו ערך התחלתי 0 ב-TOTAL, לא נוכל לצפות מה יהיה ערכו לאחר ביצוע פעולת החיבור (ADD). שדה, שלא קיבל ערך התחלתי - לא ניתן לדעת את ערכו.שים לב, כי אפשר להחליף קבוע, בו משתמשים בחטיבת הביצוע, בפריט נתונים עצמאי. ההוראה:

IF CDE = 0 THEN                        

MOVE 'CR' TO CREDIT-AREA.

זהה להוראה: 

IF CDE = 0 THEN                        

MOVE CREDIT TO CREDIT-AREA.

כאשר CREDIT הוא פריט-נתונים עצמאי, שהוגדר כך:

02  CREDIT  PIC  XX VALUE  'CR'.

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

על משפט-VALUE של שדה מספרי להכיל קבוע מספרי:

02  FLDA  PIC  99V99  VALUE  12.34 .

12.34 הוא קבוע מספרי. כזכור, קבועים או שדות מספריים מקבלים אורך מירבי של 18 ספרות. לכן, הגדרה הניתנת לפריט מספרי במשפט-VALUE  או משפט-  PICTURE, אסור שתהיה ארוכה יותר מ 18 ספרות.

משפטי- VALUE שאינם מספריים

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

ב. פריטים מקובצים המתחלקים לשדות-משנה

חטיבת הנתונים (DATA DIVISION) מכילה, כפי שהודגש בסעיף הקודם, את כל שטחי האחסון, שהגדרתם נחוצה לשם עיבוד הנתונים. קטע שטחי-האחסון לעבודה (WORKING-STORAGE SECTION) של חטיבת הנתונים, מכיל את כל אותם שטחי אחסון, שאינם חלק מן הקלט או מן הפלט. 

עד כה, עסקנו בפריטים עצמאיים, שהוגדרו ב WORKING-STORAGEכחלק מפריט מקובץ אשר כינינו, באופן שרירותי,WORK-AREAS. פריט בסיסי, או עצמאי, הדורש הגדרה בקטע שטחי-העבודה, הוגדרכשדה בתוך הרשומה WORK-AREAS. ניתן להקצות לשדות אלה ערכים התחלתיים באמצעות משפטי-VALUE.

בנוסף לשימוש בפריט מקובץ, המתחלק לפריטים בסיסיים עצמאיים, ניתן להשתמש בפריט מקובץ להגדרת שטחי אחסון, המתחלקים לשני שדות-משנה מקושרים, או יותר. דוגמאות לפריטים מקובצים המתחלקים, לשדות משנה מקושרים (שיש קשר ביניהם) הן: שדה בשם NAME(שם) המתחלק לשדות המשנה FIRST-NAME ו-LAST-NAME (שם פרטי ושם משפחה); שדה בשם DATE-OF-RUN (תאריך ההרצה), המתחלק לשדות-המשנה MONTHDAY-OF-RUN, וYEAR (חודש, יום ההרצה, שנה). כל הפריטים המקובצים בקטע שטחי-האחסון לעבודה יקודדו ברמה 01, במרווה-A. להלן דוגמא של קטע שטחי-עבודה, המכיל פריט מקובץ WORK-AREAS, ושדות משנה מקושרים בתוך פריטים מקובצים נוספים:

WORKING-STORAGE SECTION.                          

01 WORK-AREAS.                                              

02 TOTAL   PIC 9(5)  VALUE ZERO.            

02 CONST   PIC X(4)  VALUE 'CODE'.         

02 SAVE-AREA   PIC X(3)  VALUE SPACES.

01 ADDRESS-1.                                                    

02 NUMB   PIC 9(4)  .                                     

02 STREET   PIC X(20)  .                               

02 CITY   PIC X(25)  .                                     

02 STATE   PIC X(3)  .                                     

01 DATEX.                                                           

02 MONTH   PIC 9(2)  VALUE 06.

02 YEAR   PIC 9(4)  VALUE 2003.            

 

  פריטים מקובצים בקטע שטחי-העבודה משמשים לשתי מטרות

  1. בשדה הנקרא WORK-AREAS , המכיל שדות עצמאיים לעבוד.

  2. כשדות המחולקים חלוקת משנה לשדות-משנה, שיש קשר ביניהם.

אם לשדות שבתוך פריט מקובץ לא ניתנו ערכים התחלתיים כלשהם, יוצבו בהם (בהוראת MOVE) במשך התכנית הערכים הרצויים. אנו רשאים להניח כי נתונים אכן יועברו ויוצבו בפריט המקובץ ADDRESS-1, למשל, מאחר שאין לו כל משפט-VALUE. לפריט מקובץ יכולים גם להיות משפטי-VALUE מתאימים, הנותנים ערך התחלתי לשדות, כפי שמופיע ב-DATEX בדוגמא לעיל. 

הבה נבחן תכנית COBOL, בה נדרש השימוש בפריטים מקובצים בשטחי-העבודה.

דוגמא 1

נניח, כי קובץ רשומות מכיל שני סוגי-רשומה: רשומת תאריך, ורשומת עסקה מפורטת. להלן קטע הקבצים (FILE SECTION), המתאים לקובץ זה.

FD FILE-1

LABEL RECORDS ARE OMITTED

RECORD CONTAINS 80 CHARACTERS

DATA RECORDS ARE DATE-REC, TRANS-REC.

01 DATE-REC.

02 DATEX.

03 MONTH PIC 99.

03 YEAR PIC 99.

02 FILLER PIC X (76).

01 TRANS-REC.

02 CUSTOMER-NAME  PIC X(20).

02 TRANS-NO  PIC 9(5).

02 AMT  PIC 999v99.

02 FILLER  PIC  X (46).

02  DATE-OF-TRANS.

03 MONTHX  PIC  99.

03 YEARX  PIC  99.

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

01  STORED-DATE.

02 MONTHY  PIC 99.

02 YEARY  PIC 99.

ההוראה לאחסון התאריך בשטח-העבודה תקודד בחטיבת הביצוע כהוראת הצבה:

MOVE  DATEX  TO  STORED-DATE.

חשוב לשים לב, כי STORED-DATE הינו פריט מקובץ, המתחלק לשני פריטים בסיסיים: MONTH ו-YEAR. לאחר הצבת התאריך ב-STORED-DATE, ניתן תמיד לגשת אליו לצורך עיבוד, אלא אם כןכתבנו הוראה, המוחקת אותו.  

ג. שימוש בפריטים ברמה-77 בשטח העבודה.

פירוט-רמה 77 בקטע שטחי העבודה ישמש להגדרת שדה עצמאי. הוא יכול להכיל משפט-VALUE, ויש לקודדו במרווח A. כך, ניתן להשתמש בשתי שיטות קידוד בתכנית-COBOL:

שיטה 1- עדיפה

WORKING-STORAGE SECTION.

01  WORK-AREAS.

02 EOF  PIC 9  VALUE 0.

02  TOTAL  PIC  999  VALUE 0.

02  CTR  PIC  99  VALUE 0.

שיטה 2

WORKING-STORAGE SECTION.

77 EOF  PIC 9  VALUE 0.

77  TOTAL  PIC  999  VALUE 0.

77  CTR  PIC  99  VALUE 0.

יצויין, שפריטי-רמה-77 אינם ניתנים לחלוקת משנה.

ההדגמה שלעיל מראה, כי ניתן לא להשתמש כלל ברמה-77 בתכנית. על ידי הגדרת פריט מקובץ ברמה 01, שאנו קראנו לו WORK-AREAS, ניתן להגדיר את כל הפריטים העצמאיים כחלק של פריט מקובץ זה.  

לצורכי תיעוד וניפוי-שגיאות, עדיף להשתמש בפריט מרמה-01 (שייקרא בדרך כלל WORK-AREAS), שבתוכו יוגדרו השדות העצמאיים, ולא להשתמש בפריטים ברמה-77. שים לב גם, כי הקטע הבא ייתן אותן תוצאות כמו זה שלעיל:

שיטה 3

WORKING-STORAGE SECTION.

01  WORK-AREAS  VALUE  ZERO.

02 EOF  PIC 9.

02  TOTAL  PIC  999.

02  CTR  PIC  99.





דדווח על תוכן פוגעני

סמל אישי
מנותק
נשלח ב-27/7/2011 16:12 לינק ישיר 
פרק 9 הוראות אריתמטיות.

א. הוראת חיבור

ניתן לכתוב הוראת חיבור פשוטה, באחת משתי התבניות הבאות:  

 תבנית 1

.(שמ-נתון-2) TO {שם-נתון-1 } ADD

קבוע }             

 

 תבנית 2

(שמ-נתון-3) GIVING  {שם-נתון-2 } , {שם-נתון-1 } ADD

{קבוע-2}         { קבוע-1}          

דוגמאות

ADD TAX  TO  DEDUCATIONS.

ADD  15.8  TO  TAX.

ADD 1.20, AMOUNT  GIVING  TOTAL.

.ADD AMT1, AMT2 GIVING NET

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

לאחר המלה GIVING, כשמשתמשים בתבנית 2, והוא נקרא שדה התוצאה. חשוב מאוד לזכור, ששדה התוצאה - אסור שיהיה קבוע, והוא חייב להיות משתנה כלשהו. ההוראה ADD HOURS-WORKED  TO 40.  היא הוראה שגויה, כיוון ששדה התוצאה הוא קבוע, ולא שם-שדה, כפי שחייב להיות.

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

לדוגמא:

.ADD HOURS-WORKED  TO  WEEKLY-HOURS

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

לדוגמא:

.ADD HOURS-WORKED, WEEKLY-HOURS  GIVING  TOTAL-HOURS

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

יש לזכור, שהשדות המופיעים בהוראה אריתמטית כלשהי, יכולים להיות שדות המוגדרים ברשומת קלט או פלט ב-FILE SECTION, או שדות המוגדרים ב-WORKING-STORAGE  SECTION . השימוש באותה הוראת חיבור במלים TO ו-GIVING יחדיו אסור בשפת COBOL, ואם נכתוב את ההוראה הבאה:ADD  TAX  TO  NET  GIVING  TOTAL. , הרי זוהי הוראה שגויה. מכל האמור לעיל נראה, שמשתמשים בתבנית מספר 1 כאשר, לאחר ביצוע ההוראה, התוכן המקורי של השדות כבר אינו נחוץ, ואילו בתבנית מספר 2 נשתמש כאשר אנו צריכים לשמור את תוכן השדות המקוריים, המשתתפים בביצוע הפעולה, להמשך התכנית. ניתן גם להרחיב את שתי התבניות הנ"ל, כפי שנראה מיד:

 תבנית 1 - צורה מורחבת

(שם-נתון-ח) TO ... ,[שם-נתון-2] , {שם-נתון-1} ADD

[קבוע-2]      {קבוע-1}             

 תבנית 2 - צורה מורחבת

 (שם-נתון-ח) GIVING ... ,[שם-נתון-2] , {שם-נתון-1} ADD

[קבוע-2]      {קבוע-1}             

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

 כללים לפעולת החיבור - סיכום תמציתי

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

  2. מקבל התוצאה (שלאחר המלה TO או GIVING) חייב להיות משתנה, ואסור שיהיה קבוע. בתבנית השימוש מספר 2 (עםGIVING) - מותר, שמשתנה התוצאה יהיה משתנה בעל עריכה פנימית (משתנה בעל עריכה פנימית מוסבר ביתר פרוט בפרק 13).

  3. בשימוש בתבנית מספר 1 (עם המלה TO) כל הערכים, כולל הערך של משתנה התוצאה, מסוכמים יחדיו, ומאוחסנים במשתנה התוצאה.

  4. בשימוש בתבנית מספר 2 (עם GIVING), הערך של משתנה התוצאה אינו מסוכם, ומשתנה זה משמש רק לאחסון והצגת התוצאה.

  5. אסור, שבאותה הוראת חיבור יופיעו גם המלה TO , וגם המלה GIVING יחדיו.

כדי להמחיש את שתי תבניות השימוש הנ"ל, נסתכל על הדוגמאות הבאות:

דוגמא א

.ADD  AMT1, AMT2, AMT3  GIVING  AMT4

AMT4

AMT3

AMT2

AMT1

לפני ביצוע ההוראה

15

6

4

2

אחרי ביצוע ההוראה

12

6

4

2

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

דוגמא ב

ADD  AMT1, AMT2, AMT3 TO  AMT4.

 

AMT4

AMT3

AMT2

AMT1

לפני ביצוע ההוראה

15

6

4

2

אחרי ביצוע ההוראה

27

6

4

2

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

כאשר כותבים ב-ANS COBOL, ניתן להרחיב את תבנית השימוש מספר 1, כך שע"י אותה הוראה, יתבצעו

מספר פעולות חיבור, כפי שנראה להלן:

נכתוב לדוגמא

ADD AMT1, AMT2  TO  TOTAL1, TOTAL2.

וזה כאילו כתבנו: 

ADD AMT1, AMT2  TO  TOTAL1.

ADD AMT1, AMT2  TO  TOTAL2.

מכאן שתבנית ההוראה ADD יכולה להסתכם בצורה הבאה: 

,(שם-נתון-ח+1),(שם-נתון-ח) TO ,[שם-נתון-2] ,{שם-נתון-1} ADD

[קבוע-2]       {קבוע-1}           



ב. הוראת חיסור

ניתן לכתוב הוראת חיסור פשוטה, באחת משתי התבניות הבאות.

 תבנית 1 

(שם-נתון-ח) FROM ... ,[שם-נתון-2] , {שם-נתון-1} SUBTRACT

[קבוע-2]      {קבוע-1}                       

או:

 תבנית 2 

 (שם-נתון-ח) GIVING (שם-נתון-ח-1) FROM ... , {שם-נתון-1} SUBTRACT

(קבוע-ח-1)                     {קבוע-1}                              

 

דוגמאות

SUBTRACT  25  FROM  FLDA.

SUBTRACT  FLDA, FLDB, 99  FROM  FLDC.

SUBTRACT  TAX  FROM GROSS GIVING NET.

.SUBTRACT  TAX, FICA, INSUR-PREM  FROM  GROSS GIVING  NET

כל הכללים שלמדנו בפרק א', לגבי הוראת החיבור, תקפים גם לגבי הוראת החיסור, שגם היא הוראה אריתמטית. לכן, הוראה שתיכתב כך: .SUBTRACT  TAX  FROM  100 היא הוראה שגויה, כיוון ששדההתוצאה חייב להיות משתנה, ואסור שיהיה קבוע. בכל מקרה, שנרצה להפחית סכום כלשהו מקבוע, נצטרך להשתמש בתבנית מספר 2 (עםGIVING),


 כללים לפעולת החיסור - סיכום תמציתי

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

  2. שדה התוצאה (שאחרי המלה FROM בתבנית שימוש 1 , או אחרי המלה GIVING בתבנית שימוש 2) חייב להיות משתנה, ואסור שיהיה קבוע.

  3. בשימוש בתבנית מספר 1, ערכי כל המשתנים והקבועים שלפני המלה FROM מסתכמים יחד, והסיכום מופחת מהמשתנה שאחרי המלה FROM התוצאה ( ההפרש) מאוחסנת במשתנה שאחרי המלה FROM . כל יתר המשתנים נשארים בערכיהם המקוריים.

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

כדי להמחיש את שתי צורות השימוש הנ"ל, נסתכל בדוגמאות הבאות:

דוגמא א

SUBTRACT  15.4, TAX, TOTAL  FROM  AMT.

AMT

TOTAL

TAX

לפני ביצוע ההוראה

100

10

30

אחרי ביצוע ההוראה

44.6

10

30

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

דוגמא ב

SUBTRACT 15.4, TAX, TOTAL  FROM  AMT GIVING  NET.

 

NET

AMT

TOTAL

TAX

לפני ביצוע ההוראה

87

100

10

30

אחרי ביצוע ההוראה

44.6

100

10

30

הערך המקורי שבמשתנה NET אינו משתתף בפעולת החיסור, ואין לו כל השפעה על התוצאה הסופית, שמאוחסנת במשתנה זה.

בתכנית COBOL נשתמש בתבבית מספר 1 , כאשר איננו צריכים לשמור על הערכים המקוריים של השדות המשתתפים בחיסור, ובתבנית מספר 2, כאשר אנו צריכים בהמשך התכנית להשתמש באותם שדות, בערכיהם המקוריים, לשימושים נוספים מלבד החיסור.

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

נכתוב לדוגמא

SUBTRACT  AMT1, AMT2, AMT3  FROM TOTAL1, TOTAL2, TOTAL3.

וזה כאילו כתבנו: 

SUBTRACT  AMT1  FROM TOTAL1.

SUBTRACT  AMT2  FROM TOTAL2.

SUBTRACT  AMT3  FROM TOTAL3.

תבנית מספר 1 של הוראת החיסור היא כדלקמן:

... ,(שם-נתון-ח+1),(שם-נתון-ח) FROM ... ,[שם-נתון-2] ,[שם-נתון-1] SUBTRACT

[קבוע-2]       [קבוע-1]                          


ג. הוראת כפל וחילוק

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

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

גם להוראת הכפל הפשוטה, שתי תבביות כתיבה בסיסיות:

 תבנית 1 

(שם-נתון-2) BY  {שם-נתון-1} MULTIPLY

     {קבוע-1}                       

או:

 תבנית 2 

 (שם-נתון-3) GIVING (שם-נתון-2) BY {שם-נתון-1} MULTIPLY

(קבוע-2)             {קבוע-1}                    

 

דוגמאות

MULTIPLY  100  BY QTY-ON-HAND.

MULTIPLY  QTY  BY  PRICE.

MULTIPLY  TAX  BY  GROSS  GIVING DEDUCTIONS.

MULTIPLY 150  BY  DEPENDENTS   GIVING  STD-DED.

כמו כן, גם להוראת החילוק הפשוטה : שתי תבניות כתיבה כנ"ל:

 תבנית 3 

(שם-נתון-2) INTO  {שם-נתון-1} DIVIDE

     {קבוע-1}               

או:

 תבנית 

 (שם-נתון-3) GIVING (שם-נתון-2) BY {שם-נתון-1} DIVIDE

(קבוע-2)   INTO    {קבוע-1}                  

 

דוגמאות

DIVIDE  12  INTO  ANN-SAL.

DIVIDE  N  INTO SUM.

DIVIDE  12  INTO  ANN-SAL GIVING MONTHLY-SAL.

DIVIDE  N  INTO SUM GIVING AVERAGE.

DIVIDE  ANN-SAL  BY  12  GIVING  MO-SAL.

אנו רואים אפוא, שלכל ההוראות האריתמטיות ישנן שתי תבניות כתיבה בסיסיות. במקרים, שבהם הערך המקורי שבמשתנים, המשתתפים בהוראה אריתמטית, אינו חשוב להמשך התכנית, ואין צורך לשמור אותו תוך כדי ביצוע התכנית, נשתמש בתבנית כתיבה מספר 1. לעומת זאת, במקרים שבהם, תוך כדי ביצוע ההוראה האריתמטית, חשוב לשמור על ערך מקורי,של משתנים, המשתתפים בהוראה מסוימת זו, הרי נשתמש בתבנית כתיבה מספר 2 (עם GIVING).

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

  1. MULTIPLY  20  BY PRICE

  2. MULTIPLY  PRICE  BY  QTY

הפקודות צריכות להיכתב זו אחר זו, והתוצאה הסופית תהיה המכפלה של כל 3 המשתנים והקבוע, מאוחסנת במשתנה QTY. בהוראת הכפל נשתמש תמיד במלה השמורה BY, ואילו בהוראת החילוק אנו יכוליםלהשתמש במלה השמורה BY, וגם במלה השמורה INTO, כאשר השימוש בשתי הצורות זהה והתוצאה הפוכה.

אם כתבנו: .DIVIDE  3 INTO 6  GIVING  AMT, הרי התוצאה של 6/3, שהיא 2, תאוחסן ב-AMT, וזה בדיוק כפי שהיינו כותבים:        DIVIDE  6 BY 3  GIVING  AMT.

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

דוגמא 1

הסבת מעלות צלסיוס למעלות פרנהיט מתבצעת על פי הנוסחה         (9/5)C + 32  F. בשפת COBOL נכתוב זאת כך:

MULTIPLY  9  BY  C.

DIVIDE  5  INTO C.

.ADD 32, C GIVING  F

כיוון ש- 1.8 = 9/5, נוכל גם לכתוב כך: 

MULTIPLY 1.8 BY C.

ADD 32, C GIVING F.

דוגמא 2

חשב את ממוצע שלושת שדות הנתונים הבאים: HRS-WEEK1, HRS-WEEK2,HRS-WEEK3. הצב את  שובתך בשדה הנתוניםAVERAGE ודאג לכך שערכיהם של שדות הנתונים המשמשים בסיס לחישוב לא ישתנו:

פתרון:

ADD HRS-WEEK1, HRS-WEEK2, HRS-WEEK3 GIVING AVERAGE.

DIVIDE  3  INTO  AVERAGE.

דוגמא 3

מצא את ערכו של שדה הנתונים C על פי הנוסחה הבאה:  

C = A^2  +  B^2

שוב, נצא מתוך ההנחה ששדות הנתונים A ,B, ו-C מוגדרים בחטיבת הנתונים.

פתרון:

MULTIPLY A BY A.

MULTIPLY B BY B.

.ADD A, B GIVING C

זכור: הכפלת שדה הנתונים A בעצמו (A * A) או רישום חזקה של A(ז"א A^2) אלה פעולות זהות מבחינת ביצוען.

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

.ADD A  TO  B

.MULTIPLY  B  BY  B  GIVING  C

הוראת הרישום ADD מעבירה לשדה הנתונים B את סיכום השדות A + B. הוראת הכפל יוצרת את התוצאה על פי הנוסחה (B + A* (B + A), נוסחה שהיא שונה מהמבוקש A^2  +  B^2.

REMINDER (שארית)

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


DIVIDE 130 BY 40  GIVING  ITEM-A.

    .99 הוא ITEM-A של PICTURE

התוצאה:  03 מאוחסן ב- ITEM-A .

שארית: 10

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


 (שם-נתון-3) GIVING (שם-נתון-2) BY {שם-נתון-1} DIVIDE

(קבוע-2)   INTO    {קבוע-1}                  

[(שם-נתון-4) REMINDER]

דוגמא

WORKING-STORAGE  SECTION.

WORK-AREAS.

REMAIN-1  PIC  99.

...

PROCEDURE  DIVISION.

...

.DIVIDE  130  BY  40  GIVING  ITEM-A  REMAINDER  REMAIN-1

יש לזכור, שהשימוש בצורה זו (עם REMINDER) אינו הכרחי כלל, ואינו משפיע בשום צורה, על התוצאה של פעולת החילוק המקורית.

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

ערך אחרי ביצוע הפעולה  

פעולה אריתמטית

A

B

C

D

ADD A TO B

A

A+B

 

 

ADD A, B, C TO D


A

B

C

A+B+C+D

ADD A, B, C  GIVING D


A

B

C

A+B+C

SUBTRACT  A  FROM  B


A

B-A

 

 

SUBTRACT  A, B  FROM  C


A

B

C-(A+B)

 

SUBTRACT  A, B  FROM  C  GIVING  D


A

B

C

C-(A+B)

MULTIPLY  A  BY  B


A

A*B

 

 

MULTIPLY  A  BY  B  GIVING  C

A

B

A*B

 

DIVIDE  A  INTO  B


A

B/A

 

 

DIVIDE  A  INTO  B  GIVING  C

A

B

B/A

 

DIVIDE  A  BY  B  GIVING  C

A

B

A/B

 



ד. עיגול תוצאות חישוב

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

ADD AMT1, AMT2  GIVING  AMT3.

AMT1                 AMT2                 AMT3          

התוכן אחרי פעולת  ADD

PICTURE

התוכן

PICTURE

התוכן

PICTURE

37.99

99V99

25.142

99V999

12.857

99V999

כיוון ששדה התוצאה הוא משתנה המוגדר רק עם שתי ספרות דיוק לאחר  הנקודה העשרונית, מתבצע קיצוץ של הספרה הימנית ביותר12.857 + 25.142 = 37.99, כך שהתוצאה המתקבלת איננה האמיתית ממש. באופן כללי, במקרים אלו, ברור שתוצאה יותר רצויה היתה התשובה 38.00, כלומר, תוצאה המעוגלת כלפי מעלה, בסיפרה הימנית.

על מנת להשיג עגול בהוראות אריתמטיות, ניתן להשתמש בעיגול התוצאה, בכל סוגי ההוראות שלמדנו, בעיגול התוצאה כפי שנראה בדוגמאות להלן:

ADD  AMT1  TO  AMT2  ROUNDED.

SUBTRACT  DISCOUNT  FROM  TOTAL  ROUNDED.

MULTIPLY  QTY  BY  PRICE  ROUNDED.

.DIVIDE  UNITS-OF-ITEM  INTO  TOTAL  ROUNDED

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

דוגמאות

ADD AMT1, AMT2  GIVING  TOTAL  ROUNDED.

ADD AMT1, AMT2  GIVING  TOTAL1  ROUNDED,  TOTAL2  ROUNDED.

אם שדות הנתונים AMT1 ו-AMT2 אמנם מכילים את הערכים כפי שצויינו בדוגמא, התוצאה אשר תתקבל בשתי הדוגמאות היא שהערך יעוגל ל-38.00.

יש לשים לב, שהשימוש ב-ROUNDED אינו הכרחי בכתיבה, והוא אכן רשות בלבד, ולא חובה. בכל מקרה, בו נכתוב בהוראה לעגל, נקבל תמיד תוצאה מעוגלת כלפי מעלה, בהתאם להגדרת משתנה התוצאה. אם לא נשתמש באפשרות העיגול, יכולים להיות מקרים של תוצאות מקוצצות. בדוגמא שלהלן נראה, כיצד אנו מקבלים שתי תוצאות שונות, במקרים של שימוש ב-ROUNDED, או אי שימוש בו (בהתאם לרצוננו):

דוגמא

DISCOUNT               TOTAL                    AMT          

התוכן

PICTURE

התוכן

PICTURE

התוכן

PICTURE

00

99

99.98

99V99

87.23

99V99

 

1. כתיבה רגילה

SUBTRACT   DISCOUNT  FROM  TOTAL  GIVING  AMT.  

במקרה זה, התוצאה המתקבלת (99.98 - 87.23 = 12.75) מכילה שתי ספרות אחר הנקודה, וכיוון שמשתנה התוצאה מוגדר ללא ספרות עשרוניות כלל, הרי נקבל ב-AMT את המספר 12 , לאחר קיצוץ של הספרות מימין.

2. כתיבה עם עיגול

SUBTRACT  DISCOUNT  FROM  TOTAL  GIVING  AMT  ROUNDED.

במקרה זה, אותה תוצאה 12.75 מעוגלת כלפי מעלה, ולפי הגדרת משתנה התוצאה, נקבל ב-AMT את המספר 13 (שהוא שונה מ-12בתבנית מס'1  ).

אם משתמשים במלה ROUNDED, בהוראת ה-DIVIDE עם שארית, הרי מלה זו תופיע ראשונה ( לפי הכלל, צמודה למשתנה התוצאה); בצורה הבאה:

 (שם-נתון-3) GIVING (שם-נתון-2) BY {שם-נתון-1} DIVIDE

(קבוע-2)   INTO    {קבוע-1}                  

 [(שם-נתון-4) ROUNDED] [REMINDER] 

השארית תאוחסן, כמובן, במשתנה הרביעי.




ה.  הערה לשגיאת גודל - ON SIZE ERROR OPTION

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

כיצד מתרחש מצב כזה? נראה בדוגמא הבאה:

ADD AMT1, AMT2  TO  AMT3.

אם מתבצעת ההוראה דלהלן:

AMT1                 AMT2                 AMT3          

התוכן

PICTURE

התוכן

PICTURE

התוכן

PICTURE

050

999

150

999

800

999

התוצאה המתקבלת היא (800 + 150 + 50 = 1000 ) - מספר בן ארבע ספרות; תוצאה זו צריכה להיות מאוחסנת במשתנה, המוגדר באורך שלושה תווים בלבד. במקרה כזה הספרה השמאלית מושמטת (קיצוץ משמעותי לגבי התוצאה), ובשדה AMT3. נקבל 000. זהו מצב של שגיאת גודל, או, OVERFLOW, וחשוב לציין שאין המחשב מתריע על כך, ואף אינו מפסיק את התכנית אם נתהווה מצב שכזה.  

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

 {הוראת הביציע} [[ON SIZE ERROR {הוראה חשבונית}

להלן דוגמא לשימוש בהערה לשגיאת גודל:

ADD A ,B  TO  C  ON  SIZE  ERROR   MOVE  0 TO  C.

MULTIPLY   A   BY   B  ON  SIZE  ERROR   PERFORM  ERROR-RTN.

DIVIDE  A  INTO  C  ON  SIZE  ERROR  MOVE  'INVALID  DIV'  TO  CDE.

בכל הוראה אריתמטית, גם בצורת הכתיבה הרגילה וגם עם GIVINGניתן להשתמש באפשרות זו. המונח IMPERATIVE  STATEMENT(משפט ציווי) מציין כל משפט COBOL המורה על ביצוע של הוראה או הוראות מסוימות. אין לכלול במונח זה משפטי תנאי או הוראות. משפט הציווי יתבצע אך ורק אם, לאחר ביצוע ההוראה האריתמטית, באמת נתהווה מצב של שגיאת גודל. למשל, בדוגמא מספר 1 יועברו אפסים למשתנה C רק אם הוא אינו מספיק גדול להכיל את תוצאת הסיכום. אםC מכיל מספיק תווים, כדי שהתוצאה תאוחסן בו, ללא קיצוץ משמעותי בשמאל, הרי משפט הציווי לא יתבצע, אלא המחשב ימשיך למשפט העוקב להוראה הבוכחית. בהוראת החילוק יכול להתהוות מצב של שגיאת גודל, לא רק כאשר אין מספיק מקום במשתנה התוצאה, אלא גם כאשר רוצים בטעות לחלק ב-0, דבר שאסור לבצע. בכל הוראה אריתמטית, ניתן להשתמש בצרוף של אפשרות העיגול עם אפשרות שגיאת גודל (כאשר המלה ROUNDED תמיד ראשונה), בצורה הבאה:

 ]הוראת הביציע] ROUNDED ON SIZE ERROR [הוראה חשבונית[

בהוראת חילוק עם שארית, כתיבת ההוראה תיראה כך:

 [(שמ-נתון)  REMINDER... [ROUNDED]   DIVIDE

[(הוראת הביציע) [ON  SIZE  ERROR




ו. הוראת החישוב - COMPUTE STATEMENT

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

בהוראת COMPUTE, ניתן להשתמש בסמלים הבאים, עבור הפעולות האריתמטיות:

חיבור

+

חיסור

-

כפל

*

חילוק

/

העלאה בחזקה

**

נתבונן בשימוש בהוראה זו בדוגמאות דלהלן:

(1)   COMPUTE TAX = .05 * AMT

(2)  COMPUTE  A = B * C / D

(3)  COMPUTE  NET = AMT - .05 * AMT

יש לשים לב, שלפני סימן השוויון, משמאל, מופיע תמיד שם משתבה, שהוא משתנה התוצאה, בעוד שמימין לסימן השוויון מופיע ביטוי אריתמטי אשר תוצאתו מועברת אל משתנה התוצאה. אם בדוגמא מספר 1 , התוכן   המספרי בשדה AMT היה 200, הרי תוצאת הביטוי האריתמטי200 * .05 = 10, היתה מאוחסנת במשתנה TAX, בעוד שהתוכן הקודם שלו היה נעלם. כל השדות המופיעים בביטוי האריתמטי (מצד ימין שלסימן השוויון) - נשארים בערכם המקורי.

דוגמא 4

COMPUTE  TOTAL  =  AMT1 + AMT2 - AMT3.

תוכן אחרי הביצוע

תוכן אחרי הביצוע

95

100

TOTAL

80

80

AMT1

20

20

AMT2

5

5

AMT3

שדות הנתונים AMT1,AMT2 ו-AMT3 המשתתפים בהוראהCOMPUTE, נשארים ללא שינוי לאחר ביצוע ההוראה. השדה TOTALמקבל את תוצאת הפעולה האריתמטית. ערכו המקורי של השדהTOTAL לפני ביצוע הפעולה אינו משפיע על תוצאת הפעולה. הערך 95 מועבר לשדה הנתונים TOTAL. שדות הנתונים, המופיעים מימין לסימן השוויון בהוראה COMPUTE, יכולים להיות קבועים או משתנים. אין להגדיר את הקבועים במקומות כלשהם בתכנית, אלא יש להשתמש בהם במקומות בהם הם נחוצים; אולם ברור כי שדות נתונים, המשמשים בהוראה לצורכי חישוב, חייבים להיות מוגדרים בחטיבת הנתונים. כל שדות הנתונים, המשתנים והקבועים, המשתתפים בהוראה COMPUTEחיבים להיות נומריים.בהוראה COMPUTE ניתן להשתמש ביותר מאשר פעולה אריתמטית אחת (פעולות חיבור, חיסור, כפל או חילוק). לדוגמא, נוכל לראות כי ההוראה אשר בוצעה בדוגמא 2, שבה מופיעים גם כפל וגם חילוק, ניתן לרשום אותה גם בצורה הבאה.

MULTIPLY  B  BY  C  GIVING  A.

DIVIDE  D  INTO  A.

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

ההוראות ADDSUBTRACTMULTIPLY ו-DIVIDE מקבילות בהתאמה לסימנים +,-,*,/. ניתן לבצע בעזרת הסימנים האריתמטיים גם העלאה בחזקה, תוך שימוש בסימן האריתמטי **. לא קיימת בשפתCOBOL הוראה נפרדת, המקבילה לסימן זה, והמבצעת העלאה בחזקה. הרישום A ** 2. מסמל את הרישום המתמטי A^2 או את הרישום A * A. הסימן A ** 3 מסמל את הרישום המתמטן A^3 או את הרישום A * A * A. לשם מציאת הערך B^4 ולשם הצבת התוצאה בשדה C ההוראה אשר תירשם היא 

COMPUTE C = B ** 4.

כל הסימנים האריתמטיים, המופיעים בהוראת החישוב, חייבים להתנהג לפי חוקי המרווח; כלומר - לכל סימן יש מרווח אחד לפניו ואחד אחריו (כולל סימן השוויון). אם נרצה לכתוב A = B+C+D^2, הרי ב-COBOLיופיעו מרווחים כדלקמן:

COMPUTE  A  =  B  +  C  +  D  **  2

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

  1. הוראה אריתמטית, לדוגמא:

    COMPUTE  SALARY = HRS * RATE
  2. קבוע, לדוגמא

    COMPUTE  TAX  = .05                                       

     

  3. שמות נתונים, לדוגמא:

    COMPUTE  FLDA = FLDB.

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

{שם-נתון} = [ROUNDED] (שם-נתון)ׁCOMPUTE 

קבוע                                                            

ביטוי חשבוני                                             

 

דוגמא 5

(a)  COMPUTE  A  =  B  +  C  +  D

(b)  COMPUTE  A  ROUNDED  =  B  +  C  +  D

       A                  B                     C                     D          

התוכן

PIC

התוכן

PIC

התוכן

PIC

התוכן

PIC

6.84

9V99

2.10

9V99

1.05

9V99

a) 09.9)

99V9
      b) 10.0) 

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

(הוראת הביציע) [ON SIZE ERROR] {שמ-נתון}  (שמ-נתון) COMPUTE

קבוע}                                      

ביטוי חשבוני}                                   

 

דוגמא 6

COMPUTE  A  = 105 -3

בהוראת COMPUTE, אם המשתנה A יהיה מוגדר PICTURE 99, אזי התוצאה המתקבלת תהיה גדולה מדי. התוצאה 102 אינה יכולה להיות מאוחסנת בשדה A. במקרה זה מקוזזות הספרות השמאליות של המספר. התוצאה שתתקבל היא 02. לשם הגנה בפני מצב זה, משתמשים במשפט ON SIZE ERROR, לדוגמא:

COMPUTE  A  =  105  - 3 ON SIZE ERROR  PERFORM  ERROR-RTN.

והתבנית הכללית המושלמת של הוראת החישונ היא:

(הוראת הביציע) [ON SIZE ERROR] {שמ-נתון}  [ROUNDED] (שמ-נתון) COMPUTE

קבוע}                                                          

ביטוי חשבוני}                                                       

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

ADD  1  TO  A.

COMPUTE  A = A  +  1.

ניתן בעזרת ההוראה COMPUTE לרשום ביתר קלות נוסחאות מסויימות. לשם רישום הנוסחה C = A^2 + B^2 , ללא ההוראהCOMPUTE יש לרשום כמות מסויימת של פעולות בודדות, בעוד שבמסגרת ההוראה נרשום:

COMPUTE  C  =  A ** 2  +  B  **  2.

אין הוראה או סימן בשפת COBOL, המבטאים הוצאת שורש ממספר; אולם מבחינה חשבונית ניתן להעלות בחזקה של 1/2 מספר מסויים ולקבל את התוצאה הרצוייה.

מכאן:

SQRT(25)  =  25^.5  = 5

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

COMPUTE  C  =  A  **  .5

סדר ביצוע ההוראות האריתמטיות

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

דוגמא 7

COMPUTE  D = A + B / C

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

a) D = (A+B) / C

b) D = A + (B / C)

ברור, שאלו שתי דרכים, המובילות לתוצאות שונות. אם A = 3,B = 6  ו-C = 3, הרי בדרך הביצוע הראשונה (a) נקבל D = 3, ואילו בדרך הביצוע השניה (b) נקבל D = 5.

 חוקי עדיפות הביצוע

  1. ** חזקה

  2. * (כפל) או / (חילוק) (לפי סדר ההופעה שלהם - מצד שמאל לצד ימין)

  3. + (חיבור) או - (חיסור) (לפי סדר ההופעה שלהם - מצד שמאל לצד ימין).

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

בהתאם לחוקים אלו, ההוראה A = C + D ** 2 תתבצע באופן הבא:

1. בתחילה העלאה בחזקה :D ** 2  = תוצאת החזקה

2. ואח"כ חיבור : תוצאת החזקה + C

כלומר, על פי הביטוי האריתמטי A = C + D^2, ולא A = (C + D)^2, שהוא בניגוד לחוקים הנ"ל. וההוראה COMPUTE  S = T * D + E / Fתתבצע על פי הסדר הבא:

1. בתחילה כפל: T * D

2. אח"כ חילוק:E / F  

3. לבסוף חיבור: (T * D) + (E / F)

כלומר, על פי הביטוי האריתמטי S = T * D + E / F. יש לשים לב, שבהוראה זו יש גם הוראת כפל וגם הוראת חילוק, והן מתבצעות בזו אחר זו, משמאל לימין.

נסתכל כעת, כשאנו יודעים את הקדימויות של סדר הביצוע, על הדוגמא הראשונה, שהיתה כדלהלן: COMPUTE  D = A + B / C. ברור, שהביטוי האריתמטי המתאים הוא D = A + (B / C) (כלומר לפי צורה (b).

כאשר רוצים לשנות את סדר הביצוע בהוראת החישוב, אפשר להשתמש בסוגריים. השימוש בסוגריים מבטל את סדר ביצוע ההוראות, כפי שבא לידי ביטוי בסוג הפעולה המבוצעת. לשם חישוב העךך D = (A + B) / Cניתן להשתמש בהוראה COMPUTE C = A + B / 3 וזאת הואילוהוראה זו מבטאת את החישוב  D = A + (B/C) . לשם חלוקת סכום הערכים של המשתנה A והמשתנה B במספר 3, כפי שרצינו לבצע יש לכתוב את ההוראה הבאה.

COMPUTE  C  = (A + B) / 3

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

1. A + B

2. (A + B) / 3

דוגמא 8

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

C = SQRT( A^2 + B^2)

צורת הכתיבה במקרה זה תהיה: 

COMPUTE  C  ROUNDED = ( A ** 2 + B ** 2) ** .5

דוגמא 9

ברצוננו למצוא, מהו המחיר נטו (NET), אשר נצטרך לשלם, אם מהמחיר המלא (GROSS) ניתנת הנחה (DISCOUNT) מסויימת, שהיא חלק מתוך המחיר המלא. נתון כי גובה ההנחה

DISCOUNT = .03

נתון:

NET = GROSS - DISCOUNT

DISCOUNT = .03 * GROSS

ניתן לרשום את ההוראה COMPUTE כדלקמן:

COMPUTE  NET = GROSS - (.03 * GROSS)

אולם אין חובה להשתמש במקרה זה בסוגריים. ניתן לרשום גם:

COMPUTE  NET = GROSS - .03 * GROSS

שים לב, כי הצורה הפשוטה ביותר תהיה הצורה הבאה:

COMPUTE NET = .97 * GROSS





דדווח על תוכן פוגעני

סמל אישי
מנותק
נשלח ב-27/7/2011 16:17 לינק ישיר 
פרק 10 הוראות תנאי.

א. תנאי פשוט

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

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

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

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

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

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

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

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

תנאי פשוט

a)  IF A IS EQUAL TO B

b)  IF 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, חייבים להיות משתנים מספריים, או אלפאנומריים. בהשוואת ערכים מספריים כל המספרים הבאים, בצורה בה הם רשומים, הינם זהים:

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שימושי רק כשיש לבצע פעולה מסויימת או פעולות מסויימות כשהתנאי אינו מתקיים.

ב. הוראת תנאי 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.




ג. משפטי תנאי לבדיקת סימן, בדיקת אופי ושלילת תנאי

בדיקת סימן

ניתן לבדוק את היחס שבין משתנה כלשהו ובין הקבוע אפס:

{POSITIVE}

    (הוראה/הוראות ביצוע) {IS {NEGATIVE (שם משתנה) IF

    {ZERO}

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

שים לב, שצורת הכתיבה IF A = ZERO מקבילה לצורת הכתיבה

IF A IS ZERO

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

387-

ערך שלילי

387

ערך חיובי

387+

ערך חיובי

הערך אפס עצמו אינו חיובי או שלילי. ניתן לייחס אותו ל"כיוון" חיובי או שלילי, על ידי רישום 0- כרישום שלילי, ו-0+ כרישום חיובי.

דוגמא

ננסה לחשב את ההפרש, שבין ערך המשתנה FIELDA והקבוע המספרי אפס, ללא התחשבות בסימנו החיובי או שלילי של המשתנהFIELDA. לדוגמא, אם FIELDA = 2, הרי ההפרש בינו ובין האפס הוא 2.

אם FIELDA = -2, גם אז ההפרש הוא 2. ערך זה של המשתנהFIELDA, נקרא הערך המוחלט של המשתנה, וסימנו המתמטי :      |FIELDA| לשם פשטות ההסבר נאמר:

אם הערך של FIELDA גדול מאפס או שווה לאפס, אזי הערך המוחלט של FIELDA הוא גם ערכו של FIELDA.

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

לשם מציאת הערך המוחלט של משתנה, ניתן להשתמש בצורת התנאי שלמדנו

דוגמא

MOVE ZERO TO ABSA.

IF FIELDA IS POSITIVE MOVE FIELDA  TO ABSA.

IF FIELDA IS NEGATIVE MULTIPLY -1 BY FIELDA GIVING ABSA.

שים לב, שכתיבת המשפט IF A IS NEGATIVE מקבילה, מבחינת הביצוע, לרישום IF A < 0. ובאופן דומה, אם כותבים IF A IS POSITIVE, הרישום הזה מקביל לכתיבת IF A > 0.

בדיקת אופי

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

צורת הכתיבה, במקרה זה, היא כדלקמן:

{ALPHABETIC}

    (הוראה/הוראות ביצוע) {IS {NUMERIC (שם משתנה) IF

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

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

דוגמא

התו הראשון של רשומה מכיל את כמות הילדים, שיש לעובד מסויים במפעל. עבור כל ילד יקבל העובד 750 שקל. אם לעובד יש יותר מתשעה ילדים, צריך לרשום A במקום עשר, במקום אחת עשרה וכו'. מכפלה רגילה של כמות במחיר תתבצע בקטע CALC-RTN, בעוד שטיפול מיוחד באותיות, המופיעות במקום המספרים, יבוצע בקטעEXCEPTION-RTN. קטע הקידוד הבא מראה את צורת הכתיבה לטיפול במצב זה.

IF NO-OF-DEPTS IS ALPHABETIC

PERFORM EXCEPTION-RTN

ELSE PERFORM CALC-RTN.

שלילת תנאי

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

{GREATER THAN}

    (הוראה/הוראות ביצוע) (שם נתון-2) {IS [NOT] {LESS THAN (שם נתון-1) IF

    {EQUAL TO}

    {ALPHABETIC}

    {NUMERIC}

    {POSITIVE}

    {NEGATIVE}

    {ZERO}

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

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

IF A = B PERFORM RTNX ELSE PERFORM RTNY.

IF A IS NOT EQUAL TO B PERFORM RTNY 

ELSE PERFORM RTNX.

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

אולם אם נרצה לשאול IF A IS NOT NEGATIVE הרי שבהיפוך השאלה IF A IS POSITIVE - לא נקבל את אותה משמעות שרצינו, וזאת מאחר שאם A = 0, לא נקבל תשובה חיובית בשתי הדוגמאות.

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

IF B IS NEGATIVE PERFORM RTNZ 

ELSE PERFORM RTNQ.

IF B IS NOT POSITIVE PERFORM RTNZ 

ELSE PERFORM RTNQ.

נניח ש-B =0 . על פי ההוראה הראשונה, קטע התכנית שיתבצע יהיהRTNQ. על פי ההוראה השנייה, קטע התכנית שיתבצע יהיה RTNZ. באופן דומה נראה כי אם נכתוב:

IF A IS NOT ALPHABETIC

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

IF C IS NOT ALPHABETIC PERFORM RTNP ELSE PERFORM RTNV.

IF C IS NUMERIC PERFORM RTNP ELSE PERFORM RTNV.




ד. תנאי מורכב

כדי להפיק תכניות יעילות, אין להסתפק בידיעה פשוטה של חוקי כתיבת ההוראות בשפת התכנות, שבה אנו כותבים. אנו חייבים להשתמש בחוקים אלה, לשם מתן פתרון לסוגים שונים של בעיות לוגיות, המתעוררות במהלך תכנון התכנית. הוראות התנאי, כפי שלמדנו עד כה, נותבות בידנו כלי לפתרון בעיות מסוגים שונים, על ידי הצגת תנאים וביצוע הוראות בהתאם. התנאי המורכב נותן להוראת 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 = BC = 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.

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

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

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

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





דדווח על תוכן פוגעני

סמל אישי
מנותק
נשלח ב-27/7/2011 16:25 לינק ישיר 
פרק 11 רישומים נוספים בחטיבת הנתונים ושגרות לבדיקת תקינות.

א. זיהוי שמות

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

כזכור לך, שמות הקבצים ושמות הרשומות בתכנית COBOL חייבים להיות ייחוד''ם (unique). אם XXX הוא שמו של קובץ, המוגדר בפסוקSELECT בחטיבת הסביבה (ENVIRONMENT DIVISION) ומתואר על ידי היישום FD בחטיבת הנתונים, אזי אותו שם, XXX, אינו ניתן לשימוש להגדרת שדות, שטחי עבודה או שמות סעיפים. באופן דומה, פריטי אחסון עצמאיים לעבודה חייבים לקבל שמות ייחודיים. יחד עם זאת, שמות שסופקו על ידי המתכנת, המגדירים שדות-נתונים בתוך רשומות, אינם חייבים להיות ייחודיים. לדוגמא, רישומים אלה בחטיבת הנתונים, הם תקינים:

FD  FILE-IN  LABEL RECORDS ARE OMITTED 

DATA RECORD IS REC-IN.

01 REC-IN.

02 NAME  PIC  A (10).

02 AMT  PIC  9 (5).

02 CDE  PIC  X (5).

02 FILLER  PIC  X (60).

FD  FILE-OUT  LABEL RECORDS ARE STANDARD 

DATA RECORD IS REC-OUT.

01 REC-OUT.

02 NAME  PIC  A (10).

02 AMT  PIC  9 (5).

02 CDE  PIC  X (5).

FILE-IN ו-FILE-OUT, כשמות של קבצים, חייבים להיות ייחודיים. באופן דומה REC-IN ו-REC-OUT, כשמות של רשומות, אף הם חייבים להיות ייחודיים. אולם NAMEAMT ו-CDE, שהם שדות-נתונים בתוך רשומות, אינם חייבים להיות ייחודיים; כלומר, ניתן להשתמש בהם להגדרת יותר מאזור אחד של אחסנה. בחטיבת-הביצוע - כאשר מגיעים לשם-נתונים שאינו ייחודי, שם זה חייב להיות מזוהה (qualified). עלינו לציין לאיזו רשומה יש לגשת. איננו יכולים לומר, לדוגמה: ADD AMT TO  TOTAL, מאחר ש-AMT הוא שמם של שני שדות-נתונים שונים, ואין זה ברור איזה מהם יש לחבר. כאשר ליותר משדה אחד באחסנה יש אותו שם, אנו מזהים את השם בחטיבת הביצוע באופן הבא:

} שם רשומה}   [OF]  ( שם נתונים)

}  פריט מקובץ }           [ON]

 

דוגמאות

1.  ADD AMT IN FILE-IN  TO  TOTAL.

2.  MOVE  NAME  IN  FILE-IN  TO  NAME  IN  FILE-OUT.

3.  IF  NAME  IN  FILE-IN  =  SPACES  

THEN  MOVE  'MISSING'  TO  NAME  IN FILE-OUT.

בכל פעם, שבחטיבת הנתונים משתמשים באותו שם יותר מפעם אחת, עלינו לזהותו בשעת עיבודו בחטיבת הביצוע. מילות המפתח OFINמשמשות לזיהויו של שם, וניתנות להחלפה זו בזו. שיטה זו של שימוש באותו שם-נתונים להגדרת כמה שדות ברשומות נבדלות, הוא מכשיר-תכנות שימושי. אם משתמשים בזיהוי שמות, רישומים בחטיבת-הביצוע נעשים קלים יותר להבנה לקורא התכנית, וקלים יותר לניפוי משגיאות על ידי המתכנת, האמירה MOVE  AMT  IN  REC-IN  TO  AMT  IN  REC-OUT.היא, יחסית, פשוטה להבנה. האמירה MOVE  AMT1  TO  AMT2., שבה AMT1 ו-AMT2 הם שדות המוגדרים באופן ייחודי באיזורי הקלט והפלט, בהתאמה, היא פחות ברורה. למרות שהאחרונה כרוכה בפחות כתיבה, על הקורא לבדוק את רישומי חטיבת הנתונים כדי לקבוע איזה איזור באחסנה מועבר, ואיזה שדה יקבל את הנתונים. כלומר, מיקומם של AMT1 ו-AMT2 באחסנה אינו ברור. מזהים מבהירים באופן מוחלט, ששדות הכמות (AMT) הם חלק מרשומות הקלט והפלט. כאשר רשומה מכילה כמה שדות שיש להציב ברשומה אחרת, נוכל להשתמש בשמות-שדה זהים בשילוב עם הוראת MOVE  CORRESPONDING, כמתואר בפרק 7. בדרך זו, זיהוי השמות בחטיבת הביצוע אינו דרוש כלל.לא פעם נתקשה לעקוב אחרי לוגיקה של תכנית, אם ניתוחה דורש התייחסות בלתי-פוסקת לחטיבת הנתונים. בעזרת הזיהוי השמות, ייקל עלינו לעקוב אחר הרישומים בחטיבת הביצוע. שדה ניתן לזיהוי על ידי שימוש ב-OFאו ב-ON יחד עם שם הרשומה או כל פריט קבוצתי:

01  REC-1.

02  CODEX.

03  SEX  PIC  X.

03  MARITAL-STATUS  PIC  X.

03  AGE  PIC  99.

מכאן שניתן להשתמש ב-JUSTIFIED RIGHT בחטיבת הנתונים כדי לשנות את הכללים המקובלים של פעולות הצבה אלפאנומריות. באופן רגיל שדות אלפאנומריים מיושרים לשמאל; שימוש בפסוק דלעיל, בשדה אלפאנומרי, יגרום לכך, שנתונים המכילים פחות תווים מהשדה המקבל יוצבו במקומות הימניים ביותר של השדה, וכל המקומות בעלי הערך הגבוה שלא מולאו ימולאו ברווחים. המשפט JUSTIFIED RIGHT ניתן לשימוש עבור כל שדה אלמנטרי (יסודי) לא-מספרי. פסוק זה יימצא לאחר הגדרת ה-PICTURE, ולאחר שהערך ההתחלתי - VALUE, אם קיים, ייקבע.

ההוראה MOVE 'C'  TO  FLD1., כאשר FLD1 מוגדר על פי התבנית:

FLD1  PIC  XXX  JUSTIFIED RIGHT , תציב __C ב-FLD1. כלומר, השימוש ,במשפט JUSTIFIED RIGHT מביא לכך, שכל VALUE שניתן לשדה, או כל נתון המוצב בשדה, לא יצייתו לכללים האלפאנומריים הרגילים. במקום זאת, כל הנתונים, שיוצבו בשדה, יהיו מיושרים לימין. לעתים קרובות משתמשים במשפט JUSTIFIED RIGHT באזור הדפסה (PRINT  AREA). נגדיר רשומת הדפסה כך:

01 PRINT-REC.

  02 FILLER  PIC  X(61).

  02 HEADER   PIC  X(12).

  02 FILLER  PIC  X(60).

בחטיבת הביצוע נקודד את ההוראות הבאות:

MOVE  SPACES TO  PRINT-REC.

MOVE 'COMPANY AMDOCS'  TO  HEADER.

WRITE  PRINT-REC.

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

01  PRINT-REC.

02  HEADER  PIC  X(73)  JUSTIFIED RIGHT.

02   FILLER  PIC  X(60).

השימוש באותה חטיבת-ביצוע כמו קודם, יביא לתוצאות זהות לקודמות.COMPANY AMDOCS ימוקם ב-12 המקומות הימניים ביותר שלHEADER, בהשאירו 60 מקומות מסדר גבוה, או שמאליים, ריקים. כך הגדרנו את רשומתנו עם שני שדות במקום שלושה. המשפטJUSTIFIED RIGHT משנה את הכללים הרגילים של פעולות הצבה אלפאנומריות. לכן משפט זה אינו ניתן לשימוש בהקשר לשדות בעלי הגדרת PICTURE מספריים (נומריים), מאחר ששדות כאלה ממילאתמיד מיושרים לימין.

אם שם-הנתונים SEX מוגדר כמה פעמים בחטיבת הנתונים, ניתן להגיע אל השדה SEX, שמתואר לעיל כך:

SEX  IN  REC-1

או

SEX  IN  CODEX

 סדר מודרג של ביצוע התנאים הנ"ל.

סיכום

  1. שמות קבצים, שמות רשומות, ושמות-נתונים באזור האיחסון לעבודה ברמה 77 - חייבים להיות ייחודיים, כלומר לשמש לקובץ אחד או לרשומה אחת.

  2. שמות, המגדירים שדות-נתונים בתוך רשומה, אינם חייבים להיות ייחודיים.

  3. אותו שם יכול להגדיר אזורים שונים בחטיבת הנתונים.

  4. יחד עם ואת, בכל פעם שניגשים לשדות אלה בחטיבת-הביצוע, חייבים לזהותם.

  5. התבנית, המשמשת לזיהויו של שדה, היא:                           

    שם רשומה}   [OF]  ( שם נתונים)

    }  פריט מקובץ }           [ON]




ב. המשפט: JUSTIFIED RIGHT - מיושר לימין

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

01  WORK-AREAS.

02  ******  PIC  X(8)  VALUE  'ABC'.

רישום זה מבצע אותה פעולה כמו MOVE 'ABC'  TO  ******, בו****** חסר פסוק VALUE. מאחר שאורכו של הנתון-המפורש הוא 3 תווים והשדה מוגדר כבעל 8 תווים, 'ABC' ייושר לשמאל השדה. עליך לזכור שכאשר השדות או הנתונים המפורשים הנשלחים הם קטנים מן השדות המקבלים בפעולות-הצבה (MOVE) אלפאנומריות, הנתון ייושר לשמאל השדה המקבל והמקומות בעלי הערך הנמוך (מימין) ממולאיםברווחים. על כן, תוכנו של המשתנה ******, לדוגמה, יהיהABC~~~~~  (מרווח אחד = ~). לצורך שימושים מסויימים, בעיקר בהצבה של אותיות עבריות, רצוי, לפעמים שהנתון בשדה יהיה מיושר לימין. כלומר, היינו רוצים לקבל ב~~~~~ABC :******. 

המשפט JUSTIFIED RIGHT, בו נשתמש בחטיבת-הנתונים, ייתן את התוצאה הדרושה. ניתן להגדיר את ****** כך:

02  ******  PIC  X(8)  VALUE  'ABC'  JUSTIFIED  RIGHT.




ג. המשפט REDEFINES

לעיתים דרוש להגדיר שדה יחיד בחטיבת הנתונים, נשני אופנים שונים או יותר. אם אותו אזור צריך לשמש למטרות שונות, אנו חייבים להגדירו בתבנית נוספת (REDEFINE) בחטיבת הנתונים.

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

FD FILE1 LABEL RECORDS ARE OMITTED,

DATA RECORDS ARE DB-REC, CR-REC.

01 DB-REC.

02 NAME  PIC X(10).

02 ADDRESS-1  PIC X(15).

02 UNIT-PRICE  PIC 9(5).

02 QTY  PIC 9(5).

02 FILLER  PIC X(44).

02 CODE-X  PIC 9.

01 CR-REC.

02 NAME  PIC X(10).

02 ADDRESS-1  PIC X(15).

02 AMT-OF-CREDIT  PIC 999V99.

02 QTY  PIC 9(5).

02 FILLER  PIC X(44).

02 CODE-X  PIC 9.

יצויין, כי שתי הרשומות תופסות את אותו אזור אחסנה (storage area) בן 80 המקומות. הרשומה הראשונה מפרטת את מאפייני השדה; הרשומה השניה מגדירה, בפשטות, מחדש את אותו אזור, תוך שימוש במאפיינים משלה. בחטיבת הביצוע נוכל לבדוק את CODE-X: אם ערכו 1 , נשתמש בתבנית של DB-REC; אם ערכו 0, נשתמש בתבנית של CR-REC. ניתן בCOBOL לפשט את תיאור הרשומה (File Deion) הנ''ל, על ידיהגדרת תבנית רשומה אחת בלבד, תוך הגדרה-מחדש של האזור היחידי, המשתנה בהתאם לצופן CODE-X.

FD FILE1 LABEL RECORDS ARE OMITTED,

DATA RECORDS ARE DB-REC, CR-REC.

01 DB-REC.

02 NAME  PIC X(10).

02 ADDRESS-1  PIC X(15).

02 UNIT-PRICE  PIC 9(5).

02 AMT-OF-CREDIT REDEFINES UNIT-PRICE PIC 999V99.

02 QTY  PIC 9(5).

02 FILLER  PIC X(44).

02 CODE-X  PIC 9.

משפט REDEFINES בחטיבת הנתונים מאפשר לכותב התכנית להשתמש במאפיינים שונים בהגדדת שדה אחסנה אחד:

 

שם-נתונים 1

מספר רמה

9(5)

PIC

UNIT-PRICE

02

שם-נתונים 1

שם-נתונים 2

מספר רמה זהה

999V99

PIC

UNIT-PRICE

REDEFINES

AMT-OF-CREDIT

02

בתיאור דלעיל,UNIT-PRICE ו-AMT-OF-CREDIT. מתייחסים שניהם לאותם חמישה מקומות-אחסנה. בחטיבת הביצוע - נבדוק את תוכנו שלCODE-X. אם CODE-X = 1, נשתמש ב-UNIT-PRICE כשם לשדה שלם בעל חמישה המקומות. אם 0 = CODE-X, נשתמש ב-AMT-OF-CREDIT. כשם לשדה עם שלושה מקומות לחלק השלם, ושני מקומות לשבר עשרוני.

IF CODE-X = 1 

MULTIPLY  UNIT-PRICE  BY  QTY  GIVING  TOTAL  IN  OUT-REC.

IF  CODE-X = 0 

MOVE  AMT-OF-CREDIT  TO  TOTAL  IN  OUT-REC.

ניתן להשתמש במשפט REDEFINES בכל רמה שבין 02-49. לא ניתן להשתמש בו ברמה 01  בקטע הקבצים, מאחר שרשומות בתוך קובץ אמורות לספק הגדרה מחדש של שטח פיזי בזכרון באופן אוטומטי. לעומת זאת, ניתן להשתמש בו ברמה 01 בקטע האחסון-לעבודה.

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

דוגמא 1

02  FLD1.

03  FLD1A  PIC  X(5).

03  FLD1B  PIC  99.

02  FLD2  REDEFINES  FLD1  PIC  X(7).

 

דוגמא 2

02  FLDX  PIC  X(7).

02  FLDY  REDEFINES  FLDX.

03  FLDY1  PIC  X(5).

03  FLDY2  PIC  99.

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

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

לא תקין

02  ITEM1  PIC  99.

02  ITEMX  REDEFINES  ITEM1   PIC  XX  VALUE '12'.

יצויין, בכל זאת, שהרישום המקורי ברמה 02, מותר לו להכיל משפטVALUE:

תקין

02  ITEM1  PIC  99 VALUE 12.

02  ITEMX  REDEFINES  ITEM1   PIC  XX.

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

 

 

 

FD  FILE-IN  LABEL RECORDS ARE OMITTED 

DATA RECORD IS REC-IN.

01 REC-IN.

02 NAME  PIC  A (10).

02 AMT  PIC  9 (5).

02 CDE  PIC  X (5).

02 FILLER  PIC  X (60).

FD  FILE-OUT  LABEL RECORDS ARE STANDARD 

DATA RECORD IS REC-OUT.

01 REC-OUT.

02 NAME  PIC  A (10).

02 AMT  PIC  9 (5).

02 CDE  PIC  X (5).

FILE-IN ו-FILE-OUT, כשמות של קבצים, חייבים להיות ייחודיים. באופן דומה REC-IN ו-REC-OUT, כשמות של רשומות, אף הם חייבים להיות ייחודיים. אולם NAMEAMT ו-CDE, שהם שדות-נתונים בתוך רשומות, אינם חייבים להיות ייחודיים; כלומר, ניתן להשתמש בהם להגדרת יותר מאזור אחד של אחסנה. בחטיבת-הביצוע - כאשר מגיעים לשם-נתונים שאינו ייחודי, שם זה חייב להיות מזוהה (qualified). עלינו לציין לאיזו רשומה יש לגשת. איננו יכולים לומר, לדוגמה: ADD AMT  TO TOTAL, מאחר ש-AMT הוא שמם של שני שדות-נתונים שונים, ואין זה ברור איזה מהם יש לחבר. כאשר ליותר משדה אחד באחסנה יש אותו שם, אנו מזהים את השם בחטיבת הביצוע באופן הבא:

} שם רשומה}   [OF]  ( שם נתונים)

}  פריט מקובץ }           [ON]

 

דוגמאות

1.  ADD AMT IN FILE-IN  TO  TOTAL.

2.  MOVE  NAME  IN  FILE-IN  TO  NAME  IN  FILE-OUT.

3.  IF  NAME  IN  FILE-IN  =  SPACES  

THEN  MOVE  'MISSING'  TO  NAME  IN FILE-OUT.

בכל פעם, שבחטיבת הנתונים משתמשים באותו שם יותר מפעם אחת, עלינו לזהותו בשעת עיבודו בחטיבת הביצוע. מילות המפתח OFINמשמשות לזיהויו של שם, וניתנות להחלפה זו בזו. שיטה זו של שימוש באותו שם-נתונים להגדרת כמה שדות ברשומות נבדלות, הוא מכשיר-תכנות שימושי. אם משתמשים בזיהוי שמות, רישומים בחטיבת-הביצוע נעשים קלים יותר להבנה לקורא התכנית, וקלים יותר לניפוי משגיאות על ידי המתכנת, האמירה MOVE  AMT  IN  REC-IN  TO  AMT  IN  REC-OUT.היא, יחסית, פשוטה להבנה. האמירה MOVE  AMT1  TO  AMT2., שבה AMT1 ו-AMT2 הם שדות המוגדרים באופן ייחודי באיזורי הקלט והפלט, בהתאמה, היא פחות ברורה. למרות שהאחרונה כרוכה בפחות כתיבה, על הקורא לבדוק את רישומי חטיבת הנתונים כדי לקבוע איזה איזור באחסנה מועבר, ואיזה שדה יקבל את הנתונים. כלומר, מיקומם של AMT1 ו-AMT2 באחסנה אינו ברור. מזהים מבהירים באופן מוחלט, ששדות הכמות (AMT) הם חלק מרשומות הקלט והפלט. כאשר רשומה מכילה כמה שדות שיש להציב ברשומה אחרת, נוכל להשתמש בשמות-שדה זהים בשילוב עם הוראת MOVE  CORRESPONDING, כמתואר בפרק 7. בדרך זו, זיהוי השמות בחטיבת הביצוע אינו דרוש כלל.לא פעם נתקשה לעקוב אחרי לוגיקה של תכנית, אם ניתוחה דורש התייחסות בלתי-פוסקת לחטיבת הנתונים. בעזרת הזיהוי השמות, ייקל עלינו לעקוב אחר הרישומים בחטיבת הביצוע. שדה ניתן לזיהוי על ידי שימוש ב-OFאו ב-ON יחד עם שם הרשומה או כל פריט קבוצתי:

01  REC-1.

02  CODEX.

03  SEX  PIC  X.

03  MARITAL-STATUS  PIC  X.

03  AGE  PIC  99.

מכאן שניתן להשתמש ב-JUSTIFIED RIGHT בחטיבת הנתונים כדי לשנות את הכללים המקובלים של פעולות הצבה אלפאנומריות. באופן רגיל שדות אלפאנומריים מיושרים לשמאל; שימוש בפסוק דלעיל, בשדה אלפאנומרי, יגרום לכך, שנתונים המכילים פחות תווים מהשדה המקבל יוצבו במקומות הימניים ביותר של השדה, וכל המקומות בעלי הערך הגבוה שלא מולאו ימולאו ברווחים. המשפט JUSTIFIED RIGHT ניתן לשימוש עבור כל שדה אלמנטרי (יסודי) לא-מספרי. פסוק זה יימצא לאחר הגדרת ה-PICTURE, ולאחר שהערך ההתחלתי - VALUE, אם קיים, ייקבע.

ההוראה MOVE 'C'  TO  FLD1., כאשר FLD1 מוגדר על פי התבנית:

FLD1  PIC  XXX  JUSTIFIED RIGHT , תציב __C ב-FLD1. כלומר, השימוש ,במשפט JUSTIFIED RIGHT מביא לכך, שכל VALUE שניתן לשדה, או כל נתון המוצב בשדה, לא יצייתו לכללים האלפאנומריים הרגילים. במקום זאת, כל הנתונים, שיוצבו בשדה, יהיו מיושרים לימין. לעתים קרובות משתמשים במשפט JUSTIFIED RIGHT באזור הדפסה (PRINT  AREA). נגדיר רשומת הדפסה כך:

01 PRINT-REC.

  02 FILLER  PIC  X(61).

  02 HEADER   PIC  X(12).

  02 FILLER  PIC  X(60).

בחטיבת הביצוע נקודד את ההוראות הבאות:

MOVE  SPACES TO  PRINT-REC.

MOVE 'COMPANY AMDOCS'  TO  HEADER.

WRITE  PRINT-REC.

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

01  PRINT-REC.

02  HEADER  PIC  X(73)  JUSTIFIED RIGHT.

02   FILLER  PIC  X(60).

השימוש באותה חטיבת-ביצוע כמו קודם, יביא לתוצאות זהות לקודמות.COMPANY AMDOCS ימוקם ב-12 המקומות הימניים ביותר שלHEADER, בהשאירו 60 מקומות מסדר גבוה, או שמאליים, ריקים. כך הגדרנו את רשומתנו עם שני שדות במקום שלושה. המשפטJUSTIFIED RIGHT משנה את הכללים הרגילים של פעולות הצבה אלפאנומריות. לכן משפט זה אינו ניתן לשימוש בהקשר לשדות בעלי הגדרת PICTURE מספריים (נומריים), מאחר ששדות כאלה ממילאתמיד מיושרים לימין.

אם שם-הנתונים SEX מוגדר כמה פעמים בחטיבת הנתונים, ניתן להגיע אל השדה SEX, שמתואר לעיל כך:

SEX  IN  REC-1

או

SEX  IN  CODEX

 סדר מודרג של ביצוע התנאים הנ"ל.

סיכום

  1. שמות קבצים, שמות רשומות, ושמות-נתונים באזור האיחסון לעבודה ברמה 77 - חייבים להיות ייחודיים, כלומר לשמש לקובץ אחד או לרשומה אחת.

  2. שמות, המגדירים שדות-נתונים בתוך רשומה, אינם חייבים להיות ייחודיים.

  3. אותו שם יכול להגדיר אזורים שונים בחטיבת הנתונים.

  4. יחד עם ואת, בכל פעם שניגשים לשדות אלה בחטיבת-הביצוע, חייבים לזהותם.

  5. התבנית, המשמשת לזיהויו של שדה, היא:                           

    שם רשומה}   [OF]  ( שם נתונים)

    }  פריט מקובץ }           [ON]





דדווח על תוכן פוגעני

סמל אישי
מנותק
נשלח ב-27/7/2011 16:30 לינק ישיר 

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



דדווח על תוכן פוגעני

סמל אישי
מנותק
   
בית > פורומים > אינטרנט ומחשבים > למתכנתים שבינינו > לימוד שפת קובול - COBOL:
מנהל לחץ כאן לנעילת האשכול
הוסף לעמוד האישי  דווח למנהל שלח לחבר

bholext