Quadrato Magico Si richiede lo sviluppo di un programma che permette all utente l inserimento di una matrice quadrata di numeri interi positivi e verifica se si tratta di un quadrato magico Una matrice quadrata di numeri interi è un quadrato magico se sommando i numeri posti lungo qualsiasi colonna, qualsiasi riga o una qualunque delle due diagonali si ottiene comunque lo stesso numero (detto costante magica del quadrato) Un quadrato magico è interessante solo se composto da numeri tutti diversi tra loro e ancor più se contiene numeri consecutivi a partire da 1
Esempio di quadrato magico 4 3 8 9 5 1 2 7 6
Esempio di quadrato magico 16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1
Quadrato magico (versione 0.0) Il programma, dopo aver presentato un saluto iniziale: - richiede all utente la lunghezza del lato del quadrato, controllando che sia maggiore di 2 e minore di un valore massimo prefissato (p.e. 10) - richiede all utente i numeri necessari al riempimento del quadrato - verifica se il quadrato è un quadrato magico - se lo è, presenta a video la sua costante magica
Suggerimenti progetto (primo passo) Il primo passo consiste nell identificazione delle classi necessarie E possibile individuare: una classe (istanziabile( istanziabile) ) per rappresentare ciascuna matrice quadrata una classe (tutta static) ) per il main e per altri metodi di utilità specifici del problema (p.e. il saluto, la creazione di una matrice) una classe (tutta static,, che potremmo riusare da programmi precedenti) per i metodi di utilità generale, quali le letture dei dati in input
Suggerimenti progetto (secondo passo) Progettare un programma non significa solo pensare a come sarà fatto ma anche a come sarà testato E opportuno definire un piccolo piano di test: una prova in cui si inserisce un quadrato banalmente magico (p.e. perche contiene tutti 1) una prova in cui si inserisce un quadrato banalmente non magico (p.e. perche contiene tutti 1 tranne un solo 2) una prova in cui si inserisce il quadrato magico di dimensione 3 visto in precedenza una prova in cui si inserisce lo stesso quadrato modificando uno dei valori in modo che non sia più magico
Suggerimenti progetto (terzo passo) Una possibile realizzazione della classe che rappresenta una MatriceQuadrata comprende: un attributo che rappresenta la matrice quadrata un costruttore per inizializzare tale attributo un metodo che restituisce un valore boolean corrispondente al fatto che la matrice sia un quadrato magico o meno un metodo che restituisce un intero corrispondente alla costante magica se la matrice è un quadrato magico, oppure un valore negativo (p.e. 1) se non lo è un metodo che restituisce la rappresentazione della matrice come String (disposta su piu righe) o che la stampa a video
Suggerimenti progetto (quarto passo) Una prima possibile realizzazione del metodo main prevede che esso: presenti un saluto effettui la richiesta della dimensione della matrice crei un array bidimensionale di interi di tale dimensione richieda all utente uno per uno i valori da inserire e li inserisca nelle corrispondenti caselle della matrice crei un istanza di MatriceQuadrata passando l array al suo costruttore stampi a video il contenuto della matrice Queste operazioni possono essere contenute in un metodo a sé stante
Suggerimenti progetto (quinto passo) Dopo aver verificato il buon funzionamento dell inserimento dati scrivere il metodo che verifica se la matrice è un quadrato magico e collaudarne il funzionamento Dopo aver collaudato il funzionamento di tale metodo, scrivere e collaudare il metodo che calcola la costante magica se la matrice è un quadrato magico
Quadrato magico (versione 0.1) Se la versione 0.0 è stata completata con successo, possiamo pensare a modificarne il ciclo di funzionamento: anziché far inserire una sola matrice, elaborarla e poi uscire, realizzare un ciclo che chiede all utente se vuole uscire o proseguire e se vuole proseguire permette l inserimento di una nuova matrice, la elabora, ripresenta l alternativa tra uscire e proseguire e così via...
Quadrato magico (versione 0.2) Se la versione 0.1 è stata completata con successo, possiamo pensare ad aumentarne le funzionalità: Aggiungere un metodo che verifica se i numeri contenuti nella matrice sono tutti diversi o ci sono numeri ripetuti Aggiungere un metodo che verifica se i numeri contenuti nella matrice sono consecutivi a partire da 1
Quadrato magico (versione 0.3) Eulero scoprì un ulteriore categoria di quadrati magici, detti panmagici (o anche diabolici) Essi sono quadrati magici nei quali è uguale alla costante magica anche la somma dei numeri situati in ogni coppia di linee complementari. Due linee sono complementari se sono parallele ad una diagonale, una è di k elementi (k=1,2,,n-1) 1) e l altra di n-k n k elementi, dove n è la dimensione della matrice Scrivere un metodo che verifica se la matrice è un quadrato panmagico
Esempio di quadrato panmagico 1 12 7 14 8 13 2 11 10 3 16 5 15 6 9 4
Linee complementari 1 12 7 14 8 13 2 11 10 3 16 5 15 6 9 4