Sei sulla pagina 1di 12

Esempio di programma in Java

Esempio di programma in Java


Traccia del problema (da un esame di Fondamenti di Informatica in C++ procedurale)

Si realizzi un programma che sia in grado di gestire la classifica di un evento sportivo. A tale evento sportivo partecipano 4 squadre, ognuna caratterizzata da un nome (al pi di 10 lettere) e un punteggio intero. In input, il programma deve chiedere allutente i nomi e i punteggi delle 4 squadre. Il programma deve essere in grado di. - ordinare la classifica in ordine decrescente di punteggio; - stampare a video la classifica ordinata. Inoltre, il programma deve chiedere in input allutente se vi sono squadre il cui punteggio cambiato. In questo caso, lutente deve fornire il nome della squadra il cui punteggio cambiato e il valore della variazione di punteggio. Dopo aver acquisito tali informazioni e controllato che la squadra esista, il programma deve riordinare la classifica e ristamparla a video.

Esempio di programma in Java


In totale, quindi, dovranno essere realizzate, oltre al main, le seguenti tre funzioni:
void ordina(struct Squadra c[4]); riordina le 4 squadre della classifica in ordine decrescente di punteggio; void vedi_classifica(struct Squadra c[4]); stampa a video la classifica; bool aggiorna(struct Squadra c[4],char nomesquadra[10],int variazionepunteggio); aggiorna il punteggio della squadra nomesquadra e restituisce true. Se non esiste nessuna squadra con quel nome restituisce false.

Esempio di esecuzione
Inserisci nome squadra numero 1 : rossa Inserisci punteggio squadra rossa : 5 Inserisci nome squadra numero 2 : gialla Inserisci punteggio squadra gialla : 2 Inserisci nome squadra numero 3 : verde Inserisci punteggio squadra verde : 4 Inserisci nome squadra numero 4 : blu Inserisci punteggio squadra blu : 3 Posizione Squadra Punti 1 rossa 5 2 verde 4 3 blu 3 4 gialla 2 Quale squadra ha cambiato punteggio? bianca Di quanto e' cambiato il punteggio? 5 Squadra non trovata Ancora (si/no)? si Quale squadra ha cambiato punteggio? blu Di quanto e' cambiato il punteggio? 3 Posizione Squadra Punti 1 blu 6 2 rossa 5 3 verde 4 4 gialla 2 Ancora (si/no)? no

Impostazione
Un package (EsempioClassifica) Tre classi:
EsempioClassifica, col metodo main Classifica (con la maggior parte dei metodi richiesti) Squadra (con due attributi, nome e punteggio)

Classe Squadra
package Esempio; public class Squadra { private String nome; private int punteggio; Squadra(String n,int p){ setNome(n); setPunteggio(p); } void stampa(){ System.out.println(getNome()+" - "+getPunteggio()); return; } public void setNome(String nome) { this.nome = nome; } public String getNome() { return nome; } public void setPunteggio(int punteggio) { this.punteggio = punteggio; } public int getPunteggio() { return punteggio; } }

I metodi get e set sono stati generati automaticamente da Eclipse tramite una funzione di Refactoring
Refactor/Encapsulte Fields

Le funzioni set non hanno bisogno di utilizzare lallocazione dinamica con new
E sufficiente duplicare il riferimento: al termine del metodo set il riferimento al parametro verr automaticamente distrutto e rimarr solo il riferimento allattributo Vantaggio: Eclipse pu scrivere metodi set per qualunque classe, senza sapere come si chiama il suo costruttore!

Classe Classifica
package Esempio; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Classifica { final int numero_squadre=4; private Squadra lega[]; Classifica(){
lega=new Squadra[numero_squadre]; for (int i=0;i<numero_squadre;i++) inputSquadra(i);

} private void inputSquadra(int i) {


String n = null; int p = 0; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); try {

System.out.println("Nome squadra "+i); n = new String(in.readLine()); System.out.println("Punteggio squadra "+i); p=Integer.parseInt(in.readLine());


} catch (IOException e) {

// TODO Auto-generated catch block e.printStackTrace();


} lega[i]=new Squadra(n,p); return;

Lega un array di Squadra, allocato dinamicamente Gli import dei package sotto java.io sono suggeriti direttamente da Eclipse Il blocco try/catch stato suggerito da Eclipse poich sa che le operazioni di input potrebbero non andare a buon fine Linput di p (intero) passato attraverso lutilizzo del metodo di conversione parseInt della classe Integer Le variabili locali (n, p) sono state inizializzate dopo suggerimento di Eclipse

Classe Classifica
public void stampaClassifica(){
System.out.println("Classifica"); for (int i=0;i<numero_squadre;i++) lega[i].stampa();

public void ordinaClassifica(){ for (int i=0;i<numero_squadre;i++) for (int j=numero_squadre-1;j>i;j--) if (lega[j].getPunteggio()>lega[j-1].getPunteggio()) { int punteggioswap=lega[j].getPunteggio(); String nomeswap=lega[j].getNome(); lega[j].setPunteggio(lega[j-1].getPunteggio()); lega[j].setNome(lega[j-1].getNome()); lega[j-1].setPunteggio(punteggioswap); lega[j-1].setNome(nomeswap); } return; }

Il metodo ordinaClassifica stato realizzato dopo aver osservato e modificato di conseguenza lanalogo metodo realizzato in C++

Classe Classifica
public Boolean aggiorna(String n,int deltaPunteggio){
Squadra s=cercaSquadra(n); if (s!=null){
s.setPunteggio(s.getPunteggio()+deltaPunteggio); return true;

} else return false;

} private Squadra cercaSquadra(String n) {


int i=0; while (i<numero_squadre){ if (lega[i].getNome().equals(n)) return lega[i]; i++; } return null;

Il metodo aggiorna ordinaClassifica stato realizzato dopo aver osservato e modificato di conseguenza lanalogo metodo realizzato in C++ Il metodo cercaSquadra ritorna un riferimento ad un oggetto Squadra

} }

Classe EsempioClassifica
package Esempio; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;

public class EsempioClassifica { public static void main(String[] args) { Classifica c=new Classifica(); c.ordinaClassifica(); c.stampaClassifica(); Boolean fine=false; while (fine==false){ String nome=null; System.out.println("Quale squadra ha cambiato punteggio? "); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); try { nome = in.readLine(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Di quanto e' cambiato il punteggio? "); int deltap=0; try { deltap = Integer.parseInt(in.readLine()); } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }

Classifica allocato dinamicamente Tutti gli input sono stati inseriti in blocchi try/catch (dopo suggerimento di Eclipse)

Classe EsempioClassifica
Boolean ok=c.aggiorna(nome, deltap); if (!ok) System.out.println("Squadra non trovata"); else { c.ordinaClassifica(); c.stampaClassifica(); } String ancora = null; System.out.println("Ancora (si/no)? "); try { ancora=in.readLine(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (ancora.equalsIgnoreCase("no")) fine=true; } } }

Per il confronto tra stringhe si utilizza il metodo equalsIgnoreCase di String

Class Diagram dImplementazione

Classifica EsempioClassifica +main(String[] args) <<final>>+numero_squadre = 4 -inputSquadra(int) +stampaClassifica() -lega +ordinaClassifica() +aggiorna(String n, int deltaPunteggio): Boolean -cercaSquadra(String n): Squadra 4

Squadra -nome: String -punteggio: int +stampa() +getNome(): String +setNome(String) +getPunteggio(): int +setPunteggio(int)