Fondamenti di Programmazione Ingegneria dell Automazione Industriale Ingegneria Elettronica e delle Comunicazioni

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Fondamenti di Programmazione Ingegneria dell Automazione Industriale Ingegneria Elettronica e delle Comunicazioni"

Transcript

1 Fondamenti di Programmazione Ingegneria dell Automazione Industriale Ingegneria Elettronica e delle Comunicazioni Alessandro Saetti & Marco Sechi ( saetti,marco.sechi@ing.unibs.it) Università degli Studi di Brescia 1

2 Esercizi sulle classi (1º parte) 1. Definire la classe delle date del calendario con Un costruttore che inizializzi la data al capodanno del 2000; Un metodo che inizializzi la data con tre interi acquisiti da tastiera; Un metodo che visualizzi la data; Un metodo che faccia avanzare la data di una giornata. Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. 2

3 Esercizi sulle classi (1º parte) 2. Definire la classe dei numeri complessi con Un costruttore che inizializzi il numero complesso rappresentato con dati acquisiti da tastiera; Un costruttore che inizializzi il numero complesso con una data parte reale ed una data parte immaginaria; Un metodo che produca un numero complesso ottenuto incrementando un dato numero complesso con il numero complesso della classe; Un metodo che visualizzi il numero complesso nella forma x + yi ( x -yi se y è negativo). Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi un numero complesso con dati acquisiti da tastiera, incrementi il numero complesso acquisito con il numero complesso 3.5 4i, ed infine visualizzi il numero complesso risultante. 3

4 Esercizio 1 Definire la classe delle date del calendario con Un costruttore che inizializzi la data al capodanno del 2000; Un metodo che inizializzi la data con tre interi acquisiti da tastiera; Un metodo che visualizzi la data; Un metodo che faccia avanzare la data di una giornata. Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. 4

5 Esercizi sulle classi (1 parte) Definire la classe delle date del calendario con Un costruttore che inizializzi la data al capodanno del 2000; Un metodo che inizializzi la data con tre interi acquisiti da tastiera; Un metodo che visualizzi la data; Un metodo che faccia avanzare la data di una giornata. Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. Esercizio 1 Impostiamo la solita struttura iniziale di un programma C, aggiungendo eventuali commenti /************************************************************************** * Nome: casa1-data.c * * Autore: Alessandro Saetti * * Data: 6/4/10 * ************************************************************************* #include <iostream> #include <stdlib.h> /* Nome: main * Scopo: Gestione delle date * Output: 0 se il programma termina correttamente int main() // Definizione classe // Utilizzo della classe system("pause"); return 0; Per la gestione dell I/O utilizzeremo gli oggetti globali di I/O cin e cout abbinati agli operatori di flusso << e >> per cui Includiamo <iostream> 5

6 Esercizi sulle classi (1 parte) Definire la classe delle date del calendario con Un costruttore che inizializzi la data al capodanno del 2000; Un metodo che inizializzi la data con tre interi acquisiti da tastiera; Un metodo che visualizzi la data; Un metodo che faccia avanzare la data di una giornata. Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. Ricordiamoci che per il costruttore non si deve dichiarare alcun valore di ritorno Iniziamo ad impostare la definizione per la classe Data. class Data public: Data() // Costruttore di default private: int aa, mm, gg; // Dati membro o attributi ; Esercizio 1 Implementiamo il costruttore di default (esternamente alla classe) /* Nome: Data::Data * Scopo: Costruttore di default della classe Data * Output: - Data::Data() gg = mm = 1; aa = 2000; // l operatore binario di risoluzione di visibilità // :: qualifica l appartenenza alla classe 6

7 Esercizi sulle classi (1 parte) Esercizio 1 Definire la classe delle date del calendario con Un costruttore che inizializzi la data al capodanno del 2000; Un metodo che inizializzi la data con tre interi acquisiti da tastiera; Un metodo che visualizzi la data; Un metodo che faccia avanzare la data di una giornata. Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. Implementiamo, all esterno della definizione della classe, la funzione membro acquisisci() #include <iostream> using namespace std; Aggiungiamo alla definizione della classe la dichiarazione della funzionemembro acquisisci() void Data::acquisisci() cout << "Inserisci giorno: "; cin >> gg; cout << "Inserisci mese: "; cin >> mm; cout << "Inserisci anno: "; cin >> aa; Ricordiamoci di inserire il tipo restituito dalla funzionemembro della classe (anche se void) class Data public: Data() void acquisisci(); private: int aa, mm, gg; ; Inseriamo l'istruzione "using namespace std" ("using directive"). Con essa si rendono accessibili tutti i membri del namespace std senza doverli qualificare ad ogni chiamata mediante l'operatore di risoluzione dello scope ::. Pertanto gli oggetti globali di I/O std::cin e std::cout potranno essere richiamati semplicemente con cin e cout. Per la gestione dell I/O utilizziamo gli oggetti globali di I/O cin e cout abbinati agli operatori di flusso << e >>. 7

8 Esercizi sulle classi (1 parte) Esercizio 1 Definire la classe delle date del calendario con Un costruttore che inizializzi la data al capodanno del 2000; Un metodo che inizializzi la data con tre interi acquisiti da tastiera; Un metodo che visualizzi la data; Un metodo che faccia avanzare la data di una giornata. Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. Implementiamo, esternamente alla classe, la funzione membro stampa() che mostra a video la data /* Nome: Data::stampa * Scopo: Stampa la data * Output: - void Data::stampa() cout << gg << "/" << mm << "/" << aa << endl; Aggiungiamo alla definizione della classe la dichiarazione della funzionemembro stampa() ricordandoci di aggiungere il tipo restituito class Data public: Data() void acquisisci(); void stampa(); private: int aa, mm, gg; ; 8

9 Esercizi sulle classi (1 parte) Prima di proseguire possiamo testare il programma che abbiamo implementato fino a questo punto. #include <iostream> using namespace std; class Data public: Data(); void acquisisci(); void avanza(); void stampa(); private: int aa, mm, gg; ; Data::Data() aa=2000; gg=mm=1; void Data::Acquisisci() cout << "Inserisci giorno: "; cin >> gg; cout << "Inserisci mese: "; cin >> mm; cout << "Inserisci anno: "; cin >> aa; Esercizio 1 void Data::Stampa() cout << gg << "/" << mm << "/ << aa << endl; Inventiamoci quindi un main() che ci consenta di testare tutte le funzionalità fino a questo punto implementate int main() Data d; d.stampa(); d.acquisisci(); d.stampa(); 9

10 Esercizi sulle classi (1 parte) Esercizio 1 Definire la classe delle date del calendario con Un costruttore che inizializzi la data al capodanno del 2000; Un metodo che inizializzi la data con tre interi acquisiti da tastiera; Un metodo che visualizzi la data; Un metodo che faccia avanzare la data di una giornata. Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. void Data::Avanza() gg++; // incremento il giorno // CORREGGO SE GG NON E SENSATO // 1) Calcolo l ultimo giorno // del mese indicato in mm // 2) se gg è maggiore dell ultimo // giorno del mese pongo gg = 1 // ed incremento mm di uno Per passare al giorno successivo incremento la variabile gg di 1... e poi procedo, se necessario, con opportune correzioni (Normalizzazione). // 3) se mm>12 incremento l anno // e pongo mm=1 Per determinare l ultimo giorno di ogni mese devo disporre di un elenco contenente tale valore distinto per mese. Il seguente array potrebbe essere adatto ai nostri scopi: int v[12] = 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; Occorre però tener conto che febbraio, negli anni bisestili, ha 29 giorni. Un anno è bisesto quando è multiplo di 400 oppure se è divisibile per 4 ma non per 100. La condizione sottostante consente quindi di valutare se un anno aa è bisestile o meno: ( ((aa % 400)==0) ( ((aa % 4)==0) && ((aa % 100)!=0) ) ) 10

11 Esercizi sulle classi (1 parte) Per determinare se è un anno bisestile definiamo la funzione membro privata sottostante: #define TRUE 1 #define FALSE 0... /* Nome: Data::bisestile * Scopo: Determina se l'anno della data e' bisestile * Output: TRUE, se l'anno e' bisestile * FALSE, altrimenti int Data::bisestile() if (aa % 4 == 0 && aa % 100!= 0 aa % 400 == 0) return TRUE; return FALSE; Mentre per determinare l ultimo giorno del mese definiamo questa funzione membro privata: /* Nome: Data::giorni * Scopo: Restituisce il numero di giorni in un mese * Input: int mese: il mese da esaminare * Output: il numero di giorni di mese int Data::giorni(int mese) int v[12] = 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; if (mese == 2 && bisestile()) return 29; else return v[mese-1]; Inseriamo le due #define TRUE e FALSE per rendere più leggibile il codice della funzionemembro bisestile() void Data::Avanza() gg++; // 1) Calcolo l ultimo giorno // del mese indicato in mm // 2)... // 3)... Esercizio 1 Se mese==2 ed aa è bisestile allora i giorni sono 29 altrimenti sono v[mese 1] 11

12 Esercizi sulle classi (1 parte) Esercizio 1 Continuiamo con l implementazione della funzione membro avanza() void Data::Avanza() gg++; // incremento il giorno // 1) Calcolo il nr di giorni // del mese indicato in mm if (gg > giorni(mm)) gg = 1; mm++; // 2) se gg è maggiore dell ultimo // giorno del mese pongo gg = 1 // ed incremento mm di uno // 3) se mm>12 incremento l anno // e pongo mm=1 if (mm > 12) mm = 1; aa++; Aggiorniamo la definizione della classe Data: le due funzioni membro bisestile() e giorni() sono destinate ad uso interno per la classe per cui le aggiungiamo alla sezione private:. La funzione membro avanza(), che deve essere usata nel main(), verrà posta nella sezione public: class Data public: Data(); void acquisisci(); void avanza(); void stampa(); private: int aa, mm, gg; int bisestile(); int giorni (); ; 12

13 Esercizi sulle classi (1 parte) Esercizio 1 Possiamo inserire le istruzioni utilizzate per la normalizzazione della variabile gg all interno di una funzione membro privata che chiameremo normalizza(): /* Nome: Data::normalizza * Scopo: Normalizza la data * Output: - * Note: Suppone che i giorni della data eccedano al * piu' di una unita' il numero di giorni possibili void Data::normalizza() if (gg > giorni(mm)) gg = 1; mm++; if (mm > 12) mm = 1; aa++; Completiamo la definizione della classe Data inserendo nella sezione private: la dichiarazione della funzione membro normalizza(): Mentre l implementazione della funzionemembro avanza() che utilizza la nuova funzione membro normalizza() diventa: /* Nome: Data::avanza * Scopo: Incrementa la data * corrente di un giorno * Output: - void Data::avanza() gg++; normalizza(); class Data public: Data(); void acquisisci(); void avanza(); void stampa(); private: int aa, mm, gg; bool bisestile(); int giorni (); void normalizza(); ; 13

14 Esercizi sulle classi (1 parte) Esercizio 1 Definire la classe delle date del calendario con Un costruttore che inizializzi la data al capodanno del 2000; Un metodo che inizializzi la data con tre interi acquisiti da tastiera; Un metodo che visualizzi la data; Un metodo che faccia avanzare la data di una giornata. Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi la data con tre interi acquisiti da tastiera, faccia avanzare la data di 15 giorni ed infine visualizzi la data risultante. Sfruttando la classe Data e le sue funzioni membro possiamo ora implementare il nostro main() int main() Data oggi; int i; oggi.acquisisci(); for (i = 0; i < 15; i++) oggi.avanza(); cout << "Data dopo 15 giorni: "; oggi.stampa(); Acquisisco una data Avanzo di 15 giorni tramite un ciclo for Stampo la data system("pause"); return 0; 14

15 Esercizi sull uso delle classi (1 parte) Soluzione completa /************************************************************************** * Nome: casa1-data.c * * Autore: Alessandro Saetti * * Data: 6/4/10 * ************************************************************************* #include <iostream> #include <stdlib.h> #define TRUE 1 #define FALSE 0 using namespace std; class Data public: Data(); void acquisisci(); void stampa(); void avanza(); private: int gg, mm, aa; int bisestile(); int giorni(int mese); void normalizza(); ; Esercizio 1 15

16 Esercizi sull uso delle classi (1 parte) Esercizio 1.. soluzione completa /* Nome: Data::Data * Scopo: Costruttore di default della classe Data * Output: - Data::Data() gg = mm = 1; aa = 2000; /* Nome: Data::acqusisci * Scopo: Inizializzazione della data con interi acquisiti da tastiera * Output: - void Data::acquisisci() cout << "Inserisci giorno: "; cin >> gg; cout << "Inserisci mese: "; cin >> mm; cout << "Inserisci anno: "; cin >> aa; 16

17 Esercizi sull uso delle classi (1 parte).. soluzione completa /* Nome: Data::stampa * Scopo: Stampa la data * Output: - void Data::stampa() cout << gg << "/" << mm << "/" << aa << endl; /* Nome: Data::avanza * Scopo: Incrementa la data corrente di un giorno * Output: - void Data::avanza() gg++; normalizza(); /* Nome: Data::bisestile * Scopo: Determina se l'anno della data e' bisestile * Output: TRUE, se l'anno e' bisestile * FALSE, altrimenti Esercizio 1 17

18 Esercizi sull uso delle classi (1 parte).. soluzione completa int Data::bisestile() if (aa % 4 == 0 && aa % 100!= 0 aa % 400 == 0) return TRUE; return FALSE; /* Nome: Data::giorni * Scopo: Restituisce il numero di giorni in un mese * Input: int mese: il mese da esaminare * Output: il numero di giorni di mese int Data::giorni(int mese) int v[12] = 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; if (mese == 2 && bisestile()) return 29; else return v[mese-1]; /* Nome: Data::normalizza * Scopo: Normalizza la data * Output: - * Note: Suppone che i giorni della data eccedano al piu' di * una unita' il numero di giorni possibili Esercizio 1 18

19 Esercizi sull uso delle classi (1 parte).. soluzione completa. void Data::normalizza() if (gg > giorni(mm)) gg = 1; mm++; if (mm > 12) mm = 1; aa++; /* Nome: main * Scopo: Gestione delle date * Output: 0 se il programma * termina correttamente Esercizio 1 int main() Data oggi; int i; oggi.acquisisci(); for (i = 0; i < 15; i++) oggi.avanza(); cout << "Data dopo 15 giorni: "; oggi.stampa(); system("pause"); return 0; 19

20 Esercizio 2 Definire la classe dei numeri complessi con Un costruttore che inizializzi il numero complesso rappresentato con dati acquisiti da tastiera; Un costruttore che inizializzi il numero complesso con una data parte reale ed una data parte immaginaria; Un metodo che produca un numero complesso ottenuto incrementando un dato numero complesso con il numero complesso della classe; Un metodo che visualizzi il numero complesso nella forma x + yi ( x - yi se y è negativo). Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi un numero complesso con dati acquisiti da tastiera, incrementi il numero complesso acquisito con il numero complesso 3.5 4i, ed infine visualizzi il numero complesso risultante. 20

21 Esercizi sulle classi (1 parte) Esercizio 2 Definire la classe dei numeri complessi con Un costruttore che inizializzi il numero complesso rappresentato con dati acquisiti da tastiera; Un costruttore che inizializzi il numero complesso con una data parte reale ed una data parte immaginaria; Un metodo che produca un numeri complesso ottenuto incrementando un dato numero complesso con il numero complesso della classe; Un metodo che visualizzi il numero complesso nella forma x + yi ( x yi se y è negativo). Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi un numero complesso con dati acquisiti da tastiera, incrementi il numero complesso acquisito con il numero complesso 3.5 4i, ed infine visualizzi il numero complesso risultante. Impostiamo la solita struttura iniziale di un programma C, aggiungendo eventuali commenti /************************************************************************** * Nome: lab1-complesso.c * * Autore: Alessandro Saetti * * Data: 6/4/10 * ************************************************************************* #include <iostream> #include <stdlib.h> // Definizione classe /* Nome: main * Scopo: Gestione dei numeri complessi * Output: 0 se il programma termina correttamente int main() system("pause"); // Utilizzo della classe return 0; 21

22 Esercizi sulle classi (1 parte) Esercizio 2 Definire la classe dei numeri complessi con Un costruttore che inizializzi il numero complesso rappresentato con dati acquisiti da tastiera; Un costruttore che inizializzi il numero complesso con una data parte reale ed una data parte immaginaria; Un metodo che produca un numeri complesso ottenuto incrementando un dato numero complesso con il numero complesso della classe; Un metodo che visualizzi il numero complesso nella forma x + yi ( x yi se y è negativo). Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi un numero complesso con dati acquisiti da tastiera, incrementi il numero complesso acquisito con il numero complesso 3.5 4i, ed infine visualizzi il numero complesso risultante. Implementiamo il costruttore di default (quello senza argomenti) /* Nome: Complesso * Scopo: Inizializza il numero complesso con numeri acquisiti da tastiera * Output: - Complesso::Complesso() cout << "Parte reale: "; cin >> reale; cout << "Parte immaginaria: "; cin >> immag;... e il secondo costruttore, in overloading, distinto per la differente lista di argomenti /* Nome: Complesso::Complesso * Scopo: Costruttore alternativo della * classe complesso * Input: float r: la parte reale del * numero complesso * float i: la parte immaginaria * del numero complesso * Output: - Complesso::Complesso(float r, float i) reale = r; immag = i; 22

23 Esercizi sulle classi (1 parte) Esercizio 2 Definire la classe dei numeri complessi con Un costruttore che inizializzi il numero complesso rappresentato con dati acquisiti da tastiera; Un costruttore che inizializzi il numero complesso con una data parte reale ed una data parte immaginaria; Un metodo che produca un numeri complesso ottenuto incrementando un dato numero complesso con il numero complesso della classe; Un metodo che visualizzi il numero complesso nella forma x + yi ( x yi se y è negativo). Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi un numero complesso con dati acquisiti da tastiera, incrementi il numero complesso acquisito con il numero complesso 3.5 4i, ed infine visualizzi il numero complesso risultante. Implementiamo la funzione membro somma() che aggiunge al numero complesso della classe il complesso passato come addendo /* Nome: Complesso::somma * Scopo: Somma un numero complesso al numero complesso rappresentato * dall'oggetto * Input: Complesso addendo: il numero complesso da sommare * Output: Restituisce la somma tra i due * numeri complessi Complesso Complesso::somma(Complesso addendo) return Complesso (reale + addendo.reale, immag + addendo.immag); e successivamente quella che stampa a video il numero complesso void Complesso::stampa() if ( (reale!=0) (immag==0) ) cout << reale; if (immag!=0) if ((immag > 0) && (reale!=0)) cout << "+"; if (immag!=1) cout << immag; cout << "i"; 23

24 Esercizi sulle classi (1 parte) class Complesso public: Complesso(); Complesso(float r, float i); Complesso somma(complesso addendo); void stampa(); private: float reale, immag; ; Esercizio 2 Definire la classe dei numeri complessi con Un costruttore che inizializzi il numero complesso rappresentato con dati acquisiti da tastiera; Un costruttore che inizializzi il numero complesso con una data parte reale ed una data parte immaginaria; Un metodo che produca un numeri complesso ottenuto incrementando un dato numero complesso con il numero complesso della classe; Un metodo che visualizzi il numero complesso nella forma x + yi ( x yi se y è negativo). Scrivere un programma C++ che, sfruttando la classe precedentemente definita, inizializzi un numero complesso con dati acquisiti da tastiera, incrementi il numero complesso acquisito con il numero complesso 3.5 4i, ed infine visualizzi il numero complesso risultante. Definiamo quindi la classe Complesso. Ricordiamoci di inserire, per ogni singola funzionemembro, il tipo di dato restituito Sfruttando la classe Complesso e le sue funzioni membro possiamo implementare ora il main(): int main() Complesso n1, n2(3.5, 4); n1.stampa(); n1 = n1.somma(n2); cout << " + "; n2.stampa(); cout << " = "; n1.stampa(); cout << endl; system("pause"); return 0; Definiamo due istanze della classe Complesso: n1 e n2. Stampo n1 e poi lo incremento di n2 Stampo n2 e il nuovo valore di n1 24

25 Esercizi sull uso delle classi (1 parte) Soluzione completa Esercizio 2 /************************************************************************** * Nome: lab1-complesso.c * * Autore: Alessandro Saetti * * Data: 6/4/10 * ************************************************************************* #include <iostream> #include <stdlib.h> using namespace std; class Complesso public: Complesso(float r, float i); Complesso(); Complesso somma(complesso addendo); void stampa(); private: float reale, immag; ; /* Nome: Complesso * Scopo: Inizializza il numero complesso con numeri acquisiti da tastiera * Output: - 25

26 Esercizi sull uso delle classi (1 parte) soluzione completa Esercizio 2 Complesso::Complesso() cout << "Parte reale: "; cin >> reale; cout << "Parte immaginaria: "; cin >> immag; /* Nome: Complesso::Complesso * Scopo: Costruttore alternativo della classe complesso * Input: float r: la parte reale del numero complesso * float i: la parte immaginaria del numero complesso * Output: - Complesso::Complesso(float r, float i) reale = r; immag = i; /* Nome: Complesso::somma * Scopo: Somma un numero complesso al numero complesso rappresentato * dall'oggetto * Input: Complesso addendo: il numero complesso da sommare * Output: Restituisce la somma tra i due numeri complessi 26

27 Esercizi sull uso delle classi (1 parte) soluzione completa Complesso Complesso::somma(Complesso addendo) return Complesso (reale + addendo.reale, immag + addendo.immag); /* Nome: Complesso::stampa * Scopo: Stampa il numero complesso * Output: - void Complesso::stampa() if ( (reale!=0) (immag==0) ) cout << reale; if (immag!=0) if ((immag > 0) && (reale!=0)) cout << "+"; if (immag!=1) cout << immag; cout << "i"; /* Nome: main * Scopo: Gestione dei numeri complessi * Output: 0 se il programma termina correttamente Esercizio 2 27

28 Esercizi sull uso delle classi (1 parte) soluzione completa. int main() Complesso n1, n2(3.5, 4); n1.stampa(); n1 = n1.somma(n2); cout << " + "; n2.stampa(); cout << " = "; n1.stampa(); cout << endl; system("pause"); return 0; Esercizio 2 28

29 Esercizi sulle classi (1 parte) Esercizio 2 Soluzione alternativa Esercizio 2 Soluzione alternativa OVERLOAD DEGLI OPERATORI Vediamo come possiamo implementare la soluzione dell esercizio 2 sfruttando l overload degli operatori. Prima di procedere ricordiamo che una famiglia di funzioni aventi lo stesso nome, ma un diverso set di argomenti (signature), è detta in rapporto di overloading, o sovraccaricata. L overloading, oltre alle funzioni, può essere applicato ai costruttori e agli operatori. Illustriamo ora brevemente la tecnica di overload degli operatori. 29

30 Esercizi sulle classi (1 parte) Overload degli operatori Overload degli operatori In C++ sono definiti dei tipi nativi (esempio: int, char, float, double...) sui quali è possibile applicare un insieme di operazioni convenzionali (rappresentate da simboli come +, *, /, etc ) Non sempre la realtà può essere rappresentata mediante i tipi nativi (si pensi a: numeri complessi, matrici, aggregazioni di dati, etc...) ma occorre fare ricorso a tipi astratti come ad esempio le classi. La semantica delle operazioni applicabili a tali tipi astratti potrebbe differire da quella comunemente associata ai simboli convenzionali per cui nasce la necessità di ridefinirne il significato. Ad esempio il simbolo + può assumere significati diversi a seconda del tipo di dato trattato. Prendiamo ad esempio queste operazioni di addizione : Operazione di somma applicata alle matrici Operazione di somma intesa come unione Il C++ permette di ridefinire il significato di un simbolo convenzionale rendendolo adatto al tipo astratto definito dal programmatore. La tecnica che consente questo è l overload degli operatori L uso del simbolo convenzionale per richiamare le operazioni definite in una classe permette una notazione più compatta che evita chiamate a funzioni specifiche che rendono meno leggibile il codice. 30

31 Esercizi sulle classi (1 parte) Overload degli operatori Overload degli operatori Nell esempio sottostante l immediatezza della formula, quando utilizzo gli operatori + e * rispetto a quella che usa le funzioni somma() e moltiplica(), è evidente : Y=SOMMA(A,MOLTIPLICA(B,C)) Operazione implementata mediante chiamate a funzioni specifiche. Y=A+B*C Operazione espressa con simboli convenzionali Per ottenere l'overload di un operatore bisogna creare una funzione il cui nome deve essere costituito dalla parola chiave operator seguita, con o senza blank, dal simbolo dell'operatore sovraccaricato (ad esempio: operator+). Gli argomenti della funzione corrispondono agli operandi dell operatore. tipo-restituito operatoroperatore (lista-argomenti) La ridefinizione di un operatore deve essere la più vicina possibile al senso che l operatore ha per i tipi nativi. Anche se è possibile definire in modo arbitrario ciò che fa un operatore si crea solo confusione quando questo determina una semantica inaspettata (si immagini una ridefinizione dell operatore + che effettua un operazione simile ad una sottrazione) 31

32 Esercizi sulle classi (1 parte) Overload degli operatori E' possibile effettuare l'overloading degli operatori mediante funzioni membro della classe stessa. In questo caso l oggetto chiamante coincide con il primo operando. Segue che le funzioni membro associate ad un operatore binario abbiano un solo parametro (corrispondente al right operand) mentre quelle relative ad operatori unari nessuno. class MyClass... + : operatore binario MyClass operator+(myclass); MyClass operator++(); // prefissa MyClass operator--(int notused); // suffissa... ; ++, : operatori unari Supponiamo di aver definito la classe Vettore2D e di voler implementare l overload dell operatore * in modo che abbiano significato le due operazioni: Vettore*Scalare overload degli operatori L overloading mediante funzioni membro non è sempre attuabile. Infatti questa modalità implica che l operando a sinistra debba essere un membro della classe ma questo non sempre possibile (si pensi alla somma tra un numero reale e uno immaginario oppure agli operatori di flusso >> e <<). Ecco un esempio: Il prodotto di uno scalare per un vettore Scalare*Vettore main()... C=A+B // oppure C=A.operator+(B); ++C // oppure C.operator++();... C-- // oppure C.operator++(1); C=A+B; è equivalente a C=A.operator+(B); Con l overloading dell operatore la chiamata della funzione "scompare" dal codice del programma e al suo posto viene usata una più "semplice e concisa rappresentazione costituita dal simbolo convenzionale associato all operazione. In entrambi i casi l overload dell operatore deve restituire un oggetto della classe Vettore2D. Nel primo caso il left operand Vettore appartiene alla classe Vettore2D e quindi la funzione operatore può essere funzione membro della classe stessa. Nel secondo caso il primo operando non appartiene alla classe Vettore2D e pertanto la funzione operatore deve essere esterna alla classe Vettore2D : 32

33 Esercizi sulle classi (1 parte) overload degli operatori Implementazione della classe di esempio Vettore2D: Costruttori Vettore2D::Vettore2D() x = 0; y = 0; class Vettore2D public: Vettore2D(); Vettore2D(float r, float i); Vettore2D operator*(float); friend Vettore2D operator*(float,vettore2d);... private: float x, y; ; Ecco un main() di esempio che utilizza la classe Vettore2D int main() Vettore2D P; Vettore2D A(4.2,4); P = A * 3; // oppure A.operator*(3);... // Istruzioni di di output P = 3 * A;... // Istruzioni di di output Vettore2D::Vettore2D(float a, float b) x = a; y = b; Una funzione friend in una classe ha accesso ai membri privati della classe pur non essendone membro Overload degli operatori Overloading mediante una funzione membro Vettore2D Vettore2D::operator*(float b) return Vettore2D (x*b, y*b ); senza friend i membri privati x e y di B non risulterebbero accessibili! Vettore2D operator*(float a, Vettore2D B) return Vettore2D (a*b.x, a*b.y); Overloading mediante una funzione esterna alla classe Esempio di esecuzione 33

34 Esercizi sulle classi (1 parte) Alcune precisazioni utili relative all overload degli operatori Gli operatori per i quali è ammesso l overload sono: Overload degli operatori Gli operatori per i quali non è ammesso l overload sono:. ::.*?: sizeof typeid Non si può ridefinire un operatore che opera su i tipi nativi (int, char, float, ) poiché questi non sono ne classi ne strutture. Quindi la ridefinzione int operator+(int, int); non è permessa Non si può cambiare l arità (numero di operandi) di un operatore e neppure la sua associatività Nonè concesso "inventare" nuovi simboli, ma si devono utilizzare solo quelli degli operatori esistenti. Le regole di precedenza restano legate al simbolo e non dipendono dal nuovo significato che l operatore ha assunto con l overloading (ad esempio l operatore * avrà sempre precedenza sul +). E possibile ridefinire più volte lo stesso operatore e l'ambiguità, come nel caso delle funzioni, viene risolta in base al contesto degli operandi, riconoscendone il tipo e decidendo di conseguenza quale definizione operatore applicare. Un operatore unario può essere ridefinito come funzione membro senza argomenti oppure come funzione non membro con un argomento. Analogamente un operatore binario può essere ridefinito come funzione membro con un argomento oppure come funzione non membro con due argomenti gli argomenti operandi sono generalmente passati by reference e dichiarati const, per maggiore sicurezza (const) e rapidità di esecuzione (passaggio by reference); L overload deve essere esplicito: fare l overload di = non condiziona +=, = o!= 34

35 Esercizi sulle classi (1 parte) Overload degli operatori di flusso Overload degli operatori di flusso << e >> Prima di procedere con l overload degli operatori di flusso analizziamo la gestione dell I/O implementata nella libreria iostream del C++. La libreria iostream del C++ mette a disposizione un insieme di classi, funzioni ed oggetti globali per l'esecuzione delle operazioni di input output. E in questa libreria che sono definiti gli oggetti globali di I/O cout, cerr e cin e che risultano collegati ai dispositivi standard di I/O stdout, stderr e stdin. Per utilizzare questi cout, cerr e cin occorre includere l'header file: <iostream>. Nella libreria iostream le operazioni di I/O vengono gestite in modo indipendente dal dispositivo effettivamente utilizzato e che può essere un device fisico, un file o un area di memoria come ad esempio una stringa. Le istruzioni di I/O vengono strutturate seguendo una particolare astrazione detta stream (flusso) che rappresenta un "qualcosa" da o verso cui "fluisce" una sequenza di bytes. Un oggetto stream può essere visto come un entità" da cui estrarre (input), o inserire (output) dei dati. 35

36 Esercizi sulle classi (1 parte) Overload degli operatori di flusso overload degli operatori di flusso << e >> Gli operatori di scorrimento << e >> sono operatori binari. Producono lo scorrimento a destra / sinistra dei bit del primo operando (left operand) in quantità pari al valore indicato nel right operand. Shift a sinistra Dentro la libreria iostream sono definite due classi globali, ostream e istream, corrispondenti agli stream di input e output. Queste due classi sovraccaricano gli operatori di scorrimento << e >>, dandogli la funzione di stampare e leggere dati. In questa libreria vengono create due istanze delle classi ostream e istream: cout (Console Output) e cin (Console Input) che vengono usate per stampare su schermo e leggere da tastiera. Nello stream l'operazione di output viene identificata mediante un'operazione di inserimento del dato (right operand) da scrivere nell'oggetto cout (left operand): cout << dato; mentre l'operazione di input mediante un'operazione di estrazione del dato da leggere (right operand) dall'oggetto cin. cin >> dato; 36

37 Esercizi sulle classi (1 parte) Overload degli operatori di flusso overload degli operatori di flusso << e >> Vediamo ora come estendere gli operatori di flusso anche ai tipi astratti in modo che l istruzione: cout << dato; generi a video la stampa dei valori assunti dai membri di Dato (dove Dato è un'istanza di una classe A). Prima di procedere dobbiamo fare due precisazioni: 1) Abbiamo posto come right operand dell operatore di flusso l istanza Dato della nostra classe A. L operando a sinistra dell operatore di flusso è invece un istanza istream o ostream (cin e cout), diversa dalla classe a cui appartiene Dato, quindi sarà necessario lavorare su funzioni friend. 2) Nell implementazione della funzione operatore dobbiamo individuare anche il tipo di valore che essa dovrà restituire. In C++ una chiamata del tipo: cout << 5 << endl << ciao ; è lecita per il fatto che il valore restituito dall overloading dell operatore di scorrimento << è nuovamente l oggetto cout. 37

38 Esercizi sulle classi (1 parte) Overload degli operatori di flusso overload degli operatori di flusso << e >> In questo modo l operazione si semplifica progressivamente: cout << 5 << endl << ciao ; cout << endl << ciao ; l esecuzione di cout << 5 restituisce lo stesso cout per cui ottengo: cout << endl << ciao ; cout << ciao ; un ulteriore esecuzione semplifica progressivamente l istruzione Quindi il valore restituito dalla funzione di overload sarà il riferimento allo stream passato come argomento alla stessa. Inoltre il parametro della funzione operatore relativo allo stream deve essere passato come reference visto che si deve lavorare sempre su quella particolare istanza. I prototipi delle nostre due funzioni saranno quindi: friend istream& operator>> (istream&, Dato&); friend ostream& operator<< (ostream&, Dato); Possiamo adesso passare all implementazione dell esercizio 2 sfruttando l overloading degli operatori. 38

39 Esercizi sulle classi (1 parte) SOLUZIONE ALTERNATIVA Esercizio 2 Soluzione alternativa Partendo dall implementazione della somma mediante la funzione membro convenzionale Complesso Complesso::somma(Complesso addendo) return Complesso (reale + addendo.reale, immag + addendo.immag); Utilizzando l implementazione della funzione stampa() void Complesso::stampa() if ( (reale!=0) (immag==0) ) cout << reale; if (immag!=0) if ((immag > 0) && (reale!=0)) cout << "+"; if (immag!=1) cout << immag; cout << "i"; implemento l overloading dell operatore somma (+) Complesso Complesso::operator+(Complesso addendo) return Complesso (reale + addendo.reale, immag + addendo.immag); scrivo l overloading dell operatore di flusso << ostream& operator<<(ostream &output, Complesso numero) if ( (numero.reale!=0) (numero.immag==0) ) output << numero.reale; if (numero.immag!=0) if ((numero.immag > 0) && (numero.reale!=0)) output << "+"; if (numero.immag!=1) output << numero.immag; output << "i"; return output; 39

40 Esercizi sulle classi (1 parte) SOLUZIONE ALTERNATIVA Riprendendo l implementazione del costruttore di default Complesso::Complesso() cout << "Parte reale: "; cin >> reale; cout << "Parte immaginaria: "; cin >> immag; Partendo dal main() originale int main() Complesso n1, n2(3.5, 4); n1.stampa(); n1 = n1.somma(n2); cout << " + "; n2.stampa(); cout << " = "; n1.stampa(); cout << endl; system("pause"); return 0; Al termine la nuova definizione della classe Complesso diventa: class Complesso public:... Complesso(); Complesso somma(complesso addendo); void stampa();... ; effettuo l overloading dell operatore di flusso >> Esercizio 2 soluzione alternativa istream& operator>>(istream& input, Complesso& numero) cout << "Parte reale: "; input >> numero.reale; cout << "Parte immaginaria: "; input >> numero.immag; return input; int main() Complesso n1, n2(3.5, 4); cin >> n1; cout << n1; n1 = n1 + n2; cout << " + " << n2 << " = " << n1 << endl; system("pause"); return 0; riscrivo il nuovo main() class Complesso public:... Complesso operator+(complesso addendo); friend ostream& operator<<(ostream &output, Complesso numero); friend istream& operator>>(istream& input, Complesso& numero);... ; 40

41 Esercizio 2 soluzione alternativa Esercizi sull uso delle classi (1 parte) Soluzione completa /************************************************************************** * Nome: lab1-complesso-bis.c * * Autore: Alessandro Saetti * * Data: 6/4/10 * ************************************************************************* #include <iostream> #include <stdlib.h> using namespace std; class Complesso public: Complesso(); Complesso(float r, float i); Complesso operator+(complesso addendo); friend ostream& operator<<(ostream &output, Complesso numero); // Agisce come funzione globale (le passo esplicitamente l'oggetto su // cui operare) ma puo' accedere ai membri privati dell'oggetto friend istream& operator>>(istream& input, Complesso& numero); private: float reale, immag; ; 41

42 Esercizi sull uso delle classi (1 parte) soluzione completa /* Nome: Complesso::Complesso * Scopo: Costruttore di default della classe complesso * Output: - Complesso::Complesso() reale = 0; immag = 0; /* Nome: Complesso::Complesso * Scopo: Costruttore alternativo della classe complesso * Input: float r: la parte reale del numero complesso * float i: la parte immaginaria del numero complesso * Output: - Complesso::Complesso(float r, float i) reale = r; immag = i; /* Nome: Complesso::operator+ * Scopo: Somma un numero complesso al numero complesso rappresentato * dall'oggetto * Input: Complesso addendo: il numero complesso da sommare Esercizio 2 soluzione alternativa 42

43 Esercizi sull uso delle classi (1 parte) soluzione completa * Output: Restituisce la somma tra i due numeri complessi Esercizio 2 soluzione alternativa * Nota: operator e' una parola chiave per il sovraccaricamento degli operatori Complesso Complesso::operator+(Complesso addendo) return Complesso(reale + addendo.reale, immag + addendo.immag); /* Nome: Complesso::operator<< * Scopo: Stampa il numero complesso * Input: ostream &output: Un flusso di dati * Complesso numero: Il numero complesso da stampare * Output: Il flusso di dati da stampare ostream& operator<<(ostream &output, Complesso numero) if ( (numero.reale!=0) (numero.immag==0) ) output << numero.reale; if (numero.immag!=0) if ((numero.immag > 0) && (numero.reale!=0)) output << "+"; if (numero.immag!=1) output << numero.immag; output << "i"; return output; 43

44 Esercizi sull uso delle classi (1 parte) soluzione completa Esercizio 2 soluzione alternativa /* Nome: Complesso::operator>> * Scopo: Acquisisce un numero complesso * Input: ostream &output: Un flusso di dati * Complesso numero: Il numero complesso da inizializzare con i dati * acquisiti * Output: Il flusso di dati in cui salvare i dati istream& operator>>(istream& input, Complesso& numero) cout << "Parte reale: "; input >> numero.reale; cout << "Parte immaginaria: "; input >> numero.immag; return input; /* Nome: main * Scopo: Gestione dei numeri complessi * Output: 0 se il programma termina correttamente 44

45 Esercizi sull uso delle classi (1 parte) soluzione completa. int main() Complesso n1, n2(3.5, 4); cin >> n1; cout << n1; n1 = n1 + n2; cout << " + " << n2 << " = " << n1 << endl; system("pause"); return 0; Esercizio 2 soluzione alternativa 45

46 Esercizi sulle classi (2º parte) 3. Definire la classe studente (matricola, nome, cognome) con Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; Un metodo che visualizzi i dati dello studente. Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con Un costruttore che azzera in numero di studenti nel gruppo; Un metodo che visualizza i dati degli studenti nel gruppo; Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l aggiunta, la rimozione e la visualizzazione dei dati di studenti da un aula. 46

47 Esercizi sulle classi (2º parte) Definire la classe studente (matricola, nome, cognome) con Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; Un metodo che visualizzi i dati dello studente. Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con Un costruttore che azzera in numero di studenti nel gruppo; Un metodo che visualizza i dati degli studenti nel gruppo; Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l aggiunta, la rimozione e la visualizzazione dei dati di studenti da un aula. 47

48 Esercizi sulle classi (2 parte) Esercizio 3 Definire la classe studente (matricola, nome, cognome) con Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; Un metodo che visualizzi i dati dello studente. Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con Un costruttore che azzera in numero di studenti nel gruppo; Un metodo che visualizza i dati degli studenti nel gruppo; Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l aggiunta, la rimozione e la visualizzazione dei dati di studenti da un aula. Impostiamo la solita struttura iniziale di un programma C, aggiungendo eventuali commenti Non aggiungiamo #include <stdlib.h> poiché non ci serve usare system( Pause ) per sospendere l esecuzione del nostro programma. Infatti implementeremo un menù di opzioni che resta in attesa della scelta dell utente. /************************************************************************** * Nome: casa3-studente.c * * Autore: Alessandro Saetti * * Data: 6/4/10 * ************************************************************************* #include <iostream> /* * Nome: main * Scopo: Gestione di un gruppo di studenti * Output: 0 se il programma termina correttamente int main() // Definizione classe // Menu per gestire le chiamate ai metodi // fornite dalla classe AULA return 0; 48

49 Esercizi sulle classi (2 parte) Esercizio 3 Definire la classe studente (matricola, nome, cognome) con Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; Un metodo che visualizzi i dati dello studente. Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con Un costruttore che azzera in numero di studenti nel gruppo; Un metodo che visualizza i dati degli studenti nel gruppo; Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l aggiunta, la rimozione e la visualizzazione dei dati di studenti da un aula. Implementiamo: il costruttore di default (quello senza argomenti) per la classe studente, /* Nome: Studente::Studente * Scopo: Costruttore di default della classe Studente * Output: - Studente::Studente() strcpy(nome, ""); strcpy(cognome, ""); matricola = 0; il metodo stampa() che visualizza i dati dello studente, /* Nome: Studente::stampa * Scopo: Stampa i dato dello studente * Output: - void Studente::stampa() cout << matricola << " " << nome << " " << cognome << " " << endl; 49

50 Esercizi sulle classi (2 parte) Definire la classe studente (matricola, nome, cognome) con Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; Un metodo che visualizzi i dati dello studente. Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con Un costruttore che azzera in numero di studenti nel gruppo; Un metodo che visualizza i dati degli studenti nel gruppo; Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l aggiunta, la rimozione e la visualizzazione dei dati di studenti da un aula. il metodo per inserire un nuovo studente /* Nome: Studente::inserisci * Scopo: Inizializza i dati dello studente * con valori acquisiti da tastiera * Output: - void Studente::inserisci() cout << "Inserisci matricola: "; cin >> matricola; cout << "Inserisci nome: "; cin >> nome; cout << "Inserisci cognome: "; cin >> cognome; Per la gestione dell I/O utilizziamo gli oggetti globali di I/O cin e cout abbinati agli operatori di flusso << e >>. Esercizio 3 La funzione membro restituiscematricola() restituisce il contenuto della variabile membro privata contenente la matricola. Questo metodo viene utilizzato dalla funzione membro elimina() della classe Aula che definiremo successivamente /* Nome: Studente::restituisciMatricola * Scopo: Restituisce la matricola dello studente * Output: la matricola dello studente int Studente::restituisciMatricola() return matricola; Possiamo quindi definire la classe studente class Studente public: Studente(); void inserisci(); void stampa(); int restituiscimatricola(); private: char nome[dim1]; char cognome[dim1]; int matricola; ; 50

51 Esercizi sulle classi (2 parte) Esercizio 3 Definire la classe studente (matricola, nome, cognome) con Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; Un metodo che visualizzi i dati dello studente. Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con Un costruttore che azzera in numero di studenti nel gruppo; Un metodo che visualizza i dati degli studenti nel gruppo; Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l aggiunta, la rimozione e la visualizzazione dei dati di studenti da un aula. Implementiamo: il metodo che stampa gli studenti presenti in una istanza di tipo aula /* Nome: Aula::stampa * Scopo: Stampa i dati del * gruppo degli studenti * Output: - void Aula::stampa() int i; for (i = 0; i < n; i++) aula[i].stampa(); il metodo che consente di aggiungere un nuovo studente alla classe (in fondo) /* Nome: Aula::aggiungi * Scopo: Aggiungi uno studente al * gruppo degli studenti * Output: - void Aula::aggiungi() aula[n++].inserisci(); Implementiamo quindi la classe Aula class Aula public: Aula(); void aggiungi(); void elimina(); void stampa(); private: Studente aula[dim2]; ; int n; la funzione membro che chiede la matricola dello studente da eliminare. L eliminazione avviene sostituendo lo studente da eliminare con l ultimo in elenco il costruttore di default /* Nome: Aula::Aula * Scopo: Costruttore di default * della classe Aula * Output: - Aula::Aula() n = 0; /* Nome: Aula::elimina * Scopo: Elimina uno studente dal gruppo * degli studenti * Output: - void Aula::elimina() int i, m; cout << "Inserisci matricola: "; cin >> m; for (i = 0; i < n; i++) if (aula[i].restituiscimatricola() == m) aula[i] = aula[n-1]; n = n - 1; 51

52 Esercizi sulle classi (2 parte) Definire la classe studente (matricola, nome, cognome) con Un metodo che inizializza i dati dello studente (matricola, nome e cognome) con dati acquisiti da tastiera; Un metodo che visualizzi i dati dello studente. Sfruttando la classe precedente, definire la classe aula (gruppo di studenti) con Un costruttore che azzera in numero di studenti nel gruppo; Un metodo che visualizza i dati degli studenti nel gruppo; Un metodo che rimuove dal gruppo lo studente avente un numero di matricola pari ad un intero acquisito da tastiera; Un metodo che inserisce un nuovo studente nel gruppo. Scrivere un programma C++ che, sfruttando le classi precedentemente definite, supporti (tramite un menù di opzioni) l aggiunta, la rimozione e la visualizzazione dei dati di studenti da un aula. Impostiamo il main() con un menù opzioni che richiama le funzionalità rese disponibili dai metodi della classe Aula. Esercizio 3 int main() Aula eip; int x; do cout << "1. Stampa\n2. Inserisci\n3. Elimina\n0. Esci\n-> "; cin >> x; switch(x) case 1: eip.stampa(); break; case 2: eip.aggiungi(); break; case 3: eip.elimina(); break; while(x!= 0); return 0; 52

Fondamenti di Informatica 2008 corso prof. A. Picariello. Operazioni sui FILE in C++

Fondamenti di Informatica 2008 corso prof. A. Picariello. Operazioni sui FILE in C++ Fondamenti di Informatica 2008 corso prof. A. Picariello Operazioni sui FILE in C++ Librerie di I/O per la gestione dei FILE Il C++ consente di utilizzare le librerie standard di I/O del C mette anche

Dettagli

Laboratorio Informatica Classe 4A Serale Venerdì 18/02/2011. Gruppo. Cognome Riontino Nome Raffaele. Cognome Nome

Laboratorio Informatica Classe 4A Serale Venerdì 18/02/2011. Gruppo. Cognome Riontino Nome Raffaele. Cognome Nome Laboratorio Informatica Classe 4A Serale Venerdì 18/02/2011 Gruppo Cognome Riontino Nome Raffaele Cognome Nome TRACCIA 2 ARGOMENTO: LISTE TEMPO: 4h 1. Utilizzando Typedef definire un nuovo tipo di dato

Dettagli

Corso di Programmazione ad Oggetti

Corso di Programmazione ad Oggetti Corso di Programmazione ad Oggetti Funzioni e classi friend Overloading di operatori aa 2008/2009 Claudio De Stefano 1 Le funzioni friend Nella definzione di una classe è possibile elencare quali funzioni,

Dettagli

Tipi strutturati - struct

Tipi strutturati - struct Fondamenti di Programmazione A Appunti per le lezioni Gianfranco Rossi Tipi strutturati - struct Struttura dati (concreta) struct: sequenza di n elementi (n 0), rispettivamente di tipo t1,,tn (non necessariamente

Dettagli

INFORMATICA File di testo in C Roberta Gerboni

INFORMATICA File di testo in C Roberta Gerboni 2018 - Roberta Gerboni File di testo in C++ Il linguaggio C++ mette a disposizione le seguenti classi per operare sui file (è necessario includere nel programma l header ), consentendo tipo di

Dettagli

L AMBIENTE CODE BLOCKS E L IO

L AMBIENTE CODE BLOCKS E L IO L AMBIENTE CODE BLOCKS E L IO Il primo programma in C++ #include using namespace std; main() { cout

Dettagli

Struttura di un linguaggio

Struttura di un linguaggio Il C nel C++ Struttura di un linguaggio Livello lessicale: regole per la definizione i simboli Livello sintattico: regole per la composizione dei simboli Livello semantico: significato delle strutture

Dettagli

Introduzione al C++ Parte 2

Introduzione al C++ Parte 2 Introduzione al C++ Parte 2 Sommario Le differenze fra C e C++ il qualificatore const i namespace gli stream Evitare modifiche accidentali Il qualificatore const indica che la variabile non può più essere

Dettagli

La programmazione ad oggetti (OOP)

La programmazione ad oggetti (OOP) Oggetti e Classi (CAP 10) Alberto Garfagnini, Marco Mazzocco Università degli studi di Padova 30 Novembre 2011 La programmazione ad oggetti (OOP) È un approccio concettuale alla programmazione (indipendente

Dettagli

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

Classe Squadra. #include <iostream> using namespace std; Classe Squadra Si vuole scrivere un programma che gestisce la classifica di un campionato tra squadre di calcio, ognuna identificata dal proprio nome. Il programma deve essere in grado di assegnare un

Dettagli

Qualsiasi programma in C++ segue lo schema:

Qualsiasi programma in C++ segue lo schema: Qualsiasi programma in C++ segue lo schema: #include // libreria che gestisce flusso di input e output using namespace std; // uso di librerie standard del C++ int main() { // dichiarazioni

Dettagli

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} } ERRATA CORRIGE Pulizia del buffer di input: come fare? (1) Dopo aver richiamato getchar() per prelevare un carattere dal buffer di input, inseriamo una seconda chiamata a getchar(), senza assegnare il

Dettagli

Lezione 6 Introduzione al C++ Mauro Piccolo

Lezione 6 Introduzione al C++ Mauro Piccolo Lezione 6 Introduzione al C++ Mauro Piccolo piccolo@di.unito.it Linguaggi di programmazione Un linguaggio formale disegnato per descrivere la computazione Linguaggi ad alto livello C, C++, Pascal, Java,

Dettagli

Assegnazione di una variabile

Assegnazione di una variabile Assegnazione di una variabile Per scrivere un valore dentro una variabile si usa l operatore di assegnazione, che è rappresentato dal simbolo =. Quindi, se scrivo int a; a = 12; assegno alla variabile

Dettagli

L AMBIENTE CODE BLOCKS E L IO

L AMBIENTE CODE BLOCKS E L IO L AMBIENTE CODE BLOCKS E L IO Il primo programma #include main() { printf("ciao Mondo!"); } Il file deve essere salvato con estensione.c Il primo programma in C++ #include using

Dettagli

Implementazione dell albero binario in linguaggio C++

Implementazione dell albero binario in linguaggio C++ Implementazione dell albero binario in linguaggio C++ Costruire il programma per gestire le operazioni su un albero binario. Ogni nodo dell albero contiene un codice e una descrizione; il programma deve

Dettagli

Fondamenti di Informatica

Fondamenti di Informatica Programmazione modulare (top-down) Fondamenti di Informatica 15. Funzioni in C++ (parte 1) Problemi complessi Conviene suddividere il programma in sottoprogrammi piu semplici mediante la metodologia di

Dettagli

Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità

Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità Funzioni I Parte Indice Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità Le funzioni: la dichiarazione

Dettagli

Gestione di files Motivazioni

Gestione di files Motivazioni Gestione di files Motivazioni Un programma in esecuzione legge (sequenzialmente) una sequenza di caratteri prodotti "al volo" dall'utente (tramite tastiera) il programma in esecuzione scrive (sequenzialmente)

Dettagli

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I Lezione 4 Elementi lessicali e espressioni logiche Matricole 2-3 Elementi lessicali il linguaggio C ha un suo vocabolario di base i cui elementi sono detti token esistono 6 tipi di token: parole chiave

Dettagli

Il paradigma OO e le Classi

Il paradigma OO e le Classi Oggetti e Classi (CAP 10) Alberto Garfagnini Università degli studi di Padova 1 Dicembre 2009 Il paradigma OO e le Classi La programmazione ad Oggetti () è una filosofia di programmazione che si basa sui

Dettagli

Elementi di Informatica A. A. 2016/2017

Elementi di Informatica A. A. 2016/2017 Elementi di Informatica A. A. 2016/2017 Ing. Nicola Amatucci Università degli studi di Napoli Federico II Scuola Politecnica e Delle Scienze di Base nicola.amatucci@unina.it Programmazione C++ Parte 1

Dettagli

Ereditarietà. Unità 9. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Ereditarietà. Unità 9. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER Domenico Daniele Bloisi Docenti Metodi Numerici prof. Vittoria Bruni vittoria.bruni@sbai.uniroma1.it Programmazione prof. Domenico

Dettagli

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

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1 Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1 Cosa è il C++ E un linguaggio di programmazione derivato dal C Può essere usato per modificare il SO Unix e i suoi derivati (Linux)

Dettagli

Strutture di Controllo Iterative: Istruzione FOR

Strutture di Controllo Iterative: Istruzione FOR Linguaggio C Strutture di Controllo Iterative: Istruzione FOR 1 Istruzioni iterative! Anche dette cicli! Prevedono l esecuzione ripetitiva di altre istruzioni (corpo del ciclo)! Ad ogni iterazione del

Dettagli

Struttura di un programma C++

Struttura di un programma C++ Struttura di un programma C++ // Programma semplice in C++ #include using namespace std; int main() { cout

Dettagli

Strutture di Controllo Iterative: Istruzione FOR

Strutture di Controllo Iterative: Istruzione FOR Linguaggio C Strutture di Controllo Iterative: Istruzione FOR 1 Istruzioni iterative n Anche dette cicli n Prevedono l esecuzione ripetitiva di altre istruzioni (corpo del ciclo) n Ad ogni iterazione del

Dettagli

Laboratorio di Algoritmi e Strutture Dati. Pile

Laboratorio di Algoritmi e Strutture Dati. Pile Laboratorio di Algoritmi e Strutture Dati Pile Teresa M.A. Basile basile@di.uniba.it Dipartimento di Informatica Università degli Studi di Bari Aldo Moro Materiale di base gentilmente concesso dal dott.

Dettagli

Ambienti di Programmazione per il Software di Base

Ambienti di Programmazione per il Software di Base Ambienti di Programmazione per il Software di Base Le Funzioni in C Esercizi sulle Funzioni svolti Esercizi sulle Funzioni da svolgere A.A. 2011/2012 Ambienti di Programmazione per il Software di Base

Dettagli

Informatica! Appunti dal laboratorio 1!

Informatica! Appunti dal laboratorio 1! Informatica! Appunti dal laboratorio 1! Sistema Operativo! Windows 7, Windows 8, Mac OS X, Linux, Debian, Red Hat, etc etc! Il sistema operativo è un programma che serve a gestire TUTTE le risorse presenti

Dettagli

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica Corso di Fondamenti di Informatica Puntatori e Allocazione Dinamica I puntatori (Richiamo) Il C++ prevede puntatori a dati di qualsiasi natura, semplici o strutturati e puntatori a funzione. In particolare

Dettagli

Variabili e input/ Alessandra Giordani Lunedì 18 marzo

Variabili e input/ Alessandra Giordani Lunedì 18 marzo Variabili e input/ output da tastiera Alessandra Giordani agiordani@disi.unitn.it Lunedì 18 marzo 2013 http://disi.unitn.it/~agiordani/ Es. compilazione helloworld.c 2 Variabili e valori Una variabile

Dettagli

Programmazione modulare

Programmazione modulare Programmiamo in.. Programmazione modulare Un programma complesso si suddivide in più sottoprogrammi o funzioni. Un programma suddiviso in piccoli pezzi, è più semplice da gestire da aggiornare da correggere

Dettagli

a.a Codice corso: 21012

a.a Codice corso: 21012 ESERCIZIO 1 Scrivere un programma in linguaggio C che lette dallo standard input due sequenze vettoriali ordinate di interi V1[n], V2[m] ne crei una terza V3[n+m] anch essa ordinata, che contenga tutti

Dettagli

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Corso di Fondamenti di Informatica Il sistema dei tipi in C++ Corso di Fondamenti di Informatica Il sistema dei tipi in C++ Anno Accademico Francesco Tortorella Struttura di un programma C++ // Programma semplice in C++ #include int main() { cout

Dettagli

Le strutture /1. struct temp {char titolo[200]; char autore[100]; int pagine; } ; typedef struct temp libro;

Le strutture /1. struct temp {char titolo[200]; char autore[100]; int pagine; } ; typedef struct temp libro; Le strutture /1 Le strutture rappresentano un tipo di variabile che, diversamente dagli array, consente di gestire in modo compatto, mediante un'unico identificatore, un insieme di valori che non possiedano

Dettagli

Definizione di classi. Walter Didimo

Definizione di classi. Walter Didimo Definizione di classi Walter Didimo Definizione di classi Fino ad ora abbiamo imparato a: creare oggetti da classi già pronte usare gli oggetti creati, invocando metodi la creazione e l uso di oggetti

Dettagli

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro Laboratorio di Programmazione Lezione 2 Cristian Del Fabbro Prossima lezione GIOVEDÌ 29 OTTOBRE 14:00 Input da tastiera package input; import java.io.*; public class Input { public static void main(string[]

Dettagli

Fondamenti di C++ Input/Output di base

Fondamenti di C++ Input/Output di base Università della Calabria Corso di Laurea in Ingegneria Elettronica Programmazione Orientata agli Oggetti A.A. 2006/2007 Fondamenti di C++ Paolo Trunfio * * DEIS, Università della Calabria http://si.deis.unical.it/~trunfio

Dettagli

Introduzione a C++ e alla programmazione OO. Nunzio Brugaletta

Introduzione a C++ e alla programmazione OO. Nunzio Brugaletta Introduzione a C++ e alla programmazione OO Nunzio Brugaletta 1 Di cosa si parla: Paradigma OOP e C ++ 98 Si determini quali classi si desiderano; si fornisca un insieme completo delle operazioni di ogni

Dettagli

Informatica! Appunti dal laboratorio 1!

Informatica! Appunti dal laboratorio 1! Informatica Appunti dal laboratorio 1 Sistema Operativo Windows Vista, Windows 7, Mac OS X, Linux, Debian, Red Hat, etc etc Il sistema operativo è un programma che serve a gestire TUTTE le risorse presenti

Dettagli

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

OOP in C++ ha membro (dati membro) e funzioni membro In Java i dati membro sono chiamati attributi e le funzioni membro metodi OOP in C++ Classi e Oggetti Una classe èuntipochehavariabili ha membro (dati membro) e funzioni membro In Java i dati membro sono chiamati attributi e le funzioni membro metodi Una variabile ab di un tipo

Dettagli

Esercitazione 11. Liste semplici

Esercitazione 11. Liste semplici Esercitazione 11 Liste semplici Liste semplici (o lineari) Una lista semplice (o lineare) è una successione di elementi omogenei che occupano in memoria una posizione qualsiasi. Ciascun elemento contiene

Dettagli

Corso di Fondamenti di Informatica Prof. Aldo Franco Dragoni Prova scritta del 21/06/2010. Avvertenze. Specifiche

Corso di Fondamenti di Informatica Prof. Aldo Franco Dragoni Prova scritta del 21/06/2010. Avvertenze. Specifiche Avvertenze Usare ESCLUSIVAMENTE penne ad inchiostro nero o blu (NO MATITE). Consegnare solo fogli formato A4 scritti da ambo le parti. In testa a ciascun foglio scrivere: cognome, nome, numero progressivo

Dettagli

UNIVERSITA DEGLI STUDI ROMA TRE DIPARTIMENTO DI MATEMATICA E FISICA

UNIVERSITA DEGLI STUDI ROMA TRE DIPARTIMENTO DI MATEMATICA E FISICA UNIVERSITA DEGLI STUDI ROMA TRE DIPARTIMENTO DI MATEMATICA E FISICA Laboratorio di Programmazione e Calcolo A.A. 2018-19 Test Finale Roma, 17 gennaio 2019 1) Le variabili A, B e C sono dichiarate int.

Dettagli

Un esecutore di un linguaggio simbolico e costituito dalla coppia Compilatore, processore (o Interprete, processore)

Un esecutore di un linguaggio simbolico e costituito dalla coppia Compilatore, processore (o Interprete, processore) Un esecutore di un linguaggio simbolico e costituito dalla coppia Compilatore, processore (o Interprete, processore) Macchina astratta: un linguaggio di programmazione trasforma un calcolatore in una macchina

Dettagli

Esercizio 1: media di numeri reali (uso funzioni e struct)

Esercizio 1: media di numeri reali (uso funzioni e struct) Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 5 Esercitazione: 2 novembre 2005 Esercizi sulle funzioni Esercizio 1: media di numeri reali (uso funzioni e struct) Le

Dettagli

INTRODUZIONE ALLA PROGRAMMAZIONE

INTRODUZIONE ALLA PROGRAMMAZIONE INTRODUZIONE ALLA PROGRAMMAZIONE Prof. Enrico Terrone A. S: 2008/09 Definizioni Programmare significa risolvere problemi col computer, cioè far risolvere problemi al computer attraverso un insieme di informazioni

Dettagli

Costanti e Variabili

Costanti e Variabili Parte 3 Costanti e Variabili Identificatori Un identificatore è un nome che viene associato a diverse entità (costanti, tipi, variabili, funzioni, ecc.) e serve ad identificare la particolare entità Gli

Dettagli

Standard Template Library

Standard Template Library Standard Template Library Standard Template Library Progettata per gestire insiemi di dati in modo comodo ed efficiente senza conoscere dettagli implementativi Fa parte dello standard C++ È basata a sulla

Dettagli

Corso di Fondamenti di Informatica Tipi strutturati: Stringhe

Corso di Fondamenti di Informatica Tipi strutturati: Stringhe Corso di Fondamenti di Informatica Tipi strutturati: Stringhe Anno Accademico Francesco Tortorella Stringhe di caratteri La stringa è il tipo strutturato con cui vengono rappresentati gruppi di caratteri

Dettagli

Il C nel C++ Struttura di un linguaggio. Elementi lessicali. Spazi. Livello lessicale: Livello sintattico: Livello semantico:

Il C nel C++ Struttura di un linguaggio. Elementi lessicali. Spazi. Livello lessicale: Livello sintattico: Livello semantico: Struttura di un linguaggio Il C nel C++ Livello lessicale: regole per la definizione i simboli Livello sintattico: regole per la composizione dei simboli Livello semantico: significato delle strutture

Dettagli

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012 Fondamenti di Informatica - 1 Prof. B.Buttarazzi A.A. 2011/2012 Sommario Operatore? Tipo di dato: struct La ricorsione Funzioni ricorsive Esercizi proposti 26/04/2012 2 Operatore? L'operatore? può essere

Dettagli

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

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER Domenico Daniele Bloisi Docenti Metodi Numerici prof. Vittoria Bruni vittoria.bruni@sbai.uniroma1.it Programmazione prof. Domenico

Dettagli

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

C++ funzioni Alberto Ferrari. Alberto Ferrari Programmazione di applicazioni SW C++ funzioni Alberto Ferrari http://en.cppreference.com FUNZIONI le funzioni caratterizzate da nome, parametri (numero, ordine e tipo) e tipo di ritorno le funzioni hanno un prototipo il prototipo non

Dettagli

Laboratorio di Informatica

Laboratorio di Informatica Strutture di dati Laboratorio di Informatica 5. Strutture / Array di oggetti / Pila&Coda in C++ Una struttura è un insieme finito di variabili (dette campi) non necessariamente dello stesso tipo, ognuna

Dettagli

Dati due punti sul piano calcolare la loro distanza

Dati due punti sul piano calcolare la loro distanza Introduzione al C Primo esempio in C Dati due punti sul piano calcolare la loro distanza Soluzione: la distanza fra due punti si calcola secondo il teorema di Pitagora, con la formula: y Distanza = (lato12

Dettagli

A. Veneziani - Le variabili puntatore

A. Veneziani - Le variabili puntatore A. Veneziani - Le variabili puntatore I puntatori Una variabile puntatore è atta a contenere un indirizzo di memoria. Questo, quindi, è il tipo di dato contenuto in una variabile puntatore. A seconda dell

Dettagli

Fondamenti di Programmazione

Fondamenti di Programmazione Fondamenti di Programmazione Ingegneria dell Automazione Industriale Ingegneria Elettronica e delle Comunicazioni Alessandro Saetti Marco Sechi e Andrea Bonisoli (email: alessandro.saetti,marco.sechi,andrea.bonisoli@ing.unibs.it)

Dettagli

Introduzione al C++ (continua)

Introduzione al C++ (continua) Introduzione al C++ (continua) I puntatori Un puntatore è una variabile che contiene un indirizzo di memoria pi_greco 3.141592 pi_greco_ptr indirizzo di 3.141592 & DEREFERENZIAZIONE RIFERIMENTO * se x

Dettagli

#include <iostream> // libreria che gestisce flusso di input e output. using namespace std; // uso di librerie standard del C++

#include <iostream> // libreria che gestisce flusso di input e output. using namespace std; // uso di librerie standard del C++ Qualsiasi programma in C++ segue lo schema: #include // libreria che gestisce flusso di input e output using namespace std; // uso di librerie standard del C++ int main() { // dichiarazioni

Dettagli

ciclo di vita della soluzione (informatica) di un problema

ciclo di vita della soluzione (informatica) di un problema Università di Roma Tor Vergata L2-1 ciclo di vita della soluzione (informatica) di un problema errori run-time errori sintattici codice editor codice C++ compilatore esegui eseguibile OK risultati scorretti

Dettagli

Lezione 5 e 6. Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza. Valentina Ciriani ( ) Laboratorio di programmazione

Lezione 5 e 6. Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza. Valentina Ciriani ( ) Laboratorio di programmazione Lezione 5 e 6 - Concetto di blocco - Controllo del flusso di un programma - Costrutti per la scelta if e switch - Costrutti while e for - Operatori in C Fabio Scotti (2004-2009) Laboratorio di programmazione

Dettagli

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

Le Funzioni in C. Fondamenti di Informatica Anno Accademico 2010/2011. Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia Le Funzioni in C Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia Fondamenti di Informatica Anno Accademico 2010/2011 docente: prof. Michele Salvemini 1/24 Sommario Le funzioni Il

Dettagli

File binari e file di testo

File binari e file di testo I file File binari e file di testo distinzione tra file binari file di testo si possono usare funzioni diverse per la gestione di tipi di file diversi Programmazione Gestione dei file 2 File binari e file

Dettagli

Rappresentazione binaria delle variabili (int e char)

Rappresentazione binaria delle variabili (int e char) Rappresentazione binaria delle variabili (int e char) int e char son i due tipi utilizzati dal linguaggio C per la rappresentazione di valori interi; ai valori delle variabili del primo tipo sono assegnati

Dettagli

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore. Linguaggio C Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore. 1 Funzioni Generalizzazione del concetto di funzione algebrica: legge che associa a valori delle variabili

Dettagli

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella Corso di Informatica Tipi strutturati: Stringhe Anno Accademico 2010/2011 Francesco Tortorella Stringhe di caratteri La stringa è il tipo strutturato con cui vengono rappresentati gruppi di caratteri quali

Dettagli

Introduzione alle classi

Introduzione alle classi Introduzione alle classi Corso di Programmazione 3 - Ingegneria dell Informazione e dell Organizzazione 23 ottobre, 2001 Gino Perna Esempi di semplici classi in C++ INTRODUZIONE AGLI OGGETTI Fin dall'inizio

Dettagli

Fondamenti di Informatica Ing. Biomedica

Fondamenti di Informatica Ing. Biomedica Fondamenti di Informatica Ing. Biomedica Esercitazione n.8 Matrici Antonio Arena antonio.arena@ing.unipi.it Fondamenti di Informatica - Esercitazione n.8 2 Matrici In C++ viene trattata come array multi-dimesionale.

Dettagli

Ingegneria Elettronica Ingegneria delle Telecomunicazioni (J-Z) Ing. Antonio Monteleone A.A. 2001/02 3 ciclo

Ingegneria Elettronica Ingegneria delle Telecomunicazioni (J-Z) Ing. Antonio Monteleone A.A. 2001/02 3 ciclo Ingegneria Elettronica Ingegneria delle Telecomunicazioni (J-Z) Ing. Antonio Monteleone A.A. 2001/02 3 ciclo In C++ è possibile distinguere due aree distinte di memoria: memoria stack e memoria heap E

Dettagli

Fondamenti di Programmazione

Fondamenti di Programmazione Fondamenti di Programmazione Ingegneria dell Automazione Industriale Ingegneria Elettronica e delle Comunicazioni Alessandro Saetti Marco Sechi e Andrea Bonisoli (email: alessandro.saetti,marco.sechi,andrea.bonisoli@unibs.it)

Dettagli

Fondamenti di Programmazione

Fondamenti di Programmazione Fondamenti di Programmazione Ingegneria dell Automazione Industriale Ingegneria Elettronica e delle Comunicazioni Alessandro Saetti Marco Sechi e Andrea Bonisoli (email: {alessandro.saetti,marco.sechi,andrea.bonisoli@unibs.it)

Dettagli

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

Tipi di dato. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER Domenico Daniele Bloisi Docenti Metodi Numerici prof. Vittoria Bruni vittoria.bruni@sbai.uniroma1.it Programmazione prof. Domenico

Dettagli

HOMEWORKS. in modo che il programma stampi N ripetizioni della stringa HelloWorld (su righe diverse), con N inserito dall utente.

HOMEWORKS. in modo che il programma stampi N ripetizioni della stringa HelloWorld (su righe diverse), con N inserito dall utente. HOMEWORKS Questi esercizi saranno proposti di tanto in tanto e forniti sempre SENZA soluzioni. Come materiale complementare ai libri di testo e alle lezioni frontali e di esercitazione, si consiglia di

Dettagli

Programmazione in Java (I modulo)

Programmazione in Java (I modulo) Programmazione in Java (I modulo) Lezione 4 Variabili di tipo primitivo. Dichiarazione di costanti Conversioni di tipo: operatore cast Altri operatori di assegnamento Operazioni aritmetiche e di confronto

Dettagli

A. Ferrari. informatica. Java basi del linguaggio. Alberto Ferrari Informatica

A. Ferrari. informatica. Java basi del linguaggio. Alberto Ferrari Informatica informatica Java basi del linguaggio Alberto Ferrari Informatica struttura di un programma Java /** * Classe EsempioProgramma * Un esempio di programmazione in Java * @author 4A Informatica */ public class

