• Non ci sono risultati.

IEIM 2015-2016

N/A
N/A
Protected

Academic year: 2021

Condividi "IEIM 2015-2016"

Copied!
24
0
0

Testo completo

(1)

IEIM 2015-2016

Esercitazione V

“Matrici, funzioni, puntatori & enum”

Alessandro A. Nacci

alessandro.nacci@polimi.it - www.alessandronacci.it

1

(2)

Cosa facciamo oggi?

MATRICI E FUNZIONI

PUNTATORI E MEMORIA

ESERCIZIO: IL PIANO CARTESIANO

L’ENUMERAZIONE

2

(3)

3

(4)

Matrici e funzioni

Esercizio 1

4

(5)

5

MATRICI E FUNZIONI

Il passaggio di una matrice ad una funzione e’ sempre per indirizzo e mai per copia.

(6)

Esercizio 1: Matrici e Funzioni

6

#include <stdio.h>

#define R 3

#define C 3

void foo1(int*);

void foo2(int mat[R][C]);

void foo3(int mat[][C]);

int main() {

int mat[R][C];

foo1(mat);

foo2(mat);

foo3(mat);

}

void foo1(int *mat) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

*(mat+i*C+j) = (i+j) * 2;

}

void foo2(int mat[R][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 3;

}

void foo3(int mat[][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 4;

}

#include <stdio.h>

#define R 3

#define C 3

void foo1(int*);

void foo2(int mat[R][C]);

void foo3(int mat[][C]);

int main() {

int mat[R][C];

foo1(mat);

foo2(mat);

foo3(mat);

}

void foo1(int *mat) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

*(mat+i*C+j) = (i+j) * 2;

}

void foo2(int mat[R][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 3;

}

void foo3(int mat[][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 4;

}

Calcolo manuale dello spiazzamento

Puntatore ad intero!

#include <stdio.h>

#define R 3

#define C 3

void foo1(int*);

void foo2(int mat[R][C]);

void foo3(int mat[][C]);

int main() {

int mat[R][C];

foo1(mat);

foo2(mat);

foo3(mat);

}

void foo1(int *mat) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

*(mat+i*C+j) = (i+j) * 2;

}

void foo2(int mat[R][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 3;

}

void foo3(int mat[][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 4;

}

INDIRIZZO

Valore contenuto all’indirizzo tra parentesi

(7)

Esercizio 1: Matrici e Funzioni

7

#include <stdio.h>

#define R 3

#define C 3

void foo1(int*);

void foo2(int mat[R][C]);

void foo3(int mat[][C]);

int main() {

int mat[R][C];

foo1(mat);

foo2(mat);

foo3(mat);

}

void foo1(int *mat) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

*(mat+i*C+j) = (i+j) * 2;

}

void foo2(int mat[R][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 3;

}

void foo3(int mat[][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 4;

}

#include <stdio.h>

#define R 3

#define C 3

void foo1(int*);

void foo2(int mat[R][C]);

void foo3(int mat[][C]);

int main() {

int mat[R][C];

foo1(mat);

foo2(mat);

foo3(mat);

}

void foo1(int *mat) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

*(mat+i*C+j) = (i+j) * 2;

}

void foo2(int mat[R][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 3;

}

void foo3(int mat[][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 4;

}

Esplicito che il puntatore punta al primo elemento

di una matrice RxC

Accesso comodo alla matrice!

(8)

#include <stdio.h>

#define R 3

#define C 3

void foo1(int*);

void foo2(int mat[R][C]);

void foo3(int mat[][C]);

int main() {

int mat[R][C];

foo1(mat);

foo2(mat);

foo3(mat);

}

void foo1(int *mat) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

*(mat+i*C+j) = (i+j) * 2;

}

void foo2(int mat[R][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 3;

}

void foo3(int mat[][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 4;

}

Esercizio 1: Matrici e Funzioni

8

#include <stdio.h>

#define R 3

#define C 3

void foo1(int*);

void foo2(int mat[R][C]);

void foo3(int mat[][C]);

int main() {

int mat[R][C];

foo1(mat);

foo2(mat);

foo3(mat);

}

void foo1(int *mat) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

*(mat+i*C+j) = (i+j) * 2;

}

void foo2(int mat[R][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 3;

}

void foo3(int mat[][C]) {

int i, j;

for(i=0;i<R;i++)

for(j=0;j<C;j++)

mat[i][j] = (i+j) * 4;

}

Esplicito che il puntatore punta al primo elemento di una matrice con C colonne

Accesso comodo alla matrice!

x x x

x x x Ai fini del calcolo dello

spiazzamento il numero di righe non è essenziale!

NOTA BENE

Il valore di mat cambia Il valore di mat cambia Il valore di mat cambia

(9)

Puntatori e memoria

Esercizio 2

9

(10)

Esercizio 2: Puntatori e memoria

10

0 1 2 3 4 5 6 7 8 9

IND. CONTENUTO

int main() {

int a = 3;

printf(“%d”, &a);

int* b;

b = &a;

int mat[2][2];

int* c;

mat[0][1] = 13;

c = &(mat[1][0]);

int d = *b;

int e;

}

DATO UN PROGRAMMA C, COME SI COMPORTA LA MEMORIA?

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

(11)

Esercizio 2: Puntatori e memoria

11

0 1 2 3 4 5 6 7 8 9

IND. CONTENUTO

int main() {

int a = 3;

printf(“%d”, &a);

int* b;

b = &a;

int mat[2][2];

int* c;

mat[0][1] = 13;

c = &(mat[1][0]);

int d = *b;

int e;

}

DATO UN PROGRAMMA C, COME SI COMPORTA LA MEMORIA?

ATTENZIONE!

Il comportamento della memoria mostrato in questo esercizio non è del tutto coerente con quanto avviene su un reale

calcolatore. L’esempio mostrato è però funzionale alla spiegazione del comportamento dei puntatori in C.

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

(12)

Esercizio 2: Puntatori e memoria

12

0 1 2 3 4 5 6 7 8 9

IND. CONTENUTO

int main() {

int a = 3;

printf(“%d”, &a);

int* b;

b = &a;

int mat[2][2];

int* c;

mat[0][1] = 13;

c = &(mat[1][0]);

int d = *b;

int e;

}

DATO UN PROGRAMMA C, COME SI COMPORTA LA MEMORIA?

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

(13)

Esercizio 2: Puntatori e memoria

13

0 1 2 3 4 5 6 7 8 9

IND. CONTENUTO

int main() {

int a = 3;

printf(“%d”, &a);

int* b;

b = &a;

int mat[2][2];

int* c;

mat[0][1] = 13;

c = &(mat[1][0]);

int d = *b;

int e;

}

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

(14)

Esercizio 2: Puntatori e memoria

14

3

0 1 2 3 4 5 6 7 8 9

IND. CONTENUTO

int main() {

int a = 3;

printf(“%d”, &a);

int* b;

b = &a;

int mat[2][2];

int* c;

mat[0][1] = 13;

c = &(mat[1][0]);

int d = *b;

int e;

} a

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

(15)

Esercizio 2: Puntatori e memoria

15

3

0 1 2 3 4 5 6 7 8 9

IND. CONTENUTO

int main() {

int a = 3;

printf(“%d”, &a);

int* b;

b = &a;

int mat[2][2];

int* c;

mat[0][1] = 13;

c = &(mat[1][0]);

int d = *b;

int e;

} a

~ b

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

(16)

Esercizio 2: Puntatori e memoria

16

3

0 1 2 3 4 5 6 7 8 9

IND. CONTENUTO

int main() {

int a = 3;

printf(“%d”, &a);

int* b;

b = &a;

int mat[2][2];

int* c;

mat[0][1] = 13;

c = &(mat[1][0]);

int d = *b;

int e;

} a

0 b

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

(17)

Esercizio 2: Puntatori e memoria

17

3 3

~

~

~

~

0 1 2 3 4 5 6 7 8 9

IND. CONTENUTO

int main() {

int a = 3;

printf(“%d”, &a);

int* b;

b = &a;

int mat[2][2];

int* c;

mat[0][1] = 13;

c = &(mat[1][0]);

int d = *b;

int e;

} a

b mat mat mat mat mat

0

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

(18)

Esercizio 2: Puntatori e memoria

18

3 3

~

~

~

~

~

0 1 2 3 4 5 6 7 8 9

IND. CONTENUTO

int main() {

int a = 3;

printf(“%d”, &a);

int* b;

b = &a;

int mat[2][2];

int* c;

mat[0][1] = 13;

c = &(mat[1][0]);

int d = *b;

int e;

} a

b mat mat mat mat mat

c

0

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

(19)

Esercizio 2: Puntatori e memoria

19

3 3

~ 13

~

~

~

0 1 2 3 4 5 6 7 8 9

IND. CONTENUTO

int main() {

int a = 3;

printf(“%d”, &a);

int* b;

b = &a;

int mat[2][2];

int* c;

mat[0][1] = 13;

c = &(mat[1][0]);

int d = *b;

int e;

} a

b mat mat mat mat mat

c

0

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

(20)

Esercizio 2: Puntatori e memoria

20

3 3

~ 13

~

~ 5

0 1 2 3 4 5 6 7 8 9

IND. CONTENUTO

int main() {

int a = 3;

printf(“%d”, &a);

int* b;

b = &a;

int mat[2][2];

int* c;

mat[0][1] = 13;

c = &(mat[1][0]);

int d = *b;

int e;

} a

b mat mat mat mat mat

c

0

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

(21)

Esercizio 2: Puntatori e memoria

21

3 3

~ 13

~

~ 5 3

0 1 2 3 4 5 6 7 8 9

IND. CONTENUTO

int main() {

int a = 3;

printf(“%d”, &a);

int* b;

b = &a;

int mat[2][2];

int* c;

mat[0][1] = 13;

c = &(mat[1][0]);

int d = *b;

int e;

} a

b mat mat mat mat mat

c d

0

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

(22)

Esercizio 2: Puntatori e memoria

22

3 3

~ 13

~

~ 5 3

~

0 1 2 3 4 5 6 7 8 9

IND. CONTENUTO

int main() {

int a = 3;

printf(“%d”, &a);

int* b;

b = &a;

int mat[2][2];

int* c;

mat[0][1] = 13;

c = &(mat[1][0]);

int d = *b;

int e;

} a

b mat mat mat mat mat

c d e

0

Indicare nella tabella come il programma C mostrato modifica lo stato della memoria del calcolatore.

(23)

23

(24)

24

Tutte il materiale sarà disponibile sul mio sito internet!

alessandronacci.it

Riferimenti

Documenti correlati

Da: cinque vo: compresi tra 0 e 10, calcolarne la media e dire se lo studente e' bocciato (media minore di 6)!. o promosso (media maggiore o uguale

filosofia e diede vita alla scuola degli algebristi della logica... Le operazioni logiche (booleane)

“coordinate, si constata che le coppie di valori di A e B (di C e D) associate alle colonne (alle righe) sono ordinate in modo che tra due caselle adiacenti (della medesima riga

Marco e' padre di LUCA e di PIPPO Stefania e' madre di LUCA e di PIPPO Arianna e' figlia di Marco e Lucia. Stefano e' figlio di Arianna

• Se l’elemento A[i] considerato è uguale al carattere occorrenza ed è uguale all’elemento A[i-1], incremento un contatore occorrenze (occorrenze++). • Se l’elemento A[i] non

Scrivere una funziona che, date due coordinate tes_x e tes_y - che sono le coordinate del tesoro - crei la mappa termica. radiale presentata in precedenza all’interno di

Nel nostro caso, una automobile è descritta da un nome, un costo, un colore, da un insieme di componenti e da un libretto di circolazione.. • Un componente ha un nome, un costo ed

Anche un vettore multidimensionale è implementato in C come un puntatore all’area di memoria da cui partono le celle contigue contenenti il vettore. contigue contenenti il vettore