Professional Documents
Culture Documents
נושא 3- מערכים דו מימדיים וארגומנטים של פונקציות
נושא 3- מערכים דו מימדיים וארגומנטים של פונקציות
אתחול של מערך שגרתי שכזה יהיה למשל ]𝑚[]𝑛[𝑏 𝑡𝑛𝑖 -כלומר מטריצה של Integersעם nשורות ו m -עמודות ,
כך שהאיבר הראשון במערך החיצוני זה השורה הראשונה של המטריצה ,האיבר הראשון בו זה האיבר בטור הראשון בשורה
הראשונה וכך הלאה.
נזכור שמבחינת הזיכרון ,עדיין מדובר פה ברצף אחד של כתובות בזיכרון שממוקמים אחד ליד השני .לכן ,ניתן לעשות פעולות
עם מצביעים על מנת לגשת לאיברים שונים במטריצה .למשל אם נגדיר מטריצה של 3שורות ו 5-עמודות כמו בדוגמא ,יש לנו
3מערכים רצופים בזיכרון ,שכל מערך הוא 5תאים רצופים בזיכרון שמהווים את המערך הפנימי )או השורה של המטריצה(.
לכן אם אנחנו מדברים למשל על הביטוי ] ,𝑎[0בדומה למה שראינו במערכים רגילים ,מדובר בכתובת לתחילת המערך
הראשון במערך החיצוני ,כלומר הכתובת ל"תחילת" השורה הראשונה במטריצה.
באופן דומה ,אם נכתוב ]𝑖[𝑎 ,מדובר בכתובת ל"תחילת" השורה ה i-במטריצה .לכן ,אם ניקח את הכתובת ]𝑖[𝑎 ונעשה לה
𝑗 +עבור כלשהו מספר ,jאנחנו נתקדם jמקומות רצופים בזיכרון ,כלומר במקום להיות בתחילת השורה ה i -במטריצה,
אנחנו נהיה בכתובת של האיבר ה j-בשורה ה.i -
במילים אחרות הכתובת 𝑗 𝑎[𝑖] +תהיה הכתובת לאיבר הj -
בשורה ה .i -כלומר ,אם נרצה לגשת לאיבר זה ,נשתמש במצביע
)𝑗 .*(𝑎[𝑖] +
ישנם עוד כמה צורות )פחות אינטואיטיביות( לעשות את אותו
דבר.
נשים לב שאם לא נשתמש ספציפית ב I -עבור 𝑎[𝑖 ] + 3למשל
אלא נרשום ,𝑎 + 3אנחנו מדברים על ללכת 3כתובות קדימה מתחילת המטריצה כולה .לכן לאיזה איבר נגיע תלוי בכמה
איברים יש בכל שורה בטבלה -פשוט נתקדם 3איברים קדימה בשורה הראשונה ,ואם חרגנו מהשורה הראשונה נגיע לתחילת
השורה השנייה וכך הלאה .כך למשל אם נתקדם קדימה כמספר האיברים שיש בכל שורה ,נגיע להצבעה על תחילת השורה
השנייה ,וכך הלאה.
ע ק ר ו נ ו ת א ל ו ש ל ה פ ו י נ ט ר י ם ו ה כ ת ו ב ו ת א מ נ ם ח ש ו ב ו ת ל ה ב נ ת א ו פ ן ה פ ע ו ל ה ש ל ה ק ו מ פ י י ל ר ת ו ך ק ר י א ת ש פ ת ,Cא ב ל ת מ י ד
אפשר להשתמש בכתיב היותר נוח של ]𝑗[]𝑖[𝑎 על מנת לגשת לאיברים במטריצה.
מערך של מצביעים -ראינו כי ניתן לייצר מערך דו מימדי שמהווה מטריצה ,ובה יש מספר מסוים של שורות )מספר האיברים
בערך החיצוני( ומספר מסוים של טורים )מספר האיברים שיש בכל רשימה פנימית במערך הרשימות( .במקרה זה ,אם נסתכל
על רשימת הרשימות החיצונית ,כל רשימה פנימית בה תהיה עם אותו מספר של איברים.
באופן קצת שונה ניתן להגדיר מערך של מצביעים כך ש ב מ ע ר ך י ש מ ס פ ר מ ס ו י ם ש ל א י ב ר י ם ש כ ל א ח ד
מצביע לכלשו איבר אחר .באופן זה ,ניתן לעשות שכל מצביע שכזה ברשימה יצביע על כתובת של מערך
חד מימדי אחר בגדלים משתנים ,ובעצם קיבלנו סוג של רשימה של
רשימות כך שכל רשימה פנימית היא באורך שונה מהאחרות.
נשים לב שרעיונית פונקציה זו מקבלת 2ארגומנטים -הראשונה מספר שיהווה את מספר הארגומנטים שיועברו לפונקציה
)סוג של( והשנייה מערך של מחרוזות -הקלטים עצמם.
במידה ואנחנו כותבים תוכנית שלא מעבירים אליה ארגומנטים אז זה לא מעניין אותנו בכלל.
במידה ואנחנו כן נרצה להעביר ארגומנטים לפונקציה נתעלם מהחלק של ה Int-בקלט ונרשום ביחד עם הקריאה לפונקציה
את הארגומנטים מסוג מ ח ר ו ז ו ת ) ב ל ב ד ( ש נ ר צ ה ל ה כ נ י ס ל ת ו כ נ י ת .
למשל עבור תוכנית שנקראת Echoזה יראה באופן הבא:
השם של התוכנית הוא .Echo
העברנו 2ארגומנטים מחרוזות .Apple, Banana
מערך המחרוזות הכולל מכיל סה״כ 3מחרוזות -הקריאה לפונקציה בשמה ושני
הארגומנטים.
המספר Argcשמהווה את מספר הקלטים שיוכנסו לפונקציה הוא -3לא רק 2
עבור המחרוזות שהכנסנו אלא אחד נוסף עבור מחרוזת הקריאה לפונקציה.
בתוך הארגומנט של הפונקציה החיצונית כתבנו ) (∗ fשזהו כאילו המצביע לפונקציה שנכניס כארגומנט .מימינה רשמנו
,Doubleכי זה מה שהפונקציה שנכניס אמורה לפלוט וכמו כן הגדרנו שהארגומנט של הפונקציה הפנימית יהיה .Double
כעת כשאנחנו רוצים להשתמש בפונקציה שהכנסנו לפונקציה החיצונית בתוך הבלוק שלה נעשה זאת על ידי כתיב )𝑥()𝑓 ∗(
כך ש x -זה מה שנכניס לפונקציה הפנימית.
כעת ניתן להגדיר פונקציות באופן נורמלי לחלוטין ,ולהכניס אותם כארגומנטים לפונקציה החיצונית שהגדרנו.