Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: Daréios89 on 22-02-2009, 16:41:23



Title: Un metodo dove non capisco cos'è in più o in meno
Post by: Daréios89 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;
}

}



Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: atrix0ne on 22-02-2009, 17:20:36
uffa io lo so risolvere solo se nn è frastagliata  .poverinoi


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: Daréios89 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....:(


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: atrix0ne on 22-02-2009, 17:24:11
solo perchè le righe dell'array variano cpt?


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: fedyfausto on 22-02-2009, 17:24:39
nemmeno io XD


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: Daréios89 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???


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: Daréios89 on 22-02-2009, 17:31:27
Uffa voglio riuscire a capire la programmazione!!!

 :"-(  :"-(  :"-(  :"-(  :"-(  :"-(  :"-(  :"-(  :"-(


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: atrix0ne 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));
}
}


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: Daréios89 on 22-02-2009, 17:55:59
Ti ringrazio ugualmente....Sapete per caso a che ora e dove è l'esame del 25?


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: isuccia89 on 22-02-2009, 18:24:35
Ti ringrazio ugualmente....Sapete per caso a che ora e dove è l'esame del 25?
.quoto


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: JF 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;
}

}



Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: atrix0ne 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));
}
}


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: Daréios89 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]))


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: zElOtO on 22-02-2009, 21:23:45
Scusa ma che caspio sarebbe
Code:
S.length[r]
l'errore è quello  .whistling


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ 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 .rido!

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

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 .ciaociao.


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: JF on 23-02-2009, 00:15:37
Scusa ma che caspio sarebbe
Code:
S.length[r]
l'errore è quello  .whistling

E' uno dei tanti... Reverse mi ha fatto notare che ho preso per buona la prima soluzione che ho visto, correggendo solo la "grammatica", ma in effetti quella soluzione controlla i doppioni per riga e non per colonna. La sua soluzione invece centra il problema (controlla per colonna e non per riga).

Reverse perchè riprendi la variabile "esiste", controllando il suo valore in tutti i cicli, invece di usare direttamente "return true"?

Credo che la condizione da verificare sia "Math.min (S [r1].length, S [r2].length) > c", non >= (giusto?). In ogni caso sarebbe equivalente ma un po' più intuitivo a mio parere riscrivere il controllo così:

Code:
if (c<S [r1].length  &&  c<S [r2].length  &&  S[r1][c].equals(S[r2][c])) return true;


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 23-02-2009, 01:19:18
Reverse perchè riprendi la variabile "esiste", controllando il suo valore in tutti i cicli, invece di usare direttamente "return true"?
Ehm... questa è una tecnica che evita di interrompere bruscamente il controllo di flusso, che ho appreso sulla pelle quando ho fatto un parser per progammi ANSI-C (C99) scritto sempre in ANSI-C (C99) per Progetto Software :boh.
È molto utile in caso di debug, anche se in effetti per un codice così piccolo è difficile non notare i bug :boh.

Quote
Credo che la condizione da verificare sia "Math.min (S [r1].length, S [r2].length) > c", non >= (giusto?). In ogni caso sarebbe equivalente ma un po' più intuitivo a mio parere riscrivere il controllo così:

Code:
if (c<S [r1].length  &&  c<S [r2].length  &&  S[r1][c].equals(S[r2][c])) return true;
Corretto, non ho considerato che la lunghezza è sempre 1+l'indice massimo |-O. Concordo anche sulla intuitività della seconda espressione :pray.

Ciao .ciaociao.


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: Daréios89 on 23-02-2009, 14:53:18
Scusate ragazzi ho provato adesso a riscrivere qualcosa ma mi dà sempre il solito errore outofbounds

Ho scritto questo:

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 k=0; k<S[0].length; k++)
{
for (int r=0; r<(S.length-1); r++)
{
for (int r1=r+1; r1<S.length; r1++)
if (S[r][k].equals(S[r1][k]))
return esiste;

}

}

return !esiste;
}

}



Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: CollegaCaparezza on 23-02-2009, 16:23:12
Colleghi una domanda. Due righe r1 ed r2 si dicono compatibili se esiste una stringa in r1 e contemporaneamente la sua inversa in r2. Come faccio a capire quale è il valore inverso della stringa????
Help  :-)| :-)| :-)|


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: ShiShi on 23-02-2009, 16:38:20
Io senza usare il metodo equals l'ho svolto così, solo che non so come saltare le stringhe mancanti...


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). */

public class Prova {
    public static void main (String[]args) {
        String[][]S = {{"abcd", "efgg", "il"},
                        {"mno", "pqrst"},
                        {"uvz", "wy", "il"}};
        System.out.println (metodo (S));
        }

public static boolean metodo (String[][]S) {
    boolean prova = false;
    for (int r=0; r<S.length; r++) {
      for (int r1=r+1; r1<S.length; r1++)
          for (int c=0; c<S[r].length-1; c++)
              for (int i=0; i<S[r][c].length() && i<S[r1][c].length(); i++)
                      if (S[r][c].charAt(i) == S[r1][c].charAt(i))
                          prova = true;
                  }
                  return prova;
              }
}
       


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: atrix0ne on 23-02-2009, 17:01:52
equals è piu' semplice ed efficace e ti permette di non usare i for per il charat .winkquindi se non è vietato usarlo xkè non utilizzarlo? .bah


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: zElOtO on 23-02-2009, 17:04:06
equals è piu' semplice ed efficace e ti permette di non usare i for per il charat .winkquindi se non è vietato usarlo xkè non utilizzarlo? .bah
.quoto


Title: Re:Un metodo dove non capisco cos'è in più o in meno
Post by: ShiShi on 23-02-2009, 17:05:52
infatti se non è vietato lo uso, è per avere sempre un'alternativa  :-OK