Informatica 2 Liceo Scientifico Scienze Applicate/esercizi2 funzioni

Wikibooks, manuali e libri di testo liberi.
Jump to navigation Jump to search


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