Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347

    Miglioramento pezzo di codice

    ciao, mi dareste un aiutino a migliorare questo pezzo di codice?
    codice:
    	public boolean quadratoMagico(double[][] m){
    		if(m.length != m[0].length) throw new RuntimeException("La matrice non è quadrata");
    		int p=0; int c=0;
    		for(int k=0; k<m.length; k++) p+=m[0][k];
    		for(int i=1; i<m.length; i++){
    			for(int j=0; j<m.length; j++)
    				c+=m[i][j];
    			if(c!=p) return false;
    			c=0;
    		}
    		for(int i=0; i<m.length; i++)
    			c+=m[i][i];
    		if(c != p) return false;
    		else c=0;
    		for(int i=0; i<m.length; i++)
    			c+=m[i][m.length];
    		if(c != p) return false;
    		return true;
    	}
    mi rendo conto già da solo che fa proprio schifo XD quindi per favore non fate commenti su come è scritto grazie
    EDIT: per una più veloce comprensione questo è l'esercizio che dovevo fare:
    boolean quadratoMagico( matrice m )
    riceve una matrice quadrata m di interi e ritorna true se essa forma un quadrato magico, cioè la somma degli
    elementi di una qualunque riga, di una qualunque colonna, della diagonale principale e della diagonale
    secondaria è sempre uguale ad una stessa costante

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,310

    Moderazione

    Originariamente inviato da John360
    ciao, mi dareste un aiutino a migliorare questo pezzo di codice?
    Migliorare in che senso? Spiega cosa non funziona o cosa desideri ottenere.

    Non è la prima volta che apri discussioni di questo tenore (ad esempio, questa oppure questa e soprattutto questa).

    Se hai un problema specifico, devi indicare qual è nel dettaglio, oppure descrivere qual è il dubbio che devi risolvere, senza che gli utenti si mettano ad analizzare il codice che hai scritto cercando di indovinarlo e poi, fornendo una possibile soluzione, si sentano rispondere che non l'hai ancora affrontata all'università, come è già successo), oppure chiedendo spiegazioni che puoi trovare ovunque sul Web, corredate da esempi).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    scusami, comunque intendo miglioramenti visivi... non so se mi spiego, l'algoritmo è giusto però mi sembra scritto male....

  4. #4
    Originariamente inviato da John360
    scusami, comunque intendo miglioramenti visivi... non so se mi spiego, l'algoritmo è giusto però mi sembra scritto male....
    Manca qualche test.

    A me è venuta questa soluzione:
    codice:
        public static boolean isQM(int M[][]){
        	if( M.length != M[0].length )
        		return false;
        	
        	int n = M.length, m = M[0].length;
        	int c = 0, diagpsum = 0, diagssum = 0;
        	
        	// test righe e colonne
    	for(int i = 0; i < n; i++) {
    		int rowsum = 0, colsum = 0;
       		for(int j = 0; j < m; j++) {
           		rowsum += M[i][j];
           		colsum += M[j][i];
           		diagpsum += (i == j) ? M[i][j] : 0;
       		}
       		c = (i == 0) ? rowsum : c;
       			
       		if ( c != rowsum || c != colsum )
          		return false;
    	}
    		
    	// test diagonale principale
    	if ( c != diagpsum )
    		return false;
    		
    	// test diagonale secondaria
    	int row = 0, col = m - 1;
    	while( row - col < m ) 
         	diagssum += M[row++][col--];
    
    	return c == diagssum;
        }

  5. #5
    ma nel tuo codice se non sbaglio controlli le righe la diagonale e l'ultima colonna... ma non tutte le colonne

  6. #6
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Hai controllato che la somma di ogni riga sia uguale a p, ma non hai controllato che anche la somma delle colonne sia uguale a p, ho modificato il primo pezzo di codice così:
    codice:
    int sum=0;
    for(int k=0; k<m.length; k++) p+=m[0][k];
    		for(int i=1; i<m.length; i++){
    			for(int j=0; j<m.length; j++)
                            {
    				c+=m[i][j];
                                    sum+=m[j][i];
                            }
    			if(c!=p || sum!=p) return false;
    			c=0;
                            sum=0;
    Poi c'è un altro problema, nella parte in cui hai pensato di controllare la diagonale secondaria, cioè questa:
    codice:
    		for(int i=0; i<m.length; i++)
    			c+=m[i][m.length-1]; 
    		if(c != p) return false;
    		return true;
    	}
    In realtà non stai controllando la diagonale secondaria (a parte il fatto che uscivi dalla riga), ma stai controllando l' ultima colonna, cioè quella costituita dagli elementi m[0][m.length-1], m[1][m.length-1], .... , m[m.length-1][m.length-1].
    La diagonale secondaria va dall' elemento m[0][m.length-1] all' lemento m[m.length-1][0],per cui l' ultima parte l' ho modificata così:

    codice:
    sum=0;
    for(int i=m.length-1;i>=0;i--)
        sum+=m[i][m.length-1 -i];
    return sum==p;

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 © 2024 vBulletin Solutions, Inc. All rights reserved.