Corso di Esercitazioni di Programmazione

47
Corso di Esercitazioni di Programmazione Introduzione Dott.ssa Sabina Rossi

Transcript of Corso di Esercitazioni di Programmazione

Page 1: Corso di Esercitazioni di Programmazione

Corso di Esercitazioni di Programmazione

Introduzione

Dott.ssa Sabina Rossi

Page 2: Corso di Esercitazioni di Programmazione

Informazioni

Pagina web del corso:

http://www.dsi.unive.it/~prog1NewsOrariMailing listLezioniEsercitazioniDate esamiRisultati esami…..

Page 3: Corso di Esercitazioni di Programmazione

Informazioni e spiegazioni

Per ricevere gli avvisi relativi al corso ci si può iscrivere alla mailing list

[email protected]

usando la pagina web

http://listserver.dsi.unive.it/wws/subrequest/programmazione

oppure inviando direttamente una e-mail a

[email protected]

mettendo nel body il testo subscribe programmazione

Page 4: Corso di Esercitazioni di Programmazione

Ricevimento

Martedì dalle 14.00 alle 15.00oppure su appuntamento

Page 5: Corso di Esercitazioni di Programmazione

Libri di Testo

C Corso completo di programmazioneH.M. Deitel, P.J. DeitelApogeo

The C Programming LanguageKernighan, RitchiePrentice Hall

Page 6: Corso di Esercitazioni di Programmazione

Laboratorio

Lunedì e Giovedìdalle 13.00 alle 14.00

Tutor Luca Leonardi

Page 7: Corso di Esercitazioni di Programmazione

Laboratorio

Richiesta dell’account:

In aula 3 c'è un PC su un carrello rosso dove le matricoleDEVONO iscriversi (inserendo Cognome, Nome, Numero dimatricola, e eventuale Email);

Coloro che non sono ancora iscritti e quindi non hanno ilnumero di matricola, come matricola devono scrivere"TEMP07" per ottenere un account provvisorio valido fino al 31/12.

Page 8: Corso di Esercitazioni di Programmazione

Esercitazioni settimanali

Ogni settimana verranno assegnate delle esercitazionida svolgere a casa

Le esercitazioni devono essere consegnata via web(si veda la pagina web del corso)

Page 9: Corso di Esercitazioni di Programmazione

Esame

L'esame consiste in due prove distinte:- una prova teorica scritta;- una prova pratica in laboratorio.

Per passare l'esame entrambe le prove devono essere sufficienti, e verranno registrati due voti che sono la media dei due esami + un bonus per le esercitazioni svolte e consegnate durante l'anno.Si tratta di due prove indipendenti, il cui voto rimane valido per tutto l'anno accademico.

Page 10: Corso di Esercitazioni di Programmazione

Problemi, Algoritmi e Programmi

Approfondiamo come progettare e scriverenuovi algoritmi e programmi

Page 11: Corso di Esercitazioni di Programmazione

Risolvere un problema

es : riconoscere qualcuno fra la folla

Dati diingresso

Immagine dellafolla

Elaborazione

Ricerca nell’immagineSI, NO, chi è la persona riconosciuta

Dati diuscita

Page 12: Corso di Esercitazioni di Programmazione

Risolvere un problema

es : torta di carote

Dati diingresso

Ingredienti

Elaborazione

Combinazione degli ingredienti secondo una opportuna ricetta La torta !

Dati diuscita

Page 13: Corso di Esercitazioni di Programmazione

Risolvere un problema

– vogliamo essere capaci di specificare la strategiaseguita dal passo di elaborazione in modo dafarla eseguire ‘automaticamente’ dal computer quindi dobbiamo :

– riuscire a descrivere accuratamente i vari passidella soluzione attraverso azioni che ilcalcolatore è in grado di effettuare e con un linguaggio che è in grado di comprendere

Page 14: Corso di Esercitazioni di Programmazione

Risolvere un problema

Dati diingresso

Codificati opportunamente

Elaborazione

Trasformazione dei dati di ingressoseguendo i passi specificatida un opportuno algoritmo

Dati diuscita

Umano (che conosce l’algoritmo)

Ovvero la descrizione dell’algoritmosecondo un linguaggio comprensibile alcalcolatore

Calcolatore(che conosce alcune azioni elementari:es confrontare due numeri, eseguire semplicioperazioni aritmetiche

programma

Page 15: Corso di Esercitazioni di Programmazione

Qual’è il ruolo dei calcolatori ?

Nel loro impiego tradizionale, i calcolatori sono essenzialmente esecutori di soluzioni che esseri umani hanno previamente identificato e descritto

Questo utilizzo è motivato dalla notevole velocità diesecuzione dei calcolatori e dalla loro capacità dieseguire molte volte la stessa operazione

Un calcolatore è caratterizzato– dal linguaggio che è in grado di interpretare e – dalle istruzioni che è in grado di eseguire

Page 16: Corso di Esercitazioni di Programmazione

Introduzione alla programmazione

• Prima di scrivere un programma:

– Avere una piena comprensione del problema– Pianificare con cura un approccio per risolverlo

• Mentre si scrive un programma:

– Sapere quali “mattoni per costruire” sono disponibili– Seguire buoni principi di programmazione

Page 17: Corso di Esercitazioni di Programmazione

Algoritmi

• Problemi di elaborazione

– Possono essere risolti eseguendo, in un ordine specifico, una serie di azioni

• Algoritmo: procedura in termini di

– Azioni che devono essere eseguite– L’ordine in cui tali azioni devono essere eseguite

Page 18: Corso di Esercitazioni di Programmazione

Algoritmi e Programmi

Algoritmo (def) : – una sequenza di azioni non ambigue che

trasforma i dati iniziali nel risultato finale utilizzando un insieme di azioni elementari chepossono essere eseguite da un opportunoesecutore.

Programma (def)– specifica di un algoritmo utilizzando un

linguaggio non ambiguo e direttamentecomprensibile dal computer

Page 19: Corso di Esercitazioni di Programmazione

Pseudocodice

– Linguaggio artificiale e informale, che aiuta i programmatoria sviluppare gli algoritmi

– Simile all’italiano di tutti i giorni

– Non realmente eseguito sui computer

– Aiuta il programmatore a “riflettere” sul programma, primache provi a scriverlo

• Facilmente convertibile in un corrispondente programma C

Page 20: Corso di Esercitazioni di Programmazione

Strutture di controllo• Esecuzione sequenziale

– Le istruzioni sono eseguite, una dopo l’altra, nell’ordine incui sono state scritte

• Trasferimento di controllo– Quando la prossima istruzione ad essere eseguita non èla prossima nella sequenza

• Strutture di controllo– Tutti i programmi possono essere scritti in termini di tre sole strutture di controllo:• Struttura di sequenza: le istruzioni vengono eseguite sequenzialmente in modo implicito• Struttura di selezione: Se, Se…altrimenti• Struttura di iterazione: Finché

Page 21: Corso di Esercitazioni di Programmazione

Diagramma di flusso

Sono grafici che permettono di esprimere un algoritmo in modo preciso ed intuitivo

Si costruiscono a partire da un certo numero di ‘blocchi base’ che rappresentano le operazioni elementari ed i costrutti di controllo

Page 22: Corso di Esercitazioni di Programmazione

Diagramma di flusso

I blocchi base:

Cond.

Inizio

Fine

Sottoprog. Operazione I/0

ElaborazioneSi No

Page 23: Corso di Esercitazioni di Programmazione

• Struttura di selezione:– Usata per scegliere tra percorsi di azione alternativi– Pseudocodice:

Se il voto dello studente è maggiore o uguale a 60Visualizza “Promosso”

• Se la condizione è vera– Sarà visualizzato “Promosso” ed “eseguita” l’istruzionesucessiva– Se falsa, la visualizzazione sarà ignorata e sarà eseguital’istruzione successiva– I rientri rendono i programmi più semplici da leggere

Il comando di selezione Se

Page 24: Corso di Esercitazioni di Programmazione

Il comando di selezione SeSimbolo rombo (simbolo di decisione)– Indica che dovrà essere eseguita una scelta– Contiene un’espressione che può essere vera o falsa– Testa la condizione, segue il percorso appropriato

Page 25: Corso di Esercitazioni di Programmazione

Il comando di selezione Se … altrimenti

• Se– Esegue l’azione indicata solo quando la condizione è vera

• Se…altrimenti– Specifica che, nel caso in cui la condizione sia vera, dovràessere eseguita una azione differente da quella che si dovràeseguire qualora la condizione sia falsa

• Pseudocodice:Se il voto dello studente è maggiore o uguale a 60

Visualizza “Promosso”altrimenti

Visualizza “Bocciato”

– Osservate le convenzioni di rientro e spaziatura

Page 26: Corso di Esercitazioni di Programmazione

Il comando di selezione Se … altrimenti

• Diagramma di flusso del comando di selezione

Page 27: Corso di Esercitazioni di Programmazione

I comandi Se … altrimenti nidificati

Se il voto dello studente è maggiore o uguale a 90Visualizza “A”

altrimentiSe il voto dello studente è maggiore o uguale a 80

Visualizza “B”altrimenti

Se il voto dello studente è maggiore o uguale a 70Visualizza “C”

altrimentiSe il voto dello studente è maggiore o uguale a 60

Visualizza “D”altrimenti

Visualizza “F”

Page 28: Corso di Esercitazioni di Programmazione

Diagramma di flusso

I blocchi base vengono collegati tramite ‘frecce’ che collegano un’azione alla successiva all’interno dell’algoritmo Vediamo il diagramma di flusso del seguente

algoritmo:

Trovare il maggiore fra 2 numeri interi x e y

Page 29: Corso di Esercitazioni di Programmazione

Il maggiore fra due numeri interi x, y

Algoritmo max1. Leggi i valori di x e y dall’esterno2. Calcola la differenza d fra x e y (d=x-y)3. Se d è maggiore di 0 allora esegui il passo 4

altrimenti esegui il passo 54. Stampa ‘il massimo è …’ seguito dal valore di x

e termina5. Stampa ‘il massimo è …’ seguito dal valore di y

e termina

Page 30: Corso di Esercitazioni di Programmazione

DF di max

d > 0 ?

Inizio

Fine

Leggi x e y

Si No

d = x - y

Scrivi ‘max è’ x Scrivi ‘max è’ y

Page 31: Corso di Esercitazioni di Programmazione

d > 0 ?

Inizio

Fine

Leggi x e y

Si No

d = x - y

Scrivi ‘max è’ x Scrivi ‘max è’ y

Passo 1

Passo 2

Passo 3

Passo 4 Passo 5

DF di max

Page 32: Corso di Esercitazioni di Programmazione

DF e programmi

I DF sono un primo passo verso la formalizzazione di un algoritmo in modo non ambiguoPer ottenere una codifica interpretabile direttamente dalla macchina dobbiamo però specificare molti più dettagli :– trasformare tutte le ‘frasi’ in variabili e

modifiche su di esse

Page 33: Corso di Esercitazioni di Programmazione

Programmi

Per ottenere una codifica interpretabile direttamente dalla macchina dobbiamo anche :– decidere come codificare l’informazione

• non banale in esempi più complessi del nostro, ad esempio se voglio codificare un’immagine o un video

– scrivere il tutto con una codifica ‘leggibile’ dalla macchina

• … ma la macchina lavora molto a basso livello (linguaggio macchina, codificato con zeri e uni) !!!!

Page 34: Corso di Esercitazioni di Programmazione

Programmi

… soluzione….– usare linguaggi di ‘livello’ più alto (linguaggi di

programmazione ad alto livello)– usare dei programmi appositi per far tradurre i

nostri programmi in linguaggio macchina (i compilatori)

importante ….– I tipici linguaggi (C, C++, Java, Fortran, Basic…)

permettono di definire strutture del tutto analoghe ai diagrammi di flusso che abbiamo visto finora

Page 35: Corso di Esercitazioni di Programmazione

Programma: max in Cmain() /* calcola max */{int x, y, d;

scanf ("%d %d”, &x, &y) ; d = x - y ;if (d > 0)

printf (”il max è %d”, &x) ;else

printf (”il max è %d”, &y) ;return ;}

Page 36: Corso di Esercitazioni di Programmazione

Comando: if-elseLa forma generale dell’istruzione if-else è la seguente:

if (espressione) istruzione;

else istruzione;

dove istruzione può essere una singola istruzione, un blocco di istruzioni o l’istruzione nulla. La clausola else è opzionale.

Se espressione fornisce un risultato vero, viene eseguita l’istruzione o il blocco relativo alla parte if; Se espressione fornisce un risultato falso, verrà eseguita, se esiste, l’istruzione o il blocco else.

Page 37: Corso di Esercitazioni di Programmazione

Comando: if-else/* Scrivere un programma che legge due numeri e stampa il maggiore */

#include <stdio.h>int main ( ) {int x, y, max;printf (“Digita due numeri: ”);scanf (“%d%d”, &x, &y);if (x>y)

max = x; else

max = y;printf (“%d\n”, max);

}

Page 38: Corso di Esercitazioni di Programmazione

Comando: if-else/* Scrivere un programma come prima che non usa la variabile max */

#include <stdio.h>int main ( ) {int x, y;printf (“Digita due numeri: ”);scanf (“%d%d”, &x, &y);if (x>y)

printf (“%d\n”, x); else

printf (“%d\n”, y); }

Page 39: Corso di Esercitazioni di Programmazione

Comando: if-else/* Scrivere un programma che riceve un numero intero in input,determina se il numero e’ maggiore o minore di 100 e stampa a video un messaggio corrispondente */

#include <stdio.h>int main( ) {

int i; /* dichiarazione di variabile */printf (“Dammi un intero: ”);scanf (“%d”, &i); /* inizializzazione della variabile i */if (i<100)

printf (“il numero inserito è minore di 100\n”);else

printf (“il numero inserito è maggiore o uguale a 100\n”); }

Page 40: Corso di Esercitazioni di Programmazione

Espressioni booleane/* Utilizzo delle espressioni booleane */

#include <stdio.h>int main( ){

int a, i;printf (“Dammi un intero: ”);scanf (“%d”, &i);a = i<100;if (a!=0)

printf (“il numero inserito è minore di 100\n”);else

printf (“il numero inserito è maggiore o uguale a 100\n”);}

/* equivale a if (i<100) */

Page 41: Corso di Esercitazioni di Programmazione

Espressioni booleaneL’assegnamento

a=i<100

è del tutto lecito, perché viene valutata l’espressione logica i<100,che può restituire 1 (true) o 0 (false). Il risultato e’ dunque un numero intero, che viene assegnato allavariabile, di tipo int, a.

