+ All Categories
Home > Documents > הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב...

הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב...

Date post: 10-Sep-2020
Category:
Upload: others
View: 5 times
Download: 0 times
Share this document with a friend
37
תרגול חזרה שאל ה1 עצים בינאריים נתונה ההגדרה הבאה: typedef struct node{ int val; struct node *left, *right; }node; כת ו ב פונקציהnode *recreate_tree(int *in, int *post , int length) , אשר מקבלת כפרמטרים מצביע למערך של שלמיםin שמכיל את ערכי סרי ק ת עץ ב ינארי בשיטתinorder , מצביע למערך של שלמיםpost שמכיל את ערכי סריקת אותו העץ בשיטתpostorder , ו מספר ה איברים ש בעץlength . הפונקציה בונה מחדש את העץ ה בינארי ומחזירה את ש ו רשו. תשובה: node *recreate_tree(int *in, int *post, int length){ node * temp; int i; if (!length) return NULL; temp = (node*) malloc (sizeof(node)); temp->val = post[length-1]; for (i=0; in[i] != post[length-1]; i++); temp->left = recreate_tree(in, post, i); temp->right = recreate_tree(in+i+1, post+i, length-i-1); return temp; }
Transcript
Page 1: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

תרגול חזרה

עצים בינאריים– 1ה שאל :נתונה ההגדרה הבאה

typedef struct node{

int val;

struct node *left, *right;

}node;

מקבלתאשר , node *recreate_tree(int *in, int *post , int length) ב פונקציה וכת ינארי בשיטת עץ בתקסרי שמכיל את ערכי inכפרמטרים מצביע למערך של שלמים

inorder, מצביע למערך של שלמים post אותו העץ בשיטתסריקת שמכיל את ערכי postorder,בעץשאיברים המספר ו length .בינארי ה את העץ הפונקציה בונה מחדש

.רשוו שומחזירה את

:תשובה

node *recreate_tree(int *in, int *post, int length){

node * temp;

int i;

if (!length) return NULL;

temp = (node*) malloc (sizeof(node));

temp->val = post[length-1];

for (i=0; in[i] != post[length-1]; i++);

temp->left = recreate_tree(in, post, i);

temp->right = recreate_tree(in+i+1, post+i, length-i-1);

return temp;

}

Page 2: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

2

2

קבצים- 2שאלה

: היוצרת מספר קבצים בצורה הבאה( )void makefilesכתוב פונקציה : בדיוק בפורמט הבא המורכב משתי שורות” start.txt “הפונקציה קוראת מקובץ הנקרא

start.txt

name=<some name>

count=<number>

קבצים countרת ולפיהם יוצ) name, count(הפונקציה קוראת שני משתנים מהקובץ

ותוכן כל קובץ מכיל , count- ל1 ומספר סידורי בין name-כששם כל קובץ מורכב מ, חדשיםcountשורות כשכל שורה בנויה מ -name ל1 ומספר שורה בין - count.

: היהstart.txt-אם קובץ ה: לדוגמאstart.txt

name=yosi

count=3

:באיםאזי הפונקציה הייתה יוצרת את הקבצים ה

yosi1.txt

yosi1

yosi2.txt

yosi1

yosi2

yosi3.txt

yosi1

yosi2

yosi3

Page 3: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

3

3

קבצים- 3שאלה

:צים קבנים שנינתו :כל שורה בקובץ מכילה את הפרטים הבאים, קובץ נתוני הסטודנטים של הקורס שלנו )1 תווים20 - סטודנטשם ה - תווים20 - כתובת - ספרות 9 - . ז.מספר ת - ספרות3 - ד מחלקה קו - ספרות3 - ציון סופי בקורס -

. בסדר עולה.ז.ת מסודר לפי מספר ץבוהק :כל שורה בקובץ מכילה את הפרטים הבאים, קובץ פרטי כל המחלקות של האוניברסיטה) 2 תווים10 - שם המחלקה - ספרות3 - קוד מחלקה- תווים20 - שם ראש המחלקה-

. בסדר עולהקוד מחלקהסודר לפי מץבוהק

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

.סטודנטים מצטיינים

ל ויוצרת קובץ חדש " לקבצים הנ שמקבלת כפרמטרים שני מצביעיםexcellentפונקציה כתוב :כל שורה בקובץ מכילה, של כל הסטודנטים המצטיינים ”excellent.dat"בשם

ספרות10 - שם המחלקה - ספרות3 - קוד המחלקה - תווים20 - סטודנט ה שם - ספרות 9 - . ז.מספר ת -

.בסדר עולהקוד מחלקה מסודר לפי ץבוהק

...), רשימה משורשרת, מערך(ובץ למבנה נתונים אחר אין להעתיק ק :הגבלה

Page 4: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

4

4

:תשובהvoid excellent(FILE* student, FILE* department){

FILE* excel;

char name[21],id[10], dp_name[11];

int cod_s, cod_d, grade, max;

rewind(department);

if((excel=fopen("excellent.dat","w"))== NULL){

printf("Error in access to file department\n");exit(1);

}

while(fscanf(department,"%10[^$]%3d%*21c",dp_name,&cod_d)==2){

max = -1;

rewind(student);

while(fscanf(student,"%*49c%3d%3d%*c",&cod_s,&grade)==2)

if(cod_s==cod_d && grade>max) max = grade;

if(max == -1)continue;

rewind(student);

while(fscanf(student,"%20[^$]%*20c%9s%3d%3d%*c",

name,id,&cod_s, &grade)==4)

if(cod_s==cod_d && grade==max)

fprintf(excel,"%s%03d%s%s\n",dp_name,cod_d,name,id);

}

if(fclose(excel)== EOF){

printf("Error closing file excellent.dat\n"); exit(1);

}

}

Page 5: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

5

5

קבצים- 4שאלה

לאור הביקוש הרב החליטה האוניברסיטה לאפשר לסטודנטים להנדסה לעבור למחלקה סטודנט מהנדסה יוכל לעבור רק אם . JAVA - וCלמדעי המחשב על סמך הציונים בקורסי

נתון קובץ של כל הסטודנטים .90קורסים ציון מעל ל וקיבל בשני ה"נבחן בשני הקורסים הנ :כל שורה בקובץ מכילה את הפרטים הבאים, של הפקולטה להנדסה

תווים20 - שם הסטודנט - תווים20 - כתובת - ספרות9 - . ז.מספר ת - אות אחת- שנה - ספרות 3 - קוד מחלקה - תווים15 - שם מחלקה-

.בסדר עולה. ז. מספר תהקובץ מסודר לפי

) מכל האוניברסיטה ולא רק מהנדסה(נתונים גם שני קבצים של הציונים של כל הסטודנטים :כל שורה בכל קובץ מכילה את הפרטים הבאים. JAVA - ובC-שנבחנו ב

תווים20 - שם הסטודנט - ספרות9 - . ז.מספר ת - ספרות 5 - נבחן' מס - ספרות 3 - ציון-

.בסדר עולה. ז.הקבצים מסודרים לפי מספר ת )JAVA- או בC-יש סטודנטים בהנדסה שלא נבחנו ב(

, ל" שמקבלת כפרמטרים שלושה מצביעים לקבצים הנchange_dptכתוב פונקציה . ומחרוזת שהיא השם של הקובץ חדש שהפונקציה יוצרת

למחלקה למדעי המחשב עם ציון הקובץ החדש הוא הקובץ של הסטודנטים הזכאים לעבור

:כל שורה בכל קובץ מכילה .JAVA- ובC- ב90מעל תווים20 - שם הסטודנט - ספרות9 - . ז.מספר ת - תוספר 3 - קוד מחלקה - ספרות C - 3- ציון ב- ספרותJAVA - 3- ציון ב-

.להבסדר עו. ז.הקובץ מסודר לפי מספר ת

, מערך( אין להעתיק קובץ למבנה נתונים אחר . אין לקרוא קובץ יותר מפעם אחת:הגבלה ...)עץ, קובץ,רשימה משורשרת

Page 6: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

6

6

:תשובה

void change_dpt(FILE *eng, FILE *c, FILE *java, char *filename){

FILE* fnew;

char name[21];

long idE,idC,idJ;

int cod,gradeC,gradeJ,flagE,flagC,flagJ;

if(!(fnew=fopen(filename,"w")))

exit(1);

flagE=fscanf(eng,"%20[^\n]%*20c%ld%*c%d%*16c",name,&idE,&cod);

flagC=fscanf(c,"%*20c%9ld%*5c%d%*c",&idC,&gradeC);

flagJ=fscanf(java,"%*20c%9ld%*5c%d%*c",&idJ,&gradeJ);

while(flagE==3 && flagC==2 && flagJ==2){

if(idE<idC||idE<idJ){

flagE=fscanf(eng,"%20[^\n]%*20c%ld%*c%d%*16c",

name,&idE,&cod);

continue;

}

if(idC<idE||idC<idJ){

flagC=fscanf(c,"%*20c%9ld%*5c%d%*c",&idC,&gradeC);

continue;

}

if(idJ<idE||idJ<idC){

flagJ=fscanf(java,"%*20c%9ld%*5c%d%*c",&idJ,&gradeJ);

continue;

}

if(gradeC>90&&gradeJ>90)

fprintf(fnew,"%s%09d%03d,%03d%03d\n",

name,idE,cod,gradeC,gradeJ);

flagE=fscanf(eng,"%20[^\n]%*20c%ld%*c%d%*16c",

name,&idE,&cod);

flagC=fscanf(c,"%*20c%9ld%*5c%d%*c",&idC,&gradeC);

flagJ=fscanf(java,"%*20c%9ld%*5c%d%*c",&idJ,&gradeJ);

}

if(fclose(fnew)==EOF)

exit(1);

}

Page 7: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

7

7

קבצים- 5ה שאל

).אחד של אורחי הכלה ואחד של אורחי החתן( קבצים של כל האורחים לחתונה 2נתונים

:כל שורה בקבצים מכילה את הפרטים הבאים תווים15 – שם פרטי

תווים15 – שם משפחה )120 עד 0-מ( ספרות 3 – גיל

)מלל חפשי( תווים 30 – הערות

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

guest(FILE* f1, FILE* f2, char* filename1, char* filename2) כתוב פונקציה

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

.שני הקבצים החדשים הם במבנה זהה לשני הקבצים הנתונים

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

.והקובץ החדש השני מכיל את רשימת האורחים המשותפים לחתן ולכלה

.ים לפי שם משפחה ושם פרטישני הקבצים החדשים גם ממוינ

. אין לקרוא קובץ יותר מפעם אחת:הגבלה ...)קובץ אחר,עץ, רשימה משורשרת, מערך( אין להעתיק קובץ למבנה נתונים אחר

Page 8: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

8

8

:תשובה

void guests(FILE* f1, FILE* f2, char *filename1, char *filename2 ){

char first1[16],last1[16], name1[31], details1[34], first2[16],

last2[16], name2[16], details2[34];

FILE *twice, *once;

int flag1, flag2;

if(!(once = fopen(filename1, "w"))){

puts(" The program cannot open file"); exit(1);

}

if(!(twice = fopen(filename2, "w"))){

puts(" The program cannot open file"); exit(1);

}

flag1=fscanf(f1, "%15[^$]%15[^$]%[^\n]*c",first1,name1,details1);

if(flag1==3){

strcpy(name1,last1); strcat(name1,first1);

}

flag2=fscanf(f2, "%15[^$]%15[^$]%[^\n]*c",first2, name2, details2);

if(flag2==3){

strcpy(name2,last2); strcat(name2,first2);

}

while(flag1==3 || flag2==3)

if(flag2==3 && flag1==3 && !strcmp(name1,name2)){

fprintf(twice,"%15s%15s%33s\n",first1,name1,details1);

flag1=fscanf(f1, "%15[^$]%15[^$]%[^\n]*c",

first1,name1,details1);

if(flag1==3){

strcpy(name1,last1); strcat(name1,first1);

}

flag2= fscanf(f2, "%15[^$]%15[^$]%[^\n]*c",

first2, name2, details2);

if(flag2==3){

strcpy(name2,last2); strcat(name2,first2);

}

}

else

if(flag2!=3|| flag1==3 && strcmp(name1,name2)<0){

fprintf(once,"%15s%15s%33s\n",first1,name1,details1);

flag1= fscanf(f1, "%15[^$]%15[^$]%[^\n]*c",

first1, name1, details1);

if(flag1==3){

strcpy(name1,last1); strcat(name1,first1);

}

}

else{

fprintf(once,"%15s%15s%33s\n",first2,name2,details2);

flag2= fscanf(f2, "%15[^$]%15[^$]%[^\n]*c",

first2, name2, details2);

if(flag2==3){

strcpy(name2,last2); strcat(name2,first2);

}

}

fclose(once);

fclose(twice);

}

Page 9: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

9

9

רשימות- 6ה שאל :הבאההגדרה נתונה ה

typedef struct node{ int value; struct node* next; }Node;

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

Node* middle(Node* source){ Node *fast, *slow, *source2;

if (source==NULL || ??1 ?? ) return NULL; slow = source; fast = ?? 2 ?? ; while (?? 3 ??) { fast = fast->next; if ( ?? 4 ?? ) { slow = slow->next; fast = fast->next; } } source2 = slow->next; slow->next = ?? 5 ?? ; return ??6?? ;

}

.עים החסריםהשלם בדף התשובות את הקט

:פתרון

Node* middle(Node* source){ Node *fast, *slow, *source2; if (source==NULL || source->next==NULL) return NULL; slow = source;

fast = source->next; while (fast) {

fast = fast->next; if (fast) { slow = slow->next; fast = fast->next; } } source2 = slow->next; slow->next = NULL ; return source2; }

Page 10: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

10

10

רשימות- 7ה שאל :בנה של רשימה משורשרתמות ההגדרה הבאה שמאפשרת להגדיר נתונ

typedef struct item{

int digit;

struct item *next;

}item;

.משורשרתי רשימה "ניתן לייצג מספר טבעי גדול עי הרשימה " מיוצג ע1234567890כל איבר ברשימה מכיל סיפרה כך שלמשל המספר

:הבאה0 � 9 � 8 � 7 � 6 � 5 � 4 � 3 � 2 � 1 � NULL

...,השני ספרת ההעשרות, שימו לב שהאיבר הראשון מכיל את ספרת היחידות של המספר

.NULL-והאיבר האחרון מצביע ל .NULLי רשימה ריקה "המספר אפס מיוצג פשוט ע

המקבלת את העוגן של שתי רשימות void add(item* num1, item* num2)כתוב פונקציה

.משורשרות שמייצגות שני מספריים טבעיים גדולים

הפונקציה משנה את הרשימה הראשונה כך שהיא תייצג את סכום שני המספרים המיוצגים . מייצגnum2-צג גדול מהמספר ש מייnum1-ידוע שהמספר ש. י הארגומנטים"ע

Page 11: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

11

11

רשימות- 8ה שאל

:להלן הגדרה typedef struct node{

int val;

struct node *next;

} node;

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

).הראשונהvoid single(node* first){

node *temp, *p, *del;

int i;

temp = first;

while(?? 1 ?? !=first){

p = temp;

while(?? 2 ?? !=first){

if(?? 3 ?? == temp->val){

del = ?? 4 ??;

?? 5 ?? = del ->next;

?? 6 ??;

}

else

p = p -> next;

}

?? 7 ??;

}

}

