29
ללללל ללללל ללללל ללללל14 14 לללל לללל: : 25.1.04 25.1.04

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

  • View
    262

  • Download
    0

Embed Size (px)

Citation preview

Page 1: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

1414 תכנות תרגולתכנות תרגול

::שבועשבוע

25.1.0425.1.04

Page 2: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

רשימות מקושרותרשימות מקושרות

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

נוחה יותר. מבנה זה נקרא רשימה מקושרת. נוחה יותר. מבנה זה נקרא רשימה מקושרת.

איבר

מידע

מצביע לאיבר

מצביע לראש

הרשימה

איבר

מידע

מצביע לאיבר

איבר

מידע

מצביע לאיבר

איבר

מידע

מצביע לאיבר

איבר

מידע

מצביע לאיבר

5 7 1 8

Page 3: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

struct list {struct list { int data;int data; struct list *next;struct list *next;};};

typedef strcut list typedef strcut list Item;Item;

מידע

מצביע לאיבר

:פעולות על הרשימה

יצירה והריסה של רשימה•ספירת מספר האיברים ברשימה•חיבור שתי רשימות•מחיקה/הוספה של איבר לרשימה•הדפסת רשימה•

Page 4: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

CCרשימות מקושרות ב-רשימות מקושרות ב-

נחזיק מצביע אשר יהיה מצביע לראש נחזיק מצביע אשר יהיה מצביע לראש ..mainmainהרשימה וישב בהרשימה וישב ב

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

הפונקציה תדע לקבל מצביע לראש הפונקציה תדע לקבל מצביע לראשהרשימה וערך להוספה ותוסיף את האיבר הרשימה וערך להוספה ותוסיף את האיבר

בסוף הרשימה.בסוף הרשימה.

Page 5: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

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

Page 6: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

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);}

Page 7: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

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

איבראותן. אותן.

מידע

מצביע לאיבר

3

איבר

מידע

מצביע לאיבר

7

איבר

מידע

מצביע לאיבר

5

1רשימה איבר

מידע

מצביע לאיבר

3

איבר

מידע

מצביע לאיבר

5

2רשימה

איבר

מידע

מצביע לאיבר

3

איבר

מידע

מצביע לאיבר

7

איבר

מידע

מצביע לאיבר

5

איבר

מידע

מצביע לאיבר

3

איבר

מידע

מצביע לאיבר

5

Page 8: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

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;

}

Page 9: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

מערכים דו מימדיםמערכים דו מימדים

) החד ) החד CCניתן להכליל את המערך הרגיל של ניתן להכליל את המערך הרגיל של מימדי( מימדי(

למספר רב של מימדים.למספר רב של מימדים.

אנחנו נראה כיצד להכליל את המערכים שלמדנו אנחנו נראה כיצד להכליל את המערכים שלמדנו

לשני מימדים.לשני מימדים.

נחשוב על מערכים דו מימדים כל טבלה שלה נחשוב על מערכים דו מימדים כל טבלה שלה

עמודות ושורות. עמודות ושורות.

Page 10: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

מערכים דו מימדיםמערכים דו מימדים

a[0]a[0][0][0]

a[0]a[0][1][1]

a[0]a[0][2][2]

a[0]a[0][3][3]

a[1]a[1][0][0]

a[1]a[1][1][1]

a[1]a[1][2][2]

a[1]a[1][3][3]

a[2]a[2][0][0]

a[2]a[2][1][1]

a[2]a[2][2][2]

a[2]a[2][3][3]

0שורה

1שורה

2שורה

1עמודה 2עמודה 3עמודה 4עמודה

שם המערך

אינדקס שורה

אינדקס עמודה

Page 11: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

מערכים דו מימדיםמערכים דו מימדים

הגדרת מערך דו מימדי תתבצע כך:הגדרת מערך דו מימדי תתבצע כך:int main()int main()

{{

int a[3][4]=int a[3][4]={{{{1,2,3,41,2,3,4}},,{{5,6,7,85,6,7,8}},,{{9,10,11,129,10,11,12}}};};

}}

שם המערך

מספר שורות

מספר עמודות1 2 3 4

0אתחול שורה

5 6 7 8

1אתחול שורה

9 10 11 12

2אתחול שורה

Page 12: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

#include <stdio.h>#include <stdio.h>#define ROW 3#define ROW 3#define COLUMN 4#define COLUMN 4int main()int main(){{ int array1[ROW][COLUMN]= {{1,2,3,4},{5,6,7,8},int array1[ROW][COLUMN]= {{1,2,3,4},{5,6,7,8},

{9,10,11,12}};{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" ); }}}}

מעבר על השורות

הדפסת כל שורה

Page 13: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

מערכים דו מימדים ופונקציותמערכים דו מימדים ופונקציות

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

כשדיברנו על מערכים רגילים אמרנו שצרך כשדיברנו על מערכים רגילים אמרנו שצרך להעביר מצביע לראש המערך ואת גודל להעביר מצביע לראש המערך ואת גודל

המערך. מה נעביר לפונקציה בבואנו להעביר המערך. מה נעביר לפונקציה בבואנו להעביר מערך דו מימדי ?מערך דו מימדי ?

Page 14: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

void printArray(int a[][ COLUMN ] , int size )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" ); }}}}

מעבר על השורות

הדפסת כל שורה

Page 15: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

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

בזיכרון הוא מופיע כמערך רגיל כדי שבתוך הפונקציה בזיכרון הוא מופיע כמערך רגיל כדי שבתוך הפונקציה נוכל נוכל

לפנות לאיברו של המערך באמצעות ][][ חייבים לציין לפנות לאיברו של המערך באמצעות ][][ חייבים לציין את את

גודל כל שורה כלומר את מספר העמודותגודל כל שורה כלומר את מספר העמודות

1 2 3

5 6 7

11

22

33

44

55

66

אשליה מציאות

Page 16: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

מערכים דו מימדים ופונקציותמערכים דו מימדים ופונקציות צריך לדעת שהשורה ה צריך לדעת שהשורה ה a[1][1]a[1][1]כדי לגשת לתא כדי לגשת לתא

00

תאים למעשה מה שמתבצע בפועל זה תאים למעשה מה שמתבצע בפועל זה33מכילה מכילה

a[row][col] a[row*COLUMN+col] a[row][col] a[row*COLUMN+col] a[1][1] a[1*COLUMN+1]a[1][1] a[1*COLUMN+1]

1 2 3

4 5 6

11

22

33

44

55

66

אשליה מציאות0 1 2

0

1

0

1

2

3

4

5

Page 17: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

#include <stdio.h>#include <stdio.h>#define ROW 3#define ROW 3#define COLUMN 4#define COLUMN 4void printArray(int [][ COLUMN ] , int );void printArray(int [][ COLUMN ] , int );int main()int main(){{ int array1[ ROW ][ COLUMN ] = {{1,2,3,4},{5,6,7,8},int array1[ ROW ][ COLUMN ] = {{1,2,3,4},{5,6,7,8},

{9,10,11,12}};{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 )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" ); }}}}

Page 18: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

תרגילתרגיל

כתוב פונקציה המקבלת מערך דו מימדי בגודל כתוב פונקציה המקבלת מערך דו מימדי בגודל

1010XX1010 .וממלאת אותו בלוח הכפל. וממלאת אותו בלוח הכפל

התוכנית תדפיס את לוח הכפל המתקבלהתוכנית תדפיס את לוח הכפל המתקבל

Page 19: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

פתרוןפתרון

void fillArray( int a[][ COLUMN ] , int size )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);

}}}}

