Author: gutner

מתוך 
סמסטר א' תשס"ח
 18  בדצמבר 2007
תרגיל 4 - מבוא למחשבים לסטטיסטיקאים
0365.1800
שי גוטנר

תאריך הגשה: 31 בדצמבר 2007.

לפני הגשת התרגיל חובה להריץ את .compile_ex4
שאלה שעבורה compile_ex4 כותב הודעות שגיאה או אזהרה לא תיבדק.
יש לעיין בקפידה בדף ההנחיות להגשת תרגילים בקישור הבא:
http://www.cs.tau.ac.il/~gutner/intro2cs08a/ex/Exercises.rtf
הקנס על כל יום איחור בהגשה הינו 5 נקודות.

 
הערה חשובה: הניקוד לניתוח סיבוכיות הזמן יהיה 20% מהציון של כל שאלה.

ההנחיות הבאות חלות על כל הפונקציות בשאלה 1 ו-2 (למעט פונקציות main ופונקצית sort בשאלה 1):
 
1.	המימוש של הפונקציה יעשה ע"י שימוש במצביעים בלבד (אסור להגדיר משתנים מטיפוס שאינו מצביע, כמו למשל int או double).
2.	אסור לעשות שימוש בסוגריים מרובעים.  
3.	אין לבצע קריאה לפונקציות אחרות מתוך הפונקציה (בפרט, אסור להשתמש בפונקציות ספריה).

שאלה 1

כתבו שתי פונקציות כדלהלן:
double *pointer_of_max(double *a,const int n);
void sort(double *a,const int n);

הפונקציה pointer_of_max מקבלת מצביע a לתא ראשון במערך, ומחזירה מצביע לאיבר המקסימאלי מבין n האיברים הראשונים במערך (ניתן להניח כי ).
הפונקציה sort ממיינת מערך a בן n איברים בסדר יורד, ע"י שימוש בפונקציה pointer_of_max.

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

שאלה 2

כתבו פונקציה כדלהלן:
char *my_strstr(char *s,char *t);

הפונקציה my_strstr מחזירה מצביע למופע הראשון של המחרוזת t במחרוזת s. במידה והמחרוזת t לא מופיעה כתת-מחרוזת ב-s, הפונקציה תחזיר NULL.

דוגמאות:

my_strstr(“abcxyz”,”cxy”) תחזיר מצביע לאיבר השלישי.
my_strstr(“abcxyz”,”cxyy”) תחזיר NULL.

על מנת לבדוק את הפונקציה, כתבו פונקצית main הקוראת שתי מחרוזות מהקלט ומדפיסה את תוצאות הרצת הפונקציה my_strstr. 
ניתן להניח שאורך שתי המחרוזות הוא לכל היותר 250.

שאלה 3

כתבו תוכנית הקוראת מספר טבעי n ושתי סדרות באורך n של מספרים מרוכבים: a_0,..,a_n-1 ו-b_0,..,b_n-1 ומחשבת את ערך הביטוי .

דוגמה:

קלט:
3
-3 5   -0.5 3.5   0 1
1 2   -1 -3   -1 -1

פלט: 
17.000000-3.000000i

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

שאלה 4

הגדירו טיפוס נתונים בשם student לתחזוקת שם הסטודנט (שם פרטי + שם משפחה), תעודת זהות ואוסף ציונים בקורסים המורכב ממספר שלם k המציין את מספר הקורסים ומערך של k ציונים (0-100) בקורסים. ניתן להניח כי אורך שם פרטי או שם משפחה .

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

בתוכנית עליכם לממש את הפונקציות הבאות:

void read_student(student *s);
void free_student(student *s);
double average(student *s);
void copy_student(student *t,student *s);
void write_student(student *s);

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

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

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

הפונקציה copy_student מקבלת מצביע לרשומת סטודנט s ומצביע לרשומת סטודנט t, ומשכפלת את המידע ברשומה המוצבעת ע"י s לרשומה המוצבעת ע"י t. על הפונקציה לבצע הקצאת זיכרון דינאמית עבור ציוני הסטודנט המוצבע ע"י t.

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

דוגמה:

קלט:

4
Mar  Zipan     54395418  7  81  82  90  70  76  93  86
Mar  Shmelo  33714937  8  93  89  72  63  95  97  96  100
Seffi  Gaon     39754351  5  44  65  22  100  21
Yosef  Ilui       63549117  6  39  70  81  63  67  71
  
פלט: 

Mar  Shmelo  33714937  8  93  89  72  63  95  97  96  100

הערות:

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

שאלה 5
  
כתבו פונקציה כדלהלן:
int all_different(int a[10][20]);

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

על מנת לבדוק את הפונקציה, כתבו פונקצית main היוצרת מערך דו-מימדי בגודל  המכיל את כל אחד מהערכים 1 עד 200 בדיוק פעם אחת, ומדפיסה את תוצאות הרצת הפונקציה all_different על מערך זה. 

         
   
בהצלחה !!!