Dettagli

Le classi. Per questo introduciamo le classi. Una classe è un nuovo tipo di dato che integra insieme i dati e le funzioni che possono agire sui dati.

Le classi. Per questo introduciamo le classi. Una classe è un nuovo tipo di dato che integra insieme i dati e le funzioni che possono agire sui dati. Le classi Abbiamo visto che le funzioni sono molto utili nella scomposizione top-down di un problema molto complesso; l uso dei parametri ci consente di associare valori diversi alle stesse variabili senza

Dettagli

Esercizio 1. Tavola ordinata in memoria centrale

Esercizio 1. Tavola ordinata in memoria centrale Esercizio 1. Tavola ordinata in memoria centrale E dato un programma che realizza una rubrica telefonica come tavola in memoria centrale. In particolare, ogni elemento della tavola è caratterizzato dalle

Dettagli

Fondamenti di programmazione parte 2. Elementi di informatica IGLP

Fondamenti di programmazione parte 2. Elementi di informatica IGLP Fondamenti di programmazione parte 2 Elementi di informatica IGLP Questo insieme di trasparenze è stato ideato e realizzato dai ricercatori e professori del Dipartimento di Informatica e Sistemistica dell

Dettagli

Puntatori. Grazie ai puntatori:

Puntatori. Grazie ai puntatori: Puntatori Grazie ai puntatori: 1) è possibile permettere ad una funzione di modificare il contenuto di un area di memoria; 2) invece di passare ad una funzione tutto un blocco di memoria, si passa alla

