Presentation is loading. Please wait.

Presentation is loading. Please wait.

Computer Programming תירגול 13 חזרה למבחן.

Similar presentations


Presentation on theme: "Computer Programming תירגול 13 חזרה למבחן."— Presentation transcript:

1 Computer Programming תירגול 13 חזרה למבחן

2 תרגיל What נתונה התכנית הבאה: #include <stdio.h>
int what(int n){ int i, sum=0; if(!n) return 1; for (i=0; i<n; i++) sum += what(i); return sum; } void main(){ printf("%d\n",what(4)); printf("%d\n",what(10)); א. (10 נקודות) מה הפלט של התכנית הנ"ל? ב. (5 נקודות) מה הנוסחה של הערך המוחזר של what(n) ?

3 תרגיל 1 (פתרון) א. 8, 512. ב.

4 תרגיל מחרוזות כתוב פונקציה void blank(char *sentence) שמקבלת מחרוזת שהיא משפט ומצמצמת רווחים במשפט. אין להשאיר רוח לפני המילה הראשונה אין להשאיר רוח בסוף המשפט אסור שיהיו שני רווחים ברצף במשפט אין ליצור או להשתמש במערך או במחרוזת עזר. דוגמה: הפונקציה תהפוך את המחרוזת " this is an example of a sentence. ” ל- "this is an example of a sentence.”

5 פתרון תרגיל void blank(char *sentence){ int i=0, j=0, first=0; while(sentence[i]){ if(sentence[i]!=' '){ first=1; sentence[j++]=sentence[i++]; } else if(first){ first=0; else i++; if(sentence[j-1]==' ') j--; sentence[j]='\0';

6 תרגיל רקורסיה שאלה מס'4: כתוב פונקציה רקורסיבית void X(int lines) שמדפיסה את האות X באמצעות כוכביות ב-lines שורות (נניח ש-lines תמיד אי-זוגית). ניתן להשתמש בלולאות. לדוגמא עבור X(9) יודפס: * * * * * * * * * * * הכוכבית הראשונה חייבת להופיע בתחילת השורה הראשונה. אין להגדיר פונקציה נוספת.

7 פתרון תרגיל פתרון: הרעיון הוא להדפיס את השורה הראשונה של X, אחר כך לפתור את תת-הבעיה עבור X ללא השורה הראשונה והאחרונה ואז להדפיס את השורה האחרונה (שהיא זהה לראשונה). ניתן להדגים את סדר הפעולות הכרונולוגי בכל קריאה רקורסיבית באמצעות התרשים הבא:

8 פתרון תרגיל void X(int lines){ int static blank; int I; for (i=0; i<blank; i++) putchar(' '); putchar('*'); if(lines==1){ puts(""); return; } for (i=0; i<lines-2; i++) puts("*"); blank++; X(lines-2); blank--; for (i=0; i<blank; i++) putchar(' '); }

9 שאלת רשימות

10 השלם את החסר

11 תשובות

12 תרגיל 5 ( מבחן – 20 נק') כתוב פונקצית char *sentence(char ** words)המקבלת כארגומנט מערך words של מחרוזות (כל איבר במערך words הוא מצביע למחרוזת). כל מחרוזת מכילה מילה אחת. המילה האחרונה מסתיימת בנקודה (התו '.'). ניתן להניח שבמערך לפחות מילה אחת. הפונקציה בונה ומחזירה מחרוזת חדשה שהיא המשפט המורכב מכל המילים של המערךwords לפי הסדר במערך.

13 תרגיל 5 ( מבחן – 20 נק') דוגמא: המשפט שמחזירה פונקצית
picture is worth a thousand words.. A words דוגמא: המשפט שמחזירה פונקצית sentence(words) הוא: “A picture is worth a thousand words." הערה: בין מילה למילה במשפט רווח אחד בלבד. Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

14 תרגיל 5 ( פתרון) char *sentence(char ** words){
char *newstring, *save; int length, lines; for(lines = length=0; ; lines++){ length = length + strlen(*(words + lines) ) + 1; if(*(*(words + lines) + strlen(*(words + lines)) - 1) == '.') break; } newstring = (char *)malloc(length * sizeof(char)); newstring[0] = '\0'; for( save = (words) ; (words) <= save + lines ; (words) ++){ strcat(newstring, *(words)); if(*(words) < save + lines) strcat(newstring, " "); else newstring[length - 1] = '\0'; return newstring; Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel

15 שאלת קבצים – מבחן 2011 שאלה 3 (20 נקודות)
נתונים שני קבצים, כאשר הקובץ הראשון מכיל את כמויות הגשם הממוצעות בעשר שנים אחרונות בשלושה אזורים שונים בארץ, הקובץ ממויין לפי חודש. (יש 12 רשומות בקובץ זה ). כל שורה בקובץ זה מורכבת מהפרטים הבאים: מספר החודש – 2 ספרות שם איזור תווים ממוצע אזור 1 – 4 ספרות שם איזור תווים ממוצע אזור 2 – 4 ספרות שם איזור תווים ממוצע אזור 3– 4 ספרות הקובץ השני מכיל פרטי הגשמים בשנה האחרונה לפי חודש ואזור לפי אותו מבנה של הקובץ הראשון. הקובץ ממויין גם לפי חודש אבל לא בכל חודש היו גשמים ולכן הקובץ מכיל רק חודשים עם גשם (אפילו אם היה גשם רק באזור אחד יתר האזורים מופיעים גם עם 0 גשם).

16 המשך שאלת קבצים א ) (10 נקודות ) כתוב פונקציה:
void update(FILE* history, FILE*new_year, char* final_rain) שמקבלת כארגומנטים שני מצביעים לקבצים הנתונים ויוצרת קובץ שלישי המשלב את שני הראשונים ומכיל את הממוצעים החדשים אחרי ההכללה של השנה החדשה. לקובץ השלישי יש אותו מבנה מהשניים הראשונים. ב ) (10 נקודות) כתוב פונקציה node * zone_sort(char* final_rain) אשר מקבלת את קובץ הגשמים המעודכן ע"י הפונקציה הקודמת ומחזירה מצביע לרשימה מקושרת ממוינת לפי הכמות הממוצעת של האזורים (כלומר ברשימה יהיו 12 איברים ) לפי המבנה: typedef struct node { int zone_average ; node* next ; } node; הגבלות: אין לקרוא קובץ יותר מפעם אחת. אין להעתיק קובץ למבנה נתונים אחר, לדוגמא, מערך דינמי של מבנים (ברור שלא מדובר על סעיף ב).

17 פתרון: א – (10 נקודות ) void update(FILE * history, FILE * new_year, char * final_rain){ FILE * update; int flag1 = 0,flagold, flagnew; int month10,ave10,ave20, ave30; int month1,av1,av2, av3; char zone10[16],zone20[16],zone30[16]; char zone1[16],zone2[16],zone3[16]; int new_ave1,new_ave2,new_ave3; if(!(update = fopen(final_rain,"w"))){ printf("No opening\n"); exit(1); }

18 המשך פתרון סעיף א while((flagnew = fscanf(new_year, "%2d%15[^$]%4d%15[^$]%4d%15[^$]%*c", &month1,zone1,&ave1,zone2, &ave2,zone3, &ave3)) == 7){ while(((flagold = fscanf(history,"%2d%15[^$]%4d%15[^$]%4d%15[^$]%*c", &month10,zone10,&ave10,zone20, &ave20,zone30, &ave30))== 7 ) && (month1 != month10)) { new_ave1 = (ave10 * 10 )/11; new_ave2 = (ave20 * 10 )/11; new_ave3 = (ave30 * 10 )/11; fprintf(update,"%2d%15s%4d%15s%4d%15s%4d\n", &month1,zone1,new_ave1,zone2, new_ave2,zone3, new_ave3); } if(flagold == 7){ new_ave1 = (ave10 * 10 + ave1)/11; new_ave2 = (ave20 * 10 + ave2)/11; new_ave3 = (ave20 * 10 + ave3)/11; fprintf(update,"%2d%15s%4d%15s%4d%15s%4d\n", &month1,zone1,new_ave1,zone2, new_ave2,zone3, new_ave3); else break;

19 המשך פתרון סעיף א while((flagold == 7) &&
(flagold =fscanf(history,"%2d%15[^$]%4d%15[^$]%4d%15[^$]%*c", &month10,zone10,&ave10,zone20, &ave20,zone30, &ave30)== 7)){ new_ave1 = (ave10 * 10 )/11; new_ave2 = (ave20 * 10 )/11; new_ave3 = (ave30 * 10 )/11; fprintf(update,"%2d%15s%4d%15s%4d%15s%4d\n", &month1,zone1,new_ave1,zone2, new_ave2,zone3, new_ave3); } fclose(update);

20 פתרון: ב – (10 נקודות ) //help function : add node sorting the list node * insert_sort(node *head, node *newNode) { node *currNode; if (!head) return newNode; if (newNode->key < head->key) { newNode->next = head; return newNode; } currNode = head; while (currNode->next && newNode->key > currNode->next->key) currnode = currnode->next; newNode->next = currNode->next; currNode->next = newNode; return head; }

21 המשך פתרון סעיף ב node * zone_sort(char* final_rain){ FILE * update; node * temp, *aux , *head = NULL; int month,av1,av2, av3; char zone1[16],zone2[16],zone3[16]; int new_ave; if(!(update = fopen(final_rain,"r"))){ printf("No opening\n"); exit(1); } for (i=0; i < 12 ; i++){ fscanf(history,"%2d%15[^$]%4d%15[^$]%4d%15[^$]%*c", &month,zone1,&ave1,zone2, &ave2,zone3, &ave3); new_ave = (zone1 + zone2 + zone3)/3; temp = (node *) malloc(sizeof(node)); temp->zone_average = new_ave; temp->next = NULL; insert_sort(head, temp); return head;{

22 תרגיל עצים (מבחן – 20 נק') עץ בינארי נקרא מלא, אם הוא ריק או שלכל צומת שלו יש אפס או שני בנים בלבד. דוגמה לעץ בינארי מלא: דוגמה לעץ בינארי לא מלא: יש רק בן אחד!

23 תרגיל 3 (מבחן – 20 נק') #define FALSE 0 #define TRUE 1 typedef struct Data { int key ; double val; … … } Data; typedef struct TreeNode struct TreeNode *right ; struct TreeNode *left ; Data TreeNode_info; } TreeNode; כתבו פונקציה רקורסיבית isFull המקבלת כארגומנט מצביע לשורש העץ ומחזירה TRUE אם העץ מלא ו - FALSE אחרת. הפונקציה סורקת את העץ פעם אחת בלבד ואינה משתמשת באף פונקצית עזר.

24 תרגיל 3 (פתרון) int isFull (TreeNode * root) { if (!root) return TRUE;
if ((root->left && !(root->right))|| (root->right && !(root->left))) return FALSE; return(isFull(root->left)&& isFull(root->right)); }

25


Download ppt "Computer Programming תירגול 13 חזרה למבחן."

Similar presentations


Ads by Google