Upload
hadat
View
268
Download
2
Embed Size (px)
Citation preview
Linguaggio C++ 8 1
Linguaggio C++
Ingegneria AerospazialeProf. A. Palomba - Elementi di Informatica (E-Z)
8
2009-2010
Matrici
Linguaggio C++ 8 2
Array a più dimensioni.
Sintassi generale :
tipo nome [dimensione 1][dimensione 2]…[dimensione n]int a[10][15]int a[10][15]
Lettura matrice N*M
-----------------------------for (i=0; i <N;i++)
for (j=0;j<M;j++)cin >>Matrice[i] [j];
----------------------------
Produzione matrice N*M
-----------------------------for (i=0; i <N;i++){
for (j=0;j<M;j++)cout <<Matrice[i] [j];
cout <<endl;}----------------------------
Linguaggio C++ 8 3
Esercizio Assegnata una matrice bidimensionale di riempimenti N ed M, determinare la somma dei suoi elementi
1 2 3 4 56 7 8 9 109 8 7 6 5
N = 3M = 4 Somma = 90
Linguaggio C++ 8 4
Assegnato una matrice di max 10*10 valori interi, determinare valore max e valore min e rispettive posizioni (indici)
Esercizio
Linguaggio C++ 8 5
Linguaggio C++ 8 6
Esercizio Dato un array A[ N ][ M] di elementi reali, produrre:
Le somme di ogni rigaLe somme di ogni colonnaLa riga di somma massimaLa colonna di somma massima
N=4M=4
1 2 3 45 6 7 89 1 2 34 5 6 7
Somme righe 10 26 15 22Somme colonne 19 14 18 22Riga max 1Colonna min 3
Somme righe 10 26 15 22Somme colonne 19 14 18 22Riga max 1Colonna min 3
Linguaggio C++ 8 7
Linguaggio C++ 8 8}
Linguaggio C++ 8 9
Esercizio proposto Dato un array A[ N ][ M] di elementi reali, produrre:
-La riga di somma massima-La riga di somma minima-L’inversione delle due righe-La colonna di somma minima-L’inversione con la prima colonna
N=4M=4
1 2 3 45 6 7 89 1 2 34 5 6 7
Riga somma max 2Riga somma min 1Colonna somma min 2
Riga somma max 2Riga somma min 1Colonna somma min 2
6 5 7 82 1 3 41 9 2 34 6 5 7
6 5 7 82 1 3 41 9 2 34 6 5 7
Esercizio proposto
Dato un array A[ N ][ N] di elementi interi, determinare:-La somma degli elementi sulla diagonale principale-L’elemento massimo e posizione fra gli elementi delladiagonale principale
N=4 6 5 7 82 1 3 41 9 2 34 6 5 7
6 5 7 82 1 3 41 9 2 34 6 5 7
Somma 16Elem max 7Pos max 3,3
Somma 16Elem max 7Pos max 3,3
Linguaggio C++ 8 10
EsercizioAssegnata una matrice A di interi e di riempimenti RIEMP1 e RIEMP2 si generino da essa due vettori VMAX e VMIN contenenti rispettivamente i valori massimi di ogni riga e i minimi di ogni colonna
10 12 -7 6 51 9 8 4 3
16 22 23 25 47 44 12 2 62 3 26 18 9
10 12 -7 6 51 9 8 4 3
16 22 23 25 47 44 12 2 62 3 26 18 9
VMAX 12 9 25 44 26VMAX 12 9 25 44 26
VMIN 1 3 -7 2 3VMIN 1 3 -7 2 3
Ipotesi algoritmoLeggi Riempimenti e matrice APer ogni riga della matrice for ( i=0;<Riemp1;i++)
blocco1Assumi primo elemento riga come max corrente max=A[i] [1]Per indice correntedi colonna da 1 a <Riemp2
blocco2se max corrente <elemento corrente matrice
aggiorna max corrente con elemento correntefine blocco2
memorizza max corrente in VMAXfine blocco1
for (j=1;<Riemp2;j++)
If (max <A[ i] [j] ) max= A[ i] [j]
VMAX[i] = max
Linguaggio C++ 8 11
Linguaggio C++ 8 12
Linguaggio C++ 8 13
Data una matrice M quadrata,di riempimento N verificare se la matricedata è simmetrica
Esercizio
Una matrice simmetrica è una matrice quadrata che ha la proprietà di essere la trasposta di se stessa
Linguaggio C++ 8 14
Linguaggio C++ 8 15
EsercizioAssegnata una matrice di interi di riempimenti N ed M, eliminare la riga in posizione K
N=4 M=5 K=2
1 2 3 4 56 7 8 9 04 8 3 1 56 0 2 9 4
1 2 3 4 56 7 8 9 06 0 2 9 4
Linguaggio C++ 8 16
Caso k sia ultima riga
Linguaggio C++ 8 17
EsercizioAssegnata una matrice di interi di riempimenti N ed M, eliminare la colonna in posizione K
N=4 M=5 K=2
1 2 3 4 56 7 8 9 04 8 3 1 56 0 2 9 4
1 2 4 56 7 9 04 8 1 56 0 9 4
Linguaggio C++ 8 18
Linguaggio C++ 8 19
Esercizio Assegnata una matrice di interi di riempimenti N ed M, inserire unariga in posizione K tutta di un assegnato elemento elem
N=4 M=5 K=2 elem = 91 2 3 4 56 7 8 9 04 8 3 1 56 0 2 9 4
1 2 3 4 56 7 8 9 09 9 9 9 94 8 3 1 56 0 2 9 4
La posizione di inserimento della nuova riga può essere:A) di accodamento alla matriceB) intermedia nella matrice (compresa la prima)
A)// Se dopo ultima riga
for (int j=0; j<M; j++)matrix[ N ][ j ]=elem;
1 2 3 4 56 7 8 9 04 8 3 1 56 0 2 9 49 9 9 9 9Riga N
Linguaggio C++ 8 20
B)Spostare le righe dalla posizione K in poi di una posizione verso il basso;
si sposta :• prima l’ultima riga• poi la penultima riga• e così via
Provvedere all’inserimento nella giusta posizione
Per evitare perdita di informazioniPer evitare perdita di informazioni
1 2 3 4 56 7 8 9 04 8 3 1 56 0 2 9 4
1 2 3 4 56 7 8 9 0
4 8 3 1 56 0 2 9 4
1 2 3 4 56 7 8 9 09 9 9 9 94 8 3 1 56 0 2 9 4
// riga intermedia// effettua spostamento
for (int i=N-1; i>=k; i --)for (int j=0;j<M;j++)
matrix[ i+1 ][ j ] =matrix[ i ][ j ];// effettua inserimento
for (int j=0;j<M;j++) matrix[ k ][ j ]=elem;
Linguaggio C++ 8 21
Linguaggio C++ 8 22
Esercizio
Assegnata una matrice di interi, di Riempimenti N ed M, si determininogli eventuali punti di sella
Punti di sella di una matrice sono glielementi che sono massimi della rigae della colonna di appartenenza
5 4 2 03 6 4 11 2 9 37 6 5 4
Linguaggio C++ 8 23
Linguaggio C++ 8 24
Esercizio Assegnata in ingresso una matrice quadrata A d’ordine N, si generi la matrice trasposta
1 2 34 5 67 8 9
1 4 72 5 83 6 9
matrice input matrice trasposta
Metodo di soluzione Scambio degli elementi A[ i ] [ j ] con gli elementi A[ j ] [ i ](viene scambiata ogni riga d’ordine N con la colonna di pariordine)
A00 A01 A02
A10 A11 A12
A20 A21 A22
A00 A00A01 A10A02 A20A11 A11A12 A21A22 A22
i j j i
i da 0 a <Nj da i a <N
Linguaggio C++ 8 25
Linguaggio C++ 8 26
Esercizio
Assegnata una matrice di interi A d’ordine N*M, determinare :per ogni colonna il valore dello scarto tra l’elemento massimo e l’elemento minimo.
Modificare la matrice ponendo le colonne secondo l’ordinamento crescente degli scarti calcolati
Nro righe =4Nro colonne =5
9 10 1 12 14 7 7 1 25 6 8 2 33 2 4 0 4
Scarti 6 8 7 12 3
1 9 1 10 122 4 7 7 13 5 8 6 24 3 4 2 0
Matrice modificata
Informazioni di Ingresso
Riempimento di colonnaVariabile interaM
Riempimento di rigaVariabile interaN
Matrice da modificareMatrice interi 10*10A
Descrizione significatoTipoNome
Matrice modificataMatrice interi cardinalità 10*10
A
Contiene scarti di colonnaVettore interi cardinalità 10
ScartoInformazioni di uscita
Linguaggio C++ 8 27
Linguaggio C++ 8 28
Linguaggio C++ 8 29
EsercizioAssegnata una matrice A (N * M) di elementi interi positivi e minori di 10 , per ogni riga della matrice costruire il valore decimale ottenuto, procedendo sulla riga da sinistra verso destra, considerando la differenza in valore assoluto fra ogni coppia di elementi della riga
Si modifichi la matrice disponendo le righe secondo l’ordinamento crescente dei valori calcolati
1 3 7 4 05 2 8 6 34 6 7 8 99 7 5 1 23 1 4 0 41 0 5 4 2
N=6 M=5
243436232111224123441512
1 0 5 4 24 6 7 8 99 7 5 1 23 1 4 0 41 3 7 4 05 2 8 6 3
Matrice modificata
Linguaggio C++ 8 30
Linguaggio C++ 8 31
Linguaggio C++ 8 32
Linguaggio C++ 8 33
Esercizio Assegnate due matrici di interi A e B, determinare la matrice prodotto C
Condizione necessaria per il prodotto di due matri: Nrocol_primamatrice = Nrorig_secondamatrice
Prodotto di due matrici A[m][n] * B[n][k] è una terza matrice C[m][k] con il genericoelemento n
C i , j = ∑ A i, k * B k ,jK=1
i 1, mj 1, l
1 2 34 5 61 2 34 5 6
1 23 45 6
1 23 45 6
22 2849 6422 2849 64
A(2,3)m,n
B(3,2)n, l
C(2,2)m,l
x
for (int i=0; i<m; i++)for (int j=0; j<l; j++){C[ i ][ j ]=0;for (int k=0; k<n; k++)C[ i ][ j ]=C[ i][ j]+A[ i] [ k ]+ k ][ j ];
for (int i=0; i<m; i++)for (int j=0; j<l; j++){C[ i ][ j ]=0;for (int k=0; k<n; k++)C[ i ][ j ]=C[ i][ j]+A[ i] [ k ]+ k ][ j ];C11=a11*b11 + a12*b21 + a13*b31
C12=a11*b12 + a12*b22 + a13*b32
C21=a21*b11 + a22*b21 + a23*b31
C22=a21*b12 + a22*b21 + a23*b32
per m=2n=3l=2
Linguaggio C++ 8 34
Linguaggio C++ 8 35
Linguaggio C++ 8 36
EsercizioAssegnata una matrice quadrata di ordine N prefissato, calcolare la somma degli elementi sulla diagonale principale e quella degli elementi sulla diagonale secondaria)
L’algoritmo deve avere validità sia per matrici d’ordine pari che dispari
1.05.02.00.0
3.01.07.04.0
2.06.05.24.0
9.23.02.01.0
3.01.05.02.03.0
7.0
2.0
5.0
4.0
1.05.02.20.0
3.01.07.04.0
2.06.05.24.0
9.03.02.01.0
Sommap=8.2Sommad=22.2
Sommap=11.2Sommad=12.2
El. Diag. Principale 0,0 1,1 2,2 3,3 4,4 j=i i=1,<NEl. Diag.Secondaria 0,4 1,3 2,2 3,2 4,0 j=N – i -1
i=0 mat[0][0] mat[0][4]i=1 mat[1][1] mat[1][3]i=2 mat[2][2] mat[2][2]i=3 mat[3][3] mat[3][1]i=4 mat[4][4] mat[4][0]
Sommap=Sommap+mat [ i ][ i ] Sommad=Sommad+mat [ i ][ N – i -1 ]
Linguaggio C++ 8 37
Linguaggio C++ 8 38
Esercizio Assegnata una matrice quadrata di ordine N prefissato, calcolare la somma degli elementi della matrice compresi fra la diagonale principalee quella secondaria (clessidra)
L’algoritmo deve avere validità sia permatrici d’ordine pari che dispari
1.05.02.00.0
3.01.07.04.0
2.06.05.04.0
9.03.02.01.0
3.01.05.02.03.0
7.0
2.0
5.0
4.0
1.05.02.00.0
3.01.07.04.0
2.06.05.04.0
9.03.02.01.0
S=42 S=62
a11 a12 a13 a14 a15
a21 a22 a23 a24 a25
a31 a32 a33 a34 a35
a41 a42 a43 a44 a45
a51 a52 a53 a54 a55
N = 5
Appartengono alla diagonale principale tutti gli elementi con pedice di riga e colonna eguali
Appartengono alla diagonale secondaria tutti gli elementi con pedice di riga e colonna tali che i + j = N+1
Per la riga i-ma l’indice di colonna j per gli elementi da trattare sarà compreso fra:i , N - i +1 per la parte alta
( i <=riemp/2)
N - i + 1, i per la parte bassa( i > riemp/2)
Per la riga i-ma l’indice di colonna j per gli elementi da trattare sarà compreso fra:i , N - i +1 per la parte alta
( i <=riemp/2)
N - i + 1, i per la parte bassa( i > riemp/2)
Linguaggio C++ 8 39
Linguaggio C++ 8 40
Esercizio
Assegnata una matrice A[ N , M ] di interi, individuare in essa il minore di ordine Kche presenti la somma maggiore degli elementi.Per tale minore produrre, oltre al valore della somma, le coordinate del vertice alto sinistro
1 2 3 45 6 7 89 1 2 3
K =2Somma=22Riga =0Col = 2
1 2 3 4 56 7 8 9 02 3 4 5 64 5 6 7 9
K =3Somma=54Riga =1Col = 2
In una matrice N * M il numero di minori d’ordine K è pari a(N – K + 1) * (M – K + 1)
N=3 M=4 K=2 2 *3 6
Linguaggio C++ 8 41
Metodo di soluzione
Posizionandosi su ogni elemento della matrice che può essere ( * ) vertice sinistro alto del minore di dimensione K, si calcola la somma degli elementi appartenenti al minore in esame
Il valore della somma viene di volta in volta confrontato con il valore della variabile sommap che conserva il valore maggiore delle somme trovate in precedenza.
Se del caso il valore sommap viene aggiornato con il valore attuale della somma (somma > sommap)
Linguaggio C++ 8 42
I possibili vertici alti sinistri
a00 a01 a02 a03 a04 a05
a10 a11 a12 a13 a14 a15
a20 a21 a22 a23 a24 a25
a30 a31 a32 a33 a34 a35
a40 a41 a42 a43 a44 a45
K = 2K = 3K = 4
somma=0sommap=0Per ogni riga lecitablocco1
somma=0Per ogni colonna lecitablocco2
calcola somma minore con vertice sxnel punto in esame
Se somma > somma precedenteaggiorna somma precedente con somma
fine-blocco2fine-blocco1
Linguaggio C++ 8 43
Linguaggio C++ 8 44
Linguaggio C++ 8 45
EsercizioAssegnata una matrice A (N * M) di interi positivi i cui valori siano uguali,per la maggior parte, ad uno stesso valore assegnato in Input e pertanto chiamato dominante. I valori della matrice diversi dal valore dominante sono assegnatiin input tramite la triplice: indice riga , indice colonna, valore
La successione degli elementi in ingresso è terminata da un valore negativo per indice riga.
Nel produrre la matrice, si individuino tutte le righe e le colonne costituite esclusivamente da elementi dominanti.
Righe =5Colonne=5Dominante=7
0 3 121 4 3 1 0 143 0 93 4 121 2 93 2 11-1
7 7 12 7 714 7 9 7 37 7 7 7 79 7 11 7 127 7 7 7 7
Linguaggio C++ 8 46
Linguaggio C++ 8 47
Linguaggio C++ 8 48
Linguaggio C++ 8 49
Esercizio
E’ assegnata in ingresso un sequenza di valori interi >0La sequenza è terminata dal valore zeroSi vuole modificare la sequenza di ingresso sostituendo ad ogni terna di valori a, b, c tali che a<b e c<b la terna c, b, a senza che gli elementi di quest’ ultima siano considerati nella successiva analisi
Si determini fra le terne oggetto di scambio quella che presentala somma maggiore degli elementi e se ne indichi la posizione di partenza nella sequenza modificata
1 5 7 13 5 2 8 22 10 12 4 0
1 5 5 13 7 2 10 22 8 12 4 0
Somma terna max =40 parte da posizione 7
Linguaggio C++ 8 50
Linguaggio C++ 8 51
Linguaggio C++ 8 52
Assegnata una matrice quadrata d’ordine N determinare la somma degli elementi sulla diagonale principale e le somme degli elementi su ciascuna delle diagonali parallele alla principale.
Esercizio
N=4
1 2 3 45 6 7 89 10 11 1213 14 15 16
Diag(0)=34Diag(1)=30Diag(2)=23Diag(3)=13Diag(4)=4Diag(5)=11Diag(6)=21
Diag(0) =A00 + A01 + A02 + A03Diag(1) =A10 + A21 + A32Diag(2) =A20 + A31Diag(3) =A30Diag(4) =A03Diag(5) =A02 + A13Diag(6) =A01 + A12 + A23
Nro diagonali = 2 * N -1
Indice diagonali da 0 a 2 * N - 2
Linguaggio C++ 8 53