Presentation is loading. Please wait.

Presentation is loading. Please wait.

מבוא כללי למדעי המחשב תרגול 7. מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים.

Similar presentations


Presentation on theme: "מבוא כללי למדעי המחשב תרגול 7. מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים."— Presentation transcript:

1 מבוא כללי למדעי המחשב תרגול 7

2 מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המילה typedef היא לאפשר למתכנת לתת שמות חדשים לטיפוסי משתנים קיימים. מטרת המילה typedef היא לאפשר למתכנת לתת שמות חדשים לטיפוסי משתנים קיימים.

3 מבנים נניח שאנו כותבים תוכנית שמטרתה היא לחשב ערכים באמצעות מספרים מרוכבים a+bi נניח שאנו כותבים תוכנית שמטרתה היא לחשב ערכים באמצעות מספרים מרוכבים a+bi הכי נוח לנו הוא אם כמו שהיה לנו טיפוס למספר ממשי (double) אז יהיה לנו גם טיפוס למספר מרוכב. השימוש במבנים מאפשר זאת. הכי נוח לנו הוא אם כמו שהיה לנו טיפוס למספר ממשי (double) אז יהיה לנו גם טיפוס למספר מרוכב. השימוש במבנים מאפשר זאת.

4 Syntax מבנים הגדרת מבנה : הגדרת מבנה : struct complex { double real; double image; }; הגדרת משתנים מסוג זה הגדרת משתנים מסוג זה struct complex c; struct complex* pc; ה members של המבנה

5 Syntax מבנים struct complex { double real; double image; }; int main() { struct complex c; struct complex *pc; c.real = 5; c.image = 7; } real image 5 7 c

6 Syntax מבנים struct complex { double real; double image; }; int main() { struct complex c; struct complex *pc; c.real = 5; c.image = 7; pc = &c; pc->real = 3; pc->image = 4; } real image 5 7 c 6024 pc 6024 3 4

7 Syntax מבנים struct complex { double real; double image; }; סיכום : לגישה ל members של c נשתמש בנקודה לגישה ל members של pc נשתמש ב <-

8 #include struct complex { double real; double im; }; void PrintComplex (struct complex num); void ScanComplex(struct complex *p_num); int main() { struct complex x; ScanComplex(&x); PrintComplex(x); return 0; }

9 void PrintComplex (struct complex num) { printf(“%lf + %lf i\n”, num.real, num.im); } void ScanComplex(struct complex *p_num) { scanf(“%lf%lf”, &(p_num->real), &(p_num->im)); }

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

11 double AbsComplex(struct complex a) { return sqrt(a.real * a.real + a.im * a.im); } struct complex Add(struct complex a, struct complex b) { struct complex s; s.real = a.real + b.real; s.im = a.im + b.im; return s; } שימוש בפונקציות x = Add(x,y); ab = AbsComplex(x); העברה לפי ערך !

12 מבנים ושימוש ב - typedef struct complex { double real; double image; }; int main() { struct complex c={5,7}; struct complex* pc; } struct complex { double real; double image; }; typedef struct complex complex_t; int main() { complex_t c={5,7}; complex_t *pc; } typedef struct complex complex_t; טיפוס קיים שם חדש לטיפוס קיים

13 double AbsComplex(complex_t a) { return sqrt(a.real * a.real + a.im * a.im); } complex_t Add(complex_t a, complex_t b) { complex_t s; s.real = a.real + b.real; s.im = a.im + b.im; return s; }

14 double AbsComplex(complex_t* pa) { return sqrt(pa->real*pa->real + pa->im*pa->im); } complex_t Add(complex_t* pa, complex_t* pb) { complex_t s; s.real = pa->real + pb->real; s.im = pa->im + pb->im; return s; }

15 מערכים ומבנים מאחר ומבנים מגדירים סוג חדש של משתנים הרי מאחר ומבנים מגדירים סוג חדש של משתנים הרי שכמו לסוגים רגילים נרצה ליצור מערכים עבור סוגים אלו real 5 7 image 2 1 7 2 1 8 complex_t arr[SIZE]={{5,7},{2,1},{7,2},{1,8}}; arr

16 מערכים ומבנים פונקציה להדפסת מערך פונקציה להדפסת מערך void PrintComplexArr(complex_t arr[ ],int n) { int i; for (i=0;i<n;i++) { PrintComplex(arr[i]); }

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

18 פתרון int MaxAbs(complex_t arr[],int n) { inti,maxIn; doublemaxAbs=-1; for (i=0;i<n;i++) if ( AbsComplex(arr[i]) > maxAbs ) { maxAbs = AbsComplex(arr[i]); maxIn = i; } return maxIn; }

19 שימוש של מבנה בתוך מבנה מבנה שהגדרנו יכול לשמש אותנו גם כ -member של מבנה אחר. למשל מבנה של נקודה יכול לשמש אותנו בבואנו להגדיר מבנה של משולש. struct point{ double x; double y; }; typedef struct point point_t; struct triangle { point_t x; point_t y; point_t z; };

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

21 מערכים דו מימדים 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 שם המערך אינדקס שורה אינדקס עמודה

22 מערכים דו מימדים הגדרת מערך דו מימדי תתבצע כך : 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} };} שם המערך מספר שורות מספר עמודות 12341234 אתחול שורה 0 56785678 אתחול שורה 1 9101112 אתחול שורה 2

23 #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; } מעבר על השורות הדפסת כל שורה

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

25 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" ); }} מעבר על השורות הדפסת כל שורה

26 מערכים דו מימדים ופונקציות אנחנו מתייחסים למערך דו מימדי כאליו זו טבלה אבל בזיכרון הוא מופיע כמערך רגיל כדי שבתוך הפונקציה נוכל לפנות לאיברו של המערך באמצעות [][] חייבים לציין את גודל כל שורה כלומר את מספר העמודות 123123 45645612 3 4 5 6 אשליה מציאות 012012 0101 012345012345

27 מערכים דו מימדים ופונקציות כדי לגשת לתא a[1][1] צריך לדעת שהשורה ה 0 מכילה 3 תאים למעשה מה שמתבצע בפועל זה a[row][col] a[row*COLUMN+col] a[1][1] a[1*COLUMN+1] 123123 45645612 3 4 5 6 אשליה מציאות 012012 0101 012345012345

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

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

30 פתרון 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); }}

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

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

33 מערכים דו מימדים ומחרוזות 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; }

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


Download ppt "מבוא כללי למדעי המחשב תרגול 7. מבנים מטרת המבנים היא לאפשר למתכנת להגדיר טיפוסי משתנים חדשים אשר מתאימים ספציפית לבעיה שאותה התוכנית פותרת. מטרת המבנים."

Similar presentations


Ads by Google