Engineering Programming A

Slides:



Advertisements
Similar presentations
ממיבחניםC שאלות ++.
Advertisements

1 Formal Specifications for Complex Systems (236368) Tutorial #4 Refinement in Z: data refinement; operations refinement; their combinations.
מבוא למדעי המחשב לתעשייה וניהול דוגמאות ותרגול נוסף במערך חד ממדי הרצאה 12.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
תכנות תרגול 11 שבוע : מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.
תכנות תרגול 6 שבוע : חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה n n.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
11 Introduction to Programming in C תרגול
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
1 Formal Specifications for Complex Systems (236368) Tutorial #5 Refinement in Z: data refinement; operations refinement; their combinations.
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
מבוא למדעי המחשב מחרוזות, מצביעים וכתובות
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
תכנות – שיעור 7. חזרה -מערכים נגדיר בעזרתו קבוצת משתנים כאשר יהיה לנו מספר רב של משתנים זהים נגדיר בעזרתו קבוצת משתנים כאשר יהיה לנו מספר רב של משתנים.
תכנות תרגול 14 שבוע:
תכנות תרגול 10 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
תכנות תרגול 14 שבוע : רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע את הוספת האיברים בצורה נוחה יותר. מבנה זה.
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
קורס תכנות – סימסטר ב ' תשס " ח שיעור שישי: מערכים
מבוא כללי למדעי המחשב רשימות מקושרות
מבוא למדעי המחשב תרגול 6 - מערכים שעת קבלה : יום שני 11:00-12:00 דוא " ל :
תכנות תרגול 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 משתנה: "פתק" המשמש את המחשב לשמירת מידע. לכל משתנה יש שם וטיפוס כללים לשמות משתנים –חייבים להכיל רק אותיות, מספרים ו '_' –חייבים להתחיל.
תכנות בשפת C תרגול 15 תרגול חזרה 2 תרגילים ממבחנים
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
מבוא כללי למדעי המחשב תרגול 7. מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.
תכנות תרגול 12 שבוע : מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.
מבוא למדעי המחשב תרגול 12 – הקצאת זיכרון דינאמית שעת קבלה : יום שני 11:00-12:00 דוא " ל :
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 8 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא.
Structure. מה לומדים היום ? דרך לבנות מבנה נתונים בסיסי – Structure מייצר " טיפוס " חדש מתאים כאשר רוצים לאגד כמה משתנים יחד דוגמאות : עובד : שם, טלפון,
הגדרת משתנים יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
הגדרת משתנים יום שלישי 14 יוני 2016 יום שלישי 14 יוני 2016 יום שלישי 14 יוני 2016 יום שלישי 14 יוני 2016 יום שלישי 14 יוני 2016 יום שלישי 14 יוני 2016.
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
מבני נתונים רשימה מקושרת, מחסנית ותור
Tirgul 12 Trees 1.
Computer Architecture and Assembly Language
Operators Overloading
מבוא למדעי המחשב סיבוכיות.
מערכים ומצביעים הקצאה דינאמית של מערכים דו-מימדיים
מצביעים, הקצאה דינאמית ומבנים
מצביעים קרן כליף.
SQL בסיסי – הגדרה אינדוקטיבית
תירגול 14: מבני נתונים דינאמיים
הרצאה 06 רשימות מקושרות קרן כליף.
Introduction to Programming in C
קורס תכנות – סמסטר ב' תשס"ח
מבנים קרן כליף.
פרוקטוז, C6H12O6 , חד-סוכר מיוחד
מצביעים קרן כליף.
הקצאת זיכרון דינאמית מבוא כללי למדעי המחשב
Computer Programming תרגול 9 Summer 2016
מבוא כללי למדעי המחשב תרגול 4
תרגול 8 תחומי הכרה פונקציות
מערכים של מצביעים הקצאה דינאמית
Programming in C תרגול Introduction to C - Fall Amir Menczel.
תירגול 8:מצביעים והקצאה דינאמית
Computer Programming תרגול 3 Summer 2016
Engineering Programming A
מבוא לתכנות ב- Java תרגול 10 - רשימות מקושרות.
Presentation transcript:

Engineering Programming A תרגול 10 מבנים ורשימות מקושרות 30.12.2012 Introduction to C - Fall 2010 - Amir Menczel

מטרת התרגול Typedef Structures Linked list

typedef פקודת typedef: typedef existingType newType;   המהדר יתייחס ל-newType כאל existingType - כלומר אם נגדיר משתנה מהטיפוס החדש, המהדר יתייחס אליו כאל משתנה שהוגדר לפי הטיפוס הישן. לדוגמא: typedef int* pint; pint p; int *q; משמעות: p ו-q שניהם הם משתנים מטיפוס int* מכיוון שהגדרנו את pint כ- int*. השימוש ב-typedef מאפשר להפוך את הקוד ליותר קריא מבחינת ההקשר. השימוש העיקרי ב-typedef הוא בד"כ בעת הגדרת מבנים.

structures מבנה (struct) הוא טיפוס אשר יכול להכיל מספר רב של נתונים מטיפוסים שונים. המבנה מורכב ממשתנים, שלכל אחד מהם קוראים שדה. ניתן לומר שמבנה דומה למערך בכך ששניהם יכולים לאגד מספר נתונים, אך מבנה נותן לנו גם חופש בבחירת טיפוסי הנתונים ,כלומר מבנה יכול להכיל גם float, int, double ועוד בעת ובעונה אחת תחת משתנה אחד. התבנית של מבנה: struct nameOfStruct { fields }; בהגדרת המבנה יש לכתוב את המילה השמורה struct ולאחר מכן את שם המבנה שבחרנו. חשוב ששמו של המבנה יהיה משמעותי בדיוק כמו בבחירת שמות למשתנים. בתוך הסוגריים יש לרשום את המשתנים ובסוף נקודה-פסיק.

structures לדוגמא: struct address { char city[20]; char street[20]; int houseNum; }; יצרנו מבנה של "כתובת מגורים" הכולל: שם עיר ורחוב - מחרוזות בעלות 20 תווים, ומספר בית - משתנה מסוג int. כעת נצהיר על משתנה מהטיפוס "כתובת מגורים": struct address addr; שימו לב שיותר נוח להשתמש ב-typedef באופן הבא: typedef struct address address; ורק אז להגדיר את משתנה ה-"כתובת מגורים" כך: address addr;

