Prima
settimana
Cominciamo con un esercizio semplice:
Problema
Conoscendo il risultato di una partita di calcio ad eliminazione
diretta (non è consentito il pareggio), si vuole visualizzare
il nome della squadra vincente.
Provo a descrivere il ragionamento che dobbiamo fare e quali
passi dobbiamo compiere:
1) individuare i dati
il risultato è dato di gol segnati dalle due squadre;
poiché dobbiamo visualizzare il nome della squadra vincente,
mi servono anche i nomi delle due squadre.
Possiamo indicare le due squadre in ordine, prima squadra +
gol, seconda squadra + gol.
2) individuare le azioni
Poiché non è consentito il pareggio (vincolo del
problema), la squadra vincente è quella con il numero
di gol maggiore.
Dovremo quindi fare un controllo (un test, un confronto, una
selezione) confrontando i valori dei gol delle due squadre.
Useremo quindi la struttura di selezione binaria (se.., allora
altrimenti
)
N.B.
Poiché il problema parla solo di una partita, qui non
abbiamo ripetizione.
Passiamo ora alla formalizzazione di tutto il ragionamento.
Dati di input:
nome della prima squadra (Nome1), gol della prima squadra (Gol1)
nome della seconda squadra (Nome2), gol della seconda squadra
(Gol2).
Dati di output:
nome della squadra vincente
Algoritmo
Ingresso dei dati
Confronto
Uscita del risultato
In dettaglio
Inizio
-------- Ingresso dati -----------------------
Chiedi (Nome prima squadra)
Leggi (Nome1)
Chiedi (Gol prima squadra)
Leggi(Gol1)
Chiedi (Nome seconda squadra)
Leggi (Nome2)
Chiedi (Gol seconda squadra)
Leggi(Gol2)
------- Controllo ------------------------
Se Gol1 > Gol2
Allora
Vincente = Nome1
Altrimenti
Vincente = Nome2
------- Uscita del risultato -------------
Scrivi (Vincente)
Fine
Sulla base della traccia precedente, dovete ora fare:
a) la codifica di questo algoritmo, provandolo sul computer
Attenzione ai tipi di dati: stringhe e interi
b) Risolvere in modo completo (analisi, algoritmo, codifica)
il seguente problema analogo:
Problema
Su un reddito si paga l'imposta del 35% se il reddito è
superiore a 60.000 euro, altrimenti il 23%.
Quanto si deve pagare?
Seconda
settimana
Un passo avanti: la struttura di ripetizione
La tipologia di problemi che vogliamo trattare ora riguarda
i casi in cui dobbiamo esaminare molti dati inseriti da tastiera
e fare su di essi alcune elaborazioni (controlli, selezioni,
somme, conteggi, stampe, ecc.).
I dati naturalmente vengono fatti entrare ed esaminati ad uno
ad uno: si tratta di stabilire quanto terminare questa attività,
cioè stabilire un controllo di fine ripetizione (o fine
ciclo), nell'ipotesi che non sappiamo a priori il numero esatto
di dati da esaminare.
La soluzione consiste nello stabilire una condizione che consenta
di determinare la fine della lista di dati: per esempio, se
faccio entrare nomi (o stringhe di caratteri in generale) posso
stabilire che la ripetizione termina quando l'utente, anziché
inserire un nome, inserisce un carattere *.
Oppure se faccio entrare numeri, la ripetizione termina quando
l'utente inserisce 0 oppure -1.
La struttura generale dell'algoritmo di ripetizione è
la seguente:
scrivi (inserisci il primo nome)
leggi (nome)
MENTRE nome diverso da * ESEGUI
Inizio
---------------
---------------
--------------
scrivi (inserisci un altro nome)
leggi (nome)
Fine
La struttura MENTRE rappresenta la ripetizione: il primo inserimento,
prima del MENTRE, serve a far partire il ciclo; le righe con
i trattini rappresentano altri dati di input e le attività
di elaborazione; prima di tornare all'inizio della ripetizione,
si fa l'inserimento di un altro dato.
L'uscita dalla ripetizione avviene quando si inserisce un *
come nome.
Sulla base della traccia precedente, l'esercitazione prevede:
1) un primo esercizio semplice:
PROBLEMA 1
Costruire un algoritmo che accetta da tastiera un elenco di
nomi e man mano li visualizza.
2) un secondo esercizio leggermente più difficile
PROBLEMA 2
Costruire un algoritmo che accetta da tastiera un elenco di
nomi e li conta. Alla fine fornisce il numero dei nomi inseriti.
(per contare: usare una variabile contatore che all'inizio
è posta uguale a 0; ogni volta che entra un nome si incrementa
di 1
contatore := contatore +1
Alla fine, fuori dal ciclo MENTRE, scrive il valore del contatore)
2) un terzo esercizio ancora un po' più difficile
PROBLEMA 3
Dato un elenco di nomi con le rispettive città, conta
quanti sono quelli di Milano.
Di ciascun problema dobbiamo fare l'analisi dei dati di input
e di output, scrivere l'algoritmo in pseudocodifica e poi codificare
nel linguaggio di programmazione validando il programma con
la prova sul computer.
Terza
settimana
Un altro tipo di ripetizione: la struttura di ripetizione
con contatore
La tipologia di problemi nei quali si usa questa struttura
riguarda i casi in cui sappiamo già a priori quanti sono
i dati da esaminare e da elaborare.
Questi casi sono molto frequenti: si pensi ai dati degli studenti
di una classe, oppure a dati riferiti ai 12 mesi dell'anno.
Anche in questi casi i dati vengono fatti entrare ed esaminati
ad uno ad uno: il controllo sulla ripetizione è fatto
con un contatore che all'inizio assume il valore 1 e che si
incrementa di 1 ad ogni ripetizione finché viene raggiunto
il numero complessivo prestabilito.
La struttura generale dell'algoritmo di ripetizione è
la seguente:
scrivi (quanti sono i dati da esaminare)
leggi (N)
PER K da 1 a N ESEGUI
Inizio
---------------
---------------
--------------
Fine
Sulla base della traccia precedente, l'esercitazione prevede
due esercizi simili a quelli visti con la ripetizione MENTRE:
1) un primo esercizio semplice:
PROBLEMA 1
Costruire un algoritmo che accetta da tastiera un elenco di
N città e man mano le visualizza.
2) un secondo esercizio leggermente più difficile
PROBLEMA 2
Costruire un algoritmo che accetta da tastiera un elenco di
N prezzi e li somma. Alla fine fornisce il totale dei prezzi
inseriti.
(per sommare: usare una variabile somma che all'inizio è
posta uguale a 0; ogni volta che entra un prezzo si incrementa
del prezzo
somma := somma + prezzo
Alla fine, fuori dal ciclo, scrive il valore della somma)
2) un terzo esercizio ancora un po' più difficile
PROBLEMA 3
Dato un elenco di prodotti con i rispettivi prezzi, conta quanti
sono quelli che hanno il prezzo superiore a 100 euro.
(Attenzione a non confondere il contatore del ciclo con il
contatore dei prodotti selezionati).
Di ciascun problema dobbiamo fare l'analisi dei dati di input
e di output, scrivere l'algoritmo in pseudocodifica e poi codificare
nel linguaggio di programmazione validando il programma con
la prova sul computer.
Quarta
settimana
Organizzare gli algoritmi: uso delle procedure
Nei procedimenti risolutivi, soprattutto di problemi complessi,
è possibile identificare le parti di cui si compongono
per poter meglio tenere sotto controllo la complessità
del problema.
Si usa cioè una metodologia top-down, che vuol dire procedere
da una visione "alla grande" del problema per arrivare
al dettaglio delle singole parti.
In un problema standard possiamo sempre distinguere tre parti
principali:
- ingresso dati
- elaborazione
- uscita risultati.
L'algoritmo principale è formato dai nomi di queste
parti: lo sviluppo di ciascuna parte viene fatto nei sottoalgoritmi
che dettagliano le cose da fare.
Nella codifica, il programma risulta formato dal programma principale
che richiama l'esecuzione dei sottoprogrammi, detti procedure.
Si consideri per esempio il problema del calcolo della media
dei voti di N studenti. Il procedimento risolutivo si compone
di tre parti:
1. ingresso dei nomi e dei voti di ciascun studente (con una
ripetizione con contatore): man mano i voti vengono sommati
2. calcolo della media
3. visualizzazione della media.
Sviluppiamo ciascuno dei tre punti con un sottoprogramma (procedura):
il programma principale è la chiamata alle tre procedure.
Si osservi che, per questo problema semplice, le istruzioni
della seconda e terza parte sono una, al massimo due.
Sulla base della traccia precedente, l'esercitazione prevede
la costruzione dei procedimenti usando le procedure. Per questi
primi esercizi non usiamo il passaggio di parametri, lasciando
quasi tutte le variabili (ad esclusione dei contatori dei cicli)
come variabili globali.
1) un primo esercizio semplice:
PROBLEMA 1
Da un elenco di automobili conta quante sono quelle che appartengono
ad una marca fornita all'inizio del programma.
(le parti sono: (1) ingresso marca da controllare, (2) ingresso
dati automobili, (3) visualizzazione risultato).
2) un secondo esercizio leggermente più difficile
PROBLEMA 2
Dato da tastiera un numero, calcolare l'area di un quadrato
e l'area del cerchio aventi rispettivamente il numero come lato
e come raggio.
3) un terzo esercizio ancora un po' più difficile
PROBLEMA 3
Il programma principale consente all'utente (con una selezione
multipla) di scegliere tra tre figure diverse: quadrato, rettangolo,
trapezio. A seconda della scelta, le singole procedure di calcolo
chiedono i dati necessari e visualizzano il valore dell'area
di ciascuna figura.
Quinta
settimana
Organizzare gli algoritmi 2.a parte: uso delle procedure
con i parametri
Nell'esercitazione della quarta settimana abbiamo usato procedure
senza parametri.
L'uso dei parametri però è importante perché
consente non soltanto di organizzare gli algoritmi suddividendoli
in sottoproblemi, ma soprattutto di poter usare la stessa procedura
più volte con dati diversi e anche all'interno di programmi
diversi.
In sostanza i parametri sono variabili che vengono usate all'interno
della procedura e che ricevono i valori dal programma principale.
I parametri sono indicati nell'intestazione della procedura:
Procedure Calcolo (a, b : integer); nel passaggio per valore
Procedure Calcolo (Var a, b : integer); nel passaggio per indirizzo
(si riveda nel libro di testo la distinzione tra i due diversi
tipi di passaggio di parametri)
Nel programma principale la chiamata della procedura deve contenere
anche l'indicazione dei valori da passare ai parametri:
Calcolo (x, y);
L'esercitazione prevede la costruzione dei procedimenti usando
le procedure con parametri. È anche opportuno usare laddove
è possibile molte variabili locali e poche variabili
globali, per rendere la procedura un'unità di elaborazione
che può essere riusata in contesti diversi.
1) un primo esercizio semplice:
PROBLEMA 1
Il programma principale passa a una procedura di stampa un nome
e un numero: la procedura stampa sulla carta il nome e il numero
su due righe una sotto l'altra e poi una riga formata da 30
trattini.
2) un secondo esercizio:
PROBLEMA 2
Calcolo della statura media delle persone. Il programma acquisisce
da tastiera il numero delle persone (variabile globale) e lo
passa come parametro alla procedura di ingresso dati. Questa
procedura con un ciclo fa entrare le stature e ne calcola la
somma (variabile globale). Una seconda procedura riceve la somma
delle stature e il numero delle persone come parametri e calcola
la media visualizzando il risultato.
Sesta
settimana
Organizzare gli algoritmi (terza parte): uso delle funzioni
L'uso delle funzioni consente di costruire sottoprogramma che
non soltanto organizzano meglio gli algoritmi suddividendoli
in sottoproblemi (come le procedure), ma che restituiscono sempre
un valore calcolato e quindi possono essere usate nel programma
come se fossero variabili nelle istruzioni di assegnazione,
di controllo o di stampa.
La struttura generale di una funzione è:
Function NomeFunzione (parametri: tipo) : tipo;
Begin
End;
è importante notare la differente sintassi dell'intestazione
perché occorre specificare il tipo del risultato restituito
dalla funzione.
Importante inoltre ricordare che, poiché la funzione
deve restituire qualcosa al programma principale, prima di uscire
nel corpo della funzione ci dovrà essere per forza un'istruzione
che assegna un valore alla funzione (cioè il nome della
funzione compare a sinistra nell'istruzione di assegnazione).
Nel programma principale la chiamata della funzione è
di questo tipo, per esempio:
Calcolo = NomeFunzione (x, y);
1) un primo esercizio semplice:
PROBLEMA 1
Il programma principale contiene 4 funzioni per il calcolo delle
4 operazioni aritmetiche; esse ricevono come parametro i due
operandi.
2) un secondo esercizio:
PROBLEMA 2
Riscrivere il problema 2 della precedente esercitazione, usando
una funzione per il calcolo della media.
torna all'inizio