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

Post on 21-Dec-2015

234 Views

Category:

Documents

9 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

ee חישוב חישוב

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

1 + 1n

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 קביעת

הביטוי:

העלאה בחזקה:

eexxחישוב חישוב

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

1 + xn

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;

}

תרגילתרגיל

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

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

2

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

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

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

פתרוןפתרון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;

}

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

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

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

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

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

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

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

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

rand() % 20rand() % 20

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

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

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

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

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

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

, ניתן לקבוע ע"י , ניתן לקבוע ע"י 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כאשר הפונקציה כאשר הפונקציה

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

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

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

דוגמה לפלט:231227314647310.0168770.5540640.4000060.7842950.4818570.4877770.724479

#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;

}}

פתרוןפתרון

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

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;}}

תרגילתרגיל

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

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

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

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

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

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

#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));

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;

}}

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

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

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

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

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

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

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

פתרוןפתרון#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;}

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

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;}

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

דני

יוסי

שמעון

אבנר

רמי

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

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

דני

דני, יוסי

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

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

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

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

של הבניין

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

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

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

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

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

רקורסיה

פתרוןפתרון

int sum(int n){

if (n==1) return 1;

return n+sum(n-1);}

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

int power(int x, int y){

if (y == 0)return 1;

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

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

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

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

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

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

int mul(int x,int y){

if (y==1) return x;

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

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

int div(int x,int y){

if (y>x) return 0;

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

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

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

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

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כתבו פונקציה לחישוב האיבר ה-כתבו פונקציה לחישוב האיבר ה-פיבונאצ'י.פיבונאצ'י.

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

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

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);}}

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

פונקציה איטרטיבית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;

}}

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

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

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

#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;}}

top related