SlideShare a Scribd company logo
1 of 45
Download to read offline
Istruzioni Iterative
del Linguaggio C/C++
Semplice programma
  • Scrivere un programma che, dato un numero
    naturale N, letto a tempo di esecuzione del
    programma stesso, stampi i primi N numeri
    naturali
  • Al momento non sappiamo scriverlo!




Programmazione I - Paolo Valente, 2008/2009       2
Istruzioni iterative
  • Le istruzioni iterative (o di iterazione) forniscono strutture
    di controllo che permettono di ripetere una certa istruzione
    fintanto che una certa condizione è vera
  • Per il Teorema di Jacopini-Böhm, una struttura di controllo
    iterativa è sufficiente (insieme al blocco e a un’istruzione di
    scelta) per implementare qualsiasi algoritmo
  • Tuttavia, per migliorare l’espressività del linguaggio,
    vengono rese disponibili vari tipi di istruzioni iterative:
        – for ( ; ; )
        – while ( )
        – do … while ( )

Programmazione I - Paolo Valente, 2008/2009                       3
Primo problema iterativo
  • Scrivere un programma che, dato un numero
    naturale N, letto a tempo di esecuzione del
    programma stesso, stampi i primi N numeri
    naturali

  Proviamo a pensare ad una soluzione ...

  Rappresentazione dati
  • Una variabile N che rappresenti il numero naturale N dato
  • Una variabile i che rappresenta un ausilio per “scorrere”
    tutti i valori naturali da 1 fino a N


Programmazione I - Paolo Valente, 2008/2009                     4
Algoritmo e Programma
  • Inizialmente, i vale 1
  • Finché i<=N, ripetere:
         - stampare il valore attuale di i
         - incrementare di 1 il valore attuale di i

       main ()
       {
         int i = 1, N;
         cin>>N;
         finché resta vero che (i<=N),
            ripetere il blocco { cout<<i<<endl; i++; }
       }

Programmazione I - Paolo Valente, 2008/2009              5
Istruzione iterativa “while”
  <istruzione-while> ::=
         while (condizione) <istruzione>
                                                                falsa
                                                 condizione

                                                  vera


                                                   istruzione
  • <istruzione> viene ripetuta per tutto
    il tempo in cui l’espressione condizione rimane vera
  • Se condizione è già inizialmente falsa, il ciclo non
    viene eseguito neppure una volta.
  • In generale, non è noto a priori quante volte <istruzione>
    verrà eseguita

Programmazione I - Paolo Valente, 2008/2009                        6
Osservazioni
  • Direttamente o indirettamente,
    <istruzione> deve modificare prima o poi la
    condizione,
    altrimenti si ha un ciclo infinito

  • Per questo motivo, molto spesso <istruzione> è
    in realtà un blocco, che contiene tra le altre una
    istruzione di modifica di qualche variabile che
    compare nella condizione



Programmazione I - Paolo Valente, 2008/2009          7
Esempio (precedente)
       main ()
       {
         int i = 1, N;
         cin>>N;
         finché resta vero che (i<=N),
            ripetere il blocco { cout<<i<<endl; i++; }
       }

       main ()
       {
         int i = 1, N;
         cin>>N;
         while (i<=N) { cout<<i<<endl; i++; }
        }
                                              Istruzione di modifica
                                              della condizione del while
Programmazione I - Paolo Valente, 2008/2009                                8
Problema più complesso
  • Dato un numero naturale N, calcolare la
    corrispondente somma dei primi N numeri
    naturali

  • Calcolare il valore: S = 1 + 2 + … + N

  Rappresentazione dati
  • Una variabile N che rappresenti il numero naturale N dato
  • Una variabile somma che rappresenti la somma calcolata
  • Una variabile i che rappresenti un ausilio per “scorrere”
    tutti i valori naturali da 1 fino a N


Programmazione I - Paolo Valente, 2008/2009                     9
Algoritmo
  • Inizialmente, somma vale 0, i vale 1

  • Finché i<=N, ripetere:
        - aggiungere a somma il valore attuale di i
        - incrementare di 1 il valore attuale di i




Programmazione I - Paolo Valente, 2008/2009           10
(Quasi) Programma

       main ()
       {
          int i = 1, somma = 0, N;
          cin>>N;
          finché resta vero che (i<=N),
                   ripetere il blocco { somma = somma+i; i++; }
       }




Programmazione I - Paolo Valente, 2008/2009                       11
Ultimo passo
       main ()
       {
          int i = 1, somma = 0, N;
          cin>>N;
          finché resta vero che (i<=N),
                   ripetere il blocco { somma = somma+i; i++; }
       }

       main ()
       {
          int i = 1, somma = 0, N;
          cin>>N;
          while (i<=N) { somma = somma+i; i++; }
        }
                                              Istruzione di modifica
                                              della condizione del while
