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:
- 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:
- 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().
- 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; }