תכנות תרגול 14 שבוע : 31.5.05. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע את הוספת האיברים בצורה נוחה יותר. מבנה זה.

Slides:



Advertisements
Similar presentations
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
Advertisements

רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
תכנות תרגול 11 שבוע : מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.
תכנות תרגול 7 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא.
תכנות תרגול 9 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
תכנות תרגול 6 שבוע : חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה n n.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
תכנות תרגול 4 שבוע : לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
תכנות תרגול 2 שבוע : שבוע שעבר כתבו תוכנית המגדירה שלושה משתנים מאתחלת אותם ל 1 2 ו 3 ומדפיסה את המכפלה שלהם את ההפרש שלהם ואת הסכום שלהם.
מבוא לשפת 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 תרגול
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
תכנות – שיעור 7. חזרה -מערכים נגדיר בעזרתו קבוצת משתנים כאשר יהיה לנו מספר רב של משתנים זהים נגדיר בעזרתו קבוצת משתנים כאשר יהיה לנו מספר רב של משתנים.
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 14 שבוע:
תכנות תרגול 10 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
מערכים מבוא לתכנות למנע"ס - שבוע מספר 8 - מאיר קומר - סמסטר ב' - תשס"ו והנה בעיה כתוב תוכנית אשר תקלוט 36 מספרים ותדפיס כמה מתוכם גדולים יותר מהממוצע.
מבוא כללי למדעי המחשב תרגול 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;
עקרון ההכלה וההדחה.
מערכים דו ממדי ו STRUCTS פונקציות בוליאנית Module Module1 Function Flip(ByVal word1 As String) As Boolean Dim i As Integer For i = 0 To word1.Length()
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
מבוא למדעי המחשב תרגול 9 – מערכים ומחרוזות, תרגילי חזרה שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא כללי למדעי המחשב תרגול 7. מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.
תכנות תרגול 12 שבוע : מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.
1 מבוא למדעי המחשב backtracking. 2 מוטיבציה בעיית n המלכות: נתון: לוח שחמט בגודל. המטרה: לסדר על הלוח n מלכות כך שאף אחת לא תאיים על השנייה. דוגמא: עבור.
תכנות תרגול 8 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא.
Structure. מה לומדים היום ? דרך לבנות מבנה נתונים בסיסי – Structure מייצר " טיפוס " חדש מתאים כאשר רוצים לאגד כמה משתנים יחד דוגמאות : עובד : שם, טלפון,
הגדרת משתנים יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר.
Dynamic Allocation. Malloc - Reminder void* malloc(unsigned int nBytes); Used to dynamically allocate nBytes in memory Returns a pointer to the allocated.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
1 רשימות טיפוס נתונים מסוג רשימה (enumeration) הוא אוסף של שמות שהם הערכים האפשריים עבור טיפוס זה. enum היא מילה שמורה המגדירה טיפוס שכזה. הערכים מוגדרים.
מבנה נתונים ואלגוריתמים ) לשעבר - עיבוד מידע( ד"ר אבי רוזנפלד ד"ר אריאלה ריכרדסון.
Programming Pointers. נדגים היום בעזרת מצביעים העברת משתנים לפונקציה שמשנה אותם  פונקציה שמקבלת מצביעים לסמן תא בזיכרון  פונקציה שמחזירה מצביע מערך.
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
Programming Arrays.
מבני נתונים רשימה מקושרת, מחסנית ותור
הרצאה 10 פונקציות עם מספר משתנה של פרמטרים
מבוא למדעי המחשב סיבוכיות.
מערכים ומצביעים הקצאה דינאמית של מערכים דו-מימדיים
מיונים וחיפושים קרן כליף.
שיעור חמישי: מערכים ומחרוזות
מצביעים קרן כליף.
מערכים קרן כליף.
תירגול 14: מבני נתונים דינאמיים
הרצאה 06 רשימות מקושרות קרן כליף.
קורס תכנות שיעור 11: הסוף.
מצביעים קרן כליף.
מערכים ומטריצות קרן כליף.
Engineering Programming A
בניית מחסנית סטטית Static Stack Implementation מורים מובילים תשע"ה
שאלה 1.
מבוא כללי למדעי המחשב תרגול 4
תרגול 8 תחומי הכרה פונקציות
מבוא כללי למדעי המחשב תרגול 6
מערכים של מצביעים הקצאה דינאמית
תירגול 8:מצביעים והקצאה דינאמית
שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב
מבוא לתכנות ב- Java תרגול 10 - רשימות מקושרות.
Presentation transcript:

תכנות תרגול 14 שבוע :

רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע את הוספת האיברים בצורה נוחה יותר. מבנה זה נקרא רשימה מקושרת. איבר מידע מצביע לאיבר מצביע לראש הרשימה איבר מידע מצביע לאיבר איבר מידע מצביע לאיבר איבר מידע מצביע לאיבר איבר מידע מצביע לאיבר

struct list { int data; int data; struct list *next; struct list *next;}; typedef strcut list Item; מידע מצביע לאיבר פעולות על הרשימה : יצירה והריסה של רשימה ספירת מספר האיברים ברשימה חיבור שתי רשימות מחיקה / הוספה של איבר לרשימה הדפסת רשימה

רשימות מקושרות ב -C  נחזיק מצביע אשר יהיה מצביע לראש הרשימה וישב ב main.  תהיה לנו פונקצית הוספה אשר תוסיף איברים לרשימה בסוף הרשימה.  הפונקציה תדע לקבל מצביע לראש הרשימה וערך להוספה ותוסיף את האיבר בסוף הרשימה.

איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 7 איבר מידע מצביע לאיבר 5 רשימות מקושרות ב -C int main() { Item *L_head = NULL; L_head = Add(L_head,5); L_head = Add(L_head,3); L_head = Add(L_head,7); } מצביע לראש הרשימה

Item* Add(Item* L_head, int value) { Item* L_tail = L_head; Item* L_tail = L_head; Item* I_new = malloc(sizeof (Item)); Item* I_new = malloc(sizeof (Item)); I_new->value = value; I_new->value = value; I_new->next = NULL; I_new->next = NULL; if (L_tail == NULL) return I_new; while (L_tail->next != NULL) L_tail=L_tail->next; L_tail=L_tail->next; L_tail->next = I_new; L_tail->next = I_new; return L_head; return L_head;}

איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 7 איבר מידע מצביע לאיבר 5 רשימות מקושרות ב -C int main() { Item *L_head = NULL; … L_head = Delete(L_head,3); } מצביע לראש הרשימה

Item *Delete(Item * head,int value) { Item* curr = head; Item* prev = head; if (curr->value == value) { curr = curr->next; free(head); return curr; } האיבר למחיקה הוא הראשון

while (curr != NULL) { if (curr->value == value) { prev->next = curr->next; free(curr); return head; } prev = curr; curr = curr->next; } return head; } חיפוש ומחיקת איבר

כתוב פונקציה המקבלת מצביע לרשימה וסופרת כמה איברים יש ברשימה כתוב פונקציה המקבלת מצביע לרשימה וסופרת כמה איברים יש ברשימה

int Count(Item * L) { int counter=0; while (L) { counter++; L=L->next; } return counter; } int CountR(Item * L) { if (L == NULL) return 0; return 1 + CountR(L->next); }

כתוב פונקציה המקבלת מצביעים לשתי רשימות מקושרות ומחברת אותן. איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 7 איבר מידע מצביע לאיבר 5 רשימה 1 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 5 רשימה 2 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 7 איבר מידע מצביע לאיבר 5 איבר מידע מצביע לאיבר 3 איבר מידע מצביע לאיבר 5

Item* Meld(Item* L1,Item* L2) { Item* L1_head = L1; if (L1 == NULL) return L2; if (L2 == NULL) return L1; while (L1->next != NULL) L1=L1->next; L1->next = L2; return L1_head; }

מערכים דו מימדים ניתן להכליל את המערך הרגיל של C ( החד מימדי ) למספר רב של מימדים. אנחנו נראה כיצד להכליל את המערכים שלמדנו לשני מימדים. נחשוב על מערכים דו מימדים כעל טבלה שלה עמודות ושורות.

מערכים דו מימדים a[0][0]a[0][1]a[0][2]a[0][3] a[1][0]a[1][1]a[1][2]a[1][3] a[2][0]a[2][1]a[2][2]a[2][3] שורה 0 שורה 1 שורה 2 עמודה 0 עמודה 1 עמודה 2 עמודה 3 שם המערך אינדקס שורה אינדקס עמודה

מערכים דו מימדים הגדרת מערך דו מימדי תתבצע כך : int main() { int a[3][4]= { {1,2,3,4},{5,6,7,8},{9,10,11,12} }; int a[3][4]= { {1,2,3,4},{5,6,7,8},{9,10,11,12} };} שם המערך מספר שורות מספר עמודות אתחול שורה אתחול שורה אתחול שורה 2

#include #include #define ROW 3 #define COLUMN 4 int main() { inta[ROW][COLUMN]= {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; inta[ROW][COLUMN]= {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int i, j; int i, j; for ( i = 0; i < ROW; i++ ) for ( i = 0; i < ROW; i++ ) { for ( j = 0; j < COLUMN; j++ ) for ( j = 0; j < COLUMN; j++ ) printf( "%4d", a[ i ][ j ] ); printf( "%4d", a[ i ][ j ] ); printf( "\n" ); printf( "\n" ); } return 0; } מעבר על השורות הדפסת כל שורה

מערכים דו מימדים ופונקציות כיצד נעביר מערך דו מימדי לפונקציה כך שהפונקציה תדע שמדובר במערך דו - מימדי ? כשדיברנו על מערכים רגילים אמרנו שצרך להעביר מצביע לראש המערך ואת גודל המערך. מה נעביר לפונקציה בבואנו להעביר מערך דו מימדי ?

void printArray(int a[][ COLUMN ], int size ) { int i, j; int i, j; for ( i = 0; i < size; i++ ) for ( i = 0; i < size; i++ ) { for ( j = 0; j < COLUMN; j++ ) for ( j = 0; j < COLUMN; j++ ) printf( "%4d", a[ i ][ j ] ); printf( "%4d", a[ i ][ j ] ); printf( "\n" ); printf( "\n" ); }} מעבר על השורות הדפסת כל שורה

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

מערכים דו מימדים ופונקציות כדי לגשת לתא a[1][1] צריך לדעת שהשורה ה 0 מכילה 3 תאים למעשה מה שמתבצע בפועל זה a[row][col] a[row*COLUMN+col] a[1][1] a[1*COLUMN+1] אשליה מציאות

#include #include #define ROW 3 #define COLUMN 4 void printArray(int [][ COLUMN ], int ); int main() { int array1[ ROW ][ COLUMN ] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int array1[ ROW ][ COLUMN ] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; printf( "Values in array1 by row are:\n" ); printf( "Values in array1 by row are:\n" ); printArray( array1, ROW ); printArray( array1, ROW ); return 0; return 0;} void printArray(int a[][ COLUMN ], int size ) { int i, j; int i, j; for ( i = 0; i < size; i++ ) { for ( i = 0; i < size; i++ ) { for ( j = 0; j < COLUMN; j++ ) for ( j = 0; j < COLUMN; j++ ) printf( "%4d", a[ i ][ j ] ); printf( "%4d", a[ i ][ j ] ); printf( "\n" ); printf( "\n" ); }}

תרגיל כתוב פונקציה המקבלת מערך דו מימדי בגודל 10X10 וממלאת אותו בלוח הכפל. התוכנית תדפיס את לוח הכפל המתקבל

פתרון void fillArray( int a[][ COLUMN ], int size ) { int i, j; int i, j; for ( i = 0; i < size; i++ ) { for ( i = 0; i < size; i++ ) { for ( j = 0; j < COLUMN; j++ ) for ( j = 0; j < COLUMN; j++ ) a[ i ][ j ] = (i+1)*(j+1); a[ i ][ j ] = (i+1)*(j+1); }}

מערכים דו מימדים ומחרוזות נגדיר מערך דו מימדי שיכיל שמות. לצורך זה כל שורה במערך תהיה מחרוזת : char names[N][STR_SIZE]; Gadi\0 Rami\0 Dani\0 מה הערכים של N ו ? STR_SIZE #define N 3 #define STR_SIZE

מערכים דו מימדים ומחרוזות נכתוב פונקציה שמקבלת שם ומערך. אם השם נמצא במערך הפונקציה תסמן את השם ב *. כיצד נגדיר את הפונקציה ? void markName (char [][STR_SIZE],int size,char *name);

מערכים דו מימדים ומחרוזות void markName(char Names[][STR_SIZE],int size,char *name) { int i; for ( i = 0; i < size; i++ ) if (strcmp(Names[i],name) == 0) { strcat(Names[i],"*"); return; }

נגדיר מערך של מצביעים. char *names[N]={NULL,NULL,NULL}; names[0] = (char*)malloc(10); strcpy(names[0],”Gadi”); names[1] = (char*)malloc(10); strcpy(names[0],”Rami”); names[2] = (char*)malloc(10); strcpy(names[0],”Dani”); NULL NULL NULL Rami\0 5124Dani\0 1084Gadi\

מערכים דו מימדים ומחרוזות נכתוב פונקציה שמקבלת מערך שמות. הפונקציה בודקת לכל שם האם הוא מופיע פעם נוספת במערך. כל שם שמופיע יותר מפעם אחת מודפס בצירוף הכניסות הזהות במערך. כיצד נגדיר את הפונקציה ? void PrintSameName (char [][STR_SIZE])