:ל הרשימה הראשונה תהפוך לשניה"אחרי הביצוע של הפונקציה הנ, לדוגמה

Page 12: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

12

12

רקורסיה ורשימות– 9 ה שאל

: הבאההגדרהנתונה הtypedef struct item{

int val;

struct item * next;

}item;

:והפונקציה הבאה

item* what(item* list1, item* list2) {

if(!list1) return list2;

if(!list2) return list1;

if(list1->val == list2->val)

list1->next = what(list2->next, list1->next);

else

list1->next = what(list1->next, list2);

return list1;

}

: ראש רשימה משורשרתים כל אחד עלמצביע list2- וlist1אם

ואת לאן מצביע ההחזר של הפונקציהעבור שתי הרשימות הבאות צייר בדף התשובות .ל"מצב הרשימות אחרי הקריה לפונקציה הנ

Page 13: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

13

13

רקורסיה-01שאלה

די של המפה היא למעשה מערך דו מימ. (bitmap)ניתן לייצג תמונה באמצעות מפת ביטים לשם הפשטות . כל פיקסל נושא צבע). picture cell קיצור של pixel( פיקסלים –תאים

.(integers)החלטנו לייצג את הצבעים השונים באמצעות מספרים שלמים :רקורסיבית יש לכתוב פונקציה

void paint(int**map, int size, int x , int y , int color) הפונקציה ). דומה לשימוש בדלי הצבע בתוכנת הצייר( תמונה בתוך" צביעת שטח"המדמה

:מקבלת חמישה פרמטרים

• sizeמספר שלם חיובי

• map–מערך דו מימדי בגודל size x size המייצג את מפת הפיקסלים של ממנה .מורכבת התמונה

. מייצגות קואורדינאטות נקודה – x , yקואורדינטות 2 •

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

. להם אותו צבע :לדוגמא נתונה המפה הבאה

9 6 1 1 3 4 5 6 1 1 1 8 1 7 6 4

: נקבלx=1, y=2, color=5 עם paintלאחר הפעלת 9 6 1 1 3 4 5 6 5 5 5 8 5 7 6 4

:פתרון

void paint(int**map, int size, int x , int y , int color){

int oldcolor;

oldcolor=map[y][x];

map[y][x]=color;

if(x>0 && map[y][x-1]==oldcolor)

paint(map,size,x-1,y,color);

if(x<size-1 && map[y][x+1]==oldcolor)

paint(map,size,x+1,y,color);

if(y>0 && map[y-1][x]==oldcolor)

paint(map,size,x,y-1,color);

if(y<size-1 && map[y+1][x]==oldcolor)

paint(map,size,x,y+1,color);

}

Page 14: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

14

14

רקורסיה-11שאלה

אשר מקבלת void startbychar(char *string, char letter)כתוב פונקציה רקורסיבית

.ומדפיסה את כל הסיומות של המחרוזת המתחילות בתו הזה, מחרוזת ותו

:ידפסו השורות הבאות’ a‘והתו ” babcbabcbdbabca"לדוגמה עבור המחרוזת abcbabcbdbabca abcbdbabca abca a

:פתרון void startbychar(char string[ ], char letter){

if (!*string) return;

if (*string==letter)

puts(string);

startbychar(string+1);

}

Page 15: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

15

15

רקורסיה ועצים– 12שאלה

:מה הפלט של התכנית הבאה#include <stdio.h>

#include <stdlib.h>

typedef struct item item;

struct item{

int data1, data2 ;

item *left, *right;

};

int what1(item* here, item* that){

if(!that) return 0;

return (here->data2 == that->data2)

+what1(here, that->left)+what1(here, that->right);

}

void what2(item *head){

if(!head)return;

head->data1 = what1(head, head);

what2(head->left);

what2(head->right);

}

item *insert(item *root, item *leaf){

if (!root)return leaf;

if(leaf->data1 < root->data1)

root->left=insert(root->left, leaf);

else

root->right=insert(root->right, leaf);

return root;

}

void print(item *root){

if(!root)return;

print(root->left);

printf("%d %d\n",root->data1, root->data2);

print(root->right);

}

void main(){

item *root=NULL, *temp;

int a[]= { 15,12,14,19,11,21,17,13,20,16,18,22},

b[]= { 12,23,12,31,23,33,11,12,22,12,23,11},i;

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

temp=(item*)malloc(sizeof(item));

temp->left=temp->right=NULL;

temp->data1=a[i];

temp->data2=b[i];

root=insert(root,temp);

}

what2(root);

print(root);

}

