- שנה: 1994
- מחבר: Alan R. Neibauer רונן אליאב
- מו"ל: Bug
- פורמט: ספר
- נמסר ע"י: ספריית יונס וסוראיה נזריאן, אוניברסיטת חיפה
- תגיות: תכנות
OCR (הסבר)
++0/0 ד
₪ מכיל תקליטון קומפיילר 6 - חינם
חיסכון של מאות דולרים
0 מתאים במיוחד למתחילים
4 הדרכה מלאה ודוגמאות בשיטת צעד-אחר-צעד
4 כולל שאלות למבחן עצמי = המסייעותלך לזכור את
החומר הנלמד
0
ו 6
*6ם
ו
0 + .
0
שד ו ו
/
/
++0/0
התוכנית הראשונה שלי
אלאן ר. נייבאור
-
₪ וו
ספר זה תורגם מ: וחגזקסץ] ++ 0/6 ופעו קוסע
48 :15886
בסוו61 20826ח1.3 ב15[קחש נתסז] תסו)ג!5תג11 266ותסתוט ה
4 .סם] 85% 5 6 זםקןזץקס6 |תוקוזס
4 10187506 3110 69 תסגוג|פתגזך
תרגום: רונן אליאב
הפקה: לילי צראף - באג מולטיסיסטם בע"מ
עריכה לשונית: שולה גרינברגר - באג מולטיסיסטם בע"מ
סדר ועיצוב: מיקסס טכנולוגיות בע"מ
דפוס: טופרינט בע"מ
כריכייה: כריכיית אהרון
הודפס בישראל כסלו תשנ"ד--נובמבר 1994
9 כל הזכויות שמורות
באג מולטיסיסטם בע"מ הוצאה לאור
אין להעתיק ספר זה או קטעים ממנו בשוס צורה ובשוס אמצעי אלקטרוני או
מכני, לרבות צילוסם והקלטה, ללא אישור בכתב מהמוציאים לאור.
שיווק והפצה:
באג מולטיסיסטם בע"מ
רחוב כנרת 13 בני ברק טל: 03-5794711, פקס: 5708174 -03
תוכן העניינים
הקדמה
מה מעניק לך הספר
כלי תכנות מושלס
סנאה 3 ריט 6א/ר'ן ?
תוכנית מחשב
שפות תכנות
מהדרים (קומפיילרים)
תרגמנים (61615זקז16ם1)
יתרונותיה של ++02/06)
מהירות
התאמה למחשבים שונים
בקרה
ספריות פונקציות
הגרסאות השונות
מהו תכנות מונחה-עצמים!
מה יכולה שפת 6 לעשות עבורך, ומה לא!
שלבים בתכנות
תכנון התוכנית
כתיבת התוכנית
הידור (קימפול) התוכנית
קישור התוכנית
בדיקת התוכנית
לימוד תכנות
מה דרוש כדי לתכנת
עתידך עס שפת התכנות ++6/0
שאלות
תרגילים
שת התכןות ++6/6
המבנה של תוכנית 6
אותיות גדולות, אותיות קטנות (באנגלית)
הפונקציה ()תזט)6ז
שימוש בהערות (5)תסנתוזס0ס)
הערות בשפת ++0
הבנת נושא הפרמטרים
הפקודה 006ַ[6ת%1
עיצוב התוכנית
שאלות
תרגילים
אשתיטו 1ק/8'
נתונים תווייס
מחרוזות
מספרים שלמים
מספרים עשרוניים
מדוע להשתמש במספרים שלמיס!
קבועים ומשתניט
מתן שמות לקבועיס ולמשתנים
הכרזה על קבוע
קבועים בשפת ++.6
מדוע להשתמש בקבועים!
הכרזה על משתנה
הקצאת ערכים
הכרזה על משתני מחרוזת
טיפוסי נתונים ופונקציות
ערכים מילוליים
תכנון התוכנית
4
שאלות
תרגילים
ה6/0 060/ת. התכ(ות ++6/6
הפונקציה ()פ)טץ
הפונקציה ()41תס)נוק
פיצול אישיות
קודיס של בקרה
קוד שורה-חדשה (6ת:]-אוסם)
קוד דילוג (0ג'1)
קוד תזטש6ת
קוד 050806
קוד הזנת עמוד (660]מזזסי)
הצגת תווים מיוחדים
הפונקציה הרב-צדדית ()1)תוזק
הצגת מספרים
הזנת שורה (2666 6ם1.1)
המרת טיפוסי נתוניס
קביעת תצורת הפלט
בחירת פקודת הפלט הנכונה
הפלט בשפת התכנות ++.6
עיצוב התוכנית
שאלות
תרגילים
הק6/7 060/ת התכ[ות ++06
הפונקציה (86180
הפונקציה ()ז260
8
8
השהיית תוכנית ("6טם11ת0:) 10 זסות 655זק")
אופרטור הכתובת .6
הפונקציה ()1ת509
שטף קלט (68זו9)
שימוש בפונקציה ()/מ509
השגת קלט מתאים
היזהר בשימוש בפונקציה ()1ם508
הקלט בשפת התכנון ++0
משתנים שלא נקבע להס ערך
אלגוריתמים שימושיים לקלט
שאלות
תרגילים
סי 080 (7/670/6') = ,
אופרטוריס חשבוניים
חילוק מספריס שלמים
אופרטורים וטיפוסי נתוניס
ביטוייס
סדר קדימויות
אלגוריתמיס שימושייס לעיבוד נתונים
מונים
אופרטורים של תוספות קבועות
אוגריס
אופרטוריס של הקצאת ערכים
הקצאת ערכים התחלתייס
עיצוב התוכנית
היזהר משגיאות לוגיות
חפש תבניות חוזרות
איתור ותיקון תקלות
שאלות
97
068
100
11
15
16
|08
108
109
110
112
16
5
17
139
11
146
15
1|0
11
1:52
1:5
1%6
117
18
108
18
119
10
תרגילים
כ'"+3 8/0//ת הסו(קצ'/ת
שימוש בפונקציות
משתנים בפונקציות
משתנים אוטומטיים (מקומיים)
משתנים חיצוניים (גלובלייס)
משתנים סטטיים
העברת פרמטרים
החזרת משתניס
החזרת ערכים מטיפוס ]108
הפונקציה ()תזט!6ז ב-()תו4ח
שימוש בהגדרות מקרו
עיצוב התוכנית
משתנים אוטומטיים לעומת משתנים חיצוניים
קלט בלתי תקף
שאלות
תרגילים
]ה את ההח/ה סיכ" החש
- פקודה קטנת-גדולה
תאים
פקודות מרובות
הפקודה 16..6156
ביקור חוזר בתוכנית החידון
אופרטוריס לוגיים
פקודות 11 מקננות
המבנה של )11ו0856/0618/ת1)0/ו5
בדיקת משתנים מטיפוס )1108 ומחרוזות
0
עיצוב התוכנית
בדיקת תקפות הקלט
שאלות
תרגילים
סאה חופת
שימוש בלולאת זס!
השהיית התוכנית
הוראות מרובות
שימוש במשתנים
לולאות מקננות
שימוש בלולאת 116ת/ו...0
לולאות 60 מקננות
שימוש בלולאת 116ש
שילוב של לולאות מסוגיס שוניס
עיצוב התוכנית
שימוש בדגלוניס
שימוש בפקודה %ףסזט
שאלות
תרגיליס
א6רכי'ס !אחר//ת
מערכים
הכרזת מערך
הכנסת ערכים למערך
טיפול במערכים
בדיקת מערך
העברת מערך
תרגיל במערכים
20
1
172
מחרוזות
השוואה בין שתי מחרוזות
קביעת אורך המחרוזת
הקצאת ערכיס למחרוזות
איחוד מחרוזות
מערכי מחרוזות
עיצוב התוכנית
שאלות
תרגילים
אכניטו 31 אי
. . . . . . . . . . . .
שימוש במבניס
הגדרת מבנה
הקצאת ערכיס למשתנה מבנה
הקצאת ערכים התחלתיים
שימוש במבנה
מערכי מבנה
מבנים ופונקציות
הבנת נושא המצביעים
מצביעים ופונקציות
שאלות
תרגילים
0
הבנת נושא הקבצים
הכרזת קוב
פתיחת קוב
כיצד פועלים קבציס
הימנעות משגיאות הרצה
11
סגירת קוב
פונקציות קלט ופלט
עבודה עס תוויס
קריאת תווים מקובץ
עבודה עם שורות
קריאת מחרוזות
קלט ופלט מפורמטים
קריאת קבצים מפורמטים
עבודה עס מבנים
קריאת מבנים
קריאה לתוך מערך
הוספת נתונים לקובץ
פורמט של מלל ופורמט בינארי
פורמט בינארי
הדפטת נתונים
עיצוב התוכנית
שאלות
תרגילים
. .
היישוס
הכרזות כלליות
הפונקציה ()מוגוח
הוספת רשומה: הפונקציה ()80000
מחיקת רשומה: הפונקציה ()66106
שינוי נתוני תקליט: הפונקציה ()0100
שינוי מיקוס: הפונקציה ()100ו01
הצגת רשומה: הפונקציה ()100816
הדפסת דו"ת: הפונקציה (11860ק
מיון רשומות: הפונקציה ()5011
קש'רת כ/ ה7ק3//ת
נלפח | ה0א/6 סתק6/| ההצגאה 317
התקנת המהדר (קומפיילר) 8
השימוש בעורך התוכניות 6017 09
שמירת תוכנית 220
ניקוי המסך 220
יציאה מ-0011) 220
הטענת תוכנית 21
הדפסת מלל התוכניות 21
שימוש בקומפיילר 200 21
התקנת 206 0
ההבדליס לעומת 6 81א1 22
קימפול תוכנית 22
קישור התוכנית 23
הרצת התוכנית 24
שימוש בתוכניות ההדגמה 26
פתרונות לתרגילים 23
אינדקס 7
הקכאה
,
000000 א 0003000000
שכת את כל אותם סיפורים ששמעת על הקשיים הרבים הכרוכים בתכנות מחשבים.
התעלם מכל אותן מעשיות על התמודדות ומאמ אדירים. אינך צריך להיות מוטרד כלל
אם אינך בעל תואר דוקטור למתמטיקה או למדעים.
לימוד תכנות מחשבים, וכתיבת התוכניות בפועל, יכולים להיות מהנים. אם אתה בעל
מחשבה לוגית, אס אתה אוהב לפתור חידות ובעיות, או אס ברצונך לשלוט במתשב
שברשותך במקוס שהמחשב ישלוט בך, הרי שאתה מועמד מושלם ללימוד תכנות.
אתה אוחז בידך את הספר שיכול להכניס אותך לעניינים בצורה הטובה ביותר. ספר אה
נועד למתחילים, לעושים את צעדיהס הראשוניס בתכנות. למעשה, הנחת המוצא של הספר
היא שאינך :דע דבר וחצי דבר אודות תכנות מחשבים. (הספר מתאים במיוחד גם
למתכנתים מנוסים העוברים לשפת 6 ולשפת ++6 משפות תכנות אחרות, כגון 84516
פסקל, או אפילו שפות מקרו המשמשות בתוכניות כמו 0:6761100/, פנוזס.] ו-061א).
לאמיתו של דבר, כל שנדרש כדי ללמוד תכנות הוא הספר הזה ורצון ללמוד. התקליטון
המצורף לספר מכיל אפילו מהדר (קומפיילר) ועורך תוכניות, בעזרתם תוכל לכתוב תוכניות
משלך.
תוכנית ++06/6 הראשונה שלך מתמקד בגרסאות של שפת התכנות 6 הידועות בכינוייס
תקן 88א ותקן 6 41%51, וכן במאפייניס המרכזיים של גרסת ++6. ניתן ליישם את כל
הטכניקות שתלמד בספר זה בתוכניות :6 ובתוכניות ++6. אם אתה מתעניין בשפת ++0,
חפש את הקטעיסם, ההערות והערות השוליים המתייחסות במיוחד לגרסת העילית הזו של
שפת התכנות 6.
1 מעניק לך הסר
בעזרת ספר זה תלמד, צעד אחר צעד, כיצד לכתוב תוכניות. תמצא בספר הסברים בהירים,
קלים להבנה, וכן שפע של תרשימים ודוגמאות. על ידי קריאת ההסברים ועיון בתרשימים
ובתוכניות ההדגמה, תלמד להכיר את כל הנושאים הקשורים בתכנות, על-פי הסדר
המתאים. כל אחד מפרקי הספר מסתיים בשאלות חזרה שימושיות ובתרגילים מעשיים.
הספר נועד, אמנם, למתכנת המתחיל, אך הוא משמש גם כספר מבוא מקיף. לא החסרנו
דבר. בעזרת ספר זה תלמד לא רק שפת תכנות, אלא גם תגלה את ההיגיון שבעיצוב
תוכניות ובפתרון בעיות.
בפרקים 1 ו-2 תלמד על תהליך התכנות, וכן על המבנה והתכונות של תוכנות 6 ותוכניות
++6. בפרק 3 תלמד כיצד לתקשר עס תוכנית, תוך שימוש במשתנים ובקבועים.
מה מעניק לך הספר 1
11
בהמשך, תלמד בפרק 4 כיצד להציג מידע על-גבי הצג, ובפרק 5 תגלה כיצד להזין מידע
מהמקלדת. בפרק 6 תלמד איך לכתוב תוכניות, תוך שימוש בסימני פעולה (אופרטורים)
לביצוע חישובים.
בפרק 7, העוסק בפונקציות, תגלה כיצד לבנות את תוכניותיך בקטעים, תוך כדי חלוקת
התוכנית למקטעים שקל לטפל בהט. פרק 8 עוטק בנושא קבלת החלטות, ופרק 9 מדגים
כיצד לחזור על הוראות באמצעות לולאות.
לאחר שרכשת כישורי תכנות, תלמד בפרק 10 על מערכים ומחרוזות, ובפרק 11 על
מצביעים ומבנים. בפרק 12 תלמד כיצד לקרוא ולכתוב קבצים, וכיצד לשגר נתוניס
למדפסת.
כדי לשלב זה בזה את הכישוריס שרכשת, מציג פרק 13 תוכנית הדגמה מקיפה המשמשת
לבניית יישום של מסד (תוניס. מקריאת הפרק ומעיון בקוד התוכנית תלמד כיצד יש לבנות
יישומים מקצועיים.
הנספת בסוף הספר מסביר כיצד להתקין את הקומפיילר ואת עורך התוכניות שבתקליטון
המצורף, וכיצד להשתמש בהם, וכן כיצד לגשת לתוכניות ההדגמה ולפתרונות לתרגילים,
הנמצאיס אף הס על-גבי התקליטון.
לאחר שתסיים לקרוא את פרקים 1 ו-2, בצע את ההוראות הכלולות בנספח לצורך התקנת
התוכניות שעל התקליטון. לאחר ההתקנה תוכל לעקוב, תוך כדי קריאת הפרקיס הבאים,
אחר ההדגמות שבתוכניות. אנו בטוחים שתוכל במהרה לכתוב תוכניות משלך, לשימוש
במשרד, בביה"ט או בבית.
לי תכנות מושלם
אם יש כבר ברשותך קומפיילר 6 או ++6, תוכל להיעזר בו ללימוד שפת התכנות 6 ולכתוב
את התוכניות המוצגות בספר. אך גם אם אין ברשותך קומפיילר משלך, כל מה שאתה
זקוק לו כלול בתקליטון המצורף לספר.
התקליטון המצורף לספר זה כולל יותר מאשר תוכניות הדגמה בלבד. הוא מכיל קומפיילר
6 מלא, קשר, ספריית פונקציות מקיפה, וכן חוברת עזר בת 80 עמודים, אותה תוכל
להדפיס בעזרת מעבד תמלילים או באמצעות פקודת )חוז? של 08.
התקליטון כולל גם עורך מלל לכתיבת תוכניות ולעריכתן, ואפילו מאגד תוכניות, שיסייע לך
אם תרצה ללמוד בשלב מאוחר יותר את שפת התכנות /48961 1.. בתקליטון תמצא גם
עותקים של כל תוכניות ההדגמה המופיעות בספר. תוכל לקמפל ולהריץ את התוכניות
בצורתן הנוכחית, או לפתוח אותן בעזרת העורך, כדי להתעמק בהן או להשתמש בהן
כבסיס לבניית תוכניות משלך.
קאה 3 ;7 1₪6ר' 7
2 נשים בוחרים ללמוד תכנות מחשבים מסיבות שונות. בראש ובראשונה,
י כמובן, מדובר בכסף. מרבית תוכניות המחשב נכתבות כאמצעי להרווית
כסף. תוכניות מסוימות נכתבות עבור קהל יעד או ענף מסוימיס, בעוד שתוכנמות
אחרות נכתבות עבור הקהל הרחב של משתמשי המחשב. כך או כך, המטרה דומה -
ליצור הצלחה מסחרית. ייתכן שלא תכתוב לעולם תוכנית מחשב שתהפוך "להיטיי
עולמי, אך תוכל להרוויח כסף מכתיבת תוכניות מחשב עבור משתמשים אחרים.
2
ייתכן שברצונך לכתוב תוכניות מחשב בגלל האתגר והחוויה הכרוכים במשימה, בדיוק
מאותה טיבה שאנשים אחרים מטפסים על הרים, פותרים תשבצים או מנסיס להתקבל
לנבחרת האולימפית. אם אתה מתכנת מטיפוס כזה, אתה ודאי שואב סיפוק רב מעצם
כתיבת התוכנית, מתחילתה ועד סופה. תוכנית מחשב היא מעין חידה, תרגיל שכלי, בו אתה
מתמודד נגד המחשב להשגת שליטה מלאה.
ייתכן שאתה עוסק בתכנות כדי לפתור בעיה מיוחדת. עליך לבצע מטלה כלשהי בעזרת
המחשב, ואינך מוצא תוכנית מסחרית העונה לצרכיך, או שאינך יכול להרשות לעצמך
לרכוש תוכנית כזו. זו יכולה להיות תוכנית פשוטה ביותר, כמו תוכנית לאיסוף ותיעוד של
מרשמים לבישול, או תוכנית מורכבת לפתרון בעיה עסקית או הנדסית ייחודית.
תהא אשר תהא הסיבה לכך שאתה מעוניין לתכנת את המחשב, העיסוק בתכנות מעניק לך
תחושה של הישג אישי והצלחה. קל להתמכר לתחושת הסיפוק שחשים כאשר התוכנית
פועלת כהלכה. מאידך, התסכול שתשים כאשר התוכנית אינה פועלת, עלול להיות הרסני.
אך כמו כל אתגר - זה שווה את המאמ.
1 וננית מחעוב
קרוב לוודאי שכבר התנסית בהרצת תוכניות מחשב - מעבד תמלילים, תוכנית גיליון נתוניס
אלקטרוני, מסד נתונים, או אפילו משחק מחשב אחד או שניים. אך כאשר אתה מריצ
תוכנית מחשב, אתה מתבונן בה מבחוץ בלבד. אינך רואה מה עושה התוכנית באמת, אלא
רק את תוצאות פעולתה.
כאשר אתה כותב תוכנית מחשב, אתה מתבונן בה מבפנים. אתה יודע כיצד התוכנית פועלת,
ומדוע היא פועלת כך ולא אחרת. זוהי דרך שונה לגמרי ומלהיבה יותר, להתבונן בתוכנית
מחשב. אין זה משנה עד כמה אתה בעל ניסיון בהרצת תוכניות, או עד כמה אתה מתמצא
במחשבים, כתיבת תוכנית מחשב מציבה בפניך אתגרים חדשיס לחלוטין.
האם הזדמן לך פעם להדריך מישהו המחפש כתובת כלשהי! האם לימדת פעם מישהו כיצד
לבצע דבר-מה! זה מה שעושה תוכנית מחשב. תוכנית מחשב אינה אלא סדרה של הוראות
למחשב, המורות לו בדיוק מה עליו לעשות, ובאיזה סדר פעולות, בשפה שהמחשב מבין.
זהו זה.
כאשר הוראה כלשהי אינה מובנת למחשב, הוא מודיע על כך באמצעות הצגת הודעת
שגיאה. כל שעליך לעשות הוא לנסות שוב, לשכתב את ההוראה כך שהמחשב יוכל לעקוב
אחריה. לעתים המחשב יכול לעקוב אחר הוראותיך אפילו כשההוראות שגויות! האם קרה
לך שביקשת הוראות כיצד להגיע למקוס מסוים, ולמרות שביצעת אותן במדויק לא הגעת
למקום הרצוי! דבר דומה יכול לקרות גם בתוכנית מחשב. אלו הן הבעיות הקשות ביותר
לפתרון, מכיוון שאתה עשוי שלא לדעת כלל על קיומן.
עתה, הבה נמשיך ונבחן את ההגדרה של תוכנית מחשב.
פרק 1: במה דבריס אמורים!
ההוראות מודוח למחעוב מה עליו לעעוות בד'!ק. | מלת המפתת היא בד"ק. כל
הוראה חייבת להיות מדויקת. לא ניתן לדלג על שלבים כלשהם. לדוגמה, נניח שמישהו
שואל אותך כיצד להגיע לסוכנות הדואר השכונתית. אתה עונה: 'המשך ישר לאורך שני
גושי בניינים ופנה שמאלה ברחוב פרנקלין". אתה מניח, כדבר מובן מאליו, שאותו אדס
יראה את סוכנות הדואר וייכנס אליה.
- 0 ל
הערות ++6 ן
++6 היא שפה נוהלית פחות משפות תכנות אחרות. הוראות
מסוימות מתייחסות ל"עצמים"" ול"אירועים", במקום להציג רצף
של צעדים. עם זאת, ההוראות, בין אם הן נוהליות ובין אם לאו,
חייבות להיות מפורשות ומלאות. ו
6 םק םי 0
בעבודה עם המחשב, לעומת זאת, אינך יכול להניח שדבר-מה הוא מובן מאליו. לכן, אם
עליך להדריך את המחשב כיצד למצוא את טוכנות הדואר, ההוראות שתמסור יהיו
כדלקמן: המשך ישר לאורך שני גושי בניינים. בצע פנייה של 90 מעלות לכיוון שמאל. המשך
להתקדס עוד 20 מטריס. בצע פנייה של 90 מעלות לכיוון שמאל. טפס ארבע מדרגות. פתח
את הדלת והיכנס פנימה.
כאשר אתה שומר מסמך בתוכנית עיבוד תמלילים, לדוגמה, על התוכנית לדעת בדיוק אילו
צעדיס עליה לבצע. עליה לדעת היכן להציב את המסמך בתקליטון. עליה גם לקבל הוראות
להציג הודעת אזהרה כלשהי, במקרה ששמירת המסמך החדש עלולה לשכתב מסמך שכבר
שמור על-גבי התקליטון.
ההוראוח חייבות להינת| בשדר ה[ .]!3 אם תורה למחשב לבצע פעולות 4, 8 ו-6,
המחשב יבצע אותן בסדר הזה. המחשב אינו יכול לחשוב "רגע, זה לא נשמע לי נכון, אולי
עלי לפנות קודס לרחוב פרנקלין". עס זאת, ניתן לגרוס למחשב לקבל החלטות. התוכנית
יכולה להחליט "אס משכורתה גבוהה מ-550,000, אז יש לנכות 25% מסים, ואם לא - לנכות
רק 15%". אך עליך לומר למחשב מתי לקבל את ההחלטה, ומה לעשות כאשר מתקיים כל
אחד מהתנאים.
לדוגמה, נבחן שוב את המקרה של שמירת מסמך חדש, ששמו זהה לשמו של מסמך שכבר
קיים על-גבי התקליטון. אם התוכנית היתה שומרת את המסמך החדש, תוך כדי מחיקת
המסמך הקודם, ואז שואלת אותך אם זה מה שאתה אכן רוצה לעשות - זה לא היה פתרון
מוצלח. על התוכנית להציג תחילה את ההודעה, ואז להחליט מה לעשות על סמך הקלט
שלך. אם תאשר את הפעולה, התוכנית תשכתב את המסמך הקיים. אם לא תאשר את
הפעולה, התוכנית תבקש ממך להקליד שם חדש עבור המסמך שברצונך לשמור.
תוכנית מחשב 3
ות הכנות
הדרישה השלישית מתוכנית מחשב היא שעליה להיות כתובה בשפה שהמחשב יכול להבין.
עמוק בתוך המתשב נמצא מיקרו-מעבד, מעגל משולב יחיד השולט בכל מה שמתרחש
במחשב. (ראה תרשים 1.1).
כאשר התוכנית מורה למתשב להציג הודעה על-גבי הצג או להדפיטה במדפסת,
המיקרו-מעבד משגר את האותות האלקטרונייס המתאימים. אותות אלה מוריס למחשב
היכן נמצאת ההודעה בזיכרון, ולאן עליו לשגר אותה. מרבית פעולותיו של המיקרו-מעבד
אינן נראות לעין - אתה מזין את התוכנית שלך למחשב ומניח שהמיקרו-מעבד יודע את
תפקידו. אולס כדי להבין כיצד פועל התכנות, עליך לדעת מעט יותר - לא הרבה - על אופן
פעולתו של המיקרו-מעבד.
תרשים 1.1
המיקרו-מעבד שולט בכל
מה שמתרחש במחשב.
א
| ח+ 15 אסא
1 9
₪8 6 1 "0+
0 2695008/
6 0 906
8 8ח+ 18 אסא
06 81 108
0+ 2605008
]8+ 0+ 0008
זיכרון
סורק אופטי
מבחינה טכנית, המיקרו-מעבד מסוגל לבצע ארבע פעולות בלבד. ביכולתו להזיז נתונים
מכתובת זיכרון אחת לאחרת, לשנות נתונים בתוך כתובת זיכרון, לקבוע אם כתובת זיכרון
כלשהי מכילה נתונים מסוימים, ולשנות את רצף ההוראות שהוא מבצע. כל הפעולות האלה
מבוצעות על ידי שיגור אותות אלקטרוניים, קליטתם או בקרה עליהם.
המחשב מטפל באותות האלקטרוניים באחד משני מצבים (רמות מתח); אות אלקטרוני יכול
להיות מופעל או מופסק. כדי לבצע מטלה, אנו מזינים סדרה של אותות - במצב מופעל או
מופסק - למיקרו-מעבד. השילוב של מצבי מופעל/מופסק המודגס בתרשים 1.2, למשל,
מדפיס את התו .
כדי לכתוב הוראות למחשב ברמה בסיסית זו, אנו משתמשים בספרה 0 כדי לייצג את
המצב "מופסק", ובספרה 1 כדי לייצג את המצב "מופעלי. ספרות אלה מכונות "ספרות
בינאריות" (ביטים), או הוראות בינאריות, בהתבסס על שיטת המספור הבינארי (בסיס
שתיים), העושה שימוש בצירופים של 0 ו-1 בלבד כדי לייצג את כל המספרים.
תרשים 1.2
סדרה של אותות
אלקטרוניים במצב
מופעל או מופסק מורה
למיקרו-מעבד איזו
מטלה לבצע - במקרת
זה, לאתזר תו מהזיכרון
ולשגרו למדפסת.
צר
ה-א
זיכרון
8 0%
4 ל ו 0 / 7
%) / 1 %*ן 6% /
שפות תכנות 5
תרשים 1.3
התוכנית ז1016ת4556 ממירה
את ההוראות בשפת
45560017 לקוד בינארי.
בראשית ימי המחשבים ותוכניות המחשב, תוכנית היתה מבוצעת על ידי תפעול ישיר של
אותות מופעל/מופסק אלה. המיקרו-מעבד לא היה קיים עדיין. הטכנאי, ששימש כבקר,
היה מציב שורה של מתגים במצב מופעל או מופסק. אך מכיוון שלביצוע ישוס שלם
נדרשים אלפי אותות בודדים, כתיבת תוכנית מחשב היתה מטלה שגוזלת זמן רב.
עס התפתחות המחשבים, נפתחה הדרך להזין תוכנית למחשב כיחידה אחת, ואז לגרום
למחשב לבצע את ההוראות הכלולות בה. עדיין היה צורך באלפי ספרות 0 ו-1 בודדות, עד
שפותחה שפת התכנות /301ת4586.
שפת ץ51ה45861 עושה שימוש בקוד מנמוני (סנמסותסתמז) כדי לייצג מטלות מחשב
המתייחסות ישירות לחומרה. קוד מנמוני הוא מלה או קיצור שקל לזכרס, המייצגים מטלת
מיקרו-מעבד מלאה. לדוגמה, הקוד 10%( מורה למחשב להזט (₪0%6) מידע כלשהו
ממיקום מסוים בזיכרון למיקוס אחר. הקוד ?1א1 מורה למתשב לדלג (קוחטן) למיקוס
אחר בזיכרון. וכך, במקום לכתוב סדרה של אפסים ואחדים, המתכנת בשפת ע01ו599
יכול להשתמש בקודים כגון 10% ו-12א[, כשכל קוד מייצג שמונה הוראות בינאריות, או יותר.
כפי שניתן לראות בתרשיס 1.3, תוכנית הנקראת :45801016 מתרגמת את הקודים האלה
לאותות אלקטרוניים אותם יכול המחשב להבין. מכיוון שכל קוד מתייחס ישירות לפעולות
ו 0
ו 05 אס צסו
צְ ₪ ח21 זאו
>- | 595008188 | >--- ה40 ,רוג סו
ו 21 דאו
*ס | שה 8
9 ה צסוא
5 0-65 ,אס צסוא
ח21 דאו
ח40 ,זה צסו
ח21 זאו
0000 8
6 פרק 1: במה דברים אמורים!
הפנימיות של המיקרו-מעבד, התוכניות הנכתבות בשפה זו מורצות במהירות רבה מאוד.
אולם השימוש בשפת /101ח2596 עדיין גוזל זמן ודורש מספר גדול של קודים.
מרבית המתכנתים משתמשים היום בשפת תכנות עילית, שהוראותיה מורכבות ממלים
המובנות לבני-אדם, ואינן רק קודים מנמוניים או סדרות של 0 ו-1. כל מלה מייצגת פעולה
מעשית שלמה, ולא רק מטלת מיקרו-מעבד אחת. לדוגמה, הפונקציה 8!טק בשפת התכנות
6 מורה למחשב להציג מידע מסוים על המסך. כדי לבצע אותה פעולה בשפת 455010017
היו נדרשיס מספר קודים מנמונייס, ואולי מאות אותות בינאריים אלקטרונים.
תרשים 14 מדגים הוראה פשוטה בשפת ++0/6, להצגת מלה על-גבי המסך, ואת
ההוראות המקבילות לה בשפת ץ01ו556/ ובקוד בינארי. איזו משפות התכנות נראית לך
קלה יותר לקריאה ולכתיבה!
תרשים 1.4
בשפת 6 הוראות מקבילות
בשפת 0, בשפת
("אםפצפ")פסגוקש ץ01גת4556 ובקוד
בינארי.
בשפת 55010017
9 ,זג טסא
אגא למפתפעס ,אס טסא
ת1? עאך
ג40 ,26 טסא
ת1? עאך
"אממצ5" 5 פאגא
בקוד בינארי
7" /7-+/ 21
"772" 01
-""""""""""""""(""|",("( "3" 1
7"
כמובן שהמחשב אינו מבין באמת מה פירוש הפקודה 7018 או כל פקודה אחרת בשפת
תכנות עילית. קודס שהמתשב יוכל לבצע את הפקודה, יש לתרגם את הפקודה לשפת
המחשב עצמו - קוד בינארי.
התרגוס ממלים אנושיות להוראות בינאריות יכול להתבצע באחת משתי דרכים. על ידי
הידור (קומפילציה), או על ידי תרגמן.
שפות תכנות 7
1 הדרים (קומביילרים)
פעולת הקימפול מתרגמת את התוכנית כולה כיחידה אחת ושומרת אותה על-גבי דיסקו
כדי שניתן יהיה להריץ את התוכנית במועד מאוחר שותר. כדי לדמיין את אופן הפעולה של
התהליך, הבה נתבונן במצב מציאותי.
נניח שאתה מכין דוח בשפה האנגלית, אותו עליך להציג לפני הפרלמנט הצרפתי. אתה
שוכר מתרגם שיתרגם את הדו"ח לצרפתית, מכין עותקיס במספר הדרוש, ואז מפיץ את
העותקים. במקרה שהמתרגס מגלה שגיאות דקדוק בדו"ח הוא מפסיק את עבודתו ומדוות
לך על כל שגיאה, ועליך לתקן את השגיאה קודס שהמתרגם יוכל להמשיך בעבודת
התרגום. עם זאת, אס תרצה להשתמש באותו הדו"ח בשנה שלאחר מכ|(, כל שיהיה לעשות
הוא להעתיק אותו ולהפי את התרגוס. לא תזדקק עוד לשירותו של המתרגם.
כפי שמודגם בתרשים 1.5, זוהי הפעולה שמבצע הקומפיילר בשפת המחשב. הקומפיילר הוא
תוכנית מחשב, שבעזרת תוכנית נוספת הנקראת קשר - זַ66ת:1, הופכת את כל ההוראות
שנתת לקוד בעארי, כדי שניתן יהיה להרי את התוכנית. הקומפיילר מוודא שהתוכנית
עומדת בכללים שמכתיבה שפת 6 או ++6, ואז יוצר קובץ עצמיס, מעין צורת ביניים של
התוכנית. תוך כדי התהליך, הקומפיילר יודיע לך אס נתקל בהוראה שאינו מבין. עליך
לתקן את הבעיה ולנסות פעס נוספת. הקשר ממיר אז את קוד העצמים לתוכנית שניתן
להריצה. תהליך זה אינו מריץ את התוכנית, אלא מתרגם אותה בלבד.
תרשים 1.5
הקומפיילר והקשר ממירים
את ההוראות משפה עילית
לקוד בינארי.
2
3 6
[ 1
90 06 /
הק - ששל השמומה
4 /(
טיד וו
מ
8 פרק 1. במה דברים אמורים?
הערות ++6
בהמשך תלמד ששפת ++6 היא מעין גרסה משופרת של שפת
6. פירוש הדבר שאם קומפיילר 0 יכול לקמפל את התוכנית
שלך. גם קומפיילר ++6 יוכל לקמפל אותה.
יי
כאשר אתה משתמש בקומפיילר, התוכנית קיימת בשלושה מצבים. הפקודות בשפת 6
מאוחסנות בקובץ מלל הנקרא קוד מקוו. ניתן להדפיס את הקובץ הזה ולקרוא אותו,
בדומה לכל מסמך של מעבד תמלילים, באפשרותך לערוך את הקובץ כדי להכניס שינויים
בתוכנית. התוכנית המקומפלת מאוחסנת בקובץ עצמים, ואילו התוצאות הטופיות
מאוחסנות בקובץ הפעלה, שאותו מריצים.
6, ++6, פסקל, קובול ו- א( 018 הן דוגמאות לשפות מחשב מקומפלות.
סיומות של שמות קבצים
במרבית הקומפיילרים, הסיומת של שם הקובץ המכיל את קוד
המקור צריכה להיות 6., ואילו קובץ העצמים מקבל את הסיומת
. הקומפיילר המצורף לספר זה דורש שסיומת קוד המקור
תהיה 6., ושהסיומת של קובצי העצמים תהיה 0.. הקומפיילר
שברשותך עשוי לדרוש סיומות אחרות.
ו
ו
1 גמנים (5ז6ו6זכןזס)חו)
התרגמן מתרגס כל הוראה למחשב תוך כדי הרצתה. הבה נבחן שוב את הדוגמה של הדו"ח
לפרלמנט הצרפתי.
אתה כותב את הדו"ח באנגלית ושוכר מתורגמן. המתורגמן ממיר את המשפט הראשון
לצרפתית ומקריא אותו באוזני חברי הפרלמנט הצרפתי המאזיניס. לאחר מכן המתורגמן
מתרגס ומקריא את המשפט השני, וכך הלאה, עד סיוס הדו'ח. זכור שהדו'ח קיים בפועל
רק בשפה האנגלית. אס בעוד שנה תרצה שדובר צרפתית יקרא את הדו'ח, תצטרך לשכור
שוב מתורגמן ולחזור על כל התהליך.
תרגמן של מחשב פועל בדרך דומה. כפי שמודגם בתרשים 1.6, הוא מתרגם ומריץ את
ההוראות, זו אחר זו. בעבודה עם תרגמן, התוכנית קיימת רק בגרסתה המקורית, בשפת
המקור. שפת התכנות 8516 המטופקת חינם עס 15-208/, היא דוגמה לשפה העושה
שימוש בתרגמן.
תרגמנים (100101615ת1) 0
תרשים 1.6
התרגמן מתרגם הוראות
משפת תכנות עילית לקוד
בינארי בכל פעס שהתוכנית
מורצת.
מדוע שמישהו ירצה להשתמש בתרגמן? כאשר אתה לומד תכנות, התרגמן מאפשר לך
לכתוב ולבדוק את התוכנית שלך, שורה אתר שורה. שפות מקומפלות, לעומת זאת, מחייבות
אותך להשלים את התוכנית כולה, או לפחות קטעים עצמאיים, בני-הרצה, קודם שניתן
יהיה להריץ ולבדוק אותס.
אם כך, מדוע להשתמש בקומפיילר! בגלל העובדה שתרגמנים הופכים את המכניקה של
כתיבת תוכנית לפשוטה וקלה, משתמשים רבים מזניחים את התכנון והעיצוב הדרושים כדי
ליצור תוכנית שפועלת כהלכה. הם מאקים ישר למיס העמוקים, מנסים לכתוב תוכנית
'ביעף", ומבזבזיס שעות ארוכות בתיקון שגיאות בשיטת ניסוי וטעייה. אם אתה לומד
תכנות לראשונה, כדאי לרכוש הרגלי עבודה נכוניס כבר מההתחלה.
תוכניות הכתובות בשפות העושות שימוש בתרגמנים רצות לאט יותר. עליך להטעין את
התרגמן לזיכרון, ואז לתרגם ולהריץ כל שורה בתוכנית בנפרד. קומפיילריס, לעומת זאת,
ממירים את התוכנית בבת אחת. כאשר אתה מריץ תוכנית מקומפלת, היא כבר קיימת
בצורת הוראות בינאריות שהמחשב יכול להריצן ישירות.
10 פרק 1: במה דברים אמורים?
6/6++ ₪ היתונורת*
שפת התכנות .6 היא שפה מקומפלת. זהו אוסף של פקודות ופונקציות, בצורת מלים
מוכרות, המומר לקוד בינארי אותו יכול המחשב להריץ. בשניס האחרונות הפכה 6 לשפת
התכנות המועדפת על ידי מרבית המתכנתים, וזאת בגלל שלוש סיבות עיקריות - מהירות,
התאמה למחשבים שונים ובקרה.
הערות ++6
זכור שכל המידע הכלול בספר זה מתייחס הן לשפת 6 והן לשפת
++6. במקום לציין שוב ושוב את הביטוי ++6/6, נתייחס
בדרך-כלל לשפת 6 בלבד. אין פירוש הדבר שאתה לומד את
שפת 6 בלבד - אלא שאתה לומד את שתי השפות בעת ובעונה
אחת.
םש 0 ו( ו םהש ו ם ל 5
6 הפ מ נש לח אה
מהירות
נחשבת "קרובה" יותר לשפת ע4556151. מכל שפת תכנות עילית אחרת, מכיוון שפקודות
0 מסוימות מתייחסות ישירות לחומרת המחשב. עובדה זו מאפשרת הרצה מחירה של
תוכניות 6 מקומפלות. למעשה, מהירות ההרצה היא כה גבוהה, עד שניתן להשתמש בשפת
6 לכתיבת מערכות הפעלה, יישומי תקשורת ויישומים הנדסייס, ואפילו קומפיילרים.
בנוסף, מרבית הקומפיילרים של 6 יוצרים קוד ברמת אופטימיזציה גבוהה. זוכר את
ההוראות הבינאריות להן זקוק המחשב! ככל שמספר ההוראות שהקומפיילר חייב ליצור
נמוך שתר - רמת האופטימיוציה של הקוד גבוהה יותר - והתוכנית מהירה שתר.
קומפיילרים של שפות מטוימות יוצרים קוד ברמת אופטימיזציה נמוכה, ולכן התוכניות
שנכתבות בשפות אלה איטיות יותר.
התאמה למחעבים עוונים
ניתן ליצור תוכניות מהירות גם בשפת ץ45801. אולם, המנמוניקה של שפת ץ001ז4556
שונה עבור כל משפחה של מיקרו-מעבדים. אם כתבת תוכנית בשפת ץ4556191. עבור
מחשב אישי של א18 או תואם ]%א18, וברצונך להשתמש באותה תוכנית על מחשב
מקינטוש של 16פק4, יהיה עליך לשכתב את התוכנית כולת.
שפת 0 עושה שימוש בטדרת פקודות תקנית ואחידה למדי. באופן כללי, עליך לכתוב את
התוכנית פעם אחת בלבד, ללא קשר לפלטפורמה (מחשב או מערכת הפעלה) עליה אתה
מתכוון להריצ את התוכנית. בעוד שקוד המקור אינו משתנה, תזדקק לשני קומפיילרים -
האחד לצורך תרגוס התוכנית להוראות בינאריות אותן יכול מחשב 18%1 להבין, וקומפיילר
יתרונותיה של ++6/6 1 1
12
נוסף לצורך תרגוס התוכנית לסוג ההוראות הבינאריות של מחשבי 16פק4. אבל את
התוכנית עצמה עליך לכתוב פעם אחת בלבד.
פירוש הדבר הוא שאס למדת לתכנת בשפת 6, שוב אינך צריך ללמוד שפת תכנות נוספת
כדי לתכנת מתשב אחר. באפשרותך להעביר את כישוריך מפלטפורמה אחת לאחרת, ללא
צורך בהכשרה מחדש. אחרי הכל, אינך יודע לאן עשויים כישורי התכנות שתרכוש להוביל
אותך, וכדאי להיות מוכן.
בקרה
6 היא אמנס שפה קלה ללימוד, אך גם לה יש דרישות משלה. בשפת 24516, העושה
שימוש בתרגמן, אתה יכול להתיישב ליד המחשב ולכתוב תוכנית ללא הכנה מוקדמת.
בשפת 6 הדברים אינס כה פשוטים. לשפת 6 יש מבנה, דרך מטוימת בה נעשים הדברים,
שמחייבת אותך לחשיבה לוגית. ניתן אמנם לדלג על דרישות מבניות רבות ולכתוב תוכנית
"מהירה וגסה" שאינה עושה הרבה. אך כדי לכתוב יישום רציני בשפת 0, יש להכין תחילה
שיעורי בית.
עס זאת, המבנה הזה כלל או מהווה סרבול, אלא מקל על העיצוב של תוכניות 6, כמו גס
על תחזוקתן ועל איתור ותיקון השגיאות.
(צריות בונקציוח
שפת 60 עצמה אינה כוללת פקודות רבות. בניגוד לשפות תכנות אחרות, 6 אינה כוללת
פקודות מובנות לקלט ופלט של נתונים, או לטיפול במחרוזות. (מחרוזת היא סדרה של
תוויס היוצרים מלה או משפט). ההגדרה המקורית של שפת 6 למשל כללה 27 מלות מפתת
- פקודות, בלבד.
כוחה. של שפת 6 נובע מספריות הפונקציות המסופקות עס הקומפיילר. פונקציה היא
סדרה של הוראות המבצעת מטלה מסוימת. ספרייה היא קוב דיסק נפרד, המסופק עם
הקומפיילר, ומכיל פונקציות לביצוע מטלות שכיחות, כדי שלא יהיה עליך לכתוב אותן
בעצמך.
לדוגמה, 6 אינה כוללת פקודה להצגת מידע על-גבי הצג. עס זאת, זוהי מטלה כה שכיחה,
שספריית 6 מכילה מספר פונקציות לפלט של מידע. במקוס לכתוב את הפונקציה בעצמך,
באפשרותך להשתמש באחת הפונקציות המסופקות עס הקומפיילר.
לכל פונקציה שם ייחודי, כמו הפונקציה ()פווק שכבר הזכרנו קודס. במקוס להקליד
לתוכנית את כל ההוראות הכלולות בפונקציה, עליך רק להקליד את שס הפונקציה, תוך
שימוש בתחביר ובסימני הפיסוק הדרושים. (אל דאגה, בהמשך נלמד כיצד להשתמש
בשמות הפונקציות).
פרק 1: במה דברים אמורים?
קובצי ספרייה מסוימיס מכילים קוד מקומפל מראש. כאשר הקומפיילר נתקל בשמה של
אחת מפונקציות הספרייה האלה בתוכנית, אין הוא צריך לטרוח ולהמיר את הפקודות
לקוד בינארי. ההמרה כבר בוצעה. בתהליך הקישור (פַתםו1), (המודגס בתרשים 17),
מתמזגים מקטעי הקוד של הפונקציה - אותן הוראות בספרייה לביצוע הפונקציה - עס
קובץ העצמים, ויוצרים תוכנית הרצה. מכיוון שהפונקציות קומפלו מראש, הקוד המקומפל
יעיל מאד. יצרן הקומפיילר עידן ושיפר את הפונקציות לרמת האופטימיזציה הגבוהה ביותר.
קיימות גם פונקציות אחרות, שהשימוש בהן כה שכיח עד שקוד המקור בשפת .6 מסופק
לך (תלוי בקומפיילר). פונקציות מסוג זה כלולות בקבציס הנקראים קובצי כותרת. סיומת
שמם של קבציס אלה היא בדרך-כלל 4. קובצי כותרת מכילים גם הנחיות קומפיילר,
סדרת הוראות המורה לקומפיילר כיצד להשתמש בהגדרות מסוימות. במהלך הקומפילציה
מתמזג הקוד שבקוב הכותרת עם התוכנית עצמה, ליצירת קוד העצמים.
תרשיס 1.8 מסכס את תהליך הקימפול-קישור.
תרשים 1.7
קוד מקור ההוראות לביצוע
הפונקציה נלקחות
1 1 ?0 1 שה") פוטס מהספרייה במהלך
הקישור.
(₪צ60008') פוט
א
צן ב 2
ו
ו
0
]
ו
ה
דר זו
ספריות פונקציות 3 1
קובצי כותרת אינם מקומפלים. בדומה לקוד המקור בשפת 6 שאתה כותב בעצמך, ניתן
לקרוא אותס, להדפיס אותס ולערוך אותם. עס זאת, יש להימנע מלשנות את קובצי
הכותרת שסופקו עס הקומפיילר, מכיווןן שבמקרה של טעות, ייתכן שהקומפיילר לא יוכל
עוד ליצור קוד עצמיס.
בנוסף לספרייה המסופקת עס הקומפיילר שברשותך, באפשרותך לרכוש ספריות לביצוע
מטלות מיוחדות כגון ניהול מסד (תוניס, גרפיקה משוכללת ומהירה, תקשורת, עבודה
בחלונות ופונקציות מתקדמות אחרות. ככל שמספר הפונקציות בספריות שברשותך גדול
יותר, קטנה יותר כמות העבודה שעליך לבצע בעצמך.
תרשים 1.8
תהליך הקימפול/קישור. קובצי הכללה :
קוד מקור
פונקציות ספרייה זסווקותסק '
קוד עצמים
ב
ה
ו
רו
0
1 י
1
14 פרק 1: במה דברים אמורים?
באפשרותך גס ליצור ספרייה משלך של פונקציות, בהן אתה משתמש בכתיבת תוכניותיך.
לדוגמה, נניח שאתה כותב מספר תוכניות, שכולן מבצעות מטלות 4, 8 ו-6. תוכל לכתוב
את הפונקציות המבצעות את המטלות האלה ולהציב אותן בספרייה אישית משלך. כך הן
תעמודנה לרשותך, מוכנות ומקומפלות, בכל פעם שתזדקק להן.
השימוש בקובצי ספרייה הוא שעושה את שפת 6 למתאימה למחשבים שונים. קומפיילר
למחשב תואם-18%1 מכיל קובצי ספרייה של הוראות בינאריות של מחשב 18%1. קומפיילר
למקינטוש כולל קובצי ספרייה של הוראות בינאריות של מקינטוש. עליך רק לכתוב את
התוכנית בשפת 6 פעס אחת, ולהשתמש בקומפיילריס המתאימים כדי ליצור תוכניות עבור
כל אחד מסוגי המחשבים.
גרטאות השונוח
שפת התכנות 6 פותחה ב-1972 על ידי דניס מ. ריטצ'י, והוגדרה בספר שפת התכנות 6
שחיבר ריטצ'י יחד עם בריאן וו. קרניגן. נהוג לכנות יישומיס של שפת 6 העוניס על
הכללים שתוארו בספר בשם 6 888 (ראשי התיבות של קרניגן וריטצ'י). הגדרת 8%
נחשבת לתקן היישוס המינימלי, ולכן ניתן לקמפל בהצלחה כל תוכנית הנכתבת בהתאם
לכללי 88 בכל קומפיילר 6.
עם זאת, קטעים אחדים בתקן לא הוגדרו במלואם. כתוצאה מכך, החלו. יצרני
הקומפיילרים לעדן ולהרחיב את השפה בעצמם. כדי למנוע בלבול, פיתח ב-1983 מכון
התקנים הלאומי האמריקאי תקן חדש, הנקרא 6 4851. תקן זה קובע כללים להרחבת
השפה, ומאמף תקנים עבור מרבית מאפייניה של שפת התכנות 6.
שפת התכנות הידועה בשם ++6 היא שיפור של שפת 6. אין זו שפה שונה, למעשה, מכיוון
שהיא כוללת את כל הפקודות והמאפיינים של 6 עצמה, וכן תכונות נוספות. על ידי לימוד
6 תלמד גם את עיקרה של שפת ++0. התוספות הכלולות בשפת ++6 מאפשרות פיתוח
קל יותר של תוכניות גדולות ומורכבות, באמצעות הגדרת גישה 'מודולרית" יותר, בנוסף
להרחבות נוספות. כמו-כן, ++6 מתמקדת בתכנות מונחה-עצמים (007).
הו תכנות מונחה- עצמים?
יש לומר מראש, במלוא הכנות, שאין דרך קלה ומהירה לתאר את התכנות מונחה-העצמים
למי שאינם מתכנתים מנוסים. אף-על-פי-כן, ננסה לעשות זאת להלן.
דמיין לעצמך צרור של כרטיסים בגודל של 12 על 75 ס"מ. כל אחד מהכרטיסים מכיל שם,
כתובת ופרטים נוספים של חבר במועדון כלשהו:
הגרסאות השונות 15
כרטיט חבר
שס
כתובת
מספר טלפון
מעמד
במקרה שכתובתו של אחד החברים משתנה, עליך לדפדף בכרטסת ולקרוא את השם
הרשוס על כל כרטיס, עד שתאתר את הכרטיס הנכון. כך גם במקרה שחל שינוי במספר
הטלפון או במעמדו של אחד החברים. אם עלינו לכתוב הוראות ביצוע לשלוש הפעילויות
הנפרדות האלה, הן עשויות להיראות כך:
.86 6 0
.םווות5 זס] 1.00%
6 1 / 12 10 8007055 16 86ה8ת)
65 65 ]36)
6 0 1.00%
.464 ס זסטותנות 6תסתק 186 86ה8ת
.5 60 01
.06 ז0] 1.00%
6 0 518105 136 סקַתגת)
שיס לב שכל הפעילויות האלה קשורות בכרטיסים. הכרטיסים עצמס נפרדים מהפעולות
שאתה מבצע עליהם. לפיכך, עליך לטפל בארבעה עצמים - הכרטיסים והפעולות של שינוי
הכתובת, מספר הטלפון והמעמד.
בתכנות מונחה-עצמים אנו משלבים את הנתונים בהם אנו משתמשים (הכרטיסים) עס
הפעילויות שאנו מבצעיס עליהם. השילוב הזה הופך עתה לעצם היחיד בו עלינו לטפל.
דמיין לעצמך את העצס (הבה נכנה אותו 2816 זסטוח6]א) כך:
86 66
סותגא
5
וטא 6מסתץ
5
5 6שקתו)
16 פרק 1: במה דברים אמורים?
זסטוחנות 6תסוק 6קתגת)
5 6קתת)
מכיוון שהעצם כולל הן נתונים והן פעולות, אענו צריכים עוד למטור לקומפיילר צעדים
נפרדיס לביצוע שינוי. הקומפיילר יבין הוראות כמו:
(6טת6ל4 651/ 12 ,8601655051 86ח08105.002. זסס תושו
68105.008026 0601206, 555-1234( ז6טות6ו/אן
(301106ח1 ,5181051065 26ח09705.008. זססתז6)/ן
ייתכן שהרעיון של תכנות מונחה-עצמים גראה לך מופשט למדי. אל דאגה, אינך צריך
ללמוד תכנות מונחה-עצמים כדי לתכנת בשפת 6. עם זאת, לאחר שתלמד את שפת 6,
תוכל לקלוט את רעיון התכנות מונחה-העצמיס בקלות רבה יותר.
נה יבולה שבת 6 לעשות עבודך, ומה לא?
אס בכוונתך לכתוב תוכניות מחשב מסוגים שונים ובגדלים שונים - שפת 6 היא בחירה
טובה עבורך. אין כמעט מגבלות למה שניתן להשיג באמצעות קומפיילר 6 חזק. ומרגע
שלמדת את שפת 6, המעבר לשפת ++6 הוא קל ופשוט.
עס ואת, העובדה ששפת 6 היא בעלת עוצמה רבה אין פירושה שזוהי הדרך היחידה, או אף
הטובה ביותר, לביצוע כל משימה. אס אתה זקוק ליישוס של מסד נתוניס, לדוגמה, אינך
צריך ללמוד את שפת התכנות 6. קיימים בשוק חבילות תוכנה ומחוללי יישומים המסוגלים
לכתוב עבורך את היישום הדרוש. בעזרתם יש באפשרותך להציב מסד נתונים במהירות
ובקלות, ולאחר מכן להוסיף לו אפיונים תוך כדי העבודה. שפת 6, כשלעצמה, לא תסייע
לך ליצור מסד נתונים ביום אחד. זוהי מגבלה לא רק של 6, אלא של כל שפות התכנות
הכלליות. שפות תכנות אלה לא נועדו לייעול הפיתוח של סוג מסוים של יישומים.
בהכנוח
פיתוח תוכנית הוא תהליך לוגי, *שר ולעניין". אם תשקיע את הזמן הדרוש לביצוע כל שלבי
התהליך, מתחילתו ועד סופו, תהפוך למתכנת 6 מצליח. הבה נבחן את השלבים השונים של
תהליך התכנות.
חכנון התוכנית
שב בנחת, לא ליד המחשב, וחשוב על מה שברצונך להשיג באמצעות התוכנית. התווה את
התוכנית בפירוט רב ככל האפשר. מרבית התוכניות בנויות על-פי תבנית המכונה 0ק1,
ראשי התיבות של ונוקח1 (קלט), פתופפסססזק (עיבוד) ו-)וקוט0 (פלט).
מה יכולה שפת 6 לעשות עבורך, ומה לא 7 1
לדוגמה, ננית שברצונך לכתוב תוכנית שמחשבת את סכום מס הקנייה על רכישה כלשהי.
מה צריכה התוכנית לעשות!
הבה נבחן את הקלט. אנו זקוקיס לשתי פיסות מידע: סכוס הרכישה ושיעור מס הקנייה.
אס ברצונך להשתמש בתוכנית עבור יותר מרכישה אחת, יהיה עליך להזין את סכוס
הרכישה בכל עס שאתה מריץ את התוכנית. מרבית הטיכויים שתזדקק לשיעור מס אחד
בלבד, זה המקובל במדינתך, ולפיכך תוכל לכלול את שיעור המס ישירות בקוד התוכנית.
עתה, יש לקבוע את תהליך עיבוד המידע. במקרה שלנו, עלינו לחשב את סכום מס הקנייה,
כלומר - להכפיל את סכוס הרכישה בשיעור המס.
לבסוף, נבחן את הפלט. עלינו להציג את תוצאות החישוב - הפלט - על-גבי הצג.
השלביס של תוכנית זו עשויים להיראות כך:
פא - קלט
אמור למשתמש שיש להזין את סכום הרכישה.
הקלד את טכוס הרכישה במקלדת.
אמור למחשב מהו שיעור המס המקובל במדינה.
5 - עיבוד
הכפל את סכום הרכישה בשיעור מש הקנייה.
7 - פלט
הצג את התוצאות.
נתיבת החוכנית
כדי לכתוב את התוכנית אנו משתמשים בעורך מלל. העורך (ז0וו66) הוא תוכנית הדומת
למעבד תמלילים, אלא שהוא איעו זקוק ליכולת שיש לכל מעבד תמלילים לעבד את
התצורה של התווים או של הפסקאות. למעשה, אסור שקובץ קוד המקור יכיל קודים
מיוחדים כלשהם של תצורה, מכיוון שהקומפיילר לא יבין אותס ויתייחס אליהם כאל
שגיאות.
הידור נקימבול) החוכנית
לאחר שמירת קוב קוד המקור, השתמש בקומפיילר כדי ליצור את קובץ הביניים, הוא
קוב העצמים. במקרה שהקומפיילר נתקל בהוראות שאינו מבין, מוצגות אזהרות קומפיילר
או הודעות שגיאה. אזהרה פירושה שייתכן שקיימת בעיה כלשהי, אך הקומפיילר יכול
להמשיך ולייצר את קוד העצמים. הודעת שגיאה גורמת בדרך-כלל לעצירת תהליך
הקימפול. במידה שמוצגות שגיאות כלשהן, עליך להטעין בחזרה את קוד המקור לעורך
18| פרק 1: במה דברים אמורים?
המלל ולתקן את הבעיה. אלו הן בדרך-כלל שגיאות תחביר, טעויות באיות, בפיסוק או
בסדר המלים בפקודה או בפונקציה של שפת 6.
שגיאות אינן צריכות לרפות את ידיך. גס מתכנתי 6 מנוסים ביותר טועים לפעמים.
קיעוור התוכנית
אס לא דווחו שגיאות קומפילציה כלשהן, עליך לקשר את קובץ העצמים לספריות
שברשותך, כדי ליצור תוכנית שניתן להריצה. אם הקשר אינו מוצא את המידע המתאים
בספריות, מופיעה הודעת שגיאה. במקרה כזה, עליך לבדוק את קוד המקור ולוודא שאתה
אכן משתמש בקובצי הספרייה הנכונים,
בדיקת התוכנית
כעת אתה יכול להריץ את התוכנית. אס ביצעת את כל השלבים כהלכה, התוכנית תרוצ
ללא כל בעיות. עס זאת, עלולות להתגלות שגיאות משני סוגיס.
שגיאת הרצה מתגלה כאשר התוכנית כוללת הוראה שלא ניתן לבצעה. במקרה כזה תוצג
הודעה על-גבי המטך, והרצת התוכנית תיעצר. שגיאות הרצה קשורות בדרך-כלל לקבצים
או להתקני חומרה.
לדוגמה, נניח שהתוכנית שלך כוללת פקודה לפתוח קובץ ששמו "41 60001.2" אך
קובץ בשם זה אינו נמצא על הכונן. הקומפיילר והקשר מניחים שהקובף יימצא על הכונן
בעת הרצת התוכנית, ולכן אינס מדווחים על שגיאה כלשהי. אולם כאשר אתה מריץ את
התוכנית, אין אפשרות לבצע את ההוראה מכיוון שהקובץ אינו נמצא, והרצת התוכנית
תיעצר.
שגיאות לוגיות מתגלות כאשר התוכנית יכולה לבצע את ההוראות, אולם ההוראות עצמן
שגויות; כלומר, כשההוראות מביאות לתוצאות מוטעות. אלו הן הבעיות הקשות ביותר
לאיתור, מכיוון שייתכן שאינך מודע אפילו לקיומן. עליך לבדוק בקפדנות את הפלט של
התוכנית ולוודא שהתוצאות אכן מדויקות.
הבה נבחן שוב את הדוגמה של התוכנית לחישוב סכוס המס. נניח ששגית והורית לתוכנית
לחלק את טכוס הרכישה בשיעור המס, במקוס להכפילו. הקומפיילר והקשר אינם יכולים
לדעת שטעית, ולכן נראה שהתוכנית נוצרה ורצה ללא תקלות. לרוע המזל, מס קנייה
בשיעור של שישה אחוזים על רכישה בסכוס של 5100 יחושב כטכוס של 51666.66! שגיאה
כזו ברורה אמנם לעין, אך שגיאות לוגיות אחרות אינן כה קלות לאיתור.
אס נתקלת בשגיאות הרצה או בשגיאות לוגיות כלשהן, עליך לתקנן, ואז לקמפל ולקשר את
התוכנית פעם נוספת.
שלבים בתכנות טְ 1
ליוד הכנות
כשאתה לומד כיצד לתכנת את המחשב, אתה רוכש למעשה שני כישורים חשובים.
אתה לומד את התחביר - המלים, הדקדוק וכללי הפיסוק - של שפת המחשב עצמה. אתה
לומד מה עושה כל פקודה וכל פונקציה, וכן מתי וכיצד להשתמש בהן.
אתה לומד גס את הלוגיקה של תכנות מחשבים - כיצ
זוהי הבנה אוניברסלית, אותה תוכל ליישם לכל שפת
כדי לתכנת את המחשב יש צורך בשני הכישורים. למרבה המזל, אתה רוכש את שניהם בעת
ובעונה אחת!
1ה דרוו בדי לחכנת
כדי לתכנת בשפת 0 או בשפת ++6 אתה זקוק לעורך, מהדר (קומפיילר) ולקשר.
ניתן להשתמש במעבד תמלילים רגיל, במקוס בעורך מלל מיו
המקור. אולס יש לשמור את הקוב ללא הוראות תצורה כלשהן. צורה זו נקראת פלט
ג או 181 08פ. למרבית מעבדי התמלילים המקובליס יש את היכולת לשמור את
הפלט כקובץ 45011.
עם זאת, לטווח הארוך, השימוש בעורך מלל מיוחד המיועד לתכנות הוא מהיר יות
שהתוכנית נשמרת באופן אוטומטי ללא קודיס של תצורה. עורכי מלל מסוימים מאפשרים
גס להחדיר פקודות תכנות של שפת 6 על ידי הקלדת מלות מפתח מקוצרות, או על ידי
הקשה על צירופי מקשים מיוחדים. עורך המלל הכלול בתקליטון המצורף לספר זה מציג
אפילו דוגמה של תוכנית 6, כדי להזכיר לך את המבנה הבסיסי של השפה.
הקומפיילר שלך יכלול גס קשר וסדרה של פונקציות ספרייה. כל ספריו
אולס לא כל הספריות זהות. ספריות
רבות כוללות פונקציות מתקדמות המיועדות לניהול מסדי נתוניס, לגרפיקה, לתקשורת
וליישומיס נוספים. אם אתה רוכש קומפיילר משלך, בחר קומפיילר הכולל את הפונק
פונקציות :6 הבטיסיות אותן תכיר בהמשך הספר,
להן תזדקק.
בנוסף לפריטים הבסיטיים האלה, קיימים גם כלי-ע
התכנות. מאתר ומתקן התקלות (6פַקָ0600) יסייעי סי
מציג את הערכים של המשתניס ואת שמות הפונקציות המבוצעות תוך כדי הר
על ידי התבוננות בפעולה, באפשרותך לגלות היכן נפלו הש
לך לבצע אופטימיוציה של התוכנית, כדי להחיש את זמן ההרצה. ה
מאפשר לך להוטיף פונקציות בשפת /1לו85561 באופן ישיר,
תור במהירות רבה ככל האפשר,
20 פרק 1: במה דבריס אמורים!
ו ₪
ד לבצע מטלה באמצעות שפת המחשב.
תכנות. מרגע שלמדת את הלוגיקה של
התכנות בשפה אחת, תוכל לרכוש כל שפה אחרת על ידי לימוד התחביר שלה בלבד.
חד, כדי ליצור את קובץ קוד
ת 6 כוללות את
זר נוספים היכולים לייעל את עבודת
ך לאתר שגיאות הרצה בתוכנית. הוא
גיאות. המאפיין (ז11]6סזק) מסייע
מאגד (ז1016ת8550)
אס ברצונך שמטלה מסוימת
""יי
ישנן חבילות תוכנה הכוללות קומפיילר 6 יחד עם טביבת פיתוח משולבת (128). באמצעות
₪ אתה מריצ תוכנית אחת, המעניקה לך גישה לעורך המלל, לקומפיילר, לקשר
ולכלי-עזר נוספים, על ידי בחירה מתוך תפריט. אם אינך משתמש בסביבת פיתוח משולבת,
עליך להפעיל את עורך-המלל, להקליד את התוכנית ולשמור את הקובץ. לאחר מכן עליך
לצאת מעורך-המלל כדי להריץ את הקומפיילר.
(תידך עם עונת החכנות ++0/6
הרושס הוא שהיוס אין כל מגבלות למתכנתי 6. זוהי השפה הנפוצה ביותר לתכנות מערכות
ולפיתוח בקנה מידה רחב. שפת 6 איננה, כמובן, שפת התכנות היחידה העומדת היום
לרשות המתכנתים, אולס נראה שהיא זוכה למרבית תשומת הלב.
לאחרונה פותחו קומפיילרים חדשים ומורחבים לשפת 6, המיועדים ל-2005, ל-5שו60ם1/
ולכל שאר פלטפורמות המחשוב. קיימים היום כלי-עזר לתכנות וספריות מקיפות,
המייעלים את עבודת פיתוח המערכות. נראה ששפת 6 תשלוט בכיפה עוד זמן רב, ולכן
לימוד שפת 6 הוא השקעה נבונה.
אלות
1
2. האם כל הקומפיילרים של שפת 6 זהיסו
.
מהו ההבדל בין מהדר (קומפיילר) לבין תרגמן (זטוסזקז6וחו)
3 מה ההבדל בין שפת ז16פות4596/ לבין שפת מחשב עיליתו
4. מהו קובץ קוד מקורו
5 מה ההבדל בין שגיאות קומפילציה לבין שגיאות הרצה!
6. מהן יתרונותיה של שפת התכנות 6! הסבר.
7
. מהס השלבים בתכנות מחשבים!
ד רגילים
1 התווה תוכנית המחשבת תשלומי שכר רגיל ותשלומים עבור שעות נוספות, על
בסיס מספר שעות העבודה בשבוע:
2 התווה תוכנית הקובעת אס אדס זכאי לגמלאות (גיל הפרישה לגמלאות הוא 65).
עתידך עם שפת התכנות ++6/₪ 1 2
6 התכ[ות ++0/6
חש
יסון להבין מה בדיוק עושה תוכנית 6 מסוימת רק על ידי התבוננות בקוד
₪4 המקור, עשוי להיות מרתיע בהתחלה. אומנס מרבית פקודות 6 הן מלים
בשפה האנגלית (כמו זס1 , למשל), ומרבית הפונקציות ב-6 הן מלים וקיצורים (כמו
1 - שילוב של א506/8 (טרוק) את המקלדת -)גווזזסע (קבע את התצורה) של
התווים), הרי שכאשר משלבים את הפקודות והפונקציות עם התחביר של שפת 6,
ועס סימני הפיסוק והרוותיס, מתקבלת תוכנית שאינה נראית בדיוק כמו משהו מוכר
באנגלית. אין פלא שזה מכונה "קוד". אבל אל תיתן לעובדה זו לרפות את ידיך. מרגע
שתכיר את שפת 6, תוכל לקרוא תוכניות 6 באותה קלות כמו שאתה קורא רומן טוב.
בפרק זה תלמד להכיר את המבנה של תוכנית 6, וכן מספר מושגים חשובים בתכנות.
הערות ++6
לשפת 6 ולשפת ++6 מבנה זהה. אחרי שתלמד לכתוב תוכנית
בשפת ס, תדע גם לכתוב תוכנית בשפת ++0.
נה של תוכנית 6
תוכנית 6 מכילה פונקציה אחת או יותר. זכור, פונקציה היא סדרה של הוראות המורה
למחשב לבצע מטלה מסוימת. חלק גדול מהפונקציות שתשתמש בהן כבר נכתבו וקומפלו
עבורך בספריית הפונקציות שסופקה לך יחד עס הקומפיילר. במקוס לכתוב את ההוראות
בעצמך, עליך רק להורות לקומפיילר להשתמש באחת מהפונקציות התקניות שלו. רק
במקרה שברצונך לבצע מטלה שאינה כלולה בספרייה, עליך לכתוב את הפונקציה בעצמך.
הקומפיילר המצורף לספר זה, לדוגמה, כולל ספריית פונקציות מלאה. היא מכילה את כל
הפונקציות שהוגדרו בתקן 8%א, את הפונקציות שהוגדרו על ידי ועדת 51אג, וכן
פונקציות רבות נוספות. ניתן לקמפל ולקשר את כל התוכניות המופיעות בספר באמצעות
הקומפיילר המצורף.
כל תוכנית 6 (וכן גס כל תוכנית ++6) מתחילה בפונקציה הנקראת ()ם81ו ונראית כך:
()תוגות
הסוגריים המופיעים אחרי המלה ()תוגוז מהוויס חלק משמה של הפונקציה וחובה לכלול
אותס. אס תשכח לרשוס את הסוגריים, הקומפיילר לא :וכל ליצור את התוכנית; הסוגרייס
מסמניס לקומפיילר שזוהי פונקציה ולא המלה תנגוז. למעשה, אחרי שמה של כל פונקציה
יופיעו הסוגריים, אם כי במרבית המקרים יירשס גס משהו בתוך הסוגרייס. בהמשך הספר,
כל איזכור של שס פונקציה ילווה בסוגריים.
אחרי שם הפונקציה ()ת1גות מופיעות ההוראות שברצונך למסור למתשב. ההוראות יכולות
לכלול פקודות 6 או שמות של פונקציות הכלולות בספרייה, או פונקציות שכתבת בעצמך.
סוגר מסולסל פותח ()) תייב להופיע לפני ההוראה הראשונה, וסוגר מסולסל סוגר ([) חייב
להופיע אחרי ההוראה האחרונה. כלומר, המבנה הבסיסי של תוכנית 6 נראה כך:
זוהי הפונקציה העיקרית שעליך לבצע ()םותת
והיא מתחילה כאן.
אלו הן ההוראות שעליך לבצע 4
והן מסתיימות כאן. ]
4 2 פרק 2: שפת התכנות ++ 0/6
הסוגריים המסולסלים ([ ו-]) נקראיס תוחמים (811019זו061) ומסמנים את תחילתו ואת
סופו של קטע קוד. כל פונקציה שאתה כותב חייבת להיפתח ולהיסגר בסוגריים מטולסלים.
בנוסף, יכוליס להשת קטעי קוד בתוך הפונקציה המתתילים ומסתיימים בסוגרייס
מסולסלים משלהם.
כאשר אתה מפעיל את התוכנית, המחשב מתחיל לעבד את ההוראה הראשונה בפונקציה
()הוגות. להלן תוכנית ++0/6) מלאה, המציגה את המלה א00) על-גבי המטך:
()הוצות
ן
("א0") פוטק
|
תוכנית זו כוללת הוראה אחת בלבד, אך גם עליה למלא אחר הכללים של שפת 6.
המרכאות סביב המלה 008 לא יוצגו על-גבי המסך - תפקידן הוא רק להורות ל-0 שיש
להציג את התווים המופיעים בין המרכאות, ולא קבוע או משתנה ששמו 0%. (בפרק 3
תלמד על קבועים ומשתנים). תרשים 2.1 מראה מה מבצע כל אחד מהחלקים של תוכנית
פשוטה זו.
סימן הנקודה-פסיק (;) המופיע לאחר ההוראה נקרא מסיים הביטוי. סימן זה מורה
לקומפיילר שהוא הגיע לסופה של הוראה - ומה שמופיע בהמשך יהיה הוראה חדשה
או סופה של התוכנית. טימן הנקודה-פטיק חייב להופיע בסופה של כל הוראה:
()תוגות
|
;("08 ות'ז")פ)וק
;("01ת 6ז'טס ")ףוק
)
אין פירוש הדבר שכל שורה תייבת להסתיים בנקודה-פסיק. לעתים, הוראה מסוימת תופסת
יותר משורה אחת על-גבי המסך. במקוס להציב את סימן הנקודה-פסיק בסופה של השורה
במסך, יש להציב את הסימן בסופה של ההוראה.
המבנה של תוכנית 6 25
תרשים 2.1
חלקיה של תוכנית ++6/6.
הערה
קומפיילרים מסוימים
אס עוברים באופן
אוטומטי לשורה הבאה
לאחר פקודת ()פונגק. מידע
נוסף תמצא
בפרק 4.
שס הפונקציה
ותחילת התוכנית
תוחם פותח (סוגריים מטולסלים) ()חוגוח
ת
מסמן את תחילתו של גוש הוראו ₪ יי |
יו
הוראה אחת - 7 | >"
תו נקודה-פסיק מסמן ו ו
את טסופה של ההוראה
תוחס סוגר מטמן את
סופו של גוש הוראות
דרך אגב, לאחר כל הוראת ()פונוק, מביא המחשב את הסמן לתחילתה של השורה הבאה.
לכן, כשתריף תוכנית המכילה שתי הוראות ()פוגוק, יופיעו שתי שורות מלל על-גבי המסך.
שפת 6 ושפת ++6 נקראות שפות בעלות תבנית-חופשית. אין זה משנה היכן אתה מציב
את הסוגריים המסולסלים או היכן אתה מתחיל את שורות ההוראות. ניתן לכתוב את
התוכנית שלנו גם באופן כזה:
(("3)'0%ווק | | ()םוגות
כך או כך, הקומפיילר יוכל לבצע את התוכנית. אולס כדי להקל על קריאת התוכנית,
אימצנו מספר מוסכמות:
* הצב את שם הפונקציה ()ת41ח1 בשורה נפרדת.
* הצב את התוחמים (הפותח והסוגר) בשורות נפרדות.
> רשוס את ההוראות בהזחת פסקה. כשתתוכניות שלך יהפכו ארוכות יותר, תלמד
כיצד מבליטות הזחות הפסקה את ההיגיון של התוכנית ומציינות את האופן בו
מקובצות ההוראות ליחידות משנה.
נסה להקפיד על מוסכמות אלה ועל המוסכמות האחרות בשפת 6. הן אולי לא נראות
חשובות במיוחד בתוכניות קצרות, אולם הן מקלות על הטיפול בתוכניות ארוכות ומורכבות
יותר.
6 2 פרק 2: שפת התכנות ++ 0/6
בעוד שמספר הרווחים אינו משנה לקומפיילר, סימני הפיסוק הס משמעותיים. אס השמטת
סימן תוחם, סוגריים או נקודה-פסיק, הקומפיילר ייצור שגיאה במקוס תוכנית. שגיאות
מסוג זה נקראות שגיאות תחביר, וחובה לתקנן קודס שניתן יהיה ליצור את התוכנית.
קָותיות גדולות, אותיות קטנות (באנגלית)
מוסכמה נוספת בשפת 6 נוגעת לשימוש באותיות גדולות וקטנות. פקודות ושמות פונקציות
נכתבים תמיד באותיות קטנות, ולכן אנו משתמשיס בצורת הכתיבה ()פווק ולא ()21115 או
(50נו?. אם תשתמש באותיות גדולות לא תוצג אומנס הודעת שגיאה, אך התוכנית פשוט לא
תראה כמו תוכנית 6. האותיות הגדולות משמשות אך ורק עבור קבועים ושמות סמליים.
פנונקציה 0חזוז0ז
מה קורה כאשר המחשב מסיים לבצע את ההוראות הכלולות בתוכנית! התוכנית נעצרת,
והמחשב חוזר למצב בו היה לפני התוכנית. אם אתה מריץ את התוכנית מסימן ההנחיה של
מערכת ההפעלה, יחזור ויופיע סימן ההנתיה. אס אתה מריץ את התוכנית מ-8ו00ת:/,
יופיע משטח העבודה של 0088ם1/.
השבת השליטה למערכת ההפעלה או ל-0085ת1/ מתבצעת באופן אוטומטי. עם זאת,
קומפיילרים מסוימים של שפת 6 דורשים שתציין במפורש כל שלב ושלב, כולל החזרה
למערכת ההפעלה. עבור קומפיילרים מסוג זה יש לכלול את הפקודה (0)תזט6ז לפני
התוחם הסוגר של הפונקציה ()תו4וז:
()םופות
|
;("0% )פוט
(")סת 6ז'טס ץ')פוטק
;(0)תזטו16
ן
הפונקציה ()תזטו6ז מורה למחשב לשוב למערכת ההפעלה. עבור מרבית הקומפיילרים
הפקודה אינה הכרחית. לא תוצג הודעת שגיאה במקרה שתשמיט אותה. (גם ה-0 שבתוך
הסוגריים אינו הכרתי. בהמשך תלמד מה תפקידו). עבור הקומפיילר המצורף לספר זה,
לדוגמה, הפקודה ()תז6ז אינה הכרחית. אס החלטת לכלול אותה, באפשרותך לרשמה
(0)תז600ז או אפילו ;תז6ז ללא סוגריים. עס זאת, במידה שאתה אכן כולל את הסוגריים,
חובה להציב 0 בתוך הסוגריים - ללא ה-0 תתקבל הודעה על שגיאת קומפילציה.
אס אתה אכן כולל את הפונקציה ()תזטזטז, אין להציב הוראות כלשהן בינה לבין התוחם
הסוגר. לדוגמה, צורת הכתיבה להלן אינה נכונה:
אותיות גדולות, אותיות קטנות (באנגלית) 7 2
()תוגות
|
;("08 מ'ז')פוטק
0
;("זסת 6ז'טס )פוט
]
בדוגמה זו, המתחשב יחזור למערכת ההפעלה אחרי פונקצית ה-()פוגוק הראשונה, וההוראה
להציג את המלל 06ת 6ז'וסץצ לא תתבצע כלל.
(18'מוש בהעדות (%5ח6וחוס6)
אחרי כתיבת תוכנית >6 וביצוע של תיקוניס ושיפורים, אין ספק שתבין היטב את התוכנית,
ותדע מה עושה כל הוראה ומדוע כללת אותה בתוכנית.
אולם, ככל שהתוכניות הופכות מורכבות, קשה יותר לזכור מהי הסיבה שמאחורי כל הוראה וכל
פרט בתוכנית. הדבר קשה במיוחד אם אתה חוזר ובוחן תוכנית כלשהי לאחר שחלף זמן ממושך
ממועד כתיבתה, או כאשר אתה מנסה לקרוא תוכנית שנכתבה על ידי מישהו אחר.
הוספה של הערות עושה את התוכנית קלה יותר להבנה. הערה היא מעין מסר המופנה לכל
מי שקורא את קוד המקור. הערות יכולות להופיע בכל מקום בתוכנית. הקומפיילר והקשר
מתעלמים מהן. למעשה, הן אינן מתווספות לקוד העצמים או לתוכנית המוכנה להרצה.
במהלך לימוד תכנות, הוספת הערות עשויה להראות כבזבוז זמן משווע. תעדיף ודאי לעבוד
על בניית התוכנית עצמה. בתוכניות מבחן קצרות ופשוטות - שאורכן שורות מעטות בלבד -
ההערות אינן הכרחיות. אולס בהמשך הדרך תגלה שההערות מסייעות בהבנתה של
התוכנית, אפילו תהא זו תוכנית בסיסית ביותר.
הערה מתחילה בתוויס */ ומסתיימת בתווים /*, כמו בדוגמה הבאה:
/*זסו1תסות 16[ תס 6זסאו 8 0150185 מת8זקסזק פוהיך*/
()וגות
|
("0")פטוק
תזט16
)
צירוף התווים */ מסמן את תחילתה של ההערה, והצירוף /* מסמן את סופה. קומפיילר 6
מתעלס מכל מה שמופיע בין שני הסימנים. מתכנתים נוהגיס להציב בתחילתה של כל
תוכנית הערה, המסבירה את ייעודה הכללי של התוכנית. הערות הנכללות בתוך גוף
8 2 פרק 2: שפת התכנות ++ 0/0
התוכנית משמשות כדי להסביר הוראות מסוימות או נקודות לוגיות מיוחדות. ניתן להוסיף
הוראה גס אחרי סימן הנקודה-פסיק של הוראה:
/*זסוותסות 116 תס 6זסאו 8 6150135 מתגזקסזק פוג'ך*/
()תופות
|
/* 08 5 615012760 6זסצו 6 */
;("א0')פוטק
/*ת575)6 106 10 פםזט6ז 8וג1*/ | (0) תזט)16
]
כאשר כוללים הוראה והערה בשורה אחת, מקובל להשאיר מספר רווחיס בין השתיים.
הדבר מקל על קריאת ההוראה וההערה.
גם במקרה של הערות ארוכות, אין הגבלה על מספר השורות שניתן להקליד בין צירופי
התוויס המסמנים את תחילתה וסופה של ההערה:
ג 10010065 6ת8 זס!ותסות 6) תס 6זסעו 8 0150185 ותגזקסזק 8ותיך*/
1 1108ות60 הוושו 8110[6קות60 11 1466 10 6תגותותסס ()תזט160
16
/*
צירוף התוויס /* המסמן את סופה של ההערה יכול להיות בשורה נפרדת, או בשורה בה
מסתיימת ההערה.
מתכנתים אחדים נוהגים להוסיף את סימן הכוכבית (*) בתחילתה של כל אחת משורות
ההערה הנוספות, וקובעיס את צורתה של ההערה כך:
3 10010065 6ת3 זס!נתסות 106 תס 6זסעו 3 0150185 ותפזקסזק פותך*/
1 116קותסס תז1עו 411016קות 60 11 1466 10 6תאותותסס ()תזט6ז *
6 *
*/
שימוש בהערות (פ)ת6תזומזס6) טְ 2
באפשרותך אף להבליט את ההערה בעזרת שימוש בכוכביות נוספות:
אצאצ */
5 זס)ותסות 16 מס 6זסעו 8 01501375 תתפזקסזק פנמיד /
* 66 10 6תהותות00 ()תזטו16 8 665נו1סת1 תה *
* 11 זו 16 181 פזס11קותסס םו1א 6811016 0
*+++++א+אא+%+%%+++++++++++++++++++++++++++++++++4++++++צ%++צ+
/
הכוכביות הנוטפות משמשות ל"קישוט" בלבד. הקומפיילר מתעלם מהן, כמו משאר המלל
הכלול בין צירופי התווים */ [-/*.
העדות בעונת ++6
שגיאה נפוצה אצל מתכנתיס מתתילים היא להשמיט את צירוף התוויס /* המסיים את
ההערה. הדבר גורס להודעת שגיאה המוצגת על ידי הקומפיילר. שפת ++6 עושה את
השימוש בהערות לנוח מעט יותר, בכך שהיא מאפשרת להשתמש גם בצירוף התווים //
לסימון הערה. הערה מסוג זה מסתיימת בסופה של השורה בה היא מופיעה, ולפיכך - אין
צורך להקליד סימון מיוחד לציון סופה של ההערה:
זסזוחסות 16 תס 6זסאו 8 01501875 ומגזקסזק פגגיך" //
()תוות
|
("08"פוטק
5750 116 10 פנתטו0// | ((0) תזט6ז
]
עם זאת, במקרה שההערה נמשכת על-פני יותר משורה אחת, כל שורה חייבת להתחיל
בצירוף התווים //:
8 10010065 תג זס)ותסות 186 תס 6זסעו 8 8150185 הזהזקסזק פנתדד //
1 5ס!1קוחס6 !עו 8)1016קותסס )1 366 0! 6תגותותסס ()תזטוסז //
//
שפת ++) מתירה גס להשתמש בצירופי התווים */ ו-/* לסימון הערה.
דזבנת נושא הברמטרים
שימוש בפונקציה כלשהי, כמו ()פוטק, למשל, בתוך פקודה בשפת 6, מכונה בשם קריאת
לפונקציה. פירוש הדבר שאתה קורא ל-0 לבצע את הפונקציה.
0 3 פרק 2: שפת התכנות ++ 0/0
הסוגריים המופיעים אחרי שס הפונקציה מיועדים להכיל פרמטרים כלשהם. פרמטר הוא
פריטי מידע הדרוש לפונקציה כדי שתוכל לבצע את תפקידה. לדוגמה, ()פווק היא פונקציה
בספרייה. הפונקציה כוללת הוראות המורות למתחשב להציג מחרוזת של תוויס על-גבי
המסך. אך איזה תוויס עליו להציג! עליך לומר למחשב אילו תווים ברצונך להציג על ידי כך
שתציב את התווים הרצויים בתוך הסוגריים. פעולה זו נקראת העברת פרמטר. לפיכךו
בהוראה:
("11.1.0")פ)טוק
המלה 11811.0 היא הפרמטר שאנו מעבירים לפונקציה. כפי שמודגס בתרשיס 2.2, אנו
מורים לקומפיילר לבצע את הפונקציה ()פווק, ולהשתמש לשם כך במלה 1/0 זמ
המרכאות מסמנות שברצוננו להציג את התוויס 1-0-.1-5-1, ולא קבוע או משתנה
כלשהו (ראה פרק 3) הנקרא 11811.0.
העברת
ל
0 לפונקציה
גזמו | מהדר קשר
(0ָחוח5)50061זט :
;"0 1 ")זו
5
בספר זה אנו מכנים הוראה כמו ("118111.0')פווק בשס פונקציה. למעשה, הפונקציה
עצמה, ()פונוק, נמצאת בספרייה. לכן, מבחינה טכנית, ("1181.1.0')פטק היא הוראה
שקוראת לפונקציה ()פוטק ומעבירה לה את המלה 11811.0 כפרמטר.
הבנת נושא הפרמטרים
תרשים 2.2
העברת פרמטר
לפונקצית ספרייה.
21
המלה 11811.0 כולה מהווה פרמטר אחד. ()פונוק יכולה לקבל פרמטר אחד בלבד - תו,
מלה או משפט, שאותו אתה רוצה להדפיס באמצעות הפונקציה. בהמשך תכיר פונקציות
שיכולות לקבל מספר פרמטרים.
לפונקציות מטוימות אין צורך להעביר פרמטרים. מתכנתים רבים נוהגים לבצע את
הפונקציה (0)תזו6ז, למשל, באמצעות כתיבתה כך:
()תזט16
במקרה זה אין צורך בפרמטר.
תוך כדי לימוד פונקציות :6 אחרות, תלמד גם פרטים נוספים אודות פרמטרים.
ודא שאתה מבין את ההבדל בין אופן השימוש בפונקציה ()תוגות לבין כל פונקציה אחרת,
כמו ()פונוק, למשל. ב-()תוגוח אנו משתמשים כדי להעניק שם לפונקציה המכילה את
ההוראות שאנו נותנים למחשב. אנחנו לא קוראים ל-()ַתוגּמז, אלא מבצעיס את הפקודות
הכלולות בה. אחת מפקודות אלה קוראת לפונקציה ()5וטק. לפיכך, ()פווק היא פונקציה
שנקראת מתוך הפונקציה ()תנגו.
1 קודה 06טוסחו4
אס אתה כותב תוכנית שעושה שימוש בקבציס כלשהם, או מדפיסה נתוניס במדפסת, קרוב
לוודאי שיהיה עליך לכלול את קובץ הכותרת 5/6:0.1 בתוך פקודה, כדלקמן:
<ת.31010> 66נ1סת1/
()חוגות
|
;("08")פוטק
(0) תזט6ז
]
הפקודה 01066ח%1 היא הנחיה, המורה למתשב להשתמש בנתונים הכלולים בקובץ הכותרת
ששמו ת.5/010. אלו הן ראשי התיבות של הביטוי ]טקוטס/)וקת 5186816 (קלט/פלט תקני),
והקובץ ג.5/610 מכיל את כל ההוראות להן זקוק הקומפיילר כדי לעבוד עם קבצים ולשגר
נתונים למדפסת.
ההוראה להשתמש בקובף כותרת חייבת להינתן לפני ()ת41חז.
2 3 פרק 2: שפת התכנות ++ 0/0
היכן נמצא קובץ הכותרת?
הקפת שמו של קובץ הכותרת בסימנים < ו-> מורה לקומפיילר
שהקובץ עשוי להימצא במחיצת ברירת המחדל 6סט|סחו. זוהי |
המחיצה בה מציבה תוכנית ההתקנה של הקומפיילר קובצי |
כותרת. אם הקובץ אינו נמצא במחיצה הנוכחית במהלך תהליך
הקימפול, הקומפיילר יחפש את הקובץ במחיצה 6וטוסחו. ניתן גם
להקיף את שמו של קובץ הכותרת במרכאות, כך:
"ח.0ו5)0" 6סט!סחוצ
אך במקרה כזה, הקומפיילר יחפש את קובץ הכותרת אך ורק
במחיצה הנוכחית, ואם הקובץ אינו נמצא שם, תוצג הודעת
שגיאה.
תוכנית ההתקנה המצורפת לספר זה מציבה את קובצי הכותרת
במחיצה בה נמצא גם הקומפיילר, 6זפ5חו::0, ולכן באפשרותך
להשתמש הן בסימנים < ו->, והן במרכאות. הקומפיילר כולל גם
קובץ כותרת ששמו ₪.דהוו, המשמש לביצוע פעולות מתמטיות | |
מורכבות: מידע נוסף בנושא זה תוכל למצוא בקובץ התיעוד |
06, המותקן יחד עם הקומפיילר. התיעוד המצורף |
לקומפיילר שלך מסביר באיזה קובץ כותרת יש להשתמש ומתי |
יש להשתמש בו. . ן
ו ל 0
הקובץ 51610.2 דרוש גם לפונקציות 6 מסוימות, לצורך פעולתן התקינה. לדוגמה, הפונקציה
(26060 קולטת תו בודד מתוך מקור כלשהו אותו אתה מציין, כמו קובץ על-גבי הכונן,
למשל. עם זאת, מכיוון שנתוניס רבים כל-כך נמסרים באמצעות המקלדת, שפת 6 כוללת
גם את הפונקציה ()ז861018. פונקציה זו מורה לקומפיילר לקבל תו מהמקלדת. הפונקציה
עושה זאת על ידי קריאה לפונקציה (86160, תוך כדי ציון העובדה שהמקור הוא התקן
הקלט התקני. אנו יודעיס שהתקן הקלט התקני שלנו הוא המקלדת, אך כיצד ודע ואת
הקומפיילר! התקן הקלט התקני מוגדר בקובץ 0.8ו5/6. לכן, כדי שניתן יהיה להשתמש
בפונקציה ()86/6(81 בתוכנית, יש לכלול את הפקודה 01066ת%1 עבור הקובץ .5/610. קוב
הכותרת והספרייה פועלים בצוותא כדי להשלים את הפונקציה.
אם הקומפיילר שלך כולל קובץ ששמו 5/6:0.2, כדאי להשתמש בפקודה 81801066 ולכלול
אותו בכל תוכנית כדי להימנע משגיאות.
הפקודה 06נ1סח%1 3 3
הערה
התיעוד המצורף
לקומפיילר שלך מסביר
באיזה קובץ כותרת יש
להשתמש, ומתי יש
להשתמש בו.
[1יצוב החוכנית
תוך כדי לימוד שפת 6, תפתח גם כישורים של פתרון בעיות. כישורים אלה נחוצים כדי
ליישם את השפה ואת המבנה של 6 לצורך ביצוע מטלות. אחד מאותס כישורים הוא
היכולת לחלק את הבעיה לחלקים נפרדים, שניתן לטפל בהם.
הפרדת בעיה לחלקיה היא טכניקה מקובלת בפתרון בעיות. אחרי הכל, כלום לא קל שתר
לפתור בעיה קטנה מאשר להתמודד עם בעיה גדולה! כאשר אתה ניצב בפני בעיה גדולת
שקשה לפותרה, חלק אותה לבעיות קטנות שקל ותר לטפל בהן. במידת הצורך, המשך
לחלק את הבעיה ליתידות יותר ויותר קטנות, עד שתוכל למצוא את הפתרון לכל יחידה.
ברגע שפתרת את כל הבעיות הקטנות, הבעיה הגדולה נפתרה מעצמה.
השתמש בטכניקה זו גס בעיצוב התוכנית. התחל בחלוקת המטלה הכוללת שברצונך לבצע
למטלות קטנות יותר. אס נראה לך שעדיין קשה לטפל במטלה הקטנה יותר, חלק גם אותה
למטלות-משנה. המשך לעשות זאת עד שתוכל לכתוב את ההוראות המבצעות את המטלה.
לאחר שכתבת את כל הקטעים הנפרדים, וקישרת אותסם זה לזה בתוך ()מגגז, התוכנית
מוכנה! (בפרק 7 תלמד דרך יעילה עוד יותר לכתיבת תוכנית בקטעים).
חלוקת התוכנית בצורה כזו מטייעת לך גם באיתור שגיאות. כל שעליך לעשות הוא לשאול
את עצמך איטו מטלה אינה מתבצעת כיאות, ואז לבדוק את חלק התוכנית המבצע את
המטלה.
תהליך זה נקרא איתור ותיקון שגיאות, והוא משמש אנשי מקצוע בכל התחומים לצורך
פתרון בעיות. לדוגמה, כאשר אתה מכניט את מכוניתך לתיקון במוסך, המכונאי מפנה אליך
סדרה של שאלות. כשאתה מבקר אצל הרופא, הוא שואל 'איפה כואב לך'. תשובותיך
מסייעות לו לקבוע איזו מערכת בגוף גורמת לבעיה.
לוה
1. מהו המבנה הכללי של תוכנית 0!
2. מהו תותס ביטוי!
3. האם כל הקומפיילרים של 6 מחייבים שימוש בפונקציה ()מזטוטזו
4. מהי המטרה של ההערות בתוכנית 6!
5. מדוע משתמשים בפרמטר כאשר קוראים לפונקציה!
6. האם כל קריאה לפונקציה דורשת שימוש בפרמטרו
4 3 פרק 2: שפת התכנות ++ 6/6
ד רגילים
41 כתוב תוכנית המציגה על-גבי המסך את המלל הבא:
.6 עות 10 סה סט[
6 לת תס מ81ז %/ת00 16886
2 כתוב תוכנית המציגה את שמך, כתובתך ומספר הטלפון שלך, כשהס ממורכזים
על-גבי המסך.
3. הסבר מה לקוי בתוכנית הבאה:
()חוגות
(,
(תנוי1. 15 סחזגת ץ]א')פונוק
תרגילים 5 3
אושת סקסאס
5 ל תוכנית זקוקה למידע מסוג כלשהו. תוכנית שמתשבת תשלומי משכנתא
₪ צריכה לדעת את טכום ההלוואה, את שיעור הריבית ואת משך תקופת
ההחזרים. תוכנית המקטלגת אוסף בולים זקוקה לתיאור של כל בול. תוכנית שיורה
בפולשים מן החלל התיצון צריכה לדעת את הכיוון של כל ירייה ושל כל טורפדו
פוטונים.
מידע הנמסר למחשב נקרא נתוניס. אתה מזין את הנתוניס למחשב; המחשב מעבד
את הנתוניס בהתאם להוראותיך, ומוסר לך מידע כפלט. אך לפני שניתן יהיה להזין
את התוכנית בנתונים, עליך לומר לתוכנית באיזה סוג נתונים עליה לטפל.
7
ראשית, על 6 להקצות די זיכרון כדי לאחסן כל אחד מפריטי הנתוניס (מבלי לבזבז זיכרון).
טיפוסים שונים של נתונים זקוקים לכמויות שונות של שטח זיכרון. שנית, לא את כל
הפונקציות של שפת 6 ניתן לבצע על כל טיפוסי הנתוניס. אס תנסה למסור לתוכנית מלה
כאשר היא זקוקה למספר, תתקבל שגיאת קומפילציה או שגיאת הרצה.
כאשר אתה כותב את התוכנית, עליך לפרט לאיזה טיפוס משתייך כל פריט נתונים המשמש
את התוכנית, הן כקלט והן כפלט. אינך רשאי להשמיט מידע כלשהו, ואינך יכול לשנות את
דעתך כשהתוכנית כבר רצה.
את פריטי הנתוניס מסווגיס על-פי סוג הערך אותו הס מכילים. (שים לב שהמושג ערך אינו
מתייחס בהכרח לערך מספרי, מכיוון שנתונים יכוליס להיות גם אותיות, מלים ומשפטים,
בנוסף למספרים).
הערות ++6 ו
++6 כוללת את טיפוסי הנתונים הכלולים בשפת 6. עם זאת,
קומפיילרים מסוימים של .6 ושל ++6 כוללים טיפוסי נתונים
נוספים, שלא הוגדרו במפרט 688 המקורי של השפה.
8 8 0 570 88 אה-5 8 אלש עב 8 ונופ 8-0 אי 8 8די םיפ ה-78ם של
בחונים תוויים
ערכיס המשתייכים לטיפוס הנתוניס תווים - המכונה בקיצור 01431 - יכוליס להיות אותיות
בודדות, ספרות, או תווי מקלדת אחרים. עבור כל פריט של טיפוס הנתונים ז023 מקצה
המחשב די מקוס בזיכרון לאחסון תו אחד. לכן, אם אתה עושה שימוש בחמישה פריטים
שונים של טיפוס הנתוניס ז69, המחשב יקצה מקוס לחמישה תווים, כפי שמודגם בתרשים 3.1.
תרשים 3.1
כל פריט מטיפוס הנתוניס
,
3 תופש עמדה אחת עמדות זיכרון
בזיכרון.
התוויס כוללים את 26 האותיות הגדולות:
2צאאצטדפתסתקסאא ;אנ 6
את 26 האותיות הקטנות:
2וגאטצט|:ז6כק סת ת21[%1 6064612 ג
את עשר הספרות:
8 3 פרק 3: משתנים וקבועים
11+ 90
ואת הסימנים שניתן להקליד באמצעות המקלדת:
- ( > ב< 7ונונ:יי]|[ +|( ()*א י-%++%+ 8:
אס אתה כותב "מבחן אמריקאי", לדוגמה, באפשרותך להזין את התשובה 4, 2, 0 או ע -
כפריטי מטיפוס הנתונים ז008.
כפי שתראה בהמשך הפרק, תו מטיפוס :613 יכול להיות גם קוד בקרה מיוחד ש-6
מאחסנת באותו מקוס שהיא מאחסנת תו בודד.
שים לב שפריט מטיפוס הנתונים ז3ת6 יכול גם להיות ספרה בודדת, כמו 1, 2 או 3. אולס 6
מבדילה בין התו '" לבין המספר 1. בתור תו, לא ניתן להשתמש ב-"1" בפעולות מתמטיות,
מכיוון שאין לו אז ערך מספרי. כשהוא משמש מספר, ניתן להשתמש ב-1 במתמטיקה. אך
כפי שתלמד בהמשך, 6 יכולה לאחסן את התו "1" בחצי משטח האחסון לו היא זקוקה
עבור המספר 1.
מחרוזות
מחרוזת היא קבוצה של תווים, כמו מלה, ביטוי או משפט. 6 אינה כוללת טיפוס נתונים
נפרד עבור מחרוזות, כמו בשפות תכנות אחרות. במקוס זאת, אנו עובדים עם מחרוזת
כסדרה של ערכים מטיפוס הנתונים ז69, ומשתמשים בדבר שנקרא מערך (/83).
מחרוזת יכולה להכיל כל צירוף של תווים, מספרים, סימני פיסוק וקודים מיוחדיס
המשמשים כפריטי נתונים מטיפוס 6181 6 מבדילה בין מחרוזת המורכבת מספרות בלבד,
לבין מספר. הערך של המחרוזת "123" אינו מאה עשרים ושלוש. זהו רק צירוף התווים "1"/
4 ן-"3".
בספר זה תעבוד עס מחרוזות החל מהפרק הנוכחי, אם כי לא נעסוק בפירוט בנושא
המערכים עד פרק 10. הסיבה לכך היא שהמחרוזות שימושיות ביותר בכל סוגי התוכניות,
וניתן להתחיל להשתמש בהן גס מבלי להכיר את כל הרקע הטכני שלהן.
1 טברים שלנים
אס בכוונתך לבצע פעולות מתמטיות עם פריט נתונים, עליך להשתמש בטיפוס (תוניס
מספרי. :6 כוללת כמה טיפוסי נתונים מספריים, השונים זה מזה בתחוס הערכים שניתן
להקצות להם ובכמות הזיכרון שהס תופשים.
מספר שלם - הנקרא בקיצור 1ם! - הוא מספר שאינו כולל נקודה עשרונית. הוא יכול
להיות חיובי או שלילי, וכן אפס, אך ללא ספרות כלשהן אחרי הנקודה.
מוסכמה מקובלת ב-0 היא: "השתמש בטיפוס הנתונים תו לצורך מנייה". השתמש ב-)ת1 כדי
למנות כמה פעמיס דבר-מה מתרחש, או כדי למנות דבר-מה המופיע ביחידות שלמות בלבד.
הערה
קומפיילרים מסוימיס של 6
ושל ++6 כוללים טיפוסי
נתוניס מיוחדיס למחרוזות,
וכן ספרייה של פונקציות
מחרוזות. הקומפיילר
המצורף לספר זה כולל
פונקציות לטיפול במחרוזות,
אך אינו כולל טיפוסי נתוניס
מיוחדיס למחרוזות. אם אתה
משתמש בקומפיילר אחר,
בדוק את התיעוד הגלווה
אליו כדי לדעת איזה
מאפיינים הוא כולל, וכיצד
לגשת אליהם.
מספרים שלמים סְ 3
כפי שמודגם בתרשים 3.2, כל פריט מטיפוס הנתונים !פו זקוק למקוס אחסון של שני
תוויס, בין אס זה המטפר 2 או המספר 2000. אולם כדי להשתמש בשתי עמדות אחסון
בלבד עבור כל מספר, 6 חייבת להגביל את הערך של נתוני מספרים שלמים לתחום שבין
8- ל-32,767. מספרים מחוץ לתחום זה זקוקים ליותר משתי עמדות אחסון.
תרשים 3.2
פריט מטיפוס הנתונים תו
תופש שתי עמדות אחסון. עמדות זיכרון
כדי לטפל בכל סוגי המספרים, מרבית הקומפיילרים של 6 מגדירים כמה טיפוסים של
מספרים שלמים. הערכים שניתן להקצות לטיפוסים אלה משתניס מקומפיילר אחד למשנהו.
ם מספר שלם חיובי בין 0 ל-255
]םג מספר שלם בין 32,768- ל-32,767
זתו קַתסן מספר שלם בין 2,147,483,648- ל-2,147,483,647
קַתס] 66םקופתט | מספר שלם חיובי בין 0 ל-4,294,967,295
מספרים שלמיס המשתייכים לטיפוסים ]תג אַת0! (-8תס! 66ת18פתגו זקוקיס לארבע עמדות
אחסון בזיכרון. מרבית הקומפיילרים, כולל זה המצורף לספר, אינם מכירים בטיפוס
הנתוניס )ם1 !זסת5 כטיפוס נפרד. אתה רשאי להשתמש בו בתוכנית, אולס הוא מתנהג
באופן זהה לטיפוס )תו. הקומפיילר המצורף לספר זה מכיר בטיפוס נתוניס הנקרא
+ 18866פתו בעל תחוס בין 0 ל-65535.
1 טברים עעורוניים
מספרים שיכוליס להכיל נקודה עשרונית וספרות אחרי הנקודה נקראיט ערכי נקודה צפה.
6) כוללת טיפוס נתונים מיוחד עבור מספרים עשרוניים, הנקרא )804. מכיוון שמספרי
נקודה-צפה יכולים להיות קטנים מאוד או גדוליס מאוד, תחוס המספרים מבוטא לעתים
קרובות במספרים מעריכים (אקספוננציאלים). לדוגמה, ערך מטיפוס הנתונים 1081 יכול
להיות מספר גדול כמו 3.48+38. ביטוי זה אומר: "הזו את הנקודה העשרונית 38 מקומות
ימינה, תוך כדי הוספת מספר האפסים הדרוש'.
קיימיס טיפוסי נתוניס נוספיס המיועדים לטיפול בתתום רחב אף יותר של מספרים:
וו מספר בין 3.48-38 ל-3.48+38
6 מספר בין 178-308 ל-175+308
6 קַתסן מספר בין 3.45-4932 ל-1.15+4932
00 פרק 3: משתנים וקבועים
מידת הדיוק של טיפוסי הנתונים מסוג נקודה-צפה מוגבלת, ומשתנה מקומפיילר אחד
למשנהו. לדוגמה, המספר 6.12345678912345 הוא אומנם בתחום התקף של טיפוס נתונים
מסוג 8031, אולס מערכת המחשב שלך עשויה לאחסנו כ-6.12345 בלבד. טיפוס ]803 כזה
נחשב לבעל דיק יחיד. פירוש הדבר שהוא מוגבל ל-5 או 6 ספרות אחרי הנקודה
העשרונית. טיפוס 600016 נחשב לבעל דיוק כפול, והוא מדויק עד ל-14 או 15 ספרות אחרי
הנקודה. הקומפיילר המצורף לספר זה כולל טיפוס ]163 בעל דיוק של שבע ספרות אחרי
הנקודה, וטיפוס 40916 בעל דיוק של 13 ספרות אחרי הנקודה. קומפיילר זה אינו תומך
בטיפוס הנתוניס 600516 אַחסן.
טיפוסי נתוניס מסוג ]1804 תופשים ארבע עמדות זיכרון. טיפוסי נתונים מסוג 60856
משתמשים בשמונה עמדות זיכרון, ואילו טיפוסי 60016 קַתס! תופשים עשר עמדות זיכרון.
תרשים 3.3 מסכס את דרישות הזיכרון של טיפוסי נתונים מקובליס בשפת 6.
תרשים 3.3
סיכוס דרישות זיכרון.
עמדות זיכרון
"7 - = אשמתקקתתאתתתוותתקתהההתתתוחחומה /
212 || 0
86| ו זגחס
1 דוע להעותמעו בומטברים עולמים?
מחוץ לעולם תכנות המחשבים, איננו מוטרדים בדרך-כלל מההבחנה שבין מספרים שלמים
למספרים עשרוניים. אם אתה משתמש במחשבון לביצוע פעולות מתמטיות, כל שעליך
לעשות הוא ללתוץ על הכפתורים. אם מספר מסוים כולל ספרות אחרי הנקודה, אתה
מקיש אותן, אם המספר אינו מכיל ספרות אחרי הנקודה, אתה מקיש את המספר השלם.
אם כך, מדוע טורתחת שפת 6 לעשות הבחנה בין סוגי המספרים! הרי מספר הוא רק מספרו
חלק מהתשובה לשאלות אלה קשור בנושא אחטון המידע במחשב. זיכרון עולה כסףו
וכאשר אין די אכרון במחשב התוכנית לא תפעל. מתכנת טוב מנסה תמיד לחסוך באכרון
ולעשות שימוש בכמות זיכרון קטנה ככל האפשר. שימוש במספרים שלמיס במקום בערכי
1, או בטיפוס התוויס ז3ת6 במקוס במחרוזות, תוסך זיכרון.
בנוסף, פעולות על מספרים שלמים מתבצעות מהר יותר מפעולות על מספרים עשרוניים.
אם התוכנית שלך מבצעת כמות גדולה של פעולות מתמטיות, שימוש במספרים שלמים,
היכן שניתן, הוא החלטה נבונה. ייתכן שלא תבחין בהבדל בתוכניות קטנות הרצות על
מחשב מהלר, אולם ביישומים הנדסייס וגרפיים, הבדלי המהירות הם משמעותייס ביותר.
תוך כדי לימוד תכנות, הקפד לבחור תמיד בטיפוס הנתונים המתאים ביותר לצרכיך
המיידיים. כדאי לפתח את ההרגל להשתמש במספרים שלמים בכל מקוס שהדבר אפשרי -
בכל מקרה שאתה יודע שהמספר אינו זקוק לנקודה עשרונית.
מדוע להשתמש במספרים שלמים? [4
7דבועים ומעוחנים
לאחר שביררת לעצמך מהו טיפוס הנתונים המתאים לכל אחד מפריטי הנתונים להס אתה
זקוק, עליך להתליט כיצד תזין אותם למחשב. ישנן אומנס פקודות רבות המשמשות לקלט
נתוניס, אך עליך לסווג תחילה כל אחד מפריטי הנתונים כקבוע או כמשתנה.
קבוע נשאר אותו הדבר לאורך התוכנית כולה. למעשה, קבוע מקבל את הערך שלו בעת
כתיבת התוכנית, ולא בזמן הרצתה, וערך זה אינו יכול להשתנות, אלא אס כן אתה משנה
את התוכנית. אם ערכו של פריט נתונים כלשהו ידוע לך מראש, וערך זה אעו צריך
להשתנות במהלך התוכנית, השתמש בקבוע.
לדוגמה, נניח שאתה מתגורר במדינה בה שיעור מס הקנייה הוא 5 אחוזים. כאשר אתה
מחשב את מחירו של מוצר, שיעור המס יחושב תמיד כ-5 אחוזים. לכן, ניתן לאחסן את
הערך 0.05, ערך מטיפוס )1108, כקבוע.
ערכו של משתנה, לעומת זאת, יכול להשתנות בכל פעם שאתה מריץ את התוכנית. אתה
מציב את הערך בעת שהתוכנית מורצת. במערכת של הזמנות מוצרים למשל, שיעור מס
הקנייה אינו משתנה, אך סכוס ההזמנה משתנה. לא כל הרכישות הן באותו הסכום. לכן,
סכוס ההזמנה יאוחסן כמשתנה.
מרבית התוכניות עושות שימוש הן בקבועים והן במשתנים. כאשר אתה כותב את התוכנית
עליך לדעת כיצד להתייחס לכל פריט נתונים, האם כקבוע או כמשתנה. זוהי רק אחת
מההחלטות שעליך לקבל בעת שאתה מתכנן את התוכנית.
1 תו שמוח לקבועים ולמעותנים
עליך להעניק שם לכל קבוע ולכל משתנה בהם תעשה שימוש בתוכנית. אורכו המירבי של
שם של משתנה תלוי בקומפיילר. בקומפיילריס מסוימיס אתה מוגבל לשמונה תווים, ואילו
קומפיילריס אחריס מתירים שמות בני עד 32 תווים או יותר. במקריס מסוימים, שמות
משתנים יכולים להכיל תווים נוספים, מעבר למספר התוויס המשמעותיים. לדוגמה, ייתכן
שבאפשרותך להשתמש בשמות בני 32 תווים, אולס רק שמונת התווים הראשונים חייבים
להיות ייחודיים. מבחינת המחשב, המשתנים 15088016ח80000 [-1916061/8016ת36000 הם
זהים, מכיוון ששמונת התווים הראשונים של שמם זהים. הקומפיילר המצורף לספר זה
מתיר שימוש בעד 31 תוויס משמעותיים בשמות משתנים.
שמות של משתנים וקבועים יכולים להכיל אותיות גדולות ואותיות קטנות, וכן את תו הקו
התחתי ( ). באפשרותך להשתמש בכל צירוף של אותיות ומספרים, אולס התו הראשון בשס
חייב להיות אות. מתכנתיס משתמשים בתו הקו התחתי כדי להפריד בין מליס, וכך הופכים
את השמות לקריאים יותר ובעלי משמעות ברורה, כמו למשל אג! עו במקוס אגוץ)01.
212 פרק 3: משתנים וקבועיס
נסה לבחור שמות המתאריס את אופן השימוש בנתונים. השם א! ץווס מובן יותר מאשר
0% והשם 006 ווזג3 אומר יותר מאשר 46. הימנע משימוש בשמות כמו 4 ו-8, אלא אם
כן אתה כותב תוכנית פשוטה במיוחד.
אין להשתמש בפקודה של 6 (או במלת מפתח) כשם של משתנה או קבוע. אם תעשה זאת,
הקומפיילר יציג הודעת שגיאה ויפסיק את קימפול התוכנית. הרשימה הבאה מציגה את כל
מלות המפתח בשפת 6 ובשפת ++6, כולל מלות המפתח שנכללו בהגדרת 888 המקורית
של שפת 6, מלות המפתח שנוספו ב-6 581א8, ואלו שנוספו בשפת ++6. ייתכן
שהקומפיילר שלך כולל פקודות נוספות המשמשות אף הן כמלות מפתח. יש לבדוק את
התיעוד הנלווה. אס מוצגת לך הודעת שגיאה בעת הקימפול, ואתה בטוח שההוראה נכונהן
בדוק אם אינך משתמש בטעות במלת מפתח כשם של קבוע או משתנה.
להלן מלות המפתח שהוגדרו ב-6 88א:
סט
זל
56
זו
006
0
0
1006
56
ץז)תס
תזס)אס
ותו
זסז
6 [5א4 הוסיפה את מלות המפתח הבאות:
0
11
תו
8ַתסן
1
הזז
ו
1
0
ו
5
יי
םסותט
00%
ותטתס
בו
6
6
מתן שמות לקבועיס ולמשתנים 23
ואילו בשפת ++6 נוספו מלות המפתח:
ה ות
תוס שוסת
5 זר
00 6
6 6
68
בשמות של משתנים וקבועים ישנה הבחנה בין אותיות גדולות לקטנות. אם הענקת
למשתנה את השם 18%, אינך יכול להתייחס אליו בשלב מאוחר יותר בשם אג1 או א8.
למעשה, יכולים להיות לך שלושה משתנים שונים, ששמס 18%, 18% ו-אג), כשכל אחד
מהם מכיל ערך שונה, ומשתייך לטיפוס נתונים אחר. (כמובן שדבר זה יקשה מאד על
קריאת התוכנית ועל איתור ותיקון התקלות). שגיאה נפוצה אצל מתכנתים מתחילים היא
לשנות את האיות או להשתמש בצירוף שונה של אותיות גדולות וקטנות באיזכור שמו של
משתנה או קבוע בחלקים שונים בתוכנית. הדבר גורם לשגיאות קומפילציה או לשגיאות
הרצה, שלעתיס קשה לאתרן ולתקנן.
תרשים 3.4
המוטכמות בשפת 6 למתן . .
שמות למשתנים ולקבועיס. 5
6 85 528085 סא /] אגז שו
16%008 8 01%0 808 96004 16 1 זז
ז0+ 100070858 058 זק. 80
5 8718018
65
0+ 660858קקט 086 וח וא
5 0005%80%
48 86 508008 סא 5 ך ףזגח אד
16%008 8 ה1%א פפתפה +זגום | ]0)/61 001
המוסכמה בשפת 6 (כפי שמודגם בתרשים 34) היא להשתמש באותיות קטנות בלבד
בשמות של משתנים, ובאותיות גדולות בלבד בשמות של קבועים. אומנם לא תוצג לך
הודעת שגיאה אם תפר את המוסכמה, אך ישנן סיבות טובות לקיים את הכלל. שמירה על
14 פרק 3: משתנים וקבועים
הכלל מקלה על ההבחנה בין משתנים לבין קבועים בתוכנית, והופכת את התוכנית לנוחה
יותר לקריאה ולמעקב אחר מהלכה.
חובה לציין בתוכנית 6 את השם והטיפוס של כל משתנה ושל כל קבוע.
רזה על קבו
הכרזה על קבוע פירושה למסור לקומפיילר 0 את שמו ואת ערכו של הקבוע. עושיס זאת לפני
הפונקציה ()ם41וח, באמצעות הנחיית הקומפיילר 6ם866/1, שתחבירה הכללי הוא כדלקמן:
₪ םא 406065
אין להציב נקודה-פסיק בסופה של ההנחיה ובין ההנחיר שם הקבוע וערכו חייב להופיע
לפחות רווח אחד. התחביר המדויק תלוי בטיפוס הנתוניס אותו מגדירים - מספרי, זַגם0 או
מחרוזת (עיין בתרשים 3.5).
לפני שהקומפיילר מתחיל ליצור את קוד העצמים, הוא מחליף כל איזכור של שס הקבוע
בערך של הקבוע (בדומה לפעולה אוטומטית של חיפוש והחלפה במעבד תמלילים). בעיקרו
של דבר, שס הקבוע אינו מומר לעולס לקוד עצמיס.
ערכים מספריים איעט -------->3.15 8₪!(\ 6ח0618א
נתונים במרכאות
אין לכלול נקודה עשרונית ----------> 3 8=4!(!) 406118
בערכיס מטינוס מספר שלם
ערכים מטיפוס )₪08 חיש
לכלול ספרה עשרונית אחת, 0 ה 6חו001
לכל הפחות, פטמאל ומומ ו וט 06108
לנקודה העשרונית
ו ו -----> ו 0107 00108
יי גנט ------> "480" | 51 4061106
קבוע מספרי מוכרז על ידי ציון שמו של הקבוע וערכו. לדוגמה, ההנחיה הבאה:
4 1 6ת0611
יוצרת קבוע ששמו [0, ומציבה בו את הערך 3.14. (ראה תרשים 3.6).
תרשים 3.5
התחביר בהכרות
קבועים.
/
7
9 פע
ניתן להשתמש בהנחיה
6 גס לצורך
יצירת תוכניות מקרו.
עיון בפרק 7.
הכרזה על קבוע 5
תרשים 3.6
הכרזת קבוע.
שמו של הקבוע שנוצר (מוכרז)
הערך המוקצה לקבוע הנחיה לקומפיילר
"3.16 |הטף6 [ק )16 9
חי ו . . /
4 | 40006
משמעות הביטוי היא
זץ שווה 3.14
תרשים 3.7
הקומפיילר מחליף את שם
הקבוע בערך של הקבוע. לפני יצירת קוד העצמים מוחלף
כל איזכור של 21 בערך 3.14
400608 | 4
זה הביטוי שמקומפל %
1 185 98% 18 8די
4 | 8חו4001
6 פרק 3: משתנים וקבועים
בכל פעם שהקומפיילר נתקל ב-1? בקוד המקור (בנוסחה למשל), הוא מציב במקומו את
הערך 3.14. (ראה תרשים 3.7).
אינך חייב לציין במפורש את טיפוס הנתוניס בשעה שאתה מגדיר קבוע. 6 מייחטת לקבוע
טיפוס נתונים בהתאס לערך שמסרת בהנחיה %061!86. בדוגמה הקודמת, הקבוע 71 מקבל
את טיפוס הנתונים 8081, מכיוון שהערך שלו, 3.14, הוא מספר עשרוני. בהנחיה:
5 דא 60 06006
הקבוע 1א60 מקבל את טיפוס הנתונים !תו, מכיוון ש-5 הוא מספר שלם.
כדי להכריז על טיפוס )808, עליך לוודא שהערך כולל לפתות ספרה אחת משמאל לנקודה
העשרונית, ולפחות ספרה אחת מימין לנקודה. גם אם הערך איגו כולל ספרות כלשהן מימין
לנקודה העשרונית, יש לכתוב את הנקודה וכמה אפסים מימין לה, כך:
0 6ם06/1
ללא ציון הנקודה העשרונית, 6 תניח שמדובר בקבוע מטיפוס תו ולא מטיפוס ]808. כדי להכרט
על ערכים הקטנים מאחד, יש לכתוב אפס משמאל לנקודה העשרונית, כמו בדוגמה הבאה:
6 006
6 תציג הודעה על שגיאת קומפילציה אם תכריט
6 ד 6ת060
בעבודה עם טיפוס הנתונים זגת6, יש להציב גרש משני צדדיו של הערך:
יי דא[ 40606
באופן דומה, כדי להכריז על מתרוזת, יש להקיף את הערך במרכאות:
"0060186" כאם1ת] 6ה068
()םוגות
|
לסאמ1ת)טטת
)
יש לזכור שהמרכאות אינן הופכות לחלק מהערך.
כאשר עושים שימוש בשם של קבוע בתור פרמטר, במקרה זה בפקודה ()פוגוק, אין להקיף
אותו במרכאות. כך יודע הקומפיילר שעליו להשתמש בערך שהוקצה לקבוע ולא בתוויס
המרכיביס את שמו. בדוגמה שלנו, הקומפיילר ישתמש בערך שהוצב בקבוע פאמ1את, ולא
בתוויס 2-א-8-]-2-ת. אס ברצונך להציג את המלה א18ת, הפקודה תיראה כך:
("קאפז')ונוק
הכרזה על קבוע 77
הערה
00 היא פקודה
שימושית מכיוון שהיא
מאפשרת למתכנת ליצור
קבועיס מקומייס
לפונקציות מסוימות. עם
זאת, כדי להבטיח תאימות
עם כל הקומפיילרים של
6 ושל ++6, מרבית
המתכנתים ממשיכים
להשתמש בהנחיה 6ת4660
לצורך הכרזה על קבועים.
אחרי שהקומפיילר קרא את ההנחיה "60186" כ 15 6מ86611, בכל פעס שהוא נתקל
בקבוע פאמזאץ בתוכנית, הוא מחליף אותו בערך "260186)". לפיכך, ההוראה
(סאם1ת)טק
קוראת למעשה לפונקציה ()פוטוק כך:
(("260780)")פוטוק
ומציגה את השס 0300186 על-גבי המסך. אם התוכנית שלך מתחילה בשורה:
"118201" את[ 6תו4001
יופיע השס |11826 על-גבי המסך. מדוע! מכיוון שההנחיה הגדירה את השס פאםזפק
כבעל ערך |11826.
קבועים בעובת ++6
++6 וקומפיילרים מסוימים של 6 כוללים דרך נוספת להכרזה על קבועים. בעזרת
השימוש ב-%%ח60 ניתן להכריז על קבוע, לציין את טיפוט הנתונים אליו הוא משתייך
ולהקצות לו ערך. עם זאת, השימוש ב-)%תסס נעשה בתוך פונקציה, ולא כהנחיה המופיעה
לפני ()תוגחז, כמו בקטע התוכנית הבא:
()תנגות
|
8 = אםכ6111 וו ופתסס
6% = 1811 081 00081
פקודות אלה מכריטות על קבוע מטיפוס זחג בעל ערך של 8, ועל קבוע מטיפוס ז9ת6 בעל
ערך של 6. הן מבצעות פעולה זהה להנחיות
8 61111.0 0606
שי ד]א] 6ת4066
1 דוע להשתמעו בקבועים?
אס הערך איגו עומד להשתנות בתוכנית, מדוע לטרוח ולהשתמש בקבוע! מדוע לא
להשתמש בערך עצמו באופן ישיר בהוראה המתאימה בתוכנית! לדוגמה, אם אנו פותחיס
את התוכנית עס השורה
"555-1234" 1100 6מ40611
ניתן להציג את מספר הטלפון על המסך באמצעות פקודה כזו:
(5א110)פווק
8 פרק 3: משתנים וקבועים
אולם מכוון שהעוך של מספר הטלפון לא משתנה במהלך התוכנית, ניתן באותה מידה
להציג אותו ישירות:
("1234--5)"555זנוק
אחרי הכל, התוצאה תהיה זהה לחלוטין/ ואינך צריך לטרות ולכתוב הנחיית 6ת%0611
ולהעניק שס לקבוע.
יחד עם זאת, השימוש בקבועיס עושה את התוכנית לקלה נותר לשינוי. נניח, לדוגמהו
שהתוכנית מציגה את מספר הטלפון שלך 20 פעמים. אס חל שינוי במספר הטלפון, ולא
השתמשת בקבועו היה עליך לערוך מחדש את כל 20 פקודות ה-()5זטוק. אתה עלול לטעות
ולשנות 19 פקודות ()פונוק בלבד, ולגרוס בכך שמספר הטלפון השגוי יוצג פעס אחת. אם
השתמשת בקבוע, לעומת זאת, כל שעליך לעשות הוא לבצע שינוי אחד - להקליד את
מספר הטלפון החדש בהנתיה 6 כפי שמודגם בתרשים 8, כל פקודות ה-(50זטק
נעודכנו באופן אוטומטי.
תרשים 3.8
השתמש בקבועים כדי
להקל על הכנסת
שינויים בתוכנית.
עם קבוע, יש לשנות את ללא קבוע, יש לשנות את
ההוראה הזו בלבד כל ההוראות הבאות:
"234 5-1" 8005 06106 ()חו4וח
()חוגוח (
(
ו >("1115)'555-1234ם
("015)"555-1234 .
15)'555-1234%
(115)'555-12840ם
:(116)'555-1234%ק
("15)"555-1234/ק
;(15)'555-12340/ום
015)'555-1284"(
4 :(15)'555-1234%/ם
-(15)'555-12840/ם
מדוע להשתמש בקבועים? 5 4
תוירי יה נרכ- המ =
הדבר נכון גם לגבי קבועיס מספריים. במקוס להשתמש בהנחיה
6 7 6תו/466
ולבצע חישובים תוך כדי שימוש בקבוע 1%, ניתן להציב את הערך 006 ישירות
בנוסחאות. אך נניח שהמדינה מחליטה להעלות את שיעור המס ל-65%. אם לא השתמשת
בקבוע, יהיה עליך לשנות את הערך בכל מקוס בו הוא מופיע בתוכנית, במקוס לבצע שינוי
אחד בלבד בהנחיה 6ם40611.
רזה על מעוחנה
הכרזה על משתנה פירושה לספק לקומפיילר ₪6 את השס ואת הטיפוס של המשתנה, ועליך
לציין במפורש את טיפוס הנתוניס אליו משתייך ערכו של המשתנה. התחביר הכללי
להכרזה על משתנה הוא כדלקמן:
6ומגת 6קע1
מספר הרווחים בין הטיפוס לבין השס תלוי בך, כל עוד הוא גדול מאחד. הכרזה אופיינית
על משתנה נראית כמו קטע התוכנית הבא:
()םוגתז
|
60 ום1
6 אג) וגס
תרשים 3.9
הכרזה על משתנים.
שם המשתנה טיפוס הנתונים
א
הכרזה זו יוצרת משתנה מטיפוס )תג ששמו ומטסס, ומשתנה מטיפוס ]08 ששמו 1916 אגו
(ראה תרשים 3.9).
אס אתה משתמש במספר משתניס המשתייכים לאותו טיפוס, באפשרותך להכריז עליהם
בהוראה אחת. יש להפריד בין שמות המשתנים בפטיק, ולסיים את ההכרזה בנקודה-פסיק,
כך:
0 פרק 3: משתנים וקבועיס
()תוגות
|
6 ,ח6116:6 ,)תטסס זח1
;0150006 ,1816 88 |גסה
|
תוכנית זו יוצרת חמישה משתנים - שלושה ערכים מטיפוס הנתונים )םו, ושני ערכים
מטיפוס :108. יש להציב את הכרזת המשתנים בקבוצה בתוך הפונקציה ()תופות, אחרי
התוחס הפותח ולפני כל הוראה אחרת. על משתנים בודדים ניתן להכריז גם לפני ()ח1גתז,
כך:
;)טסס ות1
()םוות
ן
ו
בתוכנית פשוטה, ניתן להכריז על משתנים באחד משני המקומות. (כאשר עושים שימוש
במספר פונקציות, מקוס ההכרזה על משתנים נקבע על ידי כללי 6 מורכבים יותר. כללים
אלה נדונים בפרק 7).
ךקצאת ערכים
למשתנים מסוימים יש ערך התחלתי - הערך שיהיה למשתנה עס התחלת התוכנית. בניגוד
לקבוע, ערך זה יכול להשתנות תוך כדי הרצת התוכנית. ערך התחלתי מציבים בהכרזה על
המשתנה, או בהוראה נפרדת.
בעבודה עס נתונים מספריים ונתונים מטיפוס :63 (בהמשך נתייחסי גס למחרוזות), ניתן
להקצות את הערך כחלק מההכרזה:
()מ1גות
(
5=]ת 60 1ח1
;'=1)181ח1 081
05
הוראה זו מכריזה על משתנה ששמו !חוסט ומקצה לו את הערך ההתחלתי 5. ההוראה
מכריזה גם על משתנה מטיפוס זגת6 ששמו [184ח1 ומקצה לו את האות , ועל משתנה
מטיפוס 11081 בעל ערך התחלתי של 0.55. משני צדדיו של ערך המשתנה מטיפוס 0141 יש
הקצאת ערכים 1 5
להציב גרש, וערכים מטיפוס ]1108 חייבים לכלול לפחות ספרה אחת מצידה השמאלי של
הנקודה העשרונית, ולפחות ספרה אחת מצידה הימני.
לאחר שהכרזת על משתנה, ניתן להקצות לו ערך גם בהוראה נפרדת, באמצעות הסימן =, כך:
005
'=10101ת1
1655
הערך שאנו מקצים כאן למשתנה הוא ערך התחלתי בלבד. מכיוון שאנו עוסקים במשתנים,
הערך ההתחלתי יכול להשתנות תוך כדי הרצת התוכנית.
אס אינך ודע מהו ערכו ההתחלתי של משתנה כלשהו עד שהתוכנית מורצת, באפשרותך
להקצות ערך על ידי הזנתו מהמקלדת, מקובץ, או באמצעות חישוב. נלמד שיטות אלה בהמשך.
רזה על מעותנ' מחדוזה
זכור, 6 אינה כוללת טיפוס נתונים מיוחד למחרוזות או פונקציות מובנות המיועדות
למחרוזות. למרבה המלל, :6 מאפשרת לנו לעבוד עם מחרוזות על ידי שימוש במערכים.
בתחילת הפרק הגדרנו מחרוזת כסדרה של תווים. זוהי בדיוק מתרוזת - סדרה של משתנים
מטיפוס 6141 המאוגדים במשהו שנקרא מערך. התווים המרכיבים את המחרוזת מאוחסנים
יחד, בעמדות זיכרון רציפות. משתנה שהערך שלו הוא "116110" ייראה כפי שמודגם בתרשים
0. כל תו מאוחסן בעמדת זיכרון נפרדת, בדיוק כמו תו 681 בודד, אולם ניתן להציג את
המחרוזת כולה כיתידה אחת, באמצעות פקודת ((פונוק אחת. הסימן 0 הוא קוד מיוחד
ש-6 מציבה אחרי המחרוזת. תפקידו לסמן את סופה של המחרוזת, כדי שפונקציות
כדוגמת ()פונוק ידעו מתי עליהן לחדול מלאחזר תוויס לצורך הצגתם.
תרשים 3.10
נתוני מחרוזת בזיכרון. עמדות זיכרון
משתנה מטיפוס מחרוזת
למדת כבר כיצד להכריז על קבוע מחרוזת - באמצעות הנחיית 866116 והקפת התווים
₪ הערה במרכאות, כמו בביטוי הבא:
הסימן 0 נקרא מסיים
אפס (ז810ת1חח9! [[ום) ]סנו 106" 61,157 6ה40611
ונחשב לתו אחד בלבד. כדי להכריז על משתנה מחרוזת, אנו משתמשים בטיפוס הנתונים 618 ומציינים את
המספר המירבי של תוויס שהמשתנה יכול להכיל. התחביר הוא כדלקמן:
2 5 פרק 3: משתנים וקבועים
;[א]פו אתא זגתס
8אה אתה הוא שמו של המשתנה, ו-א הוא המספר המירבי של תווים. את מספר
התווים יש להציב תמיד בתוך סוגריים מרובעיס, [ ו-].
המספר שבתוך הסוגריים המרובעים צריך, למעשה, להיות גדול באחד מהמספר המירבי
של תווים שברצונך לכלול במשתנה. 6 זקוקה לתו הנוסף כדי לאחסן את הקוד (. לדוגמה,
על משתנה המיועד לאחסן קיצורים בני שתי אותיות של שמות המדינות בארה'ב ניתן
להכריז כך:
זס
כפי שמודגם בתרשים 3.11, הכרזה זו יוצרת משתנה מחרוזת ששמו 81816, היכול להכיל שני
תוויס בנוסף למסיים אפס (0).
תרשים 3.11
הכרזה על משתנה
הקצה שלוש עמדות זיכרון מחרוזת.
עבור המשתנה ששמו 5)8)6
7 זה
ההכרזה כוללת מקוס
עבור מסיים האפס
אינך יכול להקצות למשתנה מספר תווים גדול יותר מזה שהכרזת עליו. הסיבה לכך היא
ש-6 מקצה מקוס בזיכרון המספיק רק כדי לאחסן את המספר המירבי של תוויס. לכן,
חשוב היטב לפני ההכרזה על המשתנה.
לדוגמה, נניח שאתה זקוק למשתנה כדי לאחסן שס של לקוח. ניתן להכריז עליו כך:
0 0
הכרזה על משתני מחרוזת 3 5
תרשים 3.12
אינך יכול להציב במשתנה
תוויס רבים יותר מכמות
הזיכרון שהוקצתה.
התוכנית עשויה לרוץ ללא תקלות, עד שתתקבל הזמנה ממר ת18816101/5. כאשר תנסה
להקצות את שם הלקוח הזה למשתנה, התוכנית תיעצר ותוצג הודעה על שגיאת הרצה,
כמודגס בתרשים 3.12.
הקצה עשר עמדות זיכרון
עבור המשתנה ששמו )םסו[6,
כולל מסיים האפס.
ו
יי מצטערים, אין די מקוס
אתה יכול להכריז על המשתנה תוך ציון מספר גדול של תווים, כמו
]0 זג
אולס אם התוכנית כוללת כמה משתנים כאלה, הדבר יגרום לבזבוז רב של משאבי מחשב.
לאחר שהכרות על משתנה מחרוזת, באפשרותך להקצות למשתנה ערך. בדומה למשתנים
אחרים, ניתן להקצות ערך התחלתי או לקבל ערך מהמקלדת או מקובץ. (בפרק הבא תלמד
כיצד לקבל מחרוזת מהמקלדת). ב-0 88 לא ניתן להקצות ערך למחרוזת באופן ישיר,
כמו שמנסה לעשות התוכנית הבאה:
()ם1פות
[
0
"106"=]מ0116
;(1ת5)0116)טק
4 5 פרק 3: משתנים וקבועים
הביטוי
"1="[06ת0116
או ביטוי חוקי. אם ברצונך להציב ערך התחלתי במשתנה מחרוזת, עליך לעשות זאת בעת
שאתה מכריז על המשתנים, באמצעות אחת משתי שיטות. באפשרותך להקצות את הערך
על ידי הכרזה על המשתנה לפני הפונקציה ()מוגוז, כך:
;"מ0/16ת816קט1'=[]]מ6116 זגו[
()חוגחז
|
;(6ת5)0116וטק
|
שיס לב שהמספר המירבי של תוויס אינו מופיע בתוך הסוגריים המרובעים. המספר המירבי
המותר יהיה תלוי בקומפיילר שברשותך, אולס הוא מוגבל, בדרך-כלל, למספר המירבי של
תוויס בערך ההתחלתי (ראה תרשים 3.13). כמו כן, שים לב שאנתנו משתמשים בשמו של
המשתנה רק בפונקציה ()5טק - אינך צריך להשתמש בסוגריים מרובעים.
תרשים 3.13
הכרזה על ערך
התחלתי עבור מחרוזת.
הקצה 13 עמודות זיכרון עבור משתנה
מטיפוס 6187 ששמו )ה6ו61, ואתחל
את המשתנה בערך ם16100/6שקטו
"וט ח6וטשטו"=1 7-ו זחס
הדרך הנוספת להצבת ערך התחלתי, בתוך הפונקציה ()ת1גוח, מורכבת מעט יותר:
()תוגות
|
518110 081 ₪166)][ = "116110"
(19)81601ק
הכרזה על משתני מחרוזת 5 5
ההכרזה מתבצעת בתוך הפונקציה ()תו8וח, ומתחילה עם המלה 51911:0. משתנה 518116 יכול
לשמש רק בפונקציה בה הוכרז. אם ברצונך להקצות ערך התחלתי למשתנה מחרוזת
ב-()תוגות, עליך להכריז עליו כעל משתנה 5/8/10. בפרק 7 נעסוק בהרחבה בנושא זה.
טי נחונים ובונקציות
טיפוס הנתונים אליו משתייכים קבוע או משתנה כלשהם קובע איזה פונקציות יכולות
לעשות בהס שימוש. למרבית הפונקציות יש להעביר טיפוס נתוניס מסויס בתור פרמטר.
לדוגמה, ()פוטק דורשת מחרוזת של תווים, ולכן התוכנית
4 1 6ת406
()תופות
|
)וטק
תגרוס לשגיאה. הפונקציה ()פוטק אינה יכולה להציג ערך מטיפוס )108].
שגיאה נפוצה אצל מתכנתים מתחילים היא להכריז על קבוע זג014 על ידי הצבת ערך בן תו
אחד בתוך מרכאות כפולות:
"ה" [גוונתן 40606
6 תקבל את ההכרזה הזו, מתוך הנחה שברצונך שהקבוע יהיה מחרוזת. עם זאת, כאשר
תנסה להעביר את הקבוע לפונקציה שדורשת טיפוס ז8ת6, תקבל שגיאות קומפילציה.
הערך הוא אומנס בן תו אחד, אבל הצבתו בתוך מרכאות כפולות מסמנת אותו כמחרוזת.
תוך כדי לימוד נושאי הקלט והפלט בפרקים הבאים, ודא שברור לך לאיזה טיפוס נתוניס
זקוקה כל אחת מהפונקציות.
( רבים מילוליים
ערך מילולי הוא פריט נתונים שאתה מקליד ישירות לתוך הוראה של 6. לדוגמה, כל מספר,
תו או מתרוזת שאתה מקליד כערך התחלתי נחשב לערך מילולי. בהוראת
(5=)ת 00
המספר 5 הוא ערך מילולי. פירוש הדבר שברצונך להקצות למשתנה את המטפר הזה
בדיוק. בהוראות
שי ד1א] 6תו4061
55
("1="106ת0116
("19)"555-1234ט
6 5 פרק 3: משתנים וקבועים
התו 6, המספר 0.55, המלה 106 ומספר הטלפון 555-1234 הם ערכיס מילוליים.
ך ננון התוכנית
גתוניס חיונייס לכל תוכנית 6 או ++6. אס אינך מתכנן מראש את השימוש בנתונים, רביס
הסיכויים שתיתקל בשגיאות קימפול ובשגיאות הרצה.
בפרק זה עסקנו במשתנים ובקבועים מבחינת הנתונים שיש להזין לתוכנית. עליך גם
להתייחס לנתונים שברצונך לקבל מהתוכנית כמידע. מרבית הסיכויים שיהיה עליך להכרט
על משתנים כדי לאחסן גם את המידע הזה.
למעשה, מתכנתים רבים נוהגים להתחיל את תכנון התוכנית בפלט. בעזרת ההחלטה בדבר
המידע שברצוגם לקבל מהתוכנית, הם יכוליס לקבוע איזה מידע יש להצין לתוכנית, וכיצד
יש לעבד אותו.
כדוגמה, הבה נבחן תוכנית שמחשבת את מס הקנייה על הזמנה. להלן השלבים הכרוכים
בפיתוח הקבועיס והמשתנים הדרושים:
1. לאילו פריטי מידע התוכנית זקוקה:
* הפלט יהיה סכום הרכישה, כולל מס הקנייה.
* כדי לקבוע את הפלט, עליך להזין לתוכנית את סכוס ההזמנה ואת שיעור מס
הקנייה. סכוס הרכישה מבוטא בדולרים, ולכן תזדקק למשתנה מטיפוס ]1103.
תוכל לכנות את המשתנה בשס 5816. שיעור מס הקנייה נקבע על ידי המדינה,
ולכן אתה זקוק לקבוע מטיפוס 081. נכנה אותו 4718 14%
* על התוכנית להכפיל את סכום ההזמנה בשיעור מס הקנייה. לדוגמה, אס
ההזמנה היא בסכום של 525.00, ושיעור מס הקנייה הוא 0.05, סכום המס
הוא 51.25. תזדקק למשתנה מטיפוס )11084 כדי לאחסן את סכוס המס. נכנה
את המשתנה א8] 58165.
* על התוכנית להוטיף את סכוס המס לסכוס ההזמנה כדי לקבל את
הסך-הכל. הסך-הכל בדוגמה שלנו הוא 526.25. כדי להציג את הפלט תזדקק
למשתנה מטיפוס )809 שיאחסן את סכום הרכישה כולל המס. נקרא
למשתנה זה [018).
2. את הנחיות 866/16 עבור הקבועים:
5 אד 065
3. את הכרזות המשתנים:
1081 5816, 54165 8, 1
תכנון התוכנית 7 5
לאחר שביצעת את התכנון עבור הנתונים, אתה מוכן לכתוב את התוכנית.
אלות
4
2
3
9
מהו טיפוס הנתונים 30491
מה ההבדל בין התו "3" לבין המספר 3?
באיזה טיפוס נתוניס תשתמש כדי לאחסן סכום בדולרים!
מתי יש צורך להשתמש בתוכנית בטיפוס הנתונים 1ם1 קַחסן
לאיזה צורך תשתמש בטיפוס הנתונים 1081 160016
מה ההבדל בין קבוע לבין משתנה?
כיצד מכריזים על קבוע!
האם 6 כוללת טיפוס נתונים מיוחד עבור מחרוזות!
האם יכול להיות למשתנה ערך אחד לאורך כל התוכנית!
0. כיצד משנים את ערכו של קבוע!
ד רגילים
41
2
3
החלט איזה טיפוסי נתונים דרושים עבור תוכנית המחשבת את משכורתו
השבועית של עובד, המשתכר תעריף כפול עבור כל שעת עבודה נוספת מעל 40
שעות עבודה בשבוע, וכתוב את ההכרזות המתאימות.
החלט איזה טיפוסי נתוניס דרושים עבור תוכנית המחשבת את הסכוס ואת
הממוצע של ארבעה מספרים, וכתוב את ההכרזות המתאימות.
הסבר מה שגוי בקטע התוכנית הבא:
"א /"=[1]3ת0116 זגוס
()הוגגת
(06 אג) 1031
(410010ת 03
(5)ותס6 זם1
"6.00 א18
8 5 פרק 3: משתנים וקבועים
6/0 0620/ת. התכנות. +06
אא
| | 4; פלט משגר עותק של נתונים מתוך זיכרון המחשב למיקוס אחר - מציג
ש 1 אותו על-גבי המסך, מדפיס אותו במדפסת, או שומר אותו בקובץ. טוגיס
נדיריס יותר של פלט שומרים נתוניס על-גבי סרט מגנטי, מעביריס אותם דרך מודס
או שולחים אותס בפקס דרך קו הטלפון.
יצירת פלטי של הנתונים אינה מוחקת אותם מזיכרון המחשב, ואעה משפיעה על אופן
האחסון של הנתונים. הפלט הוא רק עותק של נתוניס המשוגר למקוס אתר.
תרגילים 0 5
4
9 בפרק זה תלמד כיצד לשגר פלט אל המסך.
טיפ
כל פקודות הפלט בשפת ₪6 הפקודה בה תשתמש ליצירת הפלט תלויה בסוג הנתוניס ובאופן בו ברצונך להציגם. צורות
נתמכות גס על ידי ++6. הפלט הישירות ביותר פועלות עס מחרוזות ונתונים מטיפוס זגת0.
[נונקציה 50וטכ
בפרקיס הקודמים הכרת כבר היטב את הפונקציה ()18טק, המציגה מחרוזת על-גבי הצג.
הפרמטר (המידע הנתון בסוגריים, אותו ברצונך להציג) חייב להשתייך לאחד מטיפוסי
הנתוניס הבאים:
* מתחרוטת מילולית:
;("1616) 116110")פוטק
. קבוע מחרוזת:
"6ז6ת) 116110 1355/00 6ם46681
()םוגות
|
((1055401/)פוטק
. |
₪ הערה . משתנה מחרוזשת:
זכור, ערך מילולי הוא ערך
מדויק המוקלד בתוך
"1066 8][='116110ת216611 081
הוראה של 6 או ++6, (מוות
במקוס שס של משתנה או |
של קבוע. ((8ת810001)פווק
]
כל טיפוס אחר של קבוע, משתנה או ערך מילולי יגרוס לשגיאת קומפילציה. מחרוזת
₪ הערה מילולית חייבת להיות נתונה במרכאות כפולות, בניגוד לשס של קבוע או של משתנה.
מכיוון שקומפיילר 206
אינו מוסיף את פקודת מרבית הקומפיילרים מבצעים פקודת שורה-חדשה אחרי הפונקציה (50וטק. פירוש הדבר
השורה-החדשה באופן שאחרי הצגת הנתונים, הסמן עובר לתחילתה של השורה הבאה.
ה ס זאת, קומפיילרים מסוימים, ובכלל זה גס קומפיילר השותפה 206 שבתקליטון המצור
את הקוד ח בהוראות ע / , 2 ם [ליטון המצורף
(ווק. אס אתה משתמש לספר זה, אינם מבצעים את פקודת השורה-החדשה באופן אוטומטי. בעבודה עס
בקומפיילר שמבצע פקודת קומפיילרים אלה, עליך להורות לסמן לעבור לשורה חדשה באמצעות קוד הבקרה ת. (דשן
שורה-חדשה באופן מפורט בנושא קודיס של בקרה - בהמשך הפרק). למרות שתכונה זו נראית אולי כחיסרון,
אוטומטי, באפשרותך היא עשויה להיות שימושית ביותר. אם אינך כולל פקודת שורה-חדשה אחרי הפונקציה
להשמיט את הקוד ח ()ונוק, ניתן להשתמש בכמה הוראות ()פווק כדי להציג נתונים בשורה אחת על המסך.
מהוראות ה-()פווק. השתמש בקוד הבקרה ח רק כשברצונך שהסמן ידלג לשורת המסך הבאה.
00 פרק 4: הפלט בשפות התכות ++00/0)
1 שנונקציה 0ז8חס)טס
הפונקציה ()ז9ת6וטוק מציגה על-גבי הצג ערך זג6 יתיד. הפרמטר חייב להשתייך לאחד
מטיפוסי הנתוניס הבאים:
* תו זגת0 מילולי:
;('11')ז וטק
* קבוע ז8ת0:
זי 11ד1א1 6מו4067
()תוגות
|
וק
* משתנה ז8ת0:
()חוגות
[
זו
3% = ז16))6
;(ז81)16000 סוט
ערכו של הפרמטר מוגבל לתו אחד בלבד. ההוראה
'111) וטק
תגרוס לשגיאת קומפילציה.
אם אתה מציג תו 6381 מילולי או קוד בקרה, יש להציבו בין גרשיים.
מרבית הקומפיילרים של 6 אינס מוסיפים פקודת שורה-חדשה אחרי הוראת ()ז6(8וגוק.
הסמן נשאר אחרי התו המוצג על המסך ואינו עובר באופן אוטומטי לשורה הבאה. כדי
לדלג לשורה הבאה, עליך להשתמש בקוד הבקרה גן, בו נדון בהמשך הפרק.
ביצול אישיות
במערכות מחשב מסוימות יש לכלול את קובץ הכותרת 5/4:0 כדי להשתמש בפונקציה
()זגת6וטק. במערכות אלה, הפונקציה ()זגווסווק נגרת מפונקציה אחרת, ()סונו. כפי
שתלמד בפרק 11, הפונקציה ()סווק משגרת את הפלט להתקן פלט מסוים, כגון כונן או
1
0 9
הקומפיילר שברשותך עשוי
לכלול את הפונקציה
()ט)נוק. פעולתה של
פונקציה זו זהה לפעולתה
של הפונקציה ()זגתט)טק.
הפונקציה ()זגתסונו 1 6
מדפסת. קובץ הכותרת 8/6100 מכיל את המידע הדרוש כדי להשתמש בפונקציה ()סוטק
לביצוע פעולתה של הפונקציה ()ז08)טק.
מכיוון שהפונקציה ()סוטק יכולה לשגר את הפלט לקובץ שעל-גבי הדיסק, ישימים לגביה
מספר כללים מיוחדים, וכללים אלה ישימים גס לפונקציה ()זגתסווק. ישנ קודיס
מסוימים שחייבים להיכתב בקוב, אך עשויים שלא להתאים לעמדת הזיכרון היחידה
השמורה עבור פריט ז8ת0. כדי שניתן יהיה להשתמש בקודים אלה, תוכננו מלכתחילת
הפונקציות ()ס)טוק ו-(זתסוט לשימוש בטיפוס הנתונים +חו. הקומפיילר ממיר את טיפוט
הנתונים ]תו לתו. לפיכך, בעבודה עס קומפיילרים התומכים בתקן 6 8%8א, באפשרותך
לכתוב תוכנית כך:
()תנגות
[
7 תו
3% = )161
((081)101101)טוק
)
למרות שהמשתנה ז16))0 מוכרז כמשתנה מטיפוס הנתוניס )תו, הוא מקבל תו בתור ערך
התחלתי. התוכנית תקומפל ותרוץ ללא כל בעיה.
מתכנתים אחדים נשארו נאמניס לתקן 888 ומשתמשים תמיד בפונקציה ()זגתסונוק עס
טיפוס הנתונים זחו. הברירה בידך.
2ודים שר בקרה
באפשרותך לשלוט על האופן בו נע הסמן על-גבי הצג ובכמה פעולות נוספות של המחשב,
על ידי יצירת פלט של קודיס מיוחדים, הנקראים רצפי פסק (65סתסנו50 650806). כל רצף
מתחיל בסימן הלוכסן ההפוך (), המזהה את התו הבא אחריו בתור תו פסק. התו המופיע
אחרי הלוכסן ההפוך מסמל את הפונקציה שברצונך להפעיל. כאשר הקומפיילר נתקל
בלוכסן ההפוך הוא אינו מציג את התו הבא אחריו, אלא מבצע את הפונקציה שאותו תו
מסמל.
יש להציב את רצפי הפסק במרכאות בתוך הפונקציה ()פוטק, או בין גרשיים בפונקציה
()ז8ת6)ונוק. הרצף מורכב אומנם משני תווים, אך 6 מתייחסת לרצף כאל תו יחיד בתוך
הוראת ()41ת0)טוק.
02 פרק 4: הפלט בשפות התכנות ++02/6)
קוד שורה-חדעוה (שחו!!-שוסח)
הרצף ת מבצע פקודת שורה-חדשה, כלומר - מעביר את הסמן לתחילתה של השורה
הבאה. השתמש בפקודה זו כדי לעבור לשורה הבאה אחרי ש-()זגת6וטק מציגה תו. אס
ההוראות שלך הן:
;('.')ז8סוטק
(('ת')ז וסוט
תוצג על המסך האות ג, והסמן יעבור לתחילתה של השורה הבאה. שיס לב שהקוד ם,
כמו כל ערך מילולי אחר בפונקציה ()41תסוטק, נתון בתוך גרשיים. מכיוון שהאות ם מופיעה
אחרי תו הלוכסן ההפוך, הקומפיילר מבצע את פקודת השורה-החדשה, במקום להציג את
האות ם על המסך.
בפקודת ()פווק ניתן לשלב את הקוד עס ערך מילולי בתוך אותן מרכאות. ההוראה
("ממ8150/ תתו1[1')פונוק
מציגה את השס ת60וג\ ותאו!|ו/ על המטך, ומציבה את הסמן בשורה הבאה. קוד
השורה-החדשה תייב להיות בתוך המרכאות של הפרמטר. אס הקומפיילר שברשותך מוסיף
קוד שורה-חדשה באופן אוטומטי אחרי הפונקציה ()פוט, הסמן ידלג שתי שורות למטה.
התהליך פועל כך:
41 השס תספוג/ ת8ו!11 מוצג על-גבי המסך.
2 הקוד ת מבצע פקודת שורה-חדשה ומעביר את הסמן לתחילתה של השורה
שאחרי השורה בה מופיע השם.
3 הפונקציה ()8טק מסתיימת. אס הקומפיילר שברשותך מוסיף פקודת שורה-חדשה
באופן אוטומטי, הסמן מדלג שורה אחת נוספת כלפי מטה,
אומנס בדרך-כלל נעשה שימוש בקוד ת בסופה של ההוראה, אולם אתה רשאי להציב את
הקוד בכל מקוס בתוך המרכאות של הפרמטר. הפקודה הבאה:
(("ת\ ")וטק
מציגה שלוש שורות מלל:
4
8
0
הקומפיילר מציג את האות 4, מבצע פקודת שורה-חדשה, מציג את האות 8, מבצע פקודת
שורה חדשה ומציג את האות 6. אס הקומפיילר שברשותך מוסיף פקודת שורה-חדשה
באופן אוטומטי, הסמן יופיע בתתילתה של השורה שאחרי השורה המכילה את האות 6.
קודים של בקרה 3(
תרשים 4.1
פלט המתקבל בעזרת
קודים של דילוג.
קוד דילוג (ס8דך)
הפקודה ) מעבירה את הסמן לנקודת הדילוג הקבועה-מראש הבאה על המסך. כדי
לראות כיצד פועל קוד הדילוג, השתמש בתוכנית הבאה:
()חוגות
|
(ה'2356789012345678921236567893123656789017305 ")ףונו
:("ם )11213)615") פוט
|
התוכנית מציגה שורה של מטפרים המיועדים לסייע לך למנות מיקוס של תוויס. לאחר מכן
היא מציגה את המספר 0 בקצהו השמאלי של המטך, ואת המספרים 1 עד 5 בחמש עמדות
הדילוג הבאות:
177878
5 4 3 2 1 0
באפשרותך להשתמש בקוד כדי ליצור עמודות של מלל או מספרים במרווחים שווים:
()ת1גתז
|
6 0896 1167 קתסן אוסם תפ וס 65ת6ו')פוט
(("מי6ות
("ם וס מ 6 18 ")ונוכ
(("מ5)'51.50/)52.45\156.24)\53.56!וגו
;("ח 03 685))1 5 0875\!5 10")פונוק
]
הפלט של תוכנית זו מוצג בתרשים 4.1. שים לב שהשתמשנו בשני קודים של דילוג ביץ כל
שתי עמודות, כדי לרווח את העמודות על פני המסך. שים גס לב שאין רווחים נוספים בין
קוד הדילוג לבין המלל הבא אחריו. כל רווח נוסף יופיע על המסך, והעמודות לא יהשו
מיושרות כהלכה.
:1 6פש0ס 6צהת צ6ת> צַתס1 שסת בת8 ,66268 ע61ת6 ,68ת16עק
סי צסתהא 2011 ת18[ג
2-6 1.24 12.5 122.00
צג3ף 1 8 15 8 5 8 10
4 פרק 4: הפלט בשפות התכנות ++6/0)
קוד חזט)36
הקוד ז מבצע פעולה של החזרת הסמן לתחילתה של אותה שורה, מבלי לעבור לשורה
הבאה. אס אתה מציג מלל כלשהו, מתזיר את הסמן לתחילת השורה ומציג דבר-מה נוסף,
המלל החדש משכתב את המלל הקודם.
תרשים 4.2 מדגים את ההבדל בין פעולת החזרת הסמן לתחילת השורה, לבין פקודת
שורה-חדשה. כאשר אתה משתמש במקלדת, הקשה על מקש ז6)חם או תזטו6 מבצעת את
הפעולה המכונה בשפת 6 פקודת שורה-חדשה. מתכנתים אחדים מכנים את הפעולה הזו
שילוב של החזרת הסמן והזנת שורה, או ,08/1. קוד תזט)6ז ז בשפת 6 אימו מעביר את
הסמן לשורה הבאה.
תרשים 4.2
ההבדל בין פקודת
החזרת הסמן לבין
ו 6ח+ 15 וס 0
, > -4. מיקוס הסמן
4-0 -
67 אחרי קוד שורה-חדשה
הנבי 2 -----------<--<<<<<| מיקום הסמן
אחרי קוד תזט)סע
את תוצאת השימוש בקוד ז ניתן לראות בהוראה הבאה:
ז16 ")ווק
על המסך תוצג המלה )8181 בלבד. הסיבה: אחרי שהקומפיילר הציג את המלה 160
החזיר קוד ז את הסמן לתחילת השורה. עתה הוצגה המלה 818% ונכתבה על-גבי המלה 1686.
תנועת הסמן אל עבר תחילת השורה כתוצאה משימוש בקוד ז אינה גורמת למחיקת המלל
המוצג על המסך. הצגת תווים אחרים לפני הזזה נוספת של הסמן, לעומת זאת, גורמת
למחיקת המלל הקיים.
קודים של בקרה 5
קוד 80%80806
בניגוד לקוד ז המחזיר את הסמן לתחילת השורה, קוד 88050806, ל, מחזיר את הסמן תו
אחד שמאלה. פעולה זו איגה הרסנית, כלומר - אעה גורמת למחיקת התו עליו עומד הסמן.
אס אתה משתמש בקוד 080%50806 או בקוד תזטוסז כדי להזיז את הסמן ואז נותן פקודת
שורה-חדשה, הסמן עובר לשורה הבאה מבלי להשפיע על המלל המוצג על-גבי המסך.
פקודת שורה-חדשה איגה מכניסה שורה ריקה חדשה (בניגוד לפעולתו של מקש זסומם
בתוכנית עיבוד תמלילים).
קוד הזנח עמוד (1660חזזס=)
כאשר אתה שולח פלט למדפסת (כפי שתלמד לעשות בהמשך), קוד הזנת עמוד () מקדם
את העמוד הנוכחי. קוד זה מוכר על ידי מרבית המדפסות.
אחרי הדפסת דו"ח, לדוגמה, מרבית המתכנתים נוהגים לכתוב קוד הזנת עמוד, כדי
להבטיח שהעמוד האחרון של הדו"ח יקודס במדפטת עד סופו. אם אתה מציג את הקוד
על-גבי המסך באמצעות ()פונוק או ()זגתסונוק, יופיע על המסך תו גרפי קטן, אולס התצוגה
אינה מושפעת מעבר לכך.
הצגת חווים מיוחדים
ניתן להשתמש בקודים של בקרה כדי ליצור פלט של מגוון תווים מיוחדים. מתכנתיס
משתמשים לעתים קרובות ברצפי פטק כדי להציג תוויס שלא ניתן להציגס בדרך אחרת:
קוד פעולה
| מציג גרש יחיד
ש מציג מרכאות
\ מציג לוכסן הפוך
לדוגמה, נניח שברצונך להציג את המלל הבא:
"הז58" ז6ת [681 6/
כולל המרכאות סביב השס 881. אם תכתוב את פקודת ()פונוק כך:
;(""ות88" ז6ת [681 6/ל")פ)טק
הקומפיילר יציג הודעת שגיאה. זכור, פרמטר של ()פווק חייב להתחיל ולהסתיים במרכאות,
כדי ש-6 תדע היכן מתחילה המחרוזת והיכן היא מסתיימת. בביטוי השגוי למעלה,
הקומפיילר יתרגם את הפרמטר בצורה הבאה: "זפת 0811 6/+'", ולאחר מכן התוויס הנוספים
"יי/א/5, המופיעים מחוץ למרכאות הסוגרות את הפרמטר, אך עדיין בתוך הסוגריים.
מבחינת הקומפיילר, השורה פשוט מכילה מידע רב מדי.
0606 פרק 4: הפלט בשפות התכנות ++>6/0
כדי להדפיס את המלל כהלכה, השתמש בהוראה הבאה:
;(""ת58' זסת 6311 6/)")פוטק
תרשיס 4.3 מראה כיצד מתרגם הקומפיילר את השורה הזו.
תרשים 4.3
יצירת פלט של תו
;("הח54" זפח [61 6")פזטכ המרכאות.
מציג את המחרוזת | | | | 2
ו ו 0 | זסת |וג6 6\")פזטק
מציג את תו המרכאות | | | | .
מציג את המחרוזת 581
מציג את תו המרכאות
מסיים את הפרמטר ואת
הפונקציה
בנוסף להדפטת מרכאות ולוכטן הפוך, ניתן להשתמש בקודים של בקרה לצורך הצגת מגוון
של תווים גרפיים. מחשבים אישיים של ]18% ותואמי 18% יכולים להציג טדרה של תוויס
הידועה בשם ערכת 26 (או 50611 מורחב), שכוללת את כל האותיות, המספרים וסימני
הפיסוק שניתן להקליד במקלדת, וכן גס כמה סימניס גרפיים מיוחדים ואותיות יווניות. כל
תו בסדרת ]4801 מיוצג על ידי מספר ייחודי. לדוגמה, המספר 3 מייצג את סימן הלב. כדי
להציג תו כלשהו מסדרת 48611, יש להציב את המספר המייצג אותו אחרי תו הלוכסן
ההפוך, בקוד בן שלוש ספרות, כך:
('003')ז8תס)וק
קודים של בקרה 07
הוראה זו מציגה את תו הלב. כדי להציג את כל ארבע הצורות הקיימות בחפיסת קלפים,
השתמש בתוכנית הבאה:
()תנגות
|
;("ת 03 5)"1169115)טוק
;("ם 04 65ת30ת218[")פ)טק
;("מ 05 5סט[0")פ)טק
;("ח 06 508065")פוטוק
]
הוראות (0פוטוק אלה מציגות את שם הצורה ואת התו הגרפי המתאים. (תרשים 4.4 מציג את
הפלט). טבלה 4.1 מראה תווים נוספים שניתן להציג בדרך זו, יחד עס מספרי קוד 45011
המתאימים.
תרשים 4.4
פלט של תווים גרפיים. 8
8מסמהוק
פמט
8
ניתן להשתמש גם בפונקציה ()ז8תטוטק כדי להציג סמלים גרפיים, על ידי ניצול הכפילות
המאפיינת את משתני התווים. אס אתה מכריז על משתנה מטיפוס מו, באפשרותך להקצות
לו ערך מספרי, כך:
)פטס ]ות
(5 = 0001
כעת, אם תשתמש במשתנה כפרמטר מטיפוס ז8ת6 בהוראת ()זגתסוטוּק, כך:
((1ת81)600 סוק
יוצג התו הגרפי שמספר זה מייצג.
8 6 פרק 4: הפלט בשפות התכנות ++0/6
טבלה 4.1
20000002 = קודים של יט
001 שימושיים.
002
03
044
005
006
206
207
200
204
22
200
סל
3% 9 + + ₪
ג
-
ש
<< מא מאה ₪ 2 0 5 ₪ ₪3 שש
6 % ₪ 00 כ ₪ + ש -
+
אחד הקודים בסדרת 18%1/?6 אינו מציג תו אלא משמיע צלצול פעמון! רצף הפסק 007
משמיע צלצול בפעמון הפנימי של המחשב. התוכנית הבאה, לדוגמה, מצלצלת בפעמון
פעמיים כדי למשוך את תשומת לבו של הצופה:
/ 6 ת6ז 0) 695167 18 1 1*/ | '007 ,11 6ת061
/*007 תגו[! */ ()תוגות
|
/* [[6ט 6ת) 806 */ = 12 01)זהתסווק
/* סט 16 6ת80 */ = 1 1 ם)זהחסונוק
;("ם!5ז6קק 5110 תסוות6ו1 ")ווק
(ח"200605 קחוזזסק5 ת! 5816 8 עוסת 15 616מך")פונוק
]
קודים של בקרה סְ 6
ההנחיה 8066/86 מכריזה על קבוע ששמו ,881.1 וערכו 007. הערך מורכב אומנס מארבע
הקשות במקלדת, אך הקומפיילר מקבל אותו כקבוע בן תו אחד מטיפוס ז628. הפעמון
יצלצל בכל פעם שתיצור פלט של הקבוע ,81.1 בהוראת ()ז8תסוטק.
1
יצירת תווים מיוחדים
| אם מפעמת בך רוח הרפתקנית, להלן מידע נוסף בנוגע לתווים
+ מיוחדים. בספרי הדרכה רבים לשימוש במחשבים ובמדפסות
תוכל למצוא טבלה מלאה של סדרת הקודים 6ק/ופו (וו250
מורחב). הקודים מוצגים, בדרך-כלל, במופע עשרוני (בסיס 10)
ובמופע הקסדצימלי (בסיס 16). ישנם אומנם קומפיילרים של 6
שתומכים בקודים בתצורה זו, אולם תקן 0 688 המקורי ו-0 ₪5
משתמשים בשיטת המספרים האוקטלית (בסיס 8). כדי לשמור
על תאימות עם מרבית הקומפיילרים של 6, השתמש בשיטה
האוקטלית (כפי שמודגם בטבלה 4.1).
סדרת הקודים 8/26! כוללת את כל התווים והסמלים שניתן להציג
על המסך, ולא רק את התווים שניתן להקליד ישירות במקלדת.
בספרים מסוימים אתה עשוי למצוא טבלה המציגה תת-סדרה של
סדרת 06/וו8!, הנקראת סדרת !4501. תת-סדרה זו כוללת קודים
עד למספר 127 (בשיטה עשרונית), כלומר-רק התווים ותנועות
הסמן (כמו 90%80806 ו-0פ!) שניתן להקליד ישירות במקלדת.
0% 8 55 ₪48 אד | ₪ תו הי םעמ יש 2-ה ל "ןש מ ש 5 היהש בא ₪ :₪15 ₪08 הרידה 8 ₪ הק .חש
ךפנונקציה הרב-צדדית (!)חוזסן
הפונקציות ()פוטק ו-()זגתסוטק הן אומנס פונקציות שימושיות למדי, אך יש להן מספר
מגבלות. הן אינן יכולות ליצור פלט של נתונים מספריים, וכל אחת מהן יכולה להציג רק
ארגומנט או פרמטר אחד. גס ()19טק וגם ()41ת6וטק יכולות להציג דבר אחד בלבד.
שפת התכנות 6 ושפת ++6 כוללות פונקציה רב-צדדית יותר הנקראת ()!ותוזק. הפונקציה
()ו)תוזק יכולה להציג נתונים המשתייכים לכל טיפוסי הנתונים, וכן לפעול עם מספר ארגומנטים
בפרמטר אחך. בנוסף, ()!ותוזק יכולה לקבוע את התצורה או הפורמט של הצגת הנתונים.
ברמה הפשוטה ביותר, ניתן להשתמש בפונקציה ())ותוזק במקוס בפונקציה ()פטק ליצירת
פלט של מחרוזת:
"116[[0* 1555/05 6הו4061
()תנגות
ן
(1855400/])!ותוזק
ונס 61 שוסת ,6]זסש ענת 10 6מתסס[0/6 *)])תוזק
0 7 פרק 4: הפלט בשפות התכטת ++2/0)
בדומה לפונקציה ()צוטק, הפונקציה ()!)פוזק תציג ערכי מחרוזת מילוליים הנתוניס
במרכאות, וכן את הערכיס של קבועי מחרוזת ומשתני מחרוזת.
הצגת מסברים
כדי ליצור פלט של נתוניס מספריים ולקבוע את הפורמט של כל טיפוסי הנתונים, עליך
לחלק את הפרמטר של הפונקציה ()!ותוזק לשני החלקים המוצגים בתרשים 4.5.
תרשים 4.5
רשימת נתוניס מחרוזת בקרה שני החלקים של
פרמטר הפונקציה
(10)תוזק.
החלק הראשון נקרא מחרוזת בקרה או מחרוזת פורמט. מחרוזת הבקרה, הנתונה במרכאות,
מורה לקומפיילר היכן ברצונך להציב את הנתונים בשורה המוצגת. חלק זה של הפרמטר
כולל את המלל שברצונך להציג, יחד עם מצייני מיקום הנקראים מצייני פורמט, המסמנים
את הטיפוס ואת המיקוס של הנתוניס.
כל מציין מתחיל בתו האחוזים (%) ולאחריו מופיעה אות המסמנת את טיפוס הנתונים:
90 מציג מספר שלס
ג מציג מספר שלם בלתי-מסומן
% מציג מספר עשרוני, מטיפוס ]1103 או 606
6 מציג מספר בכתיב מדעי
9% מציג מספר עשרוני בכתיב עשרוני או בכתיב מדעי, הקצר מביניהס
90 מציג תו מטיפוס זגת0
98 מציג מחרוזת
לפיכך, חלקה הראשון של הוראת ()!ותוזק עשוי להיראות כך:
")ווק
תו האחוזים מורה לקומפיילר שהתו הבא יהיה מציין הפורמט. (כדי להציג את תו האחוזיס
עצמו, יש לכתוב את התו פעמיים, כך: ("%9"))תוזק). התו הבא, 6, מורה לקומפיילר להציג
ערך.של מספר שלם, בפורמט עשרוני (בסיס עשר) (ראה תרשיס 4.6).
הפונקציה הרב-צדדית (]מנזק 1 7
תרשים 4.6
חלקיו של מציין פורמט.
מסמן ערך מטיפוס )חו מסמן את
(בסיס עשר) מצייץ הפורמט
חלקו השני של הפרמטר נקרא רשימת נתונים, ומכיל את הערכים, הקבועים או המשתנים
שברצונך להציג. יש להפריד בין רשימת הנתונים לבין מחרוזת הבקרה באמצעות פסיק, וכן
להפריד בין פריטי הנתונים באמצעות פסיקים. כאשר הקומפיילר יוצר את קוד העצמים,
הוא מציב את הנתוניס שברשימה במקוס מצייני המיקום.
הוראת ()])תוזק מלאה, אם כי פשוטה מאד, גראית כך:
((12 ,'%0")])תוזק
כשהוראות אלה יבוצעו, הערך 12 *וחדר במיקוס של מציין הפורמט %6 (ראה תרשים 4.7).
בדוגמה זו, הפקודה ()!)תוזק מעבירה למעשה שני פרמטרים לפונקצית הספרייה - מחרוזת
הבקרה וערך מילולי אחד, המספר 12.
תרשים 4.7
הערך מחליף את מציין
הפורמט. רשימת נתוניס מחרוזת בקרה
,(82 ,'60")חחוזס
הצג את הערך הזה
-
שר
:(12 ,")וז
2 / פרק 4: הפלט בשפות התכנות ++6/0
מחרוזת הבקרה יכולה להכיל גם מלל יחד עס מציין הפורמט, לצורך הצגת נתוניס.
כדוגמה, עיין בשורה הבאה:
;(12 ,"010 5ז68ץ %0 מזג [')]!תוזק
מחרוזת הבקרה כאן היא
"010 6:5 40 תה [
מציין הפורמט, %6, מראה שברצונך להציג מספר בין המלים וג 1 לבין 016 פז6ץ. (ראה
תרשים 4.8). הקומפיילר מציב את המספר 12 במקוס מציין הפורמט, כדי ליצור את הפלט:
6 זל 12 הזג 1
תרשים 4.8
רשימת נתונים מחרוזת בקרה שימוש במציין פורמטטי
/ / בתוך מלל.
(12 ,"0/0 6815 %0 ותה [")זהוזק
(2ף ,"00 9815 %0 וג |")ותוזס
0 6815 12 וחג |
הוראה זו מעבירה לפונקציה הן מחרוזת מילולית והן ערך מספרי.
כמובן שניתן להשיג את התוצאה הזו על ידי הצגת השורה כולה כמחרוזת מילולית, בעזרת
אחת מההוראות הבאות:
;("010 6818 12 תג ["))ותוזק
"010 6815 12 וחג [")פוטק
אולס כדי לשלב מלל עם קבוע או משתנה, עליך להשתמש בפונקציה ())ומוזק ובמציין
פורמט, כמו בתוכנית הבאה:
הפונקציה הרב-צדדית ()חוזם 3 /
()תוהות
|
6 ות
386 = 2
;(386 ,"010 6318 %0 גת3 [")1)מוזק
]
במקרה זה, התוכנית מציגה מחרוזת מילולית ומשתנה מטיפוס ]תו בהוראה אחת (כמודגם
בתרשים 4.9).
תרשים 4.9
הערך של המשתנה מחליף
את מציין הפורמט.
,(806 ,"010 0815 %0 וחג |")חחוזס
0 8 12 וג |
ניתן להעביר כל מספר רצוי של פרמטרים כדי להציג ארגומנטים מרובים, אולם יש לכלול
מציין פורמט עבור כל ארגומנט. הערכים ברשימת הנתוניס חייבים להופיע בסדר זהה
לסדר הופעת המציינים המתאימים להם. הפריט הראשון ברשימה מחליף את מציין
הפורמט הראשון, הפריט השני מחליף את המציין השני, וכך הלאה. עיין בתוכנית הבאה:
()םוגמת
|
2 )סט ,1 עסנו[ )תג
2 = 1 שסטן
2 = 2 שאסטן
(2 עאסט] ,2 ץאסט| ,'%0 תג %0 6זה פזססותטת ע%סט1 ץןאי)])תוזק
4 7 פרק 4: הפלט בשפות התכנות ++0/6
התוכנית מכריזה על שני משתנים מטיפוס זח1, המשתנים 1 ץאסט! ו-2 ץאסגו!, ומקצה להם
ערכים התחלתיים. רשימת הנתונים בהוראת ה-()!)חוזק מכילה שני משתנים (ארגומנטיס)
אותס יש להציג, ולכן חייבת מחרוזת הבקרה לכלול שני מצייני פורמט. מכיוון ששני
המשתנים הם מטיפוס )פו, חייבים שני מצייני הפורמט להיות 46, כמודגס בתרשים 4.10.
תרשים 4.10
רשימת נתונים מחרוזת בקרה שימוש בשני מצייני
7 / ל
((2 עסט ,1 עאסט! ,"%0 0ח3 %0 6ז8 פזססוחוטח עאסטו עוא") הס
;(2 עאסט! ,1 עאסט! ,"%0 0חג %6 376 פזססרחטח עאסטו עו" ההוז
,
,
הקומפיילר מציב את הערכים של המשתנים במקום מצייני הפורמט, כדי להציג את הפלט הבא:
1 6חג 12 316 פזסטותנות עָאסט1 עו
ערכו של המשתנה 1 עא00%], הפריט הראשון ברשימת הנתונים, מוצג במיקום של המציין
הראשון. הערך של המשתנה 2 ץאסט!, הפריט השני, מוצג במיקוס של המציין השני. אס
סדר הפריטים היה הפוך:
(1 שסט1 ,2 ץאסט] ,"40 6תג %60 316 פזסטחזנות עאסט[ ץוא')!ותוזק
היו הערכיס מוצגיס בסדר הבא:
2 36 21 816 פזססחתום עאסטן עו
טיפוס הנתונים צריך להתאיס לטיפוס הנתונים עליו מצביע מציין הפורמט. לדוגמה,
התוכנית הבאה מציגה משתנה מטיפוס ₪081 ומשתנה מטיפוס )תו בפונקציה ()]ותוזק אחת:
()תופות
|
;תס זה
;)תנוסוחג 1081
5 = )תטס00
% = ותטסוחג
()תנוסס ,תטסוחה ,"5וח116 %6 ז0] ]% 15 0056 6מ'ד")1)תוזק
]
הפונקציה הרב-צדדית ())מוזק 5 7
ערכו של הפריט הראשון ברשימת הנתונים, מטיפוס )803, מוחדר במיקוס של המציין
הראשון, 41. ערכו של הפריט השני, מטיפוס !ת1, מוחדר במיקוס של המציין השני, 86.
התוכנית מקומפלת ורצה ללא שגיאות מכיוון שטיפוסי הנתונים מתאימים, כמודגם
בתרשים 4.11.
תרשים 4.11
טיפוס הנתוניס חייב 1
להתאים למציין הפורמט. ()חו8 רת
|
00% זחו
)חטסוחג | 1088
5 = 00001
= 80
00 ,הט0סרח8 ,"185 %6 זס1 %1 5 6051 פחד")וחוזם
% ע
( 0 8000 ,"65| 66 זס 61 15 005% שתד")זוחוזס
, 0
4
תב
ערך 1081 מחליף את המציין /8, וערך תו מחליף את המציין 46. הפלט הוא:
65 5 ז0] 45.580000 15 005 6מיך
(מספר האפסים תלוי בקומפיילר שברשותך. בהמשך תלמד מדוע הס מופיעים). לעומת
זאת, אס הוראת ())חוזק היתה נכתבת כך:
()חנוסותג ,תנוסס ,'38ת110 %4 זס] 91 15 0051 6ת'ד")!)והוזק
ייתכן שהקומפיילר לא יזהה שגיאה, אולס הפלט יהיה חסר משמעות, כמו בביטוי הבא:
65 16456 זס] 2.002149₪37- 18 6086 6גיך
טיפוסי הנתוניס המספרייס אינסם מתאימים למצייני הפורמט. ניתן להציג מספר ארגומנטיס
מטיפוסים שוניס בתוך פרמטר אחד, רק כאשר טיפוסי הנתונים מתאימים למצייני הפורמט.
הזנה שורה (860= 6ח1 !)
הפונקציה ()פוזק אינה מוסיפה פקודת שורה-חדשה באופן אוטומטי אחרי הצגת נתונים.
לאחר שהפרמטר מוצג, הסמן נשאר באותה השורה אחרי התו האחרון.
6 / פרק 4: הפלט בשפות התכנות ++0/06
אס ברצונך שהסמן יעבור לשורה הבאה, עליך לכלול את קוד הבקרה ח בתוך מחרוזת
הפורמט, כך:
00 )תנוסרת8 ,"ת15ת116 6 זס 34 18 6081 6ם'1)"1!תוזק
הצב את הקוד מ במקוס בו אתה רוצה שתתחיל שורה חדשה (לא בהכרח בסוף). ההוראה
(1תט00 ,)טסרה ,"ת15ת110 6 זס]ח%1 18 0051 106")!)מוזק
מציגה שתי שורות:
0 15 )005 7716
10 5
באפשרותך להשתמש בקודים אחרים של בקרה כדי לשלוט במספר הרווחים בשורה,
לצלצל בפעמון או להציג תווים מיוחדים.
המרת טיבוםי נתונים
קיימים שני מצייני פורמט נוספיס, הממירים מספר שלם למקבילה שלו בכתיב אוקטלי או
הקסדצימלי:
0 ממיר ערך לשיטה אוקטלית (השתמש באות 0 קטנה, לא בספרה 0).
א% ממיר ערך לשיטה הקסדצימלית.
כדי להמיר ערך כלשהו משיטה עשרונית לפורמט אחר, השתמש במצייני הפורמט %0 או א%
במחרוזת הבקרה, ובמספר העשרוני ברשימת הנתונים. התוכנית הבאה, לדוגמה, מדפיסה
את המקבילות של המספר העשרוני 7 בכתיב הקסדצימלי ובכתיב אוקטלי:
()תופות
|
;(17,17,17 ,"ת/00131 תג %0 0ם א6ם תו א% 15 %0")]!חוזק
הפלט יהיה
וח 21 36 אשת מ 11 15 17
זכור שאתה זקוק למספר האוקטלי כדי להדפיס תווים וסמלים גרפיים. אם ידוע לך
המספר העשרונל של התו שברצונך להדפיס, השתמש בתוכנית כמו זו כדי להמיר אותו
לאוקטלי.
הפונקציה הרב-צדדית (]1!מוזק / 7
8
תווים בעלי פיצול אישיות
כפי שלמדת בפרק העוסק בפונקציה ()זגתסוגוק, ניתן להכריז על משתנים מטיפוס זגת0 גם
כמשתייכים לטיפוס זמו. כלומר, ניתן לייחס אות ל-1מו ולהציג אותה באמצעות ()זגתסונוק
או ()1ותוזק, כדלקמן:
()תנ גו
|
4 ותו
%'=3
((041)8וטק
('ם')ז וטק
;(40"8")]ותוזק
]
כשתריץ תוכנית זו, האות .4 תופיע פעמיים. היא מוצגת כתו תוך שימוש ב-()ז103טק, וכתו
תוך שימוש במציין %6 ב-()))תוזק. אולס בין אם אתה מכריז על התו כמשתייך לטיפוס
זגווס או לטיפוס ]חו, באפשרותך להשתמש במציין %6 כדי להמיר את התו לקוד ה-5611
שלו:
()חוגות
[
זו
'/'=3
;(4,3,'ה%0 18 06 01 6066 456211 6ת1")])תוזק
במקרה זה, אותו משתנה מוצג באמצעות המציינים 86 ו-%6. הפלט הוא:
5 5 4 01 0006 45011 6מיך
הוא מציג את התו 4 תוך שימוש במציין %6 ואת המספר 65 - קוד ]4861 של האות -
באמצעות המציין 40.
התוכנית היתה רצה בהצלחה ומציגה בדיוק אותו פלט גס אם המשתנה 8 היה מוכרז
כטיפוס ]ת1.
קביעת תצורת הבל
ניתן להשתמש בפונקציה ())וחוזץ גם לצורך קביעת התצורה של הנתונים המוצגים.
באפשרותך לשלוט בריווח השורה ובמספר התווים המוצגיט בעזרת מצייני רוחב-שדה,
פרק 4: הפלט בשפות התכנות ++6/6
ללא מציין רוחב, מספרים מטיפוס 8081, לדוגמה, יוצגו עס שש ספרות אחרי הנקודה
העשרונית. זו הסיבה שההוראה
;(תט00 ,)תנוסות8 ,"5ות6ו1 %0 זז ]א 15 6054 6 1")]!ותוזק
תציג את הפלטט
פות1!6 5 ז0] 45.580000 18 6081 6תיך
בהתאס למערכת המחשב שברשותך, ובהתאם לאופן חישוב הערך, הפלט עשוי גם להיראות
כך:
פוחס)ן 5 101 45.579998 18 0084 6גיך
אנו עושיס שימוש במצייני רוחב-שדה כדי להתאים את אופן הצגת המלל והמספרים
לצרכינו.
כדי לציין את מספר הספרות העשרוניות, השתמש בפורמט
+]
כאשר ם הוא מספר הספרות העשרוניות הרצוי (ראה תרשים 4.12). לדוגמה,
()תטסותה ,5.21% 15 6051 6ת'ך")])מוזק
תרשים 4.12
מספר מטיפוס )08 ציון מספר הספרות
אחרי הנקודה
| העשרונית.
|(21",45.58. %") חוז
] %
2 ספרות עשרוניות מסמן את מציין הפורמט
תציג את הסכום מטיפוס 1031 עס שתי ספרות בלבד אחרי הנקודה העשרונית:
8 58 6051 שג"
באופן דומה, ההוראה
;(זתטסח3 ,5.30% 15 6051 6ם'1')))תוזק
תציג את הסכום עס שלוש ספרות אחרי הנקודה:
0 1 ]6051 6ת
הפונקציה הרב-צדדית (!חזזק 0 7
תרשים 4.13 מסכס את אופן השליטה במספר הספרות העשרוניות.
תרשים 4.13
שליטה במספר הספרות
העשרוניות. ,(%1",45.58")חוזס
5.0
(21',45.58. %")11חו]
) 1 חם
88
(31",45.58. %")11ח1]
) יש ו
0
(01",45.58. %") וז
) 5% )וז
45
באפשרותך לשלוט גם על הרוחב הכללי של השדה - מספר המקומות שתופש הערך כולו -
בעזרת הפורמט:
]הא
כאשר א הוא רוחבו הכולל של השדה. לדוגמה,
;(ותנוסתזה ,'%8.21 15 0054 6ת1'")])תוזק
תציג את הפלט:
8 5 )005 706
עס שלושה רוותים (וספים לפני המספר. כדי להבין זאת, דמיין לעצמך את מציין
רוחב-השדה מורה לקומפיילר להדפיס את הערך בתיבה שרוחבה שמונה מקומות, כמוצג
בתרשים 4.16. המספר עצמו, 45.58, תופש חמישה מקומות - מכיוון שהנקודה העשרונית
נחשבת כתו לכל דבר. המקוס שאינו בשימוש מופיע כרווחים לפני המספר.
גם אם תציין רוחב שדה קטן מרוחב המספר עצמו, 6 תציג את המספר כולו. במקוס
למחוק תווים מהמספר, 6 מתעלמת מרוחב השדה שציינת. הפקודה
((1ת0ת3 ,"52.21 15 005 6ם'1"))ותוזק
תציג את הפלט
0 8 פרק 4: הפלט בשפות התכות ++02/6)
תרשים 4.14
מציין רוחב-שדה שולט
בריווח על-גבי המסך.
עם מציין
רוחב השדה
רוחב השדה
8 5 )003 6ג'"
באפשרותך גס להוסיף את המקומות הנוספים, אולם למלא אותם באפטים במקוס
ברווחים, כמודגס בתרשים 4.15. עליך רק לרשוס 0 לפני המספר המציין את הרוחב:
((תנוסוחג ,"508.21 15 608 116")))תוזק
ההוראה תיצור את הפלט:
המטפר.
-(1)"08.21",45.58)חוזם ₪
|| |
8 15 ]608 6ח'
כדי ליישר מספרים לשמאל - להציב אותס בצידה השמאלי של אותה תיבה דמיונית -
הצב סימן מינוס אחרי ה-8, כך: 8-8.21. הרווחים הנוספים יופיעו מימין לערך:
;()חטסוחה ,"קסתסזזטס 125 ם! 8.21-% 15 6051 6ת'ד'")!זמוזק
תציג
הפונקציה הרב-צדדית ())חזזק 1 8
תרשים 4.16
יישור תוויס לשמאל על
המטך.
תרשים 4.17
שימוש במציין רותחב-שדה
עס מחרוזת.
ץסמסזטס 15 ם! 45.58 15 6051 6מ
כפי שניתן לראות בתרשים 4.16, הערך 45.58 עדיין מוצג בתוך תיבה דמיונית בת ארבע
עמדות, אולס הפעס הוא מופיע בצידה השמאלי של התיבה. הרווחיס הנוספים מופיעים
:(8.21',45.58-%")11חוזם
ל
מימין לערך.
מצייני רוחב-שדה פועלים גם עם מחרוזות ונתונים תוויים. רווחים נוספים יופיעו לפני
המלל, כשהם דוחקים את המלל לצידה הימני של התיבה הדמיונית. לדוגמה, אס משתנה
המחרוזת ששמו 1655486 מכיל את הערך "ס!1161', הפקודה:
(1055880 ,"0ז6ת) 575 58 10 081166 ופגון 1")!)מגזק
תציג את הפלט
6 1160 53 10 081106 ופט 1
"100" ,"10076 %5") זוז
2 8 פרק 4: הפלט בשפות התכנות ++0/6)
כפי שמודגם בתרשים 4.17, שני רוותים נוספים מוחדרים לפני ערך המחרוזת.
בחירת נקודת הנל הנכונה
כאשר אתה מתכנן את הפלט, עליך לשקול ולהחליט איזו פקודת פלט או פונקצית פלט
מתאימה ביותר לצרכיך.
כדי להציג מלל או תוויס בלבד, השתמש בפונקציות ()פוטק או ()ז8תסוגוק. מכיוון שפונקציות
אלה אינן משפיעות על התצורה הן פועלות מהר יותר, והקוד שלהן תופש פחות מקום בכונן
מאשר הקוד הנוצר על ידי ())זםגזק. בעבודה עם (0פוגוק, בדוק תחילה אס הקומפיילר
שברשותך מוסיף פקודת שורה-חדשה באופן אוטומטי. אם הקומפיילר אעו מוסיף את
הפקודה, ואתה שוכח לעשות זאת, יהיה עליך להשקיע זמן נוסף בעריכת התוכנית. השמטת
ה בעבודה עם ())ותוזק היא שגיאה נפוצה מאוד.
הפונקציה ()!)ת!זץ איטית יותר ותופשת מקוס רב יותר בכונן. אולס זוהי הפונקציה
האידיאלית כאשר ברצונך ליצור פלט של ערכים מספריים, לקבוע את הפורמט של מחרוזת,
או לשלב מלל ומספרים באותה שורה. עליך רק להקליד את השורה בקפידה, ולהתאים את
תרשים 4.18
כללים לשימוש
אל תשכח את תו התחל את מחרוזת בפונקציה ()!)תוזק.
המרכאות הטסוגר הבקרה בתו מרכאות
4
תו זה אינו שייך
למחרוזת הבקרה
תו הנקודה-פטיק = , :(12 90% 15ת1 ע%015018)!חוזם
יש להציב פסיק אחרי | טיפוס הנתוניס של הערך
מחרוזת הבקרה חייב להתאים לטיפוט
הנתונים של המציין
מצייני הפורמט. לערכים המילוליים, לקבועים ולמשתנים ברשימת הנתוניס. בתרשים 4.18
מודגמיס הכללים החשובים ביותר עבור הוראות ()!)חוזק.
ל בעונת התכנות ++6
ניתן ליישס את כל טכניקות יצירת הפלט בהן דנו עד כה הן ב-6 והן בשפת ++6. עם זאת,
++6 כוללת דרך נוספת ליצירת פלט של כל טיפוסי הנתוניס.
בחירת פקודת הפלט הנכונה 3
ההוראה 1טסס בשפת ++6 מציגה נתוניס על-גבי הצג. בשילוב עם התווים >>, הנקראיס
אופרטור החדרה, וסט יכולה להציג הן ערכים מילוליים והן ערכים של קבועים ומשתנים
ללא צורך במצייני פורמט.
אס ברשותך קומפיילר ++6, בדוק את התיעוד הנלווה. ייתכן שעליך להשתמש בקובצ
כותרת מיוחד כדי להפעיל את הפקודה 1ט60 ואת הפקודה חו6, עליה תלמד בפרק הבא.
בקומפיילרים מסוימיס, לדוגמה, יש לציין את הקובץ ששמו ג.וז09ז/105 בפקודת 06ט1סםו%
בתחילת התוכנית. בפרק ? תמצא מידע נוסף אודות הפקודה 01006מ41 והשימוש בקובצי
כותרת.
המבנה הבסיסי של וטסס מודגם בתרשים 4.19. אחרי הפקודה וסט מופיעים שני התווים
>>. תוויס אלה מורים ל-זטסט להציג את המידע הבא אחריהם. המידע יכול להיות ערך
מילולי הנתון במרכאות, או שמו של משתנה או קבוע.
תרשים 4.19
הפקודה 0081 בשפת ++6.
רשימת נתונים אופרטור פקודת הפלט
לפלט החדרה ית
0
0 >>
הפלט הוא המחרוזת
שנתונה במרכאות
600% >> "1.11073| 51
הפלט הוא הערך
של הקבוע
0001 >> 005 6
הפלט הוא הערך
של המשתנה
ות 18016 >> 0001
לדוגמה, ההוראה
"זו 1 100% נוסץ ,366 .581 15 סחזגת לת ,111" >> ]60
4 8 פרק 4: הפלט בשפות התכנות ++6/6
מציגה את המחרוזת המילולית הנתונה במרכאות. ההוראות
;)60 ותו
= )תטסס
00 >> 0041
מציגות את המספר 4509, ערכו של המשתנה ששמו )תט60.
כדי להציג מספר ארגומנטים, יש להפריד ביניהס באמצעות אופרטור החדרה, כמודגם
בתרשיס 4.20. לדוגמה, ההוראות
6 זתו
3 = 386
"010 6915 " >> 486 >> * 816 וס" >> 00₪1
מציגות את המלל
6 6918 43 316 גוס
. תרשים 4.20
רשימת הנתוניס פקודת הפלט הצגת מספר
לפלט 0% ארגומנטיס באמצעות
]0
,ו >> 62 >> 61 >> +60
ח' >> 6 הגח >> "15 6הזג)!" >> 6001
הפקודה )00 מציגה כל אחד מהפריטים כפי שהוא מסומן על ידי אופרטור ההחדרה,
בהתאם לסדר הופעתם בהוראה.
הפלט בשפת התכנות ++6 5
6 פרק 4:
בדומה ל-()]!חוזק, הפקודה 60 אינה מוסיפה פקודת שורה-חדשה באופן אוטומטי לאחר
הצגת הנתונים. כדי לעבור לשורה הבאה, יש להוסיף את הקוד ח במקוס בו אתה רוצה
שתתחיל השורה, כמודגס בתרשיס 4.20.
בעבודה עם ]60 אין צורך במצייני פורמט, אם כי ניתן להשתמש בהם. לצורך שליטה
ברוחב, בריווח ובמספר הספרות העשרוניות בעבודה עם מצייני פורמט, ניתן להשתמש
בפונקציה וחזס). אופן השימוש בפונקציה ותזס] בשפת ++6 חורג מהנושאיס בהם עוסק
ספר זה. אם ברשותך קומפיילר ++6, בדוק את התיעוד הגלווה כדי ללמוד נושא זה ביתר
פירוט. כמו כן, עיין בתיעוד כדי לדעת אס עליך לכלול קובץ כותרת מיוחד כדי להשתמש
ב-6001.
העמסת-יתר (פחוסוזפטס) בשפת ++6
תכונה מיוחדת של ++6 הנקראת העמסת-יתר עושה את מצייני
הפורמט למיותרים. בניגוד ל-()אחוזם, הדורשת ציון מפורש של
פורמט הנתונים המועבר לפונקציה, זטסס יכולה לקבוע זאת
בעצמה, בהתבסט על טיפוס הנתונים שהיא מקבלת. תהליך זה
נקרא העמסת-יתר.
שיש 187 יש בדה( טפ הש 6-74 שש רא אש הר למ יחל
(1 יצוב התוכניח
הפלט - כל מה שאתה משגר למסך, למדפסת וכדומה - מהווה חלק חיוני בכל תוכנית,
ולכן יש לתכנן כל פלט בקפידה.
התחל את התוכנית בהוראות פלט המסבירות את מטרת התוכנית:
;("חז281018)0) 386ק!זס! 116 0] 6מזסס[6/ ')פונוק
("ח.5)תסות עבק 8886)זסות 031018165 ותהזקסזק 15ג'1")פוטק
;(" 103 6ק4ק!זסות 16! ]0 )תטסות8 116 ז16ת6 [11או וס')פוגוק
;("ח.ת108 16 01 פזב6ץ 01 זססותטת 116 80 916 05ז16ת1 6תו")פונוק
בפרק הבא תלמד אודות הקלט - הזנת נתונים לתוך התוכנית מהמקלדת. אך לפני בקשת
נתוניס עליך לומר למשתמש, אפילו אס המשתמש הוא אתה עצמך, מה בדיוק עליו
להקליד. השתמש בשורת פלט עבור כל פריט קלט:
;("-ה109 386ק1זסות 186 01 )תוסחה 116 ז16ת6 216856")פונוק
כאשר התוצאות מוכנות להצגה, עשה את התצוגה נוחה לקריאה וברורה:
(סתוזק ,"ח87.2 :ותסותץגק 6!קוסמוזק ע1מותסי)!תנזק
;(161631ת1 ,"ח%7.21 :תותכ 167051ת1])"1תוזק
;(10181 ,'ח%7.2 :)תסו עבק ע1וחסו [1018")]!מוזק
הפלט בשפות התכנות ++6/0
הרווחים הנוספים בין תווי הנקודתיים לבין מצייני הפורמט, היישור של מצייני הפורמט
והמצייניס עצמם, כל אלה גורמים ליישור הערכים המספרייס בתצוגה, כך:
5" :)תסו ץק 16קוסתוזק ע1ם!תסואן
12 :)תסות ץק 1167651
217 :)ועבק ץ1ת!תסתת [7018
צורת תצוגה זו עדיפה ללא ספק על ההוראה:
המציגה את הפלט כך:
([1019 ת6ות1 ,סמוזק ,"87 ]8 %1")]זמוזק
256.05 9.15 7
את צורת המחשבה הזו יש ליישם לכל פן של התוכנית. הדבר גוזל מעט יותר זמן, אולס
התוצאות מצדיקות זאת. התוכנית תיראה מקצועית *ותר, ותשרת טוב יותר את
המשתמשים.
ונקצוהוא טפוס
שמלתשמפתח נתונים
טיפוס מחרוזת
()פונום
בלבד
()זהו[סונוק תוויס בודדים
טבלה 4.2 מסכמת את שיטות יצירת הפלט שנדונו בפרק זה.
₪העהות
טבלה 4.2
סיכוס פקודות פלט
שפת ?6 ושפת ++.6. משמשת
ליצירת פלט של מחרוזות בלבד.
ניתן להציג ערכים מילוליים
הנתוניס במרכאות, משתנים
וקבועים. עשויה להעביר את הסמן
לשורה הבאה באופן אוטומטי,
אחרי הצגת הנתונים (אולס יש
לבדוק את התיעוד הנלווה
לקומפיילר).
שפת 6 ושפת ++6. משמשת
ליצירת פלט של תו המוכרז כשייך
לטיפוס הנתונים +ם1 או לטיפוס
זגון[6. אינה מעבירה את הסמן
לשורה הבאה באופן אוטומטי אחרי
הצגת הנתונים (אולם יש לבדוק את
התיעוד הנלווה לקומפיילר).
השתמש בפונקציה זו להצגת תו
מילולי הנתון בין גרשיים, קבוע או
משתנה מטיפוס זג 6, קוד בקרה
או תו מיוחד.
עיצוב התוכנית 7
טבלה 4.2
סיכוס פקודות פלט (המשך)
מלתמפתה
()1)חויזת כל טיפוסי
הנתוניס
]0 כל טיפוסי
הנתוניס
(11אלוה
1. מהו פלטו
שפת 2) ושפת ++:). יש לכלול מציין
פורמט עבור כל פריט נתונים
שברצונך להציג. ניתן להשתמש
בפונקציה זו ליצירת פלט של מספר
ארגומנטיס בהוראה אחת. אינה
מעבירה את הסמן לשורה הבאה
באופן אוטומטי - יש להשתמש
לשם כך בקוד ם.
משמשת בשפת ++0) בלבד. יש
להפריד בין הארגומנטים באמצעות
התוויס >>. אינה מעבירה את הסמן
לשורה הבאה באופן אוטומטי. אין
הכרח להשתמש במצייני פורמט.
2 באיזה שלושה סוגים של ארגומנטים ניתן להשתמש בפרמטר של ()פווק!
3 באיזה שלושה סוגים של ארגומנטים ניתן להשתמש בפרמטר של ()ז4תסונוקז
4. מהם קודיס של בקרה!
5. מה ההבדל בין קוד הבקרה ח לבין קוד הבקרה זו
6. כיצד מציגים את תו המרכאות על המסך!
7. מהם שני חלקיה של הוראת ())חזזק!
8. מהם היתרונות של ())תוזק לעומת ()פונוק!
9. מהו מציין פורמט!
10. כיצד מציגים את ערכו של משתנה מספרי?
8 8 פרק 4: הפלט בשפות התכנות ++0/6)
ךז רגילים
1. כתוב הוראות ()פ)טק להדפסת שמך וכתובתך.
2. כתוב הוראות ()!ותוזק להדפסת שמך וכתובתך.
3. כתוב הוראת ()פוטק שממרכזת את המלה 11/6 על-גבי המסך. רוחב המסך הוא
0 תווים.
4. כתוב הוראת ())ותוזק המציגה את המלה 2886 בצידו הימני של המסך.
5. כתוב הוראת ()1!תנזק אחת שיוצרת פלט של ערכי המשתנים הבאיס:
;6ותט[סע ,6121 ,161עו ,זקת6] 031
6. כתוב הוראת ()))פוזק המציגה את ערכי המשתניס הבאיס עבור תוכנית המציגה
את שמו וגילו של אדס כלשהו:
([12 ]גת ז8 0
6 ות
7. תוכנית מסוימת כוללת את המשתניס הבאיס:
"618% קקס]" = []תת116 זהתס
5 = ]005 1081
5 = קנ זגו )08
כתוב הוראות ())מוזק המציגות את הפלט הבא:
5% לסקסן :סותגא ת1)6
5 ותו
5 : זגו
שים לב ליישור הערכים המוצגים.
8. תוכנית מסוימת כוללת את המשתנה הבא:
0 = )םטסס ותו
כתוב את הוראות הפלט המשמיעות צלצול פעמון, ולאחר מכן מציגות את
ההודעה הבאה, תוך שימוש בערכו של המשתנה )פטס כדי להציג את המספר
בשורה האחרונה:
[תותז/ !קתותז3 ל !קתנתזג\ וקַתנתזג/
.64 ח0ספ פב ז06נתותג תג
.6 16 16806 10 566005 30 46 סע
תרגילים 0 8
60/77 060/ת. התכ[ות +6/0
המהפ|
/ לט הוא תהליך הזנת הנתונים עבור התוכנית למחשב. הנתונים מוזנים
. ]| לתוך משתנה. כלומר, הנתונים שהמשתמש מקליד, בתגובה לבקשת קלט
שמציגה התוכנית, הופכים לערך של משתנה המאוחסן בטיכרון. לאתר
מכן, התוכנית עושה שימוש במשתנה בפעולות השונות שהיא מבצעת. כפי שמודגם
בתרשים 5.1, הקלט יכול להגיע ממקורות שונים.
01
תרשים 5.1
קלט מכל מקור שהוא
מאוחסן במחשב כמשתנה,
מיקרו"מעבד
ו[
מ
ב
----
תקליטור |5
קְ לשאר . כונניס
סורק אופטי
התוכנית חייבת לקבל את הקלט המתאים. זכור את הפתגם הידוע: נכנס זבל - :צא זבל.
ל רת ₪ אם הקלט המוזן לתוכנית שגוי, הפלט יהיה אף הוא שגוי. מידת הדיוק של הפלט לעולם
1 ו /
המלה קלט משמשת לא תעלה על זו של הקלט.
בשתי הוראות שונות.
כאשר משתמשים בה
כפועל, הכוונה היא
לתהליך הזנת הנתונים לא ניתן להזין נתונים לתוך קבוע, אלא למשתנה בלבד. הקבוע יכיל תמיד את הערך
למחשב. כשמשתמשים ההתחלתי שהקצית לו. כאשר אתה מזין ערך כלשהו למשתנה, אתה מציב את הערך
במלה קלט כשם עצם, בעמדת הזיכרון המתייחסת לאותו משתנה. אם המשתנה מכיל כבר ערך כלשהו, הערך
הכוונה היא לנתונים החדש שאתה מזין (או מקצה למשתנה באמצעות סימן השווה) תופש את מקומו (תרשים
ה ו 2. הערך הקודם נעלס לבלי שוב.
בפרק זה תלמד כיצד לקבל נתוניס מהמקלדת. בפרק 12 נעסוק באופן בו קוראת התוכנית
נתונים מקוב.
02 פרק 5: הקלט בשפות התכנות ++6/6
תרשים 5.2
תוכנו של המשתנה
מוחלף כאשר מזיניס
ערך חדש.
הערות ++6
++6 תומכת בכל פקודות הקלט של שפת 6.
880-8005 8-8 הרמ 8006-7080 0 -(8- 015 הש 0-כ( ה-2(<₪ 8 -8/סה/8)ההיוש 82-05 ג ש הקוש ה
1 ונקציה 06180
הפונקציה ()8615 מזינה מחרוזת לתוך משתנה. הפרמטר הוא שמו של המשתנה. לדוגמה,
עיין בתוכנית הבאה:
()הוגות
|
זו
((886מ)2618
[(46ת)פונוק
]
הפקודה ()86/8, במקרה זה, תקצה את עד 14 התווים הראשוניס שיוקלדו במקלדת
למשתנה מחרוזת ששמו 6ותם. זכור ש-6 מקצה עמדות זיכרון בהתאס למספר המפורט
בהכרצה. מכיוון שעמדת זיכרון אחת שמורה עבור מסיים האפס, באפשרותך להקליד מספר
הפונקציה ()8008 00
הערה
כאשר אתה מקליד תווים
בתגובה להוראת ()618/
התוויס המוקלדיס מופיעים
אמנס על-גבי המסך, אולם
אין זה כתוצאה מפקודת
פלט כלשהי. למעשה, התוויס
אינס מוזניס למחשב בפועל
עד להקשת ז6)ח3.
טיפ
התרגל להשתמש בביטויי
(0])תוזק או ()פווק המוריס
למשתמש מה עליו להקליד
לפני כל פקודת קלט. כפי
שתראה בהמשך, הצגת
הנחיות ברורות היא בעלת
חשיבות עליונה בפקודות
קלט אחרות.
94
תווים הקטן באחד מהמספר שצוין בהכרזה. אם ברצונך להזין שס בן 15 תוויס, לדוגמה,
עליך להכריז על שס המשתנה כבעל 16 תווים לכל היותר:
[6]16ות4ת ז08
כאשר מתבצעת הוראת (0150, התוכנית נעצרת. היא ממתינה שהמשתמש יקליד דבר-מה.
הנתונים המוקלדים הופכים בפועל לערך של משתנה רק לאחר הקשת זטותת. עס הקשת
זסות, המתרוזת שהקליד המשתמש מוקצית למשתנה, והסמן עובר לשורה הבאה במסך.
התו ות עצמו אינו הופך חלק מהמחרוזת, אולם .6 מוסיפה את מסיים האפס 0 כדי
להשלים את המחרוזת.
הבה נתבונן בדוגמה נוספת, מפורטת יותר:
()תוהות
זו
;(" :6וחפת זטסץ ז6)ת6 16856ק")])תנזק
((16ת615)08
;(טותפת ,"85 :15 סהתבת זטסע ,קתוותזו!תס)")))תוזק
כשתריץ את התוכנית, תופיע שורת ההנחיה הבאה;
:6ותגת זטסץ 16ת6 716856
מכיוון שהשתמשנו בפקודה ()!!ותוזק ללא הקוד ח, הסמן נשאר בסופה של ההנחיה. הסמן
יעמוד במרחק של תו אחד מתו הנקודתיים, מכיוון שהכנסנו רווח בין הנקודתיים לבין תו
המרכאות הטוגר את הפרמטר של ()!)חוזק. אם תמשיך לשבת ולהתבונן במסך, לא יקרה
דבר. התוכנית ממתינה לקלט כלשהו - במקרה זה, שתקליד את שמך.
תוך כדי הקלדת שמך, התווים מופיעים על-גבי המסך. אס שגית בהקלדה וטרס הקשת
זסותם, באפשרותך להקיש על מקש 980%50806 כדי למחוק את התווים השגויים ולהקלידם
מחדש. במערכות מחשב מסוימות ניתן להקיש 886 כדי למחוק בבת אחת את כל התווים
שהוקלדו, ולהתתיל מחדש.
הקשת זטום מציבה את התוויס שהקלדת במשתנה 6וחגת, ומחדירה את המסיים אפס
בסופה של המחרוזת. לאחר מכן מתבצעת פקודת ()!!ותוזץ השנייה. אם שמך הוא
370 מנצ41, יוצג על המסך המלל הבא:
310% מוץ1/ :6ותגת זטסץ זסות6 16856
תנט41 :15 6מזגת זנוסץ ,תוזת )
פרק 5: הקלט בשפות התכנות ++6/6
זכור, שמך מופיע בסופה של שורת ההנחיה הראשונה רק בגלל שהתווים שהקלדת כקלט
מוצגים על-גבי המסך. תווים אלה לא נקלטו בתוכנית עד שהקשת זטותם. בשורת ההנחיה
השנייה התווים מוצבים כמשתנה על ידי הפקודה ()!וחוזק.
הפונקציה (₪6/80 משמשת דרך מצוינת להזנת מחרוזות לתוכנית.
1 שנונקצ'יה 06100910
הפונקציה ()91ת86)0 מזינה תו יחיד מהמקלדת. מרבית הקומפיילרים מאפשרים להצין את
התו הן כתו המשתייך לטיפוס ז8ן0 והן כתו המשתייך לטיפוס )מו, בגלל האופן בו מגדיר
תקן :868 משתני תווים. (בפרק 4 תמצא מידע נוסף בנושא פיצול האישיות של תווים).
כדי להזין תו, השתמש באחד הפורמטיט הבאים:
זו ותו
(201010 = ז16)!0 = 1
שים לב שהקריאה לפונקציה ()ז86/008 עונה מהקריאה לפונקציות האחרות שהכרנו עד
עתה. במקום להופיע בתחילת השורה, היא מיוחסת למשתנה באמצעות סימן השווה (=).
פורמט זה פירושו: 'התוצאות המתקבלות מביצוע הפונקציה ()86/0181 מוצבות כערך
במשתנה ז6וו6|". למעשה, הקריאה לפונקציה (8610310 מטופלת כאילו היתה ערך בעצמה
(תרשים 5.3). כאשר השורה מתבצעת, נקראת הפונקציה ()ז6%8ו6, מוזן תו יחיד, והתוצאה
מוצבת במשתנה. פונקציה זו אינה מקבלת ארגומנט. כלומר, לא מועבר ערך כלשהו
לפונקציה בטוגריים.
כאשר המשתמש מקליד תו כלשהו, הפונקציה ()8010881 מציגה את התו על המסך. אין
צורך להקיש זטותם, מכוון ש-()8616141 מקבלת תו אחד בלבד - התוכנית ממשיכה לרו
ברגע שהוקלד תו אחד. התו מוצב במשתנה מייד עם הקלדתו.
מתי מתעורר הצורך להצין תו יחיד! נתקלת בוודאי בתוכניות הדורשות תשובה של 65 או
סא, או שמורות לך לבחור פריט מסוים מתוך תפריט. אלו הס יישומים המתאימים במיוחד
לפונקציה ()ז3ת040, מכיוון שהיא אינה ממתינה להקשת זטותע. די בהקשת התו כדי
להשלים את הקלט ולהמשיך בהרצת התוכנית.
גם כאשר התו המוזן באמצעות ()ז26)0148 משתייך לטיפוס הנתונים זחו, ניתן להציגו בעזרת
הפונקציה ()ז9תס)טוּק, או על ידי שימוש במציין %6 בהוראת ()))תגזק:
/ ו 00*/
()תוגות
[
1
"111101 6 זנוסץ 0ת6 16956)פונוקן
הפונקציה ()ז201010
קומפיילרים מסוימים של
ושל ++6 עושים שימוש
בפונקציה ()ת8610 כדי
להזין תו מבלי להזדקק
להקשת זסוחנן.
בקומפיילרים מסוג זה,
כאשר התוכנית קוראת את
התו באמצעות הפונקציה
(0ז63סק, המשתמש חייב
לעתים להקיש זסותם
אחרי הקלדת התו. עיין
בתיעוד הגלווה לקומפיילר
שברשותך.
55
60 = [1118ת1
('ת')ז וטק
(11181ת1) וטק
;('מ')זתסונוק
(11181ת%0",1"א)תוזק
תרשים 5.3
הפונקציה (10/0. ;()81ח610 = 80|
הפעל את הפונקציה |]]
(0ז6618ק כדי להזין תו ₪
הקצה את | | הצג את התו
התו למשתנה | אא על"גבי המסך
ששמו "16/0
תוכנית זו מזינה תו למשתנה מטיפוס )תו ששמו |4ות1, ומציגה את התו באמצעות
הפונקציות ()זפו!ט)טק ו-())ותוזק. אם תקיש את האות 1 בתשובה להנחיה, תוצג האות 1 על
המסך שלוש פעמים בשורות (פרדות - פעם אחת תוך כדי ההקלדה, ופעמיים נוספות
כתוצאה מהוראות הפלט. במרבית מערכות המחשב לא מתבצעת פקודת שורה חדשה
באופן אוטומטי אחרי הקלדת התו.
% פרק 5: הקלט בשפות התכנות ++2/6)
באפשרותך גם ליצור פלט של קוד ה-48611 של התו, בעזרת המציין 86, כך:
/*85011.0*/
()תוגות
|
6 ותו
;(260810 = ז161)60
0 161166,"ת%0 15 %6 01 6006 480211 6ת'ך'))מוזק
]
בדוגמה זו, המשתנה ז0ו)16 מוזן באמצעות הוראת ()86)0041. הפקודה ()!תוזק מציגה את
המשתנה בשני פורמטים. המציין %6 מציג את התו כפי שהוקלד במקלדת. המציין %0 מציג
את המשתנה כמספר שלם, קוד 49611 המקביל לאותה אות.
גם אם תכריז על המשתנה כמשתייך לטיפוס !ח! ותזין ספרה כלשהי, לא תוכל להשתמש
בספרה בפעולה מתמטית. כל עוד השתמשת בפונקציה ()91ת6)6א כדי להזין את התו,
ההתייחסות אליו היא כאל תו ולא כאל ערך מספרי.
השהייח הוכנית ("שטחו%ח60 10 זסוח= 655זק")
ניתן להשתמש בפונקציה ()ז86108 כדי להשהות את התוכנית. לדוגמה, מסך המחשב יכול
תרשים 5.4
שימוש בפונקציה
. "5 % 5 א .> ()81 603 להשהיית
= ּ התצוגה.
ו 0
ה -- .
הפונקציה ()ז201018 7
להציג מספר מוגבל של שורות בעת ובעונה אחת - בדרך כלל 25 שורות. אם השתמשת
בתוכנית בסדרה של הוראות ()פטק המציגות על המסך מספר שורות גדול יותר ממספר השורות
שניתן להציג בו זמנית, השורות הראשוטת שהוצגו י*עלמו מחלקו העליון של המסך. במקרה כזה,
ייתכן שלא יהיה די זמן למשתמש לקרוא את המידע הכלול בשורות שנעלמו.
כדי להתגבר על הבעיה, כתוב פקודות ()פ!טץ - או פקודות פלט אחרות - במספר שימלא
רק חלק מהמסך, והוסף את ההוראות
;("סנומ1זתסס 10 161ת5 655זק")]]תוזק
00
ההוראה ()8610(41/ המשמשת כאן לבדה וללא פרמטר, גורמת להשהיית התוכנית עד
להקשה על מקש כלשהו (תרשים 5.4). למעשה, המקש אינו חייב להיות זסותע, אולס
הקשה על מקש אחר תציג את התו על המסך, דבר העלול להטעות את המשתמש.
כשמשתמשים ב-()26/0241 באופן כזה, לא מאוחסן ערך כלשהו במשתנה. אם תקיש את
האות צ למשל כדי להמשיך בהרצת התוכנית, תוצג האות + על המסך, אולם היא לא
תוצב במשתנה כלשהו.
וברטור הכחובת 8
כידוע. לך, כל משתנה בתוכנית תופס מקוס בזיכרון המחשב. (כמות הזיכרון שתופס
המשתנה תלויה בטיפוט הנתונים אליו הוא משתייך. עיין בפרק 3 כדי לרענן את זיכרונך).
כל עמדה באיכרון ממוספרת, החל מ-0 ועד לעמדת הזיכרון האחרונה במערכת המחשב
תרשים 5.5
כתובות זיכרון.
200
2000
209
2008
207
4 ₪ = ₪ כא 6-2
8 פרק 5: הקלט בשפות התכנות ++6/06
משתנה ששמו +תש60
שלך. אם המחשב שלך מכיל 2 מגהבייט של זיכרון, העמדות ממוספרות מ-0 עד 2,097,151
- כמודגם בתרשים 5.5. מספרים אלה נקראים כתובות זיכרון.
כאשר אתה מכריט על משתנה, 6 מקצה די עמדות זיכרון כדי לאחסן את הערך. אם
הכרזת על משתנה מטיפוס ו ששמו ]תנוסס, לדוגמה, 6 מקצה שתי עמדות זיכרון כדי
לאחסן את הערך שיוצב ב-זפוסס. העמדה הראשונה מבין עמדות הזיכרון האלה היא
כתובתו של המשתנה.
בתרשים 5.6 ערכו של המשתנה ]מטסס הוא 2341. ערך זה מאוחסן בעמדות הזיכרון 21560
ו-21561. כתובתו של המשתנה !תטוסס, להבדיל מערכו, היא לפיכך 21560. די לקבוע את
העמדה הראשונה בתור כתובת, מכיוון ש-6 יודעת כמה עמדות זיכרון תופס כל טיפוס של
משתנה. אם 1]תטסס הוא משתנה מטיפוס מו התופס שתי עמדות זיכרון, והוא מתחיל
בעמדה מספר (2156, הרי שהוא חייב להסתיים בעמדה מספר 21561.
כאשר אתה רוצה להתייחס לערך של משתנה כלשהו, כדי להציגו בפקודת פלט, למשל,
השתמש בשמו של המשתנה. כדי להתייחס לכתובתו של המשתנה, יש להציב את התו 8
לפני שמו של המשתנה, כך: ותטסס8. התו 8 נקרא אופרטור הכתובת. הוא מורה ל-6
שאתה מעוניין בכתובת בה מאותסן המשתנה, ולא בערך המאוחסן בעמדה זו. לפיכך, בעוד
שערכו של המשתנה |תנוסס הוא 2341, כתובתו של 1ת800 היא 21560.
אין להשתמש באופרטור הכתובות עם משתני מחרוזת. מחרוזות מאוחסנות במשתנים מטוג
מיוחד, הנקרא מערך, עליו נלמד בפרק 10.
תרשים 5.6
משתנה וכתובתו.
הערה
כתובותיהס האמיתיות של
משתניס תלויות במחשב,
ועשויות אף להשתנות בכל
פּעם שאתה מריץ את
התוכנית. השתמשנו כאן
בכתובת 21560 כדוגמה
בלבד.
אופרטור הכתובת 6 סל
ה 50810
הפונקציה ()1ת509 היא דרך רב-שימושית להזין את כל סוגי המידע למחשב. שמה של
הפונקציה מורכב מהמלים 56% (סריקה) ו-66ווגוזס (תצורה קבועה), כלומר, סריקה
של תוויס מהמקלדת. הפונקציה טורקת את המקלדת, מוצאת תווים שיש להזינס למחשב,
ואז מתרגמת את הקלט בהתאם למצייני פורמט. בדומה לפונקציה ())ותוזק, גם ()ת508
יכולה לטפל במספר ארגומנטים, ולכן באפשרותך להצין משתנים מספריים, משתני מחרוזת
ומשתנים מטיפוס זג0, בעת ובעונה אחת.
הערות ++6
++6 תומכת בכל פקודות הקלט של 6, ובנוסף - כוללת גם
פונקצית קלט רב-שימושית הנקראת חוס. עיין בפסקה "הקלט .
בשפת הת
בדומה ל-()תוזק, גם הפרמטר של ()/ח503 מורכב משני חלקים, מחרוזת בקרה ורשימת
נתונים. (ראה תרשים 5.7) מחרוזת הבקרה כוללת מצייני פורמט המורים כיצד יש לתרגס
את נתוני הקלט. בפונקציה ()1ת508 נקראיס המצייניס תווי המרה(618180)6159 תס!פז6שתס0ס).
רשימת הנתונים מצביעה על המשתנים שיאחסנו את הערכים המוזנים לתוכנית.
תרשים 5.7 רשימת נתונים מחרוזת בקרה
הפרמטר של ()1מ508 מורכב
משני תלקים.
5090 עושה שימוש במצייני הפורמט שמשמשיט את הפונקציה ()!)ח1זק:
40 מציג מספר שלם
₪ מציג מספר שלם בלתי-מסומן
% מציג מספר עשרוני, מטיפוס 1031
%6 מציג מספר בכתיב מדעי
₪ מציג מספר עשרוני בכתיב עשרוני או בכתיב מדעי, הקצר מביניהס
0 מציג תו מטיפוס ז8ת0
98 מציג מחרוזת
40 מציג מספר אוקטלי (בסיס 8)
0( 1 פרק 5: הקלט בשפות התכנות ++6/6
א מציג מספר הקסדצימלי (בסיס 16)
כאשר מזינים נתוניס מספריים או נתונים מטיפוס זגַת0, חובה לציין ברשימת הנתונים גם
את כתובת המשתנה ולא רק את שמו:
()תוגות
|
)תטסותג )1108
508 )"%1", 63101
]
ההוראה ()1ת508 תזין ערך מטיפוס )808 לעמדת הזיכרון בא מאוחסן המשתנה ]מטסוזה.
כאשר מציבים ערך בכתובת של משתנה, הערך מיוחס למשתנה באופן אוטומטי.
כאשר פונקצית ()1ת563 מתבצעת, התוכנית ממתינה שתקליד נתונים. התווים שתקיש
במקלדת יופיעו על-גבי המסך, עד שתקיש זסותם.
אופן הזנת הנתונים על ידי הפונקציה (]1ם509 שונה לתלוטין מאופן הזנת הנתוניס
באמצעות הפונקציות ()861 ו-()ז26)018. כדי להבין כיצד פועלת ()1ת809, עלינו לבחון את
ההבדלים האלה ביתר פירוט.
שטך קל 0ח698זו9)
בהזנת נתונים לפקודה ()8618, כל התוויס המוקלדים עד להקשת זטותם מוצבים במשתנה.
כאשר מזיניס תו באמצעות הפונקציה ()ז8610(8, התו המוקלד מיוחס למשתנה באופן
אוטומטי.
הפונקציה ()ת508 פועלת באופן שונה. במקוס לקחת את הנתונים המוקלדים ולייחס אותם
למשתנה, ()/ת509 משתמשת במצייני הפורמט כדי לתרגם את האופן בו יש להשתמש
בתווים המוקלדים.
(10ת508 לוקחת את הנתונים מתוך שטף קלט. שטף הוא סדרה של תוויס המוזנים ממקור
כלשהו. במקרה של ()1ת509, המקור הוא המקלדת. כאשר אתה מקיש זטותם אחרי הקלדת
הנתונים, כל מה שהקלדת מועבר לפונקציה ()1ת563 כסדרה של תווים חסרי משמעות,
בסדר בו הקלדת אותם. על ()1ת509 לקבוע איזה תווים מתאימים לטיפוס הנתונים עליו
מצביע מציין הפורמט, ומאיזה תווים עליה להתעלם. מצייני הפורמט נקראים תווי המרה
מכיוון שהם ממיריס את התווים הגולמיים בשטף הקלט לנתונים, בהתאם לטיפוסי
הנתונים שציינת. תרשים 5.8 מדגיסם את התהליך.
הפונקציה ()1ת808 01 1
תרשים 5.8
(0/ח568 קוראת את שטף
הקלט כדי לקבוע איזה
נתונים לקבל ומאיזה נתונים
להתעלס.
התו 5 הוא מספר | :(%1",84000007") 501
שתואם למציין ]8.
קבל אותו לתוך 5
]תטסוחה.
התו 6 הוא מספר | ;(%61",8.80000001") 50
שתואם למציין ]%.
-קבל אותו לתוך 566
)טסוה
התו . הוא תו שתואם ;(1)"%1",8.8000001 50
למציין ]8. קבל אותו
לתוך )תטסמו3. 66
התו 8 הוא מספר |( 1,880" 0
שתואם למציין ]%.
קבל אותו לתוך 8
+הטסוחה. 2
התו 7 הוא מספר | :(1)"%1",8.870077ח508
שתואם למציין ]%.
קבל אותו לתוך 7
;+טסוחה.
התו 5 אינו תואס :(50801)"%1",8.8₪00007
למציין ]8. עצור
כאן. אל תמשיך. 7
0 "1", (
2 0 1 פרק 5: הקלט בשפות התכנות ++0/6
ןא
וו
5
58 צטסהך
46
9% +טפח1
[7
5% צטקה1
8
5 %טסח1
17
5% צטקה1
| 567680 טסה
(10ם509 מתעלמת באופן אוטומטי מכל תווי הרווח - רווחים, תווי דילוג או פקודת שורה-חדשה
- אלא אם כן פריט הנתונים הבא משתייך לטיפוס ז64. התבונן בתוכנית הבאה:
()הופות
|
00 זמ1
;(" ח6טותטת 8 זוה 9)"216856ונוק
66006 ,'"90"))ת508
()תטסס,"%6 15 ז6סחנות 6 1")]ותוזק
]
באפשרותך להקיש על מקש הרווח כמה פעמים שתרצה לפני הקלדת המספר. 6 מתעלמת
מהרווחים ומחפשת את התו הראשון שאיו רוות. לאחר מכן היא מנטה להתאים את
התוויס לפורמט עליו מצביע המציין. אס התוויס מתאימים לפורמט - בדוגמה שלנו, אס
אלו הס מספרים - (10ח509 מציבה את המספרים במשתנה. הצבת המספריס במשתנה
נפסקת ברגע שהפונקציה נתקלת בתו שאינו מתאים לטיפוס הנתוניס, ובדוגמה שלנו - תו
שאעו מספר. לפיכך, אם הקלדת 123400, הערך 123 יוצב במשתנה, והפונקציה תתעלם
מהאותיות 850, כמודגס בתרשים 5.9. ההצבה במשתנה נעצרת גם ברגע שהפונקציה נתקלת
בתו רוות. אס הקלדת 3 12, הערך 12 וצב במשתנה והפונקציה תתעלם מהמספר 3.
תרשים 5.9
()1ת503 מפסיקה לקבל
נתונים ברגע שהיא
נתקלת בתו שאינו
מספר.
4
0%" ,800 0 (
אינו מקבל את זה 806
/
.
הי
ו
התו הראשון בשטף הקלט שאינו תו רווח חייב להתאים למציין הפורמט. אס תקליד 80123,
הפונקציה תתעלס מהעיול (עזות6) כולו, ולא תוכל לדעת איזה ערך מאוחסן במשתנה.
התווים הנחשבים "מתאימים" תלוייס במציין. אס המציין הוא 46, לדוגמה, רק תווי
הספרות ותו הקו המפריד (סימן המינוס) מותרים. אם המציין הוא א%, מותרים התווים
87 01230567894, מכיווןן שאלו הס התוויס המשמשים במספרים הקסדצימלים. אם
הפונקציה ()1מ508 ו 1
תרשים 5.10
(10ת503 מפסיקה לקרוא
תווים לתוך משתנה מחרוזת
ברגע שהיא נתקלת בתו רווח.
המציין הוא %6, כל תו ייחשב "מתאים', כולל תו הרווח. מכיוון שטיפוס הנתונים ז8ו1 יכול
להכיל כל תו, ()/ת508 אינה מתעלמת מתווי רווח בשטף הקלט. אס ההוראה היא
1 ז תס
(06 500
ואתה מקיש על מקש הרווח לפני הקשת התו, ()6ת508 תציב את תו הרווח במשתנה
ותתעלם מהתו הבא אחריו. אין להקליד רווחים לפני ערך מטיפוס זגתס.
כאשר אתה מקליד מחרוזת, (10ת508 מתחילה את ההצבה בתו הראשון שאינו תו רווח,
ומפטיקה לייחס קלט למשתנה כשהיא נתקלת בתו הרוות הבא. התבונן בתוכנית הבאה:
()תוגות
|
([6]25ו גת זו
[(% :סוחגת זטסץ ז10ת6 16856ק')פונו
(6וז גת ,1)"85%ת 508
, ;(6ותגת)5)טק
]
שיס לב שכאשר המשתנה הוא משתנה מחרוצת, אין משתמשים בתו 8. אם תקליד עטתגּאן
ותקיש זסות:, התוויס יוצבו במשתנה סוַתח. אולס, אם תקליד 60651 שסתגא (כמודגס
בתרשים 5.10), (10ח563 תציב את התווים החל מהתו הראשון שאינו רווח, ותפסיק את
הצבת התווים בתו הרווח הבא. לפיכך, רק השם שְסתגאן וצב במשתנה, והפונקציה תתעלם
משם המשפחה ₪:068ו6. בגלל אופן פעולתה של (10מ503, אם ברצונך להקליד מחרוזת
שכוללת רווח, עליך להשתמש בפונקציה ()86/5.
שטף קלט
(6 8 ,"5065 | 08
הפונקציה ())מ568 מקבלת
את כל התווים, עד 2% ,
לרווח הראשון. ו
508 %טקהך
(6ח ,")501 | 0ה6פות 7
עם מציין אחד בלבד,
הסריקה נעצרת ברוות
ומתעלמת מיתר התוויס בב ול
:ה
בשטף הקלט. חגא
(46ח , ")0
4 0 1 פרק 5: הקלט בשפות התכנות ++6/6
שילוש בצונקציה 10ח508
הבה נבחן עתה את הפונקציה ()1ת508 ביתר פירוט. עיין בתוכנית הבאה:
()םוגות
|
;)טסט 1ח1
ות 655זק ח6ו!] זססותנות ז1686ם! ת8 ז6)מ6 216856")]ותוזק
%
;(1ת0000 ,'%0")מ309
()מטסס ,' %0 :קזות6 זנוסץ קתותז1]תס<)")זהוזק
כאשר התוכנית מורצת, מתרחשים הדברים הבאים:
1. ההוראה ()תוזק מציגה הנחיה על-גבי המסך:
ות 655זק ת6ם] זסטומטת ז1680ת1 תה זסות6 216856
מכיוון שלא כללנו קוד שורה-חדשה, הסמן נשאר בסופה של ההנחיה.
2. התוכנית ממתינה שהמשתמש יקליד ערך כלשהו.
3 אתה מקליד עיול כלשהו, ומקיש ז6ותע.
4. ()1ת503 בוחנת את שטף הקלט וקובעת איזה תווים לקבל ומאיזה תוויס להתעלס.
אם היא נתקלת בתווים מספריים לפני תוויס שאינם מספריים, היא ממשיכה
לסרוק את השורה עד לתו הראשון שאינו תו מספרי, או עד לתו הרווח הראשון.
התוויס המספריים מומרים למספר ומאוחסניס בכתובתו של המשתנה. אס ()1ת509
נתקלת בתווים שאיגם מספריים לפני תו מספרי כלשהו, הסריקה נפסקת
והפונקציה מתעלמת מהתוויס שהקלדת.
5. הסמן עובר לתתילתה של השורה הבאה במסך.
6. ההוראה (())םוזק מציגה את הערך של המשתנה |תטסס אחרי ההודעה
ץזות6 זטסץ קתומח1)תס0.
אתה רשאי להשתמש במספר פונקציות (]/ת509 הדרוש לך כדי להזין את הנתונים. תוכנית
1 לדוגמה מזינה ארבעה משתנים - משתנה מטיפוס 1ח1, משתנה מטיפוס 1081, משתנה
8 ומחרוזת. שים לב שנעשה שימוש באופרטור הכתובת עבור כל המשתנים, למעט
משתנה המחרוזת.
הפונקציה (]1ת5804 5 1
הערה
ניתן להשתמש ב-()50801
גם כדי להזין מספר
משתנים בהוראה אחת.
אולס, אס המשתמש אינו
מקליד את הנתוניס בדיוק
באופן בו ()]ת568 מצפה
לקבל אותם, הפונקציה
עשויה להתעלם מהקלט
כולו. לכן, כל עוד אתה
לומד את שפת 6, השתדל
להימנע מהזנת מספר
משתנים בפקודת ()1ח308
אחת. השתמש בפקודה
נפרדת עבור כל פריטי
נתוניס שעל המשתמש
להקליד.
תוכנית 5.1: תוכנית שמזינה ארבעה משתנים
/* 36]ת808 */
()תוגות
;)תטסס )מו
;)מנוסוזג )1108
ז תס
([6]15וחגת ז8תס
("זסות פפסזק 6תה ז0ק16תן תג זסותם')פונוק
;6601 ,'1)"%0ת508
("זסות סז 6תה 11081 8 זסות2')פונוק
;( 6310 ,'%1")]ת508
("ז16ת פ5סזק 6ח8 03180101 8 זס)ותמ'י)פווק
;(62161)61 ,"%0"))ם508
;("זטות פפסזק 0ת8 קתוזו5 8 זסומם')פונוק
;(6ותגת ,"1)"%5ת568
;(סוחגת 16116 ,תטסותה , |תנוסס ,'%5 %0 ]%6.2 %0")ותוזק
לדוגמה, נניח שאתה כותב תוכנית המקבלת כקלט את סכומה של רכישה כלשהי:
|
)
ניתן להכריז על משתנה תווי כמשתייך לטיפוס הנתונים +תו, אולס עליך להזין אותו בעזרת
מציין הפורמט %6. לא ניתן להזין אותו באמצעות המציין %6 (אם כי באפשרותך להציג את
ערך ה-48611/ של התו בעזרת המציין %0 בפקודת ())ותגזק).
השגח קלט מתאים
כפי שראינו, בגלל אופן הפעולה המיוחד של ()ח508, הפונקציה יכולה להתעלס מקלט. לכן,
חיוני להציג הנחיה למשתמש לפני כל הוראת ()/ת804.
()ת1גות
;)תוסג 11081
((" :5816 116 01 ]מטוסותג 16 ז0)ת6 16856ק')פונוק
(( 830 ,'"%1") 30
()מטסותג ,"]% 5 856תסזנוקן זטס ל ם")]ותוזק
06 1 פרק 5: הקלט בשפות התכנות ++0/6
|
מכיוון שהערך שיש להקליד הוא ערך כספי, משתמשים שיריצו את התוכנית עשויים לצרף
לערך את סימן ה-5, כך: 545.65. סימן הדולר נכלל בשטף הקלט. אולם מכיוון שסימן
הדולר אינו משתייך לטיפוס הנתונים )103], ומכיוון שהוא התו הראשון שהפונקציה פוגשת
בשטף, היא תתעלס מהקלט כולו. זו אינה דרך מוצלחת לעשות עסקים.
כדי להימנע מבעיה זו, יש לכלול הוראות מפורטות לפני פקודת ()1ת508, כדוגמת ההוראות
הבאות:
;('"ח6ת) 176 .5816 6 0 [תטסוחג 106 ז6)ת6 216856")פוט
;('ה פט זס שופ זג![60 8 6ק! וסת סכ .ץותס והוסותג')פווק
;("ח4567.87 :4110ץ 18 5 .65מ8פגוס1 תססץו01ט פ8הזותסס")פווק
("ם54,567.87 6 סת 15 15 ")ונוק
;("מטסץ אמפת1 ")פוטק
עס זאת, ניתן לקבל קלט הכולל תווים שאינך מעוניין להציב במשתנה. זכור, בפונקציה
(10)ם1זק, מחרוזת הבקרה יכולה לכלול תווים נוספים, מלבד מצייני הפורמט. כל התוויס
המילוליים הכלוליס במחרוזת הבקרה מודפסים, כשהערכים מוחדרים בעמדות של
המציינים. באפשרותך לכלול תוויס מילולייס גס במתרוזת הבקרה של הוראת ()1ת808.
נניח שכתבת את הוראת ה-()1ת863 כך:
508 )'5%0", 60
סימן הדולר (5) במחרוזת הבקרה מורה ל-6 לצפות לסימן 5 כתו הראשון שאינו תו רווח
בקלט. כאשר המשתמש מקליד 5 6 מצפה כבר שסימן הדולר יהיה כלול בשטף. היא
מתעלמת מהסימן במקוס לעצור את קליטת הנתונים, ומאחסנת את התווים המספריים
הבאיס אחריו בכתובת של המשתנה )תטסתזגּ.
יחד עס זאת, חובה להקליד כל מלל המופיע במחרוזת הבקרה לתוך שטף הקלט, ועליו
להיות במקום המדויק יחסית למצייני הקלט. אס התווים אינם מוקלדיס במקוס בו הס
אמורים להיות, הפונקציה מתעלמת מכל הקלט המוקלד מנקודה זו והלאה. לדוגמה, כאשר
סימן הדולר כלול במציין הפורמט, הפונקציה תתעלם מהקלט אס לא תקליד את סימן
הדולר כחלק מהעיול. לכן, אס החלטת להשתמש בתו המילולי, ודא שהמשתמש ודע שעליו
להקליד אותו:
;("ח 16 1 .5816 186 01 )הטסוחג 6ת] זסות6 216856")פוטק
:('"ח54567.87 תו 85 ,חקו ז60[18 8 ם!1או זסטמתטת")פונוק
:("ח.65ת58נוסת! ת66או)6ט 005 56 )סת 20")פוטק
סימן הדולר אינו מאוחסן כחלק מהמשתנה אינו מוצג כאשר אתה משתמש במשתנה
בפקודת ()4)תוזק. הוא מופיע על המסך רק בעת הקלדת התונים, מכיוון שכל התווים
הפונקציה ()1ת508 077 1
מופיעים על המסך בעת הקלדתם. אם ברצונך להציג סימן דולר יחד עם המספר בשלב
מאוחר יותר בתוכנית, יש לבנות את הוראת ()]!חוזק כך:
(ותטסותה ,"/5% 5 456חסזוק זטס ')]ותוזק
במקרה זה, טימן הדולר הוא פשוט עוד תו מילולי המוצג על ידי ()]ותוזק. הוא יוצג לפני
המספר המוחדר במיקוס של המצביע ]4.
בגלל ההסתברות הגבוהה לבעיות הנובעות משימוש בתווים מילולייס בפונקציה ()/ח808,
מומל להימנע משימוש בהם, אלא אם הדבר חיוני או נדרש לצורך יישוס מיוחד.
היזהר בעוימועו בצונקציה 10ח508
במערכות מחשב רבות, תוויס המוקלדים לתוך שטף מאוחסנים באזור מיוחד בזיכרון
הנקרא חוצף (16טפ). אם ()1ת508 מפסיקה את פעולתה בטרס עת, תווים אחדיס עשויים
להישאר בחוצץ במקוס להיות מוצבים במשתנים. עלול להיווצר מצב בו פעולת הקלט
הבאה תתחיל לקרוא את התווים שנותרו בחוצץ מפעולת הקלט הקודמת, במקוס את
התווים שהמשתמש מקליד בתגובה להנחיית הקלט הבאה.
לכן יש לנקוט זהירות בשימוש בפונקציה ()1ת508. מומלף להזין כל פריט נתונים בנפרד,
ולכלול הנחיות למשתמש המסבירות בבירור את טיפוס הקלט הנדרש.
קל בעונת התכנון ++0
קומפיילרים של ++6 תומכים בפונקציות (8618, (810 0/6 ו-(10ה50, כפי שהכרת אותן
בפרק זה. אולם, ++6 כוללת פקודת קלט רב-שימושית נוספת, באמצעותה ניתן להזין את
כל טיפוסי הנתונים. הפקודה תוס, יחד עם אופרטור החילוץ <<, משמשת להשגת קלט
מהמקלדת. ההוראות
()תטסס ותו
)תטסס << ם01
מזינות נתון מטיפוס )1 לתוך המשתנה !תטס6. בעבודה עס תוס אין צורך להשתמש
באופרטור הכתובת עבור משתניס מספריים ומשתנים מטיפוס :618 - די בשמו של
המשתנה.
אין גס צורך להעביר מצייני פורמט לפונקציה. !6 היא פקודת העמסת-יתר, כלומר -
מסוגלת לקבוע כיצד לפעול בהתאם לנתונים שהיא מקבלת. בגלל תכונת העמסת-היתר,
מעדיפים מרבית המתכנתים להשתמש ב-חוס במקום ב-()/ת808.
כדי להזין מספר ארגומנטים, יש להפריד בין שמות המשתנים באמצעות אופרטור החילו,
כמו בדוגמה להלן:
08 1 פרק 5: הקלט בשפות התכנות ++6/6
ב ו שי
6חגת << 6אָ << )תטסס << ותטסותג << חוס
ייתכן שבהתחלה תתקשה לזכור אס להשתמש באופרטור התילוץ << או באופרטור
ההחדרה >>. תרשים 5.11 מציג שיטה קלה לזכירה. דמיין לעצמך שהאופרטורים הס חציס
המופנים בכיוון המשתנים שברשימת הנתונים >>6, או בכיוון הנגדי למשתניסם שברשימת
הנתונים <<.
תרשים 5.11
דמיין את הקלט והפלט מנקודת מבטו של המשתנה אופרטור ההחדרה
ואופרטור התילו.
,811806/<<חוס ;|
<<<<<<<<<<<< %>>>>>>>>>>>
הנתונים נשלחים אל הנתוניס נשלחים
המשתנה מהמקלדת מהמשתנה אל עבר הצג
דמה את אופרטור התילוצ << לחציס המופנים לכיוון המשתנים, ומטמלים נתונים העובריס
אל המשתנים באמצעות הקלט. כאשר אתה משתמש ב-ם01 לצורך הזנת נתוניס, השתמש
באופרטור המצביע לכיוון המשתניס שלתוכס אתה מפין נתונים.
דמה את אופרטור ההחדרה >> לחצים המופנים בכיוון הנגדי למשתנים, ומסמליס נתוניס
היוצאים מהמשתנים אל הצג. כאשר אתה משתמש ב-)600 לצורך הצגת פלט, השתמש
באופרטור המצביע לכיוון הנגדי למשתגים שמעבירים נתונים לצג.
1 שחנים שלא נקבע להם ערך
ייתכן מצב בו הכרזת על משתנה בתוכנית, אך לא הצבת בו ערך כלשהו. מצב כזה עשוי
להיגרם בגלל הוראת ()1ת508 שנקטעה מוקדס מדי, או בגלל שפשוט שכחת לכתוב פקודת
קלט להזנת הערך. אס אתה עושה שימוש במשתנה שלא נקבע לו ערך בתוך פקודת פלטט,
לא תופיע הודעת שגיאה, אבל הערך שיוצג על-גבי המסך יהיה חסר משמעות.
עס הפעלת המחשב, מתמלאות עמדות זיכרון שמערכת ההפעלה אינה משתמשת בהן
בנתוניס אקראיים. כאשר 6 מקצה עמדות זציכרון למשתנה מוכרז, היא אינה משנה את
תכולתן של עמדות זיכרון אלה עד שמקצים למשתנה ערך התתלתי או עד שמזינים ערך
כלשהו למשתנה. לכן, אס משגרים לפלט משתנה שלא הוקצה לו ערך, שפיעו בו הנתוניס
האקראיים המאוחסנים באותה עמדת זיכרון. אך המצב יכול להיות גרוע אף יותר, מכיוון
שגם כאשר מנסים להשתמש במשתנה בחישוב כלשהו לא מופיעה הודעת שגיאה, אך
תוצאת החישוב תהיה חסרת משמעות לתלוטין. אם אינך ער לכך, אתה עלול להניח שזוהי
התוצאה הנכונה.
משתנים שלא נקבע להם ערך 0 0 1
הערה
מרבית התרגמנים (כמו
התרגמן לשפת התכנות
0, וכן קומפיילרים
אחדים, מקצים באופן
אוטומטי אפסיס למשתנים
מספריים.
מתכנתים רבים נוהגים להקצות ערכים התחלתיים לכל המשתנים כדי למנוע את הבעיה.
ניתן להקצות את הערך אפס למשתניס מספריים, ורווח למשתנים מטיפוס זגו01 ולמשתני
מחרוזת, כך:
(0=]תטסס )ח1
[ '=[1)13ח1 זגתס
/ 010
ייתכן, כמובן, שהלוגיקה הפנימית בתוכנית שלך תכתיב ערכים התחלתיים אחרים.
בדרך זו, אס מציגים משתנה מבלי שהוזן-לתוכו | ערך או הוקצה לו ערך התחלתי, התוצאה
המוצגת על המסך איננה חסרת משמעות. בהמשך תלמד כיצד לבחון את תוכנם של
משתנים, כדי לוודא שהערכים המוצבים בהם תקפים. זכור, אס נכנס זבל, יצא זבל.
טבלה 5.1 מסכמת את פקודות הקלט שלמדת בפרק זה.
אָָלגודיתמלים עוימושיים לקלט
אלגוריתם הוא דרך לביצוע מטלה מסוימת. כאשר אתה לומד לתכנת, אתה לומד למעשה
כיצד לפתח אלגוריתמים - כיצד לבצע מטלה בשפת התכנות 6. נראה, לכאורה, שמספר
האלגוריתמיס האפשריים הוא בלתי מוגבל, אך למעשה, קיים גרעין יסודי של אלגוריתמים
המשמשים לפיתוח 90 אחוז מהתוכניות. מרגע שתלמד להכיר את האלגוריתמיס
השימושיים ביותר, תוכל לעצב את התוכנית בקלות בעזרת השיטות שכבר למדת.
אחד האלגוריתמים האלה משמש להצבת ערך חדש במשתנה. ישנם מקרים בהם אתה
מעוניין להזין ערך למשתנה שכבר מכיל ערך כלשהו. אם תשתמש, בפשטות, בשמו של
המשתנה בפקודת קלט, יאבד הערך המקורי המאותחסן במשתנה. מה ניתן לעשות כאשר
אינך רוצה לאבד את הערך המקורי! כאשר אתה רוצה, לדוגמה, להשוות את הערך הקודס
לערך החדש, כפי שתלמד לעשות בפרק 8.
האלגוריתם משמש, בפשטות, להצבת הערך במשתנה אחר, כך:
006
בדוגמה זו, הערך המאוחטן במשתנה )תגוסותג מוצב במשתנה 08086. עד שתקצה או תזין
ערך חדש למשתנה |חסותג, יכילו שני המשתנים ערך זהה. המשתנה 0866 משמש כעמדת
זיכרון נוחה לאחסון הערך עד שתזדקק לו שוב. כאשר תזדקק לערך זה, תקרא למשתנה
המשמש כעמדת אחסון.
0 1 1 פרק 5: הקלט בשפות התכנות ++6/6
= 2 טבלה 5.1
1 טיכוס פקודות הקלט.
(01050 טיפוס מחרוזת שפת ?)0 ושפת ++?). משמשת להזנת
בלבד מחרוזות, ובכלל זה גס מחרוזות
הכוללות רווחים. יש להקיש זס)מי
אחרי הקלדת המחרוזת.
(2010[810 תוויס יחידים שפת ?6 ושפת ++?). משמשת להזנת
תו שהוכרז כמשתייך לטיפוס !מו או
לטיפוס ז8ת6. אין צורך להקיש
תא אחרי הקלדת התו. השימוש
בפונקציה ()86)6031 נעשה ללא
פרמטר, כמשתנה (לדוגמה,
()200681 = 160)67). ניתן להשתמש
בפונקציה עצמה כדי להשהות את
הרצת התוכנית.
()1מ509 כל טיפוסי שפת 6 ושפת ++6. זקוקה
הנתונים למצייני פורמט עבור כל פריט
נתוניס שיש להזין. אין להשתמש
בפונקציה זו לצורך הזנת
מחרוזות הכוללות רווחים. יש
לוודא שהנתוניס מוזנים ומוקצים
למשתנים בסדר הנכון. ניתן
להשתמש ב-()1מ503 כדי להזין
מספר ארגומנטים בהוראה אחת.
אין להקליד רווח לפני משתנה
מטיפוס זזהת6.
מס כל טיפוסי שפת ++>) בלבד. אינה זקוקה
הנתוניס למצייני פורמט או לאופרטורים
של כתובות זיכרון. ניתן להזין
בעזרתה מספר ארגומנטים,
המופרדים בסימן <<.
אלגוריתמים שימושיים לקלט 1 1 1
תוכנית 5.2 מדגימה את תהליך הצבת ערכים חדשיס במשתנים. (בפרק הבא תפגוש
דוגמאות מעשיות יותר).
תוכנית 5.2: תוכנית המציבה ערך חדש במשתנה
/* 8107806.0 */
()ח81ח
/
6 ,"6פהטה לה1
; ( "י]6פהחטת + + 8106ע 6ח+ ת6+הם")8+טם
; (הפחטת8 ,"%0")+ה508
; 006ה=51070806
; ( "יז6סחטת 6+ 01 6ט81ע 8ה+ "6+הם")8+טק
; (ח6הטח8 ,"50801)"%0
; (9%07806 , "ח%0 ₪88 868 07101881 8ת7")%+ה1פק
; (תססחטה ,"50 18 8106 שפח 8תד")++ה1חק
שורות אלה מציבות ערך במשתנה זטטותות:
;("זססותנות 186 01 816 6 ז6)חמ'י)פונוק
;(ז00 ותנות62 ,'1)"%6ה508
הערך המאוחסן במשתנה ז6טנתטת נשמר במשתנה 886ז5/0 באמצעות ההוראה:
(ז6סותנות=5107326
לאחר מכן מוצב ערך אחר במשתנה זסלמחטת, על ידי חזרה על ההוראות ששימשו להזנת
הערך הראשון. ניתן להציג הן את הערך הישן והן את הערך החדש. הערך המקורי לא
אבד, אלא אוחסן בעמדת זיכרון אחרת, כפי שמודגם בתרשים 5.12.
אלות
1. מה פירוש הביטוי :כנס זבל, יוצא זבלי!
2. מדוע יש להקיש זסות אחרי פקודת הקלט ()ז1861004
3 מהן שתי הדרכים לשימוש בפונקצית הקלט ()18010181
4. מהן אופרטור הכתובת!
5. מהם היתרונות בשימוש בפונקציה ()ת508 להזנת נתוניס!
6. מהס תווי המרה!
2 1 1 פרק 5: הקלט בשפות התכנות ++0/
תרשים 5.12
תוצאות הצבה-מחדש
של ערכים.
00 זו
0% 0 8 0
6 טח
7. מתי תעדיף להשתמש ב-()8618 במקוס ב-()1ת508 להזנת מחרוזת!
8. מהם יתרונותיה וחסרונותיה של הוראת הקלט ()1ת508 עם מצייני פורמט!
9. האם יש צורך להקצות ערכיס התחלתיים לכל המשתנים!
10. אילו בעיות עלולות להיווצר כאשר משתמשים ב-(1ת509 להזנת משתנה מטיפוס
זג
113 9
144
ד רגילים
4
2
כתוב תוכנית המזינה את שמך ומספר הטלפון שלך, ומציגה אותס בשורה אחת
על-גבי המסך.
כתוב תוכנית המזינה מספר ומציגה את כתובת הזיכרון בה הוא מאוחסן.
כתוב תוכנית שמזינה שלושה מספרים ומציגה אותם בסדר הפוך -
המספר האחרון שהוזן מוצג ראשון, וכך הלאה.
כתוב תוכנית שעושה שימוש ב-()91ת2010, ()8015 ו-()1ת808.
הטבר מה לקוי בתוכנית הבאה:
()תוגות
|
וז
(26150 = 111181
((11181ת9)1)נוק
פרק 5: הקלט בשפות התכנות ++6/6
סיאן: 780/ה (0'7/670/6) , ,
2
, | /] שהו חסר! בפרק 5 למדת כיצד להזין נתוניס למחשב. בפרק 4 למדת
ע כיצד לשגר פלט אל הצג. עתה הגיע הזמן להכיר את מה שביניהם -
שלב העיבוד.
שלב העיבוד בתוכנית ממיר את הנתונים שהזנת לתוכנית למידע, המהווה את פלט
התוכנית. ההבדל בין נתונים לבין מידע הוא אומנם דק אך משמעותי. נתוניס הס
חומר גלס, תוויס ומספריס שהם אומנם בעלי ערך, אך אינם מאורגניס בצורה שיוכלו
לשמש כמוצר מוגמר. מידע הוא המוצר המוגמר; הוא התוצאה שכדי להשיג אותה
כתבת את התוכנית.
15
תהליך ההמרה של נתונים למידע לובש צורות שונות. כשעובדיס עם מספרים, התהליך
כולל לעתים קרובות פעולות מתמטיות כאלה או אחרות. לדוגמה, :יתכן שאתה צריך
להכפיל את סכוס ההזמנה בשיעור מס הקנייה, ולהוסיף את המט לטכום ההזמנה. בתהליך
זה, המודגם בתרשים 6.1, מעורבות שתי פעולות שניתן לתארן כך:
מס קנייה = סכוס ההזמנה כפול שיעור המס
סך ההזמנה = טכוס ההזמנה בתוספת מס הקנייה
תרשים 6.1
תהליך חישוב טך הזמנת 5 וחג ח3150/
ייה
קנייה. 466 תואוע 2867
2 ,תסזקתוט
2000 3 ח₪80 יי
2.0 טָחוז הזוא 06זג | 5
0 0 | אסוםוש
11000 0
"0 אגד 50105 5%
> 115.00 סד
כדי לבצע את החישוביס ההופכים נתוניס למידע, אגו זקוקיס לסימני פעולה (אופרטוריס).
אופרטור הוא סימן המורה למחשב כיצד לעבד את הנתונים. בפרק זה תכיר אופרטוריס
חשבונייס, אופרטוריס של תוספות קבועות ואופרטוריס של הקצאת ערכים.
ּ %* 7 מש 33+זקָטס ו"
הערות ++6 ּ
שפת 6 ושפת ++6 משתמשות בסימני הפעולה המתמטיים ן
בצורה דומה. עם זאת, בשפת ++6 ניתן ליישם אופרטורים
מסוימים לטיפוסי נתונים שונים, בזכות תכונת העמסת-היתר.
בפרק 10 תלמד כיצד להשתמש באופרטור + בשפת ++6 כדי
לחבר בין שתי מחרוזות.
6 58 8 שה ₪8 ₪ 4 ₪85 רא 8-6 01-15-08 ₪-807 ₪52 ₪
16 1 פרק 6: סימני פעולה (אופרטורים)
א ובדטודים חעובוניים
כדי לבצע פעולות מתמטיות, משתמשים באופרטוריס החשבוניים הבאים:
אופרטור פעולה חשבונית |
+ חיבור
- חיסור
/ כפל
/ חילוק |
% שארית של חילוק מספרים שלמים |
שים לב שהכוכבית משמשת לסימון פעולת הכפל (ולא התו א), ותו הלוכסן (/) מציין
חילוק - אל תשתמש בתו הלוכסן ההפוך ().
לעתים קרובות משתמשים באופרטורים בתוך הוראות המבצעות פעולות מתמטיות ומציבות
את התוצאה במשתנה. בדוגמה שלנו, של חישוב סכוס החשבונית, אין היגיון בהצבת ערך
מילולי מדויק במשתנה המאחטן את מס הקנייה, כך:
0 = א8] 88105
אלא יש לחשב את הערך. את המשתנה מציבים תמיד בצידו השמאלי של סימן השווה, ואת
הפעולה החשבונית מצידו הימני:
6 אג) * ]טסוה = אג] 58165
(66חגזנופת1 + קַתנקקות5 + )005 = 6סוזק
000 / [064) = )ות זסק
הוראות אלה מורות לקומפיילר לבצע שלוש פעולות:
* להציב במשתנה אג! 54165 את הערך המתקבל מהכפלת הערך המוצב במשתנה
]תטסמזג בערך המוצב במשתנה 1866 א8).
* להציב במשתנה 6וזק את הערך המתקבל מסכוס שלושת הערכים 008 פלוס
פםןקק1 5 פלוס 6סמגזטפת1.
* להציב במשתנה וותו ז6 את התוצאה של חלוקת ערך המשתנה [1014 בערך
המשתנה )תטסס.
המחשב מבצע את הפעולה המתמטית הרשומה בצידה הימני של המשוואה, ומציב את
הערך המתקבל במשתנה שבצידה השמאלי. ניתן להשתמש בכל שילוב של משתנים,
קבועים וערכים מילוליים בצידו הימני של סימן השווה:
;6 * |תטסוחג = א8] 58165
7 + קתוקקוון5 + 56.90 = 6סוזק
(0 / 15665 = )1תט זסק
אופרטורים חשבוניים 7 1 1
8 ל
תוכנית 6.1 מדגימה את השימוש באופרטורים בתוכנית. התוכנית מזינה את שמותיהם
וכתובותיהם של לקוחות, ואת סכומי ההזמנות שלהם. לאחר מכן היא מחשבת את דמי
המשלות (עשרה אחוז מסכוס ההזמנה) ומס קנייה בשיעור שישה אחוזים. ההוראות ()פוטק
ו-()]1ת!זק מציגות חשבונית מלאה.
תוכנית 6.1: תוכנית לחישוב חשבונית ולהצגתה
/]*0106.0שח1*/
6 78%6 א8+ 8ה8406+1
0 סףסחהגכק1ח5 6ה800+1
()ה81ח
/
;[210]6 ,[5%8%6]3 , [15]ץ+01 ,[80070855]20 ,[808]15ה ח8ת0 י
;קנה5 ,א8+ ,10181 ,07087 1108%
;(" :806ה 0088+005%")++ה1חק
; (06%5)0806
((" :80070658 %1)"5%006%ה1תק
; (0019)8007088
;](" :ע1)"01%+ה1חם
; (צ+06%5)01
((" :1)"5%8%6+ה1חק
; (00%5)5%8%6
;(" :210")זה1חק
; (ס06%5)21
;(" :+הטסח8 1)"00068+ה1חקם
; (800007, "91" ) 9081
1 א%8 * 070068 = א8+
;חגקקגה5 * "0706 = כ1ת8
;קגהפ + א8+ + 000678 = 0%81+
; ("החהה")פ+טם
; (*"ח 105/א1 ")פ+טק
,ץצ01 ,8000855 ,806ה ,"ה%5 %5 , %5ה%5ה%5")++ה1חק
; (ק5%8%6,21
(00068:",00068" ,"ה+%10.2+105-%ץץץ+")++ה1חקם
;(א8+,':אהד" ,"ה%10.2%+105-1%+++")++ה1חם
; (ק1ח5, *":הַה1קס1ה8" ,"ה%10.21%+105-%++++")++ה1חם
; ("ח ++++++")+זהנחק
; (0%81+, ":81+סך" "+%10.2+105-%++++")++ה1ים
סימני פעולה (אופרטורים)
חילוק מסברים שלמים
כדי לחשב את השארית של חילוק מספרים שלמים, עושים שימוש באופרטור %. אם נשתמש
באופרטור החילוק (/) לביצוע חילוק של מספרים שלמים, או של משתנים מטיפוס מספר
שלס, התוצאה תהיה תמיד מספר שלם. לדוגמה, תוצאת חילוק 12 ב-5 (12/5) תהיה 2, ולא
4. השארית (0.4) היא מה שנותר אחרי חילוק מספרים שלמים.
לעתים אנו מעוניינים לדעת מהי השארית, אולם מכיוון שאנו עוסקים במספרים שלמים,
לא ניתן להשתמש בערך 04, מכיוון שזהו מספר עשרוני, מטיפוס 8041. במקום זאת, אנו
מאחסניס את השארית כמספר שלם. התוצאה של תילוק 12 ב-5 היא 2, והשארית היא 2,
כלומר - השארית של פעולת החילוק 5, כשהיא מחושבת באמצעות הביטוי 5 % 12, היא
2. השארית היא תמיד מספר שלם.
לדוגמה, התבונן בתוכנית 6.2. תוכנית זו מחשבת כמה שטרות בני עשרים, עשרה, חמישה
ואחד דולר דרושים כדי להחזיר עודף. הדבר החשוב ביותר שתוכנית זו מדגימה הוא
האלגוריתס, הטכניקה העושה שימוש בחילוק מספרים שלמיס כדי לבצע מטלה שהיתה
עשויה לדרוש חישוביס מורכבים יותר. בדומה לכל האלגוריתמים, גם אלגוריתס זה נראה
פשוט למדי ברגע שקולטיס את הרעיון הטמון בבסיסו.
תוכנית 6.2: תוכנית העושה שימוש באופרטור השארית
לחישוב עודף
/]*008006.0*]/
()810ח
ָ
,20ת 1 ,11/08 ,605+ ,%165ה00+, +הטסהה +ה1
;(" :66000 08חה8ת0 1 %הטסח8 6ה+ %68ה6")++ה1חם
501 )"%0" , 880? ;
ז+חטסחה =165+ה6א+
/* %165ה6ש+ 1600 060817068 %8ה0000050 020 /* [20 % %הטסהה=720
1 =67985+
/* 1608 81180 76081067 %8ה76206560 010 */ 1 % 010=220
11/85= 710 /
07085 = 710 %
; ('ה')יהס+טק
; (+הטסחה ,"ח :101100100 8ה+ 0146 5%0 "0+ סהַה8ה0 8%6ה סד")++הגחם
; (108+ה96+ ,"ה(165)ע%ה696 %0"))לתגחם
[(605+ ,"ה(160)5 %0")++ה1חקם
((1085+ ,'ה(11086)5 %0")++ה1חתם
; (88ה0 ,"ה(6)5ה0 %0")+צה1חקם
1
אופרטורים חשבוניים 0 1 1
אם תקליד את המספר 57, הפלט יהיה:
:שתואוס]01] 16 2106 557 107 86ת8ת6 %6גות סי
(169)ץ)ת6און 2
(69ח6 1
1 ₪669(
(06)5/ 2
תרשים 6.2 מדגים את אופן פעולתה של התוכנית. מטפר השטרות בני עשרים הדולר
מחושב על ידי ההוראה 20/ותטסגתג = ₪165ת6ו. מכיוון שהמשתנים זמטסנתג ו-₪165ם6/ו1
הס שניהס מספרים שלמים, התוצאה תהיה מספר שלם - מספר הפעמים ש-20 נכנס
ב-)תטסגזג. מבחינת המחשב, התוצאה היא רק מספר שיש לאחסנו בזיכרון. אך עבורנו,
הערך של 8פוזת6שוז הוא מידע, מכשון שהוא מייצג את מספרס של השטרות בני עשרים
הדולר בטכוס העודף שיש להחזיר.
עתה, כשידוע לנו כמה שטרות בני עשריס דולר יש ב-)תטסותג (2), כיצד תקבע את מספר
השטרות בני עשרה דולר! חשוב כיצד היית מבצע את המטלה הזו במציאות. לאחר מסירת
השטרות בני עשרים הדולר, היית בודק מה הסכוס הנותר, ולכמה שטרות בני עשרה דולר
תרשים 6.2
אופן פעולתה של תוכנית
החזרת העודף.
2 שטרות בני עשרים דולר | 57/20=2 | ;60105=80000020ע '
4
1
אחרי השטרות בני 20 הדולר, | : | 57920517 - 200 |
נותרים 17 ( ו 0 -
0
4
שטר אחד בן עשרה דולרים | | 11 0 0 1 י
אחרי השטר בן 10 דולל | / 1107 | : 0 1
נותריס 7 יו ו
שטר אחד בן חמישה דולרים : 751 : ב 5 :
אחרי השטר בן חמישה
הדולרים, נותרים שני שטרות
בגי דולר אחד
0 2 1 פרק 6: סימני פעולה (אופרטורים)
/00080% 00007 75 2
3%
|
'
אתה זקוק. התוכנית עושה פעולה דומה. כדי לקבוע מהו הסכום שנותר, השתמש באופרטור
השארית. ההוראה 20 8 זתגוסות120=9 מציבה במשתנה 120 את השארית שנותרה אחרי
חלוקת המשתנה ותטסותג ב-20. עבורנו, שארית זו מייצגת את הסכום שנותר לאחר
שהחזרנו כעודף את כל השטרות בני עשריס הדולר שניתן להחזיר. אחרי שמחזירים שני
שטרות בני עשרים דולר, סך של 540, השארית היא 17.
לאחר מכן אנו חוזרים שוב על אותה התבנית - עבור השטרות בני עשרה דולר, פחסו,
והשטרות בני חמישה דולר, 65ש88. מספר השטרות בני דולר אחד שווה בדיוק לשארית
הנותרת אחרי החילוק ב-65ו1].
ָָָוברטורים וטיבוטי נחונים
בדרך כלל משתמשים באותו טיפוט נתוניס (וחו או 8031) משני צדדיו של סימן השווה
בפעולה חשבונית. אס עליך לחבר שני ערכים מטיפוס )109, לדוגמה, תקצה את הסכום
למשתנה מטיפוס +108, כפי שמודגם בתוכנית הבאה:
()תוגות
|
חוקקות5 0056 1081
(% > 008
= פַתוקקגםת5
מוקקות + 0031 = [1018
;(31ו0) ,"58.21 8 10181 זטס צ")] )םוז
הפלט של תוכנית זו הוא:
7 5 0111 10181 זטסצ
ניתן גם להציב טיפוסי מספריס שונים משני צדדיה של הפעולה החשבונית. הערך שיוצג
ייקבע על-פי טיפוס המשתנה שבצידה השמאלי של המשוואה. לדוגמה, עיין בגרסה שונה
במקצת של התוכנית:
(0)תופות
|
1 ותו
ופתנקקום5 00560 081
(% * 605
= תוסקות5
[פתןקק 3 + 005% = 10081
(091) ,"586 15 5111 10181 זטסץ")!)מוזק
אופרטורים וטיפוסי נתונים 21 1
תרשים 6.3
התישוב המתמטי מבוצע
לפני המרת הנתונים לטיפוס
הנתונים של המשתנה.
הפעולה החשבונית מחברת שני משתנים מטיפוס 8081 (המשתנים 0051 ו-חוקק1ת5) אולם
מקצה את הסכוס למשתנה מטיפוס )ח! ששמו [1014. אם תחבר את הערכים במחשבון,
הסכוס יהיה 61.07. אך מכיוון שהמשתנה [1014 משתייך לטיפוס הנתוניס 1תו, הסכוס מומר
ומוצג כמספר שלם. מציין הפורמט %6 מציג את התוצאה כ-61.
שיס לב שתתילה מבוצע החישוב המתמטי, ולאחר מכן התוכנית משלימה את הקצאת
הערך למשתנה (ראה תרשים 63). אס הערכים היו מומרים למספרים שלמים לפני ביצוע
החישוב, הסכוס היה (6, 56 פלוס 4.
0חוסקוה014|=6051+5+
ראשית, מבוצע חיבור . , : 0-8
של שני הערכים.
שנית, מתבצעת המרה של התוצאות 7
כך שיתאימו לטיפוס הנתוניס של
המשתנה אליו הן מוקצות.
ניתן גם לחבר שני מספרים שלמים ולהקצות את הסכום למשתנה מטיפוס )108:
()תוגות
|
[קתוקקות5 005% וג
ו
0081 = %(
[4 = פתוקקות5
וקופ + 0054 = [1018
1 "58.21 15 [011 10181 זטס "))ותוזק
]
במקרה זה יוצג מספר מטיפוס )808, בגלל המציין ]% וטיפוס הנתונים של המשתנה. אך
מכיוון שהמספרים שסוכמו הם מספרים שלמים, הספרות העשרוניות יהיו אפסים - 6000.
2 2 1 פרק 6: סימני פעולה (אופרטורים)
ניתן גם לשלב מספרים שלמים ומספרים עשרוניים בצידו הימני של סימן השווה. גם
במקרה זה, בפעולות חיבור וחיסור, אופן הצגת התוצאה תלוי בטיפוס הנתונים של
המשתנה בו מציבים אותה. לדוגמה, עיין בהוראות הבאות:
()מוגות
|
קתוקקות5 ותו
1030
(09 = )008
;4 = פחוקק1ת5
₪תוקק ות + 6051 = 10181
;([1013 ,"5%.21 15 111 10181 זטס ע"))חוזק
]
הפעולה החשבונית מחברת ערך מטיפוס )803 עם מספר שלם, והתוצאה תופיע כמספר
מטיפוס 8041, 60.09.
כללים אלה תקפים גם בחילוק. אם מחלקים שני מספרים (ערכים מילוליים) ומקצים את
המנה למשתנה מטיפוס ]1108, חייב לפחות אחד המספרים לכלול נקודה עשרונית, אם
ברצונך להציג את הפלט כמספר עשרוני. תהליך זה מודגם בתוכנית המוצגת בתרשים 64.
בדוגמה זו מבוצע חישוב זהה שלוש פעמים, והתוצאה מוצבת תמיד במשתנה מטיפוס )103).
עס זאת, בחישוב הראשון לא כולל אף אחד מהמספרים נקודה עשרונית, ולכן התוצאה
מוצגת בצורה שגויה, עם אפסיס בספרות העשרוניות.
תרשים 6.4
חילוק ערכים מילוליים.
()חו3וח
|
פלט ;6 1081
זו 1/5
2.00 (0,"ח%1") הז
5
210000 (0,"ח%1") והוז
0
1000 (0"ח%1") 1 תוזם
אופרטורים וטיפוסי נתונים 23 1
דייה
ביטוי הוא חלקה הימני של משוואה ללא משתנה מצידה השמאלי. ביטויים משמשים
בהוראות פלט, כמו בדוגמה הבאה:
()תוגתת
|
(תנוסס ותו
5 = ]1תט00
(19 + |תנוסס ,"50 15 זססתתטת 6ת'ך"))ותוזק
תוכנית זו מציגה את הפלט:
4 15 ז6סותנות 6תי
הביטוי הכלול בהוראת ה-()!ומוזק הוא 19 + ]תטסט. כאשר מתבצעת קריאה לפונקציה
())מוזק, מחושב תחילה ערכו של הביטוי. תוצאת הביטוי מוצגת על ידי המציין 46.
ביטוי איגו משנה את ערכו של המשתנה. בדוגמה שלנו, אחרי ביצוע החישוב 19 + )תט0ס
והצגת התוצאה 24, ערכו של המשתנה )תטסס נותר עדיין 5. זכור, ביטוי הוא רק חלקה
הימני של המשוואה. הערך שתושב אינו מוקצה למשתנה כלשהו.
ביטויים יכולים לכלול כל שילוב של קבועים, משתנים וערכיס מילוליים, וכן אופרטוריס:
(ז6 ות + !תס ,'96")]!מוזק
(4 - 16 ,'90")]ותוזק
;(816] א8) * ותטסותה ,'%1")])םוזק
ככלל, ניתן להשתמש בביטוי בכל מקום בו ניתן להשתמש במשתנה. עם זאת, יש לשקול
היטב בכל מקרה אם להשתמש בביטוי או להציב את התוצאה במשתנה. לדוגמה, עיין
בתוכנית הבאה:
()חוגות
|
[קתוקק1ת5 ,0056 081
;(" :106 186 01 0051 116 זסזתת")]ותוזק
;(826050 ,1)"%1%ת508
;(" :618186 קתוקק1ו5 126 ז6זתת")]ותוזק
(קתוקק651 ,"41)ת509
(פתוקק1ת5 + 6051 ,"91 15 006 [018) 6ת'ד")]ותנזק
4 2 1 פרק 6: סימני פעולה (אופרטורים)
ההוראה:
(פמ1קק1ת5 + 0051 ,51% 15 006 [1018 6תידי)!ותוזק
מציגה פלט זהה לזה שמציגות ההוראות:
/*1081 ג 35 66012166 06 |פטחז [1018*/ נקתוקק1ת5 + 0051 = |[פזס1
(10131 ,'% 60815 606 )מטסות2 ")])תוזק
שתי ההוראות מציגות את הסכום שיש לשלס. במקרה הראשון, העושה שימוש בביטוי, אין
צורך להכריז על משתנה שיאחסן את תוצאות החישוב, ואיץ גם צורך להקליד משוואה.
החישוב המתמטי מתבצע והתוצאה מוצגת מייד באמצעות הוראת (0)תוזק. עם זאת, תוצאת
החישוב אינה מאוחסנת בציכרון המחשב. אס בשלב מאוחר יותר תרצה להציג את הסכוס
שיש לשלם, יהיה עליך להשתמש שוב בביטול קַתנקק1ת5 + 0086.
לעומת זאת, כאשר מקצים את התוצאה למשתנה, כמו בסדרת ההוראות השנייה, יש
להכריז על משתנה ולכתוב את המשוואה. אולם הפעם, תוצאות החישוב מאוחסנות בזיכרון.
אם תרצה להשתמש פעם נוספת בערך שחישבת, כל שיהיה עליך לעשות הוא להקליד את
שמו של המשתנה, במקוס את הביטוי כולו.
אם עליך להשתמש בתוצאה של חישוב מתמטי שותר מפעם אחת, כדאי להקצות אותה
למשתגה ולכתוב את המשוואה. השתמש בביטוי כאשר אתה זקוק לתוצאה פעם אחת בלבד.
דר קדימויות
כאשר המחשב נתקל במשוואה, הוא אינו מבצע את הפעולות החשבוניות באופן אוטומטי,
לפי סדר הופעתן משמאל לימין. המחשב סורק תחילה את השורה, ומבצע את הפעולות
על-פי סדר הקדימויות של פעולות התשבון. סדר קדימויות פירושו שפעולות מסוימות
מתבצעות לפני פעולות אחרות, אפילו אס הן מופיעות במשוואה אחריהן. הסדר קובע שכפל
וחילוק מתבצעיס תחילה, ולאחר מכן חיבור וחיסור. דרך קלה לוכור את סדר הקדימויות
היא להיעזר במשפט מממוני, כמו: 83117 ותו 2631 ץ]א (1 = תסגוגסו[קנו!ט]א - כפל, ע
= תסופוץנ - חילוק, , = ת0ווו404 - חיבור, ו-5 = ת10ו80זוטגו5 - חיסור).
המחשב סורק את המשוואה ומבצע תחילה פעולות כפל וחילוק, על-פי הסדר בו הן
מופיעות. פעולת חילוק המופיעה לפני פעולת כפל - תבוצע תחילה. לשתיהן סדר קדימויות
זהה. המחשב מקצה עמדות זיכרון זמניות כדי לאחסן את התוצאות, ואז חוזר לתחילת
המשוואה ומבצע את פעולות החיבור והחיסור, על-פי סדר הופעתן.
עיין במשוואה הפשוטה הבאת:
(1+4/2*5+3=ג
אס נבצע את הפעולות על-פי סדר הופעתן משמאל לימין, כמו במחשבון, התוצאה תהיה
5 (ראה תרשים 65). המחשב לעומת זאת זוכר את המשפט ץ![53 ותנוג. זג6כ עו
ותוצאת החישוב שלו תהיה 14. (תרשים 6.6 מדגים כיצד מתבצע החישוב). עליך לוודא
שפעולות החשבון בתוכנית שלך מתבצעות בסדר הרצוי.
סדר קדימויות 5 2 1
תרשים 6.5
ביצוע פעולות חשבון
משמאל לימין, כמו
במחשבון.
תרשים 6.6
ביצוע פעולות החשבון
5 תוצאה
לדוגמה, השגיאה הנפוצה ביותר שעושים מתכנתיס מתתילים קשורה בחישוב ממוצעים.
תוכנית 6.3 מדגימה תוכנית שמנסה להזין שלושה מספרים ולחשב את ערכם הממוצע.
השתמשנו במלה "מנסה", מכיוון שהממוצע שמחשבת התוכנית יהיה תמיד שגוי. האם אתה
רואה מדוע! השגיאה טמונה בשורה הזו:
3 3 זססוטת + 2 ז6טתנטת + 1 ז6טוחטת = 261826
על-פי טדר הקדימויות. המחשב סורק את השורה 23 /4 +8-1
16
ומבצע תחילה את החילוק
48=1+2* 3
ל ו.
המחשב משתמש בתוצאת 3+ 25 +8=1
החילוק לביצוע המכפלה ;
832= 3
לבסוף, המחשב מחבר
את המספרים שמתקבלים
פרק 6: סימני פעולה (אופרטורים)
המחשב מבצע את הפעולות בסדר הבא:
1. מחלק את 3 זסטוזטת ב-3.
2. מוסיף את המנה ל- 1 ז6פוזטת ול- 2 ז6סותגות.
תוכנית 6.3: תוכנית שגויה לחישוב ממוצע של שלושה מספרים
/*8%070806.0*]
()310ח
/
]6 ,3 "פסחטת ,2 ת6פטה ,1 ה6פהטה +1108
; (* :הספהטת 1+108% 6ה+ %68הם")+%ה1חק
; (1 מפסהטה8 ,"%%")%ה908
(" :ת6סטה 860000 8+ ת6שתם")++ה1חם
; (2 תסטהטה8 ,"%%")1ה508
ו" :הספהטה 170ה+ 8ה+ %88ה1)"5+ה1חהק
; (3 הסטחטח8 ,"%1")+ה508
3 / 8 ח6סהטה + 2 ה6סהטה + 1 ה6סהטה = 8080808
; (8087806 ,"%% 18 860806 שתד")++ה1קק
ז
אם תקליד את הערך 100 עבור כל אחד מהמספרים, הממוצע וצג כ-233.33. כדי לכתוב
את ההוראה כהלכה, השתמש בצורת הכתיבה הבאה:
(3/ (3 זססותטם + 2 ז6לוחנות + 1 זססגתטם) = 861886
הסוגריים משנים את סדר הקדימויות. כאשר המחשב סורק את המשוואה, הוא מבצע
תחילה את הפעולות הנתונות בסוגריים, ואז חוזר לתחילת השורה ומבצע את הפעולות
הנותרות על-פי סדר הקדימויות. במקרה זה, המחשב מסכס תחילה את שלושת המטפרים,
ואז מחלק את הסכוס בשלוש, כמודגם בתרשים 6.7. זהו זה! התשובה הנכונה.
3 (3 ז6סר טח + 2 זספותח + 1 זססותטת) = 8007806
4 : 7
7
תרשים 6.7
הנוסחה הנכונה
לחישוב הממוצע.
תרשים 6.8
מספר רמות של טוגריים.
כדי לשלוט בסדר הפעולות אף יותר, ניתן להשתמש במספר רמות של סוגריים, כמודגם
בתרשים 6.8. המחשב מבצע תחילה את הפעולות הנתונות בסוגריים הפנימיים ביותר,
ומתקדס משם לכיוון הרמות החיצוניות.
נתבונן בדוגמה. נניח שאתה משלם לעובדיך תעריף כפול עבור כל שעת עבודה מעל 40
שעות עבודה בשבוע. בהנחה שכל העובדים עובדים לפחות 40 שעות, או מקבלים תשלום
עבור 40 שעות לכל הפחות, אנו זקוקיס לחלקים הבאים כדי לבצע את החישוב:
5 ע61סא [ההחסת */ 6 * 40
טס 6ות11ז6צס */ 0
6 6ו11ו-00₪916 */ 2 * 1306
על המשוואה להכפיל את מספר שעות העבודה הנוספות בתעריף הכפול, ולהוטיף את
תוצאת המכפלה למשכורת השבועית הרגילה. אס מתעלמים מסדר הקדימויות, ניתן לכתוב
את המשוואה כך:
2 * 16 * 40 - פזנוסת + 316ז * 40 = [018)
נניח שעובד כלשהו עבד 48 שעות, לפי תעריף של 0 לשעה. ללא סוגריים, תחושב
המשוואה כך:
פעולה תוצאה
6 * 40 1500
6 * 40 1200
400*:2 00|
8 + 400 18
00| 72
8 2 1 פרק 6: סימני פעולה (אופרטורים)
ודאי שתשלוס בסך מינוס 5352 לא (ראה כתשלוס הנכון. כדי לכתוב את המשוואה כהלכה,
יש להשתמש בסוגריים:
((2 * 6גז) * (40 - פזטסם)) + (66ג1 * 40) = 1031
המשוואה מחולקת עתה לשני חלקים לוגיים (תוכנית 6.4). הפריטיס בתוך הסוגרייס
הראשונים מייצגיס שעות עבודה רגילות, ואילו הפריטים בתוך הסוגריים השנייס מייצגיס
שעות עבודה נוספות. הקטע הזה עצמו מכיל שתי רמות של סוגריים. קומפיילר 6 יבצע
תחילה את הפעולות שבסוגריים הפנימיים, ולאחריהן את הפעולה שבסוגרייס החיצונייס.
כלומר, מתבצעות חמש פעולות:
1500 6 * 40
8 0 - 8זטסת
0 2 * 186
100 00*%
00 400+0
תוכנית 6.4: חישוב משכורת כולל תשלום עבור שעות נוספות
/*0111.0הצ8ק*]/
()ה81ח
ָ
1 ,00008 ,78%8 1108%
((" :ע8ק 0% 78%8 ע1תטסה תטסץ ה%6הם")++ה1חם
; (808168 ("+%")+ה508
(('* :₪00660 טסעץ פוטסה 01 תשפהטה 8ה+ ת6+הם")+ה1חם
; (8הטסה8 ,"+%")1ה808
[((2 * 7818) * (40 - פתטסה)) + (78%8 * 40) = 0%81+
[(0%81+ ,"%% 18 /ץ58187 מטסץ")+%הגחם
/
אס אתה מתקשה לעבוד עם סוגריים, באפשרותך לפרק את המשוואה למשתנים נפרדים.
תוכנית 6.5 מחשבת אף היא משכורת כולל תשלוס עבור שעות נוטפות, אולם החישוב
מתבצע בסדרה של פעולות, במקוס במשוואה ארוכה אחת. מכיוון שתוצאת כל פעולה
מוצבת במשתנה, ניתן להציג כל תוצאה בנפרד, ובכך לעשות את הפלט לברור יותר. טכניקה
זו מעניקה לך בקרה טובה יותר על התהליך, ומקלה על איתור שגיאות.
סדר קדימויות 20 1
תרשים 6.9
אלגוריתם המונה.
1200
תוכנית 6.5: תוכנית עם פעולות נפרדות
/]*111.0סחצְק*]/
()ה81ח
ָ
; 0/6 0 ,%08א6 ,0000187 ,10181 (פהטסה ,7818 108%+
1 :ץע 0% 78%86 ע1הטסה תטסץ ה6+הם")%1ה1חם
; (8708%6 ,"+%")+ה508
ו(" טסץע פחטסה 0% הפמהטה פת+ ת8+הם")ז+ה1פם
; (5הט0ה8 ,"%%")+ה508
]1 * 40 = ה60018ת
- 0000585 = 1708א0
0 1106=708%8 * 2
6 6 * %08א6 = 108+ה0ט0
+0%81 = 7600188 +
; (7600180 ("ה2%.% 18 58187 ע₪66%01 7600188 הטסץ")+%ה1חם
; (%78א0 , "הפהטסה 8ה%1+67ע0 21%.% 60אתס₪ טסץ")++הגחם
; (0/60%106 ,"ה2%.% 18 ע8ק 6ה1+,פטס הטסץ")++הגחם
;(0%81+ ,"ה2%.% 18 ע8ק %81+0+ הטסצ")+%ה1חם
אָלגודיתולים שימושיים לעיבוד נחונים
חלק מהאלגוריתמים השימושיים ביותר בתכנות כוללים פעולות חשבוניות. השימוש בכמה
מהאלגוריתמיס האלה הוא כה נפוץ, עד שמתכנתים רבים כלל לא חושבים עליהט כעל
אלגוריתמיס. מתוכם, שני האלגוריתמים החשוביס ביותר הס המוניס (5ז6ו)תטסס) והאוגרים
(1130015ו1תנו800).
חישוב זה מבוצע תחילה | --> | 1+ חפזם!וח6 = ח0ז1!0ח6
. .
התוצאה מוקצית למשתנה 1+ ח6זם!וחס = ח6ז0!וח6
- למשתנה ת6111076 ערך
אחד בלבד בכל רגע נתון
פרק 6: סימני פעולה (אופרטורים)
!ונים
מונה הוא משתנה המתתחיל בערך התחלתי כלשהו, הגדל באחד בכל פעס שמשהו מתרחש.
האלגוריתס עבור מונה הוא:
9118016 = 811406 + 1
אץ ספק שכל מורה למתמטיקה יזדעק למראה המשוואה הזו ויטען שאי אפשר להשתמש
באותו משתנה משני צדדיה של המשוואה. אולס בתכנות מחשבים זוהי פעולה תקפה לחלוטין.
המחשב מחשב תחילה את הביטוי שבצידה הימני של המשוואה, ואת התוצאה מציב
במשתנה שבצידה השמאלי (ראה תרשים 69). בכל רגע נתון מוצב במשתנה ערך אחד
בלבד. ניתן להבין את המונה כך:
הערך החדש של המשתנה שווה לערך הקודס פלוס 1.
הבה נבחן את שלבי אלגוריתם המונה - כפי שמודגם בתרשים 6.10. נתחיל עס משתנה
ששמו !תטסס ונקצה לו ערך התחלתי אפס:
;)טסט ותו
000
כעת ניישם את האלגוריתם:
1 + )תט00 = ותטסס
המחשב מבצע את ההוראה כך:
1+ )= |תט00
הערך הנוכחי של ותגוסט, (0), מתווסף לערך המילולי 1. תוצאת הפעולה, 1, מוצבת במשתנה
]תנוס6 כערך חדש.
הבה נבצע את ההוראה הזו פעם נוספת:
1 + )טס = ותטסס
המחשב מבצע את הפעולה הבאה:
1+1 = ותטסס
הערך הנוכחי של זתנוסס, (1), מתווסף לערך המילולי 1. התוצאה, 2, מוצבת במשתנה !חטסס.
בכל פעם שמבוצעת ההוראה, ערכו של !תוס6 גדל באחד.
כמובן שניתן למנות בעזרת כל מספר ולהציב כל מספר כערך התחלתי. אס נקצה ל-)תגוס6
את הערך 1 כערך התחלתי, ההוראה
2 + )תט00=)תט00
אלגוריתמים שימושיים לעיבוד נתונים 1 13
תרשים 6.10
ביצוע אלגוריתס המונה.
12
ערכו של המשתנה החישוב שמתבצע בפועל הוראה
0 אחרי ההוראה
600
00001=00001+1; 0-1
0; 01
00001=00001+1; 001
6001=00001+1; 1
תגדיל את ערכו של )תטסט לאורך ציר המספרים האי-זוגיים - 1, 3, 5, 7 וכן הלאה. ניתן
למנות בדילוגיס של 5 עס הביטוי 5+)תטסס=)תטס6, או בדילוגים של 10 עם הביטוי
0+ 00=)מטס6, או בדילוגיס של כל מספר אחר.
כדי למנות כלפי מטה (להקטין את הערך של ומטסס) יש לשנות את האלגוריתם כך:
1 הזע
בכל פעס שהפעולה מתבצעת, הערך של המשתנה קטן באחד.
אוברטורים של חוטבות קבועות
השימוש במוניס הוא כה נפוץ, עד ששפת 6 כוללת אופרטורים מיוחדים המשמשים לביצוע
תוספת קבועה לערך של משתנה. האופרטור 8118016++ מוסיף 1 לערך של המשתנה לפני
ביצוע ההוראה. האופרטור מבצע למעשה את הפעולה
(1 + 411206ץ = 4118016
לדוגמה, נבחן את התוכנית הבאה:
/*6.)תטו60*/
()םוגות
|
(0=]מ 60 ]ת1
;()תנוסס ,'ח%0 15 ]תטסס 11:51 6ת'ך"))תוזק
;(1תנו60++ ,"ח%0 15 )מנוסס 56006 6ם'1"))ותוזק
;(1תס6 ,"מ%0 85/ 1תטס6 01 9[6ץ 1851 6 ד')]!ותוזק
פרק 6: טימני פעולה (אופרטורים)
הפלט של התוכנית הוא:
0 15 )תטסס 11:51 6
1 15 )00 56006 6
1 גו ]תס 01 9186 ]185 6מיך
לפני שהקומפיילר מבצע את הוראת ())תוזק השנייה, הוא מגדיל את הערך של !פטס ב-1,
כאילו כתבת את ההוראות כך:
1+ 60=]תנו 00
;()תנוסס ,"ת%0 15 ]תוס 6ת5600 6םך"))!תוזק
על ידי שימוש באופרטור התוספת הקבועה ניתן לבצע את אלגוריתס המונה מבלי לכתוב
הוראה נפרדת.
אופרטור התוספת משנה בפועל את ערכו של המשתנה. ודא שאתה מבין את ההבדל בין
אופרטור התוספת ]ת60++ לבין הביטוי 1+)תטסס בשורה הבאה:
;(1+)תט60 ,'ח%0 15 ]מטסס 56006 6ם1")])תוזק
הביטוי 1+)תטסס אינו משנה את ערכו של המשתנה ]תטסס, אלא רק מציג את הערך אחרי
התוספת. תוכנית 6.6 עושה שימוש בביטוי זה.
תוכנית 6.6: שימוש בביטוי במקום באופרטור התוספת הקבועה.
()ה81ח
ָ
]+00 %ה1
; (+הטס0ס ,"ה%0 15 %ה000 1105% 6תך")++ה1חקם
; (1++ה000 ,"ה%0 18 +הטסס 860070 8הך")++ה1חק
; (+הטסס ,"ח%0 ₪88 +הט0ס 0% 6ט1אט 185% 6הד")+%הבחם
הפלט של התוכנית הוא:
0 18 %חש00 175%+ פהך
1 18 000% 580000 פחד
0 988 %ח000 0% 98108 185% 6חך
הביטוי 1+!)מטסס מחושב כ-1, אך אעו משנה את הערך של המשתנה )תנסט. כאשר
המשתנה מוצג על ידי הוראת ())!םוזק השלישית, הערך שלו הוא עדיין הערך המקורי.
ניתן להשתמש באופרטור התוספת הקבועה בתוך הוראות (0)חוזק, כמו בביטוי בצידה
השמאלי של משוואה. ההוראה הבאה, לדוגמה, מגדילה את הערך של המשתנה )תטסס, ואז
מציבה את הערך החדש במשתנה זסטוחנות:
;1םו00++ = ז6סותטת
אלגוריתמים שימושיים לעיבוד נתונים 3 3 1
ביטוי זה מקביל לשתי ההוראות הבאות:
% + )00 = ]תט00
(ת 60 = ז6טותטת
ניתן אפילו להשתמש באופרטור ++, יחד עס שם של משתנה, כהוראה בפני עצמה:
(ז6טותטת++
אם מציבים את האופרטור ++ בסופו של שס המשתנה, הגדלת הערך מתבצעת אחרי סיוס
ביצוע ההוראה. הכתיב הוא:
++9118016/
התבונן בגרסה שונה של התוכנית הקודמת:
()תוגות
(
(1=0ת 00 ]ח1
;(ותנוס6 ,"מ%0 15 ]תוס ]פזו] 6ם'ך"₪]ומוזק
;(++ותנוסס ,"מ%0 15 ותגוסס 56006 סתידי)]ותוזק
;(תט00 ,"ח%0 5 ותטסס 01 8[6ץ 1851 סת'ך")!ותוזק
]
האופרטור ++)תטסס מגדיל את הערך של המשתנה אחרי ביצוע הוראת ()!ומוזק השנייה.
הוראת ()!)תוזק השנייה מציגה לפיכך את הערך המקורי, כפי שניתן לראות בפלט הבא:
0 15 001 )1118 6מיך
0 15 )תטסס 860006 6תך
1 בגאו ]תוס 01 4]₪6 185 6מך
הערך של המשתנה הוא 0 כאשר מתבצעות הוראות ()))תגזק הראשונה והשנייה. הערך גדל
ל-1 לפני שמתבצעת הוראת (א)תנזק השלישית.
ניתן להשתמש באופרטור התוספת כדי להקצות מחדש את הערך המקורי של משתנה
ולהגדילו, במהלך אחד, כמו בתוכנית הבאה:
()תופות
(
016 ססות ]1
("ז6וחטת 6 0 6 186 ז6ות")פונוק
;(061ותטות:8 ,5080])"%6
(++061ותת=5)01806
|(3101980 ו'ה%0 או סנו[ [8מ1ק1זס ווק
|(זסטתנות ,"96 15 ₪6[ צוסת 6ם'1'")]ותוזק
4 13 פרק 6: סימני פעולה (אופרטורים)
הפקודה:
++001ותת=3101326
מקצה תחילה למשתנה 5101386 את הערך של המשתנה ז6טחחטת, ואז מגדילה את הערך
של ז6סמזטת באחד.
האופרטוריס להפחתה קבועה פועלים באופן דומה, אולס מקטינים את הערך של המשתנה
באחד. הם נכתבים כך:
6 -- מפחית 1 מערכו של המשתנה לפני ביצוע ההוראה.
--8118016 מפחית 1 מערכו של המשתנה אחרי ביצוע הפעולה.
אוגרים
גם אוגר מגדיל את ערכו של משתנה, אולס במקוס להגדיל תמיד את הערך במספר קבוע,
הגידול משתנה - כלומר, יכול להשתנות בכל פעולה. צורת הכתיב הכללית היא:
86 066 + 9118016 = 918016
אלגוריתס זה נקרא אוגר מכיוון שהערך ממשיך להיאגר. לדוגמה, התבונן בהוראות הבאות:
6סתתנום ,10181 )ת1
) = ]1068
;(061תנות62 ,"1)"%0ת308
6 וחטת + [0/4] = [014+
נניח שאתה מזין את הערך 10 כערכו של המשתנה זססותטום. אחרי ביצוע ההוראה
ות + 10191 = [1018
הערך של [104 הוא 10. המחשב ביצע את ההוראה על הערכים הבאים:
+ 0 = 1081
כעת, נניח שאתה מבצע את הוראות ()/ם504 והאוגר פעס נוספת, ומזין את הערך 15:
((61סחנות:6 ,"1)"%6ת508
|6סותטת + [018] = [0)8+
במקרה זה, המתשב יבצע את ההוראות תוך שימוש בערכים:
5 + 10 = ]1009
אתה אוגר את הערכים של המשתנה זסטוחנות.
תוכנית 67 מקבלת קלט של שלושה מספרים ומחשבת את הממוצע שלהם. ניתן היה
להשתמש בביטוי פשוט כדי לחשב את הממוצע:
2+0(3+) = 6הַז0/ב
אלגוריתמים שימושיים לעיבוד נתונים 5 1
השתמשנו באוגר כדי לסכם את המספרים ובמונה כדי למנות את העיולים - לצורך הדגמת
אופן השימוש בהס. בפרק 9 תלמד כיצד להשתמש באלגוריתמים אלה באופן יעיל ביותר.
תוכנית 6.7: שימוש במונה ובאוגר כדי לחשב את הממוצע של
שלושה מספרים
/*6708001.0צה8*/
()חה81ח
81 ,000% ,0%81+ ,( ה6טחהטה +108+
]0 = 0%81+
07 = %חש00
;(" :ת6סהטה 1178% 6הת+ 68+הם")+%ה1חק
; (ה6פהטה8 , "+%")0%ה908
; ח6סחטת =+ 0%81+
++0000%
;(" :80הטה 860000 8ה+ ח6+הם")+צה1חם
; (ה6סחטה8 , "%%")1ה508
; ת6פהטת =+ 0%81+
++0000+%
;(" :הפטה 0ת1ה+ פת+ 68+ה%1)"5ה1חק
; (ח6סחטח8 ,( "%%")+ה508
; הפטה =+ 0%81+
++0000%
8/67806 = 10%81/ 000;
; (80008068 ,"%% 15 8/87808 פהך")++ה1חק
אוברטורים עול הקצאת ערכים
האופרטוריס המשמשים להקצאת ערכיס הם למעשה אוגרים הרשומים בכתיב מקוצר:
אופרטור דוגמה מקביל ל-
+ ]תטוסותג =+ [1004 ]וסנת + [04) = [1018
=- ]500 =- [1018 ]900 - [1064 = [1018
=* 6 א8) =* [1014 6 8 * 1001 = [1018
=/ 60 =/ [1014 ]00 / [1014 = [1018
=% 00 =% [1018 ]טס % [1014 = [1018
6 13 פרק 6: סימני פעולה (אופרטורים)
כל אחד מהאופרטורים מבצע פעולה תוך שימוש במשתנה בו מוצב הערך בתור הגורס
המשותף. כדי להמחיש את אופן פעולתם, התבונן בתרשים 6.11. דמיין לעצמך שעותק בלתי
נראה של המשתנה וסימן הפעולה שמשמאל לתו השווה - עוברים לצידה הימני של
תרשים 6.11
זחטסוחג = + סז האופרטור של הקצאת
ערכים
+ ו1080
/
סרג = + |ג10%
סרג + |1014 = |0%ז
המשוואה. ההוראה
6 =* [1008
זהה להוראה
10/81 = 1018[ * 6
הקצאת ערכים התחלחיים
חובה להקצות ערכיס התחלתיים לכל המונים והאוגרים. זכור, שני האלגוריתמיס מוסיפים
ערך כלשהו לערך הנוכחי (או מפחיתים ממנו). אם לא מקצים למשתנה ערך התחלתיו
המספר מתווסף לתוכנה האקראי, הבלתי ידוע, של כתובת המשתנה. הקצאת ערך התחלתי
מנקה את כתובת המשתנה, בדומה להקשה על מקש :00163 במחשבון.
לדוגמה, התבונן שוב בתוכנית 6.7, המחשבת את הממוצע של שלושה מספרים. נניח
שכתובתו של המשתנה [4018 מכילה את הערך האקראי 1827. אם התוכנית אינה כוללת את
פקודת ההקצאה
10181 = 0
ואתה מקליד את המספר 75, האוגר הראשון יבצע את הפעולה החשבונית כך:
5 + 1827 = [1014
הקצאת ערך התחלתי אפס למשתנה מבטיחה שהפעולה החשבונית תתבצע כהלכה, כך:
5 + 0 = [1004
אלגוריתמים שימושיים לעיבוד נתונים 7 13
( וב התוכניה
עתה, לאחר שלמדת כיצד לבצע פעולות מתמטיות בעזרת אופרטורים, הלוגיקה של
התוכנית עשויה להיות מתותכמת יותר. עליך להקפיד ולוודא שהתוכנית אכן משיגה את
התוצאות הנכונות. הבה נבחן מספר דוגמאות.
היזהר מעוג'אות לוגיות
בתחילת הפרק (תוכנית 6.4) הצגנו כדוגמה תוכנית שמחשבת שכר שבועי. ניתן לקמפל את
התוכנית ללא שגיאות ולהריץ אותה מספר רב של פעמים - לפני שתתגלה העובדה
שהתוכנית כוללת פגם משמעותי - היא מניחה שכל אחד מהעובדים עובד לפחות 40 שעות
בשבוע, או שהוא מקבל תשלוס עבור 40 שעות לכל הפחות. אם ההנחות האלה נכונות, אין
כל בעיה. אך מה בדבר עובדים שצברו פחות מ-40 שעות עבודה, ושזכאים לתשלום רק
עבור שעות העבודה בפועל! אם נזין לתוכנית מספר הקטן מ-40 שעות, החישוב לא יהיה
מדויק עבור עובדיס אלה. הבעיה טמונה בחישוב:
((2 * 6גז) * (40 - פזטסו)) + (10בז * 40) = 10181
ראשית, גס במקרה שעובד צבר פחות מ-40 שעות, מספר השעות המוכפל בתעריף, בביטוי
6 * 40, יהיה עדיין 40. שנית, התוצאה של הביטוי 40 - פזטסו! תהיה מספר שלילי. ערך
שלילי זה יוכפל בתעריף הכפול ויתווסף לשכר עבור שעות עבודה רגילות. כאשר מוסיפים
מספר שלילי, מבצעים למעשה פעולת חיסור. לפיכך, העובד יפסיד שכר בתעריף כפול עבור
כל שעת עבודה שעבד פחות מ-40 שעות.
בפרק מאוחר יותר נפתור את הבעיה הזו. בשלב זה, חשוב יותר להבין את הבעיה מאשר
למצוא את הפתרון.
חבש תבניות חוזרות
תוך כדי עבודת התכנות, נסה לאתר תבניות חוזרות. חפש הוראות שניתן להשתמש בהן
יותר מפעם אחת, או הוראות שחוזרות בשינוייס קטניס בלבד. הבחנה בתבניות מקלה על
הבנת האופן בו פועלת התוכנית, ומכאן - מקלה גם על כתיבתה של תוכנית דומה
בהזדמגות אחרת.
לדוגמה, תוכנית 6.2, שעושה שימוש בחילוק מספרים שלמים לחישוב עודף, כוללת תבנית
חוזרת. גסה לאתר את התבנית התוזרת בסדרת ההוראות הבאות:
0 ות =1105ת16
0 % |תט120=8110
0 =955ת160
110=120 * 0
5 110 =65ש18
065 = 110 * 5
8 13 פרק 6: סימני פעולה (אופרטורים)
שיס לב שהמשתנים בצידן הימני של המשוואות מופיעים פעמיים - פעט אתת עם אופרטור
החילוק /, ופעם אחת עם האופרטור %. שיס גם לב שהתוצאה של כל פעולת שארית
משמשת בביטוי הבא אחריה. תרשים 6.12 מדגיס את התבנית החוזרת.
תרשים 6.12
תבניות חוזרות
90 10 1008 בתוכנית החזרת העודף.
7700 1/2070 טסה = 65ח6/א1
משתנה וערך מילולי חוזריס / ש
בסדרות של שתי הוראות
,0 % זחטסוחג = 20]
₪ 7%
התוצאות של פעולות 6
השארית הופכות למשתנה 0 20 = 5ח%6
עבור הסדרה הבאה | ז
10 = 20 % 0
₪
11005 = ]10 / 5;
0085 = ]10 % 5;
ניתן בקלות להרחיב את התוכנית על ידי החלת התבנית על רמות נוספות. לדוגמה, אם
ברצונך להשתמש גם בשטרות בני חמישים דולר, יש להכניס בתוכנית את השינוי הבא:
;0 תטסותה=11165
0 % 1ת00ו150=81
0 110655ת6/ו1
(0 % 50ז=120
שתי ההוראות החדשות שמתווספות לתוכנית בגויות באותה תבנית. ההוראות המחשבות את
מספר השטרות בני עשרים הדולר עוברות שינוי קטן בלבד.
איחור ותיקון תקלות
אם אינך בטוח במידת הדיוק של הפלט, נסה להוסיף לתוכנית הוראות ()!)חוזק. חלק את
התהליך למספר גדול ככל האפשר של פעולות נפרדות. אתרי כל פעולה שמשנה את הערך
עיצוב התוכנית 9 13
של משתנה, הכנס הוראת (ותוזק המציגה את תוכנו, גם אם אין צורך לראות את הערך
בפלט הסופי של התוכנית.
הרץ את התוכנית והתבונן בפלט של אותן הוראות ()])פוזק נוספות. השווה אותו לערכים
שציפית לקבל. הפלט השגוי הראשון יכוון אותך אל הבעיה. לדוגמה, אס מוצג הפלט הבא
בתוכנית חישוב השכר השבועי:
50 זג1681
2- 15 68/18
0 15 6ח1] 6
ברור מייד שמשהו לקוי בערך השלילי של המשתנה 3ז1א6. ניתן להניח שמיקום הבעיה הוא
לפני הוראת ()!)תוזק שמציגה את המשתנה. אחרי תיקון הבעיה, אפשר למחוק את השורות
המיותרות.
לוה
1. מה ההבדל בין האופרטור / לבין האופרטור 1%
2. האם ניתן לשלב טיפוסי נתוניס שוניס בפעולה חשבונית אחת! אס כן, כיצד
ישפיע הדבר על תוצאת הפעולה?
3 מהו ביטו?
4. היכן ניתן להשתמש בביטוי!
5. תאר את סדר הקדימויות.
6. מדוע יש להשתמש בסוגריים בפעולות חשבוניות!
7. הסבר את ההבדל בין 1+)תנוסס=!חנוס0 לבין ++!)תטסס.
8. מהו אוגר!
9. תאר אופרטור של הקצאת ערכיס.
0. מה ההבדל בין ]תטוסס-- לבין --1תנוסס!
ךז רגילים
1. כתוב תוכנית המחשבת מה יהיה גילו של המשתמש בשנת 2000.
2. כתוב תוכנית המחשבת את החוקה הריבועית והתזקה השלישית של מספר
המוזן באמצעות המקלדת.
120 פרק 6: סימני פעולה (אופרטורים)
3 כתוב תוכנית שממירה נתוני טמפרטורה מפרנהייט לצלזיוס. נוסחת ההמרה היא
(611-32ת6זת5.0/9.0())8) = 0619108,
4 שנה את התוכנית שכתבת בתרגיל 3, כך שתציג את הפרש הטמפרטורה בין הערך
המוקלד לבין נקודת הקיפאון, הן בצלזיוס והן בפרנתייט.
5. הסבר מה לקוי בתוכנית הבאה:
6 1816 אג) 6ת406/1
()ת1 ו
|
0
;(" :וחסו1 16 0 16 ז6זמת')!ותוזק
0080 "0
((" :018186 קתוקקגוופ 6 זסותת')]ותוזק
תוקקת 85 %1%") 508
קקפ + 1816 18% * ופסס + 0051 = [108
0 5 [גזס) 6די )תוזק
110
-
1
כ'33 8/0//ת הסו[ק3'/ת
פּש
₪ ₪
₪
4 2% / ם תערוס את כל חפציך בערימה אחת על הרצפה, תתקשה למצוא פריט
) /
ג 4 מסוים. כדי שניתן יהיה למצוא כל חפ בקלות, אתה ממיין את תפציך
מראש ומניח אותס על-גבי מדפים. כאשר אתה זקוק לתפף כלשהו, אתה יודע בדיוק
היכן למצוא אותו.
גם תוכנית המחשב שלך עלולה לסבול מאי-סדר דומה. ככל שהתוכנית גדלה, עבודה
עס פונקצית ()םו14 גדולה אחת נעשית קשה יותר. אינך יכול להניח את קוד
התוכנית על גבי מדפים, אבל אתה יכול לתלק את התוכנית לפונקציות.
13
תרשים 7.1
מספר קריאות לפונקציה.
פונקציה היא סדרה של הוראות שמבצעות ביחד מטלה מסוימת. באפשרותך לכתוב
פונקציות משלך ולהשתמש בהן בדיוק כמו שאתה משתמש בפונקציות הכלולות בספריית
פונקציות של שפת 6 או שפת ++6. אתה קורא לפונקציה כדי לבצע מטלה, ויכול גס
להעביר ארגומנטים אל הפונקציה וממנה.
הפונקציות שימושיות במיוחד במקריס בהם עליך לבצע אותן הוראות יותר מפעס אחת.
לדוגמה, אס התוכנית שלך מציגה מידע רב על-גבי המסך, יהיה עליך להשהות את התצוגה
כאשר המסך מתמלא. במקוס להקליד את ההוראות הגורמות להשהיית התצוגה בכל פעס
שעל התוכנית לעשות זאת, באפשרותך להקליד אותן פעס אחת בלבד לתוך פונקציה נפרדת,
ואז לקרוא לפונקציה בכל פעם שיש צורך להשהות את התצוגה, כמודגם בתרשים 7.1.
וגח
/
:רגוס תגוס תג!סחגוס תגוס ג81')פוט
:גוס גו תג'סחגום תגי ת813')פוטכ
,"תגוס תגוס תגוטתגום תגום תב81') וטק
;(חגוס חגום חגוסתגום הגוס חג81')פווק
:תגוס חגום חגוסתגוט הגופ חגו8")פוטם
("תג'ם תגוס חגוסתגום הגוס תגום')פוט .
;("תגוס חגוס תגוסת3ום גוס חגו8')פוטק
."תגוס תגוס תג!מתגום תגוס תגופ')פוטק
:0 לל.,
:"גוס הגוס חגומתגוט תגום חבו8")פוו -
תגוס חגום חגופתגום תגוס חגום')פוטק
,"תגוס חגום חג!סחגוס חגום חבו')פונו
;("חגוס חגום תג!סת גוס תגופ תגו8')פוט
:רגוס הגוס תגוסחגוס תגוס תגו8')פווק
0 ל
(חגום חגום תגוסתגוס חגום תגו8")פוטם 4
;תגוס חגום תגוסחגוט חגים תבופ")פוק /
,תגוס תגוס חג!טח3ופ תגוס ח3ו8')פוטם
:("ת3!ס תגוס תג!מחגוט תגוס חגו8')פוט
:תגוס חגום הגוטחגוס חגום חגו8")פוו
ל
:("חגוס תגוס חגוס גו תגוס חגו8') טוט
;"תגוס חגום תג|סתגופ תגוס תגופ')פוטק
("חגוס חגום תגוסת'גום תגוס תגום")פוטק
;תגוס חגום תג!פח3ופ תגוס חגו8")פוטק
:חגופ חגום תגוסתגוס הגוס חגו8')פוו
כותבים את הנונקציה פעס
אחת בלבד, וקוראיס לה
. לפי הצורך.
:חס שוח זה
;(6טחו1ח 60 10 זוה 655זקי) חח
;10 ם חס סח
;(0)חחטוו
ניתן להשתמש בפונקציות גם לסייע בארגון של תוכנית קשה. נסה לחלק את התוכנית
לקטעים שכל אחד מהם מבצע מטלה שלמה נפרדת. אם אתה מתקשה בכתיבת קטע
כלשהו, חלק אותו שוב לקטעים קטנים יותר. המשך לחלק את התוכנית לקטעים :ותר
ויותר קטנים, עד שתוכל לכתוב את ההוראות המבצעות כל אחת מהמטלות. כל קטע כזה
ניתן להכניס לפונקציה משלו. ברגע שכתבת את כל הפונקציות הנפרדות: וקישרת ביניהן
בתוך הפונקציה הראשית ()תוגות, התוכנית מוכנה!
144 פרק 7: כיצד פועלות הפונקציות
ו בצונקציות
את הפונקציות שכתבת יש להציב אחרי הסוגר המסולסל המסמן את סופה של ()תוגתז.
המבנה של כל אחת מהפונקציות דומה למבנה של ()םוגמ, כפי שמודגס בתרשים 7.2. כמו
ב-()מוגת, אחרי שס הפונקציה מופיעים סוגריים, ללא נקודה-פסיק בסוף הביטוי.
ההוראות הכלולות בפונקציה תחומות בתוך סוגריים מסולסלים.
תרשים 7.2
מבנה הפונקציה.
שם הפונקציה
הוראות
תוחס פותת
4% 8 0 פחסוזסטזזפחו 6ח1 || */
. / ( זז תוחס סוגר
9-ו
חזור להוראה הקוראת
בעת שאתה קורא לפונקציה, המחשב מבצע את ההוראות הכלולות בפונקציה וחוזר
לפקודה המופיעה מייד אחרי הקריאה לפונקציה. בקומפיילרים מסוימים אין צורך לכלול
את הפקודה (0)תזטו6ז - 6 חוזרת לפקודה שאחרי הקריאה לפונקציה באופן אוטומטי,
מייד עס סיום ביצוע ההוראות הכלולות בפונקציה.
הפקודה ()חזטזפז וקומפיילר 00ש
זכור, קומפיילר 5060 המופיע על התקליטון המצורף לספר אינו
מקבל את צורת הכתיב:
;חזטזסז
במקום זאת, השתמש באחת מצורות הכתיב הבאות:
;()חזטזסז
;(0)חזטזסז
0₪00 ₪080 06-ש-- 064 062-6280085 167060 ₪ 762 הש אש-0ש₪/ שר 088 0ש> ₪098
לדוגמה, תרשיס 7.3 מדגיס תוכנית שמציגה שאלה ותשובה. המספרים מצייניס את סדר
זרימת התוכנית.
שימוש בפונקציות 5 1
תרשים 7.3 ()חגוח
קריאה לפונקציה. [
0 זחו
:('ח?א1 חו 6ז8 0195 עחגוח שוסז')1נום
9 ('ח5%01ח3 106 101 זסזח6 655זק")פזטום
( ()8050=0610087
0 /* ()ז5 ח ח| 05ח8חח00 8חז סם */ ;()זפשופחג
ו ;(0)ח זז 9
50
/ |
9 "16 ח| 195ע0 1024 6ח1 פזה 858חד')פוק |
** ()חוגוח 10 280% 760/ ;(0)תזטזז --"
ו
הפקודה ()ז6עופת8 הכלולה בתוך ()תוגות קוראת לפונקציה, בדיוק כפי שמתבצעת קריאה
לפונקציה הכלולה בספריית 6. אולס, הקוד של הפונקציה ()61אופת8 נמצא בתוכנית עצמה,
במקוס בספרייה. אחרי שתי פקודות ()פוטק הראשונות בתוך ()מנגוז, הפקודה
ו
קוראת לפונקציה. אין צורך להעביר פרמטרים ל-()ז6אופת4, מכיוון שהפונקציה כוללת את
כל הנתונים הדרושים לה לביצוע המטלה. בשלב זה מתבצעת הוראת (()פונוק שבתוך
()זס/ופתג, והפקודה (0)מזג16 מחזירה את הקומפיילר אל ההוראה המופיעה מייד אחרי
הקריאה לפונקציה. הפקודה (0)תזט)6ז שבתוך ()ת41וז מטיימת את התוכנית.
מבחינת המחשב, סדר ביצוע ההוראות הוא כדלקמן:
("181 ת! 6ז3 05וע0 גת אוס11')פוטק
;("ז50ח3 16 101 זסות 655זק")פוטק
((810 2610 = טפ
תג
(".18 חו 65ועל 1024 816 616ם1")פ)טק
(00תז 16
זנ
66 1 פרק 7: כיצד פועלות הפונקציות
ניתן לקרוא לפונקציה מכל מקוס בתוכנית, אפילו מתוך פונקציה אחרת. כאשר הקומפיילר
נתקל בפקודת (0)םזנ6ז, הוא מחזיר את השליטה לשורה הבאה מייד אחרי הקריאה
לפונקציה. תוכנית 7.1 כוללת שתי פונקציות שנכתבו לבד (כלומר, שאינן פונקציות ספרייה).
הפונקציה הראשונה, ()תס1ופסוף, נקראת מתוך ()תוגות. הפונקציה השנייה, ()ז6עופתה,
נקראת מתוך ()ם6)!0ט). הפקודה (0)םזט60ז שבתוך ()ז6א5ת8 מחזירה את השליטה
ל-()ת65110טף, שמחזירה אותה לפונקציה ()תוגוח. להלן הפלט של התוכנית, כשלצד כל
שורה מופיעה הפונקציה שמציגה אותה:
()תוגות .03116056 5796 16] 0) 6נמססן[6
(0ת65110ט | .11070501 נמסז] 1806ז16ת1 סותקהזק 8 6ותגצן
(0ת10ו05טף .זסאופתה 16] 107 ז16תם 658ז
(610 שח .5ו00ת1/ 15 זאופת3 6
()ם1גות .6 זג זטסץ ז0] פאתגתך
תוכנית 7.1: קריאה לשתי פונקציות
/]*122.0ט0*/
()ה81ח
ָ
; ("ה. 6ה008118 א6סץ5 8ה+ 0+ 610086א")5+טק
; ()0085+100
; ("ה.06ָ8ה8+70ק תטסץ "0+ 6אההתד")65טק
; (96%000)0
1
()ה0085+10
1
;חס 8עס₪ צה1
; ("ה.+₪107050% ה0ק+ %671806ה1 10הק8 8 8ההא")פ+טקם
; (ה".5000ה8 8ת+ 108 %68הם 658ת%5)"0טק
; ()6+07086[=ה0 6טסח
; ( )850
; (6%000)0ת
1
()5000ח8
ָ
; ("ה. 100005 15 8%א5ה8 8תד")5+טם
; (070)0ז6ת
שימוש בפונקציות 77 1
118
השימוש הטוב ביותר בפונקציות הוא לצורך ארגון התוכנית לחלקים נפרדים. בתוך ()תוגוח
מבצעיס 'פעולות משק-בית", כלומר - הצבת התוכנית וקריאות לפונקציות השונות. ניתן
לראות זאת בתוכנית 7.2, המהווה עיבוד של תוכנית החידון. בתוכנית 7.2, ()ת1פווז כוללת אך ורק
קריאות לפונקציות. ה"עבודה" של התוכנית מתבצעת בפונקציות המופיעות אחרי ()תואחז.
תוכנית 7.2: שימוש בפונקציה ()חוגּחו לקריאה לכל יתר הפונקציות
|*123.0ט0*/
()חג8ח
; ( ) 616078
; ()0085%100
; ()50ח8
; ()0ה6 6ה+
; (8%000)0ת
ָ
/
610008 ) (
; ("ה.06ה08116ה0 506% 6ה+ 0+ 610086)")פ+טם
; ()התטצ0ת
ָ
/
()ה85+10ט0
;חס ₪046 צחב
;("ה.+0107050% 1700 806+%67%ה1 10ה0080 8 6ההא")5+טקם
; ('"ה.8060ה8 8ה+ 107 %88הם 78655ק")%5טק
; ( )6%0088[=חס 6צסח
; (0)הקעצ8ת
ָ
/
()050ח8
; (ה". 1000605 15 88668 6תד")5+טק
;חתט+6ת
ָ
1
()0ה6 6ת+
; ("ה.806ה0/+8ק תטסץ "10 טסץ אהההד")5+טק
; (61000)0ת
פרק 7: כיצד פועלות הפונקציות
/
מבנה זה מקל על איתור השגיאות. לדוגמה, אם מתגלה בעיה בהצגת התשובה, חפש את
השגיאה בפונקציה ()ז6א8ח8.
הפונקציות מבוצעות על-פי הסדר בו הן נקראות, ולא על-פי סדר הופעתן בתוכנית. יכולנו
להציב את הפונקציות בתוכנית 7.2 גם בסדר הבא:
()חנגות
(0ז5/0ח3
(160ת6100ע
(/4ת6 16
(0ת10ו5סטף
והפלט לא היה משתנה, מכיוון שהפונקציות נקראות בסדר הנכון מתוך ()מ41וז.
1 שתנים בצונקציות
כאשר התוכנית כוללת פונקציות נוספות, מלבד ()מ41וח, יש לשקול היכן וכיצד להכריט על
המשתנים. 6 כוללת מספר טיפוסי משתנים. בפרק זה נבחן את המשתנים האוטומטייס,
החיצונייס והסטטיים.
משתנים אוטוולטיים (מקוליים)
פונקציות מסוימות זקוקות למשתנים או קבועיס משלהן. לדוגמה, הבה נבחן את הבעיה
של השהיית התצוגה על המסך אחרי הצגת סדרה ארוכה של הודעות. ניתן להשהות את
התצוגה בעזרת ההוראות הבאות:
;("6טמ1!ת60 0) ע6א עתג פפסזק")))תוזק
(6010 = תס 6טסות
ובמקרה שעליך להשהות את התצוגה מספר פעמיס במהלך התוכנית, הצב את ההוראות
האלה בתוך פונקציה נפרדת. לאחר מכן, בכל פעם שיש להשהות את התצוגה, כל שעליך
לעשות הוא לקרוא לפונקציה. מכיוון ש-()86041 זקוקה למשתנה, עליך להכריז על
משתנה בתוך הפונקציה, כך:
(8₪560ק
(
;חס 6שסו )ח1
;("6טח!]ת60 10 ע86 עתג 21655")]!ותוזק
(10 260 = תס 6טסתת
10
)
משתניסם בפונקציות 120
10
המשתנה חס 6טסוז הוא חלק מהפונקציה ()6פט8ק. מכיוון שהוא מוכרז בתוך פונקציה, הוא
מכונה משתנה מקומי לאותה פונקציה. משתנה מקומי מוכר רק על ידי הפונקציה בתוכה
הוא מוכרז. בשפת 6 נקרא משתנה כזה אוטומטי.
חשוב על כך. אס אתה מכריז על משתנה בתוך פונקציה, הוא מוכר רק במסגרת אותה פונקציה.
הדבר נכון גם לגבי משתנים שמוכרזים בתוך הפונקציה ()תופות. עיין בתוכנית הבאה:
()חוהות
|
;חס 6טסוח )ח1
;("הת5066 116 [[1] 1081 16558865/")פוטוק
5 )0 501165 8 06 6]ו0/ו 6ז16] */
/* ת50166 16 [111 )18
0
]
(960ו
|
;("סטת1)ת 60 10 %6 עתה 658זק")]]מוזק
61010 = תס 6שסות
;(00תזט16
]
הקומפיילר יציג הודעת שגיאה מכיוון שלא ניתן להשתמש במשתנה תס 6טסות בפונקציה
()856ק. המשתנה הוכרז בפונקציה ()ת1גוז. לפיכך, הוא נחשב משתנה מקומי לפונקציה
()תוגגת, והוא בעל משמעות אך ורק כאשר עושים בו שימוש בתוך ()תוגות. כדי לפתור את
הבעיה, עליך להכריז על המשתנה תס 6טסהז בתוך הפונקציה ()856ק.
מכיוון שמשתנה אוטומטי תקף רק בתוך הפונקציה בה הוכרז, ניתן להעניק שם זהה
למשתנים שמוכרזים בפונקציות שונות. בתרשים 74, המשתנה ששמו 886 מוכרז הן
בפונקציה ()תוגות והן בפונקציה ()86ט0ק5. כל אחד מהס הוא משתנה אוטומטי, או מקומי,
לגבי הפונקציה שבתוכה הוא מוכרז. כלומר, בתוכנית זו ישנס שני משתנים שוניס בעלי שם
זהה. כל אחד מהם יכיל ערך משלו שיאוחטן בעמדת זיכרון נפרדת. המחשב מבחין ביניהס
ויודע איזה משתנה 386 ברצונך להציג לפי הפונקציה בה כלולה הוראת ה-())!מוזק. כאשר
המחשב מבצע את הוראת ()!ת!זק שבפונקציה ()6פטסק5, הוא מציג את המשתנה 886
האוטומטי לפונקציה זו. כאשר המחשב מבצע את ההוראה ()!)חוזק שבפונקציה ()ת1גחז,
הוא מציג את המשתנה 86 האוטומטי לפונקציה ()תו4ות. המחשב שומר בזיכרון שני
משתנים נפרדיס ששמם 6א4.
פרק 7: כיצד פועלות הפונקציות
תרשים 7.4
1 משתנים מקומיים
()חוגוח יכולים להיות בעלי שס
המשתנה 896 מוכרז ן זהה בפונקציות שונות.
- בפונקציה ()ח81וח : 1
- 6 זו
(':900 זטסץ זסזחם")זחחזם
50801)"%0", 8806((
0
((806 ,'%0 15 306 זטס/")שחוזם
)
משתנה 886 נוסף מוכרז ()500056
בפונקציה ()500₪56 /
6 6 זו
,("-800 500050'5 זטוסץ ז16ח6 855זק")זחוזם
0)", 8900(
(406 ,"ח%0 15 806 500050'5 זטסץ")חוזם
;(0)חזטז0]
משתנים חיצוניים (גלובליים)
משתנה חיצוני הוא משתנה שניתן להשתמש בו בכל פונקציה בתוכנית. בשפות תכנות
אחדות מכוניס משתנים כאלה בשם משתנים גלובליים. כדי שמשתנה ישמש כמשתנה
חיצוני, יש להכריט עליו לפני הפונקציה ()ח41חז, כך:
[קות ]תו
()מנגות
בדוגמה זו, המשתנה קות6! הוא משתנה חיצוני. לפיכך, כל אחת מהפונקציות בתוכנית
יכולה לעשות בר שימוש. עיין בתוכנית 7.3. מכיוון ש-קותפו הוא משתנה חיצוני, ניתן
להשתמש בו בפונקציות ()תוגות, ())זפטחסס, (/16920 ו-(11סט. הערך מוזן למשתנה
בפונקציה ()תוגוח, ויתר הפונקציות :משתמשות בו לצורך ביצוע החישובים הדרושים.
התוכנית עושה שימוש במשתנה נוסף - פט9פ!6ס. מכיוון שהפונקציה היחידה שזקוקה
משתנים בפונקציות 1 5 1
למשתנה זה היא ()ו6ץתסס, הכרזת המשתנה מתבצעת בתוכה. זהו משתנה מקומי
לפונקציה ())זס/תסט, ולא ניתן להשתמש בו במקום אחר בתוכנית.
תוכנית 7.3: שימוש במשתנה חיצוני
]*0.0 0+ +*]
;0+ %ה1
()חבח
ָ
%*: 5-8 8 פטקה1")++ה1פק
; (קח8+6 , "5081)"%0
; ( )00
; ()08020+
; ()011ט
000080%)(
ָ
+108ְ6%56 1
0615108 = )5.0/9.0(*)+600-32( ;
; (0815108 (קח6 "ה 815105 0007065 +%6.2 56 =" 6000065 %0")+צת1חקם
; (00+000)0
1
+78620)(
ָ
; (5600-32, "ח%ח01ק 8ה78621+ 8 1000 6000668 %0 18 1)"1%+הגחם
; (0)הפע6%ת
1
011)(
1
; (קח6+-212 , "ה%ה1סק הַה111סם 8 1700 0000008 %60 15 %1)"1%ה1חם
; (%000)0+96
1
אס התוכנית כוללת משתנה חיצוני ומשתנה מקומי בעלי שס זהה, הפונקציה תשתמש
במשתנה המקומי. היא אינה יכולה להשתמש בשניהם.
2 15 פרק 7: כיצד פועלות הפונקציות
מעשתנים סטטיים
משתנה אוטומטי (מקומי) מתקיים רק בשעה שהפונקציה בתוכה הוא מוכרז מתבצעת.
כאשר הפונקציה מתחילה להתבצע, מוקצית למשתנה עמדת זיכרון. עס גמר ביצוע
הפונקציה, משתחררת עמדת הזיכרון והמשתנה חדל להתקיים.
אם הפונקציה מבוצעת יותר מפעם אחת, המשתנה המקומי נוצר מחדש בכל פעס
שהפונקציה מתחילה להתבצע, ובכל פעם עשויה להיות לו כתובת זיכרון שונה. הערך
המאוחסן במשתנה אובד בכל פעם שביצוע הפונקציה מסתיים.
באפשרותך לשמור על הערך של המשתנגה המקומי גם כאשר הפונקציה מסתיימת. לשס כך
עליך להכריז על המשתנה כמשתנה סטטי. ההכרזה מבוצעת כך:
()סחט) ערת
|
;]60 1ח1 5)8]10
]
למשתנה סטטי מוקצית עמדת זיכרון קבועה, למשך כל זמן הרצת התוכנית. כאשר מטתיים
ביצוע הפונקציה, עמדת הזיכרון אינה משתחררת אלא ממשיכה לאחסן את הערך שהיה
למשתנה בעת שהפונקציה הסתיימה. זה יהי ערכו של המשתנה בפעס הבאה שהפונקציה
תבוצע. זכור שמדובר עדיין על ערך אוטומטי (מקומי), שניתן להשתמש בו רק בפונקציה
בתוכה הוכרז.
עיין בתוכנית 7.4, שאינה משתמשת במשתנה סטטי. הפונקציה (4016 מבוצעת ארבע
פעמים. בכל פעס שישנה קריאה לפונקציה, מקבלים שני המשתנים את הערך 0, והערכים
מוצגים בהוראת (!חוזק. עס סיוס הפונקציה מתווסף הערך המילולי 1 לכל אחד
מהמשתנים. עס זאת, המשתנים משתחררים אחרי כל ביצוע של הפונקציה ומקבליס מחדש
את הערך 0 בפעם הבאה שהפונקציה מבוצעת. הפלט הוא לפיכך כדלקמן:
0 15 5180091 | 0 15 ז8010/8
0 5 5191091 = 0 85 ז008)טה
0 15 זגט5)91 | 0 15 ז0/8)ט3
0 0 5 0087ב
תוכנית 7.4: הדגמת השימוש במשתנים מקומיים
/|*0.+%8+8*/
()ה1הח
ָ
001)( ;
001+)( ;
0015)( ;
001+)( ;
משתנים בפונקציות
13
1
()001%
/
1 = 80%0%8% 10%
0%
(918%%88 ,80%0%88 ,"ה%0 15 5%81087 %0 15 80%0088")++ה1חק
הה/+5+8 10%
ו"
; 80%0088++
; ה8ש+9%8++
; (0)התשז8ת
/
כעת, נשנה את ההכרזה בפונקציה ())601 וניצור משתנה סטטי:
(0 = 5101/81 1ח! 3/8110
כאשר מריצים את התוכנית עם משתנה סטטי, הפלט המתקבל הוא:
0 5 8191087 = 0 15 ז8ט0)ה
0-1 5 זה/סוטה
52 8 | 0 15 ז008זטה
3 15 519197 = 0 15 10081
בפעם הראשונה שהתוכנית מורצת, מוקצה למשתנה :58/8 הערך ההתחלתי 0. ההכרזה
על המשתנה כמשתנה סטטי, עם זאת, מורה לתוכנית לשמור בזיכרון את הערך המאוחסן
במשתנה בעת שהפונקציה מסתיימת. עם סיום הפונקציה בפעס הראשונה, ערך זה הוא 1 -
מכיוון שהשתמשנו באופרטור ז518)/9++. כאשר הפונקציה מבוצעת בפעם השנייה, ערכו של
המשתנה עדיין 1; התוכנית מתעלמת מהערך ההתחלתי 0.
בכל פעם שהפונקציה מתבצעת, ערכו של המשתנה גדל ב-1. הערך החדש נשמר בזיכרון
ומשמש כערך התחלתי כאשר הפונקציה מבוצעת פעם נוספת.
ךועברת ב'רמטרים
ישנן מטלות מסוימות שניתן לבצען רק על ידי העברת פרמטר לפונקציה. כאשר מעביריס
פרמטר לפונקציה ()פווק, למשל, יש להקליד את הארגומנט - המחרוזת שאותה רוציס
להציג - בתוך הסוגרייס. הקריאה לפונקציה ()פוטוק מתבצעת בעזרת פקודה כזן:
(("1616%) 111")פוטק
4 15 פרק 7: כיצד פועלות הפונקציות
המתרוזת "6ז6ג! :11" משוגרת אל פונקצית הספרייה (0פווק ומורה לה מהו המידע
שברצונך להציג על המסך.
העברת פרמטרים אל פונקציות שכתבת בעצמך מתבצעת באופן דומה. עליך להקליד בתוך
הסוגריים את כל הנתונים שברצונך לשגר אל הפונקציה. רשימת המשתנים המועברת
לפונקציה נקראת רשימת ארגומנטים.
הבה נבתן עתה מה קורה בצד המקבל. פונקצית הספרייה ()פוגו כוללת הוראה האומרת
'הציגי משהו על-גבי המטך". הפונקציה מצפה שיועבר אליה אותו 'משהו" - פרמטר.
פונקצית הספרייה זקוקה למקום כלשהו כדי לאחסן את המחרוזת המועברת אליה, כפי
שמודגס בתרשים 7.5. לפיכך, גם לה יש רשימת ארגומנטים המכילה את שמות המשתנים
שיאחסנו את הנתונים המתקבלים. ניתן להעביר יותר מארגומנט אחד, בתנאי שמספר
הארגומנטים בפקודת הקריאה לפונקציה, וכן טיפוסי הנתוניס של אותם ארגומנטים -
מתאימים למספר ולטיפוטי הנתונים שהפונקציה מצפה לקבל.
ספריית .6 תוכנית 6
(0חה5)50001זט "1010 ")זט
:
רשימת ארגומנטים
הבה נראה כיצד להעביר ארגומנט לפונקציה שכתבת בעצמך. עיין בתוכנית הבאה:
()הנגות
|
;)טס )תו
5 = |חט0סס
(ת 165000 0
]
(התטת)6010165
ות !תו
תרשים 7.5
יש צורך בארגומנט כדי
לקבל ערך מועבר.
העברת פרמטרים 15
(2 * וחנות ,'%0")]!ותוזק
;(0)חזנו10
1
הפקודה ;(1םטסס)600105 בפונקציה ()ת1וז קוראת לפונקציה ומעבירה אליה את ערכו של
המשתנה !תטסס. הפונקציה ()609165 מקבלת את הערך של הארגומנט ומאחסנת אותו
במשתנה ששמו וחטת. הערך של המשתנה חתות יהיה, לפיכך, זהה לערך של המשתנה
]תטסס. שיס לב שהמשתנה וחטת מוכרז לפני הסוגר המטולסל הפותח את הפונקציה
(40001680. שורה זו נקראת הכרזת הארגומנט והיא מורה לקומפיילר איזה טיפוס נתונים
יתקבל על ידי הפונקציה. רק הכרזות ארגומנטים יכולות להופיע לפני התוחם הפותח את
הפונקציה. אס הפונקציה זקוקה למשתניס נוספים, יש להכריז עליהם אחרי התוחם
הפותח, באופן הרגיל.
להלן שלבי התהליך (עיין גם בתרשים 7.6):
1 מתבצעת קריאה לפונקציה ()165נו60 ומועבר אליה הערך של המשתנה זתטסס.
2 הערך 5 מתקבל בפונקציה על ידי הארגומנט ששמו וחטת.
3 הפונקציה מכפילה את הערך ומציגה את התוצאה בהוראת ()]ותוזק.
תרשים 7.6
העברת פרמטר.
()חוגוח
2 הערך 5 מוקצה
למשתנה )מט00 |
00% זחו
;5 = 00001
(0000165)00071
ערכו של המשתנה ן )
וחטת )0600 |
מועבר לארגומנט | | (החטת)0000165
הכרזה על
------> ;וחטח זחו
ארגומנט
(
(2 * החטח ,"%0")חוזס
)
6 15 פרק 7: כיצד פועלות הפונקציות
הערות ++6
בשפת ++6 ניתן להכריז על הארגומנטים ישירות ברשימת
הארגומנטים של הפונקציה, כך:
(הזטח +הו)165 טס
ו
כפי שניתן לראות בתוכנית 7.5, באפשרותך להעביר אל הפונקציה מספר פריטי נתונים, מכל
טיפוס נתוניס שהוא, בהתאם לצורך. הפונקציה ()64ז3 מחשבת את שטחה של קומה. נתוני
האורך והרוחב של הקומה, וכן מספרה, מוזנים בפונקציה ()חגחז, ואז מועברים אל
הפונקציה בפקודת הקריאת:
;(התטם ,161 ,1 קַת16 זה
תוכנית 7.5: העברת כמה פרמטרים
]|*87068.0*]
()10ח
ָ
;ה+10 ,ה0%ַה10 %+108+
;הטה+ %ה1
1( :חספהטה 11008 8ה+ ה%6ה5")+%ה1חם
; (חעת81 , "%0")+ה508
((" :11009 8ה+ +0 ה+0ה10 6ת+ ה%6הם')1+ה1חם
; (ה0%ה810 ,'+%")+ה808
6(" :1000+ 6ה+ 01% ה10%א פה+ ה6צה5")+%ה1חם
; (ה8010% ,"+%")+5080
; (חטה+ ,ה10%א ,ת+0ה3708)16
/
(חטה ,0106 ,87/68)5120
1 ,51260 108%+
;הטה 10%
0
1 108%6+
; 87068=51206*6100
; (8008 (חטה ,"2%.% 18 %0 11008 01% 8788 פהד")++ה1חם
; (00%000)0
1
העברת פרמטרים 7 15
שלושת הארגומנטים נקלטים בסדר בו הם מועבריס. במקרה זה, הערך של גַזפַת6! נקלט
על ידי 516, הערך של גו6ואי נקלט על ידי 66וש, והערך של ותטת! נקלט על ידי וזטת.
טיפוסי הנתונים של הארגומנטים מתאימים - שני ערכים מטיפוס 1041 נקלטים על ידי
משתנים מטיפוס ₪081, וערך מטיפוס )מו נקלט על ידי משתנה מטיפוס ות1.
הפונקציה ()8163 זקוקה גם למשתנה שיאחסן את תוצאת החישוב. משתנה זה, הנקרא אף
הוא 8168, מוכרז אחרי התוחס הפותח.
אם שגית וכתבת את הקריאה לפונקציה כך:
(ב טמ 161016
הערך של גו16ש ייקלט על ידי 816, והערך של תוַפַח16 ייקלט על ידי 166 מכיוון
שטיפוסי הנתונים מתאימים, הקומפיילר לא יציג הודעת שגיאה, ובמקרה זה התוכנית עדיין
תגיע לתוצאה הנכונה - סדר האיבריס במכפלה אינו משנה. לעומת זאת, נניח שכתבת את
רשימת הארגומנטים בקריאה לפונקציה כך:
;(810ת10,מ101/ו התטת]) 08ב
הפונקציה תקלוט את וזות! לתוך הארגומנט 8126, את הו0וָאו לתוך הארגומנט 166, ואת
וקם6! לתוך וחטת. שני ארגומנטים אינס מתאימיס מבחינת טיפוס הנתונים. גם אם
הקומפיילר שברשותך איגו מציג הודעת שגיאה, תוצאת החישוב תהיה ללא טפק שגויה.
נבחן דוגמה נוספת, בתוכנית 76. התוכנית מצינה את מחירו של פריט ואתוז הנחה.
המשתנים )608 ו-1תט6:560 מועברים אל הפונקציה ()6סוזק ונקלטים לתוך הארגומנטים
[תטסוחה ו-תעו60)זות. המשתנים 1600006 ו-6ת נדרשים בתוך הפונקציה, ולכן הם
מוכרזיס כמשתנים אוטומטיים אחרי התוחס הפותח.
תוכנית 7.6: העברת פרמטרים
/*0.%ה015000*/
()ח₪81
1
11086 1, 150000
₪ :1% פה+ 0% 005% 8ה+ %88ה")1+ה1תם
; (8005% ,"%%")+8080
; (" :ח6פחטח 0601081 8 0%ט01500 67060%ק 6ה+ %68הם")++ה1חק
; (0%ט801600 ,"%%")+5080
; (+ה015000 ,106)005%
1
( ח%000 , +ת106)8000פ
; סא +חטסחה +108+
/
1108% 7800060, 8%]
8 15 פרק 7: כיצד פועלות הפונקציות
; חא00איה * +הטסהה8 = 8000860ת
1 - %הט0ח8 = 8%ה
(6%ה ,"+6%.2 18 005% 6%ה 6תהד")%+610ק
; (8%000)0ת
1
הפונקציה ()6סוזק מכפילה את ערך משתנה המחיר (008) בערכו של משתנה ההנחה
(1ם41860), מפחיתה את ההנחה מהמחיר, ומציגה את המחיר אחרי ההנחה. תצוגת המסך
אחרי הרצת התוכנית עשויה להיראות כך:
0 :הזג 6 01 0051 116 זסותי
5 :חתות 6601181 85 1תו61500 +ת06זסק 6ת] זסות
0 1 ]008 ]6ת 6"
עתה, נניח שטעית וכתבת את הקריאה לפונקציה כך:
;(6051 ,6ת100)61860זק
הקומפיילר לא יציג הודעת שגיאה, מכיוון ששני ערכיס מטיפוס 1081 נקלטים על ידי שני
ארגומנטים מטיפוס 8031. אך לרוע המזל, הס אינס נקלטים על ידי הארגומנטים הנכוניס.
הערך של 1תו4:860 נקלט על ידי זתוסתוג, ואילו הערך של 6081 נקלט על ידי תאוס0אזוז.
אס המשתמש מקליד את הערך 100 עבור המחיר, ו-0.05 עבור ההנחה, הפונקציה תהפוך
את הסדר. היא תחשב את מחיר הפריט כחמישה סנט ואת ההנחה כ-100%. מחיר הפריט
אחרי ההנחה יהיה מינוס 54.95 (4.95-) במקום 595.00.
אחזרת מוחנים
פונקציה יכולה לא רק לקלוט ערכים, אלא גם להחזירס. זכור לך בוודאי שהפונקציה
(610011 משתמשת בפורמט הבא:
00 = 6
ההוראה קוראת לפונקציה ()86)0(481, שמזינה תו אחד מהמקלדת. בדוגמה שלפנינו, כאשר
מבוצעת הפונקציה ()ז86/0(8, תו הקלט מוצב במשתנה ששמו ע6א. פעולה זו נקראת
החזרת ערך.
הפונקציות שלך יכולות להחזיר ערכיס לפונקציה הקוראת. עם זאת, כדי להחזיר ערכים, יש
להוסיף לפונקציה כמה מרכיבים. לדוגמה, עיין בתוכנית הבאה:
()תוגות
[
זו
0 5 1
החזרת משתנים 159
;('ם' ווק
(0ו161 ,"%0 עו 16166ת6 :60818010 6מ'1')!וםוזק
1
(10 1 זגס
+
;(" :ז0148780)0 8 ז0ותם")1ותוזק
(((261011810 )תזו16
ההוראה:
16106: = 2601600
קוראת לפונקציה (261160. פונקציה זו מזינה תו מהמקלדת ומחזירה את התו למשתנה
1 בפונקציה ()מ41ו.
כאשר אתה רוצה להחזיר ערך, עליך למסור לקומפיילר מהו טיפוס הנתוניס של הערך שוחזר.
הדבר מתבצע על ידי ציון טיפוס הנתונים לפני שמה של הפונקציה, כמו בדוגמה שלט:
611600 זגו[
הוראה זו אומרת ל-6 שהפונקציה (861166 תחזיר ערך מטיפוס ז18ס. הערך שיוחזר הוא
הארגומנט המופיע בקריאה לפונקציה ()תזנ6ז. ההוראה:
;((0101810 )תז 1010
מבצעת את עיקר העבודה. זכור שהפונקציה ()861081 משמשת במקוס בו היינו מציבים ביטוי
או ערך. בתוכנית שלנו, ()8610181 מזינה תו, ()םז160 מעבירה את התו בחזרה למשתנה ששמו
זו6! ומחזירה את השליטה לפונקציה ()ת!גוח, בתוכה מתבצעת הוראת ()!)חוזק.
ערכים מוחזרים מסוג "טוסע"
| בעבודה עם קומפיילרים של שפת 6 הפועלים לפי תקן ופאג,
עליך לקבוע את טיפוס הפונקציה, גם כאשר הפונקציה אינה
מחזירה ערך כלשהו. במקרים כאלה, טיפוס הנתונים מוכרז
| כ-")וסע'", כמו בדוגמה להלן:
: ()וסחטועות סוס
ן הכרזה זו מורה לקומפיילר שהפונקציה אינה מחזירה ערך |
לפונקציה הקוראת. בשפת ++6 אין הכרח להשתמש במלת
| המפתח טוסט, אם כי מומלץ לעשות זאת.
008-7080 ₪ 08-06 26-08 0809-68 שה 60 ₪278 השש שה אש9 שש ₪00 הש
בחן היטב את אופן השימוש בפונקציה ()מזנ0שז בתוכנית זו. ודא שאתה מבין כיצד פועלות
פונקציה זו והפונקציה ()41ת8610.
100 פרק 7: כיצד פועלות הפונקציות
נבחן עתה תוכנית שקולטת ערך ומחזירה אותו. התוכנית המודגמת בתרשים 7.7 מזינה ערך
ומציגה את חזקתו הריבועית. ההוראה:
((50816008106 = ז6טוחטות
קוראת לפונקציה ()50416 ומעבירה אליה את תוכנו של המשתנה 8106ץ.
הגדרת הפונקציה (ותטח)6ז4טף5 ותו מוסרת ל-0 שהפונקציה ()6זגטוף5 תחזיר ערך מטיפוס
זתז, ותקלוט ארגומנט לתוך המשתנה ותטת.
בדוגמה שלט, ()תז6 היא ההוראה היחידה הכלולה בפונקציה. ההוראה
(נתטת*ותטת)תזנג6ז מחזירה את הערך המחושב של הביטוי מתטת*וזטת ומחדירה אותו
למשתנה ששמו זסטוחנות - המשתנה שהוקצה לקריאה לפונקציה בתוך ()תוו.
/* 6.חזטזז */
()חו8וח
הערך מוזן למשתנה
ו 066 טוח +חז
ו (809106 ,")50
9 ;(500876)/9|06 = זססוחנוח
;(ז6ס רוח ,"60 15 500816 6 ך")חחוזס
]
9 (וחטח)זגטף5 זחו
;החטח זחו
|
המשתנה
6
מועבר
ל-ותטם
בפרמטר
:(החטח* והטחה)תזוזטז
] הערך של נתטם*ומטת )
| מוחזר למשתנה ז6טממנות
תרשים 7.7
תוכנית שמחזירה ערך
מפונקצית.
החזרת משתנים 1 1
102
הערות ++6
בעבודה עם קומפיילרים של ++6 (וכן עם קומפיילרים מסוימים
של 6), מומלץ לפתוח את התוכנית עם אב-טיפוס של פונקציה.
אב-טיפוס הוא שורת ההכרזה של הפונקציה, הנכתבת בתחילת
התוכנית, לפני ()חוגּוח, כך:
; (החטח זחו)6ז8 5 סוסצ
()חוהוח
אב-הטיפוס מוסר לקומפיילר באיזה טיפוס פונקציה ובאילו
ארגומנטים תעשה שימוש בתוכנית.
5:57 5-5 8/4 5 8% ה 8 ₪97 הי 8 אל הפ גג ₪ סו 5 פיק ₪ הר ₪ ריע ₪ מ לא ₪ ג ₪ (3-הע שח ₪ הש
החזרת ערכים מטיבום סו
כאשר פונקציה מחזירה משתנה מטיפוס ]ת1 או מטיפוס זגת0, אין הכרח לציין את טיפוס
הנתונים לפני שמה של הפונקציה. 6 תוכננה מלכתחילה לטפל בנתונים מטיפוס ]ת! ו-ז019
בלבד. לפיכך, אס אין מציינים את טיפוס הנתונים, :6 מניחה שבכוונתך להחזיר עוך
מטיפוס זח! או זגוןס.
לעומת זאת, אס אתה מחזיר ערך מטיפוס 804, עליך לבצע שני דברים:
1. לכתוב את טיפוס הנתוניס )103 לפני שמה של הפונקציה.
2. להכריז על הפונקציה עצמה.
מכריזיס על הפונקציה כעל משתנה חיצוני לפני הפונקציה ()תו4ות, כפי שמודגס בתרשים
8. ההוראה:
1081 50081060((
מכינה את הקומפיילר לטיפול בפונקציה מטיפוס )804. מלבד הכרזת הפונקציה וציון
טיפוס הנתוניס )808, התוכנית זהה לתוכנית שמחשבת את חזקתו הריבועית של מספר
שלס.
מרבית הקומפיילרים מאפשרים גס להכריט על טיפוס הפונקציה בתוך ()ח1גוח, כך:
()םוות
ן
;(3008160 ,4106 6סותטת 081
פרק 7: כיצד פועלות הפונקציות
הערות ++6
העמסת יתר היא תהליך בשפת ++6 המאפשר לאופרטורים
ולפונקציות לטפל ביותר מטיפוס נתונים אחד. ניתן להעניק שם
זהה למספר פונקציות, כפי שמודגם בשורות אב-הטיפוס הבאות:
;(החטח זח!)165 00 )חז
; (וחטח 65)1!081!ט טס ובסו
התוכנית תכלול שתי פונקציות ששמן ()65|טטס4. פונקציה אחת
משמשת להכפלת מספר שלם, והשנייה להכפלת מספר
מטיפוס ובּסו1.
6 ם פ ם לפ 5 5 ו 8 8 ב 5 ₪ אפ ביא יאק ם וש איהש םאש ה
תרשים 7.8
/* 031.6 */ הכרזה על פונקציה
הכרזה על הפונקציה מטיפוס /108].
כמשתייכת לטיפוס )808 > ;()500876 -
()חו וח
ָ
;6 טח 031
1 ו 2 ם הערך המוחזר
;("-5008106 20 10 זססחחטח 4 ז0זח")]1חוזכ במטתייך ליפו ומפה
501)", 8/8106(:
;(501876)09]06 = ז6סוחטח
;(ז0םרחטח ,"21. % 18 500876 8חד")חוז
הגדרת הפונקציה ' 1
7 (החטח)6ז4 50 ז1!08 <
;טח 1081
ה
הגדרת הערך הנקלט (החטח* החטח) זט
כמשתייך לטיפוס )809
)
אם הקומפיילר שברשותך אינו מאפשר זאת, הכרז על הפונקציה לפני ()תוגות.
החזרת משתנים 3 1
המונקצ'ה 0חזטז6ז ב- 0חוהוח
לפני שנמשיך, הבה ניזכר במבנה של הפונקציה (0)תז6ז ב-()תוגוח. אם ראינו שאו
משתמשים בפרמטר שבסוגריים כדי לשגר ערך כלשהו אל פונקציה, נשאלת השאלה לאן
משוגר הערך 0 כאשר מסיימים את התוכנית! למעשה, אנו משגרים אותו אל מערכת
ההפעלה.
בעת שמריצים תוכנית 6, ניתן לחשוב על מערכת ההפעלה כמבצעת קריאה לפונקציה
()תוגות. עם סיוס התוכנית, הפקודה ()םזט)6: מחזירה את השליטה למערכת ההפעלה.
הפרמטר המופיע בסוגריים ב-()60ז מורה למערכת ההפעלה אס התגלתה שגיאה,
ובאיזה סוג של שגיאה מדובר. הפקודה (0)מזט16 מורה למערכת ההפעלה שלא התגלתה
שגיאה. תוכניות מתקדמות יכולות לעשות שימוש בפרמטרים אחרים כדי לדווח למערכת
ההפעלה על שגיאות חומרה או תוכנה, וכן להורות לה לבצע פעולות נוספות בהתאם לאופן
בו הסתיימה הרצת התוכנית.
]וש בהגדרות מקרו
למדת כבר שבאפשרותך ליצור קבוע בעזרת ההנחיה 6מם!866. לדוגמה, הפקודה
4 1 866116 מורה ל-) להציב את הערך 3.14 בכל מקום שמופיע בתוכנית שם הקבוע 1ק.
ההנחיה 6ם!%661 מורה לקומפיילר להחליף את שמו של הקבוע בנתון המופיע אחריו
בהנחיה. גם אם תופיע הוראה מלאה אחרי שם הקבוע בהנחיית 6ת/8061, הקומפיילר יבצע
את ההחלפה. לדוגמה, ההנחיה הבאה מחליפה את הקבוע ששמו מא בהוראת ())תוזק:
("-ז0ס ות 4 ז6)ת6 216856")])תוזק םדא 6תו/400
כאשר ברצונך להציג את ההודעה הכלולה בפקודה ()))פוזק, כל שעליך לעשות הוא
להשתמש בהוראה 8 דאא, כך:
(":ז00ותטת 8 ז10ת6 1])"216856תוזק הזת דאם 40606
()תוות
|
1) 426, 8126
שפדאת
((8406 ,'1)"%0ת509
שמדאת
;(625126 ,'1)"%6ת508
4 16 פרק 7: כיצד פועלות הפונקציות
כאשר תריץ את התוכנית, תוצג ההודעה :ז6סמתטת 8 ז0!ת6 16856ק, בדיוק כאילו שהוראת
ה-()1!פוזק הופיעה בתוך ()תוגוז, כפי שמודגס בתרשים 7.9.
תרשים 7.9
וח 4 זזה חק הד 6חו1 00 -- 0
יר ב וח
|
ההוראה (0)חנזק שמוקצית למקרו ; 4 : ,
דאס מחליפה את 1188א8] בתוכנית. 526 ,806 זחו
> :חסזאם
2 (8806 ,"50801)"%0
: > :הד
[(85120 ,"50801)"%60
1
לכן, התוכנית גראית לקומפיילר כך.
(' םוח ג ז16ח6 6456|ק")חוז חח ד= 6חו0017
()חו3וח
(
6 ,306 זחו
:061 חחח 3 ז6זח6 6856וק")חוזס
50 1)"%0', 8800(
;(:זסס חח 8 ז10ח6 6856!ק")חחוזק
5001)", 85120(
)
הנחיות מסוג זה נקראות פקודות מקרו. הן משמשות כלי-עזר שימושי ורב-עוצמה, מכיוון
שהן חוסכות את הצורך לחזור ולהקליד הוראות שחוזרות מספר פעמיס באותה תוכנית.
באפשרותך להשתמש במקרו 8מ'1אם, למשל, בכל פעם שברצונך להנחות את המשתמש
להקליד נתון כלשהו. פקודות מקרו הן שימושיות במיוחד מכיוון שביכולתן לקלוט
ארגומנטיס, בדומה לפונקציות. התוכנית הבאה, לדוגמה, כוללת מקרו המשמש להמרת
נתוני טמפרטורה מפרנהייט לצלציוס:
;(" :זסטותנות 8 ז61ת6 016856")])מוזק תס דא 6ת068
(32-קות5.0/9.0(*))6) (קתת6ו) זנ )001 46686
()חוגות
שימוש בהגדרות מקרו 5 1
11081 0116;
;דאס
;(6:01110810 ,"1)"%1ם508
;((816 תג[ ד 60 ,"םא 15 ו1")זתוזק
]
הנחיית 6ם%66/1 השנייה יוצרת מקרו ששמו 5371/א60 המקבל ערך יחיד כארגומנט.
הארגומנט ש-00%%₪1 מקבל מוצב בביטוי (32-קנת5.0/9.0(*)0) במיקוס של המלה
קנת6). הקריאה למקרו דומה לקריאה לפונקציה, תוך שימוש בערך שיש להמיר כארגומנט
הקריאה (ראה תרשים 7.10). אס תקליד את הערך 212 בתגובה לפקודת הקלט, תחושב
הקריאה 0161180316 /א60 הכלולה בפקודה ()4)תוזק כך: (5.0/9.0(*)212-32).
תרשים 7.10
הגדרת ביטוי כמקרו.
הקומפיילר מציב את הביטוי
במקוס המקרו ששמו 00/5871
ומעביר אליו את הארגומנט.
(10 !801 ,")01
((810חו!0) דחם/\60 ,"ח%1 5 זו")זהוז
((416-32חו1ס) * (5.0/9.0) ,"ח%1 5 זו")חחוזס
המחשב מעריך את הביטוי
באמצעות הערך שהועבר אליו.
(קהח6ז)ח6עחס0 108%
המקרו מבוצע בדיוק כאילו היה
פונקציה שקולטת ומחזירה ארגומנט. קוח6ז זג
|
;(1600-32)* (5.0/9.0)חזז6ז
)
השימוש במקרו מעניק את כל היתרונות של השימוש בקבוע. אס ברצונך לשנות את הנחיית
הקלט הרגילה שלך, למשל, כל שעליך לעשות הוא לשנות את המקרו 78%'א₪ בתחילת
6 16 פרק 7: כיצד פועלות הפונקציות
התוכנית. כך, במקרה ששגית בהקלדת נוסחת ההמרה - יהיה עליך לתקן שורה אחת בלבד,
במקוס לתקן את הנוסחה בכל מקוס בתוכנית בו השתמשת במקרו.
( יצוב החוכניה
אין כלליס מוחלטים המסייעים למתכנת להחליט מתי להשתמש בפונקציות ומתי לכלול
את כל ההוראות בתוך ()תוגמז. כשתצבור ניסיון בתכנות, תגלה שההחלטה מתקבלת באופן
טבעי. אם אתה כותב תוכנית קצרה, כמו תוכנית שמזינה מספר אחד או שניים, מבצעת
כמה פעולות מתמטיות ומציגה את התוצאות - השתמש ב-()ח!1גחז בלבד. אין צורך לחלק
תוכנית בת חמש או עשר שורות לפונקציות נפרדות, אלא אס כן הדבר נדרש.
לעומת זאת, אם אתה כותב תוכנית ארוכה יותר בתוך ()ם!4ז ומשהו משתבש, קשה הרבה
יותר לאתר את הבעיה. אם התוכנית מחולקת לפונקציות נפרדות, ניתן לאתר את הבעיה
באופן שיטתי, על ידי בדיקת הפונקציות אחת לאחת, החל מהפונקציה שהסבירות שהיא
מקור הבעיה היא הגדולה ביותר, ועד לפונקציה בעלת הסבירות הנמוכה ביותר.
לשתנים אוטומטיים לעומח מעותנים חיצוניים
מתכנתים מתחיליס בוחרים, לעתים קרובות, להשתמש בקיצור-הדרך של הכרזת משתנים
חיצוניים בלבד, מתוך תקווה שכך יחסכו את הטרחה הכרוכה בהעברה ובהחזרה של
ארגומנטים. לדוגמה, תוכנית 7.3 בתחילת הפרק עושה שימוש במשתנה התיצוני קו6)
בארבע פונקציות שונות. מכיוון שזהו משתנה חיצוני, לא היה צורך להעביר את ערכו כארגומנט.
אס כי נראה שקל יותר להשתמש במשתנים חיצוניים, הס עלולים לגרוס לשגיאות הרצה
שקשה מאד לאתרן - וכתוצאה מכך, לתוצאות בלתי מדויקות. יש לזכור שאמנם כל
הפונקציות יכולות להשתמש במשתנה חיצוני, אך הן יכולות גם לשנות אותו. אס קיבלת
תוצאות שגויות, יהיה עליך לחפש את השגיאה בתוכנית כולה. ייתכן שהוראה קטנה
ותמימה אחת, הקבורה עמוק בתוך פונקציה שנקראת רק לעתים רחוקות, שינתה את ערכו
של המשתנה בטעות.
השימוש במשתנים אוטומטיים ובהעברת ערכיס בארגומנטים מעניק לך שליטה רבה יותר
בזרימת התוכנית. ערכו של משתנה אוטומטי יכול להשתנות רק בתוך הפונקציה בה הוא
מוכרז. אם התוצאות שגויות, באפשרותך להוסיף הוראות ()!!תוזק זמניות לכל פונקציה
ולהציג את הערכים של המשתנים המקומיים. כך תוכל לאתר בקלות את ההוראות השגויות.
קלט בלת' תק
התוכניות שהוצגו בפרק זה נבחרו כדי להדגים את מושג השימוש בפונקציות. הן אינן
מייצגות בהכרח את הדרך הטובה ביותר לביצוע מטלה, והן אינן מובטחות מפני שגיאות.
עיצוב התוכנית 07 1
לדוגמה, גס התוכנית הטובה ביותר אינה יכולה לשלוט בקלט המוזן באמצעות המקלדת.
בתוכנית 7.6, למשל, מחיר הפריט ושיעור ההנחה מוזנים באמצעות הפונקציה (10ת808.
חישוב המחיר אחרי הנחה מבוסס על ההשערה ששיעור ההנחה יוקלד כמספר עשרוני,
כדוגמת 0.05 עבור חמישה אחוזים. כדי להגדיל את הסיכויים שיוקלד קלט מתאים, מציגה
הוראת ה())!)תוזק את ההנחיה:
ונת [6601₪08 85 1ת615008 זת6סזסק 116 ז6וחבן
אולס, המשתמש עלול עדיין לשגות ולהקליד 5 במקוס 0.05. במקרה כזה, במקום להפחית
את עלות הפריט בחמישה אחוזים, שיעור ההנחה יחושב כ-500 אחוז. כלומר, המוכר משלס
לקונים כדי שיקנו ממטו!
גם בתוכניות שאתה כותב, אל תניח מראש שהקלט יהיה כפי שאתה מצפה. להיפך, עליך
ללמוד לצפות לבלתי-צפוי. בפרק 8 תלמד כיצד למנוע חלק מהשגיאות האלה.
אלות
1 מה ההבדל בין פונקציה בספריית 6 לבין פונקציה שאתה כותב בעצמך!
2. האם פונקציה חייבת להיקרא תמיד מתוך ()מ41וח!
3. מה קורה אחרי שפונקציה מתבצעת!
6. הסבר את ההבדל בין משתנים אוטומטיים למשתנים חיצונייס,
5 מהס היתרונות היחסיים של השימוש במשתנים אוטומטיים, ומהס יתרונותיהס
של משתנים חיצונייס!
6. מתי תשתמש במשתנה סטטיו
7. כיצד מעבירים ערך לפונקציה!
8. כיצד מחזיריס ערך מפונקציה!
9. מהו מקרו!
0. כיצד מחזירים ערך מטיפוס ]1108
ד רגילים
41 כתוב תוכנית חידון שמציגה ארבע שאלות, כשכל שאלה ותשובה בפונקציה
אחרת.
2. כתוב תוכנית שמצינה מספר ומשתמשת בפונקציה כדי לחשב ולהציג את
החזקה הרביעית של המספר.
1108 פרק 7: כיצד פועלות הפונקציות
3 שנה את התוכנית שבתרגיל מספר ? כך שחישוב החזקה הרביעית יתבצע
בפונקציה, אך התוצאה תוחזר ל-()ת1גוז לצורך הצגתה,
4. הטבר מה לקוי בתוכנית הבאה:
01150
|
115 15 פות'ד')פונון
()הנגות
זט
]
()תוגוה
|
("560000 15 15')פוון
((0)תזטו16
169 0
1 ,
]האר את ההח/6ה כ'כ
האחש;
₪7
| ל מפרק זה, כישורי התכנות שלך עומדים בפני אנוק אדיר קדימה.
4 ש הנושאיסם בהס נעסוק בפרק זה ובפרקים הבאיס אינס קשיס יותר מאלו
שכבר הכרת, אולס השילוב בינס לבין מה שכבר למדת, יציב אותך על-פני מדרגה
גבוהה יותר מבחינת התחכוס שבתכנות.
11
כמו כן, החל מפרק זה נפנה תשומת לב רבה יותר ללוגיקה של עיצוב התוכנית. ככל
שכישוריך בשימוש בכתיב של שפת 6 ושפת ++6 יגדלו, תבחין בשינוי הדגשים. במקוס
להתמקד בכל נקודה-פסיק ובכל תוחס, נתרכז יותר באלגוריתמיס ובפתרון בעיות. תגלה
שלא קיימת דרך "'כונה" אחת בלבד לכתוב תוכנית - ושבאפשרותך לבצע מטלה על ידי
כתיבת תוכנית במספר דרכים שונות.
בפרק זה תלמד כיצד לגרוס למחשב לקבל החלטות. במקוס לבצע כל אחת מההוראות
על-פי הסדר בו כתבת אותן, התוכנית תחליט, על-פי קריטריוניס שתקבע, אילו הוראות
לבצע. למעשה, תוכל להשתמש בטכניקה שתלמד בפרק זה לתיקון מרבית הבעיות הלוגיות
שהצבענו עליהן בפרקים הקודמים.
ו - קודה קטנה-גדולה
כל הקסם הזה מבוצע על ידי הפקודה הקטנה !1 - מלה קטנה, אך בעלת עוצמה גדולה.
אנו משתמשים בפקודה !1 כדי להתליט אס יש לבצע הוראה מסוימת. מבנה הפקודה הוא
כדלקמן:
(ת61!10ם60) ]1
;חתותו
הפקודה אומרת למעשה את המשפט הבא: 'אם התנאי מתקיים (אמת), בצע את ההוראה
הבאה". (ראה תרשים 8.1). המחשב מבצע את ההוראה וממשיך, כרגיל, אל ההוראה הבאה
אחרי פקודת ה-]1.
תרשים 8.1
מבנה הפקודה 11 תנאי בסוגריים פקודת ]1
%
זהוראה שיש לבצע |[חסווהחח זז
התנאד מתקול 6 --- - --- - - | (חסטושחס0) ]ןה
וח
א
תו נקודה-פסיק מסיים
לעומת זאת, אס התנאי אינו מתקיים (שקר), המחשב מדלג על ההוראה המהווה חלק
מפקודת ה-11, ועובר להוראה הבאה בתוכנית. קל לכתוב פקודת 18, כל עוד מקפידים על
הנקודות הבאות:
> הצב את התנאי בתוך סוגריים.
2 7 1 פרק 8: להשאיר את ההחלטה בידי המחשב
= אין להציב נקודה-פסיק אחרי התנאי - אלא רק אחרי ההוראה.
* אנו אומנם מתייחסים לפקודה כאומרת "אס התנאי מתקיים, אז בצע את
ההוראה", אך המלה אז (ת6ם)) אינה קיימת בשפת 6.
* 6 היא שפת תכנות בעלת פורמט חופשי, ולפיכך - התנאי וההוראה יכולים להיות
בשורה אחת. עס זאת, ההפרדה וכניסת הפסקה מקלים על קריאת התוכנית.
חנאים
התנאיס בפקודות 1 מבצעים השוואה בין ערכים - משתנה או קבוע מושוויס עם ערך מילולי
או עס משתנה או קבוע אחריס. ההשוואה מתבצעת בעזרת אחד האופרטוריס הבאים:
אופרטור מובן דוגמה
== שווה (0.06 == אגו) ]1
> גדול מ- (40 < פזוסת) ]1
- קטן מ- (40 > פזוסם) ]1
=< גדול או שווה (10000 =< /:ג[88) ]1
=> קטן או שווה (11נ1] => )008) ]1
= שונה מ- (1 =! )תטסט) ]1
שים לב שכדי לבחון אס שני ערכים הס זהים, עליך להשתמש באופרטור ==, שני תווי שווה
רצופיס. אם תשתמש בתו שווה אחד בלבד, הקומפיילר יציג הודעת שגיאה. תו שווה אחד
משמש רק להקצאת ערכים למשתנים.
פקודת ]1 פשוטה עשויה להיראות כך:
(11 < 6וחגו) ]1
;('-6]זנוס 41101 15 11 ,6ותסו| 00")פונוק
ההוראות אומרות למעשה את המשפט הבא: "אם המשתנה 6הז1) גדול מ-11, אזי הצג את
ההודעה הבאה". אם ערכו של המשתנה הוא 11 או קטן מ-11, ההודעה לא תוצג.
ניתן להשתמש בתנאי 1 כדי לבחון משתנים מספריים או משתנים מטיפוס זגון0, אך לא
מחרוזות. קטע התוכנית הבא, לדוגמה, יקומפל מבלי להציג הודעת שגיאה כלשהי, אך לא
יציג את התוצאה הנכונה:
(6 תו
("ת408/" == 6הזגת) ]1
"וס 19)"0311ק >
+ - פקודה קטנה-גדולה 3 7 1
מחרוזות הן משתנים מיוחדים, שנעסוק בהם ביתר פירוט בפרק 10.
עיין בתוכנית 8.1, תוכנית מלאה שעושה שימוש בפקודת /. זוהי גרסה מתוקנת של תוכנית
שכבר פגשת בפרק קודס, המחשבת את טכומה של הזמנה, כולל מס הקנייה. בתוכנית זו, מוטל
מס מותרות מיוחד על פריטים שמתירס עולה על 540,000. החישוב מבוצע בפקודה הבאה:
(40000.00 < 0031) ]1
5 * ]008 = עזטאטן
תוכנית 8.1: תוכנית לחישוב סכום הזמנות רכש, כולל מס מותרות
]*ס.וץהטאט1*/
()ח81ח
)
1 ,צְ"טאט1 ,א8+ ,005% 1108%
17 = עחטאט1
;(" :%00+1 8ת+ 0% 008% 8+ %87ה%1)"5ה1חק
( (80059% ,"+%")50801
* 005% = א8+
(40000.00 < 008%) 1%
* 005% = עְהטאט1
נץחטאט1 + א8+ + 005% = 0%81+
;(0%81+ ,"+2.% 18 008% %0%81 שהד")++ה1חם
הפקודה אומרת, למעשה, את המשפט הבא: "אם ערכו של המשתנה )608 גדול מ-540,000ו
אזי הצב את הערך של |003 כפול 0.5 אחוז במשתנה ץזנואט[". שתי ההוראות האחרונות
בתוכנית מבוצעות בכל מקרה, בין אס מוטל מס מותרות ובין אם לאו, מכיוון שהן מופיעות
אחרי תו הנקודה-פסיק המסיים את פקודת ה-1.
שים לב שבשלב מוקדם יותר בתוכנית מוקצה למשתנה עזטאו| ערך התחלתי 0, אך לא
מוקצה ערך התחלתי למשתנה אג!. הסיבה לכך היא שהמשתנה אג1 יקבל תמיד ערך
כתוצאה מהחישוב 0.06 * ]605 = 8%!, בעוד שהמשתנה עזטאט| מקבל ערך מחושב רק
במקרה שמחיר הפריט גדול מ-540,000. אם התנאי אינו מתקיים (שקר), החישוב כלל אינו
מתבצע. אם לא היינו מקציס ל-עזטאט! ערך התחלתי, היה מתווסף אל הסכוס הכולל ערך
בלתי-ידוע כלשהו. ככלל, כדאי להקצות ערכים התחלתיים למשתנים שערכיהם מחושבים
בפקודת 11, כמו גט למוניס ולאוגריס.
כאשר אתה משתמש באופרטורים גדול מ-או קטן מ-, ודא שהס אכן מבצעים את התנאי
הדרוש לך. בדוגמה הקודמתו מס המותרות מוטל רק אם מחיר הפריט הוא לפחות סנט
4 7 1 פרק 8: להשאיר את ההחלטה בידי המחשב
אחד יותר מ-540,000, כלומר, החל מסכוס של 540,000.01. אם מחיר הפריט 540,000 בדיוק,
לא יוטל עליו מס המותרות. אם המס היה מוטל על פריטיס שמחירם 540,000 ומעלה,
התנאי המתאיסם היה כדלקמן:
1] )605] <= 40000.00(
ההבדל בין < לבין =<, ובין > לבין => הוא אומנם עדין, אך הוא חיוני לצורך קבלת
תוצאות מדויקות בתוכנית.
בקודות מדובוח
פקודת ]4 הבסיסית מבצעת הוראה אחת. אס ברצונך לבצע יותר מהוראה אחת כאשר
התנאי מתקיים, עליך להשתמש ברמה נוספת של סוגריים מסולסלים. הסוגריים
המסולסלים מסמנים את נקודת ההתחלה ונקודת הסיום של קבוצת הוראות, אותן יש
לבצע כאשר התנאי מתקיים (אמת).
עיין לדוגמה בתוכנית 8.2, המדגימה ביצוע של שתי הוראות כאשר התנאי מתקיים. תו
הסוגר המסולסל שאחרי התנאי מסמן את נקודת ההתחלה של קבוצת ההוראות, ואילו תו
הסוגר המסולסל שאחרי ההוראה השנייה מסמן את נקודת הסיוס של קבוצת ההוראות.
הוראה כלשהי הכלולה בקבוצת ההוראות תתבצע רק כאשר התנאי מתקיים (אמת).
השורות מסורגות כדי להבהיר לקורא שהן מהוות חלק מפקודת ה-!!, אולם אין לכך כל
משמעות מבחינת הקומפיילר.
תוכנית 8.2: הוראות מרובות בפקודת זו
]*2.0עץחטאט1*/
()810ח
.
; 0+81+ ,ץזטאט1 ,א8+ ,008% 1108%
1 = עחטאט1
;(" :1%60 6ה+ 0% 005% 6ה+ %60ה5")%+הגפק
; (+8005 ,"%%")+9080
* 005% = א8%+
(40000.00 < 008%) +1
6
;005 * 008% = עחטאט1
; (צוטאט1 ,"ה+2.% 5 א8ץ עְזטאט1 8הד")++ה1תק
1
;צֶזטאט1 + א8+ + 005% = 10181
; (0%81+ |"+2.% 18 005% 0%81+ פהך"))%ה1"ק
1
פקודות מרובות 5 /
16
1 קודה 1..6!86ז
כאשר משתמשים בפקודת )1 כשלעצמה, מעוניינים רק בביצוע הוראות כאשר התנאי
מתקיים (אמת). ניתן גם לבצע סדרת הוראות אחת כאשר התנאי מתקיים, וסדרה אחרת
של הוראות כאשר התנגאי אינו מתקיים (שקר). לדוגמה, נניח שברצוננו להדפיס את ההודעה
"על פריט זה לא מוטל מס מותרות" עבור פריטים שמחירס נמוך מרמת המס. נוכל לעשות
זאת בעזרת שתי פקודות )1, כך:
(4000000 < 0081) ]1
|
05 * )605 = עזטאט]
;(עזטאט] ,'28.% 15 אג) עזטאטן 6גד)]וםוזק
]
(40000.00 => ]005) ]1
;("106 115 זס] אג) קזטאט] סם 15 סזסג1')פוטק
יחד עס זאת, קיימת חלופה יעילה יותר. ניתן לשלב את שתי ההוראות בפקודה אחת, מכיוון
שהן למעשה שני מצבים אפשריים של משתנה אחד. ערכו של משתנה המחיר, /008, יכול
להיות גבוה מ-540,000, ויכול להיות נמוך או שווה ל-540,000. אם תנאי אחד הוא שקר,
הרי שהתנאי השני חייב להיות אמת. משלבים את ההוראות בעזרת הפקודה 6156:
(מ61]10ם0ס) ]1
100
506
(ם0סן!סנתופת1
המבנה הזה אומר למעשה את המשפט הבא: "אם התנאי הוא אמת, בצע את ההוראה
הבאה; אחרת - בצע את ההוראה המופיעה אחרי הפקודה 6156". ההוראות המופיעות אחרי
המלה 6156 מבוצעות רק אס התנאי אינו מתקיים. אם ברצונך לבצע יותר מהוראה אחת,
בכל אחד מהמקרים, הקף את ההוראות בסוגריים מסולסלים. יש להציב תו נקודה-פסיק
אחרי כל הוראה, אך לא אחרי מלת המפתח 6156.
כדי להדפיס את ההודעה במקרה שלא מוטל על הפריט מס מותרות, יש לשנות את
התוכנית, כפי שמודגם בתרשים 8.2. שים לב שכעת איגנו חייבים להקצות למשתנה עזטאטן
ערך התחלתי בתחילת התוכנית, מכיוון שהפקודה ]! לוקחת עתה בחשבון את כל המצביס
האפשריים.
פרק 8 להשאיר את ההחלטה בידי המחשב
תרשים 8.2
גרסה שונה של
אם התנאי מתקיים, , התוכנית תוך שילוב
בצע את סדרת ההוראות הזו (40000.00 < 0051) ]ו מלת המפתת 6156.
|
5 4 = עטאטו
(עטאנן ,21.% 5 א עטאטו יהוז
1
ללא תו נקודה-פטיק - 5
4% 00|
1005 5וח1 זס1 19 עזטואט! סח 5 זפ ד)פוטס
ּ :0 = טאו
אחרת, התנאי אינו מתקיים,
לכן בצע את סדרת ההוראות הזו
ביקור חוזר בחוכנית החידון
בפרק 7 ראינו מספר תוכניות שמציגות שאלות ותשובות. מכיוון שאז עדיין לא הכרת את
הפקודה 11, לא יכולת להעניק נקודות או ציונים. הענקת נקודות היא פשוט עניין של
השוואת התשובה הנכונה עס התשובה שהמשתמש נותן באמצעות המקלדת, כפי שמודגס
בתוכנית 8.3.
תוכנית זו עושה שימוש בפונקציה כדי להציג את השאלה, להזין את התשובה, לקבוע אם
התשובה נכונה ולמנות את מטפר התשובות הנכונות והתשובות השגויות. הן השאלה והן
התשובה הנכונה מועברות אל הפונקציה - השאלה היא מחרוזת מילולית, ואילו התשובה
היא מספר שלם. התוכנית כתובה באופן שניתן יהיה להוסיף שאלות על ידי החדרת קריאות
לפונקציה, כדוגמת:
, = 5 + 35809
תוכנית 8.3: תוכנית חידון שמעניקה נקודות
|*50006+*]
,0070806 %ת1
()ח1גת
ָ
הפקודה 11..6156 7 % 1
;[15]ה0065+10 "088
;80588 %ת1
0000860% =
= ", 9(;
= ", 8(;
= 5 40( ;
= ", 11(;
0 = [הספש
5 + 4")א85
2 + 6")א88
5 + 5")א85
7+ 4")א88
; (0070080% ("ה.ץ007060%1 ה0088%10 %0 8760אפה8 טסצץ")ז+ה1חם
; (0הסתא ,"ה.צץ0000860%1ה1 ה0085%10 %0 6780ש5ה8 טסצ")++ה1חם
1
(8ה8 ,00651)א85
;[0085%]15 0088
10%
/
1%
; (0089% ,"%5")++ה1חם
; (8006858 , "%0" )80801
(8ח8 == 0086988) +1
; 700 00++
008
;+
(0)חהתט9%ת
קָוברטורים לוגיים
תנאי ]1 שראינו עד עתה בוחנים רק משתנה אחד וערך אחד. כלומר, רק תנאי אחד צריך
להתקיים כדי שהביטוי יוערך כביטוי אמת. במציאות, תוכניות מחשב חייבות לעתים
קרובות לבחון יותר מערך אחד.
עיין בתוכנית 8.4, שמניחה מראש שלא על כל פריט שאתה מוכר מוטל מס. במקוס להוסיף
את מס הקנייה באופן אוטומטי לכל פריט, התוכנית שואלת תחילה אם הפריט המסוים
חייב במס, ואז - אם אכן הפריט חייב במס, היא מוסיפה למחירו מס קנייה בשיעור 6
אחוזים.
8 7 1 פרק 8: להשאיר את ההחלטה בידי המחשב
תוכנית 8.4: לוגיקה המבוססת על קלט מהמשתמש
/]*ס.א11+8*/
()ה81ח
ָ
1 סח1
;א8+ ,008% 108%+
17 = א8+
;(" :1%00 06 0% 008% 8ת+ 68+ה5")+%ה1חם
(8005% ,"+%")+95080
;(" :8018א8+הסה 11 % ,8016א18 18 180 8ה+ +1 ץ ה6צתם")+%תגחסם
; ()8016=0010088א8+
('ץ' == 80186א8+) +11
* 005% = אה8+
;(אה8+ + 008% ,"%% 15 006 %0%81 8הךה")++ה1סקם
אס התוכנית ראית לך נכונה, עיין בה שוב - היא סובלת מפגם משמעותי. התוכנית מניחה
שהמשתמש יקליד את האות הגדולה + אס הפריט חייב במט. במקרה שהמשתמש מקליד
אות ץ קטנה, התוכנית מסיקה שהפריט אינו חייב במס, מכיוון שפקודת ה-1: בוחנת רק
עבור צ גדולה.
במצבים כאלה - יש לבחון עבור שני סוגי הקלט האפשריים - צ או ץ. ניתן אומנס לעשות
זאת בעזרת שתי פקודות ]1, אך במקוס זאת נשתמש באופרטור הלוגי או - || - כך:
('ץ' == 016אג! || '?' == 6|סהאהו) ]1
הוראה זו אומרת למעשה את המשפט הבא: "אס 1888916 שווה + או 1848916 שווה ע".
לפיכך, הפריט ייחשב כחייב במס אם אחד משני התנאים הוא אמת. במקרה ששני התנאים
אעס אמת - כלומר, המשתמש הקליד תו אחר כלשהו שאיננו + או ץ - הפריט לא יחויב
במס. התנאי כולו מוקף בזוג סוגריים אחד, והמשתנה אותו בוחנים - 188806 - מופיע
פעמיים. אס נכתוב את התנאי כך: ('ץ' || "1' == 816אג!) - תיווצר שגיאת קומפילציה.
אופרטורים לוגיים 0 177
הערות בנושא הפונקציה ()ז9ח9610
בקומפיילרים מסוימים (אך לא בקומפיילר ₪06 שעל-גבי
התקליטון המצורף לספר), הפונקציה ()ז9ה₪610 פועלת דוך
חוצץ, או זיכרון זמני. פירוש הדבר שהתו המוזן מאוחסן בזיכרון
המחשב עד שהמשתמש מקיש על מקש זוחם. אם כך פועל
הקומפיילר שברשותך, עיין בתיעוד הנלווה לקומפיילר לגבי
הפונקציות ()ח8610 או ()6ח9610. פונקציות אלה אינן פועלות
בדרך כלל דרך חוצץ, וניתן להזין תו בודד בעזרתן מבלי להזדקק
להקשה על זסזחם. |
בנוסף, שימוש בפונקציה ()9ח0610 אחרי פקודת הקלט ()1ח508
עלול לגרום לבעיה. כפי שהוסבר בפרק 5, אם לא מזינים את
הנתונים המתאימים לפונקציה ()1ח503, תווים אחדים עלולים
להישאר בחוצץ הקלט. הפונקציה ()זּחס90ָ עשויה לקרוא את
אחד התווים האלה במקום את התו שהקלדת. ניתן להימגע מכך
על ידי שימוש בפקודה ()9615 או בפקודת קלט לתו יחיד אחרת,
שאינה פועלת דרך חוצץ, כמו ()חסו96 או ()6ח0ו46, במידה שהן
זמינות בקומפיילר שברשותך.
אפשרות נוספת היא לרוקן את חוצץ הקלט לפני השימוש
בפונקציה ()זפּח0סףָ. כדי לעשות זאת, הוסף את הפקודה
<ח.0ו510> 46ט|[סחו בתחילת התוכנית. לאחר מכן, החדר את
הפקודה (חו510)חפטו!1 לפני הפונקציה ()ז3ח86)0. הפקודה ()תפטו11
מרוקנת (מסלקת) את התווים שנותרו בחוצץ הקלט התקני.
ל( ו 0 8-4 ה-א שההלמש1 דוש - האשנ קש ה טושוד אש/ בושו קשה הש1 (ש) גושס שביה
קיימים שלושה אופרטורים לוגיים: || מסמן את האופרטור 08 (או), 86 מסמן את
האופרטור כא4 (וגם), והתו ! מסמן את האופרטור 071א (לא). כאשר אתה משתמש
באופרטור 0, אחד משני התנאיס (או שניהם) חייב להיות אמת כדי שביטוי ה-11 יהיה
אמת. כאשר משתמשים באופרטור 2א, שני התנאים חייבים להיות אמת. כאשר
משתמשים באופרטור '071א, על התנאי להיות שקר כדי שביטוי ה-11 יבוצע.
ניתן להשתמש באופרטור 8.8 ובאופרטור || כדי לבחון משתנה אחד לעומת שני ערכים, כפי
שעשינו זה עתה, או כדי לבחון שני משתנים שונים. לדוגמה, נניח שעליך לכתוב תוכנית
שמזינה את משכורתו של המשתמש ואת מספר בני המשפחה התלויים בו, כמו תוכנית 8.5.
0 8[ פרק 8: להשאיר את ההחלטה בידי המחשב
תוכנית 8.5: בחינת שני משתנים
/ *6. 5 8עסל+*]/
()ה₪81
/
; 06060%8 %ח1
;10008 %+108+
; ( "006ח1 הטסץ %88ה6 16858ק")פשט
; (0006ה81 ,"+%")+5080
; ( "%5ה006ה0608 + "6פהטה 8ה+ %60ה6 16888ק%5)"0טק
; (%8ה00ק806 ,"%0")+5080
(2 < %8ה06ק06 88 20000 > 0008ה1) 11
; ("א8+ 0006ח1 סה 6שס טסץ")פסטם
תנאי ה-1: בוחן שני משתנים, סוחסטת! ו-15ת6ק46. ההכנסה (6ותססת!) חייבת להיות קטנה
מ- ,520,000 וגם מספר התלויים (18ת6ק66) חייב להיות גדול משניים - כדי שהתנאי
יתקיים וההודעה תוצג. אס אחד משני התנאיס אינו מתקיים, כמו במקרה של בן משפחה
אחד או הכנסה של 520,001, לא תבוצע הוראת ה-()9)טק.
יש לנקוט זהירות בשימוש באופרטור .88, ולוודא שהוא אכן משיג את מטרת התנאי.
לדוגמה, אל תשתמש לעולם באופרטור 8.86 כדי לבחון אס למשתנה כלשהו יש שני ערכים.
התנאי
(יץ' == 4896ג] .88 'ץ' == ספַהאה)) ]1
לעולם לא יתקיים. משתנה אינו יכול להיות שווה לשני ערכים שוניס. לעומת זאת, ניתן
לבחון משתנה אחד כדי לקבוע אם הוא בתוך טווח של ערכים, או מחוץ לטוות.
כדוגמה, נניח שמס המותרות מוטל רק על פריטים שמתירם נע בין 540,000 לבין 560/000.
כדי לבחון זאת נציב את התנאי הבא:
1] )6051 <= 40000.00 86 005) >= 60000.00(
כדי שביטוי ה-11 יהיה אמת, שני התנאים חייבים להתקיים, בגלל האופרטור 6ַתג. כדי
ששני התנאים יתקיימו, מחיר הפריט צריך להיות גדול או שווה ל-540,000 וגם קטן או
שווה ל-560,000, בעת ובעונה אחת - כלומר, בתוך טווח המתירים, כפי שמודגסם בתרשים
3
אופרטורים לוגיים
11
תרשים 8.3
שימוש באופרטור לוגי כדי
לקבוע אס ערך כלשהו נמצא
בתוך טוות ערכים.
008% >6=> 0
הקסהה היאק
0 1 2 3 4 .... 40,000 40.001 40,002 ....- 60,001 60,002 .....
0
005% <= 0.00 88 005% >= 0
תי "+
.... 60,002 80,001 1 ....... 0,002 40.001 ל 0
8
אם היית משתמש כאן, בטעות, באופרטור או, כל ערך של המשתנה )005 היה מקיים את
התנאי. כדי לקבוע אם ערך כלשהו נמצא מחוץ לטווח ערכים נקוב, עליך להשתמש
באופרטור או ולשנות את מיקומס של האופרטורים גדול-שווה וקטן-שווה. הביטוי הבא
בוחן אס הערך של המשתנה 6וחססח1 נמצא מחוץ לטווח, על ידי הצבת השאלה האס הערך
קטן-שווה לגבול התחתון של הטווח, או גדול-שווה לגבול העליון:
(60000,00 =< 6ותססת1 || 20000.00 => 6ותססמםו) ]1
;("61855 310016 ]0 316 טסצ')פונוק
האופרטור לא (07א) נקרא אופרטור יחידני מכיוון שהוא פועל על פריט אחד בלבד - שם של
משתנה או של קבוע. אם נקבע שהערך 0 גתשב לשקר (88186), כל ערך שאינו אפס - בין אם
הוא מספר שלילי או מספר חיובי - ייחשב לאמת. ההוראות הבאות, לדוגמה, יציגו את ההודעה
"8156) 15 )תנוסכ)", מכיוון שערכו של המשתנה ]תטסס הוא 0:
;00 ותו
0 = 1תט00
(("9156] 15 )תטסס") פווק (ותטסס) ]1
התנאי פועל בצורה זהה לביטוי (0 == |תטסס) ]1. באופן דומה, ההוראות הבאות יציגו את
ההודעה "06ז] 18 +םטס0)" מכיוון שערכו של ותטסס שונה מאפס:
;60% ותו
1 = 4טסס
;("6טז] 15 )תטס?)") 5וטק (ותטס6) ]1
2 8 1 פרק 8: להשאיר את ההחלטה בידי המחשב
התנאי זהה לביטוי (0 =! זחטסס) ]1 כתיב מקוצר לבדיקה אם הערך שונה מאפס. בפרקים
הבאיס תלמד כיצד להשתמש באופרטורים יחידניים.
בצקודות ו מקננות
אחרי תנאי ]1 או פקודת 6156 יכולה לבוא כל הוראה שהיא. ההוראה יכולה לשמש לקלט
או לפלט של ערך, לבצע פעולה מתמטית או לקרוא לפונקציה. ההוראה יכולה גם להיות
פקודת ) נוספת. פקודת ]1 שנתונה בתוך פקודת ]1 אחרת נקראת מקנכת (65166ח). לדוגמה,
בקבוצת ההוראות הבאה, פקודת ה-!: השנייה מקננת בתוך הראשונה:
(100000 < 6וחססת!) ]1
('פ' == 5)8105) ]1
5 = 181916
תנאי ה-1ו השני נבחן רק כאשר תנאי ה-]: הראשון מתקיים, ומכאן שהמשתנה 16ג431)
מקבל ערך רק במקרה ששני התנאים הס אמת. ניתן לכתוב זאת גם בעזרת אופרטור לוגי, כך:
(5' == 5ט)5/8 66 100000 < 6ותססם1) ]1
(0.35 = 1881816
שתי הדוגמאות מבצעות מטלה זהה, אולס צורת הכתיבה השנייה, תוך שימוש באופרטור
הלוגי .88, ברורה יותר. אין צורך לפענח מה עושה כל ביטוי ]4 בנפרד; קריאת הביטוי
מסבירה את משמעותו: "אם 6ותססתו גדול מ-100000 וגם 518008 שווה 8, אזי 841966)
שווה 0.35".
ככלל, ניתן להחליף כל שתי פקודות ]3 מקננות עוקבות - בביטוי אחד הכולל את
האופרטור הלוגי .88. כלל נוסף: כדאי להימנע מפקודות ]1 מקננות, מכיוון שהן עלולות
להביא למצביס בלתי-ברוריס ולקוד קשה לקריאה. לדוגמה, עיין בתוכנית הבאה:
(0םוגות
|
6 סח )108
((6ת61000 ,'"ן%")1ת508
(20000.00 =< 6וחססת1) ]1
(100000.00 => 6ותססחו) ]1
;("22% 18 1916 אג] זטס )וטק
56
;("15% 15 136 זטסץ 50 520,000 103 1655 תז68 וס ) פוט
פקודות ]1 מקננות 3 1
מקריאת התוכנית נראה שהיא אומרת כדלקמן: "אם סותססמו גדול מ-520,000 וגם קטן
מ-5100,000, הדפס את ההודעה הראשונה, אולס אס 6וססת! אינו גדול מ-520,000, אזי
הדפס את ההודעה השנייה".
לרוע המזל, התוכנית תתקמפל ללא שגיאות, אך לא תציג את התוצאות הנכונות. אם תקליד
ערך קטן מ-520,000 לא תתבצע אף אחת משתי הוראות ה-()פונוק, ואס תקליד ערך גדול
מ-5100,000, ידווח שיעור המס כ-15% בלבד.
פקודת ה-6186 מקושרת לביטוי ה-1! הקרוב אליה ביותר, ללא קשר להזחת השורות
בתוכנית. בתוכנית הזו, הזחת השורות מטעה את הקורא לחשוב שפקודת ה-6186 מקושרת
לתנאי ה-)! הראשון, אך למעשה, ה-6186 מקושרת אל פקודת ה-1ג השנייה - ומתבצעת רק
במקרה ש-6ותססת: גדול מ-20,000 אך אינו גדול מ-100,000.
כדי להשיג את הכוונה המקורית, יש לכתוב את ההוראות כך:
(20000.00 =< 6תזססם!) ]1
|
(100000.00 => 6ותססם!) ]1
;("22% 15 1816 18% זטס ')פונוק
)
6
;("15% 15 1916 זטסץ 50 520,000 ת089] 1655 תז68 וס ץ')פוגוק
הסוגרייסם המסולסלים מבודדים את פקודת ה-]1 המקננת ומאלצים אותה להסתיים
בתוחס הסוגר. הפקודה 6185 מקושרת עתה לפקודת ה-11 הראשונה.
דרך טובה יותר לכתוב את קטע התוכנית הזה היא בעזרת פקודת ]1 אחת, כך:
(100000.00 => 6ות0סח! :88 20000.00 =< 6ותססתו) ]1
(("22% 15 1816 8%] זטס ')פוטק
56
;("15% 15 1916 זטסץ 50 520,000 ת8ם! 1655 תז63 טס ')פוטק
בצורה זו נמנעת אי-הבהירות הנובעת מפקודות ]1 מקנגות וכפל סוגריים מסולסלים.
תיקנו אומנס את הלוגיקה של התוכנית, אולס היא עדיין סובלת מפגם משמעותי. התוכנית
מציגה הודעה רק במקרה שההכנסה (סותססת1ו) שווה או קטנה מ-5100,000. תוכנית שבנויה
כהלכה חייבת לקחת בחשבון את כל המצבים האפשריים. לדוגמה, אם תקליד ערך הכנסה
של 5150,000, לא תוצג כל הודעה. האס פירוש הדבר שאינך חייב כלל במס!
פתרון אפשרי אחד, המוצג בתוכנית 8.6, עושה שימוש בפקודות 16.66 מקננות כדי
להתייחסי לכל רמות ההכנסה האפשריות. ודא שברור לך האופן בו פקודות ]1 אלה מקננות
4 8[ פרק 8: להשאיר את ההחלטה בידי המחשב
אחת בתוך השנייה. אס התנאי הראשון הוא אמת (20000.00 > 6ותססת:), מתבצעת הוראת
ה-()פונ הראשונה, והתוכנית מדלגת על יתר ההוראות. מילת המפתח 6155 הראשונה
מקושרת לפקודת ה-11 הראשונה, ולכן התנאי השני (100000.00 > 6וחססת!) מתבצע רק אס
התנאי הראשון אינו מתקיים.
תוכנית 8.6: שימוש בפקודות 1 מקננות כדי להתייחס לכל
התנאים
/]*86%5.0א₪780*]/
()ה81ח
1
;6ססח1 +108+
;(" :180008 תטסץ ח%8ה5")++ה1חק
; (0008ה81 ,"+%")50801
(20000.00 > 180006) +1
;('15% 15 78%8 א8+ תטסץ")פצטם
0
(100000.00 > 0008ה1) +11
;("22% 18 78%8 א8+ תטסץ")פצטק
06
;("35% 18 6 אג+ מטסצ")5+טק
]
שיס לב שקיימים שלושה מצבים אפשריים, אולס רק שני תנאי ]ג. כשמשתמשים בשילובי
6 עוקביס, זקוקיס לתנאי אחד פחות ממספר המצבים האפשריים. אם המצב הראשון
אינו מתקיים, והמצב השני אינו מתקיים, אזי המצב השלישי חייב להתקיים - אין צורך
בפקודת ]1 כדי לבחון אותו. אילו היו ארבעה מצבים אפשריים, היעו זקוקים לשלושה
שילובי 11...6186 ולפקודת 6155 רביעית מסיימת.
עול ]0856/061801/ח5110
כאשר קיימים ארבעה מצבים אפשריים, או יותר, הלוגיקה של פקודות 11..6186 מקננות
עלולה להיעשות מסובכת ומטעה. הפקודה 5 משמשת כחלופה במקרים כאלה.
סופ מציגה מבנה דמוי-תפריט, שבו רשומים כל המצבים האפשריים וההוראות שיש
לבצע בכל אחד מהמצבים, כפי שמדגימה תוכנית 8.7.
המבנה של ]011ו5₪1)01/0856/0019 5 1
תוכנית 8.7: שימוש בפקודה חהסזוש5
/*6.ה0צ501*/
()הגאח
ָ
; 8568 %חב
;("ה :15 6הַ8טףה18 0 שתד")%5טם
("ה78008; הזט50 6ה+ ה1 ה800%6 סִהַהטְחַה18 ג .6)"1+טם
; ( "ה805חחסזם 0067 18006 ההגצבחא 108 צֶ1הס ₪560 .%6)"2טם
6968 0 207%80 ץ11 ס6חהַ0088ה18 1160קהסס 2 .%6)"3טם
; ("ה5+5%005
; ("ה800%8 6ה+ +0 הס( .4")פצטס
;("ח4 0 [ 000+ 805068 תטסץ הפצתם")פ+טם
; ()08%00860 =5080ה8
;('ה')יההס%טם
(58%07ה8) תס+501
0
:'ו' 08858
;[("ה.10000080% 800 טסץע ,עֶ%6)"90טם
;("ח785081 508% עָסח+ ,06ה78] +0 הצ500 6ה+ ה5)"1+טק
68% ;
08886 '2':
8 1%%5חא 0 0800 06 ה08 18000806 0 6חד .ע8007")פ+טס
;("ח
;("ח.51205 0ח8 65קְץ+ 811 ")סט
רוי
:'3' 0886
; (*"ה 000860% 68 טסץ ,0000 ע6/")פשטק
חס 560 6ס ה8ס 1% 0ה8 ,00001160 15 סִהְטהָה18 0 6הד")פ%טם
;("חה
; ("ה.5%805ע5 00000168 +0 ע8016%ע")6+טם
;68%
:'4' 0856
(("ה.0070080% 56 3 ח6פהטה ע1ה0 .עְ5000")פ+טם
;68%
:+"
1 האת+ ה6ת%+0 תפמהטה 8 תס 16%%68 8 ת1%א 660ה76500 טסצ")פ+טס
;("ח4 0+
1
6 8 פרק 8: להשאיר את ההחלטה בידי המחשב
הפקודה 51002 זקוקה לארגומנט המכיל משתנה מטיפוס מספר שלם או מטיפוס זגף0.
אחרי הפקודה מופיעות הוראות הנתונות בתוך סוגריים מסולסלים, המורכבות מסדרה של
פקודות 0886. כל פקודת 6855 מבצעת הוראות המבוססות על ערך אפשרי כלשהו של
המשתנה. הערך חייב להיות מבוטא כמספר שלם, כערך מילולי הנתון בגרשיים או כשמו
של קבוע מטיפוס מספר שלם או מטיפוט ז08.
הביטוי :' 0456, לדוגמה, מורה לקומפיילר לבצע את ההוראות הבאות אחרי הביטוי,
בתנאי שערכו של משתנה ה-ףטו1ש5 הוא '". במקרה שהערך אינו '1', הקומפיילר מדלג
אל ביטוי ה-6886 הבא ובוחן אותו.
כאשר הערך מתאים לתנאי ה-0856, מבוצעות ההוראות המופיעות אחרי ה-0856. הביטוי
6% המופיע בסופה של כל סדרת 0456 מעביר את השליטה אל סופה של הפקודה
50 מכאן נובע, שאם מתבצעת סדרת 6456 אחת, הקומפיילר מתעלם משאר סדרות
ה-0856 ופקודת חס0ו51 מסתיימת.
.אס לא מתקיים אף אחד מתנאי ה-0856, מבוצעות ההוראות שבקטע ה-)01ג/66. בשיטה זו
קל לתת מענה לכל אפשרויות הקלט. אין צורך בפקודת 64%זל עבור תנאי ה-:06/901,
מכיוון שזהו תמיד הקטע האחרון ברוטינת ה-01ז8/1. כלול בתוכנית קטע ]66/01 גם אס
אתה סבור שביכולתך לתת מענה לכל התנאים האפשריים בעזרת סדרות ה-0886 השונות.
אם השמטת ביטוי 1% המחשב יבצע את ההוראות המופיעות אחרי 6856 שהוא אמת,
עד לביטוי ה-68%זט הבא. ניתן להשתמש בתכונה זו כדי לבצע סדרת הוראות אחת עבור
יותר מ-0856 אחד, כמו בדוגמה להלן:
08506
;("65ץ 8 ואו 165000066 טס ''')פונוק :'ע' 0886
זט
:'' 0886
;("סת 4 ה!1או 10500666 טס ")וטק :'ח' 0856
(%זט
בדיקת מעוחנים מטיבום +1!09 ומחדוזות
מכיוון שהערך בביטוי 6856 חייב להיות מטיפוס מספר שלם או מטיפוס ז08, אנך יכול
לכלול בתוכנית ביטויי 6856 כגון :12.87 0856, או :"203" 6356. במחרוזות נדון בפרק 10,
אך אם עליך לבחון ערכים מטיפוס 8081, יש להמיר אותם תחילה לפורמט של מספר שלם
או של ערך מילולי מטיפוס זגת0.
במרבית המקרים ניתן להשתמש בסדרה של פקודות 1..6!85ו, כמו בתוכנית 8.8. פקודות
16 מקצות ערך מספר שלם למשתנה ששמו %61פ!, בהתבסס על ערך מטיפוס :₪08
המוזן לתוך המשתנה סוזססת1.
המבנה של ]01ו80/110/0856/0610 7 8 1
08 ו
תוכנית 8.8: שימוש בפקודות זו מקננות כדי לטפל בערכים
מטיפוס 1031
/*ס.+ה901+0*/
()ח1ח
;00068ה1 108%+
,1 חאה
;(" :100008 תשסץ ח%6תם")++ה1תק
; (8100006 ,"+%")1ה908
(20000.00 => 0008ה1) +1
;'1' = 18/81
068
(60000.00 => 0008ה1) +1
;'2' = 18061
06
(120000.00 => 00086ה1) +11
;'8' = 18/81
060
;'4' = 18/61
(18081) ת801%0
1
:'' 0886
6" )פ+טם
;08%
15%"(
08588 '2':
28%"( ;
6 ")פצטק
;8%
0888 '':
32%"( ;
8") פ%טק
;08%
0888 '4':
36%"(
ו
8 אד") פצטק
;אס
:1.0
; ("ע+ה6 8110טה1 תה %8780ה6 טסצ")5+טם
1
להשאיר את ההחלטה בידי המחשב
1
ממבט ראשון זה נראה טיפשי למדי להשתמש בסדרה של פקודות 16...6666 וברוטינת
ת51)0, כאשר אפשר מלכתחילה לכתוב את כל ההוראות בפקודות 11..66866. בתוכניות
פשוטות, כמו זו שבדוגמה, ניתן אכן לעשות זאת. אולס כאשר ההוראות שיש לבצע עבור כל
6 מורכבות יותר, וכוללות בעצמן פקודות ! מקננות, המבנה של רוטינת סוושפ עדיף.
ביטויי ה-6856 מראים בבירור כמה מצביסם נבתנים, ואילו הוראות מבוצעות עבור כל מצב.
"בדק הבית" הכרוך בהקצאת ערכים מילולייט בעבודה עם סדרות נפרדות של פקודות
6 מצדיק את הטרחה הנוספת.
( וב התוכניה
כפי שניתן לראות, ישנן מספר דרכים לכתוב אותה תוכנית - תוך שימוש בכמה פקודות ]1,
בפקודות ]1 מקננות, באופרטורים לוגיים או בפקודת גט16ש5. תוכנית 8.9, למשל, מדגימה
כיצד ניתן לבצע את תוכנית החידון (שבגרסה הקודמת עשתה שימוש בפקודת ב50/100),
בעזרת הוראות 1]..6[%6 מקננות. הבחירה תלויה בסגנונך האישי. איש לא יוכל לטעון
שהדרך שבחרת בה אינה נכונה, כל עוד התוכנית מבצעת את כל מה שהיא אמורה לבצע.
מובן שאם התוכנית מביאה לתוצאות שגויות - היא ללא ספק פגומה - אך אין זה בהכרח
בגלל שבחרת מבנה שאינו נכון.
תוכנית 8.9: תוכנית החידון - שימוש בפקודות 6/85...ו מקננות
/*124.0*/
()ה81ח
10% 868 ;
; ("ח :15 806ט0ה18 0 6חז")%5טק
; ("ה 6ה78" +0 ה%ש50 8ה+ ה1 ה8א500% 08406ה18 3 .5)"1+טק
; ( "חפטסים 00068 18706 [ה1+1הא 108 ע1הס 0586 .2")פסטק
898 0 007%60 /68511 סאְטהַה18 00001180 3 .%5)"3טק
; ("ח5+5105
; ("ה800%6 6ח% +0 פהסא .5)"4+טק
;("ה4 0+ 1 חסת+ 68א8ה8 תטסץ ח%6ה5)"5+טם
; ()061008 =875060
; ('ה')"ההס%טק
('5000=='1ה8) +1
,
;("ה.0070060%ה1 878 טסץ ,ע5)"8000+טק
; ("ח88081ק 508% ע6ה+ ,06ה08= +0 ת500% 6ה+ ה1")פסטם
1
עיצוב התוכנית 0.| 1
1000
00|
('8060=='2ה8) +1
1
68 50 5860 06 0870 00806ה18 0 פהזד .עֶ"%5)"507טק
; ("ה 0"805סים
;("ח.581208 0ה8 85קץ+ 811 +5)"0+טק
/
106
('5087=='3ה8) +1
.
;("ת 077000% 876 טס? ,0000 עח6/")פצטם
0 56 088 1% 0ה8 ,00001180 15 ש6אָבּטְהַה18 0 6הד")פסטק
; (ח"8 חס
; ("ה.55%605 "6+טקהסס +01 ע16%ה8ע")%5טקם
1
00
('58007=='4ה8) 1%
;("ה.0077060% 18 3 תפסהטה צְ1ה0 .צֶ507")פצטק
06
1 תאת+ השת+0 ה6סהטה 8 08 16%%68 8 ה+גא 060ה76520 טסץ")פצטק
;("ה4 0+
1
בחר בשיטה הנוחת לה שתיצור תוכנית ברורה ומובנת ככל האפשר. לעתים השיטה הטובה ביותר
מצריכה שימוש במספר הרב ביותר של הוראות - התוכנית הקצרה ביותר איגה בהכרח גם הטובה
ביותר. בכל שיטה שתבחר עבור תוכנית מסוימת, הקפד תמיד לוודא את תקפות הקלט.
בדיקת תקבות הקל
אל תניח מראש שהמשתמש יקליד את הערך הנכון, או אות קטנה או גדולה, בהתאם
לצורך. לדוגמה, בפרק 7 ראינו תוכנית שמניחה מראש שהמשתמש יקליד את שיעור ההנחה
למוצר כמספר עשרוני. תוצאת החישוב תהיה שגויה אס המשתמש יקליד את הערך 5
במקום 0.05 לציון חמישה אחוזים. אחת הדרכים לפתור את הבעיה היא להוסיף את
הפקודה הבאה:
(1 < םאוס0אזות) ]1
0 / תא00אזו = תאוס0אזות
פקודת ה-1 תמיר את הקלט מ-5 ל-0.05.
פרק 8: להשאיר את ההחלטה בידי המחשב
בפרק 6 ראינו תוכנית שמתשבת את משכורתו של עובד. כזכור לך, במקרה שהעובד צבר
פחות מ-40 שעות עבודה שבועיות, התוכנית הפחיתה, למעשה, את התשלוס המגיע לפי
תעריף כפול לכל שעת עבודה חסרה. תוכנית 8.10 מתקנת את הפגם. פקודת ה-1: כוללת
שתי סדרות של הוראות - סדרה אחת מתבצעת כאשר העובד צבר 40 שעות עבודה לכל
היותר, והסדרה השנייה מתבצעת כאשר מספר השעות גדול מ-40. לכל משתנה ששצג
מוקצה ערך באחת משתי הסדרות, כדי שלא יוצגו ערכים בלתי-ידועים.
תוכנית 8.10: תוכנית שכר מתוקנת
/*ס.8הטסת9811*/
()ה81ח
1
;9 ,106 0 ,%78+א6 ,7600187 ,0%81+ ,(פהטסה ,7816 %+108+
;(" :עֶ8ק +01 708%6 ע1תטסת תטסץ %68הם")++הבחקם
; (870810 ,"+%*")%ה9808
((" :80א₪00 טסץ 8הטסה 0% ה6סהטה 6הת+ ה%6הם")++הבחם
; (8הט800 , "+%")01ה508
21 * 110057816 ₪
(40 => פתטסה) 11%
1
* 8תט0ת = 600188ת
07 = %08א8%
= 0/879%188
;00186 = 0%81+
|00
]6 * 40 = 600188ת
- 70008 = %798+8%
1 6 * %708א6 = 0/879%106
;6 + 9000188 = 10%81+
1
; (000180ת ,"ה21%.% 15 "5818 ץ[9609 7600188 הטסצ")++ה1ים
; (8ת%א6 ,"ה5תטסה 0%67+106 2%.% 8078066 טסץ"))להגים
; (1₪6+ 0 ,"ה8%.2% 56 08%6 8011₪6ע0 תטסץ*)++הגחקם
; (0000+106 ,"ה+2.% 15 ע8ק 0671186 תטסץ")%+ה1"ם
; (0181+ ,"ה2%.% 18 ץ8ק 0%81+ חטסץ")++ה1חם
עיצוב התוכנית 01 1
התעריף הכפול, המיוצג על ידי המשתנה 1886ז6, מחושב לפני הוראת ה-1, מכיוון שהתעריף
הכפול תקף לגבי כל העובדים, גס עבור מי שלא עבד בפועל למעלה מ-40 שעות בתקופה
הנוכחית. מכיוון שחישוב זה אינו מבוסס על קיוס או אי-קיום של תנאי כלשהו, הוא
מחושב מחוץ לפקודת ה-)1.
עס זאת, הפתרונות שהצגנו לשתי הבעיות אינס מלאים. המשתמש עדיין יכול להקליד
מספר שלילי עבור שיעור ההנחה, או ערך בלתי סביר, כמו 2500, עבור מספר שעות העבודה
השבועיות. בפרק הבא תלמד כיצד לפתור באופן סופי את בעיית הקלט.
לוה
1. מהו ההבדל בין הסימן = לבין הסימן ==!
2. כיצד מבצעים יותר מביטוי אחד כאשר תנאי כלשהו מתקייס!
3. מהי מטרתה של פקודת 16185
4. כיצד בודקים אם מספר כלשהו נמצא בתוך טווח ערכיס נתון!
5. הסבר את אופן השימוש בפקודות !1 "מקננות".
6. במה שונה פקודת 01ו1ש5 מפקודת ]11
7. כיצד ניתן להשתמש בערך מטיפוס )1104 בפקודת חסוןאפ?
8. הסבר כיצד ניתן להשתמש בפקודת ]1 כדי לבדוק את תקפות הקלט.
ד רגילים
0 כתוב תוכנית שמזינה מספר כלשהו ומדווחת אס המספר הוא זוגי או אי-זוגי.
2. כתוב תוכנית שמזינה מספר כלשהו ומדווחת אם המספר נמצא בטווח הערכים
שבין 1 ל-100.
3 כתוב תוכנית שמזינה מספר שלם ומדווחת לאיזה טווח מספרים הוא משתייך:
קטן מ-0, מ-0 עד 50, 51 עד 100, 101 עד 150 או גדול מ-150.
.
=
כתוב תוכנית המנחה את המשתמש להקליד מספרים לתוך המשתנים ותותשוס1
-ותנותק1ת. ערכו של ותטתאוס! חייב להיות קטן מערכו של ותטתתקות. אס לא
כך הס פני הדברים, על התוכנית להחליף בין המספרים ולהציב את הערך
הקטן במשתנה ותטתשס! ואת הערך הגדול במשתנה ותטתתקות. הצג את
הערכים כדי לוודא שהפעולה בוצעה כהלכה.
02 1 פרק 8: להשאיר את ההחלטה בידי המחשב
הסבר מה לקוי בתוכנית הבאה:
()ח1גות
|
6זת
;(380 זטסץ זסוםם)]]מוזק
;6886 ,")%")1ה509
ת6) 18 > 386 ]1
;("6ז0ץ 01תת63 טס ")וטק
656
חסת]) 18 < 486 ]1
(("016 ת08 טס ")פוט
19
5
780 ח/פרת
2 וכנית מתחילה ומסתיימת, אך אין פירוש הדבר שעליה לבצע פעולה
4 ₪ כלשהי פעם אחת בלבד. ייתכן שעליך לטפל ביותר מהזמנה אחת, או
שעליך לבצע כמה חישובים שונים. ייתכן שתרצה להמשיך ולבקש קלט מהמשתמש,
עד שיקליד ערך הנמצא בתוך טווח הערכים הנכון.
15
תרשים 9.1
המבנה של לולאת זס).
1%
שפת 60 ושפת ++6 כוללות שלושה מבנים מובדלים, הנקראים לולאות, לצורך טיפול
בפעולות חוזרות:
* לולאת זס!
* לולאת 116גשו...60
> לולאת 1116
כל אחד ממבנים אלה יכול לחזור על הוראה, על סדרה של הוראות או אף על תוכנית
שלמה.
(8'מו בלולאת זסז
השתמש בלולאת ז0? כאשר ידוע לך המספר המדויק של חזרות שברצונך לבצע. מבנה
הלולאה מודגס בתרשיט 9.1. שיס לב שאת תו הנקודה-פסיק המסיים יש להציב אחרי
ההוראה, ולא אחרי הפרמטר של הביטוי זס!. שלושת מרכיבי הפרמטר שבתוך הסוגריים
חייבים להיות מופרדים בנקודה-פסיק.
חזור עד שהתנאי
ביטוי שמשמש חדל להתקיים ערך התחלתי
להגדלת הערך | אי
( 66 חן ;הסוזו0חס6 (4106ע=|118ח]) זט
תו נקודה-פסיק מסיים
00 --=--
ההוראה שיש לחזור עליה
לדוגמה, התוכנית הבאה משתמשת בלולאת זס! כדי להציג על המסך את המספרים 1 עד
0, שורה אחר שורה:
()תו תת
|
ות
(++)10;16064=> 160681 ;60091=1ז)זס]
((160681 ,"ח%0")])תוזק
פרק תשע: פעולה חוזרת
הלולאה נשלטת על ידי משתנה ששמו |03ק6ז, הנקרא משתנה האינדקס. באפשרותך
להעניק למשתנה האינדקס כל שס שתרצה, אך המשתנה חייב להיות מטיפוס מספר שלם.
הפרמטר של זס! מתחלק למקטעים הבאים:
1 = 100691 מאתחל את הערך ההתחלתי של המשתנה 160681.
10 קביעת תנאי החזרה: כל עוד )16063 קטן-שווה ל-10.
++160681 מגדיל את ערכו של )16064 אחרי כל חזרה.
עס כל חזרה על הלולאה התוכנית מציגה את ערכו הנוכחי של המשתנה )16008.
בל ב-צב ממ 5-8 בצסי 0% 9 בנז פפצננ-נשצמי-9 ההכ <<< <:מכג בצינ 5 גנופ שה .7 מכ אנת -
| הערות ++6 ן
בשפת ++6 גיתן להכריז על משתנה האינדקס בתוך הפרמטר,
(++10;160601 => 160691 ;1 =60081ז וחו)זס+
% םא הפ םא ₪ א
כאשר התוכנית נתקלת בלולאה בפעס הראשונה, היא קובעת את ערכו של המשתנה 100681
ל-1. לאחר מכן היא בודקת את התנאי כדי לראות אס הערך של )16064 קטן או שווה
ל-10. מכיוון שהתנאי מתקיים, התוכנית מבצעת את ההוראה הקשורה ללולאה, כלומר -
מציגה את הערך של המשתנה.
אחרי ביצוע ההוראה, התוכנית מגדילה את ערכו של המשתנה ב-1, ובודקת שוב את התנאי
(כפי שמודגם בתרשים 9.2). מכיוון שהתנאי עדיין אמת, התוכנית מבצעת את ההוראה פעם
נוספת ומציגה את ערכו הנוכחי של המשתנה. התהליך חוזר על עצמו עד שהערך של
המשתנה גדל ל-11. במצב זה התנאי 10 => )16063 כבר אינו מתקיים, ולכן ההוראה אינה
מבוצעת והלולאה נפסקת.
הביטוי ++)176063 מגדיל ()ח וח
את הערך לפני החזרה /
על הלולאה
זו
(++80091] ;10=> 190091 ;107)100081=1 ה
:(60081 , "ח%0") הזז
תרשים 9.2
התנאי (בדק בסיום של
כל לולאה,
שימוש בלולאת 101 77 1
בדוגמה הקודמת ההוראה עשתה שימוש בערכו של המשתנה. אין הכרח לכתוב כך את
ההוראה. לדוגמה:
()ם1גו
|
ו
זז
;"0181801015 10 ז16ת0 16856ק")פונוק
(++10/60001=> 00081 [081=1ק16)זס1
;(1 2010 =ז16000
]
תוכנית זו מבצעת את ההוראה ()ז26/003 עשר פעמים, פעם אחת עבור כל חזרה על
הלולאה, כשהערך של )16068 גדל מ-1 ל-11. משתנה האינדקס משמש רק לצורך קביעת
מספר החזרות. ניתן גס לכתוב את הוראת ה-זס] בצורה הבאה, עם אותן התוצאות:
(++)110/76068=> 101 =100081) 10
((20101010 =ז16))0
|
גם בצורת כתיבה זו יוזנו עשרה תווים, הפעם על ידי הגדלת ערכו של משתנה האינדקט
מ-101 ל-110. ערכו המדויק של המשתנה חשוב רק כאשר משתמשים בו בלולאה עצמה,
השהיית החוכנית
ניתן להשתמש בלולאת זס] ללא הוראות כדי להשהות את הרצת התוכנית למשך זמן נקוב:
101)0618=1; 6618 >=1000; 00127++((
הלולאה אומנס אינה כוללת הוראות כלשהן; אך היא חוזרת על עצמה 1000 פעמים, תוך
הגדלת המשתנה /6618 ב-1 בכל חזרה ובדיקתו לעומת התנאי. החזרה הזו גורמת להשהיה,
עד שהתוכנית עוברת להוראה הבאה.
השתמש בטכניקה זו כדי להשהות את התקדמות המידע המוצג על המסך ולאפשר
למשתמש די זמן כדי לקרוא את ההוראות או ההנחיות המוצגות לו. זוהי חלופה להנחיה
למשתמש להקיש זפות כדי לעבור למסך הבא
עליך לבצע מספר ניסיונות כדי לקבוע את משך ההשהיה שמתקבל מ-1000 חזרות
במערכת המחשב שלך. משך ההשהיה תלוי במהירות של המחשב שברשותך. לולאה
שבמחשב מהיר גורמת להשהיה בת שנייה אחת, עשויה לגרום להשהיה בת שתי שנות
במחשב איטי יותר. הגדל או הקטן את מספר החורות בתנאי הלולאה כדי להשיג את משך
ההשהיה הרצוי לך.
8 1 פרק תשע: פעולה חוזרת
הוראות מדובות
כדי לבצע יותר מהוראה אחת בלולאה, הקף את סדרת ההוראות בסוגריים מסולסלים.
לדוגמה, להלן תוכנית שממירה 101 נתוני טמפרטורה עוקבים (מ-32 מעלות עד 132
מעלות) מפרנהייט לצלזיוס:
()תוגות
|
6 ותו
05 03
;("ם8ו611))26[51תת6זם3")פווק
(++קות6) (132=>ק 6 (32=קות6))זס1
;(32-קות5.0/9.0(*)6) = 00181008
;(0615105 ,קות6),"ח86.21)ז%0")])הוזק
]
בכל חזרה של הלולאה מבוצעות שתי הוראות. הערך של משתנה הבקרה קובע הן את
מספר החזרות והן את הערכים שיומרו לצלזיוס. השווה את התוכנית הזו לתוכנית הבאה:
()הו גת
|
,ות ותו
ו
;("מ611])2615105תמ6זי")פוטק
(10=קות6)
(++162681>=10/760681 ;60081=1ז)זס1
ז
;(32-קוחס))*(5.0/9.0) = 0018108
;(0615108 ,קות6),"ם%0))86.20")]זתוזק
(0=+קוח10
הערה
הפונקציה ())פוז קובעת
את הפורמט ומיישרת את
הנתונים המוצגיס
בעמודות. שני תווי הדילוג
()) מיישריס את
טמפרטורות הצלזיוס עס
כותרת העמודה. מציין
הפורמט (%6.2) מציג את
הטמפרטורות עס שתי
ספרות אחרי הנקודה
העשרונית, על פני שישה
תוויס.
שימוש בלולאת זס1 ל 1
200
כאן קובע משתנה האינדקס רק את מספר החזרות. נתוני הטמפרטורה שיש להמיר נקבעים
על ידי המשתנה קות6), שגדל בדילוגיס של 10 בכל חזרה - מ-10 ל-20, ל-30, וכן הלאה
עד 100.
שימוש במשחנים
גם אס בעת כתיבת התוכנית אינך יודע עדיין לכמה חזרות תזדקק, באפשרותך להשתמש
בלולאת 01] אס תדע את מספר החזרות בעת שתריץ את התוכנית. ניתן להזין ערך
למשתנה ולהשתמש בו בתנאי הלולאה. לדוגמה, התוכנית הבאה מבקשת מהמשתמש
להקליד טווח של טמפרטורות להמרה - ולמעשה, את מספר הפעמים שהתוכנית תחזור על
עצמה:
()תוגות
|
5 ,160 ות
כו
;(" :016ו6131קות16 קם11ז513 116 זסזת>")]ותוזק
;(1)"%6',051011ת 508
;(" :16נ61800קות0] קת61מ6 126 זסותכ")]ותוזת
((1)"96",6260 508
;("ת611])2615105ת6זם8]")פוטוק
(++קות6) (0ת6=>קות6 ;5141=קומ6))זס1
|
;(32-קות5.0/9.0(*))6) = 0618108
;(0615105 ,קות16,"ח1)"801]86.21ותוזק
]
בתוכנית זו על המשתמש להקליד את ערך הטמפרטורה ההתחלתי והערך הסופי שברצונו
להמיר. המשתנים ]541 ו-6ת6 משמשים בפרמטר של זס! כדי לקבוע את הערך ההתחלתי
של משתנה האינדקט וכדי לבדוק אם התנאי מתקיים. הלולאה נפסקת כאשר הערך של
קת גדל מעבר לערך הטמפרטורה הסופי. לכן, אס המשתמש מקליד 20 ו-43, התוכנית
ממירה מפרנהייט לצלזיוס את נתוני הטמפרטורה שבין 20 מעלות ל-43 מעלות, ועוצרת -
4 לולאות.
פרק תשע: פעולה חוזרת
לולאות מקננוח
כאשר מבוצעת פקודת זס] אחת בתוך פקודת זס! אחרת, הן נקראות לולאות מקננות.
התוכנית חוזרת על הלולאה הפנימית בשלמותה בכל חזרה על הלולאה התיצונית. ניתן
לדמיין לולאות ז10 מקננות כבעלות שני מימדים, ולולאות זס! בודדות כבעלות מימד אחד.
לדוגמה, עיין בתוכנית הבאה:
()תוגות
|
;תומט]60 ,סז וח1
(++10/:0=> שס ;1=שסז)זס]
|
(++תותט10;601=>תותט001 ;1=מותט101)001
;("*")1ותוזק
/*)15ו] 15166 ,קסס1 560006 01 015106*/ ;('ת')זהווסווק
)
התוכנית מציגה 10 שורות של 10 כוכביות ומשתמשת בשני משתנים מטיפוס מספר שלס:
אוסז [-ממזנ[60. הלולאה החיצונית מגדילה את ערכו של שסז מ-1 ל-10. בכל חזרה על
הלולאה החיצונית, מבוצעת הלולאה הפנימית 10 פעמים, מגדילה את ערכו של חותט[00
ומציגה שורה של 10 כוכביות. (שים לב ששמות המשתנים מסייעים להבהרת הלוגיקה של
התוכנית). הקינון של הלולאות מודגם בתרשים 9.3. הלולאה הפנימית היא:
(++תותט10;001 =>תותט001 ;1 =תותט[60)ז0]
;("*"))ותוזק
לפיכך, מוצגות בסך הכל 100 כוכביות - 10 לולאות פנימיות (עמודות) לכל אחת מ-10
הלולאות החיצוניות (שורות). תרשים 9.4 מציג את ערכי המשתנים בכל חזרה.
שיס לב למיקומה של ההוראה ;'ח')ז8תס1וק. ההוראה מופיעה מחוץ ללולאה הפנימית, אך
בתוך הסוגריים המסולסלים של הלולאה החיצונית. ההוראה מבוצעת עשר פעמים, פעם
אחת בכל חזרה של הלולאה החיצונית, ומחדירה פקודת שורה-חדשה בסופה של כל שורה.
תוכנית 9.1 מציגה דוגמה נוספת ללולאות מקננות. התוכנית מבצעת עשר לולאות תיצוניות
ועשר לולאות פנימיות כדי ליצור את לוח-הכפל. במקוס להציג כוכבית בלבד, כמו בדוגמה
הקודמת, היא מציגה את מכפלת ערך השורה בערך העמודה.
שימוש בלולאת זס1 01 2
תרשים 9.3
לולאה פנימית ולולאה
חיצונית.
תרשים 9.4
ערכי המשתניס בכל חזרה.
200
לולאה חיצונית ()חוגוח
לולאה פנימית |
= :חוחט!0ס ,סז זחז
ו 0 סז ,1=ש ז)זס]!
1
--
(++חחחטו10;00 ו 1= 0 ,
2 "הו
"זוז ו ,00| 500006 01 7/*015/06 / זו
1 ב 10 2-02 שא טמ ככ בב
|
/
)
לולאה פנימית
ו
1
*צ*אא* אאא אא *
א א א*א*א<א*<א אא <*
*צ*אאא אאא א <
**א*אא* אאא א א
*' **<*<צ*<צ<צאא< <*
לולאה חיצונית
*' א צ*<צ*<*<*<אאא* *
* ח*צ*צצ*זד<אא א א
*צצצצאדד א *
*צצצאצאצ,א* <*
-2 ₪ 00 [| ₪ 0 ₪ 62 9 >
)=(
*'צ*צ*אצדצצצא כ א*
פרק תשע: פעולה חוזרת
תוכנית 9.1: תוכנית לוח הכפל
]0.0 1ז*]/
()ה1הח
,
ההט001 ,סק %ה1
; ("חה8016ד ה1+121108%10ט₪ ש0ח38 ע++")פצטק
(++0%ת;10=> א0ת ;1=א0ה)107+
ָ
(++חהט10;601=>ההט001 ;1=החט107)001+
; (החט700*001 ("1)"%60+ה1חם
;('ה')יההס+טק
הפלט של 11165/80.6 מוצג בתרשים 9.5.
תרשים 9.5
68 ת0ס16101108610טא צַבַתגּא צָא הפלט של תוכנית לותח
הכפל.
שימוש בלולאת זס1 03 2
לבסוף, עיין בתוכנית הבאה:
()תוות
|
;תותט]00 ,סז זם1
(++ע10010=> עוס ;0/=1ז)101
[
(++תותט101/;001=>תותט[00 1=תומט001)ז10
("*")])ת1זק
;('ם')ז וטק
]
התוכנית מציגה סדרת כוכביות, כמודגס בתרשים 9.6.
תרשים 9.6 /
מבנה הפלט כאשר מספר
החזרות על הלולאה 0
הפנימית מבוקר על ידי
הערך של הלולאה החיצונית. 6
*צאצאצצ
*אצ*אאא*
*.אא****
*******
***.א*א***
אצ+***א..***
*אאאא.*.****
לכל שורת כוכביות אורך שונה. במקרה זה, הלולאה הפנימית אינה חוזרת מספר קבוע של
פעמים, אלא מספר החזרות גדל עם כל חזרה של הלולאה החיצונית - כוכבית אחת בשורה
הראשונה, שתי כוכביות בשורה השנייה, שלוש כוכביות בשלישית, וכן הלאה. מספר
העמודות בכל שורה זהה למספר השורה. אנו משיגיס את התוצאה הזו על ידי שימוש
במשתנה ששסז בתנאי של הלולאה הפנימית.
בחזרה הראשונה על הלולאה החיצונית, מבוצעת הלולאה הפנימית פעם אחת ומציגה
כוכבית אחת. בחזרה השנייה על הלולאה החיצונית מבוצעת הלולאה הפנימית פעמיים,
ומציגה שתי כוכביות. תהליך זה נמשך ויוצר את התבנית המוצגת בתרשים.
04 2 פרק תשע: פעולה חוזרת
יש להיזהר כאשר כותביס תוכנית עס שתי רמות, או שותר, של ביטויי זס). תוכנית שמבצעת 100
חזרות על לולאה חיצונית ו-100 חזרות על לולאה פנימית מבצעת, למעשה, 10,000 חזרות!
בלולאת 6ווחו..₪0
השתמש בלולאת 116םשו...60 כאשר אינך יודע מהו המספר המדויק של חזרות, אך ידוע לך
שעל התוכנית לבצע את הלולאה לפחות פעם אחת. מבנה הפקודה מודגם בתרשים 97.
תרשים 9.7
המבנה של לולאת
בצע את ההוראות האלה 00 06
הוחו
כל עוד מתקיים התנאי הזה וזח
]
(6)6081808!וחע
ההוראות הנתונות בסוגריים מסולסליס מבוצעות שוב ושוב, כל עוד מתקיים התנאי
שבביטוי ה-6!ותאי. מכיוון שהתנאי אינו נבחן עד לסיוס הלולאה, הלולאה תתבצע לפחות
פּעם אחת - אפילו במקרה שהתנאי אינו מתקיים כבר קודם לביצוע הלולאה.
בלולאת 8116א..60 עליך לוודא שהלולאת תסתיים. אם התנאי מתקיים תמיד, הלולאה
תמשיך להתבצע עד שתאתחל מחדש את המחשב או תקיש על צירוף המקשים
+
לעתים קרובות משתמשים במבנה של לולאת 60.05 כדי לחזור על תוכנית, עד
שהמשתמש יחליט שאין יותר קלט:
()תוגות
(
קת וםו
0
0
00
|
|(" 6 ות 3 ווקה1")]זתוזק
שימוש בלולאת 1]6תש...₪0 5 2
הערה
כדי להימנע מהתנגשות עם
הקלט של ()]804,
השתמש בפקודה ()[8616
או (/26/6[6 במקוס
הפונקציה ()610(81, או
לחילופין, השתמש בפקודה
(ת5101)ת805] כדי לרוקן
את החוצ>. עיין בפרק 8
למידע נוסף.
(קות16 ,%'5081)'%0
;(32-קות5.0/9.0(*)10) = 0015105
(קותס),"מ 615108 0621665 86.21 15 7 0601665 %6')])ותוזק
(0015105
(("116ו6781ות10 3001161 186 טסץ סכ")!)תוזק
00 100
;('ם')זג סונוק
1
;("081=='1ק16 || 'ץ' ==160081) 1]6תשי
|
התוכנית כולה, למעט הכרזות המשתנים, נתונה בתוך לולאת 116תא...60 אחת גדולה.
הלולאה מתבצעת שוב ושוב, עד שהמשתמש מקליד תו שאינו או ץ בתגובה לבקשת
הקלט. שים לב שהוראת הקלט השואלת את המשתמש אם ברצונו לחזור שוב על הלולאה
היא ההוראה האחרונה בטדרה.
המבנה של 116א...60 משמש גס כדי להבטיח שמוקלד הקלט המתאים. לדוגמה, נניח
שכתבת תוכנית שמזינה שיעור הגחה בפורמט עשרוני. אם המשתמש מקליד ערך קטן מ-0,
או ערך גדול מ-1, עליך לבקש קלט אחחר. לולאת ה-116שו...60 תיראה כך:
00
|
;(" :+תט01500 116 ז6)ת6 16856ק")])תוזק
;(1ת8615600 ,"%1")ת508
|
;(1=< 1תט01500 || 1>0תט116)01500ת שו
תנאי ה-6ג1אי משתמש באופרטור הלוגי או כדי לבחון אס הערך שהוקלד הוא מתוץ
לתחוס הערכיס המותר. הלולאה תתבצע כל עוד המשתמש מקליד ערכים שאינס תקפים.
אין כל פסול ברוטינה הזו כל עוד המשתמש מבין, בסופו של דבר, את הכוונה - ומקליד
ערך תקף. לעומת זאת, אס המשתמש אינו יודע כלל מהו מספר עשרוני, הלולאה עלולה
לחזור על עצמה עד אין-קץ. פתרון אפשרי אחד הוא להוסיף מונה לאלגוריתם, כך:
()םוגות
|
;)תטסס ות1
1103] 01500;
2066 פרק תשע: פעולה חוזרת
000
00
|
;(" :1מ015000 16] זסות6 6856[ק")])תוזק
;(1ת8015000 ,"]%")1ת308
[++)ת00
]
;(20> )תטסס 8.6 (1=< 015001 || 1>=0תט16))41500וםע
;("5)"50010)טק (1==20תטס6) ]1
]
עתה, יש למשתמש 20 ניסיונות להקליד את הקלט המתאים! המשתנה ]תטס0 גדל ב-1 עס
כל עיול בלתי-תקף.
כדי לבצע הוראה אחת בלבד בלולאת 1116א..40, השמט את הסוגרייס המסולסליס.
התוכנית הבאה, לדוגמה, מאפשרת למשתמש להקליד תווים, עד שיקיש ץ:
()תופות
|
4 ותו
0
( 20/0 = 4
(("ץ'=!ג 86 'ץ'=!1]6)8ת שי
לולאות 60 מקננות
ניתן להציב לולאות 1116או...60 זו בתוך זו, כדי ליצור מספר רמות של חזרות. באפשרותך
להשתמש בלולאה חיצונית כדי לחזור על התוכנית כולה עד שהמשתמש יחליט לחדול מכך,
ובלולאות פנימיות כדי לבחון שמוקלד קלט מתאים, כפי שמודגס בתרשים 9.8. הלולאה
הפנימית משמשת להזנת מספר בין 0 ל-100. כאשר מוקלד עיול תקף, הלולאה מסתיימת
ומתבצעות ההוראות הנותרות בלולאה החיצונית. הלולאה החיצונית חוזרת כל עוד מתקיים
התנאי הבא:
(''==)68ק6 || 'ץ' ==160091) 1]6ת אי
ברגע שמוקלד תו כלשהו שאינו ץ או +, הלולאה החיצונית - והתוכנית כולה, מסתיימת.
שימוש בלולאת 116ת/ש...00 07 2
תרשים 9.8 /* 00.0 85% */
לולאות 1!6חטו..00 מקנגות. הלולאה החיצונית חוזרת על התוכנית כולה ()חוגוח
|
הלולאה הפנימית בוחנת את תקפות הקלט 0
;חפ זחו
;6015105 1081
00
(" :19010 116 8 זנוסחו") תוזכ .
(81970 ,"90") 508
0
(100 < קוחפ1 || 0>0ח19) סהוחשו;
;(32-ק160)* (5.0/9.0) = 0015108
9 ,9 ,"ח 0/5105 000106 66.21 5 = 000106 %0")חוזס :
;("01910707ח16 ז0ח01ח3 6ע8ח טסץ סס")חוזק .
( 0101 =60091 |
;(ח')זהחסזטק
| 1
]+ (ע'==80681 || "ץ'==100091) 6
ו
בלולאת ווח
השתמש בלולאת 1!6א כאשר אינך ודע מהו מספר החזרות הדרוש, וכאשר קיימת גס
אפשרות שאינך מעוניין לבצע את הלולאה כלל. מבנה הלולאה הוא כדלקמן:
(ת01]10ת116)60עי
ות
08 2 פרק תשע: פעולה חוזרת
תרשים 9.9 מדגים את המבנה של לולאת 6ופא. כדי לכלול בלולאה מספר הוראות,
השתמש במבנה הבא:
(תס!)01תס6) 6[ותע
|
15
]
תרשים 9.9
שויי " המבנה של לולאת
כל עוד מתקיים התנאי הזה ---------------> (ח8)6001110!ו/ 6
הזחו
> .
:הוחו
בצע את ההוראות האלה
בדומה ללולאת 00, ההוראות יבוצעו כל עוד מתקיים תנאי ה-6!ואו. אולם בניגוד ללולאת
0, התנאי נבחן עוד קודם לביצוע הלולאה. אס התנאי אינו מתקיים, הלולאה לא תתבצע
אפילו פעס אחת.
כדי להבטיח קלט מתאים, הצב את פקודת הקלט הראשונה מחוץ ללולאה. כך ניתן
להמשיך ולבקש מהמשתמש לספק קלט, כל עוד הערך המוקלד אינו תקף:
;(" :1תו61600 16 ז16ת6 216856")]ותוזק
;(1ת661500 ,%]%")1ת 50
(1=< 1ם615000 || 1>0ת116)615000תע
|
;(" קתסזעו 11 801 טס")]!תוזק
;(1ת 861500 ,*1)"%1ת508
ילוב של לולאות מםוגים עוונים
ניתן להציב כל שילוב של לולאות 6!ותאו, זס] ו-116ושו..60 זו בתוך זו, אס הלוגיקה של
התוכנית דורשת זאת. התוכנית הבאה, לדוגמה, מציבה לולאת 116תש מקננת בין התזרות
של לולאת זס), כדי להמיר 10 נתוני טמפרטורה, בין 0 ל-100, שמוזנים מהמקלדת:
שילוב של לולאות מסוגים שונים 09 2
/*60.0א1חז*/
()תוגות
|
;)מטסס ,6 ות
5 0
(++)תט00 ;10=>]תטסס ;1=)תטס6):ז10
|
(" :100 0ת3 1 ת866ו061 91016ז6קות6) 8 זסותנ")!וחוזק
(קות6ו%0',6')ת508
(100 < קות9 || 0>קות6)) ונש
[
;(" :ת81ק8 /1! ,6זו81זסקות0) 16[השת1")])תוזק
;(קות60 ,5081/0905
]
;(32-ק1ת5.0/9.0(*))6) = 0618108
;(0615105 ,ק3ת6)/"מפט06151 ]46.2 15 611ת6זת8] %8")]ותנזק
]
)
לולאת זס1 החיצונית תחזור 10 פעמיס בלבד. הלולאה הפנימית תחזור כל עוד המשתמש
מקליד ערך בלתי-תקף.
( וב החוכנית
השימוש בלולאות מוסיף תחכום לעיצוב התוכנית. יש ללמוד ולבחון את האלגוריתם
בקפידה כדי לוודא שהוא פועל כהלכה.
השלב הראשון הוא להחליט באיזה מבנה להשתמש - לולאות ז0], 116תאו...60 או 16ַתשו.
שאל את עצמך:
* האם ידוע לי מספר החזרות הנדרש מהלולאה, או שאדע את המספר עם הרצת
התוכנית!
אם התשובה חיובית, השתמש בלולאת ז10. אם התשובה שלילית, שאל את עצמך שאלה
נוספת:
= האם ברצוני לבצע את הלולאה לפחות פעס אחת?
0 1 2 פרק תשע: פעולה חוזרת
אס התשובה חיובית, השתמש בלולאת 116תאו...60. אם התשובה שלילית, השתמש בלולאת
6
לדוגמה, נניח שברצונך לחשב את הממוצע של סדרת מספרים. מכיוון שאינך יודע מראש
כמה מספרים כוללת הסדרה, עליך להשתמש בלולאת 116השו..60 או בלולאת 116ת -
במקום בלולאת ז0). נניח גם שברצונך לאפשר למשתמש לעצור את התוכנית אחרי
הפעלתה, בלי לבצע את הלולאה אפילו פעס אחת. לשם כך, תשתמש בלולאת 16ת/ש.
אבל איך תפסיק את התזרות! יש לספק למשתמש אמצעי כלשהו להורות לתוכנית שהוא
סיים את הקלדת המספרים וברצונו להפסיק. דרך אחת לעשות זאת היא להציג למשתמש
שאלה, בכל חזרה, אם ברצונו להקליד מספר. אולס דרך זו מחייבת את המשתמש להקליד
שני עיולים בכל חזרה על הלולאה - את המספר המשמש כקלט, וכן צ או עץ, כדי לחזור
על הלולאה פעם נוספת.
דרך טובה יותר היא להשתמש בערך קלט שיפעיל את סיוס הרוטינה, כפי שמודגס בתוכנית
2 תוכנית זו נעצרת כאשר מוקלד מספר שלילי. הערך הראשון מוקלד לפני הלולאה, כדי
שניתן יהיה מייד לעצור את התוכנית על ידי הקלדת מספר שלילי בתור הערך הראשון.
עבור כל ערך חיובי שמוקלד, התוכנית מגדילה את ערכו של משתנה מונה ואוגרת את
הסכוס. שים לב לכך שיתר המטפרים מוזניס לקראת סוף הלולאה, ממש לפני שנבחן תנאי
ה-116/ו בתחילתה של החזרה הבאה.
שיס לב לתנאי:
(0<)תטסס)]1
המופיע לפני חישוב הממוצע. תנאי זה חיוני כדי למנוע חילוק ב-0, שיגרוס לשגיאת הרצה
ברוב מערכות המחשב.
תוכנית 9.2: חישוב ממוצעים
/|*8907806.0*/
()ה81ח
/
1 |, ח6סהטה %+108+
;+הט0ס 30%
+0%81 0
תיבהיי
;(" :600 0+ 608%1486ה ,חססהטה 8 %68ה")++ה1חם
; ( 6 חטחה8, "+%" ) +ה508
(6"<=0ס טח ) 116 חא
ָ
0000%++ ;
;יז 6סחטה=+81+0%+
עיצוב התוכנית 211
; (":0ה6 0+ 6ש608+1ה ,("פפהטה 8 68+ה₪")++ה1חם
; (ח6טוחטח8, "+%" ) +ח508
1
(0<+ה000)+1
; 00% / 0+81+=6טהטח
(%הט00 ( ה6סהטה, "+078085%.2צה %0=+הט 00 2%.%=70%81")++ה1תק
; (0%81+
ד
נניח לרגע שכתבת את התוכנית באופן שכל הקלט מוזן בתוך הלולאה, כך:
(116)8<=0ת שו
|
;(608,"]%")1ת509
+00
(8=+]10)8
)
כאשר יוקלד מספר שלילי כדי לעצור את התוכנית, הוא ייחשב, שלא כנדרש, לעיול תקף -
ויתווסף לסך-הכל, לפני שתנאי ה-116תעו ייבחן שנית.
כאשר משתמשים בלולאות מקננות, יש לנקוט זהירות באופן השימוש במונים ובאוגריס.
לדוגמה, נניח שהחלטת לחזור על תוכנית הממוצעים, פשוט על ידי הקפתה ברמה נוספת
של 116תשו...60, כמודגס בתוכנית 93. תוכנית זו לא תפעל כהלכה, בגלל מיקומן של
ההוראות:
10081 =0
00 =0(
תוכנית 9.3: מיקום לא-נכון של פעולות הקצאת ערכים
/*080.0 6צב8*/
()ה81ח
ָ
0086 008
1 |, הפטה 1108%
;000 %+ה1
+0%81[ 01
2 1 2 פרק תשע: פעולה חוזרת
;0
00
/
;(" :600 0+ 608%106ה ,"פסהטה 8 %68ה5")++ה1חם
; ( 67 חטח8, "+%" ) 1ה808
(0=<יז6טחטה ) 18 חא
/
;+++הט00
; יז 6פהטה=+0%81+
; (":600 %0 808%1%/8ה ,הפסהטה 8 60ה5")++ה1חק
; ( 066 חטח8, "+" ) 1ה9508
1
(0<+0000)+1
ָ
; 00 / 0+81+=6פחטח
,+הט00 |( "6סהטה,"21.%=4/67806 %0=%ה000 2%.%=70%81")+%ה1חק
; (0+81+
; ("?65פטה 01% 587188 "6ה0%ה8 פעהה טסץ סם")+%ה1הם
; ()00%070886=+76068
; ('ח')8הס%טם
1
1
;('ץ'==76068% || 'ע' ==76268%) 116תא
בגלל שפעולות הקצאת הערכים ממוקמות מחוץ ללולאה הראשית, הן מבוצעות פעם אחת
בלבד, עס הפעלת התוכנית. בכל פעס שמתבצעת חזרה על הלולאה הראשית עבור סדרת
מספרים חדשה, המונים והאוגרים שומרים על ערכיהם. התוצאה תהא ממוצע מצטבר של
כל המספרים שהוקלדו. על ההוראות להופיע בתוך הלולאה החיצונית, כך:
00
|
1004[ =0
(0=)תט00
מבנה זה יקצה מחדש את הערך ההתחלתי אפס למונה ולאוגר, עבור כל סדרה של
מספרים. שיס לב שבתוכנית מקננת לולאת 6!ןאו בתוך לולאת 116חאו...00.
עיצוב התוכנית 213
בדגלונים
דגלון הוא אלגוריתס המסמן לתוכנית שתנאי כלשהו התקיים - בדיוק כפי שדגל המונף על
הירח מסמן שהאסטרונאוטיס נחתו כאן. משתנה דגלון מקבל ערך בתחילת התוכנית או
בלולאה החיצונית, ובשלב מאוחר יותר מוקצה לו ערך אחר, כדי לסמן שפעולה כלשהי
התרתשה או שהתוכנית הגיעה לערך מסויס.
לדוגמה, תוכנית המרת הטמפרטורות עושה שימוש בלולאת 16ותש...60 כדי להזין ערכיס:
00
|
;(" :0076ו81ז6קנת16 8110 8 )טקם[")]!תוזק
((קות8:16 ,1)"%6%מ309
ן
בכל חזרה מופיעה אותה ההנחיה למשתמש - בין אם זהו הקלט הראשון ובין אם
המשתמש הקליד עיול בלתי-תקף. האם לא עדיף להציג הודעה שונה, שתורה למשתמש
שהמספר שהקליד אינו נכון? זהו בדיוק מה שעושה תוכנית 9.4.
תוכנית 9.4: שימוש במשתנה דגלון כדי להציג הודעות שונות
/*180.0+*/
()חגאח
/
;6+ %ה1
8 מְ11084+
;1 "08
חהחס
00
1
;'ח'=180+
00
/
('ח'==180+) +11
;(": 6קש6020678%+ 08110 8 %טקה1")++הגחק
06
;(": 10קע5% ,%006+602078+ 8110ע 8 +טקה1")ז+ה1חק
; (ק8100 ,"%0")+ה508
4 1 2 פרק תשע: פעולה חוזרת
1'עַ'=180+
1
;(100 < 0ח8+ || 600>0+) 16גחא
; (900-32+)*(5.0/9.0) = 0818108
; (0818105 ,600+, "ת 8618105 5 56.25 18 = 0607665 %0")+%ה1חם
; ( "?8+ 6%ה+0ה3 פטאת טסץ 0ם")זצה1חם
; ()00%00886=+70088
; ('ח' )הסט
1
(('ץצ'==+70008 || 'ע' ==+68ק76) 118הא
1
משתנה דגלון, ששמו בתוכנית קָ1, מקבל את הערך 'ת' בתחילת כל חזרה על הלולאה
החיצונית. כשמופעלת הלולאה הפנימית היא בוחנת את ערכו של משתנה הדגלון, ומציגה
הודעה אחת אס ערכו של המשתנה הוא 'ת', והודעה אחרת אס ערכו של המשתנה שוגה
מ-'ת'.
כשהלולאה מתבצעת בפעם הראשונה, הערך הוא 'מ' ומוצגת ההודעה הראשונה. כאשר
המשתמש מקליד מספר, משתנה ערכו של משתנה הדגלון ל-'ץ'. עס זאת, במידה שהקלט
שהקליד המשתמש הוא בלתי-תקף, תחזור הלולאה הפנימית פעם נוספת. הפעם, התנאי
('ם'==138) אינו מתקיים, ולכן תוצג ההודעה השנייה.
כאשר המשתמש מקליד מספר תקף, הטמפרטורה מומרת מפרנהייט לצלזיוס, והלולאה
החיצונית חוזרת פעס נוספת. הלולאה החיצונית מקצה מחדש את ערכו של משתנה הדגלון,
והמשתמש יכול שוב להקליד ערך תקף. בדומה למונה ולאוגר, משתנה הדגלון מקבל את
ערכו המקורי בכל חזרה של הלולאה החיצונית.
משתנה הדגלון יכול לקבל כל שם וכל טיפוס נתונים, אס כי מומלץ להשתמש בטיפוסי
הנתונים :009 או ופו. גס הערך המוקצה לדגלון נתון לבחירתך. בתוכנית שלנו השתמשנו
בערך ת עבור עיול תקף, ובערך ץ עבור עיול בלתי-תקף. באפשרותך לבחור בכל ערך
שעולה בדעתך.
שימוש בנקודה 68%זס
שיטת הדגלון מבצעת אומנס את המטלה, אך היא מגדילה את התקורה של התוכנית -
משתנה נוסף, כמה שורות הקצאת ערכים ומבנה של 18..655. ניתן להימנע מהתקורה
הנוספת ולהשיג את המטרה על ידי הטבת המבנה של התוכנית לשימוש בלולאות 16ושו,
כמודגם בתוכנית 95.
שימוש בדגלונים
25
216
תוכנית 5: שימוש בלולאות פווחש ובפקודת )פפזם
/*5.0א₪0088*]/
()ה₪81
ָ
;6+ %ה1
1 ְ108+
:(*: 5700 0+ 555 60%68 פס 0006081006+ 8 %טקה1")++ה1חם
; (81000 ( "%0")+ה508
(555 =| כח6+) 116חא
ָ
| (555 =ן 6+ 88 (100 < קה6+ || 880>0+)) 16בהא
ָ
;(" :ה8081 עץת+ 0+ 4110עה1")+צה1ים
; (8%000 ,"%0")+5080
1
(800==555+) +1
; יט
; (600-32+)*(5.0/9.0) = 0618105
00 "ה 615108 08078688 %+%6.2 5 =" 0000005 %0")+%ה1חם
; (0818108
;(": ק5%0 %0 555 90% 000608%006+ 8 %טקה1')+צת1ים
; (ק8%00 ,"%6")+ה508
1
1
גם תוכנית זו מציגה שתי הודעות - אחת עבור עיול תקף, והודעה שונה במהלך החזרה
אחרי קלט בלתי-תקף. שים לב שתוכנית זו אינה שואלת את המשתמש אם ברצונו להקליד
טמפרטורה נוספת אחרי כל חזרה. במקוס זאת, התוכנית מטתיימת כאשר מוקלד הערך
5
התנאי קובע שעיול תקף הוא מספר בין 0 ל-100, או המספר 555. העיול 555 מסיים את
התוכנית בגלל ההוראה:
(ל55==קו6)) ]1
0%
הפקודה 0168% מסיימת את הלולאה שבתוכה היא נמצאת, בדיוק כמו שהלולאה מטתיימת
כאשר תנאי ס!וצו או תנאי זס] אינס מתקיימיס.
כל תוכניות המרת הטמפרטורה שהוצגו בפרק זה הן 'כונות". ההבדל ביניהן הוא בכך שכל
אחת משתמשת בגישה שונה או באלגוריתס שונה, כדי לבצע אותה מטלה. הצגת שאלה
פרק תשע: פעולה חוזרת
למשתמש אם ברצונו להקליד עיול נוסף, חוסכת אומנס למשתמש את הצורך לזכור שעליו
להקליד מספר שלילי או ערך מיוחד כלשהו כדי לסיים את התוכנית, אולס היא מצריכה
הקשת מקש נוסף בכל חזרה. שימוש במספר מיוחד, כמו 555, חוסך את הצורך בהקשות
נוספות אלה. החיסרון טמון בכך שאינך יכול להשתמש באותו מספר כעיול תקף. לדוגמה,
אס כל מספר שלילי מסיים את התוכנית, לא ניתן להמיר נתוני טמפרטורה שמתחת לאפס.
המבחן לינכונותה" של תוכנית הוא אם היא מורצת ללא שגיאות, וממשיכה לרוץ כל עוד
המשתמש רוצה בכך.
הלוח
1. מהס הקריטריוניס לבחירה בלולאת זס), 60 או 116תש!
2. מהן הפעולות המבוצעות בפרמטר של ביטוי זס!!
3. מה מפסיק לולאת זס)!
4. מהם לולאה מקננת!
5. כיצד משתמשים בדגלון!
6. מהי מטרתה של פקודת א6זט1
ד רגילים
1. ערוך את תוכנית 8.10 (פרק 8) כך שהתוכנית תחזור על עצמה עד שלמשתמש לא
יישאר קלט נוסף.
2. כתוב תוכנית שמציגה טבלת סכומי מס קנייה בשיעור 6 אחוזים, עבור מוצריס
שמתירס מ-51 עד 550, על-פי התצורה הבאה:
עלות סכוס המט סך-הכל
1 06 6
2 12 12
3. כתוב תוכנית שמצינה עשרה מספרים בין 0 ל-25.
217
4 כתוב תוכנית שמציגה את הגרפיקה הבאה:
*אאצ%
א*אאא*
אא%
*+*
*
אא
אצ+
א*%%+
אאאאא
5. הסבר מה לקוי בתוכנית הבאה:
()תוגתת
|
(תותט[00 סז 1081
("מת8016 1 מס811סג1ק1ו[ט/1 6ם113 ע1א!)")פונוק
(++או10/70=> שוסץ ;1=אוסז)זס1
|
(+תותט10;601=>תותט001 ;1=תותט[60)ז10
;(תותט[60* /וסת ,"%0")])תוזק
;('ם')ז וטק
8 1 2 פרק תשע: פעולה חוזרת
4
אאַרכ'ט !אחר//ת
-- |
| | ₪ משתנים שפגשנו עד עתה יכולים לאתסן ערך אחד בלבד בכל פעס. אס,
4 4 לדוגמה, ברצונך לחשב את הממוצע של 31 נתוני טמפרטורה, ניתן להזין
למשתנה 31 ערכים שונים, ערך אחד בכל פעם, ולסכמם בעזרת אוגר. עם זאת, כאשר
מזינים את הערך השני, הערך הראשון אובד; כשמזינים את הערך השלישי, אובד
הערך השני, וכן הלאה. כשתסיים יהיו בידך הסכוס והממוצע, אך לא המספרים
המקורייס.
עד עתה, אם רצית להזין 31 ערכים ולשמור אותם לשימוש בשלב מאוחר "תר
בתוכנית, היית זקוק ל-31 משתנים שונים ול-31 הוראות קלט שונות.
219
200
בפרק זה תלמד כיצד לאגור ערכים במשתנה מיוחד שנקרא מערך. תלמד גם עוד על
העבודה עם משתני מחרוזת.
1 ררכים
דמיין לעצמך קבוצת אנשיס הממתינה בתור בכניסה לקולנוע. הדבר היחיד המשותף להס
הוא עמידתם באותו תור. העובדה שאדס מסוים עומד ראשון בתור אינה מוסרת לנו מידע
נוסף עליו - אין פירושה שהוא פיקח יותר, גבוה יותר או עשיר יותר מאנשים אחרים בתור.
אולם בעוד שאנשים אלה הם יחידים נפרדים, ללא סדר מסוים, הס שייכים לאותה אסופה.
מכיוון שהס חלק מאסופה, ניתן לטפל בהס כקבוצה. אס הסדרן יבקש מהעומדים בתור
לזוז שמאלה, כדי שלא לחסוס את דוכן הפופ-קורן, התור ינוע הצידה כיחידה אחת.
מערך פועל באופן דומה לתור. מערך הוא אסופה של ערכים שניתן לטפל בהס כקבוצה. כל
פריט או ערך במערך מהווה משתנה נפרד וניתן להתייחט אליו באופן עצמאי. אך מכיוון
שהם אסופים לתוך מערך, ניתן להתייחס אליהס גם כקבוצה, ובדיוק כמו שהמיקום של
אדס מסוים בתור אינו מגלה לנו פרטים נוספים אודות אותו אדם, כך גס מיקומו של פריט
כלשהו במערך אינו קשור כלל לערך המאוחסן באותו פריט.
כבר יצרת מספר מערכים והשתמשת בהם בצורת מחרוזות. מחרוזת היא למעשה מערך של
תווים בודדים. עבדת עם מערכים כקבוצות כשהצגת מחרוזות בעזרת הפקודה ()פוטק. אך
באפשרותך גם לטפל בכל תו בנפרד.
העבודה עם מערכים מתבצעת בשלבים. ראשית, עליך להכריז על המערך כמשתנה. שנית,
יש להזין ערכים לתוך המערך. לבסוף, באפשרותך להשתמש במערך כדי לבצע לוגיקה של
תוכנית.
הכרזת מערך
הכרזת מערך מתבצעת על ידי קביעת טיפוס הערכים שהמערך יאחסן ואת המספר המירבי
של פריטים במערך, באמצעות המבנה המודגם בתרשים 10.1. כדי ליצור מערך בן 31
מספרים שלמים, לדוגמה, השתמש בהכרזה:
[31]פקות6) ותו
שיס לב לשימוש בסוגרייס מרובעים, במקוס סוגריים רגילים או מסולסלים. בדומה לכל
טיפוסי המשתנים, ההכרזה על מערך יכולה להתבצע לפני הפונקציה ()תוגח, כדי שהמערך
יהיה חיצוני (זמין לכל הפונקציות), או בתוך ()תוגגת או פונקציה אחרת - כדי לעשותו
אוטומטי.
פרק 10: מערכים ומחרוזות
תרשים 10.1
שם המערך טיפוס הנתונים של הערך | | המבה של הכרות
ה ₪
[ 6 תרזח עגזזג חנו
/
מספר הפריטים באסופה
ההכרזה על מערך יוצרת גם את פריטי המערך, כפי שמודגם בתרשים 10.2. הפריט הראשון
של המערך 5קות6! נקרא [5]0קנת6ו, הפריט השני [1]פקותסו, השלישי [2]פקות6ו, וכן הלאה.
שיס לב שמספור הפריטים מתחיל מהספרה 0, ולפיכך המערך בן חמשת הפריטיס המוצג
בתרשים, מכיל פריטים הממוספרים מ-0 עד 4. המערך אינו כולל פריט [5]פקות6!. המספר
הנתון בסוגריים המרובעים נקרא )ק05011ט5 (מציין/מספר סידורי תחתי), ופריטי המערך
מכוניס לפיכך "0 580 פקות16", *1 טפ פקמתט)', וכן הלאה.
תרשים 10.2
, הכרות מערך יוצרת גם
[05]5וח16 וחו את פריטי המערך.
[5]4קוח16 [5]2קוח16 | [05]0וח16
[05]3וח16 [005]1ח16
המספר הסידורי הגבוה ביותר יהיה תמיד קטן ב-1 ממספר הפריטים המוכרזים במערך.
אס הכרזת על מערך בן 10 פריטים, עליך לוודא שלא תשתמש במספר סידורי גבוה מ-9.
שגיאה מסוג זה לא תתגלה על ידי הקומפיילר בתהליך הקימפול, אולם תגרוס לשגיאת
הרצה או לתוצאות משונות.
2201
הכרזה על מחרוזת היא, למעשה, הכרזת מערך של משתנים מטיפוס ז6(8;
([6]5וחגת ז3ו[0
אולס בעוד שבעזרת הפונקציות (86050 ו-()פונו ניתן ליצור קלט ופלט של מערך שלם
כיחידה אחת, טיפוסי נתוניס אחריס מחייביס ביצוע הפעולות בנפרד על כל פריט במערך.
הכנסת ערכים למערך
מרגע שהכרות על מערך, באפשרותך להכניס לתוכו ערכים. ניתן להקצות לפריטי המערך
ערכים התחלתיים בעת ההכרזה:
([12 ,98 ,12 ,56 ,45) = [5]5קות6! ותו
הכרזה זו יוצרת מערך בן חמישה פריטיס עם הערכיס הבאיסם:
5 [1050ת16
6 [5]1קת16
2 [05]2ות19
8 [05]3ות16
2 [5]4קות16
כדי לאתחל מערך מסוג זה, הקלד את ההוראה לפני ()תוגמו, או בתוך ()ת1גנ או פונקציה
אחרת כמשתנה סטטי:
([12 ,98 12 56 ,45) = [5]5קות6) ותו
()תנגחז
|
([12.36 ,36.56 ,23.45] = [1008]3זק 1081 518110
באפשרותך גם להכניס ערכים בתוך ()ת!8וח או בתוך פונקציה אחרת, על ידי הקצאה:
1605105
עס זאת, כאשר ברצונך להקצות ערך לכל פריט במערך, נוח ומהיר יותר להשתמש בלולאה.
אם ידוע לך מספר הפריטים שיש להקצות להסם ערכים, השתמש בלולאת זס]:
()תופות
[
[1 ]קת !הו
(106% )ת1
(++א06ת! ,31> א06ם1 ;0=א66ַתו)זס1
|
;(068ת ," :486 6זט)3ז6קות16 זסותב')]ותוזק
;([068ת305]1ת1)"%6",616ת509
]
22 פרק 10: מערכים ומחרוזות
המשתנה א66ת1 משמש כאן לקביעת מטפר החזרות. בדוגמה זו, הלולאה חוזרת 31 פעמים,
פעס אחת עבור כל פריט במערך. בכל חזרה של הלולאה מוצגת ההנחיה:
8 81016 זסקות6) ז0וחת
ולאחריה המספר הסידורי של פריט הקלט.
שים לב ש-31 החזרות מבוצעות על ידי הגדלת ערכו של המשתנה מ-0 ל-30, ולא מ-1
ל-31. כך ניתן להשתמש במשתנה א66ת1 גם כמספר הסידורי המציין את מספרי הפריטים
במערך, שממוספרים מ-0 עד 30 כאשר ערכו של המשתנה 66%ת1 הוא 0, הפריט
[5]18668קות16 הוא למעשה [0]פקות6). לפיכך, הזנת ערך לתוך [א06ת!]פקוח6! באמצעות
הפונקציה-()1ת568, מחדירה ערך לתוך הפריט הראשון במערך, [05]0ת6). מכיוון שערכו של
אתו גדל עס כל חזרה על לולאת ה-זס), הפונקציה (]5091 מזינה ערך לפריט אחר של
המערך בכל חזרה. טבלה 10.1 מדגימה את התהליך.
(שמסל) -
(105)0ת6+
(105)1ת6)
(105)2ת6+
(0105)3+
(105)4ז6+
(5)5 161
.
(105)25ת16
(16105)26
(05)27 6+
(05)28 101
(6105)29)
(61105)30+
חשוב להבתין בין ערכו של משתנה האינדקס בתוך הסוגריים המרובעים, לבין ערכו של
פריט המערך עצמו. משתנה האינדקס מציין רק את מיקומו של הפריט במערך. הוא אעו
קשור כלל לערך המאוחסן בפריט עצמו. עיין בתרשיס 10.3. המספר הסידורי של הפריט
הוא 0. במשתנה עצמו, [0]פקות6), מאוחסן הערך 75.
223
טבלה 10.1
שימוש בתזרות כדי
להגדיל את מספרו
הסידורי של המערך.
תרשים 10.3
הבחן בין המספר הסידורי
לבין הערך של פריט המערך.
ערכו של הפריט
הוא 75
כמו בדוגמה של התור הממתין בכניסה לקולנוע, המספר הסידורי אינו קשור לערכו של
המשתנה. ערכו של המשתנה הבא, [1]פקג161 יכול להיות גבוה יותר מערכו של [0]פקותסו,
נמוך ממנו או זהה לו.
כמו כל משתנה, גס פריט מערך שלא הוקצה לו ערך יכיל ערך בלתי ידוע. ניתן לאתחל
במהירות מערך של מספרים שלמים לאפס בעזרת הלולאה הבאה:
(++א06ח1 ;31> 668ם1 (0=א06ם10101
(0=[א5]1866ק1ת16
בעבודה עס מערך, באפשרותך להזין כל מספר של פריטים על ידי שינוי ההכרזה ותנאי
הלולאה.
טיבול במערכים
ניתן להשתמש בפריט מערך בכל מקוס בו משתמשים במשתנה - בהוראה, בפקודות קלט
או פלט, או בביטויים. ההתייחסות לפריט מערך היא תמיד באמצעות המספר הסידורי שלו.
הערכים המאוחסנים במערך זמינים לתוכנית בכל עת. תוכנית 10.1, לדוגמה, עושה שימוש
במערך לביצוע שתי מטלות שונות. תתילה מחושב הממוצע של ערכי המערך, ולאחר מכן
משמש המערך להדפסת טבלת המרה. בשתי הפעמים, הגישה למערך מתבצעת באמצעות
לולאת 01+, שמגדילה את משתנה האינדקס מ-0 ועד לפריט המערך האחרון.
תוכנית 10.1: שימוש במערך לביצוע שתי מטלות
|*ס.וַצֶהת80*]/
()ח1ח
/
; [6005]31+ 10%
1 ,א060ה1 10%
224 פרק 10: מערכים ומתרוזות
+ 8 "(5
+0
]* 85ט1אט הצ1א שְ8קיה 6ה+ 1080*/
(++א00ה1 ;31 > 108% ;0=א06ה07)1+
י ָ
; (008ה1 ,":8%0 706ש000608%+ %68ה₪")++ה1חקם
; ( [068חג ] 8+608, "%0" ) +ח9808
/]* 8007806 %0 0810868 8ה+ 7686 */
(++06%ה1 ;31 > 106% ;0=א06ה00)1+
; [068ח1 ] 8ק6₪+=+0+81+
970"
; (8087808 ,"הה%% :18 8460806")++ה1תם
; ("ה 815105+760061%ת5)"=8+טם
/]* 60%שה00 %0 0810858 6ה+ 0680 */
(++א06ה1 ;31 > א08ה1 ;0=א06ה00)1+
.
; (32-[א06ח1 ] 085ח6+)*(5.0/9.0) = 0615108
; (0615108 , [א06ה5]1ק60+, "ה+%6.2++%0")++ה1פם
עם זאת, התוכנית מניחה שהמשתמש יקליד ערכים לתוך כל 31 פריטי המערך. אם יוקלדו
נתוני הטמפרטורה לחודשים נובמבר או פברואר, למשל, הרוטינה לא תציג תוצאות
מדויקות. למעשה, אין הכרח להשתמש בכל פריטי המערך, כל עוד הלוגיקה של התוכנית
מתחשבת בכך.
בתוכנית 10.2 ניתן להשתמש לתיעוד של עד 31 נתוני טמפרטורה. לולאות ה-ז10 שבתוכנית
1 הותלפו בלולאות 116תשו...60, וההוראה:
[0=א1006
מופיעה לפני כל לולאה כדי לאתחל את התזרות לפריט הראשון במערך. כאשר משתמשים
בלולאת ז0] אין צורך בהוראה נפרדת, מכיוון שהערך מאותחל בפרמטר הלולאה.
22%
206
תוכנית 10.2: שימוש בלולאת פווחש...סם לטעינת מערך
/*2.0צ8078*]
()ה1
/
;[9005]31+ %ה1
|, א17006 10%
;+ה000 ,0015108 ,8067806 +108+
0+
/* 65ט1הט ה+1א צֶה7יה 6ה+ 1080*/
; 0=א08ח+
00
/
;(א06ת1 ,":001% %0 555 -- 8%0 000008%006+ ת6+הם")++הגחק
; ( [א086ח1 ] 8+6₪05, "%0" ) +ח508
;++1006%
1
;(555 =! [!-א8005]1006+ 88 31 >א66ה116)1ת9
/*ץ8008 6ה+ 870808ע8*/
;=
00
0
; [088ח1 ] 6₪05+=+0181+
; ++1006%
1
((555 =| [א06%ה6005]1+ 88 31 >א118)1006ח9
; א1708=+0000
; 0181/0000+=9/670800
; (8007806 ,"הה%% :15 8/67806")++הגחק
; ("ה 615108++061ה5)"=8076+טק
/*81065/ 6ה+ 67%שה00 */
1;
00
4
; (32- [א6שח1 ] 5ק6₪+)*(5.0/9.0) = 0815105
; (0615108 [א6005]1006:, "ת+21. %6++7%0)++ה1חם
;++א1008
ך
;(555 =| [א06ה605]1+ 88 31 >א06ה116)1הש
מערכים ומחרוזות
הערכים מוזניס לתוך המערך עד שיוקצו כל 31 הפריטים, או עד שיוקלד ערך הדגלון 555,
באמצעות התנאי:
(555 =! [1-66%ת5]1קנת16 6.6 31 >א66ת1001נ שי
שים לב שערכו של משתנה האינדקס הופחת ב-1, מכיוון שהמשתנה גדל אחרי הזנת
הטמפרטורה. במקרה שהקלט כולל פחות מ-31 נתוני טמפרטורה, הערך 555, המוקלד כדי
להפסיק את החזרות, מוחדר לתוך פריט המערך שאחרי נתון הטמפרטורה האחרון.
הערך 555 משמש כדגלון. הלוגיקה של התוכנית נעזרת בדגלון כדי להחליט אס המשתמש
סייס להקליד את נתוני הטמפרטורה לפני סוף המערך.
כאשר מחושב הממוצע של פריטי המערך, לולאת ה-1116ו...60 מסכמת את הערכים עד
סופו של המערך או עד לערך 555. המשתנה א1866 כולל אומנס את מספרם של נתוני
הטמפרטורה שהוקלדו, אך כדי לשמש כמספר סידורי במערך, עליו להיות משתנה מטיפוס
מספר שלם. כדי לקבל ערך מטיפוס 8041 כמנה, הערכים המתולקים חייבים להיות
מטיפוס 8081. לכן, התוכנית כוללת הגדרה למשתנה מטיפוס )108, ששמו זםטסס, מקצה לו
את מספר נתוני הטמפרטורה שהוקלדו, ומשתמשת בו לביצוע הפעולה המתמטית:
[1=106%ת טס
תו8/67886=1010[/00
מכיוון שהשורה האחרונה בלולאה מגדילה את המשתנה א66ת!ו, ערכו של א66מ1 יהיה,
למעשה, גדול ב-1 ממטפרו הסידורי של הפריט האחרון במערך שמכיל נתון טמפרטורה
תקף. אס המשתמש מעין ערכים לתוך פריטים 0 עד 4, לדוגמה, ערכו של 866% יהיה 5. עס
זאת, ערך זה מציין גס את מספר הפריטיס שהוקלדו - 0 עד 4 הס 5 פריטים - ולפיכך
ניתן להשתמש בו כמונה לצורך חישוב הממוצע.
אס נבחן בקפידה את הלוגיקה של התוכנית, נגלה בעיה פוטנציאלית בתנאי השני והשלישי
של לולאת ה-116תא. אם אכן מזיניס את כל 31 נתוני הטמפרטורה (0 עד 30), המספר
הסידורי גדל ל-31 ומופיע בביטוי התנאי כ-[31]פקת6!, כלומר - גדול מהמספר הסידורי
המירבי המותר. עס זאת, לא תוצג הודעת שגיאה בגלל סדר הופעת התנאים בביטוי:
;(555 =! [א66ם!]3קות6) .8.6 31 >א66ת16)1ותעש
כדי לקצר את משך הרצת התוכנית, מרבית הקומפיילרים מפסיקים את ההערכה של ביטוי
הכולל אופרטור וגס ברגע שמתגלה התנאי הראשון שאינו מתקיים (כמודגם בתרשיס 104).
מכיוון שאופרטור וגם פירושו שעל כל התנאים בביטוי להתקיים, אין כל צורך להמשיך
ולבחון את הביטוי אחרי התנאי השקרי הראשון.
מערכים 7 2 2
תרשים 10.4
הערכת ביטוי מקוצרת.
208
מתעלמים אם תנאי זה
מתנאי זה אינו מתקיים
;55פ=![א06חו]5קח19 .8.8 31>א06ח!. 6ווחעו
לאחר שהוקלדו 31 פריטי מערך, התנאי הראשון (31 >א1866) כבר אינו מתקייס. במצב זה
התוכנית אינה טורחת כלל לבחון את התנאי השני, ולכן איגה מגלה שהמספר הסידורי חרג
מהטווח המותר.
ניתן לבדוק זאת בקלות על ידי שינוי סדר הופעת התנאים, כך:
;(31 >א66%ם1 868 555 =! [068ת!]5קמת16))6נתע
במצב זה, אס נזין 31 ערכים ונריץ את התוכנית - תתקבל שגיאת הרצה, מכיוון שהמחשב
יגלה פריט מערך שמספרו הסידורי תורג מהטווח המותר.
ייתכן שישנם קומפיילריס מסוימים שאינס משתמשים בקיצור-הדרך שתיארנו. בעבודה עם
קומפיילרים כאלה תתגלה שגיאת הרצה בתוכנית. הפתרון הוא להכריז על מערך בן 32
פריטים, אך להשתמש ב-31 פריטים בלבד.
בדיקת מערך
על ידי שימוש בחזרות ניתן לסרוק את פריטי המערך, כדי להשוות בין הפריטים או לאתר
ערך מסוים כלשהו. עיין ברוטינה הבאה:
/*איס1ת8נו*/
([5]0קות6)=קות
([5]0ות6)= עס[
(1>=א06ת1
(555 =! [664ת5]1קות6] 8:86 31 >א064מ116)1ם/ט
|
(181ת<[א06ם5]1קות0ו)/1
;[068ם5]1קות6)= תפות
(שוס]>[א06ת5]1ק1ת1/))0
;[668מ1]פקות6!= אוס1
פרק 10: מערכים ומחרוזות
;++א06ח1
|
;(שוסן,'ם%0 15 שוס[")]!תנזק
;(18ת,'ח%0 18 ב18ם'"))מוזק
]
בהנחה שהכרזנו על המשתנים שס1 ו-אָו1 כמשתנים מטיפוס מספר שלם, הרוטינה בודקת
את הערכים של כל הפריטים במערך, כדי למצוא את הערך הנמוך ביותר ואת הערך הגבוה
ביותר. המפתח הוא להקצות, בהתחלה, את הערך של הפריט הראשון במערך הן למשתנה
קת והן למשתגה אוס[. אס בוחנים פריט אחד בלבד, כמובן שערכו יהיה גם הגבוה ביותר
וגם הנמוך ביותר. פעולה זו "זורעת" את המשתנים, שערכיהם מושווים אז לערכיס של יתר
פריטי המערך. אם מתגלה במערך ערך גבוה מערכו הנוכחי של המשתנה תַּ8ָוּת, הוא הופך
להיות הערך הגבוה החדש. אס הערך נמוך מהערך הנוכחי של המשתנה שס], הוא הופך
לערך הנמוך החדש. תרשים 10.5 מציג את המחזורים הראשוניס בלולאה.
תרשים 10.5
ערכי המשתניס במהלך
ההוראה שמשנה את הערך הערך של הערך של ערך פריט התזרות.
המשתנה המשתנה הפריט המערך
בב םקוה
[5]0קח9!=אוס1 [0]פוחפו-חטות 65 55 5 [5]0קחף6ז
[5]1קוח6!=ח0ות 5 955 55 [05]1וח16
65 5 5 [05]2ח16
[05]3וח6)=שס1 4 5 4 [05]3ח6ז
חיפוש במערך
לעתים קרובות עלינו לבצע חיפוש במערך כדי לאתר ערך מסוים. החיפוש כרוך בבדיקה
של כל אחד מהפריטים כדי לראות אס הוא זהה לערך המסויס אותו מחפשים. אם החיפוש
נועד רק לגלות אס הערך המסויס נמצא במערך, ניתן להפסיקו ברגע שמתגלה הפריט
הראשון שערכו זהה לערך המבוקש. כאשר מבצעים חיפוש במערך בן אלף פריטים ומגלים
את הערך המבוקש בפריט הראשון, אין צורך להמשיך ולתחפש ב-999 הפריטים הנותרים.
להלן רוטינה המשמשת למציאת ערך במערך הטמפרטורות שלנו:
229
220
/*6.0מטס] */
;(" :זס) ת0ז568 0) 6ט[פץ 16 זסוחם"))ותוזק
((הזנות62 ,%"%0")]ח8 80
(0=א06ח1
(06=0ס1
(555=![א06ם3]1קות16 6:8 31 >א66ת1 :6:6 0תנוס]!)6!נתשר
[
(הזטם==[א66ח1]פק1/))6
(0>1מטס]
56
[++א06ח1
(6תטס]!)/1
;"1181 116 תו 1סת 15 זסטותטם ]8ג1")פוגוק
156
;(06%ת1 ,"ם%0 תס1!ופסק ם1 15 זסטומנות 6תך")ומוזק
הרוטינה מניחה שהכרזנו על משתנה מטיפוס מספר שלם ששמו 6תטס. המשתנה משמש
כדגלון; הוא מציין שנמצא ערך תואם ליעד החיפוש, ואין צורך להמשיך ולחפש ביתר פריטי
המערך.
אנו משתמשיס במשתנה 6פטס] כאופרטור יחידני. הביטוי?:
(6מטס/1160ת שי
פירושו "כאשר לא נמצא (6מטס))". הביטוי הזה מתקיים כאשר ערכו של 6תטס! הוא אפס.
מכיוון שהקצנו ל-6תטס ערך התחלתי של 0 מחוץ ללולאה, התנאי מתקיים עבור החזרה
הראשונה, והתוכנית בודקת את הפריט הראשון במערך (שמספרו הסידורי 0) למציאת התאמה.
כאשר נמצאת התאמה, תנאי ה-) מקצה ל-6תטס1 את הערך 1. פירוש הדבר שהתנאי
"כאשר לא נמצא (6פטס!)" חדל להתקיים, והלולאה מסתיימת. הערך הטופי של המשתנה
א66ת! יכיל את מספרו הסידורי של הפריט המכיל את הערך התואם.
תנאי ה-! הסופי מדפיס הודעה מתאימה, בהתאם לתוצאות התיפוש,
שיס לב שהוראת ה-16א כוללת שלושה תנאיס הקשורים ביניהס באמצעות האופרטור
הלוגל וגס. הלולאה תחזור על עצמה כל עוד לא נמצא ערך תואם, וגם החיפוש עוד לא
הגיע לסוף המערך, וגם לא אותר הערך 555.
העברת מערך
ניתן להעביר מערך שלס מפונקציה אחת לפונקציה אחרת, אם כי שפת 6 ושפת ++6
מטפלות במערך מועבר באופן שונה לחלוטין מאופן הטיפול בטיפוסיס אחרים של משתנים.
פרק 10: מערכים ומחרוזות
כאשר מעביריס משתנה שאינו מערך, 6 יוצרת עותק של הנתונים ומציבה אותו בעמדת
זיכרון שמקושרת עס המשתנה הקולט. קיימיס שני עותקיס של הנתונים, ושינוי ערכו של
המשתנה בפונקציה הקולטת אינו משנה את ערכו של המשתנה המקורי.
כשמעבירים מערך, מעבירים למעשה את כתובתו של המערך. 6 אינה יוצרת עותק של
המערך כולו, אלא רק מקצה אותו אזור זיכרון, ובכך גס את הנתוניס המאוחסנים בו, לשס
שונה של מערך. תוכנית 10.3 מדגימה כיצד מעביריס מערך כארגומנט. שים לב שארגומנט
הקריאה משתמש בשמו של המערך בלבד, ללא מספר סידורי?:
(5ק1ת61)))6ת 00
תוכנית 10.3: העברת מערך
|*0858.0 הקה*/
1 זא000 406118
()ה81ח
/
; [7א8₪05]000+ %ת1
;106% %ה1
81 מְ1084+
]* 81068ט ה+1א צץ8078 6ה+ 1080*/
(++08%ה1 ;ז000%8 > א06%ה1 ;0=א06ה07)1+
ָ
; (א06ה1 ,":8%0 000078+078+ %6%ה₪")%1ה1חק
; ( [068ח1 ] 8+606, "%0" ) +ח508
1
/* 60%עה00 %0 צץ8708 2888 *]/
; (8₪08+)000/87%
/]*הסג+סהט+ %ה6שה00ס*/
(000087%)088%
2[ שח1
ָ
;א06ה1 %ח1
81 108% 6+
(++א17008 ;זא000> א08ה1 ;0=א08ה07)1+
ָ
; (32-[א06ה1]+88ת)*(5.0/9.0) = 8ש08151
0815108( ; [א06ה1]+68ה, "ה%6.21++%6")++ה1חם
23[
העברת מערכים בתקן 0 88א
|
ההגדרה המקורית של 6 688 אינה מאפשרת העברת מערך על |
ידי שימוש בשמו, כפי שעשינו בתוכנית 10.3. כדי להעביר מערך |
| ב-0 688, עליך להשתמש במשתנה מצביע כפי שנלמד בפרק |
11. לעומת זאת, הקומפיילרים של 6 51א4 ושל ++6 מאפשרים |
להעביר מערך באופן שמודגם בפרק זה.
מכיוון שאנו מעבירים למעשה את כתובתו של המערך, אין צורך לציין את מספר הפריטים
בארגומנט הקולט; די להשתמש בסוגרייס מרובעים כדי לציין שזהו מערך:
(1)0681ז6 00
ותו
הערות ++6 ן
זכור, בשפת ++6 ניתן להכריז על המערך בתוך הארגומנט, כך: |
([]686ח)1ז6עחהסס ן
העברת מערך באמצעות כתובתו, במקום לשכפל אותו, חוסכת זיכרון, אולס עשויות
להתלוות לה תופעות לוואי. שינוי של פריט מערך בפונקציה הקולטת יגרום גם לשינוי
הערך במערך המועבר. אם הפונקציה (ז6/םס6 מקצה ערכים חדשים למערך 2641(
הערכים החדשים ייושמו גס במערך פקוס), כפי שמודגס בתרשים 10.6. בתוכנית שלנו
הפונקציה (ז6ְץת60 מוסיפה 1 לכל אחד מפריטי המערך )163. המערך )163 תופש אותה
כתובת זיכרון כמו המערך פ>קותט), ולכן גדל ב-1 גס כל אחד מהפריטים במערך פקותסו.
ךז רגיר במערכים
כדוגמה לשימוש במערכים, הבה (ניח שאתה מנהל מרכז ועידות בבית-מלון. לרשותך
עומדיס עשרה חדרי ישיבות, כשלכל אחד מהס תכולת אנשים מותרת משלו. אתה זקוק
לתוכנית שמבצעת את שלוש הפעולות הבאות:
* מציגה תרשים המראה את מספרו של כל חדר ישיבות ואת תכולתו המירבית.
* מציגה את מגבלת התכולה של חדר ישיבות מסוים.
* מציגה רשימת חדרים בעלי תכולה מירבית מסוימת.
222 פרק 10: מערכים ומחרוזות
1= 60 6חו001 תרשים 10.6
שני המערכים תופסים . שינוי ערכים של מערך
אותן כתובות בזיכרון ()חו8 ות בפונקציה.
|
|[ 651600 זחו
2 ;06%חו זחז
1 .
ב -- > 00%ח! ;0=א06חו)101
.
4% 6זט6]91ק 16 זסזחם")חחוזס
([068ח05]]1 81160 ,"%0") 50
|
00 10 05(
)
(81)0681ח00
>= ,[]₪881 זחו
ויזה 68% 6+ ה1 68ט1ע פח+-חַתבחַה8ה0
106 ת05-1ט41ע 6+ 008065 8180 |
: וי ,ו זחו
שינוי הערכיס במערך ,0% / / ,
משנה גט את הערכים (++א6ח! ,00(11 > א06חו ;0=א06חו)ז10
. +06 1 = | 06 11
])
ישנן כמה דרכים לבנות תוכנית כזו. באפשרותך להשתמש במערך בן 20 פריטים, שמכיל הן
את מספרי החדרים והן את ערכי התכולה, כך:
...4 ,107 ,12 ,102 | =[20]ת00ז )ח1
המערך מאותחל כך שאחרי כל מספר חדר מופיעה תכולתו. חדר 102 מכיל 12 אנשים, חדר
7 יכול להכיל 63 אנשים, וכן הלאה. אם מאתריס את מספר החדר במערך, ידוע שמגבלת
התכולה שלו מאוחסנת בפריט הבא אחריו.
אפשרות נוספת היא להשתמש במערך דו-מימדי. נעיף מבט במערכים דו-מימדיים בשלב
מאוחר יותר, כשנדון במחרוזות.
תרגיל במערכים 3 3 2
234
האפשרות השלישית היא להשתמש בשני מערכים מקבילים. מערכים מקבילים הם שני
מערכיס נפרדים שיכולים להתייחט זה לזה. ניתן לדמיין מערכים מקבילים כשני טורים של
בוגרי אוניברסיטה העומדים בטקס הענקת התעודות. כאשר שני הטורים מתקרבים לכניסה
לאולם, סטודנטים משני הטורים נעמדים זה לצד זה. האדם הראשון בטור הימני יצעד
פנימה יחד עס האדס הראשון בטור השמאלי, וכן הלאה. אס הבוגרים התייצבו בטורים
בצורה אקראית, אין קשר בין העומדים בטור השמאלי לבין העומדים בטור הימני. אולס
ניתן להתאים את הטורים כך שייווצרו זוגות מסוימים כאשר הטוריס נפגשים.
כאשר משתמשים במערכים מקבילים, יוצרים שני מערכים נפרדים שסדר הפריטים בהס
מתואם. הפריט הראשון במערך אחד מתייחס באופן כלשהו לפריט הראשון במערך השני,
וכן הלאה.
תוכנית 104 מדגימה פתרון לבעיית ניהול החדרים שהצגנו, בעזרת מערכים מקבילים.
המערך וחססז מכיל רשימה של עשרת מספרי החדריס הזמיניס. המערך אגוז מכיל את
מגבלות התכולה של אותס עשרה חדרים. אם אנו מאתרים את מספר החדר המבוקש
בפריט 5 במערך ותססז, ידוע לנו שתכולתו מופיעה בפריט 5 של המערך אאוח.
תוכנית 10.4: שימוש בשני מערכים מקבילים
/ *0. 8חססי*/
;(112,115,116,128,125,127,130 ,109 ,107 ,10[=)102]תססה %ה1
;(2/15, 12,20, 23, 10[=)12,43]א₪8 10%
()ח81
ָ
1% |,180+ ,70005 ,חטה ,0106ה0 ,א08ה1 +הב
00
; ( "ח6סהטה הססי עפ עֶסההקט000 .5)*1+טם
; ("החס00י 50601110 0% עץ0ה08ט000 .5)"2+טם
; ("הץ0ה000008 ה%גא פהססק 0ה1= .3")פ+טקם
((" :8 %0 1 070108 %68ה")++ה1חקם
; (8070106 , "%0")+ה808
1+)0700106==1(
/
(++א006ה1 ;70008> 06%ה0;1=א06ה00)1+
; ( [10068]אפח, [א66חה1]חססת, "ההטה1אגה %0 %0 הססה")ז+ה1חם
/
(11)070106==2
/
;(" :ח6סהטה ה00ק %68ה")++ה1חם
; (חטח8 , "%0")+ה508
; 1=א06ח1
+;
פרק 10: מערכים ומחרוזות
וק המקה
(08%>70005ה1 88 6הט0+!)118ח
(חטה==[א1808% ]000ה)+1
; 0000=1+
006
; ++1006%
(0הט0+!)11
;("ח 56 01855 108 0%ה 18 ת6סחטה הססק +אהד")פ+טק
1068
; ( [068ח1 ]א8ח, [א66ח1 ]חססת , "ה675005ק %0 ₪0105 %0 הססה")+%ה1חם
1
(0700108==3)+1
/
,30
;(" :0605005 +0 א6סהטה תטת1ה1ת 6ה+ "6+הם")1+ה1חק
; (חטח8 , "%0")+5080
(++א1006 ;00008>א06ה1 ;0=א66ה07)1+
(הטח=<[ א06ח1 ] א )11
ָ
;11
; ( [ א06ח1 ] א8ח, [א06ח1 ] חססי, "ה 608008 0 0105 %0 הססג")++הגחם
1
(180==0+)+11
; ("ה18708 08% 70008 סה 876 6ת8הד")%5טקם
התוכנית מקצה את המספר הסידורי המירבי של המערכים למשתנה פוחססז, ומציגה
תפריט של אפשרויות. הבחירה שלך קובעת איזו פונקציה תתבצע, בסדרה של שלוש
הוראות ]1. באותה מידה, ניתן היה גס לכתוב את התוכנית עם הוראת תסווש8 או עם
הוראות 11..6186 מקננות.
תרגיל במערכים 5 2
206
רוטינת ה-11 הראשונה משתמשת בלולאת זס) כדי להדפיס טבלה של מספרי החדרים
ומגבלות התכולה. יש צורך במשתנה מספר סידורי אחד בלבד, והוא משמש כמספר טידורי
הן עבור המערך וחססז והן עבור המערך אאוז.
רוטינת ה-]1 השנייה מזינה מספר חדר, וסורקת את המערך למציאת התאמה.
הרוטינה השלישית מזינה ערך תכולה ומציגה רשימה של כל החדרים שיכולים להכיל את
הערך הזה. במקוס לעצור כאשר היא מוצאת את ההתאמה הראשונה, הרוטינה סורקת את
כל המערך כדי להדפיס טבלה של כל החדרים המתאימים למטרה. הרוטינה משתמשת
במשתנה ששמו פַ18 כדי לציין שלא אותרו חדרים מתאימיס.
1 חרוזות
מחרוזת היא מערך של תווים. כאשר מכריזים על מחרוזת יש להעניק לה שם ולציין את
המספר המירבי של תוויס שביכולתה לאחסן. הפריט האחרון במערך, עס זאת, שמור עבור
מטייס האפס (0), ולכן יש להכריז על המערך כבעל פריט אחד יותר מהמספר המירבי של
תוויס בפועל.
שפת 6 ושפת ++6 מאפשרות לנו ליצור קלט ופלט של מערך תווים כיחידה אחת -
מחרוזת. אולס כל תו הוא למעשה פריט נפרד במערך, כפי שמודגס בתרשים 10.7. לדוגמה,
ניתן להזין מחרוזת ולהציג את תוויה בנפרד, כך:
()ת1גות
|
([6]20זפת 01
06% ותו
;(" :סוחגת זוסץ ז0ות5")]!חוזק
(6חתגת ,"%5")]ת508
(++א66ת20;1>א66ח1 ,0= א06ם:)101
;([068ת6]1ותהח,"ת ס%")]זתוזק
|
אס אין מזיניס את כל 20 התווים, יכילו הפריטים שאחרי מסייס האפס ערכיס בלתי
ידועים.
פרק 10: מערכים ומחרוזות
החלליהה לה"אקן תרשים 10.7
1[ זגה | כל תו במחרוזת הוא
ב למעשה פריט נפרד
במערך.
4
||
[91]8 [5)6 [51]4 | [5!]2 [310
[59 [9177 [55 [91]3 [1ו5
גם אילו לא היתה קיימת הפונקציה ()618 בשפת 6, ניתן היה להזין מחרוזת על ידי
הקלדת סדרת תוויס והקצאתס לפריטי המערך הנפרדים, כפי שמודגם בתוכנית 10.5.
תוכנית 10.5: חיקוי פעולתה של הפונקציה ()99158
/]*70%8+0.0*/
()ה41
/
(16%%88 ,[10]חהה חהה0
;א06ה1 10%
;1006%=0
; ("ה8ה00 הסחא %6ה₪ 07658 ,6חהה 8 ה%6הם")פשטק
00
1
; ( )18%%00=06%0086
; %6₪++16= [א06ח- ] סוחפת
; ++1006%
1
; (9>א1006 88 ']'=] 118)18%%67ה₪
; '0 '=[א6סח1 ] הח
; ('ה')י8הסזטק
; (6ח8ה)5+טק
257
טבלה 10.2
פונקציות לטיפול במחרוזות.
208
למרבית המזל, 6 מכירה בעובדה שמחרוזות הן פשוט סוג של מערכים, בכך שהיא
מאפשרת לנו ליצור קלט ופלט של המערך כיחידה אחת. למעט העובדה הזאת, 6 לא
תוכננה עם שפע של פונקציות מיוחדות אחרות לטיפול במחרוזות. אך מכיוון שמתרוזות הן
כה שימושיות בתכנות, כוללים מרבית הקומפיילרים של 6 ושל ++6 פונקציות מיוחדות
לעבודה עם מחרוזות. יש באפשרותך, אומנם, לבצע את הפעולות על ידי כתיבת הוראות
משלך, אך הפונקציות המובנות יעילות יותר. טבלה 10.2 מציגה רשימה של כמה מפונקציות
המחרוצת האופייניות שניתן למצוא בספריות ++6.
4%
5016
קומס
ו
1
)9
5
)5
)5
יז
ות
ץז
ירוציב
בצציב
זז
מוסיפה תו ממחרוזת אחת לסופה של מחרוזת אחרת.
מחזירה את מיקומו במחרוזת תו נתון.
משווה בין שתי מחרוזות.
משווה בין שתי מחרוזות; ללא הבחנה בין אותיות
גדולות לקטנות.
מעתיקה מחרוזת אחת, או ערך מחרוזת מילולי, אל
מחרוזת אחרת.
מחזירה את מיקומו של תו במחרוזת מתוך סדרת
תוויס נקובה.
משכפלת מחרוזת.
מחשבת את אורכה של המחרוזת.
ממירה מחרוזת לאותיות קטנות.
מוטיפה תוויס נקוביס ממחרוזת אחת לאחרת.
משווה בין תוויס נקוביס בשתי מחרוזות.
מעתיקה תווים נקוביס ממחרוזת אחת לאחרת.
משנה תווים נקוביס במחרוזת לתוויס אחרים.
הופכת את התוויס במחרוזת.
מאתרת מחרוזת אחת בתוך מחרוזת אחרת.
כדוגמה, נבתן כמה פונקציות לטיפול במחרוזות ונראה כיצד ניתן לבצע אותן לבד.
פרק 10: מערכים ומחרוזות
השוואה בין שת' מחרוזות
בשפת 6 ובשפת ++6 לא ניתן להשוות באופן ישיר ביען הערכים של שתי מחרוזות על ידי
תנאי כגון:
(82ח1ז21==51ח100511
עם זאת, מרבית הספריות כוללות את הפונקציה ()קוחסזו5, שמחזירה ערך אפס אם שתי
המחרוזות שוות, או ערך שאינו אפט אם המחרוזות אינן זהות. המבנה של הפונקציה
(0ק ות 0זו5 מודגם בתרשים 10.8, ומשמש בקטע תתוכנית הבא:
(62(==0ה8ח,61רת )קת 0זו1/)5
("16ח58 116 816 פסהתפת 6ת1")פונוק
56
:("6וח58 6ת] )סח 816 פסחחגת 6תד")פוגוק
קומפיילרים מסוימים מחזירים מספר שלילי אס המחרוזת הראשונה "קטנה', מבחינה
אלפביתית, מהמחרוצת השנייה, וערך חיובי אס המחרוזת הראשונה "גדולה" מהשנייה.
משווה בין המחרוזות 5/7181 507108271
0
,(02ח5171 , 01ח511)קרת5%0 = 8ט!9/
ָ
המשתנה טט[גץ שווה לאפס אס המחרוזות זהות -
המשתנה סט[גץ שונה מאפס אם המחרוזות אינן זהות
אס הקומפיילר שברשותך אינו כולל פקודת ()קות0ז51, באפשרותך לכתוב פונקציה משלך
שמשווה בין שתי מחרוזות, פריט אחר פריט, בדומה למערכים מקבילים, ומפסיקה את
התחליך כאשר מתגלה צמד שאינו זהת:
()תוגות
|
06 ]תו
([61]10וחגת ,[6]10תזגת זהתס
((6 10
;(88161ת)2019
0
תרשים 10.8
המבנה של הפונקציה
()קנתסזו5.
259
(++א66ת10;1 > א0;1006= א06ת1)ז10
([668ת61]1בתהת=![ א06ת6]1תַ81ת)/1
|
1>פגה
0%
ו
(10032==1
;("16ח58 16[) ]0ת 816 85ת1ז51 6ג'")פוטק
56
;("16ת50 106 886 85ם1ז51 6ג1')פונוק
ו
קביעת אורך המחרוזת
אורכה של המחרוזת אינו זהה בהכרח לגודלו של המערך. לדוגמה, באפשרותך להכריז על
מערך בן 20 פריטיס ששמו 6ותגת, אך להזין שס הכולל פחות מ-20 תווים. מרבית
הקומפיילרים של שפת 6 ושפת ++6 עושים שימוש בפונקציה ()ת6!זו5 כדי לקבוע את
מספר התווים בפועל במחרוזת, כפי שמודגם להלן:
;(06ח605)08
;(08780)ת51716= 001
;(1ת 60 ,6וחפת ,"5ז6979010 %6 85 %5 קַמוז51 6מ'ך")]ותוזק
הפונקציה מקצה את מספר התוויס שבקלט המחרוזת (המחרוזת ת!וג - בדוגמה שלנו)
למשתנה מטיפוס מספר שלם (וםטסס). כדי לבצע אותה פעולה באופן ידני, השתמש
ברוטינה כדוגמת:
()תוגות
|
;6% )תו
;[6]10וחגת ז0[48
((16ת018)08
(++א06ת10;1>א66%ם0;1= 66%ת1)ז10
|
6% ('0'==[א06ת!] סוַתגּת)/1
]
;(068ח1 ,"%0 18 [)קת16 6ם!")])תוזק
ן
220 פרק 10: מערכים ומחרוזות
הרוטינה הזו סורקת את מערך התווים ומחפשת את מסיים האפס. מיקומו של מסיים
האפס מציין את מספר התוויס במתרוזת.
כדוגמה לשימוש בפונקציה לקביעת אורך מחרוזת, להלן תוכנית המציגה את היפוכה של
מחרוזת:
()חוגות
|
;גת זו
;]תוס ,06%ח1 !הז
0 0((
((0816)ת16ז/5=)ת000
(--א06ח0;1<א1;1206ת600=א06ת1)ז0]
;([1-א06%ם8116]1ם)181ס)טק
('ת')ז סונוק
|
התוכנית עושה שימוש באורכה של המחרוזת בתור ערך התחלתי של אינדקס הכלול
בלולאת זס! וקטן בכל חזרה על הלולאה. אם המחרוזת היא בת 5 תווים, הלולאה חוזרת 5
פעמים, והאינדקס מונה מ-5 ל-1. מכיוון שפריטי המערך ממוספרים מ-4 עד 0, מופחת 1
ממספר האינדקס כדי ליצור את המספר הסידורי.
הקצאת ערכים למחרוזות
שפת 6 אינה מאפשרת להקצות תווים למחרוזת באופן ישיר, כמו בביטוי:
;"וז6="5וזגת
במקום זאת, ניתן להשתמש בפונקציה ()00ז51 הכלולה במרבית הקומפיילרים. המבנה של
הפונקציה הוא כדלקמן:
(" ",הת )זו
[(61התגח ,5/00/0086
בדוגמה הראשונה, התווים 1ז53 מוצביס במתרוזת ששמה 6מזגת. בדוגמה השנייה, התוויס
שכבר הוקצו למשתנה ששמו 61וזגת - מוצבים במשתנה ששמו 6וזגת.
כדי לבצע את הפונקציה הזו בעצמך, עליך להקצות תווים לפריטי המערך הנפרדים:
;"חג]"=[]6וחגת 0181
()תנגות
|
[10]ת50ז6ק 081
2
;א66ת1 ,!תטסס ותו
((8816ת)ת16ז/5=]ת 00
(+ +א06ת1;1תטסס=> א06ת0;1= א06ת1)ז10
([664ת1] סו8ת= [א06ת1] תספזטק
(תספזסק)פוטוק
:
הרוטינה מקצה תווים המוצבים במערך אחד לפריטים מקבילים במערך אחר.
איחוד מחרוזות
כאשר מאחדים שתי מחרוזות, מתווספים התוויס של מחרוזת אחת לקצה המחרוזת
האחרת, ומסיים האפס עובר לקצה המחווזת החדשה שנוצרה. התהליך נקרא
ת0ו/9ת0416ת60 (שרשור). הפונקציה ()5/1030 (ראה תרשים 109) מוגדרת בתקן 88א.
התוויס הכלולים בפרמטר השני מתווספים לקצהו של הפרמטר הראשון.
תרשים 10.9
המבנה של הפונקציה
(0 0
(" )0
;("6/₪ 0חג", 61ח4ח)ע0 510
איחוד המשתנים סווזפת ו"1טוחהת: ----> ; (80061ח ,3006ח)511081
"סש 6תג" + "הזג0 4"
15)04008(
080 800 6
--
הערות ++6
שפת ++6 מאפשרת העמסת יתר של אופרטורים, כלומר - ניתן
לאחד שתי מחרוזות בעזרת האופרטור +, בהתאם לפורמט הבא:
;2+ שתוז51=טַה!1ז5 ש6ח
₪7 0 360-560 אשת 0₪8 ₪2--5₪ 8( 0% אשה תשר -(₪ 96 ששה 80 שו שו ששה ₪ ₪
222 פרק 10: מערכים ומחרוזות
לערבי מחרוזות
ניתן ליצור מערכים של מחרוסות, בדיוק כפי שניתן ליצור מערכים של כל טיפוס נתוניס
אתר. אולס מערך של מחרוזות הוא למעשה מערך של מערכי תוויס. מערך שפריטיו הס
מערכים נקרא מערך דו-מימדי.
ניתן לדמות מערך דו-מימדי לגיליון נתוניס בעל שורות ועמודות. יש להגדיר מערך כזה
בעזרת שתי סדרות של מטפרים סידוריים - סדרה אחת מציינת את מספרי השורות
בגיליון, והשנייה את מספרי הטורים. ההוראה הבאה מכריזה על מערך בן 10 שורות ו-20
עמודות, הכולל 200 משתניס מטיפוס מספר שלם:
[18016]10[]20 )הג
ניתן לדמיין כל פריט במערך כמספר שלם הנתון בתא משלו, בתוך גיליון נתוניס של
0 א 10. הפריט [18016]0[]0 ממוקס בתא השמאלי-עליון, ואילו הפריט [18916]0[]1
ממוקס בתא שמימינו.
גם בהכרזה על מערך של מחרוזות יש להשתמש בשני מספרים סידוריים. הראשון מייצג
את המספר המירבי של מחרוזות במערך, ואילו השני מייצג את האורך המירבי של כל
מחרוזת. כלומר, אס מכריזים:
זו
ניתן להזין לתוכו עשרה שמות, כשכל שם יכול להכיל עד 19 תווים (ראה תרשים 10.10).
עד 19 תווים בכל שם 0 שמות
(זכור את מסיים האפס)
. %/
[8185]10[]20ח 081
כאשר עלינו להזין מחרוזות כתווים נפרדים, אנו זקוקיס ללולאות מקננות. הלולאה
התיצונית תחזור 10 פעמים, פעם אחת עבור כל מחרוזת. הלולאה הפנימית תחזור עד 19
פעמים, כדי להזין את התווים של כל מחרוזת, כפי שמודגם בתרשים 10.11. התוכנית מזינה
0 שמות לתוך מערך, ועושה שימוש בלולאת זס) כדי להציג את כל עשרת השמות.
תרשים 10.10
הכרזה על מערך
מחרוזות.
2
תרשים 10.11
תכנות מערך מחרוזות.
24
הלולאה החיצונית מזינה 10 שמות /* 589.0 */
()חוגוח
[0[]20 81 חח זגחס
7077 :02א06ח ,06 זחו
(++א06ח];06%>10ח0;1=א06חו)זס1 :
הלולאה הפנימית מזינה | .
עד 19 תווים לכל שם (
| 9 ]2=0א06ח1
;("ה 006 חפחעו זסזחם 655ז2 ,6חזגח 8 זזחם")פוטק
וו ו
/
ו
]=[ 062 ח] [6 1 6 גח .
++00%2ח1<
| 1
:(2>19א06%ח! 88 ת=! ז6)!080!וחצ
7 :)=[2א06ח!][066ח!]6חח:
;('ח')זה סוט .
1
= (10;10004+4>א00%=0;1006ח))זס1
07000 :066ת]וגח)פוט
( ח')זחסזטק
1
ך7"]". 4 :הקיס התסה רקיה
/
4
כדי להקצות תו למחרוזת, יש להשתמש בשני המספרים הסידוריים:
2[=[661א66ת1] [א06ת6]1ותגת
המספר הסידורי הראשון מציין את המחרוזת הרצויה במערך; המספר הסידורי השני מייצג
את מיקומו של התו במחרוזת. לדוגמה, בתרשים 10.12, פריט [6]0[]3מזגת הוא התו הרביעי
פרק 10: מערכים ומחרוזות
(ת) במחרוזת הראשונה (ות403) במערך השמות. כדי להציג את המחרוזת כולה, יש צורך
במספר סידורי אחד בלבד, שמייצג את המחרוזת עצמה:
([063ת6]1ותגת)פוטק
תרשים 10.12
מחרוזות ופריטים
במערך מחרוטות.
[16]0[]4ח8ח [0[]3]פחחגת [9]0[]2ח8ח [6]0[]1החה | [0[]0]פתאת
₪ 8 6 ( 0
למרבה המזל, ניתן להזין מחרוזות שלמות כיחידות, בעזרת לולאה אחת בלבד שחוזרת פעם
אחת עבור כל מחרוזת במערך:
()תוגות
|
גת 3
16% )תג
(++א00ת101>א01006=א1066)ז10
([668ת810]1מ)2015
(++1)1066=01866%>10;0063ס]
([068ת8116]1ם)פ)טק
|
יצוב החוכנית
מכיוון שיש להכריז על גודלו המירבי של המערך בתתילת התוכנית או בתחילת הפונקציה,
זוהי אחת ההחלטות הראשונות שיש לקבל. אס גודלו של המערך קטן מהגודל הדרוש בעת
הרצת התוכנית, תתקבל שגיאת הרצה או תוצאות בלתי עקביות.
מאידך, יש להימנע מהכרזה על מערך תוך שימוש במספרים עצומים, "כדי להיות בטוח".
מערכים, ובמיוחד מערכים של נתונים מטיפוס )103 ומערכי מחרוזות, הס זוללי זיכרון
אמיתיים. ככל שהתוכניות שלך נעשות גדולות ומורכבות יותר, הכרזה על מערכים עצומיס
שאין בהם צורך, עלולה להביא לשגיאות של מחסור בזיכרון.
תכנן בקפידה את גודלו של המערך. השאר לעצמך מרווח שדי בו כדי לוודא שהמספר
הסידורי אינו עולה על מספר הפריטים המירבי.
עיצוב התוכנית 5 2
אלות
1. מהו מערך!
2. האם מערך יכול לאחסן יותר מטיפוס אחד של משתניס!
3. כיצד מכריזים על מערך!
4. מהו מערך דו-מימדי!
5. כיצד מכריוים על מערך דו-מימדיו
6. מהו הקשר בין ערכו של המספר הסידורי לבין ערכו של פריט המערך!
7. כיצד משווים בין שתי מחרוזות!
8 ביצד מקצים ערך למשתנה מחרוזת!
רגילים
1. כתוב תוכנית שעושה שימוש במערכים כדי לאחסן את השמות, הכתובות
ומספרי הטלפון של 20 אנשים. אחסן את השמות לפי הסדר: שם פרטי, שס
משפחה.
2. שנה את התוכנית שכתבת בתרגיל 1, כך שניתן יהיה להזין שם ולאתר
במערכים את מספר הטלפון שלו.
3. הסבר מה לקוי בתוכנית הבאה:
()ה1 תת
ן
(105)31ת6! ותו
01 ,068ת1 זם1
(++א06ת1 ;1 > א06ם1 ;608=0תו)101
ן
((668ם1 %:4%6 6זט!9זסקות16 ז6ותת"))תוזק
;((05)1068ות1)"40',616ת308
]
(10500מ181=16ת
10 =)
6 2 פרק 10: מערכים ומחרוזות
1=א06ת1
(31 >א66%ם116)1ת/
|
(הק66%(<[1ח5)1קות1/))6
;(068ח5)1קות6)= קוו
56
;(5)1806%ק1ת10/=)6
;++1006%
ן
;(שוס!,'ח%0 15 עוס[")]!םוזק
;(1ש1ם,"ת%0 18 קנת')]ותוזק
]
27
אכ'טו 1+ '8'ט
> | ל המשתנים שהכונו עד עתה הכילו ערכים מטיפוס נתוניס אחד בלבד:
₪ תווים, מחרוזות, מספרים שלמים או מספרים עשרונייס. אפילו מערך, בין
אס הוא חד-מימדי או דו-מימדי, יכול לאחסן רק משתניס מטיפוס אחד. אלו הס
משתנים פשוטים, כלומר - ניתן להקצות להם ערך בצורה פשוטה, על ידי איזכור
שמס בהוראת קלט או בהוראת הקצאה.
229
בפרק זה תכיר שני סוגים של משתנים רב-צדדיים יותר. משתנה מבנה הוא אסופה של
משתניס אחרים, המכילים ערכים מטיפוסים שונים. מצביעים הס משתנים המתייחסים
למיקומם בזיכרון של משתנים אחרים.
מבניס ומצביעיס מאפשרים פיתוח של יישומים מורכביס יותר.
ו במבנים
תוכנית מחשב מייצגת בדרך כלל מצב מציאותי כלשהו, שמצריך ארגון ועיבוד של מידע
באופן שיטתי: מערכת הנהלת חשבונות, בעיה הנדסית, מערכת רישוס תלמידים או סדרת
פעולות אחרת שניתן לבצעה באמצעות אלגוריתמים של תוכניות מחשב.
בתוך התוכנית אנו מייצגים כל פיסת מידע במשתנה, ומקצים אותו לטיפוס נתונים מסוים:
1, ז8תס, ותו או מחרוזת. אך במציאות עלינו לטפל, לעתים קרובות, בעצמים שמכילים
יותר מטיפוס אחד של נתונים. לדוגמה, נניח שאתה מקטלג את אוסף תקליטי
הקומפקט-דיסק שלך. ברשותך קבוצה של כרטיסים, כשכל כרטיס מכיל את שמו של
תקליט קומפקט-דיסק באוסף, תיאורו, מחירו, טוג המוסיקה המוקלטת עליו ומספרו
הסידורי (תרשים 11.1).
תרשים 11.1
תיעוד בלתי-ממוחשב.
65 שד 5פָו5 וחוד עֶמוד
עס 86 65ט!ל 6חל +0 הסוטס6\סס ג/
50 08 וחוד עחוד
0899108
10.55
255
ס
200 פרק 11: מבנים ומצביעים
הערות ++6
בשפת ++6, מבנה יכול לשמש גם להגדרת מחלקה (0|355).
מחלקה היא מבנה שמכיל משתנים ופונקציות. על ידי הגדרת
הפונקציה בתוך המחלקה אנו משייכים אותה למשתני המבנה,
כמו בקטע התוכנית הבא:
) 50816 51001
;זסט וחטה זבסו1
;(000!6)זסט וט הח35510 סוסצ
;(סוסט)]8101ו50 13
ן ;טסוה [ ן
| ( החטח 11081) זט והט ה ה0::85910זה 50 !סע > ן
( |
;וחטח = זסט והות
) ו
(010ע)0::5008761זהט5 סוסצ ו
;חזטזסזסז זהסו1
;זסם התזטח* זסט והטח = הזט!סזס+
;(חזטז6זס:) חזטזסז
] ן
(0)ז וט ה 500876.855100 |
>> " 15 זססוחטח 6ח1 01 6זהטוף5 6חד'' >> זטסס
;( 1
הסימן :: בהגדרות הפונקציות נקרא אופרטור פַחוכ500, ומשמש
לשיוך הפונקציה למחלקה.
וט םס וט ם ם ב ב -ם ר ם ובם 4
ניתן למחשב את הקטלוג בקלות על ידי הקצאת כל אחד מהפריטים למשתנה;
;[12] 68/6201 ,[1100]40ק665011 ,[6]20התגת זפ
הבו
טתטת )הו
אולס במציאות אנחנו לא מטפלים בחמשת פריטי המידע האלה בנפרד, אלא מאחטנים
אותם כקבוצה על-גבי הכרטיס. אומנס כל פיסת מידע על-גבי הכרטיס שונה מחברתה, אך
יחד הן מייצגות עצם אחד - תקליט קומפקט-דיסק אחד באוסף.
שימוש במבנים 21
אם ברצוננו לכתוב תוכנית שתייצג בצורה נאמנה את המצב המציאותי, אנו זקוקיס לדרך
כלשהי שתאפשר לנו לטפל בטיפוסים שונים של (תונים כאסופה. למרבה המזל, שפת 6
ושפת ++:6 מאפשרות לאגד טיפוסי נתונים שוניס לעצסם אחד שנקרא מכנגה, הגרסה
הממוחשבת לכרטיס קטלוגי.
הגדרת מבנה
השלב הראשון ביצירת אסופה של משתנים הקשורים זה לזה הוא הגדרת המבנה. הגדרת
מבנה היא למעשה הגדרה של טיפוס נתוניס משלך. אתה מעניק למבנה שס, ומוסר
לקומפיילר את השם ואת טיפוס הנתונים אליו משתייך כל נתון שברצונך לאחסן במבנה,
כפי שמודגם בתרשים 11.2.
תרשים 11.2 שם המבנה
מרכיבי המבנה. מלת מפתח
תוחס פותה -------- >),ן,
;חח ז0סוח6ו 06
הכרזה על .
ל > ,162גח ז06וח6ות 6קעז
ז00ות6וח 06ע
מ . = יו
תוחם טוגר
תו נקודה-פסיק מסיים
על ההגדרה להתחיל במלת המפתתח 51160, ולאחריה שמו של המבנה, המכונה גם 88
(תווית). הנתונים היוצרים את המבנה נקראים איברי המבה, ומוצביס בקבוצה בין סוגרייס
מסולסלים.
ההכרזה על איברי המבגה דומה להכרזה על משתנים. יש לציין את טיפוס הנתונים של כל
איבר, וכן את גודלם של מערכים או מחרוזות כלשהם. כמו כן, יש להציב נקודה-פסיק
אחרי כל הכרזה, וכן בסופו של המבנה.
רשימת איברי המבנה נקראת 16ג]קות6! (תבנית). המבנה אינו מכריו למעשה על משתנים.
איברי המבנה עצמם אינם משתנים, אלא מרכיבים של משתנה, אחד או יותר (הנקראים
משתני מבנה), שיוכרז כמשתייך לטיפוס המבנה. התבנית מגדירה את המרכיבים ומורה
לקומפיילר כמה זיכרון יש להקצות עבור כל משתנה מבנה.
22 פרק 11: מבנים ומצביעים
ניתן להגדיר את אוסף תקליטי הקומפקט-דיסק בעזרת המבנה הבא:
2 3
|
[6]20ו4ת זג 0
([40]ת110ק665011 081
2 0 זו
המבו
ונת זת1
1
סדרת הוראות זו :וצרת טיפוס נתוניס חדש ששמו 62, המכיל חמש פיסות מידע
מטיפוסים שונים: שלוש מחרוזות, מספר עשרוני ומספר שלסם. המבנה מקצה אזור בזיכרון
שרוחבו 78 עמדות זיכרון (תרשים 11.3).
תרשים 11.3
מבנגה מקצה שטת
בטיכרון עבור איברי
המבנה.
ב ו 7
0 9
.[00]40ו06507!1 08
הו 4 זו
עבור מחרוות [ | = 100
| . :טוח זחו
0 כתובות
עבור מחרוזת
4 כתובות עבור [:
מספר עשרוני
2 כתובות עבור
מספר שלם
שימוש במבנים 23
תרשים 11.4
הכרזה על משתנה מבנה.
הקצאח ערכים למעוחנה מבנה
הגדרת המבנה עדיין לא מעניקה לנו גישה לעמדות הזיכרון. כזכור, קודס שניתן יהיה
להשתמש בטיפוס נתוניס כלשהו, יש להכריט על משתנה המשתייך לאותו טיפוס נתונים. לא
ניתן להשתמש בערך מטיפוס )808, למשל, לפני שמכריזיס על משתנה מטיפוס ₪081.
באופן דומה, לא גיתן להשתמש במבנה עד שמכריזים על משתנה המשתייך לטיפוס
הנתונים של המבנה, באופן המתואר בתרשים 114.
שס המבנה מלת מפתח
0
6 סז
|
משתנה מבנה
מלת המפתח )100ו5 מורה לקומפיילר שהכוונה היא לטיפוס מבנה, ותווית המבנה מזהה
את התבנית של המשתנה. אחרי התווית מופיע שמו של המשתנה בו תשתמש בתוכנית.
לדוגמה, ניתן לגשת לאסופה 60 על ידי הגדרת משתנה כך:
501 0 156
כעת יש ברשותנו משתנה ששמו 61850, המהווה אסופה של חמישה פריטים. כמו כל משתנה
אחר, 6150 מייצג אזור בזיכרון. אך מכיוון ש-6180 הוא משתנה מבנה מטיפוס 60, הוא
מייצג אזור בזיכרון שרוחבו 78 כתובות, שיכיל שלוש מחרוזות, ערך מטיפוס :808 וערך
מטיפוס מספר שלם (תרשים 115).
אם אתה זקוק ליותר ממשתנה אחד מאותו טיפוס (לדוגמה, כדי לתעד נתוניס דומים עבור
תקליטורי ]62-80% שברשותך), ניתן להכריז עליהם בהוראה אחת:
;0₪0ז00 ,02/6180 )תו
ההוראה מכריזה על שני משתנים (4180 (-ג01ז60) מטיפוס המבנה 6. לעומת זאת, אם
הגדרת יותר מטיפוס מבנה אחד, עליך להכריז על המשתנים של כל טיפוס בנפרד. לדוגמה,
אם הגדרת את המבנה 02 ומבנה נוסף ששמו 1280), עליך להכריז על המשתנים כך:
;ת0ז00 ,0150-כ )5100
(ת40310ץ ,65וטסות 1200 ₪01ו5
28 פרק 11: מבנים ומצביעים
₪ ו תרשים 11.5
מרכיביה של הכרזת
-/--- : ָ משתנה מבנה.
עבור מחרוזת | [ | : [0]20 חח ז3ח0
0 כתוגות = = || + [40] 065000 6
עבור מחרוזת | |' 0
ויו
2 כתובות | 0 2 : /
עבור מחרוזת | | טח זו
4 כתובות עבור
מספר עשרוני
8
5 8
2 כתובות עבור | ך 050
מספר שלם 0 00
ניתן גם ליצור את המבנה ולהכרט על המשתנים בצעד אחד. הצב את שס המשתנה (או
שמות המשתניס) בין התוחס הסוגר את המבנה לבין תו הנקודה-פסיק, כך:
62 ₪6
ו
0 זו
;[60]ת110ק065011 091
זו
0
6טטת ותו
6 ן|
כדי להבהיר את המינוח, הבה נסקור שוב את מרכיבי ההכרזה:
*= 60 היא תווית המבנה. זהו שמו של טיפוס נתוניס חדש, אסופה של פריטים
הנקראת מבנה.
שימוש במבנים 5 5 2
256
* הפריטים המרכיבים את המבנה נקראים איברי המבנה. ההכרזה עליהם דומה
להכרזה על משתניס.
> 2166 הוא שמו של המשתנה בו תשתמש בתוכנית. זהו משתנה מטיפוס כ0,
כלומר - הוא מכיל את כל איברי המבנה שהוכרזו כחלק מהמבנה. לעתים הוא
מכונה גס משתנה מבנה.
הקצאת ערכים התחלתיים
כאשר ידועים הערכים ההתתלתיים של איברי המבנה, ניתן להקצות את הערכים בעת
הכרזת המשתנה. אם אנו יוצרים משתנה אחד בלבד מטיפוס המבנה, ניתן לאתחל אותו
כחלק מהגדרת המבנה:
2 ותו
|
;[6]20זגת זגת0
([40]ת10)ק065011 081
[12] 09620 זגתס
ו
תות זת1
;(12 ,12.50 ,"ופטח קסק","תז 1 עתג'ך/ "11109 3631"] = 8180 [
סדרת הוראות זו יוצרת את המבנה 62, מכריזה על המשתנה 4186 ומקצה ערך התחלתי
לכל אחד מחמשת איברי המבנה (תרשים 11.6).
אפשרות אחרת היא לאתחל את איברי המבנה בהכרזת המשתנה:
"010 23105) .3 "סו 6ת3 1.166 ע]א"] = 6150 62 ₪01ו5
(213 ,24.99 ,'0150 תס %ססס*
מכיוון ששפת 6 היא בעלת פורמט חופשי, ניתן לחלק את פקודת ההקצאה למספר שורות,
כל עוד לא מחלקים מחרוזת הנתונה בתוך מרכאות.
ניתן להגדיר מבנה חיצוני לפני הפונקציה ()תוגחז, או להגדיר מבנה מקומי בתוך ()תוגות או
בתוך פונקציה אחרת. עם זאת, כאשר מקצים ערכים התחלתיים למבנה שמכיל מחרוזותן
יש להכריט עליו לפני הפונקציה ()תוגות, או כמשתנה סטטי:
509110 50 02
פרק 11: מבנים ומצביעים
5 5
חוד עהוד
6 קס
שימלוש במבנה
תרשים 11.6
פס ו אתתול משתנה מבנה.
[
| זו
]40 סוק 650 63
08 16012
101%
טח זחו
,"זו 0051") = 0150 [
,"החוד עחודי
, "סו5טרח קסס"
(213 ,24.99
איבר הוא תמיד חלק ממבנה. לא ניתן להתייחס אל איבר כשלעצמו. לדוגמה, אם ננסה
להקצות ערך לאיבר 008% במבגה 62 באמצעות הביטוי;
215(
00% =
הקומפיילר יציג הודעת שגיאה, מכיוון שהמשתנה )005 אינו מוגדר. לא הוקצה זיכרון תחת
שם המשתנה הזה. המשתנה בו אנו מעונייניס הוא 6180, שכולל איבר ששמו )סס. כדי
להתייחס לאיבר, יש לציין אותו באמצעות שמו של משתנה המבנה, כך:
בהוראות הבאות:
6וותהת-1001ת16ת.016 8118 /-6זט)סנת 51
כלומר, יש לציין את שמו של משתנה המבנה, נקודה, ולאחריה את שמו של האיבר, כמו
((8010ת.261500150
1500050
(013)6150.00102017
5 = 0150.008
5 = זססותטח.0150
שימוש במבנים 277
צורת הכתיב הזו מורה לקומפיילר היכן בדיוק למקס את הערך בזיכרון; למשל, באיבר
6ות של משתנה המבנה 6186.
גם פלט של ערכי איברים יש ליצור בצורה דומה, עס נקודה בין משתנה המבנה לבין שס
האיבר. תוכנית 11.1, לדוגמה, מזינה ומציגה מידע אודות המבנה 02. התייחסות לשמות
האיברים מלווה תמיד במשתנה המבנה.
ניתן להזין וליצור פלט של פריטי המבנה בכל סדר שהוא; אין הכרת להשתמש בהם בסדר
בו הס מוגדרים בתבנית המבנה.
תוכנית 11.1: שימוש במבנה עם קלט ופלט
/*001.0*/
00 %סט5+0
/
[808]20ה ת8ת0
00885 0850710%100]40[ ;
00878 08%6007ץ]12[ ;
+108% 005%;
10% הטהס6ה ;
[
()ה81
/
; ("ההה%0708+10ה1 015% ה%6הם")%5טם
; (":806ה 6+ %88הש")++ה1חק
; (06ח8ח.06%5)0180
;(":ה0050010+10 6ה+ %68ה5")++ה1חם
; (ח%10ק06%5)0150.065071
(":ץ08+6007 6ה+ 50%68")++ה1תם
; (צ06%5)0180.08%6007
; (":005% 6ה% %68ה5")++ה1חם
; (80150.008% ,"%%")%ה808
; (":ה6פהטה 510% 8ה+ %67ה₪")++ה1חק
; (00087ה.80150 ,"1)"%0ה508
; ("הח:15 00 8ה+ חס ה8%10ה07+ה1 שהד")פ%טק
; (6חהח. 0150, "ח%5 :)++הגים
; (ה%10+ק0150.065001,"ה%8 | :ה%10ק085071")++הגחם
; (ץ0150.08+6007, "ח%5 :")גי
; (0150.009%, "ה+%6.2 :)1
; (ח6סחטח. 0150, "ח%0 :ה1008+10"))+תג1חם
1
258 פרק 11: מבנים ומצביעים
מערכי לבנה
עד עתה עבדנו עס המקבילה של כרטיס אחד בלבד; אולס הגדרנו את המבנה כדי שנוכל
לטפל בנתוניס של אוסף תקליטי הקומפקט-דיסק כולו. עלינו להשתמש, אם כן, במערך -
במקוס במשתנה *חיד. כאשר אנו יוצרים מערך של מבנה, אנו יוצריס מערך של התבנית
כגלה. יש להכריז על המערך בעזרת מספר סידורי המוצמד לשמו של משתנה המבנה:
1 0 50
הוראה זו מקצה עשרה מקטעי זיכרון, כשגודלו של כל אחד מהם מספיק לאחסון מבנה
שלס (תרשים 11.7). התייחסות לפריט מערך מתבצעת על ידי הצמדת המספר הסידורי
למשתנה המבנה, ולא לשם האיבר:
;(סהתגת.[8615)0180]0
;(סותגת.[201500180]1
תרשים 11.7
זז מערך של מבנה.
8 כתובות = [0150]0 4 [20] וח 03
[0150]1 : ]6500 03
סך הכל * | [0180]2: 4 ]2 זו
[0150]3 4 1
לכל פריט
0 כתובות
[0150]4 / חח זחו
[0150]5 1 , /
[6 0 :0150]101/ 00 51001
[01507/,
[0150]8 >
[050]9 4
תוכנית 11.2, למשל, עושה שימוש במערך מבנה כדי לייצג את המטלה המציאותית של
מילוי סדרה של כרטיסים עבור אוסף תקליטי הקומפקט-דיסק.
שימוש במבנים 259
200
פרק 11:
תוכנית 11.2: תכנות מערך מבנה /002.0-]
00 900%
/
; [808]20ה 8%ת0
08650712%100]40[ 876ת0
08%0007,]12[ ; 0088
;005% 108%+
; ח6טהטה %ה1
; [10 [
()ח81ח
/
,א06ה1 10%
"08
;'צ' = 1180
;0 = 108%
00
/
; (א06ה1, "ה%0 א 0158 %68הם")++ה1חק
; (":806ה 6ה+ ת6+הם*)++ה1חק
; (6חהח. [א08ה1 ]]06%5)0150
; (":0650010+100 6ה+ %88הם*)++ה1חם
; (ח10+ק0050"1. [א06ה09%5)0150]1
; (":צ08+8007 6ת+ %88הם*)++ה1ח
; (('09%0007. [א08ח1 ] 99%5)0160
;(":008% 08+ %68הם")%1ה1חק
; (0051.[א80150]1008 ,"%1")+8080
; (":תשפהטה 810% 106 %68הם")+%ה1חם
; ( ח6סחטח. [א06ה1 ]86160 , "%0*)%ה508
; ++א1008%
(10>א11)1006
/
; ("א חס ץ ?"פה+0ה8 שעת טסע סם")++הגחקם
; (81180 ,"5080%)"%0
1
מבנים ומצביעים
1
ו([יצי == הַ19+ וו 'צ' == ַ18+) 88 10> א06ה1) שגגהש
; ( "יפסחטא 510% הא" )פצטם
(++760681; א06ה78068%>1 ;10
(ח6סחטה. [%+0150]06088 , 6הח. [+76068 ]6150, "ח%0 %6")שהגים
ז
מערך בן 10 פריטים, הנקרא 8186, מוכרז כחלק מהגדרת המבנה:
|
המשתנה 8ג|1 מוכרז כדי לציין את סיוס הקלדת המידע על ידי המשתמש, במקרה
שברשותו פחות מ-10 תקליטים. לולאת ה-60 מצינה את פריטי המערך: חמישה נתוניס
(איברי מבנה) לכל אחד מפריטי המערך (תקליטו קומפקט-דיסק באוסף). המשתנה א66ח1
ישמש מספר סידורי.
אחרי הזנת כל פריט מערך, מוצגת למשתמש השאלה אס ברשותו תקליט קומפקט-דיסק
נוסף. עס זאת, השאלה אינה מוצגת אס המשתמש הזין כבר את כל 10 פריטי המערך.
לולאת ה-60 משתמשת בתנאי הבא:
(('ץ' == פָגּ || 'ד' == קַ09) 88 10> א66חו) 6[ותש
השימוש באופרטור וגם פירושו ששני התנאיס חייבים להתקיים: א66ח1 קטן מ-10, וגם
המשתנה אָּ!] שווה צ או ץ.
ללא הסוגריים המקננים, קומפיילר 0 היה מאחד את שני התנאים הראשוניס ומתייחס
להוראה כתנאי או (כפי שמודגס בתרשים 11.8). הלולאה היתה ממשיכה לבצע חזרות גם
אחרי שהוזנו כל עשרת הפריטים, אם ערכו של המשתנה פַגּ!! היה ץ מהקלט האחרון.
('צ' == 80 || "' == 1/0 8.8 10 > א06חו)6ווחעו
ללא סוגריים מקנניס,
הביטוי יתפרש כמו
ץצ == 80 || ("" == 1080 8.8 10 > א66ח)))6וחש
תנאי 1 או תנאי 2
תרשים 11.8
אופן התרגוס ללא
סוגריים מקנניס.
שימוש במבנים 1 2
הערה
קומפיילר :266 המצורף
לספר זה מציג אזהרה
כאשר תוכנית מעבירה
מבנה מפונקציה אחת
לאחרת. ניתן להתעלם
מאזהרה זו, והיא תושמט
בגרסאות הבאות של
הקומפיילר.
כאשר מזיניס את נתוני התקליט האחרון, ערכו של א66ת! גדול ב-1 ממספר פריטי המערך.
המשתנה משמש בלולאת :10 כדי להדפיס רשימה של התקליטים ומיקומס.
שים לב שכל הפניה לאיבר מבנה כוללת את שם המשתנה. המספר הסידורי של המערך
מופיע אחרי שם המשתנה.
לבנים ובונקציות
הגדרת 6 888 המקורית הגבילה את השימוש במבנים. ניתן היה להעביר מבנים
כארגומנטים רק בעזרת מצביעים מיוחדים, עליהס תלמד בהמשך הפרק. בנוסף, לא ניתן
היה להקצות באופן ישיר מבנה אחד למבנה אחר, כך:
6
הקומפיילרים המודרניים של 6 ושל ++6 התגברו על המגבלה הטו. ניתן להקצות ישירות
מבנה אחד למבנה אחר, ולהעביר מבנה שלם לפונקציה, או לקלוט מבנה שלס מפונקציה.
במרבית הקומפיילרים של ++6 ו-6 81א4, למשל, אפשר להעביר ולהחזיר מבנה שלם.
תוכנית 1133, לדוגמה, מדגימה כיצד להעביר מבנה לפונקציה. ערכי האיברים מוזניס
בפונקציה ()ם1פוח, ולאחר מכן מועבר המבנה כולו אל הפונקציה ()6180וט לצורך פלט.
משתנה המבנה משמש בקריאה לפונקציה:
;(6150)6150)ק
הוראה זו מעבירה את המבנה כולו אל הפונקציה. הפונקציה מכילה משתנה שיקבל את
המבנה המועבר, ומכריזה על המשתנה כמשתייך לאותו טיפוס מבנה:
;(6150)015%]נוק
6 0 50
הפונקציה מכירה עתה משתנה מבנה נפרד, 618%, המכיל את האיבריס המועברים של
המבנה 4180. בתוך הפונקציה, הפניה לאיבריס היא באמצעות התווית 418%, שמו של המבנה
הקולט.
תוכנית 11.3: העברת מבנה
]*003.0*/
0 %000%+5
/
[806]20ה 00886
"/- "08
08%60070]12[ ; 088
1 ְ108%+
;תפפהטה %ה1
200 פרק 11: מבנים ומצביעים
6 7[
()ה81ח
/
; (*ההת8+10ה07+ה1 % ף=6תהם")פ+טק
; (":6חח 68 ח6+הם")++הגחם
; (88ח. 00%5)0150
;":0050010%100 6+ %67תם")%+ה1חם
; (%100ק08%5)0150.008001
(":צץ"08+8009 8+ חס%הם")++הגחם
; (צ08%5)0150.08%0007
;(":005% 108 %68הם")1+ה1חם
;(80150.008% ,"%%")01ה508
; (*: יז6סחטח 1% פחת %68ה5")++ה1חם
; (ח6סוחטה. 80150 "%0")+5080
; (0150)0180+ט0
1
(61580)015%+ט
050 +סטת+8
/
;("חה:15 00 פח+ הס ה10708%10ה1 6הד")%5טם
; (015%.08₪8, "ח%6 :)הניק
(016%.0650710+100, *ח %9 :ה06501010")%%הג1חם
; (צ615%.09+6007, "ח%5 :)הניק
; (015%.0081, "ח21. %6 ב )ה1ים
; (ח6פחטה. 015%, "חה%0 :ה61)"1008%10הגיזם
1
תוכנית 11.4 מדגימה כיצד להתזיר מבנה מפונקציה. איברי המבנה מוזנים לפונקציה
(8001800, ולאחר מכן מוחזרים לפונקציה ()תוגוז בפקודה:
((16150טקת!)תזטו1
שימוש במבנים 3 2
24
שיס לב שתווית המבנה ((62) משמשת הן בהכרות הפונקציה והן בהכרזת המשתנה של
()8616150. כאשר מחזירים טיפוס נתונים שאינו זחו או זפוס, יש לציין את שם הטיפוס
בהכרזת הפונקציה. טיפוס הנתוניס המוחזר הוא טיפוס המבנה 602, ולכן הפונקציה
מוכרזת כך:
(86161500 202) 04גת51
גם המבנה המשמש בפונקציה הוא מטיפוס 62, ולכן הוא מוכרז כך:
וטו כ 5101
שים לב גס לכך שהפונקציה ()8616180 מוכרזת באופן גלובלי כמשתנה מבנה, יחד עם
המשתנה 56:. יש צורך בהכרזה מסוג זה כדי שהפונקציה תחזיר מבנה.
תוכנית 11.4: החזרת מבנה
/*004.0*]
00 0%ט0+%+9
/
0806]20[ ; 00886
08507010%100]40[; 085
[12]ע 08%6007 0086
;+00 1108%
;הספהטה %ה1
(()80%0150 ,0180 [
()10ח
,
; ()00%0150 = 0180
;("חח:15 00 8ה+ חס ה0ג+0708+ה1 פהד")5+טקם
; (86ח. 0150, "ח%5 :)היק
; (0150.0650010%100, "ה%8 | :108+כ265071")++ה1חם
; ((0150.08+6007, "ח%5 :צ000*)ז+הגים
;(0150.005%, "ח%6.2% :)היק
; ( ח6סחטח. 0150, "ח%0 :ה008%10|")++הגחק
ז
()08%0150 00 0%ש5+0
1
2 00 0%ש5+0
;("הה1010708%100 015% ת6+ה5)"5+טם
פרק 11: מבנים ומצביעים
; (":808ה 6ה+ ת6+ה5")+ףה1חם
; (806ח. 10000150 )06%5
;(":0050710%100 6ת+ %60ה5")++ה1חם
; (ח10+ק085071. %5)1000501850+00
((':ע08%0000 6ה+ 68שהם")++ה1חם
; ((0816007. 100050180 ) %5+00
;(":005% 6ה% %68ה₪")++ה1חם
; (81000%0150.0059% ,"+%")+ה508
; (":"6סהטחה % 86חל %88ה6")++ה1הם
; ( 00 הטח. 81000+0180 , "0 )508
; (0180+ט0חג )9%
נועוא המצביעים
בעוד שניתן להעביר לפונקציה כל מספר של ארגומנטים, ובכלל זה גם מבנה שלס, אפשר
לכלול פרמטר אחד בלבד בפקודת ()תזט)6ז. כלומר, באפשרותך להחזיר ערך אחד בלבד אל
הרוטינה הקוראת לפונקציה בתוכנית. פתרון אחד לבעיה הוא שימוש במשתנים גלובליים.
אולס, בדרך זו מאבדיסם חלק מהבקרה על מבנה התוכנית, וקשה יותר לאתר שגיאות. לכן,
אם ברצונך להחזיר יותר מערך אחד מפונקציה, השתמש במצביעים.
ישנן שתי דרכים לאזכר משתנה בתוכנית. כאשר משתמשים בשמו של המשתנה, ההפניה
היא לערך המאוחסן בעמדת הזיכרון. כאשר משתמשים באופרטור הכתובת (6), ההפניה
היא אל כתובת הזיכרון בה מאוחסן המשתנה.
כאשר מקצים ערך למשתנה, כמו בדוגמה הבאה:
5 = א8)
מחדיריס ערך לעמדה בזיכרון. כתובת הזיכרון שהוקצתה למשתנה 13% תכיל את הערך 35.
ניתן גס להציג את כתובת הזיכרון של משתנה בעזרת האופרטור 8. ההוראה:
(882 ,'%0')])תוזק
תציג את הכתובת בה מאוחסן המשתנה אא!ז, ולא את הערך המאוחסן באותה כתובת. עס
זאת, אופרטור הכתובת, כדוגמת א818, יכול לשמש רק בביטוי. הוא אינו מהווה משתנה,
מכיוון שהוא מייצג מספר שלס בלבד; הוראה כדוגמת
5 = א68
הבנת נושא המצביעים 5 2
אינה הוראה תקפה.
תרשים 11.9
הכרזה על מצביע.
206
מצביע הוא משתנה המכיל את כתובת הזיכרון של משתנה אחר. אם המשתנה 188 מאוחסן
בעמדה 21260, אזּי המצביע למשתנה א8! יכיל את המספר 21260.
שס המצביע טיפוס המשתנה
אליו מצביעים
:גת 180|6ז99 6סע
הכוכבית מציינת מצביע
כדי ליצור משתנה מצביע, השתמש בצורת הכתיב המודגמת בתרשים 11.9. ראשית יש לציין
את טיפוס הנתוניסם המאוחסן במיקוס המזוהה על ידי המצביע. תו הכוכבית מורה
לקומפיילר שמדובר במשתנה מצביע. לבסוף, יש לציין את שמו של המשתנה. לדוגמה,
ההוראה
זוקאג)* ותו
יוצרת משתנה מטיפוס מצביע (מסומן באמצעות כוכבית) ששמו זזקאגז, שיכיל את כתובתו
של משתנה מטיפוס !ת1. ההוראה:
* ]08
יוצרת מצביע ששמו )6ת, שיכיל את כתובתו של משתנה מטיפוס 1081].
לאחר שמכריזים על משתנה מסוג מצביע, יש להצביע באמצעותו על דבר-מה. עושיס זאת
על ידי הקצאת כתובתו של המשתנה עליו יש להצביע, כך:
גו = זוקאגו
הוראה זו מציבה במשתנה זוקאג! את הכתובת שבה מאוחסן המשתנה א8) (כפי שמודגם
בתרשים 11.10). אם א מאוחסן בכתובת הזיכרון 21260, אזי ערכו של המשתנה זוקאפ!
הוא 21260.
פרק 11: מבנים ומצביעים
תרשים 11.10
הקצאת כתובת למצביע.
%ג1 ה 90
9 המשתנה ז1סְאג! / [זקאגו* זחו 8
כאן 0
הכתובת 21260 ממוקמת כאן או = זוכאגו 6
לדוגמה, עיין בתוכנית הבאה:
()תותז
|
וקאגו* זו
8% ותו
8% = ]תא
5
((אג] ,'ח%0 15 א8)")]!תוזק
(זוקאג) ,'ה%0 15 זס)הוסק אג1 6םז")!ותוזק
]
אם נשתמש בנתוני המדגס שלנו, הפלט יהיה:
5 15 אג]
0 5 זסותוסק אג] 186
בשלב זה ייתכן שאתה תוהה: '"אז מה': - אחרי הכל, ניתן להשיג תוצאה זהה על ידי הקצאת
כתובתו של אגו למשתנה רגיל מטיפוס מספר שלם (שאעו מצביע). היתרון הוא בכך שניתן
הבנת נושא המצביעים 07 2
לאזכר את משתנה המצביע כ-זוקאגן*. הכוכבית מורה לקומפיילר שאנחנו מעונייניס
בתוכנה של כתובת הזיכרון המאוחסנת במצביע. א לנו עניין בערך 21260, אלא בערך
שמאותסן במיקום זה בזיכרון. הערך של זוקאג) הוא 21260, אולם הערך של זוקָאגז* הוא 35.
למשתנה זוקא3) ניתן להקצות כתובת זיכרון בלבד. ההוראה
0 = 01א18
תגרום לשגיאת קומפיילר מכיוון שהיא מנסה להקצות למצביע מספר שלם. ההקצאה
היחידה שניתן לבצע למשתנה ז01א4) היא כתובתו של משתנה, בעזרת אופרטור הכתובת, כך:
8% =זוקאג
עם זאת, ניתן להקצות ערך למצביע ז1קא8!*, כמו בהוראה:
5 = זוקא8)*
הוראה זו פירושה 'הצב את העוך 5 בכתובת הזיכרון עליה מצביע המשתנה זוקאג)".
מכיוון שהמצביע מכיל את הכתובת 21260, מוצב הערך 35 בכתובת זיכרון זו. כמו "כן,
מכיוון שזוהי כתובתו של המשתנה א8!, מקבל גם אגז את הערך 35 (תרשים 11.11).
לכאורה, נראה שזוהי דרך מסורבלת למדי לשינוי ערך של משתנה. קל יותר להקצות ל-א8!
ערך חדש. אולס כוחס האמיתי של מצביעים טמון ביכולתס לשמש ארגומנטים לפונקציות.
תרשים 11.11
הקצאת ערך למצביע.
0 המשתנה אג) ממוקס
בכתובת 21260
כאן
המשתנה זוקא3 ----> [ || ;0אגז* זחו 8
9 הכתובת 21260 ממוקמת כאן | [-- | א818 = ז1קאג! 63
הערך 35 מוצב בכתובת 69 | | , = זי 0
שמכיל המשתנה זוקאג)
208 פרק 11: מבנים ומצביעים
מצביעים ובונקציות
ללא מצביע, הדרך היחידה להעברת ארגומנט לפונקציה היא באמצעות ערך. פירוש הדבר
שהערך של הפרמטר הקורא מועבר אל הפרמטר הקולט. עותק של הערך מוצב בעמדת אכרון
נפרדת. הכנסת שינוי בערך של הפרמטר הקולט אעה משנה את ערכו של הפרמטר המשגר.
כאשר מעבירים פרמטר אל מצביע באמצעות כתובתו של הפרמטר, הוא איגו משוכפל.
במקוםס זאת, אנו יוצריס משתנה נוסף שמצביע אל אותה עמדה בזיכרון. לפיכך, אס משניס
את הערך של משתנה המצביעו משתנה גם הערך של המשתנה המשגר.
תוכנית 115 מזינה מחרוזת ותו. לאחר מכן התוכנית מונה את מספר הפעמים שהתו מופיע
במחרוזתו ומציגה את ההופעה הראשונה של התו במחרוזת.
תוכנית 5 -: תוכנית שעושה שימוש במצביעים כדי להחזיר
ערכים
/*ס.+הט%00+16*/
()ח₪81
ָ
;ת10%%0 , [20 ] הח יהחס
0 , ה6סחטת %חג
; ( "ח6הח 8 %68ה8)"6+טק
; (806ה)99%8
; ("0087080+86 8 ה6+הם")%+הגתם
10%+00500%0086) ( ;
; (89180% ,00 טח (ה%0+10 , 08886)+0000%16
, 6ח8ח 16%%08, "ה 11085 0 %58 הג 18 %0 10%%6% 6דה")ז+ת1פק
; (ח6ס טח
; (%87%+9 ,"%0 16 ה0051+10 הַה5+80+1")++ה1ים
1
(1106% +הטסס ,8חק81 , 6חט001ח)+0000%18
;9 , [ ] ₪6ט001ה 008%
;+ ,הט00* %ה1
ָ
;ח1+ ,א08ה1 10%
;00 00*
;.0=א1006
,11800
;190*
הבנת נושא המצביעים 0 6 2
('0' =! [א06ה1]פהט1ק0ה)18גהא
0
(8תסק81 ==[א06ח1 ] 000108ה)11
/
; 1++חהט0008%=*00*
(180==0+)+1
*1108+51706%+1 ;
+180=1;
; ++א1706
אחרי הזנת המחרוזת והתו, אנו מעבירים ארבעה משתנים אל הפונקציה ()1161ת60;
המחרוזת, התו, וכתובותיהס של המשתנים ז6פותטת ו-5)811, שמסומנים בתו -8 המופיע
לפני שמותיהם.
הפונקציה מקצה את הכתובות למשתני מצביע קולטים: כתובתו של זססותטת מאוחסנת
ב-)תטסס*, וכתובתו של 51811 מאוחסנת ב-1:%1!* (תרשים 11.12). המשתנים מאותחלים
בערך אפס, ולאחר מכן מופעלת לולאת 16תשו:
תרשים 11.12
העגרה פופו קש (8517 800 61168| ,876 ח)118%ת 60
;(ז8סוחטח 6 6116 "ת65רחוז 4 558 ח! 58| %0 ז606| 6חך ת")זזחוזס:
כתובתו של המשתנה +ז5)4 כתובתו של המשתנה ח6טוחטת
מאוחסנת במצביע ששמו מאוחסנת במצביע ששמו ")מש60*
)זי
( 6 ,6 )וזח 60
[ ]6 טוח זגתס
5 הט 0ס* זחו
20 פרק 11: מבנים ומצביעים
('0' =: [664ם1]סבתנו[ק0ת)6[גתשי
לולאת ה-1116 תבדוק כל אחד מהתווים במחרוזת, ותמשיך בפעולתה כל עוד התו הנבדק
שונה ממסיים האפס. כאשר היא נתקלת במסיים האפס, הלולאה מסתיימת.
מיקוס הסוגריים המסולסלים בלולאת ה-116תאו חשוב ביותר; הוראת !1 אחת מקננת כולה
בתוך השנייה (כפי שמודגם בתרשים 11.13). תנאי ה-1 הראשון בוחן אס התו הנבדק זהה
לתו שברצונך למנות. במידה שכן, המוגה גדל ב-1. במקרה שלט, המונה הוא משתנה מצביע:
,1+ 00*=]ת600*
פעולה זו מוסיפה 1 לערך המאוחסן בכתובת שמכיל המצביע. מכיוון שהמצביע מכיל את
כתובתו של המשתנה זשסותטם, המשתנה ז6פנתטת גדל ב-1, למרות שזהו משתנה מקומי
בפונקציה ()םוגות. שים לב שלא ניתן להשתמש בצורת הכתיב:
++)תט00*
מכיוון שהוראה כזו תשנה את הכתובת אליה מתייחס המצביע, ולא את תוכנה של אותה
כתובת.
תנאי ה-]! השני בוחן את ערכו של המשתנה 8. אם פָגּ שווה אפס, זוהי ההופעה
הראשונה של התו אותו מחפשים. משתנה המצביע 8זו1* מקבל את מיקומו של התו
במחרוזת, פלוס 1. (הוספת 1 לאינדקס נועדה כדי שהספירה תתחיל מהתו הראשון
במחרוזת, כפי שנהוג למנות, במקוס מאפס). ערכו של 838 נקבע ל-1, כדי שנקודת
ההתחלה לא תשתנה כאשר התוכנית תאתר את התו המתאיס הבא במחרוזת.
אחרי תנאי ה-11 האינדקס גדל, כדי שהתזרה הבאה על הלולאה תבחן את התו הבא
במחרוזת. חשוב לוודא שההוראה ++86ת1 מופיעה אחרי התוחס הסוגר את הוראת ה-11
החיצונית, אך לפני זוג הטוגריים המסולסלים שמסיימים את התוכנית: תוחם אחד מסיים
את הוראת ה-16ו1או, והשני מסייס את הפונקציה. אס ההוראה תוצב במקוס אחר כלשהו,
הפונקציה לא תפעל כהלכה.
כאשר הפונקציה מסיימת את פעולתה, השליטה חוזרת לפונקציה ()תו4וז, שמציגה את
המחרוזת, התו, מספר ההופעות ונקודת ההתחלה.
שים לב שהפונקציה אינה מחזירה ארגומנט בקריאה ()תז60ז. במקוס זאת, הערכים של
זססותות ושל 5081 הוקצו באמצעות מצביעים. על ידי הקצאת ערכים למצביעים בפונקציה,
התוכנית 'מחזירה" את הערכיס למשתנים שבארגומנט הקריאה.
ניתן לכתוב את התוכנית הזו גם ללא מצביעים, על ידי הכרזה על המשתנים זססנתטת
ו-5131 כמשתנים גלובליים. כך ניתן לאזכר אותם ב-()תנגות וב-(1600)םטס6, במקוס
להעבירם כארגומנטים. עם זאת, השימוש במצביעים מעניק למשתמש בקרה רבה *ותר.
המשתניס נותרים אומנס משתנים מקומיים, אולס באפשרותך לבחור לשנות אותס על ידי
העברת כתובותיהם.
הבנת נושא המצביעים 1 7 2
תרשים 11.13
מיקום הסוגריים
המסולסלים כדי לציין את
קבוצות ההוראות.
51 ,601 ,3חק|8 ,6 !606100
ג ,[] 6 טוח ז8ח6
%זו* ,1חטסס* זחו
(
א6חו זחו
0=ח00*
;0=א06ח!
אע 100
,0=ז9זו]*
(0' =! [א06חו]6רחט!ק0ח)8!חעו
/ (
8 ==[א06חו] 6חחט! 0ח)!1
/
;0 *=00001*
(1)!80==0ו
מציב את משתנה המיקום ---------- 6% |
הראשון כאשר התו מתאיס : .
= :;1+06%חו=ז8זו]*
;1
1
.1
בכל חזרה מתבצע -> :++א06ח!
הביטוי ++א06ח1
כדי לעבוד עם קבצים ולשגר את הפלט למדפסת, במקום אל הצג, יהיה עליך להשתמש
במצביעים. בנושאים אלה נדון בפרק 12.
222 פרק 11: מבנים ומצביעים
אלות
1. מתי יש להשתמש בטיפוס מבנה!
2. כיצד מכריטים על מבנה!
3. מה ההבדל בין תווית המבנה לבין משתנה המבנה?
. כיצד מאזכריס פריט מבנה!
. האם ניתן ליצור מערך של מבניס!
4
5
6. האם מבנה יכול להכיל פריטיס המשתייכיס לטיפוס נתוניס אחד!
7. מהו מצביע!
8
. אם תוכנית כלשהי כוללת את ההכרזה ותטת* 1081, מה ההבדל בין המשתנים
ותטת ו-תנות*?
9. מדוע משתמשים במצביעים בתוכניות 36
0. איך מעביריס מצביע לפונקציה!
ך] רגילים
1. כתוב תוכנית שמזינה נתונים אודות מלאי של מוצר מסוים לתוך מבנה. הנתוניס
כוללים את שס המוצר, מחירו, את הכמות ואת שס הספק.
2. שנה את התוכנית שכתבת בתרגיל 1, כך שתזין את הנתונים לתוך מערך בן 20
פריטים במבנה.
3. שנה את התוכנית שכתבת בתרגיל 2, כך שתציג את שוויו הכולל של המלאי.
6. כתוב תוכנית שמזינה שני משתנים מטיפוס !108 שיהיו מקומיים ל-()מוגות, ואז
משתמשת בפונקציה כדי לחשב את החזקה הריבועית של שני המספרים.
5. הסבר מה לקוי בתוכנית הבאה:
()תוגות
|
62 ו
|
([40]ת110ק1ז0650 081
([12]ע6816201 זגו[
273
;[20]סותגח זג
יו
נז6לנחטת 11
[6
;("ת3110ותז0ס]ת: 615% ז10תם")פוטק
((":6ותגת 86] זסזתם")!ותוזק
(06ח8מ)015
:65010 6 זסזתת")]ותוזק
000500
;(":ע03)0801 16 ז6ומם")ותוזק
00007
;(":6051 186 ז6זתם'"))חוזק
;(86081 %/%")/ת508
;(":ז06 ותטת 6ם] זסותת")])מוזק
;061 ותטת62 ,'1)"%0ת508
;(":08 012 6 מס תסוותחס/ת! 56 1")פוטק
((6ותגת,"ת%5 :6ותג")!1תוזק
;(ת110ק1ז4650,"ח%5 :תסווקז2050")וותוזק
(031020/'ת%9 :")תוזת
;(0081,"ח%6.2 ות
;(61סחתטת,"ת%0 :1.061100')]!תוזק
פרק 11: מבנים ומצביעים
יבור 6/0 "/כ/ן] ///לססת
. ₪ . . . . . . . . . . . . . . - . . . . . . . . .
0
% צגת מידע על-גבי המסך היא אומנס פעולה שימושית, אך מוגבלת. גם
4 כאשר התוכנית מאפשרת למשתמש להשהות את התצוגה די זמן כדי
לקרוא את המידע, הרי שמרגע שתצוגת המסך התחלפה, יש להריץ את התוכנית פעם
נוספת כדי לעיין במידע שוב.
כמו כן, התוכנית שומרת על ערכיהם של משתניס אך ורק במהלך פעולתה; ברגע
שעוצרים את התוכנית, הקלט נעלם. כך, לדוגמה, אס הקלדת את נתוני אוסף תקליטי
הקומפקט-דיסק שברשותך לתוך מערך של משתנה מבנה, יהיה עליך להקלידם
מחדש בפעם הבאה שתפעיל את המחשב.
2,
כדי לשמור את המידע באופן תמידי, או כדי למסור עותקים של פלט התוכנית למשתמשים
אחרים, יש להדפיס את הפלט על-גבי נייר. כדי שניתן יהיה להקליד את הנתוניס פעם אחתת
בלבד ולאחזר אותם כאשר מתעורר הצורך בכך, יש לאחסן את המידע בכונן.
ךבנת נועוא הקבצים
פקודת פלט בתוכנית אינה משגרת את (תוני הפלט ישירות אל הכונן או אל המדפסת.
הפלט מופנה לשטח אחסון זמני בזיכרון, שנקרא חוצץ. כאשר החוצץ מתמלא, הנתונים
מועברים אל הכונן או אל המדפסת (ראה תרשים 12.1). נתוני קלט המוזנים מהכונן מופנים
אף הס לחוצ>, ומאוחסנים שם עד שניתן יהיה להקצות אותס למשתנה, או להציגס על-גבי
המסך.
תרשים 12.1
הנתונים מאוחסניס באופן
זמני בחוצ. 2
חוצף זיכרון 4
כשהחוצף מלא,
הנתונים נכתבים לכונן
74 " . . .
זוז
כדי להעביר נתוניס אל החוצץ או ממנו, יש צורך בתקשורת בין התוכנית לביץ מערכת
ההפעלה של המתשב. את תפקיד הקישור ממלא הקוב.
6 7 2 פרק 12: שיגור פלט לכונן ולמדפסת
כאשר התוכנית יוצרת קובץ, היא מציבה בציכרון מבנה מיוחד, שמכיל מידע הנחוץ הן
לתוכנית והן למחשב כדי לקבל קלט מהקוב או לשגר אליו פלט, או כדי להדפיט את
הנתוניס במדפסת.
לדוגמה, המבנה מכיל את כתובתו של חוצץ הקובץ, כדי שהמחשב יוכל לדעת היכן עלו
לחפש את המידע שברצונך לשגר לכונן כפלט, או היכן להציב נתונים שברצונך להאן
מהכונן כקלט לתוכנית. המבנה עוקב אחר מספר התווים שנותרו בחוצץ ואחרי מיקומו של
התו הבא - שיכול להיות פלט או לאחסן קלט (ראה תרשים 12.2).
] 06-10-16 51001
:ח0ו0691] זסחום זחו
0 ]אה זחו
| ( ;0914 01 סע זחו
רוב הקומפיילרים של 6 ושל ++6 מאחסנים את המידע אודות הקבציס בקובץ הכותרת
ת.51610. קובץ זה מכיל מספר הכרזות קבועות שדרושות לצורך ביצוע פעולות בקבצים,
ועשוי להכיל גם את תבנית מבנה הקובץ. כדי שניתן יהיה להשתמש בפונקציות ובפקודות
של קבצים, יש להתחיל את התוכנית בפקודה הבאה:
;<ת.51010> 66ש01ת1
פקודה זו מאפשרת לקומפיילר גישה אל קבועי הקובץ ואל תבנית המבנה בעת קימפול
וקישור התוכנית.
תרשים 12.2
מבנה הקובף מאחסן
מידע שנחוץ בעת
הרצת התוכנית.
הבנת נושא הקבצים 27
2|8
כאשר מזיניס נתונים מקובץ שבכונן, נוצר בזיכרון המחשב עותק של הנתונים. הנתוניס
נותריס בכונן ללא שינוי. מסיבה זו, מכניס המתכנתים את פעולת הקלט קריאה. כאשר
מאחסנים בכונן פלט של נתוניס מהזיכרון, אנו מציביס בכונן עותק של הנתונים. פעולה זו
מכונה כתיבה.
הערות ++6
קומפיילרים רבים של ++60 כוללים קובצי כותרת נוספים
המשמשים לביצוע פעולות קובץ מיוחדות. קבצים אלה עשויים
להיקרא בשמות ח.וח769ו05)!, א ה.ו68₪זו5!, או בשם אחר, בהתאם
לתפקידם ולסוג הקומפיילר. למידע נוסף - עיין בתיעוד הנלווה
לקומפיילר שברשותך.
00 םס םס 0
נרות קובץ
אנו יוצריס קובץ כמצביע אל מבנה הקובץ שבזיכרון. כאשר כותבים נתונים בקובץ, או
קוראים ממנו נתוניס, התוכנית מקבלת מהמבנה את המידע הדרוש לה לביצוע הפעולה.
כדי להכריז על קובץ, השתמש בצורת הכתיב הבאה:
ומוס ₪16* מז
מלת המפתח 111.8 מורה לתוכנית שהמשתנה מצביע אל מבנה קובץ. הכוכבית :וצרת
משתנה מצביע, באמצעות שס המשתנה המופיע אחריה.
אס בכוונתך להשתמש ביותר מקובץ אחד בעת ובעונה אחת, יש ליצור מצביע קובץ עבור
כל אחד מהם. לדוגמה, עבור תוכנית שמעתיקה את תוכנו של קוב אחד אל קובץ אחר, יש
צורך בשני מצביעי קובץ, כמו גם עבור תוכנית שקוראת מידע מהכונן ומשגרת אותו
למדפסת:
6* ,1116ת1* ]11
בצתיחת קובץ
הקישור בין התוכנית, הקובץ והמחשב נוצר באמצעות הפונקציה ()תסקס], לפי התבנית
המודגמת בתרשים 12.3.
הפונקציה מקצה את כתובתו של מבגה הקובץ למשתנה המצביע. הפרמטר כולל את שם
הקובץ, שחייב להתאיס למוסכמות שמות הקבצים במחשב שברשותך: ב-208, שס הקובצ
יכול להכיל עד שמונה תווים, עס אפשרות לסיומת בת שלושה תווים. כדי להדפיס פלט,
במקוס לשגרו לקובץ, השתמש בשם הקובף "א2", במרכאות. פעולה זו משגרת את הפלט
למדפסת באופן אוטומטי.
פרק 12: שיגור פלט לכונן ולמדפסת
שמו של הקוב מלת מפתת משתנה מצביע
000" ו סז = 0
מצב הגישה לקוב"
ארגומנט המצב 66סמ1 מציין את סוג הפעולה שבכוונתך לבצע. בשפת 6 ובשפת ++6 יש
להציב מרכאות גם סביב ארגומנט המצב, שיכול לקבל אחד הערכיס הבאים:
תרשים 12.3
צורת הכתיב של
הפונקציה ()ת6קס).
ַ מציין שבכוונתך לקרוא נתונים מהקובץ אל המחשב. אם הקוב אינו קיים כבר
בכונן, התוכנית תציג שגיאת הרצה.
שי מציין שבכוונתך לכתוב בקובץ או במדפסת. אם הקובץ עדיין אינו קיים בכונן,
מערכת ההפעלה תיצור אותו. מאידך, אם הקובץ קיים, כל הנתוניס הנוכתיים
המאוחסנים בו יימחקו.
8 מציין שבכוונתך להוסיף נתונים לסופו של הקובץ. מערכת ההפעלה תיצור את
הקובץ, במקרה שהקוב> אינו קיים כבר בכונן. אס הקובץ קיים, נתוני הפלט יוספו
בסופו של הקובץ, מבלי למחוק את תוכנו.
לדוגמה, כדי ליצור קוב ששמו 62.241 שיאחסן את (תוני אוסף תקליטי
הקומפקט-דיסק שלך, יש לכתוב פקודה כזו:
6
;("אוייד .כ ")ת6קס] = 06816
אם על התוכנית לקרוא נתוניס מהקובץ, במקוס לכתוב לקובץ, השתמש בפורמט הבא של
()תסקס]:
6 מ
;("ז,"7 02.2")ם6ק0 = 068116
שים לב ששמו של הקובץ וארגומנט המצב ₪066 נתונים במרכאות, מכיוון שהס מועבריס
אל הפונקציה ()ם6ק10 כמחרוזות. ניתן גם להקליד את שמו של הקובץ מהמקלדת כמשתנה
מחרוזת, ואז להשתמש בשמו של המשתנה כארגומנט, ללא מרכאות.
אס ברצונך להדפיס את המידע אודות אוסף התקליטים, השתמש בפקודה כזו:
6
;("ש",יאת?י)תסקס! = 060116
פתיחת קובץ ס / 2
הערה
++6 וכן קומפיילריס רביס
אחרים של 6 81
מאפשריס לפתות קוב
שישמש הן לקריאה והן
לכתיבה, בעת ובעונה אחת.
בעבודה עס קומפיילרים
אלה, ארגומנט המצב נכתב
כך: +ז, +או א( +4,
תרשים 12.4
המצביע עוקב אחר המיקוס
הנוכחי בקובף.
כאשר משגרים נתוניס למדפסת, ניתן להשתמש במצב שי בלבד.
כיצד בועלים קבצים
שפת 6 עוקבת אחר מיקומך בקובץ באמצעות מצביע מיוחד.
כאשר קוראים נתונים מקובץ, המצביע מציין את מיקומו של הנתון הבא שייקרא מהכונן.
כשהקובף נפתח לראשונה במצב ז, המצביע מוצב על התו הראשון בקובץ. אחרי כל פעולת
קריאה, המצביע נע אל הנתון הבא שייקרא. גודלה של התנועה תלוי בכמות המידע שנקרא
בכל פעם (תרשים 12.4). אם התוכנית קוראת תו אחד בלבד בכל פעולת קריאה, המצביע נע
אל התו הבא. אם קוראים מבנה שלם, המצביע נע אל המבנה הבא. אחרי קריאת הנתון
האחרון בקובץ, המצביע מועבר אל קוד מיוחד המכונה סמן-קצה-קובץ. אם תנסה לקרוא
נתונים מעבר לסמן-קצה-הקוב>, תוצג שגיאת הרצה.
מז
ג
ו
0 ג
0 ג פעולת קריאה
פעולת קריאה
ב
ב הס פעולת קריאה
60 הזג
גם כשפותחים קובץ במצב אי המצביע מוצב בתחילת הקובצ, כך שהפלט הראשון מוחדר
בתחילת הקובץ. עם סגירת הקובץ, מערכת ההפעלה מציבה את סמן-קצה-הקובץ אחרי
הנתון האחרון. אס הקובץ קייס כבר בשעה שהוא נפתח במצב שו, הנתונים המאוחסנים
בקובץ ישוכתבו על ידי הנתוניס החדשים הנכתבים בו. נתונים שלא שוכתבו ופיעו אחרי
סמן-קצה-הקובץ, כדי שלא יהיו זמיניס לפעולת קריאה. זו הסיבה שפתיחת קובץ קייס במצב
0 8 2 פרק 12: שיגור פלט לכונן ולמדפסת
ש מוחקת את תוכנו - גם כאשר פותחים וסוגרים את הקובץ מבלי לכתוב בו נתוניסם
כלשהם.
כאשר פותחים קוב במצב 8, המצביע מוצב על סמן-קצה-הקובץ. הנתוניס החדשים
שברצונך להוסיף מוחדרים לקובץ, וסמן-קצה-הקובץ מוצב אחריהם.
הילנעות מעוגיאות הרצה
לעתים מערכת ההפעלה אינה יכולה לפתוח את הקוב שצוין בפקודה ()תסקס). ייתכן שלא
נותר מקום בכונן, או שאתה מנסה לקרוא נתונים מקובץ שאינו קיים. הסיבה יכולה גם
להיות ניסיון להדפיס בשעה שהמדפסת אינה מופעלת או כשאינה מכילה נייר.
אם ננטה להשתמש בקובץ שלא נפתח, התוכנית תיעצר בשגיאת הרצה. כדי להימנע מכך,
השתמש בהוראת ]1 שעוצרת את התוכנית במקרה שלא ניתן לפתוח את הקוב המבוקש.
ניתן להיעזר במבנה ]1 כדי לפתוח קובץ ולבחון אם הוא גפתח כהלכה:
(011א == (("או", "0.7 0")ה6קס] = 60016)) 11
(
("116] 186 סקס 10 6|טפת(ז')פוגוק
(10
|
1 הוא ערך מיוחד שמוגדר בקובץ הכותרת .51610. אס מתגלה שגיאה בפתיחת
הקובץ, מערכת המחשב מחזירה את הערך .011 במקוס את כתובתו של מבנה הקוב,
והתוכנית מסתיימת.
ניתן להשתמש במבחן דומה גס לצורך שיגור פלט למדפסת:
((011א == (("ש",'חזק")ת6קס] = 1100600116
|
;("ח1הקה 1115 חנז ת6ת] 6והוזק 1166 תס הזט ך")פוטק
60
|
אם המדפסת אינה מופעלת, תוצג שורת ההנחיה המורה להפעיל את המדפסת ולהריץ את
התוכנית פעם נוספת. באפשרותך גס להציב את התנאי בתוך לולאת 6|!ותשו, כדי להעניק
למשתמש שהות לתקן את הבעיה:
111[ == (("או","תזק")ת6קס! = 116))601116ת/צ
|
;("ז6)ח: 655זק ת86!) 6ותוזק 116 תס תזט ")ווק
6010 = הקַגה
]
פתיחת קובץ 21
22
שיס לב - שיטה זו עלולה שלא לפעול במערכות מסוימות. אס המדפטת אינה מוכנה
לפעולה, מערכת ההפעלה תציג הודעה שמאפשרת למשתמש לבחור בין הפסקת הפעולה
(זזסטג) או ניסיון נוסף (ץז6ז). הפעל את המדפסת והקש 8 כדי לבצע ניסיון נוסף.
הערות ++6
פעולות מיוחדות של קובצי חגסזו5 הכלולים בקומפיילר ++6. |
מאפשרות לקרוא מקבצים ולכתוב לקבצים בעזרת האופרטורים
<< ו->>. לדוגמה, בקומפיילרים מסוימים, ניתן לפתוח קובץ
+ לקריאה כך: |
(6ות8ח 6!6)ז16הוסכן 16 וה68זו1/5 |
וקובץ לכתיבה, כך: |
| (6וחהח 1!!6) ז16הוסכ 116 וההפז151ס ן
ייתכן שיהיה עליך לעשות שימוש בקובץ כותרת מיוחד עבור *
פעולות אלה. עבור שמו של קובץ הכותרת ואופן השימוש בו,
עיין בתיעוד הנלווה לקומפיילר שברשותך.
סיס סי 7
]גידה קובץ
לאחר סיום ביצוע פעולות קריאה מקובץ או כתיבה לקובץ, יש לסגור את הקישור בין
הקובץ לבין המחשב, כך:
(ז16ת01ק 1610560116
סגירת הקובץ מבטיחה שכל הנתונים בחוצץ נכתבו בפועל בקובץ. אס מסיימים את
התוכנית קודס לסגירת הקובץ, קייס חשש שנתונים מהחוצץ שעדיין לא נכתבו, לא ייכללו
בפלט ויאבדו. ללא סגירת הקובץ לא ניתן להחדיר כהלכה את סמן-קצה-הקוב), ומערכת
ההפעלה עלולה להתקשות בגישה אל הקובץ במועד מאוחר יותר.
בנוסף, סגירת הקוב משחררת את מצביע הקובץ, כדי שניתן יהיה להשתמש בו עבור קוב
אחר, או כדי לבצע פעולה נוספת באותו קובץ. לדוגמה, נניח שברצונך ליצור קובץ, ולאחר
מכן לוודא שהנתונים נקלטו כהלכה. התוכנית יכולה לעשות שימוש במבנה המתואר
בתוכנית 12.1.
פרק 12: שיגור פלט לכונן ולמדפסת
תוכנית 12.1: שימוש במצביע קובץ אחד לשתי פעולות
,00+116+ ם|ךת
(ושא == (("א","ד3הם.00")ה8קס+ = 00+118)) +3
ָ
;("1110 706+ 0068%8 %0 8018ת5)"0טק
; ()1%א9
1
8 8ח+ 0+ מה1+1תא חס? 5ה10+סט5%0ה1
+01058)00+118( ;
()וטא == ((""","דהם.00")ה6ק0ס+1 = 00%116)) 1%
/
; ("118+ 8ח+ ח8ק0 0+ 8018ה5)"0+טק
; ()ת1א9
1
8 %808 תסת?1 9980109 חס9ת+ הס1+סטס+5ה1
101058)001118( ;
תחילה, הקוב נפתח במצב שו והנתונים נכתבים לתוכו. הקובץ נסגר, ונפתח פעם נוטפת
במצב ז, כדי שניתן יהיה לקרוא את הנתונים ולהציגס על המסך.
קומפיילרים מסוימיס מאפשריט למשתמש לוודא שכל הנתונים נכתבו לקובץ על ידי
"ניקוי" החוצץ באמצעות הפקודה:
(0)מפטה
פקודה זו גורמת לכתיבה לכונן, או להדפסה, של כל הנתונים בחוצץ, גם במקרה שהקובץ
לא נסגר.
בצונקציות קל ובלט
ישנן מספר דרכיס להעביר נתונים מקבצים ואל קבצים:
* לכתוב את הנתונים לקובץ או לשגרס למדפסת תו אחר תו, בעזרת הפונקציות
()סזוק או ()סווק).
= לקרוא נתונים מקובץ תו אחר תו, בעזרת ()2600 או (/18600.
פונקציות קלט ופלט 3[ 2
* לכתוב נתונים לקובץ או לשגרס למדפטת כמחרוזות (שורה אחר שורה), בעזרת
הפונקציה ()פוגוק).
* לקרוא נתונים מקובץ כמחרוזת (שורה אחר שורה), בעזרת הפונקציה ()86/8].
*+ לכתוב תוויסם מפורמטים, מחרוזות ומספרים לכונן, או לשגרס למדפסת, בעזרת
הפונקציה ()!!תוזק).
* לקרוא תווים מפורמטים, מחרוזות ומספריס מקובץ בעזרת הפונקציה ()1ת808].
*= לכתוב מבגה שלס באמצעות הפונקציה ()6ו1עו].
* לקרוא מבנה שלס באמצעות הפונקציה ()680:).
( בודה עם חווים
העברת נתונים בשיטת תו-אחר-תו היא פעולת הקובץ הבסיסית ביותר. אומנם אין זו
השיטה היעילה ביותר לטיפול בנתונים, אך ניתן להדגים בעזרתה את אופן השימוש
בקבצים. התוכנית הבאה, לדוגמה, כותבת תווים לקובץ, עד שהמשתמש מקיש זסותכ:
/*ס.סונוק]*/
".51010" 0[066ת1
()הנ גו
|
(* מז
1
(1א==(("אויץ יט 1 ]א ")תסקס! = 1
[
;("116] 116 תסקס 01תת03")פוטק
0
0
;(001 200 =ז16100
(ק1 0)16000)טק1
ו
;('ז'=!ז116)160)6 תע
(ק]161050
4 8 2 פרק 12: שיגור פלט לכונן ולמדפסת
הקובץ נפתח במצב שי - ובמקרה שהקובץ .11 ]א אינו קייס, התוכנית יוצרת אותו.
לולאת ה-60 מזינה סדרה של תווים באמצעות הפונקציה ()ז8ת8610, וכותבת אותס לקובצ
בעזרת הפונקציה ()סווק. צורת הכתיב של הפונקציה ()16טק היא:
;(61ותוסק 116 ,8118016 ז8ת0)סווק
ניתן גס להשתמש בהוראת ()10טק1 עס אותס ארגומנטים.
הלולאה חוזרת על עצמה עד שהמשתמש מקיש זסותע. הקשת זטוחם מזינה את תו החזרה
(ז) והקוב נסגר.
קלט ()זגּחסוסף באמצעות חוצץ |
בעבודה עם קומפיילרים שמשתמשים בחוצץ בעת הזנת נתונים
עם הפונקציה ()זח4010, השתמש בפונקציה ()6חסז6ט כדי להזין |
תווים בודדים לצורך כתיבה לקובץ בכונן. החלף את מבנה |
ה-6ווחש...₪0 בלולאה הבאה: |
('ז'=! ( ()6ה616=ז0016!) ) 6|וחעצ ו
;(ס]) ,ז10ז6!)סזטקז |
4-ה חח ה ה ו 4
קריאת תווים מקובץ
כדי לקרוא תו מקובץ, השתמש בפונקציה ()8600 או בפונקציה ()610), שצורת הכתיב שלה
היא:
;(6ות01ק 200006116 = 9118016 081
לדוגמה, כדי להזין תו מקובץ שעליו מצביע המצביע פ!, השתמש בהוראה:
((ק])2600 = ז161)6
התוכנית הבאה קוראת את הקובצ שיצרנו בדוגמה הקודמת:
/*8610.0]*/
"ת.51010" 10166
()חוות
|
+ מז
תו
011 ==(("זיים זי עא")ת6קס) = 1000
(
עבודה עם תווים 255
206
"110 16) תסקס 01םת8)")פוטק
0
1
(20 =: ((ס))16100=18610)) 116
;(%0"101001"))ותוזק
((101056)0
1
אנו פותחים את הקובץ במצב ז וקוראים את התווים בלולאת ה-6וש. מרבית העבודה
מתבצעת בתוך הפרמטר של הוראת ה-6!ותשו. ההוראה:
(ק))2000]=ז16110
מקצה תו מהקובף למשתנה ז06ו16. הלולאה חוזרת על עצמה כל עוד המשתנה אינו שווה
תסם, שהוא קבוע מיוחד המייצג את קצה-הקובץ. כאשר המצביע מגיע לקצה הקובו
הערך המוחזר למשתנה :66| יהיה שווה לערך '₪01, המוכרז בקובץ הכותרת 51610.1.
הדוגמאות שהצגנו עושות שימוש בשמות זהים של מצביע הקובץ והמשתנה, הן לצורך
כתיבת נתונים לקובץ והן לצורך קריאה מהקובץ. אך הדבר אינו הכרתי. באפשרותך לכתוב
לקבצים ולקרוא מהם, תוך שימוש בשמות שונים למצביעים ולמשתנים, כל עוד שם הקובץ
זהה עבור שתי הפעולות.
( בודה עם עוודות
במקוס לעבוד עם תווים בודדיס, ניתן לקרוא ולכתוב שורת מלל שלמה - מחרוזת - בעזרת
הפונקציות ()1טק] ו-(186/80.
מבנה הפונקציה (50וטק] הוא:
;(61ות1סק 116 8118016 קםוזו5)פוטוק
הפונקציה כותבת לקובץ או משגרת למדפסת מחרוזת שלמה, אך אינה מוסיפה פקודת
שורה-חדשה לסופה של המחרוזת. אס ברצונך לאחטן בקובץ כל שורה בנפרד, או להדפיס
כל מחרוזת בשורה נפרדת, עליך להוסיף את פקודת השורה-החדשה בעצמך. לדוגמה,
התוכנית הבאה יוצרת קוב של שמות:
/*ס.פונוק]*/
"ת.51010" 06נ1סת41
()תוגות
|
₪* םזי
פרק 12: שיגור פלט לכונן ולמדפסת
זו
0
(,0141 א==(("שוים ")שק = 10000
|
;("₪10 156 ת6קס ]0תם3<)")פוטק
0
]
= קת
('ת'=!116)182ת/
|
;("סותגת 8 זסותכ")פוטק
;(16ת618)08
((ק1 6ותהם)פוטק1
(0ו/"")פוטק
;(""סהתגת זסוסתג 36 נוסץ סכ")!!הוזק
=
;('ח')ז8תסוטק
]
;(ק101050)0
]
לולאת ה-6!ותאו חוזרת על עצמה עד שהמשתמש מקיש את האות ת בתגובה לשאלה.
הלולאה מזינה שם באמצעות הפונקציה ()86; לאתחר מכן נכתב השס לקובץ בעזרת
הפקודה ()פוטוק]. בשלב זה נוצר פלט של קוד שורה-חדשה והתוכנית שואלת את המשתמש
אם ברצונו להזין שם נוסף.
אם הקומפיילר שברשותך כולל את הפונקציה ()ם16ז51, ניתן לפשט את החזרות, כך:
;(" :6חחהת 8 ז6)ת6 16456ק'))ותוזק
(816ת)2618
(0 < (6גם)ת116ו16)5ות/
|
;(ק] ,6ותגת)פוטק1
;(ק,'ת")פוטק1
;(" :6החגת 8 ז0ות6 16856ק')]תוזק
;(16ת8ת)2618
עבודה עם שורות 7 8 2
208
המחרוזת שהמשתמש מקליד מוקצית למשתנה 6וזת. התוכנית משווה את אורכה של
המחרוזת ל-0. אס המשתמש מקיש זסות₪ מבלי להקיש שם, אורכה של המחרוזת יהיה 0,
והלולאה תסתיים. אם המשתמש מקליד תו אחד לפחות, המחרוזת וקוד שורה-חדשה
נכתביס לכונן.
בקומפיילרים מסוימים ניתן לקצר את האלגוריתס אף יותר, כך:
((" :סוחגת 8 ז16ת6 216856")])מוזק
(0 < ((0ותגת)2615)ת16ז1]6)51ת ער
|
;(ק 6ו41ם)פוטק1
;(0ום")פוטפ1
(" :גת 8 101ח6 16856ק")])תוזק
קלט המחרוזת מבוצע בתוך תנאי ה-1116או עצמו.
על ידי שימוש בשם הקוב "תזק" ניתן להדפיס את המחרוזות, במקוס לשמור אותן בכונן.
פתח את הקובץ בעזרת הפקודה:
(.1א==(("עו',יימזק')תסקס) = 1))0
כדי ליצור תוכנית הדפסה עליך להכריז על המחרוזת בתחוס 81 תווים, כדי שניתן יהיה
להציג שורה מלאה על המסך קודם להקשת זשומט. תוכנית 12.2 מדגימה כיצד ניתן לבנות
מעבד תמלילים פשוט. מכיוון שהשורה אינה משוגרת למדפסת עד להקשת זסוחת, ניתן
להשתמש במקש 88050806 לתיקון שגיאות בשורה בזמן ההקלדה.
תוכנית 12.2: תוכנית להדפסת שורות פלט
/*ס.סא*!
"ת.5%010" 08ט01ה41
()ה81ח
1
;+ 1|6=
0%
())0א==( (*ש", *חזק")ה6קסז = כ+))+1
/
; ("%60ה1יק 6ה+ 8008655 0%הה%5)"08טק
; ()1%א9
1
;("הה680 67++8% %60ה5 [ה076551 ,%א6+ +0 65ה11 תטסץ 6קעד")%5טם
;("ח ק50 0+ 1178 ששה 8 הס ₪888 655קק")5צטם
פרק 12: שיגור פלט לכונן ולמדפטת
; (0015)11068
(0 < (1108)ה116)5%716חה₪
.
;(ק+ ,8ה%5)11טק+
; (ק+, *ח")5+טק+
; (00%5)1106
1
; (ק101056)1
1
קריאת מחרוזות
קריאת מחרוזת מקובף מתבצעת באמצעות הפונקציה (186)80, לפי הפורמט הבא:
(6)םוסק 16 06 08
הפונקציה מזינה שורה שלמה, עד לקוד השורה-החדשה, אולס לא יותר מִ-תּ1אַת6[ פחות תו
אחד. הפרמטר גַקַת6! הוא מספר שלם, או משתנה או קבוע מטיפוס )םו, שמבטא את
המספר המירבי של תוויס שניתן להזין.
להלן תוכנית שקוראת בחזרה את טסדרת השמות שיצרנו בדוגמה הקודמת:
/*10615.0*/
"ה.51010" 101166
()תופות
|
(ק* ₪ זו
0
(11טא== זי א תס = 1
|
(("1116 86) תסקס )0תתג0")פונוק
0
|
(01א=!(ק6,12,0ותהת)ו6ק))116ת אי
|
|(6ותהח)]1תוזק
]
161050000(
עבודה עס שורות 200
]
הקלט מתבצע בפרמטר של ביטוי ה-6|ותש כל עוד הערך שהתוכנית קוראת שונה
מ-,011אא. בעת קריאת מחרוזות, כאשר המצביע מגיע לסופו של הקובץ, מוקצה הערך
עוטא למשתנה המחרוזת. לכן, יש להשתמש תמיד ב-1 11 כדי לאתר את סופו של
הקובץ בקריאת מחרוזות; בעת קריאת תווים, השתמש ב-407.
אם ברצונך לכתוב תוכנית כללית לקריאת קובץ מלל כלשהו, קבע את גודלו של הארגומנט
הוקַת! ל-80.
הפקודה ()!)תוזק, דרך-אגב, משמשת כאן ליצירת פלט של תוכן משתנה המחרוזת ללא
מציין פורמט. כל מחרוזת שנקראת מהקובץ כוללת פקודת שורה-חדשה שנכתבה לקובץ על
ידי ההוראה (ק),'ח')פונוק). אי צורך בפקודת שורה-חדשה נוספת בתוך הפונקציה
(0))תנזק.
חרט ובלט מבורמנטים
פקודות קובץ שמטפלות בתווים ובמחרוזות יכולות אך ורק לקרוא מלל ולכתבו. אס ברצונך
ליצור קובץ או תדפיס שמכילים ערכים מספריים, עליך להשתמש בפונקציות (]ותוזק1
ו-(0ת508). צורת הכתיב של פקודות אלה דומה לזו של ()ותוזק ו-(10ת508, אולם הן
כוללות גם את מצביע הקובץ שמציין מהיכן יש לקרוא את הנתונים, או להיכן לכתוב
אותם.
(180] 918 תוזז [0זותס6 מסותוסק 816)]ותוזק!
1150 0818 ,קתוז51 101והסס סק 10116
תוכנית 123 מזינה נתוני מלאי וכותבת אותם לקובץ. הקלט הראשון מבוצע באמצעות
פקודת (₪61%0, לפני תחילתה של לולאת ה-116תאי. הלולאה חוזרת כל עוד אורכו של כל
אחד משמות הפריטים הוא תו אחד לפחות. הלולאה מסתיימת כאשר מקישים ששוח
במקוס שס.
תוכנית 3: תיעוד פלט מפורמט
/*0.%%ה1יק+*/
"ה.5%010" 06טש01ה1/
()ה81
/
;ק++* םוז
; [0806]20 86ת0
;הט +ה1
1 מ1108%%+
( ==( (*א", *ם 1" )סז = ם11))1
ָ
;("1106+ 8 ח006 0%ה5)"080צטק
00 2 פרק 12: שיגור פלט לכונן ולמדפסת
; ()צ1א9
1
ב :הח ה1+6 8ה+ %68ה6 16856ק")+%ה1תק
; (806ה)96%5
(0 < (808ה)ה116)5%718הש
ָ
;(* :005% 8ה+ %68ה0 216866*)+%ת1חק
; (+8005 ,"%%")+5080
[(* :צ+1+ההטף 6ה+ 68168 16856ק*)+צה1חם
; (צ+1+ח8ט80 , "50801)"%0
; (צ+1+ה08) ,005% ,חאה ,"ה%0 %% %8* ,0+)++ה1הק+
;(* :0806 8 %88ה6 216856*)++ה1סק
; (808ה)08%5
1
; (ק+)1+01056
ז
שיס לב שהשם השני מוזן בתור השורה האחרונה של הלולאה. מבנה זה מאפשר למשתמש
לסיים את הלולאה על ידי הקשת זוזמ פעס אחת. מתכנתיס מתחילים עשויים לכתוב את
הלולאה כך:
00
|
;(" :6ותגת 8 101ת6 016856")]!תוזק
06
;(" :0056 116 זס)ת6 216856")])חוזק
;(60050 ,"]%")/ת508
;(" :ותו 116 ז10ח6 016856")])תוזק
;(11ח :6 ,"1)"90ת309
;(ע111מהטף ,6056 (6ותהם ,"ח%0 41 95" ,ק1)]ותוזק
]
(0 < (סותגת)ת116)51:16ם שי
קלט ופלט מפורמטים 01 2
207
גם כך הלולאה תפעל כשורה, אולס כדי לסייס את הלולאה על המשתמש להקיש זטוחע
שלוש פעמים: פעם אחת עבור השם, ופעמיים נוספות כדי לעקוף את ההנתיות עבור 00%
ועבור ץ)1)תגטף.
בתוך לולאת ה-1!6שו, המחיר והכמות (0081, ץ)1ותגנוף) של כל פריט מוזנים על ידי שימוש
בפונקציות ()ת508, ולאחר מכן הנתוניס נכתבים לקובץ על הדיסק בפקודה אחת:
;(ע111מ8נוף ,0054 (6חתהת ,"ת%6 ]4 פ%" ,15)!ותוזק!
שים לב שבסופה של כל שורה נכתב לקובץ קוד שורה-חדשה. אם נסקור את הקוב
באמצעות פקודת 125 של 2005, תופיע כל שורת נתוניס בנפרד:
0 1.120000 618%
0 7.340000 מספטוז
3 75.000000 ז6תס1
ללא פקודת השורה-החדשה, המלל היה מופיע ברצף אחד, כך:
3 000000 זסתס)150 7.340000 ת1500ז100 1.120000 615%
שיס לב שאין רווח בין ערך הכמות של פריט אחד, לבין שמו של הפריט הבא אחריו. עס
זאת, ניתן יהיה לקרוא את הקובץ ללא קושי, מכיוון שהקומפיילר מזהה היכן מסתיים ערך
מספרי ומתחילה מחרוזת.
לעומת זאת, נניח שהערך הראשון והאחרון של כל פריט היו מחרוצות, כך:
17 75.000000 ז6ת2887681910) 7.340000 מסספ!זא6זסתז16/[ 1.120000 15%
כשהתוכנית תקרא את המחרוזת בסופו של הפריט הראשון, היא תקרא גס את המחרוזת
שפותחת את הפריט השני. לדוגמה, הפריט הראשון יקרא כך:
חסלפזא6/סות16/! 1.120000 615%
כל נתוני הפלט, אפילו ערכים מטיפוס )תו ו-)08, מאוחסנים על-גבי הדיסק כתווי מלל.
בהמשך נדון בנושא זה בפירוט.
קריאת קבצים מבודמטים
קלט מקובף מפורמט מתבצע באמצעות הפונקציה ()1ת809. הפונקציה ()18081 פועלת
באופן דומה לפונקציה ()1מ504, אלא שהיא מקבלת את הקלט מקובץ ולא מהמקלדת. לרוע
המזל, ()1ת₪63 סובלת מחסרונות דומים לאלה של ((0ת804. היא אינה יכולה לקרוא
מחרוזות שכוללות רווחים, ומחזירה תוצאות שגויות במקרה שהנתונים בשטף איגם תואמים
לטיפוסי הנתוניס הצפויים במחרוזת הבקרה.
תוכנית 12.4 קוראת את קוב המלאי המפורמט. שים לב שלולאת ה-116תש חוזרת כל עוד
הקלט שונה מ-₪01 (קצה הקובץ).
פרק 12: שיגור פלט לכונן ולמדפסת
תוכנית 12.4: קריאת קובץ מלל מפורמט
/]*ס.+ה508+*/
"ה.5%010" 06ט01ה81
()ה81ח
.
;ק++* ם|ז;
; [806]20ה 0088
;ץזנ+הטט %ח1
;005% 108%+
(1שא== (("-","ם |ך;צא")ה6קס+ = ס+))+1
ָ
;("116+ 8ה+ ח6קס 0%הה5)"08+טק
;()1%א9
1
("6₪0 =! (ץ+1+ה8008 ,8005% ,6חהה , "%0 %% %5*,ק1)%ה116)1508הש
; (6חהח ,"ה%5 :1%60")+%ה1חם
; (0085% ('ה2%.% :%1)"005%הגחק
; (עץצ1זההטף ( "ה%0 :)הב
1
; (ק01056)1+
/
( דה עם מבנים
אחת הדרכים להתגבר על חטרונותיה של הפונקציה (10מ1803 היא לשלב אלמנטיס של
נתוניס במבנה, ואז ליצור פלט וקלט של המבנה כולו בעת ובעונה אחת. ניתן לכתוב מבנה
לדיסק באמצעות הפונקציה ()116ז₪), ולקרוא מבנה מהדיסק באמצעות הפונקציה ()1680.
צורת הכתיב של ()116ז/1 היא כדלקמן:
6% 6ז)סנת!3 06 06 )ות
(סותוסק 16 5106 01 ז6טותטת
צורת כתיב זו נראית אולי מסובכת, אך למעשה קל מאד ליישמה:
6 )גוז הוא משתנה המבנה עם אופרטור הכתובת. משתנה זה
מורה לקומפיילר מהי הכתובת ההתחלתית של הנתונים שברצונך לכתוב לדיסק.
* 8[26 6ז010מת)5 הוא מספר התוויס במבנה. במקוס לספור את התווים בעצמך,
השתמש בפונקצית הספרייה ()812601, כך:
5126051016 8118016(
עבודה עם מבנים 3 2
פעולה זו מחשבת את גודלו של המבנה באופן אוטומטי.
* 66זט)0נת51 01 זססותטת הוא מספר שלסם שמציין כמה מבנים ברצונך לכתוב בעת
ובעונה אחת. השתמש תמיד במספר 1, אלא אם ברצונך ליצור מערך של מבנים
ולכתוב את המערך כולו כיחידה גדולה אחת.
> ז0)ת!סק 1116 הוא המצביע המסמן את הקוב.
לדוגמה, נניח שברצונך לשמור את נתוני אוסף תקליטי הקומפקט-דיסק שלך על-גבי כונן.
אם נשתמש במבנה 02 שתיארנו בפרק 11, הפקודה לכתוב מבנה תיראה כך:
ן [
0 ,1 (51260100150 ,11116)620150
ההוראה מודגמת בתרשים 12.5.
תוכנית 12.5 מזינה נתונים לתוך המבנה 622 ושומרת אותם על-גבי הכונן. התוכנית עושה
שימוש בפונקציה ()86/8 לצורך הזאנת שם הקובץ שברצונך ליצור. המשתנה שמאחטן את
שם הקוב משמש לאחר מכן בפקודה ()תסקס), לפתיחת הקוב.
תרשים 12.5
הכתיב של הפקודה
מלת מפתח
(60וזא עבור המבנה 0. מספר המבנים שיש לקרוא היכן לאתר את
המבנה בזיכרון
|
(1.70 .(812001)056 ,80150 ) וזו
מצביע לקוב
מספר התוויס במבנה
ממנו יש לקרוא ַ
הנתונים על כל תקליט קומפקט-דיסק מוזניס מהמקלדת, ולאחר מכן נכתב המבנה כולו לכונן.
תוכנית 12.5: תיעוד המבנה פס
/*1%6.0הא+*/
"ה.5%010" 41001006
()ה81ה
,
;ק++* ₪|1;
2 0 9+000%
94 פרק 12: שיגור פלט לכונן ולמדפסת
; [8]20ההה "8ה0
; [0850010%100]40 חהה0
; [12]ץ" 08%600 00885
;0 11081
; ח6סהטה %ה1
0 1[
; [0806]25ה118+ ח8ה0
;(* :0768%6 %0 980% טסץ 1118 8ה+ ת%6ה₪")+הב1חם
; (08%5)1116088
()01א == (("א", 808ה1+116)ה0ק10 = ס+))11
ָ
; (111008₪6, "ה%5 1116 6ה+ ה6קס %'ה1)"08+הגחם
; ()1%א9
/
; ("הה0708+10זה1 018% ה6שהם")פצטק
](' :00 6ה+ +01 806ח 8ה+ %8%ה6 18856ק")1+ה1חק
; (08%5)0150.0806
(0 < (116)5%7180)0150.0806ח₪
ָ
;(" :0650710%100 6ה+ %67ה6")+%ה1חק
; (ה10+ק06%5)0150.065071
((" :/ץ08%8007 188 %68הם")+%ה1חק
; (צ06%5)0150.08+8007
;(' :005% 76 %68ה5")+%ה1חק
; (80150.005% ,"50801)"%1
; (" :ה6פהטה 810% 8ת+ %68ה")1+ה1חק
; (68סהטה.80180 , "%0")%ה508
;(ק1 ,1 ,(512601)01580 ,1001+6)80150
; (" :8806 8ה+ 67%6% 16856ק7")++ה1חק
; (96%5)0180.0806
ז
; (ק1+01056)1
עבודה עם מבנים 55 2
206
קריאת מבנים
כדי לקרוא מבנה שלם בבת אחת, השתמש בפונקציה ()1680!, לפי צורת הכתיב הבאה:
6 6זנו!0נת)5 ,4118016 200016ת640)651
(6)תנסק 116 ,0100165נת51 01 ז6טותנות
צורת הכתיב של ()11680 זהה לזו של ()16זא], למעט שם הפונקציה. תוכנית 12.6 קוראת
את מבנה קובץ תקליטי הקומפקט-דיסק. הנתונים נקראים בעזרת לולאת 16ַתש:
(1==(ק) 1 ,(812601)6150 ,(116)11686)6:0186 שו
הפונקציה ()1:630 מחזירה את מספרם של המבנים השלמים שנקראו בהצלחה. מכיוון
שהארגומנט מתייחס לקריאת מבנה אחד בלבד בכל פעם, הערך שיוחזר אמור להיות 1.
לולאת ה-6!ואו חוזרת כל עוד ניתן לקרוא מבנה שלס מהכונן. במקרה שלא ניתן לקרוא
מבנה - מכיוון שהפונקציה הגיעה לקצה הקובץ - הפונקציה מחזירה אפס והלולאה מסתיימת.
תוכנית 12.6: קריאת המבנה סש מהכונן
]*17680.0*]
"ה.5%010" 41001006
()810
0
1]5₪ת
0 8%000%
/
; [6]20ח8ה "078
; [0680010%100]40 85ת0
; [12]ץ08%0007 008%
;0 108%+
; ה6סהטה %ה1
7[
; [11160806]25 "8ה0
;(* :7680 0+ 11160806 8ה+ ה%6הם")%1ה1תקם
; (808ה06%85)1116
+ (014א == ((""",808ה10067)1110 = כ11))10
; (806ה1116, "ה%5 1116 6ה+ ה6קס %'ה08")++ה1חק
(()1%א9
1
(1==(ם1 ,1 ,(51260%)0150 ,116)170080)80150ה₪
ָ
פרק 12: שיגור פלט לכונן ולמדפסת
; (806ח. 0180) 5+
; ('ה')תההס%טק
; (הס1+ק%5)0150.065071טם
; ('ח')תההס+טק
; (צ08+6007. %5)01850ט
; ('ת')יההס%+טק
; (0150.008% ,"ת%%")++ה1חק
; (הפפהטה. .0150 , "ה%6")+%ה1חם
1
; (ק101058)1 |
טבלה 12.1 מסכמת את שיטות הקלט והפלט, וכן את המבחן בו עושה שימוש כל אחת
מהפונקציות כדי לעצור את קריאת הנתונים.
טבלה 12.1
סיכוס פונקציות קלט
ופלט של קבצים.
(100160 201000 | | ()0)טוק1 (()0)נוק | 6037800088
07 ==! 6|נתשו
תשא == 6נש (120150 ()5וגו] פסתון
]== 6!זתש (/1ת1508 ()תזיזס1 מס
1! 1!6תץו (10900 ()1)6יזש] 5ננ ו
ריאה לחוך מערך
התוכנית בה השתמשנו כאן להדגמת הקריאה מהכונן מסתפקת בהצגת נתוני הקלט על-גבי
המסך. עם זאת, מרגע שהנתונים נקראו לתוך משתנה, ניתן לבצע עליהם כל פעולה שהיא,
כמו גם להשתמש בנתונים לטעינת מערך.
תוכנית 12.7, לדוגמה, קוראת את הנתונים מקובצי הקומפקט-דיסק לתוך מערך של מבנה
ה-62 (בהנחה שאין יותר מ-20 תקליטים). התוכנית עושה שימוש במספר הסידורי בכל
אחד מהמיקומים של המבנה ששמו 6186, כך שכל מבנה מוזן לתוך אלמנט אחר במערך.
לאחר קריאתו והצגתו של כל מבנה, מחושב ערכו הכולל של האוסף, והמספר הסידורי
ומשתנה המנייה גדלים בעזרת ההוראות הבאות:
קריאה לתוך מערך 77 2
8 2 פרק 12:
0050 [068ת6150]1 + 10181 = [1018
(++06%ת1
(++1ם 000
אם היינו מעוניעים אך ורק בנתוני הסכוס והמנייה, היינו יכוליס לקרוא כל רשומה לתוך
מבגה שאינו מערךו ולעקוב באופן שוטף אחר הסכוס והמנייה המצטברים. אולם, מרגע
שקראנו את הנתונים לתוך מערך, ניתן להשתמש במערך לאיתור תקליט קומפקט-דיסק
מסוים, או להדפיס דו"ח כלשהו.
שים לב שהתוכנית מבקשת שוב ושוב שס קובץ, עד שניתן לפתוח קובץ.
תוכנית 12.7: קריאת המבנה לתוך מערך
/*0.צ8008ת*/
"ה.5+010" 410010086
()ה81ח
;םק ₪]1ת
8+000% 00
ָ
0886 ה876]20[ ;
08650010%100]40[ ; 88ה0
; [12]/ץ 08%8000 %"8ה0
+1108%
; ח6סהטה %ה1
[ 0180]20[ ;
;+ה00 ,א06ה1 +ה1
1108% 1
7 = +חט00
+0%81 = 17
; [806]25ה116+ "8ת0
; (* ?1180806+ %טקה1 6ה+ ה6+תש')1+ה1חם
; (806ה06%5)1116
()וא == ((""",806ה1118)ה6ק10 = ק116))1חא
1
; (806ה1118, "ה%8 1118 6ה+ הפקס %'ה08")+%ה1חקם
; (" ?11180806 צטקת1 6ה+ %67ה%1)"5ה1חם
; (8₪6ה116+)06%5
שיגור פלט לכונן ולמדפסת
= 106%
(1==(ק+ ,1 ,([א06ה0150]1)+512860% , [א116)17080)80150]1006חא
/
; (8₪8ח. [א1006 ] 0180) פ+טם
; ('ה')ההס+טם
; (ח0650710%10. [א086ח1 ] 0150) פ+טם
; ('ח')80ה0+טק
; (צ0818007%. [ א6חב ] 0150) פ+טם
; ('ח')יההס+טם
; (008%.[א06ה0150]1 ,"ה%%")++ה1חקם
; (ה6סהטה. [א06ה0150]1 , "ה%0")%%ה1חקם
]1 [א0180]10086 + 0%81+ > 0%81+
1006%++ ;
;+++חהט00
1
; (ק101056)1
;(%0%81 ,"ה21.% 158 ה001160+10 עה +01 ה+זסא 0%81+ 6תד")++ה1חם
; (+הט0ס ,"חהה001180+10 עֶח הג 008 %0 8טאה 1")++ה1חק
הערות ++6
בעבודה עם קומפיילרים של ++6 ניתן לקרוא ולכתוב קבצים
שנפתחו בעזרת הפונקציות ההבּסזו6! !ו-וה6זו15ס, תוך שימוש
באופרטורים >> ו-<<. כדו לקרוא קובץ, השתמש בצורת הכתיבה
הבאה:
;6|מהּ]זהט << זסזהוסכ 16
כדי לכתוב קובץ, השתמש בצורת הכתיבה הבאה:
;זה >> זס)חוסכן 6
₪ 2 5₪ה6 082 הש 0 ₪ אש 8 08-08 ₪7 809₪ אש שה 080760 שו
קריאה לתוך מערך סל 2
ד וסנת נתונים לקובץ
כאשר פותחים קוב קיים במצב שו, נמחקים כל הנתונים בקובצ. כדי להוסיף נתונים לקוב,
יש לפתוח אותו במצב ג. למעשה, במרבית הקומפיילרים ניתן להשתמש בתוכנית אחת הן
ליצירת קובץ והן להוספת רשומות לקובץ. השימוש במצב 8 מבטיח שהקוב> יווצר, אם אינו
קייס עדיין. אס הקובץ כבר נמצא על-גבי הכונן, הנתוניס החדשים יתווספו אליו.
כאשר מוסיפים נתוניס לקובץ, יש להקפיד שפורמט הנתונים החדשים זהה לפורמט הנתונים
השמורים בקובץ. לדוגמה, ניתן לפתוח קובץ שנוצר כסדרה של תווים, ואז לכתוב לתוכו מבנה.
אולם כשתנסה לקרוא מהקובץ, תתקבל שגיאת הרצה או שיתקבלו נתוניס מוזרים.
דורמיט של מלל ובורמט בינארי
הפונקציות ()סוטק, ()סוגוק] ו-(150וק1 יוצרות פלט של מלל. אם נתבונן בקובץ בעזרת פקודת
נראה את התוויס בדיוק כפי שהקלדנו אותס. ניתן להשתמש בכל אחת מפונקציות
אלה כדי ליצור קובץ, ואז לקרוא אותו בעזרת (86000, ()18010 או ()18618. פונקציות התווים
לדוגמה, יקראו את הקוב תו-אחר-תו, אפילו אם במקור הקוב נכתב כמחרוזות, בעזרת
(0פ)טק). באופן דומה, פונקציות המחרוזות יקראו את הקובץ שורה-אחר-שורה, גס אס
הקובץ נכתב כתווים בודדיס.
תוכנית 12.8, לדוגמה, מעתיקה קובץ אחד לקובץ אחר, ומציגה את תוכנו של הקוב
על-גבי המסך. התוכנית תפעל עם כל קובץ שהוא, ללא תלות באופן בו הוא נוצר. אנו
מכריזים על שני מצביעי קוב, מכיוון שעלינו ליצור גישה לשני קבצים בעת ובעונה אחת.
תוכנית 12.8: תוכנית העתקת-קבצים
/|*0.ץ116000++/
"51010.8" 417001006
810)(
ָ
1 ,101* ₪]ךת
;[%1116]25ט0 ,( [116]25+ה1 תהה0
1080 10%
;(" :7086 %0 11160806 6ת+ ה%6הם")+ה1פם
; (00%5)101116
(1שא == ((""",%116ה1)ה6ק0+ > 101))+1
1
; (118+ה1, "ח%5 68 6חף 0060 %'ה08")++ה1חם
()15א9
ד
1 :1 0 11160806 8+ ח%6ה5")+%ה1חם
; (09%5)00%1+116
200 (\א == (("א*,116+זטס)0060+ = 02+))+1
פרק 12: שיגור פלט לכונן ולמדפסת
;(00%1110 ,'ה%5 1118 שח+ ה6קס %'080י)ז%ה1חם
+
()ז1אס
/
(?60 =!| ((108%0)101 =18))16%%60בח9
ָ
; (8")16%%80ה0לטס
; (102 (%0)10%%88ט0+
/
; (1ק01088)1+
; (2ק01086)1+
הקוב הראשון נפתח במצב ז, כדי שניתן יהיה להזן את הנתוניס שהוא מכיל. אם לא ניתן
לפתוח את הקובץ, התוכנית מסתיימת. הקוב השני נפתח במצב או, כדי שניתן יהיה ליצור פלט
של נתוניס לתוכו. אס לא ניתן לפתות את קובץ הפלט, נסגר תחילה קוב הקלט והתוכנית
מטתיימת. מבנה זה מבטיח שקוב הקלט שנפתח בהצלחה, לא ייפגם עם סיום התוכנית.
גם הפונקציה (!)חוזק! כותבת את הנתונים כמלל. לדוגמה, אם נשתמש ב-()!חוזק] כדי
לכתוב את המספר 34.23 לכונן, ייכתבו למעשה חמישה תווים, כפי שמודגם בתרשים 156.
כאשר משתמשים ב-()1ח808] לקריאת הקובץ, התוויס מומרים לערכים מספריים בעת
החדרתט לכתובת המשתנה.
תרשים 12.6
()8)תוזק] מאחסנת
ערכיס מספריים כתווי
מלל.
' 4 = 008%
> :(61",0087",ס1)זחוזס
פורמט של מלל ופורמט בינארי 01 3
קומפיילרים של ++6 וכן
קומפיילרים רבים של
6 [5א4 מאפשרים לך
ליצור קבציס בפורמט
בינארי לצורך אחסון נתוניס
מספריים. יש ליצור את
הקובף במצב פא, ולקרוא
אותו במצב טז. התו ל
מסמן פורמט בינארי. לאתר
מכן ניתן לכתוב ערכי
מספרים שלמים בעזרת
הפונקציה ()אזטק, ולקרוא
אותם בעזרת ()/861.
מכיוון ש-(]))חוזק1 מאחסנת את כל הנתונים כמלל, באפשרותך גם לקרוא את הקובף
בעזרת הפונקציות (8660, ()18610 או (186150. עם זאת, פונקציות אלה יתייחסו לנתוניס
המספריים כאל תווי מלל. בשימוש בפונקציה ()8615!, לדוגמה, המספרים ייקראו כתווים
שמהוויס חלק משורה. ניתן אומנס להציג או להדפיס את הקובץ אחרי קריאתו באמצעות
(86150] או ()18010/ אולס לא ניתן לבצע פעולות כלשהן על פריטי הנתונים השונים.
בורמט בינארי
השתמש בפונקציה (1160ז1 כדי לשמור משתנים מספריים בפורמט בינארי. כמות המקוס
שהמספרים תופסים בכונן זהה לזו שהם תופסים בזיכרון. אס נתבונן בקובץ בעזרת
הפקודה מץצ1, נראה תוויס או סימניס חסרי משמעות במקוס נתונים מספריים. סימנים
אלה מייצגים את תווי ה-4.5011 המקבילים לערכים המאוחסנים.
כדי לקרוא קובץ שנשמר בעזרת (60!וזש], יש להשתמש ב-()1640/ ולהזין את הנתונים
לאותה תבנית מבנה. שמו של המבנה יכול להיות שונה מזה ששימש לכתיבת הקוב, וכך
גם שמות האלמנטים החברים במבנה, אולס סדר האלמנטים, הטיפוס והגודל של
האלמנטים חייבים להיות זהים.
ךחדבטת נתונים
מבחינה טכנית, ניתן להשתמש בכל פונקצית פלט קובץ לצורך שיגור נתוניס למדפסת: לפי
תו, שורה, שורה מפורמטת או מבנה. כל שעליך לעשות הוא לפתוח את הקובץ תוך שימוש
בשם "תזק" ובמצב ש.
עם ואת, אין זה מעשי להדפיס מבנה בעזרת הפקודה ()186זש1. ערכים מספריים יודפסו
כנתונים בינאריים, ויופיעו בהדפסה כסימנים ותוויס חסרי משמעות. במקוס זאת, יש
להדפיס נתונים במבנה בעזרת הפונקציה (0)תוזק!, כפי שמודגם בתוכנית 12.9. תוכנית זו
פותחת שני קבצים: קוב הכונן נפתח לצורך קריאה, וקובץ המדפסת נפתח לצורך כתיבה.
תוכנית 12.9: קריאת קובץ כונן והדפסתו
/*76801.0+*/
'ה.5+010" 06ט601ה1א
()ה81ח
/
(חזק* ,ם++ 0₪ךת
0 6%ט9+0
1
; [806]20ה 088%
0850710%100]40[; ח8ת0
08%6007,]12( ; 0088
;0% 108%+
02 3 פרק 12: שיגור פלט לכונן ולמדפסת
10% הטהפפת;
+7 1
; [806]25ה110+ 008%
;(" :7880 0+ 806ה1116 8ה+ %68הם")++ה1חם
; (11608068+)06%5
(011א == (("806,"0ה1116)ה1006 = 0+))31%
.
; (6ה8ה1110, "ה%5 118+ 8ה+ ה6ק0 %'ה1)'08+ה1חק
( ()15א9
1
(1שא == ((יא", "אהק")ה0ק0ס+ = חסם))+1
/
; ("ח%60+ה1תק 8ה+ הצבא בַהסחא 18 בַה1ה8008%")++הגחק
; (ק+)01056+
( ()+1א9
1
(10(==1 ,1 ,(51260%)0150 ,7680)80160+)118חא
ָ
; (86ח. 6150, "ח%5 8 00",פ+ק)%+ה1הק+
; (0+100ק0150.0680701,"ה%8 | :%5,"0650010%100ק)+צה1תק+
; (צ0150.08+6007, *"ח%5 :ץ%6000+08", + )++ה1פס+
; (0150.008%, '*ה+%6.2 :,ז)1ה1הק+
; (ה6סחטה. 6150, "ח%0 :ה008+10|",יזק)%+ה1הק+
; ("הח",ת%ק)%ז+ה1הק+
1
; (%6ק)01056+
; (ק+)01058+
1
כל אחד מהמבנים מוזן באמצעות הפונקציה ()81630, ואז מודפסיס חברי המבנה באמצעות
הוראות ()!!מ!זק]. הוראת ()11630 יכולה לקרוא מחרוזות שכוללות רווחיס, ולכן היא עדיפה
על ()]ת1808.
ההוראה
;"םת ת"ק ווק
מחדירה שתי שורות ריקות נוספות בין כל אחד מתקליטי הקומפקט-דיסק.
הדפסת נתונים 20
(1 יצוב החוכנית
השליטה בכתיבת קבצים ובקריאתם מאפשרת לך ליצור יישומים עסקיים ואישיים
מתותכמים. תוכניות ההדגמה בפרק זה שהזינו נתוניס מתוך קובץ, קראו את הקוב כולו.
לעומת זאת, לעתים יש לטפל בנתוניס בדרכיס אחרות.
לדוגמה, ייתכן שעליך לאתר רשומה מטוימת בקובץ. במקרה כזה, יש לפתוח את הקוב
במצב : ולעשות שימוש בלולאה כדי להזין את הנתונים, או כמבנה-אחר-מבנה, או
שורה-אחר-שורה, בהתאט לאופן בו נוצר הקובץ. בכל מעבר בלולאה אנו בוחניס את הערך
לעומת הנתוניס אותס אנו מחפשים. כדי לבחון ערכי מחרוזת, השתמש בפונקציה ()קנתסזו9,
אס היא כלולה בקומפיילר שברשותך. ברגע שמתגלית התאמה, הצג את הנתונים וסגור את
הקובץ.
פונקציות הקובץ שמתוארות כאן מבצעות פעולות סדרתיות, כלומר - הן קוראות את
הקוב מתחילתו, על-פי סידרו. ניתן להשתמש במצב ג כדי להוסיף נתוניס לקצהו של
הקובץ, אולס אינך יכול לגשת ישירות אל מיקוס מסוים בקובץ ולשנות את היתונים ,
המאוחסנים בו.
אין פירוש הדבר שאינך יכול לשנות את הנתוניס השמורים בקובץ, אולס לשם כך עליך
להשתמש באלגוריתס שמטפל בקוב> באופן סדרתי. נכיר את האלגוריתם הזה ואלגוריתמים
נוספים, בדוגמאות התכנות המפורטות בפרק הבא.
פונקציות גישה-אקראית
קומפיילרים של ++6 וכן קומפיילרים רבים של 6 ו51א4 כוללים
| פונקציות המשמשות לגישה אקראית לקבצים. גישה אקראית
פירושה שיש באפשרותך לגשת ישירות אל מיקום מסוים בקובץ
ולקרוא את הנתונים המאוחסנים שם, או לשנותם. הפונקציה
()1566%, לדוגמה, מביאה את המצביע אל מיקום מסוים בקובץ.
הפונקציה ()1680 הבאה אחריה נוטלת את הנתונים מאותו
מיקום. הפונקציה ()!ו₪ מדווחת על מיקומו הנוכחי של המצביע,
והפונקציה ()טחושפז מחזירה את המצביע אל תחילת הקובץ.
3 וו 2 ,+ תסלה
04 3 פרק 12: שיגור פלט לכונן ולמדפסת
לוה
41
2
3
4
.5
.6
7
8
9
0
מהו חוצץ קובצו
כיצד משתמשים במבנה קובצו
מדוע מכריזים על קוב כעל מצביען
הסבר את ההבדלים בין מצבי ז, ש ו-4.
מדוע יש לסגור קובץ לפני סיוס התוכניתו
כיצד יוצרים פלט של נתוניס מספריים!
כיצד מדפיסים נתוניס במדפסת!
מהו ההבדל בין הפונקציה ()!ותוזק] לפונקציה ((6וַןש!
כיצד מדפיסים מבנה!
מהי מטרתה של הפונקציה ()1812601
ךז גילים
4
2
3
6
כתוב תוכנית שמשתמשת בפונקציה (5ופ1 ליצירת קוב של שמות טרטים.
כתוב תוכנית שקוראת את שמות הסרטים (מתרגיל 1) לתוך מערך מחרוזת.
כתוב תוכנית שעושה שימוש בפונקציה (וחוזק1 ליצירת קובץ מלאי מוצרים
שמכיל את שמו, מחירו וכמותו של כל מוצר.
כתוב תוכנית שקוראת את קובץ מלאי המוצרים שיצרת בתרגיל 3.
כתוב את התוכניות מתרגילים 3 ו-8 כך שיקראו ויכתבו את הנתוניס כמבנה,
הסבר מה לקוי בתוכנית הבאה:
.51010" 6[066ח1
()תוגות
|
וכ
ז תס
(11טא==!"איים, 1 יסקס = כז10
|
שאלות
205
06 3 פרק 12: שיגור פלט לכונן ולמדפסת
;"116 186 ת6קס ]סתת28)")פוטק
1
00
((101101=26100810
;(ק1 110016010
|
;('ם'=!116)16110ת א
101030000(
רת כ הק+!/ת
₪ מ
ן ] + תה, לאחר שהכרת את המרכיבים הבסיסיים של 6 ושל ++6, באפשרותך
- ₪ לכתוב תוכניות. הטכניקות שלמדת בספר זה משמשות אבני הבניין. כדי
לפתח תוכנית, יש ליישם את הטכניקות האלה על-פי הסדר הנכון, ולבנות את
התוכנית כסדרה של הוראות, גושים של הוראות, ופונקציות.
בפרק אחרון זה נעסוק בפיתותו של יישום שלם. תגלה שהמוצר הסופי כולל את
הפונקציות והפקודות שכבר למדת.
207
חישו
בפרקים הקודמים עבדנו עס מבנה ועם קובץ כדי לקטלג אוסף של תקליטי
קומפקט-דיסק. למדת כיצד ליצור קוב וכיצד לקרוא קובץ שמכיל נתונים על אוסף
התקליטים. עם זאת, תוכניות ההדגמה בפרקים אלה כוללות רק את רכיביו החיונייס של
היישוס. לא היתה אפשרות למחוק תקליט מהאוסף, או לבצע חיפוש באוסף אחר הנתונים
של תקליט מסויס.
התוכניות שניצור בפרק זה משלימות את היישוס, ומאפשרות לו לבצע את שבע המטלות
הבאות:
>= להוסיף תקליט קומפקט-דיסק לאוסף.
* למחוק תקליט מהאוסף.
> לשנות את שמו של התקליט או פרטים אחרים.
*= לשנות את מספר התרי בו מאותחסן התקליט על-גבי המדף.
= לאתר נתוניס של תקליט מסוים.
* למיין את סדר התקליטים בקובץ כדי שיתאיס לסדר בו הס מאוחסנים על-גבי
המדף.
* להדפיס רשימה של התקליטים הכלולים באוסף.
נבנה את היישוס כסדרה של פונקציות. אולם לפני קריאת כל אחד מהסעיפים בפרק,
התבונן בכותרת הסעיף ורשום לעצמך את ההוראות שתזדקק להן לצורך פיתוח היישוס.
לדוגמה, התחל בכך שתרשום לעצמך את ההכרוות הכלליות להן תזדקק - קבועים,
מצביעים או מבנים. לאחר מכן, קרא את הסעיף כדי לראות כיצד הוא מפתח את התוכנית.
זכור, ישנן דרכיס רבות לכתוב את התוכנית. ההוראות שלך עשויות להיות שונות מההוראות
שנתנו בספר, אך אין להסיק מכך שהשיטה בה נקטת היא שגויה.
בתקליטון המצורף לספר תמצא רישום של היישוס המלא. אם התקנת את קובצי ההדגמה
בעת שהתקנת את קומפיילר ה-266, התוכנית תימצא במחיצה 1/25ק4/1 185705,
תחת השם 62822.0. (למידע נוסף על התקנת קומפיילר מ-200 וגישה לתוכניות
ההדגמה - עיין בנספח). עליך להדפיס את רישום התוכנית לפני שתפנה ללימוד הפרק. כך
תוכל לעיין בתוכנית אחרי קריאת כל סעיף ולראות כיצד האלגוריתמים מיושמים.
08 3 פרק 13: קשירת כל הקצוות
רשומות ומבנים
בפרק זה תיתקל במונח "רשומה'' פעמים רבות. "רשומה" היא |
מונח המשמש בניהול מסדי נתונים, ותוכנית זו היא למעשה |
יישום בסיסי של ניהול מסדי גתונים. מסד נתונים הוא אוסף של
מידע אודות קבוצה של פריטים. במקרה שלנו, הקבוצה היא
אוסף תקליטי הקומפקט-דיסק, אולם מסד נתונים יכול לשמש
לצורך מעקב אחר לקוחות עסקיים, לניהול מלאי של חברה, א[ |
לצורך תיעוד אוספים מכל הסוגים. |
דמיין לעצמך את מסד הנתונים כגרסה אלקטרונית של כרטסת. |
נתונים. כל כרטיס נקרא רשומה. ומכיל את כל הנתונים על פריט |
מסוים. לפיכך, כל רשומה בתוכנית שעוסקת בתקליטי קומפקט-דיסק
כוללת את המידע אודות תקליט מסוים.
| כאשר תוכנית עושה שימוש במבנה, כל רשומה היא מקרה אחד
של המבנה. בכל פעם שהתוכנית קוראת מבנה מהכונן, היא
קוראת רשומה אחת. באופן דומה, בכל פעם שהתוכנית כותבת | |
מבנה לדיסק, היא כותבת רשומה אחת. |
1-0
זנרזות כלליות
המטלה הראשונה היא להכריז על המשתנים הכלליים הנחוצים. מכיוון שנשתמש בקבצים,
יש לכלול את קובץ הכותרת 8/610.8:
".51010" 01066ח1
כפי שתראה בהמשך, נשתמש בשלושה קבצים: קובץ הדפסה ושני קובצי כונן. קוב כונן
אחד מכיל את הנתונים אודות אוסף התקליטים, ואילו הקוב השני משמש כמקוס אחסון
זמני. אנו מגדיריס את שמות הקבצים כקבועים, כדי שנוכל לאזכר אותס על ידי שימוש
בשמות קבועים:
"ווכ6י טוא אם,1י 4066
"קות6 1 ₪ 11ןק )אד 6ם4061
תוכל להשתמש בכל שם שתרצה עבור קובצי הכונן שלך, ושמות הקבצים יכולים לכלול גס
את הנתיב המלא, כך:
"ד ק6\ ד ס:6" םוא אם,זי 90606
בנוסף, היישוס שלנו מנית שעל-גבי המדף יש מקוס אחסון ל-20 תקליטים, ולכן נגדיר
קבוע שישמש למניעת הזנה של מספרים גדולים מ-20:
06116 14 0
הכרזות כלליות סְ 0 3
כמובן שבאפשרותך להגדיל את המספר בהתאם לצרכיך.
כל שלושת הקבצים מוגדרים בביטוי אחד:
זסותוזק* (קו* ק** מז
כעת, יש לפנות להכרזת המבנה 62, תוך שימוש בהגדרה שהודגמה בפרק 11:
2 5
|
;[6]20ומהת 018
0 זג
2 0
]0
תת תו
6[
לבסוף, תזדקק למנגנון כלשהו שימנע מהמשתמש להקצות יותר מתקליט אחד לכל עמדת
אחסון במדף. בתוכנית זו נשתמש במערך של מספרים שלמים כדי להקצות את מספרי
העמדות, ובמשתנה מטיפוס מספר שלם כדי לציין את המספר הכללי של תקליטי
קומפקט-דיסק באוסף:
]50% ותו
)תטסס ]הו
ךפנונקציה 0חוהוחז
כל אחת מהמטלות העיקריות של התוכנית תבוצע בפונקציה משלה. בפונקציה ()תוגות אנו
זקוקים לדרך כלשהי לבתירת המטלה שתבוצע, ולקריאה לפונקציה המתאימה. הדרך
היעילה ביותר לבחירת המטלה היא להציג תפריט של המטלות. כך, ()תוגג צריכה לבצע
את הפעולות הבאות:
+ לחזור ולהציג את התפריט, עד שהמשתמש יבחר להפסיק את התוכנית.
>= להציג את רשימת המטלות.
* לקבל את ההקשה במקלדת לבחירת מטלה.
* לקרוא לפונקציה לביצוע המטלה.
> לעצור את התוכנית כשהמשתמש בוחר באפשרות זו.
כדי לייצג את הבחירה בתפריט, אנו זקוקים למשתנה שיהיה מקומי ל-()מו14. כאשר
המשתמש בוחר בפריט כלשהו מהתפריט (על ידי הקשת מספר), ()תוגגת תקרא את הערך
0 1 3 פרק 13: קשירת כל הקצוות
הזה לתוך משתנה ותשתמש בו כדי לקבוע לאיזו פונקציה עליה לקרוא. לפיכך, אנו
מתחילים את הפונקציה ()ת41וז בהכרזה הבאה:
זו
עתה, קודס להצגת התפריט, עלינו לדעת אילו עמדות במדף התקליטים כבר הוקצו. נעשה
זאת על ידי קריאה לפונקציה ()618105אָ. הפונקציה פותחת את הקובץ, קוראת את כל
הרשומות, מקצה כל אחד מהערכים של זטלותטת.180 לרכיב במערך []51018, ומונה את
המספר הכולל של רשומות בקובץ:
610090
|
;66% ות
(0=א1066
000
(011א =! ((יזי/םא ה אם.11)תס תס = 10
|
(1==(ק] ,1 ,(512601)0150 ,16)]1680)6:6186גתע
[
זל ותנות.6150= [א31015]1806
(++א1066
[++)תט00
)
101036000
]
]
נשאלת כעת השאלה מדוע יש לחזור ולהציג את התפריט! אם לא נחזור על התפריט בתוך
לולאה, התוכנית תסתיים אחרי ביצוע פעולה אחת. אס המשתמש רוצה לבצע שתי פעולות,
כמו להוסיף תקליטים חדשים ולהדפיס רשימה מעודכנת, יהיה עליו להתתיל את התוכנית
פעמיים. מכיוון שאיננו יודעיס מראש כמה פעמים יש לתזור על התפריט, אנו משתמשים
בלולאה 60.
התפריט יכלול שמונה אפשרויות - אחת לכל אחת מהמטלות העיקריות של התוכנית,
ואפשרות שמינית לסיום התוכנית. השתמש בהוראות ()פוק או ()!ותוזץ כדי להציג את
התפריט, ואז בפונקציה ()זגת8616 כדי להזין את תגובת המשתמש. השימוש ב-()ז861608
הפונקציה ()ת81וז 1 1 3 |
מונע את הצורך להקיש זפות אחרי בחירת האפשרות הרצויה. אם נשתמש במספרים
לצורך הקלט, במקוס באותיות, נהיה פטוריס מהצורך לטפל באותיות קטנות וגדולות.
לפיכך, נוכל להתחיל את ()מנגות כך:
()מוגות
|
זג
0
|
;("םח8ז02ז? 0116011055 6 עו )ווק
;("ח6 464 1")טנת
;("ם 61666 | <")פוטק
;("ח 0 תו 611 3)פוטק
(("תת1008110 86ת3 6 | 4")פוטק
;("ם629 801 5')פוטק
(("ח ) 1.00816 | 6")פוטק
("ם1.151 זמוז? | 7")פוטק
;("תתגזקסז? זוא 8")פוטק
;(" :5616001008 6101 216856")])תוזק
561601 = 26/01810(
;('') סוט
מרגע שהמשתמש בוחר בפריט תפריט כלשהו, ()ם1גות חייבת לקרוא לפונקציה המתאימה.
עבור שמונה אפשרויות תפריט אנו זקוקיס לשבעה ביטויי ]ג. כדי להשיג שליטה רבה יותר,
כמו גם תוכנית קלה יותר לקריאה, השתמש בפקודת הסז1שו5 שבוחנת את הערך של משתנה
הקלט. אל תשכח לכלול קטע של ברירת מחדל, למקרה שהמשתמש מקליד מספר או תו
שאינם מופיעים בתפריט. נשלים את ()ת41ות כך:
0886
200
8%
056%:
1
2 1 3 פרק 13: קשירת כל הקצוות
(561601)ם5/1)0
[
68%תס
0850
0
68%
0856
0
0%
5% 0856
0
בהוין
0886
1003160
6%
080%
0
8%
0856
(6%תט
וי
;("חתת81ק3 17 ,זות6 4110מ1")פוטק
;(/1116)56160!='8 ו
(00זו16
]
לולאת ה-1!6תש...60 חוזרת על התפריט (כלומר, ביטוי ה-8₪1661) כל עוד המשתמש לא
מקיש 8 לסיום התוכנית. אחרי בחירה באחת מאפשרויות התפריט והשלמת ביצוע המטלה,
התפריט שב ומופיע על-גבי המסך, כדי שניתן יהיה לבחור אפשרות נוספת.
הפונקציה ()ת81וז 13 3
וסנת רוומה: הנונקציה 800000
הפונקציה המשמשת להוספת נתונים אודות תקליט בנויה במתכונת דומה לתוכנית להוספת
נתוניס שראינו בפרק 12.
עם זאת, ישנס שלושה הבדלים בין הפונקציה ()86600 המשמשת ביישום הזה, לבין
התוכנית המופיעה בפרק 12. ביישוס הזה, המשתמש אינו יכול להוסיף תקליט חדש לאוסף
אם אין עמדת אחסון פנויה על-גבי המדף. הפונקציה ()86/81068 מחשבת את מספר
התקליטים שכבר אוחסנו. כאשר מגיעיס למטפר המירבי, מופיעה הודעה על-גבי המסך,
והתוכנית חוזרת לתפריט:
6 ו
(42%]א=<|תוס1/)6
;("ם[101 15 040161 זטס ץצ .ץחספ')פוטק
(()90=261081טאק
(תזט!6ז
ו
כמו כן, ביישוס זה הקובץ נפתח במצב ג, כדי שייווצר - במידה שהוא עדיין אינו קיים.
(011א == ((יפי א א )תסקס = 105
|
(₪א אם.11,'ח5א 1116 6 מסקס 1'ת8?)")]!ותוזק
0
אם הקוב כבר קייסם, נתוניס חדשים יתווספו אל קצהו.
פונקציה זו דורשת גס קלט של מספר עמדה, בין 1 ל-20. מכיוון שקלט זה דרוש לכמה
ממטלות התוכנית, אנו יכולים לבצעו בפונקציה נפרדת, שנקראת (8618100, ולקרוא לה
בשעת הצורך:
6151000(
|
6 ,182 (663ת1 זת1
00
0
4 1 3 פרק 13: קשירת כל הקצוות
;("-ז6סותטת 5101 16] ז16םם")))מוזק
;(060נות.8:0150 ,'%6"))ת508
(++א66ת1;1תנו0ס> א66ם66%=0;1מ101)1
|
(061 וחנות.0150== [א06ם11)81018]1
|
;("חם3281 717 .500ט 15 5101 1081 עזזספ")!ותוזק
1
]
((2==1]] || א ]1<זססותנות.6150 || 1 > זסטתנות.116)6150ת ער
[++1 000
6לוטם.0150= [1ת 51015600
1
]
הפונקציה ()8615101 מונעת מהמשתמש להקליד מספר עמדה שכבר הוקצתה.
אחרי שהתקליט החדש נכתב לקובץ, נקראת הפונקציה ((618100 כדי לעדכן את מערך
העמדות.
1 חיקת רעוומה: הבונקציה 061000
הפונקציה המשמשת למחיקת נתונים אודות תקליט קומפקט-דיסק באוסף, עושה שימוש
באלגוריתס תקני לעבודה עס קבצים סדרתיים. בגישה סדרתית, אין אפשרות לגשת ישירות
למיקוס כלשהו בקובץ כדי לשנות רשומה. כאשר פותחים קוב במצב אי, תוכנו נמחק. אס
נפתח את הקוב במצב ג, נוכל רק להוסיף נתונים לקצה.
הפתרון הוא להשתמש בשני קבצים. הפונקציה ()06100 פותחת את קובץ הנתונים במצב זו
ופותחת גם קובץ זמני נוסף במצב ש.
((11 == (("ז',6ותהת1!6))ת6קס) = ]1
|
;(סוחהת116],'ת%8 1116 16 תסקס ]'תג>)"))תוזק
0
מחיקת רשומה: הפונקציה ()06100 5 1 3
|
01 == (("או'116קומ6!)מ6קס] = 1002
|
(116קות0),"ח%5 6 5 תסקס ['תג1)")0ומוזק
(161056000
0
לאחר מכן אנו מאניס את שמו של התקליט שברצוננו למחוק:
;(" :2 186 01 סותגת 106 זסות6 1)'216856)מוזק
(10ת8ת615)061
לולאת 6או קוראת כל מבנה (רשומה) בקובץ המקורי:
(1==(ק] ,1 ,(51260/)0180 ,16)11680)6/6150ות עו
|
אם אין זו הרשומה שברצונך למחוק, ()66100 כותבת אותה לקובץ הזמני:
(0 =! (6ותגת[06 ,6ה81ם.0190)קומסזופ)/1
;(ק1 ,1 ,(512601)0150 ,1/1)6)80150
ישוס זה עושה שימוש בפונקציה ()קותסש8 במספר מקומות, כדי לקבוע אם נקראה
הרשומה הנכונה מהקוב). הפונקציה ()ק0ת5:0 אינה כלולה אומנם ב-6 88א, אולם ניתן
למצוא אותה בכל הספריות של 6 41881 ושל ++6,
כאשר נמצאת הרשומה הנכונה, ()66106 אינה כותבת אותה לקובץ הזמני ובמקוס זאת
מציבה דגלון, כדי לדוותח בהמשך אם נמחק מבנה:
56
'ץ'=פגה]
|
אנו מבצעים את התהליך הזה בלולאת 6!ושי כדי להמשיך ולקרוא מקובץ אחד ולכתוב
לקוב אחר, עד לסופו של הקובץ. בנקודה זו אנו סוגריס את שני הקבציס:
(ק1010560
(101056)0
אם ()6104 לא מצאה את הרשומה שרצית למחוק, היא מציגה הודעה על-גבי המסך,
ומסתיימת:
;("62 16 6תו] וסת 6ות")פווק
וק
6 1 3 פרק 13: קשירת כל הקצוות
כעת יש ברשותך שני קבצים שמכילים אותם נתונים. החיסרון היחיד ברוטינה הזו הוא
שחייב להיות די מקוס בכונן לאחסון שני קובצי נתוניס מלאים. ניתן לראות בקובץ הזמני
מעין קוב גיבוי. אס דבר-מה משתבש בקובץ המקורי, הקובץ הזמני יכיל את הנתונים,
מעודכניס עד הפעולה הסדרתית האחרונה. אם אינך מעוניין לשמור את הקובץ הזמני
על-גבי הכונן, תוכל לפתוח אותו במצב כתיבה ולסגור אותו מייד, כך:
;("או",1116קות6!)מ6קס! = קז
(קו)161050
פעולה זו מותירה את הקובץ בכונן, אך כשהוא ריק לחלוטין, ולפיכך - תופס מעט מאד
מקום.
אס אכן מתקת רשומה, יש ברשותך עתה שני קבצים שונים. הקובץ המקורי מכיל את כל
הנתונים, כולל הרשומה שהיה ברצונך למחוק. מכיוון שהפונקציה (691000 לא כתבה את
המבנה שרצינו למחוק, הקובץ הזמני כולל רק את הנתונים שהתכוונו לשמור. אולס אי
אפשר להשאיר את הנתוניס במצב כזה. התוכנית ערוכה להוספת נתונים ולביצוע פעולות
נוספות תוך שימוש בקובץ המקורי. לפיכך, יש להחזיר את הנתונים המעודכנים לקוב
הנתונים.
קומפיילרים מסוימיס של ++6 כולליס פונקציה מובנית לשיעוי שמו של קובץ, אך לא
כולם. כדי לנקוט בגישה כללית, ניתן לפתוח מחדש את שני הקבצים במצבים הפוכים.
כלומר, אנו פותחים את הקובץ המקורי במצב ש, מוחקים את הנתונים המאוחסנים בו,
ופותחים את הקוב הזמני במצב ז. הפונקציה ()זשותסקס, שנקראת על ידי 061060
ופונקציות אחרות, מבצעת את הפעולה הזו:
(01 א == (("ו'/6תהסט1)מ6קס! = )10
|
;(סתת3ח816,"תפ% 1116 6 מסקס +'ת08 )!והוז
0
)
(1 0 == ((יז16 קת )מקס) = 10
|
;(110)קות6),"ה%5 16 6 תסקס 1'מ03"))ותוזק
;(1610560)0
0
]
לאחר מכן, הפונקציה ()06106 קוראת את הרשומות מהקובץ הזמני וכותבת אותן לקובצ
המקורי. כשהפונקציה טוגרת את הקבצים, הקוב המקורי מכיל את הנתונים המעודכנים,
ללא הרשומות שנמחקו:
מחיקת רשומה: הפונקציה ()06100 7 1 3
₪
(1==(כן ,1 ,(512601)0150 ,116))1680)6:0180ו1/
;(0 ,2 (116)6:0150,812001)00150ש1
101056000(
(קו1010960
לפני שהפונקציה ()66106 מסתיימת, התוכנית קוראת לפונקציה ()6181018, כדי לעדכן את
מערך העמדות המוקצות.
היישום ממשיך לחפש רשומה מתאימה גם אחרי מחיקת רשומה. כך ניתן למחוק בעת
ובעונה אחת מספר רשומות בעלות שם משותף - אס החלטת למחוק מהאוסף את כל
תקליטי הדיסקו, לדוגמה.
ניתן להרחיב את הרוטינה על ידי הצגת הרשומה והנחיה למשתמש לאשר את המחיקה. אס
המשתמש מחליט שאין ברצונו למחוק את הרשומה, הרוטינה המורחבת תכתוב אותה
לקוב.
וע ִז]קתת3 ----ס יי
פונקציות שימושיות
חלק מההרוטינות שמוסברות כאן מבוצעות על ידי כמה
מהפונקציות העיקריות בתוכנית. במקום לחזור ולכתוב אותן
מחדש בכל פעם, ניתן להציב את הרוטינות בפונקציות נפרדות
שייקראו בשעת הצורך. אלו הן הפונקציות הבאות:
* ()זשחסקס: פותחת את קובץ הנתונים לקריאה ואת הקובץ
הזמני לכתיבה.
* ()אזהסטס: פותחת את קובץ הנתונים לכתיבה ואת הקובץ
הזמני לקריאה.
* ()0חוסה: מציגה הודעה כאשר הרשומה המבוקשת אינה
קיימת. ,
5 ₪ ₪ ה ₪ גר ₪ רכוש ל ₪ מ 08 ₪ 18 ₪ שר ₪ ור 8278 87718 ₪88
יי נחוני תקליט: הבונקציה 00600
כדי לשנות את הנתונים של אחד התקליטים באוסף, אנו זקוקים לאלגוריתס הבסיסי
ששימש אותנו למחיקת נתונים: יש לכתוב את כל הנתונים לקובץ זמני, ואז לקרוא את
הנתוניס שלא שונו בתחזרה אל קובץ הנתוניס. עס זאת, במקוס לדלג על הרשומה שברצונך
לשנות, יש להזין את הנתוניס החדשים עבור רשומה זו, ואז לכתוב אותה לקובץ הזמני.
הפונקציה ()0100 מבקשת תחילה מהמשתמש את שמו של התקליט שברצונו לשנות, ואז
מתחילה לולאת 16א לקרוא כל אחד מהמבנים:
8 1 3 פרק 13: קשירת כל הקצוות
( סקס
("חת10וסחט 12150 6קת8ח0")פוטק
(" :62 16 ]0 6וזגח 6 16856")] )תוזת
(6 000
2==(ק] ,1 ,(812601)6150 ,116)01630)8:0180ת א
|
לאחר מכן, אס אין זה המבנה שברצונך לשנות, הפונקציה כותבת אותו לקוב הזמני:
(6!=0 ,רב .0150 )קת סז11)5
(0 2 ,(51260/)0150 ,6)8.0186)ת1
כשמאותרת הרשומה הרלוונטית, הפונקציה ()0800 מציגה את הנתונים הנוכחיים, ומבקשת
מהמשתמש קלט של הנתונים החדשים:
56
|
1321
("ה 813 016")וטק
0500
("ת813 עוסא')פונוק
(" :6 106 ]0 6מזגח 6 ז0זת6 216856")])תוזק
(8816ה.2049)0150
((":ח10ק665011 16 זטומם"))תוזק
((0108ק01800150.00501
"0 6 ")תוזת
((2015)0150.08100017
((":6051 106 זסזח0")])תנזק
(80150.0080 ,")50
(4%](=%14קססן) 10
|
(++110002ת101)10002=0;10072>600
לולאת ה-ז0] החיצונית מגדילה את 1001 מ-1 ועד המספר המירבי של תקליטים. בחזרה
הראשונה על הלולאה החיצונית, טורקת הלולאה הפנימית את המערך כולו כדי לאתר
תקליטים בעמדה 1. כל תקליט שהיא מוצאת שמספר העמדה שלו הוא 1 נכתב לקובף:
מיון רשומות: הפונקציה ())501 5 / 3
(1001==זסט תות [2 100 ק 11016
ן
0 ,1 ([2ק00!]קות52601))0 ,[10002] ק1ת6)616)ות או
(++01000ת6
]
בחזרה הבאה על הלולאה החיצונית סורקת שוב הלולאה הפנימית את המערך כולו, אך
הפעם כדי לאתר תקליט בעמדה 2, וכותבת אותו לקובץ. התהליך חוזר על עצמו עבור כל
מספרי העמדות האפשריים.
עס זאת, מרגע שכתבנו את כל התקליטים בתזרה לקובץ, אין עוד צורך להמשיך ולחפש
מספרי עמדות. אנו משתמשיס במשתנה 61005ת6 כדי לעקוב אחר מספר המבנים שנכתבו
לקובץ. אחרי כתיבת כל אחד מהמבנים, ()8011 מגדילה את ערכו של קסס[6ת6. כאשר
קס0ס| 6 שווה למספר תקליטי הקומפקט-דיסק שבאוסף, פירוש הדבר שכל המבנים
נכתבו וניתן להפסיק את התזרות:
(1ם01000==600ת1106
8%
הקוב נסגר והפונקציה ())501 מסתיימת.
עיין שוב בקוד המלא של התוכנית. נסה להוסיף בעצמך שיפורים שהיית רוצה לראות
בתוכנית.
6 2 3 פרק 13: קשירת כל הקצוות
שש
ה6'וו/6. אתק6/] ההצגווה
הפ
ה שלב זה אתה ודאי משתוקק כבר להתחיל לכתוב תוכניות 6. התקליטון
- ו המצורף לספר מכיל את כל הדרוש לך לשם כך - עורך מלל לכתיבת
תוכניות, קומפיילר וקשר, וכן תוכניות הדגמה שיסייעו לך לצאת לדרך. התקליטון
מכיל גס את הפתרונות לתרגילים שמופיעים בסופו של כל אחד מפרקי הספר.
207
1 הקנה המהדר (קומציילר)
כדי להתקין את התוכניות ושאר הקבצים על הכונן הקשיח במחשב שברשותך, בצע את
השלבים הבאים:
1. הכנס את התקליטון לכונן התקליטונים.
2. התחבר לכונן על ידי הקשת :4 או :8 (בהתאם לכונן בו אתה משתמש) והקש
ות
3. הקלד ,61514141 והקש זטוחם. יש צורך ב-750% פנויים בכונן הקשיח, לכל
הפחות. אם אין די מקוס פנוי בכונן הקשיח, ,61511.1 תציג אזהרה
ותסתיים. מחק קבצים מיותרים והפעל את ,411 6151 פעס נוספת.
על המסך :ופיע סימן הנחיה שמציין את מחיצת ברירת המחדל בה יותקנו התוכניות -
וי
4. הקש זטות כדי לאשר את מחיצת ברירת המחדל, או הקלד נתיב חדש והקש
זסותם לאחר מכן.
5. הקומפיילר, הקשר ועורך המלל יותקנו בכונן הקשיח; תוכנית ההתקנה תשאל
אס ברצונך להתקין גם את התוכניות.
6. אם ברצונך להתקין את תוכניות ההדגמה, בחר 68.
7. תופיע הודעה שמדווחת כי כל התוכניות הותקנו בהצלחה. לאחר מכן תוכנית
ההתקנה שואלת אם ברצונך ש-,51411א61 תבדוק את הקוב
8 . הקומפיילר והקשר זקוקים ל-25 קבצים ול-25 חוצצים, לכל
הפחות, ב-10.8/5א00. אס תבחר 65+, ,51411א61 תבדוק את קובץ
התצורה 8צ000810.5, ותגדיל אותו בהתאם לצורך. אם ,41.1 51א61 משנה
את הקובץ 710.5+5א60, העותק המקורי של הקובץ נשמר תחת השס
למקרה שדבר-מה ישתבש.
8. תוכנית ההתקנה תציג לך שאלה אם ברצונך לאתחל מחדש את המחשב.
האתחול יישם את השעויים שהוכנסו ב-5צ710.8א00, כך שניתן יהיה
להתחיל לכתוב תוכניות ולקמפל אותן. בחר 68 (או בחר סא, אס החלטת
לנטוש את ההתקנה, מסיבה כלשהי.
9. הקש זטותת כדי לסייס את ההתקנה.
אם החלטת שלא להתקין עתה את תוכניות ההדגמה, תוכל להתקין אותן באופן ידני, בשלב
מאוחר יותר. העתק את הקובף ₪א521,05.2 מהתקליטון אל הכונן הקשיח, היכנס
למחיצה אליה העתקת את התוכנית, הקלד 54121.5 והקש זשותג.
8 2 3 פרק נספח: השימוש בתקליטון ההדגמה
במקרה שתוכנית ההתקנה ,615111 לא התקיה את התוכנה כיאות, ניתן להתקינה
ידנית. העתק את הקבציס הבאיס אל הכונן הקשית:
ב
מאם ספת
מא 5
היכנט לכונן אליו העתקת את התוכניות והרץ כל אחת מהן.
שיש בעודך התוכניות דוס
ניתן להשתמש בכל עורך מלל או מעבד תמליליס לכתיבת קוד המקור של התוכניות. עם
+את, אם אתה משתמש במעבד תמלילים, יש לשמור את הקוב בפורמט ]4561. קובצ
1 אינו מכיל את הקודיס והפקודות לקביעת התצורה, שמשמשים את מעבדי
התמלילים בעת שמירת מטמכים. הקומפיילר ינסה לקמפל את הקודים האלה והדבר עלול
לגרוס להצגת סדרה ארוכה של הודעות שגיאה ואזהרות.
התקליטון המצורף לספר מכיל תוכנית שנקראת 6211.00(1. זהו עורך מלל פשוט
שיכול לסייע לך לכתוב ולערוך תוכניות שאורכן אינו עולה על 1000 שורות.
כדי להפעיל את 68011, היכנס למחיצה בה התקנת את הקומפיילר, הקלד 6811 והקש
ות
0 אינו כולל תכונות לקביעת התצורה של המלל, ואעו עובר באופן אוטומטי לשורה
חדשה כשמגיעים לטופה של השורה הנוכחית. עליך להקיש זפותם כדי לעבור לשורת
חדשה. אך עם זאת, 6017 כולל את כל התכונות להן אתה זקוק כדי לכתוב תוכנות.
בחלקו העליון של מסך ה-65011 מופיעה שורת מצב, שמציינת את מיקומו של הסמן
מבחינת השורה והתו, את שמו של הקוב שאתה עורך, וכן אס אתה במצב החדרה (185)
או במצב שכתוב (זטס). במצב שכתוב, תווים חדשים יתפסו את מקומם של תתוויס
הנוכחיים בשורה. במצב החדרה, תווים חדשים דוחקים את התוויס הקיימים.
אורכה המירבי של שורה הוא 78 תווים. כשתתקרב לסופה של השורה, יישמע צפצוף
אזהרה, וצפצוף נוסף יישמע כשהשורה התמלאה ואינה יכולה להכיל תווים נוספים. אם
אתה מחדיר מלל לשורה קיימת, במצב החדרה, 62211 עובר אוטומטית למצב שכתוב
כשהשורה מתמלאת, כדי למנוע מהמשתמש להקיש יותר מ-78 תווים בשורה,
לא ניתן אומנס לבחור קטעי מלל ולהעתיקס ב-02011, אך תוכל לעשות שימוש במקשים
הבאים:
| מוחק תוויסם משמאל לסמן.
כו מוחק תווים מימין לסמן.
השימוש בעורך התוכניות 60017 0 2 3
סק מעלה את הסמן 20 שורות.
תספץ מוריד את הסמן 20 שורות.
6תסז1 מביא את הסמן לתחילת השורה.
20| מביא את הסמן לקצה השורה.
5 מעביר ממצב החדרה למצב שכתוב, ולהיפך.
= מחדיר שורה ריקה.
2 מוחק שורה שלמה.
3 מציג מידע סיוע.
7 מציג אפשרויות לשמירת תוכנית, ניקוי המסך
ויציאה מ-6017.
220 מטעין תוכנית.
השתמש במקשי החצים כדי להניע את הסמן על-פני המסמך. לחיצה על מקש הח
המופנה למטה כאשר הסמן נמצא בסוף המסמך - מוסיפה שורות ריקות, בדיוק כמו
הקשת זסותם.
שמירת חוכנית
לשמירת מסמך, הקש 7/. מופיעה שאלה אס ברצונך לשמור את התוכנית. הקש +. אם יש
כבר לקובץ שם, הוא יישמר באופן אוטומטי תחת אותו שס. אם זוהי תוכנית חדשה,
תתבקש להעניק שם לקובץ. הקלד שס לתוכנית כולל הסיומת 6., והקש זסותם. לא ניתן
לשמור תוכנית בשם זהה לשמה של תוכנית שכבר שמורה בכונן.
עורך המלל יציג על-גבי המסך את השאלה אם ברצונך לצאת מ-68211. הקש א כדי
להישאר בעורך ולהתתיל, או להטעין, תוכנית חדשה. הקש + אם ברצונך לנטוש את
זז
ניקוי הלסך
אס ברצונך לנטוש תוכנית תוך כדי עריכתה ולנקות את המסך, הקש 27 א אא.
יציאה מ- ד01ם6
כדי לצאת מ-08211, הקש 7/. הקש צ אס ברצונך לשמור את התוכנית שעל המסך, או
א אם ברצונך לנטוש את התוכנית. לאחר מכן הקש צ כדי לשוב לסימן ההנחיה של 205.
0 3 3 פרק נספח: השימוש בתקליטון ההדגמה
הטענח חוכנית
כדי להטעין תוכנית ל-62211 - הקש 10/, הקלד את שס התוכנית כולל הסיומת, והקש
זו
ניתן להטעין קובץ רק כאשר המסך ריק. לא ניתן להטעין קובץ אס מופיע מלל כלשהו על
המסך, או אס הקלדת מלל כלשהו מאז הפעם האחרונה שניקית את המסך, אפילו אם
מחקת אותו. כדי לנקות את המסך ולאפשר הטענת קובף, הקש 7 א א.
רבסה מלל התוכניות
לא ניתן להדפיס את קוד התוכנית מתוך 62011. עם זאת, בין התוכניות שהתקנת בכונן
הקשיח כלולה גם תוכנית ששמה 1.8%8א621, שהותקנה במחיצה בה הותקנו העורך
והקומפיילר. כדי להדפיס את קוד התוכנית, עליך להתחבר למחיצה ולהקליד את מלת
ההפעלה 6211 ולאחריה את שם התוכנית, כך:
)ותוזקס
א תדפיס את התוכנית ותציב את שס הקוב לפני הקוד.
ניתן להשתמש ב-0221[1 לצורך הדפסת הקוד המלא של התוכנית 02427.0 שבפרק 13.
וש בקומניילר 60ק
קומפיילר 206 שמצורף לספר איגו גרטה חתומה שמשמשת להדגמה, אלא קומפיילר מלא
על כל התכונות הדרושות. הוא מכיל ספריית פונקציות נרחבת שכוללת פונקציות לטיפול
במחרוזות ופונקציות לגישה-אקראית לקבציס.
בעזרת 266 תוכל ללמוד את שפת 6 וגס לכתוב יישומים מלאים. 266 כולל גס מאגד
(אסמבלר), אם ברצונך ללמוד תכנות בשפת ץ01ות4556!
זכויות היוצרים לקומפיילר ולתוכניות הגלוות שייכות לחברת 48 / 6, אולס הס מופצים
כישותפה". פירוש הדבר שאתה רשאי לנסות את התוכנית למשך 30 יום, כדי לראות אם
היא מתאימה לצרכיך. בסופה של תקופת הבדיקה עליך לרשוס את עותק ה-200
שברשותך, או לחדול מלהשתמש בו.
רישוס הקומפיילר, שכרוך בתשלום סך של 530, מעניק לך רשות להשתמש בתוכנית בכל
מחשב שברשותך, כל עוד השימוש נעשה במחשב אחד בלבד בעת ובעונה אחת. אתה רשאי
גס להעתיק את התוכנית ולמוסרה למשתמשים אחרים לצורך בדיקה. כמשתמש רשום,
אתה זכאי לקבל עדכונים כשיוצאות לשוק גרסאות חדשות, בקשר ישיר עם חברת
8 60 בסוף הנספח תמצא טופט שניתן לצלמו ושמשמש לרישוס עותק ה-266
שברשותך.
הדפסת מלל התוכניות 1 3 3
מוסדות חינוכייס שמעונייניס להשתמש ב-06 בקורסים ללימוד שפת 6, כמו גס מוסדות
פרטיים או מסחריים, מתבקשים לפנות לחברת 488 / , או לעיין בקובץ 60.206ק.
התקנת 06ק
עס הרצת תוכנית ההתקנה ,5141א01, כפי שתיארנו בתחילת הנספח, מותקנים
הקומפיילר ותוכניות העזר בכונן הקשיח.
אס חסר לך מקוס אחסון בכונן הקשיח, תוכל למחוק חלק מהקבציס שהותקנו עס 06.
עס זאת, כדי להריץ את תוכניות ההדגמה הכלולות בספר, תזדקק לקבציס הבאים:
ו מחזור הביצוע הראשון של קומפיילר 6.
4 מחזור הביצוע השני של קומפיילר 6.
כ המאגד ומחזור הביצוע השלישי של קומפיילר 6.
00 קשר קוב העצמים.
08 ספריית הפונקציות התקניות של שפת 60.
| קובץ כותרת עבור חבילת הקלט/פלט התקנית.
עיין בקובץ 200.200 למידע נוסף על קובצי ה-206.
ההבדלים לעומת 6 461
6 תואס לחלוטין את התוכניות והטכניקות שהודגמו בספר, למעט שני מקרים שולייס;
+ 206 אינו מחדיר קוד שורה-חדשה באופן אוטומטי אחרי כל פקודת ()פוק. אם
שורות הפלט שמתקבל צמודות זו לזו, הוסף ח לצורך הצגת תווים מילוליים, כך:
;("תמ201160110) כ ע]א")פוטק
או החדר את תו השורה-החדשה בפקודות ()ז8תסונוק, כך:
('ת')ז וטק
קובצי ההדגמה בתקליטון המצורף כבר כוללים את קוד השורה-החדשה.
* במקרה של העברת מבנה בין פונקציות, קומפיילר 266 מציג אזהרה. נית
1 [ 1
להתעלם מהאזהרה, והיא תבוטל בגרסאות הבאות של הקומפיילר.
קימבול תוכנית
כדי לקמפל תוכנית, הקלד 2066 ואת שמו של קובץ קוד-המקור. לדוגמה, כדי לקמפל
תוכנית ששמה 12₪0.6), הקלד:
2 3 3 פרק נספת: השימוש בתקליטון ההדגמה
000
והקש זטותם. הקומפיילר מניח שקובצי קוד-המקור הס בעלי סיומת 6., וכן שהתוכנית
נמצאת במחיצה בה נמצא הקומפיילר. אס שט הקובץ חסר סיומת, הצב נקודה אחרי השם,
כך:
.אמסא 200
במקרה שטיומת הקוב שונה מ-., יש להקליד את הסיומת אחרי השט, כך:
206
6 יקמפל את התוכנית וייצור קוב עצמיס בעל סיומת 0., ששמו זהה לשמו של קוב
קוד-המקור. הקומפיילר עושה שימוש, למעשה, בשלושה קבצים כדי ליצור את קוב
העצמים: 60.2%8ע, מא.2סק ו-א2060.2. עס ואת, עליך להקליד 206 ואת שם
התוכנית בלבד; הקומפיילר עצמו קורא לקבציס הנוספים, בשעת הצורך. אם הקומפיילר
מגלה שגיאה, הוא מציג את מספר השורה בה היא התגלתה, את שורת הקוד, והטבר קצר
על מהות השגיאה. במקרים מסוימים השגיאה עצמה עשויה להיות בשורה שקודמת לשורת
המוצגת. לדוגמה, אס שכחת להציב נקודה-פסיק בטופה של שורה, הלוגיקה של התוכנית
תזהה את השגיאה בשורה שבאה אחריה.
בנוסף לשגיאות, קומפיילר 66 מציג גס אזהרות. אזהרות חמורות פחות משגיאות,
ובמקרים מסוימיס התוכנית תפעל כהלכה למרות האזהרה. עס זאת, יש לבדוק כל שגיאה
וכל אזהרה בקפידה. תקן את הבעיה, וקמפל את התוכנית פעם נוספת.
קישור התוכנית
לאחר שהתוכנית קומפלה ללא שגיאות, השתמש בקשר .2601 כדי ליצור תוכנית הרצה
בעלת סיומת 8%₪. הקשר מוסיף את הקוד הדרוש עבור פונקציות מובנות מתוך קוב
הספרייה 26605.8 ומקובצי כותרת אחרים שציינת בתוכנית. 266 כולל שני קובצי כותרת:
8 כחוץ לתוכניות שעושות שימוש בקבציס או במדפסת; 18.8א דרוש לתוכניות
שעושות שימוש בפונקציות מתמטיות מורכבות.
כדי לקשר את התוכנית, הקלד ,7601 ואת שמו של קובץ העצמים. ,2601 מניח שהטיומת
של קובץ העצמיס היא 0. לדוגמה, כדי לקשר את הקוב 10660.0 (שקומפל מהתוכנית
הקלד:
ב
והקש זסותם.
תהליך הקישור יסתיים בהצלחה אס התוכנית קומפלה ללא שגיאות, קובצי הכותרת
הדרושים נמצאים על-גבי הכונן, ויש די מקוס בכונן לשמירת תוכנית ההרצה.
שימוש בקומפיילר 66 3 3 3
הרצח התוכנית
אם לא התגלו שגיאות במהלך תהליך הקישור, הרץ את התוכנית על ידי הקלדת שמה
והקשת זס)תם.
ו בתוכניות ההדגמה
בזמן התקנת הקומפיילר והעורך, תוכניות ההדגמה שנדונות בספר מותקנות בכונן הקשיתח
במחיצת המשנה 185105/]21,88ת. כל אחת מתתוכניות מופיעה בשם שהוענק לה
בספר. לדוגמה, בפרק 12 תראה תוכנית שמתחילה בשורה:
/*600.0ז]*/
פירוש הדבר שתמצא את התוכנית בשס זה במחיצה 8/)71,05.
במחיצת תוכניות ההדגמה מופיע גסם קוד המקור לתוכנית 7א6281, כדי שתוכל ללמוד
אותו בעצמך.
בתרונות לתרגילים
בסופו של כל פרק תמצא תרגילים בכתיבת תוכניות. (ישנן גם שאלות עיוניות, שאת
התשובות להן תמצא פשוט על ידי קריאת הקטע המתאים בספר). הפתרונות לתרגיליס
מאוחסנים במחיצה 58/171,28, לפי הפרק ומספר התרגיל, ומתחילים באות ₪. לדוגמה,
הפתרון לתרגיל מספר 2 בפרק 11 מאוחסן בקובץ ₪11-2.6.
באפשרותך לעיין בתוכניות או להתאימן לצרכיך על ידי הטענתן לעורך המלל. ניתן גם
לקמפל את התוכניות ולהריצן בעזרת הקומפיילר 66.
אם ברשותך קומפיילר אחר, לעומת זאת, ייתכן שיהיה עליך לערוך תוכניות שמטפלות
בקבציס. ייתכן שהקומפיילר שברשותך מתייב הכללה של הקוב 8/0102 בצורת הכתיב
הבאה:
<51010.2> 1066סת31
קרא בקפידה כל הודעת שגיאה שהקומפיילר שברשותך מציג בעת תהליך הקומפילציה. עם
זאת, במרבית המקריס תוכל לקמפל ולהריץ את התוכניות ללא עריכה, או עם עריכה
מועטה בלבד.
בנוסף לקובצי קוד-המקור שהזכרנו, המחיצה 54/]21,85 כוללת גס קובץ מלל שמכיל את
כל התרגילים ופתרונותיהם, וכן תשובות לשאלות בהן התבקשת לגלות מה לקוי בקוד
שהוצג לך. הקובץ נקרא 8880615781 ניתן להשתמש בכל מעבד תמלילים כדי
לקרוא או להדפיס את תוכנו של הקוב.
4 3 3 פרק נספח: השימוש בתקליטון ההדגמה
תרשים 4.1
,20 (805) .18 וס הפס פ:נה) ,8.כ). מדריך מהיר וקל
-6 '-. לפקודות, פונקציות,
ולאמצעים שבהם
הינך מרבה להשתמש
| ) 4 כיסוי מלא של התוכניות
חסופוס, זו
זאוהק- 00 קן6זסס,
60665 000
00605
4 מסודר לפי האלף-בית
=] האנגלי וכתוב בשפה
ברורה, תמציתית
ולא טכנית.
ודד יד הכים המקיך ביותד כיום
עבור /4ה0ו8זס6
וזוט ₪
]סז סזחו
4 המדריך המתאים
למשתמשים בכל הרמות
> כל ערך מוסבר בשפה
פשוטה, בהירה ומדויקת
4 מאורגן בסדר האלף בית
האנגלי כדי למצוא
במהירות את התשובות
שאתה מחפש
פול א. הופמן
המדריך הטוב ביותר ל -61חז6זח! במהדודת כים!
]א עשת
4 הוראות מפורטות,
בשיטת צעד-אחר-
צעד, המסייעות לך
למצוא תשובה ברורה
ומלאה לשאלותיך
4 סקירת כל תכונותיה
החדשות של מערכת
זא פוססחו/, כגון
יישומי רשת התקשורת
ואבטחת הנתונים
ו מכיל למעלה מ-50
ג'יימס א. פאואל תרשימים הקסיע ים
לך לאתר את המידע
הדרוש במהירות
מררר הביס המךיף ביותר
הערכה ז\ פס6ח\
₪-
₪" ₪
5 אססבּזובק
מדריך בזק =
מהדורה עונייה
4 הספר המושלם
למתחילים ולמנוסים כאחד
4 מכסה את קבוצת העבודה
סטסזטאזס/ ושפת השאילתות
%חו1 50 סחפוזסם
4 ערוך לפי סדר האלף"בית
האנגלי לנוחות המשתמש
לויי אנדרסון
קרי ג'נסן
מדריך הכים האודויק והמקיד ביותד עוקיים
ףּ =
₪
תי
לגרסה העברית
והאנגלית
+ דרך קלה ומהנה ללמוד - -
אודות 3.1 5/ססאוש ו-3.11
+ ערכת "העזרה ראשונה- | || ספר העזר שנועד 0
שלך להפעלה מוצלחת |) לאנשים כמונו! %
של פשססאוש
+ מה לעשות כאשר
מתעוררות בעיות -
הסברים בעברית פשוטה
|מאת דן גוק
| הדרך קלה והמהנה להכיר
ה ספר העזר שנועד
לתתקגה לתהחקה | לאנשים כמונו!
= ולפתרון בעיות
= מה לעשות כשמתעוררים
קשיים - בעברית פשוטה
ומובנת לכל
4 נפתורי חזית של הומעה
> איבות צניל גבוהה
> מגט ממווע
פ
₪
|
א זוסם-6
ניהול צריבת חעומל:
-555108-זד1ןת
=
5
5
4
=
ל
ל
5
-
ש
0ז
ל
4 א300ביים / מנייה = >
4 270 זמן גיעוה
4 6
ו
5 062-1001 4
4 מהיהות כפולה
4 הבנה
2
6-1 185-
סדרת כונני ]00
פס .
| בולל תקליטון :
חוכנה חינם - תוכניות
נמרות להצלת נחונים אבודים
ו
לבעיות ותקלות בכונן הקעויח
אמצעי מניעה נגד -:
אובדן נחונים עקב הפסקות חעומל,
מחיקת נחונים באקראי
ל יי
למתחילים - רעוימת עצות
לאיחור תקלות
התוכנית
=ף +.) ₪ הראשו/ה שלי
ספר לימוד ++6/6 המוצלח ביותר למתכנתים מתחילים, שילוב של ספר
ותקליטון שאינם פוסחים על דבר.
הספר כולל:
= יסייע לך ללמוד את יסודות תכנות
4 - גם אם לא תכנתת סקירה קלה להבנה, הממצה את עקרונות התכנות בשפת 0 - תוך
זמן קצר ביותר תוכל לחבר תוכניות שימושיות
1 70(
מאות דוגמאות, תרשימים ותוכניות הדגמה להבהרת החומר
לייעול | ה יכולת התכנות
עורך תוכניות וקומפיילר 6 מצורפים על גבי תקליטון - חוסכים לך
את הצורך להשקיע כסף רב ברכישת תוכנה, ומאפשרים לך להתחיל
כל פרק מסתיים בשאלות למבחן מייד בעבודה
אפ סב( ל ל די
כל השיטות ותוכניות ההדגמה יפעלו בכל קומפיילר ++0/0. הספר
כולל סקירה בהירה של כל הנושאים המרכזיים בשפת התכנות
06 - החל מאופן ארגון התוכנית, דרך מבנים, מצביעים ועד לקובצי
קלט/פלט - כולל הערות מיוחדות על מאפיינים ייחודיים של ++0/0.
ל 1
4 שלל דוגמאות ותוכניות הדגמה מבחנים עצמיים ותרגילים בכל פרק, שנועדו לסייע לך לבסס את
כולל תקליטון חינם המכיל
קומפיילר 6. עורך תוכניות ועוד
ן תקליטון 14 5 אינץ' המצורף חינם לספר, יסייע לך בלימוד
₪ התכנות על ++0/6. התקליטון כולל קומפיילר 0 מלא,
בצירוף הוראות שימוש; עורך תוכניות קל להפעלה; כל הוגמאות
התכנות ותוכניות ההדגמה הכלולות בספר; קוד מלא של התוכניות;
תשובות מלאות לכל התרגילים, ללימוד עצמי בקצב אישי.
אודות המחבר
אלן ר. נייבאואר הוא בוגר ביה"ס וורטון
באוניברסיטת פנסילבניה. הוא' לימד
תכנות במכללה, והיום הוא מחלק את
זמנו בין כתיבה, ייעוץ ולימוד. הוא
מחבהם של ספרי הדהכה פופולאריים | 6 !
שו
רבים בנושאי מחשבים ותכנות 1-4
ו
(
כו
ג 5 1 ₪ וו