• Non ci sono risultati.

Capitolo 13 Capitolo 13

N/A
N/A
Protected

Academic year: 2021

Condividi "Capitolo 13 Capitolo 13"

Copied!
120
0
0

Testo completo

(1)

Array statici Array statici Range-based for Range-based for Array circolari Array circolari Code Code

Capitolo 13

Capitolo 13

(2)

Contenuto capitolo Contenuto capitolo

Array statici Array statici

Passaggio alle funzioni Passaggio alle funzioni

Vettori dinamici Vettori dinamici

Accesso fuori dall'array Accesso fuori dall'array

Range-based for Range-based for

Array circolari Array circolari

Code Code

(3)

Tipi di dato Tipi di dato

struct

array []

Riferimenti

Scalari,

Fondamentali, Primitivi o

Aritmetici

int char

float

Puntatori

bool

Strutturati

predefiniti enumerati enum

Derivati

(4)

Problema Problema

Scrivere un programma che Scrivere un programma che

Legga da Legga da stdin stdin 20 valori reali 20 valori reali

Calcoli la media di tali valori Calcoli la media di tali valori

Ristampi solo i valori maggiori della media Ristampi solo i valori maggiori della media

(5)

Soluzione Soluzione

Una possibile soluzione basata sulle conoscenze Una possibile soluzione basata sulle conoscenze acquisite finora (ossia le uniche conoscenze che acquisite finora (ossia le uniche conoscenze che possiamo utilizzare) è la seguente

possiamo utilizzare) è la seguente

Definire 20 variabili di tipo reale Definire 20 variabili di tipo reale

Per ciascuna variabile Per ciascuna variabile

Leggere da Leggere da stdin stdin il valore della variabile il valore della variabile

Calcolare la media dei valori Calcolare la media dei valori

Per ciascuna variabile Per ciascuna variabile

Stamparne il valore solo se superiore alla media Stamparne il valore solo se superiore alla media

Il livello di replicazione del codice è intollerabile Il livello di replicazione del codice è intollerabile

La qualità del codice è bassissima La qualità del codice è bassissima

(6)

Proposta Proposta

Ci occorre una struttura dati che ci permetta di Ci occorre una struttura dati che ci permetta di risolvere lo stesso problema con codice

risolvere lo stesso problema con codice

Iterativo Iterativo

Compatto Compatto

Senza replicazione o al più con un livello Senza replicazione o al più con un livello ragionevole di replicazione

ragionevole di replicazione

(7)

Array Array

Un Un array array è una è una ennupla ennupla di di N N oggetti oggetti dello stesso tipo dello stesso tipo

Allocati in posizioni contigue in memoria Allocati in posizioni contigue in memoria

Selezione elementi: mediante Selezione elementi: mediante indice indice

Ciascun elemento dell'array è denotato mediante: Ciascun elemento dell'array è denotato mediante:

nome dell'array nome dell'array

seguito da un indice intero compreso fra 0 e seguito da un indice intero compreso fra 0 e N

N-1, scritto tra parentesi quadre -1, scritto tra parentesi quadre

Esempio Esempio

Dato un array Dato un array a a di dimensione di dimensione N N

L'elemento L'elemento i-esimo i-esimo è denotato come è denotato come a[i] a[i] , con , con 0 <= i <

0 <= i < N N

(8)

Array statico Array statico

SINTASSI della definizione di una variabile o di una SINTASSI della definizione di una variabile o di una costante con nome di tipo

costante con nome di tipo array statico array statico: : [

[ const const ] ] <tipo_elementi_array> <tipo_elementi_array> <identificatore> <identificatore> [ [ <espr_costante> <espr_costante> ] ; ] ;

SEMANTICA: alloca una sequenza contigua di elementi SEMANTICA: alloca una sequenza contigua di elementi in memoria, tutti di tipo

in memoria, tutti di tipo <tipo_elementi_array> <tipo_elementi_array> ed in ed in numero pari ad

numero pari ad <espr_costante> <espr_costante>

Esempio: array statico di 4 elementi di tipo Esempio: array statico di 4 elementi di tipo int int int a[4] ;

int a[4] ; // alloca spazio per 4 elementi // alloca spazio per 4 elementi int int contigui contigui

0 1 2 3

a[0] a[1] a[2]

a[3]

(9)

Array a dimensioni costanti Array a dimensioni costanti

Per aderire a qualsiasi standard C/C++, è Per aderire a qualsiasi standard C/C++, è

necessario che, all'atto della definizione di un necessario che, all'atto della definizione di un

array statico le dimensioni devono essere stabilite array statico le dimensioni devono essere stabilite mediante una espressione costante

mediante una espressione costante

Il valore deve essere quindi noto a tempo di Il valore deve essere quindi noto a tempo di scrittura del programma

scrittura del programma

Deve essere un numero naturale maggiore di Deve essere un numero naturale maggiore di zero

zero

(10)

Variable-length array Variable-length array

Esiste però anche l’alternativa di array statici a Esiste però anche l’alternativa di array statici a lunghezza variabile (Variable-length array, VLA) lunghezza variabile (Variable-length array, VLA)

Ossia la cui dimensione è decisa a tempo di Ossia la cui dimensione è decisa a tempo di esecuzione del programma

esecuzione del programma

Ma solo pochi compilatori e standard la supportano Ma solo pochi compilatori e standard la supportano

Pertanto codice che utilizza VLA non è portabile tra Pertanto codice che utilizza VLA non è portabile tra standard e compilatori diversi

standard e compilatori diversi

Vediamo i due casi con esempi di codice Vediamo i due casi con esempi di codice

(11)

Esempi Esempi

Portabile

Portabile VLA: non portabile VLA: non portabile const int

const int

NUM_ELEM = 500;

NUM_ELEM = 500;

int vett[NUM_ELEM];

int vett[NUM_ELEM];

int num_elem ; int num_elem ; cin>>num_elem ; cin>>num_elem ;

int vett[num_elem];

int vett[num_elem];

(12)

Estensioni Estensioni

Come mai è tipicamente imposto che la grandezza di Come mai è tipicamente imposto che la grandezza di un array sia decisa a tempo di scrittura del

un array sia decisa a tempo di scrittura del programma?

programma?

Perché non c’è nessun modo semplice di gestire un Perché non c’è nessun modo semplice di gestire un fallimento nel caso in cui si crei un array troppo

fallimento nel caso in cui si crei un array troppo grande a tempo di esecuzione di un programma grande a tempo di esecuzione di un programma

Ma compilatori quali Ma compilatori quali gcc gcc , , g++ g++ e e clang++ clang++ permettono permettono Variable Length Arrays (VLA) come estensioni

Variable Length Arrays (VLA) come estensioni

