SlideShare uma empresa Scribd logo
1 de 19
Fondamenti di informatica
Strutture dati composte: struct
Il sistema dei tipi del C++
• Uno degli obiettivi principali del C++ è
permettere al programmatore di creare tipi
personalizzati e usarli come se fossero offerti
dal linguaggio
• Il sistema dei tipi del C++ comprende
– Tipi predefiniti (predefined)
– Tipi composti (composite)
– Tipi definiti dall’utente (user defined)
– Tipi classe (class types)
I costruttori di tipi
• A partire dai tipi predefiniti si possono creare
nuovi tipi, che aggiungono proprietà speciali ai
tipi predefiniti
– Const (visto)
– Reference (visto)
– Pointer (ancora da vedere)

• A questi si aggiungono costruttori di tipi definiti
interamente dall'utente
– struct (eredità del C, poco usato in C++)
– Class
Tipi composti aggregati
• Variabili omogenee: sequenza finita /
indefinita
– ARRAY (sequenza predefinita), VECTOR (sequenza
indefinita)

• Variabili disomogenee: tipi classe
– STRUCT (record)
– CLASS (oggetti con dati e funzioni dichiarati e
definiti assieme)
4
Esigenza
• Nella progettazione dei dati, spesso capita di
prevedere informazioni connesse in gruppi logici:
– Parole in un testo e loro frequenza
– Indirizzo, composto da via n. civico città
– Dati dell'utente: username, password, email

• In questi casi, piuttosto che variabili separate, si
usa un costruttore di tipo che definisce un gruppo
logico di variabili correlate, detto "record"
(ovvero: scheda, registrazione)
Il costruttore di tipo record
• Record (o struct): memorizzano aggregazioni di
dati di diversa natura
• Ciascun dato è chiamato “campo” o dato membro
(member):
struct {
string via;
int numero;
int CAP;
string citta;
} indirizzo;

//
//
//
//

1o
2o
3o
4o

campo:
campo:
campo:
campo:

stringa
intero
intero
stringa

nome della variabile record

• indirizzo è un record formato da quattro
campi di vario tipo
Uso dei record
• Il record (o struct) è una sorta di “contenitore” di campi
di tipo disomogeneo
• Il record raggruppa dati più semplici
– Ne rende più ordinata la gestione, evitando confusioni

• I campi del record non sono accessibili individualmente
– L'accesso avviene mediante il record a cui appartengono
– Si utilizza l'operatore . come metodo di accesso ai campi
• indirizzo.citta

– Con gli iterator si usa l'operatore -> : iter->member
– I nomi dei campi sono identificatori “locali” all’interno di
una variabile di tipo record, da usarsi come suffissi
Operazioni su campi dei record
• Le operazioni che sono definite sono le stesse
applicabili sui tipi dei campi
• Assegnamento ai campi del record:
indirizzo.via = "Ponzio";
indirizzo.numero  34;
indirizzo.CAP  20133;
indirizzo.citta = "Milano";

• Accesso (leggere, scrivere…):
– cout << indirizzo.numero;
– cin >> indirizzo.CAP;
Assegnamento di record
• Dati due record identici (cioè dichiarati insieme) è lecito
assegnare globalmente il primo al secondo
struct  … / campi /  rec1, rec2;
•
è lecito scrivere:
rec2  rec1;
• tutti i campi di rec1 sono ordinatamente copiati nei campi
corrispondenti di rec2.
• Se i due record sono diversi (anche solo per l’ordine dei
campi) l’assegnamento è privo di senso !
• Memento: l’assegnamento “diretto” tra array è vietato
– deve avvenire elemento per elemento

• Ma…. Diventa possibile tra membri array di una struct!
Assegnamento di array nelle struct
int main() {
struct {
char via[20];
int numero;
int CAP;
string citta;
} indirizzo1, indirizzo2;
strcpy(indirizzo1.via, "Ponzio"); // non si può usare assegnamento
indirizzo1.numero = 35;
indirizzo1.CAP = 20133;
indirizzo1.citta = "Milano";
cout << "RECORD 1: " << endl << indirizzo1.via << endl << indirizzo1.numero
<< endl << indirizzo1.CAP << endl << indirizzo1.citta << endl;
indirizzo2 = indirizzo1; // copia anche l'array!!
cout << "RECORD 2: " << endl << indirizzo2.via << endl << indirizzo2.numero
<< endl << indirizzo2.CAP << endl << indirizzo2.citta << endl;
return 0;
}
Check this out
• http://stackoverflow.com/questions/8939090/
why-array-assignment-operation-doesnt-existbut-structure-assignment-does-in-c
Tipi definiti dall’utente
Tipi di dato astratti (TDA)

