1. 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
2. Formato:
tipo nome_vettore[numberOfElements];
Quando si definisce un vettore, bisogna
specificarne:
il tipo dei suoi elementi; c[0]
il nome; c[1]
il numero dei suoi elementi; c[2]
c[3]
c[4]
Esempio: c[5]
int c[12]; c[6]
float mio_vettore[3284]; c[7]
c[8]
c[9]
c[10]
c[11]
3. Array multidimensionali
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)
4. Array multidimensionali
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 [ ]
5. Esempio: lettura e stampa di matrice
#include <stdio.h>
#define RIG 2
#define COL 3
int 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;
}
7. Strutture
• Una struttura è una collezione di variabili finita
non
necessariamente 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>
};
8. 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
9. Dichiarazione di variabili
struttura
p1 e p2 sono variabili di tipo struct persona
Esempio: elenco è un array di 50 elementi di
tipo struct persona
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.
d1 e d2 sono variabili di tipo struct data
struct data {
int giorno;
int mese;
int anno;
} d1,d2;
10. 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 Esempi
definendo corretti
int x;
struct a { char x; int y; };
struct b { int w; float x; };
ERRORE
struct s {
int a;
struct s next; };
11. Accesso ai campi di una struttura
• Una volta definita una variabile struttura, si accede ai singoli
campi mediante la notazione puntata
struct data {
struct punto { int giorno, mese, anno;
int x, y; } d1, d2 ;
} p1, p2 ; …
… d1.giorno = 25;
p1.x = 10; d1.mese = 12;
p1.y = -2; d1.anno = 2003;
p2.x = 5; printf(“%d-%d-%d”, d1.giorno,
p2.y = 7; d1.mese, d1.anno);
• Ogni campo si usa come una normale variabile del tipo
corrispondente a quello del campo
12. 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!
13. • 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 suo
seme (‘c’, ‘q’, ‘f’, ‘p’)
– I membri della stessa struttura devono avere nomi diversi, mentre
membri di diverse strutture possono avere lo stesso nome (poi
capiremo perché).
– Ogni definizione di struttura deve terminare con ;
14. Esempio
• PROBLEMA: leggere le coordinate di un punto in un
piano e
modificarle a seconda dell’operazione richiesta
1. proiezione sull’asse X
2. proiezione sull’asse Y
3. 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
15. Esempio
#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("%sn","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("%sn",“Le nuove coordinate sono ");
printf("%f %fn",P.x,P.y);
}
17. Modello cliente/servitore
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
18. Comunicazione cliente/servitore
•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
19. Interfaccia di una funzione
•L’interfaccia (o prototipo) di una funzione comprende
nome della funzione
lista dei parametri
tipo del valore da essa denotato
• Esplicita il contratto di servizio fra cliente e servitore
•Cliente e servitore comunicano quindi mediante
i parametri trasmessi dal cliente al servitore all’atto della chiamata
il valore restituito dal servitore al cliente
20. Funzioni: esempio C
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
21. Comunicazione cliente/servitore
• Il cliente passa informazioni al servitore mediante una serie di
parametri
Parametri formali:
sono specificati nella dichiarazione del servitore
esplicitano il contratto fra servitore e cliente
indicano che cosa il servitore si aspetta dal cliente
Parametri attuali:
sono trasmessi dal cliente all’atto della chiamata
devono corrispondere ai parametri formali in numero,
posizione e tipo
23. Comunicazione cliente/servitore
Legame tra parametri attuali e parametri
formali:
• effettuato al momento della chiamata, in
modo
dinamico
Tale legame:
vale solo per l’invocazione corrente
vale solo per la durata della funzione
24. Esempio
All’atto di questa
chiamata della funzione,
si effettua un legame tra:
xez
ye4
25. Esempio:
All’atto della chiamata
della funzione si effettua
il legame tra:
xe5
yez
26. 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
27. Definizione di funzione in C
<tipoValore> <nome>(<parametri-formali>) {
<corpo>
La forma base è:
}
return <espressione>;
<parametri-formali>
o una lista vuota: void
o una lista di variabili (separate da virgole)
visibili solo entro il corpo della funzione
<tipoValore>
deve coincidere con il tipo del valore restituito dalla funzione
Può non esservi valore restituiti, in tal caso il tipo è void
28. 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
29. Funzioni: nascita e morte
• All’atto della chiamata:
l’esecuzione del cliente viene sospesa e il
controllo 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
30. Chiamata di funzione
• La chiamata di funzione è un.espressione della forma
<nomefunzione> ( <parametri-attuali> )
• dove:
<parametri-attuali> ::=
[ <espressione> ] { , <espressione> }
31. Funzioni: esempio
Parametri formali
int max (int x, int y ){
SERVITORE
if (x>y) return x ;
else return y; Definizione
}
della funzione
main() {
CLIENTE
int z = 8;
int m; Chiamata
m = max ( z, 4);
}
della funzione
Parametri attuali
32. 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;
}
33. Funzioni: esempio
Parametri formali
int max (int x, int y ){
SERVITORE
if (x>y) return x ;
else return y; Definizione
}
della funzione
main() {
CLIENTE
int z = 8;
int m; Chiamata
m = max ( z, 4);
}
della funzione
Risultato
34. 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
35. 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
36. Passaggio per valore
• Si trasferisce una copia del valore del parametro attuale
cliente
37. Passaggio per valore
• Si trasferisce una copia del valore del parametro attuale
Valore
(copiato) di z
copia
Ogni azione
fatta su w è
locale al
servitore
Istanza del
servitore
cliente servitore
39. Passaggio per valore
• Si trasferisce una riferimento al parametro attuale
Riferimento a z
(indirizzo)
riferimento
x
x
Ogni azione
fatta su w è
In realtà
fatta sulla
Istanza del
variabile z
servitore
del cliente
cliente servitore
40. 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’originale
tale copia è strettamente privata e locale a quel servitore
il servitore potrebbe quindi alterare il valore ricevuto, senza
che ciò abbia alcun impatto sul cliente