with בפניה לשדה רשומה
בתת תוכניות הקודמות, בכל פעם שהיינו צריכים לפנות לשדה שהוא חלק מרשומה, היינו צריכם לכתוב את שם הרשומה, נקודה ושם השדה הרצוי.
כאשר נעשות בבת אחת מספר פעולות על שדות הרשומה, ניתן להשתמש ב-with (מילה שמורה).
לדוגמא:
if THIS_RECORD.X > 1 then
begin
write('*');
THIS_RECORD.Y:=2;
end;
wite THIS_RECORD do
begin
if X>1 then write('*');
Y:=2;
end;
כלומר, לאחר המלה השמורה with נרשום את שם הרשומה ואז נשתמש בתאי הרשומה ללא הצורך להזכיר בכל פעם את שם הרשומה.
מבנה with הוא:
do שם רשומה with begin
הוראות הכוללות שדות של הרשומה הזו
;end
|
כמובן, אם בתוך הבלוק הפנימי יש רק הוראה אחת ניתן לוותר על הבלוק הפנימי.
לדוגמא:
with THIS_RECORD do if X > 1 then write('*');
דוגמא:
כתוב תת תוכנית הקוראת רשומה מקובץ קלט, הרשומה מכילה שדה של מספר ממשי, ושדה של מחרוזת בת 17 תווים.
מחרוזת בת 17 תווים היא מחרוזת הכוללת את התווים המרכיבים מספר ממשי. הבנוי בצורה:
על התוכנית להפוך את המחרוזת, שרשומים בה תווי המספר הממשי, למספר ממשי
ולהציבו בשדה המספר הממשי. אם המחרוזת אינה בת-המרה למספר, כלומר, התווים
אינם מרכיבים מספר תקני, אזי הצב במספר הממשי אפס.
פתרון:
כדי להפוך מחרוזת, המכילה תווים שם מספר, נשתמש בתת התוכנית (פרוצדורה) הניתנת על ידי הטורבו פסקל.
פרוצדורה זו היא val (מלה שמורה) והמוגדרת על ידי הפסקל:
val (S:string; var V; code: integer);
|
כאשר: S:string זוהי המחרוזת המכילה את המספר להמרה.
var V - שלם או ממשי ובו נקבל את תוצאת ההמרה.
code : integer - יכיל אפס אם המחרוזת היא בת המרה למספר.
program NAME; type STRING_REAL = (*הצהרת הרשומה הכוללת את שדה המחרוזת *) (*השדה הממשי *) record STRING_NUM: string[17]; REAL_NUM: real; (* המשתנה הממשי *) end; · · קטע הבא לפני תת תוכנית זו ·
procedure STR_TO_NUM (var IN_RECORD: STRING_REAL); { תת תוכנית להפיכת מחרוזת למספר ממשי } (* IN_RECORD – הרשומה המועברת והמוחזרת *) var OK: integer; begin with IN_RECORD do (* IN_RECORD עם השדות של הרשומה *) begin val (STRING_NUM, REAL_NUM, OK); (*הפיכת המחרוזת לממשי*) if OK <> 0 then (* אם המחרוזת אינה בת המרה *) begin writeln('למספר',STRING_NUM, 'אי אפשר להמיר את' ); REAL_NUM := 0; (* והצב אפס כנדרש *) end; end; end; · · קטע הבא אחרי תת תוכנית זו · |
כאשר המחרוזת תגרום לתוצאה החורגת מגודלו המקסימלי האפשרי של המספר, התוכנית תפסיק את הביצוע תוך כדי ריצתה (Run time Error).
נתונה התוכנית הבאה:
program WRITE_TO_FILE; { text תוכנית לכתיבה וקריאה של נתונים לקובץ } var ST: string[225]; (* מחרוזת שתשמש לקריאת נתונים שנכתבו לקובץ *) A:string[3]; (* מחרוזת שנכתוב לקובץ *) B:integer; (* שלם שנכתוב לקובץ *) C:boolean; (* ערך בוליאני שנכתוב לקובץ*) D:real; (* ממשי שנכתוב לקובץ *) FILE_TEXT:text; (* הקובץ שאליו נכתוב וממנו נקרא *) begin { הצבת ערכים לתאים } A:= 'XYZ'; B:= 12345; C:=true ; D:=1.2; { קישור השם של הקובץ בתוכנית לשם הקובץ על הדיסקט } assign (FILE_TEXT, 'FFF'); { הכנת הקובץ לכתיבה } rewrite(FILE_TEXT); { כתיבת הערכים לקובץ } write (FILE_TEXT,A,B,C,D); {סגירת הקובץ} close (FILE_TEXT); {פתיחת הקובץ מחדש} reset (FILE_TEXT); { קריאת מחרוזת מהקובץ} read(FILE_TEXT); { סגירת הקובץ,שוב } close(FILE_TEXT); { ולבסוף הדפסת המחרוזת כדי שנראה מה קיבלנו } writeln (ST); end;
הפלט שיתקבל לאחר הרצת התוכנית:
XYZ12345TRUE 1.2000000000+00 |
כלומר, קיבלנו את תוכן התאים כאשר כל הערכים הפכו לתווים הנמצאים במחרוזת.
היתרון: אפשר לרשום לקובץ text נתונים ללא מבנה רשומה. כך יוכל הקורא את הקובץ לפענחו לבד, ללא צורך בידיעת מבנה הקובץ.