structures אופרטור הנקודה: כשנרצה לגשת לשדות של המשתנה addr ולעדכן אותם, נוכל לעשות זאת על ידי שימוש באופרטור הנקודה (.). לדוגמא, נציב את המספר 5 בשדה של מספר הבית באופן הבא: addr.houseNum = 5; כך ניתן לעדכן ולשנות את השדות. ניתן להצהיר על מספר משתנים מטיפוס מבנה בשורה אחת כמו שהצהרנו על משתנים פשוטים, לדוגמא: address addr1, addr2, addr3; כמו כן ניתן לאתחל מבנים כפי שאתחלנו מערך: address addr = {"Tel Aviv", "Menachem Begin", 132}; ניתן גם לבצע השמה בין מבנים, בצורה הבאה : addr1=addr2; נסכם ונאמר כי ניתן לבצע את כל הפעולות שביצענו במשתנים פשוטים על מבנה באותו אופן (הצבה כארגומנט בפונקציה, הצהרה וכו').

structures אופרטור <- : האופרטור <- מאפשר גישה לשדה של מבנה כלשהו ממצביע למבנה. לדוגמא, נגדיר מצביע למבנה address, pAddress: address addr, *pAddr; pAddr = &addr; נוכל לגשת לשדה houseNum של המבנה ע"י כתיבת: addr.houseNum = 3; או: pAddr->houseNum = 3; (*pAddr).houseNum = 3;

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

structures #include <stdio.h> typedef struct person { char name[20]; int age; } person; // by reference void getDetails (person *p) printf ("Enter name: "); gets (p->name); printf ("Enter age: "); scanf ("%d", &(p->age)); } //by value void printDetails (person p) printf("name: %s\n ", p.name); printf("age: %d\n ", p.age); void main() person pr; getDetails (&pr); printDetails (pr); הסבר: בפונקצית main() יש מבנה מסוג person, pr, ונניח שכתובת הזיכרון ממנה הוא מתחיל היא 1000. כשנפעיל את הפונקציה getDetails, נרצה שהיא תוכל לשנות את המבנה, ולכן נעביר לפונקציה את הכתובת של המשתנה pr. לפיכך, הפרמטר של הפונקציה getDetails צריך להיות כתובת - כלומר מצביע.

structures מבנה כערך המוחזר על ידי פונקציה: כאשר אנו מעוניינים לקלוט נתוני מבנה, לפעמים נעשה זאת בעזרת פונקציה המחזירה מבנה. בהצהרה על הפונקציה יש לרשום: struct nameOfStruct nameOfFunction(arguments);   תרגיל 2: שנה את הפונקציה getDetails מהתכנית הקודמת כך שתחזיר מבנה, ועדכן את ה-main בהתאם.

structures Person getDetails(){ Person pers; printf ("Enter name: "); gets (pers.name); printf ("Enter age: "); scanf ("%d", &(pers.age)); return pers; } void main(){ Person pr; pr=getDetails(); printDetails (pr);

structures מערך של מבנים: ניתן ליצור מערך של מבנים בדיוק כמו בהצהרת מערך רגיל. לדוגמא: person pr[3]; יוצר מערך של שלושה משתנים מטיפוס person . כדי לגשת לשדותיו יש לפנות קודם לאיבר במערך שבו אנו מעוניינים - לדוגמא, עבור השדה name באיבר השני של המערך, נרשום: pr[1].name תרגיל 3: שנה את התכנית הקודמת כך שתעבוד עם מערך של מבנים.

structures #include <stdio.h> typedef struct person{ char name[20]; int age; } person; void getDetails (person p[],int size){ int i; for (i=0; i<size; i++) { printf ("Enter name: "); gets (p[i].name); printf ("Enter age: "); scanf ("%d", &(p[i].age)); } void printDetails (person p[],int size){ for (i=0; i<size; i++) { printf("name: %s\n ", p[i].name); printf("age: %d\n ", p[i].age); void main(){ person pr[3]; getDetails (pr,3); printDetails (pr,3);

רשימות משורשרות typedef struct address { char city[20]; הקדמה - מבנה מקונן: שדות של מבנה יכולים להיות בעצמם מבנה לדוגמא: typedef struct address { char city[20]; char street[20]; int houseNum } address;   typedef struct person char name[20]; int age; address addr; } person; נניח כי אנו מצהירים על משתנה מסוג person: person p; כדי לגשת לשדה age נרשום : p.age כדי לגשת לשדה city נרשום: p.addr.city כלומר ראשית ניגש לשדה addr שהוא גם מטיפוס מבנה וממנו ניגש לשדות שלו שוב על ידי אופרטור הנקודה.

רשימות משורשרות typedef struct node{ int value; node *next; } node; רשימות מקושרות - הגדרה ותכונות:   רשימה מקושרת – שרשרת של מבנים. כל מבנה מכיל מצביע למבנה הבא או NULL (עבור המבנה האחרון אשר לא מצביע על המבנה הבא - כי אין כזה). לאיבר שנמצא בתחילת הרשימה נהוג לקרוא "עוגן". בניגוד למערך, אין גישה מיידית לכל איבר ברשימה באמצעות סוגריים מרובעות [], אלא באמצעות סריקה של הרשימה עד שמגיעים לאיבר המבוקש. היתרון לעומת מערך – הוספה ומחיקה יעילה של איברים. כלומר – אם נרצה למחוק איבר מאמצע מערך, נהיה חייבים ליצור עותק חדש של המערך כולו. ברשימה כל מה שנצטרך לעשות זה למחוק את האיבר שמיועד להימחק, ולקשר בין שני האיברים שמסביבו. זהו חיסכון משמעותי ביותר מבחינת זמן ריצה. typedef struct node{ int value; node *next; } node;

רשימות משורשרות תרגיל 4: כתוב פונקציה countDifItems(node *list) int המקבלת כארגומנט מצביע לרשימה מקושרת ומחזירה את מספר הערכים השונים (value) שברשימה. לדוגמה, עבור הרשימה באה:   countDifItems(head) שווה 3.

רשימות משורשרות int countDifItems(node *list) { node *temp; int found, count=0; while(list){ found = 0; temp = list; while(temp){ if(temp->value == list->value) found++; temp = temp->next; } if(found==1) count++; list = list->next; return count;

רשימות משורשרות תרגיל 5:

רשימות משורשרות typedef struct node{ int data; struct node *next; }node; node* orderList(node* head){ node* temp,*run,*odd=NULL,*even=NULL; while(head){ temp=head; head=head->next; temp->next=NULL; if(temp->data%2){ temp->next=odd; odd=temp; } else{ if(!even) even=temp; for(run=even;run->next;run=run->next); temp->next=run->next; run->next=temp; temp->value=(temp->value*2); return odd; run->next=odd; return even;

שאלה ממבחן: רשימות משורשרות

שאלה ממבחן - המשך ג'.

פתרון

שאלה ממבחן:

(! ||

פתרון