Table of Contents

torna indietro > problema_e_algoritmo

Introduzione

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:

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.

Teorema Böhm-Jacopini

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:

Struttura sequenziale

Un programma può eseguire una lista sequenziale di istruzioni

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;
}

Struttura condizionale

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

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?

Struttura condizionale annidata

vedere operatori_logici

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.

Struttura iterativa

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

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

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

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;
}

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