עזרה ב4 שאלות ספציפיות בגאווה . - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

עזרה ב4 שאלות ספציפיות בגאווה .


Dror Arasheven

Recommended Posts

עד עכשיו יצרתי שני מחלקות . 1 היורשת את הנתונים מהאב . 

import java.awt.Color;
import java.awt.Point;

public abstract class MyShape implements Cloneable{
	public static void claerscreen () {
		System.out.print ("\u000c");
	}
	protected Point P1;
	protected Point P2;
	protected Color paint;
	
	public  MyShape(Point P1, Point P2, Color paint){
		super();
		this.P1=P1;
		this.P2=P2;
		this.paint=paint;	
	}
	public  MyShape(MyShape p){
		this.P1=p.P1;
		this.P2=p.P2;
		this.paint=p.paint;	
	}
	public Point getP1(){
		return P1;
	}
	public Point getP2(){
		return P2;
	}
	public Color getPaint(){
		return paint;
	}
	
	public void setP1(Point P1){
		this.P1=P1;
	}
	public void setP2( Point P2){
		this.P2=P2;
	}
	public void setPaint( Color paint){
		this.paint=paint;
	}
	public MyShape(){
		super();
		this.P1=new Point(0,0);
		this.P2=new Point(0,0);
		this.paint=Color.BLACK;
	}	
}

והשני

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;

public class MyLine extends MyShape{

	public MyLine(Point P1, Point P2, Color paint) {
		super( P1, P2, paint);
		
	}
	public boolean equals(MyLine x,MyLine y){
		double line1x=(double) (x.getP1().getX()-x.getP2().getX());
		double line1y=(double) (x.getP1().getY()-x.getP2().getY());
		double line2x=(double) (y.getP1().getX()-y.getP2().getX());
		double line2y=(double) (y.getP1().getY()-y.getP2().getY());
		double d1=Math.sqrt(Math.pow(line1x,2)+Math.pow(line1y,2));
		double d2=Math.sqrt(Math.pow(line2x,2)+Math.pow(line2y,2));
		if (d1==d2)
			return true;
		else return false;
	}
	
	public void draw (Graphics g){
		int x1 =(int) P1.getX();
		int y1 =(int) P1.getY();
		int x2=(int) P2.getX();
		int y2=(int) P2.getY();
		g.drawLine (x1, y1, x2, y2);
		g.setColor(getPaint());
	}

}

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

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

א. מחלקה שמממשת את Cloneable צריכה לדרוס את הפונקציה clone, והפונקציה אמורה ליצור מופע חדש של האובייקט שזהה למופע הקיים (מה זה "זהה" הוא כבר החלטה שלך). הדרך הנוחה היא ע"י קריאה לבנאי המתאים (כבר יש לך בנאי כזה).

 

ב. המימוש של equals נראה בסדר, חוץ מכמה דברים קטנים:

1. אל תקרא לפונקציה equals, כי השם הזה שמור לפונקציות שבודקות אם שני אובייקטים הם זהים. תן שם יותר אינפורמטיבי (לדוגמה isEqualLength).

2. מיותר להשתמש ב-Math.pow בשביל להעלות מספר בריבוע. הרבה יותר פשוט, יעיל ומדויק להכפיל את המספר בעצמו.

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

if (d1 == d2)

לעשות משהו כזה:

if (Math.abs(d1-d2) < 0.00001)

4. שים לב לשכפול קוד שאתה עושה כאן. הקוד שמחשב את d1 והקוד שמחשב את d2 הוא אותו קוד בדיוק שאתה מפעיל על שני אובייקטים שונים. תחשוב איך לייעל את זה.

 

ג. לא הבנתי את השאלה.

 

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

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

תודה לתשובה

ל-א אפשר לקבל קישור לדוגמא זה יעזור .

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

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

ל-ד השאלה שלי היא אם הבנאי שרשמתי עם הSUPER יורש את כול הבנאים או שאני צריך ליצור גם להם בנאים ..... וכנ"ל אם אני צריך ליצור שינוי......

 

 

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

א. חיפוש זריז של java clone example בגוגל יניב לך תוצאות. תיקון קטן למה שאמרתי קודם - הדרך הנוחה היא ע"י הפעלת הפונקציה .clone.

 

ב. כאמור, החישוב שלך נכון.

 

ג. עדיין לא הבנתי מה הדרישה. אתה צריך לפרט יותר.

 

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

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

עשיתי כמה שינויים 

import java.awt.Color;
import java.awt.Point;

public abstract class MyShape implements Cloneable{
	public static void claerscreen () {
		System.out.print ("\u000c");
	}
	protected Point P1;
	protected Point P2;
	protected Color paint;
	
	public  MyShape(Point P1, Point P2, Color paint){
		super();
		this.P1=P1;
		this.P2=P2;
		this.paint=paint;	
	}
	public  MyShape(MyShape p){
		this.P1=p.P1;
		this.P2=p.P2;
		this.paint=p.paint;	
	}
	public Point getP1(){
		return P1;
	}
	public Point getP2(){
		return P2;
	}
	public Color getPaint(){
		return paint;
	}
	
	public void setP1(Point P1){
		this.P1=P1;
	}
	public void setP2( Point P2){
		this.P2=P2;
	}
	public void setPaint( Color paint){
		this.paint=paint;
	}
	public MyShape(){
		this.P1=new Point(0,0);
		this.P2=new Point(0,0);
		this.paint=Color.BLACK;
	}	
	 protected Object clone() throws CloneNotSupportedException {
	        return super.clone();
	}
}

והשני

public class MyLine extends MyShape{
	public static void claerscreen () {
		System.out.print ("\u000c");
	}

	public MyLine(Point P1, Point P2, Color paint) {
		super( P1, P2, paint);
		
	}
	
	public boolean equals(Object other){
		double x1 = this.getP1().getX()-this.getP2().getX();
		double x2 = ((MyShape) other).getP1().getX()-((MyShape) other).getP2().getX();
		double y1 = this.getP1().getY()-this.getP2().getY();
		double y2 = ((MyShape) other).getP1().getY()-((MyShape) other).getP2().getY();
		double d1=Math.sqrt(x1*x1+y1*y1);
		double d2=Math.sqrt(x2*x2+y2*y2);
		if (Math.abs(d1-d2) < 0.00001)
			return true;
		else return false;
	}
	
	public void draw (Graphics g){
		Point x=getP1();
		Point y=getP2();
		g.drawLine ((int)x.getX(),(int)x.getY(), (int)y.getX(),(int)y.getY());
		g.setColor(getPaint());
	}

}

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

1 ) האם אני צריך להעביר גם את הבנאים GET וSET ל'בן'?

2 ) במחלקה הראשית נראה לי שיש מחלקה מיותרת בגלל שיצרתי את המחלקה CLONE . אין אם זה בעיות ?

3 ) במחלקה EQUALS אני מקבל דרישה להצהיר על DOUBLE דבר הגורם במחלקה לדרישה להצהיר INT . להשאיר את זה כך ? ובנוסף הוא דורש למפנות לאב .... דבר כזה לא יצור לי בעיות הרצה אחר כך ?

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

1. get ו-set הם לא בנאים. הם מתודות, ומתודות עוברות בירושה (אלא אם הן private כמובן).

2. אתה מבלבל בין מונחים. מחלקה זה class. מה שאתה מדבר עליו נקרא מתודה או שיטה (method). לא הבנתי מה מיותר פה.

