Pages: [1] 2   Go Down
Print
Author Topic: Un metodo dove non capisco cos'è in più o in meno  (Read 4014 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« on: 22-02-2009, 16:41:23 »

In questo programma c'è un errore che mi perseguita nei miei esercizi e consiste nel fatto che i controlli dei cicli portano fuori dall'array generando Idexoutofbounds......

mi potreste dare un consiglio??

Code:
/*Scrivere un metodo che prenda in input una matrice bidimensionale frastagliata S di stringhe e
restituisca un boolean che indichi se esiste una colonna in S contenente due stringhe uguali (saltare le
eventuali stringhe mancanti).
 */

class Stringheuguali
{
public static void main(String[] args)
{
String [][] S={{"slurp","unaltroprogramma","benvenga"},
                     {"festival","marcocarta"},
    {"lambda4","sanremo"},
    {"cuccaraccia"},
    {"lamba","diverto","yeah","ilcuore","cancello"},
    {"msn","cenerella","mammamia"}};
   
   
   
System.out.println(prendi(S));
}
   



       public static boolean prendi(String [][] S)
{
boolean esiste =true;
for (int r=0; r<(S.length-1); r++)
{
for (int k=0; k<S[r].length+1 ; k++)
{
for (int r1=r+1; r1<S.length; r1++)
{
if(S[r][k]==S[r1][k])
return esiste;
}
}

}

return !esiste;
}

}

« Last Edit: 22-02-2009, 17:37:14 by guitarplaying » Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
atrix0ne
Forumista
***
Offline Offline

Posts: 607


homo faber fortunae suae


« Reply #1 on: 22-02-2009, 17:20:36 »

uffa io lo so risolvere solo se nn è frastagliata 
Logged

Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #2 on: 22-02-2009, 17:22:09 »

MH bè così è un pò più complicato...ma io non sto capendo perchè esce fuori dall'array........sono troppo deluso....Sad
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
atrix0ne
Forumista
***
Offline Offline

Posts: 607


homo faber fortunae suae


« Reply #3 on: 22-02-2009, 17:24:11 »

solo perchè le righe dell'array variano cpt?
Logged

fedyfausto
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 130


Gandalfr


WWW
« Reply #4 on: 22-02-2009, 17:24:39 »

nemmeno io XD
Logged

Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #5 on: 22-02-2009, 17:25:49 »

ATRIX: Cioè nel senso che lo sai risolvere solo se non è frastagliato per quella motivazione, oppure è la correzione al mio problema???
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #6 on: 22-02-2009, 17:31:27 »

Uffa voglio riuscire a capire la programmazione!!!

 cry  cry  cry  cry  cry  cry  cry  cry  cry
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
atrix0ne
Forumista
***
Offline Offline

Posts: 607


homo faber fortunae suae


« Reply #7 on: 22-02-2009, 17:54:55 »

io lo so fare non frastagliato:
Code:
/*Questo programma implementa un metodo che prende in input un'array frastagliato di stringhe e restituisce un boolean che indica se esiste una colonna con due elemnti uguali */
public class Eesercizio9
  {
  public static boolean metodo(String [][] A)
    {
    int c,r1=0;
    int r=0;
    for(c=0;c<A[0].length;c++)
      {
      for(r=0;r<A.length;r++)
        {
        for(r1=0;r1<A.length && r1 !=r;r1++)
          {
          if(A[r][c].equals(A[r1][c]))
            {
            return true;
            }
          }
        }
      }
    return false;
    }
  public static void main (String [] args){

        String [][] S = {  {"aaa", "cccbc", "eee", "fff", "hhh"},
                           {"aaa", "eppp", "rrr","bbb","ccc"},
                           {"ttt", "vaa", "zzaa", "xx","abcbc"} };


System.out.println(metodo(S));
}
}
Logged

Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #8 on: 22-02-2009, 17:55:59 »

Ti ringrazio ugualmente....Sapete per caso a che ora e dove è l'esame del 25?
« Last Edit: 22-02-2009, 17:57:31 by guitarplaying » Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
isuccia89
Apprendista Forumista
**
Offline Offline

Gender: Female
Posts: 481



« Reply #9 on: 22-02-2009, 18:24:35 »

Ti ringrazio ugualmente....Sapete per caso a che ora e dove è l'esame del 25?
Logged

Se incontrerai qualcuno persuaso di saper tutto e di esser capace di far tutto non potrai sbagliare, costui è un imbecille! (Confucio)
JF
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 383



WWW
« Reply #10 on: 22-02-2009, 20:05:50 »

