iem פורסם 2011 בדצמבר 7 Share פורסם 2011 בדצמבר 7 בתרגיל נתבקשנו לכתוב מחלקה בשם Robot בעלת התכונות הבאות:1) זיהוי - מספר שלם המזהה את הרובוט.2) מיקום הרובוט - אובייקט מסוג Point המייצג את הקואורדינטות של מיקום הרובוט בעולם.3) כיוון הרובוט (ישנם 4 כיוונים).את המחלקה הזו עם השיטות: public void move() , public void turnLeft() , public void turnRight() כתבתי.לאחר מכן מגיעה הבעיה:נתבקשנו לכתוב מחלקה בשם RobotsWorld שמייצגת את עולם הרובוטים כמטריצה ריבועית של תאים. בכל תא יכול להיות רובוט אחד לכל היותר ותנועת הרובוטים מתבצעת מתא לתא בהתאם לכיוון הרובוט. העולם ייוצג באמצעות רשימה של רובוטים (מסוג Robot שהוגדר לעיל) ומשתנה המייצג את מימדי העולם.מבקשים גם לכתוב בנאי המקבל כפרמטר את מימדי העולם ומאתחל אותו כעולם ריק מרובוטים.בינתיים כתבתי את הקוד הבא (בצירוף החתימות של השיטות שאני אצטרך לבנות):import java.util.*;public class RobotsWorld { private int n; private Robot roboArr[][] = new Robot[n][n]; //2D Robot type array public RobotsWorld(int worldDim){ n=worldDim; } public boolean addRobot(Point p){ } public boolean removeRobot(Point p){ } public Robot getRobot(Point p){ } public boolean moveRobot(Point p){ }}הבעיה היא שאני מרגיש שמשהו לא נכון כאן כי אם כתבתי את כל החברי מחלקה נכון, אז איך אני אמור ליצור עצם מסוג עולם חדש כעת? האם יצרתי בכלל את המטריצה נכון ?אשמח להכוונה כי אני ממש תקוע עם זה ... :'( קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2011 בדצמבר 7 Share פורסם 2011 בדצמבר 7 איך אתה יכול ליצור את המטריצה שלך אם אתה עדיין לא יודע מה גודל העולם (גודל העולם הרי מתקבל בבנאי)?דאג ליצור את המטריצה רק כשאתה יודע מה הגודל שלה צריך להיות. קישור לתוכן שתף באתרים אחרים More sharing options...
עוד אחד פורסם 2011 בדצמבר 7 Share פורסם 2011 בדצמבר 7 ע"פ הגדרת התרגיל שלךהעולם ייוצג באמצעות רשימה של רובוטיםאז בשביל מה להגדיר מטריצה בכלל ?תפריד בין הרעיון (רובוטים על לוח משבצות) לייצוג המידע (רשימה מקושרת, מטריצה, או דרך אחרת), ותמצא מה הכי מתאים להמשך התרגיל. קישור לתוכן שתף באתרים אחרים More sharing options...
iem פורסם 2011 בדצמבר 7 מחבר Share פורסם 2011 בדצמבר 7 אז בשביל מה להגדיר מטריצה בכלל ?כי הם דורשים את זה בשורה הראשונה של התרגיל, בדגש על ריבועית...איך אתה יכול ליצור את המטריצה שלך אם אתה עדיין לא יודע מה גודל העולם (גודל העולם הרי מתקבל בבנאי)?דאג ליצור את המטריצה רק כשאתה יודע מה הגודל שלה צריך להיות.תיקנתי...import java.awt.*;public class RobotsWorld { private int n; Robot[][] roboArr; public RobotsWorld(int worldDim){ n=worldDim; roboArr = new Robot[n][n]; } האם כך הדבר או ששכחתי משהו בבנאי לפי הדרישות ? פשוט אני לא רוצה לפשל עם הבנאי... חסרים { כי חתכתי את החלק של הבנאי עד השיטות. קישור לתוכן שתף באתרים אחרים More sharing options...
עוד אחד פורסם 2011 בדצמבר 7 Share פורסם 2011 בדצמבר 7 א - מאוד ייתכן שאתה צודק. צריך לקרוא את התרגיל במלואו, מה שלא עשיתי.ב - אני סבור שאתה טועה, ושאין דרישה כזו.למה ?כי למחלקה רובוט יש קורדינאטות.למה יש לכל רובוט קורדינאטות פנימיות משלו אם הוא סטאטי בתוך המטריצה ? (יש לו ערכי i,j שמגיעים ממיקומו במטריצה)אתה גם מגדיר n^2 רובוטים, שזה קצת בזבוז.המחלקה robotworld יוצרת אבסטרקציה על המידע הפנימי, וכלפי חוץ תיראה כמטריצה. בלי קשר לייצוג הפנימי של המידע. קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2011 בדצמבר 8 Share פורסם 2011 בדצמבר 8 בהחלט הגיוני לשמור את הקואורדינטות אצל הרובוט, וגם להחזיק מטריצה של מיקומי הרובוטים בעולם.קח לדוגמה את המתודה move: נרצה שהרובוט לא יוכל לזוז למקום שבו נמצא כרגע רובוט אחר. לשיטתך, נאלץ לעבור על רשימת כל הרובוטים ולבדוק אם יש התנגשות. עם מטריצה, אפשר פשוט לבדוק האם התא המדובר במטריצה פנוי.ולא באמת מגדירים n^2 רובוטים, כי תאים ריקים במטריצה הם פשוט null. חוץ מזה, אפשר גם לחסוך מקום על ידי שימוש ב-<Map<Point,Robot במקום המטריצה. קישור לתוכן שתף באתרים אחרים More sharing options...
עוד אחד פורסם 2011 בדצמבר 8 Share פורסם 2011 בדצמבר 8 עם מטריצה, אפשר פשוט לבדוק האם התא המדובר במטריצה פנוי.נכון, זה הייתרון של מטריצה על פני רשימה. מעבר נוח יותר בבדיקה של move.גם לרשימה מקושרת יכולות להיות ייתרונות (לדוגמה מעבר על כל הרובוטים במטריצה דלילה).אבל לא זה העניין... לא התכוונתי שדווקא רשימה מקושרת מתאימה יותר (צריך לראות מה עושים בהמשך התרגיל...)אם יש לך את הרובוטים כמטריצה, הייצוג הפנימי של point מיותר... הרי כשאתה ניגש לגעת ברובוט אתה יודע בהכרח את המיקום שלו, וכשאתה מזיז אותו אתה נוגע בתא אחר.זה מדליק לי נורה שאולי לא לזה התכוון משורר התרגיל... קישור לתוכן שתף באתרים אחרים More sharing options...
Gil28 פורסם 2011 בדצמבר 8 Share פורסם 2011 בדצמבר 8 אפשר גם שהמטריצה תהיה של מספרים שלמים ולא של רובוטים (כל רובוט מזוהה על פי מספר שלם כלשהו). קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2011 בדצמבר 8 Share פורסם 2011 בדצמבר 8 גם לרשימה מקושרת יכולות להיות ייתרונות (לדוגמה מעבר על כל הרובוטים במטריצה דלילה).אבל לא זה העניין... לא התכוונתי שדווקא רשימה מקושרת מתאימה יותר (צריך לראות מה עושים בהמשך התרגיל...)בשביל מה שאמרת לא צריך רשימה מקושרת, מספיקה רשימה רגילה (ArrayList). וכמו שאמרתי, אם המטריצה דלילה ורוצים לחסוך מקום, אז אפשר להשתמש ב-<Map<Point,Robot.אם יש לך את הרובוטים כמטריצה, הייצוג הפנימי של point מיותר... הרי כשאתה ניגש לגעת ברובוט אתה יודע בהכרח את המיקום שלו, וכשאתה מזיז אותו אתה נוגע בתא אחר.זה מדליק לי נורה שאולי לא לזה התכוון משורר התרגיל...לא נראה לך הגיוני שרובוט ידע מה המיקום של עצמו? זה שיש לך רובוט ביד לא אומר שאתה יודע באיזה מקום במטריצה הוא יושב.זה לא נורא להחזיק מידע כפול, כל עוד אתה דואג לשמור עליו קונסיסטנטי.אפשר גם שהמטריצה תהיה של מספרים שלמים ולא של רובוטים (כל רובוט מזוהה על פי מספר שלם כלשהו).מה היתרון בזה? הרי כל תא במטריצה הוא פשוט מצביע לרובוט, הוא לא באמת מכיל עותק של הרובוט. זה לא חוסך מקום או משהו כזה. קישור לתוכן שתף באתרים אחרים More sharing options...
Gil28 פורסם 2011 בדצמבר 8 Share פורסם 2011 בדצמבר 8 כמדומני מצביע הוא 8 ביטים לעומת 4 של int (למרות שאף אחד לא מחפש כאן 100% יעילות). קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2011 בדצמבר 8 Share פורסם 2011 בדצמבר 8 הגודל של מצביע הוא אכן לא קטן מהגודל של int, אבל זה נראה לי שולי (כאמור, אם הבעיה היא מקום אז עדיף לייצג ע"י רשימה דלילה). קישור לתוכן שתף באתרים אחרים More sharing options...
עוד אחד פורסם 2011 בדצמבר 8 Share פורסם 2011 בדצמבר 8 זה לא נורא להחזיק מידע כפול, כל עוד אתה דואג לשמור עליו קונסיסטנטי.שום דבר לא נורא, אפשר לתכנת את זה ב20 דרכים שונות...זה רק מרים דגל קטן. בסוף זה תרגיל.. ואולי המתרגל רצה לגרום לו ללמוד משהו א'. והפתרון הזה עוקף את זה...התרגיל נועד ללמד, לא באמת "לפתור את הבעיה" של איך לייצג רובוטים בעולם.לכן שווה לברר.אם אין הגבלות - אכן כנראה שייצוג במטריצה הוא הנוח ביותר. קישור לתוכן שתף באתרים אחרים More sharing options...
iem פורסם 2011 בדצמבר 8 מחבר Share פורסם 2011 בדצמבר 8 אין הגבלות סיבוכיות ויעילות, זה אכן בשביל ללמוד, ואני חושב שבמטריצה בשביל ההשתפשפות בהתחלה זה סבבה לגמרי.השאלה אם הבנאי מתאים לפי דרישות התרגיל ומשם אפשר לזרום למתודות כבר או שצריך לשפצר עוד כמה דברים לפני ? קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2011 בדצמבר 8 Share פורסם 2011 בדצמבר 8 כן, הבנאי בסדר (והדרך הכי טובה לדעת את זה היא פשוט לבדוק אם שאר הקוד שלך עובד). קישור לתוכן שתף באתרים אחרים More sharing options...
iem פורסם 2011 בדצמבר 9 מחבר Share פורסם 2011 בדצמבר 9 אהה סבבה..כתבתי את המתודה public boolean addRobot(Point p) אבל משום מה הוא לא מתקמפל...המתודה אמורה לקבל כפרמטר אובייקט מסוג Point ולהוסיף רובוט במיקום של Point, במידה והמיקום מחוץ לגבולות העולם, או שיש רובוט בתא כבר, היא מחזירה false, אחרת היא מוסיפה אותו למיקום ומחזירה true.כתבתי:import java.awt.*;public class RobotsWorld { private int n; Robot[][] roboArr; public RobotsWorld (int worldDim){ n=worldDim; roboArr = new Robot[n][n]; } public boolean addRobot(Point p){ if ((p.getX()>n)||(p.getY()>n)||(roboArr[p.getX()][p.getY()]!=null)) return false; else return true; }והוא נותן לי על השורה של ה-if שגיאה, כאשר הוא מסמן לי את התנאי של ה-null, כאשר באתי לבדוק אם התא ריק, וניתן לצאת מהנחה שהתאים או ריקים או עם רובוט (בודד). אני לא כ"כ מצליח לחשוב על המקור של השגיאה שלי... מה יכולה להיות השגיאה ?2) דבר נוסף שאני צריך עזרה בו זה איך אני נותן שם חדש לרובוט חדש בהנחה שמן הסתם יהיו כמה כאלה, אני צריך איכשהו לתת לו שם מייצג (אני מניח), אבל אני לא יכול לתת לו שם מפורש שלא מגיע מפרמטר כי אז יהיה בעיה להבדיל בפניות לרובוטים, אני מניח... מה עושים במקרה כזה ?תודה. קישור לתוכן שתף באתרים אחרים More sharing options...
Recommended Posts
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.