Sei sulla pagina 1di 6

26/02/2019

UNIVERSITÀ DEGLI STUDI Le strutture


DEL SANNIO Benevento • Esistono due grandi categorie di dati in C:
DING • Dati non strutturati
DIPARTIMENTO DI INGEGNERIA
• int, char, float, double, pointer
• Dati strutturati
CORSO DI "PROGRAMMAZIONE I" • Omogenei
• array
• Eterogenei
• struct
Prof. Franco FRATTOLILLO
• Una struttura è una collezione di una o più variabili
Dipartimento di Ingegneria
(membri o campi della struttura), normalmente di tipi
Università degli Studi del Sannio
diversi, raggruppate sotto uno stesso nome
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 1
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 2

Perché usare le strutture Esempi di strutture

• 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

La dichiarazione di variabili struct L’inizializzazione delle strutture

• Creato il tipo, si possono dichiarare le variabili • Le strutture possono essere inizializzate


struct dipendente programmatore; • Esempi:
struct card oneCard, deck[52], *cPtr;
struct dipendente programmatore = {487,“Marco”,12000.35};
• Oppure, è possibile fondere creazione del tipo e
dichiarazione di variabili struct dipendente {
In questo caso, il tag può int codice;
struct card { essere omesso char nome[30];
char *face;
float stipendio;
char *suit;
} oneCard, deck[52], *cPtr;
} programmatore = {487, ”Marco”, 12000.35};
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 5 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 6

L’assegnazione delle strutture La selezione dei campi

• 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

Altre operazioni sulle strutture Strutture ed array


• La dichiarazione di un array di strutture si realizza così:
• Altre operazioni che possono essere effettuate su struct matita {
strutture sono: int durezza; struct matita {
• ottenere l’indirizzo di una struttura (con &) char *fabbricante;
int durezza;
char *fabbricante;
• usare l’operatore sizeof per determinare l’ingombro di una int numero;
int numero;
};
struttura in termini di byte } m[3];
main( ) {
struct matita m[3];
m[0].durezza = 2;
m[2].numero = 400;
m[1].fabbricante = “Modini”;
}
Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 9 Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 10

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

Strutture innestate Esempio

• 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

Un’osservazione Un esempio di puntatore a struttura

• Una struttura non può contenere un’istanza di se struct matita {


stessa int durezza;
• Una struttura può però contenere un puntatore ad char fornitore[40];
una struttura dello stesso tipo } m;
• È questa la chiave per realizzare strutture dati dinamiche …
Le parentesi sono importanti in
struct matita *matPunt = &m; quanto la precedenza dell’operatore .
(*matPunt).durezza = 3; è superiore a quella di *

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

L’operatore -> Il passaggio delle strutture

• 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

L’aritmetica dei puntatori a strutture La dichiarazione typedef

• 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

• L’uso di typedef consente di aumentare la chiarezza e


la leggibilità del programma
• forse …
• L’uso di typedef consente anche di elevare la
portabilità del programma
• dovendo portare su un altro sistema un programma che
ha tipi dipendenti dall’architettura, è sufficiente modificare
le typedef senza che vi sia la necessità di modificare le
dichiarazioni di variabili

Franco FRATTOLILLO – Dipartimento di Ingegneria – Università degli Studi del Sannio Corso di "Programmazione I" – Corso di Laurea in Ingegneria Informatica / ExAT 21

Potrebbero piacerti anche