Answer: What2 changes every node’s data1 to the number of nodes in

both its subtrees having the same data2 value.

Page 16: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

16

16

שאלה 13 – עצים ורקורסיה : הוגדר המבנה הבא, כדי לממש עץ חיפוש בינארי

typedef struct node {

struct {

int key;

char value[32];

} info;

struct node *left, *right;

} node;

:נתונה הפונקציה הבאה node* What(node* root, int a, int b) {

node *new = root;

if (root) {

if (root->info.key < a)

new = What (root->right, a, b);

else if (root->info.key > b)

new = What (root->left, a, b);

else if ((new = (node*) malloc(sizeof(node)))) {

new->info = root->info;

new->left = What (root->left, a, b);

new->right = What (root->right, a, b);

}

else

new = NULL;

}

return new;

}

סעיף א (10 נקודות)

root -בהינתן העץ הבינארי הבא ש : מצביע על השורש שלו

:צייר את העץ שהפונקציה תחזיר לאחר הקריאה What( root, 10, 20)

.What הסבר בקצרה מה יעודה של הפונקציה )נקודות 5(סעיף ב

The What function returns a new tree which is a subtree of the original tree, and for every value x of the new tree, a<=x<=b.

Page 17: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

17

17

רשימות- 14שאלה הראשון מצביע על האיבר הראשון : י שני הפוינטרים הבאים"נתונה רשימה מקושרת רגילה מוגדרת ע

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

typedef struct Queue {

item *head, *tail;

} Queue;

typedef struct item item;

struct item {

int value;

item *next;

};

Queue enqueue(Queue q, int number) {

item *temp = ?? 1 ?? ;

temp->value = ?? 2 ?? ;

temp->next = ?? 3 ?? ;

if ( ?? 4 ?? )

q.head = q.tail = ?? 5 ?? ;

else {

?? 6 ?? ;

q.tail = ?? 7 ?? ;

}

return q;

}

:פתרון

?? 1 ?? = (item*) malloc(sizeof(item))

?? 2 ?? = number

?? 3 ?? = NULL

?? 4 ?? = !q.tail או !q.head או !q.tail&&!q.head

?? 5 ?? = temp

?? 6 ?? = q.tail->next = temp

?? 7 ?? = temp

Page 18: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

18

18

רשימות- 15שאלה

הפונקציה משחררת , head מקבלת את העוגן של רשימה משורשרת רגילה singleפונקצית ונקציה משאירה כל ערך פעם הפ. (מהרשימה את כל המבנים שהערך שבהם הופיע מקודם ברשימה

). אחת ברשימה . כך שהפונקציה תבצע את הנדרש ?? ?? -הקטעים המסומנים ב 7השלם בדפי התשובות את

typedef struct item{

int value; struct item *next;

}item;

void single(item *head){

item *prev, *temp;

while( head ){

prev = head; temp = head -> next;

while( temp )

if( ?? 1 ?? ){

?? 2 ?? = temp -> next;

free( ?? 3 ?? );

temp = ?? 4 ?? ;

}

else{

prev = ?? 5 ?? ;

temp = ?? 6 ?? ;

}

?? 7 ?? ;

}

}

:פתרון

void single(item *head){

item *prev, *temp;

while( head ){

prev = head;

temp = head -> next;

while( temp )

if( head ->value == temp->value ){

prev -> next = temp -> next;

free( temp );

temp = prev -> next;

}

else{

prev = temp ;

temp = temp-> next;

}

head = head -> next;

}

}

Page 19: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

19

19

a051Clang קבצים – 16שאלה

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

:שמכילה את הפרטים הבאיםבקובץ שורה כל .האחרון תווים20 – שחקןשם ה

ספרות או תווים9 – רכוןאו ד. ז.ת. מס ספרות2 – הקבוצה של השחקןמספר

ספורות2 – מספר השחקן ספרות4 – כ נקודות בעונה"סה

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

נתוני עםGAMESn.TXT בשם עדכון ההתאחדות מקבלת מספר קבצי,כל שבוע

לכל משחק קוד ( הוא מספר המשחק nבאשר , המשחקים שהתקיימו באותו שבוע )9- ל0ייחודי בין

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

:הבאים

ספרות2 – הקבוצה של השחקןמספר ספרות2 – מספר השחקן ספרות3 – מספר נקודות

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

.שחקן גם בסדר עולה

מצביע שמקבלת כארגומנטים void results(FILE* fp, char *filename)כתוב פונקציה

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

שמופיע בשם הקובץnא "ז(לא ידוע כמה קבצים התקבלו . הקבצים שהתקבלו באותו שבוע ).אינו ידוע

GAMESn.TXTנים שרשומים בקבצים שחק הא שכל"ז, ניתן להניח שכל הקבצים תקינים .רשומים כולם גם בקובץ הראשי

. ובץ יותר מפעם אחת אין לקרוא ק:הגבלה

...)קובץ אחר,עץ, רשימה משורשרת, מערך( אין להעתיק קובץ למבנה נתונים אחר

:עזר שהוגדרו באופן הבא יבמערכ להשתמש מומלץ :רמז FILE *arr[10];

int eof[10];

Page 20: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

20

20

פתרון:

void results(FILE* fp, char *filename){

char details[30], nameG[]="GAMES*.TXT";

int id, point, idG[10], pointG[10], eof[10]={0}, i;

FILE *arr[10], *newf;

if(!(newf = fopen(filename, "w"))){

printf(" The program cannot open file %s\n", filename);

exit(1);

}

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

nameG[5]='0'+i;

if(arr[i]=fopen(nameG,"r"))

eof[i]= fscanf(arr[i],"%4d%3d%*c",idG+i,pointG+i);

}

while(fscanf(fp, "%29[^$]%4d%4d%*c",details,&id,&point)==3){

for(i=0; i<10; i++)

while(eof[i]==2 && idG[i]==id){

point += pointG[i];

eof[i]=

fscanf(arr[i],"%4d%3d%*c",idG+i,pointG+i);

}

fprintf(newf,"%29s%04d%04d\n",details,id,point);

}

fclose(newf);

for(i=0; i<10; i++)

if(arr[i])fclose(arr[i]);

}

Page 21: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

21

21

b102clang קבצים – 17שאלה

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

.כ המכירות של הסוכן מעל סכום מקסימאלי שנקבע הסוכן מועמד לקידום"הסוכן ואם סה :כל שורה בקובץ מכילה, סוכנים של החברה של כל ה ראשינתון קובץ

תווים20 סוכןשם ה •

ספרות2 הסניףמספר •

ספרות 3 הסוכן פרמס •

תווים20 אזור פעילות •

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

:כילה את הפרטים הבאיםובץ מקכל כל שורה ב

ספרות2 סניףמספר ה •

ספרות 3 ןסוכמספר ה •

ספרות 7 כירותמ • ממוינים לפי מספר סניף בסדר עולה ובתוך אותו סניף לפי מספר סוכן גם בסדר םקבציה

.עולה כתוב פונקציה

void report(FILE* agent, FILE* fp[12], int min, int max, char* name1, char* name2) :שמקבלת כארגומנטים

• agentטי הסוכנים מצביע לקובץ הראשי של פר,

• fp בציי המכירות החודשייםק מצביעים ל12 מערך של,

• min ו-maxסכומים מינימאלי ומקסימאלי שנקבעו מראש

• name1 קובץ הסוכנים הקובץ החדש הוא . שם של קובץ חדש שהפונקציה יוצרת

עם בסוף הראשי לקובץ דומהבמבנה הקובץ . min-כ המכירות שלהם קטן מ"שסה

,) ספרות9( המכירות השנתיות של אותו סוכן כ"כל שורה סה

• name2 קובץ הסוכנים הקובץ החדש הוא . שם של קובץ חדש שהפונקציה יוצרת

עם בסוף הראשי לקובץ דומהבמבנה הקובץ . max-כ המכירות שלהם גדול מ"שסה

,) ספרות9(כ המכירות השנתיות של אותו סוכן "כל שורה סה

:כל שורה בקובץ מכילה •

ספרות2 סניף המספר •

ספרות 3 סוכןמספר ה •

תווים20 שם הסוכן •

ספרות 9 כירותמכ "סה • :שימו לב

בכל הקבצים אין תווי הפרדה בין השדות •

. יותר מפעם אחתלעבור על קובץאין •

קובץ ,עץ, רשימה משורשרת, מערך(למבנה נתונים אחר שלם אין להעתיק קובץ • ...)אחר

Page 22: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

22

22

#include<stdio.h>

#include<stdlib.h>

void report(FILE *agent, FILE* fp[12], int min, int max, char* name1,

char* name2){

FILE *f1, *f2;

int i,eof[12], id[12], idMain;

long sales[12], total;

char name[21];

if(!(f1=fopen(name1,"w"))) exit(1);

if(!(f2=fopen(name2,"w"))) exit(1);

for(i=0;i<12;i++)

eof[i]=fscanf(fp[i],"%5d%7ld*c",id+i,sales+i);

while(fscanf(agent, "%20[^$]%5d%*21*c",name, &idMain)==2){

total=0;

for(i=0;i<12;i++)

if(eof[i]!=EOF && id[i]==idMain){

total += sales[i];

eof[i]=fscanf(fp[i],"%5d%7ld*c", id+i, sales+i);

}

if(total < min)

fprintf(f1, "%05d%s%09d\n", idMain, name, total);

else

if(total >= max)

fprintf(f2, "%05d%s%09d\n", idMain, name, total);

}

fclose(f1);

fclose(f2);

}

Page 23: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

23

23

Clang101b:שאלה 18 – קבצים פתרון

מפגש " הרכבות מעוניינת לשפר את זמני הנסיעה של הרכבות על ידי מציאת נקודות חברת

.שקיימות" הרכבות

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

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

:לכל רכבת קיים קובץ מסלול יומי עם המבנה הבא

:בשורה הראשונה •o ספרות3 מספר קטר

: מהשורה השנייה ואילך •o ספרות במבנה 4 שעת הגעה למסילה hhmm שעות 24 בפורמט של

)0830 מיוצגת 8:30השעה (o תווים10 נקודת התחלתית o תווים10 נקודת סיום o ספרות4 סילהקוד מ o מסילה כפולה-2, מסילה יחידה -1(ספרה אחת סוג מסילה (

).אם המסילה כפולה אז אין בעיה של מפגש רכבות(

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

void trainReport(FILE *trainArray[ ], int trainNum, char *outfile)כתוב פונקציה

trainNum, מערך של מצביעים לקבצים של נתוני מסלולי הרכבותtrainArrayהמקבלת רשום מידע בקובץ החדש . חדש שהפונקציה יוצרתץבושל ק שם outfile, גודלו של המערך

. מבין כל הקבצים" מפגשי רכבות"על .כמובן שלא יכולים להגיע לאותה מסילה באותה שעה יותר משתי רכבות

: החדש כל שורה מכילה את הנתונים הבאיםבקובץ

hhmm ספרות במבנה 4שעת יציאה •

ספרות4 קוד מסילה •

הקטר עם המספר היותר קטן, ספרות3 1מספר קטר •

הקטר עם המספר היותר גדול, ספרות3 2מספר קטר •יון משנה לפי מספר הקובץ החדש מוין בסדר עולה לפי שעת יציאה מנקודת המוצא ומ

.מסילה

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

:ותהגבל

. יותר מפעם אחתלעבור על קובץאין •

קובץ ,עץ, רשימה משורשרת, מערך(למבנה נתונים אחר שלם אין להעתיק קובץ •

...)אחר

Page 24: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

24

24

#include<stdio.h>

#include <stdlib.h>

typedef struct train{

int eof, loco, time, num;

} train;

void trainReport(FILE *trainArray[ ], int trainNum, char *outfile){

train *arr;

FILE * fout;

int i, way, minTime=2500, ind1, ind2=-1;

if(!(fout=fopen(outfile,"w"))) exit(1);

arr = (train*)malloc(sizeof(train)*trainNum);

if(!arr)exit(1);

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

fscanf(trainArray[i], "%d", &arr[i].loco);

// search for the first line with way==1 in the file of

trainArray[i]

do

arr[i].eof = fscanf(trainArray[i],"%4d%*20c%4d%d",

&arr[i].time, &arr[i].num, &way);

while(way==2 && arr[i].eof==3);

}

while(1){

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

if(arr[i].eof!=3) continue;

if(arr[i].time > minTime) continue;

if(arr[i].time < minTime ){

minTime = arr[i].time;

ind1 = i; ind2=-1;

continue;

}

/* case of arr[i].time == minTime */

if(arr[i].num > arr[ind1].num) continue; // search for

the minimal railway number

if(arr[i].num < arr[ind1].num){

ind1 = i; ind2=-1;

continue;

}

/* case of arr[i].time == minTime && arr[i].num ==

arr[ind1].num */

if(arr[i].loco < arr[ind1].loco){

ind2 = ind1;

ind1 = i;

}

else

ind2 = i;

} // for

if(minTime == 2500) break; // case of eof in all the files

Page 25: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

25

25

if(ind2 >=0){ // 2 locomotives on the same railway found

fprintf(fout, "%04d%04d%03d%03d\n", minTime,

arr[ind1].num, arr[ind1].loco, arr[ind2].loco);

do

arr[ind2].eof =

fscanf(trainArray[ind2],"%4d%*20c%4d%d", &arr[ind2].time,

&arr[ind2].num, &way);

while(way==2 && arr[ind2].eof==3);

ind2 = -1;

}

do

arr[ind1].eof = fscanf(trainArray[ind1],"%4d%*20c%4d%d",

&arr[ind1].time, &arr[ind1].num, &way);

while(way==2 && arr[ind1].eof==3);

minTime = 2500;

}

free(arr);

fclose(fout);

}

Page 26: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

26

26

Clang091a Clang101b שאלה 19- רקורסיה

שלמים מערך של מספרים , int F[N][M]חיוביים שלמים ו של מספרים מימדינתון מערך דו של שורות kכל היותר האם קיימות לבדוק אנו נרצה ל.k שלם ומספר int S[M] חיובייםו

.S מערךבשל המספרים כך שאיחודם מכיל את כ(F המערך

:דוגמהל

F =

1 5 7

3 2 9

1 2 3

S =

7 2 3

בעלי (F מערך ב3 ושורה מספר 1שורה מספר : אנו נקבל תשובה חיובית כיk=2עבור

.S המערך המכילות את כל מספרי1,5,7,2,3: מכילות את המספרים) 2 - ו0האינדקסים כל הכילשמ F מערךכיוון שאין שורה אחת ב, ה שלילית נקבל כי התשובאולם עבור

:ח שיש ברשותך את הפונקציות הבאותיהנ .Sהמערך אברי

אברי המערך הם אפס M כל אם 1מחזירה 0אחרת מחזירה

int all_zero(int x[M]) ;

אשר xמאפסת את כל איברי המערך yמערך מופיעים ב

void x_zero( int x[M],int y[M]) ;

dest copy(int dest[M], int src[M]); void למערך srcמערך המעתיקה את תוכן

S כל המערך ניתן לכסות אתאם 1 המחזירה covers הרקורסיבית את הפונקציה השלם .ית-i- כאשר מתחילים מהשורה הF המערך שורות מkלכל היותר י "ע

int covers( int F[N][M], int S[M], int i, int k){

int temp[M] = {0};

if (?? 0 ??)

?? 1 ?? ;

if (?? 2 ?? )

?? 3 ?? ;

?? 4 ??

?? 5 ?? ;

?? 6 ?? ;

?? 8 ?? ;

?? 8 ?? ;

} פתרון:

int covers(int F[N][M],int S[M],int i,int k){

int temp[M]={0};

if( all_zero(S))

return 1;

if( k==0 || i==N )

return 0;

if(covers(F,S,i+1,k))

return 1;

copy(temp,S);

x_zero(temp,F[i]);

return covers(F,temp,i+1,k-1);

}

Page 27: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

27

27

שאלה 20 – רקורסיה {

.נתון מערך של אורכי לבנים

.int bricks[3]={1,2,3} מוגדר מערך3 - ו2, 1למשל עבור לבנים באורך של

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

:מקבלת כארגומנטים )int *bricks, int size, int width) int HowManySets הפונקציה

• bricks - בסדר עולההמערך ממוין, הלבנים מערך של אורכי ,

• size - גודל המערך,

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

bricks . שרשום במערך אורךמספר הלבנים מכל bricks אינו מוגבל . 7הפונקציה מחזירה 4 שווה width -למשל עבור מערך הדוגמה ו

:הסידורים האפשריים הםכי 1 1 1 1 2 1 1 1 2 1 3 1 1 1 2 2 2 1 3 . ?? N ?? -שובות הקטעים החסרים המסומנים ב השלימו בדף הת

int HowManySets (int *bricks, int size, int width){

int res=0,i;

if( ?? 1 ?? ) return 1;

for( ?? 2 ?? )

if( ?? 3 ?? >=bricks[i])

?? 4 ?? += HowManySets (?? 5 ?? , ?? 6 ?? , ?? 7

??);

return ?? 8 ??; }

פתרון:

int HowManySets (int *bricks, int size, int width){

int res=0,i;

if( ! width ) return 1; for( i=0; i<size; i++ )

if( width >=bricks[i])

res += HowManySets (bricks, size, width-

bricks[i]);

return res ;

}

Page 28: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

28

28

clang101a שאלה 21 – רקורסיה : התכנית הבאהנתונה

void what(char *s1, char *s2, char *temp, int index){ if (*s1 == '\0'){

strcpy(temp+index, s2); printf("%s\n", temp); return;

} if (*s2 == '\0'){

strcpy(temp+index, s1); printf("%s\n", temp); return;

} temp[index] = *s1; what(s1+1, s2, temp, index+1); temp[index] = *s2; what(s1, s2+1, temp, index+1);

}

int main(){

char *str1 = "AB";

char *str2 = "xyz";

char *temp= (char *)malloc(strlen(str1)+strlen(str2)+1);

what(str1, str2, temp, 0);

}

? מה הפלט של התכנית.'סעיף א

?what מטרתה של הפונקציה הסבר בקצרה מה.'סעיף ב :פתרון

) נקודות 10(סעיף א

ABxyz

AxByz

AxyBz

AxyzB

xAByz

xAyBz

xAyzB

xyABz

ayAzB

xyzAB

) נקודות 5(סעיף ב

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

Page 29: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

29

29

a041prog רקורסיה – 22שאלה

void shablul(int** ar, int row1, int col1, int row2, int col2) רקורסיביתכתוב פונקציה

' הפונק.בצורת שבלול 1- במספרים עולים החל מarמימדי -שממלאת את המערך הדומאלי עליון של של התא הש) col1(ועמודה ) row1(שורה ' מס, arמקבלת מצביע למערך

אין להגדיר . של התא הימני תחתון של המערך) col2(ועמודה ) row2(שורה ' המערך ומס . פונקציה נוספת

shablul(ar, 0, 0, 3, 4) לדוגמא עבור

:נקבל

:פתרון#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define ROWS 4

#define COLS 5

void shablul(int** ar, int row1, int col1, int row2, int col2)

{

int i;

static int num = 1;

if (row1<=row2 && col1<=col2)

{

/*Filling top row:*/

for (i=col1; i<=col2; i++)

ar[row1][i] = num++;

/*Filling right column: */

for (i=row1+1; i<=row2; i++)

ar[i][col2] = num++;

/*Filling bottom row: */

if (row2>row1)/*only when the array has more than one row. */

for (i=col2-1; i>=col1; i--)

ar[row2][i] = num++;

/*Filling left column:*/

if (col2>col1)/*only when the array has more than one column. */

for (i=row2-1; i>row1; i--)

ar[i][col1] = num++;

shablul(ar, row1+1, col1+1, row2-1, col2-1);

}

5 4 3 2 1

6 17 16 15 14

7 18 19 20 13

8 9 10 11 12

5 4 3 2 1

6 17 16 15 14

7 18 19 20 13

8 9 10 11 12

Page 30: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

30

30

}

את השורה , את העמודה הימנית, הוא למלא במספרים את השורה העליונההעקרון

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

shablul(1,1,2,3) :היהבע

17 16 15

18 19 20

:אשית שממחישה את השימוש בפונקציהתוכנית ר

void main()

{

int i,j;

int **arr;

if(!(arr=(int **)malloc(ROWS*sizeof(int *))))

{

printf("Error allocating memory! Exitting…");

return;

}

for(i=0;i<ROWS;i++)

{

if(!(*(arr+i)=(int *)malloc(COLS*sizeof(int))))

{

printf("Error allocating memory! Exitting…");

return;

}

}

shablul(arr,0,0,ROWS-1,COLS-1);

/*Print the shablul array:*/

for(i=0;i<ROWS;i++)

{

for(j=0;j < COLS;j++)

printf("%d\t",arr[i][j]);

printf("\n");

}

}

Page 31: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

31

31

a032clang רקורסיה – 32שאלה

lines- בכוכביות בV שמדפיסה את האות void V(int lines) רקורסיביתכתוב פונקציה .שורות

:יודפסV(5) לדוגמא עבור * *

* *

* *

* *

*

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

:1 פתרון

void V( int lines ){

static int firstSpace=0;

int i;

for (i=0; i < firstSpace; i++) printf(" ");

printf ("*");

if (lines == 1){

printf("\n");

firstSpace =0;

return ;

}

for (i=0; i< ((2*lines-3)) ; i++) printf(" ");

printf("*\n");

firstSpace ++;

V(lines-1);

}

) מוגבלlinesעבור (2פתרון void V(int lines){

static int start=0;

char str[]=" ";

str[start]=str[2*lines-2+start++]='*';

puts(str);

if(n==1){

start=0;

return;

}

V(lines-1);

}

Page 32: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

32

32

a032prog – רקורסיה 24שאלה

lines- בכוכביות בX שמדפיסה את האות void X(int lines) רקורסיביתכתוב פונקציה ). זוגי- נתון אי lines(שורות

:יודפסX(9) לדוגמא עבור

* *

* *

* *

* *

*

* *

* *

* *

* *

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

:פתרון

void X(int lines){

int static blank;

int i;

if (lines < 1) return;

for (i=0; i<blank; i++) putchar(' ');

putchar('*');

if(lines==1){

puts("");

return;

}

for (i=0; i<lines-2; i++) putchar(' ');

puts("*");

blank++;

X(lines -2);

blank--;

for (i=0; i<blank; i++) putchar(' ');

putchar('*');

for (i=0; i<lines-2; i++) putchar(' ');

puts("*"); }

Page 33: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

33

33

קבצים- 25 שאלה

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

תווים30 - שם העובד •

ספרות9 - .ז.ת •

ספרות2 - מחלקה •.ז.הקובץ ממוין לפי ת

.ל ומצביע לקובץ חדש" שמקבלת מצביע לקובץ הנdoublesortכתוב פונקציה

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

.אין להעתיק את הקובץ למבנה נתונים אחר

:תשובהvoid doublesort(FILE *old, FILE *new){

int dept, i;

char details[40];

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

rewind(old);

while(fscanf(old,”%39[^$]%2d%*c”,details,&dept) ==2)

if (dept==i)

fprintf(new, “%s%02d\n”, details, dept);

}

}

Page 34: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

34

34

a121Clang קבצים– 25שאלה

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

.מהירות גלויות ונסתרות ומצלמות רמזור

number עד 1-הקבצים ממוספרים מ, מתועדים נתוני העברותלכל מצלמה קובץ שבו

- number 1- ולכל אחד שם מתאים מ- הוא מספר המצלמות שהותקנו.txt עד number.txt . : כל הקבצים במבנה דומה

:בשורה הראשונה של הקובץ מופיעים

תווים20 -מיקום המצלמה •

תווים10 - סוג מצלמה •

:הבאיםעברות ה מכילה את פרטיובהמשך כל שורה בקובץ

)120216 לדוגמה התאריך של היום מקודד yymmdd( ספרת 6 – תאריך •

)0900 מקודדת 9:00 לדוגמה השעה hhmm(ות ספר 4 – שעה •

ספרת 3 – מהירות •

ספרות7 – הרכב' מס •

תווים20 –שם קובץ תמונה •

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

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

numberמקבלת ש int radar(int number) פונקציהבונכתמשטרת ישראל על מנת לעזור ל . מספר המצלמות שהותקנו

dat.ב עם סיומת יוצרת קובץ ששמו מספר הרכהפונקציה עבריין תנועה עבור כל

:כל שורה בקובץ מכילה

)120216 לדוגמה התאריך של היום מקודד yymmdd( ספרת 6 – תאריך •

)0900 מקודדת 9:00 לדוגמה השעה hhmm(ות ספר 4 – שעה •

ספרות4 – מצלמה' מס •

תווים20 –מיקום המצלמה •

ספרת 3 – מהירות •

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

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

::::שימו לבשימו לבשימו לבשימו לב

בכל הקבצים אין תווי הפרדה בין השדות •

. יותר מפעם אחתלעבור על קובץאין •

...)קובץ אחר,עץ, רשימה משורשרת, רךמע(אין להעתיק קובץ למבנה נתונים אחר •

Page 35: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

35

35

:תשובה

typedef struct camera{

FILE *fp;

int eof;

char place[21], time[11];

} camera;

int radar( int number){

camera *arr;

FILE *fp;

char filename[12] , *minTime="9913", photo[21];

int i, index=-1, speed, car,;

if(!(arr=(camera*)malloc(sizeof(camera)*number)))exit(1);

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

sprintf(filename, "%d.txt", i+1);

if(!(arr[i].fp=fopen(filename, "r")))return 0;

fscanf(arr[i].fp, "%20[^$]%*11c", arr[i].place);

arr[i].eof=fscanf(arr[i].fp, "%10s", arr[i].time);

}

while(1){

for(i=0; i<number; i++)

if(arr[i].eof==1&& strcmp(arr[i].time, minTime)<0){

minTime = arr[i].time;

index = i;

}

if(index==-1) break;

arr[index].eof = fscanf(arr[index].fp,

"%3d%7d%20[^$]%*c", &speed, &car, photo);

sprintf(filename, "%d.dat", car);

if(!(fp=fopen(filename, "a")))return 0;

fprintf(fp, "%s%04d%s%03d%s\n", minTime, index,

arr[index].place, speed, photo);

if(fclose(fp)==EOF) return 0;

arr[index].eof=fscanf(arr[index].fp,"%10s",

arr[index].time);

index=-1;

minTime="9913";

}

for(i=0; i<number; i++)

if(fclose(arr[i].fp)==EOF) return 0;

free(arr);

return 1;

}

