INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SOFTLAB DUE INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA ESEMPIO INIZIO PREPARA-CAFFE Un esempio di programma: la preparazione del caffè. Il simbolo grafico aiuta a capire che ci si trova davanti ad un processo composto da più sottoprocessi, sia semplici azioni elementari che ulteriori processi. FINE
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SOFTLAB DUE INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SCOMPOSIZIONE: processo “prepara caffè” INIZIO PREPARA-CAFFE PREPARA-MACCHINETTA METTI-MACCHINETTA-SU-FUOCO CUCINA-CAFFE Ecco scomposto il processo “Prepara-caffè”. Come si vede, la routine è composta da tre ulteriori sub-routine e da un’azione elementare. Si vedrà come scomporre ulteriormente tutto il processo, sino ad arrivare ad un insieme di azioni elementari. SERVI-CAFFE FINE PREPARA-CAFFE
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SOFTLAB DUE INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SCOMPOSIZIONE: processo “prepara macchinetta” INIZIO PREPARA-MACCHINETTA PRENDI-MACCHINETTA-DA-CREDENZA 1 PRENDI-CAFFE-DA-DISPENSA 2 METTI-ACQUA-IN-MACCHINETTA Come si vede in questa slide, la routine “Prepara-macchinetta” è stata scomposta in una serie di azioni elementari, le quali descrivono tutte le fasi della preparazione della caffettiera. La routine è stata scomposta al livello più semplice. METTI-CAFFE-IN-MACCHINETTA FINE PREPARA-MACCHINETTA
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SOFTLAB DUE INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA INIZIO PREPARA-MACCHINETTA V F Macchinetta in credenza 1 PRENDI-MACCHINETTA-DA-CREDENZA In questa slide viene introdotto il concetto di test. Durante l’elaborazione ci si può trovare di fronte ad una alternativa. La rappresentazione grafica è un rombo nel quale si avranno un ingresso e due uscite che convoglieranno sempre ad un nodo connettore. All’interno del rombo verrà inserita la condizione da testare. L’ alternativa conduce sempre ad una scelta: vero o falso. A seconda della risposta il programma seguirà un percorso anziché un altro. PRENDI-CAFFE-DA-DISPENSA 2
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SOFTLAB DUE INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA NODO CONNETTORE q TEST/VERIFICA/DECISIONE q CONDIZIONE
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SOFTLAB DUE INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA ENTRATA TEST F V q A B Se la condizione testata è vera, verrà eseguita la routine B, mentre se la condizione è falsa verrà eseguita la routine A. Le uscite delle due routine conducono al nodo connettore, per poi proseguire nell’elaborazione. USCITA
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SOFTLAB DUE INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA F V Macchinetta in credenza 1 PRENDI-MACCHINETTA F V Naturalmente i test possono essere eseguiti in cascata, uno dopo l’altro, testando una dopo l’altra più condizioni. 2 Caffè non in dispensa COMPRA-CAFFE
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SOFTLAB DUE INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA TESTS IN CASCATA F V p 1 A B F V q 2 C D
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SOFTLAB DUE INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA TESTS NIDIFICATI F V p C F V q B A
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SOFTLAB DUE INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SCOMPOSIZIONE: processo “servi caffè” INIZIO SERVI-CAFFE TOGLI-CAFFE-DA-FUOCO ZUCCHERA-CAFFE VERSA-CAFFE PORGI-CAFFE FINE SERVI-CAFFE
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SOFTLAB DUE INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SCOMPOSIZIONE: processo “zucchera caffè” INIZIO ZUCCHERA-CAFFE V Caffè amaro AGGIUNGI-ZUCCHERO F Questo esempio introduce le strutture iterative. La prima analizzata è l’iterazione per vero. Si controlla se il caffè è amaro: se ciò è vero si aggiunge lo zucchero e si assaggia il caffè. Si ripete il test e si continua ad aggiungere zucchero e ad assaggiare il caffè. Si “esce” dal ciclo quando la condizione “caffè amaro” non risulta più verificata. ASSAGGIA-CAFFE FINE ZUCCHERA-CAFFE
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SOFTLAB DUE INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA ITERAZIONE PER VERO V p A F
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SOFTLAB DUE INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SIMBOLI INIZIO/FINE PROCESSO TEST NODO CONNETTORE PROCESSO FLUSSO AZIONE
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA SOFTLAB DUE INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA STRUTTURE SEQUENZA ITERAZIONE PER VERO V p A F TEST ITERAZIONE PER FALSO F V p A B A F p V
Progetto: Calcolo del resto Capitolo1
Calcolo del resto La divisione di due numeri positivi, può essere espressa attraverso la sottrazione: n:m equivale a sottrarre m da n fino a quando n diventa inferiore di m. Il numero di volte in cui tale sottrazione ha luogo, è il risultato della divisione.
resto = resto - divisore Calcolo del resto inizio Lettura dividendo Lettura divisore resto = divisore resto >= divisore F resto = resto - divisore V Stampa “resto”
Calcolo del resto #include <stdio.h> int main() { int dividendo, divisore, resto; printf("Inserire dividendo:\n"); scanf("%d", ÷ndo); //lettura dividendo printf("Inserire divisore:\n"); scanf("%d", &divisore); //lettura divisore resto = dividendo; while (resto >= divisore){ resto = resto - divisore; } printf("\nresto della divisione %d/%d e' %d", dividendo, divisore, resto); return 0;
Progetto: Calcolo numero primo Capitolo1
Calcolo del numero primo Definizione Un numero n>=2 è un numero PRIMO se è divisibile per 1 e per se stesso. L’ algoritmo consiste nel dividere il numero n per tutti i numeri interi minori di n. Se il numero n risulta divisibile per uno di questi interi (ovvero il resto della divisione è zero) allora n è un numero non PRIMO; in caso contrario n è un numero PRIMO
Calcolo del numero primo Esempio N = 5
int main() { int n, divisore, quoz, resto; int primo; printf("Insrire Numero:"); scanf("%d", &n); primo = true; divisore = 2; while (divisore < n && primo==true){ quoz = n/divisore; //calcolo del quoziente resto = n-(quoz*divisore); //calcolo del resto if (resto == 0){ //se il resto è nullo primo = false; //il numero in esame non è primo } else{ //altrimenti divisore = divisore + 1; //incremento il divisore } if (primo==true){ printf ("\n\n%d e` un numero primo",n); }else{ printf ("\n\n%d non e` un numero primo",n);
Calcolo del numero primo inizio Lettura n primo = true divisore = 2 resto == 0 F V divisore = divisore +1 Primo = false È stato trovato un divisore Divisore < n AND primo = true F resto = n – (quoz*divisore) resto V quoziente quoz = n/divisore stampa
Progetto: Torri di Hanoi http://it.wikipedia.org/wiki/Torre_di_Hanoi http://www.frasi.net/giochionline/torre-di-hanoi/ Capitolo1
Torri di Hanoi: regole Il rompicapo è costituito da tre pile di dischi (“torri”) allineate all’inizio tutti i dischi si trovano sulla pila di sinistra alla fine tutti i dischi si devono trovare sulla pila di destra o centrale I dischi sono tutti di dimensioni diverse e quando si trovano su una pila devono rispettare la seguente regola nessun disco può avere sopra di sé dischi più grandi
Torri di Hanoi: regole Situazione iniziale Situazione finale
Torri di Hanoi: regole Per risolvere il rompicapo bisogna spostare un disco alla volta un disco può essere rimosso dalla cima della torre ed inserito in cima ad un’altra torre non può essere “parcheggiato” all’esterno… in ogni momento deve essere rispettata la regola vista in precedenza nessun disco può avere sopra di sé dischi più grandi
Algoritmo di soluzione Il problema generale consiste nello spostare n dischi da una torre ad un’altra, usando la terza torre come deposito temporaneo Per spostare n dischi da una torre all’altra si suppone di saper spostare n-1 dischi da una torre all’altra, come sempre si fa nella ricorsione Ricorsione Una funzione ricorsiva è una funzione che richiama se stessa
La “Torre di Hanoi”
A B C
Torre di Hanoi: algoritmo int mossa = 0; void hanoi(int, char, char, char); void muovi(int, char, char); int main() { int DISCHI; printf("\nInserire il numero di DISCHI:"); scanf("%d",&DISCHI); printf("\nMosse da eseguire per spostare %d dischi\n", DISCHI); hanoi(DISCHI, 'A', 'B', 'C'); }
Torre di Hanoi: algoritmo void hanoi(int n, char piolo_b, char piolo_a, char aus) { if(n == 1) { muovi(n, piolo_b, piolo_a); }else { hanoi(n-1, piolo_b, aus, piolo_a); hanoi(n-1, aus, piolo_a, piolo_b); } void muovi(int n, char piolo_b, char piolo_a) char invio; printf("\nMossa %3d: ", ++mossa); printf("disco %d da %c a %c\n",n, piolo_b, piolo_a); scanf("%c", &invio);
Torre di Hanoi: output
Torre di Hanoi: sequenza di trasferimenti 1 2 3 A B C 2 3 A B C 1 Mossa 1 3 A B C 1 2 Mossa 2 3 A B C 1 2 Mossa 3 A B C 1 2 3 Mossa 7 A B C 3 1 2 1 A B C 3 2 Mossa 5 1 A B C 2 3 Mossa 6 Mossa 4