Costrutto for

Ciao

Premesso che non è un problema di script.

Vorrei chiedere gentilmente chi mi spiega il perchè di questo finzionamento in un ciclo for, ecco il codice:

1. <table border="1">

2. <?

3. $impiegati = array('Rossi', 'D\'Alessio', 'Vanzina', 'Verdone', 'Cleope', 'Giannini'); // imposto l'array

4. $flag_colore=0; // imposto il falg a 0

5.  for($i=0;$i<=5;$i++){ // inizio il cilco for

6.      if($flag_colore==0){ // controllo che  flag colore sia 0 in quel caso eseguo l'istruzione echo

7.         echo "<tr><td bgcolor=\"green\">$impiegati[$i]</td></tr>"; //non ha bisogno di spiegazione

8.         $flag_colore=1; // al termine del ciclo imposto il colore del flag a 1

9.       }

10.      else{

11.          echo "<tr><td bgcolor=\"grey\">$impiegati[$i]</td></tr>"; // idem come la riga 7

12.          $flag_colore=0; // una volta stampato a video l'istruzione precedente setto il colore flag a 1, cosi quando ripete il ciclo cambia colore alla cella

13      }

13.   }

15. ?>

16. </table>

Quello che non risco a capire come mai una volta che è stato appurato nella riga 6 che il colore del falg è uguale a 0, quindi stampa a video l'istruzione eco, a ritornare indietro e questa volta evitando di controllare dinuovo la riga 6 ma salta alla 8 dove è stato impostato il colore del falg a 1 e quindi salta all'istruzione successiva, quella racchiusa nel else, ovvero la riga 11. Bhoo.

Scusate se mi faccio st'altra pera mentale :uglystupid:

inviato 11 anni fa
TrxWeb
X 0 X

Il ciclo for ha lo scopo di ripetere 5 volte le seguenti istrusioni:

if ($flag_colore == 0)
{ 
   echo "<tr><td bgcolor=\"green\">$impiegati[$i]</td></tr>"; 
   $flag_colore = 1; 
}
else
{
   echo "<tr><td bgcolor=\"grey\">$impiegati[$i]</td></tr>"; 
   $flag_colore = 0; 
}

Questo è un semplice costrutto if - else: se $flag_colore = 0 verrà eseguito il primo blocco di istruzioni, altrimenti il secondo.

Nella prima interazione $flag_colore = 0 poiché tale valore è stato assegnato prima che iniziasse il ciclo for, pertanto viene eseguito il primo blocco di codice:

   echo "<tr><td bgcolor=\"green\">$impiegati[$i]</td></tr>"; 
   $flag_colore = 1;

la particolarità sta nel fatto che la seconda istruzione porta il valore di $flag_colore a 1

Eseguite tali istruzioni il ciclo riprende con la seconda iterazione. Viene nuovamente eseguito il costrutto if - else. Questa volta però $flag_colore = 1, pertanto non verrà eseguito il primo blocco di codice bensì il secondo:

   echo "<tr><td bgcolor=\"grey\">$impiegati[$i]</td></tr>"; 
   $flag_colore = 0;

Questa volta la seconda istruzione imposta il valore di $flag_colore a 0.

Eseguite tali istruzioni il ciclo riprende con la terza iterazione. Viene nuovamente eseguito il costrutto if - else. Questa volta $flag_colore = 0 quindi verrà eseguito il primo blocco di codice. La terza iterazione pertanto è identica alla prima.

Il ciclo continua alternando sempre ad ogni iterazione i due blocchi di codice.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

La prima volta controlla che if ($flag_colore=0), e quindi segue il primo blocco di istruzione - ok fin quì semplicissimo  >:D

Eseguite tali istruzioni il ciclo riprende con la seconda iterazione. Viene nuovamente eseguito il costrutto if - else. Questa volta però $flag_colore = 1, pertanto non verrà eseguito il primo blocco di codice bensì il secondo:

