Per questa esercitazione ipotizziamo di avere un minicomputer, che dispone di uno schermo e di una tastiera che permettono di inserire e stampare dati. Il computer è programmabile con un linguaggio di programmazione, che chiameremo HOP, che dispone di un insieme di istruzioni limitato ed una memoria per le variabili limitata.
In HOP sono presenti le seguenti variabili: A, B, C, D, E, F, G, H, che possono contenere un numero.
E’ possibile leggere e scrivere le variabili con queste due istruzioni:
A = LEGGI() -> legge il valore di A dalla tastiera
STAMPA(B) -> stampa il valore di B
Sono poi presenti le seguenti operazioni:
C = SOMMA (A,B)
C = SOTTRAI (A,B)
C = MOLT (A,B)
C = DIVIDI (A,B)
C = MODULO (A, B) (indica il resto della divisione)
A = RADICE(B)
Naturalmente è possibile utilizzare qualsiasi variabile, sia a destra che a sinistra dell’uguale.
E’ infine possibile assegnare direttamente una variabile.
A = 3
Proviamo a scrivere un piccolo programma che riceve due numeri e stampa la loro somma:
A = LEGGI()
B = LEGGI()
C = SOMMA(A,B)
STAMPA(C)
Possiamo scrivere un programma che risolve il Teorema di Pitagora
A = LEGGI() -> primo cateto
B = LEGGI() -> secondo cateto
A = MOLT(A,A) -> quadrato del primo cateto
B = MOLT(B,B) -> quadrato del secondo cateto
A = SOMMA(A,B) -> somma dei quadrati dei cateti
A = RADICE(A) -> calcolo ipotenusa
STAMPA(A)
Notare che per motivi di efficienza continuiamo ad usare le stesse variabili.
Esercizi
Sommare 3 numeri
Calcolare la soluzione dell’equazione di secondo grado
Che avrà come soluzioni:
3. Calcolare il seguente polinomio (dati a,b,c,d,x)
4. Calcolare la seguente espressione
Istruzione condizionale
Non sempre il flusso di istruzioni è lineare. Un algoritmo infatti deve essere in grado di gestire delle scelte sui dati, e quindi gestire istruzioni o gruppi di istruzioni differenti a seconda dei dati stessi. Per questo introduciamo questa istruzione
SE (CONDIZIONE) VAI A XX
Se la condizione è vera il programma si sposta all’istruzione con etichetta XX altrimenti va avanti normalmente. La condizione è una possibile tra le seguenti
A > B A < B A >= B A <= B A = B A != B (diverso)
Questo ci permette di svolgere quindi programmi dove il flusso di esecuzione del programma cambia in base ai dati inseriti dall’utente. Per esempio possiamo scrivere un programma che ricevuti 3 numeri ci dice il più grande
1. A = LEGGI()
2. B = LEGGI()
3. C = LEGGI()
4. SE (A >= B) VAI A 8
5. SE (B <= C) VAI A 9
6. STAMPA(B)
7. FINE
8. SE (A >= C) VAI A 11
9. STAMPA(C)
10. FINE
11. STAMPA(A)
12. FINE
Un programma con le condizioni è sempre più complesso e difficile da leggere, perché per interpretarlo dobbiamo seguire il flusso del programma per ogni possibile situazione. Ad esempio – per A=3, B=2, C=1 le istruzioni che verranno eseguite sono 1-2-3-4-8-11 (A il più grande). – per A=1, B=2, C=3 verranno eseguite 1-2-3-4-5-9 – per A=2, B=3, C=1 verranno eseguite 1-2-3-4-5-6
Bisogna quindi assicurarsi che tutti i i casi possibili siano gestiti.
Esercizi
Individuare il mediano tra 3 numeri.
Calcolare anno bisestile (un anno è bisestile se – è divisibile per 4 – non è divisibile per 100 – è divisibile per 400, (Quindi 1900 non è bisestile, 2000 si. )
Il programma legge tre numeri e dice se possono essere le lunghezze dei lati di un triangolo equilatero, scaleno, o isoscele.
Un ecommerce propone uno sconto del 20% se si acquistano almeno 10 articoli e si spendono almeno 500 euro. Scrivere un programma che chiede di inserire la spesa totale ed il numero di articoli, e stampa la spesa finale (identica se senza sconto o scontata del 20% se si soddisfano le condizioni di sconto).
Scrivere un programma che chiede un numero e dice se è divisibile per 2 e per 3.
Cicli
Per risolvere numerosi problemi di calcolo spesso è necessario svolgere operazioni ripetitive, ovvero dove viene ripetuta molte volte la stessa sequenza di istruzioni. Ad esempio se chiediamo al computer di enumerare tutti i numeri da 1 a 100, significa chiedergli di eseguire l’istruzione di stampa 100 volte:
Queste istruzioni non vanno bene, sia perchè non è pensabile scrivere 100 istruzioni identiche, sia perché potrebbero essere mille o centomila, sia perché di norma dobbiamo cercare di delegare il lavoro noioso e ripetitivo al computer.
Possiamo semplificare questo comportamento per eseguire alcune istruzioni in modo ciclico ed utilizzando l’istruzione condizionale per controllare questa ripetizione. L’esempio precedente si può quindi riscrivere così:
1. A = 0
2. A = SOMMA(A,1)
3. STAMPA(A)
4. SE (A<100) VAI A 2
Con 4 istruzioni è possibile far contare il computer fino a qualsiasi numero definito nell’istruzione 4. E’ importante osservare che il numero di cicli è noto a priori dal programmatore già mentre scrive il codice, e per questo tipo di ciclo viene detto a “iterazione definita a compile time”. Il “compile time” è il momento in cui il programmatore scrive il codice, e in questo caso specifico di ciclo conosce già quanti cicli serviranno.
Non è detto che sia sempre così, ad esempio il numero di cicli potrebbe essere generato casualmente. Ipotizziamo che esista una istruzione RANDOM(XX) che genera un numero casuale intero tra 1 e XX.
1. B = RANDOM(1000)
2. A = 0
2. A = SOMMA(A,1)
3. STAMPA(A)
4. SE (A<B) VAI A 2
In questo caso il numero di cicli non è noto a compile time, perché viene generato solo quando il programma è in esecuzione. In questo caso si parla di “iterazione definita a runtime” dove “runtime” è il momento in cui il programma viene eseguito. In questo caso il programmatore non conosce a priori il numero di cicli, ma il computer lo conosce, una volta definito il valore di B. Questo caso è più comune, in quanto i dati su cui operano gli algoritmi non sono sempre noti al programmatore.
C’è poi un terzo caso in cui il numero di cicli non è noto in anticipo, perché i programmi non sono solo operazioni di calcolo, ma interagiscono con utenti, che di norma possono essere imprevedibili. Poniamo che il numero B, anziché essere generato sia inserito dall’utente. Il numero però deve soddisfare una regola, ovvero che sia maggiore di 0, quindi dobbiamo verificare che l’utente inserisca un valore valido.
1. B = LEGGI()
2. SE (B <= 0) VAI A 1
3. A = 0
4. A = SOMMA(A,1)
5. STAMPA(A)
6. SE (A<B) VAI A 2
In questo caso il ciclo delle istruzioni 1-2 ha una durata non conosciuta nè dal programmatore, nè dal computer, perché dipende da azioni svolte dall’esterno del programma. Parliamo in questo caso di “iterazione indefinita”. Anche questo caso è molto comune, in pratica tutte le volte che si scrivono applicazioni interattive dove i dati inseriti dall’utente vanno validati.
Esercizi
Creare un programma che chiede un numero (es. N) e stampa i multipli di quel numero fino a 10 volte (es. l’utente se inserisce 5 il programma stamperà 5,10,15, …).
Scrivere un programma che chiede un numero A positivo e stampa tutti i numeri da A a 1, compresi.
Come il precedente, ma A può essere negativo.
Scrivere un programma che stampa i primi 5 numeri pari.
Scrivere un programma che stampa i primi N numeri pari, con N richiesto all’utente e dopo aver verificato che N sia positivo.