מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא...

32
בבבב בבבב בבבבב בבבבב בבבב בבבב בבבבב בבבבב בבבבב בבבבב5 5

Post on 21-Dec-2015

234 views

Category:

Documents


9 download

TRANSCRIPT

Page 1: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

מבוא כללי למדעי המחשבמבוא כללי למדעי המחשב55תרגול תרגול

Page 2: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

ee חישוב חישוב

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

1 + 1n

n

Page 3: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

#include <stdio.h>double CalcE(int last);int main(){

int last;printf("Enter number of iterations\n");scanf("%d", &last);printf("%lf\n", CalcE(last));

}

double CalcE(int last){

int i;double e = 1, mul = 1 + 1 / (double)last;for(i = 1; i <= last; i++)

e *= mul;return e;

}

n קביעת

הביטוי:

העלאה בחזקה:

Page 4: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

eexxחישוב חישוב

x ואת nכתוב פונקציה המקבלת את באמצעות הנוסחה exומחשבת את

1 + xn

n

Page 5: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

הפונקציההפונקציה

double CalcE(int last,int power){

int i;double e = 1;

double mul = 1 + power / (double)last;for(i = 1; i <= last; i++)

e *= mul;return e;

}

Page 6: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

תרגילתרגיל

שורש של מספר מחושב לפי הסדרה הבאה:

root0 = 1rootn = rootn-1 + a / rootn-1

2

של הסדרה הוא קירוב nכאשר האיבר ה- גדל.n. הקירוב משתפר ככל ש-aלשורש של

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

:תנאי העצירה של החישוב יהיה כאשרrootn == rootn-1

Page 7: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

פתרוןפתרוןdouble MySqrt(int num){

double root, root_n = 1.0;do{

root = root_n;root_n = (root + num / root) / 2;

}while(root_n != root);return root;

}

Page 8: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

מספרים אקראייםמספרים אקראיים

ניתן לייצר מספרים אקראיים ע"י הפונקציהניתן לייצר מספרים אקראיים ע"י הפונקציה•

int rand(void);int rand(void);

הפונקציה מייצרת מספר אקראי שלם הפונקציה מייצרת מספר אקראי שלם •RAND_MAXRAND_MAX עד עד 00בתחום בתחום

32,76732,767 הוא לפחות הוא לפחות RAND_MAXRAND_MAXמובטח ש-מובטח ש-•

stdlib.hstdlib.hהפונקציה מוגדרת ב-הפונקציה מוגדרת ב-•

Page 9: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

