Esercizi sulle funzioni void e non void (superiori)
I seguenti esercizi riguardano Funzioni Void e non Void studiati nella Lezione 19 della Parte Prima. Essi sono divisi per paragrafi in modo tale da favorire la scelta degli esercizi specifici.
esercizi1 funzioni
modificaEsercizio n.1 Scrivi una funzione void per il calcolo dell'
area di un trapezio
modifica#include <cstdlib>
#include <iostream>
using namespace std;
//questo è il prototipo della funzione
void areatrapezio (int baseminore, int basemaggiore, int altezza, int *area);
int main(int argc, char *argv[])
{
int a,b,c,d,e,f,g,h;
cout<<"inserisci la base minore";
cin>>a;
cout<<"inserisci la base maggiore";
cin>>b;
cout<<"inserisci l'altezza";
cin>>c;
areatrapezio (a,b,c,&d);// 1 chiamata alla funzione
cout<<"l'area vale "<<d <<endl;
cout<<"inserisci la base minore";
cin>>e;
cout<<"inserisci la base maggiore";
cin>>f;
cout<<"inserisci l'altezza";
cin>>g;
areatrapezio (e,f,g,&h);// 2 chiamata alla funzione
cout<<"l'area vale "<<h<<endl;
system ("PAUSE");
return 0;
}
// questa è la dichiarazione della funzione
void areatrapezio (int baseminore, int basemaggiore, int altezza, int *area)
{
*area=(baseminore+basemaggiore)*altezza/2;
}
Esercizio n.2 Scrivi una funzione void per calcolare
l'area di un rettangolo
modifica#include <cstdlib>
#include <iostream>
using namespace std;
/* calcolo area rettangolo utilizzando le funzioni void
obiettivo uso funzioni void restituzione valori
*/
void arearettangolo(float lato, float altezza, float *area);
int main(int argc, char *argv[])
{
float lato, altezza,a;
cout<<"inserire il lato ";
cin>>lato;
cout<<"inserire l'altezza ";
cin>>altezza;
arearettangolo(lato,altezza,&a);
cout<<"l'area del rettangolo è: "<<a<<endl;
system("PAUSE");
return 0;
}
void arearettangolo(float lato, float altezza, float *area)
{
*area=lato*altezza;
}
Esercizio n.3 Calcolo del
max e della posizione del massimo d un vettore generico
modifica#include <cstdlib>
#include <iostream>
using namespace std;
void mia(int v[],int n,int *m,int *p);
int main(int argc, char *argv[])
{ int i;
int vett[3]={3,8,9};
cout<<"il vettore1 contiene ";
for(i=0;i<3;i++) cout<<vett[i]<<",";
cout<<endl;
int max,posmax;
mia(vett,3,&max,&posmax);
cout<<" Il valore max e':"<<max<<endl;
cout<<" La posizione del max e':"<<posmax<<endl;
int vett2[7]={7,3,6,1,2,8,0} ;
cout<<"il vettore2 contiene ";
for(i=0;i<7;i++) cout<<vett2[i]<<",";
cout<<endl;
int max2,posmax2;
mia(vett2,7,&max2,&posmax2);
cout<<" Il valore max e':"<<max2<<endl;
cout<<" La posizione del max e':"<<posmax2<<endl;
system("PAUSE");
return 0;
}
void mia(int v[],int n,int *m,int *p)
{
int a;
int b;
int i;
a=v[0];
b=0;
for(i=1;i<n;i++)
if(v[i]>a)
{
a=v[i];
b=i;
}
*m=a;
*p=b;
}
Esercizio n.4 Calcolo del
max di un vettore generico passato tramite puntatore
modifica#include <cstdlib>
#include <iostream>
using namespace std;
/* trovare il max di un vettore
il vettore è passato per indirizzo con sintassi dei puntatori int *vett
invece di passarlo per indirizzo con sintassi dei vettori int vett[]
*/
void maxvettore (int *vett, int n, int *massimo);
int main(int argc, char *argv[])
{
int ne ;
cout<<"inserisci numero elementi vettore? ";
cin>>ne;
int altezze[ne];
int i;
for(i=0;i<ne;i++)
{ cout<<"inserisci l'elemento di posizione "<< i <<" ?";
cin>>altezze[i];
}
int soluzione;
maxvettore(altezze,ne,&soluzione);
cout<<"il max vale "<<soluzione <<endl;
system ("PAUSE");
return 0;
}
void maxvettore (int *vett, int n, int *massimo)
{ int i;
*massimo= *(vett+0);
for(i=0;i<n;i++)
if ( *(vett+i) > *massimo )
*massimo = *(vett+i);
}
Esercizio n.5 calcolo del
doppio di un numero tramite funzione void e tramite funzione non void
modificainclude <cstdlib>
#include <iostream>
using namespace std;
/*scrivi due funzioni che calcolino il doppio di un numero
la prima funzione è void la seconda non void
obiettivo: sottolineare differenza fra void e non void
*/
void doppio(int a, int *c);
int doppio2(int a);
int main(int argc, char *argv[])
{
int z,k;
z=3;
doppio(z,&k);
cout<<k<<endl;//stampa il doppio di z
doppio(7,&k);
cout<<k<<endl;//stampa il doppio di 7
doppio(2+z*3,&k);
cout<<k<<endl;//stampa il doppio del valore 2+z*3
k=doppio2(z);
cout<<k<<endl;//stampa il doppio di z
k=doppio2(3);
cout<<k<<endl;//stampa il doppio di 3
k=doppio2(2+z*3);
cout<<k<<endl;//stampa il doppio del valore 2+z*3
k=doppio2(4)*7;
cout<<k<<endl; //56
k=doppio2(4)*doppio2(6)+7-4;
cout<<k<<endl; //99
k=doppio2(doppio2(6)+7)-4;
cout<<k<<endl; //34
system("PAUSE");
return 0;
}
void doppio(int a, int *c)
{*c = 2*a;
}
int doppio2(int a)
{ return 2*a;
}
Esercizio n.6 Risolvere una
equazione di 2^ grado
modificatramite una funzione
#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;
void soleq2grado(float a,float b,float c,float &x1,float &x2,bool &sol)
{ float delta;
delta = b*b-4*a*c;
if(delta <0)
{ sol=false;
}
else
{ x1= (-b-sqrt(delta))/(2*a);
x2= (-b+sqrt(delta))/(2*a);
sol=true;
}
}
int main(int argc, char *argv[])
{
float s1,s2;
bool sece;
soleq2grado(5,7,2, s1,s2,sece);// par attuali
if(sece)
cout<<"x1="<< s1<<" x2= "<< s2<< endl;
else
cout<<"nessuna soluzione";
float b1,b2,b3, k1,k2;
cout<<" inserisci a=";
cin>>b1;
cout<<" inserisci b=";
cin>>b2;
cout<<" inserisci c=";
cin>>b3;
soleq2grado(b1,b2,b3, k1,k2,sece);// par attuali
if(sece)
cout<<"x1="<< k1<<" x2= "<< k2<< endl;
else
cout<<"nessuna soluzione";
system("PAUSE");
return EXIT_SUCCESS;
}
esercizi2 funzioni
modificaEsercizio n.1 Scrivi una funzione che ordini un vettore mediante il bubblesort Scrivi una funzione per la ricerca dicotomica (restituisce come posizione -1 per indicare che il numero ricercato non è presente nel vettore
#include <cstdlib>
#include <iostream>
using namespace std;
/* ordinamento e ricerca dicotomica attraverso uso funzioni
obiettivo: implementare il bubblesort e la ricerca dicotomica
mediante funzioni
*/
void ordinamento( int vett[], int n);//prototipo
void ricerca( int vett[], int inf, int sup , int ricercato, int *posizione);
int main(int argc, char *argv[])
{ int v[]={3,6,76,1,2,9,7,5,0} ;
int numero=9;
cout<<"vettore disordinato"<<endl;
for(int k=0;k<numero;k++)
cout<<v[k]<<" ,";
cout<<endl;
ordinamento(v,numero); //chiamata alla funzione
cout<<"vettore ordinato"<<endl;
for(int k=0;k<numero;k++)
cout<<v[k]<<" ,";
cout<<endl;
cout<<"inserisci un valore da cercare";
int valore;
int soluzione;
cin>> valore;
ricerca(v,0,numero-1,valore,&soluzione); //chiamata alla funzione
cout<<"il valore: "<<valore<<" si trova nella pos:"<<soluzione<<endl;
system("PAUSE");
return 0;
}
void ordinamento( int vett[], int n) //dichiarazione
{ int i,j;
int temp;
for(i=1;i<n;i++)
for(j=n-1;j>=i;j--)
if(vett[j]<vett[j-1])
{ temp=vett[j];
vett[j]=vett[j-1];
vett[j-1]=temp;
}
}
void ricerca( int vett[], int inf, int sup , int ricercato, int *posizione)
{ bool trovato;
int centro;
trovato= false;
while( (!trovato) && (inf<=sup))
{ centro=(inf+sup)/2;
if(vett[centro]==ricercato)
{ trovato=true;
*posizione=centro;
}
else if(ricercato<vett[centro])
sup=centro-1;
else
inf=centro+1;
}
if (!trovato) *posizione =-1;
}
Esercizio n.2
data una matrice generica nel numero di righe ( e con 5 colonne) scrivere una funzione che calcoli la somma di ciascuna riga
#include <cstdlib>
#include <iostream>
using namespace std;
/* somma di ciascuna riga di una matrice
obiettivo : funzioni e passaggio matrici
calcolo somma ciascuna riga matrice
*/
void somma( int mat[][5], int nrighe, int vett[]);
int main(int argc, char *argv[])
{
int m[3][5] = { 4,6,7,8,9,
3,4,5,6,7,
2,4,3,1,1
} ;
int risposta[3];
somma(m,3,risposta);
int k;
for(k=0;k<3;k++)
cout<<risposta[k]<<" ,";
system("PAUSE");
return 0;
}
void somma( int mat[][5], int nrighe, int vett[])
{ int i,j;
for (j=0;j<5;j++)
{vett[j]=0;
for( i=0;i<nrighe;i++)
vett[j]=vett[j]+mat[i][j];
}
}
Esercizio n.3 Calcola il massimo di una matrice con numero di righe generico e numero di colonne uguale a 3
#include <cstdlib>
#include <iostream>
using namespace std;
/* calcolo max di una matrice generica nel numero righe*/
void massimo(int mat[][3], int nrighe, int *massimo);
int main(int argc, char *argv[])
{
int m[][3] = { 4,6,7,
6,8,9,
2,5,4,
1,8,32
};
int soluzione;
massimo(m,4,&soluzione );
cout<<" il max = "<< soluzione<<endl;
system("PAUSE");
return 0;
}
void massimo(int mat[][3], int nrighe, int *massimo)
{ int i,j;
*massimo=mat[0][0];
for(i=0;i<nrighe;i++)
for(j=0;j<3;j++)
if (mat[i][j]> *massimo)
*massimo = mat[i][j];
}
esercizio n.4 Calcola la somma di ciascuna riga di una matrice generica (sia righe e sia colonne)
#include <cstdlib>
#include <iostream>
using namespace std;
/* somma righe matrice
dove la matrice è passata come puntatore a intero
obiettivo : passaggio matrice generica nelle righe e nelle colonne a funzione
cast
calcolo indirizzo cella matrice noto indirizzo base e indici riga
e colonna i j
*/
void somma( int *mat , int nrighe,int ncolonne, int vett[]);
int main(int argc, char *argv[])
{
int m[3][5] = { 4,6,7,8,9,
3,4,5,6,7,
2,4,3,1,1
} ;
int risposta[5];
somma((int *)m,3,5,risposta); // (int *)m si poteva usare &m[0][0]
int k;
for(k=0;k<5;k++)
cout<<risposta[k]<<" ,";
system("PAUSE");
return 0;
}
void somma( int *mat , int nrighe,int ncolonne, int vett[])
{ int i,j;
for (j=0;j<ncolonne;j++)
{vett[j]=0;
for( i=0;i<nrighe;i++)
vett[j]=vett[j]+*(mat+j+i*ncolonne);
}
}
Esercizio n. 5 Calcola il massimo di una matrice generica nelle dimensioni
#include<iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
/* max matrice generica sia nel numero di righe e sia nelle colonne
*/
void massimo(int *mat, int nrighe,int ncolonne, int *massimo);
int main(int argc, char *argv[])
{
int m[4][3] = {4,6,7,
6,8,9,
2,5,4,
1,8,32
};
int soluzione;
massimo((int *)m,4,3,&soluzione );
cout<<" il max = "<< soluzione<<endl;
system("PAUSE");
return 0;
}
void massimo(int *mat, int nrighe,int ncolonne, int *massimo)
{ int i,j;
*massimo= *(mat+0*ncolonne+0); // *massimo = *mat
for(i=0;i<nrighe;i++)
for(j=0;j<ncolonne;j++)
if (*(mat+i*ncolonne+j)> *massimo)
*massimo = *(mat+i*ncolonne+j);
}
Esercizio n.8 data una matrice con 7 colonne che contiene numeri fra 0 e 100, contare il numero di volte (occorrenze) con cui si ripete ogni numero fra 0 e 100 all'interno della matrice , il calcolo delle occorrenze viene fatto mediante una funzione prima di tipo void e poi di tipo non void
#include <cstdlib>
#include <iostream>
using namespace std;
void f( int m[][7], int nr, int vett[101])
{ int i,j;
for(i=0;i<101;i++) vett[i]=0;
for(i=0;i<nr;i++)
for(j=0;j<7;j++)
if( m[i][j]>=0 && m[i][j]<=100)
vett[m[i][j]]++;
}
int * f2( int m[][7], int nr)
{ int i,j;
static int vett[101];
for(i=0;i<101;i++) vett[i]=0;
for(i=0;i<nr;i++)
for(j=0;j<7;j++)
if( m[i][j]>=0 && m[i][j]<=100)
vett[m[i][j]]++;
return vett;
}
int main(int argc, char *argv[])
{ int mat[23][7];
int i,j;
for(i=0;i<23;i++)
for(j=0;j<7;j++)
mat[i][j]= rand()%100;
int risultati[101];
f(mat,23,risultati);
for(i=0;i<101;i++)
cout<<"il numero"<<i<<" e presente"<<risultati[i]<<"volte"<<endl;
cout<<"soluzione non void"<<endl;
int *p;
p=f2(mat,23);
for(i=0;i<101;i++)
cout<<"il numero"<<i<<" e presente"<<*p++ <<"volte"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
esercizio n.9
data una matrice calcolare il massimo tramite funzioni, prima passando la matrice con dimensioni 3*2, poi passando la matrice pensandola generica nel numero di righe, poi pensandola generica sia nel numero di righe e di colonne
#include <cstdlib>
#include <iostream>
using namespace std;
void mass1( int mat[3][2], int *risultato)
{ int i,j;
*risultato=mat[0][0];
for(i=0;i<3;i++)
for(j=0;j<2;j++)
if (mat[i][j]> *risultato)
*risultato = mat[i][j];
}
void mass2(int mat[][2],int nr,int *massimo)
{ int i,j;
*massimo=mat[0][0];
for(i=0;i<nr;i++)
for(j=0;j<2;j++)
if(mat[i][j]>*massimo)
*massimo=mat[i][j];
}
void mass3(int *mat,int nr,int nc, int *massimo)
{
int i,j;
*massimo=*mat;
for(i=0;i<nr;i++)
for(j=0;j<nc;j++)
if(*(mat+j+i*nc)>*massimo)
*massimo=*(mat+j+i*nc);
}
int main(int argc, char *argv[])
{
int m[3][2]={3,4,
1,2,
12,8};
int x;
mass1( m, &x);
cout<<x;
mass2(m,3,&x);
cout<<x;
mass3((int*)m,3,2,&x);
cout<<x;
system("PAUSE");
return EXIT_SUCCESS;
}