12
Tipi definiti dall'utente
• I record sono un caso esemplare in cui un tipo ha una
struttura definita dal programmatore
• Tuttavia è un tipo "anonimo"
• C e C++ forniscono un modo per dare un nome a un tipo
• Esempio:
• typedef int intero;
• intero numero;

•

è equivalente a:
• int numero;

• È la definizione di un sinonimo
– Il nuovo tipo intero eredita le caratteristiche (valori e
operazioni) del tipo di partenza int
Costruttore di record (struct)
•

•
•

Definizione di un tipo tipo data per le date:
typedef struct {
int giorno;
int mese;
int anno;
} data;
Dichiarazione di variabili di tipo data:
data oggi, domani, dopodomani;
Altro esempio:
typedef struct {
char nome[20];
char cognome[20];
data nato_il;
char nato_a[15];
char codice_fiscale[16];
int stipendio;
} dipendente;
dipendente piero;
Esempi d'uso
• Si possono dichiarare le variabili:
dipendente persona1, persona2;

• E modificare i dati membro:
persona1.stipendio + (persona1.stipendio  10)  100;
persona2.stipendio + (persona2.stipendio  10)  100;

• Anche innestati:
persona2.nato_il.giorno = 15; // NB: accede a campo
giorno del campo data di dipendente
Progettazione dei dati
• Esempio vendite di libri
– Si vuole costruire un programma che gestisca le vendite di
libri
• Ogni libro è caratterizzato da un codice ISBN

– Il programma deve gestire per ogni libro il numero totale di
copie vendute, il ricavo totale e medio
– L'utente inserisce sequenzialmente i dati di vendita per i
diversi libri, il programma aggrega i dati per ciascun codice
ISBN e stampa il dato aggregato
– Deve quindi essere possibile:
• Inserire e stampare i dati di un libro
• Sommare più dati di vendita relativi allo stesso libro
• Stampare i dati di vendita aggregati relativi a un libro
Suddivisione del programma
• Un file di libreria (Sales_item.h) conterrà la
definizione del tipo che rappresenta il dato di
vendita: Sales_item
• Definiamo ora Sales_item come struct, cioè un
tipo definito dall'utente che comprende dati, ma
non le operazioni relativi al dato di vendita
– Campi: codice ISBN, copie vendute, ricavo

• Il programma principale importa e usa Sales_item
come se fosse un tipo predefinito
– Sales_item item; // dichiara una var. di tipo Sales_item !
Sales_item.h
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
using namespace std;

struct Sales_data {
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
#endif
Programma principale
#include <iostream>
#include <string>
#include "Sales_data.h"
using namespace std;
int main()
{

Sales_data data1, data2;
// code to read into data1 and data2
double price = 0; // price per book, used to calculate total revenue
// read the first transactions: ISBN, number of books sold, price per book
cin >> data1.bookNo >> data1.units_sold >> price;
// calculate total revenue from price and units_sold
data1.revenue = data1.units_sold * price;
// read the second transaction
cin >> data2.bookNo >> data2.units_sold >> price;
data2.revenue = data2.units_sold * price;
// check whether data1 and data2 have the same ISBN, if so print the sum of data1 and data2
if (data1.bookNo == data2.bookNo) {
unsigned totalCnt = data1.units_sold + data2.units_sold;
double totalRevenue = data1.revenue + data2.revenue;
// print: ISBN, total sold, total revenue, average price per book
cout << data1.bookNo << " " << totalCnt << " " << totalRevenue << " ";
if (totalCnt != 0)
cout << totalRevenue/totalCnt << endl;
else
cout << "(no sales)" << endl;

} else {

}
}

return 0; // indicate success
cerr << "Data must refer to the same ISBN"
return -1; // indicate failure

<< endl; // transactions not for same ISBN

Mais conteúdo relacionado

Mais procurados

14 - Programmazione: Stream e File
14 - Programmazione: Stream e File14 - Programmazione: Stream e File
14 - Programmazione: Stream e FileMajong DevJfu
 
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2Majong DevJfu
 
Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)STELITANO
 
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...UltraUploader
 
Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)STELITANO
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)STELITANO
 
Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)STELITANO
 
