םינתשמhbinsky/c content/variables.pdfםיילאקול םייטטס םינתשמ ןיב...

21
1 תכנות מתקדם בשפתC משתנים

Upload: others

Post on 24-Feb-2020

16 views

Category:

Documents


0 download

TRANSCRIPT

1

Cתכנות מתקדם בשפת

משתנים

2

משתנים

בשפת משתנים סוגי C

השונים המשתנים סוגי בין ההבדלים

משתנים/* This program computes m to the power of n */

/* Assumptions: m is an integer; n is a positive integer */

#include <stdio.h>

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

אוטומטיים/משתנים לוקאליים

פונקציות בתוך מוגדרים.

אותו בעלי למשתנים קשורים ואינם הוגדרו בה לפונקציה פנימיים

.אחרות בפונקציות המוגדרים שם

נקראת הפונקציה כאשר (זיכרון עבורו מוקצה)= "נולד" המשתנה

כאשר (ההפעלה למערכת מוחזר בזיכרון המקום)= "מת"ו

.מסתיימת הפונקציה

פונקציה אותה של שונים ביצועים בין ערכם על שומרים אינם.

שונות בפונקציות זהים בשמות משתנים להגדיר ניתן.

stack

5

(external)משתנים חיצוניים

פונקציה לכל מחוץ מוגדרים.

פונקציה בכל (ולשנותם ערכם את לקרוא) אליהם להתייחס ניתן.

תחילת עם "נולדים)" רצה שהתכנית זמן כל "חי" המשתנה

.(סיומה עם "מתים"ו התכנית

ערכם את שקבעה שהפונקציה לאחר גם ערכם על שומרים

.הסתיימה

6

( external)משתנים חיצוניים

פונקציה לכל מחוץ ,אחת פעם בדיוק ,להגדיר יש חיצוני משתנה.

המשתנה עבור בזיכרון מקום להקצאת גורמת ההגדרה.

באזור :כך על להצהיר צריכה חיצוני במשתנה להשתמש המעוניינת פונקציה כל

את לציין ההצהרה ולפני החיצוני המשתנה על להצהיר יש ,המשתנים הגדרות

;extern : extern int num המאפיין

מקום הקצאת ללא (וטיפוס שם) המשתנה אופי על מכריזה ההצהרה.

עליו ההצהרה עם משתנה לאתחל ניתן לא.

נמצאת בו בקובץ מוגדר החיצוני המשתנה אם ההצהרה על לוותר ניתן

.הפונקציה לפני ,בו שמשתמשת הפונקציה

הקובץ בתחילת חיצוניים משתנים על ההצהרות את מאגדים כ"בדר :מוסכמה,

.הפונקציות הגדרות לפני

7

דוגמא -משתנים חיצוניים

#include <stdio.h>

int num;

int main()

{

num=3;

printf("%d\n",num);

return 0;

}

#include <stdio.h>

int main()

{

extern int num=3;

printf("%d \n",num);

return 0;

}

int num;

#include <stdio.h>

int main()

{

extern int num;

num=3;

printf("%d \n",num);

return 0;

}

int num;

8

( external)משתנים חיצוניים

מקום בכל מוגדר חיצוני משתנה) לפונקציות פרמטרים העברת למנגנון תחליף