Dettagli

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

Fondamenti di Informatica II 3. Funzioni in C++ (parte 1) Introduzione alle funzioni in C++ Fondamenti di Informatica II 3. Funzioni in C++ (parte 1) Corso di Laurea in Ingegneria Informatica A.A. 2008-2009 2 Semestre Corso (A-M) int main() int n, fattoriale=1;

Dettagli

a.a Codice corso: 21012, 22010

a.a Codice corso: 21012, 22010 ESERCIZIO 1 Scrivere un sotto-programma in linguaggio C++ che ricevuta una matrice quadrata come parametro restituisca al chiamante un valore booleano indicante se la matrice è simmetrica oppure no. Scrivere

Dettagli

RELAZIONE DELLA PROVA DI LABORATORIO DI INFORMATICA

RELAZIONE DELLA PROVA DI LABORATORIO DI INFORMATICA RELAZIONE DELLA PROVA DI LABORATORIO DI INFORMATICA Anno scolastico Lab informatica AULA n 35 Data inizio svolgimento Progr. relazione primo trimestre secondo pentamestre Cognome e Nome DATI DELLO STUDENTE

Dettagli

Standard Input e Standard Output

Standard Input e Standard Output Istruzioni di I/O Standard Input e Standard Output Il C++ utilizza i concetti di standard input e standard output rispettivamente come astrazione di un canale per l ingresso e per l uscita dei dati In

