Algoritmi Politecnico di Milano

Slides:



Advertisements
Presentazioni simili
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F1 Primi programmi.
Advertisements

INFORMATICA Altre Istruzioni di I/O
LINGUAGGIO DI PROGRAMMAZIONE C
INFORMATICA Algoritmi fondamentali
Calcolo del minimo comune multiplo (m.c.m.) Luigi Sante
Analisi – Progettazione - Programmazione
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
Linguaggi algoritmici
Iterazione A. Ferrari.
Introduzione alla programmazione A. Ferrari. Il linguaggio C Nel 1972 Dennis Ritchie nei Bell Laboratories progettò il linguaggio C Il linguaggio possiede.
PROGRAMMARE IN PASCAL (le basi)
Sviluppo di programmi strutturati
I DATI LE ISTRUZIONI LE STRUTTURE FONDAMENTALI
MATLAB.
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Algoritmi e Programmazione
Informatica Generale Marzia Buscemi
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
Informatica Generale Susanna Pelagatti
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
ESERCITAZIONE N. 5 ESERCIZIO N. 1 Autore: Biagio Brattoli S I Corso.
INFORMATICA Strutture iterative
FUNZIONI DI BIBLIOTECA
Caratteri e stringhe di caratteri
Informatica B Allievi Elettrici AA La progettazione per raffinamenti successivi.
Algoritmi Politecnico di Milano C Primi programmi Politecnico di Milano.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 2 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
Algebra di Boole ed elementi di logica
Introduzione alla programmazione
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab m-file m-file script script Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali Esercizi vari Esercizi.
Introduzione alla programmazione lll
DAL PROBLEMA ALL'ALGORITMO Problemi e Programmi Paolo Amico
Somma = A + B start Stampa Somma Leggi A,B stop Sub SOMMA( ) Dim A, B as Integer A = InputBox("Immetti un numero") B = InputBox(Immetti un secondo numero)
Fondamenti di Informatica I a.a Il linguaggio C Il controllo di flusso La selezione condizionale Listruzione switch I cicli Le istruzioni break,
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
Strutture di controllo nel C
Strutture di controllo in C -- Flow Chart --
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
Esercizi C su array e matrici
Dichiarazioni e tipi predefiniti nel linguaggio C
Dall’algoritmo al programma.
STRUTTURA GENERALE DI UN ELABORATORE
Massimo Comun Divisore
Radice quadrata di un numero
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Script 1 Marco D. Santambrogio – Ver. aggiornata al 2 Dicembre 2013.
14 marzo 2002 Avvisi:.
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
BIOINFO3 - Lezione 211 INPUT La lettura di un input dallo standard input (tastiera) si effettua utilizzando lespressione. Quando il programma incontra.
Soluzioni e commenti esercizi 1 e 2
Ripetizione La vera potenza dei programmi per computer risiede nella capacità di ripetere lo stesso calcolo o sequenza di istruzioni più volte, ogni volta.
R 255 G 211 B 8 R 255 G 175 B 0 R 127 G 16 B 162 R 163 G 166 B 173 R 104 G 113 B 122 R 234 G 234 B 234 R 175 G 0 B 51 R 0 G 0 B 0 R 255 G 255 B 255 Supporting.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 26 Marzo 2014.
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
Strutture di controllo Esercizi!. Utilizzare i metodi: I modi per poter richiamare un metodo, di una classe (ad esempio SavitchIn) sono due. 1) E’ sempre.
Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (II) Istruzioni e strutture di controllo.
Algoritmi e basi del C Struttura di un programma
Algoritmi e basi del C Struttura di un programma
Operatori di incremento e decremento
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
1 Informatica Generale Marzia Buscemi Ricevimento: Giovedì ore , Dipartimento di Informatica, stanza 306-PS o per posta.
ALGORITMI Dal problema al programma Definizione di algoritmo
Strutture di controllo
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Algoritmi e basi del C Marco D. Santambrogio – Ver. aggiornata al 24 Agosto 2015.
Istruzioni e algoritmi. Istruzioni Operative I passi elementari che compongono l’algoritmo sono le istruzioni. Distinguiamo: Istruzioni di input Istruzioni.
Dal PROBLEMA all’ALGORITMO
Transcript della presentazione:

Algoritmi Politecnico di Milano Progettare

Fasi per progettare un algoritmo Formalizzare il problema Progettare Stendere l’algoritmo Verificare

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 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 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 Acquisire I valori in input Calcolare la tassa 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 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

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

Progettare:3 Visualizzare la tassa Conosco l’istruzione di printf che mi permette di visualizzare una cella di memoria tassa 198

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 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 ? lunghezza 4 larghezza 5 tassa 198 lunghezza 4 larghezza 5

Pattern 1 Acquisisci i dati di ingresso Calcola i risultati Visualizza i risultati

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

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 problema INPUT: carattere della tastiera OUTPUT:messaggi in alternativa cifra carattere EVENTUALMENTE vocale o consonante EVENTUALMENTE minuscola Altro

Progettare Acquisisco il carattere Emetto i messaggi in alternativa 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

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

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’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”); printf(“altro carattere”);

Verificare Istruzioni eseguite c video ? scanf(c) 4 4 If ((c >= ‘0’) && (c<= ‘9’)) 4 4 printf(“cifra”); 4 4 cifra

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

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

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 formalizzazione Definizione: INPUT: sequenza di naturali che finisce con 0 OUTPUT:numero massimo Raffinamento: Il Dialogo Uomo – Computer 34 61 9 0 massimo 61

Progettare Acquisire I valori in input Visualizzare il massimo Comincio a definire I passi fondamentali che deve fare l’algoritmo: Acquisire I valori in input Visualizzare il massimo

Acquisire I valori in input 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: massimo 56 numero 8

Acquisire I valori in input 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

Il massimo è il primo numero Stendere l’algoritmo main() { /* Acquisire I valori in input */ scanf(numero); massimo = numero; while (numero != 0) { if (numero >massimo) } /* 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

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 Leggi il primo valore Inizializza While (il valore non è l’ultimo) { Esegui l’operazione Leggi il prossimo valore }

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

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

Progettare Acquisire il valore n Visualizzo i primi n multipli di 2 Comincio a definire I passi fondamentali che deve fare l’algoritmo: Acquisire il valore n Visualizzo i primi n multipli di 2

Visualizzo i primi n multipli di 2 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

Pattern ciclo a conteggio Progettare Pattern ciclo a conteggio contatore = 0 while (contatore < numero volte da ripetere) { azione da ripetere contatore = contatore + 1; }

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

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

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