In questo programma c'è un errore che mi perseguita nei miei esercizi e consiste nel fatto che i controlli dei cicli portano fuori dall'array generando Idexoutofbounds......

mi potreste dare un consiglio??



Code:
/*Scrivere un metodo che prenda in input una matrice bidimensionale frastagliata S di stringhe e
restituisca un boolean che indichi se esiste una colonna in S contenente due stringhe uguali (saltare le
eventuali stringhe mancanti).
 */

class Stringheuguali
{
public static void main(String[] args)
{
String [][] S={{"slurp","unaltroprogramma","benvenga"},
                     {"festival","marcocarta"},
    {"lambda4","sanremo"},
    {"cuccaraccia"},
    {"lamba","diverto","yeah","ilcuore","cancello"},
    {"msn","cenerella","mammamia"}};
   
   
   
System.out.println(prendi(S));
}
   



       public static boolean prendi(String [][] S)
{
boolean esiste =true;
for (int r=0; r<(S.length-1); r++)
{
for (int k=0; k<S[r].length+1 ; k++)
{
for (int r1=r+1; r1<S.length; r1++)
{
if(S[r][k]==S[r1][k])
return esiste;
}
}

}

return !esiste;
}

}


S.length è 6. Con r cicli da 0 all'ultimo elemento che è "minore di 6-1", ovvero 4. L'ultimo array non lo guardi nemmeno. D'altro canto, per r=0 S[r].length è 3. Con k cicli da 0 all'ultimo elemento che è "minore di 3+1", ovvero 3. E poiché sono zero based, 3 è out of bounds. Insomma, perchè "r<(S.length-1)" e "k<(S[r].length+1)"? Perché il -1 e il +1?

Nel terzo ciclo interno, stai ciclando sempre sull'array interno. Quindi nella condizione non devi usare S.length ma S.length[r]. Giusto però ciclare a partire da r+1, e non da 0, perchè il confronto con i valori precedenti lo abbiamo già fatto quando r era più piccolo. Ma trattandosi di array di stringhe, non devi usare "==" ma il metodo equals (non stai confrontando i puntatori!).

Infine, la variabile "esiste" può... non esistere, dato che se trovi una coppia di valori esci subito dalla funzione. Sarebbe stato diverso se la funzione fosse continuata dopo i cicli.

Suggerisco (non testato):
Code:
/*Scrivere un metodo che prenda in input una matrice bidimensionale frastagliata S di stringhe e
restituisca un boolean che indichi se esiste una colonna in S contenente due stringhe uguali (saltare le
eventuali stringhe mancanti).
 */

class Stringheuguali
{
public static void main(String[] args)
{
String [][] S={{"slurp","unaltroprogramma","benvenga"},
                     {"festival","marcocarta"},
    {"lambda4","sanremo"},
    {"cuccaraccia"},
    {"lamba","diverto","yeah","ilcuore","cancello"},
    {"msn","cenerella","mammamia"}};

System.out.println(prendi(S));
}

       public static boolean prendi(String [][] S)
{
for (int r=0; r<S.length; r++)
{
for (int k=0; k<S[r].length ; k++)
{
for (int r1=r+1; r1<S.length[r]; r1++)
{
if (S[r][k].equals([r1][k])) return true;
}
}

}

return false;
}

}

Logged

atrix0ne
Forumista
***
Offline Offline

Posts: 607


homo faber fortunae suae


« Reply #11 on: 22-02-2009, 20:14:00 »

JF mi daresti una mano pure a me?come lo posso modificare per renderlo utilizzabile per i frastagliati?
Code:
/*Questo programma implementa un metodo che prende in input un'array frastagliato di stringhe e restituisce un boolean che indica se esiste una colonna con due elemnti uguali */
public class Eesercizio9
  {
  public static boolean metodo(String [][] A)
    {
    int c,r1=0;
    int r=0;
    for(c=0;c<A[0].length;c++)
      {
      for(r=0;r<A.length;r++)
        {
        for(r1=0;r1<A.length && r1 !=r;r1++)
          {
          if(A[r][c].equals(A[r1][c]))
            {
            return true;
            }
          }
        }
      }
    return false;
    }
  public static void main (String [] args){

        String [][] S = {  {"aaa", "cccbc", "eee", "fff", "hhh"},
                           {"aaa", "eppp", "rrr","bbb","ccc"},
                           {"ttt", "vaa", "zzaa", "xx","abcbc"} };


System.out.println(metodo(S));
}
}
Logged

Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #12 on: 22-02-2009, 20:31:15 »

