This is an old revision of the document!


Quando si affronta la programmazione si devono indicare al computer delle istruzioni da eseguire. Se il computer potesse comprendere il linguaggio naturale, sarebbe facile chiedere:

  • di eseguire un'istruzione condizionale: se questo è vero, fai una cosa, altrimenti fai quest'altra cosa;
  • di eseguire un'istruzione iterativa: ripeti questo per 100 volte;
  • di eseguire una sequenza di istruzioni: fai prima questo, poi fai questo e poi quest'altro.

Si tratta di istruzioni per noi molto semplici da comprendere, ma che devono essere espresse in modo da poter essere comprese dal computer. Ognuna delle precedenti istruzioni è un esempio di: una condizione, un'iterazione e una sequenza.

Questo teorema afferma che qualsiasi algoritmo può essere descritto utilizzando solo tre tipi di strutture: la sequenziale, la condizionale e l'iterativa.

Gli esempi appena visti erano proprio di queste strutture.

I programmi che seguono sono stati realizzati senza usare altre funzioni oltre al main() per mettere in evidenza solo le tre strutture:

Un programma può eseguire una lista sequenziale di istruzioni

  • Esempio che calcola l'area di un cerchio
  • chiedere in input un valore per il raggio
  • calcola l'area di un cerchio
  • visualizzare in output l'area
31.cpp
// Questo programma è stato scritto da Fabio
 
#include <iostream>
 
int main()
{ 
  std::cout << "Inserisci il valore del raggio del cerchio: " << std::endl;
  float raggio;
  std::cin >> raggio;
  float area = raggio*raggio*3.14;
  std::cout << "L'area del cerchio vale: " << area << std::endl;
  return 0;
}

Un programma può eseguire istruzioni diverse in base al verificarsi di una condizione

  • Esempio che visualizza la maggiore età
  • chiedere in input il valore dell'anno di nascita
  • calcolare l'età attuale
  • se età < 18
    • allora visualizzare in output: sei minorenne
    • altrimenti visualizzare in output: sei maggiorenne
32.cpp
// Questo programma è stato scritto da Fabio
 
#include <iostream>
 
int main()
{ 
  int const annoAttuale=2012;
  std::cout << "Per favore scrivi l'anno di nascita: ";
  int mioAnnoNascita;
  std::cin >> mioAnnoNascita;
 
  if ( annoAttuale-mioAnnoNascita < 18 )
      std::cout << "Minorenne." << std::endl;
    else
      std::cout << "Maggiorenne." << std::endl;
 
  return 0;
}

Che differenza c'è tra questi due esempi? Perché vengono compilati senza errore?

  •  if ( eta == 18 )
  •  if ( eta = 18 )

Struttura condizionale annidata

vedere operatori_logici

  • Esempio che visualizza il minimo di tre numeri
  • chiedere in input 3 valori numerici interi (primo,secondo,terzo)
  • se primo < secondo
    • allora se primo < terzo
      • allora visualizzare in output: primo
      • altrimenti visualizzare in output: terzo
    • altrimenti se secondo < terzo
      • allora visualizzare in output: secondo
      • altrimenti visualizzare in output: terzo
33.cpp
// Questo programma è stato scritto da Fabio
// visualizza il minimo di tre numeri
 
#include <iostream>
 
int main()
{ 
  int primo,secondo,terzo;
 
  std::cout << "Per favore scrivi tre numeri interi separandoli con 'invio' " << std::endl;
  std::cin >> primo >> secondo >> terzo ;
 
  if ( primo < secondo )
    if ( primo < terzo)
        std::cout << "primo: " << primo << std::endl;
      else
        std::cout << "terzo: " << terzo << std::endl;
    else
      if ( secondo < terzo )
        std::cout << "secondo: " << secondo << std::endl; 
      else
        std::cout << "terzo: " << terzo << std::endl;
  return 0;
}
34.cpp
// Questo programma è stato scritto da Fabio
// visualizza il minimo di tre numeri
// utilizzando gli operatori logici in alternativa alle condizioni annidate
#include <iostream>
 
int main()
{ 
  int primo,secondo,terzo;
 
  std::cout << "Per favore scrivi tre numeri interi separandoli con 'invio' " << std::endl;
  std::cin >> primo >> secondo >> terzo ;
 
  if ( primo < secondo && primo < terzo )
     std::cout << "primo: " << primo << std::endl;
  if ( secondo < primo && secondo < terzo )
     std::cout << "secondo: " << secondo << std::endl; 
 
  // caso superfluo...
  if ( terzo < secondo && terzp < primo )
     std::cout << "terzo: " << terzo << std::endl;
  return 0;
}

Esercizi:

  1. esercizio: chiedere due numeri e visualizzarli in ordine inverso
  2. esercizio: chiedere due numeri, senza un ordine, visualizzare uno dei tre messaggi: sono ordinati, sono disordinati, sono uguali.

La struttura iterativa può essere studiata come composta da diversi elementi (che possono anche coincidere tra loro):

  • un'eventuale variabile contatore (per numerare le ripetizioni)
  • un'eventuale variabile totalizzatore (per accumulare il risultato di tutte le operazioni ripetute)
  • la condizione su un'espressione di uscita o condizione di uscita (per terminare la ripetizione)
  • un'istruzione che modifica la variabile di uscita (per evitare il cosiddetto loop infinito)

A seconda della posizione occupata dalla condizione di uscita all'interno della ripetizione, la struttura iterativa può essere di due tipi:

  • precondizionale
  • postcondizionale

Struttura iterativa precondizionale

Precondizionale significa che la condizione di uscita precede la ripetizione, quindi, in questo caso, potrebbe accadere che, se la condizione non è verificata, la ripetizione non sia mai eseguita

  • Esempio che visualizza la tabellina del 3
  • ripetere la seguente operazione per numero che va da 1 a 10
    • visualizzare in output il risultato dell'espressione: 3*numero

La struttura iterativa in C++ si può realizzare in due modi di scrivere diversi, tra loro equivalenti: for(;;) e while().

35.cpp
// Questo programma è stato scritto da Fabio
// iterazione realizzata con for
#include <iostream>
 
int main()
{ 
  int numero;
  std::cout << "Inserisci un numero intero da 1 a 10" << std::endl;
  std::cin >> numero ;
  for ( int i=1; i<=10; i++)
    std::cout << numero*i << ' ' ;
  std::cout << std::endl;
  return 0;
}
36.cpp
// Questo programma è stato scritto da Fabio
// iterazione realizzata con while
#include <iostream>
 
int main()
{ 
  int numero;
  std::cout << "Inserisci un numero intero da 1 a 10" << std::endl;
  std::cin >> numero ;
  int i=1;
  while ( i<=10 )
  {
    std::cout << numero*i << ' ' ;
    i++;
  }
  std::cout << std::endl;
  return 0;
}
  • to do: esempio con totalizzatore che somma la tabellina del 3
  • to do: esempio di struttura postcondinsionale do{}while();

Struttura iterativa annidata

37.cpp
// Questo programma è stato scritto da Fabio
 
#include <iostream>
 
int main()
{ 
 
  for ( int i=1; i<=10; i++)
  {
    for ( int j=1; j<=10; j++)
      std::cout << j*i << ' ' ;
    std::cout << std::endl;
  }
  std::cout << std::endl;
  return 0;
}

struttura iterativa all'interno di struttura condizionale

struttura condizionale all'interno di struttura iterativa

  • appunti3s/tre_strutture.1524635754.txt.gz
  • Last modified: 2018/04/25 07:55
  • by 127.0.0.1