3. לא הבנתי את השאלה. איפה אתה נדרש להצהיר על int? מה זה אומר "למפנות לאב"? אגב, שים לב שאתה המרה של other ל-MyShape בלי לבדוק שזה אפשרי. אתה צריך לבדוק בתחילת הפונקציה שבכלל אפשר לבצע את ההמרה הזו (ע"י שימוש ב-instanceof).

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

import java.awt.Color;
import java.awt.Point;

public abstract class MyShape implements Cloneable{
	public static void claerscreen () {
		System.out.print ("\u000c");
	}
	protected Point P1;
	protected Point P2;
	protected Color paint;
	
	public  MyShape(Point P1, Point P2, Color paint){
		this.P1=P1;
		this.P2=P2;
		this.paint=paint;	
	}
	public  MyShape(MyShape p){
		this.P1=p.P1;
		this.P2=p.P2;
		this.paint=p.paint;	
	}
	public Point getP1(){
		return P1;
	}
	public Point getP2(){
		return P2;
	}
	public Color getPaint(){
		return paint;
	}
	
	public void setP1(Point P1){
		this.P1=P1;
	}
	public void setP2( Point P2){
		this.P2=P2;
	}
	public void setPaint( Color paint){
		this.paint=paint;
	}
	public MyShape(){
		this.P1=new Point(0,0);
		this.P2=new Point(0,0);
		this.paint=Color.BLACK;
	}	
	 protected Object clone() throws CloneNotSupportedException {
	        return super.clone();
	}
}
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;

public class MyLine extends MyShape{
	public static void claerscreen () {
		System.out.print ("\u000c");
	}

	public MyLine(Point P1, Point P2, Color paint) {
		super( P1, P2, paint);
		
	}
	public MyLine() {
		this.P1=new Point(0,0);
		this.P2=new Point(0,0);
		this.paint=Color.BLACK;
	}
	
	public boolean equals(MyLine other){
		double x1 = this.getP1().getX()-this.getP2().getX();
		double x2 = other.getP1().getX()-other.getP2().getX();
		double y1 = this.getP1().getY()-this.getP2().getY();
		double y2 = other.getP1().getY()-other.getP2().getY();
		double d1=Math.sqrt(x1*x1+y1*y1);
		double d2=Math.sqrt(x2*x2+y2*y2);
		if (Math.abs(d1-d2) < 0.00001)
			return true;
		else return false;
	}
	
	public void draw (Graphics g){
		Point x=getP1();
		Point y=getP2();
		g.drawLine ((int)x.getX(),(int)x.getY(), (int)y.getX(),(int)y.getY());
		g.setColor(getPaint());
	}

}

תיקנתי את המתודה equal.

יצרתי מחלקה 3 שיורשת גם היא מMyShape אני צריך לוודא שמה שנכנס ל P1 יהיה קטן או שווה לP2 . אין לי רעיונות ... יש לי בעיה נוספת . אני לא יכול להוסיף את המתודה equal כמו שעשיתי ב MyLine כאן . הוא מודיע לי שאייני יכול להחזיר את המונחים true/false וזה עושה לי גם בעיה עם ההגדרה של סוג המתודה .

import java.awt.Color;
import java.awt.Point;

public abstract class MyBoundedShape extends MyShape{
	public static void claerscreen () {
		System.out.print ("\u000c");
	}
	
	protected boolean filled;
	public MyBoundedShape (Point P1, Point P2, Color paint,boolean filled) {
	super( P1, P2, paint);
	 setFilled( isFilled() );
	 if (P2.getX()<P1.getX()||P2.getY()<P1.getY()){
		 throw new IllegalArgumentException("\nThe starting point must be less than point of graduation");
	 }
	}
	public int getMinX()
    {
        return (int) Math.min(getP1().getX(), getP2().getX());
    }
    public int getMinY()
    {
        return (int) Math.min(getP1().getY(), getP2().getY());
    }
    public int getWidth()
    {
        return (int) Math.abs(getP1().getX() - getP2().getX());
    }
    public int getHeight()
    {
        return (int) Math.abs(getP1().getY() - getP2().getY());
    }

	public MyBoundedShape () {
		this.P1=new Point(0,0);
		this.P2=new Point(0,0);
		this.paint=Color.BLACK;
		this.filled=false;
	}
	
	public void setFilled( boolean isFilled ){
	filled = isFilled;
	}
	
    public boolean isFilled(){
	return filled;
    }
   

 

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

משום מה נפתר לי ..... איך אני לא יודע .... יש לך רעיון איך אני מוודא שP1 יהיה תמיד קטן שווה לP2 ? אני צריך שהראשון יהיה נקודת התחלה והשני נקודת סיום בציור עיגול/מלבן . ....

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

זה תלוי איך אתה מגדיר "קטן". הם הרי נקודות ויש להם גם ערך x וגם ערך y, אז אתה צריך להחליט מה ההגדרה שלך לקטן (ספציפית, מה קורה אם ערך ה-x של נקודה אחת גדולה משל השנייה, אבל ערך ה-y שלה קטן יותר).

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

ארכיון

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

×
  • צור חדש...