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.
Es matrici battaglia navale
modificaBattaglia Navale
modificaDurante 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
modificaEsercizi per utilizzare correttamente le matrici
modificaes1 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
modificaEsercizi Uso Matrici
modificaQuando 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: