Algoritmi politecnico di milano
This presentation is the property of its rightful owner.
Sponsored Links
1 / 43

Algoritmi Politecnico di Milano PowerPoint PPT Presentation


  • 66 Views
  • Uploaded on
  • Presentation posted in: General

Algoritmi Politecnico di Milano. Algoritmi Politecnico di Milano. Progettare. Fasi per progettare un algoritmo. Formalizzare il problema Progettare Stendere l’algoritmo Verificare. problema.

Download Presentation

Algoritmi Politecnico di Milano

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Algoritmi politecnico di milano

Algoritmi Politecnico di Milano

Algoritmi Politecnico di Milano

Progettare


Fasi per progettare un algoritmo

Fasi per progettare un algoritmo

  • Formalizzare il problema

  • Progettare

  • Stendere l’algoritmo

  • Verificare


Problema

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


Formalizzazione problema

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 carrabile

    OUTPUT: tassa


Raffinamento formalizzazione

Raffinamento formalizzazione

Definizione:

INPUT: altezza e larghezza passo carrabile

OUTPUT: tassa

Raffinamento: Il Dialogo Uomo – Computer

Inserisci la lunghezza del passo carrabile:

4

Inserisci la larghezza del passo carrabile:

5

tassa da pagare

196


Progettare

Progettare

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

  • Acquisire I valori in input

  • Calcolare la tassa

  • Visualizzare la tassa


Progettare 1 acquisire i valori in input

lunghezza

larghezza

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)


Progettare 2 calcolare la tassa

tassa

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


Progettare 3 visualizzare la tassa

198

tassa

Progettare:3 Visualizzare la tassa

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


Stendere l algoritmo

Stendere l’algoritmo

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);

}


Verificare simuliamo l esecuzione

?

?

4

4

?

5

?

5

lunghezza

tassa

tassa

lunghezza

tassa

lunghezza

larghezza

larghezza

larghezza

198

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);}


Pattern 1

Pattern 1

Acquisisci i dati di ingresso

Calcola i risultati

Visualizza i risultati


Esercizi simili

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


Problema1

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


Formalizzazione problema1

Formalizzazione problema

  • INPUT: carattere della tastiera

  • OUTPUT:messaggi in alternativa

    • cifra

    • carattere

      • EVENTUALMENTE vocale o consonante

      • EVENTUALMENTEminuscola

    • Altro


Progettare1

Progettare

Acquisisco il carattere

Emetto i messaggi in alternativa

/* 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


Progettare2

Progettare

/* analizzo la lettera */

If (c è una vocale)

printf(“vocale”);

else

printf(“consonante”);

If (c è minuscola)

printf(“minuscola”);

I casi non sono mutuamente esclusivi: c può essere una vocale ed essere minuscola


Progettare3

Progettare

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’)

So che nella tabella ascii le lettere sono codificate sequenzialmente seguendo l’ordine


Stendere l algoritmo1

Stendere l’algoritmo

/* 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”);


Verificare

Verificare

Istruzioni eseguite c video

?

scanf(c) 4 4

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

printf(“cifra”); 4 4 cifra


Verificare1

Verificare

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


Esercizi simili1

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


Problema2

Problema

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


Formalizzazione problema2

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


Raffinamento formalizzazione1

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


Progettare4

Progettare

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

  • Acquisire I valori in input

  • Visualizzare il massimo


Progettare5

56

8

massimo

numero

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:


Progettare6

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


Stendere l algoritmo2

Stendere l’algoritmo

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);

}

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


Verificare2

Verificare

Istruzioni eseguite c massimo video

? ?

scanf(numero) 34 ? 34

massimo = numero; 34 34 34

while (numero != 0) 34 34 34

if (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


Pattern 2

Pattern 2

Leggi il primo valore

Inizializza

While (il valore non è l’ultimo)

{

Esegui l’operazione

Leggi il prossimo valore

}


Problema3

Problema

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


Formalizzazione problema3

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


Raffinamento formalizzazione2

Raffinamento formalizzazione

Definizione:

INPUT: n, quantità numeri da stampare

OUTPUT: sequenza di n numeri multipli di 2

Raffinamento: Il Dialogo Uomo – Computer

3

2 4 6


Progettare7

Progettare

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

  • Acquisire il valore n

  • Visualizzo i primi n multipli di 2


Progettare8

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


Progettare9

Progettare

Pattern ciclo a conteggio

contatore = 0

while (contatore < numero volte da ripetere)

{

azione da ripetere

contatore = contatore + 1;

}


Stendere l algoritmo3

Stendere l’algoritmo

main()

{

/* acquisisco quantità n */

scanf(n);

/* visualizzo i primi n multipli di n */

Contatore = 0;

While (contatore < n)

{

printf (multiplo2);

contatore = contatore + 1;

}

Mi accorgo che qualcosa non funziona, la variabile multiplo2 è solo visualizzata e mai valorizzata:

Provo a fare il trace


Verificare3

Verificare

Istruzioni eseguite n contatore multiplo2 video

? ? ?

scanf(n) 3 ? ? 3

contatore = 0 3 0 ? 3

while (contatore < n) 3 0 ? 3

printf(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 …


Stendere l algoritmo4

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;

}

Stendere l’algoritmo


Stendere l algoritmo5

Stendere l’algoritmo

main()

{

/* acquisisco quantità n */

scanf(n);

/* visualizzo i primi n multipli di n */

contatore = 1;

While (contatore <= n)

{

printf (contatore*2);

contatore = contatore + 1;

}

Noto che il numero da stampare è sempre il doppio di contatore: aggiusto l’algoritmo di conseguenza


Problemi simili

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


Suggerimenti

suggerimenti

  • 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 …


  • Login