Pages: [1] 2   Go Down
Print
Author Topic: Secondo metodo prova 7 aprile  (Read 2453 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
pippo
Apprendista Forumista
**
Offline Offline

Posts: 150



« on: 28-04-2009, 11:05:37 »

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

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #1 on: 28-04-2009, 19:01:16 »

Ho provato a leggere il tuo codice, ma non l'ho capito, te lo ricopio con alcune cose che ho notato e poi ti posto la mia soluzione che credo sia più semplice.

Quote
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++)
      {
      /*Penso che qui ci sia già un errore perchè così quando vai avanti con le righe la condizione rimane
                                                            fissa alla riga 0, cioè per le varie righe la colonna deve essere minore della lunghezza della prima riga,
                          per come tu hai scritto.Invece deve scendere!!!!!!!!!*/
        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)) //SINCERAMENTE....NON HO CAPITO COME FAI IL CONTROLLO
         &&(S1[j] [ i ].charAt(S1[j] [ i ].length()-1)==S1[k] [ i ].charAt(S1[k] [ i ].length()-1)))
            cont++;
           }
       
           if(cont==S.length) /*Anche io avevo scritto così, ma non credo funzioni sempre perchè non è detto che tu abbia elementi su tutta la colonna e l'esercizio
                                    chiede che la cosa valga anche per righe non complete, quindi come condizione di riferimento non va bene*/
           h=1;
                cont=1;
           }
   
      return h;
   }
   
   
   


Ecco la mia:
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 Provaaprile2
{

public static void main(String [] args)
{
String [][] S={{"abete","salutare"},
                    {"gioie","babbo","ignorante","sempre"},
    {"mamme","manual","sec","se"}};
   
   
String [][] S1={{"dele","idolatrie","no"},
                                      {"satur","hello","mother","re"},
                                      {"immane","bestie","mom","cuspide"}};


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


public static int prendiarray(String[][] S, String [][] S1)
{
int j=1;      //L'ho messo a uno perchè se è vero che ci sono queste righe con le stringhe che finiscono con la stessa lettera mi dà 1
int cont=0;  //un contatore
int i=0; //l'indice che serve per il controllo sul frastagliato........cosa indispensaile per non farlo uscire fuori



for(int k=0; k<S[i].length||k==S[i].length|| k>S[i].length; k++)
/*Allora, tutta quella pappardella di condizione se la leggi bene serve perchè nel codice vedi che le stringhe che ci interessano sono
    nella prima matrice sempre, se e nell'altra re, cuspide, se la condizione fosse diversa non farebbe il controllo su queste strighe perchè se diciamo
k<S[i].length non ci arriverà mai lì!!!!!! e la stessa cosa per la condizione con l'uguale*/



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

if(k<S[i].length) //qui verifica che la colonna sia minore della lunghezza della riga, serve per il problema dei frastagliati...ricordalo

if(S[r][k].charAt(S[r][k].length()-1)!=S1[r][k].charAt(S1[r][k].length()-1))

cont++; // LO INCREMENTA SE TROVA QUALCHE COLONNA SU CUI LE PAROLE FINISCONO CON LETTERE DIVERSE

i++; /*IMPORTANTE, NEL TUO CODICE NON ESISTEVA UNA COSA DEL GENERE, SERVE AD AUMENTARE
          L'INDICE COSI' SCENDENDO CAMBIA LA RIGA SU CUI FARE IL CONTROLLO,*/

}



      if(cont>0) /*Se cont è magigore di 0 allora le nostre matrici non avranno TUTTE le righe della colonna con la stessa lettera finale
                   allora poniamo j=-1*/
j=-1;
      else{
      j=1;       //Se troviamo già una colonan buona stoppiamo il ciclo, sennò potrebbe darsi che a un prossimo cambiando la situazione.....lo rimette a j=-1
      break;     //stop ciclo
            }
cont=0;       //dobbiamo azzerare tutto per fare il controllo sulle altre colonne e nuovamente la i va a 0 per ricominciare il controllo sulla riga 1 però di un'altra colonna
i=0;

      }
            return j;
       }
       
}





Spero capirai.... fammi sapere.
« Last Edit: 28-04-2009, 19:07:14 by guitarplaying » Logged

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

Posts: 150



« Reply #2 on: 29-04-2009, 10:46:21 »

 ciao Ho visto il tuo codice, però come fa a venirti? Mi pare, se non erro, che non ti viene in quanto il metodo chiedeva che tutte le stringhe di entrambe le rispettive colonne delle due matrici terminassero con lo stesso carattere boh..
cmq mi sorgeva un dubbio: come potrei fare a confrontare tutti gli elementi di una matrice? Quanti for sono necessari?
 ciao
Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #3 on: 29-04-2009, 20:15:45 »