.(מקום בכל לשנותו וניתן

המודולריות עקרון את סותר.

המידע הסתרת עקרון את סותר.

היטב ומוצדק מצומצם להיות צריך חיצוניים במשתנים שימוש!

9

משתנים לוקאליים ↔משתנים חיצוניים

משתנים חיצוניים משתנים לוקאליים

פונקציה לכל מחוץ מוגדרים פונקציה בתוך מוגדרים

חיה שהתכנית זמן כל חיים הפונקציה עם ומתים נולדים

התכנית ביצוע זמן כל נשמר ערכם הקריאות בין ערך על שומרים אינם

מנקודת הוגדרו בו בקובץ מוכרים הוגדרו בה הפונקציה בתוך מוכרים

ואילך הגדרתם

בתחילת ,אחת פעם מאותחלים לפונקציה קריאה בכל מאותחלים

התכנית

10

של שני ( scope)חפיפה באורך חיים

משתנים בעלי אותו שם

ב שנמצאת פונקציה בתוך מוגדר לוקאלי משתנה כאשר- scope משתנה של

.שם אותו בעל חיצוני

:דוגמא

int x;

int y;

:

double func( double x )

{

double y;

:

}

שם אותו בעלי חיצוניים משתנים "מסתירים" לוקאליים משתנים :הכלל.

בכלל מומלץ לא...

11

של שני ( scope)חפיפה באורך חיים

משתנים בעלי אותו שם

#include <stdio.h>

int main()

{

int num;

printf("%d \n",num);

return 0; }

int num=3;

#include <stdio.h>

int main()

{

extern int num;

printf("%d \n",num);

return 0; }

int num=3;

3 התוצאה לא ידועה

12

חיצוניים -משתנים סטטיים

בלבד ובו ,הוגדר בו בקובץ מוכר :חיצוני סטטי משתנה.

.במשתנה להשתמש "זרים" מקבצים מונע

static int num=0;

כסטטית המוגדרת פונקציה לגבי ל"כנ.

13

לוקאליים -משתנים סטטיים

בין ערכו על שומר שהוא אלא ,דבר לכל לוקאלי משתנה :לוקאלי סטטי משתנה

.הפונקציה לאותה שונות קריאות

:שימוש דוגמת

התבצעה שפונקציה הפעמים מספר ספירת :המטרה (לצרכי debugging למשל).

סטטי לוקאלי במשתנה שימוש ללא פתרון:

.לפונקציה קריאה כל לפני ולהגדילו counter בשם חיצוני משתנה הגדרת .1.

...שונות בפונקציות שונים ממקומות לפונקציה רבות קריאות יש אם :חיסרון

.תגדיל שהפונקציה חיצוני במשתנה שימוש .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

הגדרת משתנים בבלוקים

כל של ( { ) הפותח המסולסל הסוגר לאחר משתנים (ולאתחל) להגדיר ניתן

.(פונקציה של גוף כל בתחילת רק ולא) מורחבת פקודה

ה- scope מוגדר הוא בו הבלוק הוא המשתנה של.

דוגמא:

if (n > 0){

int i;

for (i=0 ; i < n ; i++){

:

}

}

מתחיל שהבלוק פעם בכל מחדש מאותחל בלוק בתוך המוגדר משתנה

.כסטטי המשתנה אפיון י"ע זאת למנוע ניתן .להתבצע

פנימיים כבמשתנים :יתרון, scopeכולה הפונקציה ולא בלבד הבלוק הינו.

.לשגיאות הסיכוי בהקטנת ומורכבת גדולה פונקציה כאשר יתרון מהווה

...ופשוטות קצרות פונקציות כותבים C -ב :שני מצד

15

אתחול

ב משתנה כל- C הגדרתו עם לאתחל ניתן.

מפורש אתחול אין אם:

לאפס מאותחלים וסטטיים חיצוניים משתנים.

מוגדר לא התחלתי ערך בעלי הם לוקאליים משתנים.

קבוע ביטוי להיות חייב האתחול ערך ,וסטטיים חיצוניים משתנים באתחול.

.אחת פעם מתרחש האתחול

הבלוק או שהפונקציה פעם בכל מתרחש האתחול ,לוקאליים משתנים באתחול

ביטוי להיות עשוי המאתחל הערך .להתבצע מתחילים המשתנה מוגדר שבהם

.(לפונקציה קריאה כולל) כלשהוא

16

/*A scoping example*/ דוגמאות

#include <stdio.h>

void a(void); /*function prototype*/

void b(void); /*function prototype*/

void c(void); /*function prototype*/

int x = 1; /* global variable*/

main()

{

int x = 5; /*local variable to main*/

printf("local x in outer scope of main is %d\n",x);

{

/* start new scope*/

int x = 7;

printf("local x in inner scope of main is %d\n",x);

} /* end new scope*/

printf("local x in outer scope of main is %d\n", x);

a(); /* a has automatic local x */

b(); /* b has static local x */

c(); /* c uses global x */

a(); /* reinitializes automatic local x */

b(); /* static local x retains its previous value */

c(); /* global x also retains its value*/

printf("local x in main is %d\n", x);

}

17

()void a דוגמאות

{

int x = 25; /*initialized each time a is called*/

printf("\nlocal x in a is %d after entering a\n", x);

++x;

printf("local x in a is %d before exiting a\n", x);

}

void b()

{

static int x = 50; /* static initialization only */

/* first time b is called */

printf("\nlocal static x is %d on entering b\n", x);

++x;

printf("local static x is %d on exiting b\n", x);

}

void c()

{

printf("\nglobal x is %d on entering c\n", x);

x*=10;

printf("global x is %d on existing c\n", x);

}

18

דוגמאות

local x in outer scope of main is 5

local x in inner scope of main is 7

local x in outer scope of main is 5

local x in a is 25 after entering a

local x in a is 26 before exiting a

local static x is 50 on entaring b

local static x is 51 on exiting b

global x is 1 on entering c

global x is 10 on existing c

local x in a is 25 after entering a

local x in a is 26 before exiting a

local static x is 51 on entering b

local static x is 52 on exiting b

global x is 10 on entering c

global x is 100 on existing c

local x in main is 5

19

טבלת סיכום

תחום ההכרה מקום ההגדרה סוג המשתנה

(scope)

אורך חיים

תחילת לוקאלי

פונקציה/בלוק

בתוך

פונקציה/הבלוק

אורך חיי

הפונקציה

החל ממקום פונקציה לכל מחוץ גלובלי

ההגדרה ומטה

התוכנית חיי אורך

תחילת (לוקאלי) סטטי

פונקציה/בלוק

בתוך

פונקציה/הבלוק

התוכנית חיי אורך

20

רקורסיה ומשתנים סטטייםBOOL isEvenSumDigits(int num)

{

static int sum = 0;

if(num == 0)

{

if(sum%2 == 0)

return TRUE;

else

return FALSE;

}

else

{

sum += num%10;

return isEvenSumDigits(num/10);

}

} isEvenSumDigits(135) ,מה תהיה התוצאה?

?מה תהיה התוצאה, isEvenSumDigits(135)ואם נקרא שוב

21

המשך -רקורסיה ומשתנים סטטיים BOOL isEvenSumDigits(int num)

{

BOOL res;

if(num < 10)

{

if(num%2 == 0)

return TRUE;

else

return FALSE;

}

else

{

res = isEvenSumDigits(num/10);

if((res == TRUE && (num%10)%2 == 0) ||

(res == FALSE && (num%10)%2 == 1))

return TRUE;

else

return FALSE;

}

}

אפשר בקלות לפתור את הטעות אולם אנחנו בקורס , נכון

.רקורסיביות' פוננאסור שימוש במשתנים סטטיים בכתיבת

:פתרון נכון שגם מדגים את הגישה האינדוקטיבית הוא