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

Preview:

Citation preview

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

::שבועשבוע

25.1.0425.1.04

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

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

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

איבר

מידע

מצביע לאיבר

מצביע לראש

הרשימה

איבר

מידע

מצביע לאיבר

איבר

מידע

מצביע לאיבר

איבר

מידע

מצביע לאיבר

איבר

מידע

מצביע לאיבר

5 7 1 8

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

typedef strcut list typedef strcut list Item;Item;

מידע

מצביע לאיבר

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

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

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

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

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

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

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

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

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;

}

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

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

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

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

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

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

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

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

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עמודה

שם המערך

אינדקס שורה

אינדקס עמודה

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

הגדרת מערך דו מימדי תתבצע כך:הגדרת מערך דו מימדי תתבצע כך: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אתחול שורה

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

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

הדפסת כל שורה

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

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

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

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

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

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

הדפסת כל שורה

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

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

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

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

1 2 3

5 6 7

11

22

33

44

55

66

אשליה מציאות

מערכים דו מימדים ופונקציותמערכים דו מימדים ופונקציות צריך לדעת שהשורה ה צריך לדעת שהשורה ה 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

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

תרגילתרגיל

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

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

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

פתרוןפתרון

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

}}}}

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

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

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

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

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

נמצא נמצא

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

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

void markName (char [][STR_SIZE],int size,char void markName (char [][STR_SIZE],int size,char *name)*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;

}}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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