Informatica 2 Liceo Scientifico Scienze Applicate/Esercizi2

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

Esercizi

scambiare 2 righe matrice[modifica]

Esercizio n.8 Sviluppare una procedura che scambi i valori della riga i di una matrice con i valori della riga j (con i e j parametri della procedura). Sviluppare un programma principale che chiami la procedura.

#include <cstdlib>
#include <iostream>
/*Esercizio 10 Sviluppare una procedura che scambi i valori della riga i 
  di una matrice con i valori della riga j 
  (con i e j parametri della procedura).
   Sviluppare un programma principale che chiami la procedura
   */
   
using namespace std;

void inserisci_matrice( int *mt, int m, int n);
void stampa_matrice( int *mt, int m, int n);
void scambia_riga_i_con_riga_j( int *mt, int m, int n, int i, int j );

int main(int argc, char *argv[])
{   int m,n,ri,rj;
    cout<<" di quante righe e' composta la matrice ?";
    cin >>m;
    cout<<" di quante colonne e' composta la matrice ?";
    cin >>n;
    int mat[m][n]; 
    inserisci_matrice((int*)mat,m,n);
    cout<<"la matrice inserita' e':"<<endl;
    stampa_matrice((int*)mat,m,n);
    cout<<" seleziona una riga della matrice ?";
    cin >>ri;
    cout<<" seleziona una seconda riga della matrice ?";
    cin >>rj;
    scambia_riga_i_con_riga_j((int *)mat,m,n,ri,rj);
    cout<<"la matrice con le righe scambiate e':"<<endl;
    stampa_matrice((int*)mat,m,n);
    system("PAUSE");
    return EXIT_SUCCESS;
}

void inserisci_matrice( int *mt, int m, int n)
{ int i,j;
  for(i=0;i<m;i++)
     for(j=0;j<n;j++)
       {cout<<"inserisci l'elemento di indice ["<<i<<","<<j<<"] ";
        cin>>*(mt+i*n+j); 
       }
}

void stampa_matrice( int *mt, int m, int n)
{ int i,j;
  for(i=0;i<m;i++)
     {for(j=0;j<n;j++)
       cout<<*(mt+i*n+j)<<"\t"; 
     
     cout<<endl;
     }
}

void scambia_riga_i_con_riga_j( int *mt, int m, int n, int i, int j )
{int k,temp;
 for(k=0;k<n;k++)
  { temp=*(mt+i*n+k);
    *(mt+i*n+k)=*(mt+j*n+k);
    *(mt+j*n+k)=temp;
  }
}

Soluzione breve


#include <cstdlib>
#include <iostream>

using namespace std;

void scambiorighe(int *mat,int nrig, int ncol,int x, int y);

void scambiorighe(int *mat,int nrig, int ncol,int x, int y)
{   int k;int temp;
    for(k=0;k<ncol;k++)
     {temp=*(mat+x*ncol+k);
      *(mat+x*ncol+k)=*(mat+y*ncol+k);
      *(mat+y*ncol+k)=temp;
     }
}

int main(int argc, char *argv[])
{
    int nr,nc;
    cout<<"dimensione matrice"<<endl<<"righe: ";
    cin>>nr;
    cout<<"colonne: ";
    cin>>nc;
    int matrice[nr][nc];
    int i,j;
    for(i=0;i<nr;i++)
     for(j=0;j<nc;j++)
     matrice[i][j]=rand()%10;
    for(i=0;i<nr;i++)
     {for(j=0;j<nc;j++)
      cout<<matrice[i][j]<<" ";
      cout<<endl;
     }
    int rigax,rigay;
    cout<<"che righe vuoi scambiare?";
    cin>>rigax;
    cin>>rigay;
    scambiorighe((int*)matrice,nr,nc,rigax,rigay);
    for(i=0;i<nr;i++)
     {for(j=0;j<nc;j++)
      cout<<matrice[i][j]<<" ";
      cout<<endl;
     }
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

ricerca sottomatrici[modifica]

Esercizio n.9

Scrivere un programma atto ad identificare nell'interno di una matrice generica se ci sono delle sottomatrici 2x2 di soli valori nulli.

#include <cstdlib>
#include <iostream>
/* Esercizio 11 Scrivere un programma atto ad identificare nell'interno di una
   matrice generica se ci sono delle sottomatrici 2x2 di soli valori nulli.
*/
using namespace std;

int main(int argc, char *argv[])
{ int m,n,i,j,conta;
  cout<<" di quante righe e' composta la matrice ?";
  cin >>m;
  cout<<" di quante colonne e' composta la matrice ?";
  cin >>n;
  int mat[m][n]; 
  
  for(i=0;i<m;i++)
   for(j=0;j<n;j++)
    {cout<<"inserisci l'elemento di indice ["<<i<<","<<j<<"] ";
     cin>>mat[i][j]; 
    }
 
cout<<"la matrice inserita e'"<<endl;
  for(i=0;i<m;i++)
   { for(j=0;j<n;j++)
       cout<<mat[i][j]<<"\t"; 
     cout<<endl;  
    }
  
   for(i=0;i<=m-2;i++)
    for(j=0;j<=n-2;j++)
     if(mat[i][j]==0 &&mat[i+1][j]==0 &&mat[i][j+1]==0 &&mat[i+1][j+1]==0 )
      cout<<"trovata sottomatrice 2*2 nulla con vertice il alto a sx di coord ["
          <<i<<","<<j<<"]"<<endl;
  
    system("PAUSE");
    return EXIT_SUCCESS;
}

Soluzione con l'uso delle funzioni

#include <cstdlib>
#include <iostream>
/* Esercizio 11 Scrivere un programma atto ad identificare nell'interno di una
   matrice generica se ci sono delle sottomatrici 2x2 di soli valori nulli.
*/
using namespace std;

void inserisci_matrice( int *mt, int m, int n);
void stampa_matrice( int *mt, int m, int n);
void posizioni_sottomatrici2x2_nulle( int *mt, int m, int n, int posizioni[][2]
                                    , int *quante );

int main(int argc, char *argv[])
{ int m,n,i,j,conta;
  cout<<" di quante righe e' composta la matrice ?";
  cin >>m;
  cout<<" di quante colonne e' composta la matrice ?";
  cin >>n;
  int mat[m][n]; 
  
  inserisci_matrice((int*)mat,m,n);
 
  cout<<"la matrice inserita' e':"<<endl;
  stampa_matrice((int*)mat,m,n);
 
  int soluz[m*n][2];
  int contaquante;
  
  posizioni_sottomatrici2x2_nulle((int*)mat,m,n,soluz,&contaquante);
    
  for(i=0;i<contaquante;i++)
   cout<<"trovata sottomatrice 2*2 nulla con vertice il alto a sx di coord ["
          <<soluz[i][0]<<","<<soluz[i][1]<<"]"<<endl;
  
    system("PAUSE");
    return EXIT_SUCCESS;
}

void inserisci_matrice( int *mt, int m, int n)
{ int i,j;
  for(i=0;i<m;i++)
     for(j=0;j<n;j++)
       {cout<<"inserisci l'elemento di indice ["<<i<<","<<j<<"] ";
        cin>>*(mt+i*n+j); 
       }
}

void stampa_matrice( int *mt, int m, int n)
{ int i,j;
  for(i=0;i<m;i++)
     {for(j=0;j<n;j++)
       cout<<*(mt+i*n+j)<<"\t"; 
     
     cout<<endl;
     }
}



void posizioni_sottomatrici2x2_nulle( int *mt, int m, int n, int posizioni[][2]
                                    , int *quante )
{int i,j;
 *quante=0;
 for(i=0;i<=m-2;i++)
  for(j=0;j<=n-2;j++)
   if(*(mt+i*n+j)==0 && *(mt+(i+1)*n+j)==0 && *(mt+i*n+j+1)==0 
      && *(mt+(i+1)*n+j+1)==0 )
      { posizioni[*quante][0]=i;
        posizioni[*quante][1]=j;
        (*quante)++;
      }
}

ricerca riga matrice max e min[modifica]

Esercizio n.10

Per un'assegnata matrice determinare la riga con la somma di elementi massima e quella con la somma minima. Effettuare lo scambio tra le righe precedentemente determinate.


#include <cstdlib>
#include <iostream>
/* Esercizio 12 Per un'assegnata matrice determinare la riga con la somma di
 elementi massima e quella con la somma minima. 
 Effettuare lo scambio tra le righe precedentemente determinate.
*/

using namespace std;

int main(int argc, char *argv[])
{ int m,n,i,j,conta;
  cout<<" di quante righe e' composta la matrice ?";
  cin >>m;
  cout<<" di quante colonne e' composta la matrice ?";
  cin >>n;
  int mat[m][n]; 
  
  for(i=0;i<m;i++)
   for(j=0;j<n;j++)
    {cout<<"inserisci l'elemento di indice ["<<i<<","<<j<<"] ";
     cin>>mat[i][j]; 
    }
 
 cout<<"la matrice inserita e'"<<endl;
  for(i=0;i<m;i++)
   { for(j=0;j<n;j++)
       cout<<mat[i][j]<<"\t"; 
     cout<<endl;  
    }
 
 int rigamax=0;
 int somma=0;
 int sommamax = 0;  
 for(j=0;j<n;j++)sommamax=sommamax+mat[0][j];
 
 for(i=1;i<m;i++)
   {somma=0; 
    for(j=0;j<n;j++) somma=somma+mat[i][j];
    
    if(somma>sommamax)
      { sommamax=somma;
        rigamax=i;
      }  
   }
  
 cout<<"rigamax"<<rigamax<<endl;
 int rigamin=0;
 int sommamin = 0;  
 for(j=0;j<n;j++)sommamin=sommamin+mat[0][j];
 
 for(i=1;i<m;i++)
   {somma=0; 
    for(j=0;j<n;j++) somma=somma+mat[i][j];
    
    if(somma<sommamin)
      { sommamin=somma;
        rigamin=i;
      }  
   }
 cout<<"rigamin"<<rigamin<<endl;
 int k,temp;
  for(k=0;k<n;k++)
  { temp=mat[rigamax][k];
    mat[rigamax][k]=mat[rigamin][k];
    mat[rigamin][k]=temp;
  } 
  
  cout<<"la matrice con le righe dalla somma max e min scambiate fra loro e'"<<endl;
   for(i=0;i<m;i++)
   { for(j=0;j<n;j++)
       cout<<mat[i][j]<<"\t"; 
     cout<<endl;  
    } 
     
    system("PAUSE");
    return EXIT_SUCCESS;
}

soluzione con l'uso delle funzioni

#include <cstdlib>
#include <iostream>
/* Esercizio 12 Per un'assegnata matrice determinare la riga con la somma di
   elementi massima e quella con la somma minima. 
   Effettuare lo scambio tra le righe precedentemente determinate.
*/

using namespace std;
void inserisci_matrice( int *mt, int m, int n);
void stampa_matrice( int *mt, int m, int n);
void scambia_riga_min_con_riga_max( int *mt, int m, int n);

int main(int argc, char *argv[])
{ int m,n,i,j,conta;
  cout<<" di quante righe e' composta la matrice ?";
  cin >>m;
  cout<<" di quante colonne e' composta la matrice ?";
  cin >>n;
  int mat[m][n]; 
  
  inserisci_matrice((int*)mat,m,n);
  cout<<"la matrice inserita' e':"<<endl;
  stampa_matrice((int*)mat,m,n);
 
 scambia_riga_min_con_riga_max((int *)mat,m,n);
 cout<<"la matrice con le righe scambiate e':"<<endl;
 stampa_matrice((int*)mat,m,n);
 
  
    system("PAUSE");
    return EXIT_SUCCESS;
}

void inserisci_matrice( int *mt, int m, int n)
{ int i,j;
  for(i=0;i<m;i++)
     for(j=0;j<n;j++)
       {cout<<"inserisci l'elemento di indice ["<<i<<","<<j<<"] ";
        cin>>*(mt+i*n+j); 
       }
}

void stampa_matrice( int *mt, int m, int n)
{ int i,j;
  for(i=0;i<m;i++)
     {for(j=0;j<n;j++)
       cout<<*(mt+i*n+j)<<"\t"; 
     
     cout<<endl;
     }
}

void scambia_riga_min_con_riga_max( int *mt, int m, int n )
{int i,j;
 int rigamax=0;
 int somma=0;
 int sommamax = 0;  
 for(j=0;j<n;j++)sommamax=sommamax+*(mt+0*n+j);
 
 for(i=1;i<m;i++)
   {somma=0; 
    for(j=0;j<n;j++) somma=somma+*(mt+i*n+j);
    
    if(somma>sommamax)
      { sommamax=somma;
        rigamax=i;
      }  
   }
  
 int rigamin=0;
 int sommamin = 0;  
 for(j=0;j<n;j++)sommamin=sommamin+*(mt+0*n+j);
 
 for(i=1;i<m;i++)
   {somma=0; 
    for(j=0;j<n;j++) somma=somma+*(mt+i*n+j);
    
    if(somma<sommamin)
      { sommamin=somma;
        rigamin=i;
      }  
   }
 int k,temp;
 
 for(k=0;k<n;k++)
  { temp=*(mt+rigamin*n+k);
    *(mt+rigamin*n+k)=*(mt+rigamax*n+k);
    *(mt+rigamax*n+k)=temp;
  }
}

Incornicia la matrice[modifica]

Esercizio 11
Considerando una matrice bidimensionale come rappresentativa dei punti della superficie di un quadrato, scrivere un programma per porre a 0 tutti i valori del perimetro del quadrato o di un quadrato in esso contenuto.

#include <cstdlib>
#include <iostream>
/* Esercizio 13 Considerando una matrice bidimensionale come rappresentativa 
   dei punti della superficie di un quadrato, scrivere un programma per porre 
   a 0 tutti i valori del perimetro del quadrato o di un quadrato in esso 
   contenuto.
*/

using namespace std;

int main(int argc, char *argv[])
{int m,n,i,j,conta;
 cout<<" di quante righe e' composta la matrice ?";
 cin >>m;
 cout<<" di quante colonne e' composta la matrice ?";
 cin >>n;
 int mat[m][n]; 
  
  for(i=0;i<m;i++)
   for(j=0;j<n;j++)
    mat[i][j]=0; 
 
 int rq,cq,lq;
 cout<<"inserisci le coordinate del quadrato vertice sx in alto "<<endl;
 cout<<"riga?";
 cin>>rq;
 cout<<"colonna?";
 cin>>cq;    
 cout<<"dimensione lato ?";
 cin>>lq;
 
 for(i=rq;i<m && i<rq+lq;i++)
  { mat[i][cq]=1;
    mat[i][cq+lq-1]=1;
  }
 for(j=cq;j<n && j<cq+lq;j++)
  { mat[rq][j]=1;
    mat[rq+lq-1][j]=1;
  } 
  
cout<<"la matrice inserita e'"<<endl;
  for(i=0;i<m;i++)
   { for(j=0;j<n;j++)
       cout<<mat[i][j]; 
     cout<<endl;  
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}

Soluzione con l'uso delle funzioni

#include <cstdlib>
#include <iostream>
/* Esercizio 13 Considerando una matrice bidimensionale come rappresentativa 
   dei punti della superficie di un quadrato, scrivere un programma per porre 
   a 0 tutti i valori del perimetro del quadrato o di un quadrato in esso 
   contenuto.
*/

using namespace std;

void stampa_matrice( int *mt, int m, int n);
void disegnaquadrato( int *mt, int m, int n, int rq, int cq,int lq );
                                    
int main(int argc, char *argv[])
{int m,n,i,j,conta;
 cout<<" di quante righe e' composta la matrice ?";
 cin >>m;
 cout<<" di quante colonne e' composta la matrice ?";
 cin >>n;
 int mat[m][n]; 
   
 int rq,cq,lq;
 cout<<"inserisci le coordinate del quadrato vertice sx in alto "<<endl;
 cout<<"riga?";
 cin>>rq;
 cout<<"colonna?";
 cin>>cq;    
 cout<<"dimensione lato ?";
 cin>>lq;
disegnaquadrato((int *) mat,m,n,rq,cq,lq);  
cout<<"la matrice inserita e'"<<endl;
stampa_matrice((int*)mat,m,n);

 system("PAUSE");
 return EXIT_SUCCESS;
}


void disegnaquadrato( int *mt, int m, int n, int rq, int cq,int lq )
{int i,j;
  for(i=0;i<m;i++)
   for(j=0;j<n;j++)
    *(mt+i*n+j)=0; 
    
for(i=rq;i<m && i<rq+lq;i++)
  { *(mt+i*n+cq)=1;
    *(mt+i*n+cq+lq-1)=1;
  }
 for(j=cq;j<n && j<cq+lq;j++)
  { *(mt+rq*n+j)=1;
    *(mt+(rq+lq-1)*n+j)=1;
  } 
} 

 void stampa_matrice( int *mt, int m, int n)
{ int i,j;
  for(i=0;i<m;i++)
     {for(j=0;j<n;j++)
       cout<<*(mt+i*n+j); 
     
     cout<<endl;
     }
}


ordinare un vettore[modifica]

Esercizio 12
Ordinamento di un vettore in modo crescente e decrescente.


Soluzione con l'uso delle funzioni


fusione di 2 vettori[modifica]

Esercizio 13
Fusione di due vettori.( cioè dati due vettori ordinati creare un terzo vettore con dimensione pari alla somma dei 2 vettori precedenti e che contenga gli stessi dati dei due vettori precedenti e che siano ordinati , non usare bubblesort perché la tecnica della fusione è O(n1+n2) , per fare questo devi usare due indici i e j che puntino inizialmente alla posizione 0 di entrambi i 2 vettori iniziali identificare l'elemento più piccolo e scriverlo nel terzo vettore poi devi avanzare nel vettore da cui hai letto l'elemento quindi i++ o j++ e cercare nuovamente l'elemento più piccolo dei due puntati da i e j etc , se uno dei 2 vettori termina trascrivi la parte finale dell'altro sul terzo vettore.

#include <cstdlib>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    int i,n1;
    cout<<"inserisci la dimensione del primo vettore";
    cin>>n1;
    int v1[n1];
    
    cout<<"inserisci gli elementi del 1^ vettore, il vettore e'ordinato"<<endl;
    for(i=0;i<n1;i++)
     {cout<<"inserisci l'elemento di posizione ["<<i<<"]";
      cin>>v1[i];
     }
     
   int n2;
   cout<<"inserisci la dimensione del secondo vettore";
   cin>>n2;
   int v2[n2];
    
    cout<<"inserisci gli elementi del 2^ vettore, il vettore e'ordinato"<<endl;
    for(i=0;i<n2;i++)
     {cout<<"inserisci l'elemento di posizione ["<<i<<"]";
      cin>>v2[i];
     }
     
    int v3[n1+n2];
    int pv1=0;
    int pv2=0;
    while(pv1<n1 && pv2<n2)
    { if(v1[pv1]<=v2[pv2])
       {v3[pv1+pv2]=v1[pv1];
       pv1++;
       }
       else
        {v3[pv1+pv2]=v2[pv2];
       pv2++;
       }
    }
    while(pv1<n1)
    { v3[pv1+pv2]=v1[pv1];
       pv1++;
     }
     while(pv2<n2)
    { v3[pv1+pv2]=v2[pv2];
       pv2++;
     }
    cout<<"la fusione dei 2 vettori ha dato luogo a questo vettore"<<endl;
    for(i=0;i<n1+n2;i++)
     cout<<v3[i]<<",";
    cout<<endl;   
    system("PAUSE");
    return EXIT_SUCCESS;
}


Soluzione con l'uso delle funzioni

#include <cstdlib>
#include <iostream>
/*Fusione di due vettori.( cioè dati due vettori ordinati creare un terzo
 vettore con dimensione pari alla somma dei 2 vettori precedenti e che contenga 
 gli stessi dati dei due vettori precedenti e che siano ordinati , non usare
 bubblesort perché la tecnica della fusione è O(n1+n2) , per fare questo devi
  usare due indici  i e j che puntino inizialmente alla posizione 0 di entrambi
  i 2 vettori iniziali identificare l'elemento più piccolo e scriverlo nel terzo
  vettore poi devi avanzare nel vettore da cui hai letto l'elemento quindi i++ 
  o j++  e cercare nuovamente l'elemento più piccolo dei due puntati da i e j 
   etc , se uno dei 2 vettori termina trascrivi la parte finale dell'altro sul
   terzo vettore.
*/
using namespace std;
void inseriscivettore(int v[],int n);
void stampavettore(int v[],int n);
void fusionevettore(int a[],int na, int b[],int nb, int c[]);
int main(int argc, char *argv[])
{
    int i,n1;
    cout<<"inserisci la dimensione del primo vettore";
    cin>>n1;
    int v1[n1];
    
    cout<<"inserisci gli elementi del 1^ vettore, il vettore e'ordinato"<<endl;
     inseriscivettore(v1,n1);
     
   int n2;
   cout<<"inserisci la dimensione del secondo vettore";
   cin>>n2;
   int v2[n2];
    
    cout<<"inserisci gli elementi del 2^ vettore, il vettore e'ordinato"<<endl;
     inseriscivettore(v2,n2);
    
     
    int v3[n1+n2];
    fusionevettore(v1,n1,v2,n2,v3);
    cout<<"la fusione dei 2 vettori ha dato luogo a questo vettore"<<endl;
    stampavettore(v3,n1+n2);
    system("PAUSE");
    return EXIT_SUCCESS;
}

void inseriscivettore(int v[],int n)
{int i;
 for(i=0;i<n;i++)
   {cout<<"inserisci l'elemento del vettore  di posizione ["<<i<<"]";
    cin>>v[i];
   }
}

void fusionevettore(int a[],int na, int b[],int nb, int c[])
{int i;
 int pa=0;
 int pb=0;
 while(pa<na && pb<nb)
    { if(a[pa]<=b[pb])
       {c[pa+pb]=a[pa];
       pa++;
       }
       else
        {c[pa+pb]=b[pb];
       pb++;
       }
    }
    while(pa<na)
    { c[pa+pb]=a[pa];
       pa++;
     }
     while(pb<nb)
    { c[pa+pb]=b[pb];
      pb++;
     }
 }
 
void stampavettore(int v[],int n)
{ int i;
  for(i=0;i<n;i++)
   cout<<v[i]<<",";
   
  cout<<endl;
}

occorrenze matrice[modifica]

Esercizio n.13 Scrivere un programma per la ricerca di un elemento in una matrice assegnata e visualizzare a video la sua frequenza. Inoltre determinare il numero di volte che si ripete ogni numero

#include <cstdlib>
#include <iostream>
/*Esercizio 17 Scrivere un programma per la ricerca di un elemento in una 
  matrice assegnata e visualizzare a video la sua frequenza. Inoltre determinare
  il numero di volte che si ripete ogni numero.
*/  

using namespace std;

int main(int argc, char *argv[])
{ int m,n,i,j,x,y,numero,conta;
  cout<<" di quante righe e' composta la matrice ?";
  cin >>m;
  cout<<" di quante colonne e' composta la matrice ?";
  cin >>n;
  int mat[m][n]; 
  
  for(i=0;i<m;i++)
   for(j=0;j<n;j++)
    mat[i][j]=rand()%10; 
   
 
 cout<<"la matrice inserita e'"<<endl;
  for(i=0;i<m;i++)
   { for(j=0;j<n;j++)
       cout<<mat[i][j]<<"\t"; 
     cout<<endl;  
    }
 cout<<"inserisci il numero di cui vuoi calcolare la freq ";
 cin>>numero;
 
 conta=0;
 for(i=0;i<m;i++)
   for(j=0;j<n;j++)
    if (mat[i][j]==numero) conta++; 
 cout<<"la frequenza del numero"<<numero<<" e' di "<<conta<<" volte"<<endl;
 

 int frequenze[m*n][2];
 
 for(i=0;i<m*n;i++) {frequenze[i][0]=0; frequenze[i][1]=0;}
 int k;
 for(i=0;i<m;i++)
   for(j=0;j<n;j++)
     { k=0;
       while( frequenze[k][1]!=0 && mat[i][j]!= frequenze[k][0] ) k++;    
       if( frequenze[k][1] == 0) frequenze[k][0]=mat[i][j];
       frequenze[k][1]++;
     } 
 
 k=0;
 while( frequenze[k][1] != 0)   
  {  cout<<"la frequenza del numero"<<frequenze[k][0]<<" e' di "
         <<frequenze[k][1]<<" volte"<<endl;
     k++;    
  }  

      
        
    system("PAUSE");
    return EXIT_SUCCESS;
}


Soluzione con l'uso delle funzioni

#include <cstdlib>
#include <iostream>
/*Esercizio 17 Scrivere un programma per la ricerca di un elemento in una 
  matrice assegnata e visualizzare a video la sua frequenza. Inoltre determinare
  il numero di volte che si ripete ogni numero.
*/  

using namespace std;
int frequenza(int *m, int nc,int nr, int numeroricercare);
void frequenza2(int *m, int nc,int nr, int soluzioni[][2]);

int main(int argc, char *argv[])
{ int m,n,i,j,x,y,numero,conta;
  cout<<" di quante righe e' composta la matrice ?";
  cin >>m;
  cout<<" di quante colonne e' composta la matrice ?";
  cin >>n;
  int mat[m][n]; 
  
  for(i=0;i<m;i++)
   for(j=0;j<n;j++)
    mat[i][j]=rand()%10; 
   
 
 cout<<"la matrice inserita e'"<<endl;
  for(i=0;i<m;i++)
   { for(j=0;j<n;j++)
       cout<<mat[i][j]<<"\t"; 
     cout<<endl;  
    }
 cout<<"inserisci il numero di cui vuoi calcolare la freq ";
 cin>>numero;
 
 conta=frequenza((int *)mat,m,n,numero);
 cout<<"la frequenza del numero"<<numero<<" e' di "<<conta<<" volte"<<endl;
 

 int frequenze[m*n][2];
 frequenza2((int *)mat, m, n, frequenze );
 
 
 int k=0;
 while( frequenze[k][1] != 0)   
  {  cout<<"la frequenza del numero"<<frequenze[k][0]<<" e' di "
         <<frequenze[k][1]<<" volte"<<endl;
     k++;    
  }  
      
    system("PAUSE");
    return EXIT_SUCCESS;
}

int frequenza(int *m, int nc,int nr, int numeroricercare)
{int i,j,conta=0;
 for(i=0;i<nr;i++)
   for(j=0;j<nc;j++)
    if (*(m+i*nc+j)==numeroricercare) conta++; 
    
 return conta;   
}

void frequenza2(int *m, int nc,int nr, int soluzioni[][2])
{int i,j;
 for(i=0;i<nc*nr;i++) {soluzioni[i][0]=0; soluzioni[i][1]=0;}
 int k;
 for(i=0;i<nr;i++)
   for(j=0;j<nc;j++)
     { k=0;
       while( soluzioni[k][1]!=0 && *(m+i*nc+j)!= soluzioni[k][0] ) k++;    
       if( soluzioni[k][1] == 0) soluzioni[k][0]=*(m+i*nc+j);
       soluzioni[k][1]++;
     } 
}