le funzioni. cosa fa questo programma? #include using namespace std; int x; float y; int main() {...
TRANSCRIPT
![Page 1: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/1.jpg)
Le funzioni
![Page 2: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/2.jpg)
Cosa fa questo programma?
#include <iostream>#include <cmath>
using namespace std;
int x;float y;int main(){ x=rand(); y=sqrt(x); cout<<y; system(“pause”);return EXIT_SUCCESS;}
![Page 3: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/3.jpg)
Le istruzione
rand(), sqrt(x); system(“pause”);
prendono il nome di :
Chiamata a sottoprogramma
Esse sono sottoprogrammi, messi a disposizione dalla librerie .
Ma noi possiamo definire dei nostri sottoprogrammi?
La risposta è si
Vediamo come:
![Page 4: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/4.jpg)
Progettare un sottoprogramma
Innanzitutto i sottoprogrammi si dividono in
Procedure
Funzioni
Differenze?
Le funzioni sono dei sottoprogrammi che restituiscono al codice chiamante un valore
Le procedure sono sottoprogrammi le cui istruzioni sono manipolazione di dati che non restituiscono nessun valore.
Il valore indefinito in C++ prende il nome di void
system è una procedura
Rand sqrt sono funzioni
![Page 5: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/5.jpg)
Progettare una procedura
Vogliamo disegnare una rettanglo di asterischi.
le attribuiremo il nome rettangolo
Quando si progetta una procedura si parte dalla sua definizione:
La definizione è composta dall’intestazione e dal corpo
![Page 6: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/6.jpg)
Progettare una procedura
Intestazione
L’intestazione è composta da
<tipo_restituito> <nome_sottoprogramma>( );
Esempi void linea( );
è la procedura che disegna una linea di asterichi che occupa una riga
void rettangolo(int r, int c);
è la procedura che disegna un rettangolo di asterischi dove r indica il numero di righe e c il numero di colonne che la compongono
la prima è una procedura senza parametri l’altra ha i parametri.
![Page 7: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/7.jpg)
Progettare una procedura
Intestazione
I parametri sono quelle variabili che mi permettono di effettuare le stesse operazioni su valori differenti
Quando non ho questa esigenza non metto i parametri
![Page 8: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/8.jpg)
Progettare una procedura
Intestazione
Quando necessito dei parametri devo indicare il tipo e il nome
Il numero dei parametri è opzionale da 0 a n
Seguendo la seguente sintassi
<tipo_restituito> <nome_sottoprogramma>(<tipo_parametro> <nome_parametro>, <tipo_parametro> <nome_parametro>, .. <tipo_parametro> <nome_parametro>)
La nostra procedura avrà la seguente intestazione
void rettangolo ( int r, int c);
![Page 9: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/9.jpg)
Progettare una procedura
Il corpo
È quella parte del codice racchiuso tra parentesi graffe che descrive le istruzioni che la procedura esegue e che ha come ultima istruzione
return ;
In questo caso seguito da nessun valore perché le procedure restituiscono il tipo void altrimenti return dovrà essere seguito da un valore dello stesso tipo restituito dalla funzione
Ad esempio il main essendo di tipo int alla fine contiene l’istruzione
return 0;
Dove 0 è un valore intero
![Page 10: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/10.jpg)
Progettare una procedura
La definizione della nostra procedura sarà la seguente
void rettangolo ( int r, int c){
for (int i=0;i<r;i++){
for (int j=0;j<c;j++)
cout<<‘*’;
cout<<endl;
}
return ;}
![Page 11: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/11.jpg)
All’ interno del codice dove va scritta?Subito dopo la fine del mainMa se richiamo il sottoprogramma come siamo abituati a fare nel main e non è un sottoprogramma di libreria il compilatore quando giunge alla riga del richiamo del sottoprogramma dà errore di identificatore non dichiarato come si risolve?Prima del main si inserisce il prototipo
![Page 12: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/12.jpg)
Progettare una procedura
Il prototipo
È la linea di codice che va inserita prima del main uguale alla definizione seguito dal punto e virgola
Indica al compilatore le proprietà del sottoprogramma quali:
Tipo restituito
Nome
Eventuali parametri
void rettangolo(int r, int c);
Vediamo il programma completo che usa la nostra procedura
![Page 13: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/13.jpg)
#include <iostream>using namespace std;
void rettangolo(int r, int c);int main(){ int x,y;rettangolo (20,50); cout<<“inserire il numero delle righe e delle colonne”; cin>>x>>y; rettangolo(x,y); system(“pause”); return EXIT_SUCCESS;} void rettangolo ( int r, int c){for (int i=0;i<r;i++){ for (int j=0;j<c;j++) cout<<‘*’;cout<<endl;}return ;}
![Page 14: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/14.jpg)
Costruiamo la funzione fattoriale
La funzione fattoriale, come qualsiasi funzione matematica restituisce un valore per un certo parametro di ingresso
Vediamo la sua definizione:
int fattoriale(int n){
int f=1;
for (int i=2;i<=n;i++)
f=f*i;
return f;
}
![Page 15: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/15.jpg)
Costruiamo la funzione primo
La funzione ci dice se un certo numero passato come parametro alla funzione è primo o no
Vediamo la sua definizione:
bool primo (int x){
int i=2;
while(x%i!=0)
i++;
if (x==1||i==x)
return true;
else
return false;
}
![Page 16: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/16.jpg)
Esercizio
Realizzare il programma di consegna per oggi facendo uso di sottoprogrammi
![Page 17: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/17.jpg)
Esercizio
Scrivere un programma C++ che permette di scegliere una delle seguenti funzionalità
1. Visualizzare i primi n numeri
2. Visualizzare i primi n numeri pari
3. Visualizzare i primi n numeri dispari
4. Visualizzare i primi n numeri primi
5. Visualizzare i primi n numeri della serie di Fibonacci
6. Dato in input n calcolare n!
7. Dato in input n stampare le prime n righe del triangolo di Tartaglia
Indicazioni e suggerimenti per lo svolgimento
Nelle pagine successive
![Page 18: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/18.jpg)
Indicazioni
Il programma deve essere realizzato con l’uso di:
Selezione multipla e deve contenere un ciclo continuo fino a quando l’utente decide di uscire dal programma
Ogni caso di scelta deve essere realizzato con un sottoprogramma
Ogni caso deve essere realizzato con il ciclo for
![Page 19: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/19.jpg)
Suggerimenti
Serie di Fibonacci
0 1 1 2 3 5 8 13……
n!
è il fattoriale di n esso assume i seguenti valori
se n=0 fatt(n)=1
Altrimenti fatt(n(= n*n-1*n-2* *2*1
cioè è il prodotto dei numeri da 1 a n
Triangolo di Tartaglia
Ogni elemento è dato da j!/(k!*(j-k)!
Con J che va da 0 a n dove n è il numero delle righe
e k va da 0 a j
![Page 20: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/20.jpg)
#include <cstdlib>#include <iostream>using namespace std;float x,y;void scambia(float a, float b);
Int main (){ cin>>x; cin>>y; scambia (x,y); cout<<“i valori di x e y sono “<<x<<“ “<<y<< endl; system("PAUSE"); return EXIT_SUCCESS;}void scambia(float a, float b){ float app; app=a; a=b; b=app; return;}
Provate a ricopiare questo programma e verificate quanto avete dichiarato
Cosa fa questo programma?
![Page 21: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/21.jpg)
Perché le variabili non sono scambiate?
Non è un errore di algoritmo
E’ una questione di parametri
Alla procedura scambia vengono passati dei parametri per valore
Questo vuol dire che quando viene eseguita la procedura essa viene corredata della copia dei valori contenuti nei parametri x,y che sono le effettive variabili su cui viene eseguito lo scambio.
Cioè la x e la y del main e quelle della procedura puntano a due celle di memoria differenti pertanto le modifiche apportate alle celle puntate dalle variabili della procedura non sono riportate anche sulle altre e tali modifiche alla chiusura della procedura vengono perse
Come si risolve questo problema?
![Page 22: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/22.jpg)
Quando si vuole che le variabili passate come parametri devono conservare le modifiche effettuate dalla procedura occorre anteporre al nome del parametro la &
In questo modo la variabile viene passata per indirizzo e quindi sia le variabili del main che quella passata come parametro alla procedura o funzione puntano alla stessa cella di memoria
Il prototipo di scambia diventa
void scambia(float &a, float &b);
![Page 23: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/23.jpg)
#include <cstdlib>#include <iostream>using namespace std;float x,y;void scambia(float &a, float &b);
Int main (){ cin>>x;; cin>>y; scambia (x,y); cout<<“i valori di x e y sono “<<x<<“ “<<y<< endl; system("PAUSE"); return EXIT_SUCCESS;}void scambia(float &a, float &b){ float app; app=a; a=b; b=app; return;}
a e b sono detti parametri formali e quando sono accompagnati con la & essi sono passati per indirizzo cioè si punta
alla stessa cella di memoria della variabile che viene passata al momento
del richiamo.In questo modo conserva le modifi che
X e y sono parametri attuali
![Page 24: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/24.jpg)
void acquisisciraggio(float &r ){do{ cout<<"inserire il raggio deve essere tale che non superi il valore 100 "; cin>>r; } while (r<0 || r>100); return; }
Questo codice permette di inserire un raggio con controllo sul suo valoreIl suo richiamo nel main sarà:int main(){ float r; acquisisciraggio( r); cout<< “la circonferenza è “<<2*r*3.14; return 0;}Posso realizzare la stessa funzionalità con una funzione?
![Page 25: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/25.jpg)
float acquisisciraggio(){ float r; { cout<<"inserire il raggio deve essere tale che non superi il valore 100 "; cin>>r; } while (r<0 || r>100); return r; }
In questo caso cambia il modo di richiamare il programma ad esempio :int main(){ float r=acquisisciraggio( ); cout<< “la circonferenza è “<<2*r*3.14; return 0;}
![Page 26: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/26.jpg)
void acquisiscilatitriangolo(int &x, int &y , int &z){ do{ cout<<"inserire un valore positivo cin>>x; } while (x<0 ); do{ cout<<"inserire un valore positivo cin>>y; } while (y<0 );do{ cout<<"inserire un valore positivo cin>>z; } while (z<0 );
return; }
Questa procedura permette l’acquisizione delle coordinate con cotrollo.Posso trasformarla in funzione?
![Page 27: Le funzioni. Cosa fa questo programma? #include using namespace std; int x; float y; int main() { x=rand(); y=sqrt(x); cout](https://reader036.vdocuments.mx/reader036/viewer/2022081513/5542eb4c497959361e8ba039/html5/thumbnails/27.jpg)
int acquisiscilatitriangolo(int &x, int &y , int &z){ do{ cout<<"inserire un valore positivo cin>>x; } while (x<0 ); do{ cout<<"inserire un valore positivo cin>>y; } while (y<0 );do{ cout<<"inserire un valore positivo cin>>z; } while (z<0 ); return 0; }
Questa volta devo lasciare i parametri perché i lati sono tre e le funzioni restituiscono un solo valore ma essa è comunque una funzione che però deve essere richiamata come una procedura e non come una funzione.