Pages: [1] 2   Go Down
Print
Author Topic: Esercizio Prima Prova in Itinere  (Read 3197 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Impact
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 107



« on: 12-01-2011, 17:07:22 »

Ragazzi non riesco a trovare una soluzione corretta... chi mi da una mano?

Code:
/*
Scrivere un metodo che prenda in input un array A di Stringhe e restituisca in output un array B di Stringhe con lo stesso numero di Stringhe
in cui ogni stringa è ottenuta dalla corrispondente stringa in A eliminando tutti i caratteri piu a sinistra che si ripetono (es. "abcdabgha" --> "cdbgha")
Tutti i caratteri sono minuscoli.
*/

public class Es02Bis
{
public static void main (String [] args)
{
String [] stringhe = {"abcdabgha"};
String [] B = metodo(stringhe);
for (int i=0;i<B.length;i++) System.out.println(B[i]);
}

public static String [] metodo (String [] A)
{
char temp;
char temp2;
String [] B = new String [A.length];
//scansiono l'array A
for (int i=0;i<A.length;i++)
{
B[i] = "";
//scansiono la parola
for (int j=0;j<A[i].length();j++)
{
temp = A[i].charAt(j);
for (int m=j+1;m<A[i].length()-1;m++)
{
temp2 = A[i].charAt(m);
if (temp != temp2)
        B[i] = B[i] + A[i].charAt(m);
}
}
}
return B;
}
}
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: 12-01-2011, 17:52:30 »

L'idea di fondo è corretta, però l'ultimo ciclo for, quello più interno, dovrebbe accodare A[i].charAt(j) (cioè temp) a B[i], e dovrebbe farlo:
-solo 1 volta (fissato j)
-solo se non si ripete in alcun indice m (con m > j)

mentre nel tuo codice, ad essere accodato è erroneamente A[i].charAt(m) e viene accodato
-più volte (fissato j)
-ogni qual volta non è uguale a temp.
 
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 #2 on: 12-01-2011, 23:04:35 »

io lo farei così, forse un procidemento un pò lungo però a mio avviso dovrebbe funzionare bene:

Code:
public static String [] metodo (String [] A)
{
String [] B = new String [A.length];
//scansiono l'array A
for (int i=0;i<A.length;i++)
{
B[i] = "";
//scansiono la parola
for (int j=0;j<A[i].length();j++)
{
                        boolean trovato=false;
for (int m=j+1;m<A[i].length() && !trovato;m++)
{
if(A[i].charAt(j)==A[i].charAt(m))
                                       trovato=true;
}
                        if(!trovato)
                             B[i]+=A[i].charAt(j);
}
}
return B;
}
}

in pratica la mia idea è prendere la parola e controllare un carattere con tutti quelli alla sua destra. se nn lo trova mai lo può aggiungere nella nuova stringa creata, altrimenti si va avanti col controllo.
Logged

"Che la Forza sia con Te"
ɹǝǝ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: 12-01-2011, 23:44:38 »

C'è anche un'altra opzione che avevo in mente io, alla fine è sempre lo stesso il risultato.
Quando creo la nuova stringa, inizialmente vuota, scorro i caratteri della stringa originale da destra a sinistra: se il simbolo letto non è ancora stato inserito nella stringa nuova, lo inserisco in testa, altrimenti lo ignoro  .
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
Impact
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 107



« Reply #4 on: 14-01-2011, 11:28:34 »

Grazie ragazzi, siete stati utilissimi! 
Logged
Impact
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 107



« Reply #5 on: 14-01-2011, 15:52:20 »

Ragazzi e di questo che mi dite?

Code:
/*
Scrivere un metodo che prenda in input una matrice A di float ed un float positivo epsilon,
e restituisca un boolean che indichi se esistono in A tre elementi distinti la cui somma
dei rispettivi valori assoluti è circa uno a meno dell'errore epsilon.
*/
public class Es01
{
public static void main (String [] args)
{
        float[][] numeri = new float[3][3];

        // ----- VALORI DA MODIFICARE PER TESTARE IL FUNZIONAMENTO DEL PROGRAMMA
        numeri[0][0] = 1.2221f;
        numeri[0][1] = 2.521f;
        numeri[0][2] = 5.245f;
        numeri[1][0] = 2.0f;
        numeri[1][1] = 4.25f;
        numeri[1][2] = 4.0f;
        numeri[2][0] = 6.25f;
        numeri[2][1] = 7.26f;
        numeri[2][2] = 2.222258f;
        float e = 1f;
        // ---------------------------
       
        boolean uguali = metodo(numeri, e);
        System.out.println((uguali?"Ci sono " : "Non ci sono ") + "numeri uguali o quasi nella matrice");
}

public static boolean metodo (float [][] A, float e)
{
boolean trovati = false;
//colonne
for (int j=0;j<A[0].length;j++)
     {
      for (int i=0;i<A.length;i++)
     {
      for (int p=0;p<A.length;p++)
{
  for (int m=0;m<A.length;m++)
{
  if (((Math.abs(A[i][j]+A[p][j]+A[m][j])-1)<e) && (i!=p && i!=m && p!=m))
{
  trovati = true;
  if (trovati)
     return true;
  i=A.length;
  p=A.length;
  m=A.length;
}
}
}
     }
     }
return false;
}
}
Logged
Impact
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 107



