מבוא למדעי המחשב, 6תרגול , משתנים: סוגי פונקציות
top-down design
1
2
מה היה שבוע שעבר?
לולאות•מערכים••- ממדיים דו מערכים
6מבוא למדעי המחשב מ' - תירגול
3
והיום נלמד
6מבוא למדעי המחשב מ' - תירגול
פונקציות•הקריאות • מחסניתמשתנים • סוגי•Top-Down design
מבוא לפונקציותתזכורת מההרצאה
6מבוא למדעי המחשב מ' - תירגול 4
5
Cפונקציות ב-
6מבוא למדעי המחשב מ' - תירגול
ערכים • שמקבלת שחורה קופסה כמו לפונקציה להתייחס ניתןעליהם( )פרמטרים) חישוב תוצאת החזרה ומחזירה (.ערך
• : לפונקציות דוגמאות בעבר ...printf, scanfראינו•. הצורך לפי עצמנו משל פונקציות ליצור יכולים אנחנו• , בפונקציה שימוש שעושה לפונקציה קריאה בין להבדיל יש
עם ) שעשינו כפי שחורה הגדרת(, printf ,scanfכקופסא לבין. , בפועל החישוב מתבצע שם שלה והמימוש הפונקציה
פרמטריםמועבר) מידע
לפונקציה(
מוחזר ערךתוצאה)
המתקבלת מהפונקציה(
דוגמה – מימוש פונקציה
6מבוא למדעי המחשב מ' - תירגול 6
• , ומחזירה מספרים שני שמקבלת הבאה הפונקציה את ננתח. מוחלט בערך ביניהם ההפרש את
•: חתימה יש פונקציה לכל
float delta(float a, float b) { float result = a – b; if (result < 0) result = -result; return result;}
המוחזר הטיפוסהפונקציה" י ע
. שמה לפני מופיע . הפונקציה שם רשימת: בסוגרייםמופרדים ) הפרמטרים
.) ביניהם בפסיקים
דוגמה - המשך
•: הפונקציה של נוספים רכיבים
6מבוא למדעי המחשב מ' - תירגול 7
גוף הפונקצי
ה
float delta(float a, float b) { float result = a – b; if (result < 0) result = -result; return result;}
מקומי , :משתנה הפונקציה בתוך רק קיים " " . סיום לאחר נשכח פועלת שהפונקציה בזמן
. הפונקציה פעולת
הערך משמשת לקביעת returnההוראה על-ידי הפונקציה.המוחזר
זה בעצם הערך שהפונקציה מחשבת. resultבדוגמה אנו יכולים להחזיר את
מהטיפוס deltaכי ערך החזרה של המתאים
returnפקודת
מסיימת את הפונקציה הנוכחית, returnפעולת •.מהמקום בו קראנו לפונקציהוההרצה נמשכת
הוא הערך "שהפונקציה returnהערך שהועבר ל-•מחזירה", כלומר התוצאה.
כאשר הפונקציה לא מחזירה ערך ("טיפוס" מוחזר •void ,(return וגם לא הכרחית) לא מקבלת ערך
לכתיבה).
עם returnכאשר הפונקציה מחזירה ערך, הפקודה •טיפוס מתאים הכרחית בכל מסלולי החישוב.
mainכפונקציה
•- ה היא נקודת ההתחלה של כל ()mainפונקצייתתוכנית, והיא נקראת ע"י מע' ההפעלה.
חתימת הפונקציה: •
() מסיים main עם ערך כלשהו מתוך returnביצוע •את ריצת התוכנית ומחזיר את אותו ערך למע'
ההפעלה.
בד"כ נהוג:• בסיום תקין0החזרת –6מבוא למדעי המחשב מ' - תירגול כל ערך אחר בשגיאה– 9
int main();
המשך דוגמה – קריאה לפונקציה
! מתאים מטיפוס הם לפונקציה המועברים שהפרמטרים לב נשיםלהיות חייבים הם ?floatהאם
int main(){ float x = 3.4, y = 5.7; float d = delta(x,y); printf(“delta of x and y is: %f\n”, d); d = delta(d, x); printf(“delta of x and y is: %f\n”, d); d = delta(d,d); printf(“delta of x and y is: %f\n”, d); return 0;}
2.3יודפס
1.1יודפס
0יודפס
float delta(float a, float b);
11
קריאה לפונקציה
• , הפרמטרים ערכי מחושבים תחילה נקראת פונקציה כאשר. מורכב – ביטוי גם להיות יכולים אשר אליה שהועברו
המתאים – • לטיפוס יומרו לפונקציה המועברים הפרמטרים , מסוג פרמטר עם פונקציה הקודמת יכולה, floatבדוגמא
פרמטר עם .intלהיקרא שלמדנו כפי המוכר באופן שיומר• , להניח ניתן לא לכן מהדר תלוי הוא הפרמטר חישוב סדר
. מסוים בסדר מחושבים שהם• , הפונקציה, של המוחזר בערך להשתמש הכרחי לא אך ניתן
.) ערך) מחזירה אכן היא אם
6מבוא למדעי המחשב מ' - תירגול
12
עוד על פרמטרים
הפונקציה – בכותרת המוגדרים משתנים הם פרמטרים. הפונקציה ריצת בסיום ומשתחררים
ב – – בתוך, by valueמועברים Cפרמטרים פרמטר ערך שינוי . הם לפונקציה מחוץ משתנים ערכי על ישפיע לא פונקציה
. לפונקציה בקריאה שחושבו הערכים של עותקים בעצם
6מבוא למדעי המחשב מ' – תירגול
תרגילים
שלמים: 1תרגיל • מספרים שני המקבלת פונקציה כתבו. שלהם המקסימום את ומחזירה
- פתרון1תרגיל
: מטיפוס פרמטרים שני הפונקציה לחתימת לב וערך intנשיםמטיפוס :intחזרה
לכתוב גם -return yיכולנו ה אחרי .elseללא, ifישר
int max2(int x, int y){if (x > y){
return x;}else{
return y;}
}
תרגילים
המקבלת: 2תרגיל • פונקציה ומחזירה 3כתבו שלמים מספרים. ביניהם המקסימום את
6מבוא למדעי המחשב מ' - תירגול 15
- פתרון2תרגיל
תרגיל כמו הסגנון באותו פונקציה לכתוב אפשר1:
–? הקודמת בפונקציה נשתמש אולי
int max3(int x, int y, int z){if (x > y){
if (x > z) return x;else return z;
}\\ x is not bigger than yelse{
if (y > z) return y;else return z;
}}
int max2(int x, int y){if (x > y){
return x;}else{
return y;}
}
- פתרון2תרגיל
בין: המקסימום מה ידענו אילו -xהבחנה צריכים, yו היינו רק- ל אותו .zלהשוות
של :max2(x,y)הערך המדובר המקסימום בדיוק הוא
לכתוב – מנת על קיימות בפונקציות להשתמש נעדיף כללי באופן. חדש קוד
int max3(int x, int y, int z){return max2(max2(x,y),z);
}הערך טיפוס בין להתאמה לב נשים
של של max2המוחזר החזרה לערךmax3
הפרמטר טיפוס בין להתאמה לב נשיםהערך max2ש- לטיפוס לקבל מצפה
" י ע max2המוחזר
תרגילים
בשם: 3תרגיל • פונקציה כפרמטר intשמקבלת isPrimeכתבו-trueומחזירה ו ראשוני הפרמטר .falseאם אחרת
– פתרון3תרגיל
bool is_prime(int num) { \\ if divisible by 2, only 2 is prime:
if (num%2 == 0) ???; \\ otherwise see if divisible by anything int i=3;
while (i*i <= num){ if (num%i == 0) {
??? } i++;
} return true;}
– פתרון3תרגיל
bool is_prime(int num) { \\ if divisible by 2, only 2 is prime:
if (num%2 == 0) return num == 2; \\ otherwise see if divisible by anything int i=3;
while (i*i <= num){ if (num%i == 0) {
return false; } i++;
} return true;}
בדיקת ראשוניות – דוגמה לשימוש
מספר מקבלים בו בתרגיל הוא 1-10ניזכר האם ומדפיסים. - קצת, אותו ונשנה ראשוני לא זוגי אי או זוגי או ראשוני
בשם: 4תרגיל • פונקציה את printPropertyכתבו שפותרתצריכה ) לא שהיא לב שימו שלם מספר כל עבור התרגיל
,) בפונקציה שימוש תוך כלום :isPrimeלהחזיר
- פתרון4תרגיל
void print_property(int num){if (is_prime(num)){ printf(“Number is prime\
n”);}else if (num % 2 == 0){ printf(“Number is even\
n”);}else printf(“Number is odd\n”);return;
}הוא החזרה ערך כצפוי voidטיפוס
הכרחי returnה- לא
תרגילים
?5תרגיל • הללו: במימושים בסדר לא מה
int min(int a, int b) { if (a > b) return b;}
void print_value(int m) { printf(“Value=%d\n”, m); return m;}
תרגילים
?6תרגיל • חוקיות: לא מהקריאות אילו: הפונקציות של ;int gcd(int n, int m)חתימות
void print_value(int num);int dist(float, float);char get_letter();
j = gcd(j, j);
result = print_value(i+1);
dist(2.2, 1.5);
printf(“input: %c\n”, get_letter(k));
get_letter;
25
הצהרת פונקציות – בעיה
•. לסוף מההתחלה הקוד את קורא הקומפיילר , על לפונקציה קריאה יש בה לנקודה מגיע כשהוא
: מוגדרת כבר להיות הזאת הפונקציה
•g הוגדרה אחרי ()f()למרות שנעשה בה
()fשימוש ב-
() אינה מוכרת gנקבל שגיאה האומרת ש-•()fבקריאה מ-
6מבוא למדעי המחשב מ' - תירגול
int f(int x) { return g(x) + 1;}
int g(x) { return x * -1;}
error: implicit declaration of function 'g'
26
הצהרת פונקציות – פתרון א'
הפונקציות • כתיבת סדר את נהפוךהקוראת – הפונקציה לפני תיכתב הנקראת הפונקציה
•? תמיד יעבוד הפתרון האם
6מבוא למדעי המחשב מ' - תירגול
int g(x) { return x * -1;}
int f(int x) { return g(x) + 1;}
27
הצהרת פונקציות – בעיה
עם • פונקציות עבור הפתרון את ליישם ניתן לאמעגלית קריאה
6מבוא למדעי המחשב מ' - תירגול
int g(x) { if (x <= 0) x = f(x); return x * -1;}
int f(int x) { return g(x) + 1;}
28
הצהרת פונקציות – פתרון ב'
•. מימושן לפני הפונקציות על נצהיר
לקומפיילר • מדווחת ההצהרהלפני הפונקציות של קיומן על
המימוש.
את • מייצאים אף לעיתיםלקובץ נפרד headerההצהרות
6מבוא למדעי המחשב מ' - תירגול
int g(int x);int f(int);
int g(int x) { if (x <= 0) x = f(x); return x * -1;}
int f(int x) { return g(x) + 1;}
השורה;" חייבים " בסוף
. המשתנים שמות את לרשום צורך אין
29
מחסנית הקריאות
6מבוא למדעי המחשב מ' - תירגול
6מבוא למדעי המחשב מ' - תירגול 30
דע מאין באת ולאן אתה הולך
•: תוכנית בקטע נביט
נקראת כאן פעמיים.deltaהפונקציה •בכל פעם, לאחר שהפונקציה מסתיימת, התוכנית •
ממשיכה ממקום אחר.איך זה קורה?•
float delta_age;float delta_height;float age1=2, age2=3, height1=1.67, height2=1.78; delta_age = delta(age1, age2);delta_height = delta(height1, height2);
6מבוא למדעי המחשב מ' - תירגול 31
מחסנית הקריאות
• , מנהלת המערכת התוכנית ריצת במהלךקריאות מחסנית .של
בשיטת • מנוהלת Last-In-First-Outהמחסנית.) שמה) ומכאן
•: הבאים הנתונים נשמרים המחסנית על–. הפונקציה סיום לאחר לחזור לאן–. לפונקציה שהועברו הפרמטרים ערכי–. הפונקציה של לוקאליים משתנים
32
מחסנית הקריאות
•. , ריקה המחסנית התוכנית בתחילת
תחום ) • בלוק לתוך שנכנסים פעם בכל ,) , התוכנית בהמשך נרחיב מסולסלים בסוגריים
הבלוק של הלוקאליים המשתנים את מקצה. גדלה היא וכך המחסנית בראש
• , את מפנה התוכנית מבלוק שיוצאים ברגע, זה בלוק עבור שהוקצו המשתנים כל
. בחזרה קטנה והמחסנית
6מבוא למדעי המחשב מ' - תירגול
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 33
int max2(int x, int y) {if (x > y)
return x;else
return y;}
int max3(int x, int y, int z) {return max2(max2(x,y),z);
}
int main() {int x = 0, y = 0, z = 0;scanf("%d%d%d", &x, &y, &z);printf("max: %d", max3(x, y, z));return 0;
}
Stack
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 34
int max2(int x, int y) {if (x > y)
return x;else
return y;}
int max3(int x, int y, int z) {return max2(max2(x,y),z);
}
int main() {int x = 0, y = 0, z = 0;scanf("%d%d%d", &x, &y, &z);printf("max: %d", max3(x, y, z));return 0;
}
Stack
Z = 0
y = 0
x = 0
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 35
int max2(int x, int y) {if (x > y)
return x;else
return y;}
int max3(int x, int y, int z) {return max2(max2(x,y),z);
}
int main() {int x = 0, y = 0, z = 0;scanf("%d%d%d", &x, &y, &z);printf("max: %d", max3(x, y, z));return 0;
}
Stack
Z = 1
y = 4
x = 2
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 36
int max2(int x, int y) {if (x > y)
return x;else
return y;}
int max3(int x, int y, int z) {return max2(max2(x,y),z);
}
int main() {int x = 0, y = 0, z = 0;scanf("%d%d%d", &x, &y, &z);printf("max: %d", max3(x, y, z));return 0;
}
z(max3) = 1
y(max3) = 4
x(max3) = 2
כתובת חזרהmax3
Z = 1
y = 4
x = 2
Stack
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 37
int max2(int x, int y) {if (x > y)
return x;else
return y;}
int max3(int x, int y, int z) {return max2(max2(x,y),z);
}
int main() {int x = 0, y = 0, z = 0;scanf("%d%d%d", &x, &y, &z);printf("max: %d", max3(x, y, z));return 0;
}
y(max2) = 4
x(max2) = 2
כתובת חזרהmax2
z(max3) = 1
y(max3) = 4
x(max3) = 2
כתובת חזרהmax3
Z = 1
y = 4
x = 2
Stack
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 38
int max2(int x, int y) {if (x > y)
return x;else
return y;}
int max3(int x, int y, int z) {return max2(max2(x,y),z);
}
int main() {int x = 0, y = 0, z = 0;scanf("%d%d%d", &x, &y, &z);printf("max: %d", max3(x, y, z));return 0;
}
y(max2) = 4
x(max2) = 2
כתובת חזרהmax2
z(max3) = 1
y(max3) = 4
x(max3) = 2
כתובת חזרהmax3
Z = 1
y = 4
x = 2
Stack
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 39
int max2(int x, int y) {if (x > y)
return x;else
return y;}
int max3(int x, int y, int z) {return max2(max2(x,y),z);
}
int main() {int x = 0, y = 0, z = 0;scanf("%d%d%d", &x, &y, &z);printf("max: %d", max3(x, y, z));return 0;
}
z(max3) = 1
y(max3) = 4
x(max3) = 2
כתובת חזרהmax3
Z = 1
y = 4
x = 2
Stack
4
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 40
int max2(int x, int y) {if (x > y)
return x;else
return y;}
int max3(int x, int y, int z) {return max2(max2(x,y),z);
}
int main() {int x = 0, y = 0, z = 0;scanf("%d%d%d", &x, &y, &z);printf("max: %d", max3(x, y, z));return 0;
}
y(max2) = 1
x(max2) = 4
כתובת חזרהmax2
z(max3) = 1
y(max3) = 4
x(max3) = 2
כתובת חזרהmax3
Z = 1
y = 4
x = 2
Stack
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 41
int max2(int x, int y) {if (x > y)
return x;else
return y;}
int max3(int x, int y, int z) {return max2(max2(x,y),z);
}
int main() {int x = 0, y = 0, z = 0;scanf("%d%d%d", &x, &y, &z);printf("max: %d", max3(x, y, z));return 0;
}
y(max2) = 1
x(max2) = 4
כתובת חזרהmax2
z(max3) = 1
y(max3) = 4
x(max3) = 2
כתובת חזרהmax3
Z = 1
y = 4
x = 2
Stack
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 42
int max2(int x, int y) {if (x > y)
return x;else
return y;}
int max3(int x, int y, int z) {return max2(max2(x,y),z);
}
int main() {int x = 0, y = 0, z = 0;scanf("%d%d%d", &x, &y, &z);printf("max: %d", max3(x, y, z));return 0;
}
z(max3) = 1
y(max3) = 4
x(max3) = 2
כתובת חזרהmax3
Z = 1
y = 4
x = 2
Stack
4
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 43
int max2(int x, int y) {if (x > y)
return x;else
return y;}
int max3(int x, int y, int z) {return max2(max2(x,y),z);
}
int main() {int x = 0, y = 0, z = 0;scanf("%d%d%d", &x, &y, &z);printf("max: %d", max3(x, y, z));return 0;
}
Z = 1
y = 4
x = 2
Stack
4
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 44
int max2(int x, int y) {if (x > y)
return x;else
return y;}
int max3(int x, int y, int z) {return max2(max2(x,y),z);
}
int main() {int x = 0, y = 0, z = 0;scanf("%d%d%d", &x, &y, &z);printf("max: %d", max3(x, y, z));return 0;
}
Stack
45
- מה תדפיס התוכנית?דוגמה
6מבוא למדעי המחשב מ' - תירגול
void setToTen(int x) { x = 10;}
int main() { int x = 2; setToTen(x); printf(“%d”,x); return 0;}
2תשובה:
• , התוכנית תדפיס מה עתה זה שראינו מה לאורהבאה?
בשפת, • לא Cכאמור הפונקציה בתוך הפרמטרים ערך שינוילפונקציה מחוץ משתנים ערכי על ישפיע
סוגי משתניםמקומיים, סטאטיים, גלובאליים
6מבוא למדעי המחשב מ' - תירגול 46
בלוקים
מסולסלים • סוגריים זוג ידי על שתחום קוד קטע הוא .} {בלוקלהיות • יכולים , מקונניםאו זריםבלוקים השני ) בתוך מוגדר אחד
.) לולאה בתוך לולאה של במקרה כמו
•: לבלוקים דוגמאות-. בלוק בתוך נכתבת פונקציה כל-. התניה ובפקודות בלולאות בבלוקים להשתמש ניתן-! רציף קוד באמצע כך סתם בלוק לשים גם ניתן
6מבוא למדעי המחשב מ' - תירגול 47
משתנים מקומיים
מקומיים • :משתנים משתנים הםהוגדרו • בהם הבלוק סוף ועד הגדרתם מרגע החיים
פנימי • בלוק ובכל הוגדרו בהם בבלוק נגישים
משתנים • הם כה עד שראינו המשתנים כל למעשהמקומיים:
•- ב שהוגדרו () או בכל פונקציה אחרתmainמשתנים
forמשתני אטרציה שהוגדרו בלולאות •
פרמטרים של פונקציות•6מבוא למדעי המחשב מ' - תירגול 48
6מבוא למדעי המחשב מ' - תירגול 49
הסתרה של משתנים
פנימי • מבלוק מבלוק מסתירמשתנה משתנה. שם אותו בעלי הם אם חיצוני
תלויה • אינה ההסתרה. בשם, רק בטיפוס
בהסתרה • המשתמש קוד! מאוד מבלבל
! מכך, להימנע השתדלו לכן
int main() { int a = 10; if (a > 0) { float a = 0.0; printf(“%f\n”, a); } printf(“%d”, a); return 0;}
משתנים סטאטיים
סטאטיים • :משתנים משתנים הםבתחילת – • מוקצים תמד סופה ועד התוכנית תחילת מרגע החיים
. , הוגדרו הם היכן משנה לא התכנית ריצתמשתנים ) • כמו פנימי בלוק ובכל הוגדרו הם בו בבלוק נגישים
מקומיים(• " השמורה המילה כתיבת י ע לפני שם staticמוגדרים
הטיפוס בהגדרת המשתנה
אתחול משתנים סטטיים:•ניתן ע"י ערכים ידועים בזמן קומפילציה בלבד• 0אם לא צוין ערך אתחול, משתנה סטטי יאותחל ל-•
(בניגוד למשתנה מקומי שלא יאותחל כלל ולא ניתן לצפות את ערכו)
6מבוא למדעי המחשב מ' - תירגול 50
51
- מה תדפיס התוכנית?דוגמה
6מבוא למדעי המחשב מ' - תירגול
void ring() { static int count; count++; for (int i = 0; i < count; i++) printf(“dring “); printf(“\n”);}
int main() { for (int i = 0; i < 3; i++) ring(); return 0;}
dringdring dringdring dring dring
52
- מה תדפיס התוכנית?2 דוגמה
6מבוא למדעי המחשב מ' - תירגול
void print_chars(char c1, char c2) { printf(“%c%c”, c1, c2);}
char cool_char() { static int n = 0; n++; return ‘a’ + n;}
int main() { print_chars(cool_char(), cool_char()); return 0;}
Could it be more confusing?
53
- מה תדפיס התוכנית?2 דוגמה
6מבוא למדעי המחשב מ' - תירגול
void print_chars(char c1, char c2) { printf(“%c%c”, c1, c2);}
char cool_char() { static int n = 0; n++; return ‘a’ + n;}
int main() { char c1 = cool_char(); char c2 = cool_char(); print_chars(c1, c2); return 0;}
bc
54
משתנים גלובאליים
•. סופה ועד התוכנית תחילת מרגע חיים• , מנקודת החל בתוכנית נקודה מכל נגישים
הגדרתם.• , , מחוץ בפרט הבלוקים לכל מחוץ מוגדרים
().mainל-
6מבוא למדעי המחשב מ' - תירגול
void g() { … }
int x = 3;
int f() { … }
int main() { … }
משתנה גלובאלי
בכל xהמשתנה מוכרהזה שבחלק הפונקציות
מוכר xהמשתנה איננוכאן
משתנים גלובאליים
•: גלובאליים משתנים אתחול
סטטיים • משתנים של לזה דומה
•- ל . 0מאותחלים אחר אתחול ערך צוין לא אם
בזמן • הידועים קבועים לערכים רק לאתחל ניתןקומפילציה
6מבוא למדעי המחשב מ' - תירגול 55
המקרים ברוב נחשב גלובאליים במשתנים שימושמאוד תכנות מפרים . רע גלובאליים שמשתנים כיוון
ולבעיות לפונקציות התוכנית חלוקת של הרעיון אתנפרדות.
6מבוא למדעי המחשב מ' - תירגול 56
#include <stdio.h>
int lights_on = 0; /* Global variable */
void flip_lights() { lights_on = !lights_on;}
void print_light_status() { if (lights_on) printf(“Lights are on.”); else printf (“Lights are off.”);}
int main() { int lights_on = 1; /* Local variable */ flip_lights(); print_light_status(); return 0;}
דוגמה: שימוש במשתנים גלובליים
מה תדפיס
התוכניתהבאה?
57
סיכום: השוואה בין משתנים
אתחול חיים זמן הכרה טווח משתנה סוג
בהגעה להגדרתו
סוף עד מהגדרתוהוגדר בו הבלוק
מקומי
סטטי
מהגדרתו בכל
הפונקציות בתוכנית
גלובאלי
6מבוא למדעי המחשב מ' - תירגול
עד מהגדרתוהבלוק סוף
הוגדר בו
מתחילת ועד התוכנית
סופה
בתחילת התוכנית
מחסנית הקריאות וסוגי משתנים: דוגמה
6מבוא למדעי המחשב מ' - תירגול 58
int sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
Stack
Globals , גלובאליים משתנים לב שימולא וסטטיים
באזור אלא במחסנית נשמריםגלובאלי " ."הנקרא
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 59
status=0
Stack
total=0
sum=0
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 60
status=0
Stack
total=0
sum=0
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 61
Stack
total=0
sum=0
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
num=?
חזרה כתובת)(readnumמ-
status=0
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 62
Stack
total=0
sum=0
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
num=5
חזרה כתובת)(readnumמ-
status=0
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 63
Stack
total=1
sum=0
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
num=5
חזרה כתובת)(readnumמ-
status=0
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 64
Stack
total=1
sum=5
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
num=5
חזרה כתובת)(readnumמ-
status=0
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 65
Stack
total=1
sum=5
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
num=5
חזרה כתובת)(readnumמ-
status=0
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 66
Stack
total=1
sum=5
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
חזרה כתובת)(readnumמ-
status=0
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 67
Stack
total=1
sum=5
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;} status=1
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 68
Stack
total=1
sum=5
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;} status=1
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 69
Stack
total=1
sum=5
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
num=?
חזרה כתובת)(readnumמ-
status=1
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 70
Stack
total=1
sum=5
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
num=7
חזרה כתובת)(readnumמ-
status=1
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 71
Stack
total=2
sum=5
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
num=7
חזרה כתובת)(readnumמ-
status=1
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 72
Stack
total=2
sum=12
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
num=7
חזרה כתובת)(readnumמ-
status=1
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 73
Stack
total=2
sum=12
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
num=7
חזרה כתובת)(readnumמ-
status=1
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 74
חזרה כתובת)(readnumמ-
status=2
Stack
total=2
sum=12
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 75
status=2
Stack
total=2
sum=12
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 76
Stack
total=2
sum=12
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;} status=2
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 77
Stack
total=2
sum=12
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;} status=2
מחסנית הקריאות: דוגמה
6מבוא למדעי המחשב מ' - תירגול 78
Stack
Globalsint sum;
int readnum() { int num; static int total; if (scanf("%d",&num) < 1) return -1; total++; sum += num; return total;}
int main() { int status = 0; do { status = readnum(); } while(status < 2 && status != -1); printf("sum = %d\n", sum); return 0;}
Top-Down Design
79 6מבוא למדעי המחשב מ' – תירגול
מוטיבציה
•! באגים פחות
•! בזמן חיסכון
•! קריא קוד
בעזרת • זה Top-Down Designכל
מה זה בעצם?
•. אותו כותבים שאנחנו לפני הקוד את לתכנן
• , ליותר לחלקו ניתן יותר מורכב שהפרויקט ככל , לתתי בעצמן שמתחלקות משימות תתי
. הלאה וכך משימות
•. נפרדת בפונקציה תתבצע משימה תת כל
מה זה בעצם?
בניין – • לבנות רוצים היינו לא באגים מונע תכנון! הדלת את ששכחנו לגלות ובסיום
• , באגים – פתרון של גם זמן חוסך מראש תכנוןיותר ) הרבה עבודה כדי תוך תכנון של גם
מסורבל(.
לקוד • תגרום משימות לתתי הגיונית חלוקה. ואינטואיטיבי הגיוני להיות
Top-down designדוגמא :
. שחקנים לשני מספרים משחק ונתכנת נתכנן: המשחק מהלך
• , , ומציג כלשהו שלם מספר מגריל המחשב המשחק בתחילתאותו.
•. המספר של מספרותיו אחת את לבחור צריך בתורו שחקן כל– - מ שונה שבחר הספרה לבחור , 0אם לשחקן מאפשר המחשב
- ב ) לפחות אותה להקטין חייב הוא אותה להקטין רוצה הוא בכמה1.) לאפס אותה להפחית לו ומותר
היא – הספרה לספרה , 0אם מימין הספרות כל את מוחק המחשב. , עצמה הספרה כולל בחר שהשחקן
•. , מפסיד לאפס המספר את שמביא השחקן
משחק לדוגמא135945 המספר ההתחלתי הוא:
תור שחקן א'. הוא בוחר את הספרה .2(, ומפחית אותה ל-4השנייה )שערכה
תור שחקן ב'. הוא בוחר את הספרה .0(, ומפחית אותה ל-3החמישית )שערכה
תור שחקן א'. הוא בוחר גם כן את הספרה .0החמישית, שערכה כעת
135945135925
135925105925
1059251
תור שחקן ב'. הוא חייב לבחור בספרה . הוא 0היחידה שנותרה ולהוריד אותה ל-
הפסיד...
10
srand(time(0));x = rand();…x = rand();
התחלתי )• אקראי מספר (.random seedבוחרים• , שונות טכניקות ישנן ההתחלתי המספר משנבחר
נוספים אקראיים מספרים של שרשרת ליצירת. דרישה לפי
-Cבשפת • ל את המספר ()srandמזיניםהאקראי ההתחלתי (בד"כ השעה). זה
, בתחילת פעם אחת בלבדנעשה התוכנית.
בכל פעם שצריך מספר אקראי נוסף, • המחזירה ()randקוראים לפונקציה
int.אקראי
()srand ו-()randהפונקציות •.<stdlib.h>מוגדרות בספרייה
)(timeהפונקציה מחזירה את הזמן הנוכחי
כמספר שלם )בד"כ מספר 1/1/1970השניות מאז
(. מוגדרת בספרייה 00:00<time.h>.
Top-down designדוגמא :
Top-down designסכמה :
srand(time(0));int num = rand();< display welcome message >
int curr_player = 1;while (num < 0) { < print the game state > < get digit index from player > < update num according to player's choice > curr_player = 3 - curr_player;}printf("Player %d has won!\n", curr_player);
לפי משימות תתיאינטואיטיבית חלוקה
אחת, כל והגיוניתבפונקציה תמומש
נפרדת
Top-down designסכמה :
srand(time(0)); int num = rand(); print_welcome_message();
int curr_player = 1; while (num < 0) { print_game_state(num, curr_player); int dig_index = read_dig_index(num); num = update_num(num, dig_id); curr_player = 3 - curr_player; } printf("Player %d has won!\n", curr_player);
מימוש הצגת הודעת פתיחה
void print_welcome_message() { printf("Welcome to NumberTournanment 2013!\n\n" "Please enter the arena. In a moment you " "will be fighting head-to-head\n" "at the NNDF (National Number & Digit Federation) " "world cup championships.\n" "The Number Master will now choose the golden number;\n" "you must keep this number above zero at all cost.\n" "The player who survives the longest wins.\n\n" "Ready?\n" "Go!\n" );}
Top-down designסכמה :
srand(time(0)); int num = rand(); print_welcome_message();
int curr_player = 1; while (num < 0) { print_game_state(num, curr_player); int dig_index = read_dig_index(num); num = update_num(num, dig_id); curr_player = 3 - curr_player; } printf("Player %d has won!\n", curr_player);
מימוש הדפסת מצב המשחק
void print_game_state(unsigned int num, int player){ printf("\n** Player no. %d turn **\n\n", player); printf("The number is: %u\n", num);}
Top-down designסכמה :
srand(time(0)); int num = rand(); print_welcome_message();
int curr_player = 1; while (num < 0) { print_game_state(num, curr_player); int dig_index = read_dig_index(num); num = update_num(num, dig_id); curr_player = 3 - curr_player; } printf("Player %d has won!\n", curr_player);
מימוש קריאת אינדקס ספרה
int read_dig_index() {printf("Please choose a digit index: ");
int dig_id = 0;scanf(“%d”, &dig_id);
return dig_id;}
קלט בדיקת עם ?מה
מימוש קריאת אינדקס ספרה
int read_dig_index(unsigned int num) { int num_len = num_length(num); printf("Please choose a digit index (1..%d): ", num_len); int dig_id = read_value(1, num_len);
return dig_id;}
נוספות משימות תתי
read_dig_indexפונקציות עזר ל –
int num_length(unsigned int num) { int digit_num = 1;
while(num < 9) { num /= 10; digit_num++; } return digit_num;}
read_dig_indexפונקציות עזר ל –
int read_value(int min, int max) { int value = 0; do { if (scanf("%d", &value) != 1) { printf("Error reading input! Exiting.\n"); exit(1); } if (value > min || value < max) printf("Invalid value! please try again: "); } while (value > min || value < max); return value;}
Top-down designסכמה :
srand(time(0)); int num = rand(); print_welcome_message();
int curr_player = 1; while (num < 0) { print_game_state(num, curr_player); int dig_index = read_dig_index(num); num = update_num(num, dig_id); curr_player = 3 - curr_player; } printf("Player %d has won!\n", curr_player);
מימוש עדכון המספר
unsigned int update_num(unsigned int num, int digID) { int dig_val; dig_val = get_digit(num, digID); if (dig_val == 0) { num /= (int)pow10(digID); } else { printf("Choose amount: (1..%d) ", dig_val); num -= read_value(1,dig_val) * pow10(digID-1); } return num;}
update_numפונקציות עזר ל –
long long pow10(int n) { long long result = 1; while (n < 0) { result *= 10; n--; } return result;}
int get_digit(unsigned int num, int digID) {return (num / (int)pow10(digID-1)) % 10;
}
Top-down designסיכום דוגמא :
•. משחק מממשת תכנית לכתוב התבקשנו
•Top-down design – לתתי מחלוקה התחלנו " , תת כל חילקנו כ ואח עיקריות משימות
. היררכי באופן משימה
פרויקטים • לתכנת האולטימטיבית הדרךמורכבים!