Pages: [1] 2 3   Go Down
Print
Author Topic: Dubbio su array frastagliati  (Read 6031 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« on: 19-01-2011, 19:04:17 »

/*Scrivere un metodo che prenda in input una matrice A di long, e restituisca un boolean che indichi
se esistono due colonne di A le cui rispettive medie dei valori coincidono. Non si possono usare
array ausiliari.
*/

 int somma=0,somma1=0,media,media1;


      for(j=0;j<A[0].length;j++)
      {
                somma=0;
            for(i=0;i<A.length;i++)
            {
               somma+=A[i ][j];
            }
          media= somma/A.length;
            
         for(int j1=j+1;j1<A[0].length;j1++)
            {
                somma1=0;
               for(int i1=0;i1<A.length;i1++)
               {
                  somma1+=A[i1][j1];
               }
                media1=somma1/A.length;
               
               if(media==media1)
                  trovato=true;
            }
      }
            
            
System.out.print(trovato);

Ho scritto questo codice (provato-funzionante)  senza utilizzare gli array frastagliati....
Ma se dovessi fare questo esercizio con array frastagliati come verrebbe? GRAZIE
Logged
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #1 on: 19-01-2011, 19:29:26 »

Il prof. è stato abbastanza chiaro dicendo che il metodo "prende in input una matrice", di conseguenza non esiste il problema del frastagliamento... per definizione (matematica) di matrice .

Se poi, al di là della consegna, vuoi comunque sapere come comportarti in tal caso, possiamo riparlarne .
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #2 on: 19-01-2011, 21:47:52 »

Capito capito    ... Però sarai curioso di capire come verrebbe il precedente algoritmo se utilizzassi l'array frastagliato !
Logged
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #3 on: 19-01-2011, 23:56:08 »

C'è molta roba in questo forum riguardo gli array frastagliati e come scandagliarne le colonne in sicurezza.

Non è impossibile, bisogna ragionarci un pochino.
Tuttavia, ripeto, una ricerca in questo forum ti darà risultati comunque utili alla comprensione (anche con messaggi miei).
 
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
StephCT
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #4 on: 25-01-2011, 12:48:12 »

dato che siamo in un topic dal titolo appropriato riuppo questo per chiedere un consiglio: negli array frastagliati spesso è richiesto di controllare se la somma di due colonne uguali e simili. mi chiedevo: è consigliabile fare prima un ciclo for per trovare la riga che ha la lunghezza più lunga e poi impostare il primo for con l'indice di colonna che va da 0 a questo max?

/*Scrivere un metodo che prenda in input un array bidimensionale S di stringhe, e restituisca un
boolean che indichi se esiste una colonna di S in cui un certo carattere occorre una volta sola */

ad esempio in questo caso bisogna controllare le colonne quindi sarebbe in teoria necessario, come si fa nelle matrici, scrivere prima il for della "j", indice di colonna, e poi quello dell'indice "i" di riga...
Logged

"Che la Forza sia con Te"
Stardust
Apprendista Forumista
**
Offline Offline

Posts: 450


L'amore è attesa di una gioia che qnd arrva annoia


« Reply #5 on: 25-01-2011, 13:30:37 »

dato che siamo in un topic dal titolo appropriato riuppo questo per chiedere un consiglio: negli array frastagliati spesso è richiesto di controllare se la somma di due colonne uguali e simili. mi chiedevo: è consigliabile fare prima un ciclo for per trovare la riga che ha la lunghezza più lunga e poi impostare il primo for con l'indice di colonna che va da 0 a questo max?

/*Scrivere un metodo che prenda in input un array bidimensionale S di stringhe, e restituisca un
boolean che indichi se esiste una colonna di S in cui un certo carattere occorre una volta sola */

ad esempio in questo caso bisogna controllare le colonne quindi sarebbe in teoria necessario, come si fa nelle matrici, scrivere prima il for della "j", indice di colonna, e poi quello dell'indice "i" di riga...

Devi solo scandire ma la matrice frastagliata per colonne in qst esercizio e fare qll che dice..
Logged

L'acqua ni vagna...u ventu n'asciuca e... u RUM e PERA n'aiutaaaa...
StephCT
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #6 on: 25-01-2011, 14:09:39 »

giustissimo, ma come fai a dare un limite al ciclo delle colonne? perchè se si fa nel solito modo:
for(j=0;j<A[0].length;j++)
  for(i=0;i<A.length;i++)
rischi di mangiarti alcune colonne perchè magari la prima riga nn è la più lunga. di conseguenza chiedevo: è necessario fare prima un ciclo per trovare la lunghezza max e quindi diciamo impostare quel j da 0 a j<max, oppure ci sn altri metodi?
Logged

"Che la Forza sia con Te"
Stardust
Apprendista Forumista
**
Offline Offline

Posts: 450


L'amore è attesa di una gioia che qnd arrva annoia


« Reply #7 on: 25-01-2011, 14:30:00 »

giustissimo, ma come fai a dare un limite al ciclo delle colonne? perchè se si fa nel solito modo:
for(j=0;j<A[0].length;j++)
  for(i=0;i<A.length;i++)
rischi di mangiarti alcune colonne perchè magari la prima riga nn è la più lunga. di conseguenza chiedevo: è necessario fare prima un ciclo per trovare la lunghezza max e quindi diciamo impostare quel j da 0 a j<max, oppure ci sn altri metodi?
MMmmm.... forse si dovresti trovarti la riga più lunga e poi devi stare attendo che esista la colonna che cerchi infatti può capitare che cerchi qualcosa che nn c'è generando un eccezione quindi a quanto pare i cicli fino ad ora sn 3 cmq ma intanto scrivi il codice se da errore lo correggiamo!  pc
Logged

L'acqua ni vagna...u ventu n'asciuca e... u RUM e PERA n'aiutaaaa...
Luxandro
Apprendista Forumista
**
Offline Offline

Posts: 307



« Reply #8 on: 25-01-2011, 16:39:17 »

Salve ragazzi!  

Svolgendo gli esercizi riguardanti gli array frastagliati ho incontrato, come StephCT, difficoltà nello "scorrere per colonne" gli array frastagliati. Dopo un po' di ragionamenti ho deciso di creare un array dim[] che memorizzi, tramite ciclo for, le dimensioni di ogni riga.
Propongo, di seguito, il codice di un esercizio. Logicamente "sembra" non ci siano errori, ma in fase di esecuzione ritorna il solito errore "ArrayIndexOutOfBoundsException". Da notare che, provando ad inserire in input una semplice matrice rettangolare, l'errore non si presenta   boh

Spero che qualcuno possa darmi un parere in proposito.

Grazie in anticipo!  

Code:
/* Scrivere un metodo che prenda in input un array bidimensionale frastagliato A di stringhe,
e restituisca un boolean che indichi se esiste in A una colonna contenente tre stringhe con
lo stesso carattere finale ( Attenzione alle stringhe mancanti!). */

public static boolean metodo (String [][] A)
{
int r = 0, g;
int [] dim = new int [A.length];

for (g = 0; g < A.length; g++)
            dim [g] = A[g].length;

for (g = 0; g < A.length; g++)
{
for (int j = 0; j < dim[g] ; j++)
{
for (int i = 0; i < A.length; i++)
{
if(!(A [i][j].equals(""))){
String x = "";
x = A [i][j].substring(A [i][j].length()-1);
for (int y = 1; y < A.length - 1; y++)
{
if(!(A [y][j].equals("")))
if(A [y][j].endsWith (x)) r++;
if(r == 3) return true;
}
}
}
}
}
return false;
}
}
« Last Edit: 25-01-2011, 18:50:26 by Luxandro » Logged

"Quando non stai guardando è come un'onda. Quando guardi è come una particella!"
StephCT
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #9 on: 25-01-2011, 19:38:33 »

ovvio che nn funziona, xkè il ciclo della j dipende da g, quindi se g nn si aggiorna j smette di andare avanti perchè magari una riga è più lunga di un'altra ecc mentre nelle matrici rettangolari sn tutti la stessa cosa. quindi, come ho scritto nell'altro post, bisogna fare un ciclo e memorizzare in una variabile la lunghezza massima.

Code:
int max=A[0].length;
for(int i=0;i<A.length;i++)
    if(A[i].length>max)
        max=A[i].length;

così parti direttamente cn il ciclo della j    for(j=0;j<max;j++)
e poi stare attento a poter controllare solo se
if(j<A.length)

così i codici mi hanno sempre compilato. era questo che chiedevo prima. se è conveniente usare sto ragionamento o c'è qualcos'altro che mi evita il ciclo per cercare la lunghezza max?
Logged

"Che la Forza sia con Te"
Luxandro
Apprendista Forumista
**
Offline Offline

Posts: 307



« Reply #10 on: 26-01-2011, 08:10:08 »

Il ciclo basta farlo una volta sola? Non serve che max si aggiorni per ogni riga?  
Se ho ben capito il for dovrebbe essere fatto prima che inizi l'iterazione delle colonne...quindi dovrebbe essere il ciclo più esterno... sbaglio?  boh


EDIT: funge! Grazie mille Steph!  ok
« Last Edit: 26-01-2011, 10:26:25 by Luxandro » Logged

"Quando non stai guardando è come un'onda. Quando guardi è come una particella!"
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #11 on: 26-01-2011, 22:18:44 »

