lezione 10 (21 marzo 2012)2
TRANSCRIPT
![Page 1: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/1.jpg)
Cos’è un vettore ?
Un vettore è un insieme finito di N variabili dello stesso tipo,ognuna identificata da un indice intero compreso fra 0 e N-1
![Page 2: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/2.jpg)
Formato:tipo nome_vettore[numberOfElements];
Quando si definisce un vettore, bisogna specificarne:
il tipo dei suoi elementi;il nome;il numero dei suoi elementi;
Esempio:int c[12];float mio_vettore[3284];
c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]c[10]c[11]
![Page 3: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/3.jpg)
Non è un nuovo tipo, ma si definiscono come vettori di vettori
Dichiarazione di vettori multidimensionali<tipo-elementi> <nome-array> [lung_1][lung_2]…[lungN];
Per ogni dimensione i l’indice va da 0 a lung_i-1
Esempio:int mat[3][4]; array bidimensionale di 3 righe per 4 colonne
(ovvero matrice 3 X 4)
Array multidimensionali
![Page 4: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/4.jpg)
Accesso agli elementi di una matrice
Esempio:int i, mat[3][4];...i = mat[0][0]; //elemento di riga 0 e colonna 0 (primo elemento)mat[2][3] = 24; //elemento di riga 2 e colonna 3 (ultimo elemento)mat[2][1] = mat[0][0] * mat[1][3];
• Come per i vettori, l’unica operazione possibile sulle matrici è
l’accesso agli elementi tramite l’operatore [ ]
Array multidimensionali
![Page 5: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/5.jpg)
#include <stdio.h>#define RIG 2#define COL 3int main() {
int mat[RIG][COL];int i, j;/* lettura matrice */printf("Lettura matrice %d x %d;\n", RIG, COL);
for (i = 0; i < RIG; i++)for (j = 0; j < COL; j++)
scanf("%d", &mat[i][j]);/* stampa matrice */printf("La matrice e':\n");
for (i = 0; i < RIG; i++) {for (j = 0; j < COL; j++)
printf("%6d ", mat[i][j]);printf("\n");
}system(“PAUSE”);return 0;
}
Esempio: lettura e stampa di matrice
![Page 6: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/6.jpg)
Tipi strutturati in C
Strutture (Record)
![Page 7: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/7.jpg)
Strutture
• Una struttura è una collezione di variabili finita nonnecessariamente dello stesso tipo, ognuna identificata da un nome•Una struttura (o record) serve quindi per aggregare elementi(anche di tipo diverso) sotto un unico nome.
Sintassi
struct <etichetta> {<definizione-di-variabili>
};
![Page 8: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/8.jpg)
Definizione di strutture
Esempio di definizione di struttura:
struct persona { char nome[20];
int età;float stipendio;
};
• ATTENZIONE: La definizione della struttura non provoca allocazione di memoria, ma introduce un nuovo tipo di dato
![Page 9: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/9.jpg)
Dichiarazione di variabili struttura
Esempio:
struct persona p1, p2;struct persona elenco[50];
• Una variabile di tipo struttura può essere dichiarata contestualmente alla
definizione della struttura.• In questo caso si può anche omettere l’etichetta di struttura.
struct data {int giorno;int mese;int anno;
} d1,d2;
p1 e p2 sono variabili di tipo struct persona
elenco è un array di 50 elementi di tipo struct persona
d1 e d2 sono variabili di tipo struct data
![Page 10: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/10.jpg)
Campi di una struttura• devono avere nomi univoci all’interno di una struttura• strutture diverse possono avere campi con lo stesso nome• i nomi dei campi possono coincidere con nomi di variabili o funzioni• possono essere di tipo diverso (semplice o altre strutture)• un campo di una struttura non può essere del tipo struttura che si sta
definendo
int x;struct a { char x; int y; };struct b { int w; float x; };
struct s {int a;struct s next; };
ERRORE
Esempicorretti
![Page 11: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/11.jpg)
Accesso ai campi di una struttura• Una volta definita una variabile struttura, si accede ai singoli
campi mediante la notazione puntata
struct punto {int x, y;
} p1, p2 ;…p1.x = 10;p1.y = -2;p2.x = 5;p2.y = 7;
struct data {int giorno, mese, anno;
} d1, d2 ;…d1.giorno = 25;d1.mese = 12;d1.anno = 2003;printf(“%d-%d-%d”, d1.giorno,
d1.mese, d1.anno);
• Ogni campo si usa come una normale variabile del tipocorrispondente a quello del campo
![Page 12: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/12.jpg)
Operazioni sulle strutture
• Si possono assegnare variabili di tipo struttura a variabili dello
stesso tipo struttura.Esempio:
struct data d1, d2;...d1 = d2;
• Non è possibile effettuare il confronto tra due variabili di tipo
struttura.Esempio:
struct data d1, d2;if (d1 == d2) ... Errore!
![Page 13: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/13.jpg)
• Esempio: struct card{
int valore;char seme;};
– La parola chiave struct introduce la definizione della struttura– card è il nome della struttura ed è usato per dichiarare variabili di
quel tipo di struttura– card contiene due membri della struttura: un intero che contiene il
valore della carta, ed un carattere che contiene l’iniziale del suoseme (‘c’, ‘q’, ‘f’, ‘p’)
– I membri della stessa struttura devono avere nomi diversi, mentremembri di diverse strutture possono avere lo stesso nome (poicapiremo perché).
– Ogni definizione di struttura deve terminare con ;
![Page 14: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/14.jpg)
Esempio• PROBLEMA: leggere le coordinate di un punto in un piano e
modificarle a seconda dell’operazione richiesta1. proiezione sull’asse X2. proiezione sull’asse Y3. traslazione di DX e DY
• Specifica:• leggere le coordinate di input e memorizzarle in una
struttura• leggere l’operazione richiesta• effettuare l’operazione• stampare il risultato
![Page 15: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/15.jpg)
#include <stdio.h>main() {
struct punto{float x,y;} P;unsigned int op;float Dx, Dy;printf("ascissa? "); scanf("%f",&P.x);printf("ordinata? "); scanf("%f",&P.y);printf("%s\n","operazione(0,1,2,3)?"); scanf("%d",&op);switch (op) {
case 1: P.y=0;break;case 2: P.x=0; break;case 3: printf("%s","Traslazione?”);
scanf("%f%f",&Dx,&Dy);P.x=P.x + Dx;P.y=P.y + Dy;break;
default: ;}printf("%s\n",“Le nuove coordinate sono ");printf("%f %f\n",P.x,P.y);
}
Esempio
![Page 16: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/16.jpg)
Funzioni in C
![Page 17: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/17.jpg)
Servitore:• Un qualunque ente computazionale capace di nascondere la propria organizzazione interna
• presentando ai clienti una precisa interfaccia per lo scambio di informazioni
Cliente:• qualunque ente in grado di invocare uno o più servitori per
svolgere il proprio compito
Modello cliente/servitore
![Page 18: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/18.jpg)
•Lo scambio di informazioni tra un cliente e un servitore può avvenire
in modo esplicito tramite le interfacce stabilite dal servitore
in modo implicito tramite aree-dati accessibili ad entrambi,
ossia l’ambiente condiviso
Comunicazione cliente/servitore
![Page 19: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/19.jpg)
•L’interfaccia (o prototipo) di una funzione comprende
nome della funzionelista dei parametritipo del valore da essa denotato
• Esplicita il contratto di servizio fra cliente e servitore
•Cliente e servitore comunicano quindi mediantei parametri trasmessi dal cliente al servitore all’atto della chiamatail valore restituito dal servitore al cliente
Interfaccia di una funzione
![Page 20: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/20.jpg)
int max (int x, int y ){if (x>y) return x ;else return y;}
• Il simbolo max denota il nome della funzione
• Le variabili intere x e y sono i parametri della funzione
• Il valore restituito è un intero int
Funzioni: esempio C
![Page 21: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/21.jpg)
• Il cliente passa informazioni al servitore mediante una serie di parametri
Parametri formali:sono specificati nella dichiarazione del servitoreesplicitano il contratto fra servitore e clienteindicano che cosa il servitore si aspetta dal cliente
Parametri attuali:sono trasmessi dal cliente all’atto della chiamatadevono corrispondere ai parametri formali in numero, posizione e tipo
Comunicazione cliente/servitore
![Page 22: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/22.jpg)
Funzioni: esempio parametri
![Page 23: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/23.jpg)
Legame tra parametri attuali e parametri formali:• effettuato al momento della chiamata, in modo
dinamico
Tale legame:vale solo per l’invocazione correntevale solo per la durata della funzione
Comunicazione cliente/servitore
![Page 24: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/24.jpg)
Esempio
All’atto di questa chiamata della funzione, si effettua un legame tra:x e zy e 4
![Page 25: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/25.jpg)
Esempio:
All’atto della chiamata della funzione si effettua il legame tra:x e 5y e z
![Page 26: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/26.jpg)
Information hiding
• La struttura interna (corpo) di una funzione ècompletamente inaccessibile dall.esterno
• Così facendo si garantisce protezione dell’informazione (information hiding)
• Una funzione è accessibile solo attraverso la sua interfaccia
![Page 27: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/27.jpg)
Definizione di funzione in C
<tipoValore> <nome>(<parametri-formali>) {
<corpo>}
<parametri-formali>o una lista vuota: voido una lista di variabili (separate da virgole)
visibili solo entro il corpo della funzione
<tipoValore>deve coincidere con il tipo del valore restituito dalla funzionePuò non esservi valore restituiti, in tal caso il tipo è void
La forma base è:return <espressione>;
![Page 28: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/28.jpg)
Definizione di funzione in C
<tipoValore> <nome>(<parametri-formali>) {
<corpo>}
La forma base è:return <espressione>;
• Nella parte corpo possono essere presenti: definizioni e/o dichiarazioni locali (parte dichiarazioni) e un insieme di istruzioni (parte istruzioni)
• I dati riferiti nel corpo possono essere costanti, variabili, oppure parametri formali
• All'interno del corpo, i parametri formali vengono trattati come variabili
![Page 29: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/29.jpg)
Funzioni: nascita e morte
• All’atto della chiamata:l’esecuzione del cliente viene sospesa e ilcontrollo passa al servitore
• Il servitore “vive” solo per il tempo necessario a svolgere il servizio
• Al termine, il servitore “muore”, e l’esecuzione torna al cliente
![Page 30: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/30.jpg)
Chiamata di funzione
• La chiamata di funzione è un.espressione della forma
<nomefunzione> ( <parametri-attuali> )
• dove:
<parametri-attuali> ::=[ <espressione> ] { , <espressione> }
![Page 31: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/31.jpg)
Funzioni: esempioFunzioni: esempio
int max (int x, int y ){if (x>y) return x ;
else return y;}
SERVITORE
Definizione della funzione
CLIENTE
Chiamata della funzione
main() {int z = 8;int m;m = max ( z, 4);
}
Parametri formali
Parametri attuali
![Page 32: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/32.jpg)
Risultato di una funzione
• L’istruzione return provoca la restituzione del controllo al cliente, unitamente al valore della espressione che la segue.
• Eventuali istruzioni successive alla return non saranno mai eseguite
int max (int x, int y ){if (x>y) return x ;else return y;
}
![Page 33: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/33.jpg)
Funzioni: esempioFunzioni: esempio
int max (int x, int y ){if (x>y) return x ;
else return y;}
SERVITORE
Definizione della funzione
CLIENTE
Chiamata della funzione
main() {int z = 8;int m;m = max ( z, 4);
}
Parametri formali
Risultato
![Page 34: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/34.jpg)
Riassumendo
All’atto dell’invocazione di una funzione:
• si crea una nuova attivazione (istanza) del servitore
• si alloca la memoria per i parametri (e le eventuali variabili locali)
• si trasferiscono i parametri al servitore
• si trasferisce il controllo al servitore
• si esegue il codice della funzione
![Page 35: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/35.jpg)
Passaggio dei parametri
In generale, un parametro può essere trasferito dal cliente al servitore:
• per valore o copia (by value)si trasferisce il valore del parametro attuale
• per riferimento (by reference)si trasferisce un riferimento al parametro attuale
![Page 36: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/36.jpg)
Passaggio per valore
• Si trasferisce una copia del valore del parametro attuale
cliente
![Page 37: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/37.jpg)
Passaggio per valore
• Si trasferisce una copia del valore del parametro attuale
cliente servitore
Istanza del servitore
Ogni azionefatta su w èlocale al servitore
Valore (copiato) di z
copia
![Page 38: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/38.jpg)
Passaggio per riferimento
• Si trasferisce un riferimento al parametro attuale
cliente
![Page 39: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/39.jpg)
Passaggio per valore
• Si trasferisce una riferimento al parametro attuale
cliente servitore
Istanza del servitore
Ogni azionefatta su w èIn realtàfatta sulla variabile z del cliente
Riferimento a z(indirizzo)
riferimento
xx
![Page 40: Lezione 10 (21 marzo 2012)2](https://reader033.vdocuments.site/reader033/viewer/2022052904/557bed46d8b42a302d8b49ef/html5/thumbnails/40.jpg)
Passaggio dei parametri in C
• In C, i parametri sono trasferiti sempre e solo per valore (by value)
si trasferisce una copia del parametro attuale, non l’originaletale copia è strettamente privata e locale a quel servitore
il servitore potrebbe quindi alterare il valore ricevuto, senza che ciò abbia alcun impatto sul cliente