• Non ci sono risultati.

Esercitazione su algoritmi e diagrammi di flusso

N/A
N/A
Protected

Academic year: 2021

Condividi "Esercitazione su algoritmi e diagrammi di flusso"

Copied!
73
0
0

Testo completo

(1)

Laboratorio di Informatica

Esercitazione su algoritmi e diagrammi di flusso

(2)

Algoritmi, programmi e dati

Algoritmo = insieme di istruzioni che indicano come svolgere operazioni complesse su dei dati attraverso successioni di operazioni elementari

Programma = algoritmo in un linguaggio

“comprensibile” dal computer.

Dato = informazione da elaborare rappresentata in

un formato che consenta al programma di operare su

di essa

(3)

Diagrammi di flusso

metti x+y in y

metti x-1 in x x = 0

Blocchi di elaborazione

contengono sequenze di azioni

Blocchi decisionali

contengono una condizione booleana; se vera, si segue la freccia vero, se falsa si segue la freccia falso.

vero falso

(4)

Strutture di controllo principali

selezione sequenza

falso vero

(5)

Strutture di controllo principali

iterazione

vero

falso

(6)

Esempio di decomposizione modulare

(7)

Simboli principali

• inizio o fine

• elaborazione

• decisione

• Connessione

• Operazione input/output

(8)

Processo di sviluppo di un programma

Il processo di sviluppo di un programma prevede le seguenti fasi:

– analisi del problema e specifica funzionale

• specificazione dei dati in ingresso e in uscita

– definizione dell’algoritmo risolutivo

• identificazione e formalizzazione di una soluzione, cioè dei contenitori di dati necessari e delle relative operazioni

– descrizione con un diagramma di flusso

• o con altro formalismo preciso e non ambiguo della successione di operazioni da eseguire.

– traduzione del diagramma di flusso in un programma

• in un linguaggio di programmazione “ad alto livello”;

– compilazione

• traduzione in linguaggio macchina;

– verifica

• esecuzione del programma.

(9)

Esercizi di sviluppo di algoritmi orientati alla programmazione

• Partiamo dall’analisi del problema

• Scriviamo la specifica funzionale

• Introduciamo i contenitori di dati necessari e le relative operazioni elementari

• Scriviamo l’algoritmo che opera su tali dati con un diagramma di flusso

(10)

Esempio 1

(11)

A) Problema e analisi del problema

• L’analisi del problema è il primo passo; deve fornire

– un nome e una breve descrizione di cosa si vuol fare;

– un elenco di requisiti: richieste a cui deve soddisfare il programma

(12)

Esempio di analisi del problema

Problema telefonata

• Descrizione:

– vogliamo chiamare un abbonato con il telefono.

• Requisiti, in cui prevediamo i diversi casi:

– la telefonata viene eseguita con successo

• messaggio “telefonata riuscita”

– la telefonata non può essere portata a termine

• messaggio “telefonata non riuscita”

(13)

B) Specifica funzionale

Una specifica funzionale indica

– quali sono i dati iniziali, cioè quelli da elaborare

• detti anche ingressi all’algoritmo

– che risultato si vuole, in funzione degli ingressi

• detto anche uscita dell’algoritmo

(14)

Esempio: specifica funzionale

• TELEFONATA: specifica funzionale

• Argomenti o ingressi:

– N : numero da comporre

• Risultati o uscite:

– messaggio “telefonata riuscita”

– messaggio “telefonata non riuscita”

(15)

C) I contenitori di dati

• Un algoritmo ha bisogno di tener traccia di ingressi e risultati:

– sia il risultato finale

– sia eventuali risultati intermedi

• Allo scopo, usa dei contenitori di dati

(16)

I contenitori di dati

• I contenitori di dati utilizzati per i risultati intermedi dipendono dall’algoritmo

– quindi, a meno di casi assai elementari, è necessario avere già un’idea dell’algoritmo per determinarli

– difficilmente sono TUTTI prevedibili sin dall’inizio;

man mano che l’algoritmo prende forma, si possono aggiungere al volo nuovi contenitori

(17)

I contenitori utilizzati da TELEFONATA

• Di quali contenitori abbiamo bisogno per TELEFONATA?

– Sicuramente di quello per contenere i dati di ingresso ed il risultato

• 1 contenitore per N (ingresso)

– Eventuali contenitori per i risultati intermedi – Contenitore per il risultato finale

(18)

• Relativamente agli ingressi, abbiamo il contenitore:

• Relativamente all’uscita, abbiamo il contenitore:

N N : int

m

m : string

In blu indichiamo il nome del contenitore, in rosso il numero contenuto in esso

Il tipo int corrisponde ai numeri interi; le operazioni che assumiamo disponibili per esso sono le solite: somma, prodotto, ….

(19)

D) L’algoritmo: primo passo

• Descrivere brevemente l’idea dell’algoritmo

– cioè i passi da eseguire per giungere alla soluzione usando i contenitori di dati e le operazioni disponibili su di essi in base al tipo di dati, a grandi linee

• Può darsi che una prima idea sia già stata raggiunta per trovare i contenitori dati più appropriati

– in tal caso si procede ad un eventuale raffinamento dell’idea

(20)

L’idea dell’algoritmo di soluzione di TELEFONATA

• Sollevo il ricevitore

• analizzo i vari casi di segnale:

– assente – presente

• se posso, procedo componendo il numero

• di nuovo analizzo i vari casi:

• e caso per caso costruisco il messaggio da inviare in uscita.

(21)

L’idea dell’algoritmo di soluzione di TELEFONATA

• Più in dettaglio:

– il telefono non dà segnale quando solleviamo la cornetta, non possiamo procedere e mettiamo giù

– altrimenti possiamo comporre il numero

– se il segnale è occupato o assente, non possiamo procedere e mettiamo giù

– altrimenti, aspettiamo la risposta

– se non arriva entro 10 squilli, mettiamo giù – altrimenti parliamo e poi mettiamo giù

• Passiamo al diagramma di flusso:

(22)

Leggere il numero da comporre.

Sollevare il ricevitore.

inizio

segnale?

Comporre il numero

libero?

risposta?

Messaggio

"Telefonata non riuscita".

no

no

no

Diagramma di flusso Contenitori di dati

messaggio

m

N

N

(23)

risposta?

Parlare.

finito?

Appendere il ricevitore

fine Messaggio

"Telefonata non riuscita".

Messaggio "Telefonata riuscita".

no

no

no

Diagramma di flusso

Contenitori di dati

messaggio

m

N

N

(24)

Leggere il numero da comporre.

Sollevare il ricevitore.

inizio

segnale?

Comporre il numero

libero?

risposta?

Messaggio

"Telefonata non riuscita".

no

no

no

Esecuzione Contenitori di dati

messaggio N

025031

(25)

Leggere il numero da comporre.

Sollevare il ricevitore.

inizio

segnale?

Comporre il numero

libero?

risposta?

Messaggio

"Telefonata non riuscita".

no

no

no

Esecuzione Contenitori di dati

messaggio

m

N

025031

(26)

risposta?

Parlare.

finito?

Appendere il ricevitore

fine Messaggio

"Telefonata non riuscita".

Messaggio "Telefonata riuscita".

no

no

no

Esecuzione Contenitori di dati

messaggio N

025031

T. non r.

(27)

risposta?

Parlare.

finito?

Appendere il ricevitore

fine Messaggio

"Telefonata non riuscita".

Messaggio "Telefonata riuscita".

no

no

no

Esecuzione

Contenitori di dati

messaggio N

025031

T. non r.

(28)

risposta?

Parlare.

finito?

Appendere il ricevitore

fine Messaggio

"Telefonata non riuscita".

Messaggio "Telefonata riuscita".

no

no

no

Esecuzione Contenitori di dati

messaggio N

025031

T. non r.

(29)

Esempio 3

(30)

A) Analisi del problema

Problema MAGGIORE

• Descrizione: vogliamo il maggiore tra due numeri interi, x e y.

• Requisiti in cui prevediamo i diversi casi:

– se x - y > 0, il maggiore è x

– se x - y < 0, il maggiore è y

– se x - y = 0, x e y sono uguali

(31)

B) Specifica funzionale

• Una specifica funzionale indica

– quali sono gli argomenti o ingressi

– che risultato si vuole, in funzione degli ingressi

• Argomenti o ingressi:

– x : numero intero – y : numero intero

• Il risultato o uscita è

– maggiore = x, se x-y > 0 – maggiore = y, se x-y < 0

(32)

I contenitori utilizzati dal nostro algoritmo

• Di quali contenitori abbiamo bisogno?

• Sicuramente di quelli per contenere i dati di ingresso ed il risultato

– Contenitore del primo numero (ingresso) – Contenitore del secondo numero (ingresso) – Contenitore del risultato (uscita)

• Dei contenitori per i risultati intermedi

– Contenitore della differenza

(33)

Abbiamo bisogno di x, y, dif, maggiore:

a

x maggiore

m b

y

• Sono tutti contenitori di dati;

• i loro contenuti sono di tipo intero e su di essi possiamo applicare le operazioni sugli interi somma, prodotto, ecc.

d

dif

ingressi ris. intermedi ris. finali

Abbiamo bisogno di operazioni (somme, confronti, ...)

(34)

Passiamo all’algoritmo: l’idea

• Leggo gli ingressi e li metto in x e y

• Calcolo la differenza d = x - y e la metto in dif

• Confronto dif con 0

• Se dif > 0, scrivo “max è x” e metto x in maggiore

• Se dif < 0, scrivo “max è y” e metto y in maggiore

• Fine

a questo punto ho finito e maggiore contiene il risultato finale

(35)

Assegna ad x e y i valori d’ingresso

Metti il valore di x-y in dif

dif < 0 falso

vero

Messaggio: ‘max è y’

Metti il valore di y in maggiore

Messaggio: ‘max è x’

Metti il valore di x in maggiore

fine

inizio x:int y:int

dif:int

maggiore:int

Diagramma di flusso Contenitori di dati

(36)

Esecuzione a mano

• Valori in ingresso:

x: 10

y: 10

(37)

Assegna ad x e y i valori d’ingresso

Metti il valore di x-y in dif

dif < 0 falso

vero

Messaggio: ‘max è y’

Metti il valore di y in maggiore

Messaggio: ‘max è x’

Metti il valore di x in maggiore

fine

inizio x:int y:int

dif:int

maggiore:int

Esecuzione Contenitori di dati

(38)

Assegna ad x e y i valori d’ingresso

Metti il valore di x-y in dif

dif < 0 falso

vero

Ingresso: 10, 10

Messaggio: ‘max è y’

Metti il valore di y in maggiore

Messaggio: ‘max è x’

Metti il valore di x in maggiore

fine

inizio x:int y:int

dif:int

maggiore:int

10 10

Esecuzione Contenitori di dati

(39)

Assegna ad x e y i valori d’ingresso

Metti il valore di x-y in dif

dif < 0 falso

vero

Messaggio: ‘max è y’

Metti il valore di y in maggiore

Messaggio: ‘max è x’

Metti il valore di x in maggiore

fine

inizio x:int y:int

dif:int

maggiore:int

10 10

0

Esecuzione Contenitori di dati

(40)

Assegna ad x e y i valori d’ingresso

Metti il valore di x-y in dif

dif < 0 falso

vero

Messaggio: ‘max è y’

Metti il valore di y in maggiore

Messaggio: ‘max è x’

Metti il valore di x in maggiore

fine

inizio x:int y:int

dif:int

maggiore:int

10 10

0

Esecuzione Contenitori di dati

(41)

Assegna ad x e y i valori d’ingresso

Metti il valore di x-y in dif

dif < 0 falso

vero

Messaggio: ‘max è y’

Metti il valore di y in maggiore

Messaggio: ‘max è x’

Metti il valore di x in maggiore

fine

inizio x:int y:int

dif:int

maggiore:int

10 10

0

10

Esecuzione Contenitori di dati

