Pagina 1 di 2

Ciclo while o for?

MessaggioInviato: 1 ott 2016, 11:39
da Max2433BO
Seguendo questo corso a puntate del mitico Foto UtenteTardoFreak e visto che le domande è meglio farle sul forum, ve ne faccio una da completo ignorante in materia :mrgreen: :

Sfruttando questo corso e studiando, parallelamente anche su un libro sul linguaggio C, ho visto che la funzionalità del costrutto while e del costrutto for sembrano uguali, tant'è che modificando il programma per la moltiplicazione di due numeri utilizzando solo la somma, riportato nel summenzionato articolo, e utilizzando appunto il costrutto for, il programma pare comportarsi in maniera identica:

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char** argv) {
    int m = 12;
    int n = -5;
    int r = 0; 
    int segnoMeno = 1;
    if (n < 0) {
      segnoMeno = 0;
      n = -n;
    }
    for (n; n>0; n = n -1) {     
      r = r + m;
    }
    if (segnoMeno == 0) r = -r;
    printf("%d\n" , r);
    return (EXIT_SUCCESS);
}



La mia domanda, quindi, è: c'è un costrutto che è preferibile ad un altro, o dipende dai casi in cui ci si ritrova?

Chiedo ancora scusa se la domanda potrà sembrare banale (... e forse lo è) per i più esperti, ma quando si inizia, come il sottoscritto, ci si pone anche domande la cui risposta è, magari, per altri, lampante.

O_/ Max

Re: Ciclo while o for?

MessaggioInviato: 1 ott 2016, 11:49
da ibra
Non conosco il C, ma se esistono i due comandi FOR e WHILE (PER e MENTRE) un motivo deve pur esserci. Per sapere come funzionano dovresti risalire al loro codice macchina (assembler?) e come vengono interpretati dal compilatore.

Re: Ciclo while o for?

