Pages: [1]   Go Down
Print
Author Topic: Esercizio dell'ultima prova metodi  (Read 1533 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: 17-04-2009, 21:42:19 »

Purtroppo non siete riusciti a liberarvi di me...mi spiace ragazzi  [Emoticon] Asd

Ho provato a fare questo esercizio da capo, come mai sbaglio sempre la stessa cosa, arrayindexoutofbounds???


Code:
/*Scrivere un metodo che prenda in input due array bidimensionali di stringhe frastagliati S ed S1 identici nella
struttura, e restituisca un indice j che indichi se entrambe le colonne j-esime di S ed S1 (anche non complete)
sono tali che tutte le s tringhe in esse terminano con lo stesso carattere(comune ad entrambe le colonne).
Se non esistono tali colonne allora j=-1 */




class Ultimaprova2
{
public static void main(String [] args)
{
String [][] S={{"salute","impressionante","semplice"},
    {"ovvio"},
    {"inutile","adatto","mostro"}};
   
String [][] S1={{"ovviamente","salutare","immediato"},
                                    {"ovvio"},
                                    {"barbaro","amore","cielo"}};

                System.out.println(prendiarray(S,S1));
}    


public static int prendiarray(String[][] S, String[][] S1)
{
int j=0;
int cont=0;


S1=new String[S.length][];

for(int k=0; k<S[0].length; k++)
{
S1[0]=new String[S[0].length];

for(int r=0; r<S.length; r++)
{

if(S[r][k].charAt(S[r][k].length())==S1[r][k].charAt(S1[r][k].length()))
cont++;
if(cont==S.length)
j=1;
else j=-1;
}
}

return j;
}

}
« Last Edit: 18-04-2009, 15:43:57 by guitarplaying » Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
ɹǝǝ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: 17-04-2009, 23:20:42 »

Code:
/*Scrivere un metodo che prenda in input due array bidimensionali di stringhe frastagliati S ed S1 identici nella
struttura, e restituisca un indice j che indichi se entrambe le colonne j-esime di S ed S1 (anche non complete)
sono tali che tutte le s tringhe in esse terminano con lo stesso carattere(comune ad entrambe le colonne).
Se non esistono tali colonne allora j=-1 */
Al solito, come, con dispiacere, sto vedendo già da un po' a dire il vero, il problema è gravemente mal descritto.
Innanzitutto:
Quote
restituisca un indice j che indichi se entrambe le colonne j-esime
andrebbe sostituito dal corretto:
Quote
restituisca un indice j che indichi CHE entrambe le colonne j-esime
In secondo luogo il testo non specifica cosa bisogna fare se esiste più di un indice di colonna per cui la condizione che ogni sua stringa (in entrambi gli array bidimensionali frastagliati) termini con uno stesso carattere.

Per la correzione/risoluzione di questo esercizio, pertanto, farò la seguente assunzione:
- la funzione restituisce il più piccolo indice di colonna per cui vale che tutte le stringhe
  di quella colonna (sia nel primo sia nel secondo array bidimensionale frastagliato) terminano con lo stesso carattere

Adesso, descriverò gli errori che ho trovato nel codice (sempre fatte salve le considerazioni e le assunzioni qua sopra), tramite commenti.

Code:
public static int prendiarray(String[][] S, String[][] S1)
{
int j=0;
//per l'uso che si fa di "cont", esso andrebbe inizializzato a 0 e non a 1
int cont=1;


//ERRORE MOLTO GRAVE: con questa assegnazione perdi completamente il secondo array bidimensionale in input
S1=new String[S.length][];


//questo ciclo (sulle colonne) andrebbe fatto contando prima
//le colonne poiché gli array sono (potenzialmente) frastagliati
//e non fino a S[0].length (che potrebbe non essere la lunghezza massima delle righe di S)
for(int k=0; k<S[0].length; k++)
{
//errore: questa seconda assegnazione non è motivata
S1[0]=new String[S[0].length];

//errore: in questo punto del codice andrebbe riazzerato il valore di "cont"

for(int r=0; r<S.length; r++)
{
//doppio errore: il metodo charAt di String accetta valori 0-based come indice, quindi
//l'indice S [r][k].length () è fuori dall'intervallo valido (doppio errore perché usato due volte)
if(S[r][k].charAt(S[r][k].length())==S1[r][k].charAt(S1[r][k].length()))
cont++;

//questo tipo di controllo su "cont" andrebbe fatto fuori almeno da questo ciclo
//o ancora meglio fuori da tutti e due i cicli (con opportuna condizione congiunta nel ciclo for più esterno)
if(cont==S.length)
j=1;
else j=-1;
//sempre in queste 3 righe di codice si è malinterpretato il significato di "j".
//j non vale "1" quando la condizione su una certa colonna (chiamiamola "c") è valida
//ma vale proprio "c".
//il valore "-1", poiché non è un indice valido di elemento di array, è sfruttato proprio
//per indicare l'inesistenza di tale indice di colonna.
}
}

return j;
}

}

