case במבנה רשומה משתנה
נסתכל על הצהרת הרשומה הבאה העוסקת בצורות גיאומטריות:
ממבנה case זה בתוך רשומה, ניתן להבחין כי אפשר להגדיר רשומה באורך משתנה ובמספר שדות שונים. תוכן השדה KIND הוא שיקבע איזה סוג רשומה זו. |
בעצם, הגדרנו שלושה סוגי רשומות שונות (שיכולות להיכתב לקובץ אחד) תחת השם GEOMETRIC_STRUCTURE.
אפשרויות הרשומה לפי KIND הן:
מבנה case בתוך רשומה:
הצהרת שם=
case סוג: שם השדה of |
* ניתן להגדיר רק case אחד ברשומה. * לקבוע אחד ניתן להגדיר רק סוג אחד של משתנה. * בין המשתנים יופיעו פסיקים. |
דוגמא:
כתוב תת-תוכנית הקוראת מקובץ קלט נתוני מבנים גיאומטריים ומדפיסה את שטחם של הצורות הגיאומטריות.
פתרון:
program NAME; type GEOMETRIC_STRUCTURE = (* רשומה של צורות גיאומטריות *) record X,Y : real ; (* מיקום הצורה הגיאומטרית *) case KIND: string[10] of (* איזו צורה גיאומטרית *) { מלבן } 'RECTANGLE' : (HEIGHT,WIDTH: real); (* גובה ורוחב*) { משולש } 'TRIANGLE' : (A,B,C: real); (* צלעות המשולש *) { מעגל } 'CIRCLE ' : (RADIUS: integer); (* רדיוס המעגל *) end; (* וגם את הרשומה case סוגר גם את ה- *)
INPUT_FILE = file of GEOMETRIC_STRUCTURE; · · קטע הבא לפני תת תוכנית זו ·
procedure ARIA (var FILE_IN: INPUT_FILE) { תת תוכנית להדפסת שטח מצולעים} (* FILE_IN – קובץ הקלט *) var INPUT_RECORD: GEOMETRIC_STRUCTURE; (*הרשומה מקובץ הקלט *) S : real; (* משתנה עזר לחישוב שטח המשולש *) begin while not eof (FILE_IN) do (* המשך עד סוף הקובץ *) begin read (FILE_IN, INPUT_RECORD); (* קרא רשומה *) with INPUT_RECORD do (* ועם שדות הרשומה *) begin if KIND = 'RECTANGLE' then (* אך זה אסור, case לכאורה היה מתאים להשתמש ב- *) (* כיוון שהמשתנה צריך להיות מסוג שלם, בוליאני או תווי *) writeln (HEIGHT * WIDTH , '=שטח המלבן'); if KIND = ' TRIANGLE' then begin S:= (A+B+C)/2; S:= sqrt ( S * (S-A) * (S-B) * (S-C) ); writeln(S, ' = שטח המשולש'); end; if KIND = 'CIRCLE' then writeln (3.14 * RADIUS * RADIUS, '= שטח המעגל'); end; end; end; · · קטע הבא אחרי תת תוכנית זו · |