טהמ לש c תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא...

16
פתרון ל מבחן מה"ט בשפתC מועד אביב תשע"ז, פברואר2017 עמוד1 פתרון מוצע לבחינה בשפתC של מה"ט מועד אביב תשע" ז, פברואר2017 מחבר: מר עסאקלה שאדי, מכללת אורט בראודה שאלה מספר1 נתונה התכנית הבאה בשפתC : #include<stdio.h> #define SUM_OF_3(x,y,z) x+y+z #define AVRG_OF_3(x,y,z) (x+y+z)/3 #define AVRG1_OF_3(x,y,z) SUM_OF_3(x,y,z)/3 void main() { 1. int a=10,b=8,c=7; 2. printf("The average of %d,%d,%d is %d\n",a,b,c,AVRG_OF_3(a,b,c)); 3. a<<=1; 4. b>>=1; 5. c^=1; 6. printf("The average of %d,%d,%d is %d\n",a,b,c,AVRG_OF_3(a,b,c)); 7. a>>=1; 8. b<<=1; 9. c^=1; 10. printf("The average of %d,%d,%d is %d\n",a,b,c,AVRG1_OF_3(a,b,c)); } בתוכנית יש שלוש פקודות הדפסה. מה תדפיס התוכנית עבור כל אחת מפקודת ההדפסה הללו? כתוב טבלת מעקב ופרט את החישו בים. השורות מוספרו לצורך נוחות בלבד. נבנה טבלת מעקב שתכלול בתוכה את המשתניםa,b,c : שורהa b c פלט הערות+ הסבר1 10 8 7 - הגדרת משתנים2 ללא שינוי ללא שינוי ללא שינויThe average of 10,8,7 is 8 לשים לב שבתרגילים כאלה עדיף שבמקום פקודת המאקרו להחליף בקוד שהיא מייצגת וזה ימנע טעויות. כאן הערך שלAVRG_OF_3(a,b,c) הוא בעצם(a+b+c)/3 החישוב נותן25/3 התשובה היא8.5 , מכיוון שההדפסה היא לערך מסוגint )שלם( יודפס8 3 20 ללא שינוי ללא שינוי- הפעולהa<<=1 היא בעצם לכפול אתa ב2 . או שניתן לעשות ברמת הסיביות:

Upload: others

Post on 24-Feb-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

1עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

של מה"ט Cפתרון מוצע לבחינה בשפת

2017 פברואר, ז"תשע אביב מועד בראודה אורט מכללת, שאדי עסאקלהמר : מחבר

1שאלה מספר

:Cנתונה התכנית הבאה בשפת #include<stdio.h> #define SUM_OF_3(x,y,z) x+y+z #define AVRG_OF_3(x,y,z) (x+y+z)/3 #define AVRG1_OF_3(x,y,z) SUM_OF_3(x,y,z)/3 void main() { 1. int a=10,b=8,c=7; 2. printf("The average of %d,%d,%d is %d\n",a,b,c,AVRG_OF_3(a,b,c)); 3. a<<=1; 4. b>>=1; 5. c^=1; 6. printf("The average of %d,%d,%d is %d\n",a,b,c,AVRG_OF_3(a,b,c)); 7. a>>=1; 8. b<<=1; 9. c^=1; 10. printf("The average of %d,%d,%d is %d\n",a,b,c,AVRG1_OF_3(a,b,c)); }

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

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

a,b,c:

הסבר + הערות פלט a b c שורה

הגדרת משתנים - 7 8 10 1

ללא 2 שינוי

ללא שינוי

ללא שינוי

The average of 10,8,7 is 8

לשים לב שבתרגילים כאלה עדיף שבמקום פקודת המאקרו להחליף בקוד

שהיא מייצגת וזה ימנע טעויות.

כאן הערך של AVRG_OF_3(a,b,c) הוא

בעצם (a+b+c)/3

התשובה 25/3החישוב נותן , מכיוון שההדפסה 8.5היא

)שלם( intהיא לערך מסוג 8יודפס

ללא 20 3 שינוי

ללא שינוי

היא בעצם a<<=1הפעולה -. או שניתן 2ב aלכפול את

לעשות ברמת הסיביות:

Page 2: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

2עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

10 = 10102 הזזה אחד שמאלה נותנת

.20שזה בעצם 210100

ללא 4 שינוי

ללא 4 שינוי

היא בעצם b<<=1הפעולה -חישוב )או 2 -חלוקה ב

. (בינארי כמו בחלק הקודם 4התוצאה היא

ללא 5 שינוי

ללא שינוי

לערך 1עם XOR -פעולת ה - 6בינארי 111היא בעצם 7

, 110, שזה בעצם 1עם .6כלומר הערך

ללא 6 שינוי

ללא שינוי

ללא שינוי

The average of 20,4,6 is 10

בדומה לחלק הראשון, כאן הערך של

AVRG_OF_3(a,b,c) הוא בעצם

(a+b+c)/3 התשובה 30/3החישוב נותן

10היא

ללא 10 7 שינוי

ללא שינוי

פעולה הפוכה למה שהיה -, כלומר כאן חלוקה 3בשורה

יחזור aולכן ערכו של 2ב .10להיות

ללא 8 שינוי

ללא 8 שינוי

פעולה הפוכה למה שהיה , ולכן כופלים את 4בשורה

וחוזר להיות 2-ב bערכו של 8

ללא 9 שינוי

ללא שינוי

היא בין XORכאן פעולת ה 7 110XOR1. כלומר: 1 -ל 6

כלומר 111והתוצאה היא 7הוא cערכו של

ללא 10 שינוי

ללא שינוי

ללא שינוי

The average of 10,8,7 is 20

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

בצורה ברורה על מנת לא לטעות, במיוחד כשיש

סוגריים וחלוקה. התוצאה בעצם היא:

AVRG1_OF_3(a,b,c) = SUM_OF_3(a,b,c)/3 = a + b + c /3 ניתן לראות שבגלל שפעולת

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

תהיה:10 + 8 + 7/3 = 10 + 8 + 2 = 20

2.333=7/3הערה: אומנם אבל מכיוון שזה שלם

.2התוצאה היא

Page 3: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

3עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

2שאלה מספר

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

לצורך הדגמה השתמשתי בדוגמא שהופיעה בבחינה. :1ה הער לפי הדרישות.: לא נבנתה מחרוזת חדשה אלא הדפסה 2הערה

Page 4: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

4עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

#include<stdio.h> #include<stdlib.h> #include<string.h> void PrintDecoded(char *text, char *str2insert) { char *code,*ptr,ch,*ptr2; int count=0,k=0; ptr=text; ch=*ptr; // תו ראשון במחרוזת ptr++; // עומד על התו השני במחרוזת while(*ptr!=ch){ // לולאה לחישוב אורך הקוד count++; ptr++; } code=(char *)malloc(sizeof(char)*(count+1)); // הקצאה דינמית כדי לשמור את הקוד במתוך מחרוזת ptr=text; ptr++; while(*ptr!=ch){ *(code + k++)=*ptr; // העתקת הקוד על לתו הבא ששווה בערכו לתו הראשון ptr++; } *(code + k) = 0; // סיום מחרוזת ptr++; ptr2=strstr(ptr,code); // מקבל את הכתובת של המופע הראשון של הקוד while(ptr2!=NULL) // קודים במחרוזתכל עוד יש { while(ptr!=ptr2) // לולאה שרצה עד למופע הראשון ומדפיסה תווים { printf("%c",*ptr); ptr++; } printf("%s",str2insert); // מדפיסים במקום הקוד את המחרוזת המקורית ptr+=count; // מקדמים מצביע לאחרי הקוד ptr2=strstr(ptr,code); // קבלת הכתובת של המופע הבא } printf("%s",ptr); // בסוף מדפיסים את החלק שנשאר במחרוזת ללא קודים } void main() //דוגמא { char *text="#123#Choose carfully your 123 because in these days it is more than just 123."; char str2insert[15]="mobile phone"; PrintDecoded(text,str2insert); }

Page 5: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

5עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

3שאלה מספר

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

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

.בנפרד

Page 6: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

6עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

#include<stdio.h> #include<stdlib.h> typedef struct node{ // המבנההגדרת int num; struct node *next; }NODE; void del(NODE *head)// פונקציה שמקבלת ראש רשימה ומוחקת אותה מהזכרון { NODE *temp; while(head) { temp=head; head=head->next; free(temp); } } NODE *func(int num)// ומייצרת ומחזירה צומת חדשפונקציה שמקבלת את הערך המספרי של צומת

{ NODE *p; p=(NODE *)malloc(sizeof(NODE)); p->num=num; p->next=NULL; return p; } NODE *add(NODE *head,NODE *p) // פונקציה שמקבלת ראש רשימה ואיבר ומוסיפה לסוף הרשימה { NODE *temp=head; if(head==NULL) return p; while(temp->next) temp=temp->next; temp->next=p; return head; } NODE * Reorder(NODE *head) { NODE *newList=NULL,*temp=head,*p; while(temp) // רצים על כל אברי הרשימה { if((temp->num)%2 == 1) // קודם מעתיקים לרשימה החדשה את האי זוגיים

{ p=(NODE *)malloc(sizeof(NODE));//הקצאה p->num=temp->num; p->next=NULL; newList=add(newList,p); // הוספה לסוף הרשימה } temp=temp->next; }

Page 7: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

7עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

temp=head; while(temp) { if((temp->num)%2 == 0)// העתקת הזוגיים אחרי האי זוגיים { p=(NODE *)malloc(sizeof(NODE)); p->num=temp->num; p->next=NULL; newList=add(newList,p); } temp=temp->next; } return newList; } void main() { int i; NODE *head=NULL,*p=NULL,*newList; בנית רשימה חדשה////

p=func(3); head=add(head,p); p=func(8); head=add(head,p); p=func(5); head=add(head,p); p=func(12); head=add(head,p); p=func(7); head=add(head,p); p=func(6); head=add(head,p); p=head; while(p) // ה להדפסת הרשימה המקוריתלולא { printf("%d ",p->num); p=p->next; } printf("\n"); newList = Reorder(head); // קריאה לפונקציה לבנית רשימה חדשה p=newList; while(p) //לולאה להדפסת רשימה חדשה { printf("%d ",p->num); p=p->next; } del(head); // שחרור רשימה מקורית del(newList); // שחרור רשימה חדשה }

Page 8: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

8עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

4שאלה מספר

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

Page 9: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

9עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

#include<stdio.h> #include<stdlib.h> #define MSIZE 10 #define VERTICAL 0 #define HORIZONTAL 1 #define SHIP '*' #define EMPTY '.' int IsAvailable(char board[MSIZE][MSIZE], int ship_size, int row, int col, int dir) { int i,j; if(dir==HORIZONTAL) // אם הכיוון אופקי { if(col!=0 && board[row][col-1]!=EMPTY) return 0; // אם העמודה היא לא

עמודה ראשונה ולפני הספינה יש מקום ריק

if((col + ship_size)>=MSIZE) return 0; // מגבולות הלוחאם אין חריגה if(board[row][col+ship_size]!=EMPTY) return 0;//אם אחרי הספינה ריק

if(row==0) // אם הספינה בשורה ראשנה { for(j=col;j<col+ship_size;j++) // בדיקת כל מה שמתחת לספינה { if(board[row+1][j]!=EMPTY) return 0; } if(j<MSIZE && board[row+1][j]!=EMPTY) return 0;// בדיקת אלכסון אחרי הספינה } else if(row==MSIZE-1)// אם הספינה בשורה אחרונה { for(j=col;j<col+ship_size;j++) { if(board[row-1][j]!=EMPTY) return 0;// בדיקת כל המקומות מעל לספינה } if(j<MSIZE && board[row-1][j]!=EMPTY) return 0;// בדיקת אלכסון } else // הספינה לא בשורה ראשונה ולא באחרונה { if(board[row-1][col-1]!=EMPTY) return 0;// אלכסון שמאלי עליון

if(board[row][col-1]!=EMPTY) return 0;// מקום משמאל if(board[row+1][col-1]!=EMPTY) return 0;// אלכסון שמאלי תחתון

if(board[row-1][col+ ship_size]!=EMPTY) return 0;// אלכסון ימני עליון if(board[row][col+ship_size]!=EMPTY) return 0;//איבר ימני if(board[row+1][col+ship_size]!=EMPTY) return 0;// אלכסון ימני תחתון for(j=col;j<col+ship_size;j++)//כל האברים מעל ומתחת לספינה {

Page 10: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

10עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

if(board[row+1][j]!=EMPTY || board[row-1][j]!=EMPTY) return 0; } } } if(dir==VERTICAL) // הכיוון אנכי כל הבדיקות כמו מקודם אבל בכיוונים הפוכים { if(row!=0 && board[row-1][col]!=EMPTY) return 0; if((row + ship_size)>=MSIZE) return 0; if(board[row+ship_size][col]!=EMPTY) return 0; if(col==0) { for(i=row;i<row+ship_size;i++) { if(board[i][col+1]!=EMPTY) return 0; } if(i<MSIZE && board[i][col+1]!=EMPTY) return 0; } else if(col==MSIZE-1) { for(i=row;i<row+ship_size;i++) { if(board[i][col-1]!=EMPTY) return 0; } if(i<MSIZE && board[i][col-1]!=EMPTY) return 0; } else { if(board[row-1][col-1]!=EMPTY) return 0; if(board[row-1][col]!=EMPTY) return 0; if(board[row-1][col+1]!=EMPTY) return 0; if(board[row+ship_size][col-1]!=EMPTY) return 0; if(board[row+ship_size][col]!=EMPTY) return 0; if(board[row+ship_size][col+1]!=EMPTY) return 0; for(i=row;i<row+ship_size;i++) { if(board[i][col-1]!=EMPTY || board[i][col+1]!=EMPTY) return 0; } } } return 1;// 1אם הכל עבר בשלום מחזירים }

