Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ciclo while o for?

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto UtenteMassimoB, Foto Utentefairyvilje

0
voti

[1] Ciclo while o for?

Messaggioda Foto UtenteMax2433BO » 1 ott 2016, 11:39

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
Disapprovo quello che dite, ma difenderò fino alla morte il vostro diritto di dirlo [attribuita a Voltaire]

Sapere sia di sapere una cosa, sia di non saperla: questa è conoscenza. [Confucio, "I colloqui"]
Avatar utente
Foto UtenteMax2433BO
12,1k 4 10 13
G.Master EY
G.Master EY
 
Messaggi: 2900
Iscritto il: 25 set 2013, 16:29
Località: Un puntino insignificante nell'universo!!

0
voti

[2] Re: Ciclo while o for?

Messaggioda Foto Utenteibra » 1 ott 2016, 11:49

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.
Avatar utente
Foto Utenteibra
1.286 3 4 6
CRU - Account cancellato su Richiesta utente
 
Messaggi: 2106
Iscritto il: 15 lug 2015, 0:45

0
voti

[3] Re: Ciclo while o for?

Messaggioda Foto UtenteCarloCoriolano » 1 ott 2016, 12:51

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.
Ultima modifica di Foto UtenteCarloCoriolano il 1 ott 2016, 12:52, modificato 1 volta in totale.
Avatar utente
Foto UtenteCarloCoriolano
1.436 3 4 7
---
 
Messaggi: 1024
Iscritto il: 24 mag 2016, 13:08

5
voti

[4] Re: Ciclo while o for?

Messaggioda Foto Utentepaofanello » 1 ott 2016, 13:08

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.
Piuttosto che chiedere qualcosa a me, chiedila a Mara Maionchi. E' più competente.
Avatar utente
Foto Utentepaofanello
2.275 8 13
Expert
Expert
 
Messaggi: 532
Iscritto il: 7 lug 2015, 21:01

2
voti

[5] Re: Ciclo while o for?

Messaggioda Foto UtenteFabio992 » 1 ott 2016, 13:16

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
Avatar utente
Foto UtenteFabio992
593 1 5 7
Expert
Expert
 
Messaggi: 497
Iscritto il: 26 gen 2013, 20:07

2
voti

[6] Re: Ciclo while o for?

Messaggioda Foto UtenteTardoFreak » 1 ott 2016, 14:10

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:
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,6k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15763
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[7] Re: Ciclo while o for?

Messaggioda Foto UtenteMax2433BO » 1 ott 2016, 15:04

:ok: Grazie mille a tutti...

O_/ Max
Disapprovo quello che dite, ma difenderò fino alla morte il vostro diritto di dirlo [attribuita a Voltaire]

Sapere sia di sapere una cosa, sia di non saperla: questa è conoscenza. [Confucio, "I colloqui"]
Avatar utente
Foto UtenteMax2433BO
12,1k 4 10 13
G.Master EY
G.Master EY
 
Messaggi: 2900
Iscritto il: 25 set 2013, 16:29
Località: Un puntino insignificante nell'universo!!

4
voti

[8] Re: Ciclo while o for?

Messaggioda Foto UtenteDirtyDeeds » 2 ott 2016, 10:33

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 ;-)
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,8k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7013
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[9] Re: Ciclo while o for?

Messaggioda Foto UtenteTardoFreak » 2 ott 2016, 11:50

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++) ;
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,6k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15763
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

3
voti

[10] Re: Ciclo while o for?

Messaggioda Foto UtenteDirtyDeeds » 2 ott 2016, 12:12

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.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,8k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7013
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

Prossimo

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite