מבוא למדעי המחשב הרצאה 7: מבנים מבוסס על השקפים שנערכו שי ארצי, גיתית רוקנשטיין, איתן אביאור, וסאהר אסמיר, מיכאל אלעד, רון קימל וניר אילון עדכון אחרון.

Slides:



Advertisements
Similar presentations
Processes and threads. תהליכים ותתי תהליכים תהליכים –כל תוכנית שרצה היא תהליך (process) –ניתן להתפצל מתהליך אחד למספר תהליכים, בעזרת הפקודה fork(). הרבה.
Advertisements

תוכנה 1 סמסטר א ' תשע " ב תרגול מס ' 7 * מנשקים, דיאגרמות וביטים * לא בהכרח בסדר הזה.
מבוא למדעי המחשב לתעשייה וניהול
בתרגול הקודם הורשה: –ניתן להרחיב רק מחלקה אחת –כל מה שלא private – עובר בהורשה –המילה השמורה super –יצירת היררכיה –Object היא שורש ההיררכיה –דריסה אופרטור.
1 Formal Specifications for Complex Systems (236368) Tutorial #4 Refinement in Z: data refinement; operations refinement; their combinations.
טבלאות סמלים נכתב ע"י אלכס קוגן סמסטר חורף, תשס"ח.
Pointers הרצאה קריטית. השאלות הפתוחות מה זה ה- & שמופיע ב scanf מדוע כשמעבירים מחרוזת ל scanf אין צורך ב & האם ניתן להכריז על מערך שגדלו אינו ידוע בתחילת.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
1 מבוא למדעי המחשב משתנים. 2  סוגי משתנים בשפת C  ההבדלים בין סוגי המשתנים השונים.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Map-Reduce Input: a collection of scientific articles on different topics, each marked with a field of science –Mathematics, Computer Science, Biology,
1 Formal Specifications for Complex Systems (236368) Tutorial #5 Refinement in Z: data refinement; operations refinement; their combinations.
מבוא למדעי המחשב תרגול 4 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא למדעי המחשב © אריק פרידמן 1 מצביעים כמערכים דוגמה.
תרגול חזרה. מבנה האובייקט תאר את מבנה האובייקט כולל מבנה טבלאות הפונקציות הוירטואליות עבור התכנית הבאה struct A { int x; virtual void a() {}; }; struct.
1 מבוא למדעי המחשב ביטויים. 2 ביטויים expressions ביטויים (expressions) הינם יצורים תחביריים בעלי טיפוס וערך. הגדרה אינדוקטיבית של ביטויים : קבועים הם.
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
מבני בקרה מבוא לתכנות למנע " ס - שבוע מספר 3 - מאיר קומר - סמסטר ב ' - תשס " ו הסתעפות “ אם השמאל ואימנה ואם הימין ואשמאילה ”
מנפה שגיאות - DEBUGGER מבוא למדעי המחשב (234114) רועי מלמד
תכנות תרגול 10 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
תכנות תרגול 5 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Last time on Clang משתנה: "פתק" המשמש את המחשב לשמירת מידע. לכל משתנה יש שם וטיפוס כללים לשמות משתנים –חייבים להכיל רק אותיות, מספרים ו '_' –חייבים להתחיל.
מבוא למדעי המחשב, סמסטר א ', תשע " א תרגול מס ' 1 נושאים  הכרת הקורס  פסאודו - קוד / אלגוריתם 1.
תוכנה 1 - תרגול שיעור 10 Pointers (2) שולי לב יהודי
מבוא כללי למדעי המחשב הקצאת זיכרון דינאמית
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
Safari On-line books. מה זה ספארי ספארי זו ספריה וירטואלית בנושא מחשבים היא כוללת יותר מ כותרים כל הספרים הם בטקסט מלא ניתן לחפש ספר בנושא מסוים.
מבוא למדעי המחשב תרגול 12 – הקצאת זיכרון דינאמית שעת קבלה : יום שני 11:00-12:00 דוא " ל :
1 מבוא למדעי המחשב רקורסיה. 2 רקורסיה היא שיטה לפתרון בעיות המבוססת על העיקרון העומד ביסוד אינדוקציה מתמטית: אם ידועה הדרך לפתור בעיה עבור המקרים הבסיסיים.
Structure. מה לומדים היום ? דרך לבנות מבנה נתונים בסיסי – Structure מייצר " טיפוס " חדש מתאים כאשר רוצים לאגד כמה משתנים יחד דוגמאות : עובד : שם, טלפון,
הגדרת משתנים יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר.
1 מבוא למדעי המחשב הרצאה 21: Queue, Iterator & Iterable.
קורס תכנות שיעור שמיני: הקצאת זיכרון דינאמית, הצצה לייצוג ועיבוד תמונות 1.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 7. סברוטינות subroutines.
מחסנית ותור Stacks and Queues. מחסנית Stack מחסנית - Stack ADT סוג של מערך מוגבל מהיר מאוד ותופס מעט זיכרון שימוש ב LIFO – LIFO (Last In, First Out)
קורס תכנות שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 6. מפעל השעווה – לולאות  עד עכשיו  טיפלנו בייצור נרות מסוג אחד, במחיר אחיד  למדנו להתמודד עם טיפול במקרים שונים.
1 מבוא למדעי המחשב הרצאה 5: פונקציות. 2 מבוא לפונקציות חלוקה של אלגוריתם לתת משימות: משימה - פונקציה: דוגמאות מציאת המקסימלי מבין שני איברים האינדקס של.
הגדרת משתנים יום שלישי 14 יוני 2016 יום שלישי 14 יוני 2016 יום שלישי 14 יוני 2016 יום שלישי 14 יוני 2016 יום שלישי 14 יוני 2016 יום שלישי 14 יוני 2016.
מחרוזות – הטיפוס String
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Object Oriented Programming
Object Oriented Programming
Operators Overloading
Object Oriented Programming
Object Oriented Programming
מחלקות classes.
מבוא למדעי המחשב סיבוכיות.
מצביעים קרן כליף.
SQL בסיסי – הגדרה אינדוקטיבית
תירגול 14: מבני נתונים דינאמיים
קורס תכנות – סמסטר ב' תשס"ח
מבוא למדעי המחשב הרצאה 5: תחומי הכרה של משתנים
מבנים קרן כליף.
מצביעים קרן כליף.
הקצאת זיכרון דינאמית מבוא כללי למדעי המחשב
Engineering Programming A
Programming in C תרגול Introduction to C - Fall Amir Menczel.
מחסנית ותור Stacks and Queues.
מבוא למדעי המחשב מצביעים.
תירגול 8:מצביעים והקצאה דינאמית
Computer Programming תרגול 3 Summer 2016
Engineering Programming A
Presentation transcript:

מבוא למדעי המחשב הרצאה 7: מבנים מבוסס על השקפים שנערכו שי ארצי, גיתית רוקנשטיין, איתן אביאור, וסאהר אסמיר, מיכאל אלעד, רון קימל וניר אילון עדכון אחרון סמסטר חורף 2013

מבוא למדעי המחשב. כל הזכויות שמורות ©2 תוכנייה מבנים –הגדרה ודוגמאות פשוטות –דוגמאות יותר מעניינות

תוכנה לניהול עסק מבוא למדעי המחשב. כל הזכויות שמורות ©3 #define NUM 1000 #define MAX _ STR 100 int main() { char employee_names[NUM][MAX_STR]; char employee_ids[NUM][MAX_STR]; double empoyee_salaries[NUM]; int employee_birth_years[NUM]; int employee_birth_months[NUM]; int employee_birth_days[NUM]; char employee_address_cities[NUM][MAX_STR]; char employee_address_streets[NUM][MAX_STR]; int employee_address_house_numbers[NUM];... }

מבוא למדעי המחשב. כל הזכויות שמורות ©4 מבנים (Structure) מבנה הוא אוסף של משתנים מטיפוסים זהים או שונים המקובצים יחד תחת שם אחד. מבנים תורמים לארגון נוח יותר של המידע כיוון שהם מאפשרים להתייחס למספר משתנים הקשורים זה בזה כאל יחידה אחת. המבנה מהווה טיפוס חדש.

מבוא למדעי המחשב. כל הזכויות שמורות ©5 הכרזה על מבנים struct { ;... ; }; #define NAME_SIZE 20 #define ID_SIZE 10 struct address { char city[NAME_SIZE]; char street[NAME_SIZE]; int house_number; }; struct employee { char name[NAME_SIZE]; char id[ID_SIZE]; double salary; struct date birth_date; struct address addr; }; struct date { int day, month, year; };

מבוא למדעי המחשב. כל הזכויות שמורות ©6 גישה לשדות במבנה המשתנים day, month, year של struct date נקראים שדות (members). ניתן להתייחס אל שדה במבנה ע"י אופרטור ". " –לדוגמה: אם d הוא משתנה מטיפוס struct date, כלומר הגדרנו, אזי d.day הינו שדה day במבנה d. –האופרטור ". " הינו בעל הקדימות הגבוהה ביותר, כמו זו של ( ), והאסוציאטיביות שלו הינה משמאל לימין:. ההשמה struct_name.member_name = x מעתיקה את תוכן המשתנה x לתוך השדה member_name במבנה struct_name. struct date { int day, month, year; }; struct date d; emp.addr.city

