Metodo:errore nel return

di il
5 risposte

Metodo:errore nel return

Ciao a tutti, ho un problema con il return dei metodi sopraDiagonale(M) - sottoDiagonale(M) - Diagonale(M). Il programma deve fare questo:

Definire un metodo che:
* (i) prenda come unico parametro formale, di nome m, una matrice quadrata di interi
* rappresentata PER COLONNA;
* (ii) restituisca true se e solo se tutti gli elementi che NON appartengono alla diagonale
* principale sono uguali a 0 e gli elementi che appartengono alla diagonale sono multipli di 3.

Ho fatto 3 metodi, ognuno per controllare rispettivamente se:
*gli elementi che appartengono alla diagonale sono multipli di 3
*tutti gli elementi che NON appartengono alla diagonale principale sono uguali a 0

Prendo come riferimento il metodo Diagonale; tramite la stampa a video ho controllato che faccia quello che deve e a quanto pare..lo fa...Il problema credo sia dovuto al fatto che l'ultimo elemento che trova è true quindi ritorna "true" nonostante la diagonale non sia tutta multipla.
Come posso fare a farlo uscire dal ciclo al primo false che incontra e quindi farmi ritornare false?(credo che il problema è uguale su tutti i metodi)

public class BZero{
public static boolean multiplo(int v,int a){
		return v%a==0;
	}
	
	//ELEMENTI SOPRA LA DIAGONALE
	public static boolean sopraDiagonale(int[][]m){
		boolean vero=false;
		int indiceColonne=1;
		for(int i=0;i<m.length-1;i++){
			for(int j=indiceColonne;j<m[i].length;j++){
				if(m[i][j]==0)
					vero=true;
			}
			indiceColonne++;	
		}
		return vero;
	}
	
	//ELEMENTI SOTTO LA DIAGONALE
	public static boolean sottoDiagonale(int[][]m){
		boolean vero=false;
		for(int i=1;i<m.length;i++){
			for(int j=0;j<i;j++){  
				if(m[i][j]==0)
					vero=true;
			}
		}
		return vero;
	}
	
	//ELEMENTI DELLA DIAGONALE 
	public static boolean Diagonale(int[][]m){
		boolean vero=false;
		for(int i=0;i<m.length;i++){
			for(int j=0;j<m[i].length;j++){  
				if(i==j){
					vero=multiplo(m[i][j],3);
					System.out.print(" "+ m[i][j]);
					System.out.println(" "+"DIAGONALE: "+vero);
				}
			}
		}
		return vero;
	}
	public static void main(String[] args){ 
	
	int[][] M = {{1,0,0,0}, {0,3,0,9}, {0,0,5,0}, {0,0,0,9}};
	
	if(sopraDiagonale(M) && sottoDiagonale(M) && Diagonale(M))
		System.out.println(true);
	else
		System.out.println(false);
		
	}
	
}

5 Risposte

  • Re: Metodo:errore nel return

    Jevilik ha scritto:


    Prendo come riferimento il metodo Diagonale; tramite la stampa a video ho controllato che faccia quello che deve e a quanto pare..lo fa...Il problema credo sia dovuto al fatto che l'ultimo elemento che trova è true quindi ritorna "true" nonostante la diagonale non sia tutta multipla.
    Semmai devi ragionare al contrario: vero inizialmente a true e poi se uno degli elementi NON soddisfa quella condizione, allora puoi mettere vero a false.
    Il risultato finale sarà una sorta di "and", cioè solo se tutti gli elementi considerati soddisfano la condizione, allora vero non è stato modificato ed è rimasto a true.
  • Re: Metodo:errore nel return

    andbin ha scritto:


    Jevilik ha scritto:


    Prendo come riferimento il metodo Diagonale; tramite la stampa a video ho controllato che faccia quello che deve e a quanto pare..lo fa...Il problema credo sia dovuto al fatto che l'ultimo elemento che trova è true quindi ritorna "true" nonostante la diagonale non sia tutta multipla.
    Semmai devi ragionare al contrario: vero inizialmente a true e poi se uno degli elementi NON soddisfa quella condizione, allora puoi mettere vero a false.
    Il risultato finale sarà una sorta di "and", cioè solo se tutti gli elementi considerati soddisfano la condizione, allora vero non è stato modificato ed è rimasto a true.
    Quindi devo cambiare il codice nella parte:
    //ELEMENTI DELLA DIAGONALE 
    	public static boolean Diagonale(int[][]m){
    		boolean vero=true;
    		for(int i=0;i<m.length;i++){
    			for(int j=0;j<m[i].length;j++){  
    				if(i==j){
    					vero=multiplo(m[i][j],3);
    				}
    			}
    		}
    		return vero;
    	}
    perché faccio
    if(i==j){
    	vero=multiplo(m[i][j],3);
    				}
    
    però in vero avrò ancora l'ultimo valore di multiplo(m[j],3) che se sarà false mi ritornerà false, se sarà true mi ritornerà true senza tenere conto del risultato degli elementi precedenti della diagonale
    Come risolvo?
  • Re: Metodo:errore nel return

    Jevilik ha scritto:


    però in vero avrò ancora l'ultimo valore di multiplo(m[ i][j],3) che se sarà false mi ritornerà false, se sarà true mi ritornerà true senza tenere conto del risultato degli elementi precedenti della diagonale
    Ma infatti non devi fare un assegnamento incondizionato .... ma condizionato: se NON soddisfa la condizione, allora vero=false
  • Re: Metodo:errore nel return

    andbin ha scritto:


    Jevilik ha scritto:


    però in vero avrò ancora l'ultimo valore di multiplo(m[ i][j],3) che se sarà false mi ritornerà false, se sarà true mi ritornerà true senza tenere conto del risultato degli elementi precedenti della diagonale
    Ma infatti non devi fare un assegnamento incondizionato .... ma condizionato: se NON soddisfa la condizione, allora vero=false
    Ahh ok, forse ho capito
    //ELEMENTI DELLA DIAGONALE 
    	public static boolean Diagonale(int[][]m){
    		boolean vero=true;
    		for(int i=0;i<m.length;i++){
    			for(int j=0;j<m[i].length;j++){  
    				if(i==j){
    					if(!multiplo(m[i][j],3))
    						return false;
    				}
    			}
    		}
    		return vero;
    	}
    Cosi dovrebbe essere corretto no?!

    Grazie mille
  • Re: Metodo:errore nel return

    Jevilik ha scritto:


    Cosi dovrebbe essere corretto no?!
    Sì però allora 'vero' non ti serve più. Al primo elemento che NON soddisfa la condizione fai restituire subito false. Alla fine di tutto fai restituire true. Questo è anche oltretutto il modo efficiente e "furbo" di ragionare (se un elemento non soddisfa la condizione, è inutile proseguire con i successivi).

    Se invece vuoi usare una variabile 'vero', andresti a testare comunque tutti gli elementi (meno efficiente), per poi restituire alla fine il valore di 'vero'. Tutto qui.
Devi accedere o registrarti per scrivere nel forum
5 risposte