Esercizio Riepilogativo su Strutture Lineari Collegate Si vuole implementare un sistema che consenta di gestire un campionato calcistico giocato da n (pari) squadre. 1 Realizzare una classe Giornata che sia in grado di gestire le partite giocate in una giornata di campionato. La classe dovrà mantenere le seguenti informazioni: ● Campo Identificativo (es. “giornata 1” o più semplicemente “1”) ● Elenco delle partite disputate, rappresentato da una matrice di String con n/2 righe e 2 colonne. ● Risultato di ciascuna partita (matrice di int con n/2 righe e 2 colonne) ● Segno sulla schedina (array o matrice di char (n/2 x 1) contenente esclusivamente i caratteri ‘1’, ‘X’, ‘2’). Figura 1 - Esempio di Rappresentazione di un Oggetto Giornata La classe Giornata deve contenere, oltre agli opportuni metodi costruttori, i seguenti metodi: ● public static Giornata leggiPartiteDaUtente (): chiede all’utente di inserire da tastiera l’identificatore della giornata, il numero di partite disputate e l’elenco delle partite, e restituisce un’istanza di classe Giornata contenente tali informazioni. ● public static Giornata leggiPartiteDaFile (String nomeFile): legge da un file di testo le informazioni relative alle partite di una giornata e restituisce un’istanza contenente tali informazioni. Il metodo deve leggere il file riga per riga. L’inizio delle informazioni riguardanti una giornata sono identificate dalla stringa “Giornata” seguita dall’identificativo della giornata. Nella riga successiva è indicato il numero x di partite disputate nella giornata e nelle x righe successive l’elenco delle partite nel formato “<prima squadra> <seconda squadra>”. La fine delle informazioni di una giornata è contrassegnata dalla stringa “<\fine giornata>”. Figura 2 - Esempio di un Frammento di File di testo ● public void aggiornaPunteggidaFile(String nomeFile): legge da un file di testo i risultati delle partite della giornata oggetto d’invocazione. Il metodo deve leggere il file riga per riga. L’inizio delle informazioni riguardanti una giornata è constrassegnato dalla stringa “Giornata” seguita dall’identificativo della giornata. Nelle due righe successive è riportato l’elenco delle partite e i relativi punteggi nel formato “<squadra casa> - < squadra ospite>” “<goal casa>-<goal ospite>” La fine delle informazioni di una giornata è contrassegnata dalla stringa “<\fine giornata>”. Figura 3 - Esempio di Frammento di File di Testo public char assegnaPunteggio(String sq1, String sq2, int p1, int p2): assegna il punteggio p1-p2 alla partita sq1-sq2, aggiorna il simbolo in schedina e lo restituisce. ● public char goal(String sq): assegna un goal alla squadra sq1, aggiorna il segno in schedina e lo restituisce. ● public void stampaGiornata(): stampa a video le informazioni della giornata nella forma: ● ID Giornata <Squadra1c> – <Squadra1o> <punteggioC> - <punteggioO> <segnoSchedina> <Squadra2c> – <Squadra2o> <punteggioC> - <punteggioO> <segnoSchedina> . . . 2 Realizzare una classe Classifica che rappresenti la classifica delle squadre partecipanti al campionato, ordinata per punteggio decrescente. Classifica deve essere implementata come struttura lineare collegata. Suggerimento: Il nodo della lista classifica deve contenere come informazione sia il nome della squadra che il punteggio attuale. La classe Classifica deve contenere, oltre agli opportuni metodi costruttori, i seguenti metodi: ● public Classifica aggiornaClassifica(Giornata g): il metodo aggiorna la classifica tenendo conto dei risultati della giornata g, assegnando 3 punti alle squadre vincenti, 1 punto alle squadre che hanno pareggiato e 0 punti alle squadre perdenti . L’implementazione di questo metodo deve essere funzionale. ● public void penalizza(String sq, int pt): toglie pt punti alla squadra sq e aggiorna l’ordine. ● public void rimuoviPenalizzazione (String sq, int pt): aggiunge pt punti alla squadra sq e aggiorna l’ordine. ● public void stampaClassifica(): stampa a video la classifica. 3 Realizzare una classe Campionato in grado di gestire le seguenti informazioni: ● Elenco delle giornate: rappresenta l’elenco ordinato delle giornate a partire dalla prima; ● Classifica: rappresenta la classifica aggiornata dopo l’ultima giornata. L’elenco delle giornate deve essere realizzato utilizzando una struttura lineare collegata. La classe Campionato deve fornire i seguenti metodi: ● ● ● ● ● ● ● ● ● ● ● ● Metodo costruttore senza parametri public void aggiungiGiornata(Giornata g, int k): il metodo deve aggiungere la giornata g in posizione k. L’implementazione deve essere ricorsiva. public Giornata cercaGiornata(String id): il metodo cerca la giornata identificata dalla stringa id. Se presente restituisce la giornata altrimenti, stampa un messaggio di errore e restituisce una giornata vuota. Il metodo deve essere ricorsivo. public String maxGoalSegnati(): restituisce il nome di una qualsiasi delle squadre che hanno segnato il maggior numero di goal. L’implementazione di questo metodo deve essere ricorsiva. public String maxGoalSubiti(): restituisce il nome di una qualsiasi delle squadre che hanno subito più goal. public int totaleGoalSegnati(String sq): restituisce il numero di goal totali segnati dalla squadra sq. L’implementazione di questo metodo deve essere ricorsiva. public String maxPareggi(): restituisce il nome di una delle squadre che hanno pareggiato più volte. public String minPareggi(): restituisce il nome di una delle squadre che hanno pareggiato meno volte. public String[] squadrePiuGoal(int x): restituisce un array contenente le squadre che hanno segnato più di x goal. public stampaSquadreChampions(): stampa la sotto-classifica relativa alle squadre che hanno accesso alla Champions League, ovvero le prime 4 squadre in classifica. public stampaSquadreRetrocesse(): stampa la sotto-classifica relativa alle squadre in zona retrocessione, ovvero le ultime 4 squadre. public void primoDopoXGiornate(int x): stampa a video il nome e il punteggio del primo in classifica dopo la giornata x. ● 4 public void yDopoXGiornate(int pos, int x): stampa a video il nome e il punteggio della squadra in posizione y nella classifica dopo la giornata x. Scrivere un programma di test che invochi tutti i metodi almeno una volta. Suggerimento: se necessario, sviluppare metodi ausiliari per l’implementazione di procedure ricorrenti (es. conteggi, ricerche etc…).