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