• Non ci sono risultati.

IEIM 2019-2020

N/A
N/A
Protected

Academic year: 2021

Condividi "IEIM 2019-2020"

Copied!
85
0
0

Testo completo

(1)

IEIM 2019-2020

Esercitazione VI

“Puntatori, Matrici, Funzioni”

Alessandro A. Nacci

[email protected] - www.alessandronacci.it

1

(2)

Vediamo cosa succede in memoria

2

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio valori

• Si scriva una funzione in C che, dati

due valori interi, gli restituisce

scambiati

20

(3)

Un esempio: funzione swap

3

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interi

void swap (int p, int q) { int temp;

temp = p;

p = q;

q = temp;

}

• Nel main: swap(a,b)

21

a b

3 7

p q

temp 3

7

(4)

Un esempio: funzione swap

4

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interi

void swap (int p, int q) { int temp;

temp = p;

p = q;

q = temp;

}

• Nel main: swap(a,b)

22

a b

3 7

p q

temp 3

7 3

(5)

Un esempio: funzione swap

5

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interi

void swap (int p, int q) { int temp;

temp = p;

p = q;

q = temp;

}

• Nel main: swap(a,b)

23

a b

3 7

p q

temp 7

7 3

(6)

Un esempio: funzione swap

6

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interi

void swap (int p, int q) { int temp;

temp = p;

p = q;

q = temp;

}

• Nel main: swap(a,b)

24

a b

3 7

p q

temp 7

3 3

(7)

Un esempio: funzione swap

7

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interi

void swap (int p, int q) { int temp;

temp = p;

p = q;

q = temp;

}

• Nel main: swap(a,b)

25

a b

3 7

p q

temp 7

3 Al termine 3

dell’esecuzione di swap le variabili nel main restano

inalterate!

(8)

Un esempio: funzione swap

8

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interi

void swap (int *p, int *q){

int temp;

temp = *p;

*p = *q;

*q = temp;

}

• Nel main: swap(&a, &b)

26

a b 3 7

p q

temp

(9)

Un esempio: funzione swap

9

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interi

void swap (int *p, int *q){

int temp;

temp = *p;

*p = *q;

*q = temp;

}

• Nel main: swap(&a, &b)

27

a b 3 7

p q

temp 3

(10)

Un esempio: funzione swap

10

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interi

void swap (int *p, int *q){

int temp;

temp = *p;

*p = *q;

*q = temp;

}

• Nel main: swap(&a, &b)

28

a b 7 7

p q

temp 3

(11)

Un esempio: funzione swap

11

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interi

void swap (int *p, int *q){

int temp;

temp = *p;

*p = *q;

*q = temp;

}

• Nel main: swap(&a, &b)

29

a b 7 3

p q

temp 3

(12)

Un esempio: funzione swap

12

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Esempio: scambio di 2 valori interi

void swap (int *p, int *q){

int temp;

temp = *p;

*p = *q;

*q = temp;

}

• Nel main: swap(&a, &b)

30

a b 7 3

p q

temp Al termine 3

dell’esecuzione di swap le variabili nel main vengono

modificate

(13)

13

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Fonti per lo studio + Credits

• Fonti per lo studio

§ Binky Pointer Fun Video:

http://cslibrary.stanford.edu/104/

• Credits

§ Gianluca Palermo

31

(14)

14

MATRICI E FUNZIONI

Il passaggio di una matrice ad una funzione

e’ sempre per indirizzo e mai per copia.

(15)

Esercizio 1: Matrici e Funzioni

15

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

}

(16)

Esercizio 1: Matrici e Funzioni

15

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

}

Puntatore a d intero!

(17)

Esercizio 1: Matrici e Funzioni

15

#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 ma nuale dello spiazzame nto

Puntatore a d intero!

(18)

Esercizio 1: Matrici e Funzioni

15

#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 ma nuale dello spiazzame nto

Puntatore a d 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

(19)

Esercizio 1: Matrici e Funzioni

16

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

}

(20)

Esercizio 1: Matrici e Funzioni

16

#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

(21)

Esercizio 1: Matrici e Funzioni

16

#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!

(22)

#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

17

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

}

(23)

#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

17

#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

(24)

#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

17

#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!

(25)

#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

17

#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!

Ai fini del calcolo dello

spiazzamento il numero di righe non è essenziale!

NOTA BENE

(26)

#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

17

#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!

Ai fini del calcolo dello

spiazzamento il numero di righe non è essenziale!

NOTA BENE

(27)

#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

17

#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

Ai fini del calcolo dello

spiazzamento il numero di righe non è essenziale!

NOTA BENE

(28)

#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

17

#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

(29)

#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

17

#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

(30)

#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

17

#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

(31)

#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

17

#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

(32)

18

int somma_speciale(int d, int c) {

int q = 3;

return d + c + q;

}

int main() {

int a;

int b;

int c;

a = 2;

b = 5;

c = somma_speciale(a,b);

}

(33)

Esercizio 1

Cosa fa il seguente codice?

int main() {int a;int b;int

c;for(a=0;a<10;a++) {if(a==2)

{for(b=10;b>0;b--) {if(a==5&&b==3) {c==1;while(c==<10) {printf("The

value of c is %d",c);c++;}}}}}}

19

(34)

Esercizio 1

Cosa fa il seguente codice?

int main() {int a;int b;int

c;for(a=0;a<10;a++) {if(a==2)

{for(b=10;b>0;b--) {if(a==5&&b==3) {c==1;while(c==<10) {printf("The

value of c is %d",c);c++;}}}}}}

20

(35)

Esercizio 1

Cosa fa il seguente codice?

int main(){

int a;

int b;

int c;

for (a = 0; a < 10; a++){

if (a == 2){for (b = 10; b>0; b--){

if (a == 5 && b == 3){

c == 1;

while(c == < 10){

printf("The value of c is %d", c);

c++;

}}}}}}

21

(36)

Esercizio 1

Cosa fa il seguente codice?

22 int main() {

int a;

int b;

int c;

for (a = 0; a < 10; a++) {

if (a == 2) {

for (b = 10; b>0; b--) {

if (a == 5 && b == 3) {

c == 1;

while(c == < 10) {

printf("The value of c is %d", c);

c++;

} } } } } }

(37)

Un semplice videogioco

• Scriviamo un programma C che implementi il

gioco del Forza 4

• Due giocatori, entrambi

“reali”

• Il programma deve

permettere di giocare

• Il programma deve

annunciare il vincintore

23

(38)

Forza 4: rappresentazione

24

(39)

Forza 4: rappresentazione

24

Come facciamo a rappresentare nel terminale, con quello che

già conosciamo, delle pedine rosse e delle pedine nere?

(40)

Forza 4: rappresentazione

25

%

% #

# # %

(41)

Forza 4: rappresentazione

25

%

% #

# # %

Quindi abbiamo una matrice, descritta da due indici e che

contiene caratteri...

(42)

Forza 4: rappresentazione

25

%

% #

# # %

x

y 0

Quindi abbiamo una matrice, descritta da due indici e che

contiene caratteri...

(43)

Forza 4: rappresentazione

25

%

% #

# # %

x

y 0

Ma è il PIANO CARTESIANO!

Quindi abbiamo una matrice, descritta da due indici e che

contiene caratteri...

(44)

Forza 4: rappresentazione

25

%

% #

# # %

x

y 0

Ma è il PIANO CARTESIANO!

Generico forma

di categoria F_PUNTO

Generico forma

di categoria F_PUNTO

Quindi abbiamo una matrice, descritta da due indici e che

contiene caratteri...

(45)

Forza 4: rappresentazione

25

%

% #

# # %

x

y 0

Ma è il PIANO CARTESIANO!

Generico forma

di categoria F_PUNTO

Generico forma

di categoria F_PUNTO

Quindi abbiamo una matrice, descritta da due indici e che

contiene caratteri...

POSSIAMO RIUTILIZZARE PRATICAMENTE TUTTO QUELLO CHE ABBIAMO

FATTO NELL’ESERCIZIO PRECEDENTE...

(46)

Forza 4: rappresentazione

25

%

% #

# # %

x

y 0

Ma è il PIANO CARTESIANO!

Generico forma

di categoria F_PUNTO

Generico forma

di categoria F_PUNTO

Quindi abbiamo una matrice, descritta da due indici e che

contiene caratteri...

POSSIAMO RIUTILIZZARE PRATICAMENTE TUTTO QUELLO CHE ABBIAMO

FATTO NELL’ESERCIZIO PRECEDENTE...

ECCO A COSA SERVONO LE FUNZIONI! :D

(47)

Cosa manca

26

(48)

Cosa manca

• Anche se possiamo utilizzare buona parte del codice già scritto per il “PIANO

CARTESIANO”, qualche concetto ancora ci manca:

26

(49)

Cosa manca

• Anche se possiamo utilizzare buona parte del codice già scritto per il “PIANO

CARTESIANO”, qualche concetto ancora ci manca:

• Come rappresentiamo un GIOCATORE?

26

(50)

Cosa manca

• Anche se possiamo utilizzare buona parte del codice già scritto per il “PIANO

CARTESIANO”, qualche concetto ancora ci manca:

• Come rappresentiamo un GIOCATORE?

• Come gestiamo l’inserimento di una pedina?

26

(51)

Cosa manca

• Anche se possiamo utilizzare buona parte del codice già scritto per il “PIANO

CARTESIANO”, qualche concetto ancora ci manca:

• Come rappresentiamo un GIOCATORE?

• Come gestiamo l’inserimento di una pedina?

• Come controlliamo la vincita?

26

(52)

Il giocatore

27

(53)

Il giocatore

• Un giocatore è identificato da:

27

(54)

Il giocatore

• Un giocatore è identificato da:

• IL SUO NOME

27

(55)

Il giocatore

• Un giocatore è identificato da:

• IL SUO NOME

• QUALE PEDINA HA SCELTO

27

(56)

Il giocatore

• Un giocatore è identificato da:

• IL SUO NOME

• QUALE PEDINA HA SCELTO

27

(57)

L’inserimento di una pedina

28

%

% #

# # %

x

y 0

#

(58)

L’inserimento di una pedina

28

%

% #

# # %

x

y 0

#

(59)

L’inserimento di una pedina

28

%

% #

# # %

x

y 0

#

Dobbiamo creare una sorta

di effetto gravita!

(60)

L’inserimento di una pedina: codice C

29

(61)

L’inserimento di una pedina: codice C

29

(62)

L’inserimento di una pedina: codice C

30

(63)

Verifica delle vincita

31

#

# %

% # #

# # % % % %

x

y

0

(64)

Verifica delle vincita

31

#

# %

% # #

# # % % % %

x

y

0

(65)

Verifica delle vincita

31

#

# %

% # #

# # % % % %

x

y 0

Dobbiamo controllare che, dato un simbolo, un vettore contiene 4 occorrenze di quest’ultimo

CONSECUTIVE!

(66)

Verifica della vincita

• Per verificare una vincinta, dobbiamo prima di tutto saper controllare se, dato un

vettore generico, esistono FORZA=4 occorrenze consecutive di un carattere

‘occorrenza’ dato in ingresso

• Con questa funzione potremo poi controllare sia vettori verticali, che orizzontali che obliqui

32

(67)

Controllo di un generico vettore

• Se ho un vettore A, e voglio controllare se qualcuno ha vinto, potrei usare il seguente metodo

• Parto dal secondo elemento e, per ogni elemento

• 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 è uguale ad occorrenza oppure l’elemento A[i] != A[i-1], occorrenze viene riportato a 0 (occorrenze=0)

Ogni qual volta che occorrenze arriva a FORZA-1, nel nostro caso 4-1, vale a dire 3, ho verificato che c’è una vincita

Se non succede mai che occorrenze == FORZA-1, allora non c’è nessuna vincita

33

(68)

Controllo di un generico vettore: codice C

34

(69)

Controllo vincita orizzontale

35

(70)

Controlla vincita verticale

36

(71)

Controlla vincita obliquo

• In obliquo abbiamo due direzioni possibili

37

• Quindi creiamo una funzione parametrica che dato un

parametro direzione estra un vettore

orizzontale...

(72)

Estrazione array obliquo (codice C)

38

(73)

Controllo vincita in obliquo

• Quindi, usando la funzione appena creata ora possiamo controllare le vincite in

obliquo

39

(74)

Controllo vincita in obliquo

• Quindi, usando la funzione appena creata ora possiamo controllare le vincite in

obliquo

39

(75)

Controllo di una qualsiasi vincita

• Usando le funzioni precedenti possiamo controllare una qualsiasi vincita

40

(76)

Controllo di una qualsiasi vincita

• Usando le funzioni precedenti possiamo controllare una qualsiasi vincita

40

(77)

• Prima di scrivere il main(), ci mancano ancora un paio di funzioni comode...

41

(78)

Crea giocatore: codice C

42

(79)

Crea giocatore: codice C

42

(80)

Richiedi inserimento pedina: codice C

43

(81)

Inserisci pedina: codice C

44

(82)

Inserisci pedina: codice C

44

(83)

• Ed ora, scriviamo il main:

• Dobbiamo creare due giocatori

• Dobbiamo gestire l’alternanza dei due giocatori

• Dobbiamo richiedere dove inserire la pedina

• Dobbiamo controllare la vincita

45

(84)

46

(85)

47

Tutte il materiale sarà disponibile sul mio sito internet!

www.alessandronacci.it

Riferimenti

Documenti correlati

• lo stato delle parola (quali lettere sono state indovinate?)... Dichiarazione ed

• La sequenza di chiamate ricorsive termina quando quella più interna (annidata) incontra uno dei casi di base.. • Ogni chiamata alloca sullo stack (in

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

Dati cinque voti 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

• dica in quale dei due array sono presenti i due valori di massimo e minimo. • calcoli l'array riversato In questa so luzione, non usare l

Scrivere un programma che prenda stringhe di lunghezza massima 100 (quando l'utente inserisce la stringa &#34;stop&#34; il. programma smette di

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

• Il programma deve poter permettere la creazione di auto e la stampa a schermo di tutti i dati relativi ad un’auto.. • Deve poter permettere inoltre di modificare il