Page 11: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

11עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

void main() // דוגמאות { char board[MSIZE][MSIZE] ={{SHIP,SHIP,SHIP,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY}, {EMPTY,EMPTY,EMPTY,EMPTY,SHIP,SHIP,SHIP,EMPTY,EMPTY,EMPTY}, {EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY}, {EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY}, {EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY}, {EMPTY,EMPTY,EMPTY,EMPTY,SHIP,SHIP,SHIP,EMPTY,EMPTY,EMPTY}, {EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY}, {EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY}, {EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY}, {EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY}}; int x; x=IsAvailable(board, 4, 0, 0, HORIZONTAL); printf("\nx = %d\n",x); x=IsAvailable(board, 4, 3, 0, HORIZONTAL); printf("\nx = %d\n",x); x=IsAvailable(board, 4, 4, 0, HORIZONTAL); printf("\nx = %d\n",x); x=IsAvailable(board, 4, 0, 0, VERTICAL); printf("\nx = %d\n",x); x=IsAvailable(board, 3, 2, 1, VERTICAL); printf("\nx = %d\n",x); }

Page 12: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

12עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

חלק ג 5שאלה מספר

נתונה התכנית הבאה:#include<stdio.h> void func(int *a,int s, int num) { int *p=a+num%2; int z = (s+1-num%2)/2; int i,j,m,x; for(i=0;i<z;i++) { for(j=2,m=0;j<(z-i)*2;j+=2) if(*(p+j)>*(p+m)) m=j; x=*(p+(z-i-1)*2); *(p+(z-i-1)*2) = *(p+m); *(p+m)=x; } } void main() { int data[] = {5,2,7,6,1,-3,9,0,4,-2,8,3}; int i,num; printf("Enter a number: "); scanf("%d",&num); func(data,sizeof(data)/sizeof(data[0]),num); printf("\nData is:\n"); for(i=0;i<sizeof(data)/sizeof(data[0]);i++) printf("%d ",*(data+i)); }

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

