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;
}