Dettagli

Laboratorio di Informatica I

Laboratorio di Informatica I Struttura della lezione Lezione : Elementi lessicali del C Vittorio Scarano Corso di Laurea in Informatica Elementi lessicali e token Costanti Identificatori Operatori operatori di incremento/decremento

Dettagli

Funzioni, Stack e Visibilità delle Variabili in C

Funzioni, Stack e Visibilità delle Variabili in C Funzioni, Stack e Visibilità delle Variabili in C Programmazione I e Laboratorio Corso di Laurea in Informatica A.A. 2016/2017 Calendario delle lezioni Lez. 1 Lez. 2 Lez. 3 Lez. 4 Lez. 5 Lez. 6 Lez. 7

Dettagli

Capitolo 10 - Strutture

Capitolo 10 - Strutture 1 Capitolo 10 - Strutture Strutture In molte situazioni, una variabile non è sufficiente per descrivere un oggetto. Ad esempio, una posizione sul piano cartesiano è identificata da due coordinate, e la

Dettagli

Allocazione dinamica memoria

Allocazione dinamica memoria Allocazione dinamica memoria Marco Casazza 11/12/2017 1 Esercizio 1 1 /* 2 Creare una lista bidirezionale di interi, ovvero una lista 3 che permette lo scorrimento in entrambe le direzioni ( dal primo

Dettagli

(Def. funzioni con parametri di tipo matrice)

(Def. funzioni con parametri di tipo matrice) ESERCIZIO 1 (Def. funzioni con parametri di tipo matrice) Scrivere un sotto-programma in linguaggio C++ che ricevuta una matrice quadrata come parametro restituisca al chiamante un valore booleano indicante

Dettagli

Fondamenti di Programmazione

Fondamenti di Programmazione Fondamenti di Programmazione Ingegneria dell Automazione Industriale Ingegneria Elettronica e delle Comunicazioni Alessandro Saetti Marco Sechi e Andrea Bonisoli (email: {alessandro.saetti,marco.sechi,andrea.bonisoli}@unibs.it)

Dettagli

IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica Fondamenti di Informatica IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale Fondamenti di Informatica - D. Talia - UNICAL 1 Primo esempio di un programma Java Semplicissimo programma

Dettagli