Newsgroup: it.comp.java
Titolo: break in un for

Ri-salve a tutti,
secondo voi si utilizza il break per uscire da un for? secondo me no
perchè vuol dire che hai usato un costrutto ciclico non adeguato,
infatti i cicli si utilizzano per un numero precisato di iterazioni;
esistono i while per iterare sotto certe condizioni. Che ne pensate?
Esempio 1:
int temp[] =
{41,22,5,7,33,44,6,99,565,4,5,3,2,2,2,56,8,33,11,09,078,33,22,1234};
boolean trovato = false;
for(int i = 0; i < temp.length; i++)
{
       if(temp[i] == 33)
       {
            trovato = true;
            break;
       }
}
Esempio 2:
int temp[] =
{41,22,5,7,33,44,6,99,565,4,5,3,2,2,2,56,8,33,11,09,078,33,22,1234};
boolean trovato = false;
int i = 0;
while(!trovato || i < temp.length)
{
       if(temp[i] == 33)
            trovato = true;
       i++;
}
Meglio Esempio 1 o Esempio 2 ? io dico il 2

 Meglio Esempio 1 o Esempio 2 ? io dico il 2
In questo caso dico 1.
Se il ciclo avesse occupato molte piu' linee avrei detto 2.
-- 
Andrea Francia
http://www.andreafrancia.it/


Io userei il break con parsimonia e solo dove serve davvero (tipo
negli switch): dico 2.
Ma occhio, i due esempi fanno cose diverse: il primo esce appena trova
il valore e "i" è l'indice in cui è presente, mentre il secondo arriva
sempre al fondo dell'array (secondo me ci voleva l'and).
ciao
mc


il secondo non arriva in fondo all'array perchè imposta a true la
variabile trovato e se guardi la condizione di ciclo ti accorgi che
trovato deve essere a false!

 Meglio Esempio 1 o Esempio 2 ? io dico il 2
bé se metti && invece di || fanno la stessa cosa, sono semanticamente
equivalenti, ma visto che ci sono differenti costrutti iterativi a
disposizione direi che è meglio usare quello più adatto:
SEMANTICA DEL WHILE: il ciclo viene ripetuto per un numero di volte
fintantoché la condizione di GUARDIA è vera.
SEMANTICA DEL FOR: il ciclo viene eseguito n volte con n fissato prima
dell'inizio del ciclo.
Ciao Gianmarco


Il significato naturale del 'for' è quello che dici tu ma in Java il è 
molto piu' simile al while.
Infatti abbiamo che il costrutto
  for(init;cond;inc) {
     body
  }
equivale a
  {
    init;
    while(cond) {
      body;
      inc;
    }
  }
In aggiunta il 'for' di Java rende molto semplice scrivere for naturali 
usando
  init -> int i = 0
  cond -> i < N
  inc -> i++
Questo mi fa venire in mente che c'e' un terzo modo per implementare il 
ciclo proposto da FanTux:
boolean trovato = false;
for(int i = 0; (i < temp.length) && (!trovato); i++)
{
        if(temp[i] == 33)
        {
             trovato = true;
        }
}
Pero' io preferisco sempre l'esempio 1.


On 18 Mar, 17:32, Andrea Francia

ma poi scusate voci di corridoio mi dicono che un break spezza un
ciclo come un goto e se non sbaglio
il goto non è proprio il costrutto più consigliato.che dite?

 Andrea Franciahttp://
www.andreafrancia.it/
premettendo che la semantica dei costrutti per la programmazione non è
'interpretabile', il fatto che in certi linguaggi esistano costrutti
che alterano il valore semantico di altri, non implica, dal punto di
vista della semantica il significato originale del costrutto.
Per andare su in esempio più semplice
il costrutto condizionale, noto per convenzione come if then else, non
cambia interpretazione semantica se in un linguaggio viene aggiunto
elseif  o qualsivoglia altra variante, se la condizione è vera succede
una cosa altrimenti un'altra.... volendo puoi implementare l'if then
else con un paio di for break, ma questo indica solo che ci sono molti
modi per 'scrivere' una porzione di programma... non tutti i modi sono
'giusti'.
Il for si usa per iterazioni di cui è noto a priori il numero di
ripetizioni del 'blocco', il while per eseguire un 'certo numero di
volte' il blocco.
Ci hanno insegnato a scuola che due programmi che con lo stesso input
producono lo stesso output sono equivalenti, ma ovviamente questo non
implica niente sull'efficienza o sullo stile di programmazione,
potremmo metterci a discutere sull'eventuale ottimizzazione dei
compilatori in presenza di certi costrutti o di altri, ma credo che
non sia 'interessante' in questo ambito.
Ciao Gianmarco

 implica niente sull'efficienza o sullo stile di programmazione
implica però sulla leggibilità e chiarezza del codice e di conseguenza
sulla velocità
nel modificarlo o migliorarlo, non credi?


wrote:

certo, come sentire una bella canzone o un asino ragliare, ma la
semantica prescinde dall'efficienza :P
L'equivalenza computazionale (differenti programmi che con gli stessi
input producono gli stessi output) non ha legami con l'efficienza
(velocità di elaborazione) o ancor meno sulla manutenibilità del
codice.
Tornando alla tua osservazione, nei casi di cui si parla in questo
thread, è bene, giusto, più leggibile e 'controllabile' il while.
Ciao Gianmarco


felice che sei d'accordo con me

 
Nel secondo caso ti trovi in uscita dal ciclo una variabile i, oltre al 
boolean trovato,
tra l'altro con un valore maggiore di 1 rispetto all'indice richiesto.
se ci fosse bosogno in seguito di 'ricliclare' i con altri for (int i= 
ecc", secondo me sarebbe preferibile la prima soluzione (dove i esiste 
solo all'interno del ciclo.
Oppure, si può inserire il tutto tra parentesi graffe anche in assenza 
di cicli o condizioni.
