שאלה 1.

Slides:



Advertisements
Similar presentations
Data Structure Lecture-5
Advertisements

ממיבחניםC שאלות ++.
מבוא למדעי המחשב לתעשייה וניהול דוגמאות ותרגול נוסף במערך חד ממדי הרצאה 12.
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 11 שבוע : מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.
תכנות תרגול 7 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא.
תכנות תרגול 6 שבוע : חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה n n.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
11 Introduction to Programming in C תרגול
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא כללי למדעי המחשב תרגול. הבית האדום כתובת : רחוב קוקוריקו 2 הבית הירוק כתובת : רחוב קוקוריקו 4 הבית הצהוב כתובת : רחוב קוקוריקו 1 הבית הורוד כתובת.
תכנות תרגול 9 שבוע : מערכים int a; a=5; int a[10]; a[2] = 5; 5 a a[0] a[1] a[2] a[9]  5 משתנה בודד מערך גישה למשתנה השלישי במערך.
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 תרגול
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site : T.A. :Emilia Katz.
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
Backpatching 1. תזכורת מתרגול קודם קוד ביניים - שפת הרביעיות שיטות לייצור קוד ביניים –שימוש בתכונת code –כתיבה ישירה ל-buffer של פקודות שיטות לתרגום מבני.
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 14 שבוע:
תכנות תרגול 10 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 14 שבוע : רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע את הוספת האיברים בצורה נוחה יותר. מבנה זה.
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
תכנות תרגול 12 שבוע : הקצאת זיכרון דינאמית הזיכרון המקסימאלי ששימש את התוכנית שלנו עד היום היה קבוע מראש. לפני הרצת התוכנית, לאחר שהתוכנית עברה.
מבוא כללי למדעי המחשב רשימות מקושרות
מבוא למדעי המחשב תרגול 6 - מערכים שעת קבלה : יום שני 11:00-12:00 דוא " ל :
תכנות תרגול 7 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא ידעו.
תכנות תרגול 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 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
מבוא כללי למדעי המחשב תרגול 7. מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.
תכנות תרגול 12 שבוע : מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.
1 Formal Specifications for Complex Systems (236368) Tutorial #3 Z introduction and notation (contd.); Birthday book example (Chapter 1 in the book)
מבוא למדעי המחשב תרגול 12 – הקצאת זיכרון דינאמית שעת קבלה : יום שני 11:00-12:00 דוא " ל :
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
Void*, pointer to functions, variadic functions קרן כליף.
Practice session 6 Sequence Operations Partial Evaluation Lazy Lists.
קורס תכנות שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
Dynamic Allocation. Malloc - Reminder void* malloc(unsigned int nBytes); Used to dynamically allocate nBytes in memory Returns a pointer to the allocated.
ממבחניםC שאלות ++. תכנות מונחה עצמים ו C++ (40 נקודות) בשאלה זאת עליכם לסייע בכתיבת תוכנית לניהול צי רכב של חברת השכרה. סעיף א' (10 נקודות): עליכם לכתוב.
Programming Pointers. נדגים היום בעזרת מצביעים העברת משתנים לפונקציה שמשנה אותם  פונקציה שמקבלת מצביעים לסמן תא בזיכרון  פונקציה שמחזירה מצביע מערך.
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.
הרצאה 10 פונקציות עם מספר משתנה של פרמטרים
מבוא למדעי המחשב סיבוכיות.
הקצאות דינאמיות בשילוב מבנים
Dynamic memory allocation and image processing
מיונים וחיפושים קרן כליף.
Exams questions examples
תירגול 14: מבני נתונים דינאמיים
הרצאה 06 רשימות מקושרות קרן כליף.
שאלות ממבחנים - ADT שאלות ממבחנים - C-Shell
קורס תכנות שיעור 13: רשימות מקושרות.
קורס תכנות שיעור 11: הסוף.
הקצאות דינאמיות קרן כליף.
מבנים קרן כליף.
Engineering Programming A
Computer Programming Summer 2017
תרגול 8 תחומי הכרה פונקציות
Introduction to Programming in C
מבוא לתכנות ב- Java תרגול 10 - רשימות מקושרות.
Presentation transcript:

שאלה 1

הגדרת השאלה אם נתונות ההגדרות הבאות: typedef struct listNode{ type data; struct listNode* next; }ListNode;   typedef struct list{ ListNode* head; ListNode* tail; }List; הערות: שימו לב ששדה ה- data ברשומה ListNode הוגדר מטיפוס type. הכוונה היא שהטיפוס type יכול להיות כל טיפוס (int, float, chat*, …). כלומר, לכל טיפוס type מוגדר אוסף הפונקציות לעיל.

ניתן להשתמש (מבלי לממש) בפונקציות להלן: List makeEmptyList(); int isEmpty(List lst); ListNode* createNode(type data, ListNode* next); void insertNodeToHead(List* lst, ListNode* newHead); void insertNodeToTail(List* lst, ListNode* newTail); List appendLists(List lst1, List lst2); הערות: אם אתם נדרשים לפונקציות עזר נוספות, ממשו אותם בעצמכם.

מעוניינים לממש רשימה של מערכים של מצביעים למספרים שלמים מעוניינים לממש רשימה של מערכים של מצביעים למספרים שלמים. המערכים עצמם יכולים לגדול ולקטון. נתונה הגדרה לאיבר ברשימה מקושרת חד-כיוונית ולרשימה של מערכים של מצביעים למספרים שלמים: typedef struct ArrayNode { int **arr;/* המערך */ int size; /* גודלו הנוכחי */ struct ArrayNode *next; /* מצביע לאיבר הבא */ } ArrayNode; typedef struct ArrayList ArrayNode *head; ArrayNode *tail; } ArrayList;

רשימה לדוגמה:

כתבו את הפונקציה: void deleteValueFromList(ArrayList *theList, int toRemove); הפונקציה מוחקת את כל המופעים של toRemove מכל המערכים שמוצבעים על ידי איברי הרשימה גודלו של מערך שנמחקו ממנו איברים יתעדכן, ואם הוא הפך להיות מערך ריק (בגודל 0) האיבר יימחק מהרשימה

למשל, אם נשלח לפונקציה את הרשימה הבאה: ואת הערך 77, הרשימה תהיה:

הפתרון

typedef struct ArrayNode { int. arr;/. המערך. / int size; / typedef struct ArrayNode { int **arr;/* המערך */ int size; /* גודלו הנוכחי */ struct ArrayNode *next; /* מצביע לאיבר הבא */ } ArrayNode; typedef struct ArrayList ArrayNode *head; ArrayNode *tail; } ArrayList; ArrayList makeEmptyList(); int isEmpty(ArrayList lst); ArrayNode* createNode(int** arr, int size, ArrayNode* next); void insertNodeToHead(ArrayList* lst, ArrayNode* newHead); void insertNodeToTail(ArrayList* lst, ArrayNode* newTail); המבנים הנתונים והפונקציות של רשימות מקושרות מותאמות לטיפוס שהוגדר בשאלה

מימושי הפונקציות של רשימות מקושרות (נתון שאין צורך לממש) ArrayList makeEmptyList() { ArrayList lst; lst.head = lst.tail = NULL; return lst; } int isEmpty(ArrayList lst) return lst.head == NULL; ArrayNode* createNode(int** arr, int size, ArrayNode* next) ArrayNode* newNode = (ArrayNode*)malloc(sizeof(ArrayNode)); newNode->arr = arr; newNode->size = size; newNode->next = next; return newNode; מימושי הפונקציות של רשימות מקושרות (נתון שאין צורך לממש)

המשך מימושי הפונקציות של רשימות מקושרות (נתון שאין צורך לממש) void insertNodeToHead(ArrayList* lst, ArrayNode* newHead) { if (isEmpty(*lst)) lst->head = lst->tail = newHead; else newHead->next = lst->head; lst->head = newHead; } void insertNodeToTail(ArrayList* lst, ArrayNode* newTail) lst->head = lst->tail = newTail; lst->tail->next = newTail; lst->tail = newTail; המשך מימושי הפונקציות של רשימות מקושרות (נתון שאין צורך לממש)