Programmazione I - Paolo Valente, 2008/2009                                12
Istruzione iterativa “do…while”
  <istruzione-do-while> ::=
      do < istruzione> while (condizione) ;
                                                    istruzione


                                                                 falsa
                                                   condizione
                                                          vera

  • È una “variazione sul tema” dell’istruzione “while”
  • A differenza del “while”, la condizione è controllata dopo
    aver eseguito <istruzione>
    Quindi il ciclo viene sempre eseguito almeno una
    volta


Programmazione I - Paolo Valente, 2008/2009                        13
Osservazioni
  • Analogamente al “while”, per evitare il ciclo infinito,
    <istruzione> deve modificare prima o poi la condizione

  • Si noti che, come nel caso del “while”, si esce dal ciclo
    quando la condizione è falsa

  • È adatta a quei casi in cui, per valutare condizione, è
    necessario aver già eseguito <istruzione>
    (esempio tipico: Controllo valori di input)

  • Non è adatta a quei casi in cui il ciclo può non dover
    essere mai eseguito.


Programmazione I - Paolo Valente, 2008/2009                     14
Controllo dei valori in input
  Esempio 1: n deve essere positivo per andare avanti
    do
       cin>>n;
    while (n<=0);
  Esempio 2: n deve essere compreso fra 3 e 15 (inclusi)
    do
       cin>>n;
    while ((n<3) || (n>15));

  Esempio 3: n deve essere negativo o compreso fra 3 e 15
    do
       cin>>n;
    while ((n>=0) && ((n<3) || (n>15)));

Programmazione I - Paolo Valente, 2008/2009                 15
Istruzione iterativa “for” 1/2
 • Non è l’istruzione per implementare cicli “definiti”
   come in altri linguaggi
    – Es: “ripeti per i che va da 1 a N”
 • È una evoluzione dell’istruzione while, rispetto a cui mira
   ad eliminare alcune frequenti sorgenti di errore:
       – mancanza delle necessarie inizializzazioni delle variabili
       – mancanza dell’istruzione di modifica della condizione del ciclo
           rischi di cicli infiniti




Programmazione I - Paolo Valente, 2008/2009                            16
Istruzione iterativa “for” 2/2
 • Per questo, l’istruzione for comprende esplicitamente:
    – una inizializzazione che può essere una definizione
      (solo C++) o una espressione
    – una condizione che deve essere vera ad ogni
      iterazione
    – una espressione di modifica del ciclo




Programmazione I - Paolo Valente, 2008/2009                 17
Istruzione iterativa “for”
                           (esempio pratico)




Programmazione I - Paolo Valente, 2008/2009         18
Istruzione iterativa “for” (sintassi)
  <istruzione-for> ::=
  for ( definizione | espr-inizializz. ; condizione ; espr-modifica )
         <istruzione>

                                                    inizializzazione



                                                                   falsa
                                                    condizione
                                       Stessa
                                       struttura
                                       del while    vera

                                                     istruzione


                                                   espr-modifica

Programmazione I - Paolo Valente, 2008/2009                                19
Esempio precedente
       main ()
       {
          int i, N;
          cin>>N;
          finché resta vero che (i<=N),
                   ripetere il blocco { cout<<i<<endl; i++; }
       }

  • Implementare (tradurre) mediante ciclo for




Programmazione I - Paolo Valente, 2008/2009                     20
Soluzione
       main ()
       {
         int i, N;
         cin>>N;
            finché resta vero che (i<=N),
                   ripetere il blocco { cout<<i<<endl; i++; }
       }

                                       Espressione di
       main ()                         inizializzazione
       {                               del ciclo
          int i, N;
          cin>>N;
          for (i=1 ; i<=N; i++) cout<<i<<endl;
        }
                                               Espressione di modifica
                                               della condizione del for
Programmazione I - Paolo Valente, 2008/2009                               21
Oppure, solo in C++
       main ()
       {
         int N;
         cin>>N;
         for (int i=1 ; i<=N; i++)
            cout<<i<<endl;
        }




Programmazione I - Paolo Valente, 2008/2009       22
Esempio più complesso
       main ()
       {
          int i, somma = 0, N;
          cin>>N;
          finché resta vero che (i<=N),
                   ripetere il blocco { somma = somma+i; i++; }
       }

                                       Espressione di
       main ()                         inizializzazione
       {                               del ciclo
          int i, somma = 0, N;
          cin>>N;
          for (i=1 ; i<=N; i++) somma = somma+i;
        }
                                               Espressione di modifica
                                               della condizione del for
