מבוא למדעי המחשב ושפת 31616 C הנדסת חשמל ואלקטרוניקה תשע"ו 2016 עבודה 3 פיתרון מוצע סמ' ב' מצ"ב פיתרון מוצע לעבודה 3. הפיתרונות נלקחו מעבודות סטודנטים )ותוקנו מעט אם היה צורך( שאלה 1 כתבו פונקציה המקבלת מערך של 25 מספרים שלמים )אשר מאותחל בתוכנית הראשית במספרים אקראיים מתחום ]0,49[. א. בשלב הראשון, התוכנית תקלוט מהמשתמש מספר שלם וחיובי n. הפונקציה תזיז את כל אברי המערך, n מקומות ימינה, כאשר המספרים ש"בורחים ימינה" מוכנסים משמאל )גלגול המערך(. יש לכתוב פונקציה אשר תדפיס את ערכי המערך שניתן לה. בתוכנית הראשית יש להדפיס את המערך לפני ואילו בפונקציה יש לקרוא לפונקצית ההדפסה לאחר ההזזה. ב. בשלב השני )שיתבצע מיד לאחר סיום השלב הראשון, הפונקציה תתחיל לגלגל את המערך שמאלה ב 2 מקומות )הפעם האיברים ש"בורחים שמאלה" מוכנסים מימין. התוכנית תגלגל את המערך כל 2 שניות )את פונקצית ההשהיה יש להגדיר בפונקציה בשם t_ms).void delay(int כל עוד המשתמש לא הקיש על המקלדת. הדפסת המערך תתבצע לאחר כל הזזה. #include <stdlib.h> #include <conio.h> // for _kbhit() #include <time.h> // for clock() void delay(int t_ms) int start_clock = clock(); while (clock() - start_clock <= t_ms); //do nothing till t_ms pass void print_array(int *arr) for (int i = 0; i < 25; i++) printf("%2d ", arr[i]); printf("\n"); void roll_array(int *arr, int n) int tmp,tmp2; for (int j = 0; j < n; j++) tmp = arr[24]; for (int i = 23; i >=0 ; i--) arr[i + 1] = arr[i]; //roll 1 right
arr[0] = tmp; printf("----------------------------------------\n"); while (!_kbhit()) //continue till nothing is pressed tmp = arr[0]; tmp2 = arr[1]; for (int i = 2; i <= 24; i++) arr[i - 2] = arr[i]; //roll 2 left arr[23] = tmp; arr[24] = tmp2; printf("----------------------------------------\n"); delay(2*1000); //clock is in milli sec, we need 2 sec int n; int arr[25]; printf("please enter a positive integer:\n");//number of times to roll the array scanf("%d", &n); n = n % 25; // for no overlap rotations (26 rotations= 1 rotation) printf("original array:\n"); for (int i = 0; i < 25; i++) arr[i] = rand() % 50; // random values between 0-49 printf("%2d ", arr[i]); printf("\nrotation setps:\n"); roll_array(arr, n);
שאלה 2 בדף משובץ בגודל NxN ציירו מספר מלבנים. כל מלבן מורכב מקבוצת משבצות שלמות סמוכות. מלבנים לא עולים ולא נוגעים האחד בשני. במערך דו-ממדי,T[N][N] כל איבר = 1 T[i][j] אם הוא שייך למלבן ו- = 0 T[i][j] אם איבר לא שייך למלבן )ראו דוגמה להלן(. כתבו תכנית שמגדירה מערך דו-ממדי 10x10 ממלאת אותו, ע"י המשתמש, באפסים ואחדים ומדפיסה כמה מלבנים קיימים בו. אפשר להניח כי יש רווח בין כל מלבן למלבן אחר )אך מלבן יכול להיות צמוד לדופן המערך(. אין לשנות את המערך לאחר המילוי. 0 0 0 1 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 int T[10][10] = 0 ; int C[11][11] = 0 ; // matrix: 11x11 int rect_cnt=0; //rectangle counter printf("please enter 10 numbers per row, after each row press enter: \n"); for (int i = 0; i < 10; i++) for (int j= 0 ; j < 10 ; j++ ) scanf("%d", &T[i][j]); for (int m = 1; m < 11; m++) for (int k = 1; k < 11; k++) C[m][k] = T[m-1][k-1]; //copy the matrix to a bigger one to create a partial frame of zeros for (int i = 1; i < 11; i++) for (int j = 1; j < 11; j++) if (C[i][j])
if ((C[i - 1][j]) (C[i][j - 1])) //search for a corner,start of a new rect. continue; rect_cnt++; printf("the rectangle number is:%d\n", rect_cnt);
שאלה 3 כתוב תכנית אשר בהינתן ייצוג בינארי של מספר שלם חיובי M תחשב ותדפיס ייצוג בינארי של 1+M בעזרת פונקציות להלן: א. פונקציה ;(x int convert2binary(int*,p int פונקציה מאחסנת במערך בגודל 200 את הייצוג הבינארי של x ומחזירה את האורך שבו השתמשה בפועל מתוך המערך. מובטח כי היצוג הבינארי של המספר M שניתן, לא דורש יותר מ 200 ספרות )ביטים(. ב. פונקציה s); int next_number(int* p, int* p1, int פונקציה מקבלת כפרמטרים שני מערכים בגודל 200, באחד )p( מאוחסן הייצוג הבינארי של מספר n וכמה ספרות הוא מכיל. הפונקציה תחשב את הייצוג הבינארי של המספר 1+n ותכניס אותו למערך השני )p1(. הפונקציה תחזיר את כמות הספרות שהשתמשה במערך החדש )p1(. בתוכנית הראשית,)main( יש לקלוט מהמשתמש מספר שלם חיובי M ולהדפיס ייצוג בינארי שלו ושל המספרM+1. int next_number(int* p, int* p1, int s) int j, i = 0; while (p[i]!= 0) p1[i] = 0; // 1+1=10 i++; p1[i] = 1; שימרו את התכנית בקובץ.hw3ex3.cpp for (j = i + 1; j < s; j++) //copy the rest of the number=> p[i]+0=p1[i] p1[j] = p[j]; return j; int convert2binary(int* p, int x) int i = 1; while (x>0) p[i] = x % 2; //convert from decimal to binary x /= 2; i++; return i; int M, len1,len2, arr1[200] = 0, arr2[200] = 0 ; printf("please enter an integer:\n"); scanf("%d", &M); len1= convert2binary(arr1, M);
printf("the number in binary base is:\n"); for (int i = len1-1 ; i >= 0; i--) printf("%d ", arr1[i]); printf("\n"); len2=next_number(arr1, arr2, len1); printf("the number plus 1 in binary base is:\n"); for (int i = len2-1 ; i >= 0; i--) printf("%d ", arr2[i]); printf("\n"); שאלה 4 כתבו תוכנית אשר מגרילה 10 מספרים ממשיים אקראיים לא שלמים בלולאה בתחום בין 100 ל, 999 ומבצעת את הפעולות הבאות : מפרידה עבור כל ערך נקלט בין הערך השלם לערך השבור למשל אם נתון מספר כגון 124.567 הוא יופרד ל 124 ול 567 א. מדפיסה את הערך השלם המקסימאלי מבין כל הערכים השלמים ב. מדפיסה את הערך השלם המינימאלי מבין כל הערכים השבורים. הערה : יש להגדיר שתי פונקציות min ו max אשר מקבלות שני מספרים ומחזירות את המינימלי והמקסימלי בין השניים. שימרו את התכנית בקובץ.hw3ex4.cpp #include <stdlib.h> #include <limits.h> int is_max(int max, int tmp) return tmp > max? tmp : max; //if temp>max return temp else return max int is_min(int min,int tmp) return tmp < min? tmp : min; //if temp<min return temp else return min float n; int tmp_int, tmp_float,max = 0, min = 999; for (int i = 0; i < 10; i++) n = rand() % 900000+100000; // 6 digit total n /= 1000; //split the int and float : iii.fff
tmp_int = (int)n; //save only the integer part max=is_max(max, tmp_int); //look for max tmp_float = (int)((n - tmp_int)*1000);//i used 3 digits after decimal point (as the example) min = is_min(min, tmp_float);//look for min printf("\nmax integer=%d & min float=%d\n", max, min);