MessaggioInviato: 1 ott 2016, 12:51
da CarloCoriolano
Tendenzialmente un ciclo for e` un ciclo finito, dove e` ben noto a priori lo stato iniziale e finale dell'iteratore.
I cicli do e while sono invece tendenzialmente indefiniti, la condizione di fine ciclo e` quindi da verificare durante il ciclo stesso.

In ogni caso sta al programmatore la scelta di uno o dell'altro, in funzione di altri elementi valutativi della struttura del progtramma.

Re: Ciclo while o for?

MessaggioInviato: 1 ott 2016, 13:08
da paofanello
Sul libro "Programming C: a modern approach", viene spiegato come nel 99% dei casi si possa sostituire un ciclo for con un ciclo while e viceversa.
Il consiglio che viene dato quindi è semplicemente di utilizzare il costrutto che faccia capire meglio a cosa serve il ciclo in questione:
Se si vuole un ciclo continuo fino a che non succede qualcosa il while fa intuire meglio questo funzionamento
Se invece si vuole un numero finito di iterazioni il for è più intuitivo
così un utente esterno guardando i parametri del for capirà subito quante iterazioni ci si deve aspettare, e guardando la condizione del while sa cosa dovrà accadere per uscire dal ciclo.
Diciamo che scrivere:
Codice: Seleziona tutto
while(i<N){
...
i++;
}

Nel 90% dei casi rende il codice meno leggibile.

Re: Ciclo while o for?

MessaggioInviato: 1 ott 2016, 13:16
da Fabio992
Il risultato dei due costrutti è lo stesso, ma chi programma afferma che ( vedi Programming principles and Practice) sarebbe meglio usare il ciclo while solo quando non è possibile usare il ciclo for.
Questo non è legato a motivi matematici/computazionali. Il risultato è lo stesso. E' legato semplicemente al fatto che il ciclo for è più "leggibile": nella dichiarazione hai sia punto di partenza che punto di arrivo che passo. Nel costrutto while hai nella dichiarazione solo il punto di arrivo, il punto di partenza è prima della dichiarazione e il passo è dentro al corpo del costrutto. E' solo questione di "leggibilità" del codice ( che non è una cosa che va trascurata, sia perché in fase di debugging devi leggertelo e capire e trovare gli errori, sia perché potrebbe essere letto da altri )

P.s. Paolo ho aggiunto anche la mia di risposta perché dicevo anche qualcos'altro nonostante il succo della mia e della tua sia lo stesso :mrgreen:

P.p.s. più che tradurre while= mentre secondo me usare while=finché dà più l'idea

Re: Ciclo while o for?

MessaggioInviato: 1 ott 2016, 14:10
da TardoFreak
Il controllo di ciclo "for" è sostanzialmente identico al "while". La differenza si può facilmente vedere in questi due frammenti di codice che svolgono esattamente la stessa funzione
Codice: Seleziona tutto
int i = 1;
while(i < 10) {
  // Istruzioni da iterare
  i = i + 1; 
}

Prima di iniziare il ciclo è necessario dichiarare la variabile "i" utilizzata per il conteggio ed inizializzarla. La variabile "i" deve essere incrementata all'interno del blocco.
Mentre, se si usa il costrutto "for" il codice diventa
Codice: Seleziona tutto
for(int i=1; i<10; ii+1) {
  // Istruzioni da iterare
}

Il costrutto for è:
for( <istruzioni di inizializzazione> ; <condizione> ; <istruzioni da eseguire a fine ciclo> )
Quindi prima di tutto vengono eseguite le istruzioni di inizializzazione, ovviamente la condizione è quella di ingresso e di permanenza e, terminata l'esecuzione delle linee interne al blocco (o della eventuale singola istruzione) vengono eseguite le istruzioni da eseguire a fine ciclo.
Nel nostro caso con nel costrutto "for" troviamo la dichiarazione e l'inizializzazione di "i" , la condizione d'ingresso e permanenza (identica a quella dell'esempio con il "while") e l'istruzione di incremento della variabile che, usando il "while" dobbiamo scrivere all'interno del blocco.

L'unica differenza fra i due esempi è la dichiarazione di i. Ho volutamente posto la dichiarazione nel costrutto "for" per far notare che nel primo esempio, all'uscita dal ciclo la variabile "i" esiste ancora, mentre nel secondo la sua esistenza è limitata ed una volta usciti dal blocco non esiste più.
L'avessi dichiarata fuori
Codice: Seleziona tutto
int i;
for(i=1; i<10; ii+1) {
  // Istruzioni da iterare
}

I due esempi sarebbero esattamente la stessa cosa.

Nota: la dichiarazione di variabile all'interno del costrutto"for" si può fare in Java ma non in C.

Nota 2: nel costrutto "for"sia in C che in Java nello spazio dedicato all'inizializzazione ed alle operazioni da eseguire a fine ciclo, si possono scrivere più istruzioni separate da virgole. Particolare di poca utilità pratica, ma molto utile quando si vuole fare i fighi e scrivere un frammento di codice in una sola linea. :mrgreen:

Re: Ciclo while o for?

MessaggioInviato: 1 ott 2016, 15:04
da Max2433BO
:ok: Grazie mille a tutti...

O_/ Max

Re: Ciclo while o for?

MessaggioInviato: 2 ott 2016, 10:33
da DirtyDeeds
TardoFreak ha scritto:Nota: la dichiarazione di variabile all'interno del costrutto"for" si può fare in Java ma non in C.


Foto UtenteTardoFreak, dal C99 in poi si può fare anche in C ;-)

Re: Ciclo while o for?

MessaggioInviato: 2 ott 2016, 11:50
da TardoFreak
Ho provato, il compilatore mi da questo tipo di errore
Codice: Seleziona tutto
main.c:12:3: error: 'for' loop initial declarations are only allowed in C99 mode
   for(int i = 0; i<10; i++) ;

Re: Ciclo while o for?

MessaggioInviato: 2 ott 2016, 12:12
da DirtyDeeds
Nota il messaggio d'errore:

error: 'for' loop initial declarations are only allowed in C99 mode


Per attivare la modalità C99 ci dovrebbe essere un flag da attivare. Quale compilatore usi? Con gcc bisogna compilare con

Codice: Seleziona tutto
gcc -std=c99


Per altri compilatori il flag potrebbe essere diverso, ma ormai praticamente tutti i compilatori supportano il C99.