MMN 13 2017b Final

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

‫מטלת מנחה )ממ"ן( ‪13‬‬

‫‪ - 20441‬מבוא למדעי המחשב ושפת ‪Java‬‬ ‫הקורס‪:‬‬

‫נושא המטלה‪ :‬לולאות ומערכים‬ ‫חומר הלימוד למטלה‪ :‬יחידות ‪6 – 5‬‬

‫משקל המטלה‪ 5 :‬נקודות‬ ‫מספר השאלות‪1 :‬‬

‫מועד אחרון להגשה‪13.5.2017 :‬‬ ‫‪2017‬ב‬ ‫סמסטר‪:‬‬


‫)ת(‬

‫במטלה זו אנו משתמשים במחלקה ‪ Point‬שכתבנו בממ"ן ‪.12‬‬


‫אתם יכולים להשתמש במחלקה ‪ Point‬שכתבתם או בקובץ ‪ Point.class‬שיהיה באתר בספר‬
‫הדיגיטלי של יחידות ‪ 6 – 5‬בצמוד למטלה ‪ .13‬נשים את הקובץ הזה באתר רק אחרי ההגשה של‬
‫מטלה ‪.12‬‬

‫אנא קראו את הכתוב במדריך ‪ creating_a _project_and_using_existing_classes‬שנמצא בלשונית‬


‫"מדריכי עזר" במשאבי הלמידה בדף הבית של האתר הקורס‪ .‬כך תדעו איך להשתמש במחלקה‬
‫שכבר כתובה‪ ,‬וניתנת לכם כקובץ ‪ class‬ללא הקוד‪.‬‬
‫שמנו באתר טסטר בסיסי לבדיקה ראשונית של המטלה‪ .‬חובה להריץ את המטלה מול הטסטר‬
‫ולבדוק שאין טעויות קומפילציה‪.‬‬

‫שאלה ‪ - 1‬להרצה )‪(100%‬‬


‫מצולע קמור הוא מצולע שכל זוויותיו הפנימיות קטנות מ‪ 180-‬מעלות‪ .‬במצולע קמור הקו המחבר‬
‫כל שתי נקודות מתוך המצולע עובר רק בתוך המצולע‪.‬‬

‫המחלקה ‪ Polygon‬מייצגת מצולע קמור במישור‪.‬‬

‫הייצוג נעשה על‪-‬ידי מערך ששומר את רשימת הקדקודים )‪ (vertices‬של המצולע לפי סדר‬
‫הופעתם במצולע‪ .‬אין חשיבות מי הקדקוד הראשון‪ .‬כל קדקוד מיוצג על‪-‬ידי נקודה במישור‪.‬‬
‫התכונות במחלקה הן‪:‬‬
‫‪Point [] _vertices‬‬ ‫מערך של הקדקודים‬ ‫‪‬‬
‫‪int _noOfVertices‬‬ ‫מספר הקדקודים במצולע‬ ‫‪‬‬

‫כמו כן קיים קבוע מספרי המציין את המספר המקסימלי של הקדקודים במצולע ‪.10 -‬‬
‫אין להוסיף תכונות מעבר לתכונות אילו‪ .‬לא פרטיות ולא ציבוריות‪.‬‬
‫הקדקודים )כלומר האובייקטים מהמחלקה ‪ (Point‬נמצאים במערך ברצף‪ ,‬ללא "חורים"‬
‫מתחילת המערך‪ .‬המערך צריך להישאר כך )ללא חורים( לאחר כל פעולה‪.‬‬

‫‪25‬‬
‫הנה דוגמא למצולע קמור‪ .‬השמות שהצמדנו לנקודות הם רק לשם התיחסות בהמשך‪.‬‬

‫ציר ה‪Y -‬‬

‫‪D‬‬
‫‪6‬‬
‫‪5‬‬
‫‪C‬‬
‫‪4‬‬
‫‪E‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪A‬‬ ‫‪B‬‬
‫‪0‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫… ‪7‬‬ ‫ציר ה‪X -‬‬

‫המערך המייצג את הקדקודים של המצולע הוא‪:‬‬

‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪8‬‬ ‫‪9‬‬

‫‪_x=2.0‬‬ ‫‪_x=5.0‬‬ ‫‪_x=7.0‬‬ ‫‪_x=4.0‬‬ ‫‪_x=1.0‬‬ ‫‪null‬‬ ‫‪null‬‬ ‫‪null‬‬ ‫‪null‬‬ ‫‪null‬‬

‫‪_y=1.0‬‬ ‫‪_y=0.0‬‬ ‫‪_y=5.0‬‬ ‫‪_y=6.0‬‬ ‫‪_y=4.0‬‬

‫כאשר ‪_noOfVertices = 5‬‬

‫עליכם לממש ב‪ Java -‬את המחלקה ‪ Polygon‬לפי הסעיפים להלן‪:‬‬


‫‪ .1‬הגדרת התכונות של המחלקה‪.‬‬
‫‪ .2‬בנאי שמאתחל את תכונות המחלקה כך שהמערך יהיה בגודל מקסימלי‪.‬‬
‫‪ .3‬שיטה בוליאנית ‪ addVertex‬שמוסיפה קדקוד למצולע‪ .‬היא מקבלת כפרמטרים שני‬
‫מספרים ממשיים ‪ x‬ו‪ y -‬שמייצגים את הקואורדינטות של הקדקוד הנוסף‪ ,‬ומכניסה‬
‫נקודה עם תכונות אלו למערך הקדקודים במקום הראשון האפשרי במערך‪.‬‬
‫השיטה תחזיר ‪ true‬אם ההוספה התבצעה כראוי‪ ,‬כלומר נמצא מקום במערך עבור‬
‫הקדקוד הנוסף ו‪ false -‬אם המערך כבר מלא‪.‬‬
‫ניתן להניח את ההנחות הבאות )כלומר‪ ,‬אין צורך לבדוק זאת(‪:‬‬
‫הקדקוד החדש שנוסף לא מקלקל את היות המצולע מצולע קמור‪.‬‬ ‫‪‬‬
‫הקדקוד אינו קיים עדיין במצולע‪.‬‬ ‫‪‬‬

‫‪26‬‬
‫הוספת הקדקודים על ידי השיטה ‪ addVertex‬נעשית תמיד לפי סדר‬ ‫‪‬‬
‫הופעתם במצולע‪.‬‬
‫‪ .4‬שיטה ‪ highestVertex‬המחזירה העתק של את הקדקוד שנמצא הכי גבוה במצולע‪.‬‬
‫אם יש יותר מאחד בגובה הגבוה ביותר ‪ ,‬היא מחזירה את הראשון בו נתקלה‪ .‬אם‬
‫אין קדקודים בפוליגון )כלומר המערך הוא ריק( השיטה תחזיר ‪.null‬‬
‫‪ .5‬השיטה ‪ toString‬המחזירה מחרוזת תווים המייצגת את המצולע‪ .‬המחרוזת צריכה‬
‫להיות בדיוק בפורמט הבא‪ :‬שימו לב שאין רווחים במחרוזת של הקדקודים‪.‬‬
‫‪The polygon has 5 vertices:‬‬
‫))‪((2.0,1.0),(5.0,0.0),(7.0,5.0),(4.0,6.0),(1.0,4.0‬‬
‫אם אין קדקודים השיטה תחזיר מחרוזת בדיוק בפורמט הבא )כולל הנקודה(‪:‬‬
‫‪The polygon has 0 vertices.‬‬
‫‪ .6‬שיטה ‪ calcPerimeter‬המחזירה מספר ממשי )‪ (double‬המייצג את היקף המצולע‪.‬‬
‫אם מספר הקדקודים הוא ‪ 2‬יוחזר אורך הקטע )לא הלוך וחזור(‪.‬‬
‫אם מספר הקדקודים הוא ‪ 1‬או ‪ 0‬יוחזר ‪.0‬‬
‫‪ .7‬שיטה ‪ calcArea‬המחזירה מספר ממשי )‪ (double‬המייצג את שטח המצולע‪.‬‬
‫כדי לחשב את שטח המצולע‪ ,‬צריך לסכום את שטחי המשולשים המכסים את שטח‬
‫המצולע‪ .‬בדוגמא לעיל‪ ,‬למשל‪ ,‬צריך לסכם את שטחי המשולשים הבאים‪A-B-C, :‬‬
‫‪.A-C-D, A-D-E‬‬
‫לשם חישוב שטח המשולש ‪,‬ניתן להשתמש בנוסחת ‪ Heron‬הקובעת כי שטח המשולש‬
‫שווה לשורש הריבועי של )‪ s(s-a)(s-b)(s-c‬כאשר ‪ b ,a‬ו ‪- c‬הם אורכי שלוש הצלעות‬
‫של המשולש ‪,‬ו ‪- s‬הוא מחצית היקפו‪.‬‬
‫ניתן להוסיף שיטה לחישוב שטח משולש‪ .‬שימו לב שהשיטה לחישוב שטח משולש‬
‫צריכה להיות פרטית ולא ציבורית‪.‬‬
‫אם מספר הקדקודים קטן מ‪ 3-‬יוחזר ‪.0‬‬
‫‪ .8‬שיטה בוליאנית ‪ isBigger‬המקבלת מצולע אחר‪ ,‬ומחזירה ‪ true‬אם המצולע שעליו‬
‫מופעלת השיטה גדול בשטחו מהמצולע המועבר כפרמטר ואחרת מחזירה ‪ .false‬ניתן‬
‫להניח שהפרמטר אינו ‪.null‬‬
‫‪ .9‬שיטה ‪ findVertex‬המקבלת נקודה כפרמטר ומחזירה את המיקום שלה במערך‪ ,‬אם‬
‫היא נמצאת‪ .‬אם לא‪ ,‬יוחזר ‪) -1‬מינוס(‪ .‬לדוגמא‪ ,‬אם השיטה תופעל עם הפרמטר )‪(5,0‬‬
‫היא תחזיר את הערך ‪ .1‬שימו לב שהקדקוד הראשון נמצא במיקום ‪ 0‬במערך‪.‬‬
‫הנקודה‬ ‫‪ .10‬שיטה ‪ ,getNextVertex‬המקבלת נקודה כפרמטר‪ ,‬ומחזירה העתק של‬
‫המייצגת את הקדקוד הבא במצולע‪ .‬אם הנקודה שהתקבלה אינה קדקוד במצולע‪,‬‬
‫השיטה תחזיר ‪ .null‬אם הנקודה היא האיבר האחרון במערך‪ ,‬יוחזר העתק של‬
‫הנקודה הראשונה‪ .‬אם הנקודה היא הנקודה היחידה במערך יוחזר העתק של‬
‫הנקודה עצמה‪.‬‬

‫‪27‬‬
‫‪ .11‬שיטה ‪ getBoundingBox‬המחזירה את המלבן )כפוליגון( )המקביל לצירים( החוסם‬
‫את המצולע‪ .‬אם מספר הקדקודים קטן מ‪ 3-‬יוחזר ‪ .null‬הקדקוד הראשון במערך‬
‫המייצג את המלבן צריך להיות הקדקוד השמאלי התחתון‪ ,‬ושאר הקדקודים יופיעו‬
‫בסדר הפוך מכיוון השעון )כלומר הקדקוד השני יהיה הימני התחתון‪ ,‬השלישי הימני‬
‫העליון והרביעי השמאלי העליון(‪.‬‬

‫לפניכם רשימת החתימות של הבנאי ושיטות המחלקה‪:‬‬


‫)(‪public Polygon‬‬ ‫בנאי‬
‫)‪public boolean addVertex(double x, double y‬‬ ‫שיטה שמוסיפה קדקוד למצולע‬
‫)(‪public Point highestVertex‬‬ ‫שיטה שמחזירה העתק של את הקדקוד‬
‫שנמצא הכי גבוה במצולע‬
‫)(‪public String toString‬‬ ‫תווים‬ ‫מחרוזת‬ ‫שמחזירה‬ ‫שיטה‬
‫המייצגת את המצולע‬
‫)( ‪public double calcPerimeter‬‬ ‫שיטה שמחזירה את היקף המצולע‬

‫)(‪public double calcArea‬‬ ‫שיטה שמחזירה את שטח המצולע‬

‫)‪public boolean isBigger(Polygon other‬‬ ‫שיטה שמקבלת מצולע אחר‪ ,‬ובודקת‬


‫אם המצולע שעליו מופעלת השיטה גדול‬
‫בשטחו מהמצולע המועבר כפרמטר‬
‫)‪public int findVertex(Point p‬‬ ‫כפרמטר‬ ‫נקודה‬ ‫שמקבלת‬ ‫שיטה‬
‫ומחזירה את המיקום שלה במערך‬
‫)‪public Point getNextVertex(Point p‬‬ ‫כפרמטר‪,‬‬ ‫נקודה‬ ‫שמקבלת‬ ‫שיטה‬
‫ומחזירה העתק של הנקודה המייצגת‬
‫את הקדקוד הבא במצולע‬
‫)(‪public Polygon getBoundingBox‬‬ ‫שיטה שמחזירה את המלבן )כפוליגון(‬
‫החוסם את המצולע‬

‫שימו לב לא לבצע ‪ aliasing‬במקומות המועדים‪.‬‬


‫מותר להוסיף שיטות נוספות )פרטיות(‪ ,‬לפי ראות עיניכם‪.‬‬

‫אתם צריכים לכתוב בעצמכם ‪ API‬למחלקה‪ ,‬לבנאים ולשיטות לפי הנהוג בכתיבת‬
‫‪ .API‬כמו כן‪ ,‬עליכם לתעד בתיעוד פנימי כל מה שדורש הבהרה ואינו פשוט‪.‬‬

‫‪28‬‬
‫שימו לב‪,‬‬
‫באתר הקורס תמצאו גם טסטר לבדיקת האיות והפרמטרים של השמות של‬
‫השיטות והמחלקה שאתם צריכים לכתוב‪ .‬חובה עליכם לבדוק את המחלקה‬
‫שכתבתם בטסטר זה‪ ,‬ולהגיש אותה רק אם הטסטר עובר קומפילציה‪ .‬שימו לב‬
‫שהטסטר לא מכסה את כל האפשרויות‪ ,‬ובפרט לא את מקרי הקצה‪ .‬הוא רק בודק‬
‫את השמות של השיטות במחלקות כלומר שגיאות קומפילציה‪ .‬מאד מומלץ להוסיף‬
‫לו בדיקות‪.‬‬

‫הגשה‬
‫‪ .1‬הגשת הממ"ן נעשית בצורה אלקטרונית בלבד‪ ,‬דרך מערכת שליחת המטלות‪.‬‬
‫‪ .2‬הקפידו לתעד בתיעוד פנימי וב‪ API -‬את כל השיטות שיש במחלקות השונות‪.‬‬
‫‪ .3‬הקפידו ששמות השיטות יהיו בדיוק כפי שכתוב במטלה‪ .‬וכן שההדפסות יהיו בדיוק כפי‬
‫שמופיע במטלה‪.‬‬
‫‪ .4‬עליכם להגיש את הקובץ ‪ ,Polygon.java‬עטפו אותו בקובץ ‪ zip‬ושלחו‪ .‬אין לשלוח קבצים‬
‫נוספים‪.‬‬

‫בהצלחה‬

‫‪29‬‬
30

You might also like