| נשלח ב-27/7/2011 15:27 |
|
| |
לימוד שפת קובול - COBOL:
פרק 1 מבוא לתכנות 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). להלן רשימה של כמה ממטרותיה של שיטה זו. לפשט את תהליך ניפוי השגיאות (DEBUGGING). להקל על קידוד של בעיות ארוכות וסבוכות. לייעל את התכניות. להקל קריאת תכניות והבנתן.
|
שיטות מקובלות בתכנות מבני רוב התכניות שאינן מבניות, כוללות נקודות הסתעפות רבות, אשר, לעתים קרובות, מקשות את המעקב אחר הלוגיקה של התכנית; וכאשר קיימת תקלה בתכנית ניפוי השגיאות קשה יותר. מטרה עיקרית אחרת של התכנות המבני היא לפשט את ניפוי השגיאות ע"י הקטנת מספר נקודות הכניסה והיציאה מהתכנית. מסיבה זו מתייחסים לפעמים לתכנות מבני כאל תכנות חסר הוראת 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 עד 30 תווים. יכולים להכיל אותיות, ספרות ומקפים (-) בלבד. שם אינו יכול להתחיל או להסתיים במקף. האותיות, הספרות והמקפים חייבים להיות רצופים, ללא מרווחים ביניהם. חייב להכיל לפחות תו אלפאביתי אחד. אין לתת שם לנתון, שהוא זהה למלה שמורה ב-COBOL, כלומר מלה שיש לה משמעות מסויימת עבור המהדיר של COBOL.
| DATE-IN | NAME | LAST-NAME | AMOUNT1 | AMOUNT-OF-TRANSACTION |
|
דוגמאות לשמות בלתי-חוקיים |
השם | הסיבה לאי-חוקיותו |
|---|
| EMPLOYEE NAME | קיים רווח בין EMPLOYEE ל-NAME. | | DISCOUNT-% | התו % הוא תו מיוחד ולכן בלתי חוקי בשם. | | INPUT | היא מלה שמורה ב-COBOL. | | 123 | שם נתון ב-COBOL חייב להכיל לפחות אות אחת . |
|
קבועים מספריים קבוע מספרי הוא קבוע המוגדר בחטיבת הביצוע (PROCEDURE DIVISION) ומשמש לביצוע פעולות אריתמטיות. חוקים לכתיבת קבועים מספריים |
ניתן לרשום עד 18 ספרות. ניתן לרשום סימן חיובי (+) או שלילי (-) משמאל למספר. ניתן לרשום נקודה עשרונית בתוך הקבוע. אסור לנקודה עשרונית זו להיות התו האחרון בקבוע.
| שים לב, שהסימן חיובי או שלילי אינו חייב להופיע כחלק מן הקבוע, אך יכול להופיע. אם הסימן כלול בקבוע, עליו להופיע משמאל למספר. כלומר המספריס 16+ או 12- הינם קבועיס מספריים חוקיים,אך +16 או -12 אינם חוקיים. אם אין סימן משמאלו של המספר, המספר ייחשב חיובי. מאחר שנקודה עשרונית אינה יכולה להופיע כתו אחרון, הקבוע המספרי 18.2 הינו קבוע מספרי חוקי, בעוד .16 אינו כזה. עם זאת, 16.0 הינו קבוע מספרי חוקי. המספרים הבאים הינם קבועים מספריים חוקיים, שיכולים להופיע בחטיבת הביצוע של תכנית COBOL : נניח שברצוננו להוסיף 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. קבועים מספריים הם בעלי ערך מספרי קבוע, שמשתמשים בו לפעולות חשבוניות. יש להשתמש בחוקים שצויינו לעיל, כאשר מגדירים קבוע מספרי. קבועים שאינם מספריים קבוע שאינו מספרי הינו קבוע, שמשתמשים בו לחטיבת הביצוע לכל מטרה, מלבד ביצוע פעולות אריתמטיות. יש להשתמש בחוקים הבאים, כאשר מגדירים קבוע שאינו מספרי. חוקים לכתיבת קבועים לא מספריים |
הקבוע חייב להיות 'סגור' בין שני סימני ציטוט. כמות התווים בקבוע לא תעלה על 120 תווים, כולל מרווחים. ניתן .ולבנמש בכל סימן במערכת הסימנים של 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. המלה AUTHOR (שם המחבר), שהיא שם סעיף בתכנית, חייבת להתחיל במרווח A. לאחריה ניתן לשים כל מידע שהוא במרווח B. | | | 28 | | | | 24 | | | | 20 | | | | 16 | | | | 12 | | | | 8 | 7 | | | . | N | A | M | R | E | H | S | | Y | R | E | L | A | V | | . | R | O | H | T | U | A | | |
יתן לשים את האות A של המלה AUTHOR בטור 8 או במרווח A. המלה עצמה, עם זאת, ממשיכה אל תוך התחום של מרווח B . המידע המוכנס לאחר המלה AUTHOR, חייב להתחיל במרווח B, או אחרי טור 11 .בדוגמה שלנו, מתחילה ההצהרה הבאה בטור 16. |
תכניות COBOL מתחלקות לחטיבות (DIVISIONS). לחטיבות אלה שמות קבועים: IDENTIFICATION (זיהוי); ENVIRONMENT (סביבה); DATA (נתונים) ו-PROCEDURE (ביצוע). על חטיבות אלה להופיע תמיד ובסדר זה, בכל תכנית. ניתן לחלק כל חטיבה לקטעים (SECTIONS). לדוגמה, חטיבת הנתונים, המתארת את כל שטחי האחסון בהם משתמשת התכנית, מתחלקת לשני קטעים: FILE SECTION (קטע קבצים) ו WORKING-STORAGE SECTION (קטע אחסון לעבודה). כל קטע ניתן לחלוקה לסעיפים (PARAGRAPHS). כל יתר המשפטים, הכתובים בתכנית COBOL נחשבים הוראות (STATEMENTS). חטיבות, סעיפים, שמות קטעים וFD- יתחילו במרווח A. כל שאר המשפטים וההוראות יתחילו במרווח 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 מפורטים: |
יצרן המחשב. מספר המחשב. דגם המחשב (אינו הכרחי).
|
ב. קטע קלט-פלט (INPUT-OUTPUT SECTION) |
קטע הקלט פלט של חטיבת הסביבה בא לאחר קטע הרכב המערכת, ומספק מידע על יחידות הקלט/פלט, בהם משתמשת התכנית. בפרק זה נדון בסעיף בקרת הקבצים (FILE-CONTROL) של קטע הקלט-פלט. בסעיף זה מוקצב שם לכל יחידה, בה תשתמש התכנית. סעיף בקרת הקבצים מורכב ממשפטי SELECT. כל משפט SELECT מגדיר שם קובץ, ומשייך אליו יחידת קלט או פלט. עיצוב המשפט נראה כך: (פירוט היחידה) ASSIGN TO (שם קובץ) SELECT |
שמות קבצים על שמות הקבצים, הניתנים לכל יחידה, להיות כתובים בהתאם לכללי כתיבת שמות בידי המתכנת: 1 עד 30 תווים. ללא סימנים מיוחדים, פרט למקף. ללא רווחים בתוך שם הקובץ. תו אלפאביתי אחד לפחות - בהתחלה. יש לתת שמות בעלי משמעות.
|
בנוסף להתאמה לכללים אלה, על שם הקובץ להיות ייחודי: אין לתת אותו השם לכל מבנה נתונים אחר בתכנית. לכל יחידה, בה אנו משתמשים בתכנית - חייב להתאים משפט SELECT בתכנית הדורשת תנועות מוקלדות כקלט, ומדפיסה דו"ח כפלט, יפורטו שני משפטי SELECT: שם-קובץ אחד יינתן לקובץ התנועות, ושם אחר יינתן לקובץ ההדפסה.
 |
