43
Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Embed Size (px)

Citation preview

Page 1: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Algoritmi Politecnico di Milano

Progettare

Algoritmi Politecnico di Milano

Page 2: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Fasi per progettare un algoritmo

• Formalizzare il problema

• Progettare

• Stendere l’algoritmo

• Verificare

Page 3: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

problema

• Problema: Un comune decide di mettere una tassa sul passo carrabile di 9.8 euro al metro quadro. Ogni passo carrabile è stato denunciato definendone le dimensioni in altezza e larghezza.

Calcolare la tassa che si deve pagare per ogni passo carrabile

Page 4: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Formalizzazione problema

• Problema: Un comune decide di mettere una tassa sul passo carrabile di 9.8 euro al metro quadro. Ogni passo carrabile è stato denunciato definendone le dimensioni in altezza e larghezza.

Calcolare la tassa che si deve pagare per ogni passo carrabile

INPUT: altezza e larghezza passo carrabileOUTPUT: tassa

Page 5: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Raffinamento formalizzazione

Definizione:INPUT: altezza e larghezza passo carrabileOUTPUT: tassa

Raffinamento: Il Dialogo Uomo – Computer Inserisci la lunghezza del passo carrabile: 4 Inserisci la larghezza del passo carrabile: 5 tassa da pagare 196

Page 6: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Progettare

Comincio a definire I passi fondamentali che deve fare l’algoritmo:

1.Acquisire I valori in input

2.Calcolare la tassa

3.Visualizzare la tassa

Page 7: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Progettare: 1 acquisire I valori in input

• Ogni valore digitato dall’utente (es. 4 e 5) deve essere memorizzato per poter essere utilizzato nel calcolo dell’area – Decido di utilizzare due celle di memoria:

– Conosco che l’operazione che prende I dati da tastiera e li deposita in memoria è per la macchina C la scanf

scanf(lunghezza)

scanf(larghezza)

lunghezza larghezza

Page 8: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Progettare: 2 Calcolare la tassa

• So calcolare la tassa “a mano”tassa = lunghezza * larghezza * 9.8

• Dalla formula deduco che mi serve utilizzare un’altra cella di memoria per memorizzare il valore della tassa

• Conosco l’istruzione di assegnamento della macchina C che ha lo stesso aspetto della formula matematica

tassa

Page 9: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Progettare:3 Visualizzare la tassa

• Conosco l’istruzione di printf che mi permette di visualizzare una cella di memoria

tassa198

Page 10: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Stendere l’algoritmomain(){

/* Acquisire I valori in input */ printf("Inserisci la lunghezza del passo carrabile:" ); scanf (lunghezza); printf("Inserisci la larghezza del passo carrabile:" ); scanf(larghezza); /* Calcolare la tassa */ tassa = lunghezza * larghezza * 9.8; /* Visualizzare la tassa */ printf(“tassa da pagare “); printf(tassa);}

Page 11: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Verificare: simuliamo l’esecuzione

main(){ /* Acquisire I valori in input */ printf("Inserisci la lunghezza del passo carrabile:" ); scanf (lunghezza); printf("Inserisci la larghezza del passo carrabile:" ); scanf(larghezza); /* Calcolare la tassa */ tassa = lunghezza * larghezza * 9.8; /* Visualizzare la tassa */ printf(“tassa da pagare “); printf(tassa);}

tassa?

lunghezza?

larghezza?

tassa?

lunghezza4

larghezza5

tassa198

lunghezza4

larghezza5

Page 12: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Acquisisci i dati di ingresso

Calcola i risultati

Visualizza i risultati

Pattern 1

Page 13: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Esercizi simili• Calcolare il volume di un cilindro conoscendo raggio e altezza

• Vengono forniti da tastiera i risultati di un referendum:– Numero iscritti a votare– Numero votanti– Numero si– Numero no

Calcolare la percentuale di votanti sul totale degli iscritti, le percentuali dei si e dei no rispetto al numero dei votanti

Page 14: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Problema

• Scrivere un programma che legge in ingresso un carattere e stampa se corrisponde a una cifra o a una lettera alfabetica o a un altro carattere, nel caso sia una lettera segnalare il caso particolare che sia una vocale o una consonante e il caso particolare che sia minuscola. Es:

• 3 cifra• D lettera consonante• e lettera vocale minuscola • d lettera consonante minuscola• E lettera vocale • < altro carattere

Page 15: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

• INPUT: carattere della tastiera

• OUTPUT:messaggi in alternativa– cifra– carattere

» EVENTUALMENTE vocale o consonante» EVENTUALMENTE minuscola

– Altro

Formalizzazione problema

Page 16: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Acquisisco il carattere

Emetto i messaggi in alternativa

Progettare

/* acquisisco il carattere /*

scanf(c);

/* Emetto i messaggi in alternativa */

