Classe angolo in Java

Il Java è un linguaggio molto gettonato tra i banchi di scuola per imparare i fondamenti delle programmazione ad oggetti. Vediamo un esempio introduttivo dove proviamo a realizzare una classe che gestisca gli angoli geometrici nel classico formato gradi, primi e secondi. A contorno, tutta una serie di metodi per utilizzare gli angoli con svariate operazioni.

 Si vuole gestire un oggetto di tipo angolo nel formato gradi ° primi' secondi" dove gradi è un numero compreso 0 <= g  <= 360, 0 <= p <= 60, 0 <= s <= 60. Si devono creare i metodi di accesso agli attributi individuati, un costruttore di default con le tre grandezze fondamentali individuate, un costruttore di copia. Implementare quindi i metodi visualizzaAngolo() che torna l'angolo in un formato testuale che visualizza le tre dimensioni; aggiungiGradi(n), aggiungiPrimi(n), aggiungiSecondi(n) che prendono come parametro un intero ed aumentano le rispettive grandezze, tenendo conto dei vincoli che impongono la normalizzazione e il riporto eccedente dei singoli primi e secondi. angoloSecondi() che ritorna l'angolo espresso interamente in secondi; secondiAngolo(n) che imposta il valore dell'angolo interamente attraverso i secondi totali passati; differenzaSecondi(a) e sommaAngolo(a) che fanno restituisce rispettivamente la differenza  con un'altra istanza di angolo in secondi, mentre la somma aggiunge all'angolo invocante il secondo angolo passato per parametro.

Procediamo con calma per passi. La prima cosa da fare è individuare gli attributi privati della classe. In questo caso, l'esempio è molto semplice quindi avremo solo tre elementi interi privati per distinguere gradi, primi e secondi. Creiamo quindi un file Angolo.Java in cui inseriamo la nostra classa Angolo. Mi raccomando, creiamo i file con gli stessi nomi in lettere minuscole/maiuscole delle classi che conterranno.

  private int gradi;
  private int primi;
  private int secondi;

 

A seguire, implementiamo tutti i metodi richiesti a cominciare dal costruttore e i metodi di accesso set/get. Sono quelli un po' più noiosi perché sono sempre parecchi a meno di non voler fare scelte progettuali particolari in cui non si mette a disposizione il set di alcuni attributi ritenuti immutabili by design. Non è una procedura standard, ma alcuni docenti o libri di testo potrebbero consigliare tale modalità. Qui li sviluppiamo tutti.

Particolare considerazione la diamo ai costruttori e costruttori di copia. Qui si possono fare molte scelte progettuali diverse. Decidiamo di passare da parametro tutti i valori senza fare particolari assegnazioni fisse. Idem per la copia, con il passaggio di un oggetto angolo già esistente.

  public Angolo(int g, int p, int s) 
  {
		this.gradi = g;
		this.primi = p;
		this.secondi = s;
  }


  public Angolo(Angolo a) 
  {
		this.gradi = a.getGradi();
		this.primi = a.getPrimi();
		this.secondi = a.getSecondi();
  }

Di seguito il listato completo

class Angolo
{

  private int gradi;
  private int primi;
  private int secondi;

  public Angolo(int g, int p, int s) 
  {
		this.gradi = g;
		this.primi = p;
		this.secondi = s;
  }

  public Angolo(Angolo a) 
  {
		this.gradi = a.getGradi();
		this.primi = a.getPrimi();
		this.secondi = a.getSecondi();
  }

	public int getGradi() 
  {
    return this.gradi;    
	}

	public int getPrimi() 
  {
    return this.primi;   
	}

	public int getSecondi() 
  {
    return this.secondi;   
	}  

	public void setGradi(int _g) 
  {
    this.gradi = _g;    
	}

	public void setPrimi(int _p) 
  {
    this.primi = _p;   
	}

	public void setSecondi(int _s) 
  {
    this.secondi = _s;   
	} 

  public String visualizzaAngolo()
  {
    String testo = this.gradi + "° " + this.primi + "\' "+ this.secondi + "\" "; return testo;   
  }

  public void aggiungiGradi(int n)
  {
    this.gradi = this.gradi + n;
    if (this.gradi > 360)
    {
      this.gradi = this.gradi % 360;
    }
  }

  public void aggiungiPrimi(int n)
  {
    this.primi = this.primi + n;
    if (this.primi > 60)
    {
      this.primi = this.primi % 60;
      this.aggiungiGradi(this.primi / 60);
    }
  }  

  public void aggiungiSecondi(int n)
  {
    this.secondi = this.secondi + n;
    if (this.secondi > 60)
    {
      this.secondi = this.secondi % 60;
      this.aggiungiPrimi(this.secondi / 60);
    }
  }  

  public int angoloSecondi()
  {
    int sec = this.secondi + this.gradi*60;
    return sec;
  }

  public void secondiAngolo(int n)
  {
    this.secondi =  0;
    this.aggiungiSecondi(n);
  }

  public int differenzaSecondi(Angolo a)
  {
    int sec = 0;

    sec = this.angoloSecondi() + a.angoloSecondi(); 
    return sec;
  }

  public void sommaAngolo(Angolo a)
  {
    this.secondi = this.secondi + a.getSecondi();
    if (this.secondi % 60 != 0)
    {
      this.primi = this.primi + (this.secondi / 60);
      this.secondi = this.secondi % 60;
    }
    
    this.primi = this.primi + a.getPrimi();
    if (this.primi % 60 != 0)
    {
      this.gradi = this.gradi + (this.secondi / 60);
      this.primi = this.primi % 60;
    }

    this.gradi = this.gradi + a.getGradi();
    if (this.gradi > 360)
    {
      this.gradi = this.gradi % 360;
    }

  }
}

E' giunto il momento di testare la nostra classe. Creiamo un altro file Main.java col seguente codice.

class Main {
  public static void main(String[] args) {

    Angolo test = new Angolo(23,56,23);
    
    System.out.println(test.visualizzaAngolo());
    
    test.aggiungiGradi(30);
    System.out.println(test.getGradi());

    test.aggiungiGradi(320);
    System.out.println(test.getGradi());    
  }
}