2016 ,) 234114/7 ( /` אביב סמסטר `ח מ מבוא למדעי המחשב
Transcription
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ולהדפיס הודעה מתאימה .הרצף יכול להיות במאונך ,במאוזן או באלכסון. בתרגיל זה יש לכם חופש להחליט האם וכיצד לחלק את הפתרון לפונקציות .נסו לחלק לפונקציות כך שהחלוקה תהיה פשוטה ואינטואיטיבית ותקל על פתרון התרגיל. דוגמאות הרצה: חשוב מאוד :פתרו את התרגיל באמצעות לולאות והקפידו לא לשכפל קוד מיותר! שימו לב: השתמשו בקבועים במקומות שצריך .לדוגמא הגדירו קבוע לגודל המערך הדו מימדי. וודאו שהפתרון יעבוד גם אם נשנה קבוע זה. וודאו שאכן חיפשתם את הרצף בכל הכיוונים האפשריים