« Reply #6 on: 17-01-2011, 13:39:19 »

Nessuno per quanto riguarda il secondo postato?
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 #7 on: 17-01-2011, 18:10:32 »

Ragazzi e di questo che mi dite?
Il tuo codice "restituisce un boolean che indica se esistono in A tre elementi distinti nella stessa colonna la cui somma dei rispettivi valori assoluti è circa uno a meno dell'errore epsilon", quindi è errato.

Inoltre, ti voglio fare notare alcuni errori di codice superfluo, qualora dovessi aggiustare il fatto che bisogna controllare colonne qualsiasi (e non la stessa colonna).

Code:
if (((Math.abs(A[i][j]+A[p][j]+A[m][j])-1)<e) && (i!=p && i!=m && p!=m))
{
    trovati = true;
    if (trovati)
        return true;
    i=A.length;
    p=A.length;
    m=A.length;
}
In questo blocco then di if, si vede che quando una certa condizione si verifica, allora tu
1) imposti la variabile trovati a true;
2) se la variabile trovati è a vero, fai il return di true: tuttavia, a causa di 1), la variabile trovati è SEMPRE a true in quel punto del codice, quindi quest'ultimo if è inutile;
3) dopo il return (che in virtù di 2) avviene sempre) tenti di assegnare dei valori a i, p, m: a parte che non si sa veramente a cosa debbano servire dopo questi nuovi valori (visto che sei in un blocco che si propone di terminare la computazione restituendo un valore), in ogni caso queste tre istruzioni non saranno mai eseguite, proprio perché prima di eseguirle viene eseguito SEMPRE un return;

Ti consiglio di sistemare per prima cosa, comunque, l'errore di controllare solo la singola riga (invece che righe qualsiasi), eventualmente dopo posterò un codice (che ho già pronto) che risolve il problema.
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
Stardust
Apprendista Forumista
**
Offline Offline

Posts: 450


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


« Reply #8 on: 20-01-2011, 15:06:54 »

Ho un dubbio  pray i valori devo essere uguali nel senso che la loro differe deve essere a meno dell' errore "E" e quindo qst nn vuol dire che i valori trovati devo essere devo essere uguali ma basta ripettare la differenza giusto?
Logged

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

Gender: Male
Posts: 107



« Reply #9 on: 21-01-2011, 16:54:20 »

Uhm... come faccio in questo caso a controllare colonne qualsiasi? Non riesco a capirlo..
Logged
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #10 on: 23-01-2011, 05:08:13 »

Ragazzi quindi avete idea di come si faccia l'esercizio della prova in itinere?? se avete la soluzione potete pubblicarla per favore
?
/*
Scrivere un metodo che prenda in input una matrice A di float ed un float positivo epsilon,
e restituisca un boolean che indichi se esistono in A tre elementi distinti la cui somma
dei rispettivi valori assoluti è circa uno a meno dell'errore epsilon.
*/
Logged
StephCT
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #11 on: 23-01-2011, 14:04:14 »

Code:
public static boolean metodo (float [][] A, float e)
{
boolean trovati = false;
for(int i=0;i<A.length && !trovati;i++)
for(int j=0;j<A[i].length && !trovati;j++)
for(int m=i;m<A.length && !trovati;m++)
for(int n=((m==i) ? j+1 : 0);n<A[m].length && !trovati;n++)
for(int x=m;x<A.length && !trovati;x++)
for(int y=((x==m) ? n+1 : 0);y<A[x].length && !trovati;y++)
if(Math.abs(A[i ][j]+A[m][n]+A[x][y])-1<e)
trovati=true;
return trovati;
}

reverse docet  yoh
in pratica secondo l'interpretazione bisognava trovare tre elementi nella matrice il cui valore assoluto della somma -1 fosse minore di epsilon. quindi hai bisogno di sei cicli per poter confrontare tutte le possibili terne della matrice. gli operatori ternari usati x assegnare gli indici di colonna n ed y sono fatti a posta per evitare di dover ricontrollare un elemento con i suoi precedenti
Logged

"Che la Forza sia con Te"
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #12 on: 23-01-2011, 16:38:38 »

Ti ringrazio tantissimo però è troppo difficile e non mi entra in testa...Caspita con tutti questi cicli è difficile non confondersi  .......
« Last Edit: 23-01-2011, 16:45:44 by salvopuglisi » Logged
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #13 on: 23-01-2011, 16:44:10 »

Faccio così Ragazzi siccome non riesco a capirlo modifico il testo dell'esercizio rendendolo meno complesso sperando di capire quello più facile e poi quello più complesso:

/*
Scrivere un metodo che prenda in input una matrice A di float ed un float positivo epsilon,
e restituisca un boolean che indichi se esistono in A 2 elementi distinti la cui somma
dei rispettivi valori assoluti è circa uno a meno dell'errore epsilon .
*/
« Last Edit: 23-01-2011, 16:49:01 by salvopuglisi » Logged
StephCT
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #14 on: 23-01-2011, 17:30:13 »

la prendo come missione fartelo imparare xD allora il fatto è questo, quando devi fare un confronto di uguaglianza o simili hai bisogno di vedere con quanti numeri diciamo contemporaneamente devi lavorare. quindi se ti chiede per esempio di trovare un elemento più volte in una matrice o array che sia hai bisogno di un ciclo(per l'array) o due(per la matrice, uno di riga e uno di colonna) e ovviamente un contatore che ti aggiorna su quante volte è stato trovato quello stesso elemento. se devi trovare due elementi uguali e basta allora fai due serie di cicli, la prima serve a bloccare indice di riga e colonna del primo, e la seconda serie serve x provare i controlli con tutti gli altri elementi. quindi devi controllare il primo elemento di una matrice con tutto il resto della matrice, poi il secondo ecc. e questo metodo vale anche per quanto riguarda una somma, se x esempio due numeri devono essere tali che la somma sia un certo numero...quindi dato che in quel caso erano 3 i numeri da confrontare, hai bisogno quindi di 3 serie di cicli, ognuna serve a indicare la riga e la colonna degli elementi da confrontare. l'assegnazione della colonna: int y=((x==m) ? n+1 : 0) è un modo diciamo ottimizzato di assegnare gli indici degli altri due elementi. il fatto è questo: è inutile perdere tempo a scrivere sempre tutti gli indici che partono da 0 perchè ti metti a ricontrollare un elemento con i suoi precedenti, e rischi di controllarlo anche con sè stesso. ora con due elementi te lo posto semplicemente levando gli ultimi due for:

Code:
public static boolean metodo (float [][] A, float e)
{
boolean trovati = false;
for(int i=0;i<A.length && !trovati;i++)
for(int j=0;j<A[i].length && !trovati;j++)
for(int m=i;m<A.length && !trovati;m++)
for(int n=((m==i) ? j+1 : 0);n<A[m].length && !trovati;n++)
if(Math.abs(A[i ][j]+A[m][n])-1<e)
trovati=true;
return trovati;
}


se vuoi lo semplifico ma così diventa un codice che in grosse matrici perde davvero tanto tempo:

Code:
public static boolean metodo (float [][] A, float e)
{
boolean trovati = false;
for(int i=0;i<A.length && !trovati;i++)
for(int j=0;j<A[i].length && !trovati;j++)
for(int m=0;m<A.length && !trovati;m++)
for(int n = 0;n<A[m].length && !trovati;n++)
if((i!=m || j!=n) && Math.abs(A[i ][j]+A[m][n])-1<e)
trovati=true;
return trovati;
}


questo è semplificato, si inizializzano tutti gli indici a 0 e si ricontrolla sempre tutto, (i!=m || j!=n) il controllo serve a nn controllare l'elemento bloccato dai primi due for con quello bloccato dai due for seguenti.

la math.abs è sempre la stessa. ciò ke metti all'interno delle parentesi ti restituisce il suo valore assoluto, che matematicamente vuol dire che se è il numero è positivo o negativo, ti restituisce sempre quello positivo, fa la sottrazione e controlla se la sottrazione è minore di e.

nn so cos'altro posso fare. mi disp per il discorso troppo lungo. in caso dovresti spiegare esattamente cosa nn capisci. xkè la differenza tra controllare 3 elementi o 2 è quasi nulla...
Logged

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