IEIM 2019-2020
Esercitazione VI
“Puntatori, Matrici, Funzioni”
Alessandro A. Nacci
[email protected] - www.alessandronacci.it
1
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
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
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
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
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
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!
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
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
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
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
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
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
MATRICI E FUNZIONI
Il passaggio di una matrice ad una funzione
e’ sempre per indirizzo e mai per copia.
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;
}
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!
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!
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
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;
}
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
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!
#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;
}
#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
#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!
#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
#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
#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
#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
#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
#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
#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
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);
}
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
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
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
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++;
} } } } } }
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
Forza 4: rappresentazione
24
Forza 4: rappresentazione
24
Come facciamo a rappresentare nel terminale, con quello che
già conosciamo, delle pedine rosse e delle pedine nere?
Forza 4: rappresentazione
25
%
% #
# # %
Forza 4: rappresentazione
25
%
% #
# # %
Quindi abbiamo una matrice, descritta da due indici e che
contiene caratteri...
Forza 4: rappresentazione
25
%
% #
# # %
x
y 0
Quindi abbiamo una matrice, descritta da due indici e che
contiene caratteri...
Forza 4: rappresentazione
25
%
% #
# # %
x
y 0
Ma è il PIANO CARTESIANO!
Quindi abbiamo una matrice, descritta da due indici e che
contiene caratteri...
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...
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...
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
Cosa manca
26
Cosa manca
• Anche se possiamo utilizzare buona parte del codice già scritto per il “PIANO
CARTESIANO”, qualche concetto ancora ci manca:
26
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
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
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
Il giocatore
27
Il giocatore
• Un giocatore è identificato da:
27
Il giocatore
• Un giocatore è identificato da:
• IL SUO NOME
27
Il giocatore
• Un giocatore è identificato da:
• IL SUO NOME
• QUALE PEDINA HA SCELTO
27
Il giocatore
• Un giocatore è identificato da:
• IL SUO NOME
• QUALE PEDINA HA SCELTO
27
L’inserimento di una pedina
28
%
% #
# # %
x
y 0
#
L’inserimento di una pedina
28
%
% #
# # %
x
y 0
#
L’inserimento di una pedina
28
%
% #
# # %
x
y 0
#
Dobbiamo creare una sorta
di effetto gravita!
L’inserimento di una pedina: codice C
29
L’inserimento di una pedina: codice C
29
L’inserimento di una pedina: codice C
30
Verifica delle vincita
31
#
# %
% # #
# # % % % %
x
y
0
Verifica delle vincita
31
#
# %
% # #
# # % % % %
x
y
0
Verifica delle vincita
31
#
# %
% # #
# # % % % %
x
y 0
Dobbiamo controllare che, dato un simbolo, un vettore contiene 4 occorrenze di quest’ultimo
CONSECUTIVE!
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
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
Controllo di un generico vettore: codice C
34
Controllo vincita orizzontale
35
Controlla vincita verticale
36
Controlla vincita obliquo
• In obliquo abbiamo due direzioni possibili
37
• Quindi creiamo una funzione parametrica che dato un
parametro direzione estra un vettore
orizzontale...
Estrazione array obliquo (codice C)
38
Controllo vincita in obliquo
• Quindi, usando la funzione appena creata ora possiamo controllare le vincite in
obliquo
39
Controllo vincita in obliquo
• Quindi, usando la funzione appena creata ora possiamo controllare le vincite in
obliquo
39
Controllo di una qualsiasi vincita
• Usando le funzioni precedenti possiamo controllare una qualsiasi vincita
40
Controllo di una qualsiasi vincita
• Usando le funzioni precedenti possiamo controllare una qualsiasi vincita
40
• Prima di scrivere il main(), ci mancano ancora un paio di funzioni comode...
41
Crea giocatore: codice C
42
Crea giocatore: codice C
42
Richiedi inserimento pedina: codice C
43
Inserisci pedina: codice C
44
Inserisci pedina: codice C
44
• 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
46
47