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
[modifica]Esercizio 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
[modifica]include <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
[modifica]tramite 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
[modifica]Esercizio 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;
}