Saluti  .
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
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #2 on: 18-04-2009, 13:18:21 »

Quote
      //ERRORE MOLTO GRAVE: con questa assegnazione perdi completamente il secondo array bidimensionale in input
      S1=new String[S.length][];


Io ho visto che in alcuni esercizi veniva fatto quest'assegnamento per indicare che la lunghezza delle due matrici è uguale....poi mi hai detto che bisognerebbe fare il conto delle colonne giustametne perchè sono frastagliati, ma siccome devo incrementare le righe mi serve dopo mettere il for con le righe, non so fare il conto senza il ciclo con le righe prima di quello con le colonne. solitamente lo facevo:

for(int r=0; r<array.length; r++)
for(int k=0; k<array[r].length; k++)

ma come lo posso fare lì?

L'errore della charAt qual'è? non ho capito...
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
ɹǝǝ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: 21-04-2009, 15:30:19 »

L'errore della charAt qual'è? non ho capito...
Pensavo di essere stato abbastanza chiaro nel commentare il codice, ma ora evidenzierò meglio tale commento:

il metodo charAt di String accetta valori 0-based come indice, quindi
l'indice S [r][k].length () è fuori dall'intervallo valido

Code:
if(S[r][k].charAt(S[r][k].length())==S1[r][k].charAt(S1[r][k].length()))
(è codice tuo quello qui sopra, nota bene)

Poichè l'intervallo valido per gli indici, come tu stesso hai scritto in quest'altro post:
la charAt accetta valori da(0, a .length-1)

 
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
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #4 on: 21-04-2009, 19:53:43 »

Ho scritto questo codice ma non riesco a capire perchè mi dà errore:

Il metodo è sempre quello precedente.

Code:
class Provaaprile2
{

public static void main(String [] args)
{
String [][] S={{"abete","salutare","io"},
                    {"idolo"},
    {"mamma","manuale"}};
   
   
String [][] S1={{"idolo","idolatria","lamina"},
                                      {"saturo"},
                                      {"immane","bestia"}};


System.out.println(prendiarray(S,S1));
}      
   
   


public static int prendiarray(String[][] S, String [][] S1)
{
int j=0;
int cont=0;
int i=0;

S1=new String [S.length][];

for(int k=0; k<S[i].length; k++)
{
for(int r=0; r<S.length; r++)
{

if(k<S[i].length)

if(S[r][k].charAt(S[r][k].length()-1)==S1[r][k].charAt(S1 [r][k].length()-1))
cont++;
i++;
}

      if(cont==S.length)
j=-1;
cont=0;
i=0;

}

return j;
}

}
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
ɹǝǝ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 #5 on: 22-04-2009, 02:10:08 »

È tardi e non ho molto tempo per controllare il tuo codice bene, mi sono fermato appena ho visto questa riga:
Code:
S1=new String [S.length][];
Come mai hai riscritto esattamente l'istruzione che prima ti avevo segnalato come ERRORE MOLTO GRAVE ?
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
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #6 on: 22-04-2009, 20:36:17 »

Giusto, infatti funziona senza quella istruzione.
Ora ho solo una cosa da capire, perchè quello era un errore, cioè se io metto:
S1=new String[S.length][]

dovrebbe significare che S1 ha la stessa dimensione di S,
ricordo in altri casi di avere visto codice simile a questo, oppure un'altra istruzione che ho visto è:

S1[r]=new String[S[r].length]

Perchè la prima mi dà erore e in altri esercizi può andare?

Grazie mille
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
ɹǝǝ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 #7 on: 23-04-2009, 00:11:49 »

Ora ho solo una cosa da capire, perchè quello era un errore, cioè se io metto:
S1=new String[S.length][]

dovrebbe significare che S1 ha la stessa dimensione di S,
Mmm... temo che non siano riusciti a spiegarti una cosa semplicissima chiamata "assegnazione" in Programmazione 1, oppure non l'hai capita tu.

In entrambi i casi, io porrò rimedio ora :

Allora: una istruzione Java del tipo
<a> = <b>;
(ove <a> e <b> sono due espressioni rispettivamente di tipo variabile e "qualcosa che può essere valutato in un valore del tipo della variabile <a>)
fa la seguente cosa:
1) si valuta <b>, cioè si procede a ottenere un singolo preciso esatto deterministico valore partendo da una espressione lunga e complessa quanto vuoi;
2) si copia il valore ottenuto al punto 1 dentro la variabile <a>, perdendo (cioè sovrascrivendo) qualsiasi altro valore che fosse già presente all'interno della variabile <> precedentemente all'esecuzione di questa istruzione.

Ecco nel tuo caso avviene la seguente cosa:
Code:
S1=new String[S.length][]
S1 sarebbe <a> e new String[S.length][] sarebbe <b>.
Eseguiamo il processo descritto prima:
1) si valuta new String[S.length][], e cioè non fa altro che creare uno nuovo oggetto di tipo matrice bidimensionale di String[][] in cui la prima dimensione è S.length, o detto in altri termini in modo ancora più preciso, il tipo è array con S.length posizioni i cui elementi sono di tipo String[], cioè i cui elementi sono a loro volta array di String.
2) si assegna alla variabile S1 (che ricordiamo è uno dei parametri formali di questo metodo, e in questo caso un parametro di INPUT per il metodo stesso, cioè la cui informazioni va semplicemente analizzata per costruire l'OUTPUT) il valore ottenuto al punto 1).

Ricordiamo che in S1, prima dell'esecuzione della riga di codice appena citata, c'era presente una matrice passata al metodo ad esempio nel main.

Oh dannazione, cosa è successo? Abbiamo appena sovrascritto un valore passato in input senza neanche averlo usato!!! Questo è un ERRORE MOLTO GRAVE.

Di conseguenza la frase banale "S1 ha la stessa dimensione di S" non rappresenta esattamente ciò che quella istruzione ha fatto.

Quote
ricordo in altri casi di avere visto codice simile a questo
Ora, non so in che codici di esempio hai visto una cosa del genere (parlo del fatto di sovrascrivere i valori passati in input senza nemmeno averli mai usati), ma probabilmente ti sarai confuso: penso che in quei codici S1 era semplicemente una variabile locale usata nel metodo per calcoli intermedi.

Hai capito l'errore ora?
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
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #8 on: 23-04-2009, 13:45:12 »

Ho rivisto quei codici dove dicevo di aver visto quel tipo di istruzione, si ho anche notato che in quel caso le matrici su cui effettuavo quelle operazioni non erano di input, ora va bene, grazie reverse, posso considerarti ufficialmente padre adottivo!!!  [Emoticon] Asd
Logged

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

Posts: 150



« Reply #9 on: 28-04-2009, 11:02:57 »

Ragazzi ho svolto il secondo esercizio della prova d'esame del 7 aprile.
Il metodo funziona,solo che non va quando le matrici sono frastagliate..  Ancora non ho capito bene come funzionano le frastagliate....Ecco il codice
P.S. qualcuno mi potrebbe spiegare come farlo funzionare con le matrici frastagliate..grazie

Quote
/*Scrivere un metodo che prenda in input due array bidimensionali di stringhe frastagliati S ed S1
identici nella struttura, e restituisca un indice h=1 che indichi se entrambe le colonne j-esime
di S ed S1 (anche non complete) sono tali che tutte le stringhe in esse terminano con lo stesso
carattere (comune ad entrambe le colonne). Se non esistono tali colonne h= -1.*/

class Esercizio2
{
   public static int metodo (String[][] S,String[][]S1)
   {
      int h=-1;
      int j=0;
      int cont=1;
      for(int i=0; i<S[0].length; i++)
      {
        for(int k=j+1; k<S.length; k++)
           {
         if((S[j] [ i ].charAt(S[j] [ i ].length()-1)==S[k] [ i ].charAt(S[k] [ i ].length()-1))
         &&(S[k] [ i ].charAt(S[k] [ i ].length()-1)==S1[j] [ i ].charAt(S1[j] [ i ].length()-1))
         &&(S1[j] [ i ].charAt(S1[j] [ i ].length()-1)==S1[k] [ i ].charAt(S1[k] [ i ].length()-1)))
            cont++;
           }
       
           if(cont==S.length)
           h=1;
                cont=1;
           }
   
      return h;
   }
   
   
    public static void main(String [] args) {
 String [][]S = {{ "aba" , "defs"} ,
            { "lmc" , "ops"} ,
                      { "rsc" , "uvs"} ,
                      { "jkc" , "aassss"},
            { "dsi" ,  "dass"}};
                 
 String [][]S1 = {{ "abc" , "des"} ,
                        { "lmc" , "ops"} ,
                        { "rsc" , "uvs"} ,
                        { "jkc" , "assss"},
         { "cis"  , "dars"}};
  System.out.println (metodo (S,S1));
  }
}
Logged
Pages: [1]   Go Up
Print
Jump to: