Esercizio matrice:creare sottomatrice eliminando colonne...

lorenzcollixx
buonasera;)non riesco a trovare la chiave per far girare questo metodo in java!!!la traccia è:

Scrivere Un metodo filtra che riceve una matrice di interi S e un intero x e restituisce una matrice M1 contenente
le colonne di S il cui indice è un sottomultiplo di x;

io ho provato così(non capisco dove sbaglio):

public class esercizio31 {
public static int sottomultiplo(int[][]m,int p){
	int temp=0;
	for (int j=0;j<m[0].length ;j++)
		for(int i=0;i<m.length;i++)
			if (p%j!=0){
				j=temp;
}
	return temp;
}
	
	public static int[][]controllaRighe (int[][]s, int x){
	int cont=0;
	for (int j=0;j<s[0].length ;j++){
	for(int i=0;i<s.length;i++)
	if (x%j!=0)
	cont++;
}
    int indice=0;
    int[][]m1=new int [s.length ][s[0].length-cont];
    for (int j=0;j<s[0].length ;j++){
    for(int i=0;i<s.length;i++)
	if(j!=sottomultiplo(s,x))
	m1[i][indice]=s[i][j];
    indice++;
    }
    return m1;
    }

     
	public static void main(String[] args) {
	 int[][]s={{1,4,3,5,6},{4,0,0,9,3},{3,4,3,7,4},{1,2,3,4,3},{6,2,8,5,6},{7,3,8,2,4}};
	 int x=4;
	 int[][] m1=controllaRighe(s,x);
	 for (int i=0;i<m1.length ;i++){
		 for(int j=0;j<m1[0].length;j++)
      System.out.print(m1[i][j]+" ");
      System.out.println (" ");
		 
	}
	}

}


ho utilizzato un metodo ausiliario sottomultiplo per "archivare"le j che sono sottomultipli di p...
Perfavore aiutatemi nn riesco a trovare una soluzione!!!

Risposte
apatriarca
Non mi è chiaro cosa tu stia cercando di fare, ma il problema è molto più semplice di quanto il tuo codice lasci intendere e mi fa quindi pensare che tu stia sbagliando approccio.

La prima cosa da fare è secondo me quella di calcolare il numero di sottomultipli di x minori del numero di colonne della matrice. Questa sarà la lunghezza delle righe di M1 e questo primo passaggio permette quindi di creare M1.
Dopo questo primo passaggio devi semplicemente fare un ciclo su tutte le righe di S e inserire valori nella corrispondente righa di M1 solo quando l'indice della colonna è un sottomultiplo di x.

lorenzcollixx
penso di aver capito!!è proprio quello che volevo fare contarmi i sottomultipli di x per determinare il numero di colonne che formano la matrice m1...ma qual è la scrittura per calcolarmi i sottomultipli di x??facendo girare il programmino su eclipse mi segna puntualmente come errore (x%j==0)..non è così che si determina il sottomultiplo di x???c'è un altro modo??

apatriarca
Quella riga è corretta, ma non capisco perché il ciclo per la ricerca del sottomultiplo è su tutti gli elementi della matrice (o meglio sull'insieme di tutti gli indici). Il seguente programma che ho scritto stampa tutti i sottomultipli di 60. Nota che x%0 causa un'eccezione dovuta alla divisione per zero. Il problema non è la condizione ma il fatto di aver provato a testarla in zero. Zero è comunque sottomultiplo solo di se stesso per cui non mi preoccuperei di considerarlo e fai partire i cicli da 1. Ho concluso il ciclo in x/2 perché non ci sono sottomultipli maggiori di quel numero tranne il numero stesso e non è necessario fare test. Si risparmiano in questo modo un po' di calcoli, ma nel tuo caso potrebbe essere molto più semplice proseguire fino al minimo tra x e il numero di colonne.
public class Main {
    public static void main(String[] args) {
        final int x = 60;
        for (int i = 1; i <= x/2; ++i) {
            if (x%i == 0)
                System.out.println(i);
        }
        System.out.println(x);
    }
}

lorenzcollixx
perfetto!!!;)grazie delle direttive!!!;)

lorenzcollixx
Scusa apatriarca se ti disturbo ancora!!!ho corretto il codice:
public static int sottomultiplo(int[][]m,int p){
		int cont=0;
		for (int j=1;j<=p ;j++){
		if ( p%j==0 )
			cont++;
	}
		return cont;
	}
	public static int[][]controllaRighe (int[][]s, int x){
		int indice=0;
		int[][]m1=new int [s.length ][sottomultiplo(s,x)];
	    for (int j=1;j<m1[0].length ;j++){
	    for(int i=0;i<m1.length;i++)
	    	if(j!=sottomultiplo(s,x))
	    		m1[i][indice]=s[i][j];
	        indice++;
	    }
	    
	    return m1;
	}


la matrice m1 me la restituisce delle dimensioni corrette (costituita dunque da tre colonne).Essendo x=4 ed essendo l'indice di colonna j compreso tra 1 e 4 (dato che si è escluso l'indice j=0)mi dovrebbe restituire una matrice m1 formata dalle colonne di indice j=1,j=2,j=4 inquanto sottomultipli di 4. la matrice m1 che mi restituisce però e costituita dalla colonna j=1,dalla colonna j=2 (e fin qui ci siamo),ma la terza colonna che dovrebbe essere la colonna j=4 nn me la prende..ma visualizzo una colonna di tutti zeri..cioè:
4 3 0  
0 0 0  
4 3 0  
2 3 0  
2 8 0  
3 8 0  

cosa sbaglio?..nn capisco!!!
grazie;)

apatriarca
Ma all'interno del ciclo finale devi solo testare ogni indice j usando il solito x&j==0

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.