Ecco è qui che non mi entra in zucca. Se rifà il controllo, allora vuoldire che  listruzione if ($flag_colore == 0) viene ignorata o magicamente  :o l'istruzione si modifia in if ($flag_colore == 1), se è così è tutto chiaro .

risposto 11 anni fa
TrxWeb
X 0 X

Nessuna magia  ???

Quando inizia la seconda iterazione $flag_colore è uguale a 1. Sei d'accordo?

Il comportamento del costrutto if si può riassimenre così:

se $flag_colore è uguale a 0 allora esegui queste istruzioni:

{ 
   echo "<tr><td bgcolor=\"green\">$impiegati[$i]</td></tr>"; 
   $flag_colore = 1; 
}

altrimenti esegui queste istruzioni:

{
   echo "<tr><td bgcolor=\"grey\">$impiegati[$i]</td></tr>"; 
   $flag_colore = 0; 
}

Quindi nella seconda iterazione verranno eseguite le istruzioni del secondo blocco mentre quelle del primo blocco verranno ignorate.

Cos'è che non ti convince?

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Buongiorno Gianni, ti prego porta pazienza.

Il comportamento del costrutto if si può riassimenre così:

se $flag_colore è uguale a 0 allora esegui queste istruzioni:

{ 
   echo "<tr><td bgcolor=\"green\">$impiegati[$i]</td></tr>"; 
   $flag_colore = 1;  // chiarissimo
}

altrimenti esegui queste istruzioni:

{
   echo "<tr><td bgcolor=\"grey\">$impiegati[$i]</td></tr>"; 
   $flag_colore = 0;  // chiarissimo
}

Quindi nella seconda iterazione verranno eseguite le istruzioni del secondo blocco mentre quelle del primo blocco verranno ignorate.

Cos'è che non ti convince?

Quello che non mi convice è:

Quando inizia la seconda iterazione $flag_colore è uguale a 1. Sei d'accordo?

Capisco che quando termina la prima iterazione $flag_colore viene impostata a 1, ebbene come la mettiamo con il primo if($flag_colore==0){? cosa avviene a questa riga di codice? non viene più ricontrollata dall'interprete? Passi. 1. se flag è 0 2. stampa Rossi il primo elemento dell'array 3. ora flag_colore è 1 4. ritorno a leggere il passo 1????? o valuta il passo 3, in quel caso non dovrebbe esserci nuovamente if flag_colore è 1 ? Ci vorrebbe un editor che esegue il debug riga per riga, come quello di visual basic ad esempio. :crazy:

risposto 11 anni fa
TrxWeb
X 0 X

[table][tr]

[td]

1.  2.  3.  4.  5.  6.  7.  8.  9.  10. [/td]

[td]

if ($flag_colore == 0)
{ 
   echo "<tr><td bgcolor=\"green\">$impiegati[$i]</td></tr>"; 
   $flag_colore = 1; 
}
else
{
   echo "<tr><td bgcolor=\"grey\">$impiegati[$i]</td></tr>"; 
   $flag_colore = 0; 
}

[/td]

[/tr][/table]

Ti riporto l'ordine di esecuzione delle istruzioni. Dimmi poi quale sequenza non ti convince:

Prima iterazione: 1 - 3 - 4

Seconda iterazione: 1 - 8 - 9

Terza iterazione: 1 - 3 - 4

Quarta iterazione: 1 - 8 - 9

Quinta iterazione: 1 - 3 - 4

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Prima iterazione: 1 - 3 - 4

Seconda iterazione: 1 - 8 - 9

Terza iterazione: 1 - 3 - 4

Quarta iterazione: 1 - 8 - 9

Quinta iterazione: 1 - 3 - 4

 :bye:

E' la seonda iterazione che non mi convince, nello specifico il passo 1, praticamente riesegue nuovamente if($flag_colore == 0) { in buona sostanza controlla dinuovo se flag_colore è uguale a 0 perchè mai allora salta al passo 8 della seconda iterazione? Per logica mi sarei aspettato che il passo 1 diventasse in qualche modo if ($flag_colore == 1) { allora n0on ci sarebbero stati più dubbi. :-[

risposto 11 anni fa
TrxWeb
X 0 X

La condizione dell'IF non può cambiare! Quella c'è scritta e quella rimane, anche dopo 1000 iterazioni.

Nella seconda iterazione viene nuovamente verificato se $flag_colore è uguale a zero. Ma stavolta $flag_colore è uguale a 1 (è stata l'istruzione 4 a modificare tale valore alla fine della prima iterazione) pertanto verranno eseguite le istruzioni 8 e 9.

Cosa non ti convince?  :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Corpo di mille balene  :(

Il mio cervello sta fondendo :D, pur capendo il funzionamento non capisco il meccanismo, è come nella guida della macchina, saper cosa succede cambiando marce, ma non sapere come avviene il passaggio tra l'una e l'altra.

In questo caso, se mi dici che tutto rimane uguale, ma è "$flag_colore=1" che cambia, mi chiedo allora, c'è sempre stato anche questa istruzione e cio non ha impedito che stampasse a video il primo blocco di istruzioni. Allora la domanda sorge spontanea, è quest'ultima istruzione che viene ignorata nella prima iterazione?

risposto 11 anni fa
TrxWeb
modificato 11 anni fa
X 0 X

Siccome non riesco a capire dove'è il problema, facciamo in un altro modo. Mi spieghi a parole, in maniera dettagliata, il significato che dai alle istruzioni:

1) if ($flag_colore == 0)

2) else

3) $flag_colore = 0;  e $flag_colore = 1;