Page 20: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

מערכים דו מימדים ומחרוזותמערכים דו מימדים ומחרוזות

נגדיר מערך דו מימדי שיכיל שמות. נגדיר מערך דו מימדי שיכיל שמות.

לצורך זה כל שורה במערך תהיה מחרוזת:לצורך זה כל שורה במערך תהיה מחרוזת:

char names[N][STR_SIZE];char names[N][STR_SIZE];

GG aa dd ii \0\0

RR aa mm II \0\0

DD aa nn ii \0\0

STR_NAME #define N 3 ו Nמה הערכים של

#define STR_NAME 5

Page 21: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

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

נמצא נמצא

במערך הפונקציה תסמן את השם ב *. במערך הפונקציה תסמן את השם ב *.

כיצד נגדיר את הפונקציה? כיצד נגדיר את הפונקציה?

void markName (char [][STR_SIZE],int size,char void markName (char [][STR_SIZE],int size,char *name)*name)

Page 22: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

מערכים דו מימדים ומחרוזותמערכים דו מימדים ומחרוזות

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;

}}

Page 23: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

תרגיל חזרה – חיפוש במערכיםתרגיל חזרה – חיפוש במערכים

נתון מערך ממוין נרצה לחפש בו איבר כלשהו. נתון מערך ממוין נרצה לחפש בו איבר כלשהו.

חיפוש ליניאריחיפוש ליניארי•

חיפוש בינאריחיפוש בינארי•

55 88 99 1212 1515 1717 2020 2121 2424 2727 2929 3131

חיפוש ליניארי24נחפש את

Page 24: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

תרגיל חזרה – חיפוש במערכיםתרגיל חזרה – חיפוש במערכים

55 88 99 1212 1515 1717 2020 2121 2233 2244 2929 3131

חיפוש בינארי24נחפש את

Page 25: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

#include <stdio.h>#define SIZE 12

int binarySearch( int [], int ,int);

int main(){ int a[ SIZE ] = {12,14,16,18,20,23,24,45,67,89,100,110}; int i; for (i=0;i<SIZE;i++) if (binarySearch( a, SIZE , a[i] ))

printf("Found %d \n",i); return 0;}

Page 26: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

int binarySearch( int arr[], int size, int item ){ int lsize,rsize,middle; lsize = 0; rsize = size-1; while ( lsize <= rsize ) { middle = (rsize + lsize ) /2; if ( item == arr[ middle ] ) return 1; if ( item < arr[ middle ] )

rsize = middle-1; else

lsize = middle+1; } return 0; }

55 88 99 1212 1515 1717 2020 2121 2424 2727 2929 3131

Page 27: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

הערות לבחינההערות לבחינה

קראו היטב את השאלות לפני שתתחילו לפתור קראו היטב את השאלות לפני שתתחילו לפתור •את המבחן. את המבחן.

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

השתדלו לכתוב בכתב ברור במקום שמיועד השתדלו לכתוב בכתב ברור במקום שמיועד •לתשובה.לתשובה.

Page 28: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

דברים חשוביםדברים חשובים

לולאות )תחביר, שימוש נכון, תנאי סיום(לולאות )תחביר, שימוש נכון, תנאי סיום(•ריקורסיות ריקורסיות •מערכיםמערכים•מצביעים )העברה לפונקציה כתובות כדי לשנות ערכי מצביעים )העברה לפונקציה כתובות כדי לשנות ערכי •

משתנים( משתנים( שילוב של מערכים ומצביעיםשילוב של מערכים ומצביעים•מחרוזותמחרוזות•מבניםמבנים•הקצאת זיכרון דינאמיתהקצאת זיכרון דינאמית•רשימות מקושרותרשימות מקושרות•

Page 29: תכנות תרגול 14 שבוע : 25.1.04. רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע

דברים חשוביםדברים חשובים