Esercizi sulle matrici e array (superiori)

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.

quiz
quiz
Esercizi sulle matrici e array (superiori)
Tipo di risorsa Tipo: quiz
Materia di appartenenza Materia: Informatica (istituti tecnici) per le superiori
Avanzamento Avanzamento: quiz completo al 00%

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 profondità dove innescare la bomba di profondità e la colonna rappresenta l'area di mare da proteggere. La profondità 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: