Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
• Quando in un programma si vogliono rappresentare dati • Per dichiarare una struttura si usa la parola riservata
appartenenti al mondo reale, i tipi di dati semplici, quali struct
interi, caratteri, ecc. non sono sufficienti
• La definizione di una struttura crea un nuovo tipo
• spesso ci si deve riferire ad oggetti che sono aggregati di dati
diversi • dipendente è il nome della struttura
• ad esempio, un libro è un'entità composta da un titolo, un autore, un • È un nuovo tipo che può essere usato per dichiarare variabili di
editore, l'anno di pubblicazione, il testo tipo dipendente
• Ogni variabile di tipo dipendente consta di 3 campi, l’intero
• Le strutture sono utili anche codice, l’array di caratteri nome e il float stipendio struct dipendente {
• per definire record da memorizzare in file struct card { int codice;
• combinate con i puntatori, per creare strutture dati dinamiche char *face; char nome[30];
(liste, alberi, grafi …) char *suit; float stipendio;
};
};
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 3 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 4
1
26/02/2019
• Le strutture possono essere globalmente assegnate • Per accedere al singolo campo di una struttura
bisogna usare la cosiddetta “dot notation”
• Esempio: <nome variabile struttura>.<nome campo>
struct dipendente prog1 = {487,“Marco”,12000.35}; • Esempi:
struct dipendente prog2; programmatore.codice = 487;
… strcpy(programmatore.nome, ”Marco”);
prog2 = prog1; programmatore.stipendio = 12000.35;
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 7 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 8
2
26/02/2019
Esempio Esempio
• Gli array di strutture sono utili al posto dei vettori struct key {
paralleli o bidimensionali char *word;
• ad esempio, un programma che conta le occorrenze delle int count;
parole chiavi del C, invece di essere organizzato con due } keytab[NKEY] = {“auto”, 0,
vettori paralleli “break”, 0,
char * auto break .... while …
“while”, 0};
int 3 5 ... 1 …
• può essere organizzato con un vettore di strutture for(i = 0; i < NKEY; i++)
• ogni elemento dell’array è una struttura a due campi che printf(“%s è presente %d volte\n”, keytab[i].word,
specifica una parola chiave ed il relativo numero di occorrenze keytab[i].count);
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 11 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 12
3
26/02/2019
• Una struttura può contenere anche altre strutture • Rappresentiamo mediante una struttura l’oggetto rettangolo
• in una rappresentazione cartesiana, un rettangolo è univocamente
struct progetto { determinato dai suoi vertici in alto a destra ed in basso a sinistra
int mesi; struct point {
double budget; int x;
char argomento[100]; int y;
struct dipendente pgm[100]; };
} prgSoft; struct rectangle {
• L’inserimento del 15° programmatore nel progetto struct point pt1;
può avvenire così: struct point pt2;
strcpy(prgSoft.pgm[14].nome, ”Marco”); };
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 13 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 14
strcpy((*matPunt).fornitore, “Mondini”);
…
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 15 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 16
4
26/02/2019
• Per semplificare l’accesso ai membri di una struttura, • Le strutture sono passate alle funzioni per valore
quando si usano i puntatori, è disponibile l’operatore • pertanto, la funzione opera su una copia locale della
-> struttura
• <puntatore struttura> -> <membro struttura> • È possibile il passaggio per riferimento, usando come
• nell’esempio precedente, possiamo scrivere parametro un puntatore alla struttura
matPunt->durezza = 3: struct cartella { • in tal modo, si consente alla funzione di modificare la
…
strcpy(matPunt->fornitore, “Mondini”); struct matita *m; struttura
• nel caso di strutture } *q;
innestate, l’operatore -> può …
essere utilizzato ripetutamente … q->m->fornitore …
(è associativo a sinistra) … q->m->durezza …
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 17 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 18
• Sui puntatori a strutture è possibile applicare • typedef consente di dichiarare nuovi tipi sulla base di tipi
un’aritmetica, così come per gli altri puntatori esistenti
• occorre soltanto tener presente che gli operatori • Ad esempio:
d’accesso . e -> hanno la precedenza massima e che sono typedef char* Stringa
operatori associativi a sinistra … ++p->len … • definisce Stringa come un alias del tipo char *
struct {
/* è uguale a */ • Pertanto, si può scrivere:
… ++(p->len) … Stringa str1, str2;
int len; /* che è diverso da */
char *str; … (++p)->len … • Esempio:
} *p; … ++p(->len) … /* SBAGLIATO */ typedef struct punto {…} PIXEL;
PIXEL center, *origin;
Per risolvere il problema usare le parentesi /* invece di struct punto center, *origin; */
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 19 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 20
5
26/02/2019
La dichiarazione typedef
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 21