Presentation is loading. Please wait.

Presentation is loading. Please wait.

מבוא למדעי המחשב תרגול מספר.

Similar presentations


Presentation on theme: "מבוא למדעי המחשב תרגול מספר."— Presentation transcript:

1 מבוא למדעי המחשב תרגול מספר

2 בפעם הקודמת... משפטי תנאי משפט if, if-else
ה else שייך ל משפט ה if הקרוב ביותר שאין לו כבר else if (x > 0) if (y > 4) z = 5; else z = 7; if (x > 0) if (y > 4) z = 5; else z = 7;

3 בפעם הקודמת... משפט switch switch (ch) { case 'a' :
case 'A' : printf("A was entered"); break; default : printf("A was not entered"); }

4 אז מה נעשה היום ? לולאות הרבה דוגמאות... לולאת while לולאת do - while
לולאת for פקודות break, continue הרבה דוגמאות... במילים אחרות - הרבה תרשימי זרימה...

5 while תחביר while (exp) statement; מה סדר הפעולות ? while (-3)
printf("Help"); ביצוע statement (גוף הלולאה) חישוב ערך exp exp == TRUE exp == FALSE מעבר לפקודה הבאה אחרי while

6 while פקודה מורכבת – בלוק של פקודות (אוסף של פקודות שנמצא בתוך סוגריים מסולסלים) בכל מקום שבו צריכה להופיע פקודה, הפקודה יכולה להיות פקודה מורכבת, לכן אפשר לכתוב: while (exp) { statement1; statement2; }