Hai ragione.....ho contollato, pensavo funzionasse ma non l'avevo controllato con valori sbagliati, pardòn, comunque esattamente che tipo di controllo vorresti fare, se mi spieghi a parole come lo vorresti fare posso scriverti. Dipende da che tipo di confronto devi fare......
Logged

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

Posts: 150



« Reply #4 on: 29-04-2009, 22:45:01 »

voglio semplicemente confrontare tutti gli elementi della matrice..
Ad esempio: confrontare il primo elemento della matrice con il secondo, con il terzo e così via...
una soluzione potrebbe essere quella di utilizzare 4 for:
Quote
for(int i=0; i<S.length; i++)
      for (int j=0; j<S.length; j++)
        for (int a=i+1; a<S.length; a++)
         for (int b=0; b<S[a].length; b++)
però in questo modo confronto ogni elemento di una riga della matrice con tutti gli elementi delle riga successive alla riga in cui si trova questo elemento, non facendo invece il confronto con gli elemeti della propria riga.. testate
Non so se sono stato chiaro... [Emoticon] Asd
Logged
dani89
Apprendista Forumista
**
Offline Offline

Posts: 254



« Reply #5 on: 30-04-2009, 09:35:17 »

per controllare tutti gli elementi di una matrice bastano 3 for:
1) controllo righe esterno
2)controllo colonne
3)controllo righe interno
in questo modo confronti l'elemento della prima riga e prima colonna con l'elemento successivo e così via
Logged
pippo
Apprendista Forumista
**
Offline Offline

Posts: 150



« Reply #6 on: 30-04-2009, 15:41:11 »

dani, potresti scrivermi per favore i tre for... xchè ho un pò di confusione  testate..GRAZIE ciao
Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #7 on: 04-05-2009, 22:06:39 »

Ciao, scusa il ritardo con cui posto la soluzione, o almeno....  pray

Per quanto riguarda l'esercizio sul confronto degli elementi di una matrice, ho provato a farlo, però io l'ho pensato con 4 for, si può fare con 3 ma per non avere problemi con una variabile da incrementare l'ho fatto con 4, non l'ho provato con i frastagliati, ho fatto sulla matrice un paio di prove......io ci ho provato...se ci sono errori ti prego di farmelo notare....ti saluto e scrivi pure se hai altri dubbi!!!



Code:
class Confronto
{

public static void main(String []args)
{
int [][]S={{1,3,7,5},
               {43,76,122,432},
       {10,0,21,55},
       {11,12,13,79}};
       System.out.println(Confronta(S));
}





public static boolean Confronta(int [][]S)
{
boolean uguali=false;

for(int r=0; r<S.length; r++) //La riga che rimane ferma sull'elemento da controllare
{
for(int c=0; c<S[r].length; c++) //La colonna che rimane ferma sull'elemento da controllare
{
for(int r1=0; r1<S.length; r1++) //La riga che confronta un altro elemento a partire dalla stessa riga in poi
{
for(int c1=0; c1<S[r1].length; c1++) //La colonna che confronta l'altro elmento da valutare
{
if(c1==c && r1==r) //se le colonne coincidono e anche la riga incrementiamo c1 sennò confronteremmo lo stesso elemento
if(c1!=S[r1].length-1) //necessario perchè sennò potrebbe poi fare un confronto con c1 che va indexOutofBounds, fuori dall'array
c1= c+1;
else break;                //sennò si può fermare perchè altrimenti potremmo ad esempio confrontare alla prima riga l'elemento 5 con se stesso, e sarebbe sbagliato quindi break
if(S[r][c]==S[r1][c1])  //se sono uguali metti a true
uguali = true;
}
}
}
}
return uguali;
}

}





 
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 #8 on: 04-05-2009, 22:09:04 »

Avevo provato a cambiare anche l'esercizio mio che avevo postato sull'ultima prova dei metodi, controlla anche questo se risulta giusto o meno, ripeto, fammelo notare se ho sbagliato qualcosa, io ci ho provato..

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 Provaaprile2
{

public static void main(String [] args)
{
String [][] S={{"cena","sempre"},
                    {"bamba"},
    {"miraggio","cene","mago"}};
   
   
   
String [][] S1={{"dela","idolatrie"},
                                      {"saturo"},
      {"memole","ciabatta","odia"}};


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


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

for(i=0; i<S.length; i++)
{
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++;
else
{
cont2++;
break;}

i++;
}
                   if(cont2==0)
   {
   j=1;
   break;
   }
   else j=-1;
       i=0;
      cont2=0;
}
  break;

}

return j;
}

}










 pray
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: 05-05-2009, 11:51:59 »

  Il tuo primo codice sul confronto funziona benissimo, anche sul frastagliato ok
però non capisco bene l'istruzione break.
potresti spiegarmi quale è la funzione e quando si usa e in che modo funziona??
GRAZIE
P.S: adesso do un'occhiata al tuo secondo metodo e ti faccio sapere... ok [Emoticon] Asd

Ho visto il tuo codice relativo alla prova di aprle...purtroppo il tuo metodo non funziona in quanto restituisce uno quando un elemento della colonna termina con lo stesso carattere  del rispettivo elemento della seconda matrice; invece il metodo vuole che restituisca 1 quando TUTTI gli elementi di una colanna terminano con lo stesso carattere comune anche a tutti gli altri elementi della seconda matrice nella stessa colonna.....
 testate testate un pò complicato come metodo [Emoticon] Asd
il codice che ho postato io funziona benissimo, ma purtroppo non con le matrici frastagliate... 
« Last Edit: 05-05-2009, 15:37:17 by pippo » Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #10 on: 05-05-2009, 20:42:10 »

Eilà...allora per quanto riguarda l'esercizio che non funziona hai ragione, non mi ero accorto che ci potevano essere altri errori, vedrò semmai stasera sul tardi di rifarlo.
Invece per quello giusto sul confronto, mi pare non avevi capito la funzione del break:

Praticamente supponiamo che tu hai:
{3,5,4,6,8,9}
 {98,78,65,67,32,12}

abbiamo per esempio r=0 e c =5 quindi prendiamo la prima riga e l'elmento 9 alla fine.
e abbiamo anche per il confronto r1=0 e c1 =5 supponiamo che siamo arrivati qui a questo punto.
ma per farti capire:
il codice dice :
                                        if(if(c1==c && r1==r)
                                                            //se le righe e le colonne coincidono
                                 tralascia un attimo questo if.........................
                                              c1=c+1

                                                //aumenta c1 di uno perché se ad esempio si verifica questa condizione confronterebbe l’elemento 6 con se stesso se fai caso. Perché coincidono la riga di partenza e la sua colonna con la riga e la colonna di confronto, allora la sposta di 1…..

Per quanto riguarda l’altro if che avevo detto di tralasciare riprendiamolo dice:

if(c1!=S[r1].length-1)

cioè se la colonna c1 non è arrivata alla fine allora c1= c+1;

sennò break, perché altrimenti se ci pensi uscirebbe dalla matrice la colonna
sarebbe il caso di quello che ho messo in grassetto qui:

{3,5,4,6,8,9}
 {98,78,65,67,32}

Vedi così dal 9 se facessimo c1=c+1 uscirebbe fuori, sappiamo che non abbiamo altro da confrontare per siamo alla fine…allora…..break.

Dimenticavo, con le condizione che ho messo la cosa di spostare la colonna non succede se le righe sono diverse, perché in quel caso ovviamente abbiamo la stessa colonna MA NON LA STESSA RIGA quindi gli elementi vanno confrontati regolarmente.

Se non ti è chiaro dimmelo pure, non sono molto bravo a spiegare purtroppo, ti faccio sapere per l’altro esercizio.


 

« Last Edit: 05-05-2009, 20:46:56 by guitarplaying » 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 #11 on: 06-05-2009, 09:23:00 »

Per l'altro esercizio, mi sono reso conto che è davvero davvero difficile, ho fatto tanti altri tentativi ma non riesco ad uscirne fuori, mi spiace ma non so come fare....mi arrendo, anche a me è rimasta questa lacuna, posto un altro intervento nella speranza che qualcuno ci sappia aiutare, a presto.
Logged

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

Posts: 150



« Reply #12 on: 06-05-2009, 13:08:45 »

 
Grazie guitar, sei stato chiarissimo ok ok
volevo però capire: quando si arriva all'istruzione break, dopo questa istruzione dove si va??
cmq ho relalizzato il codice che ovvia a questo problema, facendo a meno della clausola break.(stasera te lo posto, così gli dai un'occhiata) ok
Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #13 on: 06-05-2009, 18:38:33 »

Dopo l'istruzione break, dato che la colonna della riga r1, cioè quella che serve per il confronto, è arrivata alla fine, il ciclo for che incrementava c1  non viene più eseguito perchè la condizione è falsa, e si incrementa r1.
Logged

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

Posts: 150



« Reply #14 on: 06-05-2009, 19:04:14 »

quindi in pratica il break fa uscire dal ciclo for, e ritornare al ciclo for precedente,cioè quello che incrementa r1... yoh
Logged
Pages: [1] 2   Go Up
Print
Jump to: