appunti3s:programmi_procedurali
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revision | |||
appunti3s:programmi_procedurali [2018/05/03 22:35] – [Classificazione] profpro | appunti3s:programmi_procedurali [2020/06/08 22:19] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Introduzione ====== | ||
+ | Se il computer potesse comprendere il linguaggio umano, si potrebbe chiedere: | ||
+ | * Ehi Mario, calcola questo per me e restituiscimi il risultato | ||
+ | * Ehi Anna, esegui questo gruppo di istruzioni per me | ||
+ | Questo genere di ordini sono stati impartiti raggruppando le istruzioni, in modo da poterle riutilizzare più volte. | ||
+ | Un programma che utilizza questo tipo di struttura viene detto " | ||
+ | |||
+ | |||
+ | ====== Procedure e funzioni ====== | ||
+ | Il termine // | ||
+ | Per capire cosa sia una funzione in un programma basta pensare ad una funzione matematica, dove c'è la variabile indipendente //x// e quella dipendente //y//, dove si trova il risultato //y=f(x)//. Ad esempio, la funzione // | ||
+ | |||
+ | Nella programmazione procedurale, | ||
+ | |||
+ | Tra parentesi possono essere specificati degli argomenti che la funzione può utilizzare. Alcune funzioni, come //main()//, possono essere prive di argomenti. | ||
+ | |||
+ | È utile eseguire questi programmi in modalità [[appunti3s: | ||
+ | |||
+ | <file cpp 11.cpp> | ||
+ | // Questo programma è stato scritto da Fabio. | ||
+ | // Serve a calcolare il triplo di un numero | ||
+ | // scrivendo tutto il codice nella funzione principale. | ||
+ | #include < | ||
+ | |||
+ | int main () | ||
+ | { | ||
+ | int mioNumero; | ||
+ | |||
+ | std::cout << "Per favore scrivi un numero intero: "; | ||
+ | std::cin >> mioNumero; | ||
+ | |||
+ | std::cout << "il triplo di " << mioNumero << " vale " | ||
+ | << 3*mioNumero << endl; | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====== Passaggio per valore ====== | ||
+ | |||
+ | |||
+ | <file cpp 12.cpp> | ||
+ | // Questo programma è stato scritto da Fabio. | ||
+ | // Come nel programma precedente calcola il triplo di un numero, ma | ||
+ | // ora usando una semplice funzione chiamata triplicare(). | ||
+ | #include < | ||
+ | |||
+ | // questo modo di passare il valore crea una nuova variabile locale (int x) | ||
+ | // questa funzione restituisce un int (return) | ||
+ | int triplicare(int x) // definizione della funzione con parametro formale ' | ||
+ | { | ||
+ | return 3*x; | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int mioNumero, | ||
+ | |||
+ | std::cout << "Per favore scrivi un numero intero: "; | ||
+ | std::cin >> mioNumero; | ||
+ | | ||
+ | mioTriplo = triplicare(mioNumero); | ||
+ | // parametro effettivo ' | ||
+ | | ||
+ | std::cout << "il triplo di " << mioNumero << " vale " | ||
+ | << mioTriplo << endl; | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | * //main()// è una funzione (la funzione principale) che (di solito) restituisce un valore intero. | ||
+ | * // | ||
+ | Dentro la // | ||
+ | questo permette di passare alla funzione una copia di una variabile, e questo meccanismo si chiama appunto //passaggio per valore//. | ||
+ | Per parlare in termini semplificati, | ||
+ | < | ||
+ | int x; // definizione di una nuova variabile locale | ||
+ | x = mioNumero; // assegnazione del valore passato come argomento | ||
+ | </ | ||
+ | Questo codice serve solo per capire cosa accade dentro la funzione, e non va preso alla lettera, cioè non vanno copiate quelle istruzioni... | ||
+ | |||
+ | ===== Visibilità ===== | ||
+ | |||
+ | Ecco una tabella che mostra i valori contenuti nelle aree di memoria utilizzate durante l' | ||
+ | ^ mioNumero ^ mioTriplo ^ x ^ | ||
+ | | 6 | - | | ||
+ | | 6 | - | 6 | | ||
+ | | 6 | 18 | - | | ||
+ | Questo tipo di tabella che tiene la traccia delle variabili si può paragonare allo strumento di [[appunti3s: | ||
+ | |||
+ | Questo programma contiene un' | ||
+ | |||
+ | <file cpp 13.cpp> | ||
+ | // Questo programma è stato scritto da Fabio. | ||
+ | // Serve a dimostrare la visibilità delle variabili locali. | ||
+ | #include < | ||
+ | |||
+ | // questo modo di passare il valore crea una nuova variabile locale (int x) | ||
+ | // questa funzione restituisce un int (return) | ||
+ | int triplicare(int x) | ||
+ | { | ||
+ | return 3*x; | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int mioNumero, | ||
+ | |||
+ | std::cout << "Per favore scrivi un numero intero: "; | ||
+ | std::cin >> mioNumero; | ||
+ | | ||
+ | mioTriplo = triplicare(mioNumero); | ||
+ | | ||
+ | std::cout << "il triplo di " << mioNumero << " vale " | ||
+ | << x << std::endl; | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Si dovrebbe ottenere questo errore | ||
+ | < | ||
+ | In function ‘int main()’: | ||
+ | : error: ‘x’ was not declared in this scope </ | ||
+ | |||
+ | ===== Classificazione ===== | ||
+ | |||
+ | Esistono due diversi tipi di funzioni: | ||
+ | * quelle che restituiscono un valore (uno!) a chi le chiama; | ||
+ | * quelle che non restituiscono nessun valore (tipo void) a chi le chiama. | ||
+ | |||
+ | Il valore restituito dalle prime (vedi //return//) può essere usato per ottenere il risultato di un calcolo. | ||
+ | NOTA sul C: a volte i programmatori C usano il valore restituito da una funzione per stabilire se questa è stata eseguita senza errori (restituendo 0) oppure se ha prodotto un errore (restituendo ad esempio 5). In C++ il valore restituito non dovrebbe essere usata per questo scopo, perché, per stabilire se ci sono errori, si usano le // | ||
+ | |||
+ | Le funzioni si possono anche classificare in // | ||
+ | * le prime non modificano il contenuto delle variabili passate, quindi di solito, per avere un effetto al loro esterno, devono restituire un valore (quindi non sono di tipo void) | ||
+ | * le seconde possono modificare il contenuto delle variabili passate, quindi possono anche essere di tipo void | ||
+ | |||
+ | Spiegare i termini //variabile locale//, // | ||
+ | |||
+ | <file cpp 14.cpp> | ||
+ | // Questo programma è stato scritto da Fabio. | ||
+ | // Serve a dimostrare l' | ||
+ | // usando due funzioni | ||
+ | |||
+ | #include < | ||
+ | |||
+ | int triplicare() | ||
+ | { | ||
+ | return 3*mioNumero; | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int mioNumero, | ||
+ | |||
+ | std::cout << "Per favore scrivi un numero intero: "; | ||
+ | std::cin >> mioNumero; | ||
+ | | ||
+ | mioTriplo = triplicare(); | ||
+ | | ||
+ | std::cout << "il triplo di " << mioNumero << " vale " | ||
+ | << mioTriplo << endl; | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | la variabile mioTriplo NON era necessaria... riscrivere il programma 12.cpp | ||
+ | |||
+ | | ||
+ | <file cpp 15.cpp> | ||
+ | // Questo programma è stato scritto da Fabio. | ||
+ | // Dimostra l'uso di una funzione dentro l' | ||
+ | |||
+ | #include < | ||
+ | |||
+ | int triplicare(int x) | ||
+ | { | ||
+ | return 3*x; | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int mioNumero; | ||
+ | |||
+ | std::cout << "Per favore scrivi un numero intero: "; | ||
+ | std::cin >> mioNumero; | ||
+ | |||
+ | // la chiamata della funzione (triplicare) dentro insertion | ||
+ | std::cout << "il triplo di "<< | ||
+ | << triplicare(mioNumero) << std::endl; | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <file cpp 16.cpp> | ||
+ | // Questo programma è stato scritto da Fabio. | ||
+ | // Contiene una funzione di " | ||
+ | // ed inoltre mostra l' | ||
+ | |||
+ | #include < | ||
+ | |||
+ | // questa funzione non restituisce nulla (manca return) | ||
+ | void triplicare(int x) | ||
+ | { | ||
+ | x= 3*x; // ERRORE? Ha effetto sul parametro reale? | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int mioNumero; | ||
+ | |||
+ | std::cout << "Per favore scrivi un numero intero: "; | ||
+ | std::cin >> mioNumero; | ||
+ | std::cout << "il triplo di " << mioNumero << " vale " | ||
+ | |||
+ | triplicare(); | ||
+ | std:: | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | <file cpp 17.cpp> | ||
+ | // questo programma è stato scritto da Fabio | ||
+ | // Serve a calcolare la media (valore intero) tra due interi | ||
+ | #include < | ||
+ | |||
+ | int media(int x, int y) | ||
+ | { | ||
+ | return (x+y)/2; | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int numero1, | ||
+ | |||
+ | std::cout << "Per favore scrivi un numero intero: "; | ||
+ | std::cin >> numero1; | ||
+ | std::cout << "Per favore scrivi un altro numero intero: "; | ||
+ | std::cin >> numero2; | ||
+ | | ||
+ | std::cout << | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <file cpp 18.cpp> | ||
+ | // Questo programma è stato scritto da Fabio. | ||
+ | // Dimostra l' | ||
+ | // effettuando più chiamate della stessa funzione. | ||
+ | // | ||
+ | // Serve a calcolare la media di 4 numeri. | ||
+ | |||
+ | #include < | ||
+ | |||
+ | int mediare(int x, int y) | ||
+ | { | ||
+ | return (x+y)/2; | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int numero1, | ||
+ | |||
+ | std::cout << "Per favore scrivi un numero intero: "; | ||
+ | std::cin >> numero1; | ||
+ | std::cout << "Per favore scrivi un altro numero intero: "; | ||
+ | std::cin >> numero2; | ||
+ | std::cout << "Per favore scrivi un numero intero: "; | ||
+ | std::cin >> numero3; | ||
+ | std::cout << "Per favore scrivi un altro numero intero: "; | ||
+ | std::cin >> numero4; | ||
+ | |||
+ | media = mediare(mediare(numero1, | ||
+ | std::cout << | ||
+ | |||
+ | return 0; | ||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | ===== Dichiarazioni ===== | ||
+ | Ora che è chiaro l' | ||
+ | |||
+ | Le funzioni possono essere definite anche dopo, ma bisogna comunque dichiarare o " | ||
+ | <file cpp 19.cpp> | ||
+ | // Questo programma è stato scritto da Fabio. | ||
+ | // Dimostra la differenza tra concetto di dichiarazione e di definizione | ||
+ | |||
+ | #include < | ||
+ | |||
+ | int mediare(int x, int y); // qui dichiarazione senza definizione! | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int numero1, | ||
+ | |||
+ | std::cout << "Per favore scrivi un numero intero: "; | ||
+ | std::cin >> numero1; | ||
+ | std::cout << "Per favore scrivi un altro numero intero: "; | ||
+ | std::cin >> numero2; | ||
+ | std::cout << "Per favore scrivi un numero intero: "; | ||
+ | std::cin >> numero3; | ||
+ | std::cout << "Per favore scrivi un altro numero intero: "; | ||
+ | std::cin >> numero4; | ||
+ | |||
+ | media = mediare(mediare(numero1, | ||
+ | std::cout << | ||
+ | |||
+ | return 0; | ||
+ | |||
+ | } | ||
+ | |||
+ | int mediare(int x, int y) | ||
+ | { | ||
+ | return (x+y)/2; | ||
+ | } | ||
+ | </ |
appunti3s/programmi_procedurali.txt · Last modified: 2020/06/08 22:19 by 127.0.0.1