Esercizi sulle matrici e array (superiori)

Da Wikiversità, l'apprendimento libero.
Esercizi sulle matrici e array (superiori)
Tipo: quiz
Materia: Informatica (istituti tecnici) per le superiori
Avanzamento: quiz completo al 00%.

I seguenti esercizi riguardano Matrici e Array studiati nella Lezione 15 della Parte Prima. Essi sono divisi per paragrafi in modo tale da favorire la scelta degli esercizi specifici.

Es matrici battaglia navale[modifica]

Battaglia Navale[modifica]

Durante la seconda Guerra Mondiale i sottomarini Tedeschi affondano le navi rifornimento provenienti dall'America,è vitale che il convoglio giunga a destinazione , scorta il convoglio affondando tutti i sommergibili. Che dire , bisogna proprio scrivere il codice per aiutare gli Alleati, pensiamo di rappresentare il mare come una griglia 5*3 dove le righe rappresentano la quota di profondita' dove innescare la bomba di profondita' e la colonna rappresenta l'area di mare da proteggere. La profondita' varia da 0 a 4 e le aree da difendere sono 3 . Decifrare i messaggi della macchina enigma è stato facile con il progetto "mantovani" sai che in zona ci sono 2 U-Boat
I valori nella griglia hanno i seguenti significati:

0 -    acqua
1 -    sommergibile 
2 -    acqua hai già provato in questa posizione
3 -    sommergibile già colpito e affondato
#include  cstdlib 
#include  iostream 

using namespace std;
/* colpisci i sottomarini
   il mare è una griglia 5*3  che si realizza mediante una matrice 
   devi colpire 2 sottomarini ( posizione random scelta dal pc);
   dando la profondità x;
   dando le coordinate y dove sganciare la bomba
   il programma tiene traccia dei tentativi fatti
   e quando vinci li visualizza .
*/ 
 
int main(int argc, char *argv[])
{
  int matrice[5][3];
  int i,j;
  int const nsommergibili=2;
  int conta;
  int x,y;
 
  //creo il mare; 0 è uguale a acqua 
  for(i=0;i 5;i++)
   for(j=0;j 3;j++)
         {matrice[i][j]=0;
         }
        
  //creo i sommergibili e li posiziono
  //1 è uguale a sommergibile       
  conta=0;
  while(conta nsommergibili)  
   { x=rand()%5;
     y=rand()%3;
     if(matrice[x][y]==0)
       {  matrice[x][y]=1;
          conta++;
       }
  }
  
  cout  "cerca i 2 sommergibili, il mare è una griglia 5 * 3 "  endl;
  cout  " la profondità x è 0,1,2,3,4   la posizione y e' 0,1,2"  endl  ;
  
  int daaffondare=nsommergibili;
  while(daaffondare 0)
    {
    cout  "inserisci le coordinate della bomba"  endl;
    cout  "x= ";
    cin  x;
    cout  "y= ";
    cin  y;
    
    switch( matrice[x][y])
    {case 0: cout  "acqua"  endl;
             matrice[x][y]=2;
             break;
     case 1: cout  "boom!"  endl;
             daaffondare=daaffondare-1;
             matrice[x][y]=3;
             break;
     case 2: cout  "hai già tentato in questa posizione"  endl;
             break;
     case 3: cout  "il sommergibile è già stato affondato"  endl;
             break;              
      
    }    //fine switch
   }    //fine while
  
  cout  "bravo!hai vinto,sommergibili affondati"  endl;
  cout  " questi sono stati i tentativi "  endl;    
  for(i=0;i 5;i++)
   {for(j=0;j 3;j++)
      cout  matrice[i][j]  " ";
    cout  endl;  
   }
  cout  "0- acqua"  endl;
  cout  "1- sommergibile "  endl;
  cout  "2- acqua hai gia' provato in questa posizione"  endl;
  cout  "3- sommergibile colpito e affondato"  endl; 
   
  return 0;
}

Es matrici 1[modifica]

Esercizi per utilizzare correttamente le matrici[modifica]

es1 obiettivo: matrici uso indici

  • data una matrice 2*3 inserisci i valori da tastiera
  • stampa la matrice per righe
  • trova il max e posizione del max
  • trovare la somma della riga di indice 0 della matrice

Soluzione:

#include  cstdlib 
#include  iostream 

using namespace std;

/*data una matrice 2+3 inserisci i valori da tastiera
  stampa la matrice per righe
  trova il max e posizione del max
  trovare la somma della riga di indice 0 della matrice
 obiettivo: matricie uso indici
*/
int main(int argc, char *argv[])
{
  int m[2][3];
  int i,j;
  int massimo, posmaxriga,posmaxcolonna;
  //inserimento dati della matrice
  for(i=0;i 2;i++)
   for(j=0;j 3;j++)
    {
     cout  "inserisci la cella di posizione ("  i  ","  j  ")";
     cin  m[i][j];
    }
    //stampa della matrice
    for(i=0;i 2;i++)
    {
     for(j=0;j 3;j++)
      cout  m[i][j]  ",";
      cout  endl;
    }
    //calcolo del massimo
    massimo=m[0][0];
    posmaxriga=0;
    posmaxcolonna=0;
    for(i=0;i 2;i++)
      for(j=0;j 3;j++)
        if(m[i][j] massimo)
         { massimo=m[i][j];
           posmaxriga=i;
           posmaxcolonna=j;
         }
   
    cout  "il massimo vale"  massimo  endl;
    cout  "si trova nella riga "  posmaxriga  " colonna "  posmaxcolonna  endl;
   //calcolo della somma della riga indice 0
   int somma=0;
   for(j=0;j 3;j++)
    somma=somma+m[0][j];
   
   cout  "la somma degli elementi della riga 0 vale "  somma  endl;      
   return 0;
}

Es2

  • inserisci i dati in una matrice 3*2
  • stampa la matrice
  • conta quante volte (occorrenze) un numero scelto dall'utente si ripete fra i valori della matrice
  • stampa le posizioni x,y dove si verificano queste occorrenze
  • calcola la somma degli elementi della colonna 1
  • calcola la somma della riga 0
  • calcola la somma di ciascuna colonna
  • calcola la somma di ciascuna diagonale prima in un verso e poi nell'altro

Ricorda che le diagonali k=i+j hanno la somma degli indici uguali a una costante (nel caso di matrice 2*3 da 0 a 3)

Ricorda che le diagonali k=i-j hanno la differenza degli indici uguali a una costante (nel caso di matrice 2*3 da -2 a 1 , quando le registri nel vettore sommadiag non potendo usare indici negativi traslali di +2 )

soluzione:

#include  cstdlib 
#include  iostream 
using namespace std;

int main(int argc, char *argv[])
{
 int nr=3,nc=2;
 int x;
 int conta;
 int mat[nr][nc];
 int i,j;
 //inserimento dati matrice
 for(i=0;i nr;i++)
  for(j=0;j nc;j++)
  {
   cout  "introduci l'elemento"  i  ","  j;
   cin  mat[i][j];
  }
   //stampa dati matrice
 for(i=0;i nr;i++)
  {for(j=0;j nc;j++)
     cout  mat[i][j]  ",";
   cout  endl;  
  }
  //stampa occorrenze numero x nella matrice
 cout  "introduci un numero";
 cin  x;
 conta=0;
 for(i=0;i nr;i++)
   for(j=0;j nc;j++)
      if(x==mat[i][j])conta++;
      
  cout  "il numero è presente"  conta  "volte nella matrice"; 
 //stampa coordinate riga e colonna  valori x 
   for(i=0;i nr;i++)
   for(j=0;j nc;j++)
      if(x==mat[i][j])cout  "l'elemento"  x  "si trova in"  i  ","  j  endl;
 int somma;
 //somma della colonna 1
 somma=0;
 for(i=0;i nr;i++)
   somma=somma+mat[i][1];
 
 cout  "la somma della colonna 1 e'"  somma;
 //somma della riga 0
 somma=0;
 for(j=0;j nc;j++)
     somma=somma+mat[0][j];
 cout  "la somma della riga 0 e'"  somma; 
 //somma di ciascuna colonna
 int vetts[nc];
 for(j=0;j nc;j++)
  vetts[j]=0;
 for(i=0;i nr;i++)
   for(j=0;j nc;j++)
    vetts[j]=vetts[j]+mat[i][j];
 for(j=0;j nc;j++)
  cout  "la somma della colonna"  j  " vale"  vetts[j]  endl;
 //calcolo somma elementi ciascuna diagonale
 int vettdiag1[nr+nc-1];
   
 for(j=0;j nc+nr-1;j++)
  vettdiag1[j]=0;
 for(i=0;i nr;i++)
   for(j=0;j nc;j++)
    vettdiag1[i+j]=vettdiag1[i+j]+mat[i][j];
 for(j=0;j nc+nr-1;j++)
    cout  "la somma della diagonale"  j  " vale"  vettdiag1[j]  endl;
  //calcolo somma elementi ciascuna diagonale opposta
 int vettdiag2[nr+nc-1];  
 for(j=0;j nc+nr-1;j++)
  vettdiag2[j]=0;
 for(i=0;i nr;i++)
   for(j=0;j nc;j++)
    vettdiag2[i-j+nc-1]=vettdiag2[i-j+nc-1]+mat[i][j];
 for(j=0;j nc+nr-1;j++)
    cout  "la somma della diagonale opposta"  j-nc+1  " vale"  vettdiag2[j]  endl;
 system("PAUSE");
 return 0;
  
}

