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
[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: