Sei sulla pagina 1di 12

INFORMATICA

Deriva dal francese INFORMATIQUE = INFORMAT(ION) + (AUTOMAT)IQUE.


L’informatica è una scienza che si occupa del trattamento dell’informazione, al fine
di poter risolvere automaticamente problemi. Tutti i dati vengono: rappresentati
nel computer, organizzati nel computer per poterli usare subito e infine vengono
eseguite sequenze di istruzioni per il calcolatore per risolvere velocemente
problemi.
Il calcolatore è una macchina che memorizza, elabora e distribuisce l’informazione.
Esso esegue una serie di istruzioni al fine di risolvere un determinato problema.
Problemi di interesse sono quelli per i quali è possibile una formalizzazione
matematica: essi possono essere risolti attraverso algoritmi, ovvero l’applicazione
sistematica di regole operative per ottenere i risultati attesi a partire dai dati
disponibili. Dopo aver tradotto l’algoritmo in un programma si puo’ affidare
l’applicazione delle regole operative ad un esecutore automatico.
Un programma è un insieme di istruzioni che possono essere eseguite da un
calcolatore per realizzare una funzionalità, cioè per risolvere un problema.
Il calcolatore è una macchina programmabile, ovvero riesce ad eseguire programmi i
quali consentono alla macchina di far svolgere delle operazioni e offre all’utente degli
strumenti utili per vari scopi. (def. Utente) Esso è un sistema, ovvero un oggetto
costituito da vari componenti che interagiscono tra di loro per ottenere un risultato.
(def. Funzionale)
SOFTWARE
Il software è l’insieme di programmi che permette all’hardware di svolgere compiti.
Esso si divide in:
Software di base: è l’insieme di quei programmi utili per vari scopi; principalmente il
sistema operativo che gestisce le risorse del computer, semplifica l’utilizzo del
computer e lo virtualizza, cioè astrae le funzionalità del computer e le rende
disponibili per l’utente, il quale non deve conoscere il funzionamento dell’hardware.
Software applicativo: mostra il calcolatore come una macchina virtuale e si
appoggia al software di base (raramente all’hardware).