|
|
|
|
| נשלח ב-27/7/2011 15:34 |
|
| |
פרק 5 - חטיבת הנתונים (DATA DIVISION)
א. קטע הקבצים (FILE SECTION) |
חטיבת הנתונים (DATA DIVISION) חטיבת הנתונים בתכנית COBOL הינה החטיבה, המתארת ומגדירה את שדות הנתונים בשטח האחסון. יש להגדיר כל שטח אחסון, הדרוש לעיבוד הנתונים, באחד משני הקטעים, FILE SECTION (קטע קבצים) או WORKING-STORAGE SECTION (קטע שטח-אחסון לעבודה). כל תכנית, הקוראת נתונים כקלט ומייצרת נתוני פלט, זקוקה לקטע קבצים, כדי לתאר את הקלט והפלט. מאחר שכל תכנית מחשב קוראת נתונים, מעבדת אותם ויוצרת פלט, הפך קטע הקבצים לחלק הכרחי בכל תכנית. בהמשך נראה, כי קטע שטח-האחסון לעבודה הוא הקטע, בו מגדירים שדות, שאינם חלק משטחי אחסון הקלט או הפלט. קטע הקבצים (FILE SECTION) קטע הקבצים, כפי שרומז שמו, הוא הקטע המתאר את כל קובצי הקלט והפלט בהם משתמשת התכנית. קבצים אלה כבר הוגדרו בחטיבת הסביבה, בפקודות SELECT, המקצות שם לכל קובץ אשר הוגדר, ומשייכות אליו יחידת קלט-פלט. חטיבת הנתונים יכולה להיות מורכבת מ-3 קטעים |
FILE SECTION (קטע הקבצים) - המגדיר את כל שטחי האחסון, שהם חלק מקובצי הקלט או הפלט. WORKING-STORAGE SECTION (קטע שטחי-אחסון לעבודה) . מקצה זיכרון במחשב לשדות שאינם חלק מהקלט או הפלט, אך בכל זאת דרושים לעבודת התכנית. כחלק מהגדרה זו נמצאים קבועים, שטחי עבודה, שטחי החזקה זמבית של נתונים (HOLD AREAS) וכוי. 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 . אין לכתוב נקודה, אלא בסוף כל חלקי ההוראה. כללים לכתיבת שמות תיאורי הרשומה |
יש לרשום את FD במרוווז A. שאר הרישומים ירשמו במרווח B . אין לרשום נקודה עד למשפט האחרון. מותר לרשום פסיק בין משפט אחד לשני. אם נרשם פסיק הוא חייב להיות לפני מרווח אחד לפחות. כל משפט יכול להרשם בשורה נפרדת או לחילופין כרצף בשורה אחת, אולם ברור כי קריאת הנתונים בהירה יותר אם כל משפט נכתב בשורה נפרדת.
|
תוקן על ידי אנוני_מוס ב- 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 |
הרשומה הראשונה בקובץ אינה רשומת נתונים, אלא תווית רשומה התחלתית תקנית , בת 80 תווים. באופן דומה, הרשומה האחרונה הינה תווית רשומה סופית . בקובצי קלט - על המחשב לבדוק תוויות אלה, ובקובצי פלט ' על המחשב לייצרן.
|
אף על פי שאין צורך בהוראות COBOL נוספות כדי לבצע את השגרות לטיפול בתוויות רשומה, יש לספק גם הוראת בקרה בזמן ביצוע התכנית. הוראות בקרה אלו כוללות את המידע, הדרוש עבור התווית. המשפט LABEL RECORDS ARE STANDARD יכול להופיע רק עבור קובצי סרט מגנטי או קובצי גישה ישירה. ביחידות קלט פלט בעלות רשומת יחידה - אין אנו משתמשים בתוויות רשומה, מאחר שאינפורמציה מסוג זה אינה דרושה עבור קבצים, המאוהסנים ביחידות קלט פלט בעלי אורך רשומה קבוע ובלתי ניתן לשינוי. לקובצי רשומות-יחידה - יש להשתמש במשפט: .LABEL RECORDS ARE OMITTED |
באופן דומה, יש לכתוב לפעמים גם בקובצי סרט מגנטי או בגישה ישירה, כאשר אנו בטוחים, שאין צורך לבדוק אם מדובר בקובץ הנכון. במקרה כזה, לא ייבדקו ולא ייכתבו תויות רשומה. המשפט, המטפל בתוויות הרשומה, הוא הכרחי בכל תיאור קובץ (FD). ככלל, יש לציין כותרות 'STANDARD' עבור קובצי סרט מגנטי או תקליט. המשפט LABEL RECORDS ARE OMITTED חייב להופיע במקדה של שימוש בקובצי רשומות יחידה. עבור קובצי הדפסה יש לכתוב את הקטע הבא: FD FILE-NAME-1 LABEL RECORDS ARE OMITTED |
עבור קובצי גישה ישירה, יופיעו בדרך כלל המשפטים הבאים: 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) [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 A - מציין אלפביתי. X - מצין אלפאנומרי. 9 - מציין נומרי (ספרתי). |
שדה יהיה בעל PICTURE שכולו A-ים, למשל, אם הוא אלפביתי. אנו מציינים את גודל השדה על ידי מספד התווים (A,X, או 9), בהם אנו משתמשים ב- PICTURE. הבט, למשל, בדוגמה הבאה: המשפט: 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 תווים . הינו חוקי: כלומר - ניתן להשתמש בסוגריים לציון גודלו של השדה, במקום לכתוב עשר פעמים את האות A . המלה IS במשפט PICTURE אינה חייבת להופיע, וכמו בכל הוראת-COBOL, ניתן תמיד להשמיטה. כל משפטPICTURE בסעיף הקבצים יסתיים בנקודה. מכאן, שניתן להגדיר את השדה שלעיל גם כך: אם כן, פריטים מקובצים הינם פריטים, שיש להם חלוקת משנה, ואינם מכילים משפט PICTURE. משפט PICTURE, המציין את גודל השדה וסוגו, או סוג הנתונים שהוא מכיל, דרוש רק עבור פריטים בסיסיים. משפט PICTURE יכול להופיע בכל מקום בשורה. לצורך הבהירות, הוצבו כל משפטי ה- PICTURE באותו טור. הדבר אינו הכרחי. לאחר המלה PICTURE חייב לבוא רווח אחד לפחות. המשפטים הבאים הם בלתי חוקיים: מספר התווים במשפט ה -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). |
היה הדבר גורם לשתי שגיאות עיקריות: |
המחשב היה מניח, כי השדה כ - HOURS-WORKED בא מיד לאחרי השדה EMPLOYEE-NAME, הואיל והוא השדה, המופיע מיד לאחריו. פקודת READ, במקרה כזה, היתה ממקמת את טורים 30-26 באזוו האחסון, הנקרא HOURS-WORKED. משפט ה-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 המתאים יהיה, אם כן: אם כן, השלמנו את משפטי תיאור הרשומה, הדרושים לתכניות COBOL בסיסיות. לכל קובץ, המצויין במשפט DATA RECORDS , יש לשייך רמה 01, ולתאר את הרמות הכפופות לו. יש לתאר את כל הרשומות בקובץ (בקטע FD) מסויים, לפני שעוברים לתיאור הקובץ (ה-FD) הבא. ט.קטע האחסון לעבודה (WORKING-STORAGE SECTION) | זכור, כי בחטיבת הנתונים שני קטעים עיקריים: FILE SECTION - קטע הקבצים, ו-WORKING-STORAGE SECTION - קטע האחסון לעבודה. הסבר זה הינו היכרות ראשונית עם קטע האחסון לעבודה. הסבר רחב יותר מופיע בפרק 8. כל שדה הדרוש לעיבוד, שאינו חלק מהקלט או מהפלט, ניתן להגדרה בקטע שטחי האחסון לעבודה..למשל, אם יש לתת לשדה ערך התחלתי 0, ולהגדיל את ערכו ב-1 רק כאשר תיקרא הרשומה האחרונה, ניתן להגדיר שדה זה ב-WORKING-STORAGE SECTION . גם שטחים, הדרושים לאחסון תוצאות ביניים של עיבוד הנתונים, יוגדרו בקטע זה. כללים לשימיש בקטע שטחי האחסון לעבודה |
קטע שטחי האוזסון לעבודה יבוא לאחר כל המשפטים, המופיעים בקטע הקבצים. יש לקודד WORKING-STORAGE SECTION בשורה נפרדת, במרוח א,ולסיים בנקודה. הגדרה ראשונית של פריט מקובץ, אשר יתחלק לשטחי-אחסון נוספים. לדוגמה: .WORKING-STORAGE SECTION .s 01 STORED-AREA |
הגדרת כל השדות הדרושים בתוך הגדרת 01 לעיל: .WORKING-STORAGE SECTION .s 01 STORED-AREA .s 02 END-OF-FILE-SWITCH .s 02 GROSS-AMT |
יש לתת שמות לפריטים המקובצים והבסיסיים, לפי כללי מתן-שמות. לכל פריט בסיסי בלתי תלוי - יש לכתוב משפט PICTURE : .WORKING-STORAGE SECTION .s 01 STORED-AREA .s 02 END-OF-FILE-SWITCH PIC 9 .s 02 GROSS-AMT PIC 999V99 |
כל פריט בסיסי בלתי'תלוי יכול לקבל ערך התחלתי, אם דרוש כזה: .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, שהיא האחרונה שנלמד, הינה ללא ספק החשובה ביותר. חטיבת הביצוע מכילה את כל ההוראות, אשר יבוצעו על ידי המחשב, וזאת על פי הלוגיקה, אשר כתב התכניתן בעזרת הוראות אלה. הטיבות הזיהוי והסביבה מספקות מידע על אופי התכנית והציוד המופעל על ידה. קטע הקבצים של חטיבת הנתונים מגדיר בפרוטרוט את שטחי הקלט והפלט. שטח הקלט היכו שטח האחסון, השמור כמקום, אליו תיקלט רשומה מקובץ הקלט. שטח הפלט הוא השטח, השמור לנתונים, הנוצרים במהלך התכנית, ומיועדים לשמש כנתוני פלט המחשב. קטע האחסון-לעבודה של חטיבת הנתונים מגדיר את כל שטחי האחסון הדרושים לצורך העיבוד אך איבם חלק מהקלט או הפלט. אולם רק ,כחטיבת הביצוע נמצא ישום לכל הנתונים יחד. הנתונים נקראים, מעובדים, ונוצר הפלט.כל הוראות הביצוע למחשב נכתבות בחטיבת הב'צוע. רוב פרקי ספר זה עוסקים בהוראות-הביצוע. קידוד שלוש החטיבות הראשונות הוא פשוט ושגרתי למדי, אולם עיבוד הנתונים, המתבצע בחטיבת הביצוע, הינו הוץלק המרכזי של התכנות,בפרק זה נלמד כיצד : לגשת לקובצי קלט ופלט. לקרוא ולכתוב מידע. לבצע פעולות הצבה והעברה פשוטות. לבצע פעולות שיום תכנית מסוימות (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 מורה למחשב לגשת (ACCESS) אל הקובץ. תבנית הוראת OPEN בשפת COBOL |
.[(OPEN [INPUT (file name)] , [OUTPUT (file name |
אם כך, העיצוב המופיע לעיל מציין כי: OPEN ו-OUTPUT הינן מילות - COBOL שמורות, דרושות בהוראה זו. זאת הואיל והן מופיעות באותיות גדולות, כשתחתן קו. כל שמות קובצי הקלט והפלט (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 מבצעת שתי פעולות בסיסיות: מאפיינת אילו מן הקבצים ישמשו כקובצי קלט, ואילו - כקובצי פלט. מאפשרת גישה אל הקבצים לצורך עיבוד. |
לעתים קרובות, כותבים תכניות, המשתמשות במספר קובצי קלט או פלט. תכנית עדכון (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. הוראה זו מעבירה נתונים מיחידת הקלט, אל שטח-אחסון הקלט, שהוגדר בקטע הקבצים של חטיבת הנתובים. .(הוראות) AT END (שם-קובץ) READ |
שם הקובץ, המופיע בהוראת READ, כבר מופיע בשלושה מקומות קודמים בתכנית: בהצהרת SELECT, המצביעה על שם הקובץ ויחידת הקלט/פלט, אליה שייך קובץ זה. אם, לדוגמה, מכשיר הקלט הוא קורא דיסקטים, תעביר הוראת-READ נתונים מרשומת קלט אשר על הדיסקט אל שטח נתוני הקלט אשר בזיכרון המחשב. קטע FD , המתאר את הקובץ. הוראת 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 דרושה בסיום הביצוע, לאחר שעובדו כל הרשומות, וזאת כדי לשחרר את הקבצים. אנו כותבים: לכל הקבצים, שנפתחו במהלך התכנית, יש לבצע הוראת סגירה בתום העיבוד. בדומה ל-OPEN, תבצע גם הוראת CLOSE מספר פעולות נוספות. כאשר יוצרים, לדוגמה, רשומות על סרט מגנטי, תיצור הוראתCLOSE רשומת סיום קובץ, ותגלגל חזרה (REWIND) את הסרט למצבו המקורי. שים לב, כי הוראת CLOSE, שלא כמו הוראת OPEN. אינה מציינת אילו קבצים הם קובצי קלט ואילו קובצי פלט. לדוגמה, כדי לגשת לקבצים, אנו אומרים: .OPEN INPUT FILE-1, OUTPUT 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 יכללו: הוראות העיבוד לרשומה. הוראת READ לקריאת הרשומה הבאה. תנאי AT END, המורה למחשב להציב 1 ב-EOF. |
CALC-RTN. … .READ FILE-1 AT END MOVE 1 TO EOF |
אנו מניחים, כי ב-CALC-RTN ברצוננו לעבד נתונים בדרך כלשהי, וליצור רשומות-פלט.. עתה, כאשר אנו יודעים לפתוח (OPEN) קובץ ולקרוא (READ) ממנו, נצטרך לאחסן נתונים בשטח הפלט; כך שכאשר נכתוב פקודת - WRITE ייכתב מידע כל שהוא בקובץ הפלט.
מבנה הוראת 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 לוקחת את הנתונים, שנצטברו בשטח הפלט, ומעבירה אותם אל יחידת הקלט/פלט, אשר צויינה בחטיבת הסביבה. שם הרשומה מופיע ברמה 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 |
סיכום הפרטים המופיעים בחטיבת הביצוע |
שמות סעיפים PARAGRAPH יופיעו במרווח A. כל ההוראות יקודדו במרווח B, או בצורה חופשית כחלק מתוך סעיף, או בהוראה בודדתי אחת. ההוראות מתבצעות בסדר שבו נכתבו, אלא אם כן מעבירה הוראת PERFORM את הבקרה לסעיף אחר. ברב התכניות המבניות תופיע יחידה ראשית כלהלן: OPEN INPUT (file) OUTPUT (file). READ (file) AT END MOE 1 TO EOF. PERFORM (paragraph) UNTIL EOF=1. CLOSE (files). .STOP RUN הסעיף שצויין בהוראת PERFORM מתבצע שוב ושוב, עד אשר אין יותר רשומות קלט. ההוראה האחרונה בסעיף, שצויין ע"י הוראת PERFORM, הינה בדרך כלל הוראת READ: CALC-RTN. … .READ (file) AT END MOVE 1 TO EOF
|
קיימת שיטה, בה ניתן להשתמש, לשם הכנסת שורות הערה בתכנית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, כמו הוראות ביצוע אחרות, מופיעה רק בחטיבת הביצוע. לעומת זאת, FIELDA, FIELDB, הינם שמות-המשתנים, ויש להגדירם בחטיבת הנתונים. זכור לך בוודאי, כי שמות המשתנים בחטיבת הנתונים מוגדרים על ידי משפטי PICTURE, המציינים את סוג הנתון בשדה (מספרי, אלפביתי או אלפאנומרי) ואת גודלו. כדי שתתבצע הוראת MOVE, שתעביר את תוכנו המדוייק של משתנה אחד למשתנה אחר - חייבים שני המשתנים להיות מוגדרים על ידי משפטי PICTURE זהים. 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 אינו נמחק, אפוא, במשך התהליך. תוכן זה נשאר ללא שינוי, והוא נמסר, או מועתק, אל השדה המקבל. 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 : .(שם משתנה-2) TO (שם משתנה-1 ) MOVE |
במקרה זה, על שם-משתנה-1 ושם-משתנה-2 להיות מוגדרים בחטיבת-הנתונים של התכנית. כדי שתוכנו של שם-משתנה-1 יועתק לשם-משתנה-2 במדוייק, חייבת להיות הגדרת PICTURE זהה לשני השדות. צורה שנייה של הוראת MOVE היא זו: .(שם משתנה) TO (קבוע) MOVE |
כזכור, קיימים שני סוגי קבועים: קבועים מספריים, וקבועים שאינם מספריים: קבועים – תזכורת 1 עד 18 ספרות נקודה עשרונית (אינה חייבת להופיע) סימן + או - (אינו חייב להופיע) . |
קבוע שאינו מספרי (אלפאנומרי) |
1 עד 120 תווים. ניתן להשתמש בכל סימני COBOL (פרט למרכאות). הנתון כולו מופיע בין מרכאות. |
MOVE 123 TO DEPT. ' = DISPLAY 'DEPT DISPLAY DEPT |
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 היא זו: .(שם-משתנה) TO (קבוע מיוחד) MOVE |
כזכור, קבוע מיוחד הינו מלה שמורה ב-COBOL, כמו SPACES אוZERO, המציינת קבוע מחרוזתי מיוחד, כגון תו-אפס או תווי רווח. MOVE ZEROS TO TOTAL. ' = DISPLAY 'TOTAL. DISPLAY TOTAL. |
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 מספרית ניתנת לביצוע בשני אופנים |
הצבת שדה מספרי, בעל משפט PICTURE של ספרות- 9, לשדה מספרי אחר. הצבת קבוע מספרי בשדה מספרי.
|
בהוראה: (משתנה-2) TO (משתנה-1) MOVE לשני השדות משפטיPICTURE מספריים. בהנחה ששני השדות הם בעלי אורך זהה, יוחלף תוכנו של משתנה-2 בתוכן של משתנה-1, מבלי שישתנה תוכן השדה השולה (משתנה-1). FIELDA PICTURE 999 תוכן: 123 FIELDB PICTURE 999 תוכן:456 ההוראה: . MOVE FIELDA TO FIELDB ' = DISPLAY 'FIELDA DISPLAY FIELDA ' = DISPLAY 'FIELDB DISPLAY FIELDB |
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: . העברת, מספר שלם, או חלק שלם של מספר, תתפצע מימין לשמאל. " כל התווים מסדר גבוה (שמאליים), שלא התמלאו, יקבלו ערך אפס. FIELD1 PICTURE 999 תוכן: 123 FILED2 PICTURE 9(4) תוכן: 4567 נתבונן. בהוראה: MOVE FIELD1 TO FIELD2. ' = DISPLAY 'FIELD1 DISPLAY FIELD1 ' = DISPLAY 'FIELD2 DISPLAY FIELD2 |
FIELD3 PICTURE 999 תוכן: 012 FIELD4 PICTURE 999 תוכן:34 ההוראה: MOVE FIELD3 TO FIELD4. ' = DISPLAY 'FIELD3 DISPLAY FIELD3 ' = DISPLAY 'FIELD4 DISPLAY FIELD4 |
להלן כלל פשוט, שכדאי להשתמש בו ברוב המקרים בהצבות מספריות: וודא, כי השדה המקבל מכיל לפחות אותו מספר של תווים לפני הנקודה העשרונית כמו השדה השולח. אם השדה המקבל גדול יותר מהשולח, התווים השמאליים ביותר (הספרות מסדר גבוה) שלו יוחלפו באפסים, אשר לא ישפיעו על התוצאות. לעומת זאת, אם השדה המקבל קטן יותר מהשולח, עלולות דווקא הספרות המשמעותיות ביותר להיקטע. 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: העברת החלק העשרוני (החלק מימין לנקודה) של השדה השולח לשדה המקבל - נעשית משמאל לימין, החל מהנקודה העשרונית, שהוגדרה בתכנית, התווים הימניים ביותר אחרי הנקודה שלא התמלאו - יקבלו ערך אפס. FLDA PIC 99V99 תוכן:12.34 FLDB PIC 99V999 תוכן: 56.789 ההוראה: MOVE FLDA TO FLDB. ' = DISPLAY 'FLDA DISPLAY FLDA ' = DISPLAY 'FLDB DISPLAY FLDB |
FLDC PIC V99 תוכן: 0.12 FLDD PIC V9 תוכן: 0.3 ההוראה: . MOVE FLDC TO FLDD ' = DISPLAY 'FLDC DISPLAY FLDC ' = DISPLAY 'FLDD DISPLAY FLDD |
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 . FLD1 PIC 9(4) ההוראה: MOVE 123 TO FLD1 ' = DISPLAY 'FLD1 DISPLAY FLD1 |
FLD2 PIC 99 ההוראה: MOVE 123 TO FLD2. ' = DISPLAY 'FLD2 DISPLAY FLD2
|
FLD3 PIC 99V999 ההוראה: MOVE 12.34 TO FLD3. ' = DISPLAY 'FLD3 DISPLAY FLD3 |
כזכור, הצבות-MOVE נחלקות לשני סוגים: הצבה מספרית והצבה אלפאנומרית. בפרק זה נדון בסוג השני. הצבה אלפאנומרית פירושה: הצבה (MOVE) אלפאנומרית העברה של שדה אלפאנומרי (שדה המכיל ספרות, רווחים ואותיות), המוגדר במשפט PICTURE באותיות X, לשדה אלפאנומרי אחר. העברה של קבוע אלפאנומרי לשדה אלפאנומרי. העברה של קבוע מספרי לשדה אלפאנומרי. |
כלל: בהצבה אלפאנומרית הנתונים מועתקים תו-תו מן השדה השולח אל השדה המקבל, משמאל לימין. התווים הימניים ביותר של השדה המקבל (תווים מסדר נמוך) שאינם מתמלאים, מוחלפים בתווי-רווח. 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. החלפנו משתנה בקבוע שאינו מספרי, בעל תוכן זהה, והתוצאה זהה אף היא. |
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 . |
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. 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להצבות מספריות. הנתונים מוצמדים לימין בשדה המקבל: לדוגמא, הצבת 075 בשדה מספרי בן 2 תווים - תיתן תוצאה 75 בשדה זה. אם השדה המקבל גדול מהשדה השולח, יוחלפו תווים מסדר גבוה (שמאליים) באפסים. לדוגמא, הצבת 524 בשדה בן 4 תווים ספרתיים - תיתן 0524 בשדה זה.
|
הצבה שאינה מספרית (אלפבתי או אלפאנומרי) |
הנתונים מוצמדים לשמאל השדה המקבל. לדוגמא, הצבת ABC לשדה (שאינו מספרי) בן שני תווים - תציב בשדה זה AB. אם השדה המקבל גדול מהשדה השולח, תווים מסדר נמוך (ימניים) יוחלפו בתווי-רווח. לדוגמא, הצבת ABC בשדה שאינו מספרי, בן 4 תווים - תציב בשדה זה ~ABC . (~ = מרווח)
|
אפשר להציב שדה מספרי בשדה אלפאנומרי, אך אין להציב שדה אלפאנומרי בשדה מספרי. תוכן אחרי 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 תקציר |
מטרה: להחליף סדרה של הוראות-MOVE בסיסיות. תוצאה: כל השדות בפריט השולח מועברים לשדות בעלי שם זהה בפריט המקבל. שדות בפריט המקבל, שאין להם שדות מתאימים בפריט השולח - נשארים ללא שינוי.
כללים: כל הכללים של הוראות-MOVE בסיסיות - חלים גם כאן.
|
הוראת הצבה (MOVE) רגילה - תקציר |
הוראת MOVE מספרית השדה השולח והשדה המקבל, שניהם מספריים. כללים: החלק השלם מועבר מימין לשמאל תווים מסדר גבוה, שאינם מתמילאים, יוחלפו באפסים. החלק העשרוני מועבר משמאל לימין תווים מסדר במוך, שלא התמלאו, יוהלפו באפסים.
הוראת MOVE, שאינה מספרית השדה המקבל אינו מספרי. כללים מועבר משמאל לימין תווים מסדך נמוך, שלא התמלאו, יוחלפו בתווי רוווח.
|
 |
|
|
|
|
| נשלח ב-27/7/2011 16:08 |
|
| |
פרק 8 קטעי האחסון לעבודה.
א. פריטים ומשפטי עצמאיים VALUE. |
כזכור לך, מתחלקת חטיבת הנתונים לשני קטעים: קטע הקבצים וקטע שטחי האחסון לעבודה . חטיבת הנתונים, כיחידה, מכילה את כל שטחי האחסון, שהוגדרו ושיש לשמרם לשם עיבוד הנתונים. קטע הקבצים הוא הקטע, בו מתוארים כל קובצי הפלט והקלט בפרוטרוט. קטע שטחי האחסון לעבודה מכיל צת כל השדות, שאינם חלק מהקלט או מהפלט, אך הינם הכרחיים לעיבוד הנתונים. כל הקבועים, סכומי הביניים, או שטחי עבודה, שאינם חלק מהקבצים אך הינם הכרחיים לביצוע העיבוד, יוגדרו בקטע זה. בקטע שטחי-האחסון-לעבודה ישנם שני סוגי שדות |
פריטי מידע עצמאיים ברמה 77. פריטים מקובצים - המחולקים לפריטים עצמאיים בסיסיים.
|
פריטים ברמה 77 אינם בשימוש נפוץ. אנו נדגיש, לכן, את השימוש בפריטים מקובצים, שניתן לחלקם לפריטים בסיסיים עצמאיים, כפי שמופיע בדוגמה הבאה: WORKING-STORAGE SECTION. 01 WORK-AREAS. 02 EOF PIC 9 VALUE 0. 02 GROSS-AMT PIC 999V99 VALUE 0. |
השימוש בפריטים עצמאיים בקטע שטחי האחסון לעבודה פריטי מידע עצמאיים, המוגדרים בקטע שטחי-האחסון-לעבודה, הינם שדות נפרדים, שלכל אחד מהם תפקיד נפרד, שאינו קשור לשום פריט-מידע אחר. השימוש בפריטים עצמאיים יודגם בדוגמאות הבאות. המחיר נטו (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 הוא אפוא שדה ביניים, הנוצר בעת ההכפלה, וממנו מיוצרת לבסוף תוצאת הפלט. |
נניח, שאנו רוצים לספור את מספר הרשומות בקובץ כלשהו. להלן חלק מן התכנית: .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צריך להיות פריט עצמאי בקטע שטחי-העבודה. |
כללים לכתיבת פריטים עצמאיים |
כמו כל הקטעים, מקודד קטע שטחי-העבודה במרווח-A. קטע שטחי העבודה יבוא תמיד לאחר קטע הקבצים. פריטי מידע עצמאיים יכולים לבוא כחלק מפריט מקובץ (או כפריטים מיוחדים ברמה 77 ). את הפריט המקובץ כותבים ברמה 01 במרווח-A. את הפריטים העצמאיים כותבים ברמות כלשהן, הכפופות לרמה 01. שמות-הנתונים בקטע זה תואמים את הכללים ליצירת שמות-נתונים (משתנים). לכל פריט עצמאי חייב להיות משפט 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)בחטיבת הביצוע, כדי לתת לשדה ערך התחלתי. אם כן, לציון פריטים עצמאיים בקטע שטחי-האחסון-לעבודה, יש להשתמש בארבע האפשרויות הנ"ל, שמתוכן שלוש הן הכרחיות: פריטים עצמאיים בקטע שטחי-ענודה |
כתיבת רמה 01 במרווח A - מציינת למחשב, כי אנו עומדים להגדיר פריט-נתונים מקובץ. פריטים עצמאיים יכתבו ברמות, הכפופות לרמה 01. השם, הניתן על ידי המתכנת, מגדיר את השדה. גודלו ועיצובו של השדה מוגדרים במשפט PICTURE. ניתן לאחסן בשדה ערך התחלתי ע"י משפט 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 (תאריך ההרצה), המתחלק לשדות-המשנה MONTH, DAY-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. |
פריטים מקובצים בקטע שטחי-העבודה משמשים לשתי מטרות |
בשדה הנקרא WORK-AREAS , המכיל שדות עצמאיים לעבוד. כשדות המחולקים חלוקת משנה לשדות-משנה, שיש קשר ביניהם.
|
אם לשדות שבתוך פריט מקובץ לא ניתנו ערכים התחלתיים כלשהם, יוצבו בהם (בהוראת MOVE) במשך התכנית הערכים הרצויים. אנו רשאים להניח כי נתונים אכן יועברו ויוצבו בפריט המקובץ ADDRESS-1, למשל, מאחר שאין לו כל משפט-VALUE. לפריט מקובץ יכולים גם להיות משפטי-VALUE מתאימים, הנותנים ערך התחלתי לשדות, כפי שמופיע ב-DATEX בדוגמא לעיל. הבה נבחן תכנית COBOL, בה נדרש השימוש בפריטים מקובצים בשטחי-העבודה. נניח, כי קובץ רשומות מכיל שני סוגי-רשומה: רשומת תאריך, ורשומת עסקה מפורטת. להלן קטע הקבצים (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: WORKING-STORAGE SECTION. 01 WORK-AREAS. 02 EOF PIC 9 VALUE 0. 02 TOTAL PIC 999 VALUE 0. 02 CTR PIC 99 VALUE 0. |
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. שים לב גם, כי הקטע הבא ייתן אותן תוצאות כמו זה שלעיל: 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 הוראות אריתמטיות.
ניתן לכתוב הוראת חיבור פשוטה, באחת משתי התבניות הבאות: .(שמ-נתון-2) TO {שם-נתון-1 } ADD { קבוע } |
(שמ-נתון-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 נשתמש כאשר אנו צריכים לשמור את תוכן השדות המקוריים, המשתתפים בביצוע הפעולה, להמשך התכנית. ניתן גם להרחיב את שתי התבניות הנ"ל, כפי שנראה מיד: (שם-נתון-ח) TO ... ,[שם-נתון-2] , {שם-נתון-1} ADD [קבוע-2] {קבוע-1} |
(שם-נתון-ח) GIVING ... ,[שם-נתון-2] , {שם-נתון-1} ADD [קבוע-2] {קבוע-1} |
רואים, שלמעשה מספר המשתנים והקבועים כמעט אינו מוגבל, והוא תלוי בגודלו של המחשב וברמת התחכום של מהדיר שפת COBOL של המחשב. כללים לפעולת החיבור - סיכום תמציתי |
כל המשתנים והקבועים חייבים להיות נומריים. מקבל התוצאה (שלאחר המלה TO או GIVING) חייב להיות משתנה, ואסור שיהיה קבוע. בתבנית השימוש מספר 2 (עםGIVING) - מותר, שמשתנה התוצאה יהיה משתנה בעל עריכה פנימית (משתנה בעל עריכה פנימית מוסבר ביתר פרוט בפרק 13). בשימוש בתבנית מספר 1 (עם המלה TO) כל הערכים, כולל הערך של משתנה התוצאה, מסוכמים יחדיו, ומאוחסנים במשתנה התוצאה. בשימוש בתבנית מספר 2 (עם GIVING), הערך של משתנה התוצאה אינו מסוכם, ומשתנה זה משמש רק לאחסון והצגת התוצאה. אסור, שבאותה הוראת חיבור יופיעו גם המלה 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} |
ניתן לכתוב הוראת חיסור פשוטה, באחת משתי התבניות הבאות. (שם-נתון-ח) FROM ... ,[שם-נתון-2] , {שם-נתון-1} SUBTRACT [קבוע-2] {קבוע-1} |
או: (שם-נתון-ח) 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),
כללים לפעולת החיסור - סיכום תמציתי |
כל המשתנים והקבועים חייבים להיות נומריים. שדה התוצאה (שאחרי המלה FROM בתבנית שימוש 1 , או אחרי המלה GIVING בתבנית שימוש 2) חייב להיות משתנה, ואסור שיהיה קבוע. בשימוש בתבנית מספר 1, ערכי כל המשתנים והקבועים שלפני המלה FROM מסתכמים יחד, והסיכום מופחת מהמשתנה שאחרי המלה FROM התוצאה ( ההפרש) מאוחסנת במשתנה שאחרי המלה FROM . כל יתר המשתנים נשארים בערכיהם המקוריים. בשימוש בתבנית מספר 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] |
בגלל הדמיון שבין הוראות אלו, נסביר אותן יחדיו, באותו הפרק. כל הכללים, שלמדנו עד כה לגבי הוראות אריתמטיות, כמובן תקפים גם כאן, כלומר, כל המשתנים והקבועים חייבים להיות נומריים, ושדה התוצאה תמיד חייב להיות משתנה. גם להוראת הכפל הפשוטה, שתי תבביות כתיבה בסיסיות: (שם-נתון-2) BY {שם-נתון-1} MULTIPLY {קבוע-1} |
או: (שם-נתון-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. |
כמו כן, גם להוראת החילוק הפשוטה : שתי תבניות כתיבה כנ"ל: (שם-נתון-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 * 20* PRICE, נצטרך לכתוב שתי הוראות כפל נפרדות: MULTIPLY 20 BY PRICE 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. נסתכל על הדוגמאות הבאות, לצורך תרגול הנאמר: הסבת מעלות צלסיוס למעלות פרנהיט מתבצעת על פי הנוסחה (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. |
חשב את ממוצע שלושת שדות הנתונים הבאים: HRS-WEEK1, HRS-WEEK2,HRS-WEEK3. הצב את שובתך בשדה הנתוניםAVERAGE ודאג לכך שערכיהם של שדות הנתונים המשמשים בסיס לחישוב לא ישתנו: פתרון: ADD HRS-WEEK1, HRS-WEEK2, HRS-WEEK3 GIVING AVERAGE. DIVIDE 3 INTO AVERAGE. |
מצא את ערכו של שדה הנתונים 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 |
|
SUBTRACT DISCOUNT FROM TOTAL GIVING AMT. |
במקרה זה, התוצאה המתקבלת (99.98 - 87.23 = 12.75) מכילה שתי ספרות אחר הנקודה, וכיוון שמשתנה התוצאה מוגדר ללא ספרות עשרוניות כלל, הרי נקבל ב-AMT את המספר 12 , לאחר קיצוץ של הספרות מימין. 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 |
מקרה שכיח נוסף, בכתיבת הוראות אריתמטיות כלשהן בתכנית, הוא מקרה של קבלת תוצאה שגויה, עקב קיצוץ ספרה משמעותית משמאל. כיצד מתרחש מצב כזה? נראה בדוגמא הבאה: אם מתבצעת ההוראה דלהלן: 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, בעוד שהתוכן הקודם שלו היה נעלם. כל השדות המופיעים בביטוי האריתמטי (מצד ימין שלסימן השוויון) - נשארים בערכם המקורי. 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 יש יתרון על פני שיטות הרישום האחרות - בזה, שניתן במסגרת הוראה אחת לבצע יותר מפעולה אריתמטית אחת, בעוד ששיטת הרישום של ההוראות הבודדות היא מגושמת יותר ואינה נוחה. ההוראות ADD, SUBTRACT, MULTIPLY ו-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, הפשוטה יחסית, לצורך יעילות התכנית (ביצוע מהיר יותר). הוראה אריתמטית, לדוגמא: COMPUTE SALARY = HRS * RATE
קבוע, לדוגמא COMPUTE TAX = .05 שמות נתונים, לדוגמא: COMPUTE FLDA = FLDB.
|
שים לב, כי בשתי הדוגמאות האחרונות עדיף להשתמש בהוראתMOVE. בהוראת החישוב, כמו בארבע ההוראות הקודמות, ניתן להשתמש באפשרות העיגול, ובאפשרות שגיאת הגודל, לפי אותם חוקים שלמדנו עד כה. הוראה זו, עם אפשרוח העיגול, נכתבת כך: {שם-נתון} = [ROUNDED] (שם-נתון)ׁCOMPUTE קבוע ביטוי חשבוני |
(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 { קבוע} { ביטוי חשבוני} |
בהוראת 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 מספר מסויים ולקבל את התוצאה הרצוייה. מכאן: מאחר שלא קיימת הוראה של הוצאת שורש, ניתן לרשום חזקה של המספר בערך של חצי. לדוגמא: סדר ביצוע ההוראות האריתמטיות בהוראת החישוב, סדר ביצוע הפעולות האריתמטיות חשוב ביותר, וקובע לגבי התוצאה. נשים לב לדוגמא הבאה: בהתאם לעדיפות סדר הביצוע, ניתן להסתכל על ההוראה באחת משתי הדרכים הבאות: a) D = (A+B) / C b) D = A + (B / C) |
ברור, שאלו שתי דרכים, המובילות לתוצאות שונות. אם A = 3,B = 6 ו-C = 3, הרי בדרך הביצוע הראשונה (a) נקבל D = 3, ואילו בדרך הביצוע השניה (b) נקבל D = 5. ** חזקה * (כפל) או / (חילוק) (לפי סדר ההופעה שלהם - מצד שמאל לצד ימין) + (חיבור) או - (חיסור) (לפי סדר ההופעה שלהם - מצד שמאל לצד ימין).
|
הפעולה שתמיד תתבצע ראשונה, תהיה העלאה בחזקה, אח''כ כפל או חילוק, ולבסוף חיבור או חיסור. אם ישנן כמה פעולות כפל או חילוק באותה הוראה, הן יתבצעו לפי הסדר משמאל לימין, וכך גם לגבי כמה פעולות חיבור וחיסור יחדיו. בהתאם לחוקים אלו, ההוראה 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 נניח, כי המשתנים A ,B, ו-C הם צלעות במשולש ישר זווית. המשתנה C מהווה יתר במשולש זה. נתונים המשתנים A ו-B, ויש לחשב את המשתנה C על פי משפט פיתגורס, החישוב יבוצע כדלקמן: C = SQRT( A^2 + B^2) צורת הכתיבה במקרה זה תהיה: COMPUTE C ROUNDED = ( A ** 2 + B ** 2) ** .5 |
ברצוננו למצוא, מהו המחיר נטו (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 B, MOVE C TO D,OPEN INPUT FILE. מכאן שאנו מבחינים בשני סוגים עקריים של הוראות בשפת COBOL: הוראות ביצוע. הוראות תנאי. |
הוראות תנאי, כפי שאנו רואים, בודקות יחס מסויים בין משתנים. יחס זה יכול להיות קיים או בלתי קיים. בהוראת תנאי פשוט נבדק יחס יחיד בין משתנים כפי שמופיע בדוגמאות הבאות: 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 A = B PERFORM RTN1. המשתנים A,B חייבים להיות משתנים מספריים, או אלפאנומריים. בהשוואת ערכים מספריים כל המספרים הבאים, בצורה בה הם רשומים, הינם זהים: 012 12.00 12 12+ ברור, אם כן, שלמרות העובדה שהמספר 12.00 הוא בעל תבנית שונה מהמספר 012, הרי בהשוואה מתמטית התשובה שנקבל תהיה שהמספרים שווים. באוופן דומה, אם נשווה בין שני המשתנים בעלי התכולה הבאה: ABC ABC~ (מרווח = ~) הרי שנקבל תשובה חיובית : שהמשתנים שוים, למרות העובדה שהמשתנה השני מכיל מרווח אחד יותר מהראשון. כאן יש לציין, שההשוואה הנעשית הינה השוואה של תווים משמעותיים בלבד. בהשוואת ערכים אלפאנומריים במסגרת הוראת תנאי, תתבצע ההשוואה בין המשתנים על פי בדיקת תו אחרי תו משמאל לימין; כל תו נבדק על פי תצוגתו הבינארית. כך קורה שמרווח, שהוא בעל תצוגה ביבארית נמוכה, "קטן" יותר מכל אות, ספרה או סימן מיוחד. האות "A" הינה בעלת ערך נמוך יותר מהאות "B", וכו'. הייצוג הבינארי של האותיות, הספרות והסימנים המיוחדים, משתנה בין מערכות המחשב השונות. עליך לבדוק, במערכת המחשב אשר בה מופעלות תכניות COBOL אשר כתבת, את סדר האותיות, הספרות והסימנים המיוחדים ואת ערכם הבינארי. שים לב שקיימות אותיות אנגליות גדולות ואותיות קטנות. כמו כן, שים לב, שיכולות להופיע גם אותיות עבריות בנוסף לאותיות האנגליות הקטנות או במקומן. בדוגמאות הבאות, אנו יוצאים מתוך הנחה, המתקיימת בדרך כלל, שסדר האותיות והספרות הוא כדלקמן: ערך גדול ~ABC…Z0123…9 ערך קטן מכאן, שהקבועים האלפאנומריים הבאים מתנהגים כדלקמן: ABCD < BBCD | BBCD < ZBCD | ZBCD < 1BCD | ABCD < ACCD | ~BCD < ABCD | ~BCD < ABCD |
|
אם נשווה ערך מספרי (נומרי) לערך אלפאנומרי, תתבצע ההשוואה כך, שהערך הנומרי כאילו הועבר לשדה ביניים אלפאנומרי באורך המתאים וההשוואה תתבצע בין שדה הביניים הנ"ל ובין המשתנה האלפאנומרי המשווה - זאת על פי עקרונות ההשוואה האלפאנומרית. אנו רואים, אם כך, שביצוע השוואה מסוג זה מסוכן מאוד, ולא בכל מקרה ניתן לסמוך על תוצאת ההשוואה המתקבלת. מכאן, שיש לבצע בדיקות השוואה אלו בין משתנים בעלי תבניות נתונים זהות. יש מקרים, בהם בעקבות בדיקת תנאי כלשהי, נרצה לבצע סדרה של הוראות, לאו דווקא הוראת ביצוע אחת. ננסה לבצע את הדוגמא הבאה: א. אם A < B אז חבר את המשתנה C למשתנה D והעבר את הקבוע 2 למשתנה ITEM1. ב. אם A אינו קטן מ-B, אז חבר את המשתנה E למשתנה C. בכל מקרה, העבר את הקבוע אפס למשתנהITEM2 . סדרת הוראות אלה באה לידי ביטוי בדוגמא הבאה: IF A < B THEN ADD C TO D. MOVE 2 TO ITEM1. ELSE ADD E TO C. MOVE 0 TO ITEM2. |
לעתים, קיים מצב שבו נרצה לבצע הוראה כלשהי רק בתנאי, שנקבל תשובה שלילית לתנאי שהצבנו, בעוד שבגין התשובה החיובית אין לבצע הוראה כלשהי. במקרה זה נשתמש בהוראת סרק, הנקראת NEXT SENTENCE (ההוראה הבאה), אשר משמעותה, שיש להמנע מביצוע כל הוראה בגין תשובה חיובית לתנאי שהעמדנו, ולעבור להוראה הבאה לאחר הוראת התנאי. לדוגמא: IF A = B THEN NEXT SENTENCE ELSE ADD A TO D. |
משמעות ההוראה היא, שאם A = B, לא תתבצע כל הוראה, אלא ההוראה הבאה לאחר הוראת התנאי; אחרת המשתנה A מתחבר למשתנה D, ולאחר מכן מתבצעת ההוראה הבאה. ניתן להשתמש בהוראת הסרק NEXT SENTENCE גם במסגרת חלקה השני של הוראת התנאי, במסגרת ELSE, אולם לשימוש זה אין כל משמעות. לדוגמא, שתי ההוראות הבאות זהות מבחינת פעילותון: IF C = D ADD A TO B ELSE NEXT SENTENCE IF C = D ADD A TO B. |
המשפט ELSE NEXT SENTENCE הוא אינו הכרחי, כי כש-C אינו שווה ל-D, ממילא מתבצעת ההוראה הבאה. בקיצור, משפט ELSEשימושי רק כשיש לבצע פעולה מסויימת או פעולות מסויימות כשהתנאי אינו מתקיים.
ב. הוראת תנאי 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 . תהליך זה של קטע, המפעיל קטע ובעצמו מופעל על ידי קטע אחר, הינו תהליך רגיל של כתיבת תכנית. נסכם, אם כך, את סדרת ההוראות, אשר בדרך כלל מתבצעות בזמן ביצוע לולאות: יש לטעון את השדה, אשר אותו בודקים, בערך התחלתי מתאים. כתיבת ההוראה: .(תנאי) UNTIL (קטע תכנית) PERFORM לאחר הוראת PERFORM חייבות לבוא הוראות, המעבירות פיקוח לקטע אחר בתכנית. קידוד קטע התכנית, אשר מתבצע במסגרת הלולאה. שינוי המשתנה, המשמש כתנאי לביצוע הלולאה, כך שיקרב אותו אל התנאי הנבדק. מצב זה, הוא המאפשר לסיים את הלולאה ולהפוך אותה לולאה סופית. |
התבונן בקטע התכנות הבא, ובדוק, אם אתה מוצא שגיאה לוגית בקטע זה. המטרה: להוסיף את המשתנה 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 . |
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 במקום עשר,B במקום אחת עשרה וכו'. מכפלה רגילה של כמות במחיר תתבצע בקטע 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 = B, C = D,E = F , אחרת נפעיל את קטע התכנית STAR-1. כלומר, אם אחד התנאים או יותר לא יתקיים, יש להפעיל את STAR-1. במקרה זה נשתמש בהוראה הבאה: IF A = B AND C = D AND E = F PERFORM PRINT-RTN ELSE PERFORM STAR-1. |
במקרה זה, אם לכל התנאים התשובה הינה חיובית, יתבצע הקטעPRINT-RTN. אם לאחד התנאים התשובה תהיה שלילית, יתבצע הקטעSTAR-1. יש מקרים, בהם קיים צורך בשימוש בשתי צורות התנאי המורכב יחד, גם במלה AND וגם במלה OR. כתוב קטע תכנית, המבצע את קטע התכנית CALC-RTN, אם המשתנה A מכיל מספר בין 10 ל-20 (כולל את 10 ואת 20). צא מתוך ההנחה, שהמשתנה A הוגדר במסגרת חטיבת הנתונים. במבט ראשון נראה, שיש צורך בשימוש במשפט המורכב הבא: IF A = 10 OR A = 11 OR A = 12 … OR A = 20 PERFORM CALC-RTN. אם נכתוב בצורה זו, אנו חייבים לצאת מתוך ההנחה (שאינה הכרחית), שהמשתנה A מוגדר כמספר שלם, אשר אינו יכול להכיל שבר עשרוני. במקרה זה, אם A = 10.3 הרי שהוא בין הערכים 10 ו-20, אבל משפט התנאי המורכב שכתבנו לא יתקיים. מאותה הסיבה לא נוכל לרשום את המשפט הבא: IF A > 9 AND A <21 PERFORM CALC-RTN. זאת הואיל והמספר 9.8 כלול במסגרת התנאי, אבל אינו מספר בין 10 ל-20. מכאן, שנוכל לרשום את ההוראה, אם תכיל את התנאים הבאים: א. A = 10 ב. או A > 10 AND A < 20 ג. או A = 20 במקרה זה ההוראה תירשם כדלקמן: IF A = 10 OR A > 10 AND A < 20 OR A = 20 PERFORM CALC-RTN. |
סדר בדיקת התנאי בהוראת תנאי מורכב בזמן שימוש בהוראת תנאי אחת במילים AND, OR, נשאלת השאלה, מהו סדר בדיקת התנאים לצורך ביצוע ההוראה. IF A = B OR C = D AND E = F PERFORM PARA1. הנחה: A = 2, B = 2, C = 3, D = 4, E = 5, F = 6 בהסתמך על הדוגמא, מה יהיו התנאים שהקטע PARA1 יתבצע? נניח, שבדיקת התנאים היא כדלקמן: א. IF A = B OR C = D ב. וגם E = F אם זאת ההוראה לבדיקת התנאים, קיימות שתי אפשרויות, שהקטעPARA1 יתבצע. א. A = B וגם E = F. ב. C = D וגם E = F. הואיל והמשתנה E אינו שווה למשתנה F, לא יתבצע הקטע PARA1בכל מקרה. אולם ניתן להניח, שבדיקת התנאים הינה אחרת, והיא כדלקמן: א. A = B. ב. או C = D AND E = F גם במקרה זה קיימים שני תנאים לכך, שהקטע PARA1 יתבצע א. אם A = B ב. אם C = Dוגם E = F. הואיל והתנאי הראשון,A = B , מתקיים, הרי שהקטע PARA1 יבוצע בכל מקרה, אפילו אם התשובה לתנאי השני תהיה שלילית. |
אנו רואים, אם כן, שיש ליצור סדר מסויים בבדיקת התנאים, מאחר שכפי שראינו עד כאן, ניתן לשאול את השאלות בסדר שונה: על פי סדר אחד יתבצע הקטע PARA1, ולפי סדר אחר - קטע זה לא יתבצע. ואמנם קיים סדר מודרג של ביצוע התנאים הנ"ל. סדר בדיקת התנאים בתנאי מורכב |
תנאים, הקשורים בינהם בבדיקת המלה AND , מתבצעים ראשונים. תנאים, הקשורים ביניהם בבדיקת המלה OR , מתבצעים אחרונים. בזמן צירוף תנאי AND ו -OR יחד, הוראות התנאי הקשורות במלה AND . יתבצעו ראשונות, על פי סדר הופעתן במשפט משמאל ימין, ולאחר מכן יבוצעו התנאים הקשורים במלה OR , וגם הם יבוצעו על פי סדר הופעתם משמאל לימין.
|
אם כך, הדוגמא צריכה להיות מובנת בצורה הבאה: א. IF C = D AND E = F ב. או (OR) A = B ולפי האמור לעיל, הקטע PARA1 אמנם יבוצע, מאחר שמתקיים התנאיA = B. נבקש להדפיס את המשתנה A, אם הוא בעל ערך בין 10 ו-100 (כולל), הווה אומר: אם הוא שווה או גדול מעשר, וגם שווה או קטן ממאה. נבחן את ההוראה הבאה - אם היא מבצעת את תנאי הדוגמא: IF A < 100 OR A = 100 AND A = 10 OR A > 10 PERFORM PRINT-RTN. מתוך בחינת סדר בדיקת התנאים אנו רואים כי התנאים נבדקים כדלקמן (נזכור כי ראשית מבוצעות בדיקות תנאי AND, ולאחר מכןOR): א. IF A = 100 AND A = 10 ב. או A < 100 ג. או A > 10 נבחין מיד, כי תנאי א. הינו תנאי בלתי אפשרי, הואיל והמשתנה A אינו יכול להיות גם שווה למאה וגם שווה לעשר. לפיכך, הואיל והוא בלתי אפשרי, ניתן להוציאו מההוראה, ותישאר ההוראה הבאה: IF A < 100 OR A > 10 PERFORM PRINT-RTN. ברור, שהכתוב כאן אינו הפתרון לשאלה כפי שנשאלה, מאחר שכל ערך של המשתנה A יקיים את התנאי שביקשנו. אם A > 100 תתקבל תשובה חיובית הואיל והוא עונה לתנאי האם A > 10. אם A < 10התשובה גם היא חיובית, הואיל והוא עונה לתנאי A < 100, מכאן, שיש לשנות את סדר כתיבת השאלות לסדר הבא: א. IF A < 100 OR A = 100 ב. וגם (AND)A = 10 OR A > 10 |
כאן מתעורר הצורך בשינוי העדיפויות של ביצוע הוראות התנאי. ראשית, יש לבצע שתי בדיקות, שהיחס ביניהן OR. לאחר מכן - שתי בדיקות נוספות, שהיחס ביניהן OR, ורק לאחר מכן לבצע יחס AND בין התשובות לשתי הבדיקות הראשונות. במקרה זה, לצורך שינוי עדיפות סדר הביצוע ניתן, ובמקרה זה - אף צריך, להשתמש בהכנסת תנאי הבדיקה לתוך סוגריים. הכנסת רצף תנאים לסוגריים גורמת לכך, שראשית יתבצעו התנאים שבתוך הסוגריים, ורק לאחר מכן ממשיך הרצף כרגיל. מכאן, שהדוגמא הנכונה היא: IF ( A < 100 OR A = 100 ) AND ( A = 10 OR A > 10 ) PERFORM PRINT-RTN. |
אם מתעורר הספק בקשר לסדר ביצוע בדיקות התנאים, יש להשתמש בסוגריים במקומות הנכונים, ובלבד שנהיה בטוחים, שהתשובה שתתקבל תענה על המבוקש. |
שלילת תנאי מורכב אם נרצה להשתמש בשלילת תנאי כלשהו צריך להימנע ממכשלה מסויימת. רשום קטע תכנית, אשר יבצע PERFORM SOUTH, אם המשתנהA אינו שווה למספר 7 או 8. אחרת - בצע את הקטע PERFORM NORTH. ניתן לרשום זאת על פי הצורה הבאה: IF A IS EQUAL TO 7 OR A IS EQUAL TO 8 PERFORM NORTH ELSE PERFORM SOUTH אך אם נרצה להשתמש בתנאי שלילי, במחשבה ראשונה היינו רושמים: IF A IS NOT EQUAL TO 7 OR A IS NOT EQUAL TO 8 PERFORM SOUTH ELSE PERFORM NORTH. בחינה של ההוראה הנ"ל תראה, שהכתיבה אינה נכונה. אחד התנאים חייב להתקיים עבור הקטע SOUTH. נבדוק זאת: א. A IS NOT EQUAL TO 7 ב. או (OR)A IS NOT EQUAL TO 8. נניח, שהמשתנה A מכיל את הערך 6. הקטע SOUTH יבוצע, וזאת על פי מה שביקשנו. אם A = 7, רצינו שהקטע שיבוצע יהיה NORTH, אולם תנאי א' לא מתקיים, מאחר ש-A = 7 , ואילו תנאי ב' מתקיים, הואיל והוא אינו שווה ל-8 (הוא שווה ל-7). רק תנאי אחד משני התנאים א' או ב' צריך להתמלא, כדי שיתבצע הקטע SOUTH; ותנאי ב' מספק לנו צורך זה. באופן דומה, רצינו שאם A = 8 הקטע NORTH יבוצע, אולם שוב יבוצע הקטע SOUTH, וזאת מאחר שתנאי א' יספק לנו ביצוע זה, היות ש-A = 8 , והוא עונה לתנאי א'. |
המסקנה, המתבקשת מהדוגמא הנ"ל, היא - הצורך להשתמש בידע מתחום האלגברה הבוליאנית, לשם הבנת שלילה של תנאים מורכבים. נראה שלילת תנאים המופרדים במלה OR, כמו במשפט: ( (תנאי) OR (תנאי) ) IF NOT |
הרי שנקבל את התנאי הבא: (תנאי) AND NOT (תנאי) IF NOT |
על פי זה, בדוגמא הקודמת של שלילת התנאי A = 7 או A = 8 , יש להשתמש בצורת הרישום הבאה: IF A IS NOT EQUAL TO 7 AND A IS NOT EQUAL TO 8 PERFORM SOUTH ELSE PERFORM NORTH. רצוי, אם ניתן, במקרה של רישום הוראה IF עם תנאי מורכב, לרשום כל משפט בשורה נפרדת, לצורך קריאה בהירה יותר של המשפט ומניעת בלבול בהבנה. לדוגמא: IF GROSS-PAY > TOTAL ADD 50.00 TO COMMISSION MULTIPLY GROSS-PAY BY TAX GIVING TOT1 ELSE ADD 25.00 TO COMMISSION |
 |
|
|
|
|
| נשלח ב-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, כשמות של רשומות, אף הם חייבים להיות ייחודיים. אולם NAME, AMT ו-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. |
בכל פעם, שבחטיבת הנתונים משתמשים באותו שם יותר מפעם אחת, עלינו לזהותו בשעת עיבודו בחטיבת הביצוע. מילות המפתח OF, INמשמשות לזיהויו של שם, וניתנות להחלפה זו בזו. שיטה זו של שימוש באותו שם-נתונים להגדרת כמה שדות ברשומות נבדלות, הוא מכשיר-תכנות שימושי. אם משתמשים בזיהוי שמות, רישומים בחטיבת-הביצוע נעשים קלים יותר להבנה לקורא התכנית, וקלים יותר לניפוי משגיאות על ידי המתכנת, האמירה 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 סדר מודרג של ביצוע התנאים הנ"ל. שמות קבצים, שמות רשומות, ושמות-נתונים באזור האיחסון לעבודה ברמה 77 - חייבים להיות ייחודיים, כלומר לשמש לקובץ אחד או לרשומה אחת. שמות, המגדירים שדות-נתונים בתוך רשומה, אינם חייבים להיות ייחודיים. אותו שם יכול להגדיר אזורים שונים בחטיבת הנתונים. יחד עם ואת, בכל פעם שניגשים לשדות אלה בחטיבת-הביצוע, חייבים לזהותם. התבנית, המשמשת לזיהויו של שדה, היא: } שם רשומה} [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.
|
לעיתים דרוש להגדיר שדה יחיד בחטיבת הנתונים, נשני אופנים שונים או יותר. אם אותו אזור צריך לשמש למטרות שונות, אנו חייבים להגדירו בתבנית נוספת (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. יחד עם זאת, מותרת חלוקה נוספת של פריטים, העוברים הגדרה-מחדש. הדוגמאות הבאות הן הגדרות תקינות: 02 FLD1. 03 FLD1A PIC X(5). 03 FLD1B PIC 99. 02 FLD2 REDEFINES FLD1 PIC X(7). |
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, כשמות של רשומות, אף הם חייבים להיות ייחודיים. אולם NAME, AMT ו-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. |
בכל פעם, שבחטיבת הנתונים משתמשים באותו שם יותר מפעם אחת, עלינו לזהותו בשעת עיבודו בחטיבת הביצוע. מילות המפתח OF, INמשמשות לזיהויו של שם, וניתנות להחלפה זו בזו. שיטה זו של שימוש באותו שם-נתונים להגדרת כמה שדות ברשומות נבדלות, הוא מכשיר-תכנות שימושי. אם משתמשים בזיהוי שמות, רישומים בחטיבת-הביצוע נעשים קלים יותר להבנה לקורא התכנית, וקלים יותר לניפוי משגיאות על ידי המתכנת, האמירה 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 סדר מודרג של ביצוע התנאים הנ"ל. שמות קבצים, שמות רשומות, ושמות-נתונים באזור האיחסון לעבודה ברמה 77 - חייבים להיות ייחודיים, כלומר לשמש לקובץ אחד או לרשומה אחת. שמות, המגדירים שדות-נתונים בתוך רשומה, אינם חייבים להיות ייחודיים. אותו שם יכול להגדיר אזורים שונים בחטיבת הנתונים. יחד עם ואת, בכל פעם שניגשים לשדות אלה בחטיבת-הביצוע, חייבים לזהותם. התבנית, המשמשת לזיהויו של שדה, היא: } שם רשומה} [OF] ( שם נתונים) } פריט מקובץ } [ON]
|
 |
|
|
|
|
| נשלח ב-27/7/2011 16:30 |
|
| |
אני מבקשת לא להוסיף לאשכול זה תגובות נוספות. אם יש הצעות ייעול - אשמח לקבל בפרטי.
|
|
|
|
|
 |
|
|
|
|
| מנהל לחץ כאן לנעילת האשכול
|
|