vuoi
o PayPal
tutte le volte che vuoi
DESCRIVERE LE PRINCIPALI DIFFERENZE TRA ARRAY E COLLEZIONI IN JAVA
Un array è una collezione di elementi dello stesso tipo, ognuna delle quali è accessibile specificando l'indice in cui si trova. Infatti, è possibile accedere ad uno di questi elementi specificando l'indice tra parentesi quadre. In Java gli indici di un array partono da zero e non da uno. Il numero di elementi dell'array hai detto lunghezza (length), dimensione (size) o capacità (capacity) dell'array. La dichiarazione e creazione di un array avviene mediante l'operazione new. Una collezione (o contenitore) consente di organizzare gestire un gruppo di oggetti, in quanto è un insieme di variabili che possono trovarsi in qualsiasi ordine, quindi non possiedono un accesso posizionale, e che possono anche non essere necessariamente dello stesso tipo.
DISCUTERE IL CONCETTO DI CLASSE ASTRATTA
Una classe astratta è una classe che presenta alcuni metodi non
completamente definiti. Se una classe è astratta non possono essere creati oggetti per quella classe: può essere usata solo come una classe base per derivare altre classi, dette classi derivate. Per questa ragione una classe astratta è detta anche classe base astratta.
Un metodo viene definito astratto se non sei in grado di fornire la definizione del suo corpo o se si vuole delegare la sua definizione alle classi derivate. Definire un metodo astratto significa posticipare la sua definizione al momento in cui si saprà effettivamente come definirla. È possibile inserire invocazioni di un metodo astratto all'interno di altri metodi. La sintassi per definire un metodo astratto prevede di far precedere all'intestazione del metodo la parola chiave abstract, di porre un punto e virgola alla fine dell'intestazione e di omettere il corpo del metodo.
Una classe astratta può avere un numero qualsiasi di metodi astratti oltre eventuali metodi non astratti.
Se la classe definisse tutti i metodi, ma si vuole impedire la creazione di oggetti di quella classe, basta definire la classe come astratta. Se una classe derivata non è in grado di definire uno o più metodi della classe base astratta, anche lei sarà una classe astratta e dovrà includere nella propria definizione la parola chiave abstract.
DESCRIVERE L'ARCHITETTURA DI UN ELABORATORE ELETTRONICO: il calcolatore di Von Neumann è formato da tre sottosistemi interconnessi con dei collegamenti chiamati bus. Questi tre sottosistemi sono:
- SOTTOSISTEMA DI MEMORIZZAZIONE: ossia una memoria contenente istruzioni e dati;
- SOTTOSISTEMA DI ELABORAZIONE: ossia il CPU, che elabora i dati e le istruzioni provenienti dalla memoria;
- SOTTOSISTEMA DI INTERFACCIA: fa si che le istruzioni vengano caricate nella memoria.
Il bus è una linea alla quale sono contemporaneamente connesse riunita del calcolatore di chi consente trasferimento di dati tra tali unità.
Il CPU, che deve gestire l'accesso al bus impedendo alle unità periferiche la possibilità di accedervi autonomamente, ha il compito di supervisionare ogni trasferimento di dati attraverso il bus, identificando, mediante il loro indirizzo, la sorgente e la destinazione dei dati e sincronizzando con segnali di controllo i dispositivi che devono colloquiare. Il bus può essere suddiviso funzionalmente in tre componenti:- Il bus dati, utilizzato per trasferire i dati, tipicamente tra memoria e CPU ma anche tra CPU e interfacce di ingresso/uscita;
- Il bus indirizzi, che identifica la posizione delle celle di memoria in cui la CPU va a scrivere o leggere;
- Il bus di controllo virgola in cui transitano i segnali di controllo che consentono di volta in volta di selezionare l'unità coinvolta in un trasferimento di dati (sorgente e destinatario), di definire la direzione dello scambio (lettura o scrittura) e in generale di coordinare il.
ILLUSTRARE I COMPONENTI INTERNI DI UNA CPU: la CPU, più semplicemente chiamata processore, è il dispositivo interno che esegue le istruzioni di un programma. Il processore è in grado di eseguire solo istruzioni molto semplici, come spostare i numeri o altri dati presenti in memoria e compiere alcune operazioni aritmetiche di base. Una CPU in genere è formata da due parti principali:
- DATA PATH: che comprende gli ALU, ossia dispositivi in grado di elaborare dati, e i registri, ossia unità di memorizzazione temporanea in cui i dati da elaborare e i risultati della lavorazione vengono conservati per renderne più agevole la gestione;
- UNITÀ DI CONTROLLO: che coordina le operazioni di tutto il processore, quindi anche quelle del data path; in particolare regola il flusso dei dati e indica quali registri debbano essere collegati agli ingressi all'uscita dell'ALU, invia all'ALU un codice dell'operazione da eseguire.
Ricevere indicazioni sull'esito dell'operazione appena eseguita dall'Alu; uno dei compiti principali dell'unità di controllo è di provvedere al prelievo della memoria delle istruzioni da eseguire (l'indirizzo dell'istruzione corrente viene conservato all'interno di un apposito registro, il Program Counter):
- Inizialmente il contenuto del Program Counter viene trasferito sul bus indirizzi e trasmesso alla memoria, indicando contemporaneamente sul bus di controllo che si tratta di un'operazione di lettura.
- Promemoria: leggi il contenuto della cella che si trova all'indirizzo specificato e lo trasferisci sul bus dati.
- All'interno della CPU, il contenuto del bus dati viene copiato nel registro istruzioni corrente.
- Nel frattempo, il contenuto del Program Counter viene aggiornato come necessario, in modo che nella fase successiva si possa prelevare l'istruzione seguente.
Il ciclo di funzionamento della CPU si articola in sei fasi:
- ...
ILLUSTRARE IL CICLO DI ESECUZIONE DI UNA ISTRUZIONE DA PARTE DELLA CPU:
- LETTURA (fetch): acquisizione dalla memoria di una delle istruzioni del programma;
- DECODIFICA (decode): riconoscimento dell'istruzione tra quelle che compongono l'insieme delle istruzioni e identificazione delle operazioni che devono essere svolte per completarne l'esecuzione;
- ESECUZIONE (execute): effettuazione delle operazioni corrispondenti all'istruzione, incluso il recupero dalla memoria.
degli operandi o l’eventuale modifica della successione originariadelle istruzioni.
DESCRIVERE LA GERARCHIA DI MEMORIE ALL’INTERNO DI UN ELABORATORE :l’hardware (MMU) e il sistema operativo gestiscono un insieme di memorie organizzategerarchicamente che contengono repliche dei dati in modo che la CPU trovi ad ogni accesso il datoutile nella memoria più veloce possibile. La memoria del calcolatore è organizzatagerarchicamente in modo da comprendere poche memorie a bassa capacità ed alti costi ma moltoveloci e molta memoria più lenta e di capacità maggiore. Nella gerarchia di memoria i dati sonotemporaneamente trasferiti in memorie sempre più veloci. L’obiettivo è di organizzare le politichedi piazzamento ed accesso dei dati in modo tale da avere i dati più frequentemente usati, o ingenerale più “utili” virtualmente sempre nelle memorie più veloci. Distinguiamo tre tipi dimemoria:-
MEMORIA INTERNA DELLA CPU: è costituita dai registri ed è caratterizzata da alta velocità (comparabile con quella del processore) e limitate dimensioni;
MEMORIA CENTRALE O PRINCIPALE: è caratterizzata da dimensioni molto maggiori della memoria interna alla CPU ma tempi di accesso più elevati;
MEMORIE SECONDARIE: in un calcolatore esistono diverse memorie secondarie (o memorie di massa) ad alta capacità, bassi costi e non volatili.
La memoria di un computer conserva i dati che il computer deve elaborare e i risultati dei calcoli intermedi effettuati. Esistono fondamentalmente due tipi di memoria:
- la memoria principale: conserva il programma che attualmente è in esecuzione e gran parte dei dati che il programma stesso sta utilizzando; le informazioni immagazzinate nella memoria principale sono volatili, cioè sono cancellate quando il computer viene spento; la memoria principale del computer è costituita da un lungo elenco di
byte numerati, ognuno con un proprio indirizzo; un byte è la più piccola unità di memoria indirizzabile; un singolo dato può essere memorizzato in uno di questi byte; per recuperare successivamente tale dato, il computer utilizza l'indirizzo del byte in cui era stato memorizzato; un byte contiene 8 cifre ciascuna delle quali può assumere il valore 0 oppure il valore 1; ciascuna di queste cifre detta cifra binaria o più comunemente bit; un byte contiene quindi 8 bit di memoria; quando il computer ha necessità di memorizzare un dato che non può essere contenuto in un singolo byte, utilizza più byte adiacenti, e l'indirizzo del primo byte viene utilizzato come indirizzo dell'intera area di memoria.
la memoria secondaria o ausiliaria: i dati contenuti in questa memoria persistono anche a computer spento; la memoria ausiliaria è suddivisa in byte, ma questi sono raggruppati in unità più grandi
un algoritmo: per studiare la complessità spaziale di un algoritmo, è necessario analizzare il consumo di memoria durante l'esecuzione del programma. Questo può essere fatto calcolando il numero di variabili utilizzate, la dimensione dei dati memorizzati in esse e la quantità di memoria richiesta per le strutture dati utilizzate dall'algoritmo. Inoltre, è importante considerare anche la memoria aggiuntiva richiesta durante l'esecuzione, come ad esempio la memoria utilizzata per la gestione dello stack o per l'allocazione dinamica della memoria. Per calcolare la complessità spaziale di un algoritmo, si può utilizzare la notazione O-grande, che indica il limite superiore del consumo di memoria in relazione alla dimensione dell'input. Ad esempio, se l'algoritmo richiede una quantità di memoria proporzionale al quadrato della dimensione dell'input, si può dire che ha una complessità spaziale di O(n^2), dove n rappresenta la dimensione dell'input. Inoltre, è possibile utilizzare strumenti di profiling per misurare il consumo effettivo di memoria durante l'esecuzione di un programma e identificare eventuali problemi di allocazione o di utilizzo inefficiente della memoria. In conclusione, lo studio della complessità spaziale di un algoritmo è fondamentale per valutare l'efficienza e le risorse richieste durante la sua esecuzione, consentendo di identificare eventuali problemi di consumo e di ottimizzare l'utilizzo della memoria.o. La complessità spaziale può essere misurata in termini di spazio occupato da variabili, strutture dati e altre risorse utilizzate durante l'esecuzione dell'algoritmo. Per calcolare la complessità spaziale di un algoritmo, è necessario considerare il numero di variabili utilizzate e la dimensione di ciascuna variabile. Inoltre, bisogna considerare anche lo spazio occupato dalle strutture dati utilizzate, come array, liste, pile, code, alberi, grafi, ecc. La complessità spaziale può essere espressa in diverse unità di misura, come byte, kilobyte, megabyte, ecc. In genere, si cerca di minimizzare la complessità spaziale di un algoritmo, in modo da utilizzare meno memoria possibile. Un esempio di calcolo della complessità spaziale potrebbe essere il seguente: ``` int n = 10; // dimensione dell'array int[] array = new int[n]; // array di interi di dimensione n int sum = 0; // variabile per la somma degli elementi dell'array for (int i = 0; i < n; i++) { array[i] = i; // assegna ad ogni elemento dell'array il valore di i sum += array[i]; // calcola la somma degli elementi dell'array } System.out.println("La somma degli elementi dell'array è: " + sum); ``` In questo esempio, la complessità spaziale dipende dalla dimensione dell'array, che occupa uno spazio di memoria pari a n * sizeof(int) byte. Inoltre, sono presenti altre variabili, come n, sum e i, che occupano uno spazio di memoria pari a sizeof(int) byte ciascuna. Quindi, la complessità spaziale totale di questo algoritmo può essere calcolata come: Complessità spaziale = n * sizeof(int) + 3 * sizeof(int) byte Dove n è la dimensione dell'array e sizeof(int) rappresenta la dimensione in byte di un intero.