Programmazione I - Paolo Valente, 2008/2009                               23
Oppure, solo in C++
       main ()
       {
         int somma = 0, N;
         cin>>N;
         for (int i=1 ; i<=N; i++)
            somma = somma+i;
        }




Programmazione I - Paolo Valente, 2008/2009       24
for() e while() a confronto
  main ()
    {
      int N = 6;
      int i = 1, somma = 0;
      while (i<=N) { somma += i; i++; }
      }
  main ()
    {
      int N = 6;
      int somma = 0;
         for (int i=1; i<=N ; i++) somma += i;
     }
Programmazione I - Paolo Valente, 2008/2009      25
Osservazioni
  •  Per inizializzare (o modificare) più variabili si può usare
     una definizione o espressione composta (operatore , )
     for ([int] i=1, somma = 0 ; i<=N ; i++)
          somma = somma + i ;
  ·   L’espressione di modifica della condizione appare in modo
      più evidente (la sua mancanza “si nota”!)
      L’ <istruzione> che compare nel corpo del ciclo è solo
      l’operazione vera e propria da ripetere:
              - migliore leggibilità
              - (spesso non è più necessario un blocco)
  • Le variabili definite nell'inizializzazione del for possono
    essere utilizzate solo nel corpo del for

Programmazione I - Paolo Valente, 2008/2009                        26
Osservazioni
  •  Ognuna delle espressioni può essere omessa, ma
     il separatore ; deve rimanere

  Se manca condizione, la si assume sempre vera

  • Esempio: ciclo infinito


                                    for ( ; ; ) <istruzione>




Programmazione I - Paolo Valente, 2008/2009                    27
Esercizio (Specifica)


  • Leggere da input due valori naturali,
    calcolarne il prodotto come sequenza di
    somme e stampare il risultato su video.
  • Se ci riusciamo, dopo aver ovviamente
    definito l'algoritmo, proviamo a scrivere il
    programma solo carta e penna




Programmazione I - Paolo Valente, 2008/2009         28
Esercizio (Algoritmo “banale”)
  • Idea:
        – Dati i due numeri x e y, sommare y a y, x volte

  • Algoritmo:
        – Leggo i valori da input
        – Utilizzo una variabile ausiliaria n, inizializzata al valore di x, che mi
          serve come contatore del numero di somme delle y
        – Utilizzo anche una variabile ausiliaria P, inizializzata a 0, che mi
          serve per memorizzare le somme parziali delle y
        – Effettuo n somme di y, mettendole in P
        – Al termine, il risultato sarà contenuto in P




Programmazione I - Paolo Valente, 2008/2009                                      29
Esercizio (Rappresentazione informazioni)
  • Servono 2 variabili (int) per rappresentare i valori da
    moltiplicare: x, y

  • Servono, poi, due variabili ausiliarie (int) per rappresentare
    l’indice delle somme e le somme parziali: n, P

  • Possiamo usare le istruzioni while o for
     – Provare con entrambe




Programmazione I - Paolo Valente, 2008/2009                     30
Esercizio (Programma)

  main()
  {
   int x, y, n, P;
     cin>>x;
     cin>>y;
     P=0; n=x;
     while (n>0)                  P=0;
       { P=P+y;                   for (n=x; n>0; n--)
         n--;                            P=P+y;
        }
      cout<<x<<“ * “<<y<<” = “<<P<<endl;
    }

Programmazione I - Paolo Valente, 2008/2009             31
Esercizio (verifica per un caso)
  main()
  {                                           x                   n
   int x, y, n, P;                            y                   P
     cin>>x;
                                                       3                   3
                                              x                   n
     cin>>y;
     P=0; n=x;                                         5                   0
                                              y                   P
     while (n>0)
       { P=P+y;
                                                       3               2 10
                                              x               n
         n--;
                                                                       5 10 15
                                                       5
                                              y               P
        }
      cout<<x<<“ * “<<y<<” =
       “<<P<<endl;
    }
                                                  Output: 3 * 5 = 15
Programmazione I - Paolo Valente, 2008/2009                                    32
Esercizio (Algoritmo “intelligente”)
  • Idea!!:
        – Se i due numeri sono molto distanti fra di loro, …
        – Quindi, dati i due numeri x e y, conviene controllare chi è il
          maggiore, e sommare il maggiore tante volte quante sono indicate
          dal minore

  • Algoritmo:
        – Leggo i valori da input
        – Calcolo il maggiore tra x e y
        – Utilizzo una variabile ausiliaria n, inizializzata al valore del minore,
          che mi serve come contatore della somme del maggiore
        – Utilizzo anche una variabile ausiliaria P, inizializzata a 0, che mi
          serve per memorizzare le somme parziali
        – Effettuo n somme del numero maggiore, mettendole in P
        – Al termine, il risultato sarà contenuto in P

Programmazione I - Paolo Valente, 2008/2009                                      33
Esercizio
  • Scrivere un programma che legga un numero
    intero non negativo in ingresso e lo divida
    progressivamente per 10, finché non si riduce
    al valore 0. Il programma stampa il numero
    iniziale ed il risultato intermedio di ogni
    divisione
  • Esempi:
    Immettere un numero intero non negativo: 145
    145       14        1
    Immettere un numero intero non negativo: 0
    0


Programmazione I - Paolo Valente, 2008/2009           34
Tentativo 1/2
  main ()
  {
    int i ;
    cout<<Immettere un numero intero non negativo: quot; ;

      cin>>i ;
      …
       cout<<i<”t” ;
       i /= 10 ;
      …
      cout<<endl ;
  }

Programmazione I - Paolo Valente, 2008/2009              35
Tentativo 2/2
  main ()
  {
    int i ;
    cout<<Immettere un numero intero non negativo: quot; ;

      cin>>i ;
      while ( i > 0) {
                                              Cosa viene stampato se si
        cout<<i<”t” ;
                                              legge 0 dallo stdin?
        i /= 10 ;
      }
      cout<<endl ;
  }

Programmazione I - Paolo Valente, 2008/2009                               36
Possibile soluzione
  main ()
  {
    int i ;
    cout<<Immettere un numero intero non negativo: quot; ;

      cin>>i ;
      do {
        cout<<i<”t” ;
        i /= 10 ;
      } while (i > 0) ;
      cout<<endl ;
  }

Programmazione I - Paolo Valente, 2008/2009              37
Esercizio: stampa numero al contrario
  • Scrivere un programma che legga un numero
    intero non negativo in ingresso e lo stampi al
    contrario
  • Esempi:
    Immettere un numero intero non negativo: 164
    461
    Immettere un numero intero non negativo: 0
    0




Programmazione I - Paolo Valente, 2008/2009      38
Suggerimenti
  • Supponiamo di contare l'ordine delle cifre di
    un numero a partire da destra e dall’indice
    zero
  • Nel precedente esercizio
        – Che proprietà ha la cifra di ordine 0 del numero
          contenuto nella variabile i dopo d divisioni ?
        – Forse è la cifra di ordine d del numero iniziale?
  • Con quale operatore si ‘cattura’ la cifra di
    ordine 0 di un numero n in base 10?



Programmazione I - Paolo Valente, 2008/2009                   39
Algoritmo 1/2
         Leggo il valore n da input (es: 123)
  •

         Stampo la cifra di ordine 0, che mi è data da
  •
         n % 10 (= 123 %10 = 3)

         Divido n per 10 (dopodiché n = 123 / 10 = 12)
  •
        – NOTA: se n contiene solo una cifra, ossia n < 10,

              allora, n / 10 == 0, e viceversa



Programmazione I - Paolo Valente, 2008/2009                   40
Algoritmo 2/2
  1. Finché n > 0
        a) Stampo n % 10

        b) Divido n per 10, ossia n = n / 10



                              123             12   1   0   Finito: esco dal ciclo
                 n
                                               2   1
                                3
        n % 10




Programmazione I - Paolo Valente, 2008/2009                                   41
Possibile soluzione
  main()
  {
    int n;

      cout<<quot;Inserire un numero intero non negativo : quot; ;
      cin>>n ;

      do
      {
       cout<<n % 10;
       n /= 10;
      } while (n>0);

  }



Programmazione I - Paolo Valente, 2008/2009                 42
Istruzioni “break” e “continue”
  • Istruzioni senza argomenti che modificano il normale
    percorso dei cicli e dell'istruzione switch
  • Il “break” provoca l’immediata uscita da un blocco o ciclo
        – L’istruzione eseguita dopo il “break” è quella successiva
          all’istruzione composta in cui compare il “break”
        – L’utilizzo del “break” è già stato visto insieme all’istruzione “switch
          … case”
        – All’interno di cicli, serve soprattutto per interrompere l’esecuzione
          in caso di errori o di condizioni irregolari
  • Il “continue” si può utilizzare solo nel corpo di un ciclo: fa
    saltare l’esecuzione delle istruzioni del blocco successive
    (come se fosse un salto alla parentesi } che chiude il
    blocco), quindi causa la nuova valutazione
    dell’espressione condizionale e l'eventuale inizio della
    prossima iterazione
Programmazione I - Paolo Valente, 2008/2009                                     43
Esempio “break”
  main()
  {
   int x, y, n, P;
     cin>>x>>y;
     P=0; n=x;
     while (n>0)
       { P=P+y;
         if (P>250000) break;
         n--;
        }
      cout<<x<<” * “<<y<<” = “<<P<<endl;
    }


