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 AB AB+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) CA+B Scrivi (C) Dividere due numeri Leggi (A;B) Se B = 0 Allora Scrivi (“Errore”) Altrimenti CA/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 A2*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 CA/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) SA+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 SA+B+C MS/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 ii+1 i=3 Sì i=1 B[i] n Leggi (n) Fine No ii+1 i=3 Sì i=1 SA SA + A[i] SB SB + B[i] Sì No ii+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.