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

בעיה פשוטה - JAVA


iem

Recommended Posts

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

מה משמעות השדה n? למה המפה של הרובוטים אינה private?

חוץ מזה, לא הוספת את הרובוט.

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

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

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

נ.ב. כבר אמרתי את זה עשרות פעמים: תמיד תמיד תמיד תמיד תמיד תמיד תמיד תמיד תמיד שמים סוגריים מסולסלים אחרי if/for/while, גם אם יש רק פקודה אחת.

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

מה משמעות השדה n? למה המפה של הרובוטים אינה private?

חוץ מזה, לא הוספת את הרובוט.

השדה n בעיקרון לא ממש חיוני כי הבנאי הרי יודע לקבל מהמשתמש את גודל הגבול, אבל ככה אני שומר על ה-encapsulation כי אני לא רוצה לאפשר ליוזר גישה מיידית ליצירת המערך.

את הרובוט אני לא יודע להוסיף בגלל הדילמה שהזכרתי קודם...

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

התוכנית כעת:


import java.awt.*;

public class RobotsWorld {
private int n;
private 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 במתודה של addRobot:


Multiple markers at this line
- Type mismatch: cannot convert from double to int
- Type mismatch: cannot convert from double to int
- Line breakpoint:RobotsWorld [line: 13] - ‪addRobot
(Point)

הוא אחרי זה מציע בחום (quick fix של ה-eclipse) לעשות casting ל-int לתנאי האחרון (מה-3 ב-if) על ה-

p.getX() ; p.getY()

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

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

בשביל לשמור על encapsulation אתה צריך שהמערך של הרובוטים יהיה גם private.

מה ערך ההחזרה של getX ו-getY? נראה שזה double ולא int.

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

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

אבל הפכתי את המערך ל-private, פשוט לא בניתי שיטות גישה כרגע כי אין כ"כ צורך, אם אנחנו מדברים על אותו המערך שמייצג את עולם הרובוטים כמובן במח' הנוכחית.

ה-getX , getY לא שלי זה של ה- Point ש-sun כתבו... אבל אכן מחזיר double, אז מה.. בגלל ש-n הוא int והוא ממוקם כקואורדינטה במטריצה, אני צריך את הערך החוזר שלי ה-double לעשות לו casting ל-int ? כי כרגע עשיתי והדבר היחיד שהוא רושם על אותה שורה הוא:

Line breakpoint:RobotsWorld [line: 13] - ‪addRobot(Point)‬

אין לי מושג מה זה אבל זה מופיע כנק' אפורה ליד השורה...

ואיך אני פותר את בעיית יצירת הרובוט ?

תודה.

הקוד כרגע אחרי השיפצור:


import java.awt.*;

public class RobotsWorld {
private int n;
private 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[(int) p.getX()][(int) p.getY()]!=null))
{return false;}
else
{return true;}
}


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

עם איזה IDE אתה משתמש? הנקודה האפורה כנראה מסמלת breakpoint.

אם ה-getX מחזיר double אתה באמת צריך לבצע casting. הבעייה היא ש-point מחזיק ערכי double ואז זה לא כ"כ מתאים לך. מי החליט

על הטיפוס Point?

שים לב שהמתודה addRobot לא מוסיפה .

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

למה אתה משתמש ב-Point של awt? יש לתכנית שלך קשר ל-GUI?

אכן, אני אחרי זה בונה ב-main את העולם על grid ב-GUI.

עם איזה IDE אתה משתמש? הנקודה האפורה כנראה מסמלת breakpoint.

אם ה-getX מחזיר double אתה באמת צריך לבצע casting. הבעייה היא ש-point מחזיק ערכי double ואז זה לא כ"כ מתאים לך. מי החליט

על הטיפוס Point?

שים לב שהמתודה addRobot לא מוסיפה .

עשיתי על ה-breakpoint: toggle break point והיא ירדה. בעיקרון אני משתמש עם ה-IDE בגירסא 1.3.2.2011.0301-1807 אם לזה הכוונה.

בעיקרון ביקשו מאיתנו להשתמש במח' Point המובנית.

אוקיי, השלמתי את השיטה אבל הוא נותן לי הערה על השיטה, ובצדק כי אני מרגיש שמשהו לא נכון, הרי אני לא ממש יכול לתת שם ספציפי לרובוט כי יהיו יותר מרובוט בודד שיוקם בעולם ואז אם היא תיקרא בשנית תיווצר שגיאה כי השמות יהיו זהים, ודבר נוסף, הבנאי היה אמור לזהות עם UP (קבעתי שרירותית כיוון) אבל רק עם 0 הוא מזהה כי אחרת הוא אומר לי: UP cannot be resolved to a variable

בכל אופן צירפתי גם את Robot שבניתי, ואני לא מצליח להבין איפה הבעיה שהוא לא מקבל את UP ואיך אני פותר את הבעיה עם הבנאי של הרובוט שהוא נותן עליו את השגיאה (אחרי שאני מתקן את ה-UP ל-0: נראה לא נקי...):

The local variable freshRobo is never read

המחלקה RobotsWorld:


import java.awt.*;

public class RobotsWorld {
private int n;
private 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[(int) p.getX()][(int) p.getY()]!=null))
{return false;}
else
{Robot freshRobo = new Robot(840 ,p ,UP);
return true;}
}

והמחלקה Robot:


import java.awt.*;
public class Robot {

private int roboId;
private Point location;
private int direction;
// Direction of the Robot
static final int UP=0;
static final int DOWN=1;
static final int RIGHT=2;
static final int LEFT=3;
// DX,DY: A single move of the Robot

public static final int DX=1;
public static final int DY=1;
public static final int NO_MOVEMENT=0;

public Robot (int id, Point location, int dir){

this.roboId = id; // initialize roboID

if ((location.getX() <0)||(location.getY()<0)) // initialize Point location
{this.location.setLocation(0,0);} // in case (x,y) negative coordinate, set (0,0).
else
{this.location.setLocation(location.getX(),location.getY());}

if (dir>3 || dir<0)
{System.out.println("Error in int dir value!");}
else
{this.direction = dir;} // initialize Direction

}//Robot constructor

public int getId(){ //returns robot ID#
return roboId;
}

public Point getLocation(){ //returns robot (x,y) location
return location;
}

public int getDir(){ //returns robot direction
return direction;
}

public void move(){
switch (direction) {

case RIGHT: location.translate(DX, NO_MOVEMENT); break;

case UP: location.translate(NO_MOVEMENT, -DY); break;

case LEFT: location.translate(-DX, NO_MOVEMENT); break;

case DOWN: location.translate(NO_MOVEMENT, DY); break;
}//switch
}//move()

public void turnLeft(){
if (direction == RIGHT || direction == LEFT) //in both cases we need to decrement 2
{direction-=2;}
else if (direction == UP)
{direction+=3;}
else {direction+=1;} // case DOWN
}

public void turnRight(){
if (direction == UP || direction == DOWN)
{direction+=2;}
if (direction == LEFT)
{direction-=3;}
else
{direction-=1;} // case RIGHT
}
}//class Robot

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

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

אתה פותח סוגריים מסולסלים באותה שורה וסוגר בשורה אחרי. אותו דבר ב- switch case.


if (some condition){
doSomething();
}


switch (i){
case 1 :{
doSomething();
break;
}
case 2 :{
doSomethingElse();
}
}

כל הקבועים צריכים להיות const ובאותיות גדולות.

מחלקה לא אמורה לטפל בשגיאות קלט. תשתמש ב-exceptions.

האם שם של (ID) אמור להתקבל כקלט או כמספר סידורי?

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

אתה פותח סוגריים מסולסלים באותה שורה וסוגר בשורה אחרי. אותו דבר ב- switch case

בחיי שהוא העתיק את זה לא תקין לפורום, בתנאי if אם התוצאה היא שורה אחת, אני עוטף את השורה כולה ב-{}.

כל הקבועים צריכים להיות const ובאותיות גדולות.

השתמשתי ב-final שהוא המקביל בג'אווה ל-const עבור משתנים פרמיטיביים עבור כיווני הרובוט, אבל עכשיו ניסיתי לפנות דרך המחלקה ל-UP ע"י Robot.UP וזה עבד, לדעתי עדיף להשאיר את זה לא public ע"מ שיודגש שזה UP שמגיע מהמח' Robot, זה לא פתר כמובן את הבעיה של השגיאה אבל לפחות זה מאפשר לי לתת לבנאי ערך שמי קריא יותר מאשר סתם מספר.

מחלקה לא אמורה לטפל בשגיאות קלט. תשתמש ב-exceptions.

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

האם שם של (ID) אמור להתקבל כקלט או כמספר סידורי?

הם מגדירים את זה כ"מס' שלם המזהה את הרובוט".

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

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

אם אתה נמצא במחלקה שלך, אתה יכול לקרוא ל-members של המחלקה ללא המילה this.

נהוג לכתוב שם של שדה עם התחילית '_' למשל:

private int _robotId;

לא הבנתי כ"כ איפה השגיאה שלך.

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

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

אם אתה נמצא במחלקה שלך, אתה יכול לקרוא ל-members של המחלקה ללא המילה this.

נהוג לכתוב שם של שדה עם התחילית '_' למשל:

private int _robotId;

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

לא הבנתי כ"כ איפה השגיאה שלך.

בקטע קוד הזה:

public boolean addRobot(Point p){
if ((p.getX()>=n)||(p.getY()>=n)||(roboArr[(int) p.getX()][(int) p.getY()]!=null))
{
return false;
}
else
{
Robot freshRobo = new Robot(840 ,p ,Robot.UP);
return true;
}
}

בשורה של הקריאה לבנאי, הוא נותן לי את השגיאה: The local variable freshRobo is never read.

קודם כל אני לא מבין מה הכוונה שלו, אבל באופן כללי יותר, נניח וזה כן היה מתקמפל והיה נוצר בנק' שנתקבלה, האם כל פעם שהיה נוצר באיזושהי נקודה בעולם, זה תקין שהוא ייקרא freshRobo, כלומר אותו השם לכולם? האם בשביל זה יש לו שדה עם זהות שיבדיל בין הרובוטים השונים שיווצרו ולכן דרשו שדה כזה ובאופן עקרוני לא צריכה להיות בעיה עם זה?

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

מה עשית כאן בעצם? יצרת ואז יצאת מה-scope של המתודה והרובוט נמחק. המתודה אמורה להכניס רובות חדש לעולם.

אתה צריך משהו כזה:

roboWorld[(int)p.getX()][(int)getY()] = new Robot(840,p,Robot.UP);

חוץ מזה, הבנאי של העולם שלך לא טוב. הוא אמור לאפס את העולם, כלומר את השדות. מי זה roboArr?

מה זה 840? אולי אתה רוצה לקבל כפרמטר את ה-ID וגם לודא שאין אחד כזה. אולי בכלל אתה צריך HashMap של רובוטים

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

roboArr זאת המטריצה שמייצגת את העולם, למה אני אמור לאפס אותה אם אני יוצא מנק' הנחה שבעת יצירת העולם (המטריצה) אין בה עצמים ?

ואם כן אז האיפוס זה לולאת for שנותנת null לכל אחד מהתאים ?

840 זה סתם מספר ID שנתתי לבנאי כדי שיוכל לבנות אובייקט מסוג Robot.

כרגע אין שגיאות קומפילציה והקוד נראה כך:


import java.awt.*;

public class RobotsWorld {
private int n;
private 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[(int) p.getX()][(int) p.getY()]!=null))
{
return false;
}
else
{
roboArr[(int)p.getX()][(int)p.getY()] = new Robot(840,p,Robot.UP);
return true;
}
}

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

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

ארכיון

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


×
  • צור חדש...