Programmazione I - Paolo Valente, 2008/2009       44
Esempio “continue”
  main()
  {
   int x, y, n, P, min_k=3, max_k=12;
   cin>>x>>y;
   P=0; n=x;
   while (n>0)
     { P=P+y;
       if ( (P>min_k) && (P<max_k) ) continue;
       n--;
      }
    cout<<x<<” * “<<y<<” = “<<P<<endl;
  }
                Questo programma non risolve alcun problema concreto.
                Tuttavia, per esercizio, calcolare cosa viene stampato per
                x3 e y2

Programmazione I - Paolo Valente, 2008/2009                                  45

More Related Content

More from Majong DevJfu

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA CloudMajong DevJfu
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processesMajong DevJfu
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product lineMajong DevJfu
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformationMajong DevJfu
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven ArchitectureMajong DevJfu
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture PortfolioMajong DevJfu
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural stylesMajong DevJfu
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architectureMajong DevJfu
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a productMajong DevJfu
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural stylesMajong DevJfu
 

More from Majong DevJfu (20)

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product line
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles
 
Uml3
Uml3Uml3
Uml3
 
Uml2
Uml2Uml2
Uml2
 
6
66
6
 
5
55
5
 
4 (uml basic)
4 (uml basic)4 (uml basic)
4 (uml basic)
 
3
33
3
 
2
22
2
 
1
11
1
 
Tmd template-sand
Tmd template-sandTmd template-sand
Tmd template-sand
 
26 standards
26 standards26 standards
26 standards
 

