User Tools

Site Tools


appunti3s:tre_strutture
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:

  • 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.

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

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

Struttura condizionale

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.

Struttura iterativa

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.txt · Last modified: 2020/06/08 22:20 by 127.0.0.1