Laboratorio di Informatica

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Laboratorio di Informatica"

Transcript

1 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 identificata con un nome l insieme dei campi è denominato record sintassi struct nome_struttura { tipo1 nome_variabile1;... tipon nome_variabilen; La struttura definisce un nuovo tipo di dato Corso di Laurea in Ingegneria Elettronica e Telecomunicazioni A.A Semestre Prof. Giovanni Pascoschi 2 Strutture di dati Strutture di dati Dopo aver definito una variabile struttura, si accede ai singoli campi mediante la notazione. (punto) i campi di una struttura possono essere usati come qualunque variabile dello stesso tipo esempio: cd.prezzo=10; cout<<cd.titolo; cd.copie++; Una volta definito un tipo dati struttura, essa si comporta come un qualsiasi altro tipo di dati. Si puo ad esempio: assegnare una variabile struttura ad un altra far si che una funzione restituisca una struttura alla funzione chiamante passare strutture sia per valore che per referenza (riferimento) 3 4

2 Esempi strutture di dati Tabelle di dati La tabella di dati è un array di strutture daticd cd1 = { Toccata e fuga, Bach, 30, sinfonia ; daticd cd2 = cd1; //uguaglianza tra strutture void stampa_cd(daticd x) { // passaggio per valore cout<< x.autore<<x.titolo<<x.prezzo<<x.genere<<endl; struct giorno { int gg; int mm; int aa; ; void prezzo_scontato(daticd& x) { x.prezzo=x.prezzo * 80/100; // passaggio per referenza struct daticd { string titolo; string autore; float prezzo; string genere; struct giorno giorno_vendita; ; struct daticd CD[100]; // tabella costituita da 100 CD 5 6 Istruzione typedef Accesso agli elementi di una Tabella per poter descrivere in maniera piu concisa un tipo struttura si puo usare la parola chiave typedef struct giorno { int gg; int mm; int aa; ; struct daticd { string titolo; string autore; float prezzo; string genere; struct giorno vendita; ; typedef struct daticd cddata; //non definisce un nuovo tipo, ma un sinonimo!!!! cddata CD[100]; // tabella costituita da 100 CD 7 L indice di una tabella puo essere una espressione costante intera o comunque una qualsiasi espressione intera Esempio di caricamento di una tabella: for (int i=0; i< 500; i++) { cin >> CD[i].titolo>> CD[i].autore >> CD[i].prezzo>> CD[i].genere; cin >> CD[i].vendita.gg >> CD[i].vendita.mm >> CD[i].vendita.aa ; 8

3 Array di oggetti Strutture dati complesse #include<iostream> using namespace std; class Persona { public: int id_persona; int anno_nasc; Persona() { id_persona = 0; anno_nasc = 0; Persona(int id_pers, int anno) { id-persona = id-pers; anno_nasc = anno; void stampa() { cout <<id-persona << " " << anno_nasc << "\n"; ; int main() { const int dim = 10; Persona a[dim]; // richiede il costruttore di default for (int i = 0; i < dim; i++) { a[i].id_persona = i; cin>>a[i].anno_nasc; for (int i = 0; i < dim; i++) { a[i].stampa(); system("pause"); Esempi di strutture dati complesse in C++: Pila (Stack) Coda (queue) Liste semplici (semplicemente linkate) (in seguito) Liste doppie (doppiamente linkate) (in seguito) 9 10 Pila (Stack) con array Pila (Stack) con array la Pila (Stack) è un insieme di dati che permette l inserimento di nuovi elementi e l estrazione degli elementi introdotti da un unica estremità il funzionamento della pila viene denominato LIFO (Last Input First Output) meccanismo utilizzato per gestire le chiamate alle funzioni (insieme degli indirizzi di rientro) oppure nel registro di stack (linguaggio assembly) operazione di inserimento di un dato push operazione di estrazione di un dato pop L implementazione di una pila puo essere fatta tramite un array (dimensione fissa) push A[0] A[1] A[2] pop testa = 0... A[MAX-1] testa = MAX 11 12

4 Esempio Pila Esempio Pila #include <iostream> using namespace std; const int MAX = 20; int Pila[MAX]; int testa; void clearpila( ); void pop( ); void push( ); void readpila( ); void menu( ); int main( ) { int scelta; clearpila( ); menu( ); cout<< Seleziona una voce ; cin>>scelta; while(scelta <1 scelta >5); switch(scelta) { case 1: clearpila( ); case 2: pop( ); case 3: push( ); case 4: readpila( ); while(scelta!=5); return 0; void pop( ) { if( testa == MAX) cout<< La pila e vuota. Impossibile estrarre un dato << endl; cout << Elemento estratto = << Pila[testa] << endl; testa++; void push( ) { int dato; if (testa == 0) cout<< La pila è piena. Impossibile inserire altri dati << endl; cout << dato da inserire = ; cin>> dato; testa- -; Pila[testa] = dato; Esempio Pila Coda (Queue) con array void clearpila( ) { testa = MAX; cout<< Pila vuota << endl; void readpila( ) { for(int i=testa; i< MAX; i++) { cout<< Pila[i] << endl; la Coda (Queue) è un insieme di dati che permette l inserimento di nuovi elementi da una parte e l estrazione degli elementi introdotti dalla parte opposta il funzionamento della coda viene denominato FIFO (First Input First Output) operazione di inserimento di un dato push void menu( ) { cout << endl; cout << 1. Pulisci pila << endl; cout << 2. Estrai un dato << endl; cout << 3. Aggiungi un dato << endl; cout << 4. Leggi pila << endl; cout << 5. Fine << endl; operazione di estrazione di un dato pop 15 16

5 Coda (Queue) con array Esempio Coda L implementazione di una coda puo essere fatta tramite un array (dimensione fissa) pop A[0] A[1] A[MAX-1]... push #include <iostream> using namespace std; const int MAX = 20; int Coda[MAX]; int fine; void clearcoda( ); void pop( ); void push( ); void readcoda( ); void menu( ); menu( ); cout<< Seleziona una voce ; cin>>scelta; while(scelta <1 scelta >5); switch(scelta) { case 1: clearcoda( ); case 2: pop( ); fine = -1 fine = MAX-1 int main( ) { int scelta; clearcoda( ); case 3: case 4: push( ); readcoda( ); while(scelta!=5); return 0; Esempio Coda Esempio Coda void pop( ) { if( fine ==-1) cout<< La coda e vuota. Impossibile estrarre un dato << endl; cout << Elemento estratto = << Coda[0] << endl; for(int i=1; i<= fine; i++) Coda[i-1] = Coda[i]; fine- -; void clearcoda( ) { fine = -1; cout<< Coda vuota << endl; void readcoda( ) { for(int i=0; i<= fine; i++) { cout<< Coda[i] << endl; void push( ) { int dato; if (fine == MAX-1) cout<< La coda è piena. Impossibile inserire altri dati << endl; cout << dato da inserire = ; cin>> dato; fine++; Coda[fine] = dato; void menu( ) { cout << endl; cout << 1. Pulisci coda << endl; cout << 2. Estrai un dato << endl; cout << 3. Aggiungi un dato << endl; cout << 4. Leggi coda << endl; cout << 5. Fine << endl; 19 20

6 Riepilogo della lezione Fine della lezione Funzioni in C++ Strutture di dati Tabelle di dati Array di oggetti Pila/Coda con array Domande? 21 22