עבור לתוכן

Java - עזרתכם בבאג קטן ומעצבן שאני מפספס

Featured Replies

פורסם

יש לי 2 מקטעים, כל מקטע מורכב מ-2 נק' (אחת שמאלית ואחת ימנית) ולכל נק' יש כמובן קורדינטת X וקורדינטת Y, שניים מהמתודות שעלי לכתוב הם:

boolean isAbove (Segment1 other) 1 - שיטה שמקבלת מקטע כפרמטר ומחזירה האם המקטע שעליו הופעלה השיטה נמצא מעל למקטע שהתקבל כפרמטר.

boolean isUnder (Segment1 other) 2 - שיטה שמקבלת מקטע כפרמטר ומחזירה האם המקטע שעליו הופעלה השיטה נמצא מתחת למקטע שהתקבל כפרמטר. השיטה הזו משתמשת אך ורק בשיטה isAbove שהוגדרה לעיל.

ה-Class שלי מורכב מ:


public class Segment1
{
private Point _poLeft;
private Point _poRight;
}

לפני זה הייתי אמור לכתוב Class Point שגם שם הייתי צריך לממש מתודת isAbove ומתודת isUnder (המתודות האלו מקבלות נק' כפרמטר) וזה מה שכתבתי:


public boolean isAbove(Point other)
{
if (this._y > other._y)
{
return true;
}
else
{
return false;
}
}


public boolean isUnder(Point other)
{
return !(this.isAbove(other));
}

עכשיו מה שקורה זה שב-Class Segment אני משתמש במתודות שהגדרתי ב-Class Point וזה מה שרשמתי:


public boolean isAbove(Segment1 other)
{
if (this._poLeft.getY() > other._poLeft.getY())
{
return true;
}
else
{
return false;
}
}


public boolean isUnder (Segment1 other)
{
return !(isAbove(other));
}

עכשיו הבעיה שלי היא שבמקרה ויש לי 2 מקטעים שזהים מבחינת הגובה (אותו Y) אני עדיין מקבל True ולא False:


Segment1 s1 = new Segment1(5, 4, 12, 4);
Segment1 s2 = new Segment1(1, 4, 6, 4);
System.out.println(s1.isUnder(s2));

פורסם

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

פורסם
  • מחבר

קטן ושווה אבל ב-Class Point רשמתי שרק אם הוא גדול הוא יחזיר נכון

פורסם

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

המתודה isAbove תחזיר לך FALSE - שזה נכון. אבל, אתה הגדרת את המתודה isUnder להחזיר את ההפך מ isAbove. במקרה שלנו, המתודה תחזיר TRUE - לא נכון. מה הבעיה? כמו שכתבתי, המתודה isUnder לא בודקת האם הקטע האחר נמצא מתחת לקטע הנוכחי, אלא בודקת האם הוא אינו מעליו.

מה פירוש אינו מעליו? בדיוק כמו שכבר ענית בעצמך בהודעה הקודמת - מתחת או באותו גובה.

פורסם
  • מחבר

רגע אתה מדבר על זה שהבעיה שלי היא ב-Class Point או ב-Segment ?

פורסם

כרגע, בשניהם.

פורסם
  • מחבר

שיניתי את מתודת ה-is Above (ב-Class point):


public boolean isAbove(Point other)
{
return (this._y > other._y);
}

אבל עדיין יש לי בעיה עם המתודת isUnder ואני לא ממש מצליח, אשמח לעזרה.

פורסם

הבעיה היא לא במתודה isAbove, אלא במתודה isUnder.

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

במקרה כזה, שים לב שעדיין תוכל לקבל עבור קטעים באותו גובה גם FALSE מ isAbove וגם FALSE מ isUnder.

פורסם
  • מחבר

בסופו של דבר עשיתי משהו כזה:


public boolean isAbove(Point other)
{
return (this._y > other.getY());
}


public boolean isUnder(Point other)
{
return (this._y != other.getY()) && !isAbove(other);
}

פורסם

:facepalm:

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

פורסם

וגם, אין צורך להשתמש במילה this.

ארכיון

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

דיונים חדשים