Sei sulla pagina 1di 57

2009-2010

Ingegneria Gestionale della logistica e produzione


Prof. A. Palomba - Elementi di Informatica (DF-M)

Linguaggio C++
8
Matrici

Linguaggio C++ 8

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++

Produzione matrice N*M


----------------------------for (i=0; i <N;i++)
{
for (j=0;j<M;j++)
cout <<Matrice[i] [j];
cout <<endl;
}
----------------------------

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

3
8
7

4
9
6

5
10
5

Somma = 90

Esercizio

Linguaggio C++

Assegnato una matrice di max 10*10 valori interi, determinare


valore max e valore min e rispettive posizioni (indici)

Linguaggio C++

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

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

Linguaggio C++

Linguaggio C++
}

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
-Linversione delle due righe
-La colonna di somma minima
-Linversione 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
-Lelemento 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++

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++

10

Linguaggio C++

11

Linguaggio C++

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++

13

Linguaggio C++

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++

M=5

3
8
3
2

K=2

4 5
9 0
1 5
9 4

2 3 4 5
7 8 9 0
0 2 9 4

15

Caso k sia ultima riga

Linguaggio C++

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++

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++

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++

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 lultima riga


Per
Perevitare
evitareperdita
perditadidiinformazioni
informazioni

poi la penultima riga

e cos via
Provvedere allinserimento 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++

20

Linguaggio C++

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++

22

Linguaggio C++

23

Esercizio

Assegnata in ingresso una matrice quadrata A dordine N, si generi la


matrice trasposta

matrice input
1
4
7

2
5
8

matrice trasposta
1
2
3

3
6
9

Metodo di soluzione

A00

A01

A02

A10

A11

A12

A20

A21

A22

Linguaggio C++

4
5
6

7
8
9

Scambio degli elementi A[ i ] [ j ] con gli elementi A[ j ] [ i ]


(viene scambiata ogni riga dordine 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++

25

Esercizio
Assegnata una matrice di interi A dordine N*M, determinare :
per ogni colonna il valore dello scarto tra lelemento massimo e lelemento minimo.
Modificare la matrice ponendo le colonne secondo lordinamento 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

12

Matrice modificata

1
2
3
4

9
4
5
3

1
7
8
4

10
7
6
2

12
1
2
0

Linguaggio C++

Informazioni di Ingresso
Nome

Tipo

Descrizione significato

Matrice interi 10*10

Matrice da modificare

Variabile intera

Riempimento di riga

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++

27

Linguaggio C++

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 lordinamento 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

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++

30

Linguaggio C++

31

Linguaggio C++

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

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++

33

Linguaggio C++

34

Linguaggio C++

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

Lalgoritmo deve avere validit sia per matrici dordine 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++

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++

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

Lalgoritmo deve avere validit sia per


matrici dordine 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-malindice
lindicedidicolonna
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++

38

Linguaggio C++

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 dordine K pari a


(N K + 1) * (M K + 1)
N=3 M=4

Linguaggio C++

K=2

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++

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++

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++

43

Linguaggio C++

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

7 12
7 9
7 7
7 11
7 7

7 7
7 3
7 7
7 12
7 7

45

Linguaggio C++

46

Linguaggio C++

47

Linguaggio C++

48

Esercizio
Assegnata una matrice quadrata A (N * N) di elementi interi, la si modifichi in modo
da ottenere lordinamento decrescente sia della diagonale principale che di quelle
ad essa parallele
input
output
10
35
20
18

13
20
37
25

40 15
17 45
15 40
37 5

20
37
25
18

40
15
37
20

45 15
17 40
10 13
35 5

Metodo di soluzione
Utilizzo del metodo del gorgogliamento su ogni diagonale
Situazione peggiore : elemento A(N,N) il max della diagonale principale; in tal
caso lelemento A(N,N) dovr risalire di N-1 posizioni lungo la diagonale
(scambiarsi con N-1 elementi)
Di conseguenza necessita un ciclo esterno di dimensione N-1

Linguaggio C++

49

1 2
3
5 6
7
9 10 11
13 14 15

6 7
8
10 11 12
14 15 16
13 9 5

4
8
12
16

4
3
2
1

11 12
15 16
14 10
13 9

8
7
6
5

4
3
2
1

16 12
15 11
14 10
13 9

8
7
6
5

4
3
2
1

Gli elementi da confrontare sempre A(i, j) con A(i+1, j+1)

A(0,0)
A(0,1)
A(0,2)

con
con
con

A(1,1)
A(1,2)
A(1,3)

A(1,0)
A(1,1)
A(1,2)

con
con
con

A(2,1)
A(2,2)
A(2,3)

A(2,0)
A(2,1)
A(2,2)

con
con
con

A(3,1)
A(3,2)
A(3,3)

Linguaggio C++

a00
a10
a20
a30

a01
a11
a21
a31

a02
a12
a22
a32

a03
a13
a23
a33

for
fori=0
i=0aaN-1
N-1
for
forj=0
j=0aaN-1
N-1
ifif A(i,j)
A(i,j) rel
rel A(i+1,j+1)
A(i+1,j+1)
.
.

50

Linguaggio C++

51

Linguaggio C++

52

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++

53

Linguaggio C++

54

Linguaggio C++

55

Esercizio
Assegnata una matrice quadrata dordine 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++

Nro diagonali = 2 * N -1
Indice diagonali da 0 a 2 * N - 2

56

Linguaggio C++

57