Come evitare sistematicamente di commettere Come evitare sistematicamente di commettere l’errore di usa VLA?

l’errore di usa VLA?

(13)

pedantic-error e Werror pedantic-error e Werror

C’è la possibilità di evitare che un compilatore attivi C’è la possibilità di evitare che un compilatore attivi qualsiasi estensione fuori standard

qualsiasi estensione fuori standard

Per evitarlo con Per evitarlo con gcc gcc e e g++ g++ , bisogna aggiungere , bisogna aggiungere l’opzione

l’opzione -pedantic-error -pedantic-error

Approfittiamo per un ulteriore consiglio: siccome non Approfittiamo per un ulteriore consiglio: siccome non bisogna tollerare neanche i warning in fase di

bisogna tollerare neanche i warning in fase di compilazione (per un programma di qualità), compilazione (per un programma di qualità), aggiungiamo anche l’opzione

aggiungiamo anche l’opzione -Werror -Werror , che trasforma i , che trasforma i warning in errori

warning in errori

In definitiva, d’ora in poi compiliamo con la riga di In definitiva, d’ora in poi compiliamo con la riga di comando

comando

g++ -Wall -Werror -pedantic-error

g++ -Wall -Werror -pedantic-error ... ...

(14)

Intervallo indice Intervallo indice

Contrariamente ad altri linguaggi, il C/C++ non Contrariamente ad altri linguaggi, il C/C++ non

consente di scegliere il valore iniziale dell’indice di un consente di scegliere il valore iniziale dell’indice di un array

array

Parte sempre da 0 Parte sempre da 0

L'indice del primo elemento è quindi 0 L'indice del primo elemento è quindi 0

Pertanto, un array di Pertanto, un array di N N elementi ha sempre, elementi ha sempre, necessariamente, indici da 0 a

necessariamente, indici da 0 a N N-1 (inclusi) -1 (inclusi)

(15)

Esercizi Esercizi

Svolgere i seguenti esercizi dell'ottava esercitazione: Svolgere i seguenti esercizi dell'ottava esercitazione:

ins_stampa_array.cc ins_stampa_array.cc

Per casa Per casa

array_casuali.cc array_casuali.cc

Videoregistrazione: Videoregistrazione:

https://drive.google.com/file/d/1Ve8pBdBROw-NUztpm https://drive.google.com/file/d/1Ve8pBdBROw-NUztpm y61vZ_IrllKPfSJ/view?usp=sharing

y61vZ_IrllKPfSJ/view?usp=sharing

(16)

Array in memoria 1/3 Array in memoria 1/3

All'atto delle definizione di un array, viene allocato All'atto delle definizione di un array, viene allocato spazio nella memoria del programma per una

spazio nella memoria del programma per una sequenza di celle

sequenza di celle

Memoria Memoria del del

programma programma Array

Array Indirizzo

array in memoria,

ad es.:

0xFFA10008

(17)

Array in memoria 2/3 Array in memoria 2/3

Nel caso più semplice, gli elementi dell'array sono di Nel caso più semplice, gli elementi dell'array sono di un tipo di dato che può essere memorizzato su una un tipo di dato che può essere memorizzato su una sola cella di memoria

sola cella di memoria

Accade tipicamente per il tipo Accade tipicamente per il tipo char char

Se invece le cose non stanno così, l'array è di fatto Se invece le cose non stanno così, l'array è di fatto una sequenza di sotto-sequenze di celle

una sequenza di sotto-sequenze di celle

Ogni sotto-sequenza è utilizzata per memorizzare Ogni sotto-sequenza è utilizzata per memorizzare uno degli elementi dell'array

uno degli elementi dell'array

Ad esempio, se il tipo degli elementi è Ad esempio, se il tipo degli elementi è int int e tale tipo e tale tipo occupa 4 byte, l'array è una sequenza di sotto-

occupa 4 byte, l'array è una sequenza di sotto- sequenze da 4 byte ciascuna

sequenze da 4 byte ciascuna

(18)

Array in memoria 3/3 Array in memoria 3/3

Memoria Memoria del

del

programma programma Array

Array

int a[3] ;

int a[3] ;

(19)

Assegnamento tra array Assegnamento tra array

La sintassi del C/C++ non permette di utilizzare La sintassi del C/C++ non permette di utilizzare

l'operatore di assegnamento per copiare il contenuto l'operatore di assegnamento per copiare il contenuto di un intero array all'interno di un altro array

di un intero array all'interno di un altro array

Esempio: Esempio:

int a[10], b[10] ; int a[10], b[10] ;

a = b ; // VIETATO !!!!!!!!!!!!!!

a = b ; // VIETATO !!!!!!!!!!!!!!

L'unica soluzione è scrivere codice che assegni (copi) i L'unica soluzione è scrivere codice che assegni (copi) i valori degli elementi uno alla volta

valori degli elementi uno alla volta

Vedremo più avanti il motivo esatto per cui Vedremo più avanti il motivo esatto per cui

l'assegnamento tra array statici non esiste

l'assegnamento tra array statici non esiste

(20)

Array e vettori Array e vettori

Un array è un oggetto informatico che permette di Un array è un oggetto informatico che permette di implementare l'oggetto matematico

implementare l'oggetto matematico vettore vettore

Di fatto un array statico di Di fatto un array statico di N N elementi corrisponde elementi corrisponde per definizione proprio ad un

per definizione proprio ad un vettore vettore statico statico di di N N elementi

elementi

Come vedremo a breve, con un array statico si può Come vedremo a breve, con un array statico si può però anche implementare un

però anche implementare un vettore dinamico vettore dinamico, , ossia un vettore con un numero di elementi che ossia un vettore con un numero di elementi che

può variare durante l'esecuzione del programma ...

può variare durante l'esecuzione del programma ...

(21)

Esercizio Esercizio

Dato un vettore di Dato un vettore di N N interi, con interi, con N N deciso a tempo di deciso a tempo di scrittura del programma, inizializzati da

scrittura del programma, inizializzati da stdin stdin o o

casualmente, si determini il valore massimo tra quelli casualmente, si determini il valore massimo tra quelli memorizzati nel vettore e lo si stampi

memorizzati nel vettore e lo si stampi

Cogliamo anche quest'occasione per effettuare di Cogliamo anche quest'occasione per effettuare di nuovo i passi fondamentali assieme

nuovo i passi fondamentali assieme

Iniziamo dall'idea ... Iniziamo dall'idea ...

(22)

Idea Idea

Assumi, come tentativo, che il “massimo Assumi, come tentativo, che il “massimo

momentaneo” sia il primo elemento del vettore momentaneo” sia il primo elemento del vettore

Poi, confronta via via il “massimo momentaneo” con Poi, confronta via via il “massimo momentaneo” con ciascuno dei successivi elementi del vettore

ciascuno dei successivi elementi del vettore

Ogni volta che trovi un elemento del vettore Ogni volta che trovi un elemento del vettore

maggiore del “massimo momentaneo” sostituisci il maggiore del “massimo momentaneo” sostituisci il

“massimo momentaneo” con quell’elemento del

“massimo momentaneo” con quell’elemento del vettore

vettore

Dopo aver controllato tutti gli elementi del vettore, il Dopo aver controllato tutti gli elementi del vettore, il

“massimo momentaneo” corrisponderà al massimo

“massimo momentaneo” corrisponderà al massimo del vettore

del vettore

(23)

Verso un algoritmo Verso un algoritmo

Per trasformare la precedente idea in un algoritmo Per trasformare la precedente idea in un algoritmo bisogna definire in modo preciso la struttura dati ed i bisogna definire in modo preciso la struttura dati ed i passi da effettuare

passi da effettuare

Come è fatta la struttura dati? Come è fatta la struttura dati?

(24)

Struttura dati Struttura dati

Array che realizza il vettore Array che realizza il vettore

Costante Costante N N contenente la dimensione dell'array contenente la dimensione dell'array

Variabile ausiliaria Variabile ausiliaria massimo massimo destinata a contenere il destinata a contenere il massimo alla fine dell'algoritmo

massimo alla fine dell'algoritmo

Variabile contatore ausiliaria per scandire l'array Variabile contatore ausiliaria per scandire l'array

(25)

Algoritmo Algoritmo

Assegno alla variabile Assegno alla variabile massimo massimo il valore del primo il valore del primo elemento del vettore (quello di indice 0)

elemento del vettore (quello di indice 0)

Poi, scandisco il vettore da 1 a Poi, scandisco il vettore da 1 a N N -1 confrontando -1 confrontando massimo

massimo con ciascun elemento con ciascun elemento

Se trovo un elemento del vettore maggiore di Se trovo un elemento del vettore maggiore di massimo massimo sostituisco il valore di

sostituisco il valore di massimo massimo con il valore di con il valore di quell’elemento del vettore

quell’elemento del vettore

Dopo aver controllato tutti gli elementi del vettore, il Dopo aver controllato tutti gli elementi del vettore, il massimo del vettore sarà contenuto nella variabile massimo del vettore sarà contenuto nella variabile ausiliaria

ausiliaria massimo massimo

(26)

Programma Programma

max_elem.cc max_elem.cc dell'ottava esercitazione dell'ottava esercitazione

Videoregistrazione: Videoregistrazione:

https://drive.google.com/file/d/1ZYMmHVvI97d1g0tAc https://drive.google.com/file/d/1ZYMmHVvI97d1g0tAc MnGc6RG4VE9g_mi/view?usp=sharing

MnGc6RG4VE9g_mi/view?usp=sharing

(27)

Variante per casa Variante per casa

Dato un vettore di Dato un vettore di N N interi, inizializzati da interi, inizializzati da stdin o stdin o casualmente, si determini il valore massimo e si casualmente, si determini il valore massimo e si

stampi sia il massimo sia la posizione del vettore in stampi sia il massimo sia la posizione del vettore in cui tale massimo compare

cui tale massimo compare

(28)

Proposta struttura dati Proposta struttura dati

Array che realizza il vettore Array che realizza il vettore

Costante Costante N N contenente la dimensione dell'array contenente la dimensione dell'array

Variabile ausiliaria Variabile ausiliaria massimo massimo destinata a contenere il destinata a contenere il massimo alla fine dell'algoritmo

massimo alla fine dell'algoritmo

Variabile ausiliaria Variabile ausiliaria pos_massimo pos_massimo destinata a contenere destinata a contenere la posizione dell'elemento di valore massimo alla fine la posizione dell'elemento di valore massimo alla fine dell'algoritmo

dell'algoritmo

Variabile contatore ausiliaria per scandire l'array Variabile contatore ausiliaria per scandire l'array

(29)

Programma Programma

max_pos_elem.cc max_pos_elem.cc

Si può fare meglio? Si può fare meglio?

Servono due variabili Servono due variabili massimo massimo e e pos_massimo pos_massimo , o ne , o ne basta una?

basta una?

max_pos_elem2.cc max_pos_elem2.cc

(30)

Domanda Domanda

Dove è memorizzata implicitamente la Dove è memorizzata implicitamente la dimensione di un array?

dimensione di un array?

(31)

Lettura dimensione array Lettura dimensione array

In una zona nascosta della memoria non controllabile dal In una zona nascosta della memoria non controllabile dal programmatore

programmatore

Si può poi ottenere le dimensioni dell'array mediante Si può poi ottenere le dimensioni dell'array mediante l'operatore

l'operatore sizeof sizeof

Restituisce il numero di byte occupati dall'array Restituisce il numero di byte occupati dall'array

Non il numero di elementi Non il numero di elementi

Esempio: Esempio:

int a[10] ; int a[10] ;

cout<<sizeof(a) ; // stampa 40 se gli int sono cout<<sizeof(a) ; // stampa 40 se gli int sono

// memorizzati su 4 byte

// memorizzati su 4 byte

(32)

Mancanza controlli ed errori Mancanza controlli ed errori

In ogni caso, nel linguaggio C/C++ In ogni caso, nel linguaggio C/C++ non è previsto non è previsto nessun controllo della correttezza degli indici nessun controllo della correttezza degli indici

(inferiore e superiore) nell'accesso agli elementi di un array (inferiore e superiore) nell'accesso agli elementi di un array

Per esempio, per un array così definito, Per esempio, per un array così definito, int vettore[100];

int vettore[100];

istruzioni del tipo istruzioni del tipo vettore[105]=54;

vettore[105]=54; vettore[100]=32; vettore[100]=32;

verrebbero accettate dal compilatore

verrebbero accettate dal compilatore senza senza segnalazione di errori

segnalazione di errori

Tali errori possono causare fallimenti in modo impredicibile Tali errori possono causare fallimenti in modo impredicibile a tempo di esecuzione (incluso corruzione della memoria a tempo di esecuzione (incluso corruzione della memoria del programma, come vedremo fra qualche slide)

del programma, come vedremo fra qualche slide)

(33)

Inizializzazione array 1/2 Inizializzazione array 1/2

Un array può essere inizializzato (solo) all'atto della sua Un array può essere inizializzato (solo) all'atto della sua definizione

definizione

Notazione: Notazione:

[ [ const const ] ] <tipo_elementi_array> <tipo_elementi_array> <identificatore> <identificatore> [ [ <espr-costante> <espr-costante> ] = ] = {

{ <espr1>, <espr2>, ..., <esprN> <espr1>, <espr2>, ..., <esprN> } }

