INFORMATICA GENERALE
Francesco Cerino
IL SISTEMA
Sistema: Insieme di componenti che lavorano in modo coordinato e che sollecitati da un insieme di Input
producono un insieme di Output
S
I
O
I = {i1,……in}
con n appartenente a N0
O = {o1,……om}
con m appartenente a N0
S = {s1,……sq}
con q appartenente a N0
Dipendenza funzionale: y è il risultato della funzione f applicata ad x.
y = f(x)
y = variabile dipendente
f = Funzione
x = variabile indipendente
Esempio
9 = QUAD(3)
In generale: y = QUAD(x) con x numero reale e y numero reale non negativo
N.B.: E’ importante definire gli insiemi di appartenenza per x e y.
Per i sistemi in generale è O = S(I)
O è il risultato che il sistema S produce se sollecitato dall’input I.
Espressioni aritmetiche rappresentate come sistemi
Operatori elementari
a
b
+
c
c=a+b
con a,b,c numeri reali
a
b
a
b
a
b
*
c
c=a*b
con a,b,c numeri reali
-
c
c=a-b
con a,b,c numeri reali
/
c
c=a/b
con a,c numeri reali e b numero reale non nullo
Ogni altro operatore, se necessario, si può definire indicandone il simbolo e gli insiemi di appartenenza di I e O.
Esempio
a
Quad
b
b = a2
con a numero reale e b numero reale non negativo
E’ possibile combinare i sistemi elementari per ottenere ulteriori sistemi più complessi, in tal caso i sistemi
elementari possono essere definiti sottosistemi.
Ad esempio è possibile combinare gli operatori elementari per ottenere sistemi che rappresentino le espressioni
aritmetiche.
CIRCUITI LOGICI
I circuiti logici sono particolari sistemi che utilizzano i valori di verità (vero/falso) come elementi di input e
output, e che sono basati su tre operatori elementari.
Ogni operatore è caratterizzato da un simbolo, da una espressione logica e da una tabella di verità che ne
descrive il funzionamento.
Operatore NOT
i1
o1
Espressione logica: o1 = NOT (i1)
Tabella di verità
i1
0
1
o1
1
0
i1
0
0
1
1
i2
0
1
0
1
o1
0
0
0
1
i1
0
0
1
1
i2
0
1
0
1
o1
0
1
1
1
Operatore AND
i1
o1
Espressione logica: o1 = AND (i1; i2)
Tabella di verità
i2
Operatore OR
i1
o1
Tabella di verità
i2
Espressione logica: o1 = OR (i1; i2)
N.B.: Anche per i circuiti logici, in quanto sistemi, vale quanto detto precedentemente in merito alla
combinazione di operatori elementari al fine di costruire circuiti più complessi.
La sintesi di un circuito logico è il procedimento che si segue partendo da un problema specifico per definire la
tabella di verità, l’espressione logica e lo schema elettrico del circuito che risolve il problema proposto.
Esempio
Realizzare un circuito logico che dati due valori di input determini se essi sono diversi.
Tabella di verità
i1
0
0
1
1
i2
0
1
0
1
o1
0
1
1
0
Espressione Logica: o1 = OR(AND(NOT(i1);i2);AND(i1;NOT(i2)))
Schema elettrico
Circuiti equivalenti: Due o più circuiti si dicono equivalenti quando sono associati alla stessa tabella di verità.
Circuiti equivalenti possono differire per il numero di componenti da cui sono costituiti.
Dato un problema possono esistere più circuiti equivalenti che lo risolvono, in tal caso sono necessarie
operazioni di ottimizzazione del circuito per fare in modo di ricavare lo schema elettrico che contenga il minor
numero di componenti possibile.
L’ottimizzazione si basa su regole di equivalenza e di semplificazione proprie dell’Algebra di Boole.
1. OR(A;0) = A
2. OR(A;1) = 1
3. AND(A;0) = 0
4. AND(A;1) = A
5. OR(A;A) = A
6. AND(A;A) = A
7. OR(A;NOT(A)) = 1
8. AND(A;NOT(A)) = 0
9. NOT(NOT(A)) = A
10. OR(A;AND(A;B)) = A
11. OR(A;AND(NOT(A);B)) = OR(A;B)
Leggi di De Morgan
NOT(AND(A;B)) = OR(NOT(A);NOT(B))
NOT(OR(A;B)) = AND(NOT(A);NOT(B))
Esercizio
Rappresentare il circuito logico che consente di accendere una cifra digitale secondo il seguente schema
1
i1
0
0
1
1
i2
0
1
0
1
Cifra
0
1
2
3
6
2
7
Schema cifra
5
3
4
zero
uno
due
tre
Tabella di verità con due input e sette output
A
0
0
1
1
B
0
1
0
1
o1
o2
o3
o4
o5
o6
o7
0
1
0
1
Espressioni logiche semplificate, per ottenerle si è utilizzato il metodo tradizionale per la deduzione delle
espressioni logiche a partire dalla tabella di verità e si sono applicate successivamente le regole di
semplificazione
o1 = OR(NOT(B);AND(A;B))
o2 = 1
o3 = OR(NOT(A);AND(A;B))
o4 = o1
o5 = NOT(B)
o6 = AND(NOT(A);NOT(B))
o7 = A
Schema elettrico
SISTEMI DI NUMERAZIONE POSIZIONALI
Un sistema di numerazione è posizionale se ogni simbolo (cifra) contribuisce al valore del numero in relazione
alla posizione che occupa nella sequenza.
Ad esempio il simbolo 2, nella sequenza 32 ha valore di 2 unità, mentre nella sequenza 23 ha valore due decine
e cioè 20.
A = Alfabeto – Insieme di simboli usati per comporre numeri (cifre)
b = Base – Valore numerico che coincide con il numero di elementi presenti nell’alfabeto
A = {c0, c1, ……, cn-1}
b=n
In base 10 (sistema decimale) l’alfabeto è formato da 10 cifre - A = {0,1,2,3,4,5,6,7,8,9}
In base 8 (sistema ottale) l’alfabeto è formato da 8 cifre - A = {0,1,2,3,4,5,6,7}
In base 2 (sistema binario) l’alfabeto è formato da 2 cifre – A = {0,1}
Rappresentazione: E’ la sequenza di simboli utilizzati per costituire numeri.
Tutte le cifre utilizzate devono appartenere all’alfabeto associato alla base di rappresentazione. Per cui la
rappresentazione (172) ha senso in base 8, ma non ha senso in base 6, visto che il simbolo 7 non appartiene
all’alfabeto della base 6.
Valore: E’ la “quantificazione” associata ad una specifica rappresentazione.
Passaggio dalla rappresentazione al valore
Per calcolare il valore associato ad una data rappresentazione, secondo una base specifica, esiste la seguente
formula:
(cn……c1c0)b = Σci * bi
con i che va da 0 a n
Esempio
(175)10 = 5*100 + 7*101 + 1*102 = 5*1 + 7*10 + 1*100 = 5 + 70 + 100 = 175
(175)8 = 5*80 + 7*81 + 1*82 = 5*1 + 7*8 + 1*64 = 5 + 56 + 64 = 125
(101)2 = 1*20 + 0*21 + 1*22 = 1*1 + 0*2 + 1*4 = 1 + 0 + 4 = 5
Passaggio dal valore alla rappresentazione
Dato un valore espresso in decimale si può scoprire qual è la rappresentazione ad esso associata secondo una
specifica base, utilizzando il metodo delle divisioni successive per la base.
Il metodo consiste nel dividere il valore di partenza per la base scelta, ripetendo l’operazione sui quozienti che
progressivamente si ottengono, fino ad ottenere quoziente zero. La rappresentazione cercata sarà ottenuta
leggendo i resti delle divisioni in ordine inverso.
Esempio
Si determini la rappresentazione in base 2 del valore decimale 13.
13 diviso 2 = 6 e resto 1
6 diviso 2 = 3 e resto 0
3 diviso 2 = 1 e resto 1
1 diviso 2 = 0 e resto 1
(1101)2
N.B.:Combinando questi due metodi è possibile convertire un valore passando dalla sua rappresentazione in
base b1 alla sua rappresentazione in base b2. Per ottenere questo scopo si calcola dapprima il valore associato
alla rappresentazione in base b1, e successivamente, tramite il metodo delle divisioni successive, si determina la
sua rappresentazione in base b2.
Esempio
Determinare la rappresentazione in base 6 del valore associato alla sequenza (312)4
Determino il valore associato alla sequenza (312)4
(312)4 = 2*40 + 1*41 + 3*42 = 2*1 + 1*4 + 3*16 = 2 + 4 + 48 = 54
Determino la rappresentazione associata al valore 54 secondo la base 6
54 diviso 6 = 9 e resto 0
9 diviso 6 = 1 e resto 3
1 diviso 6 = 0 e resto 1
(130)6
IL SISTEMA BINARIO ED IL COMPUTER
Il sistema di numerazione posizionale in base 2 è particolarmente interessante in quanto costituisce la base di
tutta l’elaborazione di un PC.
Il computer, nonostante sia presentato come una macchina di grosse capacità, è pur sempre poco di più di un
elettrodomestico, un insieme di circuiti elettrici senza una propria intelligenza dai meccanismi alquanto
elementari.
Ogni circuito è attraversato da corrente elettrica oppure no. Quindi il computer, ed in particolare tutti i sui
componenti, può distinguere solo tra due eventi possibili: passaggio di corrente o assenza di corrente.
Questa distinzione tra due stati è la minima informazione possibile ed è equivalente ad una risposta Vero/Falso.
In informatica il valore Vero/Falso viene codificato con le cifre 1/0 che prendono il nome di BIT (Binary
Digit).
All’interno di un computer queste cifre sono organizzate in unità più grandi e più comode da gestire. Esiste
quindi un sistema di equivalenze molto simile ai nostri sistemi di misura (lunghezza, capacità, peso); con la
differenza che mentre noi lavoriamo in base 10, e di conseguenza il sistema di multipli e sottomultipli è riferito
alle potenze di 10, il computer lavora con i bit (base 2).
Ciò comporta che il sistema di multipli del bit segue un andamento relativo alle potenze di 2.
BIT = {0,1}
1 BYTE = 8 BIT
1 KILOBYTE (Kb) = 1024 BYTE
1 MEGABYTE (Mb) = 1024 KILOBYTE
1 GIGABYTE (Gb) = 1024 MEGABYTE
1 TERABYTE (Tb) = 1024 GIGABYTE
Possiamo osservare che sia il valore 8 che il valore 1024 sono potenze di 2.
Il computer, nel suo processo di elaborazione, non fa altro che operare da un punto di vista aritmetico e logico
utilizzando i bit al posto delle 10 cifre da noi utilizzate.
Possiamo dire, quindi, che i bit non sono altro che i mezzi con cui il PC rappresenta la realtà, ed il loro
raggruppamento in unità di misura superiori non è che una sorta di traduzione che aiuta la nostra percezione ad
orientarsi nel mondo dei bit, l’unico mezzo con cui noi ed il computer possiamo comunicare.
AUTOMI A STATI FINITI
Nelle reti combinatorie (circuiti logici), l’output è funzione unicamente dell’input e del comportamento del
sistema.
O = S(I)
Negli automi a stati finiti (ASF) l’output è funzione anche dello stato interno, inteso come condizione in cui si
viene a trovare il dispositivo in un preciso istante.
O = S(I,s)
Definizione formale
Un ASF risulta formalmente definito tramite 5 elementi:
I = {i1,……in}
Insieme degli input accettati
con n appartenente a N0
O = {o1,……om}
Insieme degli output prodotti
con m appartenente a N0
S = {s1,……sq}
Insieme degli stati che l’ASF può assumere
con q appartenente a N0
Fs: (I x S)  S
Funzione di transizione degli Stati
Fo: (I x S)  O
Funzione di transizione delle Uscite
N.B.: Gli insiemi I,S ed O devono essere insiemi finiti
N.B.: Le funzioni Fs e Fo sono rappresentate da due matrici o tabelle che indicano, per ogni combinazione di
Input e Stato Attuale, quelli che saranno rispettivamente lo Stato Successivo e l’Output
N.B.: Le due tabelle possono essere riunite in un’unica tabella detta Matrice di Transizione
Un ASF può essere rappresentato graficamente tramite una struttura detta Grafo
Stato
Attuale
I/O
Stato
Successivo
Esempio
Descrivere il funzionamento come ASF di un ascensore di uno stabile a 3 piani.
I = {P1, P2, P3}
L’input consiste nella pressione del pulsante che indica il piano che si vuole raggiungere
O = {+2, +1, 0, -1, -2}
L’output consiste nello spostamento della cabina dell’ascensore
S = {1, 2, 3}
Lo stato interno è il piano in cui è presente la cabina ad un certo istante
N.B.: E’ evidente che lo spostamento della cabina (Output) non dipende solo dal pulsante selezionato (Input),
ma anche dalla posizione della cabina nel momento in cui si seleziona il pulsante (Stato Interno). Tale
caratteristica fa rientrare questo dispositivo nella categoria degli ASF.
Fs: (I x S)  S
I\S
P1
P2
P3
1
1
2
3
2
1
2
3
P2/+1
P1/0
3
1
2
3
2
1
P1/-1
Fo: (I x S)  O
I\S
P1
P2
P3
1
0
+1
+2
2
-1
0
+1
P2/0
P2/-1
3
-2
-1
0
P3/+1
P1/-2
P3/+2
3
P3/0
IL PROBLEMA E L’ALGORITMO
Problema: Questione posta per essere presa in considerazione ed eventualmente risolta.
Soluzione del problema: Strategia risolutiva che comprende informazioni in nostro possesso, azioni da
compiere, scelte da fare per ottenere il risultato.
Dominio del problema: Campo di azione e sfera di influenza del problema preso in esame.
Analisi del problema: (Acquisizione del Know-How): acquisizione di tutte le possibili informazioni inerenti il
problema per poi individuarne e mettere in pratica il procedimento risolutivo del problema stesso.
Problema decidibile: un problema è decidibile se è possibile in un tempo finito determinarne la soluzione con
una qualsiasi metodologia o comunque stabilirne la irresolubilità.
Problema indecidibile: un problema è in decidibile se non esiste soluzione determinabile in un tempo finito,
non è quindi possibile deciderne la irresolubilità.
I DATI
PROBLE
MA
Elemento 1
DOMINIO
DEL
PROBLEMA
Elemento 2
Proprietà 1
Proprietà 3
Elemento 3
Proprietà 2
Partendo dal problema da risolvere in una precisa realtà si passa ad individuarne il dominio
Il dominio è costituito dagli elementi di interesse funzionali alla risoluzione del problema
Ogni elemento è caratterizzato da alcune proprietà
DATO: Valore assunto dalle proprietà degli elementi che caratterizzano il modello del problema
Un dato può essere:
VARIABILE: se può assumere valori diversi (ad esempio l’età di una persona)
COSTANTE: se assume sempre lo stesso valore (ad esempio Pi-Greco)
Per IDENTIFICATORE si intende il nome che diamo a dati variabili e dati costanti per distinguerle
all’interno del modello
Esempio
PERSONE
NOME
LUOGO
DI
NASCITA
ETA’
BIBLIOTE
CA
LIBRI
COPIE
DISPONIBILI
TITOLO
AUTORE
CASA
EDITRICE
TIPO DI DATO: In un problema i dati possono essere di tipo diverso



Numerico: valori da usare con operatori aritmetici
Alfanumerico: sequenze di lettere e/o cifre
Logico: Dati che possono assumere solo valore “vero” o “falso”
DATI DI INPUT: vengono forniti dall’esterno per poter risolvere il problema
DATI DI OUTPUT: vengono comunicati all’esterno come risultato della soluzione del problema
DATI DI LAVORO: necessari all’attività di elaborazione per ottenere risultati parziali
TABELLA DI PROGETTO: E’ una tabella che contiene i dati emersi dall’interpretazione di un problema
proposto, e che riassume le caratteristiche dei dati stessi
Nella tabella di progetto vanno specificate le seguenti informazioni





Identificatore
Variabile o Costante
Input, Output o Lavoro
Tipo
Descrizione
Esempio
Esaminare un elenco di persone con Nome e Anno di nascita, contando le persone che hanno più di 20 anni
Breve analisi del problema
Il Nome e l’Anno di Nascita delle persone costituiscono dati di input. Per contare le persone che hanno più di
20 anni sarà necessario calcolare l’età di ogni persona, eseguendo la differenza tra l’anno in corso ed il
corrispondente anno di nascita. Ottenuta l’età sarà necessario confrontarla con il valore costante 20, ed
eventualmente incrementare un contatore.
Tabella di progetto
Identificatore
Nome
AnnoNascita
Età
EtàMinima
AnnoInCorso
Contatore
Var/Cost
V
V
V
C = 20
C = 2004
V
I/O/L
I
I
L
L
L
O
Tipo
Alfanumerico
Numerico
Numerico
Numerico
Numerico
Numerico
Descrizione
Nome della persona
Anno di nascita della persona
Età della persona
Valore di confronto
Anno in corso
Contatore delle persone con Età>20
LE AZIONI
Le azioni sono attività che, mettendo i dati in relazione tra loro, consentono di ottenere i risultati desiderati
Ogni azione modifica lo stato di qualche oggetto, ed il suo effetto può essere riconosciuto dal cambiamento di
stato dell’oggetto in questione
Esistono 3 tipologie di azione
Azioni di Input: sono necessarie per acquisire i dati iniziali dall’esterno. In generale sono indicate dal verbo
“LEGGI”



