Linguaggio C++ 8 Matrici
Transcript
Linguaggio C++ 8 Matrici
2009-2010 Ingegneria Aerospaziale Prof. A. Palomba - Elementi di Informatica (E-Z) Linguaggio C++ 8 Matrici Linguaggio C++ 8 1 Array a più dimensioni. Sintassi generale : tipo nome [dimensione 1][dimensione 2]…[dimensione n] int int a[10][15] a[10][15] Lettura matrice N*M ----------------------------for (i=0; i <N;i++) for (j=0;j<M;j++) cin >>Matrice[i] [j]; ---------------------------- Linguaggio C++ 8 Produzione matrice N*M ----------------------------for (i=0; i <N;i++) { for (j=0;j<M;j++) cout <<Matrice[i] [j]; cout <<endl; } ---------------------------- 2 Assegnata una matrice bidimensionale di riempimenti N ed M, determinare la somma dei suoi elementi Esercizio N=3 M=4 1 6 9 Linguaggio C++ 2 7 8 8 3 8 7 4 9 6 5 10 5 Somma = 90 3 Esercizio Linguaggio C++ Assegnato una matrice di max 10*10 valori interi, determinare valore max e valore min e rispettive posizioni (indici) 8 4 Linguaggio C++ 8 5 Esercizio Dato un array A[ N ][ M] di elementi reali, produrre: Le somme di ogni riga Le somme di ogni colonna La riga di somma massima La colonna di somma massima N=4 M=4 Linguaggio C++ 1 5 9 4 8 2 6 1 5 3 7 2 6 4 8 3 7 Somme Sommerighe righe 10 10 Somme Sommecolonne colonne19 19 Riga Rigamax max 11 Colonna Colonnamin min 33 26 26 14 14 15 15 22 22 18 18 22 22 6 Linguaggio C++ 8 7 Linguaggio C++ } 8 8 Esercizio proposto Dato un array A[ N ][ M] di elementi reali, produrre: -La riga di somma massima N=4 -La riga di somma minima M=4 -L’inversione delle due righe -La colonna di somma minima -L’inversione con la prima colonna 1 5 9 4 2 3 4 6 7 8 1 2 3 5 6 7 Riga Rigasomma sommamax max 22 Riga Rigasomma sommamin min 11 Colonna Colonnasomma sommamin min 22 66 55 22 11 11 99 44 66 77 33 22 55 88 44 33 77 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 della diagonale principale N=4 66 55 22 11 11 99 44 66 77 33 22 55 88 44 33 77 Somma Somma16 16 Elem Elemmax max 77 Pos Posmax max 3,3 3,3 Linguaggio C++ 8 9 Esercizio Assegnata 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 10 12 12 -7 -7 66 11 99 88 44 16 16 22 22 23 23 25 25 77 44 12 44 12 22 22 33 26 26 18 18 55 33 44 66 99 VMAX VMAX VMIN VMIN 12 12 99 25 25 44 44 26 26 11 33 -7 -7 22 33 Ipotesi algoritmo Leggi Riempimenti e matrice A Per ogni riga della matrice for ( i=0;<Riemp1;i++) blocco1 Assumi primo elemento riga come max corrente max=A[i] [1] Per indice correntedi colonna da 1 a <Riemp2 for (j=1;<Riemp2;j++) blocco2 se max corrente <elemento corrente matrice If (max <A[ i] [j] ) max= A[ i] [j] aggiorna max corrente con elemento corrente fine blocco2 memorizza max corrente in VMAX VMAX[i] = max fine blocco1 Linguaggio C++ 8 10 Linguaggio C++ 8 11 Linguaggio C++ 8 12 Esercizio Data una matrice M quadrata,di riempimento N verificare se la matrice data è simmetrica Una matrice simmetrica è una matrice quadrata che ha la proprietà di essere la trasposta di se stessa Linguaggio C++ 8 13 Linguaggio C++ 8 14 Esercizio Assegnata una matrice di interi di riempimenti N ed M, eliminare la riga in posizione K N=4 1 6 4 6 2 7 8 0 1 6 6 Linguaggio C++ 8 M=5 3 8 3 2 4 9 1 9 K=2 5 0 5 4 2 3 4 5 7 8 9 0 0 2 9 4 15 Caso k sia ultima riga Linguaggio C++ 8 16 Esercizio Assegnata una matrice di interi di riempimenti N ed M, eliminare la colonna in posizione K N=4 M=5 1 6 4 6 2 7 8 0 1 6 4 6 Linguaggio C++ 8 3 8 3 2 2 7 8 0 K=2 4 9 1 9 4 9 1 9 5 0 5 4 5 0 5 4 17 Linguaggio C++ 8 18 Esercizio N=4 Assegnata una matrice di interi di riempimenti N ed M, inserire una riga in posizione K tutta di un assegnato elemento elem M=5 K=2 elem = 9 1 6 4 6 2 7 8 0 3 8 3 2 4 9 1 9 1 6 9 4 6 5 0 5 4 2 7 9 8 0 3 8 9 3 2 4 9 9 1 9 5 0 9 5 4 La posizione di inserimento della nuova riga può essere: A) di accodamento alla matrice B) intermedia nella matrice (compresa la prima) A) // Se dopo ultima riga for (int j=0; j<M; j++) matrix[ N ][ j ]=elem; Riga N Linguaggio C++ 8 1 6 4 6 9 2 7 8 0 9 3 8 3 2 9 4 9 1 9 9 5 0 5 4 9 19 B) Spostare le righe dalla posizione K in poi di una posizione verso il basso; si sposta : • prima l’ultima riga Per Perevitare evitareperdita perditadidiinformazioni informazioni • poi la penultima riga • e così via Provvedere all’inserimento nella giusta posizione 1 6 4 6 2 7 8 0 3 8 3 2 4 9 1 9 5 0 5 4 1 6 2 7 3 8 4 9 5 0 4 6 8 0 3 2 1 9 5 4 1 6 9 4 6 2 7 9 8 0 3 8 9 3 2 4 9 9 1 9 5 0 9 5 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 20 Linguaggio C++ 8 21 Esercizio Assegnata una matrice di interi, di Riempimenti N ed M, si determinino gli eventuali punti di sella Punti di sella di una matrice sono gli elementi che sono massimi della riga e della colonna di appartenenza 5 3 1 7 4 6 2 6 2 4 9 5 0 1 3 4 Linguaggio C++ 8 22 Linguaggio C++ 8 23 Esercizio Assegnata in ingresso una matrice quadrata A d’ordine N, si generi la matrice trasposta matrice input 1 4 7 2 5 8 matrice trasposta 3 6 9 1 2 3 Metodo di soluzione A00 A01 A02 A10 A11 A12 A20 A21 A22 Linguaggio C++ 8 4 5 6 7 8 9 Scambio degli elementi A[ i ] [ j ] con gli elementi A[ j ] [ i ] (viene scambiata ogni riga d’ordine N con la colonna di pari ordine) ij A00 A01 A02 A11 A12 A22 ji A00 A10 A20 A11 A21 A22 i da 0 a <N j da i a <N 24 Linguaggio C++ 8 25 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 =4 Nro colonne =5 9 4 5 3 10 7 6 2 1 7 8 4 12 1 2 0 1 2 3 4 Scarti 6 8 7 12 3 Matrice modificata 1 2 3 4 9 4 5 3 1 7 8 4 10 7 6 2 12 1 2 0 Linguaggio C++ 8 Informazioni di Ingresso Nome Tipo Descrizione significato A Matrice interi 10*10 Matrice da modificare N Variabile intera Riempimento di riga M Variabile intera Riempimento di colonna Informazioni di uscita Scarto A Vettore interi cardinalità 10 Contiene scarti di colonna Matrice interi cardinalità 10*10 Matrice modificata 26 Linguaggio C++ 8 27 Linguaggio C++ 8 28 Esercizio Assegnata 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 N=6 M=5 Matrice modificata 1 5 4 9 3 1 3 2 6 7 1 0 7 8 7 5 4 5 Linguaggio C++ 4 6 8 1 0 4 0 3 9 2 4 2 8 2434 3623 2111 2241 2344 1512 1 4 9 3 1 5 0 6 7 1 3 2 5 7 5 4 7 8 4 8 1 0 4 6 2 9 2 4 0 3 29 Linguaggio C++ 8 30 Linguaggio C++ 8 31 Linguaggio C++ 8 32 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 generico elemento n i 1, m C i , j = ∑ A i, k * B k ,j j 1, l K=1 A(2,3) m,n 11 22 44 55 per m=2 n=3 l=2 33 66 B(3,2) n, l x 11 33 55 22 44 66 C(2,2) m,l 22 22 49 49 28 28 64 64 C11=a11*b11 + a12*b21 + a13*b31 for(int (inti=0; i=0;i<m; i<m;i++) i++) for for(int (intj=0; j=0;j<l; j<l;j++) j++) for {{ C[i i][][j j]=0; ]=0; C[ for(int (intk=0; k=0;k<n; k<n;k++) k++) for C[i i][][j j]=C[ ]=C[i][i][j]+A[ j]+A[i]i][ [kk]+]+kk][][j j];]; C[ C12=a11*b12 + a12*b22 + a13*b32 C21=a21*b11 + a22*b21 + a23*b31 C22=a21*b12 + a22*b21 + a23*b32 Linguaggio C++ 8 33 Linguaggio C++ 8 34 Linguaggio C++ 8 35 Esercizio Assegnata una matrice quadrata di ordine N prefissato, calcolare la somma degli elementi sulla diagonale principale e quella degli elementi sulla diagonale secondaria) 1.0 2.0 3.0 9.2 1.0 2.0 3.0 9.0 4.0 4.0 5.2 6.0 2.0 4.0 5.2 6.0 2.0 5.0 4.0 7.0 1.0 3.0 2.0 0.0 2.2 5.0 1.0 7.0 3.0 2.0 5.0 1.0 3.0 4.0 7.0 1.0 3.0 0.0 2.0 5.0 1.0 Sommap=8.2 Sommad=22.2 Sommap=11.2 Sommad=12.2 L’algoritmo deve avere validità sia per matrici d’ordine pari che dispari El. Diag. Principale El. Diag.Secondaria i=0 i=1 i=2 i=3 i=4 mat[0][0] mat[1][1] mat[2][2] mat[3][3] mat[4][4] Linguaggio C++ 8 0,0 1,1 2,2 0,4 1,3 2,2 mat[0][4] mat[1][3] mat[2][2] mat[3][1] mat[4][0] 3,3 3,2 4,4 4,0 j=i i=1,<N j=N – i -1 Sommap=Sommap+mat [ i ][ i ] Sommad=Sommad+mat [ i ][ N – i -1 ] 36 Linguaggio C++ 8 37 Esercizio Assegnata una matrice quadrata di ordine N prefissato, calcolare la somma degli elementi della matrice compresi fra la diagonale principale e quella secondaria (clessidra) 1.0 2.0 3.0 9.0 1.0 2.0 3.0 9.0 4.0 4.0 5.0 6.0 2.0 4.0 5.0 6.0 2.0 5.0 4.0 7.0 1.0 3.0 4.0 7.0 1.0 3.0 2.0 0.0 2.0 5.0 1.0 0.0 2.0 5.0 1.0 7.0 3.0 2.0 5.0 1.0 3.0 S=42 L’algoritmo deve avere validità sia per matrici d’ordine pari che dispari S=62 a11 a12 a13 a14 a15 Appartengono alla diagonale principale tutti gli elementi con pedice di riga e colonna eguali a21 a22 a23 a24 a25 a31 a32 a33 a34 a35 Appartengono alla diagonale secondaria tutti gli elementi con pedice di riga e colonna tali che i + j = N+1 a41 a42 a43 a44 a45 Per Perlalariga rigai-ma i-mal’indice l’indicedidicolonna colonna j jper pergli glielementi elementi da trattare sarà compreso fra: da trattare sarà compreso fra: i i, ,NN- -i i+1 +1 per perlalaparte partealta alta ( (i i<=riemp/2) <=riemp/2) a51 a52 a53 a54 a55 N=5 NN- -i i++1,1,i i per perlalaparte partebassa bassa ( (i i>>riemp/2) riemp/2) Linguaggio C++ 8 38 Linguaggio C++ 8 39 Esercizio Assegnata una matrice A[ N , M ] di interi, individuare in essa il minore di ordine K che presenti la somma maggiore degli elementi. Per tale minore produrre, oltre al valore della somma, le coordinate del vertice alto sinistro 1 5 9 2 6 1 3 7 2 4 8 3 K =2 Somma=22 Riga =0 Col = 2 1 6 2 4 2 7 3 5 3 8 4 6 4 9 5 7 5 0 6 9 K =3 Somma=54 Riga =1 Col = 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 Linguaggio C++ K=2 8 2 *3 6 40 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 41 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 Linguaggio C++ 8 K=2 K=3 K=4 somma=0 sommap=0 Per ogni riga lecita blocco1 somma=0 Per ogni colonna lecita blocco2 calcola somma minore con vertice sx nel punto in esame Se somma > somma precedente aggiorna somma precedente con somma fine-blocco2 fine-blocco1 42 Linguaggio C++ 8 43 Linguaggio C++ 8 44 Esercizio Assegnata 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 assegnati in 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 =5 Colonne=5 Dominante=7 0 1 1 3 3 1 3 -1 3 4 0 0 4 2 2 Linguaggio C++ 7 14 7 9 7 12 3 14 9 12 9 11 8 7 12 7 9 7 7 7 11 7 7 7 7 7 3 7 7 7 12 7 7 45 Linguaggio C++ 8 46 Linguaggio C++ 8 47 Linguaggio C++ 8 48 Esercizio E’ assegnata in ingresso un sequenza di valori interi >0 La sequenza è terminata dal valore zero Si 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 49 Linguaggio C++ 8 50 Linguaggio C++ 8 51 Esercizio 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. N=4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Diag(0)=34 Diag(1)=30 Diag(2)=23 Diag(3)=13 Diag(4)=4 Diag(5)=11 Diag(6)=21 Diag(0) =A00 + A01 + A02 + A03 Diag(1) =A10 + A21 + A32 Diag(2) =A20 + A31 Diag(3) =A30 Diag(4) =A03 Diag(5) =A02 + A13 Diag(6) =A01 + A12 + A23 Linguaggio C++ 8 Nro diagonali = 2 * N -1 Indice diagonali da 0 a 2 * N - 2 52 Linguaggio C++ 8 53