Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Algoritmi e Programmazione Strutturata: Fondamenti di Informatica, Appunti di Elementi di Informatica

Caratteri pricpali degli Algoritmi

Tipologia: Appunti

2011/2012

Caricato il 08/01/2012

fedenicolua
fedenicolua 🇮🇹

4.4

(101)

29 documenti

1 / 12

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Appunti diAppunti di
Fondamenti di InformaticaFondamenti di Informatica
Generalità sugli algoritmi
La nozione di algoritmo.............................................................................. 1
Rappresentazione grafica degli algoritmi....................................................2
Diagrammi di flusso..............................................................................4
Esempi di algoritmi numerici .....................................................................6
La strutturazione dei programmi................................................................. 8
LA NOZIONE DI ALGORITMO
La nozione di algoritmo riveste un ruolo di notevole rilievo nei fondamenti della teoria della
programmazione dei calcolatori elettronici. Se noi pensiamo ad un libro di aritmetica, esso è una
raccolta delle nozioni riguardanti il sistema di numerazione arabo e contiene la descrizione
dettagliata dei procedimenti necessari per eseguire le operazioni aritmetiche elementari su numeri
rappresentati nel sistema posizionale decimale. Tali procedimenti di calcolo vennero chiamati, da un
certo momento in poi, algoritmi ed il termine algoritmo viene perciò da quel momento utilizzato
come sinonimo di "procedimento di calcolo". La necessità di formulare definizioni più precise del
concetto di algoritmo ha portato poi allo sviluppo di una vera e propria teoria degli algoritmi.
Def. Si dirà perciò algoritmo un "insieme di istruzioni che definiscono una
sequenza di operazioni mediante le quali si risolvono tutti i problemi di
una determinata classe".
Questa definizione viene completata dalla enunciazione delle proprietà sottoelencate, che
caratterizzano maggiormente la nozione di algoritmo:
1) carattere finito: il numero delle istruzioni che definiscono un algoritmo è finito e le
operazioni da esse specificate vengono eseguite un numero finito di volte. Naturalmente,
affinché un algoritmo possa essere veramente utile, il numero delle istruzioni che lo
compongono deve essere limitato, mentre una singola operazione può anche essere eseguita un
numero molto alto di volte (questo è, ad esempio, il caso dei procedimenti iterativi che,
come vedremo, si interrompono solo quando si è verificata una certa condizione);
2) carattere deterministico: ogni istruzione che fa parte di un algoritmo provoca l'esecuzione
di una o anche più operazioni. Tali operazioni devono essere definite "senza ambiguità”, in
modo tale, cioè, da garantire che i risultati ottenuti utilizzando più volte un algoritmo per la
soluzione di un problema siano sempre gli stessi, a prescindere dalla persona o dalla macchina
che esegue l'algoritmo stesso;
pf3
pf4
pf5
pf8
pf9
pfa

Anteprima parziale del testo

Scarica Algoritmi e Programmazione Strutturata: Fondamenti di Informatica e più Appunti in PDF di Elementi di Informatica solo su Docsity!

Appunti diAppunti di

Fondamenti di InformaticaFondamenti di Informatica

Generalità sugli algoritmi

La nozione di algoritmo.............................................................................. 1 Rappresentazione grafica degli algoritmi .................................................... 2 Diagrammi di flusso.............................................................................. 4 Esempi di algoritmi numerici ..................................................................... 6 La strutturazione dei programmi................................................................. 8

LA NOZIONE DI ALGORITMO

La nozione di algoritmo riveste un ruolo di notevole rilievo nei fondamenti della teoria della programmazione dei calcolatori elettronici. Se noi pensiamo ad un libro di aritmetica, esso è una raccolta delle nozioni riguardanti il sistema di numerazione arabo e contiene la descrizione dettagliata dei procedimenti necessari per eseguire le operazioni aritmetiche elementari su numeri rappresentati nel sistema posizionale decimale. Tali procedimenti di calcolo vennero chiamati, da un certo momento in poi, algoritmi ed il termine algoritmo viene perciò da quel momento utilizzato come sinonimo di "procedimento di calcolo". La necessità di formulare definizioni più precise del concetto di algoritmo ha portato poi allo sviluppo di una vera e propria teoria degli algoritmi.

Def. Si dirà perciò algoritmo un "insieme di istruzioni che definiscono una sequenza di operazioni mediante le quali si risolvono tutti i problemi di una determinata classe".

Questa definizione viene completata dalla enunciazione delle proprietà sottoelencate, che caratterizzano maggiormente la nozione di algoritmo:

  1. carattere finito : il numero delle istruzioni che definiscono un algoritmo è finito e le operazioni da esse specificate vengono eseguite un numero finito di volte. Naturalmente, affinché un algoritmo possa essere veramente utile, il numero delle istruzioni che lo compongono deve essere limitato, mentre una singola operazione può anche essere eseguita un numero molto alto di volte (questo è, ad esempio, il caso dei procedimenti iterativi che, come vedremo, si interrompono solo quando si è verificata una certa condizione);
  2. carattere deterministico : ogni istruzione che fa parte di un algoritmo provoca l'esecuzione di una o anche più operazioni. Tali operazioni devono essere definite "senza ambiguità”, in modo tale, cioè, da garantire che i risultati ottenuti utilizzando più volte un algoritmo per la soluzione di un problema siano sempre gli stessi, a prescindere dalla persona o dalla macchina che esegue l'algoritmo stesso;

Appunti di “Fondamenti di Informatica”

  1. carattere di realizzabilità pratica : tutte le operazioni che vengono richieste dalle istruzioni di un algoritmo devono essere effettivamente eseguibili, cioè devono essere già conosciute in precedenza o dall'utente o dalla macchina che le deve eseguire.

RAPPRESENTAZIONE GRAFICA DEGLI ALGORITMI

Trattiamo adesso un noto algoritmo elementare e descriviamo poi la sua rappresentazione grafica.

Trovare il massimo comune divisore di due numeri dati, m e n, interi positivi.

RISOLUZIONE E SPIEGAZIONE: Un algoritmo che risolve questa "classe di problemi" viene detto algoritmo di Euclide. Fondamentalmente, esso si basa sulla ripetuta applicazione della seguente proprietà: data una qualsiasi divisione tra un dividendo e un divisore, entrambi interi, ogni numero che divide sia il dividendo sia il divisore ne divide anche il resto nel caso che questo non sia nullo. Difatti, dati i due numeri interi positivi m e n, supponendo che m sia maggiore di n, possiamo sempre scrivere che m =q⋅n+ r

dove q è il quoziente ed r è il resto della divisione m/n. Se risulta r=0, allora m è un multiplo di n per cui n è il massimo comun divisore ricercato; invece, se il resto non è nullo, dalla relazione precedente ricaviamo che

m −q⋅n=r

Confrontando le due relazioni, si deduce che l'insieme dei divisori comuni di m ed n coincide con l'insieme dei divisori comuni di n ed r: quindi, il massimo comun divisore di m ed n corrisponde al massimo comun divisore di n ed r. Allora, il nostro problema diventa il seguente: trovare il massimo comun divisore di n ed r , dove r è il resto della divisione di m per n (supponendo che m≥n). Se si applica nuovamente ad n ed r il ragionamento fatto sui numeri m ed n e se si procede in modo "iterativo", si realizza un procedimento che viene cosi schematizzato:

  1. m = q 1 ⋅n+r 1 con 0≤r 1 <n

se r 1 =0 → è il Max Comun Divisore

  1. se r 1 ≠ 0 → n = q 2 ⋅r 1 +r 2 con 0≤r 2 <r 1

se r 2 =0 → r 1 è il MCD

  1. se r 2 ≠ 0 → r 1 = q 3 ⋅r 2 +r 3 con 0≤r 3 <r 2

se r 3 =0 → r 2 è il MCD

............ ............

Appunti di “Fondamenti di Informatica”

Diagrammi di flusso

La necessità di descrivere dettagliatamente la sequenza operativa completa di un algoritmo e quella, ancora più evidente, di dare a tale descrizione caratteristiche di chiarezza e di brevità, hanno portato alla ricerca di metodi convenienti per la descrizione degli algoritmi. Uno dei metodi più utili consiste nella rappresentazione dell'algoritmo mediante un diagramma , nel quale ad ogni istruzione viene associato un simbolo grafico particolare (la cui forma dipende appunto dal tipo di istruzione). I diagrammi utilizzati per la descrizione degli algoritmi vengono comunemente detti diagrammi logici o diagrammi a blocchi o flow-chart o diagrammi di flusso. I vari simboli grafici che costituiscono i diagrammi a blocchi si susseguono dall'alto verso il basso e sono collegati tra loro per mezzo di tratti rettilinei ; su tali tratti rettilinei è anche stabilito un orientamento (mediante frecce) per indicare l'ordine di esecuzione delle istruzioni. Quando la successione di due istruzioni è implicita, allora le frecce possono essere anche omesse. Per comprendere come sia fatto un generico diagramma di flusso, cominciamo con un esempio concreto e, in particolare, proviamo a rappresentare il diagramma dell'algoritmo di Euclide. Prima di tracciare il diagramma, però, è necessario fare alcune considerazioni preliminari. Dobbiamo in primo luogo osservare che è indispensabile premettere delle nuove istruzioni alle 4 date in precedenza:

  • ad esempio dire, nella istruzione 1, "considerare i due numeri dati" presuppone una operazione mediante la quale i due numeri (cioè i dati su cui si deve operare) vengono introdotti nell'ambiente in cui l'algoritmo viene eseguito; dobbiamo dunque inserire, prima della istruzione 1, una istruzione che indichi l’ introduzione dei dati ;
  • allo stesso modo, è necessario aggiungere, prima della fine dell'algoritmo, una istruzione che evidenzi l' uscita del risultato dall'ambiente in cui l'algoritmo viene eseguito;
  • infine, sarebbe opportuno inserire, ma non lo faremo per brevità, prima che comincino le operazioni, anche una istruzione che permetta all'esecutore dell'algoritmo (sia esso una persona o un calcolatore) di controllare che i dati ricevuti soddisfino le condizioni richieste (cioè che i due numeri siano interi e positivi).

Osserviamo inoltre che l'istruzione 4 avrebbe potuto essere indicata in modo più preciso: infatti, sostituire alla coppia m,n la coppia n,r significa "assegnare" alla variabile indicata con m il valore che aveva in precedenza la variabile n e assegnare alla variabile indicata con n il valore della variabile r. Per indicare una assegnazione di questo tipo si usa una notazione del tipo

→→

Questa notazione specifica che il valore che si ottiene dal calcolo dell'espressione alla sinistra della freccia deve essere assegnato alla variabile indicata a destra. Ad esempio n → m si legge "n va in m". Un altro tipo di notazione, utilizzato in alcuni linguaggi di programmazione, è il seguente:

:=

L'uso del simbolo ":=" al posto del semplice "=" ha lo scopo di evidenziare che si tratta di una assegnazione e non di una relazione di uguaglianza.

Generalità sugli algoritmi

Sulla base di queste considerazioni, possiamo adesso tracciare il diagramma a blocchi dell’algoritmo di Euclide:

Si nota, in questo diagramma, la presenza dei seguenti simboli grafici (o blocchi ):

Inizio/Fine dell'algoritmo

Istruzioni

Input/Output dei dati

Condizione

Come si vede, ognuno di essi corrisponde ad una precisa tipologia di istruzioni: c’è un blocco corrispondente all’inizio o alla fine dell’algoritmo, c’è un blocco corrispondente all’esecuzione di

Generalità sugli algoritmi

Istruzione 7 - ( estrazione di x e arresto )

Si segnala la radice trovata e l'algoritmo si ferma

Istruzione 8 - ( determinazione del discriminante )

Questa istruzione è valida nel caso, nell'istruzione 4, si sia trovato che a≠0: in questo caso, l'equazione è di 2° grado e bisogna quindi calcolare il discriminante (=b^2 -4ac) per stabilire il tipo di radici (reali e distinte, reali e coincidenti oppure complesse coniugate)

Istruzione 9 - ( discriminante ≥ 0 )

Si valuta la proposizione per cui il discriminante risulta positivo o al più nullo: se la proposizione è vera (e si hanno perciò comunque 2 radici reali, distinte o coincidenti) si passa all'istruzione 10, altrimenti si passa all'istruzione 15 (per le radici complesse)

Istruzione 10 - ( discriminate =0 )

Si valuta la proposizione per cui il discriminante risulta =0. Se la proposizione è vera (2 radici reali coincidenti) si passa all'istruzione 11, altrimenti si passa alla 12

Istruzione 11 - ( determinazione delle radici reali coincidenti )

Si calcola il valore delle due radici reali e coincidenti mediante la semplice formula

2 a

b x 1 = x 2 =− e si passa all'istruzione 14

Istruzione 12 - ( calcolo della radice quadrata S del discriminante )

Istruzione 13 - ( determinazione delle radici reali e distinte )

Si calcolano i valori delle due radici reali e distinte mediante le formule 2 a

b S x 1

= e

2 a

b S x (^2)

Istruzione 14 - ( estrazione di x 1 e x 2 ed arresto )

Dopo aver provveduto al calcolo delle radici o nel caso del discriminante nullo (istruzione 11) o in quello del discriminante positivo (istruzione 13), si segnalano le radici e si arresta il procedimento

Istruzione 15 - ( calcolo della radice quadrata del valore assoluto del discriminante )

Se il discriminate è minore di zero, le radici sono complesse e coniugate per cui bisogna calcolarne la parte reale e quella immaginaria

Appunti di “Fondamenti di Informatica”

Istruzione 16 - ( calcolo della parte reale PR delle radici complesse coniugate )

Se il discriminante è minore di zero, una volta calcolata la radice quadrata del suo valore assoluto (istruzione 15) si calcola la parte reale delle radici complesse coniugate mediante la

semplice formula 2 a

b PR

Istruzione 17 - ( calcolo del coefficiente CI della parte immaginaria )

Si calcola il coefficiente della parte immaginaria mediante 2 a

4 ac b CI

−^2

Istruzione 18 - ( estrazione di PR e CI ed arresto )

Dopo aver provveduto alla estrazione della parte reale e del coefficiente della parte immaginaria delle due radici complesse coniugate, l'algoritmo si arresta.

LA STRUTTURAZIONE DEI PROGRAMMI

Nella costruzione degli algoritmi visti in precedenza non è stata seguita alcuna particolare disciplina e questo allo scopo di rendere la loro descrizione il più naturale possibile. Tuttavia, è evidente la necessità che gli algoritmi e quindi i programmi per calcolatore vengano costruiti applicando dei metodi che garantiscano una buona strutturazione , che conducano cioè ad algoritmi chiari, il più possibile semplici e comprensibili anche a distanza di tempo dal momento in cui sono stati usati per la prima volta. Tra i metodi proposti, occupa un posto di rilievo la programmazione strutturata della quale forniamo adesso qualche cenno. Con il termine programmazione strutturata si intende un metodo di lavoro caratterizzato da due regole principali:

  • in primo luogo, la costruzione degli algoritmi deve avvenire in modo top-down , ossia per raffinamenti successivi;
  • in secondo luogo, è necessario un uso disciplinato delle cosiddette strutture di controllo , cioè delle strutture che determinano la successione delle operazione descritte in un diagramma di flusso.

Il procedimento "top-down" viene realizzato descrivendo in modo preciso e formale i diversi livelli di dettaglio a cui si arriva a partire dalle linee generali dell'algoritmo risolutivo; questo permette di raggiungere una descrizione molto dettagliata dell'algoritmo stesso al punto da poter essere immediatamente tradotta in uno specifico linguaggio di programmazione. Eseguendo tale impostazione in modo corretto, si riducono i problemi legati alla comunicazione tra le varie parti del programma, si riducono i problemi di prova del programma stesso e quelli legati alla cosiddetta manutenzione , ossia l'insieme degli interventi rivolti alla correzione, all'aggiornamento o all'eventuale miglioramento dei programmi dopo la loro prima utilizzazione. E' chiaro comunque che il significato di una corretta impostazione top-down dei programmi può essere illustrato con efficacia soltanto se si fa riferimento a programmi di notevole complessità. Passiamo adesso alle strutture di controllo : l'uso disciplinato di tali strutture è basato su un particolare teorema (di Jacopini-Bohm ) in cui si afferma che ogni diagramma di flusso

Appunti di “Fondamenti di Informatica”

Volendo rappresentare la diramazione multipla tramite un diagramma a blocchi, subentra una complicazione, derivante dal fatto che, al contrario della diramazione semplice, non esiste un blocco convenzionale (come il rombo) corrispondente alla diramazione multipla. Di conseguenza, il diagramma di flusso della diramazione multipla può essere visto come una combinazione in cascata di diramazioni semplici. Per chiarire questo concetto, supponiamo che la diramazione multipla preveda, per la variabile I, tre soli valori C 1 e C 2 , cui corrispondono perciò tre distinte sequenze S 1 , S 2 ed S 3. Il diagramma a blocchi, in questo caso, può essere il seguente:

I=C 1

Sequenza S 1

TRUE FALSE

I=C 2

Sequenza S 2

TRUE FALSE

I=C 3

Sequenza S 3

TRUE FALSE

In base a questa rappresentazione, viene per prima cosa controllata la condizione I=C 1 : se risulta vera, allora viene eseguita la sequenza di istruzioni S 1 corrispondente, altrimenti si passa a controllare la condizione I=C 2 ; anche in questo caso, se essa risulta vera viene eseguita la sequenza di istruzione S 2 corrispondente; se invece la condizione I=C 2 risulta falsa, allora le possibilità sono due: quella riportata nella figura presuppone che la variabile I possa assumere anche valori diversi da C 1 ,C 2 e C 3 , il che ovviamente rende necessario l’uso del blocco di decisione relativo alla condizione I=C 3 ; se invece l’algoritmo considerato fosse tale che I debba necessariamente assumere uno tra i valori C 1 ,C 2 e C 3 , allora il blocco di decisione relativo alla condizione I=C 3 non sarebbe necessario: infatti, se I non assume né il valore C 1 (prima condizione) né il valore C 2 (seconda condizione), sicuramente dovrà essere pari a C 3. Se facciamo dunque l’ipotesi che I debba necessariamente assumere uno tra i valori C 1 ,C 2 e C 3 , allora il diagramma a blocchi si può semplificare nel modo seguente:

Generalità sugli algoritmi

I=C 1

Sequenza S 1

TRUE FALSE

I=C 2

Sequenza S 2

TRUE FALSE

Sequenza S 3

Evidentemente, una volta appurato che la condizione I=C 2 è anch’essa falsa, si può subito passare all’esecuzione della sequenza S 3 , dato che sicuramente è verificata la condizione I=C 3. Tornando adesso alle strutture fondamentali di controllo, consideriamo l' iterazione , che può essere suddivisa in varie categorie:

  • c'è l' iterazione a condizione iniziale , nella quale si esegue (DO) o meno la sequenza S mentre (WHILE) una certa proposizione booleana P risulta vera (TRUE). Naturalmente, la proposizione P può risultare falsa alla prima esecuzione: in questo caso la sequenza S non è eseguita alcuna volta e l'algoritmo prosegue; il diagramma a blocchi è dunque il seguente:

P

Sequenza S

TRUE

FALSE