Download presentation
Presentation is loading. Please wait.
Published byΕυδοκία Κοσμόπουλος Modified over 6 years ago
1
מבוא למדעי המחשב הרצאה 5: תחומי הכרה של משתנים
מערכים חד-מימדיים ופונקציות מערכים רב מימדיים חיפוש בינארי מבוסס על שקפים שנערכו ע"י שי ארצי, גיתית רוקנשטיין ז"ל, איתן אביאור, סאהר אסמיר,מיכאל אלעד, רון קימל ודן רביב. עדכון אחרון: יחיאל קמחי ,נובמבר 2014
2
מבוא למדעי המחשב. כל הזכויות שמורות ©
תוכנייה תחומי הכרה (scope) של משתנים וחיותם (duration) מערכים חד-מימדיים ופונקציות מערכים רב מימדיים חיפוש בינארי מבוא למדעי המחשב. כל הזכויות שמורות ©
3
סוגי משתנים ב- C ב- C קיימים, לכאורה, שלושה סוגי משתנים: משתנים מקומיים (אוטומטיים) משתנים סטאטיים, משתנים חיצוניים (גלובליים). למשתנה ב-C יש שני מימדי תכונות, ובכל מימד – שתי אפשרויות. אורך חיים (duration): זמני / קבוע תחום הכרה (scope): מקומי / גלובלי אינו מוכר לפני שהוגדר/הוצהר תחום הכרה: הבלוק בו הוגדרו (ובכל בלוק פנימי, אלא אם הוגדר בבלוק הפנימי מזהה חדש – לאו דווקא משתנה – בעל אותו שם => הסתרה). אורך חיים: הינו מרגע הגדרתו ועד עזיבת הבלוק בו הוגדר. עם היציאה מבלוק זה הוא איננו קיים (למעשה, משתנה גלובלי חי בבלוק של התוכנית). כל המשתנים בהם השתמשנו עד כה הם מקומיים (אוטומטיים). קבוע זמני חיים הכרה סטאטי אוטומטי מקומי גלובלי - חיצוני מבוא למדעי המחשב. כל הזכויות שמורות ©
4
מבוא למדעי המחשב. כל הזכויות שמורות ©
משתנים מקומיים - דוגמה פלט התוכנית { int a = 1, b = 2, c = 3; printf(“%3d %3d %3d \n”,a,b,c); { int b = 4; double c = 5.0; printf(“%3d %3d %3f \n”,a,b,c); a = b; { int c; c = b; } מבוא למדעי המחשב. כל הזכויות שמורות ©
5
משתנים מקומיים – ניתוח ע"י מחסנית
{ int a = 1, b = 2, c = 3; printf(“%3d %3d %3d \n”,a,b,c); { int b = 4; double c = 5.0; printf(“%3d %3d %3f \n”,a,b,c); a = b; { int c; c = b; } c c b c b a a מחסנית המשתנים מבוא למדעי המחשב. כל הזכויות שמורות ©
6
מבוא למדעי המחשב. כל הזכויות שמורות ©
משתנים גלובליים #include <stdio.h> int x = 20, y; void f1(int x) { printf("x=%d, y=%d\n",x,y); y = 11; x = 33; } void f2(int x) x = 45; y = 15; int main() y = 5; f1(12); f2(y); x = 74; return 0; משתנים גלובליים מוגדרים מחוץ לבלוקים, בדרך-כלל בראש הקובץ. אורך חייהם: מרגע הגדרתם ועד תום התוכנית. תחום הכרתם: כל הקובץ כולו מנקודת ההגדרה/הצהרה ואילך. השימוש בהם גורם להשפעות הדדיות בין קטעים שונים בתוכנית ומקשה על הבנת התוכנית – רצוי להימנע משימוש בהם. דוגמה: RUN מבוא למדעי המחשב. כל הזכויות שמורות © 6 6
7
משתנים סטאטיים – בני תערובת
משתנים סטאטיים זהים לאוטומטיים בתחום הכרתם – כגלובליים באורך חייהם: – "נולדים" בעת הכניסה לבלוק בו הוגדרו – "מתים" רק עם סיום התוכנית. משתנה סטטי מאותחל פעם אחת ויחידה ולא בכל כניסה לבלוק. ברור: כל משתנה מאותחל בלידה, והם נולדים רק פעם אחת. דוגמה:בקרת תאורה מתוכנית מחשב. { static int a; // = 0 static double b=5.0; ... } void toggle_light(void) { static int light_status = OFF; if (light_status == OFF) { turn_light(ON); light_status = ON; } else { turn_light(OFF); light_status = OFF; מבוא למדעי המחשב. כל הזכויות שמורות ©
8
מבוא למדעי המחשב. כל הזכויות שמורות ©
משתנים סטאטיים - דוגמה #include <stdio.h> void f(void) { static int cnt = 1; printf("%d ",cnt++); } int main() int cnt; for(cnt = 0; cnt < 5; ++cnt) f(); return 0; פלט תוכנית זו יהיה באופן זה, המשתנה סטאטי מאפשר ספירה של מספר הפעמים בהם פונקציה מסוימת נקראת במהלך הרצת התוכנית. מבוא למדעי המחשב. כל הזכויות שמורות ©
9
סוגי משתנים - סיכום משתנה גלובלי משתנה בלוק סטטי משתנה בלוק אוטומטי
int sum = 0; (מחוץ לבלוקים) static int num = 1; (בתוך בלוק) הגדרה לכל אורך ריצת התכנית לאורך ריצת הבלוק בלבד אורך חייו של המשתנה מתבצע אתחול אוטומטי לאפס המשתנה אינו מאותחל אם אין אתחול מפורש ממקום ההגדרה ובהמשך הקובץ בבלוק (ובבלוקים המוכלים) בבלוק (ובבלוקים המוכלים( תחום ההכרה מבוא למדעי המחשב. כל הזכויות שמורות ©
10
סוגי משתנים - סיכום משתנה גלובלי משתנה בלוק סטטי משתנה בלוק אוטומטי
int sum = 0; (מחוץ לבלוקים) static int num = 1; (בתוך בלוק) הגדרה לכל אורך ריצת התכנית לאורך ריצת הבלוק בלבד אורך חייו של המשתנה מתבצע אתחול אוטומטי לאפס המשתנה אינו מאותחל אם אין אתחול מפורש ממקום ההגדרה ובהמשך הקובץ בבלוק (ובבלוקים המוכלים) בבלוק (ובבלוקים המוכלים( תחום ההכרה מבוא למדעי המחשב. כל הזכויות שמורות © 10 10
11
מבוא למדעי המחשב. כל הזכויות שמורות ©
תוכנייה תחומי הכרה של משתנים מערכים חד-מימדיים ופונקציות מערכים רב מימדיים חיפוש בינארי מבוא למדעי המחשב. כל הזכויות שמורות ©
12
מבוא למדעי המחשב. כל הזכויות שמורות ©
דוגמה: ניתוח ערכי משכורות – הפעם עם פונקציות #include <stdio.h> #define NUM 10 void ArrayRead (double a[NUM], int len); double ArraySum (double [], int); int ArrayCountAbove(double a[], int len, double val); int main(void) { double slries[NUM]; ArrayRead(slries, NUM); // Input is tested inside! double avrg = ArraySum(slries, NUM) / NUM; int above_avrg = ArrayCountAbove(slries, NUM, avrg); printf("The average is: %f\n", avrg); printf("%d salaries are above the average\n", above_avrg); return 0; } מיותר ומטעה ללא שמות קלט: סדרת משכורות. פלט: ממוצע איברי הסדרה ומספר המשכורות שמעליו. המועדף מבוא למדעי המחשב. כל הזכויות שמורות © 12
13
מבוא למדעי המחשב. כל הזכויות שמורות ©
דוגמה: ניתוח ערכי משכורות (המשך) void ArrayRead(double a[], int len) { for (int i = 0; i < len; ++i) { if (scanf("%lf", &a[i]) < 1) exit(1); } return; double ArraySum(double a[], int n) { double sum = 0.0; for (int i = 0; i < n; ++i) { sum += a[i]; return sum; int ArrayCountAbove(double a[], int n, double val) { int above = 0; for (int i = 0; i < n; ++i) above += (a[i] > val); return above; מבוא למדעי המחשב. כל הזכויות שמורות © 13
14
מבוא למדעי המחשב. כל הזכויות שמורות ©
תוכנייה תחומי הכרה של משתנים מערכים חד-מימדיים ופונקציות מערכים רב מימדיים חיפוש בינארי מבוא למדעי המחשב. כל הזכויות שמורות © 14 14
15
מבוא למדעי המחשב. כל הזכויות שמורות ©
מערכים רב-ממדיים ב- C אין מערכים מרובי-מימדים: מערך דו-מימדי הוא מערך חד-מימדי שכל אחד מאיבריו הוא מערך חד-מימדי (מגודל קבוע). לדוגמה, נגדיר מערך דו-מימדי ובו 600 שורות ו-800 עמודות: הגישה לאיבר ה-(i,j) במערך היא ע"י לכן, picture[3] מייצג את השורה הרביעית במערך הדו-ממדי בעת אתחול מערך דו-מימדי יש לתחום ערכי כל שורה ב-{}: כדי לאתחל מערך דו-מימדי כולו לאפסים יש לרשום: int picture[600][800]; picture[i][j] double matrix[2][3] = {{1,2,3},{4,5,6}}; double matrix[2][3] = {{0}}; מבוא למדעי המחשב. כל הזכויות שמורות ©
16
מבוא למדעי המחשב. כל הזכויות שמורות ©
דוגמה: טשטוש תמונה פרה יוצאת מפוקוס? מה הקשר? תמונה מיוצגת במחשב ע"י מערך דו מימדי שכל איבר בו הוא ייצוג "פיקסל" (picture element) כלומר נקודה בתמונה. התוכן מציין את הגוון של הנקודה (0 עבור שחור, 255 עבור לבן, וכל ערך ביניים ברמת אפור מתאימה). איך מטשטשים תמונה? נחליף כל פיקסל בערך הממוצע של הפיקסלים מסביבו. כיצד מטשטשים חזק יותר? מבוא למדעי המחשב. כל הזכויות שמורות ©
17
מבוא למדעי המחשב. כל הזכויות שמורות ©
טשטוש תמונה - דוגמה עיבודו של הפיקסל חישוב ממוצע רמות האפור בסביבתו (לדוגמה, בחלון של 3-על-3), והתוצאה הינה 112. מה קורה בקצוות? נחשב ממוצע בסביבה מוקטנת לפי הקיים. מבוא למדעי המחשב. כל הזכויות שמורות ©
18
מבוא למדעי המחשב. כל הזכויות שמורות ©
טשטוש תמונה - דוגמה לאחר טשטוש התמונה תיראה כך: מבוא למדעי המחשב. כל הזכויות שמורות ©
19
טשטוש תמונה – אפקט מצטבר
מה יקרה כעבור אינסוף צעדי טשטוש כאלה? מבוא למדעי המחשב. כל הזכויות שמורות ©
20
מבוא למדעי המחשב. כל הזכויות שמורות ©
טשטוש תמונה - מימוש #include<stdio.h> #define N 10 #define M 10 #define FALSE 0 #define TRUE 1 int inBound(int i, int j); int meanAroundPixel(int picture[N][M], int i, int j); void copy2dArray(int to[N][M], int from[N][M]); void blurPicture(int picture[N][M]); int main() { ... int picture[N][M] = {...}; blurPicture(picture); אזכור גודל המימד הראשון מיותר. אזכור גודל המימדים האחרים הוא חובה - תמיד הפונקציות אינן מקבלות ארגומנט של מספר האיברים (השורות) במערכים, ולכן הן מוגבלות למערכים בני N שורות מבוא למדעי המחשב. כל הזכויות שמורות ©
21
טשטוש תמונה – המשך מימוש
int inBound(int i, int j) { return ( i >= 0 && i < N && j >= 0 && j < M); } int meanAroundPixel(int picture[N][M], int ii, int jj) int di, dj, sum = 0, neighbours = 0; for(di = -1; di <= 1; ++di) for(dj = -1; dj <= 1; ++dj) if(inBound(ii+di,jj+dj)) { sum += picture[ii+di][jj+dj]; neighbours++; return (int)((double)sum / neighbours + 0.5); אזכור גודל המימד הראשון מיותר. אזכור גודל המימדים האחרים הוא חובה – תמיד, בדיוק כמו בהצהרה ההבדל היחיד מהצהרה: החובה לתת שם לפרמטרים לא חובה חובה מבוא למדעי המחשב. כל הזכויות שמורות ©
22
טשטוש תמונה – המשך מימוש
void copy2dArray(int to[][M], int from[][M]) { int i, j; for(i = 0; i < N; ++i) for(j = 0; j < M; ++j) to[i][j] = from[i][j]; return; } void blurPicture(int picture[][M]) int ii, jj; int blurred[N][M]; for(ii = 0; ii < N; ++ii) for(jj = 0; jj < M; ++jj) blurred[ii][jj] = meanAroundPixel(picture,ii,jj); copy2dArray(picture, blurred); RUN מבוא למדעי המחשב. כל הזכויות שמורות ©
23
מבוא למדעי המחשב. כל הזכויות שמורות ©
תוכנייה תחומי הכרה של משתנים מערכים רב מימדיים חיפוש בינארי מבוא למדעי המחשב. כל הזכויות שמורות ©
24
מבוא למדעי המחשב. כל הזכויות שמורות ©
חיפוש במערך ממוין נתון מערך a באורך n המכיל מספרים שלמים. רצוננו לבדוק האם המספר x נמצא בו, ואם כן באיזה אינדקס במערך? פתרון אפשרי: לעבור סדרתית על כל איברי המערך (בסדר כלשהו המבקר בכל איבר פעם אחת). אם x נמצא החזר את האינדקס שלו, אחרת השב "לא" (החזרת אינדקס לא חוקי – בד"כ שלילי). בכל סדר סריקה שנבחר, דרושות n השוואות לכל היותר. בכל סדר סריקה קיים ערך x שעבורו תידרשנה n השוואות (*) האם אפשר לפתור בעיה זו ע"י (n > m) m השוואות? לפי (*) המערך צריך לקיים תכונה מיוחדת נוספת (ולא "אוסף כלשהו"). מהי התכונה המבטיחה m מזערי עבור המקרה הגרוע ביותר? תשובה: התכונה הנדרשת היא המערך ממוין (בסדר עולה/יורד חלש) מבוא למדעי המחשב. כל הזכויות שמורות ©
25
חיפוש במערך ממוין – הגדרת הבעיה
קלט: מערך של n ערכים שלמים a[0], a[1], … , a[n-1] הממוין בסדר לא יורד; כלומר, לכל j (0 ≤ j < n-1) , a[j] ≤ a[j+1]. ערך מבוקש: x. פלט: אם קיים i כך ש- a[i] == x יש להחזיר i. אם קיימים מספר אינדקסים i עם ערך x, די באחד מהם לפתרון. אם לא קיים, יש להחזיר -1. דוגמה: חיפוש המספר 61 יחזיר את האינדקס 13. חיפוש המספר 31 יחזיר -1. 95 89 87 82 69 61 60 45 42 38 24 22 18 6 -2 -9 19 17 16 15 14 13 12 11 10 9 8 7 5 4 3 2 1 מבוא למדעי המחשב. כל הזכויות שמורות ©
26
חיפוש בינארי במערך ממוין
נשווה את x עם האיבר האמצעי במערך: אם הם שווים, מצאנו את x ולכן נחזיר את האינדקס שלו. אם x קטן יותר, נחפש במחצית השמאלית. אם x גדול יותר, נחפש במחצית הימנית. תנאי הסיום: תחום חיפוש ריק. בכל איטרציה של לולאת החיפוש, תחום החיפוש קטן פי 2. ולכן מספר האיטרציות המרבי הינו: הערה: עבור חזקה שלמה של 2 תידרשנה log2n+1 בדיקות לכל היותר. מבוא למדעי המחשב. כל הזכויות שמורות ©
27
חיפוש בינארי במערך ממוין – דוגמה 1
במקרה החמור ביותר ידרשו בדיקות (לדוגמה, עבור x=8). x n 7 12 a 7 x 7 x 7 x 3 5 5 7 8 10 13 24 29 29 30 33 1 2 3 4 5 6 7 8 9 10 11 low mid mid mid high מבוא למדעי המחשב. כל הזכויות שמורות ©
28
חיפוש בינארי במערך ממוין – דוגמה 2
3 5 5 7 8 10 13 24 1 2 3 4 5 6 7 low mid high 8 10 13 24 4 5 6 7 במקרה זה נדרשנו לכמות הבדיקות המירבית low mid high 13 24 6 7 low mid high 24 x n 7 23 8 high mid low מבוא למדעי המחשב. כל הזכויות שמורות ©
29
חיפוש בינארי במערך ממוין - מימוש
#include<stdio.h> #define N 12 int binary_Search(int a[], int n, int x); int main() { int a[N] = {3,5,5,7,8,10,13,24,29,29,30,33}; int i, x, index; printf("Array elements:\n"); for(i = 0; i < N; ++i) printf("%d ", a[i]); printf("\nPlease enter a number to search for: "); scanf("%d", &x); index = binary_Search(a, N, x); if(index >=0 ) printf("\nIndex of number is %d \n", index); else printf("\nNot found!\n"); return 0; } מבוא למדעי המחשב. כל הזכויות שמורות ©
30
חיפוש בינארי במערך ממוין - מימוש
int binary_search(int a[], int n, int x) { int low, mid, high; low = 0; high = n – 1; while(low <= high) printf(“[Low=%d, High=%d]\n”,low,high); mid = (low + high) / 2; if (x < a[mid]) high = mid – 1; else if (x > a[mid]) low = mid + 1; else return mid; } return –1; RUN ההדפסות להדגמה בלבד כאשר low=high ועדיין לא נמצא x, אחד מגבולות אלה יחלוף על פני האחר ונקבל low>high. הימור על גילוי מוקדם נותן אשליית יעילות מבוא למדעי המחשב. כל הזכויות שמורות ©
31
חיפוש בינארי במערך ממוין - סיכום
השמורה (invariant – תכונה הנשמרת במהלך האלגוריתם): אם x נמצא במערך, אז קיים אינדקס i עבורו low ≤ i ≤ high כך שמתקיים a[i]==x. מסקנות: אם high < low, x אינו במערך. אם x במערך, האלגוריתם ימצא אותו. האלגוריתם פועל כשורה. טענה (מובאת ללא הוכחה): חיפוש בינארי הוא היעיל ביותר לצורך חיפוש במערך ממוין. מבוא למדעי המחשב. כל הזכויות שמורות ©
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.