=0 */ int power(int base, int n) { int i, p=1; for (i=1; i<=n; i++) { p = p*base; } return p; } מה קורה כאשר שני משתנים בעלי שם זהה מוגדרים בפונקציות שונות ? באילו סביבות ניתן להגדיר משתנים והיכן הם מוגדרים ?"> =0 */ int power(int base, int n) { int i, p=1; for (i=1; i<=n; i++) { p = p*base; } return p; } מה קורה כאשר שני משתנים בעלי שם זהה מוגדרים בפונקציות שונות ? באילו סביבות ניתן להגדיר משתנים והיכן הם מוגדרים ?">
Download presentation
Presentation is loading. Please wait.
1
1 מבוא למדעי המחשב משתנים
2
2 סוגי משתנים בשפת C ההבדלים בין סוגי המשתנים השונים
3
משתנים /* This program computes m to the power of n */ /* Assumptions: m is an integer; n is a positive integer */ #include int power(int m, int n); /* test the power function */ int main() { int i; for (i=0; i<10; i++) { printf("%d %d %d\n", i, power(2,i), power(-3,i)); } return 0; } /* power: raise base to n-th power; n>=0 */ int power(int base, int n) { int i, p=1; for (i=1; i<=n; i++) { p = p*base; } return p; } מה קורה כאשר שני משתנים בעלי שם זהה מוגדרים בפונקציות שונות ? באילו סביבות ניתן להגדיר משתנים והיכן הם מוגדרים ?
4
4 משתנים אוטומטיים מוגדרים בתוך פונקציות. פנימיים לפונקציה בה הוגדרו ואינם קשורים למשתנים בעלי אותו שם המוגדרים בפונקציות אחרות. המשתנה "נולד" (=מוקצה עבורו זיכרון) כאשר הפונקציה נקראת ו"מת" (=המקום בזיכרון מוחזר למערכת ההפעלה) כאשר הפונקציה מסתיימת. אינם שומרים על ערכם בין ביצועים שונים של אותה פונקציה. ניתן להגדיר משתנים בשמות זהים בפונקציות שונות. יתרונות: מודולריזציה הסתרת מידע (information encapsulation)
5
5 משתנים חיצוניים (external) מוגדרים מחוץ לכל פונקציה. ניתן להתייחס אליהם (לקרוא את ערכם ולשנותם) בכל פונקציה. המשתנה "חי" כל זמן שהתכנית רצה ("נולדים" עם תחילת התכנית ו"מתים" עם סיומה). שומרים על ערכם גם לאחר שהפונקציה שקבעה את ערכם הסתיימה.
6
6 משתנים חיצוניים (external) משתנה חיצוני יש להגדיר, בדיוק פעם אחת, מחוץ לכל פונקציה. ההגדרה גורמת להקצאת מקום בזיכרון עבור המשתנה. כל פונקציה המעוניינת להשתמש במשתנה חיצוני צריכה להצהיר על כך: באיזור הגדרות המשתנים, יש להצהיר על המשתנה החיצוני ולפני ההצהרה לציין את המאפיין extern :extern int num; ההצהרה מכריזה על אופי המשתנה (שם וטיפוס) ללא הקצאת מקום. לא ניתן לאתחל משתנה עם ההצהרה עליו. ניתן לוותר על ההצהרה אם המשתנה החיצוני מוגדר בקובץ בו נמצאת הפונקציה שמשתמשת בו, לפני הפונקציה. מוסכמה: בדר"כ מאגדים את ההצהרות על משתנים חיצוניים בתחילת הקובץ, לפני הגדרות הפונקציות.
7
7 משתנים חיצוניים - דוגמא #include int num; int main() { num=3; printf("%d\n",num); return 0; } #include int main() { extern int num=3; printf("%d \n",num); return 0; } int num; #include int main() { extern int num; num=3; printf("%d \n",num); return 0; } int num;
8
8 משתנים חיצוניים (external) תחליף למנגנון העברת פרמטרים לפונקציות (משתנה חיצוני מוגדר בכל מקום וניתן לשנותו בכל מקום). סותר את עקרון המודולריות. סותר את עקרון הסתרת המידע. שימוש במשתנים חיצוניים צריך להיות מצומצם ומוצדק היטב!
9
9 משתנים חיצוניים ↔ משתנים אוטומטיים משתנים אוטומטייםמשתנים חיצוניים מוגדרים בתוך פונקציהמוגדרים מחוץ לכל פונקציה נולדים ומתים עם הפונקציהחיים כל זמן שהתכנית חיה אינם שומרים על ערך בין הקריאותערכם נשמר כל זמן ביצוע התכנית מוכרים בתוך הפונקציה בה הוגדרומוכרים בקובץ בו הוגדרו מנקודת הגדרתם ואילך מאותחלים בכל קריאה לפונקציהמאותחלים פעם אחת, בתחילת התכנית
10
10 חפיפה בתחום החיות (scope) של שני משתנים בעלי אותו שם כאשר משתנה אוטומטי מוגדר בתוך פונקציה שנמצאת ב- scope של משתנה חיצוני בעל אותו שם. דוגמא: int x; int y; : double func( double x ) { double y; : } הכלל: משתנים אוטומטיים "מסתירים" משתנים חיצוניים בעלי אותו שם. לא מומלץ בכלל...
11
11 חפיפה בתחום החיות (scope) של שני משתנים בעלי אותו שם #include int main() { int num; printf("%d \n",num); return 0; } int num=3; #include int main() { extern int num; printf("%d \n",num); return 0; } int num=3;
12
12 משתנים סטטיים - חיצוניים משתנה סטטי חיצוני: מוכר בקובץ בו הוגדר, ובו בלבד. מונע מקבצים "זרים" להשתמש במשתנה. static int num=0; כנ"ל לגבי פונקציה המוגדרת כסטטית.
13
13 משתנים סטטיים - אוטומטיים משתנה סטטי אוטומטי: משתנה אוטומטי לכל דבר, אלא שהוא שומר על ערכו בין קריאות שונות לאותה הפונקציה. דוגמת שימוש: המטרה: ספירת מספר הפעמים שפונקציה התבצעה (לצרכי debugging למשל). פתרון ללא שימוש במשתנה אוטומטי סטטי:.1.הגדרת משתנה חיצוני בשם counter ולהגדילו לפני כל קריאה לפונקציה. חיסרון: אם יש קריאות רבות לפונקציה ממקומות שונים בפונקציות שונות... 2.שימוש במשתנה חיצוני שהפונקציה תגדיל. חיסרון: משתנה חיצוני... ע"י שימוש במשתנה סטטי: return_type func (parameters if any) { static int counter=0; printf(“Function func is called. This is its %d’th call.\n”,++counter); : }
14
14 הגדרת משתנים בבלוקים ניתן להגדיר (ואף לאתחל) משתנים לאחר הסוגר המסולסל הפותח ( } ) של כל פקודה מורחבת (ולא רק בתחילת כל גוף של פונקציה). ה- scope של המשתנה הוא הבלוק בו הוא מוגדר. דוגמא: if (n > 0){ int i; for (i=0 ; i < n ; i++){ : } משתנה המוגדר בתוך בלוק יאותחל מחדש בכל פעם שהבלוק מתחיל להתבצע. ניתן למנוע זאת ע"י אפיון המשתנה כסטטי. יתרון: כבמשתנים פנימיים, תחום החיות הינו הבלוק בלבד ולא הפונקציה כולה. מהווה יתרון כאשר הפונקציה גדולה ומורכבת בהקטנת הסיכוי לשגיאות. מצד שני: ב- C כותבים פונקציות קצרות ופשוטות...
15
15 אתחול כל משתנה ב- C ניתן לאתחל עם הגדרתו. אם אין אתחול מפורש: משתנים חיצוניים וסטטיים מאותחלים לאפס. משתנים אוטומטיים הם בעלי ערך התחלתי לא מוגדר. באתחול משתנים חיצוניים וסטטיים, ערך האתחול חייב להיות ביטוי קבוע. האתחול מתרחש פעם אחת. באתחול משתנים אוטומטיים, האתחול מתרחש בכל פעם שהפונקציה או הבלוק שבהם מוגדר המשתנה מתחילים להתבצע. הערך המאתחל עשוי להיות ביטוי כלשהוא (כולל קריאה לפונקציה).
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.