220 likes | 386 Views
Computer Programming Fall 2012. תרגול 1. 31.10.2011. Computer Programming in C – Fall 2012. 1. אתר הקורס. http://www.cs.bgu.ac.il/~prog121 באתר הקורס מופיעים: הודעות חשובות מצוות הקורס יתפרסמו תחת announcements עבודות יתפרסמו תחת assignments
E N D
ComputerProgramming Fall 2012 תרגול 1 31.10.2011 Computer Programming in C – Fall 2012 1
אתר הקורס • http://www.cs.bgu.ac.il/~prog121 • באתר הקורס מופיעים: • הודעות חשובות מצוות הקורס יתפרסמו תחת announcements • עבודות יתפרסמו תחת assignments • מבחנים משנים קודמות יפורסמו תחת previous exams • ציונים לעבודות יפורסמו תחת grades • שאלות על העבודות ניתן לשאול תחת forum
עבודות • במהלך הקורס יהיו 6 עבודות (בערך כל 10 ימים תהיה הגשת עבודה). • העבודות יוגשו ביחידים. • בקשות לדחיית העבודה (עקב מילואים, או מחלה) יש להגיש להפנות למרצי הקורס בלבד!
מטרת התרגול – פיתוח חשיבה אלגוריתמית • אלגוריתם • דרך שיטתית (כלומר כזו שצעדיה מוגדרים היטב) לביצוע של משימה מסוימת, על נתונים, במספר סופי של צעדים (wikipedia). • אלגוריתם צריך להיות נכון כדי למלא את ייעודו • רצוי שיהיה גם יעיל (חסכוני במשאבים)
פתרון בעיות – שלבי עבודה • כאשר מוצגת בפנינו בעייה שעלינו לפתור, למשל, חיבור שני מספרים, נכתוב אלגוריתם כללי לפתרונה. • דוגמה לאלגוריתם אשר מחבר שני מספרים: • נגדיר משתנים num2,num1 ו sum • קלוט שני מספרים שלמים לתוך num1 ו-num2 • השם num1 + num2 לתוך sum • הדפס את sum למסך • נבצע בדיקה ידנית כדי לראות שהאלגוריתם נכון.
פתרון בעיות – שלבי עבודה (המשך) הערה הגדרת משתנים פלט למסך קלט ביטוי חשבוני פלט למסך
תרגיל מספר 1 • כתבו אלגוריתים אשר מקבל זמן hh::mm ומספר חיובי offset. על האלגוריתים להוסיף offset דקות לזמן • לדוגמא • עבור 21::30 ו-180 נקבל 00::30 • עבור 07::01 ו-199 נקבל 10::20 • רמזים • השתמשו באופרטור השארית % (למשל 26 % 24 = 2) • מספר הדקות הכולל שווה למספר הדקות ועוד offset • מספר השעות להוספה שווה מספר הדקות הכולל חלקי 60 • מספר הדקות החדש שווה מספר הדקות הכולל שארית 60
פתרון • פתרון הגדר משתנים: hours, minutes, offset, total_minutes • נקלוט hours, minutes ו-offset בהתאמה • total_minutesminutes + offset • new hourhours + total_minutes / 60) % 24) • new minutestotal_minutes % 60 • נבדוק את נכונות האלגוריתים • נשתדל לכסות את כל המקרים כולל "מקרי קצה" • מקרה עבורו מספר הדקות עולה בלבד. למשל 21:09 ו-11 • מקרה עבורו מספר הדקות מתאפס. למשל 21:09 ו-51 • מקרה עבורו מספר הדקות עובר ל"סבב חדש". למשל 21:09 ו-52 • מקרה עבורו השעה מתעגלת. למשל 21:09 ו-180
משפטי בקרה אם-אז • אלגוריתם פשוט, המקבל שני מספרים שלמים ומדפיס את הגדול מביניהם יראה כך: • נגדיר משתנים num2,num1 ו max • קלוט שני מספרים num1 ו-num2 • אם num1 גדול מ-num2 אזי • num1max • אחרת • num2max • הדפס את max • נבדוק את נכונות האלגוריתים • מקרה עבורו num2 < num1 למשל 60 ו- 20 • מקרה עבורו num1 < num2 למשל 60 ו- 67 • מקרה עבורו num2 = num1 למשל 60 ו- 60
תרגיל מספר 2 • כתבו אלגוריתם אשר מקבל שלושה מספרים ומחזיר את הגדול מביניהם
פתרון • הגדר משתנים: num1, num2, num3, max • נקלוט num1, num2, ו-num3 בהתאמה • אם num1 > num2 אזי num1max • אחרתnum2max • אם num3 > max אזי num3max • הדפס את max • נאמת את נכונות האלגוריתם • סדר גודל של 9מקרים שונים. 3 עבור התנאי הראשון כפול 3 עבור השני: {2,2,2},{2,2,1},{2,2,3},{2,1,2},{2,1,1},{2,1,3},{1,2,2},{1,2,2}, • {1,2,3}
תרגיל מספר 3 • כתוב תכנית שמקבלת מספר שלם חיובי ובודקת שהמספר מורכב מספרות בסדר עולה ומדפיסה הודעה מתאימה. דוגמאות: • 489 is ok • 364 is not ok
פתרון • הגדר משתנים: num, digit, prev_digit • קלוט מספר ל-num • prev_digit 10 • כל עוד num>0 בצע: 4.1. digitnum % 10 4.2. num / 10 num 4.3. אם digit > prev_digit אזי: הדפס:“not ok” , וסיים 4.4. אחרת: prev_digitdigit (חזור ל-4) 5. הדפס: "ok" נאמת את נכונות האלגוריתם:364, 489, 5
תרגיל 4 • כתוב תכנית שמקבלת מספר שלם חיובי ומחזירה את המספר שהוא היפוך ספרותיו • לדוגמה: • 2375 יתקבל עבור הקלט 5732 • 1025 יתקבל עבור 5201 או למשל גם עבור 52010 (מתעלמים מהאפסים העודפים במקרה זה)
פתרון 1. קלוט מספר חיובי ל-num 0sum .2 3. בצע: sum+num%10sum .3.1 num/10num .3.2 .3.3 אם num=0 הדפס sum וסיים 3.4. אחרת: sum*10sum(חזור ל-3)
תרגיל מספר 5 • כתבו אלגוריתם המקבל כקלט מספר טבעי (שלם שגדול מאפס) וגדול מ-1 ומחזיר כפלט האם המספר הזה הוא ראשוני. • תזכורת: מספר טבעי שגדול מ-1 נקרא ראשוני אם הוא מתחלק אך ורק בעצמו וב-1.
פתרון הגדר משתנים: num,div 1. קלוט ל-num מספר שלםשגדול מ- 1 2. אתחל משתנה div עם הערך 2 3. כל עוד div קטן מ-num וגם div לא מחלק את mבצע 3.1. הוסף אחד ל- div 4. אם div שווה ל-num, אזי 4.1. החזר: num הוא ראשוני 5. אחרת, 5.1. החזר: num אינו ראשוני נאמת את נכונות האלגוריתם: 6, 5
שיפורים אפשריים לאלגוריתם הנ"ל 1. לרוץ עד למחצית המספר. 2. לרוץ עד השורש הריבועי של המספר.
תרגיל מספר 6 כתוב תכנית המקבלת כקלט מספר שלם n ומחשבת את האיבר המתאים בסדרת פיבונאצ'י: תזכורת: סידרת פיבונאצ'י מוגדרת באופן הבא: n=0, 0 n=1, 1 = fn אחרת, fn-1+fn-2 כלומר: n: 0, 1, 2, 3, 4, 5, 6, . . . fn: 0, 1, 1, 2, 3, 5, 8, . . . .
פתרון הגדר משתנים: fn, fn-1, fn-2, n, i. 1. אם n=0 הדפס 0 וסיים אם n=1 הדפס 1 וסיים fn-2 .20 fn-1 .31 i .42 5. כל עוד i <= n בצע: 5.1 fn fn-1+fn-2 5.2.fn-2 fn-1 5.3.fn-1 fn 5.4. הוסף אחד ל i (חזור ל-5) 6. הדפס את fn נאמת את נכונות האלגוריתם: 0, 1, 4
פתרון הגדר משתנים: multiplier, result, d,last_result, i. i .11 result.20 last_result.3-1 multiplier .41 5. כל עוד |result – last_result| > /40.0001 בצע: 5.1 last_result result 5.2. result result + multiplier/i 5.3. multiplier -1* multiplier 5.4.i i + 2 (חזור ל-5) 6. הדפס את result*4