IEIM 2018-2019
Esercitazione VIII
“Ripasso Generale”
Alessandro A. Nacci
alessandro.nacci@polimi.it - www.alessandronacci.it
1
Matrici e funzioni
Esercizio 1
2
3
MATRICI E FUNZIONI
Il passaggio di una matrice ad una funzione e’ sempre per indirizzo e mai per copia.
Esercizio 1: Matrici e Funzioni
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;
}
#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
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;
}
#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 ad intero!
Esercizio 1: Matrici e Funzioni
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;
}
#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!
Esercizio 1: Matrici e Funzioni
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;
}
#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
Esercizio 1: Matrici e Funzioni
5
#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
5
#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
5
#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
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;
}
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;
}
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
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;
}
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
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;
}
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
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;
}
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
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;
}
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
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;
}
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
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;
}
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
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;
}
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
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;
}
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
L’albero genealogico
Esercizio 2
7
L’albero genealogico
• Scrivere un programma C che sia in grado di rappresentare e gestire un albero genealogico
8
• In particolare, vogliamo poter fare:
- Creare una persona
- Rappresentare di una popolazione
- Aggiungere figli ad una persona
- Elencare i figli e i nipoti dato un antenato
Una famosa struttura dati: l’albero
9
P0
P1 P2 P3
P4 P5
Una famosa struttura dati: l’albero
9
P0
P1 P2 P3
P4 P5
ogni cerchio si chiama “nodo”
Una famosa struttura dati: l’albero
9
P0
P1 P2 P3
P4 P5
ogni cerchio si chiama “nodo”
PADRE
FIGLIO
Una famosa struttura dati: l’albero
9
P0
P1 P2 P3
P4 P5
ogni cerchio si chiama “nodo”
PADRE
FIGLIO
PADRE
FIGLI
Una famosa struttura dati: l’albero
9
P0
P1 P2 P3
P4 P5
ogni cerchio si chiama “nodo”
PADRE
FIGLIO
PADRE
FIGLI
PADRE
FIGLIO
Una famosa struttura dati: l’albero
9
P0
P1 P2 P3
P4 P5
ogni cerchio si chiama “nodo”
PADRE
FIGLIO
PADRE
FIGLI
PADRE
FIGLIO PADRE
FIGLIO
Una famosa struttura dati: l’albero
9
P0
P1 P2 P3
P4 P5
ogni cerchio si chiama “nodo”
PADRE
FIGLIO
PADRE
FIGLI
PADRE
FIGLIO PADRE
FIGLIO
PADRE
FIGLIO
Una famosa struttura dati: l’albero
9
P0
P1 P2 P3
P4 P5
RADICE
FOGLIA FOGLIA
FOGLIA FOGLIA
ogni cerchio si chiama “nodo”
PADRE
FIGLIO
PADRE
FIGLI
PADRE
FIGLIO PADRE
FIGLIO
PADRE
FIGLIO
Una famosa struttura dati: l’albero
9
P0
P1 P2 P3
P4 P5
Può essere utile per rappresentare un albero genealogico?
RADICE
FOGLIA FOGLIA
FOGLIA FOGLIA
ogni cerchio si chiama “nodo”
PADRE
FIGLIO
PADRE
FIGLI
PADRE
FIGLIO PADRE
FIGLIO
PADRE
FIGLIO
Una famosa struttura dati: l’albero
9
P0
P1 P2 P3
P4 P5
Può essere utile per rappresentare un albero genealogico?
RADICE
FOGLIA FOGLIA
FOGLIA FOGLIA
ogni cerchio si chiama “nodo”
PADRE
FIGLIO
PADRE
FIGLI
PADRE
FIGLIO PADRE
FIGLIO
PADRE
FIGLIO
OVVIAMENTE SI
• OGNI NODO DELL’ALBERO SARA’ PER NOI UNA PERSONA
10
== P
Una Persona
• SESSO
• NOME
• ETA?
• CHI SONO I GENITORI?
• CHI SONO I FIGLI?
• QUANTI FIGLI?
11
Una Popolazione
• Una popolazione è rappresentata da un insieme di persone
• Ogni persona ha un suo indice (numero univoco di identificazione)
• Esiste un numero di persone della
cardinalità 12
1 2 3 4 5 6 7
Una Persona nella popolazione
• SESSO
• NOME
• ETA?
• CHI SONO I GENITORI?
• CHI SONO I FIGLI?
• QUANTI FIGLI?
cardinalità 13
1 2 3 4 5 6 7
Li rappresentiamo con l’indice della persona nella popolazione
\
14
\
14
\
14
Creazione di una persona
15
Creazione di una persona
15
Aggiunta persona alla popolazione
16
Aggiunta persona alla popolazione
16
Aggiunta di un figlio
17
Aggiunta di un figlio
17
Funzioni di stampa a schermo
• \
18
Funzioni di stampa a schermo
• \
18
Funzioni di stampa a schermo
• \
18
Elenco dei figli e dei nipoti
19
Elenco dei figli e dei nipoti
19
La nostra popolazione
20
MARCO STEFANIA LUCA PIPPO LUCIA ARIANNA RINALDO STEFANO
P0 P1 P2 P3 P4 P5 P6 P7
La nostra popolazione
20
MARCO STEFANIA LUCA PIPPO LUCIA ARIANNA RINALDO STEFANO
P0 P1 P2 P3 P4 P5 P6 P7
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 e Rinaldo
La nostra popolazione
20
MARCO STEFANIA LUCA PIPPO LUCIA ARIANNA RINALDO STEFANO
P0 P1 P2 P3 P4 P5 P6 P7
P4 P0 P1
P5 P2 P3
P7 P6
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 e Rinaldo
La nostra popolazione (codice C)
21
Aggiungiamo le parentele
22
P4 P0 P1
P5 P2 P3
P7 P6
Aggiungiamo le parentele
22
P4 P0 P1
P5 P2 P3
P7 P6
Il main()
23
24
Tutte il materiale sarà disponibile sul mio sito internet!
alessandronacci.it