520 likes | 711 Views
Algoritmi e basi del C. Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 8 Marzo 2013. Come non ricordare…. … che giornata sia oggi 8 marzo 1459: nasce Bernardino Corio Storico italiano 8 marzo 1728: muore Giovanni Mario Crescimbeni
E N D
Algoritmi e basi del C Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 8 Marzo 2013
Come non ricordare… • … che giornata sia oggi • 8 marzo 1459: nasce Bernardino Corio • Storico italiano • 8 marzo 1728: muore Giovanni Mario Crescimbeni • Poeta e critico letterario italiano • 8 marzo 1882: Arturo Graf scrive una lettera a Mario Rapisardi • Entrambi scrittori e poeti italiani • Ma è anche: • La festa del maccarone al pomodoro http://rinabrundu.com/2012/03/07/ricorrenze-8-marzo-festa-del-maccarone-al-pomodoro/
Info di servizio • Laboratori: divisione in gruppi • Non stiamo andando benissimo • 9 gruppi il lunedi’ • 3 gruppo il giovedi’ • Feedback sulle lezioni • Se date una valutazione ≤ 3 sul quanto la spiegazione sia risultata chiara, vi chiederei cortesemente di spiegare nelle note a cosa e’ dovuto questo dato • La “Survey” e’ sempre aperta, se volete potete continuare a inserire i vostri dati • No, il “gufo” non diventa milanista… • e’ milanista!!
WAT? WAT • Spiegazioni: 7 su 61 chiedono di andare più piano • Una persona ha trovato utili gli esempi in C e 25 “entrambi” • In 19 su 61 avreste voluto vedere più esempi in C!! WAT
Ripasso di ieri • Concetto ambiguo di informazione • Informazione = dati + istruzioni • Informazione = dati con significato • Esempio: il numero 3 è un semplice dato, diventa entità di informazione quando lo si contestualizza • Programmabilità del calcolatore • Macchina di von Neumann • Comunicazione non ambigua • Calcolo come calcolo di funzioni
Obiettivi • Algoritmi • Pseudocodice • Diagramma di flusso • Una prima introduzione al C • Un primo programma • Tipi di dato • Strutture di controllo
Algortimo e Programma • Algoritmo • Descrizione della soluzione di problema scritta in modo da poter essere eseguita da un esecutore (eventualmente diverso dall’autore dell’algoritmo) • Sequenza di istruzioni che operano su dati. • Programma • Algoritmoscritto in modo da poter essere eseguito da un calcolatore (esecutore automatico) 9
Acquisto DVD Novita’ Novita’ Azione Dove lo cerco? In quale settore? … Indicatori di settore Trovato il settore, come trovo il mio DVD? Ordine alfabetico
Alogoritmo per l’acquisto DVD • Acquisisci il nome del settore (s) del DVD (d) • Vai al settore (s) • Cerca (t) • Prendi il DVD (d) • Acquisisci e Cerca sono anche loro algoritmi
CERCA: contesto e problema • Contesto • Sei nel settore (s) corretto • Nel settore sono presenti diversi DVD • Il settore puo’ essere visto come un insieme di DVD: s={d0, d1, …, dn} • Problema • Devo trovare il DVD (dt) tra tutti i DVD presenti nel settore (s) • Aiuto: il settore e’ ordinato • I DVD sono ordinati alfabeticamente
Algoritmo CERCA • Noti • s={d0, d1, …, dn}, ord. alfabeticamente • DVD cercato = dt • Ci sono DVD? • Allora • Leggo il titolo del primo DVD in s • Se il titolo e’ il titolo cercato Allora concludo la ricerca con successo Altrimenti passo al DVD successivo • Altrimenti concludo la ricerca con esito negativo
CERCA: osservazioni • Cosa succede se il settore e’ vuoto? • Come funziona la mia ricerca? • Se in s vi sono 10000 DVD e io cerco Zorro? • Scenario ancora peggiore • Voglio cercare il numero del mio professore di IEIM (Santambrogio) nella rubrica telefonica di Milano.. • Esistono diversi modi per risolvere un problema
CERCA… migliorata • Noti • s={d0, d1, …, dn}, ord. alfabeticamente • DVD cercato = dt • Ci sono DVD? • Allora • Leggo il titolo del DVD (dx) nel mezzo di s • Se il titolo di dx e’ il titolo cercato • Allora concludo la ricerca con successo • Altrimenti se dx < dt • allora ricomincio da 1 considerando la meta’ superiore di s • Altrimenti ricomincio da 1 considerando la meta’ inferiore di s • Altrimenti concludo la ricerca con esito negativo
Graficamente: Noti dt s={d0, d1, …, d11} d7 d11 d3 d5 d6 d9 d10 d1 d2 d4 d8 d0
Leggo dx e lo confronto con dt d6 dt = ? dx=d6 NO d6 dt <
Ricomincio sulla meta’ superiore d7 d11 d6 d9 d10 d8 dt dx=d9
Leggo dx e lo confronto con dt d9 dt = ? dx=d9 d9 SI Termino con successo la mia ricerca comprando d9
Come si specifica un algoritmo? • Utilizzando dello pseudocodice • Utilizzando dei diagrammi di flusso (aka schemi a blocchi) Se A > B allora B = A altrimenti A = B Assegnamento Fine Inizio Test Scrivi Leggi
Massimo Comune Divisore • Definizione • Dicesi Massimo Comune Divisore (M.C.D.) il piu’ grande tra i divisori comuni a due o piu’ numeri • Esempi • Dati A=12, B=15 • Divisori comuni: 1, 3 - MCD=3 • Dati A=10, B=30 e C=20 • Divisori comuni: 1, 2, 5, 10 - MCD=10
MCD: pseudocodice • Leggi A e B • min= il minimo tra A e B • tmp = 1 • MCD = 1 • Finche’ tmp < min • tmp = tmp + 1 • Se tmp divide A e B • Allora MCD = tmp • Stampa MCD
MCD: diagramma di flusso min=minimo{A,B} tmp=1 MCD=1 tmp<min? no si tmp = tmp + 1 Inizio Fine no tmp divide A e B Stampa MCD Leggi A e B si MCD = tmp
Ciao Mondo: stdio.h • Come prima cosa, dobbiamo includere le librerie necessarie al funzionamento del nostro programma. • La libreria stdio.h • Standard Input Output • Permette di utilizzare I comandi necessari per richiedere dati o visualizzare dei messaggi.
Ciao Mondo: main • Tutti i programmi in C contengono un elemento principale: • Il main • main contiene le istruzioni che verranno eseguite all’avvio del nostro programma
Ciao Mondo: main • La sequenza di istruzioni che caratterizzano il main sono racchiuse tra parentesi graffe • Tale blocco di istruzioni e’ anche noto come corpo • Ogni istruzione deve essere seguita da un punto e virgola
Ciao Mondo: printf • Stampa a video il mesaggio “Ciao Mondo!” • printf e’ contenuta in stdio.h • Il messaggio da stampare e’ contenuto tra “”
Ciao Mondo: printf • return e' un comando che ci permette di comunicare con il sistema ospite • In questo caso viene utilizzato per comunicare lo stato di terminazione del programma • 0 indica una terminazione corretta del nostro programma
Struttura di un programma C parte dichiarativa globale parte dichiarativa locale parte esecutiva inclusione librerie / per poter invocare funzioni utili (i/o, ...) / dichiarazione di variabili globali e funzioni int main ( ) { dichiarazione di variabili locali istruzione 1; / tutti i tipi di operazioni, e cioè: / istruzione 2; / istr. di assegnamento / istruzione 3; / istr. di input / output / istruzione 4; / istr. di controllo (condizionali, cicli) / ... istruzione N; } Ogni programma C deve contenere un modulo int main() {...}
Struttura di un programma C • Parte dichiarativa: contiene le dichiarazioni degli elementi del programma • Dati, ed eventualmente funzioni (ma solo nella parte globale) • Parte esecutiva: contiene leistruzioni da eseguire, che ricadono nelle categorie: • Istruzioni di assegnamento () • Strutture di controllo: • Condizionali (if-then-else e switch) • Iterative, o cicli (while, do e for) • Istruzioni di Input/Output (printf, scanf, ...)
Istruzioni semplici e composte • Sequenze di istruzioni semplici • Ogni istruzione semplice termina con ; • ; è detto il “terminatore” dell’istruzione • Si possono raggruppare più istruzioni in sequenza tra { e } a costituire un blocco • Il blocco costituisce una “super-istruzione” • Non è necessario il ; dopo }, in quanto il blocco è già una istruzione • e non necessita del terminatore per diventarla
Variabili e indirizzi • Supponiamo che la dichiarazione riservi la zona di memoria all’indirizzo 1 • var indica il contenuto della cella di memoria • &var indica l’indirizzo della cella di memoria 3 int var; 2 &var var 1 0
Esecuzione degli assegnamenti • valutazione dell’espressione che compare a destra del simbolo = • il valore delle variabili che vi compaiono si trova memorizzato nelle celle corrispondenti, e da lì è letto • memorizzazione del risultato dell'espressione nella variabile a sinistra del simbolo =
Come interagiamo con “l’esterno”? • Input - Output • printf viene utiizzata per fornire un output del programma a video • scanf viene utilizzato per fornire degli input, e.g. da tastiera, al nostro programma
Inserimento dati • Problema • Richiedi all’utente la sua altezza in centrimentri e mostrala a video in metri • Pseudocodice • Scrivi “quanto sei alto?” • Leggi altezzacm • Altezzam = alteccacm/100 • Scrivi “sei alto: altezzam”
Inserimento dati • Problema • Richiedi all’utente la sua altezza in centrimentri e mostrala a video in metri • Pseudocodice • Scrivi “quanto sei alto?” • Leggi altezzacm • Altezzam = alteccacm/100 • Scrivi “sei alto: altezzam”
Pseudocodice vs Codice C • Pseudocodice • Scrivi “quanto sei alto?” • Leggi altezzacm • Altezzam = alteccacm/100 • Scrivi “sei alto: altezzam”
Soluzione corretta L’importanza dei tipi di dato
Tipi di dato in C • In C esistono diversi tipi di dato built-in, tra cui • int: numeri interi • float: numeri con virgola (singola precisione) • double: numeri con virgola (doppia precisione) • char: caratteri (sono interi che possono variare tra 0-255) • Inoltre il C fornisce anche la possibilità di definire dei nuovi tipi di dato
Mostra caratteri • Problema • Si scriva un programma che richieda l’inserimento di un carattere e lo mostri a video