PDA

View Full Version : [Java]Domanda: ricerca su dizionario


blue_blue
01-12-2007, 22:59
Ciao!
La prof di informatica ha spiegato archivi e dizionari portando come esempio la classe studente e creando un archivio degli studenti con i vari metodi del dizionario..Io sto provando a riscrivermela, però confrontandomi con la versione della prof non capisco una cosa: nella metodo che effettua la ricerca, lei scrive:

public Studente find(int codice)
throws new NoSuchElementException
{
Studente stud = new Studente ();
Coppia target = new Coppia (codice, stud);

int i=0;
boolean trovato = false;
while (i<dim && !trovato)
{
if (archivio[i].compareTo(target)==0)
trovato=true;
else
i++;
}
if (!trovato)
throw new NoSuchElementException;
else return archivio[i].attributo;
}

ma non capisco le parti evidenziate in grassetto, secondo me si contraddicono..io avrei scritto il contrario, inizialiazzando trovato=true (e lasciando il resto invariato) oppure mantenendo trovato=false ma poi, nelle parentesi, scrivendo semplicemente trovato e non !trovato..non so se mi sono spiegata..:fagiano: sarà sicuramente giusto il suo pezzo di codice, ma qualcuno mi spiega perchè??

(se c'è bisogno posto anche la classe Studente e il resto della classe ArchivioStudente..)

Vi ringrazio in anticipo :)

vegeta83ssj
01-12-2007, 23:09
Il !trovato trasforma il false dell'inizializzazione in true per far andare il ciclo.
Ovvio che se lo inizializzi a true e togli il not ( ! ) funziona uguale ma perdi il significato di "trovato" in linguaggio naturale.

Così infatti dici : finché non trovato...
Mettendolo a true e togliendo ! dici: finché trovato ...

Ovvio che a livello di compilazione e funzionamento non cambia nulla ma in leggibilità in italiano risulta più facile capire il codice, altrimenti anziché "trovato" andrebbe bene un qualunque nome di variabile per far girare il codice.

Ciauz

franksisca
01-12-2007, 23:48
diciamo così....il ! non cambia il senso della variabile...scrivendo !trovato equivale a scrivere trovato==false.


spero che ti sia chiaro

71104
02-12-2007, 10:33
la parte in rosso mette trovato a false perché in quell'istante dell'esecuzione dell'algoritmo l'elemento cercato di fatto non è stato ancora trovato. dopodiché il while dice letteralmente "fintantoché non l'ho trovato... (lo cerco e se lo trovo metto il flag a true)"; poi dopo l'esecuzione del while dice "se non l'ho trovato allora mi sa tanto che non c'è, ergo lancio un'eccezione".

blue_blue
02-12-2007, 11:55
la parte in rosso mette trovato a false perché in quell'istante dell'esecuzione dell'algoritmo l'elemento cercato di fatto non è stato ancora trovato. dopodiché il while dice letteralmente "fintantoché non l'ho trovato... (lo cerco e se lo trovo metto il flag a true)"; poi dopo l'esecuzione del while dice "se non l'ho trovato allora mi sa tanto che non c'è, ergo lancio un'eccezione".
ok, fin qua ho capito..
diciamo così....il ! non cambia il senso della variabile...scrivendo !trovato equivale a scrivere trovato==false.


spero che ti sia chiaro

..ecco, questo invece non mi è chiaro..perchè il ! non cambia il senso della variabile? se io metto trovato a false, !trovato non vuol dire non-false? :confused:

vegeta83ssj
02-12-2007, 12:08
ok, fin qua ho capito..


..ecco, questo invece non mi è chiaro..perchè il ! non cambia il senso della variabile? se io metto trovato a false, !trovato non vuol dire non-false? :confused:

Per "girare" il while vuole che la condizione tra () sia vera, ergo se inizializzi trovato a false con !trovato lo trasformi in true per far andare il ciclo.
Quando ho scritto che non cambia il senso intendevo: mettere !trovato con trovato inizializzato a false è identico a mettere trovato nella condizione del while con trovato inizializzato a true (ovviamente modificando il codice anche all'interno del while per stoppare il ciclo se trova l'elemento).

Ciauz

franksisca
02-12-2007, 12:16
..ecco, questo invece non mi è chiaro..perchè il ! non cambia il senso della variabile? se io metto trovato a false, !trovato non vuol dire non-false? :confused:

perchè mette a variabile a false, non inverte la variabile.

è cos+ :D

blue_blue
02-12-2007, 12:32
perchè mette a variabile a false, non inverte la variabile.

è cos+ :D

Aaah, quindi non ha lo stesso significato di != !! :stordita:

Quindi se io scrivevo

public Studente find(int codice)
throws new NoSuchElementException
{
Studente stud = new Studente ();
Coppia target = new Coppia (codice, stud);

int i=0;
boolean trovato = true;
while (i<dim && !trovato)
{
if (archivio[i].compareTo(target)==0)
trovato=true;
else
i++;
}
if (!trovato)
throw new NoSuchElementException;
else return archivio[i].attributo;
}


sbagliavo solo a inizializzare a true, perchè (come diceva 71104) in quel momento effettivamente non avevo trovato niente, giusto? ma a parte questo avrebbe funzionato lo stesso?
:fagiano:

vegeta83ssj
02-12-2007, 12:37
Aaah, quindi non ha lo stesso significato di != !! :stordita:

Quindi se io scrivevo

public Studente find(int codice)
throws new NoSuchElementException
{
Studente stud = new Studente ();
Coppia target = new Coppia (codice, stud);

int i=0;
boolean trovato = true;
while (i<dim && !trovato)
{
if (archivio[i].compareTo(target)==0)
trovato=true;
else
i++;
}
if (!trovato)
throw new NoSuchElementException;
else return archivio[i].attributo;
}


sbagliavo solo a inizializzare a true, perchè (come diceva 71104) in quel momento effettivamente non avevo trovato niente, giusto? ma a parte questo avrebbe funzionato lo stesso?
:fagiano:

Inizializzando a true e lasciando il !trovato semplicemente non inizia nemmeno il ciclo perché trova subito la condizione falsa.

Ciauz

blue_blue
02-12-2007, 13:01
Inizializzando a true e lasciando il !trovato semplicemente non inizia nemmeno il ciclo perché trova subito la condizione falsa.

Ciauz

ah vero, che scema :doh:
comunque, dopo questo esempio credo che forse potrei aver capito :sofico:

Grazie per l'aiuto :)