If (c è una cifra)

printf(“cifra”);

else if (c è una lettera)

analizzo la lettera

else

printf(“altro carattere”);

Le azioni printf sono in alternativa uso if

I casi sono mutuamente esclusivi

L’azione viene eseguita dalla macchina C solo nel

caso c sia una lettera

Page 17: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

/* analizzo la lettera */

If (c è una vocale)

printf(“vocale”);

else

printf(“consonante”);

If (c è minuscola)

printf(“minuscola”);

Progettare

I casi non sono mutuamente esclusivi: c

può essere una vocale ed essere minuscola

Page 18: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

c è una cifra (c >= ‘0’) && (c<= ‘9’)

c è una lettera(c >= ‘a’) && (c <= ‘z’) ||(c >= ‘A’) && (c <= ‘Z’)

c è una vocale(c == ‘a’) || (c == ‘e’) || (c== ‘i’) || (c == ‘o’) || (c == ‘u’)

c è minuscola (c >= ‘a’) && (c <= ‘z’)

Progettare

So che nella tabella ascii le lettere sono codificate

sequenzialmente seguendo l’ordine

Page 19: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

/* acquisisco il carattere /*

scanf(c);

/* Emetto i messaggi in alternativa */

If ((c >= ‘0’) && (c<= ‘9’))

printf(“cifra”);else if ((c >= ‘a’) && (c <= ‘z’) || (c >= ‘A’) && (c <= ‘Z’) ) /* analizzo la lettera */ If ((c == ‘a’) || (c == ‘e’) || (c== ‘i’) || (c == ‘o’) || (c == ‘u’)) printf(“vocale”); else printf(“consonante”); If ((c >= ‘a’) && (c <= ‘z’)) printf(“minuscola”);else printf(“altro carattere”);

Stendere l’algoritmo

Page 20: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Istruzioni eseguite c video

?

scanf(c) 4 4

If ((c >= ‘0’) && (c<= ‘9’)) 4 4

printf(“cifra”); 4 4 cifra

Verificare

Page 21: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Istruzioni eseguite c video

?

scanf(c) d d

If ((c >= ‘0’) && (c<= ‘9’)) d d

else if ((c >= ‘a’) && (c <= ‘z’) || d d (c >= ‘A’) && (c <= ‘Z’) )

If ((c == ‘a’) || (c == ‘e’) || (c== ‘i’) d d || (c == ‘o’) || (c == ‘u’))

printf(“consonante”); d d consonante

If ((c >= ‘a’) && (c <= ‘z’)) d d consonante

printf(“minuscola”); d d consonante minuscola

Verificare

Page 22: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Esercizi simili

• Date le misure a e b di un rettangolo potenziale

(a e b possono essere nulle o negative) si vuole sapere si tratta di un quadrato, di un rettangolo, di un segmento, di un punto o di un caso impossibile

• Dati tre numeri interi calcolare il massimo e stamparlo

Page 23: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Problema

• Data una sequenza di numeri naturali che finisce con 0 trovare il massimo dei numeri inseriti

Page 24: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Formalizzazione problema

• Problema: Data una sequenza di numeri naturali che finisce con 0 trovare il massimo dei numeri inseriti

INPUT: sequenza di naturali che finisce con 0

OUTPUT: numero massimo

Page 25: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Raffinamento formalizzazione

Definizione:INPUT: sequenza di naturali che finisce con 0

OUTPUT:numero massimo

Raffinamento: Il Dialogo Uomo – Computer 34 61 9 0 massimo 61

Page 26: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Progettare

Comincio a definire I passi fondamentali che deve fare l’algoritmo:

1.Acquisire I valori in input

2.Visualizzare il massimo

Page 27: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Progettare

Acquisire I valori in input• Provo a risolvere io il problema e osservo le operazioni

che compio

• Noto che pur non memorizzando tutti I numeri riesco a trovare il massimo

• Noto che in ogni momento memorizzo il numero appena inserito dall’utente e il massimo dei numeri precedentemente inseriti

• In memoria definisco le variabili:

massimo56

numero 8

Page 28: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Progettare

Acquisire I valori in input• Provo a risolvere io il problema e osservo le operazioni

che compio

• Noto che continuo a ripetere il confronto fra il numero inserito e il massimo dei precedenti

• Noto che se il numero inserito è più grande diventa il massimo che memorizzo

Page 29: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

main() {

/* Acquisire I valori in input */

scanf(numero);

massimo = numero;

while (numero != 0)

{ if (numero >massimo)

massimo = numero;

scanf(numero);

}

/* Visualizzare il massimo */

printf(massimo);

}

Stendere l’algoritmo

Il massimo è il primo numero

Non è l’ultimo numero

Noto che continuo a ripetere il confronto fra il numero inserito e

il massimo dei precedenti

Noto che se il numero inserito è più grande diventa il

