Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [JAVA] - Realizzazione nuova classe con 4 costruttori

    Ciao a tutta la community!!
    Mi scuso per il titolo un pò generico, ma non sono riuscito a trovarne un altro.
    Ritorno a rompervi le scatole con questo nuovo quesito.
    Allora...ecco cosa mi viene chiesto
    Una retta giacente in un piano può essere specificata in diversi modi:
    • mediante un punto (x, y) e una pendenza m
    • mediante due punti (x1, y1), (x2, y2)
    • mediante un’equazione nella forma y = mx + b
    • mediante un’equazione nella forma x = a, se la retta è verticale

    Realizzate una classe Line dotata di quattro costruttori, corrispondenti ai quattro casi menzionati, e realizzate i metodi:
    boolean intersects(Line other)
    boolean equals(Line other)
    boolean isParallel(Line other)
    Ed ecco la classe da me creata
    codice:
    public class Line 
    {
    	// Constructors
    	public Line (double x, double y, double m)
    	{
    		initPointX = x;    // coordinata x del punto iniziale
    		initPointY = y;   // coordinata y del punto iniziale
    		slope = m;        // slope è il coeffiente angolare
    	}
    	
    	public Line (double x1, double y1, double x2, double y2)
    	{
    		initPointX = x1;              // coordinata x del punto iniziale
    		initPointY = y1;             // coordinata y del punto iniziale
    		double endPointX = x2;  // coordinata x del punto finale
    		double endPointY = y2;  // coordinata y del punto finale
    		slope = (endPointY - initPointY) / (endPointX -initPointX);
                    // forumula per calcolare il coefficiente angolare
    	}
    	
    	public Line (String equation)
    	{
    		String sSlope = equation.substring(2, 3);
    		slope = Double.parseDouble(sSlope);/* Ricavo la sottostringa m dalla stringa
                     equation e la trasformo in double, assegnando il valore alla variabile slope*/
    		String sIntercept = equation.substring(5);
    		initPointX = 0;
    		initPointY = Double.parseDouble(sIntercept);/* Faccio lo stesso per ricavare la
                                b; le coordinate del punto iniziale della retta sarranno (0, b)*/
    	}
    	
    	public Line (double a)
    	{
    		initPointX = a;  // coordinata x del punto iniziale
    		initPointY = 0;  // coordinata y del punto iniziale (la retta è verticale)
    		slope = Double.MAX_VALUE; /* il coefficiente angolare di una retta verticale 
                                                           è infinito */
    	}
    	
    	// Methods
    	public boolean isParallel(Line other)
    	{
    		return(this.slope == other.slope); /* due rette parallele hanno lo stesso
                                                                     coefficiente angolare*/
    	}
    	
    	public boolean isEqual(Line other)
    	{
    		int equal = 0;
    		if (this.slope == other.slope && this.initPointX == other.initPointX && this.initPointY == other.initPointY)
    			equal = 1;
    		
    		return (equal == 1);
             /* Due rette sono uguali se hanno lo stesso coefficiente angolare e un punto in
              comune; in questo caso il punto in comune è il punto iniziale */
    	}
    	
    	public boolean intersects(Line other)
    	{
    		return (!this.isEqual(other) && !this.isParallel(other));
              // Due rette si incontrano se non sono uguali e non sono parallele
    	}
    	
    	// Instance Fields
    	private double initPointX, initPointY;
    	private double slope;
    		
    }

    Allora ho parecchie perplessità; la prima, la più grande, riguarda il terzo costruttore. Mi dice di creare un costruttore che crei una linea mediante l'inserimento di una stringa y=mx+b. Tuttavia il problema è che, dando come input una stringa, non posso ricavarmi facilmente il punto iniziale e il coefficiente angolare. Potrei ricavarmele, come ho fatto, tramite un metodo substring; tuttavia la lunghezza della stringa non sarà sempre uguale, magari può esserci uno spazio dopo ogni segno + o = o cose del genere.
    Come potrei risolvere? Togliendo di mezzo la stringa e leggendo invece solo m e b come valori double, come ho poi fatto nel quarto costruttore? Penso sia molto meglio come soluzione; tuttavia volevo capire se c'era qualche altro metodo.

    Altro problema è confrontare nei metodi predicativi di tipo boolean la linea costurita con una nuova linea da costruire (chiamata other).
    Va bene, per esempio, mettere a confronto i coefficienti angolari delle due linee in questo modo: (this.slope == other.slope) ? O è completamente sbagliato?

    Attendo pazientemente vostre news

    Grazie a tutti per le risposte!!

    gl

  2. #2

    Re: [JAVA] - Realizzazione nuova classe con 4 costruttori

    Originariamente inviato da tigerjack89
    Mi dice di creare un costruttore che crei una linea mediante l'inserimento di una stringa y=mx+b. Tuttavia il problema è che, dando come input una stringa, non posso ricavarmi facilmente il punto iniziale e il coefficiente angolare. Potrei ricavarmele, come ho fatto, tramite un metodo substring; tuttavia la lunghezza della stringa non sarà sempre uguale, magari può esserci uno spazio dopo ogni segno + o = o cose del genere.
    Come potrei risolvere? Togliendo di mezzo la stringa e leggendo invece solo m e b come valori double, come ho poi fatto nel quarto costruttore? Penso sia molto meglio come soluzione; tuttavia volevo capire se c'era qualche altro metodo.
    Puoi risolvere astraendo un po'. Ad esempio ti crei una classe Espressione, che dunque è costituita da operandi ed operatori.
    Originariamente inviato da tigerjack89
    Va bene, per esempio, mettere a confronto i coefficienti angolari delle due linee in questo modo: (this.slope == other.slope) ? O è completamente sbagliato?
    Va bene, in quanto lo fai all'interno della classe stessa.

  3. #3
    Allora ragazzi penso di aver trovato risposta a tutti e due i quesiti.
    Per il primo...ovviamente il metodo proposto dell'inserimento diretto dei numeri è molto più efficace. Se volessi leggere da stringa, invece, dovrei prima usare un metodo replace per sostituire " " con "", poi calcolare la lunghezza della stringa e infine ricavarmi in questo modo i valori di m e b. Giusto??

    Per il secondo...il programma sembra funzionare, quindi dovrebbe essere ok!!

    Tra poco posterò il programma completo.
    Ovviamente sono accetti consigli e suggerimeni per migliorare il programma.

    ty to all

  4. #4

    Re: Re: [JAVA] - Realizzazione nuova classe con 4 costruttori

    Originariamente inviato da VincenzoTheBest
    Puoi risolvere astraendo un po'. Ad esempio ti crei una classe Espressione, che dunque è costituita da operandi ed operatori.

    Va bene, in quanto lo fai all'interno della classe stessa.
    Ty, solo ora ho letto il tuo post!!
    Si ovviamente sarebbe un altro metodo efficace crearmi un'altra classe espressione; tuttavia in questo caso penso sia un di più e che per adesso vada bene inserire solo i numeri.

    Ecco la classe da me proposta, insieme al programma vero e proprio.
    codice:
    public class Line 
    {
    	// Constructors
    	public Line (double x, double y, double m)
    	{
    		initPointX = x;
    		initPointY = y;
    		slope = m;
    	}
    	
    	public Line (double x1, double y1, double x2, double y2)
    	{
    		initPointX = x1;
    		initPointY = y1;
    		double endPointX = x2;
    		double endPointY = y2;
    		slope = (endPointY - initPointY) / (endPointX - initPointX);
    	}
    	
    	public Line (double m, double a)
    	{
    		slope = m;
    		initPointX = 0;
    		initPointY = a;
    	}
    	
    	public Line (double a)
    	{
    		initPointX = a;
    		initPointY = 0;
    		slope = Double.MAX_VALUE;
    	}
    	
    	// Methods
    	public boolean isParallel(Line other)
    	{
    		return(this.slope == other.slope);
    	}
    	
    	public boolean isEqual(Line other)
    	{
    		int equal = 0;
    		if (this.slope == other.slope && this.initPointX == other.initPointX && this.initPointY == other.initPointY)
    			equal = 1;
    		
    		return (equal == 1);
    	}
    	
    	public boolean intersects(Line other)
    	{
    		return (!this.isEqual(other) && !this.isParallel(other));
    	}
    	
    	// Instance Fields
    	private double initPointX, initPointY;
    	private double slope;
    		
    }
    
    
    
    
    //Programma
    
    import javax.swing.JOptionPane;
    
    public class LineRunner 
    {
    	public static void main(String[] args)
    	{
    		JOptionPane pane = new JOptionPane();
    		String sChoice = pane.showInputDialog("In che modo vuoi costruire la linea:\n1.Coordinate punto e pendenza;\n2.Coordinate due punti;\n"
    				+ "3.Equazione del tipo y=mx+b, inserendo m e b;\n4.Equazione del tipo x=a, inserendo a (retta verticale)");
    		
    		double initPointX, initPointY, endPointX, endPointY, slope, intercept;
    		Line line = null;
    		
    		if(sChoice.equals("1"))
    		{
    			String sX1 = pane.showInputDialog("Inserisci coordinata x del punto iniziale: ");
    			String sY1 = pane.showInputDialog("Inserisci coordinata y del punto iniziale: ");
    			String sM = pane.showInputDialog("Inserisci coefficiente angolare m della retta: ");
    			initPointX = Double.parseDouble(sX1);
    			initPointY = Double.parseDouble(sY1);
    			slope = Double.parseDouble(sM);
    			line = new Line (initPointX, initPointY, slope);				
    		}
    		
    		else if(sChoice.equals("2"))
    		{
    			String sX1 = pane.showInputDialog("Inserisci coordinata x del punto iniziale: ");
    			String sY1 = pane.showInputDialog("Inserisci coordinata y del punto iniziale: ");
    			String sX2 = pane.showInputDialog("Inserisci coordinata x del punto finale: ");
    			String sY2 = pane.showInputDialog("Inserisci coordinata y del punto finale: ");
    			initPointX = Double.parseDouble(sX1);
    			initPointY = Double.parseDouble(sY1);
    			endPointX = Double.parseDouble(sX2);
    			endPointY = Double.parseDouble(sY2);
    			line = new Line (initPointX, initPointY, endPointX, endPointY);
    		}
    		
    		else if(sChoice.equals("3"))
    		{
    			String sM = pane.showInputDialog("Inserisci coefficiente angolare m: ");
    			String sB = pane.showInputDialog("Inserisci l'intercetta b: ");
    			slope = Double.parseDouble(sM);
    			intercept = Double.parseDouble(sB);
    			line = new Line (slope, intercept);
    		}
    		
    		else if(sChoice.equals("4"))
    		{
    			String sA = pane.showInputDialog("Inserisci intercetta a (retta verticale): ");
    			intercept = Double.parseDouble(sA);
    			line = new Line (intercept);
    		}
    		
    		else
    			pane.showMessageDialog(null, "Unvalid entry");
    		
    		pane.showMessageDialog(null, "Costruisci la seconda linea");
    		Line line2 = null;
    		
    		JOptionPane pane2 = new JOptionPane();
    		String sChoice2 = pane.showInputDialog("In che modo vuoi costruire la seconda linea:\n1.Coordinate punto e pendenza;\n2.Coordinate due punti;\n"
    				+ "3.Equazione del tipo y=mx+b, inserendo m e b;\n4.Equazione del tipo x=a, inserendo a (retta verticale)");
    		
    	if(sChoice2.equals("1"))
    	{
    		String sX1 = pane.showInputDialog("Inserisci coordinata x del punto iniziale: ");
    		String sY1 = pane.showInputDialog("Inserisci coordinata y del punto iniziale: ");
    		String sM = pane.showInputDialog("Inserisci coefficiente angolare m della retta: ");
    		initPointX = Double.parseDouble(sX1);
    		initPointY = Double.parseDouble(sY1);
    		slope = Double.parseDouble(sM);
    		line2 = new Line (initPointX, initPointY, slope);				
    	}
    	
    	else if(sChoice2.equals("2"))
    	{
    		String sX1 = pane.showInputDialog("Inserisci coordinata x del punto iniziale: ");
    		String sY1 = pane.showInputDialog("Inserisci coordinata y del punto iniziale: ");
    		String sX2 = pane.showInputDialog("Inserisci coordinata x del punto finale: ");
    		String sY2 = pane.showInputDialog("Inserisci coordinata y del punto finale: ");
    		initPointX = Double.parseDouble(sX1);
    		initPointY = Double.parseDouble(sY1);
    		endPointX = Double.parseDouble(sX2);
    		endPointY = Double.parseDouble(sY2);
    		line2 = new Line (initPointX, initPointY, endPointX, endPointY);	
    	}
    	
    	else if(sChoice2.equals("3"))
    	{
    		String sM = pane.showInputDialog("Inserisci coefficiente angolare m: ");
    		String sB = pane.showInputDialog("Inserisci l'intercetta b: ");
    		slope = Double.parseDouble(sM);
    		intercept = Double.parseDouble(sB);
    		line2 = new Line (slope, intercept);
    	}
    	
    	else if(sChoice2.equals("4"))
    	{
    		String sA = pane.showInputDialog("Inserisci intercetta a (retta verticale): ");
    		intercept = Double.parseDouble(sA);
    		line2 = new Line (intercept);
    	}
    	
    	else
    		pane.showMessageDialog(null, "Unvalid entry");
    	
    	if(line.intersects(line2))
    		pane.showMessageDialog(null, "Le rette sono secanti");
    	else if(line.isEqual(line2))
    		pane.showMessageDialog(null, "Le rette sono uguali");
    	else if(line.isParallel(line2))
    		pane.showMessageDialog(null, "Le rette sono parallele");
    	
    	System.exit(0);
    		
    	}
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.