Rappresentazione in C++ di tipi di dato: le classi. + insieme di operatori. 13 Maggio 1975, 23/12/01, ,

Documenti analoghi
Laboratorio di programmazione

OOP in C++ ha membro (dati membro) e funzioni membro In Java i dati membro sono chiamati attributi e le funzioni membro metodi

C++ funzioni Alberto Ferrari. Alberto Ferrari Programmazione di applicazioni SW

nome (lista_parametri) Funzioni funzioni predefinite: sqrt(x) log(x) usare queste funzioni significa: specificare il valore degli argomenti

Classe Squadra. #include <iostream> using namespace std;

Programmazione ad oggetti

Tipi strutturati - struct

Esercitazioni sulle classi

Le Funzioni in C. Fondamenti di Informatica Anno Accademico 2010/2011. Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia

Modularizzazione del software

Proprietà delle Classi e degli Oggetti in Java

Università di Roma Tor Vergata L12-1

Proprietà delle Classi e degli Oggetti in Java

Oggetti. Definizioni di Classi II

Esercitazione n 2. Obiettivi

Dichiarazioni e tipi predefiniti nel linguaggio C

Il linguaggio C. Puntatori e dintorni

Strutture come parametri di funzioni

Programmazione Procedurale in Linguaggio C++

Definizione di classi

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

I membri e le restrizioni di accesso

Strategie di programmazione

I vettori in C. Vettori. Definizione di vettori in C. int dato[10] ; int. Numero di elementi. Tipo di dato base. Nome del vettore.

1) definizione di una rappresentazione 2) specificazione di un algoritmo (dipendente dalla rappresentazione) 3) traduzione in un linguaggio

Fondamenti di Informatica

Autore: Prof. Agostino Sorbara ITIS "M. M. Milano" Polistena (RC)

Programmazione Procedurale in Linguaggio C++

I L IN I GU G AGG G I G O

Tipi user-defined. parte dichiarativa globale:

Tipi riferimento e stringhe

Perché il linguaggio C?

parte dichiarativa globale: dichiarazioni di costanti dichiarazioni di tipi dichiarazioni di variabili prototipi di funzioni/procedure

File: /home/peppino/area_lavori/ese enti/oggetti/timbro_classe.cpp Pagina 1 di 5

14 - Metodi e Costruttori

Variabili e Parametri. Scope, Lifetime Inizializzazione

Variabili e Parametri

ciclo di vita della soluzione (informatica) di un problema

File: /home/peppino/area_lavori/ese orgenti/oggetti/ohm_classe.cpp Pagina 1 di 5

Esercitazione n 2. Obiettivi

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Esercitazione n 2. Obiettivi

Gestire le situazioni di errore

Perché il linguaggio C?

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

La programmazione ad oggetti (OOP)

LA CLASSE Data ESERCIZIO. Definiamo la classe Data che incapsuli giorno, mese e anno (tutti int)

Array in Fortran 90. Ing. Luca De Santis. Anno accademico 2006/2007. DIS - Dipartimento di informatica e sistemistica

parte dichiarativa globale: dichiarazioni di costanti dichiarazioni di tipi dichiarazioni di variabili prototipi di funzioni/procedure

Tipi di dato personalizzati Array di struct. Tipi di dato utente. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Corso di Fondamenti di Programmazione canale E-O. Strutture. Strutture. Definizione di strutture (2) Definizione di strutture (1)

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Istruzione if/else. Espressioni booleane

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Il linguaggio C. Istruzioni, funzioni, dati strutturati

Tipi e Valori. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Tipi e Valori. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Lezione 4. Costruttori

Primo programma in C

Laboratorio di Informatica I

Variabili e Funzioni. Informatica 1 / 19

Tipi di Dati Stutturati

Informatica (A-K) 12. Linguaggio C -3

Introduzione al linguaggio C Puntatori

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Oggetti. Oggetti e occultamento delle informazioni. Definire oggetti. Oggetti. Definire oggetti la sintassi. Convenzione sugli identificatori

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Corso di Informatica

Programmazione con Java

Dichiarazione di una classe. Dichiarazione ereditarietà

Tipi di Dati Astratti

Un tipo di dato astratto (ADT) definisce una categoria concettuale con le sue proprietà: una definizione di tipo

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Funzioni, Stack e Visibilità delle Variabili in C

public class Counter2 extends Counter { public void dec() { val--; }

Kernel and User space

Fondamenti di Informatica II 3. Funzioni in C++ (parte 1)

GESTIONE DEGLI ERRORI

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Università degli Studi di Cassino Corso di Fondamenti di Informatica Visibilità e tempo di vita delle variabili

Definizione di classi. Walter Didimo

Programmazione Procedurale in Linguaggio C++

Fondamenti di Informatica

Capitolo 10 - Strutture

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

Lab 9 Strutture e programmi su più file

Esempio: Costruttori ed ereditarietà

Tipi definiti dall'utente

Fondamenti di Programmazione Prof.ssa Elisa Tiezzi. Programmazione orientata a oggetti

Linguaggio C - sezione dichiarativa: costanti e variabili

Transcript:

Rappresentazione in C++ di tipi di dato: le classi tipo di dato = insieme di valori + insieme di operatori esempio: il tipo di dato data : ins. di valori da rappresentare: 13 Maggio 1975, 23/12/01, 7-5-2002, fi scelta di una rappresentazione fl triple di numeri interi gg mm aaaa fl insieme di valori del tipo di dato data : D = { [gg mm aaaa] 1 gg 31, 1 mm 12 1 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

quali operatori ( primitivi ) da applicare a un elemento x ΠD? scelta plausibile (e minimale ): un operatore per conoscere il valore di x un operatore per modificare il valore di x rappresentazione C++ (usando gli strumenti che conosciamo): struct data {int giorno, mese, anno;; void mostradata(data); void modificadata(data&, int, int, int); definizione delle operazioni: void mostradata(data x) {cout<<x.giorno<<'/'<<x.mese<<'/'<<x.anno<<endl; void modificadata(data& x, int g, int m, int a) {if (g<1 g>31 m<1 m>12) cout<<"valori scorretti per il tipo data\n"; else { x.giorno=g; x.mese=m; x.anno=a; 2 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

esempio: #include <iostream> #include "data.h" Æ file che contiene le definizioni C++ del tipo di dato 'data' {data data1, data2; modificadata(data1, 3, 5, 2002); mostradata(data1); modificadata(data2, 27, 31, 2002); modificadata(data2, 27, 1, 2002); mostradata(data2); uscita prodotta: 3/5/2002 valori scorretti per il tipo data 27/1/2002 3 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

Problema: come si fa a garantire che le modifiche ad elementi del tipo di dato data siano vincolate ad essere fatte solo tramite la funzione da noi definita modificadata()? #include <iostream> #include "data.h" {data data1, data2; modificadata(data1, 3, 5, 2002); mostradata(data1); modificadata(data2, 27, 1, 2002); data2.mese = 31; mostradata(data2); uscita prodotta: 3/5/2002 27/31/2002 fi data non valida!! usando gli strumenti che conosciamo non c è modo di introdurre questo vincolo fl possibili problemi di inconsistenza, difficoltà nel riuso, 4 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

classi C++: meccanismo per: legare insieme valori e operatori obbligare a usare gli operatori per accedere/modificare i valori sintassi ( usuale ): generalizzazione della sintassi di struct denominazione di tipo (si può usare per dichiarare variabili, funzioni, di quel tipo) class nomeclasse { public: dichiarazione funzioni membro dichiarazione costruttori private: dichiarazione dati [dichiarazione funzioni ausiliarie] ; funzioni (Æ operatori!) e dati sono legati insieme solo i nomi definiti nella parte public sono visibili (Æ utilizzabili!) fuori dalla definizione della classe 5 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

esempio: class data {public: void mostradata() {cout<<giorno<<'/'<<mese<<'/'<<anno<<endl; operatori void modificadata(int g,int m, int a) {if (g<1 g>31 m<1 m>12) cout<<"valori scorretti per data\n"; else { giorno=g; mese=m; anno=a; data() { giorno=1; mese=1; anno=0; private: int giorno, mese, anno; ; costruttore (deve avere nome identico a quello della classe) rappresentazione del tipo (qui, una tripla di interi) nota: si possono definire più costruttori, differenziati tra loro dal numero e/o tipo dei parametri 6 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

dichiarazione di variabili di tipo classe: nomeclasse nomevar; provoca la creazione di una variabile nomevar di tipo nomeclasse ( istanza della classe) con i suoi campi inizializzati in accordo al costruttore specificato nella definizione della classe 1 giorno data d1; fi d1 : 1 mese 0 anno uso di variabili di tipo classe: tramite le funzioni definite nella parte public, usando la notazione: nomevar.nomefun(parametri) applica la funzione nomefun() definita nella parte public della classe alla variabile della stessa classe di nome nomevar data d1; d1.modificadata(3,7,2001); 7 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

funzioni definite nella classe vedono tutti i nomi definiti nella stessa classe void modificadata(int g,int m, int a) {if (g<1 g>31 m<1 m>12) cout<<"valori scorretti per data\n"; else { giorno=g; mese=m; anno=a; fl d1.modificadata(3,7,2001); assegna i valori: 3 7 2001 ai campi: d1.giorno d1.mese d1.anno fuori dalla classe i nomi privati sono inaccessibili!! 8 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

esempio: #include <iostream> #include "data.h" Æ file che contiene la definizione C++ di class data {data data1, data2; data1.modificadata(3, 5, 2002); data1.mostradata(); data2.modificadata(27, 31, 2002); data2.modificadata(27, 1, 2002); data2.mostradata(); uscita prodotta: 3/5/2002 valori scorretti per data 27/1/2002 ================================== #include <iostream> #include "data.h" {data data1, data2; data1.modificadata(3, 5, 2002); data1.mostradata(); data2.modificadata(27, 1, 2002); data2.mese = 31; Æ il compilatore segnala errore data2.mostradata(); messaggio del compilatore g++ (sotto Linux): In function 'int ': 8: member 'mese' is a private member of class 'data' 9 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

accorgimenti per migliorare la leggibilità di una definizione di classe: - inserire nella classe solo la dichiarazione delle funzioni - spostare fuori dalla classe la definizione delle funzioni fl separare la definizione dai dettagli realizzativi class data {public: void mostradata(); void modificadata(int g,int m, int a); data(); private: int giorno, mese, anno; ; void data::mostradata() {cout<<giorno<<'/'<<mese<<'/'<<anno<<endl; void data::modificadata(int g,int m, int a) {if (g<1 g>31 m<1 m>12) cout<<"valori scorretti per data\n"; else { giorno=g; mese=m; anno=a; data::data() { giorno=1; mese=1; anno=0; associa la definizione della funzione alla classe data 10 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

Altro esempio: rappresentazione del tipo di dato tempo (ore e minuti) (nota: versione semplificata del tipo di dato Time (libreria ccc_time.h)) valori da rappresentare: 12:53, 1:07am, 23:12, 15:10, 9.24pm, fl scelta della rappresentazione: l insieme dei valori da rappresentare è T = { o m o Œ N, m Œ N, 0 o 23, 0 m 59 operatori ( primitivi ) da applicare a un elemento t Œ T scelta plausibile : un operatore per conoscere il valore di t.o un operatore per conoscere il valore di t.m un operatore per sommare a t una certa quantità di minuti un operatore per calcolare la distanza (in minuti) tra t e un altro valore t' Œ T 11 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

rappresentazione C++ : #include <cmath> class tempo {public: tempo(int o,int m); costruttore con param. int dammiore(); int dammimin(); void sommamin(int m); int minutida(tempo t); private: int ore, minuti; ; tempo::tempo(int o,int m) { ore=o; minuti=m; int tempo::dammiore() {return ore ; int tempo::dammimin() {return minuti ; void tempo::sommamin(int m) { esercizio int tempo:: minutida(tempo t) {int m; m = 60*static_cast<int>(fabs(ore-t.ore)) + static_cast<int>(fabs(minuti-t.minuti)); return m; 12 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

#include <iostream> #include "tempo.h" {tempo t1; int min; min=t1.dammimin(); cout<<min<<endl; file che contiene la definizione C++ di class tempo messaggio di errore del compilatore g++ sotto Linux: p.cc: In function 'int ': p.cc:4: no matching function for call to 'tempo::tempo ()' per correggere questo errore potremmo definire un costruttore aggiuntivo senza parametri:... class tempo {public: tempo(); costruttore senza parametri tempo(int o,int m); costruttore con param.... private: int ore, minuti; ; tempo::tempo() { ore=0; minuti=0; inizializzazione di default tempo::tempo(int o,int m) { ore=o; minuti=m; inizializzazione parametrica... 13 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

#include <iostream> #include "tempo.h" {tempo t1(10,47); int min; t1.minuti=t1.minuti+3; min=t1.dammimin(); cout<<min<<endl; messaggio di errore del compilatore g++ sotto Linux: p.cc: In function 'int ': p.cc:6: member 'minuti' is a private member of class 'tempo' p.cc:6: member 'minuti' is a private member of class 'tempo' versione corretta: #include <iostream.h> #include "tempo.h" {tempo t1(10,47); int min; t1.sommamin(3); min=t1.dammimin(); cout<<min<<endl; risultato prodotto: 50 14 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

#include <iostream> #include "tempo.h" {tempo t1(10,23),t2(8,10); int min; min=minutida(t2); cout<<min<<endl; messaggio di errore del compilatore g++ sotto Linux: p.cc: In function 'int ': p.cc:7: warning: implicit declaration of function 'int minutida(...)' /tmp/cc7jbdwh.o: In function 'main': /tmp/cc7jbdwh.o(.text+0xeb): undefined reference to 'minutida' collect2: ld returned 1 exit status versione corretta: #include <iostream> #include "tempo.h" {tempo t1(10,23),t2(8,10); int min; min=t1.minutida(t2); cout<<min<<endl; risultato prodotto: 133 15 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

calcolare la distanza in secondi tra due variabili t1 e t2 di tipo tempo nota: non esiste una operazione primitiva per fare questo fl realizzare l operazione a partire dalle operazioni primitive int secondifra(tempo t1, tempo t2) {return 60*t1.minutiDa(t2) ; tempo t1(9,54),t2(18,23); int min, sec; min = t1.minutida(t2); cout<<min<<endl; sec = secondifra(t1, t2); cout<<sec<<endl; risultato prodotto: 571 34260 16 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi

esercizio: un appuntamento è costituito da una data, un orario, un luogo usando la classe tempo per rappresentare la componente orario di un appuntamento, realizzare in C++ la soluzione del seguente problema: dati: un insieme di N appuntamenti, una data d, un orario o, e un valore m, spostare in avanti di m minuti tutti gli appuntamenti con data = d, e orario o 17 L.classi Fondamenti di Informatica 1 - Vincenzo Grassi