(42)

Assegna ad x e y i valori d’ingresso

Metti il valore di x-y in dif

dif < 0 falso

vero

Messaggio: ‘max è y’

Metti il valore di y in maggiore

Messaggio: ‘max è x’

Metti il valore di x in maggiore

fine

inizio x:int y:int

dif:int

maggiore:int

10 10

0

10

Esecuzione Contenitori di dati

(43)

Esempio 4

(44)

A) analisi del problema

Problema prodotto

• Descrizione: vogliamo calcolare il prodotto di due numeri.

• Requisiti in cui prevediamo i diversi casi : dati due numeri x e y, il programma calcolerà il prodotto x * y, utilizzando

l’addizione

– se y = 0, il prodotto è 0

– se y > 0, il prodotto è x + x + … + x ( y volte)

(45)

B) Specifica funzionale

• Una specifica funzionale indica

– quali sono gli argomenti o ingressi

– che risultato si vuole, in funzione degli ingressi

• Argomenti o ingressi:

– x : numero intero – y : numero intero

• Il risultato o uscita è

– prodotto = 0, se y = 0

– prodotto = x * y, se y > 0

(46)

I contenitori utilizzati dal nostro algoritmo

• Di quali contenitori abbiamo bisogno?

• Sicuramente di quelli per contenere i dati di ingresso ed il risultato

– Contenitore del primo numero (ingresso)

– Contenitore del secondo numero (ingresso)

– Contenitore del risultato (uscita)

(47)

Abbiamo bisogno di x, y, prodotto:

a

x prodotto

b p

y

• Sono tutti contenitori di dati;

• i loro contenuti sono di tipo intero e su di essi possiamo applicare le operazioni sugli interi somma, confronto, ecc.

ingressi ris. finali

Noi assumeremo di disporre della somma, ma non del prodotto.

(48)

Passiamo all’algoritmo: l’idea

• Leggo gli ingressi e li metto in x e y

• Calcolo la differenza d = x - y e la metto in dif

• Confronto y con 0

• Se y = 0, metto 0 in prodotto e scrivo “il prodotto è 0”

• Se y > 0, calcolo il prodotto con un numero opportuno di addizioni, metto il risultato in prodotto e scrivo “il

prodotto è prodotto ”

• Fine

(49)

L’idea si traduce nel seguente

diagramma di flusso

(50)

(ingressi) Leggi a.

Leggi b.

inizio

Metti il valore di (ris + a) in ris.

b = 0

fine vero

Diagramma di flusso per il prodotto a * b (b > 0)

b

Contenitori di dati

ris a

Metti il valore di (b - 1) in ris.

Metti 0 in ris.

falso

Nota: ‘b’ svolge il ruolo di contatore.

Stampa ris.

(51)

Esempio 5

(52)

Analisi del problema

Problema CONVERSIONE BASE

• Vogliamo un algoritmo che operi la conversione di un numero da una rappresentazione in base B alla

rappresentazione in base 10.

• L’algoritmo sarà programmato in un linguaggio di programmazione.

(53)

Specifica funzionale

• Una specifica funzionale indica

· quali sono gli argomenti o ingressi

· che risultato si vuole, in funzione degli ingressi.

• Argomenti o ingressi:

· B : base compresa fra 2 e 16

· R : una rappresentazione in base B

• Il risultato o uscita dev’essere un numero N tale che

· N è la rappresentazione in base 10 del numero rappresentato da R nella base B

(54)

Contenitori di dati

• Di quali contenitori avrà bisogno il nostro algoritmo?

• Sicuramente di quelli per contenere i dati di ingresso ed il risultato:

– Contenitore della base (ingresso)

– Contenitore della rappresentazione (ingresso) – Contenitore del risultato (uscita)

(55)

Contenitori di dati

• Se non teniamo conto delle operazioni, abbiamo:

cm cm–1 ...c1 c0

rappresentazione base

B

risultato

N

N = cm . Bm + cm–1 . Bm–1 + … + c1 . B1 + c0 . B0 Dalla specifica:

Abbiamo bisogno, per i: 0,...n, del numero ci rappresentato dalla cifra ci

Abbiamo bisogno di somme, prodotti (e potenze?)

(56)

Contenitori di dati

• Per quanto riguarda rappresentazione, lo consideriamo contenitore di dati;

• il suo contenuto è di tipo array di interi e sugli elementi dell’array possiamo applicare le

operazioni sugli interi somma, prodotto, ecc.

• Per quanto riguarda risultato, il suo contenuto è di tipo intero e su di esso possiamo applicare le

operazioni sugli interi.

(57)

Passiamo all’algoritmo: l’idea

• Parto col contenuto iniziale di risultato = 0

• considero la cifra di rappresentazione più

significativa, c

m

, ed uso il suo valore per aggiornare risultato

– Esempio: sommo c

m .

B

m

al valore iniziale 0 di

risultato e risultato ora contiene c

m .

B

m

(58)

Passiamo all’algoritmo: l’idea

• Considero la cifra immediatamente successiva, c

m-1

, ed uso il suo valore per aggiornare risultato

– sommo c

m-1 .

B

m-1

al valore precedente c

m .

B

m

di risultato e risultato ora contiene c

m .

B

m

+ c

m-1 .

B

m-1

• Proseguo così fino a trattare la cifra c

0

– a questo punto ho finito e risultato contiene il

risultato finale

(59)

L’idea si traduce nel seguente

diagramma di flusso

(60)

Usa un indice n

inizialmente uguale alla posizione più significativa di rappresentazione Poni il contenuto iniziale di risultato = 0

Tratta la cifra di indice n di rappresentazione, aggiornando il contenuto di risultato

Decrementa l’indice n di 1

fine inizio

COMMENTO:

Quando arrivo qui, risultato contiene il

risultato parziale relativo alla elaborazione delle cifre fra la posizione più significativa ed n+1

Nota: Tratta la cifra di posto n … ancora da dettagliare

indice n: contenitore inventato al volo

NO

SI n < 0

(61)

Un modo possibile di dettagliare “Tratta …”

• Tratta la cifra di indice n di

rappresentazione, aggiornando il contenuto di risultato si realizza come segue

• si somma a risultato il valore della cifra di posto

n della rappresentazione, moltiplicato per la base

B della rappresentazione elevata ad n

(62)

(ingressi)

Metti cm cm–1 ...c1 c0 in rappresentazione.

Metti B in base.

Metti m in posizione.

Metti 0 in risultato. inizio

Metti il valore di cposizione . Bposizione + risultato in risultato.

Metti il valore di posizione - 1 in posizione.

posizione < 0

fine

vero falso

Diagramma di flusso

cm cm–1 ...c1 c0

rappresentazione

risultato

N

base

B

Contenitori di dati

posizione

m

(63)

Esecuzione a mano

• Convertire 11012 in base 10

(64)

Metti 1101 in rappresentazione.

Metti 2 in base.

Metti 3 in posizione.

Metti 0 in risultato. inizio

Metti il valore di cposizione . Bposizione + risultato in risultato.

Metti il valore di posizione - 1 in posizione.

posizione < 0

fine

vero falso

Esecuzione. 1.

rappresentazione

risultato base

posizione

(65)

Metti 1101 in rappresentazione.

Metti 2 in base.

Metti 3 in posizione.

Metti 0 in risultato. inizio

Metti il valore di cposizione . Bposizione + risultato in risultato.

Metti il valore di posizione - 1 in posizione.

posizione < 0

fine

vero falso

Esecuzione. 2.

1101

rappresentazione

risultato

0

base

2

posizione

3

(66)

Metti 1101 in rappresentazione.

Metti 2 in base.

Metti 3 in posizione.

Metti 0 in risultato. inizio

Metti il valore di cposizione . Bposizione + risultato in risultato.

Metti il valore di posizione - 1 in posizione.

posizione < 0

fine

vero falso

Esecuzione. 3.

1101

rappresentazione

risultato

8

base

2

posizione

2

(67)

Metti 1101 in rappresentazione.

Metti 2 in base.

Metti 3 in posizione.

Metti 0 in risultato. inizio

Metti il valore di cposizione . Bposizione + risultato in risultato.

Metti il valore di posizione - 1 in posizione.

posizione < 0

fine

vero falso

Esecuzione. 4.

1101

rappresentazione

risultato

8

base

2

posizione

2

(68)

Metti 1101 in rappresentazione.

Metti 2 in base.

Metti 3 in posizione.

Metti 0 in risultato. inizio

Metti il valore di cposizione . Bposizione + risultato in risultato.

Metti il valore di posizione - 1 in posizione.

posizione < 0

fine

vero falso

Esecuzione. 5.

1101

rappresentazione

risultato

8

base

2

posizione

2

(69)

Metti 1101 in rappresentazione.

Metti 2 in base.

Metti 3 in posizione.

Metti 0 in risultato. inizio

Metti il valore di cposizione . Bposizione + risultato in risultato.

Metti il valore di posizione - 1 in posizione.

posizione < 0

fine

vero falso

Esecuzione. 6.

1101

rappresentazione

risultato

12

base

2

posizione

1

(70)

…….

(71)

Metti 1101 in rappresentazione.

Metti 2 in base.

Metti 3 in posizione.

Metti 0 in risultato. inizio

Metti il valore di cposizione . Bposizione + risultato in risultato.

Metti il valore di posizione - 1 in posizione.

posizione < 0

fine

vero falso

Esecuzione. 12.

1101

rappresentazione

risultato

13

base

2

posizione

-1

(72)

Metti 1101 in rappresentazione.

Metti 2 in base.

Metti 3 in posizione.

Metti 0 in risultato. inizio

Metti il valore di cposizione . Bposizione + risultato in risultato.

Metti il valore di posizione - 1 in posizione.

posizione < 0

fine

vero falso

Esecuzione. 13.

1101

rappresentazione

risultato

13

base

2

posizione

-1

(73)

Metti 1101 in rappresentazione.

Metti 2 in base.

Metti 3 in posizione.

Metti 0 in risultato. inizio

Metti il valore di cposizione . Bposizione + risultato in risultato.

Metti il valore di posizione - 1 in posizione.

posizione < 0

fine

vero falso

Esecuzione. 14.

1101

rappresentazione

risultato

13

base

2

posizione

-1

Riferimenti

Documenti correlati

Sirena piezo da interno 13.8V DC con lampeggiante LED, suoni di alta potenza per allarme, bassa potenza di pre-allarme e LED blu MINI DOGE AL alta luminosità per luce cortesia..

Installare 6 kit barra GP [opzionale] nella guida Scanalatura per guida nel telaio laterale e fissaggio con barra GP mediante vite Phillips a testa tonda M5-10 (dente di arresto).

la casa degli ospiti del Centro Diurno di Via Marsala 95, ma anche la casa degli operatori, dei volontari, di quelli che vi si sono affacciati solo per un attimo.. E’ una casa

La fodera per guanciale è realizzata con tessuto con tecnologia ViroAlt, antivirale e antibatterica che inibisce la crescita e la persistenza di batteri e virus. FRESCHEZZA PER

flex: auto = flex-grow: 1, flex-shrink: 1, flex-basis: auto (figli flessibili con spazio vitale). flex:none = flex-grow: 0, flex-shrink: 0, flex-basis: auto (figli inflessibili

Genere: documentazione allegata Tipo: fotografia digitale colore Autore: Calcaterra, Alice Data: 2009/10/21. Ente proprietario: Istituto per la Storia dell'Arte Lombarda

Autore: Mira Paolo/ Morganti Lorenzo/ Muzzin Silvia (ISAL) Data: 2012/10/19. Ente proprietario: Istituto per la Storia dell'Arte Lombarda Codice

Spessore 3mm EURO 12,00 Mq / Spessore 5mm EURO 18,00 Mq Spessore 10mm EURO 26,00 Mq / Spessore 19mm EURO 32,00 Mq Materiale Rigido PVC ALVEOLARE bianco.. (superficie bianca