non è per farti l'interrogazione ma solo per capire cos'è che fraintendi.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Hai ragione Gianni, purtroppo non riesco a trovare le parole adatte per farmi capire. :-\

Ti rispondo così:

1.   if ($flag_colore == 0)  // controllo se il colore del falg è 0

2.  else  // altrimenti

3.  $flag_colore = 0; // imposto il colore del flag a 0 ; $flag_colore = 1; // imposto il valore del flag a 1

risposto 11 anni fa
TrxWeb
X 0 X

 :wallbash: :wallbash: :wallbash: :giveup: :giveup: :giveup:

e allora cos'è che non ti è chiaro?

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Cerco di fare un paragone con una frase parlata.

0 .  $cielo = "sereno";

1.   Se il cielo è sereno => if $cielo == "sereno";

2.   vado al mare =>echo "vado al mare";

3.   cielo brutto => $cielo = "brutto";

4 . altrimenti =>else

5.  rimango a casa

6.  $cielo="sereno";

Interpretamdo: Se il cielo è sereno vado al mare (else(altrimenti) viene messo da parte perchè la prima volta che mi sono chiesto se il cielo è sereno, è risultato vero perchè c'è l'istruzione zero $cielo="sereno"), poi mi rifaccio la stessa domanda: Se il cieolo è sereno If $cielo=="sereno", anche qui risulta vero, perchè le due istruzioni non cambiano, quindi per logica dovrebbe fornire lo stesso risultato. Il punto 4 non capisco come centra in tutto ciò.

Tu dici che (è sicuramente lo è) il passo è:

iterazione 1- 1 -2 -3

iterazione 2- 1 - 5 - 6 e così via.

Ovvero, se oggi il cielo è sereno if $cielo=="sereno";

rimango a casa.

Ora in tutto questo ingarbugliamento, ma non è che l'istruzione 0 non viene valutata perchè al posto suo è stat valutata la riga 3 come inizio del ciclo?

Ammaza e che lavoraccio, mi immagino chi legge il caos :-\

risposto 11 anni fa
TrxWeb
modificato 11 anni fa
X 0 X
Se il cielo è sereno vado al mare (else(altrimenti) viene messo da parte perchè la prima volta che mi sono chiesto se il cielo è sereno, è risultato vero perchè c'è l'istruzione zero $cielo="sereno"), poi mi rifaccio la stessa domanda: Se il cieolo è sereno If $cielo=="sereno", anche qui risulta vero

Quì c'è l'errore del tuo ragionamento. Nella prima iterazione, dopo che sei andato a mare (2), il tempo è improvvisamente cambiato (3). Questo è il punto cruciale: il tempo è cambiato!!! (3)

Nella seconda iterazione ti richiedi se il tempo è bello ma adesso il tempo è brutto! quindi rimarrai a casa (5). Mentre sei a casa il tempo cambia nuovamente (6) e diventa bello.

Siamo alla terza iterazione che è identica alla prima.

Dimmi che mi sono spiegato  :'(

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Se per quello ti eri già spiegato da prima, sono io il problema, prima perchè non capisco e secondo non riesco a farmi capire.

Tuttavia in tutto questo ragionamento, si potrebbe riassumere così?

La prima iterazione termina e ricomincia da $flag_colore=1, quindi il listato iniziale, ovvero

1.  $flag_colore=0; // imposto il falg a 0
2.  for($i=0;$i<=5;$i++){ // inizio il cilco for
3.      if($flag_colore==0){ // controllo che  flag colore sia 0 in quel caso eseguo l'istruzione echo
4.         echo "<tr><td bgcolor=\"green\">$impiegati[$i]</td></tr>"; //non ha bisogno di spiegazione
5.         $flag_colore=1; // al termine del ciclo imposto il colore del flag a 1

e diventa:

1.  $flag_colore=1;

2.  for($i=0;$i<=5;$i++){

3.      if($flag_colore==0){ // controllo che  flag colore sia 0, poichè è falso, eseguo il blocco di istruzione contenuto in else

7.         echo "<tr><td bgcolor=\"green\">$impiegati[$i]</td></tr>";

8.         $flag_colore=0; // al termine del ciclo imposto nuovamente il flag a 0

Dimmi che stavolta ho capito  :'(

risposto 11 anni fa
TrxWeb
modificato 11 anni fa
X 0 X

Non è corretto dire che l'assegnazione prima del for da $flag_colore=0; diventa $flag_colore=1;

Inoltre nella seconda iterazione, l'istruzione 7 non è quella che hai riportato ma questa:

echo "<tr><td bgcolor=\"grey\">$impiegati[$i]</td></tr>";

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Apparte l'errore di sbaglio della riga 7  ;D

quindi non ho capito na mazza?? :-\

risposto 11 anni fa
TrxWeb
X 0 X

durante un ciclo, qualunque esso sia (for, while, foreach) vengono ripetute SOLO le istruzioni presenti al suo interno. Perché chiami in causa le istruzioni precedenti? quelle sono state eseguite prima di incominciare il ciclo, prima della prima iterazione e non verranno ripetute!

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Infatti ho solo voluto fare un esempio astratto per capire e farti capire quello che intendevo.

Cioè una volta  stampato l'istruzione echo "<tr><td bgcolor=\"grey\">$impiegati[$i]</td></tr>";

prima di iniziare la seconda iterazione viene impostata la variabile $flag_colore=1, e quindi per seguire il mio ragionamento ho immaginato che quest'ultima istruzione sarà la prima ad essere considerata nel nuovo ciclo prima di if. ovvero

$flag_colore=1;

if $flag_colore==0; etc...

risposto 11 anni fa
TrxWeb
X 0 X

Ok, quindi adesso sei convinto che la sequenza delle istruzioni è la seguente?

Prima iterazione: 1 - 3 - 4

Seconda iterazione: 1 - 8 - 9

Terza iterazione: 1 - 3 - 4

Quarta iterazione: 1 - 8 - 9

Quinta iterazione: 1 - 3 - 4

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Sì ho capito  :-[

Grazie Gianni, e scusa per averti fatto perdere del tempo dietro a ste bezzecole  O0

risposto 11 anni fa
TrxWeb
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda