Esercizio matrice:creare sottomatrice eliminando colonne...
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):
ho utilizzato un metodo ausiliario sottomultiplo per "archivare"le j che sono sottomultipli di p...
Perfavore aiutatemi nn riesco a trovare una soluzione!!!
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
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.
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.
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??
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); } }
perfetto!!!;)grazie delle direttive!!!;)
Scusa apatriarca se ti disturbo ancora!!!ho corretto il codice:
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è:
cosa sbaglio?..nn capisco!!!
grazie;)
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;)
Ma all'interno del ciclo finale devi solo testare ogni indice j usando il solito x&j==0