Ragazzi approfitto di questo post per dirvi cosa non va in questo codice:

/*Scrivere un metodo che prenda in input un array bidimensionale S di stringhe, e restituisca un
boolean che indichi se esiste una colonna di S in cui un certo carattere occorre una volta sola */

public boolean metodo( String [][] A)
   {
      int cont=0;
      int max=A[0].length;
      boolean trovato=false;

      for(int i=0;i<A.length;i++)
         if(A[i ].length>max)
            max=A.length;

      for(int j=0;j<max  &&  !trovato;j++)
         {
            cont=0;
            for(int i=0;i<A.length && !trovato;i++)
               for(int k=0;k<A[i ][j].length()-1 && !trovato;k++)
                     if(A[i ][j].charAt(k) == A[i ][j].charAt(k+1))
                     {
                        cont++; //Male che vada questo diventera 1
                        if(cont>0)
                        {
                           trovato=true;
                           return true; // Esce e restituisce true  perchè ci sono caratteri che si ripetono più di una volta
                        }
                        
                     }
         }
                  if(cont==0) // Se è 0 cont ,significa che non è mai entrato nella condizione di uguaglianza
                  return false; // Restituisce false perchè nessun carattere si ripete più di una volta
         
   }

Come errore il compilatore mi da :
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
   at java.lang.String.charAt(Unknown Source)

Spero di aver interpretato bene l'esericizio  ...Ragazzi se qualcuno ha già fatto l'ese potrebbe darmi una mano ?? GRAZIE
« Last Edit: 27-01-2011, 01:26:47 by salvopuglisi » Logged
Stardust
Apprendista Forumista
**
Offline Offline

Posts: 450


L'amore è attesa di una gioia che qnd arrva annoia


« Reply #12 on: 27-01-2011, 09:17:48 »

usa il tag code... xk sennò c'è perdita di informazione
Logged

L'acqua ni vagna...u ventu n'asciuca e... u RUM e PERA n'aiutaaaa...
Luxandro
Apprendista Forumista
**
Offline Offline

Posts: 307



« Reply #13 on: 27-01-2011, 11:10:13 »

Ciao Salvo!  

Per quanto riguarda il for di controllo della dimensione massima
Code:
 for(int i=0;i<A.length;i++)
         if(A[i ].length>max)
            max=A.length;
puoi anche non metterlo poichè ci troviamo in presenza di una matrice rettangolare e non frastagliata, quindi potresti scorrerla semplicemente per colonne mettendo nella condizione del for ( che scorre le colonne)

j < A[0].length

probabilmente potresti anche omettere le variabili cont e trovato poichè il metodo deve ritornare un boolean solo quando trova due stringhe della stessa colonna aventi almeno un carattere uguale.

Ti propongo di seguito una possibile soluzione all'esercizio
Code:
public static boolean metodo (String [][] S)
{
for (int j = 0; j < S[0].length; j++)
for (int i = 0; i < S.length; i++)
for (int r = i + 1; r < S.length; r++)
{
char [] v1 = S[i][j].toCharArray();    char [] v2 = S[r][j].toCharArray();
for (int k = 0; k < v1.length; k++)
for (int z = 0; z < v2.length; z++)   if (v1[k] == v2[z])   return true;
}
return false;
}
}
e la corrispondente verifica tramite main
Code:
public static void main (String [] args)
{
String [][] S = {{"abcd","ef","ghi"},{"lmi","no","pqrs"},{"t","ioo","vz"}};
for (int x = 0; x < S.length; x++)
{
for (int y = 0; y < S[x].length; y++)
System.out.print(S[x][y]+"\t");
System.out.print("\n");
}
System.out.println(metodo(S));
}
« Last Edit: 27-01-2011, 11:11:57 by Luxandro » Logged

"Quando non stai guardando è come un'onda. Quando guardi è come una particella!"
StephCT
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #14 on: 27-01-2011, 18:59:09 »

vero nn serve qua trovare il max, e invece cmq luxandro hai bisogno di una piccola correzione. il carattere deve ripetersi una sola volta, nn specifica che devono essere in due stringhe diverse...quindi se si trova nella stessa parola va bene pure. se avesse messo,supponiamo che le stringhe contengano caratteri tutti diversi tra loro.
salvo vorrei darti un consiglio nell'operare con i booleani. in quel caso dato che stai usando il boolean trovato, appena diventa true, non continua con i cicli ma esce fuori. quindi puoi mettere un unico return alla fine scrivendo return trovato;
sull'errore che esce fuori di uno dalla stringa sinceramente nn ti so dire...il ciclo che gestisce la lunghezza della stringa mi pare corretto...
Logged

"Che la Forza sia con Te"
Pages: [1] 2 3   Go Up
Print
Jump to: