53
Linguaggio C++ 8 1 Linguaggio C++ Ingegneria Aerospaziale Prof. A. Palomba - Elementi di Informatica (E-Z) 8 2009-2010 Matrici

array e stringhe

Embed Size (px)

DESCRIPTION

programmazione c++

Citation preview

Page 1: array e stringhe

Linguaggio C++ 8 1

Linguaggio C++

Ingegneria AerospazialeProf. A. Palomba - Elementi di Informatica (E-Z)

8

2009-2010

Matrici

Page 2: array e stringhe

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;}----------------------------

Page 3: array e stringhe

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

Page 4: array e stringhe

Linguaggio C++ 8 4

Assegnato una matrice di max 10*10 valori interi, determinare valore max e valore min e rispettive posizioni (indici)

Esercizio

Page 5: array e stringhe

Linguaggio C++ 8 5

Page 6: array e stringhe

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

Page 7: array e stringhe

Linguaggio C++ 8 7

Page 8: array e stringhe

Linguaggio C++ 8 8}

Page 9: array e stringhe

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

Page 10: array e stringhe

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

Page 11: array e stringhe

Linguaggio C++ 8 11

Page 12: array e stringhe

Linguaggio C++ 8 12

Page 13: array e stringhe

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

Page 14: array e stringhe

Linguaggio C++ 8 14

Page 15: array e stringhe

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

Page 16: array e stringhe

Linguaggio C++ 8 16

Caso k sia ultima riga

Page 17: array e stringhe

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

Page 18: array e stringhe

Linguaggio C++ 8 18

Page 19: array e stringhe

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

Page 20: array e stringhe

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;

Page 21: array e stringhe

Linguaggio C++ 8 21

Page 22: array e stringhe

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

Page 23: array e stringhe

Linguaggio C++ 8 23

Page 24: array e stringhe

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

Page 25: array e stringhe

Linguaggio C++ 8 25

Page 26: array e stringhe

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

Page 27: array e stringhe

Linguaggio C++ 8 27

Page 28: array e stringhe

Linguaggio C++ 8 28

Page 29: array e stringhe

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

Page 30: array e stringhe

Linguaggio C++ 8 30

Page 31: array e stringhe

Linguaggio C++ 8 31

Page 32: array e stringhe

Linguaggio C++ 8 32

Page 33: array e stringhe

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

Page 34: array e stringhe

Linguaggio C++ 8 34

Page 35: array e stringhe

Linguaggio C++ 8 35

Page 36: array e stringhe

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 ]

Page 37: array e stringhe

Linguaggio C++ 8 37

Page 38: array e stringhe

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)

Page 39: array e stringhe

Linguaggio C++ 8 39

Page 40: array e stringhe

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

Page 41: array e stringhe

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)

Page 42: array e stringhe

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

Page 43: array e stringhe

Linguaggio C++ 8 43

Page 44: array e stringhe

Linguaggio C++ 8 44

Page 45: array e stringhe

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

Page 46: array e stringhe

Linguaggio C++ 8 46

Page 47: array e stringhe

Linguaggio C++ 8 47

Page 48: array e stringhe

Linguaggio C++ 8 48

Page 49: array e stringhe

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

Page 50: array e stringhe

Linguaggio C++ 8 50

Page 51: array e stringhe

Linguaggio C++ 8 51

Page 52: array e stringhe

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

Page 53: array e stringhe

Linguaggio C++ 8 53