1
HARDWARE
L’hardware (hard-ware) è la struttura fisica del calcolatore, costituito da componenti
elettrici, meccanici ecc…
La macchina di Von Neumann è molto importante: essa rappresenta un modello
semplificato del funzionamento di un calcolatore che ancora oggi ne rappresenta la
struttura. Lo scopo del calcolatore è trasformare dei dati (informazione elementare)
in INPUT in dati di OUTPUT attraverso dei programmi, eseguiti da un agente e
mantenuti in una memoria. L’informazione rappresenta l’insieme di dati.
I componenti principali sono: memoria, memorizza e fornisce l’accesso ai dati e
programmi; CPU, esegue le istruzioni per elaborare dati, controlla e coordina il
funzionamento delle altre parti; interfacce I/O, componenti di collegamento con
periferiche del calcolatore; bus, svolge le funzionalità di trasferimento di dati e
informazioni tra i componenti. (mouse, tastiera non fanno parte di questo modello)
MEMORIA CENTRALE
Essa è una memoria volatile che permette di memorizzare in modo temporaneo dati
e programmi. Permette le operazioni di scrittura e lettura. Puo’ essere acceduta
direttamente dal processore (grazie al bus. RAM (Random Access Memory), ovvero
dati e programmi non vengono memorizzati secondo un preciso ordine. La memoria è
costituita da uno o più chip i quali contengono un numero elevato di bit.
I bit della memoria centrale vengono raggruppati in celle: le quali hanno una
dimensione fissa, un valore (la sequenza di bit) e un indirizzo il quale permette al
processore di riferirsi a quella determinata cella. In lettura il processore invia sul bus
indirizzi l’indirizzo della cella da leggere e sul bus dati viene restituito il valore della
cella richiesta. In scrittura il processore invia sul bus indirizzi l’indirizzo su cui
scrivere e sul bus dati il valore da scrivere.
BUS
Si occupa del trasferimento di dati (bus dati), di indirizzi (bus indirizzi) e di
informazioni di controllo (bus di controllo) fra i componenti del calcolatore, i quali
sono collegati ad esso.
PROCESSORE
Chiamato anche CPU è il responsabile dell’elaborazione dei dati e del
coordinamento fra i componenti. Abbiamo l’unità aritmetico-logica (ALU), la quale
esegue le istruzioni e l’unità di controllo (CU), responsabile del coordinamento fra i
componenti. La CPU puo’ essere costituita da diversi core. Essa è fisicamente un chip,
costituito da transistor, diodi ecc.. collegati tra di loro tramite la tecnologia VLSI.
L’elaborazione delle informazioni avviene grazie all’esecuzione di istruzioni (in
linguaggio macchina).
Il processore esegue le istruzioni di un programma seguendo tre frasi principali: fetch
(lettura), dove viene letta la prossima istruzione da eseguire; decode (decodifica)
dove viene determinato il tipo della prossima istruzione da eseguire; execute, dove
vengono svolte tutte le azioni necessarie per l’esecuzione del programma.

2
FETCH
1. La CU legge dal registro PC (program counter) l’indirizzo della prossima
istruzione da eseguire, memorizzato nel PC.
2. Il contenuto di PC viene copiato in MAR (memory address register) che è
collegato con il bus indirizzi.
3. La CU invia una richiesta di lettura alla memoria tramite il bus di controllo.
4. La memoria invia l’istruzione tramite il bus dati.
5. L’istruzione viene memorizzata nel MDR (memory data register) il quale
memorizza il dato o l’istruzione che è stato acceduto.
6. Il contenuto di MDR viene copiato in IR (instruction register) il quale
memorizza l’istruzione che deve essere eseguita.
7. Il contenuto di PC viene incrementato così che faccia riferimento alla prossima
istruzione del programma.
DECODE
La CU decodifica l’istruzione presente in IR, cioè determina il tipo e quanti operandi
ha; inoltre recupera questi operandi, inviando la richiesta sul bus di controllo e
ricevendo i dati sul bus dati. I valori di tali operandi vengono salvati nei registri ALU.
EXECUTE
La CU si occupa della coordinazione dei componenti coinvolti nell’operazione. Per
l’elaborazione di un dato viene coinvolta la ALU; per la lettura e scrittura di un dato
in memoria vengono coinvolti la memoria e i bus; per la lettura e scrittura di un dato
verso una periferica viene coinvolta l’interfaccia corrispondente e i bus.
Successivamente l’esito dell’istruzione viene scritto nel registro PSW. (program status
word)
CLOCK
Le attività del processore vengono eseguite seguendo un clock, cioè un segnale che
sincronizza le operazioni. Fondamentale è la frequenza, il numero di segnali che
vengono inviati ogni secondo calcolata in gigahertz. (qualche miliardo di segnali al
secondo) Il tempo tra ogni segnale è l’inverso della frequenza (Tp) e deve essere
maggiore del tempo che impiegano i componenti della CPU ad eseguire le operazioni e
coincide con il tempo che impiega la CPU ad eseguire un’operazione.
MEMORIA CACHE
Il processore impiega molto meno tempo rispetto alla memoria, e quando richiede alla
memoria di leggere o scrivere un dato è obbligato ad aspettare diversi clock. Il
problema viene risolto utilizzando un’altra memoria più veloce della memoria
centrale, chiamata memoria cache. In essa vengono trasferite porzioni della memoria
centrale, così che il processore possa interagire direttamente con la memoria cache.
Essa fa riferimento a due principi: località temporale, cioè la cache mantiene i dati
usati recentemente; località spaziale, intere porzioni di memoria centrale sono
trasferite in cache.

3
MEMORIE DI MASSA
Sono dette anche secondarie o ausiliarie. Sono più capienti, permanenti, più
economiche e più lente. Le caratteristiche più importanti sono: la capacità, cioè la
quantità di informazioni che puo’ contenere; il tempo di accesso, la velocità di
trasferimento e il costo.
HARD DISK
Viene chiamato anche disco fisso o disco rigido, ed è costituito da un insieme di
dischi magnetici che ruotano intorno ad un asse. La superficie di un disco magnetico è
divisa in settori ed in una sequenza di tracce, dove vengono memorizzati i bit. Lettura
e scrittura vengono effettuato grazie ad alcune testine, una per ogni disco magnetico.
INTERFACCE I/O
Un calcolatore è collegato a diverse periferiche di input le quali servono per ricevere
dati ed istruzioni dall’utente, e periferiche di output le quali permettono al
calcolatore di comunicare all’utente vari risultati. Le interfacce I/O controllano il
funzionamento delle varie periferiche, traducendo i segnali in un formato
comprensibile alla periferica e viceversa.
SISTEMA OPERATIVO
Esso è il principale componente del software di base. Ha due scopi principali: gestisce
le risorse del calcolatore e virtualizza le risorse, rendendole più semplici alla vista
dell’utente. (come per esempio l’avvio di un semplice programma)
PROGRAMMI E PROCESSI
Un programma è un insieme di istruzioni e statico, mentre il processo è un
programma in esecuzione e quindi dinamico e allo stesso programma possono
corrispondere diversi processi.
MULTIPROGRAMMAZIONE E NUCLEO
Viene detta anche MULTITASKING e fornisce all’utente l’impressione che ci siano
diversi processori virtuali, ma il processore salta da un processo all’altro dando
l’illusione all’utente che tutti i processi siano in esecuzione in contemporanea: in realtà
la CPU esegue solo un processo e gli altri sono in esecuzione virtuale, ovvero sono in
attesa che la CPU esegua le istruzioni.
Il nucleo o kernel è responsabile della gestione del processore, fa da scheduler cioè
programma l’accesso dei processi alla risorsa.
GESTORE DELLA MEMORIA
Si occupa della memoria centrale e rende efficienti gli spostamenti dalla memoria di
massa alla memoria centrale e viceversa.

4
GESTORE DELLE PERIFERICHE
Si occupa della gestione delle periferiche. Esso usa un insieme di driver e: trasforma
le periferiche in periferiche virtuali, gestisce la traduzione dei dati, gestisce le
comunicazioni dei segnali e gestisce i conflitti per i processi che vogliono accedere
alla stessa periferica.
GESTORE DEI FILE O FILE SYSTEM
Gestisce le informazioni memorizzate nella memoria secondaria, ed è compito del file
system virtualizzare la memoria secondaria per presentarla all’utente in base ad una
organizzazione gerarchica.
File: archivio, è l’unità logica di memorizzazione e può contenere testo, immagini,
programmi…
Directory: è il contenitore logico di file, organizzato ad albero.
Volume: porzione della memoria secondaria (detta anche partizione) gestita dal file
system, corrispondente alla radice dell’albero.
Interprete dei comandi: è l’interfaccia utente del S.O.: definisce e gestisce le
operazioni dell’utente, cioè i comandi a disposizione. Può essere GUI (graphic user
interface) o Shell.
VARIABILE
Una variabile è una porzione di memoria destinata a contenere dei dati che possono
essere acceduti o modificati durante l’esecuzione del programma. In poche parole, una
variabile è un contenitore di valori. Essa è caratterizzata da: un nome, che la
caratterizza e che serve per leggere il valore che memorizza o per scrivere un valore in
quell’area di memoria; un tipo, che specifica l’insieme di valori che possono essere
memorizzati e le operazioni possibili.
DICHIARAZIONE
Per utilizzare le variabili bisogna dichiararle.  SINTASSI: tipo nome SEMANTICA:
utilizzerò una variabile nome di tipo tipo quindi prepara un’area di memoria per i
valori di tipo tipo e con nome nome.
ACCESSO
Operazione che permette di accedere ad un valore memorizzato all’interno di una
certa variabile. L’accesso avviene tramite la scrittura del nome della variabile. Se nome
compare a sinistra di un operatore di assegnazione allora la variabile viene usata per
memorizzare un valore. Altrimenti la variabile viene usata per accedere al valore che
memorizza.
TIPO
Un tipo è costituito da un insieme di valori, detto dominio, ed un insieme di
operazioni che possono essere sfruttate dagli elementi di tale dominio. (ex. Int)

5
ESPRESSIONE
Una combinazione di valori, variabili, operatori… che fornisce un valore di un certo
tipo. Una porzione contigua di codice caratterizzata da un tipo. All’espressione viene
assegnato un tipo durante la compilazione e un valore durante l’esecuzione.
TIPI FONDAMENTALI
TIPO COSA RAPPRESENTA FORMATO
Int interi 32 bit %d
Char caratteri 8 bit %c
Float reali 32 bit %f, %e, %g
Il tipo char è numerico: i caratteri sono rappresentati attraverso codici. A ciascun
intero fra -128 e 127 corrisponde un carattere. La codifica dei caratteri è quella ASCII
(American Standard Code for Information Interchange).
ALGEBRA DI BOOLE
! (NOT) &&(AND) ||(OR)
Si chiamano operatori logici.
!  !A vale TRUE se A vale FALSE, !A vale FALSE se A vale TRUE
&&  A&&B vale TRUE se sia A che B valgono TRUE, A&&B vale FALSE altrimenti
||  A||B vale TRUE se almeno uno fra A e B vale TRUE, A||B vale FALSE altrimenti
Leggi di De Morgan
1) !(b1&&b2&&…&&bn)  !b1 || !b2 ||…||!bn
2) !(b1||b2||…||bn)  !b1 && !b2 &&… &&!bn
CONVERSIONI IMPLICICTE
Sono delle trasformazioni del tipo di un valore effettuate automaticamente dal
compilatore.

CONVERSIONI ESPLICITE
Sono delle trasformazioni del tipo di un valore che vengono richieste
esplicitamente nel programma. Sono chiamate anche operazioni di cast.  (tipo)
espressione

6
ALGORITMO
E’ una sequenza di istruzioni per risolvere un problema. Una procedura
computazionale che prende valori in INPUT e ne restituisce altri in OUTPUT. Un
procedimento che risolve un determinato problema attraverso una sequenza di
passi.
PROBLEMI PARAMETRICI
Sono quei problemi nei quali alcuni parametri sono incogniti. Un algoritmo che risolve
questo tipo di problema lo deve risolvere per qualsiasi valore dei parametri.
PRE-CONDIZIONI E POST-CONDIZIONI
Un algoritmo per risolvere un problema funziona solo se i dati in ingresso soddisfano
certe proprietà, chiamate pre-condizioni. Successivamente, esso dovrà dare dei dati
in uscita in base ad alcune proprietà chiamate post-condizioni.
PROPRIETÀ
Correttezza: per ogni dato in ingresso che soddisfa le pre-condizioni, l’algoritmo
fornisce un dato in uscita che soddisfa le post-condizioni.
Finitezza: per ogni dato in ingresso che soddisfa le pre-condizioni, l’algoritmo deve
eseguire un numero finito di operazioni per poi terminare.
Non ambiguità: ogni istruzione deve poter essere univocamente interpretata.
Eseguibilità: ogni istruzione deve poter essere eseguita in un tempo finito e con una
memoria finita.
Efficienza: un algoritmo viene definito efficiente se vengono utilizzate meno risorse
possibili per il calcolo.
Esistono problemi indecidibili se non esiste un algoritmo risolutivo (ex. Problema
della fermata di Turing). Esistono problemi intrattabili se sono problemi decidibili se
l’algoritmo risolutivo chiede una quantità di risorse maggiore rispetto a quella
disponibile.
FLUSSO DI ESECUZIONE
E’ una sequenza di istruzioni che vengono eseguite quando un algoritmo viene
applicato per risolvere una istanza del problema. Esso consiste in una sequenza di
passi.
ISTRUZIONI DI CONTROLLO
Sono quelle istruzioni che permettono di controllare il flusso di esecuzione, cioè
quali istruzioni devono essere eseguite e in quale ordine.
PROGRAMMAZIONE STRUTTURATA
Un programma si dice strutturato se utilizza solo le seguenti istruzioni di controllo:
BLOCCO, permette di eseguire una sequenza di istruzioni; ISTRUZIONE

7
CONDIZIONALE, permette di determinare quale operazione deve essere eseguita;
ISTRUZIONE RIPETITIVA, permette di eseguire più volte un’istruzione se è
soddisfatta una condizione.
TEOREMA DI BOHM-JACOPINI
Qualunque algoritmo può essere realizzato (implementato) da un programma
strutturato.
COME SI SCRIVE UN ALGORITMO?
Utilizzando la pseudocodifica, ovvero un linguaggio intermedio tra linguaggio
naturale e quello di programmazione, e non ha alcuna sintassi da rispettare;
utilizzando il diagramma a blocchi o di flusso, ovvero un modello grafico che
rappresenta il flusso di esecuzione di un algoritmo.
TRACCIA DEL PROCESSO DI ESECUZIONE
E’ una tabella che mostra i valori assunti dalle variabili durante l’esecuzione del
programma.
ISTRUZIONI STRUTTURATE
Le istruzioni di controllo sono anche dette istruzioni strutturate perché sono
istruzioni che contengono al loro interno altre istruzioni, che a loro volta ne possono
contenere altre e così via… fino ad arrivare a delle istruzioni semplici, e quindi non
strutturate.
FUNZIONE IN C
Può essere trattata come una contenitore che riceve in INPUT valori di un certo
insieme, detto dominio, e ne restituisce in OUTPUT altri valori di un altro insieme,
detto codominio. Ogni variabile indipendente della funzione è associata a un tipo;
anche la variabile dipendente (valore di ritorno) è associata ad un tipo, che si chiama
tipo di ritorno. Una funzione viene usata per risolvere un determinato problema
parametrico.
Una funzione viene denotata con tipo nomeFunzione(tipo v1, tipo v2…). Con tipo si
intende il TIPO DI RITORNO, cioè il valore restituito dalla funzione. Con
nomeFunzione si rappresenta il NOME della funzione. Con (tipo v1, tipo v2…) si
rappresenta la LISTA DI PARAMETRI: i parametri all’interno della lista prendono il
nome di Parametri Formali.
Tipo di ritorno, nome e lista di parametri costituiscono il PROTOTIPO di una funzione.
Dopo esso abbiamo il CORPO cioè l’insieme di istruzioni da eseguire.
INVOCAZIONE DI UNA FUNZIONE
Si realizza con la seguente sintassi:
nome_funzione (par1, … ,parK)
I valori all’interno della lista prendono il nome di parametri attuali della funzione
invocata. L’invocazione di una funzione è un’espressione il cui TIPO è il tipo di

8
ritorno della funzione ed il cui VALORE è il valore restituito dalla funzione, il quale può
essere utilizzato dalla funzione invocante. Per poter invocare una funzione è
sufficiente conoscere il prototipo della funzione.
Quando una funzione viene invocata, allora: viene valutato il valore di ciascun
parametro attuale; ogni parametro formale (nella funzione invocata) prende il
valore del parametro attuale: legame fra parametri; vengono infine eseguite le
istruzioni nel corpo della funzione invocata.
Si chiama legame per valore quando si assegna ai parametri formali il valore dei
corrispondenti parametri attuali. I parametri attuali devono essere dello stesso
numero e dello stesso tipo di quelli formali.
VARIABILI LOCALI
Dato che la visibilità di una variabile locale è ristretta alla funzione in cui è dichiarata,
si può utilizzare lo stesso nome per due variabili locali presenti in due funzioni
distinte, ma non per quelle che sono presenti nella stessa funzione.
SCAMBIO DI DATI
Due variabili con lo stesso nome ma in due funzioni diverse sono due variabili
diverse e non si influenzano. Per lo scambio dei dati quindi avviene attraverso
parametri e valori restituiti.
CONTROLLO
Durante l’esecuzione del programma viene eseguita una istruzione alla volta, e quindi
una sola funziona è in esecuzione: essa ha il controllo. Tutte le altre funzioni sono in
attesa.
ATTIVAZIONE
L’attivazione di una funzione è il periodo dell’esecuzione che inizia quando la
funzione viene invocata fino alla sua terminazione. Quando è attiva, una funzione
può essere in esecuzione o in attesa, cioè può avere il controllo o no.
HEADER FILES
Di solito tutte le dichiarazioni delle funzioni vengono raggruppate nel file di
intestazioni. Il contenuto al suo interno viene poi importato all’interno del file che
contiene le definizioni tramite #include (viene copiato il suo contenuto all’interno del
punto in cui compare questa direttiva).
#include <nome_file> per quei file di intestazione delle librerie predefinite:
praticamente il file viene cercato all’interno delle cartelle del sistema.
#include “nome_file” per quei file di intestazione definiti da noi: il file viene cercato
nella cartella di lavoro attuale.

9
PROBLEMA
Dobbiamo gestire un insieme di variabili omogenee cioè: dello stesso tipo; con lo
stesso significato, cioè tutte le variabili rappresentano lo stesso tipo di
informazione su cui vengono eseguite le stesse operazioni.
ARRAY
E’ una sequenza di variabili omogenee, e permette di accedere in lettura ed in
scrittura alle sua variabili in base alla loro posizione, chiamata indice.
E’ una sequenza finita di variabili dello stesso tipo. Abbiamo: elementi, ovvero le
variabili che compongono l’array; sequenza, gli elementi dell’array sono ordinati;
sequenza finita, il numero di variabili è un numero finito, chiamata dimensione;
indice, numero intero non negativo che indica la posizione di una certa variabile
all’interno dell’array.
Gli array (monodimensionali) sono anche detti vettori. Essi costituiscono una
struttura dati, cioè un’entità o un metodo per memorizzare insieme di dati. Gli array
rappresentano variabili strutturate ed essi hanno un tipo, cioè il tipo dei loro
elementi.
DICHIARAZIONE
Per usare l’array bisogna dichiarare una variabile, specificando tipo, nome e lunghezza.
ARRAY IN MEMORIA
Dal punto di vista logico un array è una sequenza di variabili. Dal punto di vista fisico,
una variabile è una porzione di memoria e quindi è una sequenza di porzioni di
memoria consecutive.
LUNGHEZZA E LIMITI
Gli array si dicono statici in quanto la loro dimensione è fissa durante la dichiarazione
e non può essere modificata.
ARRAY BIDIMENSIONALI
Un array bidimensionale (o matrice) rappresenta un insieme di elementi organizzati
in righe e colonne. Esso è caratterizzato da due dimensioni, cioè il numero di righe e il
numero di colonne. Il numero di elementi è uguale al prodotto fra il numero di righe
e quello delle colonne.
La sintassi è : tipo nome[num_Righe][num_Colonne]

10
ITERAZIONI
Gli elementi di questo tipo di array vengono spesso acceduti tramite istruzioni
ripetitive. Per gestire le due dimensioni si usa un’istruzione ripetitiva annidata
all’interno di un’altra istruzione ripetitiva:
For(i=0; i<num_Righe; i++) {
For(j=0; j<num_Colonne; j++) {
//accedi alla matrice[i][j]
}
}
MATRICI COME PARAMETRI
Se il parametro formale di una funzione è una matrice allora è necessario specificare
il numero di colonne della matrice stessa. Il decadimento (trasformazione) di un array
a puntatore avviene una volta, cioè la matrice viene trasformata in un puntatore ad
un vettore.
ALGORITMI ITERATIVI
Sono algoritmi che permettono di risolvere problemi in cui: l’INPUT è una sequenza
di valori; l’OUTPUT è un valore che rappresenta una proprietà della sequenza;
l’algoritmo si basa sull’esecuzione ripetitiva, cioè iterata, di un insieme di istruzioni
processando tutti gli elementi della sequenza.
ESEMPI ALGORITMI ITERATIVI
Problemi di accumulazione, conteggio, verifica esistenziale, verifica universale,
ricerca, minimo o massimo.
PROBLEMI DI ACCUMULAZIONE
Sono problemi in cui bisogna calcolare la somma o il prodotto di una sequenza di
valori numerici. L’algoritmo usa una variabile di accumulazione per rappresentare la
somma o il prodotto; inizializza la variabile di accumulazione con 0 per la somma e 1
per il prodotto; incrementa il suo valore con l’operazione di accumulazione.
LO SCOPO
Lo scopo è memorizzare il valore da calcolare, ma lo realizza una volta che tutti gli
elementi della sequenza sono stati processati.
PROBLEMI DI CONTEGGIO
Sono quei problemi in cui bisogna contare il numero di elementi che soddisfano una
certa proprietà. L’algoritmo usa una variabile di conteggio per rappresentare gli
elementi che soddisfano la proprietà; inizializza la variabile di conteggio a 0;
controlla tutti gli elementi della sequenza e incrementa di 1 il valore della variabile di
conteggio.

11
PROBLEMI DI VERIFICA ESISTENZIALE
Sono quei problemi nei quali bisogna verificare l’esistenza di un elemento che
soddisfa una proprietà. L’algoritmo usa una variabile booleana che indica se un
elemento soddisfa la proprietà è stato trovato o no; inizializza la variabile booleana a
0; visita gli elementi della sequenza e se un elemento soddisfa la proprietà, assegna
valore 1 alla variabile booleana.
La variabile di esistenza deve rappresentare il fatto che una certa sequenza contiene
un elemento che soddisfa la proprietà oppure no. Essa realizza tale scopo dopo che
tutti gli elementi sono stati controllati. Il valore iniziale della variabile è 0 dato che
ancora nessun elemento è stato trovato.
PROBLEMI DI VERIFICA UNIVERSALE
Sono quei problemi in cui bisogna verificare che tutti gli elementi soddisfano una
proprietà. L’algoritmo usa una variabile booleana di universalità che indica che tutti
gli elementi visti soddisfano la proprietà; inizializza la variabile a 1; visita gli
elementi della sequenza fino a che non è terminata e se l’elemento visitato non
soddisfa la proprietà, il valore della variabile diventa 0.
La verifica esistenziale e universale sono riconducibili una all’altra!
PROBLEMI DI RICERCA
Sono quei problemi in cui bisogna verificare l’esistenza di un elemento che soddisfa
una proprietà e nel caso esista, bisogna restituire una informazione associata a
quell’elemento. L’algoritmo una usa variabile per rappresentare l’informazione;
inizializza la variabile ad un valore che indica che quell’elemento ancora non è stato
trovato; visita tutti gli elementi fino a che la sequenza non è terminata.
PROBLEMI DI MIN/MAX
Sono quei problemi nei quali bisogna trovare l’elemento MIN/MAX in una sequenza,
rispetto a qualche relazione d’ordine. L’algoritmo usa una variabile per il minimo (o
massimo); inizializza la variabile al primo elemento della sequenza; visita tutti gli
elementi fino a che non termina.
RICERCA O MIN/MAX
Questi problemi possono assomigliarsi, ma esiste un criterio ben preciso: in un
problema di MIN/MAX abbiamo sempre una soluzione significativa (ed ogni
istanza deve essere una sequenza che contiene almeno un elemento); in un
problema di ricerca si potrebbe non avere una soluzione significativa (in
particolare è ammessa un’istanza del problema in cui la sequenza non contiene
elementi).

12