Corso di Esercitazioni di Programmazione
Introduzione
Dott.ssa Sabina Rossi
Informazioni
Pagina web del corso:
http://www.dsi.unive.it/~prog1NewsOrariMailing listLezioniEsercitazioniDate esamiRisultati esami…..
Informazioni e spiegazioni
Per ricevere gli avvisi relativi al corso ci si può iscrivere alla mailing list
usando la pagina web
http://listserver.dsi.unive.it/wws/subrequest/programmazione
oppure inviando direttamente una e-mail a
mettendo nel body il testo subscribe programmazione
Ricevimento
Martedì dalle 14.00 alle 15.00oppure su appuntamento
Libri di Testo
C Corso completo di programmazioneH.M. Deitel, P.J. DeitelApogeo
The C Programming LanguageKernighan, RitchiePrentice Hall
Laboratorio
Lunedì e Giovedìdalle 13.00 alle 14.00
Tutor Luca Leonardi
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.
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)
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.
Problemi, Algoritmi e Programmi
Approfondiamo come progettare e scriverenuovi algoritmi e programmi
Risolvere un problema
es : riconoscere qualcuno fra la folla
Dati diingresso
Immagine dellafolla
Elaborazione
Ricerca nell’immagineSI, NO, chi è la persona riconosciuta
Dati diuscita
Risolvere un problema
es : torta di carote
Dati diingresso
Ingredienti
Elaborazione
Combinazione degli ingredienti secondo una opportuna ricetta La torta !
Dati diuscita
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
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
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
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
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
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
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
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é
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
Diagramma di flusso
I blocchi base:
Cond.
Inizio
Fine
Sottoprog. Operazione I/0
ElaborazioneSi No
• 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
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
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
Il comando di selezione Se … altrimenti
• Diagramma di flusso del comando di selezione
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”
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
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
DF di max
d > 0 ?
Inizio
Fine
Leggi x e y
Si No
d = x - y
Scrivi ‘max è’ x Scrivi ‘max è’ y
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
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
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) !!!!
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
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 ;}
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.
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);
}
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); }
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”); }
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) */
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.
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) */
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.
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.
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
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^^.
*/
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^^”);
}