תכנות בשפת c תרגול 9 typedef, struct, מערכים דינמיים דו-ממדיים ...

22
תתתתת תתתתC תתתתת9 typedef, struct, תתתתתת תתתתתתתתתתתתת- תת תתתתתתתת

Upload: maegan

Post on 05-Jan-2016

77 views

Category:

Documents


4 download

DESCRIPTION

תכנות בשפת C תרגול 9 typedef, struct, מערכים דינמיים דו-ממדיים ומצביעים. typedef אופרטור ה-. ניתן להגדיר טיפוס חדש על ידי פקודת typedef שתבניתה היא: typedef existing_type new_type ; המהדר יחליף את הטיפוס existing_type בטיפוס החדש new_type . לדוגמה: typedef int* pint; - PowerPoint PPT Presentation

TRANSCRIPT

Cתכנות בשפת 9תרגול

typedef, struct, מערכים דינמיים דו-ממדייםומצביעים

ניתן להגדיר טיפוס חדש על ידי פקודתtypedef:שתבניתה היא typedef existing_type new_type ;

המהדר יחליף את הטיפוסexisting_type בטיפוס החדש new_type:לדוגמה .

typedef int* pint;pint p,q;int* r;r = p;

-השימוש בtypedef מאפשר להפוך את הקוד לקריא יותר מבחינת ההקשר.

typedefאופרטור ה-

.טיפוס המאגד עצמים מטיפוסים שונים )או זהים( בתוך רשומה אחת תחביר:

struct name_of_struct {    field1; field2; etc.};

, דומה למערך בכך ששניהם יכולים לאגד מספר נתוניםבמבנה יש חופש בבחירת טיפוסי הנתונים:אך

struct address{    char city[20];    char street[20];    int num_house;    long code_area;};

struct מבנה -

אין מניעה שאחד השדות יהיה בעצמו מבנה

ע"מ להכריז על משתנה מסוג מבנהaddress :יש לכתוב

struct address x;

:איתחול

struct address add = {"migdal Haemek", "Harazim", 5, 23028};

-ניתן להשתמש בtypedef-כדי להקל על שימוש ב struct :

typedef struct some_name{

char alias[20];char username [20];char password[10];int numberOfFriends;

} facebook_record;

struct תחביר

facebook_recordאפשר להחליף כל מופע של , ולהיפךstruct some_nameבקוד ב-

:דרך אחרתstruct some_name{

char alias[20];char username [20];char password[10]; int numberOfFriends;

};

typedef some_name facebook_record;

struct ,'ניתן לשימוש כפרמטר לפו' או כערך החזרה של פו ממש כמו כל טיפוס אחר.

:ניתן להגדיר מצביע למבנהfacebook_record* p;

;facebook_record records[10]ניתן להגדיר מערך של רשומות:

)המשך( struct תחביר

( וחץ ).( כדי לגשת לשדות, קיימים שני אופרטורים: נקודה>-. )

.אופרטור הנקודה מאפשר גישה לשדות בתוך משתנה מטיפוס המבנה

facebook_record d;strcpy(d.username, “david hasholet”);d.numberOfFriends = 501;

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

facebook_record* d = (facebook_record*)malloc( sizeof(facebook_record) );

strcpy(d->username, “david hasholet”);d->numberOfFriends = 501;

structגישה לשדות ב-

להלן הגדרה עבור מבנה המממש מערך דינאמישניתן להוסיף לו מס' בלתי מוגבל של ערכים:

typedef struct dyn{

int *data;int len; int used;

} DynArr;

נתונה פונקציהvoid dynamicInsert(DynArr* arr, int val)שמכניסה מספר שלם למקום הפנוי הבא במערך.

את גודל המערך2אם המערך מלא, הפונקציה "מכפילה" פי ומוסיפה את הערך החדש, תוך שמירה על הערכים הישנים.

1תרגיל

dataהמערך מוצבע ע"י השדה

הוא אורך המערךlenהשדה

usedהוא אינדקס התא האחרון שבשימוש

void dynamicInsert(DynArr* arr, int val){

int *newarr;int i;if (?? 1 ??)

{newarr = ?? 2 ??;for (i=0; i <= arr->used ; i++)

?? 3 ??;free(?? 4 ??);arr->data = ?? 5 ??;arr->len = ?? 6 ??;

{arr->data[?? 7 ??] = val;

}

)המשך(1תרגיל

typedef struct dyn{

int *data;int len; int used;

} DynArr;

void dynamicInsert(DynArr* arr, int val){

int *newarr;int i;if (arr->len-1 <= arr->used){

newarr = (int *)malloc(2*(arr->len)*sizeof(int));for (i=0; i <= arr->used ; i++)

newarr[i]=arr->data[i];free(arr->data);arr->data = newarr;arr->len = 2*(arr->len);

}arr->data[++(arr->used)] = val;

}

)פתרון(1תרגיל typedef struct dyn{

int *data;int len; int used;

} DynArr;

void main(){

DynArr a; int i=0;a.len=4;a.used=3; if(!(a.data=(int *)malloc(4*sizeof(int)))){

printf("Problem allocating memory, please try again!!!\n");return;}

for(;i<=a.used;++i)//Fill the array with the sqare of the indices:*(a.data+i)=i*i; 

printf("Array BEFORE dynamic insertion:\n");for(i=0;i<=a.used;++i)//Print the array before dynamic insertion:

printf("%d\t",a.data[i]);printf("\n");

)שימוש בפתרון(1תרגיל typedef struct dyn{

int *data;int len; int used;

} DynArr;

dynamicInsert(&a, 16);

printf("Array AFTER dynamic insertion:\n");

for(i=0;i<=a.used;++i) //Print the array after dynamic insertion:printf("%d\t",a.data[i]);

printf("\n");free(a.data);

}

)שימוש בפתרון - המשך(1תרגיל typedef struct dyn{

int *data;int len; int used;

} DynArr;

סמן את כל התשובות הנכונות:

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

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

ומשנה את תוכנו.int)פרמטר( משתנה מסוג :קיים טיפוס מהסוגint*** . ניתן להגדיר שדה מטיפוסstruct myStructבתוך טיפוס

struct myStruct. * ניתן להגדיר שדה מטיפוסstruct myStructבתוך טיפוס

struct myStruct.

2תרגיל

סמן את כל התשובות הנכונות:

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

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

ומשנה את תוכנו.int)פרמטר( משתנה מסוג :קיים טיפוס מהסוגint*** . ניתן להגדיר שדה מטיפוסstruct myStructבתוך טיפוס

struct myStruct. * ניתן להגדיר שדה מטיפוסstruct myStructבתוך טיפוס

struct myStruct.

)פתרון(2תרגיל

struct record{

char name[20];int serial_num;

};

void readRecord(struct record r){

scanf("%s", r.name);scanf("%s", r.serial_num);

}

void main(){

record r;readRecord(r);printf("name: %s, serial: %d",r.name, r.serial_num);

}

)א(3תרגיל

מה תדפיס התוכנית הבאה ?

struct record{

char name[20];int serial_num;

};

void readRecord(struct record *r){

scanf("%s", r->name);scanf("%s", r->serial_num);

}

void main(){

record r;readRecord(&r);printf("name: %s, serial: %d",r.name, r.serial_num);

}

)ב(3תרגיל

מה תדפיס התוכנית הבאה ?

מכפלה סקלרית בין שני וקטורים

ו- מסומנת ע"י ומוגדרת באופן הבא:

רקורסיביתכתבו פונקציה int recScalarProd(int *a, int *b, int len) .len, שאורכם b ו-aהמחזירה את ערך המכפלה הסקלארית בין ווקטורים

)א(4תרגיל ),...,,( 21 naaaa

),...,,( 21 nbbbb

n

iiibaba

1

int recScalarProd(int *a, int *b, int len){

if(len==1)return (*a)*(*b);

return (*a)*(*b)+ recScalarProd(a+1,b+1, len-1);}

2לפנינו כפל של מטריצה מסדרx4 .4x3במטריצה מסדר

12(AB)בתמונה מודגש כיצד מחושב האיבר

)ב(4תרגיל

:כתבו פונקציה בעלת חתימה int ** multMat(int **A, int **B, int n, int m, int

p)

NULL, או B ו-Aהמחזירה את כפל המטריצות recScalarProd(במידה ואירעה שגיאה) ומשתמשת ב-

)ב( - המשך4תרגיל

7 6 5 4

3 2 1 0A

11 10 9

8 7 6

5 4 3

2 1 0

B

158 136 114

54 48 42AB

int ** multMat(int **A, int **B, int n, int m, int p){

int i,j,k; int *temp; int **res; 

// Allocate temp array.if(!(temp=(int *)malloc(m*sizeof(int)))){

printf("Error allocating memory!\n");return NULL;

// Allocate main array.if(!(res=(int **)malloc(n*sizeof(int *)))){

printf("Error allocating memory!\n");return NULL;

}

(i )ב( – פתרון )4תרגיל

for(i=0;i<n;++i){

// Allocate i’th row array.if(!(res[i]=(int *)malloc(p*sizeof(int)))){

printf("Error allocating memory!\n");return NULL;

for(j=0;j<p;++j){

for(k=0;k<m;++k) // Moving j’th column of B to array of integers.

temp[k]=B[k][j];res[i][j]= recScalarProd(A[i],temp,m);

}}return res;

}

(ii )ב( – פתרון )4תרגיל

:מה תדפיס התכנית הבאה

void what(char *str1, char *str2, char *str3){if(*str1 >= '0' && *str1 <= '9')

*str3 = ' ';else

*str3 = *str1;if(!*str3) return;what(str2, str1+1, str3+1);

} void main(){  char mystery1[]="4ob5rntt6e.7that!",

mystery2[]="t8eo8o0ob..", mystery3[]="abcdefghijklmnopqrstuvwxyz0123456789";  what(mystery1, mystery2, mystery3); puts(mystery3);}

5תרגיל

:פתרון

to be or not to be…

char *search(char *str1,char *str2){int i, j, k, length;char *temp, *aux=NULL;for(i=length=0;*(str1+i);i++) for(j=0;*(str2+j);j++){

for(k=0;*(str1+i+k)&& *(str1+i+k)==*(str2+j+k);k++);if(k>length){

length=k;aux=str1+i;

} }if(aux)

if(temp=(char *)malloc(length+1)){ for(i=0;i<length;i++)

*(temp+i)=*(aux+i); *(temp+i)='\0'; return temp;

}return NULL;

}

6תרגיל מה עושה הפו' הבאה?

פתרון:

הפו' מחזירה את תת-המחרוזת הגדולה ביותר שמשותפת לשתי המחרוזות