massimo che memorizzo

Page 30: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Istruzioni eseguite c massimo video

? ?

scanf(numero) 34 ? 34

massimo = numero; 34 34 34while (numero != 0) 34 34 34if (numero >massimo) 34 34 34

scanf(numero); 61 34 34 61

While (numero != 0) 61 34 34 61

if (numero >massimo) 61 34 34 61

massimo = numero; 61 61 34 61

scanf(numero); 9 61 34 61 9

While (numero != 0) 9 61 34 61 9

if (numero >massimo) 9 61 34 61 9

scanf(numero); 0 61 34 61 9

While (numero != 0) 0 61 34 61 9 0

printf(massimo) 0 61 61

Verificare

Page 31: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Leggi il primo valoreInizializzaWhile (il valore non è l’ultimo) { Esegui l’operazione Leggi il prossimo valore }

Pattern 2

Page 32: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Problema

• Visualizzare n naturali della tabellina del 2 con n scelto dall’utente

Page 33: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Formalizzazione problema

• Problema: Visualizzare n naturali della tabellina del 2 con n scelto dall’utente

INPUT: n, quantità numeri da stampare

OUTPUT: sequenza di n numeri multipli di 2

Page 34: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Raffinamento formalizzazione

Definizione:INPUT: n, quantità numeri da stampareOUTPUT: sequenza di n numeri multipli di 2

Raffinamento: Il Dialogo Uomo – Computer32 4 6

Page 35: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Progettare

Comincio a definire I passi fondamentali che deve fare l’algoritmo:

1.Acquisire il valore n

2.Visualizzo i primi n multipli di 2

Page 36: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Progettare

Visualizzo i primi n multipli di 2• Parto dal risultato:

• Devo visulizzare n numeri

ciclo che si ripete n volte e che contiene una printf del numero da visualizzare

• Uso il pattern del ciclo a conteggio

Page 37: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Progettare

Pattern ciclo a conteggio

contatore = 0while (contatore < numero volte da ripetere){

azione da ripeterecontatore = contatore + 1;

}

Page 38: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

main()

{

/* acquisisco quantità n */

scanf(n);

/* visualizzo i primi n multipli di n */

Contatore = 0;

While (contatore < n)

{

printf (multiplo2);

contatore = contatore + 1;

}

Stendere l’algoritmo

Mi accorgo che qualcosa non funziona, la variabile

multiplo2 è solo visualizzata e mai valorizzata:

Provo a fare il trace

Page 39: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Istruzioni eseguite n contatore multiplo2 video

? ? ?

scanf(n) 3 ? ? 3

contatore = 0 3 0 ? 3

while (contatore < n) 3 0 ? 3printf(multiplo2) 3 0 ? ?

Mi fermo qui: sul video appare un numero qualsiasi mentre dovrebbe essere 2 e poi 4 e poi 6 …questi sono i valori che dovrebbe assumere multiplo2 …

Verificare

Page 40: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Stendere l’algoritmo

main(){/* acquisisco quantità n */scanf(n);/*visualizzo i primi n multipli di n */multiplo2 = 2;contatore = 0;while (contatore < n){ printf (multiplo2); multiplo2 = multiplo2 + 2; contatore = contatore + 1;}

main(){/* acquisisco quantità n */scanf(n);/*visualizzo i primi n multipli di n */multiplo2 = 0;contatore = 0;while (contatore < n){ multiplo2 = multiplo2 + 2; printf (multiplo2); contatore = contatore + 1;}

Page 41: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

main()

{

/* acquisisco quantità n */

scanf(n);

/* visualizzo i primi n multipli di n */

contatore = 1;

While (contatore <= n)

{

printf (contatore*2);

contatore = contatore + 1;

}

Stendere l’algoritmo

Noto che il numero da stampare è sempre il doppio

di contatore: aggiusto l’algoritmo di conseguenza

Page 42: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

Problemi simili

• Visualizzare a video la parola ciao un numero di volte scelto dall’utente

• Calcolare il prodotto di una sequenza di numeri che termina con 0

• Stampare il valore della potenza di base m ed esponente n > 0

• data una sequenza di n punti nel piano con n scelto dall’utente, stampare la distanza massima dall’origine degli assi dei punti introdotti

• Modificare il programma precedente stampando le coordinate del punto di distanza massima

• Modificare il programma precedente stampando la distanza media

Page 43: Algoritmi Politecnico di Milano Progettare Algoritmi Politecnico di Milano

• Scompongo la soluzione in un piccolo numero di “big step”• Comicio a riempire l’algoritmo con printf e scanf facendomi guidare

dal dialogo uomo computer• Parto dal risultato da ottenere e torno indietro• Uso l’analogia: come potrei farlo io a mano?• Uso pattern conosciuti• Verifico, verifico, verifico …

suggerimenti