Esempi di algoritmi. Lezione III



Documenti analoghi
Prof. Giuseppe Chiumeo. Avete già studiato che qualsiasi algoritmo appropriato può essere scritto utilizzando soltanto tre strutture di base:

Matematica in laboratorio

Processo di risoluzione di un problema ingegneristico. Processo di risoluzione di un problema ingegneristico

Introduzione al MATLAB c Parte 2

Corso di Informatica

4 3 4 = 4 x x x 10 0 aaa

Cenni su algoritmi, diagrammi di flusso, strutture di controllo

SISTEMI DI NUMERAZIONE E CODICI

Convertitori numerici in Excel

Algoritmo. I dati su cui opera un'istruzione sono forniti all'algoritmo dall'esterno oppure sono il risultato di istruzioni eseguite precedentemente.

Algoritmi e diagrammi di flusso

Introduzione ai Metodi Formali

INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI

Dimensione di uno Spazio vettoriale

La selezione binaria

4. Operazioni aritmetiche con i numeri binari

Metodologie di programmazione in Fortran 90

ALGORITMI e PROGRAMMI Programmazione: Lavoro che si fa per costruire sequenze di istruzioni (operazioni) adatte a svolgere un dato calcolo

Funzioni in C. Violetta Lonati

LE FUNZIONI A DUE VARIABILI

APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI

1 n. Intero frazionato. Frazione

Appunti di informatica. Lezione 2 anno accademico Mario Verdicchio

Algoritmi e strutture dati. Codici di Huffman

Politecnico di Milano. Facoltà di Ingegneria Industriale. Corso di Analisi e Geometria 2. Sezione D-G. (Docente: Federico Lastaria).

10 - Programmare con gli Array

Algebra Booleana ed Espressioni Booleane

Variabili e tipi di dato

La prof.ssa SANDRA VANNINI svolge da diversi anni. questo percorso didattico sulle ARITMETICHE FINITE.

Iniziamo con un esercizio sul massimo comun divisore: Esercizio 1. Sia d = G.C.D.(a, b), allora:

Appunti sulla Macchina di Turing. Macchina di Turing

LABORATORIO DI PROGRAMMAZIONE EDIZIONE 1, TURNO B

Nozione di algoritmo. Gabriella Trucco

Studente: SANTORO MC. Matricola : 528

Risolvere un problema significa individuare un procedimento che permetta di arrivare al risultato partendo dai dati

24 : 3 = 8 con resto 0 26 : 4 = 6 con resto 2

DI D AGRA R MM M I M A BLOCC C H C I TEORI R A E D D E SERC R I C ZI 1 1

Prova di Laboratorio di Programmazione

1. Limite finito di una funzione in un punto

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Logica Numerica Approfondimento 1. Minimo Comune Multiplo e Massimo Comun Divisore. Il concetto di multiplo e di divisore. Il Minimo Comune Multiplo

Logaritmi ed esponenziali

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

Algebra booleana. Si dice enunciato una proposizione che può essere soltanto vera o falsa.

Obiettivo Principale: Spiegare come la stessa cosa possa essere realizzata in molti modi diversi e come, a volte, ci siano modi migliori di altri.

Lezioni di Matematica 1 - I modulo

Calcolo del Valore Attuale Netto (VAN)

Fasi di creazione di un programma

Esercizio: numero primo

Lezione 8. La macchina universale

Il principio di induzione e i numeri naturali.

2. Leggi finanziarie di capitalizzazione

Capitolo 13: L offerta dell impresa e il surplus del produttore

G iochi con le carte 1

Soluzione dell esercizio del 12 Febbraio 2004

Gestione Risorse Umane Web

OSSERVAZIONI TEORICHE Lezione n. 4

Architettura degli Elaboratori I Esercitazione 1 - Rappresentazione dei numeri

I sistemi di numerazione

Probabilità discreta

EXCEL FUNZIONI PRINCIPALI

Informatica 3. Informatica 3. LEZIONE 10: Introduzione agli algoritmi e alle strutture dati. Lezione 10 - Modulo 1. Importanza delle strutture dati

Polli e conigli. problemi Piano cartesiano. Numeri e algoritmi Sistemi e loro. geometrica. Relazioni e funzioni Linguaggio naturale e

Esercitazione N7:Gioco dei 21 fiammiferi (impariamo java giocando)

Scopo della lezione. Informatica. Informatica - def. 1. Informatica

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

La somma. Esempio: Il prodotto. Esempio:

SCUOLA DELL INFANZIA S. PIERO

ESEMPIO 1: eseguire il complemento a 10 di 765

Introduzione a Visual Basic Lezione 1 Concetti base e istruzioni condizionali

LE MEDIE MOBILI CENTRATE

Il concetto di valore medio in generale

Valutazione delle Prestazioni. Valutazione delle Prestazioni. Architetture dei Calcolatori (Lettere. Tempo di risposta e throughput

e-dva - eni-depth Velocity Analysis

CURSOS AVE CON TUTOR

Guida alla somministrazione delle prove e alla valutazione dei punteggi

Introduzione alla Programmazione

ARRAY. ARRAY a 3 DIMENSIONI

Calcolo delle probabilità

2. Limite infinito di una funzione in un punto

Matematica generale CTF

RAPPRESENTAZIONE GRAFICA DEGLI ALGORITMI

Corso di Informatica

ESERCIZI DI PROBLEM SOLVING E COMPOSIZIONE DEI DIAGRAMMI DI FLUSSO per le classi terza

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

DAL DIAGRAMMA AL CODICE

Esercizio 1 Dato il gioco ({1, 2, 3}, v) con v funzione caratteristica tale che:

Esercizi Capitolo 6 - Alberi binari di ricerca

SISTEMI DI NUMERAZIONE DECIMALE E BINARIO

ci sono più problemi che programmi esiste un problema che non si può risolvere con un programma

Analisi dei Dati 12/13 Esercizi proposti 3 soluzioni

matematica probabilmente

f(x) = 1 x. Il dominio di questa funzione è il sottoinsieme proprio di R dato da

Algoritmi e Strutture Dati

I SISTEMI DI NUMERAZIONE

Esercizi su. Funzioni

Transcript:

Esempi di algoritmi Lezione III

Scopo della lezione Implementare da zero algoritmi di media complessità. Verificare la correttezza di un algoritmo eseguendolo a mano. Imparare a valutare le prestazioni di un algoritmo. Scrivere alcuni algoritmi tipici da utilizzare come base per realizzarne altri. III.2

Calcolo dei numeri primi Scriviamo un algoritmo che, letto un numero, verifica se questo sia o meno primo Un numero è primo se è divisibile solo per se stesso e per l unità 1 è primo 2 è primo 3 è primo 4 NON è primo, ma è divisibile per 2 III.3

Calcolo dei numeri primi Quindi, per verificare la primalità di un numero n è sufficiente provare a dividerlo per tutti gli interi minori di esso Se almeno uno di questi interi è un divisore di n allora n non è primo Altrimenti n è primo III.4

Calcolo dei numeri primi leggi n <inizializzazione> div = 2 primo true QUANDO ci div sono < n ESEGUI ancora divisori ESEGUI SE n è divisible per il div prossimo divisore ALLORA primo il numero false non è primo div div+1 RIPETI <output SE primo del == risultato> true ALLORA scrivi il numero è primo ALTRIMENTI scrivi il numero non è primo III.5

Calcolo dei numeri primi leggi n div = 2 primo true QUANDO div < n ESEGUI SE n è divisible per div ALLORA primo false div div+1 RIPETI SE primo == true ALLORA scrivi il numero è primo ALTRIMENTI scrivi il numero non è primo n 6 div 2 3 4 5 6 primo true false III.6

Scriviamo meglio l algoritmo La condizione n è divisibile per div può essere scritta utilizzando l operatore matematico MOD che ritorna il resto della divisione intera: 10 MOD 3 = 1 8 MOD 4 = 0 Quindi a MOD b = 0 se e solo se a è divisibile per b III.7

Scriviamo meglio l algoritmo leggi n div = 2 primo true QUANDO div < n ESEGUI SE n MOD div == 0 ALLORA primo false div div+1 RIPETI SE primo == true ALLORA scrivi il numero è primo ALTRIMENTI scrivi il numero non è primo III.8

Miglioriamo l algoritmo Nel momento in cui trovo un divisore proprio (cioè diverso da 1 e dal numero che sto esaminando), sono certo del fatto che il numero in esame non è primo Quindi è inutile proseguire il ciclo ESEGUI III.9

Alternativa I leggi n div = 2 primo true QUANDO (div < n) E (primo == true) ESEGUI SE n MOD div == 0 ALLORA primo false div div+1 RIPETI III.10

Alternativa II leggi n div = 2 primo true QUANDO div < n ESEGUI SE n MOD div == 0 ALLORA primo false div n div div+1 RIPETI III.11

Alternativa III leggi n div = 2 primo true QUANDO div < n ESEGUI SE n MOD div == 0 ALLORA primo false esci dal ciclo div div+1 RIPETI III.12

Miglioriamo l algoritmo Tutte e tre le alternative sono realizzabili La seconda inserisce un istruzione impropria, con il solo fine di forzare l uscita dal ciclo Le altre due alternative sono più leggibili La prima è preferibile perché non ricorre a salti III.13

L abbiamo scritto bene? Criteri per valutare la bontà di un algoritmo Correttezza: dimostrabilità del fatto che l algoritmo esegua effettivamente le operazioni per cui è stato progettato. Complessità: determinabilità del tempo limite di esecuzione. Per entrambi questi criteri esistono vari tipi di tecniche formali. III.14

Correttezza L algoritmo proposto Termina sempre, al più in n iterazioni Ha un output corretto, nel senso che se un numero non è primo uno dei suoi divisori propri attiverà necessariamente l istruzione SE ALLORA che assegna false a primo. III.15

Complessità Ovviamente il tempo effettivo di esecuzione dell algoritmo proposto (anzi, di ogni algoritmo) dipende: dal valore fornito in ingresso e dalla velocità dell esecutore Quindi questo tempo viene quantificato in termini del numero di operazioni che vengono eseguite in funzione del valore fornito in ingresso. III.16

Quanto tempo ci mette? L algoritmo consta di tre parti Una costituita da tre operazioni che vengono sempre eseguite Una costituita da un ciclo eseguito al massimo per tante iterazioni quanto è grande n. A ogni iterazione del ciclo vengono eseguite al massimo cinque operazioni (tre confronti e due assegnamenti) Una costituita da un confronto e un operazione di output, sempre eseguite III.17

Sì,ma quanto tempo? Quindi, se n indica il numero inserito a inizio algoritmo, il numero di operazioni eseguito è al più 5+5n Trascurando i dettagli, il numero di operazioni dipende linearmente dal valore inserito Questa dipendenza viene formalmente indicata dicendo che la complessità dell algoritmo è O(n) III.18

Possiamo fare di meglio! Lemma: se un numero n non è primo, almeno uno dei suoi divisori propri è minore o uguale della radice quadrata di n. Dimostrazione: n non primo n = ab per 1< a,b < n per assurdo a,b > n n = ab > n n = n Quindi possiamo terminare prima il ciclo. III.19

Un algoritmo migliore leggi n div = 2 primo true QUANDO (div <sqrt(n)) E (primo == true) ESEGUI SE n MOD div == 0 ALLORA primo false div div+1 RIPETI SE primo == true ALLORA scrivi il numero è primo ALTRIMENTI scrivi il numero non è primo III.20

Complessità In questo modo la complessità dell algoritmo è scesa da O(n) a O( n) n 200 400 600 800 1000 Ad esempio, per un processore da 1 GHz, il tempo di esecuzione per n=12,345,678,901,234,567,890 passerebbe da più di 390 anni a 3.5 secondi! 1000 800 600 400 200 III.21

Il migliore? Esistono algoritmi con prestazioni migliori per risolvere lo stesso problema, ma noi non li prenderemo in considerazione. III.22

Modularità E possibile utilizzare un algoritmo già scritto per scriverne un altro che risolva un problema correlato Usando l algoritmo di partenza come base per costruire quello nuovo Costruendo il nuovo algoritmo in modo che esegua uno o più volte quello di partenza III.23

Esercizio Scrivete un algoritmo che, letto un intero positivo n, stampi la lista dei primi n numeri primi. III.24

Giochiamo a carte Scrivete un algoritmo che, letti due caratteri indicanti una carta da gioco utilizzando la seguente codifica A 2-9 0 J Q asso carte da 2 a 9 dieci fante donna fiori stampi la descrizione completa K Q C P F re quadri cuori picche III.25

Esempi QP: donna di picche 0Q: dieci di quadri 4F: quattro di fiori AC: asso di cuori III.26

Giochiamo a carte leggi punto leggi seme SE punto == A ALLORA scrivi asso SE punto == 2 ALLORA scrivi due SE punto == 3 ALLORA scrivi tre SE punto == 4 ALLORA scrivi quattro III.27

Giochiamo a carte SE punto == 5 ALLORA scrivi cinque SE punto == 6 ALLORA scrivi sei SE punto == 7 ALLORA scrivi sette SE punto == 8 ALLORA scrivi otto SE punto == 9 ALLORA scrivi nove III.28

Giochiamo a carte SE punto == 0 ALLORA scrivi dieci SE punto == J ALLORA scrivi fante SE punto == Q ALLORA scrivi donna SE punto == K ALLORA scrivi re scrivi di III.29

Giochiamo a carte SE seme == Q ALLORA scrivi quadri SE seme == C ALLORA scrivi cuori SE seme == P ALLORA scrivi picche SE seme == F ALLORA scrivi fiori III.30

Alcune osservazioni L algoritmo si comporta correttamente solo se l input rispetta la codifica segnalata. In caso contrario non viene stampato alcunché (nemmeno un messaggio di errore) Il numero massimo di operazioni eseguito è indipendente dall input. III.31

Alcune osservazioni Notate l uso degli apici ( ) e dei doppi apici ( ) in parti diverse dell algoritmo. Servono per differenziare tipologie di dati differenti (un concetto che approfondiremo tra qualche lezione). Possiamo scrivere l algoritmo utilizzando una sola istruzione scrivi? III.32

Controllo dell input Scrivere un algoritmo che, posta la domanda Vuoi continuare?, legga un dato e continui a riproporre la domanda fino a quando il dato letto non sia uguale a Si oppure a No III.33

Controllo input ESEGUI scrivi Vuoi continuare? leggi risposta QUANDO (risposta!= Si ) E (risposta!= No )!= è un operatore che indica quando i suoi due operandi sono diversi. Si può ottenere anche negando il risultato dell operatore ==. III.34

Esercizio Riscrivete questo algoritmo usando un ciclo QUANDO RIPETI Modificate l algoritmo in modo da avvisare l utente in caso abbia immesso come risposta qualunque cosa che sia diversa da Si e No. Cosa succede se l utente immette come risposta no? III.35

Ordinamento Scriviamo un algoritmo che, letti tre numeri, li stampa in ordine crescente III.36

Ordinamento leggi a leggi b leggi c SE a<b ALLORA SE a<c ALLORA minimo a SE b<c ALLORA medio b massimo c ALTRIMENTI medio c massimo b ALTRIMENTI III.37

Ordinamento minimo c medio a massimo b ALTRIMENTI SE b<c ALLORA minimo b SE a<c ALLORA medio a massimo c ALTRIMENTI medio c massimo a ALTRIMENTI III.38

Ordinamento minimo c medio b massimo a scrivi minimo scrivi medio scrivi massimo III.39

Esercizi Un anno è bisestile (ha 366 giorni) se è divisibile per quattro (come il 1980) e non è divisibile per 100 (ad es. il 1900 non è bisestile).fanno eccezione gli anni divisibili per 400, che sono bisestili (ad es. il 2000 è bisestile). Questa regola non si applica prima del 1582, anno di introduzione del calendario gregoriano. Scrivete un algoritmo che, letto un anno, decida se questo è o meno bisestile. III.40

Esercizi Scrivete un algoritmo che riceva in input il nome di un dipendente il numero di ore che ha lavorato durante una settimana la paga oraria Controllate che il numero di ore sia non inferiore a 40 e calcolate lo stipendio settimanale, tenuto conto che le ore di straordinarie sono pagate il doppio. III.41