מבוא למדעי המחשב. כל הזכויות שמורות ©7 דוגמה לשימוש במשתנים מטיפוס מבנה int main() { struct date d1 = {2, 5, 1975}; struct address home = {"Los-Angeles", “Kipling", 711}; struct employee beckham; strcpy(beckham.name, "David Beckham"); strcpy(beckham.id, " "); beckham.salary = ; beckham.birth_date = d1; beckham.addr = home;... return 0; } נשענים על ההגדרות הקודמות struct employee { char name[NAME_SIZE]; char id[ID_SIZE]; double salary; struct date birth_date; struct address addr; };

מבוא למדעי המחשב. כל הזכויות שמורות ©8 העברת מבנים לפונקציות by-value כאשר קוראים לפונקציה earlier_date(), מועתקים שני משתני מבנה מטיפוס date_t. עם החזרת הערך מהפונקציה earlier_date() מתבצעת העתקת מבנה. typedef struct date date_t; date_t earlier_date(date_t d1, date_t d2) { if ( d1.year < d2.year ) return d1; if ( d1.year > d2.year ) return d2; if ( d1.month < d2.month ) return d1; if ( d1.month > d2.month ) return d2; return (d1.day < d2.day) ? d1 : d2; }

מבוא למדעי המחשב. כל הזכויות שמורות ©9 העברת מבנים לפונקציות by-address כדי לחסוך בהעתקות ניתן להעביר מבנים באמצעות מצביעים. האופרטור " -> " מאפשר לגשת, בצורה נוחה, לשדות של המבנה שכתובתו נתונה במצביע ( p->m שקול ל - (*p).m ). קדימות האופרטור " -> " הינה כשל האופרטור ". ". boolean before(date_t* pd1, date_t* pd2) { if((pd1->year year) || ((pd1->year == pd2->year) && (pd1->month month)) ||...))) return TRUE; return FALSE; }

מבוא למדעי המחשב. כל הזכויות שמורות ©10 מערך של משתנים מטיפוס מבנה – דוגמה struct employee beckham, employees[NUM_OF_EMPL]; double sum = 0; int counter = 0;... for(i = 0; i < NUM_OF_EMPL; i++) { if(before(&employees[i].date, &beckham.date)) { sum += (employees + i)->salary; counter ++; } return sum / counter; מה מחשב קטע הקוד ?

מבוא למדעי המחשב. כל הזכויות שמורות ©11 גודל של מבנים #define NAME_SIZE 20 #define ID_SIZE 10 struct date { int day, month, year; }; struct address { char city[NAME_SIZE]; char street[NAME_SIZE]; int house_number; }; struct employee { char name[NAME_SIZE]; char id[ID_SIZE]; double salary; struct date birth_date; struct address addr; }; sizeof (struct date) = ? sizeof (struct address) = ? sizeof (struct employee) = ? 3 * sizeof (int) = 12 2 * 20 * sizeof (char) + sizeof (int) = * sizeof (char) + 10 *sizeof (char) + sizeof (double) + sizeof (struct date) + sizeof (struct address) = =94 השוויונות המסומנים הם תלויי מערכת

סיכום: מה (לא) ניתן לעשות עם מבנים ארגומנט לפונקצייה ערך חזרה מפונקציה אופרטור השמה פוינטר ל.. מערך של.. גישה לשדה אריתמטיקה לוגיקה השוואה מבוא למדעי המחשב. כל הזכויות שמורות ©12 void print_address(struct address A) { printf("%s\n%s\n%d\n", A.city, A.street, A.house_number); } struct address get_office_address() { struct address A = {"New York", "Wall Street", 20}; return A; } int main() { struct address A1; struct address A2; struct address* pA; struct address addresses[100]; A1 = get_office_address(); A2 = A1; pA = &A1; }

השוואה בין מבנים אופרטור השוואה (==) לא מוגדר על מבנים ניתן להשתמש ב memcmp (מוגדר ב stdlib.h) 14 הרצאהמבוא למדעי המחשב. כל הזכויות שמורות ©13 struct A { char *s; }; struct B { int n; }; int main() { struct A A1,A2; struct B B1,B2; char S1[]="hello"; char S2[]="hello"; A1.s=S1; A2.s=S2; printf("%d\n", memcmp(&A1, &A2, sizeof(struct A)))); B1.n = 10; B2.n = 10; printf("%d\n", memcmp(&B1, &B2, sizeof(struct B)));... } int memcmp (void* m1, void* m2, int n); מחזיר 0 אם ורק אם שני שטחי הזיכרון הנתונים זהים מה יודפס?