Esempi: Esempi:

int a[3] = { 7, 3, 1 } ; int a[3] = { 7, 3, 1 } ;

char cv[4] = { 't', 'A', '8', '$'} ;

char cv[4] = { 't', 'A', '8', '$'} ;

(34)

Inizializzazione array 2/2 Inizializzazione array 2/2

Se un array è inizializzato, l'indicazione della dimensione si Se un array è inizializzato, l'indicazione della dimensione si può omettere. In tal caso la dimensione è dedotta dal

può omettere. In tal caso la dimensione è dedotta dal numero di valori inizializzati. I precedenti esempi sono numero di valori inizializzati. I precedenti esempi sono equivalenti a:

equivalenti a:

int a[] = { 7, 3, 1 } ; int a[] = { 7, 3, 1 } ;

char cv[] = { 't', 'A', '8', '$'} ; char cv[] = { 't', 'A', '8', '$'} ;

Se invece la dimensione è indicata esplicitamente Se invece la dimensione è indicata esplicitamente

Non si possono inizializzare più elementi della Non si possono inizializzare più elementi della dimensione dell'array

dimensione dell'array

Se se ne inizializzano meno, i restanti contengono il Se se ne inizializzano meno, i restanti contengono il valore 0 o valori casuali a seconda che l'oggetto sia valore 0 o valori casuali a seconda che l'oggetto sia globale o locale

globale o locale

Un Un array costante array costante va va inizializzato inizializzato obbligatoriamente obbligatoriamente

(35)

Contenuto lezione Contenuto lezione

Array statici Array statici

Passaggio alle funzioni Passaggio alle funzioni

Vettori dinamici Vettori dinamici

Accesso fuori dall'array Accesso fuori dall'array

Range-based for Range-based for

Array circolari Array circolari

Code Code

(36)

Sintassi Sintassi

<dichiarazione_parametro_formale_di_tipo_array>

<dichiarazione_parametro_formale_di_tipo_array> ::= ::=

[ [ const const ] ] <tipo_elementi> <tipo_elementi> <identificatore> <identificatore> [ ] [ ]

Esempio definizione di una funzione con un parametro di Esempio definizione di una funzione con un parametro di tipo array:

tipo array:

void fun(char c, int v[], …) { … } void fun(char c, int v[], …) { … }

Se si tratta di un prototipo non è ovviamente necessario Se si tratta di un prototipo non è ovviamente necessario l'identificatore. Ad esempio:

l'identificatore. Ad esempio:

void fun(char c, int [], …) ; void fun(char c, int [], …) ;

Per passare un array ad una funzione si passa Per passare un array ad una funzione si passa semplicemente il

semplicemente il nome dell'array nome dell'array

Esempio invocazione con passaggio di un array: Esempio invocazione con passaggio di un array:

int A[4];

int A[4];

fun('b', A, ...);

fun('b', A, ...);

(37)

Tipologia passaggio 1/2 Tipologia passaggio 1/2

Gli array sono Gli array sono automaticamente passati automaticamente passati per riferimento

per riferimento

Se una funzione modifica l'array preso in Se una funzione modifica l'array preso in ingresso (parametro formale), di fatto

ingresso (parametro formale), di fatto modifica l'array originario (parametro modifica l'array originario (parametro attuale)

attuale)

Cosa si può fare evitare che questo possa Cosa si può fare evitare che questo possa accadere?

accadere?

(38)

Tipologia passaggio 2/2 Tipologia passaggio 2/2

Basta aggiungere il qualificatore Basta aggiungere il qualificatore const const nella nella dichiarazione del parametro

dichiarazione del parametro Esempio:

Esempio:

void fun(const int v[], …) ;

void fun(const int v[], …) ;

(39)

Domanda Domanda

Le informazioni sulle dimensioni di un array Le informazioni sulle dimensioni di un array passato ad una funzione dove sono?

passato ad una funzione dove sono?

(40)

sizeof

sizeof param. formali array param. formali array

Da nessuna parte! Da nessuna parte!

Inoltre, a differenza del caso dell'applicazione Inoltre, a differenza del caso dell'applicazione dell'operatore

dell'operatore sizeof sizeof al nome di un al nome di un array array

Se si applica l'operatore Se si applica l'operatore sizeof sizeof ad un ad un parametro formale di tipo

parametro formale di tipo array array, restituisce , restituisce il numero di byte necessari per

il numero di byte necessari per memorizzare l'indirizzo dell'

memorizzare l'indirizzo dell'array array in in memoria

memoria

Vedremo fra qualche lezione come mai Vedremo fra qualche lezione come mai

(41)

Domanda Domanda

Come può fare allora il codice di una funzione Come può fare allora il codice di una funzione a conoscere le dimensioni di un

a conoscere le dimensioni di un array array passato passato alla funzione?

alla funzione?

(42)

Dimensioni array funzioni Dimensioni array funzioni

Se ne assicura il programmatore con Se ne assicura il programmatore con due due tipiche soluzioni

tipiche soluzioni

Parametro addizionale, contenente le Parametro addizionale, contenente le

dimensioni dell'array, passato alla funzione dimensioni dell'array, passato alla funzione

Variabile/costante globale Variabile/costante globale

Soluzione potenzialmente più efficiente Soluzione potenzialmente più efficiente (permette di passare un parametro in (permette di passare un parametro in meno) ma affetta dai problemi degli meno) ma affetta dai problemi degli oggetti globali già discussi

oggetti globali già discussi

(43)

Esercizio Esercizio

Svolgere l'ottava esercitazione fino all'esercizio Svolgere l'ottava esercitazione fino all'esercizio calcola_somma.cc

calcola_somma.cc

Videoregistrazione: Videoregistrazione:

https://drive.google.com/file/d/1ZYMmHVvI97d1g0 https://drive.google.com/file/d/1ZYMmHVvI97d1g0 tAcMnGc6RG4VE9g_mi/view?usp=sharing

tAcMnGc6RG4VE9g_mi/view?usp=sharing

(44)

Contenuto lezione Contenuto lezione

Array statici Array statici

Passaggio alle funzioni Passaggio alle funzioni

Vettori dinamici Vettori dinamici

Accesso fuori dall'array Accesso fuori dall'array

Range-based for Range-based for

Array circolari Array circolari

Code Code

(45)

Vettori dinamici Vettori dinamici

La dimensione La dimensione N N di un array statico non può essere di un array statico non può essere determinata o modificata a tempo di esecuzione

determinata o modificata a tempo di esecuzione

Al contrario, in molte applicazioni è necessario Al contrario, in molte applicazioni è necessario utilizzare vettori di dimensioni

utilizzare vettori di dimensioni variabili variabili o di o di dimensioni costanti ma

dimensioni costanti ma note solo a tempo di note solo a tempo di esecuzione

esecuzione

Uno dei modi più semplici per implementare un Uno dei modi più semplici per implementare un

vettore di dimensioni variabili mediante un array è vettore di dimensioni variabili mediante un array è memorizzare il vettore in un array di dimensione memorizzare il vettore in un array di dimensione pari alla dimensione massima del vettore

pari alla dimensione massima del vettore

Questo vuol dire però che Questo vuol dire però che in determinati momenti in determinati momenti dell'esecuzione del programma

dell'esecuzione del programma non tutte le celle non tutte le celle

(46)

Implementazioni 1/2 Implementazioni 1/2

Come gestire l'occupazione parziale? Come gestire l'occupazione parziale?

Vi sono due tipiche soluzioni: Vi sono due tipiche soluzioni:

La prima è memorizzare, in una ulteriore variabile, La prima è memorizzare, in una ulteriore variabile, il numero di elementi validi, ossia il numero di

il numero di elementi validi, ossia il numero di elementi del vettore dinamico

elementi del vettore dinamico

Esempio di implementazione di un vettore dinamico di Esempio di implementazione di un vettore dinamico di al più 4 interi, e che ha al momento lunghezza 2

al più 4 interi, e che ha al momento lunghezza 2

11 6 ? ? int vett[4]

int num_elem 2

I valori degli elementi dell'array successivi al I valori degli elementi dell'array successivi al secondo non hanno

secondo non hanno nessuna importanza nessuna importanza, ,

perché solo i primi due elementi sono validi

perché solo i primi due elementi sono validi

(47)

Implementazioni 2/2 Implementazioni 2/2

L'altra tipica soluzione è identificare il primo elemento non L'altra tipica soluzione è identificare il primo elemento non utilizzato con un valore che non appartiene all’insieme dei utilizzato con un valore che non appartiene all’insieme dei valori ammissibili per gli elementi di quel vettore. Tale

valori ammissibili per gli elementi di quel vettore. Tale elemento viene tipicamente detto

elemento viene tipicamente detto terminatore terminatore. Ad . Ad esempio si può utilizzare

esempio si può utilizzare

0 per terminare un vettore di valori non nulli 0 per terminare un vettore di valori non nulli

-1 per terminare un vettore di valori positivi -1 per terminare un vettore di valori positivi

Esempio di implementazione di un vettore dinamico di al Esempio di implementazione di un vettore dinamico di al più 4 interi maggiori di zero, utilizzando il valore zero come più 4 interi maggiori di zero, utilizzando il valore zero come terminatore

terminatore

11 6 0 ? int vett[4]

Il valore degli elementi dell'array successivi al Il valore degli elementi dell'array successivi al terminatore non ha

terminatore non ha nessuna importanza nessuna importanza, ,

(48)

Domanda Domanda

Dato un vettore dinamico, se Dato un vettore dinamico, se

il vettore è implementato mediante un array di il vettore è implementato mediante un array di elementi di un certo tipo di dato,

elementi di un certo tipo di dato,

tutti i valori possibili per quel tipo di dato sono tutti i valori possibili per quel tipo di dato sono valori ammissibili per gli elementi del vettore valori ammissibili per gli elementi del vettore

Si può implementare tale vettore mediante un array Si può implementare tale vettore mediante un array con terminatore?

con terminatore?

(49)

Risposta Risposta

No No

Proprio perché quel tipo di dato non fornisce alcun Proprio perché quel tipo di dato non fornisce alcun valore che non sia ammissibile per gli elementi del valore che non sia ammissibile per gli elementi del vettore

vettore

Quindi l’unica opzione che rimane valida per Quindi l’unica opzione che rimane valida per

implementare il vettore dinamico è la prima, ossia implementare il vettore dinamico è la prima, ossia quella con un contatore aggiuntivo

quella con un contatore aggiuntivo

(50)

Esercizio Esercizio

Vediamo un esercizio propedeutico per i vettori Vediamo un esercizio propedeutico per i vettori dinamici implementati mediante array statici

dinamici implementati mediante array statici

In questo esercizio, il vettore dinamico non cambia In questo esercizio, il vettore dinamico non cambia dimensioni durante l'esecuzione del programma

dimensioni durante l'esecuzione del programma

Ma il numero di elementi che deve contenere si Ma il numero di elementi che deve contenere si scopre solo a tempo di esecuzione del programma scopre solo a tempo di esecuzione del programma

Un semplice array statico non va quindi bene Un semplice array statico non va quindi bene

Data una serie di rilevazioni di al più 100 temperature Data una serie di rilevazioni di al più 100 temperature espresse in gradi Kelvin da memorizzare in un vettore, espresse in gradi Kelvin da memorizzare in un vettore, si calcoli la media delle temperature

si calcoli la media delle temperature effettivamente effettivamente fornite

fornite e si ristampino solo le temperature al di sopra e si ristampino solo le temperature al di sopra della media

della media

Che valore hanno gli elementi dell'array non Che valore hanno gli elementi dell'array non inizializzati?

inizializzati?

(51)

Idee Idee

Chiedi in input il numero di valori Chiedi in input il numero di valori M M effettivamente effettivamente rilevati, e leggi tutti questi valori

rilevati, e leggi tutti questi valori

Somma tutti i valori inseriti Somma tutti i valori inseriti

La media cercata è data dalla somma precedente La media cercata è data dalla somma precedente divisa per

divisa per M M

(52)

Algoritmo Algoritmo

Assumi che vi possano essere fino a 100 temperature, Assumi che vi possano essere fino a 100 temperature, ma chiedi in input il numero di valori

ma chiedi in input il numero di valori M M effettivamente effettivamente rilevati

rilevati

Leggi Leggi M M valori non negativi e inseriscili in un vettore valori non negativi e inseriscili in un vettore nelle posizioni da 0 a

nelle posizioni da 0 a M M-1 -1

Somma tutti gli Somma tutti gli M M valori del vettore valori del vettore

La media cercata è data dalla somma precedente La media cercata è data dalla somma precedente suddivisa per

suddivisa per M M

Per tutti gli elementi del vettore stampa solo quelli di Per tutti gli elementi del vettore stampa solo quelli di valore maggiore della media

valore maggiore della media

(53)

Struttura dati Struttura dati

Costante (int) per denotare la dimensione massima Costante (int) per denotare la dimensione massima del vettore:

del vettore: max_M max_M =100 =100

Array di reali di dimensione pari a Array di reali di dimensione pari a max_M max_M

Variabile (int) per indicare il numero di valori di Variabile (int) per indicare il numero di valori di temperature effettivamente letti da input:

temperature effettivamente letti da input:

M M ( ( 0 < M <= max_M 0 < M <= max_M ) )

Una variabile ausiliaria (int) da usare come contatore Una variabile ausiliaria (int) da usare come contatore della scansione del vettore

della scansione del vettore

Infine, una variabile ausiliaria reale con il doppio ruolo Infine, una variabile ausiliaria reale con il doppio ruolo di accumulatore delle somme parziali e contenitore

di accumulatore delle somme parziali e contenitore della media

della media

(54)

Programma Programma

media_temp.cc media_temp.cc

(55)

Oggetto astratto Oggetto astratto

Le due implementazioni di un vettore dinamico viste Le due implementazioni di un vettore dinamico viste finora sono due esempi di implementazione di un

finora sono due esempi di implementazione di un oggetto astratto

oggetto astratto, il vettore dinamico, mediante uno o , il vettore dinamico, mediante uno o più oggetti concreti

più oggetti concreti

nel primo caso un array più un contatore del numero nel primo caso un array più un contatore del numero di elementi validi

di elementi validi

nel secondo caso un array nel secondo caso un array

Cogliamo l'occasione di questo esempio per Cogliamo l'occasione di questo esempio per evidenziare in modo concreto il

evidenziare in modo concreto il processo di astrazione: processo di astrazione:

l'oggetto astratto vettore dinamico astrae dai l'oggetto astratto vettore dinamico astrae dai dettagli su come è implementato

dettagli su come è implementato

sia che sia implementato con un array più un sia che sia implementato con un array più un

contatore, o che sia implementato con solo un array,

contatore, o che sia implementato con solo un array,

l'oggetto astratto vettore dinamico ha comunque le

l'oggetto astratto vettore dinamico ha comunque le

(56)

Array e vettori astratti Array e vettori astratti

Riassumendo, mediante un array si può definire un Riassumendo, mediante un array si può definire un oggetto astratto vettore, di cui si realizzano:

oggetto astratto vettore, di cui si realizzano:

lunghezza variabile lunghezza variabile

mediante contatore numero di elementi validi o mediante contatore numero di elementi validi o mediante elemento terminatore

mediante elemento terminatore

assegnamento assegnamento

mediante per esempio una funzione in cui si mediante per esempio una funzione in cui si assegnano gli elementi uno ad uno

assegnano gli elementi uno ad uno

Nella libreria standard di oggetti del C++ esiste anche Nella libreria standard di oggetti del C++ esiste anche l'oggetto astratto di tipo vettore (chiamato

l'oggetto astratto di tipo vettore (chiamato vector vector) che ) che fornisce già queste e molte altre operazioni

fornisce già queste e molte altre operazioni

Non useremo tale oggetto astratto in questo corso, Non useremo tale oggetto astratto in questo corso, ma implementeremo i vettori da noi, con le due

ma implementeremo i vettori da noi, con le due tecniche appena viste

tecniche appena viste

(57)

Contenuto lezione Contenuto lezione

Array statici Array statici

Passaggio alle funzioni Passaggio alle funzioni

Vettori dinamici Vettori dinamici

Accesso fuori dall'array Accesso fuori dall'array

Range-based for Range-based for

Array circolari Array circolari

Code Code

(58)

Esercizio Esercizio

E se volessimo realizzare una variante del precedente E se volessimo realizzare una variante del precedente esercizio in cui l'utente non comunica neanche il

esercizio in cui l'utente non comunica neanche il numero

numero M M di temperature da memorizzare, ma bensì di temperature da memorizzare, ma bensì segnala la fine della lettura inserendo un valore

segnala la fine della lettura inserendo un valore negativo?

negativo?

Supponiamo inoltre di implementare il vettore Supponiamo inoltre di implementare il vettore utilizzando un valore terminatore

utilizzando un valore terminatore

Attenzione a cosa accade nel caso in cui si Attenzione a cosa accade nel caso in cui si inseriscono

inseriscono max_M max_M elementi !!! elementi !!!

Pensateci un po' sopra, dopodiché valutiamo la Pensateci un po' sopra, dopodiché valutiamo la soluzione proposta nella prossima slide

soluzione proposta nella prossima slide

(59)

Proposta programma Proposta programma

main() main() { {

const int max_M = 100 ; double vett_temper[max_M] ; const int max_M = 100 ; double vett_temper[max_M] ;

for (int i = 0; i < max_M; i++) {for (int i = 0; i < max_M; i++) { cin>>vett_temper[i]; cin>>vett_temper[i];

if (vett_temper[i] < 0) {if (vett_temper[i] < 0) {

vett_temper[i] = -1 ; // inseriamo il terminatorevett_temper[i] = -1 ; // inseriamo il terminatore

break ;break ; } }

}}

double media = 0. ;double media = 0. ;

// in uscita dal ciclo conterra' il num di valori letti// in uscita dal ciclo conterra' il num di valori letti int num_val_letti ; int num_val_letti ;

for (num_val_letti = 0; for (num_val_letti = 0; vett_temper[num_val_letti] >= 0vett_temper[num_val_letti] >= 0; num_val_letti++); num_val_letti++) media += vett_temper[num_val_letti]; media += vett_temper[num_val_letti];

media /= num_val_letti ; media /= num_val_letti ;

cout<<"Media: "<<media<<endl<<endl ; cout<<"Media: "<<media<<endl<<endl ;

......

IL PROGRAMMA E' CORRETTO?

(commento nella prossima slide)

(60)

Commento aggiuntivo Commento aggiuntivo

main() main() { {

const int max_M = 100 ; double vett_temper[max_M] ; const int max_M = 100 ; double vett_temper[max_M] ;

for (int i = 0; i < max_M; i++) {for (int i = 0; i < max_M; i++) { cin>>vett_temper[i]; cin>>vett_temper[i];

if (vett_temper[i] < 0) {if (vett_temper[i] < 0) {

vett_temper[i] = -1 ; // inseriamo il terminatorevett_temper[i] = -1 ; // inseriamo il terminatore

break ;break ; } }

} // nota: se inseriamo max_M valori non vi sarà alcun terminatore!} // nota: se inseriamo max_M valori non vi sarà alcun terminatore!

double media = 0. ;double media = 0. ;

// in uscita dal ciclo conterra' il num di valori letti// in uscita dal ciclo conterra' il num di valori letti int num_val_letti ; int num_val_letti ;

for (num_val_letti = 0; for (num_val_letti = 0; vett_temper[num_val_letti] >= 0vett_temper[num_val_letti] >= 0; num_val_letti++); num_val_letti++) media += vett_temper[num_val_letti]; media += vett_temper[num_val_letti];

media /= num_val_letti ; media /= num_val_letti ;

cout<<"Media: "<<media<<endl<<endl ; cout<<"Media: "<<media<<endl<<endl ;

......

}}

IL PROGRAMMA

E' CORRETTO?

(61)

Risposta Risposta

Errore: Errore:

Non si controlla di essere sempre dentro l'array Non si controlla di essere sempre dentro l'array nella fase di calcolo della somma delle

nella fase di calcolo della somma delle temperature

temperature

Se nell'array fossero stati inseriti Se nell'array fossero stati inseriti max_M max_M elementi, elementi, allora

allora non vi sarebbe alcun terminatore non vi sarebbe alcun terminatore, e si , e si rischierebbe poi di leggere fuori dall'array

rischierebbe poi di leggere fuori dall'array

Errore logico Errore logico

Possibile terminazione forzata del programma, Possibile terminazione forzata del programma, oppure lettura di valori casuali

oppure lettura di valori casuali

Come mai terminazione forzata o lettura di Come mai terminazione forzata o lettura di valori casuali?

valori casuali?

La risposta è nelle seguenti slide La risposta è nelle seguenti slide

(62)

Contenuto memoria 1/3 Contenuto memoria 1/3

Sappiamo già che la memoria di un programma è utilizzata Sappiamo già che la memoria di un programma è utilizzata per memorizzare le variabili e le costanti con nome definite per memorizzare le variabili e le costanti con nome definite nel programma (e quelle allocate dinamicamente, come

nel programma (e quelle allocate dinamicamente, come vedremo nelle prossime lezioni)

vedremo nelle prossime lezioni)

Ma non solo, la memoria contiene anche delle informazioni Ma non solo, la memoria contiene anche delle informazioni non manipolabili direttamente dal programmatore

non manipolabili direttamente dal programmatore

Codice delle funzioni (tradotto in linguaggio macchina) Codice delle funzioni (tradotto in linguaggio macchina)

Codice e strutture dati aggiuntivi, di supporto Codice e strutture dati aggiuntivi, di supporto all'esecuzione del programma stesso

all'esecuzione del programma stesso

In merito alle parti aggiuntive, senza entrare nei dettagli In merito alle parti aggiuntive, senza entrare nei dettagli consideriamo solo che, quando il compilatore traduce il consideriamo solo che, quando il compilatore traduce il programma in linguaggio macchina, non si limita a creare programma in linguaggio macchina, non si limita a creare solo il codice macchina che esegue ciascuna delle istruzioni solo il codice macchina che esegue ciascuna delle istruzioni esplicitamente inserite nel codice sorgente

esplicitamente inserite nel codice sorgente

(63)

Contenuto memoria 2/3 Contenuto memoria 2/3

Il compilatore di fatto aggiunge codice ulteriore, di cui Il compilatore di fatto aggiunge codice ulteriore, di cui vedremo qualche dettaglio in alcune delle prossime vedremo qualche dettaglio in alcune delle prossime lezioni

lezioni

Tale codice effettua operazioni di supporto Tale codice effettua operazioni di supporto

all'esecuzione del programma stesso (e che non sono all'esecuzione del programma stesso (e che non sono e non possono essere esplicitamente inserite nel

e non possono essere esplicitamente inserite nel codice sorgente in base alle regole del linguaggio) codice sorgente in base alle regole del linguaggio)

Inizializzare i parametri formali con i parametri Inizializzare i parametri formali con i parametri attuali all'atto della chiamata di una funzione attuali all'atto della chiamata di una funzione

Allocare spazio in memoria quando viene eseguita Allocare spazio in memoria quando viene eseguita la definizione di una variabile/costante con nome la definizione di una variabile/costante con nome

Deallocare spazio dalla memoria quando finisce il Deallocare spazio dalla memoria quando finisce il

tempo di vita di una variabile/costante con nome

tempo di vita di una variabile/costante con nome

(64)

Contenuto memoria 3/3 Contenuto memoria 3/3

Per realizzare alcune di queste operazioni il Per realizzare alcune di queste operazioni il

compilatore inserisce nella versione in linguaggio compilatore inserisce nella versione in linguaggio

macchina del programma le strutture dati aggiuntive macchina del programma le strutture dati aggiuntive precedentemente menzionate

precedentemente menzionate

In definitiva, se si accede a celle di memoria al di fuori In definitiva, se si accede a celle di memoria al di fuori di quelle dedicate ad oggetti correttamente definiti, si di quelle dedicate ad oggetti correttamente definiti, si rischia di accedere a

rischia di accedere a

Porzioni della memoria non ancora utilizzate per Porzioni della memoria non ancora utilizzate per alcuno scopo, tipicamente contenenti valori casuali alcuno scopo, tipicamente contenenti valori casuali

Memoria occupata da altri oggetti definiti dal Memoria occupata da altri oggetti definiti dal programmatore

programmatore

Memoria occupata da codice o strutture dati Memoria occupata da codice o strutture dati aggiunte dal compilatore

aggiunte dal compilatore

(65)

Array in memoria Array in memoria

Memoria Memoria del

del

programma programma Array

Array

int a[3] ; int a[3] ;

?

??

??

??

??

??

??

?

?

??

??

??

??

??

??

?

???

??

??

??

??

?

(66)

Errore gestione della memoria Errore gestione della memoria

In ogni caso, accedere al di fuori delle celle di In ogni caso, accedere al di fuori delle celle di

memoria dedicate ad oggetti correttamente definiti è memoria dedicate ad oggetti correttamente definiti è un un errore di gestione della memoria errore di gestione della memoria

Se l'accesso avviene in lettura si leggono di fatto Se l'accesso avviene in lettura si leggono di fatto valori casuali

valori casuali

Se l'accesso avviene in scrittura si rischia la Se l'accesso avviene in scrittura si rischia la cosiddetta

cosiddetta corruzione della memoria corruzione della memoria del del

programma, ossia la sovrascrittura del contenuto programma, ossia la sovrascrittura del contenuto di altri oggetti definiti nel programma o delle

di altri oggetti definiti nel programma o delle strutture dati aggiuntive precedentemente strutture dati aggiuntive precedentemente menzionate

menzionate

Se si corrompono le strutture dati aggiuntive il Se si corrompono le strutture dati aggiuntive il comportamento del programma diventa

comportamento del programma diventa impredicibile

impredicibile

(67)

Diritti di accesso alla memoria Diritti di accesso alla memoria

I processori moderni permettono di suddividere la I processori moderni permettono di suddividere la memoria in porzioni distinte e stabilire quali

memoria in porzioni distinte e stabilire quali

operazioni si possono o non si possono effettuare su operazioni si possono o non si possono effettuare su certe porzioni della memoria, nonché quando si ha certe porzioni della memoria, nonché quando si ha diritto di effettuarle

diritto di effettuarle

Ad esempio, il Ad esempio, il codice di un programma codice di un programma viene viene tipicamente collocato in una porzione della tipicamente collocato in una porzione della

memoria del programma stesso che è etichettata memoria del programma stesso che è etichettata come

come non modificabile non modificabile

Alcune porzioni della memoria gestite direttamente Alcune porzioni della memoria gestite direttamente dal sistema operativo possono non essere

dal sistema operativo possono non essere accessibili,

accessibili, neanche in lettura neanche in lettura , dal programma , dal programma

(68)

Eccezione di accesso illegale Eccezione di accesso illegale

Se un programma tenta di scrivere/leggere in una Se un programma tenta di scrivere/leggere in una porzione della memoria in cui non ha il diritto di porzione della memoria in cui non ha il diritto di effettuare tale operazione, viene tipicamente effettuare tale operazione, viene tipicamente generata dal processore una

generata dal processore una eccezione hardware di eccezione hardware di accesso illegale alla memoria

accesso illegale alla memoria

Le eccezioni hardware sono un meccanismo del Le eccezioni hardware sono un meccanismo del processore che fa interrompere l'esecuzione

processore che fa interrompere l'esecuzione

dell'istruzione in corso e saltare immediatamente dell'istruzione in corso e saltare immediatamente all'esecuzione di codice speciale dedicato alla

all'esecuzione di codice speciale dedicato alla gestione dell'eccezione

gestione dell'eccezione

Tipicamente il codice di gestione delle eccezioni Tipicamente il codice di gestione delle eccezioni hardware di accesso illegale alla memoria

hardware di accesso illegale alla memoria termina termina immediatamente il processo

immediatamente il processo (che quindi fallisce) (che quindi fallisce)

(69)

Segmentation Fault Segmentation Fault

In ambiente UNIX l'eccezione scatenata da un accesso In ambiente UNIX l'eccezione scatenata da un accesso illegale alla memoria è tipicamente chiamata

illegale alla memoria è tipicamente chiamata Segmentation Fault

Segmentation Fault

Come sappiamo, le eccezioni sono poi gestite da Come sappiamo, le eccezioni sono poi gestite da

codice dedicato e stabilito dal sistema operativo nella codice dedicato e stabilito dal sistema operativo nella fase di avvio

fase di avvio

Il codice di gestione dell'eccezione Il codice di gestione dell'eccezione Segmentation Fault Segmentation Fault tipicamente termina forzatamente il processo che ha tipicamente termina forzatamente il processo che ha generato l'eccezione

generato l'eccezione

(70)

Accesso fuori da un array Accesso fuori da un array

In conclusione, accedere fuori da un array è un errore In conclusione, accedere fuori da un array è un errore sotto due punti di vista:

sotto due punti di vista:

Errore logico Errore logico

Non ha senso accedere ad un elemento al di Non ha senso accedere ad un elemento al di fuori dell'array stesso

fuori dell'array stesso

Errore di gestione della memoria Errore di gestione della memoria

Corruzione della memoria nel caso di accesso in Corruzione della memoria nel caso di accesso in scrittura

scrittura

(71)

Versione corretta Versione corretta

Tornando all'esercizio, la versione corretta del Tornando all'esercizio, la versione corretta del programma è in

programma è in media_temp2.cc media_temp2.cc nella cartella nella cartella dell'ottava esercitazione

dell'ottava esercitazione

Videoregistrazione: Videoregistrazione:

https://drive.google.com/file/d/1VMm6PMuTm0

https://drive.google.com/file/d/1VMm6PMuTm0

YFY-erlQC2mVXYCuTzdDLB/view?usp=sharing

YFY-erlQC2mVXYCuTzdDLB/view?usp=sharing

(72)

Domanda Domanda

Dato un vettore dinamico di interi Dato un vettore dinamico di interi rappresentato mediante

rappresentato mediante

un un array array

un contatore un contatore cont cont del numero di elementi del numero di elementi

A quanto è uguale in ogni istante il numero di A quanto è uguale in ogni istante il numero di elementi del vettore dinamico?

elementi del vettore dinamico?

(73)

Risposta ed altra domanda Risposta ed altra domanda

E' uguale ovviamente a E' uguale ovviamente a cont cont

Se, in un certo istante si volesse inserire un Se, in un certo istante si volesse inserire un nuovo elemento in fondo al vettore

nuovo elemento in fondo al vettore

A cosa sarebbe uguale l'indice dell'elemento A cosa sarebbe uguale l'indice dell'elemento dell'

dell'array array in cui memorizzare il nuovo in cui memorizzare il nuovo elemento?

elemento?

Cosa bisognerebbe fare dopo aver aggiunto il Cosa bisognerebbe fare dopo aver aggiunto il nuovo elemento?

nuovo elemento?

(74)

Risposta Risposta

L'indice del nuovo elemento sarebbe uguale a L'indice del nuovo elemento sarebbe uguale a cont

cont

Dopo aver inserito il nuovo elemento Dopo aver inserito il nuovo elemento cont cont va va incrementato di 1

incrementato di 1

(75)

Doppia funzione contatore Doppia funzione contatore

Il contatore del numero di elementi ha quindi Il contatore del numero di elementi ha quindi una doppia funzione

una doppia funzione

Indica il numero di elementi attualmente Indica il numero di elementi attualmente presenti nel vettore dinamico

presenti nel vettore dinamico

Fornisce l'indice dell'elemento dell' Fornisce l'indice dell'elemento dell'array array in in cui memorizzare il nuovo elemento nel caso cui memorizzare il nuovo elemento nel caso di inserimento in coda

di inserimento in coda

Riferimenti

Documenti correlati

99 Ora adempimento come ora l'esame è formale uno stanco e autoreferenziale: la sintesi della scuola attuale (obbligo e burocrazia)?. di

In tema di concorso esterno in associazione di tipo mafioso, ai fini della configurabilità del dolo, occorre che l'agente, pur in assenza dell'&#34;affectio societatis&#34; e,

[r]

Dati un insieme A che contiene n elementi, un insieme B che contiene m elementi, ed una relazione R da A a B, la relazione R si può rappresentare con una matrice booleana nxm

Si consideri una lista di numeri interi Lista implementata come lista doppiamente puntata non circolare implementata utilizzando la seguente struttura.. struct

La norma impugnata, difatti, afferendo all’organizzazione del servizio di continuità assistenziale, dovrebbe essere ricondotta, ad avviso della

1.1.– Espone il ricorrente che l’art. 1, comma 1, della citata legge reg. 4 del 2017 prevede: «Ferme restando le competenze attribuite al Commissario ad acta per la prosecuzione

Il Presidente del Consiglio dei ministri evidenzia, al riguardo, che la costante giurisprudenza della Corte costituzionale afferma che la potestà legislativa regionale nella