Valutare l’espressione a!=0

significa chiedersi se il valore di a è diverso da 0. Ma questoequivale a chiedersi se il valore di a è true.Si può dunque modificare il programma precedente come segue.

Page 42: Corso di Esercitazioni di Programmazione

Espressioni booleane/* Un altro esempio di utilizzo delle espressioni booleane */

#include <stdio.h>int main( ){

int a, i;printf (“Dammi un intero: ”);scanf (“%d”, &i);a = i<100;if (a)

printf (“il numero inserito è minore di 100\n”);else

printf (“il numero inserito è maggiore o uguale a 100\n”);}

/* equivale a if (i<100) */

Page 43: Corso di Esercitazioni di Programmazione

Espressioni booleaneDato che le espressioni booleane restituiscono un risultato numerico, non esistono differenze tra le espressioni booleane equelle aritmetiche.

Un’espressione può contenere una combinazione di operatoriaritmetici, logici e relazionali.

Esempio

w = k + numero + (i < 100);

l’assegnamento viene effettuato alla fine, perché = ha la prioritàpiù bassa.

Page 44: Corso di Esercitazioni di Programmazione

AttenzioneEssendo l’operatore di assegnamento trattato alla stregua degli altri,sarà lecita anche la seguente espressione:

i > n && (x=y)

dove i > n è vera se il valore di i è maggiore di n; mentre x=y corrisponde all’assegnamento di y alla variabile x:in questo caso, se il valore di y è diverso da zero l’espressione (x=y) risulta vera altrimenti è falsa.

Queste caratteristiche rendono il C un linguaggio flessibile checonsente la scrittura di codice sintetico ed efficiente ma anchedifficilmente interpretabile.

Page 45: Corso di Esercitazioni di Programmazione

Esercizio

/* esempio di if-else */#include <stdio.h>int main( ){

int x, y;x = 5;y = 4;if (x==y)

printf(“vero”);else

printf (“falso”); }

Dire cosa stampano i seguenti programmi

/* altro esempio di if-else */#include <stdio.h>int main( ){

int x, y;x = 5;y = 4;if (x=y)

printf (“vero”);else

printf (“falso”); }

stampa falso stampa vero

Page 46: Corso di Esercitazioni di Programmazione

Esempio: “Tenta l’ambo”

/* Il gioco “Tenta l’ambo” è una semplificazione del gioco del lotto. Il gioco consiste nell’indovinare una coppia di numeri estratti casualmente nell’intervallo [1,90].

Il programma genera una coppia di numeri usando la funzione rand(),che definisce un valore intero compreso tra 0 e 32767, e usando in seguito l’operatore % per ottenere un numero nell’intervallo desiderato.

La funzione rand() richiede l’uso del file header stdlib.h. Se il giocatore indovina la coppia di numeri allora il programma

visualizza il messaggio ^^Ambo!^^ altrimenti visualizza il messaggio ^^Peccato^^.

*/

Page 47: Corso di Esercitazioni di Programmazione

Esempio: “Tenta l’ambo”#include <stdio.h> /* Programma per indovinare l’ambo*/#include <stdlib.h>

int main ( ) {int estratto1, estratto2; /* numeri estratti */int guess1, guess2; /* valori immessi dall’utente */estratto1 = rand( ) % 90 +1; /* estrae il primo numero */estratto2 = rand( ) % 90 +1; /* estrae il secondo numero */printf (“Tenta l’ambo: ”);scanf (“%d %d”, &guess1, &guess2);if ( guess1 == estratto1 && guess2==estratto2 ||

guess1 == estratto2 && guess2==estratto1 ) printf(“^^Ambo!^^”);

elseprintf (“^^Peccato^^”);

}