בעיה פשוטה - JAVA - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

בעיה פשוטה - JAVA


iem

Recommended Posts

בתרגיל נתבקשנו לכתוב מחלקה בשם 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){

}


}

הבעיה היא שאני מרגיש שמשהו לא נכון כאן כי אם כתבתי את כל החברי מחלקה נכון, אז איך אני אמור ליצור עצם מסוג עולם חדש כעת? האם יצרתי בכלל את המטריצה נכון ?

אשמח להכוונה כי אני ממש תקוע עם זה ... :'(

קישור לתוכן
שתף באתרים אחרים

  • תגובות 58
  • נוצר
  • תגובה אחרונה

ע"פ הגדרת התרגיל שלך

העולם ייוצג באמצעות רשימה של רובוטים

אז בשביל מה להגדיר מטריצה בכלל ?

תפריד בין הרעיון (רובוטים על לוח משבצות) לייצוג המידע (רשימה מקושרת, מטריצה, או דרך אחרת), ותמצא מה הכי מתאים להמשך התרגיל.

קישור לתוכן
שתף באתרים אחרים

אז בשביל מה להגדיר מטריצה בכלל ?

כי הם דורשים את זה בשורה הראשונה של התרגיל, בדגש על ריבועית...

איך אתה יכול ליצור את המטריצה שלך אם אתה עדיין לא יודע מה גודל העולם (גודל העולם הרי מתקבל בבנאי)?

דאג ליצור את המטריצה רק כשאתה יודע מה הגודל שלה צריך להיות.

תיקנתי...


import java.awt.*;

public class RobotsWorld {
private int n;
Robot[][] roboArr;

public RobotsWorld(int worldDim){
n=worldDim;
roboArr = new Robot[n][n];
}

האם כך הדבר או ששכחתי משהו בבנאי לפי הדרישות ? פשוט אני לא רוצה לפשל עם הבנאי... חסרים { כי חתכתי את החלק של הבנאי עד השיטות.

קישור לתוכן
שתף באתרים אחרים

א - מאוד ייתכן שאתה צודק. צריך לקרוא את התרגיל במלואו, מה שלא עשיתי.

ב - אני סבור שאתה טועה, ושאין דרישה כזו.

למה ?

כי למחלקה יש קורדינאטות.

למה יש לכל קורדינאטות פנימיות משלו אם הוא סטאטי בתוך המטריצה ? (יש לו ערכי i,j שמגיעים ממיקומו במטריצה)

אתה גם מגדיר n^2 , שזה קצת בזבוז.

המחלקה robotworld יוצרת אבסטרקציה על המידע הפנימי, וכלפי חוץ תיראה כמטריצה. בלי קשר לייצוג הפנימי של המידע.

קישור לתוכן
שתף באתרים אחרים

בהחלט הגיוני לשמור את הקואורדינטות אצל הרובוט, וגם להחזיק מטריצה של מיקומי הרובוטים בעולם.

קח לדוגמה את המתודה move: נרצה שהרובוט לא יוכל לזוז למקום שבו נמצא כרגע אחר. לשיטתך, נאלץ לעבור על רשימת כל הרובוטים ולבדוק אם יש התנגשות. עם מטריצה, אפשר פשוט לבדוק האם התא המדובר במטריצה פנוי.

ולא באמת מגדירים n^2 , כי תאים ריקים במטריצה הם פשוט null. חוץ מזה, אפשר גם לחסוך מקום על ידי שימוש ב-<Map<Point,Robot במקום המטריצה.

קישור לתוכן
שתף באתרים אחרים

עם מטריצה, אפשר פשוט לבדוק האם התא המדובר במטריצה פנוי.

נכון, זה הייתרון של מטריצה על פני רשימה. מעבר נוח יותר בבדיקה של move.

גם לרשימה מקושרת יכולות להיות ייתרונות (לדוגמה מעבר על כל הרובוטים במטריצה דלילה).

אבל לא זה העניין... לא התכוונתי שדווקא רשימה מקושרת מתאימה יותר (צריך לראות מה עושים בהמשך התרגיל...)

אם יש לך את הרובוטים כמטריצה, הייצוג הפנימי של point מיותר... הרי כשאתה ניגש לגעת ברובוט אתה יודע בהכרח את המיקום שלו, וכשאתה מזיז אותו אתה נוגע בתא אחר.

זה מדליק לי נורה שאולי לא לזה התכוון משורר התרגיל...

קישור לתוכן
שתף באתרים אחרים

גם לרשימה מקושרת יכולות להיות ייתרונות (לדוגמה מעבר על כל הרובוטים במטריצה דלילה).

אבל לא זה העניין... לא התכוונתי שדווקא רשימה מקושרת מתאימה יותר (צריך לראות מה עושים בהמשך התרגיל...)

בשביל מה שאמרת לא צריך רשימה מקושרת, מספיקה רשימה רגילה (ArrayList). וכמו שאמרתי, אם המטריצה דלילה ורוצים לחסוך מקום, אז אפשר להשתמש ב-<Map<Point,Robot.

אם יש לך את הרובוטים כמטריצה, הייצוג הפנימי של point מיותר... הרי כשאתה ניגש לגעת ברובוט אתה יודע בהכרח את המיקום שלו, וכשאתה מזיז אותו אתה נוגע בתא אחר.

זה מדליק לי נורה שאולי לא לזה התכוון משורר התרגיל...

לא נראה לך הגיוני שרובוט ידע מה המיקום של עצמו? זה שיש לך ביד לא אומר שאתה יודע באיזה מקום במטריצה הוא יושב.

זה לא נורא להחזיק מידע כפול, כל עוד אתה דואג לשמור עליו קונסיסטנטי.

אפשר גם שהמטריצה תהיה של מספרים שלמים ולא של רובוטים (כל מזוהה על פי מספר שלם כלשהו).

מה היתרון בזה? הרי כל תא במטריצה הוא פשוט מצביע לרובוט, הוא לא באמת מכיל עותק של הרובוט. זה לא חוסך מקום או משהו כזה.

קישור לתוכן
שתף באתרים אחרים

זה לא נורא להחזיק מידע כפול, כל עוד אתה דואג לשמור עליו קונסיסטנטי.

שום דבר לא נורא, אפשר לתכנת את זה ב20 דרכים שונות...

זה רק מרים דגל קטן. בסוף זה תרגיל.. ואולי המתרגל רצה לגרום לו ללמוד משהו א'. והפתרון הזה עוקף את זה...

התרגיל נועד ללמד, לא באמת "לפתור את הבעיה" של איך לייצג בעולם.

לכן שווה לברר.

אם אין הגבלות - אכן כנראה שייצוג במטריצה הוא הנוח ביותר.

קישור לתוכן
שתף באתרים אחרים

אין הגבלות סיבוכיות ויעילות, זה אכן בשביל ללמוד, ואני חושב שבמטריצה בשביל ההשתפשפות בהתחלה זה סבבה לגמרי.

השאלה אם הבנאי מתאים לפי דרישות התרגיל ומשם אפשר לזרום למתודות כבר או שצריך לשפצר עוד כמה דברים לפני ?

קישור לתוכן
שתף באתרים אחרים

אהה סבבה..

כתבתי את המתודה

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

תודה.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.


×
  • צור חדש...