7 דוגמא לשימוש ב-while #include<stdio.h> int main(void) {
int k=1, c, sum = 0 ; while (k<=10) { if (scanf ("%d",&c) < 1) { printf("Input error\n"); return 1; } sum += c; k++; printf("The sum is: %d\n",sum); return 0;

8 do-while תחביר - do statement; while (exp);
exp == TRUE exp == FALSE מעבר לפקודה הבאה אחרי while

9 do-while מה עושה התוכנית הבאה? #include<stdio.h> int main(void)
{ int k=0 ; do if (k%10 == 0) printf("%d\n",k); while (k++ < 100); return 0; }

10 for אחת מהשיטות הנוחות ביותר לממש לולאה
for (exp1; exp2; exp3) statement; אתחול הלולאה חישוב exp1 תנאי עצירה חישוב exp2 גוף הלולאה (statement) exp2 == TRUE exp2 == FALSE צעד הלולאה מעבר לפקודה הבאה אחרי for חישוב exp3

11 for example... דוגמא פשוטה לשימוש במשפט for #include<stdio.h>
int main(void) { int k; for (k=0; k<=255; k++) { if (k%8 == 0) putchar('\n'); printf("%d = %c",k,k); } return 0;

12 for exp1, exp2, exp3 - כל אחד מהם (וגם כולם יחד) יכולים להיות "ריקים" (אך עדיין מופרדים ב ; ) for ( ; ; ) printf("Help! I’m in an infinite loop!\n"); אם exp2 ריק – התוכנית תתייחס אליו כאל TRUE מתי "נוותר" על חלק מסוים?

13 אופרטור הפסיק מאפשר לבצע כמה פעולות בשורה אחת
תחביר: expression1, expression2 הערך של כל הביטוי הוא הערך של expression2 שימו לב - expression2 בעצמו יכול להכיל אופרטור פסיק סדר שערוך - משמאל לימין שימוש? בלולאת for for (x=2, y=2; x<=y*y; x+=y, y-=2, x/=3) ...

14 מעבר לפקודה הבאה אחרי while
break break - תפקידו "לצאת" או "להפסיק" את משפט הבקרה הפנימי ביותר בו הוא נמצא ניתן להשתמש ב: for, do-while, while, switch חישוב ערך exp ביצוע גוף הלולאה .... break exp == TRUE exp == FALSE מעבר לפקודה הבאה אחרי while

15 דוגמא - break מה תדפיס התוכנית הבאה? מה ההבדל בין break ו- return?
מה קורה אם יש מספר משפטי בקרה מקוננים ? #include<stdio.h> int main(void) { int i; for (i=1; i<100; i++) { if (i%10 == 0) break; printf("%d\n",i); } return 0;

16 מעבר לפקודה הבאה אחרי while
continue continue - תפקידה להפסיק את ביצוע גוף הלולאה, ולקפוץ אל סוף גוף הלולאה חישוב ערך exp ביצוע גוף הלולאה continue exp == TRUE exp == FALSE מעבר לפקודה הבאה אחרי while

17 continue- דוגמא מה תדפיס התוכנית הבאה? #include<stdio.h>
int main(void) { int i; for (i=1; i<100; i++) { if (i%10 == 0) continue; printf("%d\n",i); } return 0;

18 if break, continue... השימוש ב break ו continue מותר רק בתוך לולאות או משפט switch שימוש לא נכון יגרור שגיאת קומפילציה int main(void) { int x = 5; if (x > 4) { printf("Hi There"); break; x = x+1; }

19 לולאות האם ניתן לחקות את פעולת for ע"י שימוש במשפט while?
for (exp1; exp2; exp3) statement; משפט while (כמעט) שקול: exp1; while (exp2) { exp3; } לבית: האם ניתן לחקות את פעולת while ע"י שימוש במשפט for?

20 לולאות האם ניתן לחקות את פעולת while ע"י שימוש במשפט do-while?
while (exp) statement; משפט do-while שקול: do { if (!exp) break; statement; } while (1); לבית: האם ניתן לחקות את פעולת do-while ע"י שימוש בפעולת while?

21 סדרת פיבונצ'י סדרת פיבונצ'י היא : 1,1,2,3,5,8,13,21,…
החוקיות? שני האיברים הראשונים הם 1, ולכל השאר- כל איבר הוא הסכום של שני האיברים הקודמים. הבעיה? עבור קלט n, יש לחשב את האיבר הn-י בסדרה. אם הקלט n קטן מ-1, נדפיס 0 בתור תשובה.

22 פתרון לסדרת פיבונצ'י על הלוח

23 דוגמאות לשימוש בלולאות
כתוב תוכנית שמקבלת כקלט מספר שלם x וספרה d ומדפיסה כמה פעמים d מופיעה ב- x פתרון – על הלוח

24 דוגמאות לשימוש בלולאות
כתוב תוכנית המקבלת מהמשתמש סדרה של מספרים (אחד אחרי השני) המטרה - למצוא מהו האורך המכסימלי של "תת סדרה" המכילה רק מספרים ראשוניים ניתן להניח כי יש פונקציה שמקבלת מספר, ומחזירה 1 אם הוא ראשוני ו-0 אם הוא לא ראשוני לדוגמא, עבור הסדרה 1,4,7,5,7,8,5,14 אורך תת הסדרה (הארוכה ביותר) שמכילה רק ראשוניים הוא : 3 (תת הסדרה היא 7,5,7)

25 פתרון אלו משתנים אנו צריכים ? (מה יש לזכור?) המספר שהוקש
אורך סדרת הראשוניים הנוכחית אורך סדרת הראשוניים הארוכה ביותר עד כה

26 המשך הפתרון נתכנן תרשים זרימה לא אתחול המשתנים: אורך סדרה נוכחית = 0
כן אתחול המשתנים: אורך סדרה נוכחית = 0 אורך מכסימלי עד כה = 0 בדוק אם האורך הנוכחי גדול מהמכסימלי (שנצפה עד כה) אם כן, עדכן את המכסימלי אפס את האורך הנוכחי לולאה : קלוט מספר בדוק אם המספר ראשוני הגדל את האורך הנוכחי ב 1

27 האם זה מספיק? האם לאחר ביצוע הלולאה האורך המכסימלי עד כה בהכרח מעודכן לערך הנכון? לא, כי עדכון האורך המכסימלי עד כה מתבצע רק כשמגיעים למספר לא ראשוני. ייתכן שסדרת הקלט הסתיימה בתת סדרה של מספרים ראשוניים, ולא לקחנו אותה בחשבון! לכן, לאחר ביצוע הלולאה יש להוסיף בדיקה אם האורך הנוכחי גדול מהאורך המכסימלי עד כה, ואם כן- יש לעדכן את האורך המכסימלי עד כה.

28 מימוש הפתרון int main(void) { /* Declaration and Initialization */
int input, curr_length = 0, max_length = 0; /* While input is valid... */ while (scanf("%d",&input) == 1) { if (prime(input)) curr_length++; else max_length = (curr_length > max_lenght) ? curr_length : max_lenght; curr_length = 0; } return 0;

29 תרגיל נוסף הוכח או הפרך את ההשערה של Goldbach
הוא שלח מכתב לאוילר ב-7 ביוני 1742 במכתב טען כי כל מספר שווה לסכום של 3 מספרים ראשוניים אוילר הרחיב וטען כי כל מספר זוגי (גדול או שווה ל-4) שווה לסכום של 2 מספרים ראשוניים, טענה זו נקראת ההשערה החזקה של גולדבך בשנת 2000 הוצע פרס בשווי מיליון דולר לכל מי שיוכיח את הטענה עד 2002 אף אחד לא הצליח והפרס לא נלקח כל שנה מצליחים להראות כי הטענה נכונה עד מספר ... השיא הנוכחי הוא של Oliveira e Silva והוא 6x10^16

30 Mini Goldbach נבדוק את השערת Goldbach עבור מספרים בין 4 ל 1000
כיצד נפתור את הבעיה? נבדוק מספר אחר מספר, מ-4 עד 1000 אם מספר n שווה לסכום של שני מספרים ראשוניים, אזי ניתן לסמן את הראשון ב k ואת השני ב n-k (כי k + (n-k) = n)

31 "הוכחת" השערת גולדבך אופטימיזציות:
#define N 1000 int main(void) { int good, n, k; for (n = 4; n <= N; n+=2) { for (good = 0, k = 1; k < n; k++) if (prime(k) && prime(n-k))              good = 1; if(good==0) { printf("%d is not good\n", n);          return 0; } printf("all numbers between %d are good",N); return 0; אופטימיזציות: ב-for הפנימי, החלפת התנאי k<n בתנאי k<=n/2 אם k ראשוני וגם n-k ראשוני, במקום לבצע רק good=1, נבצע: { good=1; break; }

32 רפרנס - פתרון פיבונצ'י int main(void) { int n;
int fn_1 = 1, fn_2 = 1, temp, index; printf("Enter n\n"); if (scanf("%d",&n) < 1) { printf("Input error\n"); return 1; } for (index = 3; index <= n; index++) { temp = fn_2; fn_2 = fn_2 + fn_1; fn_1= temp; printf("The %d fibonachi number is %d\n", n, (n>0) ? fn_2 : 0); return 0;


Download ppt "מבוא למדעי המחשב תרגול מספר."

Similar presentations


Ads by Google