Strutture Dati Le strutture dati sono entità entità che permettono di memorizzare dati in modo organizzato a funzionale a particolari compiti Strutture Dati in C++ Fondamenti di Informatica (lettere J-Z) C++: Array Prof. Francesco Lo Presti Array (Vettori) N dimensione dell’ dell’array Due tipi di array in C++ Array 2 Array 4 Array (Vettori) Array: Array: collezione finita di N variabili dello stesso tipo, ognuna identificata da in indice compreso tra 0 e NN-1 Array Strutture Classi Vector Code Liste Stacks … array: array: C-style vector: vector: classe Standard Template Library Le variabili di un array (elementi) vengono identificate da un nome (identificatore) identificatore) a cui va aggiunto un indice tra parentesi quadre I vari elementi sono memorizzati in locazioni successive di memoria Il numero di elementi di un array è fisso Nel primo modulo studieremo il primo tipo di array Array Indice compreso fra 0 e NN-1 3 v[0] v[1] v[2] array v v[N-1] Dichiarazione di un Array Dichiarazione di un Array Sintassi E’ possibile inizializzare i valori di un array in fase di dichiarazione nomeTipo nomeTiponomeArray nomeArray[[espressione espressionecostante costante];]; int inttest[5]={-3,67,23,0,5}; test[5]={-3,67,23,0,5}; Definisce l’l’array nomeArray di tipo nomeTipo con numero di elementi pari ad espressione costante Esempio int intelenco[100]; elenco[100]; int inttest[ test[]={-3,67,23,0,5}; ]={-3,67,23,0,5}; double doubletemperature[10]; temperature[10]; Dimensione di un array: array: numero di byte che l’l’array occupa in memoria numero di elementi*numero di byte per ciascun elemento Array 5 Elementi di un Array …omettendo, omettendo, volendo, la dimensione Array 6 Accesso agli Elementi di un Array Gli elementi di un array possono essere usati come una qualsiasi variabile del tipo dell’ dell’array L’indice di un array può essere una espr. espr. costante intera cout cout<<<<elenco[8]; elenco[8]; …o una qualsiasi …… elenco[5]=3; elenco[5]=3; espressione intera cout cout<<<<elenco[9]; elenco[9]; …… …… cin cin>>>>elenco[7]; elenco[7]; for(i=0;i<100;i++) for(i=0;i<100;i++){{ int intx; x; elenco[0]=elenco[1]-elenco[50]; elenco[0]=elenco[1]-elenco[50]; elenco[i]=i*i; elenco[i]=i*i; …… …… cout cout<<<<elenco[i]; elenco[i]; elenco[x]=elenco[x+1]; elenco[x]=elenco[x+1]; }} …… Array 7 Array 8 Array: Bound Checking Esempio In C++ non è previsto nessun meccanismo di verifica che un indice di un array cada all’ all’interno dell’ dell’intervallo [0,… [0,…,N,N-1] E’ possibile usare indici negativi o maggiori di NN-1 int intA[DIM]; A[DIM]; int minimo; int minimo; si accede alle celle di memoria che precedono o seguono l’area di memoria dove è allocato l’l’array cout cout<<<<elenco[-5]; elenco[-5]; ……// //inserimento inserimentodati datiininAA int inti;i; elenco[110]=4; elenco[110]=4; minimo=A[0]; minimo=A[0]; for(i=1;i<DIM;i++) for(i=1;i<DIM;i++) Ö Corruzione dello spazio di memoria Ö Crash del programma DA EVITARE!!! Lo considero un errore if(minimo>A[i]) if(minimo>A[i]) minimo=A[i]; minimo=A[i]; Array 9 Array: Assegnamento Trovare il valore minimo di un array …… const constint intDIM=50; DIM=50; cout cout<<<<“Il “Ilminimo minimoèè““<<<<minimo; minimo; …… Array 10 Array: Dimensione Fisica vs. Logica Per copiare i valori da un array ad un altro si assegnano i valori elemento per elemento …… const constint intDIM=50; DIM=50; int intA[DIM], A[DIM],B[DIM]; B[DIM]; ……// inserimento // inserimentodati datiininAA int inti;i; for(i=0;i<DIM;i++) for(i=0;i<DIM;i++) Un’ Un’ array è una collezione finita di N variabili (locazioni di memoria) dello stesso tipo Non significa che si debbano sempre usare tutte le variabili disponibili La dimensione logica dell’ dell’array (quanti elementi sono effettivamente utilizzati) può essere inferiore alla sua dimensione fisica La porzione dell’ dell’array effettivamente utilizzata dipende dai dati di ingresso. B[i]=A[i]; B[i]=A[i]; …… Array 11 Array 12 Esempio Esempio #include<iostream> #include<iostream> using usingnamespace namespacestd; std; Scrivere un programma che: 1. legge da tastiera delle rilevazioni di temperatura in gradi Kelvin; Kelvin; 2. memorizza i valori in un array 3. calcola la media dei valori inseriti if(indice>0) if(indice>0){ { media=static_cast<double>(totale)/contatore; media=static_cast<double>(totale)/contatore; int intmain main( () ){ { const constint intDIM=100; DIM=100; cout cout<<<<“La “Latemperatura temperaturamedia mediae’e’“ “<<<<media; media; cout << “\n”; cout << “\n”; int inttemp[DIM]; temp[DIM]; int intindice=0; indice=0; }} else else cout cout<<<<“Non “None’e’stato statoinserito inseritoalcun alcunvalore valore\n”; \n”; double doublemedia; media; bool boolfinito=false; finito=false; do do { { Ogni serie di dati consta al più più di 100 valori Si inserisce il valore -1 per indicare che la serie di valori è terminata cout cout<<<<“Inserire “Inseriretemperatura temperaturaoo-1\n”; -1\n”; cin >> temp[indice]; cin >> temp[indice]; }} }} return return0;0; finito=temp[indice]==-1; finito=temp[indice]==-1; if( if(!finito) !finito){ { totale+=temp[indice]; totale+=temp[indice]; indice++; indice++; }} } }while(!finito); while(!finito); Array 13 Array come Parametri Gli array possono essere usati come parametri di una funzione Gli array sono sempre passati per riferimento // //Calcola Calcolaalalmedia mediadegli deglielementi elementi // //Assume Assumeche cheililnumero numerodi dielementi elementisia sia>0 >0 int inttotale=0; totale=0; Sintassi Dichiarazione Definizione for(int for(inti=0; i=0;i<numero; i<numero;i++) i++) totale+=a[i]; totale+=a[i]; double doublemedia_array(int media_array(int[], [],int) int) return return(double) (double)totale/numero; totale/numero; }} parametro parametroformale formalearray array==tipo tipo parametro parametro[][] 14 double doublemedia_array(int media_array(inta[ a[],],int intnumero) numero){{ Retaggio del C. L’ L’argomento verrà verrà ripreso in seguito tipo tipoarray array==tipo tipo[][] Array Esempio Ösegue Ösegue all’ all’interno del corpo della funzione, i parametri formali di tipo array vengono trattati come array size fornisce la dimensione logica dell’ dell’array, array, non altrimenti nota all’ all’interno dell’ dell’array Array 15 quanti sono gli elementi effettivamente utilizzati Array 16 Array come Parametri Array come Parametri Chiamata parametro parametroattuale attualearray array==nome nomearray. array. Vedremo in seguito il caso generale …… Esempio const constint intDIM=100; DIM=100; Al momento della chiamata il nome del parametro formale per riferimento diventa un sinonimo (alias) del parametro attuale facente riferimento allo stesso array non si crea un nuovo array ma un riferimento ad una array esistente 9 sicuramente più più efficiente int inttemp[DIM]; temp[DIM]; ……// //riempire riempireparte partedi ditemp tempcon convalori valori if(indice>0) if(indice>0){{ media=media_array(temp,indice); media=media_array(temp,indice); Modifica degli elementi dell’ dell’array parametro formale all’ all’interno della funzione rappresenta, in realtà realtà, una modifica agli elementi dell’ dell’array parametro attuale …… }} …… Array 17 Array come Parametri 18 Array come Tipo Restituito Se gli elementi della funzione non devono essere modificati si può usare const nella specifica dei parametri formali Array Non è possibile usare un array come tipo restituito di una funzione double[ double[]]funzione(…) funzione(…) double doublemedia_array(const media_array(constint inta[ a[],],int intnumero) numero){{ NO! Soluzioni 1. Passare un array per riferimento 2. Restituire un puntatore ad un array (non locale) // //Calcola Calcolaalalmedia mediadegli deglielementi elementi // //Assume Assumeche cheililnumero numerodi dielementi elementisia sia>0 >0 int inttotale=0; totale=0; for(int for(inti=0; i=0;i<numero; i<numero;i++) i++) 3. totale+=a[i]; totale+=a[i]; verrà verrà visto in seguito Usare classe vector verrà verrà visto in seguito return return(double) (double)totale/numero; totale/numero; }} Array 19 Array 20 Esempio Elementi di un Array come Parametro Funzione che dato un array calcola il minimo ed il massimo Il minimo ed il massimo vengono restituiti tramite un array a due elementi int inti=0; i=0; …… void voidmin_max(const min_max(constint intx[ x[],],int intl,l,int inty[ y[])]) {{ …… main main(()){{ const constint intDIM=100; DIM=100; int inta[DIM], a[DIM],m[2], m[2],indice; indice; ……// //riempire riempireparte partedidiaacon convalori valori ……// indice contiene il numero // indice contiene il numerodidielementi elementi ……// //didiaautilizzati utilizzati min_max(a,indice,m); min_max(a,indice,m); Gli elementi di un array possono essere passati come parametro sia per valore che per riferimento come variabili qualsiasi int intmin, min,max; max; ……// calcola // calcolaminimo minimoeemassimo massimo int intx=max(temp[2],temp[5]+temp[7]); x=max(temp[2],temp[5]+temp[7]); …… ……// //eememorizzali memorizzaliininmin mineemax max y[0]=min; y[0]=min; swap(temp[i],temp[i+1]); swap(temp[i],temp[i+1]); …… y[1]=max; y[1]=max; }} …… }} Array Ösegue Ösegue 21 Array Array di Caratteri Array di Caratteri C’era una volta… volta… Array di caratteri – che termina con il carattere ‘\0’ - come unico modo per rappresentare una stringa Esempio char chars[10]; s[10]; può memorizzare una stringa fino a 10 caratteri ‘\0’ carattere null o terminatore zero C Manipolazione stringhe realizzata manipolando array di tipo char Esempio char charsaluto[5]={‘C’,’i’,’a’,’o’,’\0’}; saluto[5]={‘C’,’i’,’a’,’o’,’\0’}; 22 incluso il carattere null i a o \0 s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9] char charsaluto[ saluto[]={‘C’,’i’,’a’,’o’,’\0’}; ]={‘C’,’i’,’a’,’o’,’\0’}; Gli elementi di un array di tipo char possono essere manipolati come una variabile char s[2]=‘r’; s[2]=‘r’; cout cout<<<<s[3]; s[3]; char charsaluto[5]=“Ciao”; saluto[5]=“Ciao”; cin cin>>>>s[1]; s[1]; Array 23 Array 24 Array di Caratteri A differenza degli altri tipi di array è possibile stampare un array di caratteri (ovvero la stringa corrispondente) char charsaluto[5]=“Ciao”; saluto[5]=“Ciao”; cout cout<<<<saluto saluto i singoli caratteri possono essere modificati come gli elementi di un array di tipo char string stringsaluto=“Ciao”; saluto=“Ciao”; saluto[0]=‘M’; saluto[0]=‘M’; …come si può leggere da tastiera cout cout<<<<saluto; saluto; char charsaluto[20]; saluto[20]; cin cin>>>>saluto saluto Gli oggetti della classe string possono essere visti come array di caratteri di dimensione grande a piacere Attenzione: Attenzione: la stringa inserita non deve eccedere la dimensione dell’ dell’array!! array!! Array La classe string fornisce una rappresentazione più più astratta di una stringa è più più facile lavorare con oggetti della classe string che con array di caratteri 25 Array Esempio Array Multidimensionali Lunghezza di una stringa 1. Stringa implementata con un oggetto della Classe string E’ possibile dichiarare array con più più di una dimensione Sintassi string stringsaluto; saluto; nomeTipo nomeTiponomeArray nomeArray[[dime1 dime1]][[dime2 dime2]]……[[dimen dimen];]; …… int inti=saluto.length( i=saluto.length();); …… 2. stringa implementata con un array di caratteri Array a 2 dimensioni vengono solitamente detti mat … matrici 0 2 1 // //dichiarare dichiarareuna unamatrice matrice char charsaluto[50]; saluto[50]; //di //di10x20 10x20elementi elementi …… double doublemat[10][20]; mat[10][20]; int inti=0; i=0; while(saluto[i]!=‘\0’) while(saluto[i]!=‘\0’)i++; i++; 26 19 0 1 … Array di Caratteri e Stringhe 9 Array 27 Array 28 … mat 19 0 0 2 mat[1][2] mat[0][19] … … riga 9 mat[9][19] 29 Inizializzazione Array 30 Elementi di un Array Multidimensionale Gli array multidimensionali possono essere inizializzati con una lista di valori di inizializzazione racchiusi tra parentesi graffe nome_tipo …{riga -1}}; },},…{ dim1 nome_tiponomeArray nomeArray[[dim1 dim1][][dim2 dim2]={{ ]={{riga riga00},{ },{riga riga11},… rigadim1dim1-1 }}; {0,0,1,0},{0,0,0,1}}; {0,0,1,0},{0,0,0,1}}; mat[0][1] mat[9][1] Stesso principio si applica ad array a più più di 2 dimensioni int inta[4][4]={{1,0,0,0},{0,1,0,0}, a[4][4]={{1,0,0,0},{0,1,0,0}, 19 mat[9][0] 9 Array mat[0][0] … 1 9 … … 0 mat[1][2] 1 1 mat … 2 … mat[1][2]; mat[1][2]; 1 Gli array multidimensionali sono memorizzati per memoria righe in locazioni contigue riga 0 nomeArray ] [j]; [i[i] nomeArray[i] [j]; 0 … Per accedere all’ all’elemento che si trova nella riga i e nella colonna j si utilizza la notazione … Memorizzazione … Array Multidimensionali a= Gli elementi di un array multidimensionale possono essere usati come una qualsiasi variabile del tipo dell’ dell’array …… a[2][3]=3; a[2][3]=3; 0 1 2 cout cout<<<<a[2][0]; a[2][0]; 3 0 1 0 0 0 1 0 1 0 0 a[3][3]=a[1][3]-a[0][2]; a[3][3]=a[1][3]-a[0][2]; 2 0 0 1 0 …… 3 0 0 0 1 Array cin cin>>>>a[0][0]; a[0][0]; 31 Array 32 Esempio Accesso agli Elementi di un Array Multidimensionale Gli indicii di un array mult. mult. possono essere espr. espr. costanti intere cout cout<<<<a[2][3]; a[2][3]; …o una qualsiasi …… const constint intRIGHE=50, RIGHE=50,COLONNE=20; COLONNE=20; espressione intera …… …… for(i=0;i<100;i++) for(i=0;i<100;i++){{ int intx; x; a[0][i]=i*i; a[0][i]=i*i; …… cout cout<<<<a[0][i]; a[0][i]; a[1][x]=a[0][x+1]; a[1][x]=a[0][x+1]; Impostare tutti gli elementi di un array ad 1 int inta[RIGHE][COLONNE]; a[RIGHE][COLONNE]; int inti,j; i,j; for(i=0;i<RIGHE;i++) for(i=0;i<RIGHE;i++) for(j=0; for(j=0;j<COLONNE; j<COLONNE;j++) j++) a[i][j]=1; a[i][j]=1; …… }} …… Array 33 Esempio 34 Esempio Memorizzare la Tavola Pitagorica Array …… Modificare gli elementi di una riga const constint intRIGHE=10, RIGHE=10,COLONNE=10; COLONNE=10; Impostare gli elementi della riga 3 con il relativo numero di colonna …… int inta[RIGHE][COLONNE]; a[RIGHE][COLONNE]; const constint intRIGHE=50, RIGHE=50,COLONNE=20; COLONNE=20; int inti,j; i,j; int inta[RIGHE][COLONNE]; a[RIGHE][COLONNE]; for(i=0;i<RIGHE;i++) for(i=0;i<RIGHE;i++) …… for(j=0; for(j=0;j<COLONNE; j<COLONNE;j++) j++) int intj;j; a[i][j]=(i+1)*(j+1); a[i][j]=(i+1)*(j+1); for(j=0; for(j=0;j<COLONNE; j<COLONNE;j++) j++) …… a[3][j]=j; a[3][j]=j; …… Array 35 Array 36 Esempio Array Multidimensionali come Parametri Modificare gli elementi di una colonna Nel caso di passaggio di array multidimensionali nella dichiarazione bisogna specificare 1. Tutte le dimensioni Copiare gli elementi della colonna 3 sulla colonna 0 …… void voidstampa(int stampa(intmat[NRIGHE][NCOLONNE]) mat[NRIGHE][NCOLONNE]){{ int inti,j; i,j; const constint intRIGHE=50, RIGHE=50,COLONNE=20; COLONNE=20; for(i=0; for(i=0;i<NRIGHE; i<NRIGHE;i++) i++) for(j=0; j<NCOLONNE; for(j=0; j<NCOLONNE;j++) j++){{ int inta[RIGHE][COLONNE]; a[RIGHE][COLONNE]; …… cout cout<<<<setw(10) setw(10)<<<<mat[i][j]; mat[i][j]; cout cout<<<<“\n”; “\n”; int inti;i; for(i=0; for(i=0;i<RIGHE; i<RIGHE;i++) i++) }} a[i][0]=a[i][3]; a[i][0]=a[i][3]; }} …… Array 37 Array Array Multidimensionali come Parametri 2. Esempio: Prodotto Matrici Quadrate …tutte le dimensioni dalla seconda in poi 38 …… const constint intN=5; N=5; nel caso di matrici il numero di colonne è essenziale perché perché il compilatore sappia come accedere agli elementi in memoria void voidprodotto(double prodotto(doubleX[ X[][N], ][N],double doubleY[ Y[][N], ][N], double doubleZ[ Z[][N]); ][N]); int inti,j,k; i,j,k; double doublesomma; somma; for(i=0; for(i=0;i<N; i<N;i++) i++) void voidprodotto(double prodotto(double[[][N], ][N],double double[[ ][N], ][N],double double[[][N]); ][N]); void voidstampa(int stampa(intmat[ mat[][NCOLONNE], ][NCOLONNE],int intn) n){{ int inti,j; i,j; for(j=0; for(j=0;j<N; j<N;j++) j++){{ somma=0; somma=0; main main(()){{ double doubleA[N][N]; A[N][N]; for(i=0; for(i=0;i<n; i<n;i++) i++) for(j=0; j<NCOLONNE; for(j=0; j<NCOLONNE;j++) j++){{ for(k=0;k<N; for(k=0;k<N;k++) k++) somma+=X[i][k]*Y[k][j]; somma+=X[i][k]*Y[k][j]; double doubleB[N][N]; B[N][N]; double doubleC[N][N]; C[N][N]; cout cout<<<<setw(10) setw(10)<<<<mat[i][j]; mat[i][j]; cout cout<<<<“\n”; “\n”; Z[i][j]=somma; Z[i][j]=somma; …// …//inserire inseriredati datiininA, A,BB prodotto(A,B,C); prodotto(A,B,C); // //C=AxB C=AxB …… }} }} }} }} }} Array 39 Array 40 Ordinamento Ordinamento Una delle operazioni più più comune nell’ nell’elaborazione dati Problema: Problema: Data una sequenza di elementi Nostra formulazione Problema: Problema: Dato un array di int, int, double, double, stringhe, etc. a0 a1 … an-1 ai interi, double, double, stringhe,… stringhe,… e un relazione di ordinamento ≤ totale tra gli elementi trovare una permutazione degli indici j0, j1, …, jn-1 tale che aj0 aj1 … ajnjn-1 è ordinata, ovvero tale che riorganizzare i valori dell’ dell’array in modo tale che al termine gli elementi rispettino una relazione di ordinamento (non decrescente) a[0] ≤ a[1] ≤ a[2] ≤… ≤ a[N-1] aj0 ≤ aj1 ≤ aj2 ≤ … ≤ ajnjn-1 Array 41 Array Ordinamento: Bubblesort Si scandisce la lista di elementi confrontando coppie di elementi successivi a[0] <<-> a[1] a[1] <<-> a[2] … a[na[n-2] <<-> a[na[n-1] Algoritmo Algoritmo di di Ordinamento Ordinamento Per ogni coppia: {1,2,4,12,12,21,23,34,45,78,90} Ripetere fintanto che si Esistono diversi algoritmi di ordinamento effettua almeno uno scambio Bubblesort, Bubblesort, Insertion sort, sort, Quicksort, Quicksort, Mergesort, Mergesort, Heapsort, Heapsort, etc… etc… Noi vedremo uno dei più più sempici: sempici: Bubblesort – Ordinamento a bolle se i due elementi non sono in ordine (a[i]>a[i+1]) scambiare gli elementi Array 43 9 12 4 6 34 25 9 4 12 6 34 25 9 4 6 12 34 25 pass 1 Esempio {34,12,78,90,4,2,45,23,12,1,21} 42 9 4 6 12 25 34 4 9 6 12 25 34 4 6 9 12 25 34 4 6 9 12 25 34 pass 2 Ordinamento interi, double: double: crescente, non decrescente, … stringhe: lessicografico (del dizionario) altro: da definire volta per volta pass 3 a[0] a[1] a[2] … a[N-1] al più più n ripetizioni Array 44 Bubblesort Ricerca void voidbubblesort(int bubblesort(inta[ a[],],int intn) n){{ int inti;i; bool boolswapped; swapped; Scrivere una funzione che dato un array di interi a ed un numero x restituisce vero o falso a seconda che x occorra o meno in a bool boolricerca(int ricerca(inta[ a[],],int intn,n,int intx) x){{ bool booltrovato=false; trovato=false; do do{{ swapped=false; swapped=false; int inti=0; i=0; while(i<n while(i<nand and!trovato) !trovato){{ for(i=0; for(i=0;i<n-1; i<n-1;i++) i++) if(a[i]>a[i+1]) if(a[i]>a[i+1]){{ if(a[i]==x) if(a[i]==x) trovato=true; trovato=true; swap(a[i],a[i+1]); swap(a[i],a[i+1]); }} return returntrovato; trovato; swapped=true; swapped=true; }} }} }} while(swapped); while(swapped); }} Array 45 Ricerca il numero di operazioni richieste è in media proporzionale alla metà metà del numero di elementi dell’ dell’array Si assuma che l’l’array sia ordinato in senso non decrescente Se il vettore è ordinato, è l’algoritmo di ricerca può essere notevolmente migliorato Algoritmo di Ricerca Binaria 1. 2. 3. il numero di operazioni richieste è in media proporzionale al logaritmo (in base 2) del numero di elementi dell’ dell’array 4. numero di elementi N=1.000.000 N=1.000.000 a[0]≤ a[0]≤a[1]… [1]… ≤a[n] Algoritmo first=0, last=nlast=n-1, med=( med=(first+last)/2 first+last)/2 Si confronta l’l’elemento cercato x con l’l’elemento mediano del vettore a[med a[med]] Se x=a[ [ med], ], ho terminato x=a med Altrimenti, se il vettore ha almeno due elementi 46 Ricerca Binaria L’algoritmo di ricerca precedente ha complessità complessità lineare Array se x<a[med x<a[med]] si ripete la ricerca nella prima metà metà del vettore (da a[0] a a[meda[med-1]) 9 aggiornare last e med, med, andare al passo 2 N/2=500.000 log2N≈20 Array 47 se x>a[med x>a[med]] si ripete la ricerca nella seconda metà metà del vettore (da a[med+1] a a[last ]) a[last]) 9 aggiornare first e med, med, andare al passo 2 Array 48 Ricerca Binaria Strutture bool boolricerca_binaria(int ricerca_binaria(inta[ a[],],int intn,n,int intx) x){{ bool booltrovato=false; trovato=false; int intfirst=0, first=0,last=n-1, last=n-1,med=(first+last)/2; med=(first+last)/2; while(first<=last && !trovato) while(first<=last && !trovato){{ if(a[med]==x) if(a[med]==x) trovato=true; trovato=true; else if(x<a[med] else if(x<a[med]))last=med-1; last=med-1; presente anche nel C Sintassi struct nome_struttura{{ structnome_struttura tipo1 tipo1 nome_variabile1 nome_variabile1;; else elsefirst=med+1; first=med+1; med=(first+last)/2; med=(first+last)/2; }} }} return returntrovato; trovato; }} Una struttura è una collezione finita di variabili – dette campi - non necessariamente dello stesso tipo, ognuna identificata da un nome è possibile scrivere l’l’algoritmo in forma ricorsiva Array …… tipon tiponnome_variabilen nome_variabilen;; Definisce un nuovo tipo di dato. Differentemente da una classe tutte le variabili sono pubbliche non ci sono funzioni membro associate ad una struttura 49 Array Esempio Strutture Archivio libri di una biblioteca Un libro è caratterizzato da: Una volta definita 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 titolo, autore, numero copie, ci sono copie disponibili? struct structdatilibro datilibro{{ string stringtitolo, titolo,autore; autore; Definizione Struttura …… libro1.num_copie=2; libro1.num_copie=2; int intnum_copie; num_copie; bool boolprestito; prestito; };}; …… 50 cout cout<<<<libro1.titolo; libro1.titolo; libro2.nun_copie++; libro2.nun_copie++; Dichiarazioni variabili Struttura …… datilibro datilibrolibro1, libro1,libro2, libro2,libri[20]; libri[20]; datilibro libro3={“Divina datilibro libro3={“DivinaCommedia”, Commedia”,“Dante”, “Dante”,3, 3,true}; true}; Array 51 Array 52 Strutture 1. 2. 3. Esempio Una volta definito, un tipo dati struttura si comporta come un qualsiasi altro tipo di dati (che non sia un tipo “array di” di”) In particolare, è possibile: assegnare una variabile struttura ad un’ un’altra che una funzione restituisca una struttura passare strutture sia per valore che per riferimento Assegnare una variabile struttura ad un’ un’altra …… datilibro datilibrolibro1={“I libro1={“IPromessi PromessiSposi”, Sposi”,“Manzoni”, “Manzoni”,2, 2,true}; true}; datilibro datilibrolibro2=libro1; libro2=libro1; …… che una funzione restituisca una struttura datilibro datilibrofunzione(…) funzione(…){{ …… }} Array 53 Esempio passare strutture sia per valore che per riferimento void voidstampa_libro(datilibro stampa_libro(datilibrox) x){{ cout cout<<<<“Autore: “Autore:““<<<<x.autore x.autore<<<<“\n” “\n”<<<<“Titolo: “Titolo:““<<<<x.titolo x.titolo<<<<“\n”; “\n”; cout cout<<<<“Copie “CopieDisponibili: Disponibili:““<<<<x.num_copie x.num_copie<<<<“Prestito: “Prestito:““<<<<x.prestito x.prestito<<<< “\n”; “\n”; }} void voidaggiungi aggiungicopia(datilibro& copia(datilibro&x) x){{ x.num_copie++; x.num_copie++; }} Array 55 Array 54