Es matrici 2[modifica]

Esercizi Uso Matrici[modifica]

Quando si vogliono modificare alcune parti della matrice bisogna pensare agli indici delle celle coinvolte

Es1: inserimento,stampa,calcolo max,posmax, obiettivo: matrici, uso indici e cicli

  • dopo aver inserito i dati in una matrice 3*4
  • stampala
  • calcola il max e la sua posizione(riga,colonna)
  • calcola la somma degli elementi della riga 2
  • calcola la somma degli elementi della colonna 1
  • calcola la somma degli elementi di ciascuna colonna
  • calcola la media dei soli numeri dispari della matrice,
  • scambia colonna 0 con la colonna 1 e scambia la colonna 2 con la 3
  • /
#include  cstdlib 
#include  iostream 
using namespace std;
/*esercizi su matrice: inserimento,stampa,calcolo max,posmax,
somma riga 2,somma colonna 1,somma ciascuna colonna, media dei soli numeri 
dispari, scambio colonna 0 con 1 e scambio colonna 2 con 3
obiettivo: matrici, uso indici e cicli
*/

int main(int argc, char *argv[])
{
  int mat[3][4];
  int i,j;
  // inserimento dati matrice 3*4
  for(i=0;i 3;i++)
     for(j=0;j 4;j++)
       {//cout  "inserisci l'elemento riga "  i  " col "  j;
        //cin  mat[i][j];
        mat[i][j]=rand()%100;
       }
  // visualizzazione stampa matrice    
 
   for(i=0;i 3;i++)
     {for(j=0;j 4;j++)
        cout  mat[i][j]  " , ";
      cout  endl;  
     }
   
   //calcolo del num max della matrice e della sua posizione
   
   int max ;
   int posmaxriga,posmaxcolonna;
   max=mat[0][0];
   posmaxriga=0;
   posmaxcolonna=0;
   for(i=0;i 3;i++)
     for(j=0;j 4;j++)
       if (mat[i][j] max)
         {max=mat[i][j];
          posmaxriga=i;
          posmaxcolonna=j;
         }
   cout  "il max vale "  max  endl;
   cout  " e si trova nella riga "  posmaxriga  endl;
   cout  " colonna "  posmaxcolonna  endl;
   
  // somma di tutti gli elementi della riga 2
  int somma ;
  somma =0;
  for(j=0;j 4;j++)
    somma=somma+mat[2][j];
  cout  "la somma della riga 2 vale "  somma  endl;
  
  // somma di tutti gli elementi della colonna 1
  int sommacolonna ;
  sommacolonna =0;
  for(i=0;i 3;i++)
    sommacolonna=sommacolonna+mat[i][1];
  cout  "la somma della colonna 1 vale "  sommacolonna  endl;
  
  //somma di ciascuna colonna
  int sommacol[4]={0,0,0,0} ;
  for(i=0;i 3;i++)
     for(j=0;j 4;j++)
       sommacol[j]=sommacol[j]+mat[i][j];
  for(j=0;j 4;j++)
    cout  "somma colonna"   j  " = "  sommacol[j]  endl;
  
  //media dei numeri dispari 
  int conta=0;
  int sommadispari=0;
  for(i=0;i 3;i++)
     for(j=0;j 4;j++)
       if((mat[i][j]%2)==1)
         { conta++;
           sommadispari += mat[i][j];
         }
  cout  "la media dei numeri dispari ="   sommadispari/conta  endl;
  
  //scambio colonna 0 con 1  scambio colonna 2 con 3
  int temp;
  for(j=0;j 4;j=j+2)
    for(i=0;i 3;i++)
      {temp=mat[i][j];
       mat[i][j]=mat[i][j+1];
       mat[i][j+1]=temp; 
      }
  cout  "scambio colonna 0 con 1 scambio colonna 2 con 3"  endl;
  for(i=0;i 3;i++)
     {for(j=0;j 4;j++)
        cout  mat[i][j]  " , ";
      cout  endl;  
     }                                                                                                                                                                                                                    
  system("PAUSE");        
  return 0;
}

Es2 crea una matrice 20*15 , carica il valore 8 nelle celle che costituiscono il bordo della cella e il valore 1 nelle altre Soluzione: