עבור לתוכן
View in the app

A better way to browse. Learn more.

HWzone

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

בעיה פשוטה - JAVA

Featured Replies

פורסם
  • מחבר

אני לא כ"כ הבנתי.. הבנאי של הרובוטים כבר מקבל את ה-ID כפרמטר בעת יצירתו.

  • תגובות 58
  • צפיות 5.4k
  • נוצר
  • תגובה אחרונה
פורסם

האינדנטציה קצת השתבשה אבל תראה את זה:


public class RobotsWorld{

private int _n;
private Robot[][] _roboArr;
private int _id;


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


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(_id,p,Robot.UP);
_id++;
return true;
}
}

}

פורסם
  • מחבר

הבנתי אותך...

אבל לא צריך להגדיר את _id שהוא כמו סוג של מונה כ-static ע"מ שערכו יישמר ?

פורסם

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

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

פורסם

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

זה לא נחוץ ב-case, כי ה-case וה-break כבר עוטפים את הבלוק. ב-if/for/while זה כן נחוץ.

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

זה נוהג שנשאר מ-++C. בג'אווה הוא לא נחוץ וכבר לא כל כך נהוג.

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

מה הבעיה כאן? כשיוצרים מטריצה בג'אווה היא מאופסת, כלומר מכילה רק null (בניגוד ל-++C/C).

פורסם
  • מחבר

זאת אומרת שבמצב הנוכחי של התוכנית כפי שהיא כך, המייצר ID שלי שומר על ערכו בכל קריאה למתודה?


import java.awt.*;

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

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

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(autoIdMaker,p,Robot.UP);
autoIdMaker++;
return true;
}
}

כשיוצרים מטריצה בג'אווה היא מאופסת, כלומר מכילה רק null.

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

פורסם

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

כן.

פורסם

זה לא נחוץ ב-case, כי ה-case וה-break כבר עוטפים את הבלוק. ב-if/for/while זה כן נחוץ.

זה לא נחוץ גם בפקודה אחת אחרי if אבל זה מקל על הקריאה.

מה הבעיה כאן? כשיוצרים מטריצה בג'אווה היא מאופסת, כלומר מכילה רק null (בניגוד ל-++C/C).

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

פורסם
  • מחבר

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

אחרת אם המיקום מחוץ לגבולות העולם או שלא קיים בתא רובוט, מחזירים null.

כתבתי בנתיים את (את שיטות העזר כתבתי כבר כדי לפשט הקריאות):


public Robot getRobot(Point p){
if ( (!inBoundary(p)) ||(anEmptyCell(p)) )
{
return null;
}
else
{

}
}

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

תודה.

פורסם

return roboArr[(int)p.getX()][(int)p.getY()];

ולכן אין לך צורך לוודא שקיים רובוט בתא. אם לא קיים גם ככה יוחזר null.

פורסם
  • מחבר

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

פורסם
  • מחבר

נניח הייתי בונה מח' בשם AdvancedRobot אז זה גם ככה לא משנה כי אני הרי לא יכול לערבב נניח AdvancedRobot ו-Robot באותה מטריצה גם ככה...

ניסיתי לבנות שיטה שהחתימה שלה:

public boolean moveRobot(Point p)

השיטה מזיזה את הרובוט בנק' שנתקבלה ולאחר מכן מחזירה true, באם אין רובוט (בסרט הזה כבר היינו) היא מחזירה false.

השיטה כבר כתובה במח' Robot, אבל אין לי מושג איך אני ניגש אליה ותכלס כותב את השורה שתפעיל אותה..

ניסיתי:


public boolean moveRobot(Point p){
roboArr[(int)p.getX()][(int)p.getY()].Robot.move();

}

אבל הוא לא נותן לי לקמפל כי הוא אומר: Robot cannot be resolved or is not a field

למה זה לא הולך ?

תודה.

פורסם

נניח הייתי בונה מח' בשם AdvancedRobot אז זה גם ככה לא משנה כי אני הרי לא יכול לערבב נניח AdvancedRobot ו-Robot באותה

אתה יכול ע"י שימוש במנגנון הירושה.

אם AdvancedRobot extends Robot.

למה זה לא הולך ?

חשוב שתנסה לקרוא מה השגיאה מנסה לומר לך.

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

פורסם
  • מחבר

אם AdvancedRobot extends Robot.

כלומר אם אני יוצר מטריצה ב-AdvancedRobot אני אוכל להכניס לה אובייקטים מסוג Robot ללא (או עם) casting ?

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

אבל אני סה"כ רוצה להפעיל את move של Robot על אחד התאים (כלומר על רובוט) כלומר להפעיל שיטה מהמחלקה של רובוט על אובייקט מסוג רובוט שנמצא בתא... למה הוא לא מאפשר את זה ?

ארכיון

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

דיונים חדשים

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.