Ma.....tante cose non mi quadrano, io avevo messo al primo ciclo r<S.length -1 perchè pensavo che dato che il confronto lo faccio sulla riga successiva la r si fermerà alla penultima perchè c'è r1 che si occupa dell'ultimo posto, ad ogni modo  non funziona la tua soluzione, al compilatore non quadra questa istruzione:

Code:
(S[r][k].equals(S[r1][k]))
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
zElOtO
Forumista
***
Offline Offline

Gender: Male
Posts: 845



WWW
« Reply #13 on: 22-02-2009, 21:23:45 »

Scusa ma che caspio sarebbe
Code:
S.length[r]
l'errore è quello 
Logged

I computer sono incredibilmente veloci, accurati e stupidi. Gli uomini sono incredibilmente lenti, inaccurati e intelligenti. Insieme sono una potenza che supera l'immaginazione. (A. Einstein)

Damiano Cancemi
www.damianocancemi.com
www.nerdbren.com
www.nerdbren.com/blog
ɹǝǝ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 #14 on: 22-02-2009, 21:33:29 »

S.length è 6. Con r cicli da 0 all'ultimo elemento che è "minore di 6-1", ovvero 4. L'ultimo array non lo guardi nemmeno. D'altro canto, per r=0 S[r].length è 3. Con k cicli da 0 all'ultimo elemento che è "minore di 3+1", ovvero 3. E poiché sono zero based, 3 è out of bounds. Insomma, perchè "r<(S.length-1)" e "k<(S[r].length+1)"? Perché il -1 e il +1?

Nel terzo ciclo interno, stai ciclando sempre sull'array interno. Quindi nella condizione non devi usare S.length ma S.length[r]. Giusto però ciclare a partire da r+1, e non da 0, perchè il confronto con i valori precedenti lo abbiamo già fatto quando r era più piccolo. [...]

Infine, la variabile "esiste" può... non esistere, dato che se trovi una coppia di valori esci subito dalla funzione. Sarebbe stato diverso se la funzione fosse continuata dopo i cicli.
John, John, ma da quante ore non avevi dormito quando hai postato tutto questo?
Non puoi analizzare il problema principale (scrittura del metodo) basandoti su uno degli input nono.
Ma poi hai veramente letto il testo? Capisco che mi scrivi "non provato", ma almeno capiscilo cosa voleva fare il programmatore originale del codice boh.
Mi cadi proprio sulla programmazione !

Tornando in-topic (facciamo i seri, ora  ):

Supponiamo di aver calcolato la lunghezza del massimo array di stinghe in S.
Prima di tutto il primo ciclo va fatto sulle colonne, poiché è su una singola colonna che devo cercare due stringhe (in diversa posizione) uguali.
Dentro a tale ciclo bisogna ciclare con un primo for sulle righe da 0 a n-2 [espremi compresi] con n=numero di righe] e dentro a questo ciclo bisogna ciclare ancora con un altro for dalla riga successiva a quella selezionata al ciclo appena più esterno fino a n-1 [estremi inclusi], e verificare che le righe in tali posizioni (sempre che tali posizioni esistano, vista la natura possibilmente frastagliata dell'array bidimensionale) che ricordiamo stanno su una stessa colonna, contengano la stessa stringa.

Banalmente:
Code:
public static boolean prendi (String [][] S)
{
//si ricorda se ciò che cerchiamo esiste (true) oppure no (false)
boolean esiste = false;

//calcola l'indice massimo per una colonna (cioè la massima lunghezza degli array di stringhe in S)
int max_column = 0;
for (int r = 0; r < S.length; r++)
if (S [r].length > max_column) max_column = S [r].length);

//inizia la ricerca vera e propria
for (int c = 0; c < max_column && !esiste; c++) //per ogni colonna
for (int r1 = 0; r1 < S.length - 1 && !esiste; r1++) //per ogni coppia di righe (r1, r2) con 0 <= r1 < r2 <= S.length - 1
for (int r2 = r1 + 1; r2 < S.length && !esiste; r2++) //se tali colonne esistono in entrambe le righe, e il confronto da esito positivo, ne prendo nota
if (Math.min (S [r1].length, S [r2].length) >= c && S [r1][c].equals (S [r2][c])) esiste = true;
//restituisce il valore calcolato
return esiste;
}
Sturiàti genti .
« Last Edit: 22-02-2009, 23:49:39 by reversengineer » 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
Pages: [1] 2   Go Up
Print
Jump to: