Programmazione e algoritmi

Documenti analoghi
Formalismi per la descrizione di algoritmi

Problema: dati i voti di tutti gli studenti di una classe determinare il voto medio della classe.

Dispensa di Informatica II.1

PROGRAMMAZIONE STRUTTURATA

La rappresentazione dell algoritmo Diagrammi di flusso

Altrimenti, il M.C.D. di a e b è anche divisore di r (e.g. a=15,b=6,r=3 che è il M.C.D.)

Algoritmi e Programmi

Diagrammi a blocchi 1

Il linguaggio di programmazione Python

in termini informali: un algoritmo è una sequenza ordinata di operazioni che risolve un problema specifico

Modulo 1. Concetti base della Tecnologia dell informazione. Prof. Nicolello Cristiano. Modulo 1

Diagrammi a blocchi 1

Informatica ALGORITMI E LINGUAGGI DI PROGRAMMAZIONE. Francesco Tura. F. Tura

Come ragiona il computer. Problemi e algoritmi

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Cosa è l Informatica?

Introduzione alla programmazione Algoritmi e diagrammi di flusso. Sviluppo del software

Lez. 5 La Programmazione. Prof. Salvatore CUOMO

Cos è un algoritmo. Si dice algoritmo la descrizione di un metodo di soluzione di un problema che sia

Appunti del corso di Informatica 1 (IN110 Fondamenti) 2 Algoritmi e diagrammi di flusso

Corso di Informatica di Base

Concetti Introduttivi. Il Computer

Programmazione strutturata

3. Indicare cosa sta a significare la figura geometrica del rombo in un diagramma a blocchi

Rappresentazione con i diagrammi di flusso (Flow - chart)

La codifica digitale

LA METAFORA DELL UFFICIO

Il Concetto Intuitivo di Calcolatore. Esercizio. I Problemi e la loro Soluzione. (esempio)

PROBLEMI ALGORITMI E PROGRAMMAZIONE

Problemi, algoritmi, calcolatore

PROGRAMMAZIONE (Corso A)

Informatica. Informatica. Problema - soluzione. Algoritmi, dati e programmi. Introduzione ai concetti di: Distinguiamo tra: problema

Teoria dell Informazione

Informatica Generale Andrea Corradini Gli algoritmi e la risoluzione di problemi

Cosa si intende con stato

Concetti di base dell ICT

Algoritmi e Linguaggi

Il concetto di calcolatore e di algoritmo

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Introduzione alla programmazione

Dispense di Informatica Anno Scolastico 2008/2009 Classe 3APS. Dall'Algoritmo al Programma

Istruzioni Condizionali

Algoritmi e soluzione di problemi

Introduzione alla programmazione Esercizi risolti

Modulo 1 Concetti di base della Tecnologia dell Informazione

Linguaggi di programmazione - Principi e paradigmi 2/ed Maurizio Gabbrielli, Simone Martini Copyright The McGraw-Hill Companies srl

Concetti di Base sulla Programmazione. Prof.Ing.S.Cavalieri

Sistemi Web per il turismo - lezione 3 -

DISPENSE DI PROGRAMMAZIONE

Dal Problema all Algoritmo. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

CONCETTI FONDAMENTALI

I.4 Rappresentazione dell informazione

LA METAFORA DELL UFFICIO

Lezione 1. Problemi Algoritmi Programmi

LINGUAGGI DI ALTO LIVELLO

Corso di Fondamenti di Informatica Linguaggi di Programmazione

Sviluppo di programmi. E ora, finalmente. Si comincia! 1. Analizzare il problema. 2. Progettare una soluzione (1) E necessario capire:

1 Esercizi in pseudocodice

LA METAFORA DELL UFFICIO LAVAGNA DI PROGRAMMA SPORTELLO UTENTE LAVAGNA DI LAVORO

LINGUAGGI DI ALTO LIVELLO. Si basano su una macchina virtuale le cui mosse non sono quelle della macchina hardware

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Laboratorio di Informatica. Esercitazione su algoritmi e diagrammi di flusso

Introduzione agli algoritmi

Algoritmi. Un tema centrale dell informatica è lo studio degli algoritmi.

Informatica, Algoritmi, Linguaggi

Fondamenti di Algoritmi

Laboratorio di Programmazione

Lezione 5. La macchina universale

LAVAGNA DI PROGRAMMA SPORTELLO UTENTE LAVAGNA DI LAVORO

ALGORITMI. Obiettivo: risolvere problemi mediante l uso di un elaboratore elettronico. Elaboratore elettronico

Algoritmi, linguaggi e programmi. Emilio Di Giacomo e Walter Didimo

Linguaggi di Programmazione

Informatica e Bioinformatica: Algoritmi

Corso di Informatica

RAPPRESENTAZIONE GLI ALGORITMI NOTAZIONE PER LA RAPPRESENTAZIONE DI UN ALGORITMO

unità didattica 3 Le strutture condizionali e le strutture iterative

Corso di Matematica per la Chimica. Dott.ssa Maria Carmela De Bonis a.a

Rapida Nota sulla Rappresentazione dei Caratteri

Sviluppo di programmi

STRUTTURA E LOGICA DI FUNZIONAMENTO DEL COMPUTER

ALGORITMI E PROGRAMMAZIONE STRUTTURATA. Prof R. Bresolin a.s

Algoritmi. Pagina 1 di 5

DAGLI ALGORITMI AI LINGUAGGI. Linguaggi di Programmazione

INFORMATICA. Scienza dei calcolatori elettronici (computer science) Scienza dell informazione (information science)

Risolvere un problema significa individuare un procedimento che permetta di arrivare al risultato partendo dai dati Termine algoritmo da:

Descrizione di un algoritmo

Pag. 1. La Rappresentazione e la Codifica delle informazioni (parte 2) Tipi di dati. Informatica Facoltà di Medicina Veterinaria

Algoritmi e Strutture Dati

Dalla prima lezione. LABORATORIO DI PROGRAMMAZIONE Corso di laurea in matematica 7 VARIABILI E COSTANTI 28/02/2016. Concetto di algoritmo

La codifica. dell informazione

Algoritmi e diagrammi di flusso versione biennio

Informatica. Come si risolve un problema?

Sommario. Problema computazionale Sviluppo software Algoritmi. Istruzioni Sequenziali, Condizionali, Cicliche; Javascript

Indice. Prefazione. 3 Oggetti e Java 53

Scienza dei calcolatori elettronici (Computer Science) Scienza dell informazione. è uno strumento in grado di eseguire insiemi di azioni elementari.

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

LINGUAGGI DI PROGRAMMAZIONE E CODIFICA PROGRAMMI

Algoritmi e loro proprietà. Che cos è un algoritmo? Un esempio di algoritmo

ELEMENTI DI PROGRAMMAZIONE a.a. 2012/13 MACCHINE, ALGORITMI, PROGRAMMI

Lezione 8. Soluzione di un problema Problema. Soluzione di un problema. Comprensione del Problema. Analisi. Introduzione agli algoritmi

Analisi e Programmazione

Transcript:

Programmazione e algoritmi 1. Algoritmi e programmi Il numero apparentemente illimitato di compiti che un elaboratore elettronico è in grado di svolgere dipende da un unica capacità: quella di eseguire un programma, che consiste in una codifica opportuna di un algoritmo. Algoritmi e programmi sono dunque alla base di ogni attività che un computer è in grado di svolgere ed il loro studio è propedeutico per ogni altro ambito dell informatica. 1.1 Il concetto di algoritmo Quando abbiamo imparato ad eseguire operazioni in colonna, a calcolare perimetro ed area di certe figure geometriche, ma anche più semplicemente a trascrivere un testo, colorare un disegno stando nei contorni, oppure cercare un nome o un vocabolo in un elenco ordinato alfabeticamente, cioè in generale a svolgere qualunque compito in modo prefissato applicando un metodo, abbiamo appreso un algoritmo. Più precisamente un algoritmo è un metodo di calcolo per risolvere un problema computazionale. Quest ultimo descrive cosa sia un istanza del problema, ossia ciò che è lecito attendersi in ingresso, ed una condizione di uscita, ossia un criterio per riconoscere quando una risposta, o uscita, sia corretta. Più astrattamente un problema computazionale può essere identificato con una relazione ingresso/uscita. Un semplice esempio è la ricerca del massimo (condizione d uscita) in una collezione finita non vuota di valori numerici positivi n, K 1 (istanza). È chiaro che occorre confrontare tra loro tutti i valori in ingresso, ma senza un metodo rischiamo di ripetere gli stessi confronti o peggio di trascurarne qualcuno. Una soluzione del problema consiste nel percorrere la sequenza dei valori dal primo all ultimo ricordando ogni volta il massimo dei valori ispezionati, e confrontandolo con il valore stiamo ispezionando. Questo stesso metodo può essere descritto come una sequenza di istruzioni numerate da eseguirsi in progressione dalla numero 1 in poi, salvo diversa indicazione contenuta nelle istruzioni, fermandosi quando non vi siano ulteriori istruzioni da eseguire: 1. leggi in ingresso i valori n, K 1,nk 2. siano i il numero 2 e max il valore di n1 3. se i > k vai all istruzione 6 4. se max < ni allora ridefinisci max con il valore di n i 5. incrementa i di 1 e vai all istruzione 3 6. comunica max come valore in uscita Le relazione ingresso/uscita di questo algoritmo è univoca: non ci sono due risposte corrette per lo stesso ingresso. Ciò non vale in generale, come si vede se ridefiniamo il problema chiedendo di conoscere anziché il massimo tra n, K 1, un indice del massimo, che possiamo ottenere semplicemente modificando l istruzione numero 4 come segue: 4. se n max < n i allora ridefinisci max con il valore di i

Non avendo infatti richiesto che i valori in ingresso siano tra loro distinti, vi possono essere diverse risposte corrette che l algoritmo potrebbe fornire. Ma un algoritmo è per sua natura deterministico, il che vuol dire che se ripetuto sullo stesso ingresso, non può che fornire la medesima uscita. Per come è definito l algoritmo sopra riportato sceglierà sempre il minimo tra gli indici del valore massimo. 1.2 La programmazione. Per comunicare e studiare gli algoritmi ci occorre un insieme di convenzioni per descriverli, ovvero un linguaggio. L uso del linguaggio naturale espone infatti a fraintendimenti ed ambiguità inammissibili nel nostro contesto. Questo passaggio è indispensabile anche dal punto di vista pratico. Un calcolatore è in grado di interpretare ed eseguire solo istruzioni estremamente elementari (come: riconoscere se un bit è 0 o 1; copiare un byte, ovvero 8 bit consecutivi, da una parte all altra, ecc.) che costituiscono il codice macchina. Non è umanamente possibile produrre direttamente programmi di questo tipo salvo il caso di algoritmi molto semplici che operino su dati elementari. Si ricorre allora ad opportuni linguaggi artificiali, detti linguaggi di programmazione (come il BASIC, il PASCAL, il C o Java), i cui programmi sono più simili ad un testo matematico che ad una sequenza di istruzioni in codice macchina, ma sufficientemente precisi da essere interpretabili da un computer, vuoi perché automaticamente traducibili in codice macchina mediante un compilatore, vuoi perché riconoscibili, un istruzione dopo l altra, da un programma interprete. Per sfuggire alla babele dei linguaggi esistenti, il cui numero è in continuo aumento, e per ridurre il peso dei dettagli necessari nelle realizzazioni concrete, useremo una sorta di linguaggio ideale, molto semplificato e tuttavia sufficiente per esprimere le idee fondamentali della programmazione. Volendo introdurre la sintassi (la grammatica cui attenersi per formare le espressioni) e la semantica (il significato di ciascuna espressione) di questo linguaggio, riprendiamo in considerazione l algoritmo per il calcolo del massimo in una sequenza finita di valori. I suoi ingredienti essenziali sono: le variabili, come i e max, ma anche quelle che rappresentano i valori in ingresso n, K 1. Si parla di variabili perché il valore associato a queste espressioni può cambiare ad ogni esecuzione (come nel caso di n, K 1 ) ovvero nel corso della singola esecuzione (come avviene per i e max). Le variabili possono occorrere in espressioni più complicate, il cui significato, posto che le variabili in esse contenute sia un valore, è ancora un valore. L operazione più importante che si compie con le variabili è l assegnazione di un valore, ciò che accade quando diciamo: sia il valore v dell espressione e il nuovo valore della variabile x ; ciò per cui potremmo scrivere x e Vi sono poi istruzioni la cui esecuzione è condizionata all esito di un controllo: se allora, e che potremmo trovare in una forma più elaborata, per cui si assume che il controllo abbia due soli possibili esiti, si oppure no, e cioè: se allora altrimenti. Si parla in questo caso di selezione a due vie tra diverse istruzioni. Infine vi sono istruzioni che riguardano il flusso, ossia la successione delle istruzioni, dette istruzioni di salto: vai all istruzione. Queste ultime interferiscono con l ordine in cui le istruzioni sono elencate, dando luogo a strutture elaborate che i programmatori hanno cercato di visualizzare attraverso rappresentazioni grafiche dette diagrammi di flusso. Quello che segue è il diagramma di flusso del programma per il calcolo del massimo tra n, K 1 :

inizio leggi n 1,, n k i 2, max n 1 i > k no max < n i no i i + 1 si si comunica max max n i fine Nel diagramma i punti di inizio e fine sono rappresentati con ovali ed hanno rispettivamente un punto di uscita ed uno di ingresso; le istruzioni di assegnazione sono rappresentate con rettangoli, con un ingresso ed un uscita; le istruzioni di controllo sono rappresentate da rombi con un ingresso e due uscite, a seconda dell esito del test. Le frecce indicano una sorta di percorso, che rappresenta il flusso dell esecuzione, il quale inizia e termina in un ovale. Questa rappresentazione, facilmente traducibile in un linguaggio come il BASIC, ha il vantaggio di visualizzare la sequenza delle istruzioni e le reciproche dipendenze, ma induce facilmente ad una programmazione caotica, con salti in punti arbitrari, il cui effetto è l oscuramento del significato del programma nel suo insieme. La programmazione strutturata si basa sull idea di restringere i diagrammi a quelli che si possono ottenere per composizione di parti rispondenti ad uno dei tre schemi fondamentali, quali la sequenza, la selezione e l iterazione. La sequenza consiste nella semplice concatenazione lineare di azioni: La selezione è composta da un test e da una azione condizionata, oppure da due azioni in alternativa:

Infine l iterazione è costruita con un test di controllo ed un azione (il corpo) che viene ripetutamente eseguita fintanto che il test non divenga falso. (Sia la selezione che l iterazione hanno varianti comunque riconducibili a quelle sopra presentate). Questi schemi si possono comporre nel senso che le azioni rappresentate da rettangoli possono essere a loro volta istanze di uno qualsiasi dei tre schemi. Essi rappresentano cioè dei blocchi. In corrispondenza con gli schemi di sequenza, selezione ed iterazione, possiamo introdurre costrutti linguistici che consentano di rappresentare un diagramma con un testo (il codice sorgente del programma relativo): per la sequenza si usa la semplice scrittura in colonna, con la stessa tabulazione per indicare il blocco di appartenenza (i linguaggi che non sono sensibili all a-capo ed ai tabulatori usano ; ed opportuni marcatori di inizio e fine blocco); per la selezione si usa if then if then oppure else Infine per l iterazione scriveremo: while do Per porre in chiaro l uso di questi costrutti riproduciamo qui di seguito la pseudo-codifica dell algoritmo per il calcolo del massimo visto sopra (immaginando delle istruzioni per la lettura dell ingresso e per la scrittura dell uscita):

read n,,n 1 K k i 2 max n 1 while not i > k do if max < n i then max n i i i + 1 write max Come accade ogni volta che ci imponiamo delle limitazioni, è opportuno chiedersi se queste non comportino delle perdite, in questo caso nella capacità di esprimere algoritmi che potremmo invece rappresentare con diagrammi non strutturati: la risposta è nel teorema di Böhm-Jacopini, il quale assicura che tutto ciò che possiamo rappresentare con diagrammi non strutturati è esprimibile (sebbene in modo diverso) con diagrammi strutturati. Se combiniamo questo risultato con quello secondo cui i diagrammi di flusso sono un formalismo Turing completo, ossia capace di rappresentare in linea di principio qualunque algoritmo, ne concludiamo che in un linguaggio di programmazione l uso di istruzioni di salto come il goto del PASCAL o del C non solo non è auspicabile se si vuole mantenere la perspicuità logica del codice, ma non è neppure necessario.