Informatica 2 Liceo Scientifico Scienze Applicate/esercizi2 funzioni
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 e' 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.6 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.7
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;
}