דוגמאותדוגמאות

)כולל(: )כולל(:1919 ל- ל-00יצירת מספר אקראי שלם בין יצירת מספר אקראי שלם בין •

rand() % 20rand() % 20

)כולל(: )כולל(:2020 ל- ל-1010יצירת מספר אקראי שלם בין יצירת מספר אקראי שלם בין •

rand() % 11 + 10rand() % 11 + 10

::[[0,10,1]]יצירת מספר אקראי ממשי בתחום יצירת מספר אקראי ממשי בתחום •

(double) rand() / RAND_MAX(double) rand() / RAND_MAX

Page 10: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

יצירת מספרים אקראיים - אתחוליצירת מספרים אקראיים - אתחול

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

, ניתן לקבוע ע"י , ניתן לקבוע ע"י seedseedאת נקודת ההתחלה, ה-את נקודת ההתחלה, ה-•::stdlib.hstdlib.hהפונקציה הבאה המוגדרת ב-הפונקציה הבאה המוגדרת ב-

void srand(unsigned int seed);void srand(unsigned int seed);

יהיה שונה בכל ריצה, יש לכתוב יהיה שונה בכל ריצה, יש לכתוב seedseedכדי שה-כדי שה-•בתחילת התוכנית את הפקודה הבאה:בתחילת התוכנית את הפקודה הבאה:

srand(time(NULL));srand(time(NULL));

time.htime.h מוגדרת ב- מוגדרת ב-)()(timetimeכאשר הפונקציה כאשר הפונקציה

Page 11: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

תרגילתרגיל מספרים אקראיים מספרים אקראיים77כתוב תוכנית המדפיסה כתוב תוכנית המדפיסה

)כולל(, ואח"כ מדפיסה )כולל(, ואח"כ מדפיסה5050 עד עד 55 שלמים בתחום שלמים בתחום

..[[0,10,1]] מספרים אקראיים ממשיים בתחום מספרים אקראיים ממשיים בתחום 77

דוגמה לפלט:231227314647310.0168770.5540640.4000060.7842950.4818570.4877770.724479

Page 12: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

#include <stdio.h>#include <stdio.h>

#include <stdlib.h>#include <stdlib.h>

#include <time.h>#include <time.h>

int rand_int()int rand_int()

{{

return rand() % 46 + 5;return rand() % 46 + 5;

}}

double rand_real()double rand_real()

{{

return (double) rand() / RAND_MAX;return (double) rand() / RAND_MAX;

}}

פתרוןפתרון

Page 13: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

פתרון - המשךפתרון - המשך

int main()int main(){{ int k;int k;

srand(time(NULL));srand(time(NULL)); for ( k=0; k<7; k++ )for ( k=0; k<7; k++ ) printf("%d\n",rand_int());printf("%d\n",rand_int()); for ( k=0; k<7; k++ )for ( k=0; k<7; k++ ) printf("%lf\n",rand_real()); printf("%lf\n",rand_real()); return 0;return 0;}}

Page 14: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

תרגילתרגיל

נתון מקל שאורכו מטר אחד.נתון מקל שאורכו מטר אחד.

בוחרים באופן מקרי שתי נקודות על גבי המקל,בוחרים באופן מקרי שתי נקודות על גבי המקל,

ושוברים את המקל בשתי נקודות אלה.ושוברים את המקל בשתי נקודות אלה.

מה הסיכוי שהאורך של אחד או יותר משלושתמה הסיכוי שהאורך של אחד או יותר משלושת

החלקים שהתקבלו הוא לפחות חצי מטר?החלקים שהתקבלו הוא לפחות חצי מטר?

בצעו סימולציה של תהליך זה.בצעו סימולציה של תהליך זה.

Page 15: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>#include <time.h>#include <time.h>

double rand_real()double rand_real(){{

return (double) rand() / RAND_MAX;return (double) rand() / RAND_MAX;}}int main()int main(){{

intint all = 0,good = 0;all = 0,good = 0;doubledouble x,y,temp;x,y,temp;

srand(time(NULL));srand(time(NULL));

Page 16: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

while (1) {while (1) { x = rand_real();x = rand_real(); y = rand_real();y = rand_real(); if ( x > y ) {if ( x > y ) {

temp = x; x = y; y = temp;temp = x; x = y; y = temp;}}if ( x >= 0.5 || y - x >= 0.5 || 1 - y >= if ( x >= 0.5 || y - x >= 0.5 || 1 - y >=

0.5 )0.5 )good++;good++;

all++;all++;if ( all % 1000000 == 0 )if ( all % 1000000 == 0 )

printf("%d / %d = %lf\n",printf("%d / %d = %lf\n",good,all,(double) good/all);good,all,(double) good/all);

}}return 0;return 0;

}}

Page 17: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

מספרים מושלמיםמספרים מושלמים

אם הוא שווה לסכום אם הוא שווה לסכום מושלםמושלםמספר יקרא מספר יקרא •מחלקיו.מחלקיו.

דוגמאות:דוגמאות:•

6 = 1 + 2 + 36 = 1 + 2 + 3

28 = 1 + 2 + 4 + 7 + 1428 = 1 + 2 + 4 + 7 + 14

ומדפיסה ומדפיסה nnכתבו תוכנית הקוראת מספר שלם כתבו תוכנית הקוראת מספר שלם • )כולל(. )כולל(.nn עד עד 11את כל המספרים המושלמים מ-את כל המספרים המושלמים מ-

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

Page 18: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

פתרוןפתרון#include <stdio.h>int sum_of_dividers(int n){

int k,sum = 1;

for ( k = 2; k * k <= n; k++ )if ( k * k == n )

sum += k;else if ( n % k == 0 )

sum += k + n / k;

return sum;}

Page 19: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

פתרון - המשךפתרון - המשך

int main(){

int n,k;

scanf("%d",&n);for ( k = 2; k <= n; k++ )

if ( sum_of_dividers(k) == k )printf("%d\n",k);

return 0;}

Page 20: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

רקורסיות רקורסיות

דני

יוסי

שמעון

אבנר

רמי

שכן יכול נתון בניין רב קומות וכל לדבר רק עם זה שמעליו

. אנחנו מבקשים וזה שמתחתיומרמי את רשימת הדיירים בבניין

דני

דני, יוסי

דני, יוסי,שמעון

דני, יוסי,שמעון,אבנר

דני, יוסי,שמעון,אבנר, רמי

רמי,תן לנו את רשימת הדיירים

של הבניין

Page 21: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

רקורסיות רקורסיות חישוב עצרתחישוב עצרת

n ! = n* (n-1) * … * 1

int factorial(int n){ if (n==0)

return 1; return n*factorial(n-1);}

int factorial(int n){

int fact =1;while (n >= 1){

fact *=n;n--;

}return fact;

}

n ! = n * (n-1) !0 ! = 1

Page 22: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

רקורסיות רקורסיות : תרגיל

כתבו פונקציה המחשבת את הסכום

sum(n) = sum(n-1) + nsum(1) = 1

רקורסיה

Page 23: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

פתרוןפתרון

int sum(int n){

if (n==1) return 1;

return n+sum(n-1);}

Page 24: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

רקורסיות רקורסיות חישוב חזקה ברקורסיה

int power(int x, int y){

if (y == 0)return 1;

return x * power(x, y -1);}

Page 25: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

רקורסיות רקורסיות : תרגיל

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

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

בלבד ברקורסיה

Page 26: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

רקורסיות רקורסיות פתרון

int mul(int x,int y){

if (y==1) return x;

return x+mul(x,y-1);}

Page 27: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

רקורסיות רקורסיות פתרון

int div(int x,int y){

if (y>x) return 0;

return 1 + div(x-y,y);}

Page 28: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

רקורסיות רקורסיות

סדרת פיבונאצ'י

::נתונה הנוסחה הרקורסיבית הבאהנתונה הנוסחה הרקורסיבית הבאה

Fib)0( = 0Fib)0( = 0 Fib)1( = 1Fib)1( = 1Fib)n( = Fib)n-1( + Fib)n-2(Fib)n( = Fib)n-1( + Fib)n-2(

::הערכים של סדרה זאת הםהערכים של סדרה זאת הם0,1,1,2,3,5,8,13,…0,1,1,2,3,5,8,13,…

של סדרת של סדרת nnכתבו פונקציה לחישוב האיבר ה-כתבו פונקציה לחישוב האיבר ה-פיבונאצ'י.פיבונאצ'י.

Page 29: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

רקורסיות רקורסיות

פונקציה רקורסיבית

int fib_rec(int n)int fib_rec(int n){{

if (n<= 1)if (n<= 1)return n;return n;

elseelsereturn fib_rec(n-1) + fib_rec(n-return fib_rec(n-1) + fib_rec(n-

2);2);}}

Page 30: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

רקורסיות רקורסיות

פונקציה איטרטיביתint fib_iter(int n)int fib_iter(int n){{

intint prev1 = 0,prev2 = prev1 = 0,prev2 = 1,current,count;1,current,count;

for (count=0; count<n; count++ )for (count=0; count<n; count++ ){{

current = prev1 + prev2;current = prev1 + prev2;prev1 = prev2;prev1 = prev2;prev2 = current;prev2 = current;

}}return prev1;return prev1;

}}

Page 31: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

מערכיםמערכים

פעמיים פעמיים 60006000נכתוב תוכנית שזורקת קובייה נכתוב תוכנית שזורקת קובייה

ונספור כמה פעמיים יצא כל מספר.ונספור כמה פעמיים יצא כל מספר.

Page 32: מבוא כללי למדעי המחשב תרגול 5. חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה. 1 + 1 n n

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>#define SIZE 7#define SIZE 7int main()int main(){{ int num, face, roll, frequency[ SIZE ] = { 0 }; int num, face, roll, frequency[ SIZE ] = { 0 }; scanf("%d",&num);scanf("%d",&num); srand( num );srand( num ); for ( roll = 1; roll <= 6000; roll++ ) {for ( roll = 1; roll <= 6000; roll++ ) { face = rand() % 6 + 1;face = rand() % 6 + 1; ++frequency[ face ]; ++frequency[ face ]; }} printf( "%s%17s\n", "Face", "Frequency" );printf( "%s%17s\n", "Face", "Frequency" ); for ( face = 1; face <= SIZE - 1; face++ )for ( face = 1; face <= SIZE - 1; face++ ) printf( "%4d%17d\n", face, printf( "%4d%17d\n", face,

frequency[ face ] );frequency[ face ] ); return 0;return 0;}}