10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturatiMajong DevJfu
 
Puntatori e Riferimenti
Puntatori e RiferimentiPuntatori e Riferimenti
Puntatori e RiferimentiIlio Catallo
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScriptGiovanni Buffa
 
JavaScript Object Oriented
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object OrientedManuel Scapolan
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#Marco Parenzan
 
05 - Programmazione: Funzioni
05 - Programmazione: Funzioni05 - Programmazione: Funzioni
05 - Programmazione: FunzioniMajong DevJfu
 

Mais procurados (20)

14 - Programmazione: Stream e File
14 - Programmazione: Stream e File14 - Programmazione: Stream e File
14 - Programmazione: Stream e File
 
3 Linguaggioc
3   Linguaggioc3   Linguaggioc
3 Linguaggioc
 
07 1 funzioni
07 1 funzioni07 1 funzioni
07 1 funzioni
 
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2
 
Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)
 
Ruby in 25 minuti
Ruby in 25 minutiRuby in 25 minuti
Ruby in 25 minuti
 
Array in C++
Array in C++Array in C++
Array in C++
 
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
 
Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)
 
Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)
 
2006 Py03 intermedio
2006 Py03 intermedio2006 Py03 intermedio
2006 Py03 intermedio
 
Corso c++
Corso c++Corso c++
Corso c++
 
10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati
 
Puntatori e Riferimenti
Puntatori e RiferimentiPuntatori e Riferimenti
Puntatori e Riferimenti
 
Pillole di C++
Pillole di C++Pillole di C++
Pillole di C++
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScript
 
JavaScript Object Oriented
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object Oriented
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#
 
05 - Programmazione: Funzioni
05 - Programmazione: Funzioni05 - Programmazione: Funzioni
05 - Programmazione: Funzioni
 

Semelhante a 06 3 struct

Corso c# - Dalle basi del linguaggio alla creazione di un'applicazione uwp
Corso c# - Dalle basi del linguaggio alla creazione di un'applicazione uwpCorso c# - Dalle basi del linguaggio alla creazione di un'applicazione uwp
Corso c# - Dalle basi del linguaggio alla creazione di un'applicazione uwpGiuseppe Cramarossa
 
Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScriptSinergia Totale
 
Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...
Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...
Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...Giuseppe Cramarossa
 
Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2STELITANO
 
C#, imparare a programmare e sopravvivere
C#, imparare a programmare e sopravvivereC#, imparare a programmare e sopravvivere
C#, imparare a programmare e sopravvivereMatteo Valoriani
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptSinergia Totale
 
Code Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled RepositoryCode Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled RepositoryAndrea Saltarello
 
Introduzione ai Big Data e alla scienza dei dati - Big Data
Introduzione ai Big Data e alla scienza dei dati - Big DataIntroduzione ai Big Data e alla scienza dei dati - Big Data
Introduzione ai Big Data e alla scienza dei dati - Big DataVincenzo Manzoni
 
Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)STELITANO
 
Introduzione al web (2/2) - 18/19
Introduzione al web (2/2) - 18/19Introduzione al web (2/2) - 18/19
Introduzione al web (2/2) - 18/19Giuseppe Vizzari
 
Il controllo temporale dei data file in staging area
Il controllo temporale dei data file in staging areaIl controllo temporale dei data file in staging area
Il controllo temporale dei data file in staging areaMassimo Cenci
 
5 - Introduzione al Web (2/2)
5 - Introduzione al Web (2/2)5 - Introduzione al Web (2/2)
5 - Introduzione al Web (2/2)Giuseppe Vizzari
 
5 - Introduzione al Web (2/2) - 17/18
5 - Introduzione al Web (2/2) - 17/185 - Introduzione al Web (2/2) - 17/18
5 - Introduzione al Web (2/2) - 17/18Giuseppe Vizzari
 
Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06Majong DevJfu
 
Sencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteSencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteGiuseppe Toto
 
Lezione 8 - Pratica - Il diagramma E-R
Lezione 8 - Pratica - Il diagramma E-RLezione 8 - Pratica - Il diagramma E-R
Lezione 8 - Pratica - Il diagramma E-RGiuseppe Cramarossa
 

Semelhante a 06 3 struct (20)

Corso c# - Dalle basi del linguaggio alla creazione di un'applicazione uwp
Corso c# - Dalle basi del linguaggio alla creazione di un'applicazione uwpCorso c# - Dalle basi del linguaggio alla creazione di un'applicazione uwp
Corso c# - Dalle basi del linguaggio alla creazione di un'applicazione uwp
 
Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScript
 
Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...
Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...
Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...
 
Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2
 
C#, imparare a programmare e sopravvivere
C#, imparare a programmare e sopravvivereC#, imparare a programmare e sopravvivere
C#, imparare a programmare e sopravvivere
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScript
 
Code Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled RepositoryCode Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled Repository
 
Introduzione ai Big Data e alla scienza dei dati - Big Data
Introduzione ai Big Data e alla scienza dei dati - Big DataIntroduzione ai Big Data e alla scienza dei dati - Big Data
Introduzione ai Big Data e alla scienza dei dati - Big Data
 
Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)
 
Introduzione al web (2/2) - 18/19
Introduzione al web (2/2) - 18/19Introduzione al web (2/2) - 18/19
Introduzione al web (2/2) - 18/19
 
Template
TemplateTemplate
Template
 
Il controllo temporale dei data file in staging area
Il controllo temporale dei data file in staging areaIl controllo temporale dei data file in staging area
Il controllo temporale dei data file in staging area
 
5 - Introduzione al Web (2/2)
5 - Introduzione al Web (2/2)5 - Introduzione al Web (2/2)
5 - Introduzione al Web (2/2)
 
5 - Introduzione al Web (2/2) - 17/18
5 - Introduzione al Web (2/2) - 17/185 - Introduzione al Web (2/2) - 17/18
5 - Introduzione al Web (2/2) - 17/18
 
Repository pattern
Repository patternRepository pattern
Repository pattern
 
Vb.Net
Vb.NetVb.Net
Vb.Net
 
Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06
 
Sencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteSencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parte
 
12 Struct
12   Struct12   Struct
12 Struct
 
Lezione 8 - Pratica - Il diagramma E-R
Lezione 8 - Pratica - Il diagramma E-RLezione 8 - Pratica - Il diagramma E-R
Lezione 8 - Pratica - Il diagramma E-R
 

Mais de Piero Fraternali

Multimedia on the mountaintop: presentation at ACM MM2016
Multimedia on the mountaintop: presentation at ACM MM2016Multimedia on the mountaintop: presentation at ACM MM2016
Multimedia on the mountaintop: presentation at ACM MM2016Piero Fraternali
 
presentation at European Utility Week, Vienna, Nov. 2015
presentation at European Utility Week, Vienna, Nov. 2015presentation at European Utility Week, Vienna, Nov. 2015
presentation at European Utility Week, Vienna, Nov. 2015Piero Fraternali
 
Fraternali concertation june25bruxelles
Fraternali concertation june25bruxellesFraternali concertation june25bruxelles
Fraternali concertation june25bruxellesPiero Fraternali
 
Crowsourcing (anche) per le aziende del settore tessile e della moda
Crowsourcing (anche) per le aziende del settore tessile e della modaCrowsourcing (anche) per le aziende del settore tessile e della moda
Crowsourcing (anche) per le aziende del settore tessile e della modaPiero Fraternali
 
05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioni05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioniPiero Fraternali
 
Human computation and participatory systems
Human computation and participatory systems Human computation and participatory systems
Human computation and participatory systems Piero Fraternali
 
