User Tools

Site Tools


appunti3s:tre_strutture

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
appunti3s:tre_strutture [2018/05/03 11:13] profproappunti3s:tre_strutture [2020/06/08 22:20] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +> torna indietro > [[appunti3s: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.
 +
 +{{:appunti3s:strutture.png?|}}
 +
 +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
 +{{ :appunti3s:cpp31.png?200|}}
 +  * //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
 +<file cpp 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;
 +}
 +</file>
 +=====Struttura condizionale=====
 +Un programma può eseguire istruzioni diverse in base al verificarsi di una condizione{{ :appunti3s:cppmaggiorenne.png?250|}}
 +  * //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
 +
 +<file cpp 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;
 +}
 +</file>
 +
 +Che differenza c'è tra questi due esempi? Perché vengono compilati senza errore?
 +  * <code> if ( eta == 18 )</code>
 +  * <code> if ( eta = 18 )</code>
 +====Struttura condizionale annidata====
 +vedere [[appunti3s: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
 +<file cpp 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;
 +}
 +</file>
 +
 +<file cpp 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;
 +}
 +</file>
 +
 +Esercizi:
 +
 +    - esercizio: chiedere due numeri e visualizzarli in ordine inverso
 +    - 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()//.
 +<file cpp 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;
 +}
 +</file>
 +
 +<file cpp 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;
 +}
 +</file>
 +  * to do: esempio con totalizzatore che somma la tabellina del 3
 +  * to do: esempio di struttura postcondinsionale //%%do{}while();%%//
 +====Struttura iterativa annidata====
 +
 +<file cpp 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;
 +}
 +</file>
 +====struttura iterativa all'interno di struttura condizionale====
 +
 +====struttura condizionale all'interno di struttura iterativa====