Page 36: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

36

36

) נקודות16 (26שאלה

: הבאותהפונקציותשתי נתונות #define M 8

#define N 8

void What1( int mat[][M], int i, int j, int c){

int di, dj;

if (i < 0 || i > N – 1 || j < 0 || j > M-1 || mat[i][j])

return;

mat[i][j] = c;

for (di = -1; di<=1 ; di++)

for (dj = -1 ; dj<=1 ; dj++)

What1(mat, i+di, j+dj, c);

}

int What2(int mat[][M]) {

int count=1, i, j;

for (i=0; i < N; i++)

for (j=0; j < M; j++)

if (mat[i][j] == 0) {

count++;

What1(mat, i, j, count);

}

return count – 1;

}

) נקודות6(סעיף א

:המערך הבא mat1 יהי

What1(mat1, 3, 2, 2) -יאה לרהקלאחר mat1 צייר את המערך

0 0 0 0 0 0 0 0

1 1 1 1 1 0 0 0

1 0 1 0 1 1 1 0

1 1 1 0 1 0 1 0

1 0 0 1 0 0 1 0

1 1 1 1 1 1 1 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

Page 37: הרזח לוגרת - BGUprog131/wiki.files/review-sol...הרזח לוגרת םייראניב םיצע – 1 ה לאש: האבה הרדגהה הנותנ typedef struct node{ int val

37

37

) נקודות6 (בסעיף

: המערך הבאmat2יהי

.ואת הערך שהפונקציה מחזירה What2(mat2) -יאה לרלאחר הק mat2צייר את המערך

) נקודות4 (גסעיף

.2What - ו1Whatמה עושות הפונקציות בקצרה הסבר

:פתרון

אסעיף

What1(mat1, 3, 2, 2)

בסעיף

גסעיף

map[i][j] את כל התאים השכנים שבגוש של map[i][j]מהנקודה " צובעת "what1הפונקציה ).paintbrush- בfill-בדומה ל. (cשמכילים אפסים לצבע

- בfill-בדומה ל (2כל גוש בצבע אחר מהצבע " צובעת "what2הפונקציה paintbrush.(ושים שצבעוומחזיר מספר הג.

0 0 0 0 0 0 0 0

1 1 1 0 0 0 0 0

1 0 1 0 1 1 1 0

1 0 1 1 1 0 1 0

1 0 0 1 1 0 1 0

1 1 1 1 1 1 1 0

0 0 0 0 0 1 0 0

0 0 0 0 0 1 0 0

0 0 0 0 0 0 0 0

1 1 1 1 1 0 0 0

1 0 1 2 1 1 1 0

1 1 1 2 1 2 1 0

1 2 2 1 2 2 1 0

1 1 1 1 1 1 1 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

2 2 2 2 2 2 2 2

1 1 1 2 2 2 2 2

1 3 1 2 1 1 1 2

1 3 1 1 1 4 1 2

1 3 3 1 1 4 1 2

1 1 1 1 1 1 1 2

5 5 5 5 5 1 2 2

5 5 5 5 5 1 2 2


Recommended