04 - Programmazione: Istruzioni Pt.2

  • 2. Semplice programma • Scrivere un programma che, dato un numero naturale N, letto a tempo di esecuzione del programma stesso, stampi i primi N numeri naturali • Al momento non sappiamo scriverlo! Programmazione I - Paolo Valente, 2008/2009 2
  • 3. Istruzioni iterative • Le istruzioni iterative (o di iterazione) forniscono strutture di controllo che permettono di ripetere una certa istruzione fintanto che una certa condizione è vera • Per il Teorema di Jacopini-Böhm, una struttura di controllo iterativa è sufficiente (insieme al blocco e a un’istruzione di scelta) per implementare qualsiasi algoritmo • Tuttavia, per migliorare l’espressività del linguaggio, vengono rese disponibili vari tipi di istruzioni iterative: – for ( ; ; ) – while ( ) – do … while ( ) Programmazione I - Paolo Valente, 2008/2009 3
  • 4. Primo problema iterativo • Scrivere un programma che, dato un numero naturale N, letto a tempo di esecuzione del programma stesso, stampi i primi N numeri naturali Proviamo a pensare ad una soluzione ... Rappresentazione dati • Una variabile N che rappresenti il numero naturale N dato • Una variabile i che rappresenta un ausilio per “scorrere” tutti i valori naturali da 1 fino a N Programmazione I - Paolo Valente, 2008/2009 4
  • 5. Algoritmo e Programma • Inizialmente, i vale 1 • Finché i<=N, ripetere: - stampare il valore attuale di i - incrementare di 1 il valore attuale di i main () { int i = 1, N; cin>>N; finché resta vero che (i<=N), ripetere il blocco { cout<<i<<endl; i++; } } Programmazione I - Paolo Valente, 2008/2009 5
  • 6. Istruzione iterativa “while” <istruzione-while> ::= while (condizione) <istruzione> falsa condizione vera istruzione • <istruzione> viene ripetuta per tutto il tempo in cui l’espressione condizione rimane vera • Se condizione è già inizialmente falsa, il ciclo non viene eseguito neppure una volta. • In generale, non è noto a priori quante volte <istruzione> verrà eseguita Programmazione I - Paolo Valente, 2008/2009 6
  • 7. Osservazioni • Direttamente o indirettamente, <istruzione> deve modificare prima o poi la condizione, altrimenti si ha un ciclo infinito • Per questo motivo, molto spesso <istruzione> è in realtà un blocco, che contiene tra le altre una istruzione di modifica di qualche variabile che compare nella condizione Programmazione I - Paolo Valente, 2008/2009 7
  • 8. Esempio (precedente) main () { int i = 1, N; cin>>N; finché resta vero che (i<=N), ripetere il blocco { cout<<i<<endl; i++; } } main () { int i = 1, N; cin>>N; while (i<=N) { cout<<i<<endl; i++; } } Istruzione di modifica della condizione del while Programmazione I - Paolo Valente, 2008/2009 8
  • 9. Problema più complesso • Dato un numero naturale N, calcolare la corrispondente somma dei primi N numeri naturali • Calcolare il valore: S = 1 + 2 + … + N Rappresentazione dati • Una variabile N che rappresenti il numero naturale N dato • Una variabile somma che rappresenti la somma calcolata • Una variabile i che rappresenti un ausilio per “scorrere” tutti i valori naturali da 1 fino a N Programmazione I - Paolo Valente, 2008/2009 9
  • 10. Algoritmo • Inizialmente, somma vale 0, i vale 1 • Finché i<=N, ripetere: - aggiungere a somma il valore attuale di i - incrementare di 1 il valore attuale di i Programmazione I - Paolo Valente, 2008/2009 10
  • 11. (Quasi) Programma main () { int i = 1, somma = 0, N; cin>>N; finché resta vero che (i<=N), ripetere il blocco { somma = somma+i; i++; } } Programmazione I - Paolo Valente, 2008/2009 11
  • 12. Ultimo passo main () { int i = 1, somma = 0, N; cin>>N; finché resta vero che (i<=N), ripetere il blocco { somma = somma+i; i++; } } main () { int i = 1, somma = 0, N; cin>>N; while (i<=N) { somma = somma+i; i++; } } Istruzione di modifica della condizione del while Programmazione I - Paolo Valente, 2008/2009 12
  • 13. Istruzione iterativa “do…while” <istruzione-do-while> ::= do < istruzione> while (condizione) ; istruzione falsa condizione vera • È una “variazione sul tema” dell’istruzione “while” • A differenza del “while”, la condizione è controllata dopo aver eseguito <istruzione> Quindi il ciclo viene sempre eseguito almeno una volta Programmazione I - Paolo Valente, 2008/2009 13
  • 14. Osservazioni • Analogamente al “while”, per evitare il ciclo infinito, <istruzione> deve modificare prima o poi la condizione • Si noti che, come nel caso del “while”, si esce dal ciclo quando la condizione è falsa • È adatta a quei casi in cui, per valutare condizione, è necessario aver già eseguito <istruzione> (esempio tipico: Controllo valori di input) • Non è adatta a quei casi in cui il ciclo può non dover essere mai eseguito. Programmazione I - Paolo Valente, 2008/2009 14
  • 15. Controllo dei valori in input Esempio 1: n deve essere positivo per andare avanti do cin>>n; while (n<=0); Esempio 2: n deve essere compreso fra 3 e 15 (inclusi) do cin>>n; while ((n<3) || (n>15)); Esempio 3: n deve essere negativo o compreso fra 3 e 15 do cin>>n; while ((n>=0) && ((n<3) || (n>15))); Programmazione I - Paolo Valente, 2008/2009 15
  • 16. Istruzione iterativa “for” 1/2 • Non è l’istruzione per implementare cicli “definiti” come in altri linguaggi – Es: “ripeti per i che va da 1 a N” • È una evoluzione dell’istruzione while, rispetto a cui mira ad eliminare alcune frequenti sorgenti di errore: – mancanza delle necessarie inizializzazioni delle variabili – mancanza dell’istruzione di modifica della condizione del ciclo  rischi di cicli infiniti Programmazione I - Paolo Valente, 2008/2009 16
  • 17. Istruzione iterativa “for” 2/2 • Per questo, l’istruzione for comprende esplicitamente: – una inizializzazione che può essere una definizione (solo C++) o una espressione – una condizione che deve essere vera ad ogni iterazione – una espressione di modifica del ciclo Programmazione I - Paolo Valente, 2008/2009 17
  • 18. Istruzione iterativa “for” (esempio pratico) Programmazione I - Paolo Valente, 2008/2009 18
  • 19. Istruzione iterativa “for” (sintassi) <istruzione-for> ::= for ( definizione | espr-inizializz. ; condizione ; espr-modifica ) <istruzione> inizializzazione falsa condizione Stessa struttura del while vera istruzione espr-modifica Programmazione I - Paolo Valente, 2008/2009 19
  • 20. Esempio precedente main () { int i, N; cin>>N; finché resta vero che (i<=N), ripetere il blocco { cout<<i<<endl; i++; } } • Implementare (tradurre) mediante ciclo for Programmazione I - Paolo Valente, 2008/2009 20
  • 21. Soluzione main () { int i, N; cin>>N; finché resta vero che (i<=N), ripetere il blocco { cout<<i<<endl; i++; } } Espressione di main () inizializzazione { del ciclo int i, N; cin>>N; for (i=1 ; i<=N; i++) cout<<i<<endl; } Espressione di modifica della condizione del for Programmazione I - Paolo Valente, 2008/2009 21
  • 22. Oppure, solo in C++ main () { int N; cin>>N; for (int i=1 ; i<=N; i++) cout<<i<<endl; } Programmazione I - Paolo Valente, 2008/2009 22
  • 23. Esempio più complesso main () { int i, somma = 0, N; cin>>N; finché resta vero che (i<=N), ripetere il blocco { somma = somma+i; i++; } } Espressione di main () inizializzazione { del ciclo int i, somma = 0, N; cin>>N; for (i=1 ; i<=N; i++) somma = somma+i; } Espressione di modifica della condizione del for Programmazione I - Paolo Valente, 2008/2009 23
  • 24. Oppure, solo in C++ main () { int somma = 0, N; cin>>N; for (int i=1 ; i<=N; i++) somma = somma+i; } Programmazione I - Paolo Valente, 2008/2009 24
  • 25. for() e while() a confronto main () { int N = 6; int i = 1, somma = 0; while (i<=N) { somma += i; i++; } } main () { int N = 6; int somma = 0; for (int i=1; i<=N ; i++) somma += i; } Programmazione I - Paolo Valente, 2008/2009 25
  • 26. Osservazioni •  Per inizializzare (o modificare) più variabili si può usare una definizione o espressione composta (operatore , ) for ([int] i=1, somma = 0 ; i<=N ; i++) somma = somma + i ; ·   L’espressione di modifica della condizione appare in modo più evidente (la sua mancanza “si nota”!) L’ <istruzione> che compare nel corpo del ciclo è solo l’operazione vera e propria da ripetere: - migliore leggibilità - (spesso non è più necessario un blocco) • Le variabili definite nell'inizializzazione del for possono essere utilizzate solo nel corpo del for Programmazione I - Paolo Valente, 2008/2009 26
  • 27. Osservazioni •  Ognuna delle espressioni può essere omessa, ma il separatore ; deve rimanere Se manca condizione, la si assume sempre vera • Esempio: ciclo infinito for ( ; ; ) <istruzione> Programmazione I - Paolo Valente, 2008/2009 27
  • 28. Esercizio (Specifica) • Leggere da input due valori naturali, calcolarne il prodotto come sequenza di somme e stampare il risultato su video. • Se ci riusciamo, dopo aver ovviamente definito l'algoritmo, proviamo a scrivere il programma solo carta e penna Programmazione I - Paolo Valente, 2008/2009 28
  • 29. Esercizio (Algoritmo “banale”) • Idea: – Dati i due numeri x e y, sommare y a y, x volte • Algoritmo: – Leggo i valori da input – Utilizzo una variabile ausiliaria n, inizializzata al valore di x, che mi serve come contatore del numero di somme delle y – Utilizzo anche una variabile ausiliaria P, inizializzata a 0, che mi serve per memorizzare le somme parziali delle y – Effettuo n somme di y, mettendole in P – Al termine, il risultato sarà contenuto in P Programmazione I - Paolo Valente, 2008/2009 29
  • 30. Esercizio (Rappresentazione informazioni) • Servono 2 variabili (int) per rappresentare i valori da moltiplicare: x, y • Servono, poi, due variabili ausiliarie (int) per rappresentare l’indice delle somme e le somme parziali: n, P • Possiamo usare le istruzioni while o for – Provare con entrambe Programmazione I - Paolo Valente, 2008/2009 30
  • 31. Esercizio (Programma) main() { int x, y, n, P; cin>>x; cin>>y; P=0; n=x; while (n>0) P=0; { P=P+y; for (n=x; n>0; n--) n--; P=P+y; } cout<<x<<“ * “<<y<<” = “<<P<<endl; } Programmazione I - Paolo Valente, 2008/2009 31
  • 32. Esercizio (verifica per un caso) main() { x n int x, y, n, P; y P cin>>x; 3 3 x n cin>>y; P=0; n=x; 5 0 y P while (n>0) { P=P+y; 3 2 10 x n n--; 5 10 15 5 y P } cout<<x<<“ * “<<y<<” = “<<P<<endl; } Output: 3 * 5 = 15 Programmazione I - Paolo Valente, 2008/2009 32
  • 33. Esercizio (Algoritmo “intelligente”) • Idea!!: – Se i due numeri sono molto distanti fra di loro, … – Quindi, dati i due numeri x e y, conviene controllare chi è il maggiore, e sommare il maggiore tante volte quante sono indicate dal minore • Algoritmo: – Leggo i valori da input – Calcolo il maggiore tra x e y – Utilizzo una variabile ausiliaria n, inizializzata al valore del minore, che mi serve come contatore della somme del maggiore – Utilizzo anche una variabile ausiliaria P, inizializzata a 0, che mi serve per memorizzare le somme parziali – Effettuo n somme del numero maggiore, mettendole in P – Al termine, il risultato sarà contenuto in P Programmazione I - Paolo Valente, 2008/2009 33
  • 34. Esercizio • Scrivere un programma che legga un numero intero non negativo in ingresso e lo divida progressivamente per 10, finché non si riduce al valore 0. Il programma stampa il numero iniziale ed il risultato intermedio di ogni divisione • Esempi: Immettere un numero intero non negativo: 145 145 14 1 Immettere un numero intero non negativo: 0 0 Programmazione I - Paolo Valente, 2008/2009 34
  • 35. Tentativo 1/2 main () { int i ; cout<<Immettere un numero intero non negativo: quot; ; cin>>i ; … cout<<i<”t” ; i /= 10 ; … cout<<endl ; } Programmazione I - Paolo Valente, 2008/2009 35
  • 36. Tentativo 2/2 main () { int i ; cout<<Immettere un numero intero non negativo: quot; ; cin>>i ; while ( i > 0) { Cosa viene stampato se si cout<<i<”t” ; legge 0 dallo stdin? i /= 10 ; } cout<<endl ; } Programmazione I - Paolo Valente, 2008/2009 36
  • 37. Possibile soluzione main () { int i ; cout<<Immettere un numero intero non negativo: quot; ; cin>>i ; do { cout<<i<”t” ; i /= 10 ; } while (i > 0) ; cout<<endl ; } Programmazione I - Paolo Valente, 2008/2009 37
  • 38. Esercizio: stampa numero al contrario • Scrivere un programma che legga un numero intero non negativo in ingresso e lo stampi al contrario • Esempi: Immettere un numero intero non negativo: 164 461 Immettere un numero intero non negativo: 0 0 Programmazione I - Paolo Valente, 2008/2009 38
  • 39. Suggerimenti • Supponiamo di contare l'ordine delle cifre di un numero a partire da destra e dall’indice zero • Nel precedente esercizio – Che proprietà ha la cifra di ordine 0 del numero contenuto nella variabile i dopo d divisioni ? – Forse è la cifra di ordine d del numero iniziale? • Con quale operatore si ‘cattura’ la cifra di ordine 0 di un numero n in base 10? Programmazione I - Paolo Valente, 2008/2009 39
  • 40. Algoritmo 1/2 Leggo il valore n da input (es: 123) • Stampo la cifra di ordine 0, che mi è data da • n % 10 (= 123 %10 = 3) Divido n per 10 (dopodiché n = 123 / 10 = 12) • – NOTA: se n contiene solo una cifra, ossia n < 10, allora, n / 10 == 0, e viceversa Programmazione I - Paolo Valente, 2008/2009 40
  • 41. Algoritmo 2/2 1. Finché n > 0 a) Stampo n % 10 b) Divido n per 10, ossia n = n / 10 123 12 1 0 Finito: esco dal ciclo n 2 1 3 n % 10 Programmazione I - Paolo Valente, 2008/2009 41
  • 42. Possibile soluzione main() { int n; cout<<quot;Inserire un numero intero non negativo : quot; ; cin>>n ; do { cout<<n % 10; n /= 10; } while (n>0); } Programmazione I - Paolo Valente, 2008/2009 42
  • 43. Istruzioni “break” e “continue” • Istruzioni senza argomenti che modificano il normale percorso dei cicli e dell'istruzione switch • Il “break” provoca l’immediata uscita da un blocco o ciclo – L’istruzione eseguita dopo il “break” è quella successiva all’istruzione composta in cui compare il “break” – L’utilizzo del “break” è già stato visto insieme all’istruzione “switch … case” – All’interno di cicli, serve soprattutto per interrompere l’esecuzione in caso di errori o di condizioni irregolari • Il “continue” si può utilizzare solo nel corpo di un ciclo: fa saltare l’esecuzione delle istruzioni del blocco successive (come se fosse un salto alla parentesi } che chiude il blocco), quindi causa la nuova valutazione dell’espressione condizionale e l'eventuale inizio della prossima iterazione Programmazione I - Paolo Valente, 2008/2009 43
  • 44. Esempio “break” main() { int x, y, n, P; cin>>x>>y; P=0; n=x; while (n>0) { P=P+y; if (P>250000) break; n--; } cout<<x<<” * “<<y<<” = “<<P<<endl; } Programmazione I - Paolo Valente, 2008/2009 44
  • 45. Esempio “continue” main() { int x, y, n, P, min_k=3, max_k=12; cin>>x>>y; P=0; n=x; while (n>0) { P=P+y; if ( (P>min_k) && (P<max_k) ) continue; n--; } cout<<x<<” * “<<y<<” = “<<P<<endl; } Questo programma non risolve alcun problema concreto. Tuttavia, per esercizio, calcolare cosa viene stampato per x3 e y2 Programmazione I - Paolo Valente, 2008/2009 45