הוא מספר אי זוגי, אם כן היא מסדרת את המספרים במקומות האי זוגיים במערך numשל זוגי היא מסדרת את המספרים במקומות הזוגיים בסדר numבסדר עולה. אם המספר

עולה.. בכל פעם הלולאה נותנת את האינדקס של האיבר 2אה רצה בקפיצות של לשים לב שהלולשכבר סודרו( ומעבירה אותו לסוף )לא כולל המקומות שסודרו(. המספריםהגדול )לא כולל פעמים שהוא בעצם סה"כ האיברים האלה. zהיא עושה זאת

יודפס: 5ב. אם נקלט 5 -3 7 -2 1 0 9 2 4 3 8 6

נשאר אותו סדר המספריםקומות האי זוגיים, במקומות הזוגיים מסדרת את המספרים במ דבר.

יודפס: 6ג. אם נקלט 1 2 4 6 5 -3 7 0 8 -2 9 3

נשאר אותו סדר המספרים מסדרת את המספרים במקומות זוגיים, במקומות האי זוגיים דבר.

Page 13: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

13עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

6שאלה מספר נתונה התוכנית הבאה:

#include<stdio.h> void func(char *s) { char tmp; int z; if(*s!=' ' && *s!='\0') { for(z=0;s[z]!=' ' && s[z]!='\0';z++); z--; tmp = *s; *s=*(s+z); *(s+z)=' '; func(s+1); *(s+z)=tmp; } } void main() { char str[] = "good luck on exam"; char *p; p=str; while(*p!='\0') { while(*p==' ') p++; func(p); while(*p!=' ' && *p!='\0') p++; } printf("%s\n",str); }

?funcא. מה מבצעת פונקציה הפונקציה מקבלת מחרוזת. בצורה רקורסיבית, בכל פעם אם לא הגענו לרווח או לסוף

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

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

)לא מחרוזת הפוכה(. ב. בהמשך להסבר, בדוגמא המופיעה יודפס:

doog kcul no maxe

Page 14: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

14עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

7שאלה מספר הבאה:נתונה התוכנית

#define MS 5 void func(int m[MS][MS]) { int a,b,c,d,p,q; for(p=0;p<MS/2;p++) { for(q=p;q<MS-p-1;q++) { a=m[p][q]; b=m[q][MS-p-1]; c=m[MS-p-1][MS-q-1]; d=m[MS-q-1][p]; m[p][q] = d; m[q][MS-p-1]=a; m[MS-p-1][MS-q-1]=b; m[MS-q-1][p]=c; } } } void main() { int m[MS][MS]; int i,j; for(i=0;i<MS;i++) for(j=0;j<MS;j++) m[i][j] = i; func(m); for(i=0;i<MS;i++) { for(j=0;j<MS;j++) printf("%d ",m[i][j]); printf("\n"); } }

.5X5הפונקציה מקבלת מערך דו מימדי בגודל ?funcנקציה א. מה מבצעת פובעזרת שתי הלולאות היא רצה כל פעם על טבעת )מסגרת( של המטריצה, בהתחלה על

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

מימין למעלה עובר למקום האחרון מימין למטה, אחרון מימין למטה עובר למקום הראשון משמאל למטה. הראשון משמאל למטה עובר למקום הראשון משמאל למעלה.

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

0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4

Page 15: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

15עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

המטריצה החדשה שתודפס על המסך:4 3 2 1 0 4 3 2 1 0 4 3 2 1 0 4 3 2 1 0 4 3 2 1 0

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

8תרגיל מספר

נתונה התוכנית הבאה:#include<stdio.h> void func1(int *px, int *py, unsigned char c) { if(*py<sizeof(long int)/sizeof(unsigned char)) { (*px)<<=8; (*px)|=c; (*py) ++; } } char func2(int *px, int *py) { unsigned char tmp = '\0'; if(*py>0) { tmp = (*px) >>8; (*px)>>=8; (*py)--; } return tmp; } void main() { unsigned char ch; int x; int y=0,opr; printf("Enter an operation (0/1) or -1 to stop: "); scanf("%d",&opr); while(opr!=-1) { if(opr==0) { printf("Enter a char: "); flushall(); scanf("%c",&ch); func1(&x,&y,ch); }

Page 16: טהמ לש C תפשב הניחבל עצומ ןורתפ ראורבפ זעשת ביבא ......דומע ראורבפ ז"עשת ביבא דעומ – C תפשב ט"המ ןחבמל ןורתפ

16עמוד 2017מועד אביב תשע"ז, פברואר – Cבשפת מה"ט מבחן פתרון ל

else if(opr==1) ch = func2(&x,&y); printf("Enter an operation (0/1) or -1 to stop: "); scanf("%d",&opr); } while(y>0) { y--; ch=x>>(8*y); printf("%c",ch); } }

א. מה תדפיס התוכנית על הקלט הבא )משמאל לימין(:0 a 0 b 0 c 0 d -1

.1-עד שייקלט הערך oprהתוכנית רצה וקולטת ערכים לתוך המשתנה 0, אם 1או 0ט הוא , התוכנית בודקת אם הערך שנקל1-במידה ונקלט ערך שונה מהערך .func1היא קולטת תו וקוראת לפונקציה

והקוד אסקיי של התו שנקלט. yושל xמקבלת כתובות של משתנה func1הפונקציה , כלומר charחלקי גודל משתנה intגודל משתנה )-קטן מ yהפונקציה בודקת אם ערכו של

של ORהסיביות בעזרת שער סיביות ומכניסה את 8שמאלה x. אם כן, היא מזיזה את (4לתוך שמונת הסיביות מימין. כלומר היא מתנהגת כ"מחסנית" לשמירת משתנים cמשתנה

.xבתוך משתנה charמסוג אזי יודפסו func 1, כלומר תמיד נקרא לפונקציה 1מכיוון שבסדרה שנקלטה אין קליטת ערך

סיביות מתוך ch 8שכל פעם מכניסה ל main -הערכים שנקלטו בעזרת הלולאה האחרונה בx כל פעם(. בסוף יודפס 8)יש הזזהabcd.

ב. מה תדפיס התוכנית על הקלט הבא )משמאל לימין(: 0 a 0 b 1 0 c -1

.abמימין את הערכים xולכן יוכנס ל func1כאן בהתחלה יש קריאה פעמיים לפונקציה .func2, יש קריאה לפונקציה 1כאשר נקלט

זאת אם יש x. בודקת אם יש תווים בתוך yושל xמקבלת את הכתובת של func1הפונקציה ימינה, ומחסירה 8. אם כן היא מוחקת את התו האחרון שהוכנס על ידי הזזה yערכים בתוך

.yמערכו של 1 כלומר בסדרה שנקלטה יודפס:

ac .c, ובסוף נקלט 1כשנקלט b, לאחר מכן מחיקת b, לאחר מכן aכי בהתחלה נקלט

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