פתרון מוצע לבחינת מה"ט ב_שפת c מועד ב אביב תשע"ט, אפריל 2019 מחברת: גב' זהבה לביא, מכללת אורט רחובות שאלה מספר 1 מוגדרת מחרוזת המורכבת מהספרות 0 עד 9. הדפסה ראשונה: מתבצעת לולאה שרצה מאפס עד אורך המחרוזת. אם התו הנבדק הוא ספרה אי זוגית ערכו של ו, אינדקס הלולאה, מועלה ב 1 02468 הדפסה שנייה: מתבצעת לולאה שמדפיסה את הספרות בסדר יורד. 9876543210 הדפסה שלישית: ולכן מודפסות רק הספרות הזוגיות. מתבצעת לולאה שרצה מאפס עד מחצית גודלה של המחרוזת, כאשר אינדקס הלולאה גדל בארבע בכל סיבוב לולאה. שני ה- case הראשונים לא כוללים,break ולכן בעבור המקרה שבו התו הוא '0', יתבצע גם.case '2' וגם case '1' כאשר נבדק התו '4' - יודפס הפלט שמופיע ב.default aa0end שאלה מספר 2 char *encode_str(char *str, char num) int i, count; char temp = num; char *pstr = strdup(str); for (i = 0 ; i <strlen(str); i++) if (str[i]!= ' ' &&!((str[i] >= 'a' && str[i] <= 'z') (str[i] >= 'A' && str[i] <= 'Z'))) return NULL; for (i = 0, count=0; i <strlen(str); i++) //return to new cycle if (count == 8) temp = num; count = 0; //check if it is an alpha char עמוד 1
'a')); - 'A')); pstr[i]); pstr[i]); if(str[i]!=' ') //check if it is 0 or 1 switch (temp & 0x001) case 0: count++; if (pstr[i] >= 'a' && pstr[i] <= 'z') if (pstr[i] - 3 < 'a') pstr[i] = 'z' -(2- (pstr[i]- pstr[i] = pstr[i] - 3; if (pstr[i] - 3 < 'A') pstr[i] = 'Z' - (2 - (pstr[i] pstr[i] = pstr[i] - 3; temp = temp >> 1; break; case 1: count++; if (pstr[i] >= 'a' && pstr[i] <= 'z') if (pstr[i] + 3 > 'z') pstr[i] = 'a' + 2 - ('z' - pstr[i] = pstr[i] + 3; if (pstr[i] + 3 > 'Z') pstr[i] = 'A' + 3 - ('Z' - pstr[i] = pstr[i] + 3; temp = temp >> 1; return pstr; int main() char str[] = "Hello I am Fine"; char *str1; char num = 0x3a; str1 = encode_str(str, num); עמוד 2
printf("%s", str1); return 0; בדוגמה לעיל הפלט יהיה: Ehior L xj Clkh פתרון נוסף )באדיבות מני מאורט סינגלובסקי( char *encode_str(char*str, char num) char *encodedstr,*ptr ; int len=0, i, shift, index; char capitalletter[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char smallletters[] = "abcdefghijklmnopqrstuvwxyz"; char ch; ptr = str; while (*ptr) if (!((*ptr >= 'a' && *ptr <= 'z') *ptr == ' ' (*ptr >= 'A' && *ptr <= 'Z'))) return NULL; ptr++; len++; encodedstr = (char*)malloc((len+1)*sizeof(char)); ptr = encodedstr; i = 0; while (*str) shift = (num & (1 << i))? 3 : -3; ch = (*str >= 'a')? 'a' : 'A'; index = (*str - ch + shift + 26) % 26 ; if (*str == ' ') *ptr++ = *str; i--; if (*str >= 'a') *ptr++ = smallletters[index]; *ptr++ = capitalletter[index]; i = ++i % 8; str++; *ptr = '\0'; return encodedstr; עמוד 3
שאלה מספר 3 א. פונקציה רקורסיבית שמקבלת מספר ומחזירה את סכום ספרותיו. אם הוא שלילי יוחזר אפס. int sum_digits(int num) if (num <= 0) return 0; return num % 10 + sum_digits(num / 10); ב. פונקציה רקורסיבית שמקבלת מצביע למערך של מספרים שלמים מסוג int ושלם שמציין את גודל המערך שהתקבל. הפונקציה מוצאת את מיקום האיבר שסכום הספרות שלו הוא הגדול ביותר. היא מדפיסה את הסכום ומחזירה את מיקומו. )באדיבות מני מאורט סינגלובסקי( int find_max_sum_digits(int *arr, int size, int full_size) int static max_sum_digits = 0; int static max_sum_digits_index = 0; int sum; if (!size) printf(" %d", max_sum_digits); max_sum_digits = 0; sum = max_sum_digits_index; max_sum_digits_index = 0; return sum; sum = sum_digits(arr[size - 1]); if (sum > max_sum_digits) max_sum_digits = sum; max_sum_digits_index = size - 1; return find_max_sum_digits(arr, size - 1, full_size); /* Typedef struct name Node */ typedef struct Node int key; struct Node *next; Node; שאלה מספר 4 /* Initialize the List with input number.*/ Node *Add(Node *head, int number) Node *tail = head; עמוד 4
Node *new_item = (Node*)malloc(sizeof(Node)); new_item->key = number; new_item->next = NULL; if (tail == NULL) return new_item; while (tail->next!= NULL) tail->next = new_item; return head; /* Move max number the head list and min number to the end of the list.*/ Node *Move_min_max(Node *head) Node *tail = head; Node *pmax = head; Node *pmin = head; Node *temp = NULL; // check if the list is not NULL if (tail) while (tail!= NULL) if (pmax->key < tail->key) pmax = tail; if (pmin->key > tail->key) pmin = tail; // check if there is only one node if (pmax!= pmin) //Move max number if (pmax!= head) tail = head; while (tail!= pmax) temp = tail; temp->next = tail->next; pmax->next = head; head = pmax; //Move min number if(pmin->next) tail = head; עמוד 5
while (tail!= pmin) temp = tail; temp->next = tail->next; while (tail ->next) tail->next = pmin; pmin->next = NULL; return head; /* Display List on screen */ void Print_List(Node *head) Node *p; for (p = head; p!= NULL; p = p->next) printf(" %d ->", p->key); if (p == NULL) printf("end Of list!!!\n"); return; int main() int input ; Node *head1 = NULL; סעיף א:// printf("enter number to create new node(less than 0 to exit):\n"); scanf("%d", &input); while (input >=0) head1 = Add(head1, input); עמוד 6
printf("enter number to create new node(less than 0 to exit):\n"); scanf("%d", &input); Print_List(head1); printf("after replace:\n"); סעיף ב:// head1=move_min_max(head1); Print_List(head1); return 0; שאלה מספר 5 א. התוכנית תדפיס את התוצאות הבאות : 5 9 5 7 5 5 5 3 5 1 ב. התוכנית מגדירה שני מערכים בגודל,SIZE מסוג.struct DATA כל אחד מאיברי המערך כולל ערך ומצביע לאיבר מסוג.struct DATA vec1 0 1 2 3 4 vec2 5 4 שרטוט המערכים: 3 2 1 שאלה מספר 6 א. התוכנית תדפיס Yes!!!: ב. התוכנית צוברת בעבור כל שורה ממערך mat את סכומה ומציבה אותו בשורה המקבילה במערך res בעמודה 0, ובעמודה 1 מציבה סכום עמודה מקבילה ממערך.mat התוכנית בודקת אם סכומי השורות זהים וכן אם סכומי העמודות זהים. אם התנאים מתקיימים מודפס,Yes!!! אחרת, מודפס.No!!! עמוד 7
שאלה מספר 7 א. התוכנית תדפיס את התוצאה הבאה: the number is OK ב. שתי דוגמאות של מספרים: 120 24, ג. התכונה אותה יש לקיים היא: ערך המספר שנשלח הוא ערך המתקבל ממכפלת הערכים החל מ 2 ואילך, בצורה רציפה. לדוגמה: במקרה של הערך 6, הוא מורכב ממכפלת הערכים 2 ו.3 שאלה מספר 8 א. בעבור הערך a=0x1a84 יודפס: is: 6 res1 ב. בעבור הערך a=0xf0e0 יודפס: is: 2 res1 ג. התוכנית מוצאת את הכמות המקסימלית של ביטים רציפים בערך שמכיל המשתנה a, המקיימים את החוקיות הבאה: ערכי ביטים סמוכים הם הפוכים. לדוגמה: בעבור הערך a=0x1a84-0001101010000100 בתחילה יש שני ביטים רציפים, אח"כ נמצאים שישה ביטים רציפים ולבסוף שני ביטים רציפים. ולכן הרצף המקסימלי הוא 6. בעבור הערך a=0xf0e0 1111000011100000 נמצאים שני ביטים רציפים ואח"כ שני ביטים רציפים. ולכן הרצף המקסימלי הוא 2. עמוד 8