void putValuesInList(ArrayList* theList); void printArrayList(ArrayList* theList); void printArrayNode(ArrayNode* theNode); void deleteValueFromList(ArrayList *theList, int toRemove); void deleteValueFromArrayNode(ArrayNode* theNode, int value); void main() { int valueToDelete; int fContinue = 1; ArrayList theList = makeEmptyList(); putValuesInList(&theList); printArrayList(&theList); do { … } while (fContinue); // free all memory... } main לדוגמה do { printf("\nEnter value to delete, -1 to exit: "); scanf("%d", &valueToDelete); if (valueToDelete == -1) fContinue = 0; else { deleteValueFromList(&theList, valueToDelete); printf("The updated list:\n"); printArrayList(&theList); } } while (fContinue);

מימוש פונקציות העזר הקשורות להדפסת הרשימה void printArrayNode(ArrayNode* theNode) { int i; printf("Node has %d values: ", theNode->size); for (i = 0; i < theNode->size; i++) printf("%d ", *theNode->arr[i]); } void printArrayList(ArrayList* theList) ArrayNode* temp = theList->head; while (temp != NULL) printArrayNode(temp); printf("\n"); temp = temp->next; מימוש פונקציות העזר הקשורות להדפסת הרשימה

מימוש פונקציית העזר הקשורה ליצירת הרשימה void putValuesInList(ArrayList* theList) { srand((unsigned int)time(NULL)); int i, j, numOfArrays = (rand() % 10) + 1; printf("Creating %d arrays\n", numOfArrays); for (i = 0; i < numOfArrays; i++) ArrayNode* newNode = (ArrayNode*)calloc(1, sizeof(ArrayNode)); newNode->size = rand() % 10; newNode->arr = (int**)malloc(sizeof(int*)*newNode->size); for (j = 0; j < newNode->size; j++) newNode->arr[j] = (int*)malloc(sizeof(int)); *newNode->arr[j] = rand() % 10; } insertNodeToTail(theList, newNode); מימוש פונקציית העזר הקשורה ליצירת הרשימה

ולבסוף סוף-סוף, מימוש הפונקציה המבוקשת void deleteValueFromList(ArrayList *theList, int toRemove) { ArrayNode* temp = theList->head; ArrayNode* prev = theList->head; while (temp != NULL) deleteValueFromArrayNode(temp, toRemove); if (temp->size == 0) ... } else prev = temp; temp = temp->next; ולבסוף סוף-סוף, מימוש הפונקציה המבוקשת if (theList->head == theList->tail) { free(temp); prev = temp = theList->head = theList->tail = NULL; } else if (temp == theList->head) prev = theList->head = temp->next; temp = theList->head; else if (temp == theList->tail) theList->tail = prev; prev->next = temp = NULL; else prev->next = temp->next; temp = prev->next;

מימוש הפונקציה המוחקת מצומת יחיד void deleteValueFromArrayNode(ArrayNode* theNode, int value) { int i; for (i = 0; i < theNode->size; i++) if (*theNode->arr[i] == value) int j; free(theNode->arr[i]); for (j = i + 1; j < theNode->size; j++) theNode->arr[j - 1] = theNode->arr[j]; } theNode->size--; i--; מימוש הפונקציה המוחקת מצומת יחיד

שאלה 2

char ***Neighborhood; הגדרת השאלה מעוניינים לאחסן את שמות כל הדיירים בכל הבניינים בשכונה נתונה לצורך כך מגדירים את המערך:  char ***Neighborhood; המשתנה Neighborhood יהיה מערך דינמי אשר יכיל בסופו של דבר את שמות כל הדיירים בשכונה מספר השורות של המערך יהיה גדול ב-1 ממספר הבניינים בשכונה, כך שאם בשכונה ישנם m בניינים, הוא יכיל m+1 שורות והתא האחרון יהיה NULL כל בניין יכיל את שמות הדיירים בו, כך שאם בבניין ישנם k דיירים המשתנה Neighborhood יכיל k+1 עמודות והתא האחרון יהיה NULL

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

char. createNeighbourhood(); void printNeighberhood(char char*** createNeighbourhood(); void printNeighberhood(char*** neighberhood); void freeNeighberhood(char*** neighberhood); void main() { char*** neighberhood = createNeighbourhood(); printf("Orig neighberhood:\n"); printNeighberhood(neighberhood); freeNeighberhood(neighberhood); system("pause"); } main לדוגמה ליצירת שכונה, הדפסתה ושחרור ההקצאות

char. createNeighbourhood() { char char*** createNeighbourhood() { char*** neighberhood; int numOfBuildings, i, j; printf("How many buildings in the neighbourhood? "); scanf("%d", &numOfBuildings); neighberhood = (char***)calloc(numOfBuildings+1, sizeof(char**)); for (i = 0; i < numOfBuildings; i++) int numOfNeighboursInBuilding; printf("How many neighbours are there in building #%d? ", i+1); scanf("%d", &numOfNeighboursInBuilding); getchar(); // to clean the enter from the buffer neighberhood[i] = (char**)calloc(numOfNeighboursInBuilding + 1, sizeof(char*)); … } return neighberhood;

neighberhood[i] = (char neighberhood[i] = (char**)calloc(numOfNeighboursInBuilding + 1, sizeof(char*)); for (j = 0; j < numOfNeighboursInBuilding; j++) { int numOfLettesInName = 0; char temp; printf("Enter name #%d: ", j + 1); do scanf("%c", &temp); if (temp != '\n') neighberhood[i][j] = (char*)realloc(neighberhood[i][j], (numOfLettesInName + 1)*sizeof(char)); neighberhood[i][j][numOfLettesInName] = temp; } numOfLettesInName++; } while (temp != '\n'); neighberhood[i][j] = (char*)realloc(neighberhood[i][j], (numOfLettesInName) * sizeof(char)); neighberhood[i][j][numOfLettesInName-1] = '\0';

void freeNeighberhood(char void freeNeighberhood(char*** neighberhood) { int i, j; for (i = 0; neighberhood[i] != NULL; i++) for (j = 0; neighberhood[i][j] != NULL; j++) free(neighberhood[i][j]); } free(neighberhood[i]); free(neighberhood); void printNeighberhood(char*** neighberhood) { int i, j; for (i = 0; neighberhood[i] != NULL; i++) printf("Building #%d: ", i+1); for (j = 0; neighberhood[i][j] != NULL; j++) printf("%s, ", neighberhood[i][j]); } printf("\b\b \n");

סעיף ב נתונות ההגדרות הבאות: typedef struct listNode { char *data; struct listNode* next; }ListNode; typedef struct list { ListNode* head; ListNode* tail; }List; כתבו את הפונקציה: char *** collectAndRemoveNames(char ***neighborhood, List *APeople) שמקבלת שכונה ומחזירה במשתנה APeople רשימה מקושרת של שמות הדיירים המתחילים באות 'A'. מדובר בכל השמות מכל הבניינים בשכונה כמו-כן, הפונקציה תמחק את הדיירים הללו מהמערך neighborhood. במידה ובבניין מסוים נמחקו כל הדיירים, יש למחוק את הבניין ולהקטין את המערך neighborhood. ניתן להניח שלא ימחקו כל הבניינים. הפונקציה תחזיר את המערך neighborhood המעודכן.

void main() { List res; char*** neighberhood = createNeighbourhood(); printf("Orig neighberhood:\n"); printNeighberhood(neighberhood); neighberhood = collectAndRemoveNames(neighberhood, &res); printf("Neighberhood without A-names:\n"); printf("All names starting with A:\n"); printList(&res); freeNeighberhood(neighberhood); system("pause"); } char*** createNeighbourhood(); void freeNeighberhood(char*** neighberhood); void printNeighberhood(char*** neighberhood); typedef struct listNode { char *data; struct listNode* next; }ListNode; typedef struct list { ListNode* head; ListNode* tail; }List; List makeEmptyList(); int isEmpty(List lst); ListNode* createNode(char* data, ListNode* next); void insertNodeToHead(List* lst, ListNode* newHead); void insertNodeToTail(List* lst, ListNode* newTail); void printList(List* theList); char*** collectAndRemoveNames(char*** neighborhood, List *APeople);

List makeEmptyList() { List lst; lst. head = lst List makeEmptyList() { List lst; lst.head = lst.tail = NULL; return lst; } int isEmpty(List lst) return lst.head == NULL; ListNode* createNode(char* data, ListNode* next) ListNode* newNode = (ListNode*)malloc(sizeof(ListNode)); newNode->data = data; newNode->next = next; return newNode;

void insertNodeToHead(List. lst, ListNode. newHead) { if (isEmpty( void insertNodeToHead(List* lst, ListNode* newHead) { if (isEmpty(*lst)) lst->head = lst->tail = newHead; else newHead->next = lst->head; lst->head = newHead; } void insertNodeToTail(List* lst, ListNode* newTail) lst->head = lst->tail = newTail; lst->tail->next = newTail; lst->tail = newTail;

void printList(List. theList) { ListNode void printList(List* theList) { ListNode* temp = theList->head; while (temp != NULL) printf("%s, ", temp->data); temp = temp->next; } printf("\b\b \n");

char. collectAndRemoveNames(char. neighborhood, List char*** collectAndRemoveNames(char*** neighborhood, List *APeople) { int i, j, k; *APeople = makeEmptyList(); for (i=0 ; neighborhood[i] != NULL ; i++) for (j=0 ; neighborhood[i][j] != NULL ; j++) if (neighborhood[i][j][0] == 'a' || neighborhood[i][j][0] == 'A') insertNodeToTail(APeople, createNode(neighborhood[i][j], NULL)); // remove current name from building for (k = j + 1 ; neighborhood[i][k] != NULL ; k++) neighborhood[i][k - 1] = neighborhood[i][k]; } neighborhood[i][k-1] = NULL; j--; … return neighborhood;

char. collectAndRemoveNames(char. neighborhood, List char*** collectAndRemoveNames(char*** neighborhood, List *APeople) { int i, j, k; *APeople = makeEmptyList(); for (i=0 ; neighborhood[i] != NULL ; i++) for (j=0 ; neighborhood[i][j] != NULL ; j++) … } // if no names are left in the building, remove current building if (neighborhood[i][0] == NULL) free(neighborhood[i]); for (k = i + 1 ; neighborhood[i][k] != NULL ; k++) neighborhood[k - 1] = neighborhood[k]; neighborhood[k - 1] = NULL; i--; // i also holds the number of buildings neighborhood = (char***)realloc(neighborhood, sizeof(char**)*(i+1)); return neighborhood;