Esempio  LEGGI A, dove A è una variabile di un tipo specificato
L’esecuzione dell’automazione si arresta ed attende l’immissione del valore dall’esterno
Da quel momento, e fino a quando il valore di A non sarà modificato, ad A sarà associato il valore
inserito

Azioni di Output: sono necessarie per comunicare all’esterno i risultati ottenuti. In generale sono indicate dal
verbo “SCRIVI”

Esempio  SCRIVI A, dove A è una variabile cui è assegnato uno specifico valore
Azioni di Assegnamento: sono necessarie per scrivere o modificare il valore associato ad una variabile


Ad una variabile può essere assegnato un valore costante, compatibile con il suo tipo (A  9)
Ad una variabile può essere assegnato il risultato di un’espressione, sempre che sia compatibile con il
suo tipo
o (A  E), dove per espressione si intende una formula che specifica sempre un valore
o Ogni espressione è composta da operatori ed operandi

Gli operandi possono essere costanti, variabili o a loro volta espressioni

Gli operatori possono essere di tre tipi: ARITMETICI, DI RELAZIONE, LOGICI.
Esempi
AB
AB+2
A  B<C
A  NOT(A)
A  NOME = “ROSSI”
A  AND(B>C; ETA’ = 32)
A e B devono essere dello stesso tipo
A e B devono essere di tipo numerico
A deve essere di tipo logico, B e C di tipo numerico o alfanumerico
A deve essere di tipo logico
A deve essere di tipo logico, NOME di tipo alfanumerico
A deve essere di tipo logico, B e C di tipo numerico o alfanumerico, ETA’
di tipo numerico
L’ALGORITMO
Algoritmo: Insieme finito di istruzioni (operazioni elementari) che devono essere eseguite per portare a
termine un determinato compito e per raggiungere un risultato definito in precedenza.
Caratteristiche delle istruzioni
REALIZZABILITA’: Ogni istruzione deve essere eseguibile per l’esecutore
 Calcola RADQ(43) per un alunno delle elementari NON E’ un’istruzione realizzabile
 Calcola RADQ(43) per un alunno delle superiori E’ un’istruzione realizzabile
NON AMBIGUITA’: Ogni istruzione deve essere precisa
 Calcola l’IVA al 20% E’ non ambigua
 Calcola l’IVA E’ ambigua
DURATA LIMITATA NEL TEMPO: Per quanto lungo il calcolo deve terminare
 Calcola il quadrato dei primi 10000 numeri E’ limitata
 Calcola tutte le cifre decimali di PI-Greco NON E’ limitata
DETERMINISTICA: Deve produrre sempre il medesimo effetto se eseguita a partire dalle stesse condizioni
iniziali
 Moltiplica 3 per 4 E’ deterministico
 Lancia la freccia contro il bersaglio NON E’ deterministico
ELEMENTARE: non ulteriormente scomponibile
 Calcola RADQ(5) E’ elementare se eseguita con una calcolatrice
 Calcola RADQ(5) NON E’ elementare se eseguita a mano
Caratteristiche dell’algoritmo




Deve essere composto da un numero finito di istruzioni
Deve sempre presentare un unico inizio ed un’unica fine
Deve essere esaustivo, cioè contemplare tutti i casi che si possono verificare
Deve essere riproducibile, cioè ogni sua successiva esecuzione partendo dai medesimi dati iniziali,
deve produrre gli stessi risultati
LA PSEUDOCODIFICA
E’ la descrizione dell’algoritmo tramite termini e parole del linguaggio comune, seguendo una serie di regole
atte ad organizzare un testo orientato alla stesura degli algoritmi.
Esempio
Sommare due numeri
Leggi (A;B)
CA+B
Scrivi (C)
Dividere due numeri
Leggi (A;B)
Se B = 0
Allora
Scrivi (“Errore”)
Altrimenti
CA/B
Scrivi (C)
Fine_Se
I DIAGRAMMI A BLOCCHI
I Diagrammi a Blocchi (Flow Chart) sono un formalismo che rende standard la descrizione dell’algoritmo data
in precedenza tramite la PseudoCodifica.
Il diagramma è costituito da blocchi che rappresentano le singole istruzioni, e collegati tra loro da frecce che
indicano il flusso dell’algoritmo.
I blocchi possono essere di 4 tipi, ognuno dei quali è associato ai tipi di azioni descritti in precedenza.
Blocchi
Inizio e Fine: devono essere sempre presenti in quanto individuano L’Inizio e la Fine dell’elaborazione.
Devono essere UNICI
INIZIO
FINE
I/O: E’ il simbolo utilizzato per le azioni di lettura (Input) e scrittura (Output)
Leggi (A)
Scrivi (A)
Comando: E’ il simbolo utilizzato per le azioni di assegnamento
A2*B
Scelta: E’ il simbolo che consente di diramare l’elaborazione in relazione al verificarsi o meno di una certa
condizione
No
A>
Sì
Esempio
Dividere due numeri
INIZIO
Leggi (A)
Leggi
(B)
Scrivi
“Err B =
Sì
No
B=0
CA/B
Scrivi (C)
FINE
Tabella di prova
E’ una tabella che serve per verificare la correttezza dell’algoritmo risolutivo del problema. In essa vanno
indicate le costanti con i loro valori fissi, le variabili di input cui vengono assegnati valori arbitrari a piacere
(compatibili con il loro tipo), le variabili di lavoro cui vengono assegnati valori dedotti dall’esecuzione
dell’algoritmo effettuata sul diagramma a blocchi, le variabili di output cui vengono assegnati valori calcolati al
termine dell’esecuzione dell’algoritmo sul diagramma a blocchi.
Esempio
Calcolare la media di tre numeri immessi da tastiera
Breve analisi
La media si ottiene sommando i tre numeri immessi in input, e dividendo il risultato ottenuto per 3.
Tabella di progetto
Identificatore
A
B
C
S
M
Var/Cost
V
V
V
V
V
I/O/L
I
I
I
L
O
Tipo
Numerico
Numerico
Numerico
Numerico
Numerico
Descrizione
Primo valore di input
Secondo valore di input
Terzo valore di input
Somma dei tre valori
Media dei tre valori
Pseudocodifica
Inizio
Leggi (A;B;C)
SA+B+C
M=S/3
Scrivi (M)
Fine
Diagramma a Blocchi
INIZIO
Leggi (A;B;C)
Scrivi
(M)
FINE
Tabella di prova
A
2
B
4
C
3
S
9
M
3
SA+B+C
MS/3
La programmazione strutturata e le strutture di controllo
L’attività di programmazione può essere strutturata in 4 parti:
1.
2.
3.
4.
Definizione ed analisi del problema
Organizzazione dell’algoritmo risolutivo
Stesura del programma
Prove di esecuzione
Le fasi 1 e 2 non prevedono l’uso dell’elaboratore ed sono indipendenti dal linguaggio di programmazione
usato nelle fasi successive.
In particolare la fase 2 (organizzazione dell’algoritmo risolutivo), può essere a sua volta suddivisa in ulteriori
sezioni:
a. Definizione dei dati (tabella di progetto)
b. Definizione delle azioni (pseudocodifica e diagrammi di flusso)
La stesura dell’algoritmo è una delle fasi fondamentali del lavoro di programmazione, ed è necessario definire
un insieme di regole che devono essere seguite per una corretta organizzazione del lavoro.
Queste regole hanno lo scopo di rendere la programmazione un qualcosa di sistematico ed ordinato e
rappresentano un metodo di lavoro che viene denominato Programmazione strutturata.
Programmazione strutturata: progettazione, realizzazione e collaudo di un programma costituito di parti che
dipendono l’una dall’altra secondo un ben definito modello organizzativo.
Per ottenere questo risultato è necessario un lavoro di progettazione che rispetti certi schemi e che sia codificato
in modo univoco.
Esempio
Un segretario deve effettuare una serie di inviti ad un elenco prestabilito di persone, annotando i casi in cui
l’invito è andato a buon fine, il numero risulta errato oppure il numero risulta occupato.
Vediamo la pseudocodifica:
Inizio
Ripeti
Leggi (numero telefonico)
SollevaRicevitore
ComponiNumeroTelefonico
Se Occupato
Allora
Scrivi (‘occupato’)
Altrimenti
Se RispondePersonaDesiderata
Allora
Scrivi (‘ok’)
Altrimenti
Scrivi (‘numero errato’)
Fine_Se
Fine_se
RiagganciaRicevitore
Finchè ElencoTerminato
Fine
Esercizio
Costruire il diagramma di flusso associato alla pseudocodifica
Se si osserva la pseudocodifica si nota che le singole istruzioni sono organizzate secondo strutture standard di
tre tipi.
Sequenza: Istruzioni che devono essere eseguite una dopo l’altra secondo l’ordine con cui sono state scritte
…………..
Leggi (numero telefonico)
SollevaRicevitore
ComponiNumeroTelefonico
…………..
Alternativa: l’esecutore deve fare una scelta tra un certo gruppo di istruzioni ed un altro gruppo a seconda di
ciò che succede in quel momento durane l’elaborazione.
Se RispondePersonaDesiderata
Allora
Scrivi (‘ok’)
Altrimenti
Scrivi (‘numero errato’)
Fine_Se
Ripetizione: le istruzioni comprese tra ripeti e finchè devono essere eseguite più volte, tante quante sono le
telefonate da fare.
Ripeti
……………….
Finchè ElencoTerminato
N.B.: Le stesse strutture possono essere riscontrate nel corrispondente diagramma a blocchi.
E’ quindi possibile individuare all’interno di un algoritmo alcune strutture tipiche. Dall’esempio si vede che ci
esistono tre tipi di strutture, intese come schemi particolari secondo cui sono organizzate le istruzioni all’interno
dell’algoritmo.
Ci si può chiedere se questo è un caso legato al particolare problema, oppure se quanto emerso trovi conferma
nella teoria generale della programmazione strutturata.
Studi condotti in linea teorica consentono di affermare che:
Qualsiasi algoritmo appropriato può essere descritto utilizzando solo tre strutture di base: sequenza,
alternativa, ripetizione. Questi tre modelli organizzativi di base prendono il nome di strutture di
controllo perché servono a controllare il percorso all’interno del procedimento risolutivo per ottenere i
risultati desiderati.
Esistono dei sinonimi per due di queste strutture. La struttura alternativa è anche detta condizionale o di
selezione, la struttura di ripetizione è anche detta iterazione.
Va precisato che per struttura si intende un modello organizzativo secondo cui si rappresentano le istruzioni
all’interno di un algoritmo.
Una formalizzazione del concetto esposto viene dal teorema di Bohm-Jacopini:
Teorema - Un qualsiasi algoritmo può essere espresso usando esclusivamente le strutture di sequenza,
selezione ed iterazione.
Un corollario di questo teorema porta a comprendere come algoritmi che presentano altre strutture possono
essere scritti in modo funzionalmente equivalente tramite le tre strutture fondamentali.
Corollario – Ogni algoritmo, scritto usando le istruzioni di salto, è anche rappresentabile usando soltanto
le tre strutture di sequenza, selezione ed iterazione.
Esempio
Problema: Dato un elenco di persone di cui sono noti nome e professione, si vuole stampare l’elenco degli
avvocati.
Pseudocodifica con istruzioni di salto
1.
2.
3.
4.
5.
6.
Inizio
Leggi il nome e la professione di una persona
Se la professione è diversa da avvocato vai a 5
Scrivi il nome della persona
Se l’elenco non è terminato torna a 1
fine
Pseudocodifica funzionalmente equivalente
Inizio
Ripeti
Leggi (nome)
Leggi (professione)
Se professione = “avvocato”
Allora
Scrivi (nome)
Fine_Se
Finchè ElencoTerminato
Fine
Sono evidenti alcuni tra i vantaggi dell’uso della programmazione strutturata:




Sequenzialità dell’algoritmo
Maggiore comprensibilità
Moduli facilmente individuabili
Controllo del flusso dell’algoritmo.
Esercizi
1. Inserite da tastiera le coordinate di due punti del piano cartesiano, calcolare le coordinate del punto medio
del segmento che unisce i due punti.
2. Dati il valore di un deposito bancario ed il tasso di interesse annuo (360gg), calcolare gli interessi maturati
dopo 25 gg.
3. Sul prezzo di un prodotto viene praticato lo sconto del 3% se costa meno di 500 euro e del 5% per prezzi
superiori di 500 euro. Calcolare il prezzo da pagare.
4. Date le coordinate di due punti scrivere l’equazione della retta passante per essi (attenzione al caso in cui la
retta sia verticale).
5. Date le equazioni di due rette nella forma y=mx+q, trovare le coordinate del punto di intersezione
(considerare anche i casi di rette parallele o coincidenti)
6. La scuola rimborsa il 15% del costo dell’abbonamento se lo studente abita in provincia, usa l’autobus ed è
lontano almeno 20 km dalla scuola. Alle stesse condizioni, se usa il treno il rimborso è del 10%. Calcolare
l’ammontare del rimborso.
7. Inserire da tastiera numeri interi finchè si è riusciti a sommare 100 numeri pari. Scrivere il risultato della
somma.
8. Calcolare la somma dei quadrati dei primi N numeri interi (N immesso da tastiera).
9. Dato un elenco di N numeri, si devono scegliere quelli che sono maggiori di 10 e minori di 100. Contare tali
numeri e scrivere la loro somma.
La struttura alternativa
Per la struttura alternativa sono possibili due casi: l’alternativa a due vie e l’alternativa ad una via.
Nel primo caso è prevista un’azione sia per l’uscita ALLORA che per l’uscita ALTRIMENTI.
Nel secondo caso sono previste azioni solo per l’uscita ALLORA.
Pseudocodifica (Alternativa a due vie)
SE condizione
ALLORA
Istruzioni-a
ALTRIMENTI
Istruzioni-b
FINE-SE
Pseudocodifica (Alternativa ad una via)
SE condizione
ALLORA
Istruzioni-a
FINE-SE
Esercizio
Su una somma di denaro si vuole applicare un’imposta progressiva secondo lo schema:
da 0 a 5000 euro: imposta del 10%
da 5001 a 15000 euro: imposta del 20%
oltre i 15000 euro: imposta del 30%.
La struttura iterativa post-condizionale
E’ una struttura di ripetizione che si basa sulla valutazione di una condizione logica. L’elenco di istruzioni da
ripetere costituiscono il corpo del ciclo, e vengono eseguite prima della valutazione della condizione. Se la
condizione è falsa si ripete il ciclo, se è vera si passa ad eseguire la prima istruzione dopo il ciclo.
Pseudocodifica
RIPETI
istruzioni
FINCHE’ condizione
La struttura postcondizionale si utilizza quando è necessario prevedere un ciclo in cui le istruzioni devono
essere eseguite almeno una volta.
Esercizio
Dato un elenco non vuoto di persone, con l’indicazione di esse del nome e dell’età, si devono contare i
maggiorenni.
Le strutture derivate
In base al teorema di Bohm-Jacopini le tre strutture descritte sono sufficienti per la soluzione di qualsiasi
problema. Per facilitare il lavoro di programmazione si ricorre, però, anche ad altri tipi di strutture che risultano
di notevole utilità. Dal punto di vista teorico, però, va notato che le strutture che vengono presentate ora non
sono indispensabili, ma sono una derivazione delle strutture di base precedenti.
Questo significa che ogni frammento di programma contente strutture derivate, può essere tradotto in un
frammento equivalente che contenga solo le strutture di base.
La struttura iterativa pre-condizionale
E’ possibile definire una struttura di iterazione derivata che preveda la possibilità di non eseguire affatto le
istruzioni contenute nel ciclo, a differenza della iterazione post-condizionale, in cui le istruzioni del ciclo
vengono eseguite almeno una volta.
Pseudocodifica
MENTRE condizione
istruzioni
RIPETI
L’elenco di istruzioni da ripetere costituiscono il corpo del ciclo, e vengono dopo della valutazione della
condizione. Se la condizione è vera si esegue il ciclo, se è falsa si passa ad eseguire la prima istruzione dopo il
ciclo.
Esercizio
Calcolo del prodotto tra interi utilizzando la sola operazione di somma.
Come specificato in precedenza l’iterazione pre-condizionale può essere espressa per mezzo dell’iterazione
post-condizionale. Bisogna solo fare attenzione alla condizione di uscita dal ciclo che per la pre-condizionale è
condizione falsa, per la post-condizionale è condizione vera.
Esempio di equivalenza
RIPETI
Istruzioni
FINCHE’ (a=0)
MENTRE (a<>0)
Istruzioni
RIPETI
La struttura iterativa con contatore
E’ un’altra struttura derivata di ripetizione che permette di ripetere un certo gruppo di istruzioni non in base al
valore di verità di una condizione logica, ma in base al numero di volta che si vuole ripetere il gruppo di
istruzioni. Questa struttura è utilizzabile tutte le volte che il numero di ripetizioni è noto a priori.
Pseudocodifica
PER variabile-contatore DA valore-iniziale A valore-finale
istruzioni
INCREMENTA variabile-contatore
Il numero di cicli è controllato dal valore della variabile contatore, che viene incrementata di una unità ad ogni
ciclo. Il ciclo sarà ripetuto finchè il valore di tale variabile è compreso nell’intervallo definito dal valore iniziale
e dal valore finale.
Esercizio
Data in input una serie di N numeri interi positivi, determinare il massimo tra essi.
Anche in questo caso siamo in presenza di una struttura derivata che può essere espressa per mezzo di una
struttura base.
Esempio di equivalenza
PER variabile-contatore DA valore-iniziale A valore-finale
istruzioni
INCREMENTA variabile-contatore
È equivalente a
variabile-contatore  valore iniziale
RIPETI
Istruzioni
variabile-contatore  (variabile-contatore + 1)
FINCHE’ (variabile-contatore>valore finale)
Variante
E’ possibile specificare un PASSO per modificare l’entità dell’incremento
Pseudocodifica
PER variabile-contatore DA valore-iniziale A valore-finale PASSO incremento
istruzioni
INCREMENTA variabile-contatore
La struttura scelta multipla
Lo schema organizzativo dell’alternativa a due vie non sempre risponde alle necessità che si possono incontrare
nella stesura degli algoritmi. Per risolvere questioni più complesse rispetto alla struttura alternativa è stato
introdotto lo schema della scelta multipla (selezione multipla).
Pseudocodifica
CASO DI variabile =
Lista valori-1
Istruzioni-1
Lista valori-2
Istruzioni-2
……………………
Lista valori-n
Istruzioni-n
ALTRIMENTI
Istruzioni
FINE-CASO
Il funzionamento prevede che se il valore della variabile è presente in una delle liste di valori allora viene
eseguito il blocco di istruzioni corrispondente, successivamente si procede con la prima istruzione dopo il
FINE-CASO. In caso contrario viene eseguito il blocco di istruzioni associato ad ALTRIMENTI e si passa alla
prima istruzione dopo il FINE-CASO.
Esercizio
Scrivere una pseudocodifica equivalente a quella della struttura di scelta multipla utilizzando solo strutture di
base.
Esercizio
Per la vendita di un prodotto si deve applicare uno sconto progressivo in base al numero di pezzi ordinati,
secondo la tabella:
Pezzi
Fino a 3
Fino a 5
Fino a 10
Oltre 10
Sconto
5%
10%
20%
30%
Le strutture dati
In molti problemi si ha la necessità di aggregare molti dati di tipo semplice per facilitarne la rappresentazione e
rendere più veloce il loro ritrovamento.
I dati sono organizzati in un insieme che prende il nome di struttura dati
Tipo strutturato: Array (vettore)
E’ una struttura statica e sequenziale che viene utilizzato per rappresentare un insieme di elementi omogenei
(dello stesso tipo) tra loro
A
1
Matematica
2
Inglese
3
Italiano
4
Storia
5
Filosofia
Per identificare l’intero vettore si utilizza una variabile (A), che va dichiarata nella tabella di progetto.
Per identificare le singole componenti si utilizza un indice (i) che ne individua la posizione
A[3]: indica il contenuto del terzo elemento del vettore A
Per dimensione del vettore si intende il numero di componenti da cui esso è costituito. Tale dimensione è
prefissata e non può essere modificata nel corso del programma (da qui la caratteristica di essere una struttura
statica).
La scelta della dimensione del vettore è molto importante:
 una dimensione troppo piccola rischia di rendere il vettore inutilizzabile
 una dimensione troppo grande comporta uno spreco dello spazio di memoria