מבוא למדעי המחשב. כל הזכויות שמורות ©14 תוכנייה מבנים –הגדרה ודוגמאות פשוטות –דוגמאות יותר מעניינות: זיכרון גדל דינמית מחסנית

זיכרון גדל דינמית במקרים רבים אנו מקצים זיכרון באופן דינמי ומגלים בהמשך שהזיכרון לא מספיק אפשרות מעשית היא, בכל פעם שרוצים עוד זיכרון, להקצות זיכרון בגודל כפול מבוא למדעי המחשב. כל הזכויות שמורות ©15

זיכרון גדל דינמית מבוא למדעי המחשב. כל הזכויות שמורות ©16 #define INITIAL_SIZE 6... int *mem; int *tmp; int i; int size = INITIAL_SIZE; mem = malloc(size * sizeof(int));... tmp = malloc(2 * size * sizeof(int)); for (i = 0; i < size; i++) tmp[i] = mem[i]; free(mem); mem = tmp;

זיכרון גדל דינמית: מימוש באמצעות struct נרצה לחזור ולהשתמש בזיכרון גדל דינמית שוב ושוב נכתוב ספריית פונקציות ומבנה נתונים ש"מסתירה" את המימוש הספריה תתמוך בפעולות הבאות: –אתחול זיכרון גדל דינמית –הכפלת הזיכרון –שחרור זיכרון גדל דינמית מבוא למדעי המחשב. כל הזכויות שמורות ©17

זיכרון גדל דינמית: מימוש באמצעות struct מבוא למדעי המחשב. כל הזכויות שמורות ©18 struct doubling_memory { int *mem; int capacity; }; typedef struct doubling_memory DM; int DM_init(DM* dm, int capacity) { dm->capacity = capacity; dm->mem = malloc(sizeof(int) * capacity); if (!dm->mem) return 0; return 1; } void DM_free(DM* dm) { free(dm->mem); } int DM_double(DM* dm) { int i; int *tmp = malloc(sizeof(int) * 2 * dm->capacity); if (!tmp) return 0; for (i = 0; i capacity; i++) tmp[i] = dm->mem[i]; free(dm->mem); dm->capacity *= 2; dm->mem = tmp; return 1; }

מחסנית (stack) מחסנית הינה תור שעובד לפי כלל LIFO: Last In First Out למחסנית יש שתי פעולות: –push(X): הכנס את הערך X –pop(): החזר את הערך האחרון שהוכנס והוצא אותו מהמחסנית דוגמא: push(5) push(10) pop() push(20) pop() מבוא למדעי המחשב. כל הזכויות שמורות © ERROR returned value: 10 returned value: 20 returned value: 5

מבוא למדעי המחשב. כל הזכויות שמורות ©20 תוכנייה מבנים –הגדרה ודוגמאות פשוטות –דוגמאות יותר מעניינות: זיכרון גדל דינמית מחסנית

מחסנית (stack) אין לדעת מראש לכמה שטח תזדקק המחסנית כדאי להשתמש בזיכרון גדל דינמית מבוא למדעי המחשב. כל הזכויות שמורות ©21 struct stack { DM dm; int size; }; typedef struct stack STACK; הגודל הנוכחי של המחסנית DM dm int *mem int capacity int size STACK

מחסנית (stack) מבוא למדעי המחשב. כל הזכויות שמורות ©22 #define INITIAL STACK_SIZE int STACK_init(STACK* s) { s->size = 0; return DM_init(&(s->dm), INITIAL_STACK_SIZE); } int STACK_push(STACK* s, int value) { if(s->size == s->dm.capacity) { if (!DM_double(&(s->dm))) return 0; } s->dm.mem[s->size] = value; s->size++; return 1; } int STACK_pop(STACK* s, int *value) { if(s->size == 0) return 0; s->size--; *value = s->dm.mem[s->size]; return 1; } void STACK_free(STACK* s) { DM_free(&(s->dm)); }

מחסנית (stack) - שימוש מבוא למדעי המחשב. כל הזכויות שמורות ©23 int main() { STACK s; int value; char command[10]; if(!STACK_init(&s)) { printf ("Error: No memory for init.\n"); return -1; } HERE: handle push, pop commands STACK_free(&s); return 0; } while(1) { scanf("%10s", command); if (strcmp(command, "push") == 0) { scanf("%d", &value); if (!STACK_push(&s, value)) { printf ("Error: No mem.\n"); return -1; } } else if(strcmp(command, "pop") == 0) { if (!STACK_pop(&s, &value)) { printf ("Error: Stack empty.\n"); return -1; } printf ("%d\n", value); } else break; } RUN