Professional Documents
Culture Documents
Yl 07
Yl 07
הרצאה :7פונקציות
נכתב על-ידי טל כהן ,נערך ע"י איתן אביאור © .כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל
בעיית התוכנית הגדולה
)function-name(arguments-list
n m
)int gcd(int n, int m
?
8
2
1
5 2
0
?
{
...
;return n
}
)(int foo
{ d
... ?
2
28
d = gcd(9-1, ;)2
return gcd(5;)1 , 2d
}
• דוגמאות להכרזות:
;)double sqrt(double
;)long power(int, int
;)long power(int base, int exponent מה עדיף?
האם יש צורך
ב?else-
printf("y = ");
scanf("%lf", &y);
printf("|%f| = %f\n", y, abs(y));
double abs(double x)
return 0; {return x < 0 ? –x : x;}
}
#include ><...
;)int max(int a, int b בראש הקובץ מופיעות הכרזות על •
;)int min(int a, int b הפונקציות השונות ,ואח"כ הן מוגדרות:
)(int main } { max(x,y); ... – מסודרות למשל ,לפי העקרונות של
תכנון מלמעלה למטה ) top-down
} int max(int a, int b) { ...
. (design
} int min(int a, int b) { ...
ריבוע שלם או,• נכתוב תוכנית המקבלת מספר ובודקת אם הוא ראשוני
:לא זה ולא זה
#include <stdio.h>
#include <math.h>
return 0;
}
7 הרצאה © כל הזכויות שמורות.C מבוא למחשב בשפת 20
פונקציה לבדיקת ראשוניות:המשך הדוגמה
if (n == 2) return TRUE;
if (n % 2 == 0 || n < 2) return FALSE;
return TRUE;
}
מחסנית ) (stackהינה מבנה נתונים שבו ניתן לשמור סדרה של ערכים המוכנסים •
אליה ומּוצאים ממנה לאחר מכן.
– סדר ההוצאה הפוך לסדר ההכנסה :האחרון שנכנס הוא הראשון לצאת
).(LIFO – Last In First Out
– כך בנויה ,למשל ,גם מחסנית של כלי ירייה כגון רובה )לא אקדח תופי(.
מחסנית הקריאות של תוכנית הינה אזור מיוחד בזיכרון )הנתמך ע"י המהדר •
וע"י חומרת-המחשב( ,בה נשמר מידע אודות הפונקציות המתבצעות בכל רגע.
כאשר פונקציה נקראת ,נדחפת למחסנית רשומת הפעלה הכוללת בין השאר את: •
– ערכי הארגומנטים בקריאה לפונקציה )במידת הצורך(,
– מקום לערך המוחזר מהפונקציה )במידת הצורך(,
– כתובת החזרה מהפונקציה )בסיום פעולתה(,
– הקצאת זיכרון למשתנים המקומיים של הפונקציה )במידת הצורך(.
בסיום פעולתה של פונקציה ,נמחקת רשומת ההפעלה מהמחסנית ,והשליטה חוזרת •
לפונקציה הקוראת ,לפי כתובת החזרה.
רשומת ההפעלה של ה"פונקציה הנוכחית" הינה תמיד בראש המחסנית. •
תוכנית בשפת Cמורכבת מבלוקים :פונקציות ובהן פסוקים מורכבים }…{. •
בתחילת כל בלוק ניתן להגדיר משתנים מקומיים. •
ניתן לפנות אל משתנה מקומי באמצעות המזהה שלו רק בבלוק בו הוא •
מוגדר ,כולל בבלוקים המוכלים בו ,החל ממקום ההגדרה ועד סוף הבלוק.
מזהה מבלוק חיצוני תקף בתוך בלוק פנימי ,אלא אם הוגדר מחדש בבלוק •
הפנימי.
– במילים אחרות :מזהה המוגדר בבלוק פנימי "מסתיר" מזהה בעל שם זהה
בבלוק חיצוני.
• כשקוראים לפונקציה ,משתני הפונקציה )הבלוק( הקוראת אומנם שמורים
במחסנית ,אך המזהים שלהם אינם מוכרים בפונקציה הנקראת ,ועל כן לא
ניתן לפנות אליהם באמצעות המזהים שלהם מהפונקציה הנקראת.
• משתנה המוגדר מחוץ לכל בלוק נקרא משתנה חיצוני או משתנה גלובלי.
• משתנה חיצוני מוכר בכל הקוד החל ממקום הגדרתו ועד סוף הקובץ,
ומשתנה גלובלי עשוי להיות מוכר גם בקבצים אחרים של התוכנית.
– מלבד בבלוקים שבהם הוגדרו מחדש ,ועל כן הוסתרו.
הרצאה 7 מבוא למחשב בשפת .Cכל הזכויות שמורות © 25
#include <stdio.h>
int a = 1, b = 2, c = 3, d = 4;
void v() דוגמאות
{
int a = 101, b = 102, e = 105;
printf("%d %d %d %d %d\n", a, b, c, d, e); 101 102 3 4 105
{
int a = 201, c = 203, d = 204;
printf("%d %d %d %d %d\n", a, b, c, d, e);
} 201 102 203 204 105
{
printf("%d %d %d %d %d\n", a, b, c, d, e);
} 101 102 3 4 105
printf("%d %d %d %d %d\n", a, b, c, d, e);
}
int main() 101 102 3 4 105
{
int a = 11, b = 12, d = 14, m = 17;
printf("%d %d %d %d %d\n", a, b, c, d, m); 11 12 3 14 17
{
printf("%d %d %d %d %d\n", a, b, c, d, m);
{ 11 12 3 14 17
int a = 21;
printf("%d %d %d %d %d\n", a, b, c, d, m);
{ 21 12 3 14 17
printf("%d %d %d %d %d\n", a, b, c, d, m);
} 21 12 3 14 17
}
}
v();
printf("%d %d %d %d %d\n", a, b, c, d, m); 11 12 3 14 17
return 0;
}
7 הרצאה © כל הזכויות שמורות.C מבוא למחשב בשפת 26
מערך חד מימדי ופונקציות
)(int main
{ )change_a(int a
;int a = 7 {
;)change_a (a ;a = 3
;)printf(“%d\n”,a ;return
}
;return 0
}
על המסך יודפס .7הפונקציה מקבלת עותק זמני ,המייצג את הערך )(value
של המשתנה ומשנה אותו .בתוכנית הראשית הערך של aלא משתנה !
)(int main
{
int a[1][1] = {7}; /* {{7}} */
;)change_a (a
;)]printf(“%d\n”, a[0][0
;return 0
}
int main()
{
int a[N][M] = {{2,3}, {3,4}, {5,6}};
printf(“%d\n”, sum(a));
return 0;
N מיותר )ומטעה( לשים
}
int main()
{
int a[N][M] = {{2,3}, {3,4}, {5,6}};
int b[M][M] = {{9,8}, {7,6}};
printf(“%d\n”, sum(a, N));
printf(“%d\n”, sum(b, M)); מספר השורות עשוי להשתנות
return 0;
} int sum (int a[][M], int rows)
{
int i, j, val = 0
for (i = 0; i < rows; i++)
for (j = 0; j < M; j++)
val += a[i][j];
return val;
}
משתנים סטטיים
משתנה אוטומטי
משתנה גלובלי משתנה חיצוני משתנה מקומי
;int p = 1 ;static int p = 1 ;static int p = 1 ;int p = 1 תחביר הגדרה
מחוץ לבלוק מחוץ לבלוק בתוך בלוק בתוך בלוק מקום ההגדרה
כל חיי התוכנית כל חיי התוכנית כל חיי התוכנית חיי הבלוק זמן חיים
ביטוי קבוע ביטוי קבוע ביטוי קבוע ביטוי כלשהו סוג אתחול
לפני תח' התוכנית לפני תחילת התוכנית לפני תחילת התוכנית כניסה לבלוק זמן אתחול
)(void toggle_light
{
;static int light_status = OFF