Esempio
Caricare due vettori di dimensione 3 con valori di tipo numerico e produrre in output la somma dei valori in essi
contenuto
Breve analisi
Il problema può essere scomposto in tre fasi distinte e sequenziali. La prima fase prevede il caricamento del
vettore A, successivamente si può passare al caricamento del vettore B, infine è necessario realizzare un ciclo
che sommi i valori contenuti nei due vettori, producendo le due somme in output.
Tabella di progetto
Identificatore
A
B
i
n
SA
SB
Var/Cost
V
V
V
V
V
V
I/O/L
L
L
L
I
O
O
Tipo
Vettore Numerico
Vettore Numerico
Numerico
Numerico
Numerico
Numerico
Descrizione
Vettore di dimensione 3
Vettore di dimensione 3
Indice di scansione dei vettori
Valore per l’input
Somma dei valori contenuti in A
Somma dei valori contenuti in B
INIZIO
PseudoCodifica e Diagramma a blocchi
Inizio
SA  0; SB  0; i  1
SA  0
SB  0
PER i DA 1 A 3
Leggi (n)
A[i]  n
INCREMENTA i
PER i DA 1 A 3
Leggi (n)
B[i]  n
INCREMENTA i
PER i DA 1 A 3
SA  SA + A[i]
SB  SB + B[i]
INCREMENTA i
Scrivi (SA)
Scrivi (SB)
A[i]  n
Leggi (n)
No
ii+1
i=3
Sì
i=1
B[i]  n
Leggi (n)
Fine
No
ii+1
i=3
Sì
i=1
SA  SA + A[i]
SB  SB + B[i]
Sì
No
ii+1
Scrivi
(SA; SB)
i=3
FINE
Tabella di prova
i
1
2
3
1
2
3
1
2
3
n
2
5
7
4
6
8
SA
0
2
7
14
SB
0
4
10
18
A[1]
2
A[2]
5
A[3]
7
B[1]
4
B[2]
6
B[3]
8
Algoritmi fondamentali per il vettore
L’algoritmo più utilizzato per i vettori è il loro caricamento, che consiste semplicemente in un ciclo di lettura
dei valori da inserire ed assegnamento sequenziale di tali valori alle componenti del vettore
PseudoCodifica (vettore generico di dimensione d)
Inizio
PER i DA 1 A d
Leggi (n)
A[i]  n
INCREMENTA i
Fine
Il principale obiettivo del raggruppamento di elementi in un vettore è la facilitazione delle operazioni di ricerca
di uno o più elementi
Se gli elementi di un vettore non sono ordinati l’unico criterio di ricerca possibile è la ricerca sequenziale.
Essa consiste nello “scorrere” il vettore dall’inizio fino a che non si trova l’elemento cercato, oppure fino a che
non si è esaminato l’intero vettore, in tal caso l’elemento da ricercare non è presente nel vettore.
Ricerca in un vettore non ordinato
Tabella di progetto
Id
A
DIM
i
N
Cost/Var
C
V
V
Tipo
Vettore Num
Num
Num
Num
I/O/L
I
O
I
Descrizione
Vettore da caricare
Dimensione del vettore
Indice
Valore da ricercare
Tabella di prova (Dim = 5)
INIZIO
A1
7
A2
2
A3
9
A4
10
A5
1
i
1
2
3
N
9
i := 1 ; DIM := 5
LEGGI N
A(i) = N
V
SCRIVI i
F
i := i + 1
F
i = DIM
FINE
V
SCRIVI
"NON TROVATO"
N.B.: Nel diagramma viene utilizzato per l’assegnamento il simbolo “:= “in luogo del simbolo “”. I due
simboli sono equivalenti.
Questo tipo di ricerca è abbastanza efficiente per vettori di piccole dimensioni. Potrebbe, viceversa, diventare
“pesante” se le dimensioni del vettore sono eccessivamente grandi.
A tale scopo è utile trovare strategie diverse per la ricerca di un elemento in un vettore, ad esempio,
ordinandolo ed eseguendo una ricerca molto più efficiente dell’elemento
Ordinamento di un vettore
Esistono vari criteri di ordinamento di un vettore, ma nessuno di essi può essere considerato il migliore in
assoluto. La bontà di un algoritmo di ordinamento dipende da molti fattori tra cui la dimensione del vettore
stesso ed il livello di “disordine” presente all’interno del vettore da ordinare.
Tabella di progetto
Id
A
DIM
i
J
T
Cost/Var
C
V
V
V
Tipo
Vettore Num
Num
Num
Num
Num
I/O/L
Descrizione
Vettore da caricare
Dimensione del vettore
Indice
Indice
Temporaneo per scambio
I
L
L
L
INIZIO
i := 1 ; DIM := 5
J := i + 1
i := i + 1
F
i = DIM
F
V
A(i) > A(J)
FINE
V
T := A(i)
A(i) := A(J)
A(J) := T
Ricerca in un vettore ordinato
Ricercare un elemento in un vettore ordinato è molto più semplice ed efficiente. Basti pensare a cosa andremmo
incontro se, ad esempio, l’elenco telefonico non fosse disposto in ordine alfabetico.
Esistono diverse tecniche di ricerca in un vettore ordinato
Ricerca sequenziale
Tabella di progetto
Id
A
DIM
I
N
Cost/Var
C
V
V
Tipo
Vettore Num
Num
Num
Num
I/O/L
I
L
I
Descrizione
Vettore da caricare
Dimensione del vettore
Indice
Valore da ricercare
INIZIO
i := 1 ; DIM := 5
LEGGI N
A(i) = N
V
SCRIVI i
F
A(i) > N
V
F
i := i + 1
F
i = DIM
FINE
V
SCRIVI
"NON TROVATO"
Tale algoritmo di ricerca sequenziale in un vettore ordinato inizia la ricerca dal primo elemento, terminando nel
caso di successo della ricerca
I casi di insuccesso possono verificarsi se il vettore viene completamente analizzato, oppure se, essendo
ordinato in modo crescente, viene trovato un elemento superiore a quello cercato.
Ricerca dicotomica
PseudoCodifica
INIZIO
Leggi(n)
Trovato  Falso
SX  1
DX  Dim
RIPETI
MD  INT(SX + DX)/2)
SE (A[SX] = n) OR (A[DX] = n) OR (A[MD] = n)
ALLORA
Trovato  Vero
ALTRIMENTI
SE A[MD] < n
ALLORA
SX  MD + 1
ALTRIMENTI
DX  MD – 1
FINE_SE
FINE_SE
FINCHE’ (SX>DX) OR (Trovato = Vero)
SE Trovato = Vero
ALLORA
Scrivi(“Valore Presente”)
ALTRIMENTI
Scrivi(“Valore Assente”)
FINE_SE
FINE
Il confronto tra algoritmi che risolvono lo stesso problema si fa in relazione al numero di operazioni che
eseguono per giungere alla soluzione. Spesso l’ottimalità di un algoritmo rispetto ad un altro non dipende
esclusivamente dall’algoritmo stesso, ma anche da altri fattori.
La ricerca dicotomica è, in generale, migliore di quella sequenziale, ma è evidente che se l’elemento da cercare
si trova in A[1], quella sequenziale è più veloce!
Esercizi Vettori
Per ogni esercizio, dopo aver fatto una breve analisi, costruire tabella di progetto, pseudocodifica, diagramma di
flusso e tabella di prova (limitando a piacere la dimensione del vettore se dovesse risultare eccessiva per
effettuare una prova significativa).
1.
Dato un vettore di 7 elementi di tipo numerico, precaricato e già ordinato, costruire un nuovo vettore
che sia identico a quello dato, ma con gli elementi in ordine inverso.
2.
Caricare un vettore di 6 elementi di tipo numerico e costruire un nuovo vettore che contenga solo gli
ultimi k elementi del vettore dato, con k letto da tastiera.
3.
Caricare un vettore di 10 elementi di tipo numerico e fornire in output l’elemento di valore massimo e
quello di valore minimo. Calcolare poi la media dei 10 elementi.
4.
Caricare un vettore di 10 elementi di tipo numerico e fornire in output l’elemento ripetuto il maggior
numero di volte. Se ci sono più elementi che soddisfano la richiesta, fornire un output quello memorizzato
nella posizione di indice maggiore.
5.
Convertire un numero decimale dato in input nella sua rappresentazione binaria, memorizzandola in un
vettore.
6.
Dati due vettori di 5 elementi di tipo numerico, precaricati, costruire un nuovo vettore che contenga solo
gli elementi comuni ai due vettori dati (intersezione).
7.
Dati due vettori di 5 elementi di tipo numerico, precaricati, costruire un nuovo vettore che contenga
l’unione degli elementi dei due vettori dati.
8.
Una parola viene definita “palindrome” quando risulta identica sia se letta da sinistra a destra, sia se
letta da destra a sinistra. (Esempio: ANNA). Dato un vettore di 5 elementi di tipo “carattere”, precaricato,
scrivere un algoritmo che stabilisca se la parola memorizzata nel vettore è una palindrome o meno.
N.B.: non è essenziale che la parola sia di senso compiuto.
N.B.: L’output dell’algoritmo è un semplice messaggio del tipo “Palindrome” oppure “Non Palindrome”.
9.
Analizzare lo stesso problema dell’esercizio precedente con la differenza che il vettore sia di
dimensione 4.
Cambia qualcosa nell’algoritmo risolutivo?
Se sì, che cosa? E perché?
Strutture dati: Il record
Un singolo oggetto necessita spesso di molti dati per essere adeguatamente descritto: per esempio, di un libro
oltre al titolo vogliamo sapere il nome degli autori, l’anno ed il luogo di edizione, la casa editrice ed altre
informazioni.
Diventa allora comodo poter aggregare tutte queste informazioni in un’unica struttura che possa contenerle.
Una tale struttura si diversifica dal vettore perché contiene dati fra loro non omogenei, cioè numeri, parole,
codici alfanumerici ed anche strutture complesse come i vettori.
Tale struttura viene denominata record e lo spazio per una singola informazione che lo costituisce si chiama
campo del record.
Per rappresentare un record occorre stabilire a priori quali sono i campi che lo compongono e le loro
caratteristiche, andando a determinare quello che si definisce tracciato del record.
Per ogni campo va definito il nome ed il tipo a livello di tabella di progetto.
Vediamo alcuni esempi:
Supponiamo di dover utilizzare un record per memorizzare i dati di una persona vista come studente
universitario.
Tracciato record STUDENTE_UNIVERSITARIO
Nome campo
Matricola
Nome
Indirizzo
DataNascita
CodiceFiscale
EsamiSuperati
Tipo campo
numerico
alfabetico
alfanumerico
Data
alfanumerico
numerico
Descrizione campo
Numero di matricola dello studente
Nome dello studente
Indirizzo dello studente
Data di nascita dello studente
C.F. dello studente
Numero di esami superati
Nella tabella di progetto va inserito il solo riferimento al record insieme a tutte le altre variabili utili per la
progettazione dell’algoritmo.
Identificatore
n
i
…………..
Studente_Universitario
Tipo
numerico
numerico
……………..
Record
I/O/L
I
L
…………
V/C
V
V
………
Descrizione
Variabile di input
Contatore
………..
Per utilizzare un record a livello di pseudocodifica è necessario conoscere la sintassi con cui ci si riferisce alla
struttura record.
Teoricamente tutto avviene nello stesso modo in cui si è utilizzata una variabile di tipo vettore, per cui bisogna
distinguere il concetto di record (struttura), dal concetto di campo (dato), così come erano differenziati i
concetti di vettore (struttura) e di componente del vettore (dato).
Con riferimento ai vettori ricordiamo che A era il nome del vettore, mentre le singole componenti venivano
individuate tramite la sintassi A[i]. Va precisato che erano le singole componenti ad essere usate a livello
sintattico nella pseudocodifica, in quanto esse contenevano il singolo dato, mentre il vettore rappresentava la
struttura. Così la componente A[i] era usata per le operazioni di assegnamento, la valutazione di condizioni
logiche, le operazioni di lettura e scrittura, ecc.
Allo stesso modo il record rappresenta la struttura mentre i singoli campi contengono i dati, per essi va
determinata una sintassi di riferimento, e saranno i campi ad essere utilizzati per le varie operazioni funzionali
all’algortmo.
In generale si ha: nome_record.nomecampo
Ad esempio per assegnare un valore al nome dello studente universitario si scriverà:
Studente_Universitario.Nome ← “Mario Rossi”
Utilizzo dei record
Per rappresentare in modo efficace le strutture dati si possono utilizzare tutti i tipi di dati visti finora e questi
possono essere combinati tra loro: un campo di un record può essere, oltre che di un tipo elementare, a sua volta
un record oppure un vettore. Così come gli elementi di un vettore possono essere a loro volta di tipo record.
Campo del record di tipo vettore
Un record serve a rappresentare informazioni eterogenee in merito ad oggetti di una certa realtà. Tali oggetti
sono caratterizzati da informazioni che possono essere di diversi tipi. Con riferimento all’oggetto “persona”
possiamo individuare varie caratteristiche quali il nome (alfabetico), l’età (numerico), l’indirizzo
(alfanumerico), ecc… E’ possibile che una di queste informazioni si presenti sotto forma di elenco omogeneo.
Ad esempio l’elenco dei voti (numerico) per uno studente. In tal caso è possibile definire come tipo vettore tale
elenco che in ogni caso è una caratteristica dello studente e come tale va descritta tramite un campo del record.
Esempio
Scrivere un programma che calcoli la media (4 materie) dei voti di uno studente e riporti in output il suo nome e
la media calcolata.
Breve analisi
Utilizzo una struttura record per codificare lo studente con tutte le sue informazioni. Dopo aver preso in input i
suoi dati calcolo la media e produco in output i risultati richiesti.
Tabella di progetto
Tracciato record Studente
Nome campo
Nome
Voti
Identificatore
Nome_s
Voto_Materia
i
Tot
Media
S
Tipo campo
alfabetico
Vettore numerico
Tipo
Alfabetico
numerico
numerico
numerico
Descrizione campo
Nome dello studente
Elenco dei voti dello studente (Dim = 4)
I/O/L
I/O
I
L
L
O
Record Studente
Pseudocodifica
Inizio
Tot  0;
Leggi (Nome_s);
S.Nome  Nome_s;
Per i da 1 a 4
Leggi(Voto_Materia);
S.Voti[i]  Voto_materia;
Incrementa i;
Per i da 1 a 4
Tot  Tot + S.Voti[i];
Incrementa i;
V/C
V
V
V
V
V
Descrizione
Nome dello studente
Voto di italiano
Indice vettore voti
Somma dei voti
Risultato della media
Record studente
Media  Tot/4;
Scrivi (Nome_s);
Scrivi (media);
Fine…Si lascia per esercizio la prosecuzione dell’esempio con il diagramma di flusso e la tabella di prova.
Le tabelle (vettori di record)
Il vettore di record è una struttura molto importante e molto utilizzata, tanto da assumere, come struttura, un
nome ben preciso. Esso viene identificato come tabella perché si può schematizzare come una tabella
contenente tante colonne quanti sono i campi del record e tante righe quante sono le componenti del vettore.
Una tale struttura serve per dare un significato più completo al tipo record ed a ciò che rappresenta nella realtà.
In effetti abbiamo detto che un record serve a memorizzare informazioni eterogenee di uno specifico oggetto,
informazioni che ne rappresentano le singole caratteristiche di interesse.
Nella realtà questo oggetti si trovano aggregati in elenchi, e per questo motivo è necessario prevedere una
struttura che sia in grado di rappresentare collezioni di oggetti.
Esempio
L’elenco telefonico è una “collezione” di persone, ed ogni persona è individuate da certe caratteristiche
eterogenee. In tal senso è opportuno individuare un tipo “Persona” da rappresentare mediante un record, ed un
tipo “ElencoTelefonico”, che non è altro che un vettore di persone. Da notare che il concetto di elenco di
persone rispetta la struttura a vettore in quanto è una collezione di oggetti omogenei tra loro.
Proviamo a scrivere allora la tabella di progetto e la pseudocodifica di un algoritmo che ricerchi una persona
data in input, all’interno di un elenco telefonico precaricato in tutte le sue componenti.
N.B.:
 Della persona si utilizza solo il cognome e si ipotizza che non esistano omonimie.
 L’elenco è limitato a 100 persone ed è già caricato in modo ordinato.
 Si sceglie di utilizzare la ricerca sequenziale su un vettore ordinato.
Tabella di progetto
Tracciato record Persona
Nome campo
Nome_P
Indirizzo_P
Numero_telefonico_P
Identificatore
E_T
Cognome
Num_Tel
Indirizzo
Num_Pers
Trovato
Mess
Tipo campo
Alfabetico
Alfanumerico
Alfanumerico
Tipo
Vettore di Persona
Alfabetico
Alfanumerico
Alfanumerico
Numerico
Logico
Alfabetico
Descrizione campo
Nome della persona
Indirizzo della persona
Numero di telefono
I/O/L
V/C
I/O
O
O
L
L
O
V
V
V
C
V
C
Descrizione
Vettore elenco telefonico (Dim = 100)
Input del cognome da ricercare
Output del numero telefonico della persona trovata
Output dell’indirizzo della persona trovata
Numero di persone in elenco (100)
Variabile logica per la ricerca
Messaggio “Non trovato”
Pseudocodifica
Inizio
Num_Pers ← 100;
i ← 0;
Trovato ← Falso;
Leggi (cognome);
Ripeti
i ← i + 1;
se cognome = E_T[i].Nome_P
allora
Trovato ← Vero;
Fine_Se;
Finchè (trovato = vero) or (i=dim)
Se trovato = vero
Allora
Num_Tel ← E_T[i].Numero_Telefonico_P;
Indirizzo ← E_T[i].Indirizzo_P;
scrivi(Cognome;Indirizzo;Indirizzo);
Altrimenti
Scrivi (Mess);
Fine_se;
Fine.
Esercizi
1.
Progettare una struttura dati adeguata a contenere un elenco di cd musicali, scegliendo opportunamente
le caratteristiche da codificare per ogni cd in funzione della scrittura di un algoritmo che determini il cd
ascoltato più volte ed il cd meno costoso. La struttura non è precaricata, quindi i cd vanno inseriti uno alla
volta scegliendo a piacere il loro quantitativo.
2.
Dato un elenco di 100 persone di cui sono noti il cognome, l’età e la professione (da scegliere tra
insegnante, avvocato ed ingegnere). Scrivere un algoritmo che calcoli il numero degli avvocati che abbiano
superato i 40 anni. L’elenco è precaricato ed ordinato alfabeticamente per professione.
3.
In una prova di corsa campestre per ogni atleta (noto per cognome) si registrano il tempo a metà gara ed
il tempo finale. Scrivere un algoritmo che fornisca in output il cognome dell’atleta che ha registrato il
miglior tempo intermedio ed il cognome dell’atleta che ha vinto la gara.
Si prevede la presenza di 50 atleti in una struttura precaricata, ma non ordinata.
4.
Una biblioteca gestisce un servizio di prenotazioni archiviando i 100 titoli di cui dispone in una struttura
che prevede per ogni libro il titolo, l’autore ed il numero di copie disponibili. Scrivere due algoritmi che
realizzino il prestito e la restituzione di un libro (da ricercare per titolo). L’elenco dei libri è precaricato e
ordinato alfabeticamente per titolo. (Si consiglia di effettuare un’attenta analisi del problema).
NOTA
Una condizione logica di tipo OR (ma, con le opportune variazioni, vale anche per l’AND) viene valutata
sequenzialmente.
L’OR è vero quando almeno uno dei due operandi è vero. La valutazione sequenziale fa sì che una volta
valutato il primo operando, se questo viene trovato vero, non viene valutato il secondo operando in quanto il
risultato dell’OR sarebbe in ogni caso vero.
Esempio
A OR B
Se A è falso allora viene valutato B per poter ottenere il risultato
Se A è vero allora B viene ignorato in quanto il risultato dell’OR sarà in ogni caso vero indipendentemente del
valore di B
La conoscenza di questa modalità di valutazione è molto utile nelle condizioni logiche in cui gli operandi
contengono elementi di vettori
Supponiamo, ad esempio, di avere un vettore alfanumerico di dimensione 10 e che il valore della variabile i sia
11
La condizione (A[i] = “Paolo”) OR (i>10) è errata in quanto, valutando prima (A[i] = “Paolo”), si ha che A[11]
non esiste
La condizione (i>10) OR (A[i] = “Paolo”) è invece corretta perché, valutando prima (i>10) e trovandolo vero,
l’operando (A[i] = “Paolo”) non viene valutato e quindi non si genera l’accesso ad una posizione errata del
vettore A.
Da notare che le due condizioni sono equivalenti in quanto l’operatore logico OR gode della proprietà
commutativa.