Better society: Meet us at #ICT2013eu for #trustedsocialmedia http://bit.ly/1...
Better society: Meet us at #ICT2013eu for #trustedsocialmedia http://bit.ly/1...Better society: Meet us at #ICT2013eu for #trustedsocialmedia http://bit.ly/1...
Better society: Meet us at #ICT2013eu for #trustedsocialmedia http://bit.ly/1...Piero Fraternali
 
Human and social computation
Human and social computation Human and social computation
Human and social computation Piero Fraternali
 
Web technologies: Model Driven Engineering
Web technologies: Model Driven EngineeringWeb technologies: Model Driven Engineering
Web technologies: Model Driven EngineeringPiero Fraternali
 
Web technologies: recap on TCP-IP
Web technologies: recap on TCP-IPWeb technologies: recap on TCP-IP
Web technologies: recap on TCP-IPPiero Fraternali
 
Web technologies course, an introduction
Web technologies course, an introductionWeb technologies course, an introduction
Web technologies course, an introductionPiero Fraternali
 
Informatica delle persone: reti sociali, giochi seri e scienza dei cittadini
Informatica delle persone: reti sociali, giochi seri e scienza dei cittadiniInformatica delle persone: reti sociali, giochi seri e scienza dei cittadini
Informatica delle persone: reti sociali, giochi seri e scienza dei cittadiniPiero Fraternali
 

Mais de Piero Fraternali (19)

Multimedia on the mountaintop: presentation at ACM MM2016
Multimedia on the mountaintop: presentation at ACM MM2016Multimedia on the mountaintop: presentation at ACM MM2016
Multimedia on the mountaintop: presentation at ACM MM2016
 
presentation at European Utility Week, Vienna, Nov. 2015
presentation at European Utility Week, Vienna, Nov. 2015presentation at European Utility Week, Vienna, Nov. 2015
presentation at European Utility Week, Vienna, Nov. 2015
 
Fraternali concertation june25bruxelles
Fraternali concertation june25bruxellesFraternali concertation june25bruxelles
Fraternali concertation june25bruxelles
 
Crowsourcing (anche) per le aziende del settore tessile e della moda
Crowsourcing (anche) per le aziende del settore tessile e della modaCrowsourcing (anche) per le aziende del settore tessile e della moda
Crowsourcing (anche) per le aziende del settore tessile e della moda
 
07 2 ricorsione
07 2 ricorsione07 2 ricorsione
07 2 ricorsione
 
05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioni05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioni
 
03 2 arit_bin
03 2 arit_bin03 2 arit_bin
03 2 arit_bin
 
03 1 alg_bool
03 1 alg_bool03 1 alg_bool
03 1 alg_bool
 
02 algo programmi
02 algo programmi02 algo programmi
02 algo programmi
 
Human computation and participatory systems
Human computation and participatory systems Human computation and participatory systems
Human computation and participatory systems
 
Better society: Meet us at #ICT2013eu for #trustedsocialmedia http://bit.ly/1...
Better society: Meet us at #ICT2013eu for #trustedsocialmedia http://bit.ly/1...Better society: Meet us at #ICT2013eu for #trustedsocialmedia http://bit.ly/1...
Better society: Meet us at #ICT2013eu for #trustedsocialmedia http://bit.ly/1...
 
So human presentation
So human presentationSo human presentation
So human presentation
 
Human and social computation
Human and social computation Human and social computation
Human and social computation
 
Web technologies: Model Driven Engineering
Web technologies: Model Driven EngineeringWeb technologies: Model Driven Engineering
Web technologies: Model Driven Engineering
 
Common Gateway Interface
Common Gateway InterfaceCommon Gateway Interface
Common Gateway Interface
 
Web technologies: HTTP
Web technologies: HTTPWeb technologies: HTTP
Web technologies: HTTP
 
Web technologies: recap on TCP-IP
Web technologies: recap on TCP-IPWeb technologies: recap on TCP-IP
Web technologies: recap on TCP-IP
 
Web technologies course, an introduction
Web technologies course, an introductionWeb technologies course, an introduction
Web technologies course, an introduction
 
Informatica delle persone: reti sociali, giochi seri e scienza dei cittadini
Informatica delle persone: reti sociali, giochi seri e scienza dei cittadiniInformatica delle persone: reti sociali, giochi seri e scienza dei cittadini
Informatica delle persone: reti sociali, giochi seri e scienza dei cittadini
 

06 3 struct

  • 1. Fondamenti di informatica Strutture dati composte: struct
  • 2. Il sistema dei tipi del C++ • Uno degli obiettivi principali del C++ è permettere al programmatore di creare tipi personalizzati e usarli come se fossero offerti dal linguaggio • Il sistema dei tipi del C++ comprende – Tipi predefiniti (predefined) – Tipi composti (composite) – Tipi definiti dall’utente (user defined) – Tipi classe (class types)
  • 3. I costruttori di tipi • A partire dai tipi predefiniti si possono creare nuovi tipi, che aggiungono proprietà speciali ai tipi predefiniti – Const (visto) – Reference (visto) – Pointer (ancora da vedere) • A questi si aggiungono costruttori di tipi definiti interamente dall'utente – struct (eredità del C, poco usato in C++) – Class
  • 4. Tipi composti aggregati • Variabili omogenee: sequenza finita / indefinita – ARRAY (sequenza predefinita), VECTOR (sequenza indefinita) • Variabili disomogenee: tipi classe – STRUCT (record) – CLASS (oggetti con dati e funzioni dichiarati e definiti assieme) 4
  • 5. Esigenza • Nella progettazione dei dati, spesso capita di prevedere informazioni connesse in gruppi logici: – Parole in un testo e loro frequenza – Indirizzo, composto da via n. civico città – Dati dell'utente: username, password, email • In questi casi, piuttosto che variabili separate, si usa un costruttore di tipo che definisce un gruppo logico di variabili correlate, detto "record" (ovvero: scheda, registrazione)
  • 6. Il costruttore di tipo record • Record (o struct): memorizzano aggregazioni di dati di diversa natura • Ciascun dato è chiamato “campo” o dato membro (member): struct { string via; int numero; int CAP; string citta; } indirizzo; // // // // 1o 2o 3o 4o campo: campo: campo: campo: stringa intero intero stringa nome della variabile record • indirizzo è un record formato da quattro campi di vario tipo
  • 7. Uso dei record • Il record (o struct) è una sorta di “contenitore” di campi di tipo disomogeneo • Il record raggruppa dati più semplici – Ne rende più ordinata la gestione, evitando confusioni • I campi del record non sono accessibili individualmente – L'accesso avviene mediante il record a cui appartengono – Si utilizza l'operatore . come metodo di accesso ai campi • indirizzo.citta – Con gli iterator si usa l'operatore -> : iter->member – I nomi dei campi sono identificatori “locali” all’interno di una variabile di tipo record, da usarsi come suffissi
  • 8. Operazioni su campi dei record • Le operazioni che sono definite sono le stesse applicabili sui tipi dei campi • Assegnamento ai campi del record: indirizzo.via = "Ponzio"; indirizzo.numero  34; indirizzo.CAP  20133; indirizzo.citta = "Milano"; • Accesso (leggere, scrivere…): – cout << indirizzo.numero; – cin >> indirizzo.CAP;
  • 9. Assegnamento di record • Dati due record identici (cioè dichiarati insieme) è lecito assegnare globalmente il primo al secondo struct  … / campi /  rec1, rec2; • è lecito scrivere: rec2  rec1; • tutti i campi di rec1 sono ordinatamente copiati nei campi corrispondenti di rec2. • Se i due record sono diversi (anche solo per l’ordine dei campi) l’assegnamento è privo di senso ! • Memento: l’assegnamento “diretto” tra array è vietato – deve avvenire elemento per elemento • Ma…. Diventa possibile tra membri array di una struct!
  • 10. Assegnamento di array nelle struct int main() { struct { char via[20]; int numero; int CAP; string citta; } indirizzo1, indirizzo2; strcpy(indirizzo1.via, "Ponzio"); // non si può usare assegnamento indirizzo1.numero = 35; indirizzo1.CAP = 20133; indirizzo1.citta = "Milano"; cout << "RECORD 1: " << endl << indirizzo1.via << endl << indirizzo1.numero << endl << indirizzo1.CAP << endl << indirizzo1.citta << endl; indirizzo2 = indirizzo1; // copia anche l'array!! cout << "RECORD 2: " << endl << indirizzo2.via << endl << indirizzo2.numero << endl << indirizzo2.CAP << endl << indirizzo2.citta << endl; return 0; }
  • 11. Check this out • http://stackoverflow.com/questions/8939090/ why-array-assignment-operation-doesnt-existbut-structure-assignment-does-in-c
  • 12. Tipi definiti dall’utente Tipi di dato astratti (TDA) 12
  • 13. Tipi definiti dall'utente • I record sono un caso esemplare in cui un tipo ha una struttura definita dal programmatore • Tuttavia è un tipo "anonimo" • C e C++ forniscono un modo per dare un nome a un tipo • Esempio: • typedef int intero; • intero numero; • è equivalente a: • int numero; • È la definizione di un sinonimo – Il nuovo tipo intero eredita le caratteristiche (valori e operazioni) del tipo di partenza int
  • 14. Costruttore di record (struct) • • • Definizione di un tipo tipo data per le date: typedef struct { int giorno; int mese; int anno; } data; Dichiarazione di variabili di tipo data: data oggi, domani, dopodomani; Altro esempio: typedef struct { char nome[20]; char cognome[20]; data nato_il; char nato_a[15]; char codice_fiscale[16]; int stipendio; } dipendente; dipendente piero;
  • 15. Esempi d'uso • Si possono dichiarare le variabili: dipendente persona1, persona2; • E modificare i dati membro: persona1.stipendio + (persona1.stipendio  10)  100; persona2.stipendio + (persona2.stipendio  10)  100; • Anche innestati: persona2.nato_il.giorno = 15; // NB: accede a campo giorno del campo data di dipendente
  • 16. Progettazione dei dati • Esempio vendite di libri – Si vuole costruire un programma che gestisca le vendite di libri • Ogni libro è caratterizzato da un codice ISBN – Il programma deve gestire per ogni libro il numero totale di copie vendute, il ricavo totale e medio – L'utente inserisce sequenzialmente i dati di vendita per i diversi libri, il programma aggrega i dati per ciascun codice ISBN e stampa il dato aggregato – Deve quindi essere possibile: • Inserire e stampare i dati di un libro • Sommare più dati di vendita relativi allo stesso libro • Stampare i dati di vendita aggregati relativi a un libro
  • 17. Suddivisione del programma • Un file di libreria (Sales_item.h) conterrà la definizione del tipo che rappresenta il dato di vendita: Sales_item • Definiamo ora Sales_item come struct, cioè un tipo definito dall'utente che comprende dati, ma non le operazioni relativi al dato di vendita – Campi: codice ISBN, copie vendute, ricavo • Il programma principale importa e usa Sales_item come se fosse un tipo predefinito – Sales_item item; // dichiara una var. di tipo Sales_item !
  • 18. Sales_item.h #ifndef SALES_DATA_H #define SALES_DATA_H #include <string> using namespace std; struct Sales_data { string bookNo; unsigned units_sold = 0; double revenue = 0.0; }; #endif
  • 19. Programma principale #include <iostream> #include <string> #include "Sales_data.h" using namespace std; int main() { Sales_data data1, data2; // code to read into data1 and data2 double price = 0; // price per book, used to calculate total revenue // read the first transactions: ISBN, number of books sold, price per book cin >> data1.bookNo >> data1.units_sold >> price; // calculate total revenue from price and units_sold data1.revenue = data1.units_sold * price; // read the second transaction cin >> data2.bookNo >> data2.units_sold >> price; data2.revenue = data2.units_sold * price; // check whether data1 and data2 have the same ISBN, if so print the sum of data1 and data2 if (data1.bookNo == data2.bookNo) { unsigned totalCnt = data1.units_sold + data2.units_sold; double totalRevenue = data1.revenue + data2.revenue; // print: ISBN, total sold, total revenue, average price per book cout << data1.bookNo << " " << totalCnt << " " << totalRevenue << " "; if (totalCnt != 0) cout << totalRevenue/totalCnt << endl; else cout << "(no sales)" << endl; } else { } } return 0; // indicate success cerr << "Data must refer to the same ISBN" return -1; // indicate failure << endl; // transactions not for same ISBN