2016 ,) 234114/7 ( /` אביב סמסטר `ח מ מבוא למדעי המחשב

‫מבוא למדעי המחשב מ'‪/‬ח' (‪ ,)234114/7‬סמסטר אביב ‪2016‬‬
‫תרגיל בית ‪2‬‬
‫מועד אחרון להגשה‪2.5.16 :‬‬
‫המתרגל האחראי על תרגיל זה‪ :‬יותם אשל‬
‫משרד‪ :‬טאוב ‪315‬‬
‫‪E-mail: [email protected]‬‬
‫שעת קבלה רגילה‪ :‬יום א' ‪16:30-17:30‬‬
‫שעת קבלה נוספת‪ :‬יום ג' ‪14:30-15:30‬‬
‫ניתן לתאם פגישה בשעות אחרות‪.‬‬
‫החומר הרלוונטי לתרגיל ‪ :‬עד תרגול ‪ 6‬כולל‪.‬‬
‫הנחיות‪:‬‬
‫הגשה בבודדים‪ .‬עליכם לכתוב את הפתרונות לבד ולהגיש ביחידים‪.‬‬
‫‪‬‬
‫קראו את השאלות בעיון לפני שתתחילו בפתרונן‪.‬‬
‫‪‬‬
‫הקפידו לתעד את הקוד שלכם בהערות באנגלית‪.‬‬
‫‪‬‬
‫מלבד מילואים‪ ,‬לא יתקבלו תרגילים אחרי מועד הגשה‪ .‬הגשה באיחור לאחר מועד הגשה‬
‫‪‬‬
‫נחשבת כאי‪-‬הגשה‪.‬‬
‫כל יום מילואים = יום דחייה‪ .‬על מנת לקבל את הדחייה‪ ,‬עליכם לשלוח באי‪-‬מייל‪ ,‬עותק של‬
‫‪‬‬
‫האישור המראה שהייתם במילואים (טופס ‪ .)3010‬אם האישור יגיע אליכם בתאריך מאוחר‪ ,‬יש להודיע‬
‫על כך למתרגל האחראי על התרגיל לפני תאריך הגשת התרגיל‪.‬‬
‫ערעורים ניתן להגיש עד שבוע לאחר קבלת הציון‪.‬‬
‫‪‬‬
‫לא ניתן לערער על תוצאות הבדיקה האוטומטית‪.‬‬
‫‪‬‬
‫שימו לב! הבדיקה הינה בחלקה אוטומטית‪ ,‬ולכן הקפידו להדפיס בדיוק בפורמט‬
‫‪‬‬
‫שהתבקשתם ובידקו עם ‪ DiffMerge‬את הפלט שלכם מול הפלט של הדוגמאות שקיבלתם‪.‬‬
‫השתמשו ב‪ redirection-‬כדי להפנות את הפלט לקובץ טקסט‪.‬‬
‫‪o‬‬
‫וודאו את האותיות הגדולות והקטנות לפי הדוגמאות וההסברים בתרגיל‪.‬‬
‫‪o‬‬
‫אין להדפיס רווחים שלא התבקשתם להדפיס (בתחילת שורה או בסופה)‪.‬‬
‫‪o‬‬
‫בכל סוף שורה יש להדפיס תו ירידת שורה‪ ,‬גם בשורה האחרונה‪.‬‬
‫‪o‬‬
‫השתמשו באתר הבדיקה העצמית‪.‬‬
‫‪o‬‬
‫‪ ‬בתרגיל זה מותר להשתמש בפונקציות מהספריות ‪ stdbool.h ,stdio.h‬בלבד‪ ,‬שנלמדו‬
‫בהרצאות ובתרגולים‪ .‬החומר הנדרש לתרגיל זה שייך להרצאות ‪ 1-6‬ולתרגולים ‪ .1-6‬אין להשתמש בחומר‬
‫שאינו מופיע במצגות אלה‪.‬‬
‫‪ ‬ההגשה הינה אלקטרונית ובבודדים דרך אתר הקורס‪ .‬קובץ ההגשה יהיה מסוג ‪( zip‬ולא אף פורמט‬
‫אחר) ויכיל בתוכו את הקבצים הבאים בלבד‪ ,‬ללא כל תיקיות‪:‬‬
‫‪ o‬קובץ ‪ students.txt‬עם מספר תעודת הזהות שלך וכתובת האי‪-‬מייל שלך‪.‬‬
‫‪ o‬קובץ פתרון ‪ hw2q1.c‬עבור שאלה ‪.1‬‬
‫‪ o‬קובץ פתרון ‪ hw2q2.c‬עבור שאלה ‪.2‬‬
‫‪ o‬קובץ פתרון ‪ hw2q3.c‬עבור שאלה ‪.3‬‬
‫‪ ‬חובה לשמור את קוד אישור ההגשה שמקבלים מהמערכת לאחר שמגישים‪ ,‬עד לסיום הקורס‪.‬‬
‫‪ ‬יש להקפיד להגיש את כל הקבצים בדיוק עם השמות שמופיעים לעיל‪ .‬הגשה שלא תעמוד בתנאי זה לא‬
‫תתקבל ע"י המערכת! אם המערכת לא מקבלת את התרגיל שלכם‪ ,‬חפשו את הפתרון לבעיה באתר הקורס‬
‫תחת הכפתור ‪.FAQ‬‬
‫בדיקה ידנית‪:‬‬
‫נוסף לבדיקה האוטומטית‪ ,‬התרגיל ייבדק גם בבדיקה ידנית‪ .‬בבדיקה יורדו נקודות בין היתר על‬
‫הדברים הבאים‪:‬‬
‫‪ ‬חוסר שימוש‪/‬שימוש לא מספק ב‪ .define-‬יש להגדיר כל קבוע משמעותי‪ ,‬כמו למשל‪:‬‬
‫‪ o‬מספר האותיות באנגלית‪.‬‬
‫‪ o‬בתרגיל זה אין צורך להגדיר כקבועים תווים בודדים ללא משמעות מיוחדת‬
‫(כמו '‪ 'a‬כאשר הוא משמש כאות הראשונה)‪.‬‬
‫‪ o‬אסור להשתמש בערכי ‪ ASCII‬ישירות‪ ,‬יש להשתמש בייצוג של‬
‫התווים (למשל '‪.)'a‬‬
‫‪ ‬אין הזחות מסודרות‬
‫‪ o‬שיטת הזחה מקובלת – הזחת קוד בכל בלוק‪ ,‬למשל‪:‬‬
‫)(‪int main‬‬
‫{‬
‫‪// your code here‬‬
‫)…( ‪while‬‬
‫{‬
‫‪// your code here‬‬
‫}‬
‫}‬
‫‪ ‬שימוש במשתנים גלובאליים או סטטים‪.‬‬
‫‪ ‬שמות משתנים‪/‬פונקציות לא אינפורמטיביים‬
‫‪ ‬קוד לא ברור או תיעוד חסר (יש להסביר את הקוד שלכם באמצעות הערות)‪ .‬תיעוד‬
‫באנגלית בלבד!‬
‫‪ o‬יש לתעד פונקציות – לפני הפונקציה להוסיף הערה שמסבירה בקצרה מה‬
‫הפונקציה עושה ומה המשמעות של הפרמטרים שלה (גם עבור הפונקציות‬
‫שמוגדרות בתרגיל ‪.)2‬‬
‫‪ o‬במידה ויש כמה שורות קוד שניתן להסביר בקצרה מה המטרה שלהן‪ ,‬יש לשים‬
‫הערה בהתחלה ואין צורך לתעד כל שורה‪.‬‬
‫‪ o‬התיעוד צריך להיות אינפורמטיבי‪ ,‬כלומר יש להסביר מה המטרה של שורות הקוד‬
‫ולא לכתוב את הקוד במילים‪.‬‬
‫‪ ‬שכפול קוד שלא לצורך (למשל ריבוי קוד זהה במספר מקרי ‪ if-else‬שונים)‬
‫‪ ‬אי‪-‬עמידה באחת מדרישות התרגיל (לא מדובר על נכונות הפלט אלא על שימוש בחומר‬
‫שהיה אסור בתרגיל וכו')‬
‫באופן כללי‪ -‬הקפידו על כתיבת קוד מסודר ומובן ככל שניתן תוך יישום העקרונות שנלמדו בכיתה‬
‫שאלה ‪ - 1‬גימטריה‬
‫בתרגיל זה נקלוט מילה מהמשתמש‪ ,‬נחשב את ערכה בגימטריה ונדפיס‪ .‬תוך כדי התרגיל נלמד כיצד‬
‫לכתוב קוד קומפקטי וחכם ושאינו מסתמך על הרבה משפטי תנאי שנוטים לסבך את הקוד שלא לצורך אם‬
‫מגזימים בשימוש בהם‪.‬‬
‫לכן מותר להשתמש בפקודות התנאי‪ if,?:,switch :‬רק בפונקציית ה ‪ main‬ובפונקציה‬
‫‪ toLowerCase‬ואסור בשאר הפונקציות‪ .‬גם ב ‪ main‬נסו לצמצם ככל הניתן את השימוש בפקודות‬
‫אלו‪ .‬העדיפו לולאות וביטויים לוגים ואריתמטיים‪.‬‬
‫הערה לעתיד‪ :‬בתרגיל זה אנחנו אוסרים על שימוש במשפטי תנאי לחלוטין ברוב חלקי התרגיל‬
‫אולם במציאות האיזון בין משפטי תנאי לקוד 'מתוחכם' (ולעיתים מתחכם) עדין יותר שכן בהרבה‬
‫מקרים קוד מתוחכם הופך למאוד קשה להבנה ועדיף לחלק למקרים באמצעות תנאים‪.‬‬
‫מהו ערך גימטריה של מילה? זהו סכום ערכי הגימטריה של כל האותיות‪ .‬ערכי הגימטריה של האותיות‬
‫באנגלית מוגדר להיות‪:‬‬
‫‪a-i  1…9‬‬
‫‪j-r  10…90‬‬
‫‪s-z  100...800‬‬
‫לדוגמא‪ a=1, b=2, … , i=9, j=10, k=20,… :‬וכן הלאה‪.‬‬
‫כדי להקל על המטלה וכדי לתרגל חלוקה נכונה לפונקציות עליכם לממש את הפיתרון באופן הבא‪:‬‬
‫א‪.‬‬
‫ב‪.‬‬
‫ג‪.‬‬
‫ד‪.‬‬
‫ה‪.‬‬
‫ו‪.‬‬
‫כתבו פונקציה בשם ‪ toLowerCase‬המקבלת תו‪ ,‬אם התו שהתקבל הוא אות אנגלית גדולה‬
‫אזי מוחזרת אות קטנה (לדוגמא עבור ’‪ ‘A‬מוחזר ’‪ .)‘a‬אם התו שהתקבל אינו אות אנגלית‬
‫גדולה אזי התו מוחזר ללא שינוי‬
‫‪ .a‬בפונקציה זו מותר להשתמש במשפטי תנאי!‬
‫כתבו פונקציה בשם ‪ isLetter‬המקבלת תו ומחזירה ‪ true‬אם תו זה הוא אות אנגלית ו ‪false‬‬
‫אחרת‪.‬‬
‫‪ .a‬נסו להשתמש בפונקציה הקודמת כדי לקצר את הפונקציה הזאת‪.‬‬
‫כתבו פונקציה בשם ‪ rangeIndex‬אשר מקבלת אות (‪ )char‬ובודקת באיזה תחום האות‪ .‬אם‬
‫האות ‪ a-i‬הפו' מחזירה ‪ .0‬אם האות בתחום ‪ j-r‬הפו' מחזירה ‪ 1‬ואם בתחום ‪ s-z‬מחזירה ‪.2‬‬
‫‪ .a‬רמז‪ :‬אנחנו רוצים לבדוק האם האות היא אחת מתשע האותיות הראשונות בא'‪-‬ב'‬
‫האנגלי‪ ,‬מהתשיעייה השניה או מהתשיעייה השלישית (שבפועל יכולות להיות בה‬
‫רק ‪ 8‬אותיות אבל זה לא משנה לנו)‬
‫כתבו פונקציה בשם ‪ power‬אשר מחשבת חזקה כפי שראינו בתרגול‪ .‬הפו' מקבלת‬
‫‪ base,exp‬ומחזירה ‪ base‬בחזקת ‪ .exp‬על הפו' לטפל במקרה בו ‪( exp=0‬ואז התוצאה היא‬
‫כמובן ‪.)1‬‬
‫‪ .a‬מובטח כי ‪ exp>=0 ,base>0‬והתוצאה נכנסת ב ‪ .int‬כלומר אין צורך לבדוק מקרים‬
‫מיוחדים ואין צורך להשתמש בטיפוסים שאינם ‪.int‬‬
‫כיתבו פונקציה בשם ‪ letterGimatryValue‬אשר מקבלת אות (‪ )char‬ומחשבת את הערך‬
‫שלה בגימטריה כפי שהוגדר‪.‬‬
‫‪ .a‬נא להשתמש בשתי הפו' האחרות‪.‬‬
‫כיתבו את התוכנית הראשית‪ :‬התוכנית תקלוט מהמשתמש תווים אחד אחד כל עוד התו הוא‬
‫אות אנגלית ולא הגענו ל ‪ .EOF‬ברגע שהלולאה נגמרת התוכנית תדפיס את ערך המילה‬
‫בגימטריה (כזכור זהו סכום ערכי האותיות) ותסתיים‪.‬‬
‫‪ .a‬שימו לב שצריך לטפל גם באותיות גדולות וגם באותיות קטנות‪ .‬העזרו בפונקציות‬
‫שהגדרנו כדי להימנע מתנאים מיותרים‪.‬‬
‫דוגמאות הרצה‪:‬‬
‫שאלה ‪ – 2‬הדפסת גרף התפלגות‪.‬‬
‫אנו רוצים לכתוב תכנית אשר קולטת ציוני תלמידים בקורס ומדפיסה גרף המתאר את התפלגות‬
‫הציונים‪.‬‬
‫כיצד קולטים? הציונים הם בטווח של ‪ 1-10‬ויש לקלוט ציונים כל עוד לא הגענו ל ‪.EOF‬‬
‫‪ ‬מובטח כי הקלט תקין ואין צורך לבצע בדיקות תקינות על הקלט‬
‫‪ ‬לא ניתן לדעת מראש כמה ציונים יקלטו (למדקדקים‪ :‬מספר הציונים לא יותר גדול מערך‬
‫שנכנס ל ‪.)int‬‬
‫כיצד מדפיסים? עליכם להדפיס לכל ציון אפשרי מאחד ועד עשר שורה עם מספר הציון ושורת‬
‫כוכביות שמייצגת את מספר התלמידים שקיבלו את הציון הזה‪.‬‬
‫כמה כוכביות בכל שורה? בכל שורה מספר הכוכביות יהיה בדיוק מספר התלמידים שקיבלו את‬
‫הציון המסוים שהשורה מייצגת‪ .‬בשורה הראשונה מספר התלמידים שקיבלו ציון ‪ ,1‬בשורה השנייה‬
‫מס' התלמידים שקיבלו ‪ 2‬וכן הלאה‪.‬‬
‫דוגמאות הרצה (שימו לב כי ‪ ^Z‬זהו חלק מהקלט – ככה מסמלצים ‪ EOF‬כפי שנלמד בתרגול)‪:‬‬
‫שאלה ‪ – 3‬חיפוש רצף מספרים‪:‬‬
‫בתרגיל זה עליכם לקלוט מערך דו מימדי של מספרים בגודל ‪ ,4x4‬אורך רצף ‪ n‬ומספר ‪ .x‬על התוכנית‬
‫לחפש במערך הדו מימדי האם ישנו רצף של מספרים באורך ‪ n‬אשר סכומם הוא ‪ x‬ולהדפיס הודעה‬
‫מתאימה‪ .‬הרצף יכול להיות במאונך‪ ,‬במאוזן או באלכסון‪.‬‬
‫בתרגיל זה יש לכם חופש להחליט האם וכיצד לחלק את הפתרון לפונקציות‪ .‬נסו לחלק לפונקציות כך‬
‫שהחלוקה תהיה פשוטה ואינטואיטיבית ותקל על פתרון התרגיל‪.‬‬
‫דוגמאות הרצה‪:‬‬
‫חשוב מאוד‪ :‬פתרו את התרגיל באמצעות לולאות והקפידו לא לשכפל קוד מיותר!‬
‫שימו לב‪:‬‬
‫‪‬‬
‫‪‬‬
‫השתמשו בקבועים במקומות שצריך‪ .‬לדוגמא הגדירו קבוע לגודל המערך הדו מימדי‪.‬‬
‫וודאו שהפתרון יעבוד גם אם נשנה קבוע זה‪.‬‬
‫וודאו שאכן חיפשתם את הרצף בכל הכיוונים האפשריים‬