Sei sulla pagina 1di 187

INDICE GENERALE

CAPITOLO I: Introduzione allinformatica pag.2

CAPITOLO II: Struttura di un computer pag.4

CAPITOLO III: Le reti informatiche pag.9

CAPITOLO IV: i sistemi di numerazione pag.14

CAPITOLO V: Introduzione alla programmazione pag.21

CAPITOLO VI: Le basi del linguaggio C pag.26

CAPITOLO VII: Le strutture di controllo pag.33

CAPITOLO VIII: Le funzioni in C pag.47

CAPITOLO IX: Gli array pag.63

CAPITOLO X: Il sistema operativo pag.75

CAPITOLO XI: Organizzazione dei dati in memoria di massa pag.78

CAPITOLO XII: La complessit computazionale pag.80

CAPITOLOXIII: Le Strutture dati pag.87

CAPITOLO XIV: Evoluzione dei linguaggi di programmazione pag.103

CAPITOLO XV: Programmazione orientata agli oggetti pag.106

CAPITOLO XVI: Il linguaggio Java pag.114

CAPITOLO XVII: Gli oggetti in Java pag.122

CAPITOLO XVIII: Linterfaccia grafica awt pag.137

CAPITOLO XIX: Le applet Java pag.156


-2-

CAPITOLO I
INTRODUZIONE ALLINFORMATICA

La parola informatica deriva dalla fusione dei termini informazione e


automatica e si indica sia linsieme delle scienze che studiano il trattamento
automatico e digitale delle informazioni, sia le varie tipologie di forme
tecnologiche che ne consentono lelaborazione e larchiviazione dei dati.
Naturalmente lo strumento alla base del mondo dellinformatica il computer,
inteso come sistema elettronico di elaborazione dei dati,costituito sia dalle
parti materiali della macchina, dette HARDWARE, sia dai programmi che
consentono a questultima di eseguire le operazioni richieste. Fanno parte
dellhardware le schede formate dai circuiti elettronici, la scheda madre e
video, il mouse, la tastiera, la stampante ecc e comunque tutto ci che si pu
toccare con mano.
Fanno parte del software tutti i programmi che rendono possibile il
funzionamento del computer, dove per programma intendiamo un insieme di
istruzioni che operano sui dati allo scopo di risolvere un problema semplice o
complesso che sia.
Il software a su volta pu essere distinto in software di base, come il sistema
operativo, e software applicativo, che serve allutente finale per svolgere
diverse funzioni, sinteticamente raccolte nella seguente tabella:

Tipo di software Scopo Pacchetti commerciali


Scrittura, modifica e
Elaborazione testi Ms Word, Works
stampa di documenti
Compilazione di tabelle,
Fogli elettronici calcoli e realizzazione di Ms Excel
grafici
Gestione di grandi quantit
Database di dati ed elaborazioni Ms Access
complesse
Grafica Elaborazione immagini Corel Draw, Photoshop
Progettazione strutture
Disegno tecnico (CAD) AutoCAD
tecniche
Posta elettronica Gestione della posta Ms Outlook Express, Eudora
Navigazione ipertestuale Esplorazione pagine web InternetExplorer,Netscape

CLASSIFICAZIONE DEI COMPUTER

Possiamo identificare sei classi di elaboratori elettronici:


1) Supercomputer
2) Mainframe
3) Minicomputer
4) Workstation
-3-

5) Personal Computer
6) Network Computer

Gli elaboratori pi potenti sono i supercomputer, dotati di


altissime velocit di calcolo e potentissime capacit di
memorizzazione dei dati e vengono utilizzati nel campo
meteorologico, militare o ingegneristico.

Con il termine mainframe si indica un computer di grandi dimensioni,


utilizzato generalmente come server e collegato a terminali, disposti anche
molto lontano dal centro del sistema. Un classico esempio di mainframe si
trova negli istituti di credito.

Un minicomputer molto simile ad un mainframe, anche


se di dimensioni pi ridotte ed usato principalmente
nelle aziende medio- piccole.
Le workstation sono apparecchiature dedicate ad
applicazioni di tipo scientifico e nella progettazione, sono
dotate di grandi monitor e possono fare ricorso a pi processori centrali.
Il Personal Computer un diffusissimo elaboratore di piccole dimensioni,
normalmente monoutente e dal costo contenuto. Il pc pu essere autonomo o
collegato in rete e connesso ad altri pc e pu essere fisso o
portatile.

Unaltra classe di computer da considerare quella dei palmari, che sono


sistemi multimediali di piccolissime dimensioni ma con una sofisticata ed
innovativa tecnologia. I modelli pi recenti eguagliano ormai le prestazioni di
un normale pc.
-4-

CAPITOLO II
STRUTTURA DI UN COMPUTER

Dal punto di vista funzionale, negli elaboratori elettronici troviamo almeno


cinque unit:
1) Unit di ingresso o input
2) Unit di uscita o output
3) Memoria centrale
4) Unit logico aritmetica
5) Unit di controllo

Questi componenti non sono separati tra loro, quindi si parla spesso di sistema
di elaborazione dei dati. Lo schema funzionale stato definito per la prima
volta da John Von Neumann, secondo il seguente diagramma:

UNIT CENTRALE DI ELABORAZIONE

UNIT DI CONTROLLO

UNIT
UNIT DI UNIT DI
LOGICO - ARITMETICA
INGRESSO USCITA

MEMORIA CENTRALE

Lelemento essenziale dellunit centrale la SCHEDA MADRE che non


altro che un circuito stampato su cui sono alloggiati vari componenti, tra i
quali oltre a quelli citati prima, vi sono:

Scheda di interfaccia grafica per il video

Porte seriali e parallele

Connettori per aggiunta di altre schede


-5-

LE UNIT DI INGRESSO O INPUT

Le unit di input permettono il collegamento del computer con lesterno,


consentendo limmissione dei dati e delle istruzioni. Le pi diffuse unit di
ingresso sono:

Tastiera

immissioni dati testuali

Mouse

gestione puntatore sullo schermo

Trackball alternativa al mouse

Scanner

digitalizzazione delle immagini

Fotocamera digitale

prelevamento immagine dalla realt

Microfono

immissione di suoni come voce o musica

LE UNIT DI USCITA O OUTPUT

Le unit di uscita permettono lemissione dei risultati finali di unelaborazione


dal sistema verso lesterno. Le pi diffuse unit di uscita sono:

Monitor, grazie al quale possibile visualizzare in


modo naturale i risultati dellelaborazione o seguire in
tempo reale lo stato di esecuzione di un programma.
-6-

Esistono schermi a tubo catodico e schermi a cristalli liquidi, dove


vengono riprodotti sul video milioni di piccolissimi punti detti pixel che
forniscono limmagine desiderata. Pi grandi sono i pixel e in numero
limitato, pi bassa la risoluzione dellimmagine stessa
Stampanti, grazie alle quali possibile visualizzare i risultati
dellelaborazione su carta. Vi sono diverse tipologie di stampante:
Ad aghi
A catena
Ad impatto
Termiche
A getto di inchiostro
Laser

LA MEMORIA CENTRALE

La memoria centrale quel dispositivo che conserva, mantenendoli inalterati


per un tempo pi o meno lungo, i dati precedentemente immessi attraverso le
unit di ingresso. Questo tipo di memoria detta anche ad accesso diretto o
RAM divisa in cellette elementari che permettono di memorizzare dati e
programmi ed ha la caratteristica delle volatilit, cio al momento dello
spegnimento del sistema perde il suo contenuto. Ogni cella detta anche
locazione di memoria, ha un indirizzo che la identifica univocamente costituito
da numerazione crescente che tanto pi alta quanto pi grande la capacit
di memorizzazione del sistema. Le locazioni di memoria sono costituite da
componenti elementari bistabili, che possono cio assumere solo due possibili
stati diversi, 0 oppure 1. Un sistema basato su due possibili stati viene detto
binario e le celle che compongono ogni singola locazione di memoria vengono
dette bit. La velocit di memorizzazione del sistema, citata sopra, viene
espressa con valori multipli di 1024. Da ci diciamo che 1 byte equivale ad 8
bit, 1024 byte equivalgono ad un KiloByte o Kb 1024 Kb costituiscono 1
MegaByte o Mb e 1024 Mb corrispondono ad 1 GigaByte o Gb, che attualmente
il coefficiente pi utilizzato.
La memoria RAM pu essere soggetta ad operazioni di lettura, scrittura e
cancellazione. Oltre alla RAM esistono anche altre tipologie di memorie
centrali come la:

Memoria ROM
Memoria Cache

Nella ROM, a differenza della RAM, i dati permangono anche in caso di


mancata alimentazione elettrica, quindi di solito contiene quei programmi che
consentono al pc di effettuare le operazioni di accensione e di configurazione
-7-

del sistema. In questa memoria lutente pu solo prelevare e leggere i dati, ma


non scriverli o cancellarli.
La memoria cache ha la funzione di contenere quelle istruzioni e dati utilizzati
pi di frequente dal sistema allo scopo di renderli disponibili nel pi breve
tempo possibile ed aumentare la velocit di esecuzione dei programmi.

L UNIT LOGICO ARITMETICA

Essa viene indicata anche con la sigla ALU e consente di eseguire le quattro
operazioni fondamentali dellaritmetica e le operazioni di confronto logico e di
alternativa o di decisione. Di pertinenza della ALU il trasferimento dei dati
dalla RAM alla ALU stessa e viceversa, e il trasferimento dei dati da registro a
registro

L UNIT DI CONTROLLO

Lunit di controllo detta anche CU preposta al coordinamento e alla


sincronizzazione dellintero sistema. Per fare questo la CU colloquia con ogni
altro organo attraverso segnali di controllo che permettono di inserire dati nel
sistema, di memorizzarli, di elaborarli e di emettere informazioni. In sostanza
il compito essenziale della CU quella di interpretare il programma in corso di
esecuzione

LUNIT CENTRALE DI ELABORAZIONE

Essa viene anche detta CPU ed linsieme delle due unit


precedentemente viste, cio la ALU e la CU. Si tratta in
sostanza di un microprocessore costituito da un chip integrato
su una piastra di silicio e dotato di un orologio interno detto
clock, che ha la funzione di sincronizzare le operazioni da eseguire.
Il numero di oscillazioni del clock si dice frequenza e si misura in MegaHertz.

LE MEMORIE DI MASSA O AUSILIARIE

Dato che, come abbiamo visto, la memoria centrale non conserva


permanentemente i dati, si giustifica la presenza di altri supporti di
memorizzazione permanente e di grandi capacit. Questo memorie sono dette
di massa e la principale tra queste memorie lhard disk o disco rigido. Esso
costituito da una pila di vari dischi che ruotano velocemente e una serie di
testine che leggono e scrivono i contenuti dei dischi lungo la pila. La capacit
di un hard disk dellordine di GigaByte e oltre. I dischi fissi possono essere
-8-

interni, cio racchiusi nel case del pc, oppure esterni e racchiusi in piccole
scatole che si possono collegare al pc tramite la porta USB.
Abbiamo poi i CD-ROM e i DVD, molto simili tra loro ma
differenti nella capacit, che nei dvd e molto maggiore.

Unenorme diffusione stata raggiunta dalla penna USB, che un


dispositivo piccolo ed estremamente maneggevole e di notevole
capacit.
-9-

CAPITOLO III

LE RETI INFORMATICHE

Prima che il concetto di rete fosse introdotto nellinformatica, lo scambio di dati


fra due computer presentava diverse difficolt, soprattutto se questi erano
distanti. Diverso era il discorso nel caso in cui gli utenti, ad esempio, erano
tutti nello stesso palazzo. Esisteva infatti il cos detto centro di calcolo dove
risiedeva un computer grande e potente collegato a diversi terminali. Pi
utenti , quindi, condividevano le stesse risorse (processore, hard disk, etc.) e
avevano la possibilit di scambiarsi dati. Questo modello aveva per diversi
problemi. In primo luogo la condivisione delle risorse portava a rallentamenti
dovuti al fatto che, ad esempio, se un utente stava accedendo allhard disk, un
altro utente doveva attendere. Inoltre, nel caso in cui il centro di calcolo si
fosse guastato, lintera struttura era inutilizzabile. Quando poi lazienda voleva
aggiornare il sistema o aggiungere nuovi utenti, avrebbe dovuto cambiare
lintera struttura.
Questi e altri problemi, oltre allo sviluppo dei sistemi di comunicazione,
portarono a un diverso concetto di collegamento tra computer: la rete di
computer. Invece di un unico, grande computer, si pens di collegare tra loro
computer pi piccoli, economici e indipendenti. Questo permetteva di
condividere risorse solo quando era strettamente necessario. Inoltre un
sistema di questo tipo era estremamente affidabile in quanto, se un computer
si fosse guastato, il resto della rete avrebbe continuato a funzionare. Era poi
possibile aggiungere utenti e aggiornare il sistema mantenendo la stessa
architettura della rete. Analizziamo ora la struttura di una rete partendo dai
concetti fondamentali:

In figura rappresentato un computer che si collega a un altro mediante un


qualsiasi tipo di collegamento (telefonico, fibre ottiche, satellitare, etc.). Il cos
detto client colui che chiede un servizio allaltro computer, detto server. In
questo modello la comunicazione generalmente ha la forma di un messaggio di
richiesta che parte dal client e arriva al server. Il server esegue il compito
richiesto e spedisce al client la risposta. Naturalmente un computer pu
svolgere entrambi i ruoli, sia quello di client che quello di server.
- 10 -

Lo sviluppo delle reti ha consentito la realizzazione della pi grande e


complessa rete di computer al mondo: Internet. Grazie ad essa non solo grandi
aziende ma anche singoli cittadini hanno la possibilit di accedere a servizi e
risorse completamente inimmaginabili fino a qualche anno fa.
Alcuni di questi servizi sono: la posta elettronica, il World Wide Web, le
videoconferenze, le chat, etc
Vediamo ora di approfondire meglio gli aspetti hardware delle reti. Esistono
due tipi di tecnologie per la trasmissione:

Reti a diffusione globale (broadcast)


Reti punto-a-punto (point-to-point)

Le reti broadcast hanno un unico canale di comunicazione che condiviso da


tutte le macchine della rete. Brevi messaggi, detti pacchetti, inviati da una
qualsiasi macchina vengono ricevuti da tutte le altre. Un campo indirizzo
allinterno del pacchetto indica il computer a cui diretto. Dopo la ricezione del
pacchetto, un computer controlla il campo indirizzo; se coincide con il suo
allora lo elabora, altrimenti lo ignora. Al contrario, le reti point to point
consistono di molte connessioni fra coppie individuali di macchine. Per andare
dal mittente al destinatario, un pacchetto su questo tipo di rete potrebbe dover
visitare una o pi macchine intermedie.

RETI LOCALI

Le reti locali, generalmente chiamate LAN (Local Area Network), sono reti
private allinterno di un singolo edificio o universit, di dimensioni al pi di
qualche chilometro. Le LAN spesso usano una tecnologia di trasmissione a un
solo cavo al quale tutte le macchine sono collegate.
Sono possibili differenti tipologie per tali reti:

a) a bus
b) ad anello

La rete a bus pi diffusa quella chiamata Ethernet e permette trasmissioni


da 10 a 100 Mbps (Megabit per secondo, indicando con Megabit 1.000.000 di
bit).
- 11 -

RETI METROPOLITANE

Una rete metropolitana o MAN (Metropolitan Area Network)


sostanzialmente una versione ingrandita della LAN e, normalmente, usa
tecnologie simili. Pu coprire un gruppo di edifici vicini della medesima
azienda oppure gli edifici di unintera citt.

RETI GEOGRAFICHE

Una rete geografica o WAN (Wide Area Network), copre una grande area
geografica, spesso una nazione o un continente. In una WAN ci sono una serie
di computer chiamati host (ospiti) collegati tra loro in una LAN a sua volta
collegate a sottoreti. Nella maggior parte delle reti geografiche, la sottorete
costituita da due componenti distinte: le linee di trasmissione e gli elementi di
commutazione. Le linee di trasmissione (dette anche circuiti o canali) spostano
bit fra le varie macchine, mentre gli elementi di commutazione sono calcolatori
specializzati usati per collegare due o pi linee di trasmissione. Quando i dati
arrivano su una linea di ingresso, lelemento di commutazione, in base
allindirizzo dei singoli pacchetti, deve scegliere una linea di uscita per farli
proseguire. Il termine usato per definire questi calcolatori Router.
Se due Router che non condividono un cavo desiderano comunicare, devono
farlo in modo indiretto attraverso altri Router intermedi. In questi computer il
pacchetto viene ricevuto interamente, memorizzato fino a che la linea di uscita
richiesta non risulti libera e quindi viene fatto proseguire.
La figura sottostante mostra diversi tipi di topologia:

a) Stella
b) Anello
c) Albero
d) Completa
e) Anelli secanti
f) Irregolare
- 12 -

LA RETE MONDIALE INTERNET

All'inizio degli anni '70 il Dipartimento della Difesa americano cre una rete di
collegamento chiamata ARPANET che metteva in connessione centri militari e
centri di ricerca. Essa era strutturata in modo insolito e finalizzata, tra l'altro,
a mantenere i collegamenti anche in caso di attacco atomico. Arpanet
funzionava con un criterio di trasmissione dei dati che si chiama TCP/IP
(Trasmission Control Protocol/Internet Protocol). La novit tecnologica rispetto
alla trasmissione telefonica delle informazioni era che i segnali non erano
analogici ma digitali, e che venivano spezzettati in "pacchetti" di segnali
ognuno dei quali conteneva l'indicazione del mittente e del destinatario,
attraverso opportune sigle. Successivamente iniziarono a collegarsi a questa
rete anche le Universit e grandi aziende. Stava nascendo la rete globale
Internet oggi diffusissima anche tra i singoli cittadini. Internet quindi
sostanzialmente una grande rete di reti che sta crescendo a dismisura e che
offre tanti e tali servizi da divenire quasi indispensabile per aziende e per
alcune categorie di privati cittadini (liberi professionisti, giornalisti, etc.). Fino
ad ora abbiamo parlato di pacchetti invece che di dati ma non abbiamo
specificato di cosa si tratta. Quando fu inventata Internet ci si rese subito
conto che mandare i dati cos come erano non era vantaggioso per diversi
motivi. In primo luogo in termini di velocit: ogni nodo intermedio avrebbe
dovuto ricevere lintero file che si voleva trasferire e poi rimandarlo al
successivo nodo.
Questo avrebbe generato molti tempi morti. Inoltre se ad un certo punto il file
veniva perso, il mittente avrebbe dovuto rimandarlo nella sua interezza. Ci si
rese conto quindi che il metodo migliore per trasferire i dati era quello di
dividerli in tanti pacchetti autonomi. Una volta arrivati a destinazione
sarebbero stati riuniti per formare il dato originale.
Questo sistema si chiama Packet Switching e permette inoltre la
comunicazione di pi host contemporaneamente.
Tra la sorgente e la destinazione ci sono i cos detti Router che provvedono a
spedire i pacchetti nella giusta direzione. Il pacchetto, una volta arrivato al
Router, viene inserito in un input buffer, processato e infine messo in un
output buffer. Questo naturalmente crea un ritardo. Se il Router occupato a
processare altri pacchetti, il pacchetto appena arrivato viene messo in coda.
Alcune volte per la coda piena e quindi il nuovo pacchetto viene eliminato e
perso. Il mittente dovr quindi rispedire esclusivamente il pacchetto perso e
non lintero messaggio o file. Ogni pacchetto, per poter essere spedito dal
mittente al destinatario, deve contenere delle informazioni aggiuntive (oltre al
dato originale). Queste vengono inserite nel cos detto Header (intestazione) e
contengono fondamentalmente le informazioni relative allindirizzo del
mittente e del destinatario e un numero che indica la posizione del pacchetto
relativamente al dato originale. Grazie a questo Header il pacchetto pu
arrivare a destinazione ed essere assemblato con gli altri pacchetti ricreando il
dato spedito dal mittente.
- 13 -

I PROTOCOLLI DI INTERNET

Internet offre diversi servizi ognuno dei quali utilizza uno specifico protocollo
(ovvero un insieme di regole per la comunicazione). I servizi pi utilizzati sono
il World Wide Web e la Posta Elettronica (o Email). Con il primo possiamo
visitare accattivanti pagine informative con testo, immagini e animazioni
mentre con lEmail possiamo comunicare in tempo quasi reale con qualsiasi
parte del mondo a bassissimo costo. Vediamo quindi un po meglio i protocolli
che sono alla base di questi importanti servizi.
TCP/IP : E' il protocollo base di rete per le comunicazioni su Internet, colui che
organizza la spedizione dei file, scompattandoli in pacchetti di bit spedibili in
rete. Allinizio e alla fine del pacchetto da mandare vengono messi dei segni di
riconoscimento relativi al mittente e al ricevente. Il pacchetto viene
"instradato" da apparecchi che si chiamano Router e fatto rimbalzare da nodo
a nodo fino a quando non arriva a destinazione.
http: Hyper Text Transfer Protocol il protocollo che permette allutente di
visualizzare sullo schermo le informazioni in formato testo e grafico che
risiedono sul Web. Quando si digita un indirizzo con la sigla "http://" prima del
"www" si vuole indicare lutilizzo del protocollo http.
FTP: File Transfer Protocol consente di trasferire file da un PC ad un altro
accedendo a centinaia di biblioteche di file di ogni tipo: software, giochi,
documenti storici, testi di canzoni, etc.
SMTP: Simple Mail Transfer Protocol il protocollo che serve per spedire
messaggi di posta elettronica dal computer al mail server.
POP3: Post Office Protocoll-versione 3 il protocollo utilizzato per scaricare la
postadal mail server al computer.

GLI INDIRIZZI IN INTERNET

Abbiamo pi volte detto che quando un computer in rete vuole comunicare con
un altro computer, anchesso collegato, deve specificare il suo indirizzo. Questo
significa che ad ogni computer collegato viene attribuito un indirizzo univoco
in modo che possa essere contattato senza ambiguit. Ogni computer ha quindi
associato quello che si chiama indirizzo IP, identificato da quattro campi di 8
bit divisi da un punto (ad esempio 124.234.111.65). Se si vuole spedire un
messaggio al computer 124.234.111.65 tutti i pacchetti ad esso destinati
dovranno riportare questo indirizzo. Mentre per i computer agevole lavorare
con i numeri, noi umani preferiamo qualcosa di pi esplicativo e quindi
preferiamo indicare lindirizzo di un computer attraverso un nome mnemonico
(www.yahoo.com). Esistono quindi in rete dei computer che mediante un
database distribuito (DNS ovvero Domain Name System) traducono gli
indirizzi mnemonici in indirizzi IP.
Collegandoci quindi a www.yahoo.com il DNS lo trasforma nellindirizzo IP
relativo e quindi i Router (che leggono solo gli indirizzi IP) possono instradare
correttamente i pacchetti a destinazione.
- 14 -

CAPITOLO IV
I SISTEMI DI NUMERAZIONE
SISTEMA DI NUMERAZIONE DECIMALE

Il sistema di numerazione decimale posizionale (detto anche in base 10), ormai


comunemente usato in tutto il mondo, fu introdotto per la prima volta dagli
Indiani e si diffuse in Europa intorno al 1200, per merito del matematico
italiano Leonardo Fibonacci che laveva appreso dagli arabi in uno dei suoi
viaggi. Si basa sulluso di dieci simboli:

0 1 2 3 4 5 6 7 8 9

i quali, combinati opportunamente, danno luogo a tutti i numeri.


I numeri superiori a 9 vengono rappresentati con pi di una cifra, ciascuna
delle quali acquista valore particolare a seconda della posizione in cui si trova.
Ci che importa la posizione della cifra e quindi possiamo considerare la
seguente notazione posizionale:

9402210 = 9*104 + 4*103 + 0*102 + 2*101 + 2*100

Il pedice 10 sta ad indicare che ci troviamo in base 10.

Con lo stesso significato possiamo introdurre le cifre:

0,1 = 1/10 = 10 1
0,01 = 1/100 =10 2
0,001 = 1/1000 = 10 3

e quindi il numero

820,031 = 8*102 + 2*101 + 0*100 + 0*10 1 + 3*10 2 + 1*10 3

viceversa avendo il numero in notazione esponenziale possibile passare alla


notazione decimale eseguendo le operazioni proposte

8*102 + 2*101 + 3*100 + 2*10 1

diventa uguale a

800 + 20 + 3 + 0,2 = 823,2


- 15 -

SISTEMI DI NUMERAZIONE DIVERSI DAL DECIMALE

Oltre al decimale esistono tantissimi altri sistemi di numerazione posizionali. I


sistemi di cui noi ci occuperemo sono:

BINARIO (IN BASE 2): 2 elementi [0, 1]


OTTALE (IN BASE 8): 8 elementi [0, 2, 3, 4, 5, 6, 7]
ESADECIMALE (IN BASE 16): 16 elementi
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F]

Si potrebbero per concepire sistemi di numerazioni in base 5, 7 o 15.

CONVERSIONE DA BASE N A BASE 10

Dato un numero N in base N, per convertilo in base 10 occorre effettuare la


somma dei singoli termini pesati opportunamente in base alla loro posizione:

Esempio:

11012 = 1*23 + 1*22 + 0*21 + 1*20 = 8 + 4 + 0 + 1= 1310

CONVERSIONE DA BASE 10 A BASE N

Supponiamo di avere un numero decimale, ad esempio, 109, e di volerlo


portare in notazione N-aria. Quello che si deve fare dividere 109 per N,
scrivere il risultato e calcolare il resto. A sua volta il resto verr nuovamente
diviso per N e cos via fino a che il dividendo non risulti pari a zero. I resti
ottenuti, letti al contrario, danno il valore nella base N.

Esempio:

Vogliamo portare 109 dalla base 10 alla base 5


109 : 5 = 21 con resto 4
21 : 5 = 4 con resto 1
4 : 5 = 0 con resto 4

Quindi 10910 = 4145

SISTEMA DI NUMERAZIONE BINARIO

E sicuramente il pi semplice tra tutti i sistemi di numerazione con base


diversa da 10. E dotato di due soli simboli 0 e 1, comunemente detti bit, ed
per questo che viene chiamato a base due. Anche in questo caso siamo di fronte
- 16 -

a un sistema posizionale e, quindi, ogni cifra assume un diverso valore a


seconda della sua posizione.
Si ha che:

1102 = 1*22 + 1*21 + 0*20

e la lettura suonerebbe come 1 quartina, 1 duina e 0 unit.


Vediamo quindi come possiamo passare dal sistema binario a quello decimale.

101,1101 = 1*22 + 0*21 + 1*20 + 1*21 + 1*22 + 0*23 + 1*24 =


= 4 + 0 + 1 + 0,5 + 0,25 + 0 + 0,065 = 5,8125

Mentre abbiamo visto precedentemente come sia possibile passare dalla


notazione decimale a quella binaria.

SISTEMA DI NUMERAZIONE OTTALE

Il sistema di numerazione ottale, ovvero in base otto, si avvale di otto cifre per
rappresentare i valori

0 1 2 3 4 5 67

La tecnica di conversione di un numero ottale in un numero decimale la


stessa mostrata a titolo esemplificativo per il sistema decimale, con la
differenza che la base di numerazione otto.
Per esempio, per convertire il numero ottale 123458 si procede come segue:

1*84 + 2*83 + 3*82 + 4*81 + 5*80 = 4096 +1024 + 192 + 32 + 5 = 5349

Per passare dal sistema decimale a quello ottale si procede nel modo usuale:

5349 / 8 = 668 con il resto di 5


668 / 8 = 83 con il resto di 4
83 / 8 = 10 con il resto di 3
10 / 8 = 1 con il resto di 2
1 / 8 = 0 con il resto di 1

Ecco che cos si riottiene il numero ottale 123458.

SISTEMA DI NUMERAZIONE ESADECIMALE

La numerazione esadecimale, ovvero in base 16, funziona in modo analogo a


quella ottale, con la differenza che si avvale di 16 cifre per rappresentare i
valori. Si usano le cifre numeriche da zero e nove, pi le lettere da A a F
- 17 -

per i valori successivi. In pratica, la lettera A nelle unit corrisponde al


numero 10 e la lettera F nelle unit corrisponde al numero 15. La tecnica di
conversione la stessa gi vista per il sistema ottale, tenendo conto della
difficolt ulteriore introdotta dalle lettere aggiuntive. Per esempio, per
convertire il numero esadecimale 19ADF16, si procede come segue:

1*164 + 9*163 + 10*162 + 13*161 + 15*160 = 105183

Per passare dalla base 10 alla base 16 si procede nel medesimo modo illustrato
per il sistema binario e ottale.

ARITMETICA BINARIA

Vediamo ora come si eseguono le operazioni tra i numeri binari.


Fondamentalmente si seguono le stesse regole della notazione decimale riferite
per alla nuova base considerata.

Addizione

0+0 = 0
0+1 = 1
1+0 = 1
1+1 = 0 con riporto di 1

Esempio

1111 +
1101 +
111 =
-----------
100011

Moltiplicazione

0*0=0
1*0=0
0*1=0
1*1=1
18

Esempio:

1101 *
11 =
------------
1101
1101
------------
100111

SISTEMI DI NUMERAZIONE IN PROGRAMMAZIONE

Risulta evidente limportanza in informatica della rappresentazione binaria. A


che cosa servono allora le rappresentazioni ottale e esadecimale? Esaminiamo
la seguente tabella:

decimale binario ottale esadecimale


13 0 0 0
10 1 1 1
110 10 2 2
1010 11 3 3
1110 100 4 4
11 101 5 5
15 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F

Si pu notare che con tre bit posso rappresentare tutti e soli i numeri che
vanno da 0 a 7 mentre, con 4 bit, tutti e soli i numeri che vanno da 0 a 15.
Quindi 3 e 4 bit rappresentano rispettivamente tutti e soli i simboli dei sistemi
ottale e esadecimale.
Questo facilita molto la conversione da un sistema ottale/esadecimale a quello
binario e viceversa.
19

Ottale - > Binario


Ogni cifra pu essere rappresentata da tre bit quindi la conversione veloce si
svolge in questo modo.
Se, ad esempio, vogliamo convertire il numero 6738
6 diventa 110
7 diventa 111
3 diventa 011

Quindi 6738 = 1101110112

Binario - > Ottale


In questo caso si divide il numero binario in blocchi di tre bit che verranno
convertiti singolarmente in base 8.

1101110112 viene diviso in 110 111 011 = 6738

Esadecimale -> Binario


Il metodo identico a quello per il sistema ottale. 7E16 = 0111 1110 =
011111102

Binario -> Esadecimale


Anche in questo caso il sistema il medesimo. 1010 1011 0101 = A B 5
Come si vede, il sistema esadecimale in grado di rappresentare un
raggruppamento di 8 bit (1 byte) con due soli simboli e questa sua sinteticit
sicuramente di pi rapida memorizzazione da parte di un utente. E questa
ultima caratteristica che determina il largo impiego quando si vuole, ad
esempio, fare riferimento a un indirizzo di memoria. E infatti pi agevole
scrivere 8 caratteri esadecimali piuttosto che 32 caratteri binari per indicare
un indirizzo di memoria.

Esercizi

1) Scrivere i seguenti numeri in base 10 secondo la notazione esponenziale


(6835; 381; 408; 9875,324).

2) Trovare la rappresentazione binaria dei seguenti numeri decimali (34,


159, 512, 255, 254).

3) Eseguire le seguenti somme: (1101 + 1101); (11011 + 101); (1110111 +


111); (101101 + 110 + 11101); (11111 + 11).

4) Eseguire le seguenti moltiplicazioni: (111011 * 11); (10011*10);


(111011*1001).
20

5) Eseguire le seguenti sottrazioni: (1011101); (1010111); (11011111);


(11000101).

6) Convertire in binario i seguenti numeri ottali: (37; 121, 7032; 976).

7) Convertire in binario i seguenti numeri esadecimali: (37; 7032; 976;


5A7B).

8) Convertire in ottale i seguenti numeri binari (101111100; 1001000;


11011110).

9) Convertire in esadecimale i seguenti numeri binari (10111100;


111110101010000; 101101110111).
21

CAPITOLO V
INTRODUZIONE ALLA PROGRAMMAZIONE

Quando nella vita di tutti i giorni ci troviamo di fronte alla necessit di


risolvere un problema, seguiamo una sequenza di passi secondo fasi ben
distinte. Nella prima fase si definisce il problema, i dati a disposizione e i
risultati che ci aspettiamo. Nella seconda fase viene stabilita lesatta sequenza
di azioni da compiere per ottenere la soluzione del problema e per raggiungere
il risultato.
Schematicamente, gli elementi che caratterizzano un problema sono quindi:

1) Dati iniziali di ingresso o input


2) Risultati finali di uscita o output
3) Risorse a disposizione (schemi logici, computer)
4) Soluzioni adottate, procedimenti e percorsi
5) Stesura dellalgoritmo risolutivo del problema

DEFINIZIONE DI ALGORITMO

Si pu definire lalgoritmo, in maniera intuitiva, come un insieme finito di


istruzioni che devono essere eseguite per portare a termine un dato compito e
per raggiungere un risultato definito in precedenza.

Esempio: Una segretaria deve contattare telefonicamente una serie di persone


a cui deve lasciare un messaggio.
La segretaria deve procurarsi la lista di persone da contattare e il numero di
telefono di ciascuna. Per ogni persona deve comporre il numero e se la persona
desiderata risponde, deve lasciare il messaggio e spuntare la persona
dallelenco. Negli altri casi (telefono occupato o numero errato) deve annotare
sullelenco la situazione incontrata.
Schematicamente possiamo riassumere il tutto in questo modo:

DATI CHE SERVONO (INPUT)


Elenco delle persone con nome e numero,
messaggio da comunicare

RISULTATI DA OTTENERE (OUTPUT)


Elenco delle persone e indicazione per ognuna della situazione incontrata.

ALGORITMO
Per ciascuna persona dellelenco
Leggi il numero telefonico
Componi il numero
A seconda della situazione scrivi sullelenco occupato, numero
errato oppure Ok
22

Ripeti le operazioni precedenti finch le persone sono finite

I requisiti minimi di un algoritmo sono:


1) Le istruzioni devono essere realizzabili
2) Le istruzioni devono essere precise e non ambigue ed elementari
3) Le istruzioni devono essere di durata limitata nel tempo
4) Un algoritmo deve essere riproducibile e completo.

Lente che esegue le azioni secondo le istruzioni di un algoritmo viene detto


ESECUTORE.

STRUMENTI PER LA STESURA DI UN ALGORITMO

I linguaggi utili per descrivere ed effettuare la stesura di un algoritmo sono: i


diagrammi a blocchi e la pseudocodifica. In ogni linguaggio occorre
definire i simboli ammessi dal linguaggio, che costituiscono lalfabeto, le parole
o combinazioni di simboli, e la sintassi, cio le regole che permettono di
associare tra loro le parole in modo coerente.

DIAGRAMMA A BLOCCHI

Questo metodo consiste in una descrizione grafica dellalgoritmo. I diagrammi


a blocchi sono formati da simboli di forma diversa, uniti tra loro tramite frecce
orientate.

I simboli:

INIZIO

FINE

indicano il punto di partenza e quello di arrivo dellalgoritmo.

Il simbolo:

detto di elaborazione e contiene unistruzione da eseguire.


23

Il simbolo:

viene usato per operazioni di immissione dati (input) o emissione dati (output).

Il simbolo:

F condizione
V

viene detto simbolo di decisione e di solito rappresenta unoperazione di


confronto tra due dati, cio per stabilire se una proposizione vera o falsa.

LA PSEUDOCODIFICA

La pseudocodifica la descrizione dellalgoritmo usando termini del linguaggio


comune, ma applicando una serie di regole rigorose. Utilizzando la
pseudocodifica il programmatore esprime le proprie idee in una forma
naturale, avvalendosi di frasi della lingua italiana.
Le parole chiave che aprono e chiudono il testo di un algoritmo sono

INIZIO .. FINE.

Le istruzioni leggi(lista variabili) e scrivi(lista variabili), vengono


utilizzate per descrivere operazioni di immissione (leggi) ed emissione (scrivi)
dei dati.
Listruzione chiedi(lista dati che servono) la richiesta allutente per
acquisire i dati necessari.
Le variabili e le costanti vengono indicate da parole dette identificatori.

Oltre ad inizio e fine ci sono una serie di parole chiave che possono essere
presenti in un algoritmo e sono: A, ALLORA, ALTRIMENTI, DA, DI, ESEGUI,
FINCH, MENTRE, PASSO, RIPETI, SE, PER.
24

Esempio: Calcolo dellarea di un rettangolo.

Dati di input:
base a altezza del rettangolo

Dati di output:
area del rettangolo

ALGORITMO RETTANGOLO
Pseudocodifica

INIZIO
chiedi(base, altezza)
leggi(base, altezza)
area base*altezza
scrivi(area)
FINE

Diagramma a blocchi

INIZIO

chiedi(base, altezza)

leggi(base, altezza)

Area base*altezza

scrivi(area)

FINE

Esercizi

1) Calcolare il doppio di un numero fornito da tastiera.

2) Calcolare la media di tre numeri forniti in input.


25

3) Dato il lato, trovare il perimetro e larea di un quadrato.

4) Calcolare la misura dellipotenusa di un triangolo rettangolo, dati in


input i cateti.

5) Stabilita la percentuale di sconto, dato in input il prezzo di un prodotto,


calcolare, lo sconto, il prezzo scontato e comunicare i risultati.

6) Data let di tre persone in input, calcolare la loro et media.

7) Dato in input il raggio, calcolare la misura della circonferenza e larea


del cerchio
26

CAPITOLO VI
LE BASI DEL LINGUAGGIO C
Il linguaggio C nato nel 1971 presso i laboratori Bell, ed stato sviluppato
per facilitare la scrittura dei sistemi operativi e per scrivere un codice
compatto ed efficiente. Il linguaggio C un linguaggio compilato, cio prevede
tre fasi: scrittura, compilazione, traduzione in linguaggio macchina.
Appartengono alla categoria di linguaggi compilati, oltre al C, il C++ e il
Pascal. Ci li rende differenti dai linguaggi interpretati, che non sono tradotti
in linguaggio macchina ma sono letti, durante lesecuzione, da un programma
detto interprete che traduce sul momento le istruzioni presenti nel codice
sorgente.

LE FASI DELLA PROGRAMMAZIONE

Una volta scritto su carta il codice di un programma, si passa alla fase definita
codifica, nella quale, utilizzando il linguaggio di programmazione C, sono
memorizzate in un file, detto programma sorgente, le istruzioni che
costituiscono il programma. Loperazione appena descritta viene realizzata
utilizzando uno strumento software, che nel nostro caso un compilatore detto
Dev C++, provvisto di un apposito spazio bianco su cui scrivere il codice.
Successivamente si passa alla fase di traduzione del programma che produce il
cosiddetto programma oggetto. Durante la fase di compilazione possono
essere segnalati eventuali errori, classificabili in tre categorie:

1) Errori lessicali: si verificano se il compilatore non in grado di


riconoscere un simbolo (ad esempio se si scrive wile invece di while)
2) Errori sintattici: si verificano quando no sono rispettate le regole
definite per la sintassi del linguaggio (ad esempio omissione del ; alla
fine di unistruzione)
3) Errori semantici: riguardano ad esempio luso di una variabile che non
stata precedentemente dichiarata oppure al contrario la presenza di una
variabile dichiarata ma mai utilizzata. In presenza del secondo tipo di
errore viene per indicato un warning (avvertimento)

Terminata la fase di traduzione , il passo successivo coinvolge il cosiddetto


linker, che ha il compito di collegare il codice oggetto appena generato con
altri codici oggetto risultanti da compilazioni precedenti. Se non ci sono errori,
il linker produce il file con estensione .exe, contenente le istruzioni
effettivamente eseguibili da parte della CPU.
Il file eseguibile pu essere semplicemente lanciato attraverso il comando
esegui. Ci possono essere anche in questa fase degli errori, detti di run-time
e si manifestano con comportamenti anomali del programma, come ad
esempio:
27

1) Risultati diversi da quelli previsti derivanti spesso da errori di tipo


logico. In questo caso il programma termina correttamente, ma il
risultato dellelaborazione errato. Per correggere tali errori bisogna
rivedere lintero programma.
2) Errori di overflow, underflow o divisione per zero. Essi sono generati da
calcoli il cui risultato esce fuori dal range di valori ammessi oppure se
ci che si trova al denominatore di unespressione zero ed impossibile
effettuare la divisione. Per eliminare tali errori opportuno aggiungere
nel codice dei controlli
3) Loop infinito. In questo caso il programma non termina lesecuzione ma
si dice che gira allinfinito. Occorre modificare il codice sorgente per far
si che si verifichino le condizioni di fine ciclo.

ANATOMIA DI UN PROGRAMMA IN LINGUAGGIO C

Un programma scritto in linguaggi C si compone di due sezioni distinte che a


loro volta possono essere divise in ulteriori sottosezioni. Le due sezioni
principali prendono il nome di sezione dichiarativa e sezione esecutiva, che
sempre successiva a quella dichiarativa.
La prima sezione serve al programmatore per dichiarare le proprie intenzioni,
cio vengono definite le variabili , le strutture, le funzioni, e i sottoprogrammi o
librerie di cui intende avvalersi.
Nella seconda sezione sono effettivamente codificati gli algoritmi risolutivi del
problema.
Un primo esempio di programma in C il seguente:

#include <stdio.h>
main ( ) {
printf(" Salve, Mondo\n");
}

Vediamo passo per passo il significato delle parole espresse in tale programma.
Notiamo innanzitutto che le istruzioni (in questo caso una sola) terminano con
il punto e virgola.
La funzione main la funzione principale da cui parte lesecuzione di un
programma in C; essa sempre presente in ogni programma o listato.
Il linguaggio c mette a disposizione una serie di librerie predefinite che
consentono di utilizzare molte funzioni gi scritte e testate. Queste librerie
vengono dette librerie di sistema. Linclusione di un file della libreria di
sistema avviene con la direttiva #include<nome_libreria>. Nel nostro esempio
stdio.h la libreria che comprende le funzioni di input/output come printf e
scanf che vedremo in seguito.
La funzione printf permette di stampare a video il valore di una o pi variabili
o di intere frasi, come nel caso del nostro esempio. Essa pu anche ricevere in
ingresso un numero variabile di parametri o anche una stringa di caratteri.
28

Nel caso dellesempio visto sopra, loutput prodotto a video sar:

salve, mondo.

Il carattere \n dopo la frase indica la cosiddetta sequenza di escape e


permette il ritorno a capo del cursore a video. Ogni istruzione o gruppo di
istruzioni sono sempre racchiuse tra parentesi graffe.
Vediamo ora un esempio un po pi complesso del precedente:

#include<stdio.h>
main ( ) {
int a, b, q, r;
a = 7;
b = 3;
q = a/b;
printf(Quoziente %d\n, q);
r = a % b;
printf(Resto %d\n, r);
}

Nella sezione dichiarativa abbiamo dichiarato quattro variabili di tipo int, cio
intero,nella sezione esecutiva tali variabili vengono inizializzate
rispettivamente a 7 e a 3 , viene calcolato il loro quoziente (che sar troncato
alla parte decimale), attraverso loperatore di divisione / e il resto con
loperatore modulo %. Loutput di tale programma sar:

2
1

Nel programma appena visto troviamo la presenza del simbolo %d che lo


specificatore di formato per variabili di tipo intero. Gli specificatori pi
comunemente utilizzati nei programmi sono oltre al precedente:

% f per numeri decimali con virgola


%c per singoli caratteri
%s per insiemi di caratteri o stringhe di testo.

Vediamo ora un altro esempio di programma scritto in linguaggio C, e che si


propone di effettuare la somma di due variabili ricevute in ingresso e di
presentare a video il risultato di tale operazione.

#include <stdio.h>
main ( ) {
int a,b,s;
scanf("%d %d", &a, &b);
29

s = a + b;
printf("%d" ,s); }

Vediamo la presenza di una nuova funzione e cio scanf. Tale funzione una
tra le pi potenti e diffuse nel file stdio.h, assieme alla printf. Il suo compito
quello di analizzare una stringa o uno o pi valori digitati da tastiera, quindi
richiede in ingresso una serie di variabili da caricare precedute dal simbolo &
(tranne che per stringhe dove pu essere omesso).

Se allinterno del programma occorre definire una costante, essa viene


dichiarata attraverso una particolare direttiva, in questo modo:

#define nome valore

Esempi: #define PIGRECO 3.14


#define risposta SI (N.B. in C le stringhe sono racchiuse tra virgolette)

Per i dati di tipo alfanumerico formati da pi caratteri si utilizza la seguente


dichiarazione:

char nome[n]

Esempi di dichiarazione di variabili:

int eta;
float statura;
char risposta;
char nome[30];

Come abbiamo visto precedentemente, le variabili oltre a essere dichiarate,


possono anche essere contemporaneamente inizializzate ad un qualche valore,
come ad esempio:

int contatore = 0;
char nazione[7] = Italia

Il numero indicante la lunghezza della stringa nazione aumentato di 1,


perch occorre considerare il carattere di terminatore di stringa\0, aggiunto
automaticamente.

Allinterno di un programma possono essere inserite anche delle righe dette


commenti, che servono a documentare parti di programma o il significato di
variabili e costanti utilizzate, in sostanza a migliorare la leggibilit del codice.
Le frasi di commento vengono racchiuse tra i delimitatori /* e */

Esempio: int eta; /* et di una persona */


30

Allinterno di un programma in linguaggio C, possono essere presenti


operazioni matematiche diverse da quelle elementari (cio le quattro
operazioni fondamentali e il modulo resto). Per tali operazioni necessario far
seguire al normale file di intestazione stdio.h, la direttiva #include<math.h>,
che contiene al suo interno i prototipi delle pi comuni funzioni matematiche
come:

pow(x,y) che effettua lelevazione a potenza di x a y


sqrt(x) che effettua la radice quadrata del numero x
ceil(x) che effettua larrotondamento di x per eccesso
floor(x) che effettua il troncamento di un numero senza parte decimale

Il linguaggio C utilizza anche operatori logici e di confronto come:


== uguale
>= maggiore o uguale
<= minore o uguale
< maggiore
< minore
!= diverso
&& congiunzione (and)
|| disgiunzione (or)
! negazione

Esercizi

1) Inserire le parole mancanti nel seguente programma:

____________ ( ) {

____________ a, b;

scanf(%d, &a);

b = a*2;

____________ (%d\n, b);


}

2) Stabilire qual loutput dei seguenti programmi, supponendo che da


tastiera a = 3 e b = 5.

a) main ( ) {
31

int a;
scanf(%d, &a);
a = a +1;
printf(%d\n, a);
}

b) main ( ) {
int a;
scanf(%d, &a);
a = a * a;
printf(%d\n, a);
}

c) main ( ) {
int a, b, s;
scanf(%d, &a, &b);
s = a + b;
printf(%d\n, s);
}

3) Calcolare il doppio di un numero fornito da tastiera.

4) Calcolare la media di tre numeri forniti in input.

5) Dato il lato, trovare il perimetro e larea di un quadrato.

6) Calcolare la misura dellipotenusa di un triangolo rettangolo, dati in


input i cateti.

7) Stabilita la percentuale di sconto, dato in input il prezzo di un prodotto,


calcolare, lo sconto, il prezzo scontato e comunicare i risultati.

8) Data let di tre persone in input, calcolare la loro et media.

9) Dato in input il raggio, calcolare la misura della circonferenza e larea


del cerchio.

10) Scrivere un programma che richieda in input il nome dellutente e


scriva su video il messaggio Buongiorno, seguito dal nome fornito.
32

11)Individua nel seguente programma le istruzioni non corrette e


correggerle:

#includere<stdio.h>
main ( ) {
int i;
printf(Introduci un numero);
scanf(%d, i);
i = i *2;
scrivi(%d\n, i);
}
33

CAPITOLO VII

LE STRUTTURE DI CONTROLLO

I programmi di esempio visti nel capitolo precedente erano molto semplici ed


intuitivi e costituiti solo da una serie di istruzioni in sequenza ordinata.
Accade per che nei programmi si abbia bisogno di strutture pi complesse, di
effettuare decisioni, di eseguire istruzioni ripetute. Per questi motivi si avuta
la necessit di introdurre alcune strutture fondamentali da utilizzare
allinterno di un programma. Nasce cos la cosiddetta programmazione
strutturata che non altro che la progettazione e realizzazione di un
programma costituito da parti dipendenti luna dallaltra secondo un ben
definito modello organizzativo.
In un algoritmo possiamo di solito individuare almeno tre strutture
fondamentali dette strutture di controllo. Esse sono:

1) Sequenza
2) Alternativa
3) Ripetizione

Dal punto di vista della pseudocodifica, possiamo riassumere il tutto mediante


la seguente tabella:

SEQUENZA ALTERNATIVA RIPETIZIONE


..
istruzione_1 SE condizione ESEGUI
istruzioe_2 ALLORA istruzioni
istruzione_3 istruzione_1 RIPETI MENTRE
.. ALTRIMENTI condizione
istruzione_2
.
FINE SE

Traducendo il tutto in diagrammi a blocchi, per ognuna delle precedenti


strutture abbiamo i seguenti schemi:
34

SEQUENZA ALTERNATIVA

F V
istruzione1
condizione

istruzione2 istruzione1 istruzione2

istruzione2

RIPETIZIONE

istruzioni

V
condizione

LA SEQUENZA IN C

La sequenza si rappresenta costruendo un blocco di istruzioni, ognuna


terminante con il punto e virgola e delimitato da una coppia di parentesi graffe
aperta e chiusa.
35

Esempio: Calcolare la differenza tra due numeri interi

#include<stdio.h>
main ( ) {
int num1, num2, differenza;
printf ( Inserisci due numeri: );
scanf (%d %d, &num1, &num2);
differenza = num1 num2;
printf (Risultato = %d\n, differenza);
}

LA STRUTTURA DI ALTERNATIVA

La struttura di alternativa, nel linguaggio C ha la seguente sintassi:

if (condizione)
istruzione_1
else
istruzione_2

Da notare che la condizione racchiusa tra parentesi e che lindicazione di fine


se, presente nella pseudocodifica, invece assente nella codifica, quindi non
viene tradotta. Il significato di questa struttura che, se la condizione vera,
viene eseguita listruzione_1, altrimenti viene eseguita listruzione_2.

Esempio: Scrivere in ordine crescente due numeri

Pseudocodifica

INIZIO
chiedi (a,b)
leggi (a,b)
SE a<b
ALLORA
scrivi (a)
scrivi (b)
ALTRIMENTI
scrivi (b)
scrivi (a)
FINE SE
FINE
36

Diagramma a blocchi

INIZIO

chiedi(a, b)

leggi(a,b)

F V

a<b

scrivi (b,a) scrivi (a, b)

FINE

Codifica in C

#include <stdio.h>
main( ) {
int a,b;
printf("Due numeri: ");
scanf("%d %d", &a, &b);
if (a <b) {
printf("%d\n", a);
printf("%d\n", b);
}
else {
printf("%d\n", b);
printf("%d\n", a);
}
}

Per la struttura di alternativa, oltre al caso visto precedentemente di selezione


a due vie, abbiamo anche lalternativa ad una via, in cui manca il ramo else.
La pseudocodifica relativa a questo caso diventa allora:
37

SE condizione
ALLORA
istruzione
FINE SE

Con relativo diagramma a blocchi:

condizione

istruzione

LA RIPETIZIONE

La ripetizione una struttura di controllo che rappresenta un ciclo. In


sostanza listruzione o il gruppo di istruzioni comprese tra ESEGUI e MENTRE
vengono ripetute tante volte, fino a quando la condizione scritta dopo MENTRE
si mantiene vera. Nel linguaggio C la struttura di ripetizione si rappresenta
nel seguente modo:

do {
istruzioni
} while (condizione);

Esempio: Dato un elenco di persone, con lindicazione per ciascuna di esse del
nome e dellet, si devono contare i maggiorenni.

Pseudocodifica

INIZIO
conta 0
ESEGUI
chiedi (nome)
leggi (nome)
chiedi (et)
38

leggi (et)
SE eta >= 18
ALLORA
conta conta + 1
FINE SE
chiedi (elenco finito? (0/1))
leggi (risp)
RIPETI MENTRE risp = 0
scrivi (conta)
FINE

Codifica in C

#include <stdio.h>
main( ) {
char nome[20];
int eta;
int risp;
int conta = 0;
do {
printf("nome: ");
scanf("%s", nome);
printf("Eta': ");
scanf("%d", &eta);
if (eta >= 18)
conta ++;
printf("Elenco finito: 0 = no, 1 = si ? ");
scanf("%d", &risp);
} while (risp == 0);
printf("I maggiorenni sono = %d \n", conta);
}
39

Diagramma a blocchi

INIZIO

Conta 0

chiedi(nome)

leggi(nome)

chiedi(eta)

leggi(eta)

V
eta >= 18

F conta
V conta + 1

chiedi (elenco finito?(0/1))

leggi (risp)

risp == 0

scrivi (conta)

FINE
40

Nel programma appena visto troviamo alcuni elementi nuovi, come


lintroduzione della variabile conta e della sua inizializzazione preliminare a
zero. Lazione del contare molto importante nella stesura di un programma
e si realizza appunto con un contatore, che una variabile di tipo numerico a
cui viene assegnato il valore zero e che viene incrementato di 1 ogni volta che
si riscontra una situazione che soddisfa le condizioni poste, oppure ogni volta
che unoperazione da ripetere pi volte stata completata. Nel precedente
esempio, esaminando il nome e lanno di nascita delle persone inserite, si
controlla let ad una ad una e si incrementa di 1 il contatore ogni volta che
let risulta superiore o uguale allet prefissata cio 18. Alla fine dellelenco, il
valore del contatore fornisce il numero delle persone selezionate corrispondenti
alla condizione posta dal problema.
Unaltra azione molto importante in un programma e che ricorre spesso
quella del totalizzare o sommare. Essa si realizza mediante un sommatore,
anche esso di tipo numerico e preventivamente inizializzato a zero.
Lincremento del sommatore si indica con :

totale totale + numero

che significa che il nuovo valore di totale si ottiene aggiungendo al totale


precedentemente ottenuto il valore del numero considerato. In sostanza il
valore finale del totale viene effettuato attraverso diverse somme parziali.
Ad esempio il conto da pagare al ristorante al termine di una cena, si ottiene
sommando i prezzi dei diversi piatti consumati dal cliente in questo modo:

totale totale + prezzo

In molti programmi, inoltre, viene richiesto il calcolo del valor medio di una
serie di numeri. Il valore della media aritmetica si ottiene dividendo la somma
dei valori per il numero dei valori considerati. Ad esempio, indicando con N il
numero delle persone e con SommaEt la somma delle loro et, let media
delle persone si calcola con lespressione:

EtaMedia SommaEta / N

Il problema del calcolo dellet media di un insieme di persone viene


formalizzato con le seguenti azioni.

1) Esaminare le et ad una ad una


2) Contare le persone esaminate ( N N + 1)
3) Totalizzare le et esaminate (SommaEt SommaEta + Eta)
4) Calcolare la media delle et (EtaMedia SommaEta / N)
5) Fornire il risultato
41

LA RIPETIZIONE CON CONTATORE

La struttura di ripetizione con contatore direttamente derivata dalla


ripetizione vista prima. Questa nuova struttura permette di ripetere un certo
gruppo di istruzioni, non in base al valore di verit di una condizione, come nel
caso del do. while, ma in base al numero di volte che si desidera ripetere il
gruppo di istruzioni. In sostanza il numero di istruzioni noto a priori e la
condizione di arresto indicata dal valore massimo, fornito allinizio, del
contatore. La pseudocodifica della ripetizione con contatore la seguente:

PER contatore DA min A max PASSO incremento ESEGUI


istruzioni
RIPETI

Il diagramma a blocchi corrispondente :

i min

F
i <=max

istruzioni

incrementa i

Per quanto riguarda il linguaggio C, questa struttura viene rappresentata con


la struttura for in questo modo:

for ( i = inizio; i <= fine; i++) {


istruzioni
}
42

In maniera molto semplice diciamo che il contatore, inizialmente uguale a min


viene incrementato ad ogni esecuzione dellistruzione, fino a quando esso si
mantiene minore o uguale a max e il ciclo di ripetizione si arresta quando il
contatore diventa maggiore di max.

Esempio:

for (i = 1; i <= 20; i++) {


scanf (%d, &numero);
printf (%d\n, numero*2);
}

Questo frammento di programma rappresenta uniterazione per ottenere il


doppio di 20 numeri forniti da tastiera.

Le due strutture do while e for scritte sotto, sono funzionalmente


equivalenti:

for (i = 1; i <= 20; i++) { i=1;


printf (xxxxxxxxx\n); do {
} printf (xxxxxxxxx\n);
i++;
} while (i <= n);

Esempio: Calcola il doppio dei primi 30 numeri naturali

#include <stdio.h>
main( ) {
int i;
for ( i = 1; i <=30; i++) {
printf("%d\n", i*2);
}
}

Esercizio: Dati in input una serie di N numeri, calcolare il massimo tra essi.

Pseudocodifica

INIZIO
chiedi (quanti dati)
leggi (N)
PER i DA 1 A N ESEGUI
chiedi (dato)
leggi (dato)
43

SE i =1
ALLORA
max dato
FINE SE
SE dato > max
ALLORA
max dato
FINE SE
RIPETI
scrivi (max)
FINE

Codifica in C

#include <stdio.h>
main( ) {
int n;
int dato;
int max;
int i;
printf ("Quanti sono i dati?");
scanf ("%d", &n);
for (i = 1; i < = n; i++) {
printf ("Inserisci il %d. dato: ", i);
scanf ("%d", &dato);
if (i == 1) max = dato;
if (dato > max) max = dato;
}
printf("Il massimo valore e' %d \n", max);
}
44

Diagramma a blocchi

INIZIO

chiedi(nome)

leggi(nome)

i= 1

i<=N F
V
v

chiedi(dato)

leggi(dato)

F V
i=1

max dato

scrivi (conta)
F V
dato > max

max dato

FINE
incrementa i
45

Esercizi

1) Indica loutput prodotto dallesecuzione dei due segmenti di codice:

a) a = 5;
b = 3;
if (a > b) c = a b;
else c = b a;
printf (%d\n, c);

b) a = 0;
b = 10;
if (a < b)
printf (%d %d\n, a, b);
else
printf (%d %d\n, b, a);

2) Un padre manda il figlio alledicola per comprare il giornale e gli d le


seguenti istruzioni:
1. Esci di casa
2. Fermati alledicola
3. Acquista la Gazzetta dello Sport
4. Dai al giornalaio un biglietto da 5 euro
5. Torna a casa
6. Dammi il giornale

La descrizione completa oppure manca qualche istruzione?

3) Scrivere in pseudocodifica e rappresentare mediante il diagramma a


blocchi il seguente algoritmo: letti due numeri positivi a e b, scrivere la
differenza a b se a >b, altrimenti scrivere la frase sottrazione
impossibile.

4) Di due persone si conosce lanno di nascita. Scrivere let delle due


persone in ordine crescente.

5) Dati in input tre numeri, riscriverli in ordine crescente.

6) Sul prezzo di un prodotto viene praticato lo sconto del 3% se costa meno


di 500 euro e del 5% per prezzi uguali o superiori a 500 euro. Calcolare
il prezzo da pagare.

7) Data in input una serie di numeri, contare quelli positivi e quelli


negativi e comunicarne in output il numero
46

8) Scrivere i primi 10 numeri interi successivi ad un numero N fornito da


tastiera

9) Data in input una serie di numeri, determinare il minimo tra essi.

10) dato un elenco di persone contenente per ognuna il nome, la statura, il


sesso e let. Scrivere un programma che visualizzi :

la statura media
let media
il numero dei maschi e delle femmine
la statura massima e quella minima
la statura massima di quelli che sono maggiorenni

11) Uno studente esamina le informazioni sulle verifiche che ha fatto


durante lanno scolastico e vuole contare quante sono le prove
sufficienti. Produrre in output il risultato del conteggio

12) La popolazione di un comune due anni fa era di 6340 abitanti. Lanno


scorso ha subito un incremento del 5%. Calcolare la popolazione attuale
del comune, comunicando il nome del comune e la popolazione calcolata.
47

CAPITOLO VIII
LE FUNZIONI IN C E LORGANIZZAZIONE DEI PROGRAMMI

I programmi visti finora erano relativamente semplici. Quando ci si trova di


fronte a situazioni pi complesse, si ricorre alla scomposizione del problema
principale in sottoproblemi pi semplici e di dimensioni pi ridotte e quindi
caratterizzati da una minore complessit. Ciascun sottoproblema viene
analizzato separatamente ed eventualmente ancora scomposto qualora dovesse
presentare ancora un certo grado di complessit.
Tale modo di procedere viene detto sviluppo top down, poich nella
scomposizione si procede dallalto verso il basso, realizzando una sorta di
struttura ad albero. Nella programmazione i sottoprogrammi si rappresentano
mediante le funzioni o moduli funzionalmente indipendenti.

LE FUNZIONI

Una funzione un procedimento che riceve valori come argomenti in ingresso e


restituisce un valore come risultato o come spesso si dice, ritorna un valore.
La sintassi generale di una funzione la seguente:

tipo di dato restituito nome della funzione (elenco parametri) {


istruzioni;
return valore restituito;
}

Se il tipo restituito da una funzione non specificato, si assume di default che


il tipo sia int.
Se si vuole specificare che la funzione non restituisca alcun valore, bisogna
specificare il tipo void (vuoto) come tipo di dato restituito.
Lesempio seguente mostra la codifica di una funzione che esegue la somma di
due numeri interi, ricevuti come parametri, e restituisce il valore calcolato.

int Somma (int a, int b) {


int x;
x = a + b;
return x;
}

Quando la funzione ha come tipo di ritorno il tipo void, listruzione return non
seguita da alcun valore o espressione. Il frammento seguente alternativo a
quello precedente e mostra proprio questa differenza:

void Somma (int a, int b) {


int x;
48

x = a + b;
printf (Il totale : %d\n, x);
}

Il seguente frammento di programma, invece, una funzione di stampa che


non restituisce alcune valore e non riceve in ingresso alcun parametro:

void Stampa (void) {


printf (Stampa di prova \n);
printf( fine della funzione \n);
}

Vediamo ora come si pu effettuare la chiamata di una funzione da un


qualunque punto del programma, dopo averla dichiarata e definita. Al
momento della chiamata il compilatore esegue il controllo di corrispondenza
tra i parametri specificati nella definizione della funzione e i valori passati alla
funzione stessa. Un esempio di chiamata della funzione Somma vista in
precedenza il seguente:

int totale;
int tot1;
int tot2;

totale = Somma (tot1, tot2);

Anche il main a tutti gli effetti una funzione ma rispetto alle funzioni
quella che viene eseguita per prima allavvio del programma. Listruzione
return pu essere presente anche nella main e sar in genere seguita da zero,
mentre la main verr dichiarata come int.
In un programma le variabili sono dichiarate allinizio, dopo le direttive della
main e al suo esterno, poich esse sono usate anche dalle altre funzioni
presenti nel programma. Questo tipo di variabili vengono dette globali,
mentre quelle dichiarate allinterno delle funzioni o nella main stessa, vengono
dette locali.
Loperazione con la quale la main o altra funzione, invia i valori alla funzione,
assegnandoli ai parametri, viene detta passaggio di parametri. Le variabili
indicate nellintestazione della funzione si chiamano parametri formali,
mentre le variabili che forniscono i valori ai parametri si chiamano parametri
attuali.

Esempio: Alfa (parametri formali) {

funzione

}
49

main ( ) {

Alfa (parametri attuali) {


..
} chiamata della funzione

Il passaggio di parametri pu avvenire in due modi diversi:

1) Passaggio di parametri per valore, quando i valori delle variabili


della funzione principale vengono ricopiati nei parametri della funzione.
I cambiamenti di valore ai parametri, durante lesecuzione della
funzione, non influenzano i valori delle variabili corrispondenti nella
funzione chiamante (main o altra funzione).
2) Passaggio di parametri per indirizzo, quando i parametri attuali e
formali fanno riferimento alla stessa cella di memoria. I cambiamenti di
valore ai parametri, durante lesecuzione della funzione, influenzano i
valori delle variabili corrispondenti nella funzione chiamante.

Vediamo ora un esempio di programma scritto senza e con uso delle funzioni, e
che esegue lordinamento crescente di tre numeri

Pseudocodifica

INIZIO
chiedi (tre numeri)
leggi (a, b, c)
SE a > b
ALLORA
temp a
a b
b temp
FINE SE
SE a > c
ALLORA
temp a
a c
c temp
FINE SE
SE b > c
ALLORA
temp b
b c
c temp
FINE SE
Scrivi (Numeri ordinati:)
Scrivi (a)
50

Scrivi (b)
Scrivi (c)
FINE

Codifica in C INIZIO

#include <stdio.h> chiedi( 3 numeri)


int main(void) {
int a, b, c;
int temp; leggi (a,b,c)

printf("Tre numeri:");
scanf("%d %d %d", &a, &b, &c);
if(a > b) { a>b

temp = a;
a = b; temp a
b=temp;
} a b
if(a > c) {
temp=a;
b temp
a=c;
c=temp;
}
if(b > c) { a>c
temp=b;
b=c; temp a
c=temp;
}
printf("numeri ordinati: \n"); a c

printf("%d \n", a);


printf("%d \n", b); c temp
printf("%d \n", c);
return 0;
}
b>c

temp b

b c

c temp

scrivi( a,b,c)

FINE
51

Nel programma appena visto, viene utilizzata la variabile temporanea temp ,


che si occupa dello scambio di variabili a due a due, ma loperazione di
controllo e scambio viene eseguita ben tre volte durante il programma, su
variabili diverse ma con le stesse istruzioni. In un programma meglio
organizzato, tali istruzioni possono essere convenientemente raggruppate in
una sola funzione, che verr richiamata dalla main ad operare tre volte con
variabili diverse. Il programma opportunamente modificato presentato qui
sotto e presenta una maggiore semplicit:

Pseudocodifica

Funzione principale

INIZIO
chiedi (tre numeri)
leggi (a, b, c)
Ordina (a,b)
Ordina (a,c)
Ordina (b,c)
Scrivi (Numeri ordinati:)
Scrivi (a)
Scrivi (b)
Scrivi (c)
FINE

Funzione Ordina (Ref x, y)

INIZIO
SE x > y
ALLORA
temp x
x y
y temp
FINE SE
FINE

Codifica in C

#include <stdio.h>
void Ordina (int*x,int*y) {
int temp;

if(*x>*y) {
temp=*x;
52

*x=*y;
*y=temp;
}
return;
}

int main(void) {
int a,b,c;
printf("Tre numeri:"); INIZIO
scanf("%d %d %d",&a, &b, &c);
Ordina(&a, &b); chiedi (3 num)
Ordina(&a, &c);
Ordina(&b, &c);
printf("numeri ordinati: \n"); leggi (a,b,c)
printf("%d \n", a);
printf("%d \n", b);
Ordina (a,b)
printf("%d \n", c);
return 0;
} Ordina (a,c)

Ordina (b,c)
Diagramma a blocchi

funzione principale scrivi (a,b,c)

FINE

Funzione Ordina (Ref x, y)


INIZIO

x>y

temp x

y y

y temp

INIZIO
53

In questultimo programma c un passaggio di parametri per indirizzo, in


modo che le modifiche apportate allinterno della funzione permangano anche
dopo il ritorno al programma chiamante. Come si vede dalla codifica in C
precedente, per passare lindirizzo di una variabile necessario utilizzare
loperatore &, che restituisce appunto lindirizzo della variabile alla quale
applicato. La funzione che riceve una variabile con passaggio per indirizzo,
deve essere in grado di risalire, dallindirizzo della cella di memoria, al valore
in essa contenuto, tramite loperatore * che ne restituisce il valore. La funzione
principale chiama tre volte la funzione Ordina, operando su tre diverse coppie
di dati. Le variabili *x e *y vengono dette puntatori, cio variabili che non
contengono un dato ma lindirizzo di una locazione di memoria. La chiamata
della funzione nella main contiene tra parentesi tonde dopo il nome della
funzione, gli indirizzi delle variabili che mandano i valori ai parametri.
I due esempi seguenti chiariscono meglio la differenza tra passaggio per valore
e passaggio per indirizzo:

Passaggio per valore

#include <stdio.h>

void Modifica (int y) {


y = y + 2;
}
int main(void) {
int x;
x = 1;
printf("%d \n", x);
Modifica(x);
printf("%d \n", x);
return 0;
}

Loutput di tale programma :


1
1

Passaggio per indirizzo

#include <stdio.h>

void Modifica (int *y) {


*y = *y + 2;
}
int main(void) {
54

int x;
x = 1;
printf("%d \n", x);
Modifica(&x);
printf("%d \n", x);
return 0;
}

Loutput di tale programma :


1
3

Esempio:

#include <stdio.h>

void Aggiungi(int x, int *y) {


x++;
(*y)++;
printf("Nella funzione chiamata: %d %d \n", x, *y);
return;
}
int main(void) {
int a,b;
a = 0;
b = 0;
Aggiungi(a, &b);
printf("Nella funzione principale: %d %d \n", a, b);
return 0;
}

Loutput di tale programma :


1 1
0 1

DICHIARAZIONE DELLE FUNZIONI CON I PROTOTIPI

Le funzioni di un programma C possono comparire in qualsiasi ordine nel file


sorgente. Esse per devono essere definite prima che vengano utilizzate dalla
main o da altre funzioni. Lordine in cui le funzioni sono definite molto
importante, infatti una funzione non pu dichiarare unaltra se questa non
stata ancora definita. Per queste ragioni opportuno inserire le funzioni nel
programma attraverso due fasi distinte:
55

1) Dichiarazione delle funzioni per mezzo dei prototipi: esse vanno poste
in testa al programma, dopo le direttive include e dopo la dichiarazione
delle variabili globali. In questo modo si comunica al compilatore
lintenzione di utilizzare una certa funzione, riservandosi di specificare e
scrivere il codice in seguito
2) Definizione delle funzioni: contiene le istruzioni che compongono la
funzione e viene posta dopo la main
Diamo un esempio di programma completo e corredato di funzioni e che calcola
perimetro e area di un quadrato:

#include <stdio.h>
int Tastiera (void);
void CalcoloArea (int l);
void CalcoloPerimetro (int l);

int main (void) {


int lato;
lato = Tastiera( );
CalcoloArea (lato);
CalcoloPerimetro (lato);
return 0;
}
int Tastiera(void) {
int misura;
printf("Introduci il lato :");
scanf("%d", &misura);
return misura;
}
void CalcoloArea (int l) {
float Area;
Area = l*l;
printf("%10.2f \n", Area);
return;
}
void CalcoloPerimetro (int l) {
float Perim;
Perim = l*4;
printf("%10.2f \n", Perim);
}
56

LE FUNZIONI PREDEFINITE

Il linguaggio C possiede molte funzioni predefinite che il programmatore pu


utilizzare senza doverle dichiarare. Queste funzioni sono raggruppate in
librerie, tra le quali la pi nota math.h che contiene le funzioni matematiche
pi comuni, come ad esempio sqrt, per il calcolo della radice quadrata di un
numero, abs per il calcolo del valore assoluto di un numero, pow per il calcolo
della potenza di un numero. Vediamo a tal proposito un programma:

Esempio: Calcolo della potenza di un numero

Pseudocodifica

funzione principale

INIZIO
chiedi (base, esponente)
leggi (base, esponente)
risultato Pot (base, esponente)
scrivi ( base, esponente, risultato)
FINE

funzione Pot (Val x, y)

INIZIO
potenza 1
PER i DA 1 A y ESEGUI
potenza potenza*x
RIPETI
ritorna potenza
FINE

Codifica in C

#include <stdio.h>
double Pot(double x, double y);

int main(void) {
double base, esponente;
double risultato;
printf("Base:");
scanf("%lf", &base);
printf("Esponente:");
scanf("%lf", &esponente);
risultato = Pot(base, esponente);
printf("Base = %lf \n", base);
57

printf("Esponente = %lf \n", esponente);


printf("Potenza = %lf \n", risultato);
return 0;
}

double Pot(double x, double y) {


double potenza = 1.0;
double i;
for(i = 1.0; i< = y; i++) potenza *= x;
return potenza;
}

Diagrammi a blocchi

funzione principale

INIZIO

chiedi (base, espon)


leggi (base, espon)

risultato Pot (base, espon)

scrivi (base, espon, risultato)

FINE
58

funzione Pot (Val x, y)

INIZIO

potenza 1

i 1

F
i <= y

potenza potenza*x

incrementa i

incrementa i

FINE

Il programma che abbiamo sviluppato sopra stato codificato mediante luso


delle funzioni, cos come sono state studiate in questo capitolo.
Una variante del programma visto sopra, utilizza per la finzione predefinita
pow e ne diamo di seguito la codifica in C:

#include <stdio.h>
#include <math.h>
main( ) {
double base, esponente;
double risultato;

printf("Base:");
59

scanf("%lf", &base);
printf("Esponente:");
scanf("%lf", &esponente);
risultato = pow(base, esponente);
printf("Potenza = %lf \n", risultato);
return 0;
}

Ovviamente, dato che pow una funzione matematica, necessaria


linclusione nella libreria math.h, la cui direttiva scritta dopo il file di
intestazione include.

Esercizi

1) Che cosa scrivono in output i tre algoritmi seguenti?

a) Funzione Varia (Val a, b)


INIZIO
a a+1
b b+1
FINE

INIZIO
x 0
y 0
Varia (x, y)
scrivi (x, y)
FINE

b) Funzione Varia (Ref a, Val b)


INIZIO
a a+1
b b+1
FINE

INIZIO
x 0
y 0
Varia (x, y)
scrivi (x, y)
60

FINE

c) Funzione Varia (Ref a, b)


INIZIO
a a+1
b b+1
FINE

INIZIO
x 0
y 0
Varia (x, y)
scrivi (x, y)
FINE

2) Quale output producono i seguenti tre programmi:

a) #include <stdio.h>
void Modifica(int y) {
y = y + 5;
}
int main(void) {
int x;
x = 1;
Modifica(x);
printf("%d\n", x);
return 0;
}

b) #include <stdio.h>
void Modifica (int *y) {
*y = *y + 5;
}
int main (void) {
int x;
x = 1;
Modifica (&x);
printf("%d\n",x);
return 0;
}
61

c) #include <stdio.h>
void Modifica(int x,int *y) {
x ;
*y=* y +5;
return;
}
int main(void) {
int a,b;
a = 10;
b = 20;
Modifica(a,&b);
printf("%d %d \n",a,b);
return 0;
}

3) Il seguente programma produce un errore di compilazione riferito alla


funzione CalcoloArea. Perch?

#include <stdio.h>
float CalcoloArea (int l);
int main (void) {
int lato;
lato = 10;
CalcoloArea (lato);
return 0;
}
void CalcoloArea (int l) {
float area;
area = l*l;
printf ("%10.2f \n", area);
return;
}

4) Definire una funzione che scriva in output il nome e lindirizzo della


scuola.
62

5) Organizzare un programma che per i numeri da 1 a 20 richiami un'unica


funzione che calcoli il quadrato e la radice quadrata di un numero
intero.

6) Definire la funzione che abbia come parametro un numero intero e che


lo presenti in output con una sottolineatura di 5 asterischi.

7) Date in input le et di tre persone, scrivere i dati acquisiti in ordine


crescente.

8) Costruire una funzione che riceva in input due numeri interi e ne calcoli
il quoziente e il resto.

9) Dato un elenco di persone con lindicazione dellet e del nome, calcolare


let media. Si definisca una funzione per lacquisizione dei dati di
ciascuna persona.

10) In un supermercato, il prezzo del prodotto legato alla quantit: se si


comprano tre prodotti dello stesso tipo, uno in regalo; se si comperano
uno o due prodotti non c regalo. Calcolare il prezzo da pagare per
ciascun prodotto, del quale si inseriscono da tastiera il codice, il prezzo
unitario e la quantit. Si vuole ottenere alla fine il totale da pagare per
lintera spesa.
63

CAPITOLO IX
STRUTTURE DI DATI: GLI ARRAY

In molti problemi si ha la necessit di aggregare molti dati di tipo semplice,


per facilitarne la rappresentazione e rendere pi veloce il loro ritrovamento. I
dati sono cio organizzati in un insieme che prende il nome di struttura di
dati. Lesempio pi semplice di dato strutturato fornito da un elenco
alfabetico di persone, nel quale ad ogni cognome e nome viene associato un
numero intero che corrisponde alla posizione che la persona occupa nellelenco
alfabetico. I dati possono essere organizzati costruendo una tabella a due
colonne: la prima contiene un numero, la seconda contiene un dato.

N. NOMI
1 BIANCHI
2 VERDI
3 ROSSI
4 MARTINI
5 MORETTI
6 LISI

Schematicamente un array corrisponde ad una tabella ordinata di dati,


descritti in maniera generica nel seguente modo:

INDICE 1 2 3 i n
VALORE d1 d2 d3 di dn

La tabella pu essere anche sintetizzata mediante la seguente scrittura


matematica:

Un tipico esempio di array possiamo trovarlo anche nellapplicazione della


geometria piana. Infatti ad esempio in un quadrilatero possiamo indicare i
vertici con A, B, C, D, ma anche con V1, V2, V3, V4 , composto da ununica unit
contraddistinta da indici.
Dovendo dare una definizione precisa, diciamo che un array un insieme di
elementi omogenei tra loro. Con una variabile possiamo indicare un solo dato,
con larray possiamo indicare tanti dati dello stesso tipo con un solo nome
collettivo di variabile, che costituisce lidentificatore dellarray. Gli elementi si
distinguono attraverso lindice che viene assegnato nellarray stesso.
Per definire un array in pseudocodifica si usa la sintassi seguente:
64

nome array = ARRAY[dimensione] di tipo nome tipo

Nel linguaggio C larray si definisce nel seguente modo:

tipo NomeArray [dimensione]

Esempio: int coeff[10] indica un array di 10 coefficienti di tipo intero. La


numerazione degli indici in C inizia da 0 e quindi gli elementi dellarray sono:
coeff[0], coeff[1] coeff[2] . coeff[9] .

possibile inizializzare un array assegnando i valori alle componenti in fase di


dichiarazione, come nellesempio seguente:

double numeri[3] =

Per quanto riguarda le variabili stringa, che abbiamo gi visto in alcuni


programmi dei precedenti capitoli, abbiamo che esse sono coerenti nella loro
dichiarazione con la dichiarazione degli array. Infatti nel linguaggio C le
stringhe sono viste proprio come array di caratteri, dove le componenti sono di
tipo char.

Esempio:

#include <stdio.h>
char stringa[10]= "abcdefghi";
int main(void) {
int i;
for(i = 0; i < 9; i++) {
printf("Stringa[%d]= %c\n", i, stringa[i]);
}
return 0;
}

Il programma appena scritto produce in output il valore di ogni componente


dellarray stringa, ed il seguente:

stringa[0] = a
stringa[1] = b
stringa[2] = c
stringa[3] = d
stringa[4] = e
stringa[5] = f
stringa[6] = g
stringa[7] = h
stringa[8] = i
65

Per quanto riguarda il passaggio di parametri alle funzioni, possiamo dire che
quando un array viene passato come parametro ad una funzione, in realt
viene passato lindirizzo della prima componente dellarray. Il nome dellarray
a tutti gli effetti una variabile contenente un indirizzo o puntatore.

Esempio: Acquisire da tastiera due array e sommare le loro componenti.

Il programma si divide in varie parti, come la richiesta delle dimensioni dei


vettori, cio quante componenti possiedono, il caricamento degli stessi, cio la
richiesta in input dei singoli elementi componenti dei vettori, e la funzione di
somma delle componenti dei vettori.

Pseudocodifica

funzione principale

INIZIO
dim ChiediDimensione( )
CaricaVettore (v1, dim)
CaricaVettore (v2, dim)
tot1 Somma (v1, dim)
tot1 Somma (v1, dim)
scrivi (tot1, tot2)
FINE

funzione ChiediDimensione

INIZIO
ESEGUI
chiedi (dimensione)
leggi (d)
RIPETI MENTRE (d<1) OR (d>MAX)
Ritorna d
FINE

funzione CaricaVettore(Ref v, Val d)

INIZIO
PER i DA 0 A d 1 ESEGUI
chiedi (i - esimo elemento)
leggi (v[i])
RIPETI
FINE
66

funzione Somma (Val v, d)

INIZIO
s 0
PER i DA 0 A d 1 ESEGUI
s s + v[i]
RIPETI
ritorna s
FINE

Codifica in C

#include <stdio.h>
#define MAX 100
int ChiediDimensione (void);
void CaricaVettore (int v[ ], int d);
int Somma (int v[ ], int d);

int main (void) {


int n;
int v1[MAX];
int v2[MAX];
int tot1, tot2;
n = ChiediDimensione ( );
printf ("Carica gli elementi del primo vettore\n");
CaricaVettore (v1, n);
printf ("Carica gli elementi del secondo vettore\n");
CaricaVettore (v2, n);
tot1 = Somma(v1, n);
tot2 = Somma(v2, n);
printf("Somma del primo vettore = %d\n", tot1);
printf("Somma del secondo vettore = %d\n", tot2);
return 0;
}
int ChiediDimensione (void) {
int d;
do {
printf ("Dimensione degli array:");
scanf ("%d", &d);
} while (d<1 || d>MAX);
return d;
}
void CaricaVettore (int v[ ], int d) {
int i;
for(i = 0; i < d; i++) {
printf("Elemento di posto %d: ", i);
67

scanf("%d", &v[i]);
}
return;
} INIZIO
int Somma (int v[ ], int d) {
int i;
int s = 0; chiedi (dimensione)
for (i = 0; i<d; i++) s = s + v[i];
return s;
}
leggi (d)

Diagrammi a blocchi
d<1 o d>MAX
funzione ChiediDimensione

ritorna d

FINE

INIZIO

i 0

i<d

funzione CaricaVettore F
chiedi (i-esimo elem)

leggi (v[i])

incrementa i

FINE
68

funzione somma
INIZIO

s 0

i 0

F
i<d

s s +v[i]
incrementa i
incrementa i
FINE

funzione principale
INIZIO

dim ChiediDimensione()

CaricaVettore(v1, dim)

CaricaVettore(v2, dim)

tot1 Somma(v1,dim)
tot2 Somma(v2,dim)

scrivi(tot1, tot2)

FINE
69

RICERCA DI UN ELEMENTO IN UN ARRAY

La ricerca sequenziale di un elemento in un array consiste nellesaminare le


componenti dellarray in sequenza a partire dalla componente con il primo
indice, secondo lordine che esse occupano nel vettore, al fine di controllare se
tra le componenti dellarray ne esiste una avente valore uguale a quello
cercato.

Esempio: Cercare un elemento in un array e fornire la sua posizione oppure un


messaggio di non trovato.

Pseudocodifica

Le funzioni ChiediDimensione e CaricaVettore sono le stesse del precedente


programma e quindi omettiamo sia la loro pseudocodifica sia i loro diagrammi
a blocchi, che sono praticamente identici.
Abbiamo per, oltre alla funzione principale, la funzione Trova, che si occupa
appunto di cercare lelemento nellarray.

funzione principale

INIZIO
dim ChiediDimensione( )
CaricaVettore (vett, dim)
chiedi ( Valore da cercare)
leggi (n)
trovato Trova (vett, dim)
SE trovato
ALLORA
scrivi (n, si trova alla posizione, posto)
ALTRIMENTI
scrivi (n, non presente nel vettore)
FINE SE
FINE

funzione Trova (Val v, d)

INIZIO
s 0
posto 0
ESEGUI
SE v[posto] = n
ALLORA
s 1
ALTRIMENTI
posto posto + 1
FINE SE
70

RIPETI MENTRE (posto < d) AND (s = 0)


ritorna s
FINE

Codifica in C

#include <stdio.h>
#define MAX 10
int n;
int posto;
int ChiediDimensione(void);
void CaricaVettore(int v[ ],int d);

int main(void) {
int dim, i;
int somma = 0;
int prod = 1;
int vett[MAX];
dim = ChiediDimensione( );
printf("Carica gli elementi del vettore \n");
CaricaVettore(vett,dim);
if(i%2 == 0) somma = somma + vett[i];
else prod = prod*vett[i];
printf("Somma componenti = %d\n", somma);
printf("Prodotto componenti = %d\n", prod);
}
int ChiediDimensione(void) {
int d;
do {
printf("Dimensione dell'array:");
scanf("%d", &d);
} while(d<1 || d>MAX);
return d;
}
void CaricaVettore(int v[ ],int d) {
int i;
for(i = 0; i< d; i++) {
printf("Elemento di posto %d: ", i);
scanf("%d", &v[i]);
}
return;
}
71

Diagrammi a blocchi

funzione principale

INIZIO

dim ChiediDimensione()

CaricaVettore(vett, dim)

chiedi (valore)

Leggi(n)

trovato Trova(vett, dim)

trovato

scrivi(non trovato) scrivi( trovato,posto)

FINE
72

Funzione Trova

INIZIO

s 0

posto 1

V F

v[posto]=n

posto posto + 1 s 1

posto>d AND s =0

ritorna s

FINE

ORDINAMENTO DEGLI ELEMENTI DI UN ARRAY

Ordinare gli elementi di un array (in inglese sort) significa metterli in ordine
alfabetico se sono stringhe, o in ordine di grandezza crescente o decrescente se
sono numeri. Il metodo pi semplice e conosciuto di ordinamento quello di
sostituzione, molto efficace per un numero piccolo di elementi da ordinare.
Questo metodo consiste nel confronto di ciascun elemento, dal primo allultimo,
con tutti gli altri elementi che sono disposti nelle posizioni successive a quella
presa in esame.
Tutte le volte che tra gli elementi successivi si incontra il pi piccolo, si
procede allo scambio dei due, ripetendo il procedimento fino a quando gli
elementi sono tutti ordinati. Diamo di seguito solo la codifica del programma di
ordinamento degli elementi di un array:

#include <stdio.h>
#define MAX 100
int ChiediDimensione(void);
void CaricaVettore(int v[ ], int d);
73

void Stampa(int v[ ], int d);


void Ordina(int v[ ], int d);
void Scambia(int*a, int*b);

int main(void) {
int dim;
int vett[MAX];
dim = ChiediDimensione( );
printf("Carica gli elementi del vettore \n");
CaricaVettore(vett, dim);
Ordina(vett, dim);
Stampa(vett, dim);
return 0;
}
int ChiediDimensione(void) {
int d;
do {
printf("Dimensione dell'array:");
scanf("%d", &d);
} while(d<1 || d>MAX);
return d;
}
void CaricaVettore(int v[ ],int d) {
int i;
for(i = 0; i < d; i++) {
printf("Elemento di posto %d: ", i);
scanf("%d", &v[i]);
}
return;
}
void Stampa(int v[ ], int d) {
int i;
for(i = 0; i < d; i++) printf("%d ", v[i]);
printf("\n");
return;
}
void Ordina (int v[ ], int d) {
int i, j;
for(i = 0; i< d 1; i++) {
for(j = i + 1; j < d; j++)
if(v[i] > v[j]) Scambia(&v[i], &v[j]);
}
return;
}
void Scambia (int*a, int*b) {
int comodo;
comodo = *a;
74

*a=*b;
*b= comodo;
return;
}

Come possiamo vedere, le funzioni di caricamento del vettore e della richiesta


della sua dimensione, sono le stesse per ogni programma, mentre nel caso
specifico, abbiamo una funzione di scambio degli elementi (Scambia), che
utilizza la variabile dappoggio detta comodo e una di ordinamento degli
elementi stessi. In pi abbiamo la funzione di Stampa che, richiamata dalla
main, si occupa di stampare i risultati ottenuti. Lo stesso programma potrebbe
essere riscritto, evitando anche di creare la funzione di stampa e scrivendo
tutto nella funzione principale.

Esercizi

1) Quale tra le seguenti dichiarazioni corretta per inizializzare un array?

double valori =
double valori[2] =
double valori[3] =
double valori[3]

2) Dopo aver caricato in memoria un array di numeri interi con dimensione


non superiore a 100, scrivere gli elementi disponendoli in colonna.

3) Dopo aver caricato in memoria un array di numeri interi con dimensione


non superiore a 100, scrivere gli elementi di posto pari.

4) Dopo aver caricato in memoria un array di numeri interi con dimensione


non superiore a 20, scrivere gli elementi dellarray con indicazione del
posto occupato da ciascun elemento.

5) Dopo aver caricato in memoria un array di numeri interi con dimensione


non superiore a 100, calcolare la media degli elementi.

6) Dopo aver caricato in memoria un array di numeri interi con dimensione


non superiore a 100, azzerare lelemento di posto n, con n dato in input.
75

CAPITOLO X
IL SISTEMA OPERATIVO

Il sistema operativo un insieme di programmi che governa e controlla luso


delle componenti del sistema di elaborazione, permettendo allutente un
efficace utilizzo delle risorse hardware e software disponibili.
Un sistema operativo funziona come interfaccia tra lutente e lhardware e
gestisce le risorse del sistema come CPU, memoria centrale, periferiche,
informazioni. In sostanza lutente lavora con una macchina virtuale formata
da hardware con laggiunta del sistema operativo.
I programmi che compongono il sistema operativo sono suddivisi in livelli di
tipo gerarchico, dove i moduli pi in basso si appoggiano direttamente
sullhardware e quelli pi in alto richiamano i moduli dei livelli inferiori ; ci
significa che i moduli dei livelli superiori non colloquiano con lhardware.
Definiamo come grado di portabilit di un sistema operativo, la possibilit
di utilizzarlo stesso su macchine con hardware diverso.
Non tutti i programmi che costituiscono il sistema operativo risiedono in
memoria centrale, tranne il nucleo costituito da quei programmi indispensabili
per il funzionamento della macchina. Tutti gli altri moduli risiedono in
memoria centrale.

TIPI DI SISTEMI OPERATIVI

Diamo di seguito i due tipi di elaborazioni pi comuni per i sistemi operativi:

Elaborazioni a lotti (batch): i dati necessari allelaborazione sono


accumulati in una memoria ausiliaria durante un certo periodo di tempo e a
una scadenza prefissata vengono elaborati tutti insieme in un lotto unico.
Questo tipo di elaborazione riguarda ad esempio il calcolo degli stipendi, le
procedure contabili.

Elaborazione interattiva: essa permette di colloquiare con il programma in


esecuzione; i dati in ingresso vengono elaborati non appena si rendono
disponibili, fornendo subito i risultati. Questo tipo di elaborazione riguarda ad
esempio la gestione dei conti correnti bancari, prenotazione di voli aerei.
I sistemi operativi operano in genere in multiprogrammazione, cio
permettono di allocare pi programmi utente in memoria centrale e di
ripartire fra questi luso delle risorse. Un caso particolare di
multiprogrammazione il multitasking che consente al sistema di elaborare
pi applicazioni contemporaneamente. importante considerare il periodo di
tempo durante il quale la CPU lavora per un programma, quindi molto spesso
la CPU gestita in time sharing cio rimane assegnata ad un programma
finch esso termina, oppure richiede unoperazione di input/output, oppure
scade il periodo di tempo.
76

LA GESTIONE DELLE RISORSE

Gestione della CPU: tutti i programmi hanno bisogno della CPU per essere
eseguiti, quindi essa viene contesa dai vari processi in esecuzione. Una parte
del sistema operativo si occupa dellassegnazione della CPU ai singoli lavori
che ne richiedono luso, mantiene aggiornato lo stato del processore
(libero/occupato), decide a quale processo assegnare il processore, assegnandolo
in seguito, e riprende il controllo del processore quando il processo terminato
o sospeso.

Gestione della memoria: un programma, prima di essere eseguito, deve


essere caricato in memoria centrale e gli deve essere assegnata una quantit di
dati che possa contenere le variabili (zona dati) e la zona istruzioni. Linsieme
di queste due zone forma lo spazio degli indirizzi. Poich la memoria
centrale spesso limitata, si usa la tecnica della memoria virtuale, che
presenta due tecniche per la sua gestione:

1) Richiesta di pagine: la memoria centrale suddivisa in blocchi aventi


tutti la stessa dimensione e lo spazio degli indirizzi diviso in pagine.
Questo tipo di gestione della memoria prevede che non tutte le pagine
siano fisicamente caricate in memoria centrale. Se durante lesecuzione
troviamo una pagina non presente, verr generata uninterruzione per
mancanza di pagine o page fault. Quando il sistema operativo deve
caricare in memoria una pagina ci possono essere blocchi liberi e la
pagina viene automaticamente caricata, oppure se non ce ne sono liberi,
il sistema operativo sceglier tra tutte le pagine presenti in memoria,
quella che verr trasferita in memoria di massa, liberando cos il blocco
e rimpiazzando cos la pagina pi vecchia.
2) Segmentazione: in questo caso il programma viene diviso in segmenti
che possono essere array o tabelle. Solo il segmento contenente il
programma principale (main)sar caricato in memoria centrale. I
segmenti possono anche essere visti composti da pi pagine.

Gestione delle periferiche: il collegamento tra unit centrale e periferiche


avviene tramite interfacce. Poich i tempi di elaborazione della CPU sono
superiori rispetto a quelli di una periferica, bisogna realizzare un meccanismo
di sincronizzazione.

Gestione della memoria di massa: linsieme dei programmi del sistema


operativo memorizzato sulle memorie di massa costituisce il file system, che
consente di fare riferimento ai file con nomi simbolici e regola lallocazione, il
reperimento e la protezione dei file sulle memorie di massa. Per catalogare i
file sulla memoria di massa, il file system utilizza il file directory contenente
le informazioni riguardanti tutti i file presenti sul supporto. Per ogni file viene
inserito un record contenente lidentificativo del file, la lunghezza, il numero
dei record, la data di creazione e quella di modifica.
77

Si ha anche bisogno di un meccanismo di protezione che consiste nellinserire


nella directory linformazione relativa alle operazione permesse sui file come
lettura e scrittura.

STRUTTURA GERARCHICA DEL SISTEMA OPERATIVO

Il Sistema Operativo costituito da una struttura di tipo modulare con vari


livelli:
Livello 0: non altro che la macchina fisica e comprende il repertorio di
istruzioni della stessa.
Livello 1: costituisce il nucleo del sistema operativo e contiene le funzioni che
permettono di ripartire luso del processore tra i diversi programmi. A questo
livello appartengono i moduli per la gestione del processore e per le
interruzioni.
Livello 2: gestisce le memoria centrale e determina lindirizzo fisico di
uninformazione a partire dal suo indirizzo logico.
Livello 3: gestisce le periferiche. In questo livello si trovano i moduli che
controllano il flusso dei segnali e le informazioni da e verso le periferiche.
Livello 4: gestisce la memoria di massa, cio in sostanza ci sono moduli che
controllano laccesso alle informazioni memorizzate su memoria di massa.

Per quanto riguarda il caricamento del Sistema Operativo, dobbiamo dire che i
moduli dello stesso sono tutti in memoria centrale tranne la Bootstrap, che
risiede nella ROM e serve per la partenza iniziale del sistema e per controllare
il funzionamento delle varie componenti. Terminate tutte queste operazioni, il
sistema si pone in attesa dei comandi da parte degli utenti.
78

CAPITOLO XI
ORGANIZZAZIONE DEI DATI SULLA MEMORIA DI MASSA

Per organizzare i file su memoria di massa vengono utilizzati i file che


mantengono registrate le informazioni fino a quando lutente non decide di
cancellarle. Un vantaggio delluso dei file che, non dovendone conoscere a
priori la dimensione, sempre possibile aggiungere nuovi record. Per gestire
grandi volumi di dati necessario che questi siano memorizzati secondo una
logica ben precisa in modo che la consultazione sia pi rapida possibile. La
conservazione delle informazioni avviene attraverso luso di archivi
memorizzati sulla memoria di massa mediante sequenza di byte.

Un archivio di file un insieme di record memorizzati su un supporto di


memoria permanente. I record sono un insieme di informazioni riguardanti un
determinato oggetto. Le informazioni componenti il record vengono dette
campi.

OPERAZIONI SUI FILE

Per poter elaborare tramite un programma i dati presenti nei file, bisogna
prima spostarli nella memoria centrale e viceversa. Ci avviene mediante i
comandi READ (dalla memoria di massa alla centrale) e WRITE (dalla memoria
centrale a quella di massa). Abbiamo sempre parlato di record logico, ma in
realt ci che viene trasferito il record o blocco fisico le cui dimensioni
dipendono dallhardware della macchina. La differenza sostanziale sta nel
fatto che il programmatore vede record composti da campi, mentre il file
system vede dei blocchi. Definiamo come fattore di blocco il numero di record
logici contenuti in un record fisico; quindi i record di un blocco si dicono:

1) Sbloccati: il record fisico contiene un solo record logico, con fattore di


blocco = 1
2) Bloccati: il record fisico contiene diversi record logici, con fattore di
blocco > 1
3) Multiblocco: vi sono pi record fisici per un record logico, con fattore di
blocco < 1

Quelle appena viste sono operazioni fisiche. Le seguenti sono invece operazioni
logiche.

1) Creazione: si crea larchivio, definendone il nome e il tracciato record,


la modalit con cui i dati sono strutturati e collegati tra loro e le
modalit di accesso (scrittura, sola lettura)
2) Consultazione: riguarda il reperimento dei dati contenuti nellarchivio
79

3) Modifica: consente di modificare il valore di uno o pi campi di un


record o di record diversi
4) Inserimento: vengono inseriti o aggiunti record ad un archivio esistente
5) Cancellazione: vengono eliminati uno o pi record i cui dati non sono
pi necessari. Esiste la cancellazione logica nella quale il record da
eliminare viene marcato e non pi preso in considerazione ma esiste
ancora fisicamente, e la cancellazione fisica, durante la quale il record
viene fisicamente cancellato, rendendo lo spazio occupato di nuovo
disponibile.
6) Ordinamento: esso viene effettuato quando si vogliono avere i dati
ordinati in modo crescente o decrescente, secondo i valori assunti da un
certo campo detto chiave. In inglese lordinamento viene detto sort.
7) Fusione: essa avviene tra due file ordinati sul campo chiave e i cui
record vengono copiati in maniera ordinata sul file risultante. In inglese
la fusione viene detta merge.
8) Dichiarazione di un file: un file deve essere collegato al programma
che lo usa. Di norma il file viene riconosciuto con un nome interno o
logico e il nome esterno o fisico con cui il file registrato su supporto ed
indipendente dal programma.

FILE SEQUENZIALI

Il file sequenziale un tipo di archivio in cui i dati sono disposti in sequenza,


uno di seguito allaltro. Se i record sono in ordine crescente ( o decrescente) si
parla di file ordinato rispetto alla chiave. In un file sequenziale laccesso ad un
dato record pu avvenire solo scorrendo tutti i record precedenti a quello
ricercato, mentre linserimento deve avvenire in coda al file e sono sufficienti
due accessi, uno per la lettura e uno per la scrittura.

FILE AD ACCESSO DIRETTO

In questo caso possibile accedere direttamente alle informazioni contenute in


un record attraverso la chiave. Laccesso diretto pu essere ottenuto attraverso
tre tipi di assegnazione di cui quello pi noto e importante laccesso su
indice, in cui lindice solitamente la chiave. Le chiavi sono memorizzate in
un file detto file degli indici per accedere al record che si trova sul file di
dati. Il file degli indici memorizzato in memoria di massa ed ordinato per
chiavi crescenti. Si accede alla memoria di massa solo quando la chiave stata
trovata nella tabella.
80

CAPITOLO XII
LA COMPLESSIT COMPUTAZIONALE

Se due algoritmi diversi producono lo stesso risultato o output, essi si dicono


equivalenti. Essi per possono differire in termini di:

1) Velocit
2) Occupazione di risorse
3) Eleganza

Tutto ci determina la complessit di un algoritmo che misura la quantit di


tempo e di risorse necessarie per eseguire un compito tramite algoritmo. Un
esempio di calcolo di complessit riguardo la ricerca in un insieme di dati, pu
avvenire in modo lineare o dicotomico. Nel primo caso si scorre la serie di
dati, nel secondo si suddivide linsieme in tanti sottointervalli fino a trovare il
dato desiderato. Nellanalisi della complessit diciamo che:

1) La complessit di un algoritmo funzione del numero dei dati che si


considerano tendenti allinfinito (complessit asintotica).
2) Non viene considerata la complessit di un caso particolare, ma di
norma viene studiato il caso peggiore, che di solito il pi frequente e il
pi facile da identificare. Una stima valida sul caso peggiore sar valida
in ogni altro caso.

NOTAZIONI ASINTOTICHE

Una notazione asintotica un metodo matematico che consente di


rappresentare la complessit di un algoritmo, con n tendente ad infinito, in
modo da confrontare algoritmi con complessit diversa.

NOTAZIONE ASINTOTICA O GRANDE

La funzione T(n) O grande di g(n) se esiste un intero positivo c tale che, da un


certo valore di n in poi T(n) sempre positiva e minore o uguale al prodotto di c
per g(n).

T(n) = O(g(n)) se c>0 tale che 0T(n)c*g(n) con n > n0

c*g(n)

n0
81

NOTAZIONE ASINTOTICA

La funzione T(n) di g(n) se esiste un intero positivo c tale che, da un certo


valore di n in poi il prodotto di c per g(n) sempre positiva e minore o uguale a
T(n).

T(n) = (g(n)) se c>0 tale che 0 c*g(n) T(n) con n0> n

T(n)

c*g(n)

NOTAZIONE ASINTOTICA

La funzione T(n) di g(n) se esistono due interi positivi c1, c2 tali che, da un
certo valore di n in poi il prodotto di c1 per g(n) sempre positiva e minore o
uguale a T(n), a sua volta minore o uguale al prodotto di c2 per g(n).

T(n) = (g(n)) se c>0 tale che 0 c1*g(n) T(n)c2*g(n) con n> n0

c2*g(n)

T(n)

n0

c1*g(n)

La ricerca dicotomica ha crescita logaritmica e cresce pi lentamente della


ricerca lineare.
82

ALGORITMI DI ORDINAMENTO

Gli algoritmi di ordinamento hanno il compito di porre in ordine crescente o


decrescente una serie di valori. I pi noti algoritmi sono:

BUBBLE SORT: questo un algoritmo molto diffuso e ordina i dati


confrontando ogni valore con il suo successivo e scambiandoli nel caso in cui
lordinamento voluto non venga rispettato

T(n) = (n 1)(n 1) = n2 2n + 1 = (n2)

INSERTION SORT: questo algoritmo prevede che, dallinsieme di dati, si


estragga un elemento alla volta e lo si inserisca nellinsieme ordinato, nella
posizione corretta.

T(n) = 1 + 2 + 3 +.+ (n 1) + n = n2/2 = (n2)

MERGE SORT: in questo caso un problema di grandi dimensioni viene man


mano scomposto in problemi pi semplici, fino ad ottenere una serie di
problemi elementari.

T(n) = n 1 + n*log2n = n(1 + log2n) 1

QUICK SORT: questo ordinamento, molto adatto nel caso medio, ma poco
adatto nel caso peggiore, si pu eseguire in loco, cio senza bisogno di una
struttura dappoggio in cui copiare porzioni di dati. Lalgoritmo prevede che si
scelga, per ogni iterazione, un valore chiamato pivot. Si divide linsieme
originario in due sottoinsiemi, di cui uno contiene valori tutti minori del pivot e
laltro sottoinsieme con valori tutti maggiori del pivot.

Tpeggiore(n) = n*n
Tmedio(n) = n*log2 (n)

HEAP SORT: questo algoritmo su una struttura di dati detta Heap che in
sostanza un albero binario con al massimo due nodi.

1) Ogni elemento contiene un valore superiore a quello contenuto nei nodi


da esso discendenti
2) I nodi sono numerati a partire dal primo nodo in alto, in modo che dal
nodo i discendono i nodi 2i + 1 e 2i + 2.
3) Ogni nodo formato da altri due nodi, ad eccezione di quelli pi in basso
che possono non avere discendenti
83

TBuildHeap(n) = n*log2 (n)


THeapSort(n) = n*log2 (n)

COUNTING SORT: questo ordinamento opera esclusivamente su numeri interi


e si basa su un metodo che va ad identificare a priori quale posizione del
vettore ordinato sar occupato da ogni elemento del vettore iniziale. Il
counting sort prevede che sia eseguita inizialmente una stima di quanti e quali
valori ripetuti sono presenti nellinsieme dei dati ordinare. Questa stima
rappresentata da una struttura di dati detta vettore delle occorrenze. In
seguito si definisce il cosiddetto vettore delle posizioni, ottenuto inserendo in
ogni cella la somma del valore che la stessa aveva nel vettore delle occorrenze e
tutti i valori contenuti nelle celle precedenti.

Esempio: Ordinare mediante Quick Sort, Insertion Sort e Heap Sort la


sequenza 12 32 22 45 96 32 44 15

Quick Sort:

(12 32 22 45) (96 32 44 15)


ok no ok ok no ok no

(12 22 32 45) (96 32 44 15 )

(12 22 15) (45 96 32 44 15 )

< pivot pivot

12 15 22 32 32 44 45 96 ordinati

ok ok ok ok
84

Insertion Sort:

12
12 22
12 22 32
12 15 22 32
12 15 22 32 32
12 15 22 32 32
12 15 22 32 32
12 15 22 32 32 44
12 15 22 32 32 44 45
12 15 22 32 32 44 45 96 Ok!

Heap Sort:

12 32 22 45 96 32 44 15

12 12
32
Ok 2

No Ok
22
12

32
32 Ok No
2
2

12 22
12 22 2
2

45
2
85

32 45
2 2

45 22 32 22
2 2
No

12 12 No
2 2

45 45
2 2

32 22 96 22
2 2
No No

12 12 32
96
2 2
2

96 96
2 2

45 22 45 22
45 2 45 2

12 32 12 32 32
2 No 2 Ok
86

96
96
2

45 32
45 44
45 42

12 32 22 44
12 32 22 32
2
2

96
2

45 44
45 42
96
2
12 32 22 32
2
45 44
45 42
15
2 No
15 32 22 32
2

12
2
Ok , ordinato

Esercizio

Ordinare mediante Merge Sort, Quick Sort, Insertion Sort ed Heap Sort, la
stessa sequenza

12 32 22 45 96 32 44 15
87

CAPITOLO XIII

LE STRUTTURE DATI
LE STRUTTURE DATI STATICHE

Una struttura dati un tipo di dato complesso. Diciamo che uninformazione


semplice rappresentabile mediante un numero di dimensione finita, mentre
uninformazione complessa descritta solo ricorrendo a pi informazioni
semplici.
Esempi: numero compreso tra 1 e 1000000 (semplice)
carattere dellalfabeto (semplice)
parole del vocabolario (complessa)
frase (complessa)
posizione nel piano (x, y) (complessa)

DEFINIZIONE: una struttura dati si dice statica, se non cambia la sua


dimensione rispetto al momento in cui viene allocata, mentre si dice
dinamica se pu adattare la propria misura al numero di oggetti da gestire al
proprio interno.

RECORD

Un record una struttura di dati che permette di memorizzare e gestire


informazioni composte da pi campi, ognuno distinguibile dagli altri in base a
un nome specifico.

Esempio 1: type PuntoCartesiano {


x: NumeroDecimale;
y: NumeroDecimale;
}
var punto: PuntoCartesiano;
punto.x = 8;
punto.y = 11;

Esempio 2: : type Data {


giorno: NumeroIntero;
mese: NumeroIntero;
anno: NumeroIntero;
}
type Persona {
Cognome: Stringa;
DataN: Stringa;
88

Citt: Stringa;
}
var mario; Persona;
Mario.Nome : = Mario;
Mario.Cognome : = Rossi;
Mario.Citt : = Roma;
Mario.DataN.giorno : = 29;
Mario.DataN.Mese : = 10;
Mario.DataN.anno : = 1975;

STACK O PILA

Lo stack una struttura dati di dimensione variabile su cui sono definite


operazioni di inserimento (Push) ed estrazione (Pop) di elementi. La
caratteristica fondamentale di uno stack che lultimo elemento inserito sar
il primo ad essere estratto. La struttura in questi casi anche detta LIFO, cio
Last In First Out.
Uno stack pu essere paragonato ad una pila di elementi.

CODA

La coda una struttura di dati di dimensione variabile su cui sono definite


operazioni di inserimento e cancellazione di elementi, dove il primo elemento
inserito sar anche il primo ad essere estratto. La struttura viene perci detta
FIFO, cio First In First Out. Sulle code sono anche definite le operazioni di
ENQUEUE cio accodamento e DEQUEUE cio estrazione. Una coda pu
essere rappresentata mediante struttura circolare e ciclica.

LE STRUTTURE DATI DINAMICHE

Una struttura dati dinamica caratterizzata dalla possibilit di variare le


proprie dimensioni in base alla quantit di dati da trattare. Essa
sicuramente pi vantaggiosa da utilizzare in termini di ottimizzazione, per
indubbiamente pi complessa da gestire rispetto a una struttura statica.
Esaminiamo le principali strutture dinamiche.

LE LISTE

La lista simile ad un array, tuttavia presenta le seguenti differenze:


89

1) Una lista non ha dimensione predefinita, quindi si possono aggiungere


ed eliminare gli elementi fino ad esaurimento della memoria.
2) Ogni elemento di una lista raggiungibile solo attraverso il suo
precedente o successore, a differenza di un array, nel quale possiamo
accedere direttamente allelemento che ci interessa.
3) Una lista implementabile attraverso una struttura apposita detta
record, nella quale si pu accedere sequenzialmente ad un certo
elemento, che deve necessariamente contenere un riferimento
allelemento successivo.

In pseudocodifica possiamo riassumere quanto detto nel seguente modo:

type nodoInLista {
valore: numero Decimale;
successivo: > nodoInLista;
}

Esistono anche lista dette a doppio link, che hanno il riferimento verso
lelemento successivo, ma anche verso il precedente, in questo modo:

type nodoInLista {
valore: numero Decimale;
successivo: > nodoInLista;
precedente: > nodoInLista;
}

OPERAZIONI FONDAMENTALI SULLE LISTE

Su una lista sono definite le seguenti operazioni fondamentali:

insert: inserimento in testa di un nuovo valore


append: inserimento in coda di un nuovo valore
orderedInsert: inserimento ordinato di un dato valore
search: ricerca di un dato valore
delete: cancellazione di un dato valore
size: calcolo del numero degli elementi presenti

INSERT

Loperazione di inserimento in testa alla lista di un valore posizioner


lelemento in cima alla lista nella prima posizione, mentre lelemento che
prima era in cima viene accodato al nuovo.
90

Esempio:

4
76

76 4
11

11 76 4 e cos via..

APPEND

La procedura di inserimento in coda prevede che lelemento inserito scorra


tutti gli altri, posizionandosi alla fine della lista.

Esempio:

76
4 76

11

4 76 11

ORDERED INSERT

Questo procedimento simile allinserimento in coda, con la differenza che il


nuovo elemento viene inserito i coda se il suo valore maggiore (o minore se si
tratta di ordinamento decrescente) di quello contenuto in tutti gli altri
elementi presenti, altrimenti lelemento verr posizionato rispettando lordine
previsto.
91

4
76

4 76

11

4 11 76

SEARCH

La procedura di ricerca esamina la lista e restituisce true se viene trovato


almeno un elemento contenente il valore specificato. Se viene raggiunta la coda
della lista senza aver trovato lelemento, la procedura restituisce il valore false.

DELETE

La procedura di cancellazione simile a quella di ricerca. In sostanza, una


volta trovato lelemento da eliminare, occorre accorciare la lista, andando a
posizionare al posto dellelemento da eliminare, lelemento successivo.

SIZE

La funzione size calcola il numero degli elementi presenti in una lista.


Solitamente si scorrono tutti gli elementi della lista fino al termine,
incrementando man mano un contatore che tenga traccia del numero degli
elementi visionati.

GLI ALBERI

Un albero derivato dalla lista, ma in questo caso, ad un elemento non ne


corrisponde necessariamente un solo altro, ma ne possono corrispondere molti
altri. In un albero sono vietate le relazioni cicliche, cio un nodo non pu
congiungersi con se stesso e per ogni nodo deve essere presente sempre un solo
predecessore. In sostanza possiamo dire che una lista un caso particolare di
albero, dove ogni nodo ha un solo successore.
92

Esempio di albero corretto:

Esempio di albero non valido:

Non valido perch


un nodo ha pi
predecessori

Un esempio classico di albero quello genealogico, oppure possiamo trovare


anche alberi cosiddetti decisionali, che corrispondono agli algoritmi visti
spesso nei precedenti capitoli.

ALBERI BINARI DI RICERCA

Un albero binario di ricerca o BST una struttura dati dinamica che


memorizza dati e li ricerca in tempi molto brevi. Lelemento di base di un
albero binario di ricerca un nodo avente al massimo due successori. I nodi si
suddividono in tre tipologie:

1) Radice (root), che lunico nodo senza predecessori. (R)


2) Foglie (leaves), che non hanno successori. (F)
3) Intermedi , che non ricadono nei casi precedenti. (I)
93

Il grafico seguente, mostra un tipico albero binario di ricerca:

I I

F I F

F F

Un BST ha la seguente propriet fondamentale:


Dato un nodo n, i successori devono essere rigidamente divisi sui due
collegamenti in base al fatto che contengono valori maggiori o minori di quelli
contenuti nel nodo n.

Esempio:

26

9 43
Livello 1

2 18 55
55 Livello 2
5

13 18 Livello 3
6

Nellalbero precedente si scelto il posizionamento dei nodi con valore minore,


sulla sinistra e maggiori o uguali sulla destra.
94

I nodi contenuti in un BST possono essere suddivisi in base alla distanza tra
essi e la radice. In questo modo si opera una suddivisione in livelli, dove in
ogni livello ci sono i nodi aventi tutti la stessa distanza.
Un albero si dice bilanciato se tutte le foglie appartengono allultimo o agli
ultimi due livelli. Se tutte le foglie si trovano allultimo livello, lalbero si dice
completo.

OPERAZIONI FONDAMENTALI SUI BST

Su un albero binario sono definite le seguenti operazioni fondamentali:

search: ricerca di un nodo precedentemente inserito in un BST.


insert: inserimento di un nuovo nodo.
min/max: ricerca del valore minimo e massimo.
delete: cancellazione di un nodo.
visit: enumerazione di tutti gli elementi presenti in un BST.

SEARCH

Loperazione di ricerca prevede che, partendo dalla radice, si seguano i


collegamenti che portano al nodo voluto, seguendo il criterio descritto nella
propriet fondamentale. Se si raggiunge una foglia senza aver trovato il nodo
cercato, vuol dire che esso non presente nellalbero.

Esempio: ricerca del valore 2


Si inizia
dalla radice 26

2 < 26: si segue


collegamento di
sinistra 9 43

2 < 9: si segue
collegamento di 55
2 18
sinistra 55
5

Valore
13 18
trovato!
6
95

INSERT

La procedura di inserimento prevede che i nuovi nodi vengano inseriti come


nuove foglie, seguendo il solito criterio. necessario quindi scorrere lalbero
fino a trovare un collegamento libero.

Esempio: costruire passo per passo lalbero dellesempio precedente.

passo 1: 26

26
passo 2: <

passo 3: 26

<
9

18

26
passo 4:

43
9

18

26

43
9
passo 5:

55
18
96

passo 6:
26
<
43
9

55
18

<
13

passo 7:

26

<
43
9

55
18


13 18

passo 8: 26

43
9

55
18
2

13 18
albero completato
97

MIN/MAX

Le procedure di ricerca del minimo e massimo si basano sul criterio scelto. Se


consideriamo lalbero degli esempi precedenti, dove il ramo di sinistra ospita
tutti i nodi con valore minore di un dato nodo n, e quello di destra tutti i nodi
con valore maggiore o uguale ad n, avremo che il nodo pi a sinistra di tutti,
cio quello con valore 2 il minimo, e il nodo pi a destra, con valore 55, il
massimo.

DELETE

Loperazione di cancellazione di un nodo pi complessa delle altre, poich


prevede tre forme di eliminazione dei nodi:

1) Se si vuole eliminare una foglia sufficiente liberare il collegamento che


la lega al resto dellalbero.

26

9 43

2 18 55
55
5

13 18
6

2) Se si vuole eliminare un nodo con un solo successore, si sostituisce il


nodo da eliminare con il suo unico successore.
98

26

9 43

2 18 55
55
5

13 18
6

26

9 55

2 18 55
55
5

13 18
6

3) Se si vuole eliminare un nodo con due successori, bisogna sostituire il


nodo con il minore tra i suoi successori maggiori, oppure con il maggiore
tra i suoi successori minori.
99

26

9 43

2 18 55
55
5

13 18
6

Caso 1: sostituzione del nodo con il minore tra i suoi successori maggiori

26

13 43

2 18 55
55
5

13 18
6

Caso 2: sostituzione del nodo con il maggiore tra i suoi successori minori
100

26

2 43

2 18 55
55
5

13 18
6

VISIT

Loperazione di visita di un albero consiste nellenumerare tutti i nodi presenti


in esso. Le visite possono essere diverse:

1) Visita in ampiezza (level order).


2) Visita in profondit:
a) in order
b) pre order
c) post order

La visita in ampiezza prevede che si enumerino i nodi per livello, partendo


prima dalla radice ed arrivando man mano a tutti i nodi del livello1, livello2 e
cos via. Per effettuare la visita, necessaria una coda di appoggio, in cui
accodare i nodi man mano considerati. In fase di inizializzazione, la coda sar
composta solo dalla radice.

Esempio: consideriamo il solito albero visto precedentemente e indichiamo con


Q la cosa di appoggio e con R la coda dei nodi visitati.

Q = {26} , R = { }

Passo 1: Q = {9,43} , R = {26}


Passo 2: Q = {43, 2, 18} , R = {26, 9}
Passo 3: Q = {2, 18, 55} , R = {26, 9, 43}
Passo 4: Q = {18, 55} , R = {26, 9, 43, 2}
Passo 5: Q = {55, 13, 22} , R = {26, 9, 43, 2, 18}
101

Passo 6: Q = {13, 22} , R = {26, 9, 43, 2, 18, 55}


Passo 7: Q = {22} , R = {26, 9, 43, 2, 18, 55, 13}
Passo 8: Q = { } , R = {26, 9, 43, 2, 18, 55, 13, 22}

La visita in profondit richiede che lalbero venga visitato, prendendo in


considerazione oltre al nodo in esame, anche i sottoalberi destro e sinistro,
prima di passare al successivo nodo dello stesso livello. In base allordine in cui
vengono visitati il nodo e i suoi sottoalberi, distinguiamo tre tipi di visita:

Tipologia 1 visitato 2 visitato 3 visitato


pre order Nodo attuale Sottoalbero minori Sottoalbero maggiori
in order Sottoalbero minori Nodo attuale Sottoalbero maggiori
post order Sottoalbero minori Sottoalbero maggiori Nodo attuale

Caso pre order: si inizia dalla radice, per poi proseguire al ramo con valori
minori della radice e infine al ramo con valori maggiori della radice.
Prendendo in considerazione il solito albero come esempio, abbiamo:

R = {26}
R = {26, 9, 2}
R = {26, 9, 2, 18, 13, 22}
R = {26, 9, 2, 18, 13, 22, 43, 55}

Caso in order: si inizia dal ramo con valori minori della radice, per poi
proseguire alla radice e infine al ramo con valori maggiori della radice.

R={}
R = {2, 9}
R = {2, 9, 13, 18, 22}
R = {2, 9, 13, 18, 22, 26}
R = {2, 9, 13, 18, 22, 26, 43, 55}

Caso post order: si inizia dal ramo con valori minori della radice, per poi
proseguire con il ramo con valori maggiori della radice e infine con la radice.

R={}
R = {2}
R = {2, 13, 22, 18}
R = {2, 13, 22, 18, 9}
R = {2, 13, 22, 18, 9, 55, 43}
R = {2, 13, 22, 18, 9, 55, 43, 26}
102

Esercizi

1) Inserire in un BST i valori {12, 32, 22, 45, 96, 32, 44, 15}

2) Partendo ogni volta dalla pila 10 20 30 , determinare la


configurazione finale dopo ciascuna sequenza di operazioni:

a) Inserimento di 40, inserimento di 50, estrazione di un elemento,


inserimento di 60, estrazione, estrazione
b) Estrazione, estrazione, inserimento di 40, estrazione, estrazione
c) Estrazione, estrazione, estrazione, inserimento di 40, inserimento
di 50, inserimento di 60.

3) Partendo ogni volta dalla coda 10 20 30 , determinare la


configurazione finale dopo ciascuna sequenza di operazioni:

a) Inserimento di 40, inserimento di 50, inserimento di 60,


estrazione, estrazione, estrazione
b) Inserimento di 40, estrazione, estrazione, inserimento di 50
c) Estrazione, estrazione, estrazione, inserimento di 40, inserimento
di 50

4) Dato il seguente albero binario, indica la sequenza di nodi ottenuti con i


tre metodi di attraversamento (visita).

F4

B3 L1
1

A1 G1 P5
55
5

N3 Z1
6

N1 P1
6 6
103

CAPITOLO XIV
EVOLUZIONE DEI LINGUAGGI DI PROGRAMMAZIONE

In generale molto difficile gestire la complessit, ma esiste un modo per


poterla controllare che lastrazione. Essa un procedimento che consente di
semplificare la realt che vogliamo analizzare e la semplificazione avviene
concentrando lattenzione solo sugli elementi importanti delloggetto complesso
che stiamo considerando. Il risultato dellestrazione la creazione di un
modello che consente di ridurre la complessit della realt, ignorando i
dettagli. Lastrazione, quindi, corrisponde al processo di modellazione. A titolo
di esempio, possiamo dire che unapplicazione software rappresenta
unastrazione della realt. Nello sviluppo dei programmi si usata fino ad ora
la metodologia della programmazione strutturata, che consiste in una
sequenza di operazioni da svolgere per arrivare alla risoluzione del problema.
Lo spostamento dellattenzione dalle procedure agli oggetti, ha portato
allintroduzione della cosiddetta programmazione ad oggetti. Un modello
viene anche detto paradigma, sul quale si fonda qualsiasi linguaggio di
programmazione. I principali paradigmi di programmazione sono:

1) Imperativo: in questo caso la computazione viene portata avanti


attraverso una sequenza ordinata di passi. Alla base di tutto troviamo
listruzione di assegnamento, che cambia il valore delle variabili. Esempi
di linguaggi imperativi sono il Pascal, linguaggio di base, ma ormai
abbastanza in disuso, e il C, studiato nei precedenti capitoli.

2) Logico: questo paradigma utilizza asserzioni logiche o dichiarazioni ,


finalizzate a definire un problema e costruite attraverso relazioni.

Esempio: lasserzione Mario il padre di Luca diviene mediante


paradigma logico padre(Luca) = Mario
Dopo la costruzione delle dichiarazioni e delle relazioni, si procede
alle interrogazioni.

3) Funzionale: questo paradigma ha come base luso delle funzioni, che


ricevono in input dei valori e restituiscono un certo risultato.
Esempio: Calcolare la funzione (x+y)2 , ricevuti in input i numeri
<x,y>.

SOMMA: <a, b> = a + b


QUADRATO: < c > = c*c
PROGRAMMA: <x, y> = QUADRATO(SOMMA(x, y))

4) Orientato agli oggetti: questo paradigma analizza il problema


vedendo gli oggetti reali come composti da uno stato modificabile e da
104

un insieme di operazioni. Diversi oggetti comunicano tra loro


scambiandosi dei messaggi.

Dicesi SISTEMA una parte del mondo che una persona o gruppo sceglie di
considerare come un intero, costituito da componenti caratterizzate da
propriet e azioni che mettono in relazione la propriet stesse con altre
componenti.

componenti
SCHEMA DI SISTEMA propriet
azioni
correlazioni

Un esempio di sistema linterfaccia grafica.

Le componenti di un sistema possono essere finestre, bottoni, menu, aventi


tutti alcune propriet. Lo schema grafico il seguente:

Finestre: dimensioni, posizione


COMPONENTI Bottoni: colore, testo
Menu: colore, testo

una finestra si apre con un bottone

CORRELAZIONI sovrapposizione di finestre

Per i linguaggi imperativi come il C e il Pascal, si parla di algoritmo, mentre


Nei linguaggi di tipo orientato agli oggetti come il C++ e il Java, si parla di
sistema.

Esercizi:

1) Descrivere i seguenti sistemi sia graficamente, sia in termini di


componenti, correlazioni, propriet e finalit:

Lautomobile come sistema di trasporto


Il computer come sistema di calcolo
Il sistema operativo di un computer
105

2) Usando un paradigma logico, descrivi le seguenti relazioni di parentela:


nonno(x), nonna(x), zio(x), zia(x), nipote(x).
Ad esempio zia(x) = sorella(padre(x)) , ma vale anche zia(x) =
sorella(madre(x)).

3) Usando un paradigma funzionale, scrivere un programma che calcola la


funzione (x y)3. Elencare tutte le funzioni utilizzate.

4) Usando un paradigma funzionale, scrivere un programma che calcola la


funzione (x2 + y2)/z. Elencare tutte le funzioni utilizzate.

5) Per descrivere un sistema si devono specificare tre elementi. Quali?

6) Quali sono gli elementi chiave del paradigma logico? E del paradigma
funzionale?

7) Quale tra queste definizioni corrisponde al termine astrazione?

procedimento che consente di semplificare la realt che vogliamo


analizzare
procedimento che complica la realt che vogliamo analizzare
algoritmo che consente di semplificare la realt
procedimento che trascura le qualit considerate rilevanti
106

CAPITOLO XV
PROGRAMMAZIONE ORIENTATA AGLI OGGETTI

La programmazione orientata agli oggetti, detta anche OOP, una


metodologia che sfrutta il concetto di sistema, composto da oggetti o entit in
interazione tra loro.

GLI OGGETTI

Per capire cosa un oggetto, possiamo prendere spunto dalla vita quotidiana.
Unautomobile, un televisore sono oggetti. In particolare un oggetto viene
definito mediante:

1) Caratteristiche: esse rappresentano gli elementi caratterizzanti


loggetto, utili per descrivere le propriet e definirne il suo stato.
2) Comportamenti: essi rappresentano le funzionalit che loggetto mette
a disposizione e che devono essere attivate da chi intende utilizzarlo.

Se prendiamo ad esempio unautomobile, alcune sue caratteristiche sono la


velocit, il numero di porte, il colore, mentre tra i comportamenti troviamo il
comando avviati, accelera, fermati, gira, cambia marcia.
Loggetto Auto1 pu essere cos descritto:

velocit = 60
colore = rosso
numeroPorte = 5

Per descrivere graficamente gli oggetti, si fa ricorso al cosiddetto diagramma


degli oggetti in questo modo:

Auto1

velocit = 60

colore = rosso
numero Porte = 5

ATTRIBUTI E METODI

Un oggetto deve essere in grado di memorizzare le informazioni che servono


proprio a descriverne le sue caratteristiche. Tali informazioni prendono il nome
107

di attributi e nella programmazione sono individuati dalle variabili. Le


operazioni che un oggetto in grado di compiere e che corrispondono ai suoi
comportamenti si chiamano metodi, i quali vengono realizzati in
programmazione imperativa usando le funzioni. In sostanza un oggetto
costituito da una coppia formata da attributi e metodi. Diversi oggetti
comunicano ed interagiscono tra loro mediante scambio di messaggi. Ad
esempio loggetto Automobile pu ricevere messaggi da altri oggetti come
Autista, che invia il metodo fermati in prossimit di uno stop, oppure da
Serbatoio, che comunica la modifica dellindicazione del livello di carburante.
Un messaggio formato da tre parti:

1) Destinatario: esso loggetto al quale indirizzato il messaggio


2) Selettore: esso identifica il metodo da attivare
3) Elenco argomenti: linsieme dei parametri passati alloggetto dopo la
richiesta di attivazione del metodo.

Esempio: Auto1.accelera indica che alloggetto Auto1 stato inviato un


messaggio di richiesta di aumento della velocit.

INCAPSULAMENTO

Gli oggetti realizzano il concetto di incapsulamento, che indica la propriet


degli oggetti di incorporare al loro interno sia gli attributi sia i metodi. In
sostanza tutte le informazioni utili riguardanti un oggetto sono ben localizzate.
Strettamente legato allincapsulamento, troviamo anche linformation
hiding, cio il mascheramento dellinformazione. Ci significa che non
necessario conoscere alcune informazioni sulloggetto per poterlo utilizzare.
Linsieme dei messaggi inviati alloggetto costituisce la sua interfaccia.

Esempio: oggetto Automobile

CAMBIA
AVVIATI
MARCIA
velocit
colore
carburante

GIRA Implementazione ACCELERA


metodi

FERMATI
108

I linguaggi di programmazione ad oggetti offrono due tipi di sezioni, al fine di


distinguere ci che un oggetto vuole mostrare allesterno da ci che vuole
tenere nascosto:

1) Sezione pubblica: in essa vengono collocati attributi e metodi che si


vuole rendere visibili e utilizzabili da altri oggetti
2) Sezione privata: in essa gli attributi e i metodi non sono visibili e
accessibili, ma vengono usti solo dalloggetto che li incorpora.

LE CLASSI

Diversi oggetti possono avere stessi attributi e metodi e si dice in questo caso
che questi oggetti appartengono ad una stessa CLASSE. In sostanza una
classe rappresenta un modello che descrive una serie di oggetti. Un oggetto
non pu esistere se prima non viene creata una classe a cui lo stesso deve
appartenere; in questi casi loggetto viene detto istanza della classe. La
creazione di un oggetto a partire da una classe si indica in pseudo codifica nel
seguente modo:

CREA OGGETTO X DI TIPO A

Esempio: Classe Automobile


Oggetti: Auto1, Auto2

Gli attributi possono cambiare mentre i metodi sono gli stessi. La struttura
generale di una classe la seguente:

<nome classe>

<attributo1>
<attributo2>

<metodo1>
<metodo2>

Nel caso della classe Automobile abbiamo:


109

Automobile

velocit
colore
numero Porte
livello
carburante
posizione Marcia

avviati
fermati
accelera
gira
cambia Marcia
rifornisciti

La creazione degli oggetti la seguente:

CREA OGGETTO Auto1 DI TIPO Automobile


CREA OGGETTO Auto2 DI TIPO Automobile

Alcune caratteristiche di Auto1 sono:


Auto1.colore = blu
Auto1.numeroPorte = 5

Alcuni metodi possono essere:


Auto2.avviati( )
Auto2.accelera( )

Esistono particolari classi dette astratte che hanno la particolarit di avere


almeno un metodo che non stato implementato ma solo definito. Poich il
metodo non possiede codice, non sa come comportarsi qualora venga chiesta la
sua implementazione; in sostanza non esistono oggetti.
Le classi astratte sono generalmente usate per elencare le operazioni di
unintera gerarchia di classi, mentre le implementazioni saranno compiute
dalle sottoclassi, che sono classi derivate da altre classi per mezzo della
cosiddetta ereditariet, che studieremo tra poco. La classe generatrice di una
sottoclasse si chiama sopraclasse. Una gerarchia di classi si pu
rappresentare graficamente mediante il grafo di gerarchia.
La sottoclasse eredita dalla sopraclasse tutti gli attributi e i metodi e si
differenzia dalla sopraclasse in due modi:

1) Per estensione: la sottoclasse aggiunge nuovi attributi e metodi che si


sommano a quelli gi esistenti.
110

2) Per ridefinizione: in questo caso si crea un nuovo metodo con lo stesso


nome di quello ereditato ma con funzionalit diversa. In questo caso si
verifica il cosiddetto overridding o sovrascrittura del metodo.

LEREDITARIET

Lereditariet lo strumento che permette di costruire nuove classi utilizzando


quelle gi esistenti. Esistono due tipi di ereditariet:

1) Singola: essa si verifica quando una sottoclasse deriva da una sola


sopraclasse, che a sua volta pu per essere ereditata da pi classi.

SOPRACLASSE

SOTTOCLASSE SOTTOCLASSE

2) Multipla: in questo caso una classe deriva da una o pi classi, con la


conseguente fusione di attributi e metodi.

MEZZI DI TRASPORTO ANIMALI

CAVALLO

Esempio: consideriamo le tre classi Mezzi di trasporto, Veicoli a motore,


Autobus.
La prima possiede come attributi Velocit, ServePatente, NumPersone.
La seconda possiede come attributo consumo e come metodi Spegni,
Accelera, Frena.
La terza possiede come attributi PostiASedere, PrezzoBiglietto e come metodi
ApriPorte, PrenotaFermata e Accelera.
La classe Veicoli a Motore sottoclasse di Mezzi di trasporto ed sopraclasse
di Autobus.
La creazione degli oggetti la seguente:
111

CREA OGGETTO Mezzo DI TIPO Veicoli a Motore


CREA OGGETTO bus42 DI TIPO Autobus

Loggetto bus42, ereditando attributi e metodi da Mezzi di trasporto, Veicoli a


motore e Autobus, avr ad esempio:

Velocit = 80 ereditata da Mezzi di trasporto


ServePatente = si ereditata da Mezzi di trasporto
NumPersone = 65 ereditata da Mezzi di trasporto
Consumo = 10 ereditata da Veicoli a motore
PostiASedere = 20 ereditata da Autobus
PrezzoBiglietto = 0,9 ereditata da Autobus

Esempi di operazioni applicate a bus42 possono essere:

bus42.Numpersone = 65
bus42.Accendi( )

Un vantaggio dellereditariet quello di consentire il riutilizzo del software


gi creato, con laggiunta di eventuali elementi.

IL POLIMORFISMO

Il polimorfismo indica la possibilit per i metodi di assumere forme diverse


allinterno della gerarchia delle classi. A titolo di esempio, osserviamo che sia
loggetto Auto sia loggetto Moto possiedono il metodo Accelera, ma esso si
manifesta in due modi differenti, cio per mezzo della pressione del pedale per
quanto riguarda lAuto e attraverso il movimento del manubrio per la Moto. Il
polimorfismo si realizza mediante un collegamento dinamico, ossia il metodo
da eseguire avviene durante lesecuzione.

LA PERSISTENZA

La persistenza si realizza registrando loggetto nella memoria di massa. Un


oggetto si dice persistente se sopravvive alla singola esecuzione e pu quindi
essere utilizzato in unaltra sessione di lavoro. In modo molto semplice, la
persistenza non altro che il salvataggio su disco degli attributi con il loro
valore.
112

METODOLOGIA ORIENTATA AGLI OGGETTI

Per la costruzione di un programma OOP occorre:

1) Identificare gli oggetti caratterizzanti il problema


2) Definire le classi con gli attributi e i metodi
3) Stabilire le interazioni tra oggetti

Non tutti i linguaggi possono essere definiti OOP, ma solo quelli che forniscono
i costrutti per gestire gli oggetti, le classi e lereditariet.
I linguaggi di tipo OOP si distinguono in :

1) Puri: in questi tipi di linguaggio, ogni cosa rappresenta un oggetto,


persino un numero intero. Un esempio di linguaggio puro lo
SmallTalk.
2) Ibridi: in questo caso esistono tipi di dato astratto (TDA) che non sono
oggetti, come ad esempio int, char, float. Tra i linguaggi ibridi troviamo
il C++ e il Java, che affronteremo nei prossimi capitoli ed un
linguaggio molto adatto alla creazione di programmi eseguibili
attraverso i browser sulla rete Internet.

Esercizi

1) Come viene rappresentata graficamente una classe?


a) Con il diagramma degli oggetti
b) Con il diagramma delle classi
c) Con il grafo delle classi
d) Con il grafo di gerarchia

2) Con quale strumento viene offerta la possibilit di creare nuove classi


estendendo classi gi esistenti?
a) Incapsulamento
b) Ereditariet
c) Polimorfismo
d) Astrazione

3) Quale tra queste definizioni corrisponde al termine polimorfismo?


a) La possibilit per i metodi di assumere forme diverse
b) La possibilit per un oggetto di avere diversi metodi
c) La possibilit di poter creare pi oggetti diversi
d) La possibilit che una classe sia derivata da pi sopraclassi

4) Descrivere le caratteristiche dei seguenti oggetti; harddisk, computer,


stampante.
113

5) Descrivere una radiosveglia indicando le sue caratteristiche e i suoi


comportamenti.

6) Descrivere due o pi oggetti televisore usando il diagramma delle classi e


successivamente creare unistanza della classe televisore, assegnando i
valori agli attributi, usando la pseudocodifica. Indicare sempre mediante
pseudocodifica, quali messaggi possono essere inviati da un oggetto
telecomando ad un oggetto televisore.

7) Elencare le possibili sottoclassi della classe edificio.

8) Sfruttando il seguente diagramma delle classi e usando la pseudo


codifica, creare due quadrati rispettivamente di lato 4 e 7 e calcolare il
perimetro.

Quadrato

lunghezzaLato
colore

sposta
calcolaPerimetro

9) Considerare loggetto autoradio e descrivere la sua interfaccia.

10)Dare una descrizione di due elettrodomestici mediante diagramma delle


classi.

11)Usando il diagramma delle classi, descrivere un forno a microonde,


indicando i possibili attributi e metodi. Successivamente creare
unistanza della classe Microonde, impostare la marca del forno,
impostare il tempo di cottura a 2 minuti, iniziare la cottura, aprire lo
sportello.
114

CAPITOLO XVI
IL LINGUAGGIO JAVA

Java un linguaggio ad alto livello di tipo OOP, per usi generali ma


soprattutto per applicazioni destinate a circolare in rete, come le APPLET,
eseguibili allinterno delle pagine web, e applicazioni portabili, cio in grado
di girare e funzionare su piattaforme differenti. Quando viene compilato il
codice sorgente scritto in Java, il compilatore produce il codice compilato, detto
bytecode, generato per una macchina stratta detta virtual machine.
Lambiente di programmazione Java include un insieme di librerie che
contengono classi e metodi, conosciuti come:

1) java.lang, che contiene le classi base comuni a tutte le applicazioni


2) java.io , che consente gli accessi ai file e gestisce linput/output.
3) java.net, che funge da supporto per applicazioni in rete
4) java.util, che gestisce utilit varie come data o strutture dati

In Java non sono utilizzati i file di header (include), le clausole (# define) e la


parola chiave typedef; non esistono neanche le funzioni, viste nel C, che
vengono sostituite dai metodi. Java riserva molta attenzione ai tipi di dato,
infatti non si pu assegnare ad una variabile il valore di unaltra variabile di
tipo diverso, dovendo cos fare ricorso al casting o conversione tra variabili.

Esempio: int intero;


double reale;
reale = 3.14159
intero = reale;

In questo caso il compilatore segnala un errore. Il frammento di codice esatto


il seguente:
int intero;
double reale;
reale = 3.14159
intero = (int)reale;

Anche i puntatori, che trovavano largo impiego nel linguaggio C, vengono ora
soppiantati dagli oggetti, rendendo il codice sicuramente pi semplice e
dinamico.

STRUTTURA DI UN PROGRAMMA JAVA

In Java un applicazione pu essere costituita da una o pi classi. Tra tutte le


classi, una sola possiede il metodo main( ), poich lesecuzione incomincia
115

proprio con questo metodo. Un semplice programma Java, composto da una


sola classe il seguente:

class <nome classe> {


public static void main(String args[ ]) {
// dichiarazione variabili
// istruzioni
}
}

Vediamo il significato delle parole usate nel programma appena visto:

public indica che il metodo visibile


void indica che non ci sono valori di ritorno
static indica che il metodo associato alla classe e non pu essere
richiamato dai singoli oggetti della stessa

Vediamo ora un programma che stampa a video un messaggio:

public class Messaggio {


public static void main(String[ ] args) {
System.out.printl(Salve, mondo!);
}
}

System.out.printl( ) il metodo che scrive sullo standard output I suoi


argomenti e dopo torna a capo. importante sottolineare che Java un
linguaggio di tipo case sensitive, cio considera differenti le lettere maiuscole
dalle minuscole.

GLI IDENTIFICATORI

Gli identificatori e i tipi di dato sono nomi attribuibili alla variabili, ai metodi e
alle classi e sono composti da lettere e numeri, dove il primo carattere deve
obbligatoriamente essere una lettera. Questi nomi non possono essere uguali
alle parole chiave del linguaggio, che i buona parte sono le stesse viste nel
linguaggio C.

VARIABILI , COSTANTI E TIPI DI DATO

Le variabili sono contenitori in grado di memorizzare i dati e sono


caratterizzati da tipo, nome e visibilit. In Java la dichiarazione la
seguente:

<tipo> <nome variabile>


116

Esempio: int prezzo = 60

Il tipo di dato stabilisce linsieme dei valori e delle operazioni accettabili da


una variabile. In Java i tipi di dato si distinguono in:

1) Tipi primitivi: sono numerici, carattere e booleani.


2) Tipi riferimento: sono gli array e le classi.

Il tipo di dato booleano si indica con la parola chiave boolean e le variabili


dichiarate in questo modo possono contenere solo i valori true e false.

Esempio: boolean trovato = true;

Per quanto riguarda gli operatori, essi sono gli stessi utilizzati in C.
Le stringhe possono essere concatenate tra loro mediante loperatore di
concatenazione +.
System.out, gi visto prima, un oggetto associato allo standard output al
quale viene spedito il metodo println( ). In alcuni casi pu essere usato anche il
metodo print( ), ma esso non effettua il ritorno a capo.
Per le operazioni di input, invece, esiste loggetto System.in, che gestisce il
flusso di dati inseriti da tastiera ed obbligatorio non usarlo da solo, ma
assieme ad altri oggetti pi potenti ne seguente modo:

InputStreamReader input = new InputStreamReader(System.in);


BufferedReader tastiera = new BufferedReader(input);

In sostanza viene definito un oggetto tastiera di classe BufferedReader, usando


loperatore new. La precedente classe mette a disposizione il metodo readLine()
, che consente di leggere una riga per volta.

Per effettuare la lettura di una stringa, bisogna scrivere nel seguente modo:
String nome;
nome = tastiera.readLine( );

Per effettuare la lettura di numeri bisogna scrivere:


String leggiNumero;
int num;
try {
leggiNumero = tastiera.readLine( );
num = Integer.valueOf(leggiNumero).intValue( );

}
catch(Exception e) {
System.out.println("\nNumero non corretto!");
return;
}
117

Nellesempio che segue, viene effettuata la media di tre numeri interi letti da
tastiera:

import java.io.*;
public class Esempio {
public static void main(String[ ] args) {
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader tastiera = new BufferedReader(input);
int eta1, eta2, eta3;
int media;
System.out.println("Persona 1 ****************");
System.out.print("Eta': ");

try {
String numeroLetto = tastiera.readLine();
eta1 = Integer.valueOf(numeroLetto).intValue();

}
catch(Exception e) {
System.out.println("\nNumero non corretto!");
return;
}

System.out.println("Persona 2 ****************");
System.out.print("Eta': ");
try {
String numeroLetto = tastiera.readLine( );
eta2 = Integer.valueOf(numeroLetto).intValue( );

}
catch(Exception e) {
System.out.println("\nNumero non corretto!");
return;
}

System.out.println("Persona 3 ****************");
System.out.print("Eta': ");

try {
String numeroLetto = tastiera.readLine( );
eta3 = Integer.valueOf(numeroLetto).intValue( );

}
catch(Exception e) {
System.out.println("\nNumero non corretto!");
return;
}
118

media = (eta1 + eta2 + eta3)/3;


System.out.println("\nEt media: " + media);
}
}

LE STRUTTURE DI CONTROLLO

Le strutture di controllo in Java sono identiche a quelle viste nel linguaggio C.


La particolarit di un programma Java che esso pu essere interrotto in
qualsiasi momento, usando la combinazione di tasti Ctrl+C. Spesso pu
capitare di scrivere un programma con strutture iterative che diventano dei
loop infiniti nei casi in cui la condizione del ciclo si mantiene vera. Il seguente
frammento di programma un loop infinito:

while (true) {
// istruzioni
}

GLI ARRAY

Come abbiamo visto nel linguaggio C, larray viene indicato da un unico nome
collettivo, dove ogni elemento individuato da un indice. In Java, la
dichiarazione di un array pu essere del tipo predefinito (int, float), oppure pu
essere una classe (String, Automobile). Si possono creare array contenenti un
insieme di oggetti tutti della stessa classe. Lallocazione di un array viene
eseguita utilizzando loperatore new.

Esempio: i = new int[5];


nomi = new String[10];

Un array mantiene al suo interno linformazione sulla sua dimensione,


richiamata dalla funzione lenght. Nellesempio precedente i.lenght restituisce
il valore 5, mentre nomi.lenght restituisce 10.

Esempio: Scrivere un programma che stampa tutti i parametri passati.

import java.io.*;
public class parametri {

public static void main(String args[ ]) {


System.out.println("Elenco parametri:");

if(args.length == 0) {
System.out.println("Nessun parametro");
119

return;
}
for(int i = 0; I < args.length; i++) {
System.out.println(args[i]);
}
}
}

LE ECCEZIONI

Uneccezione una situazione anomala che si verifica durante lesecuzione del


programma. Ne un esempio la divisione per zero, oppure lutilizzo in un array
di un indice maggiore della sua dimensione. Il programma pu tenere sotto
controllo certe parti di codice con lausilio di particolari costrutti:

try {
// istruzione da controllare
}
catch (eccezione) {
// operazioni da eseguire se leccezione si verifica
}

Nell esempio seguente viene mostrato limpiego del costrutto try.catch in un


programma che esegue una divisione con divisore uguale a zero:

import java.io.*;
public class Eccezione {

public static void main(String args[ ]) {


int a;
int divisore = 0;

try {
a = 15/divisore;
}
catch(ArithmeticException e) {
System.out.println("Divisione impossibile");
return;
}
}
}
120

Esempio: dati in input 10 voti di uno studente, segnalare se il voto negativo,


sufficiente o positivo.

import java.io.*;
public class Voti {
public static void main(String argv[ ] ) {
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader tastiera = new BufferedReader(input);

final int numeroVoti = 10;


int voto;
String testo;
for (int i = 0; i < numeroVoti; i++) {
System.out.print("Voto numerico: ");
try {
String votoLetto = tastiera.readLine( );
voto = Integer.valueOf(votoLetto).intValue( );
}
catch(Exception e) {
System.out.println("Voto non valido!");
i ;
continue;
}
if (voto < 6) {
testo = "negativo";
}
else if (voto == 6) {
testo = "sufficiente";
}
else {
testo = "positivo";
}
System.out.println("Hai ricevuto un voto " + testo);
}
}
}

Esercizi

1) Scrivere un programma che restituisce il seguente output a video:


TITOLO:
La divina commedia
AUTORE:
D.Alighieri
121

2) Scrivere un programma che stampa i primi 100 numeri pari.

3) Scrivere un programma che legge da tastiera due valori di tipo double ed


esegue la divisione , restituendo il risultato sullo schermo.

4) Dati due numeri compresi tra 0 e 49, generati casualmente, stampare il


numero pi grande. (Suggerimento: in questo esercizio bisogna usare
listruzione Math,random( ), contenuta nella classe Math e che restituisce
un numero casuale di tipo double compreso tra 0.0 e 1.0. In questo caso
bisogner scrivere int numero = (int)(Math.random( ) *50);
Se ad es. il numero compreso tra 0 e100 bisogna moltiplicare per 100).

5) Generare 5 numeri casuali reali e compresi tra 0 e 1, e calcolarne la


media.

6) Una scuola composta da N classi. Per ogni classe viene inserito da


tastiera il numero di studenti. Calcolare quanti studenti frequentano la
scuola e in media quanti studenti ci sono per classe.

7) Scrivere un programma che riceva in input la base e laltezza di un


rettangolo e ne restituisca larea.

8) Scrivere un programma che continua a chiedere numeri finch viene


inserito lo zero. Alla fine indica quanti sono stati i numero positivi e i
negativi inseriti.

9) Scrivere un programma che legge da tastiera il nome e il cognome di una


persona e restituisce a video il nome completo.

10)Scrivere un programma che consenta di inserire 5 nomi di citt e e


relativo numero di abitanti e restituisca la citt maggiormente popolata.

11)Data la velocit espressa in Km/h, effettuare la conversione in m/s.

12)Un anno bisestile se divisibile per 4 ma non per100. Sono per


bisestili anche gli anni divisibili per 400. Scrivere un programma che,
inserendo un anno da tastiera, risponda se bisestile o no.
122

CAPITOLO XVII
GLI OGGETTI IN JAVA

DICHIARAZIONE DI UNA CLASSE

Nel linguaggio Java tutte le parti di un programma si trovano allinterno di


una classe, realizzando in questo modo il concetto di incapsulamento visto
precedentemente. Nei programmi visti nel capitolo quindicesimo, abbiamo
visto che main era lunico metodo presente ed inserito in una classe, mentre in
realt un programma Java di solito composto da pi classi. In sostanza, su
disco, ogni classe viene salvata in file separati con estensione .class e con il
main sempre presente. La struttura di base di una classe la seguente:

class < nome_classe > {


// attributi
// metodi
}

Ogni classe viene memorizzata in un file con estensione .java. Una volta
dichiarata una classe, pu essere stabilito il livello di visibilit per accertare da
quale punto del programma possibile creare delle istanze della stessa. Questi
livelli sono:

1) Public: una classe dichiarata pubblica pu essere usata da tutte le


classi e la sua struttura la seguente:

public class < nome_classe > {


}

2) Abstract: una classe dichiarata astratta incompleta e con alcuni


metodi anche essi astratti. Una classe di questo tipo non pu essere
istanziata e viene usata esclusivamente per creare sottoclassi con
metodi astratti. La struttura la seguente:

abstract class < nome_classe > {


}

3) Final: una classe dichiarata final non pu avere sottoclassi e la sua


dichiarazione la seguente:

final class < nome_classe > {


}
123

Se non esiste alcun livello di visibilit, significa che la classe pu essere usata
da tutte le classi allinterno della libreria in cui stata definita.

DICHIARAZIONE DEGLI ATTRIBUTI

Gli attributi sono le variabili dichiarate nel blocco di una classe. La


dichiarazione del tipo:

<tipo> <nome_variabile>

Esempi: int a; double b = 15.76;

Se ad un attributo non viene associato nessun valore di inizializzazione, il


sistema inizializza lattributo a seconda del tipo. Nella dichiarazione si pu
aggiungere un livello di visibilit che stabilisce se un attributo accessibile da
altre classi. I livelli sono:

1) Public: in questo caso gli attributi sono accessibili da qualsiasi classe


2) Private: gli attributi vengono nascosti nelloggetto
3) Protected: lattributo viene visto allesterno solo dalle classi
appartenenti alla stessa libreria

Gli attributi possono avere anche altre due caratteristiche:

1) Static: sono attributi legati alla classe e di cui esiste una sola copia
2) Final: gli attributi vengono resi delle costanti

Esempio: dato il seguente diagramma di classe, implementare la classe


corrispondente nel linguaggio Java.

Cornice
larghezza
altezza
peso

class Cornice {
private int larghezza, altezza;
public float peso;
}

N.B: la classe appena vista, non contenendo il metodo main, non pu essere
considerata un vero programma, per pu essere usata in altre classi.
124

DICHIARAZIONE DEI METODI

I metodi sono la parte dinamica di una classe e implementano le sue


operazioni, modificando anche gli attributi. La dichiarazione la seguente:

<livello_visibilit><tipo_restituito><nome_metodo>(<parametri>) {
// variabili
// istruzioni
}

Esempio: dichiarazione di un metodo che esegue la somma di due numeri


passati come parametri.

public int somma(int a, int b) {


int sum;
sum = a + b;
return sum;
}

N.B: le variabili usate allinterno dei metodi vengono dette locali.

Esempio: dichiarazione non corretta di classe

class coppia {
int a,b;
System.out.println(coppia = +a+ , +b);
}

La dichiarazione corretta la seguente:

class coppia {
int a,b;
void stampa( ) {
System.out.println(coppia = +a+ , +b);
}
}
125

Esempio: calcolare la media delle temperature di 5 citt.

class temp {
private float temperatura[ ] = new float[5];
public float media( ) {
float somma = 0;
for (int i = 0; i < temperatura.length; i++) {
somma = somma + temperatura[i ];
}
return (float) somma/ temperatura.length;
}
}

Esempio: scrivere un programma che genera numeri casuali minori di 20. La


ripetizione termina quando viene generato il numero 4.

import java.io.*;
public class Esempio {
public static void main(String argv[ ] ) {
int numero = 0;
while(numero >= 0) {
numero = (int) (Math.random( )*20);
System.out.println(numero);
if(numero == 4)
return;
}
System.out.println("Questa istruzione non verr mai eseguita");
}
}

N.B. I parametri possono essere passati solo per valore!

Nel linguaggio Java troviamo particolari metodi detti costruttori che vengono
eseguiti automaticamente ad ogni creazione di un nuovo oggetto e che servono
di solito ad inizializzare lo stesso. Un costruttore ha lo stesso nome della
classe, non ha valore di ritorno e non deve essere dichiarato void.

Esempio: class coppia {


private int numero, successore;
public coppia (int num) {
numero = num;
successore = numero + 1;
}
}
126

CREAZIONE ED USO DI OGGETTI

Gli oggetti, come abbiamo detto in precedenza, non costituiscono un vero e


proprio programma, ma devono essere utilizzati al suo interno. La creazione di
un oggetto pu avvenire negli stessi punti in cui dichiarata una variabile. Per
lallocazione di un oggetto viene usato loperatore new, seguito dal nome della
classe.
Ad esempio, se abbiamo la classe Libro, possiamo dichiarare una sua istanza
come Libro mate. Lallocazione sar quindi:
mate = new Libro(25); dove il numero 25 leventuale parametro da passare al
costruttore della classe ed esso pu anche non esistere.
Dopo lallocazione delloggetto bisogna definire il costruttore della classe e, se
esso prevede parametri, questi sono collocati tra parentesi dopo loperatore
new. Lesempio seguente mostra la creazione di un oggetto allinterno di un
programma:

class Esempio {
public static void main(String argv[ ]) {
Libro mate; // dichiarazione
Mate = new Libro(25); // allocazione
// dichiarazioni e/o istruzioni
}
}

Dopo la creazione delloggetto, si pu accedere ai suoi attributi nel seguente


modo:

< oggetto>. <attributo>

Esempio: calcolare la somma spesa per lacquisto di tre libri.

class Libro {
public int prezzo;
public Libro (int pr) {
prezzo = pr;
}
}

public class Esempio {


public static void main(String argv[ ]) {
Libro storia, mate, info;
int totale;
storia = new Libro(25);
mate = new Libro(33);
info = new Libro(27);

System.out.println("Il libro di storia costa " +storia.prezzo);


127

System.out.println("Il libro di matematica costa " +mate.prezzo);


System.out.println("Il libro di informatica costa " +info.prezzo);

totale = storia.prezzo + mate.prezzo + info.prezzo;


System.out.println("\nIl prezzo totale e' " +totale);

}
}

Si pu definire int pr con lo stesso nome della variabile, per in questo caso
lattributo deve essere preceduto dalla parola chiave this. Come si pu vedere
nelle tre righe di programma

System.out.println("Il libro di storia costa " +storia.prezzo);


System.out.println("Il libro di matematica costa " +mate.prezzo);
System.out.println("Il libro di informatica costa " +info.prezzo);

un oggetto vuole comunicare con un altro per eseguire unazione, inviandogli


un messaggio. Loggetto che precede il punto il destinatario del messaggio,
mentre il metodo il selettore.

Esempio: calcolare la misura della circonferenza e larea di due cerchi.

class cerchio {
protected double raggio;
public cerchio (double r) {
raggio = r;
}
public void setRaggio (double r) {
raggio = r;
}
public double Circonferenza( ) {
double circ = 2 *raggio * Math.PI;
return circ;
}
public double Area( ) {
return (raggio*raggio*Math.PI);
}
}
public class Progcerchio {

public static void main (String argv[ ] ) {


cerchio c = new cerchio(5.5);

double area;
System.out.println("Primo cerchio.");
128

System.out.println("Circonferenza = " +c.Circonferenza( ));


area = c.Area( );
area = (double) Math.round (area*1000)/1000;
System.out.println("Area = " +area);
c.setRaggio(8.0);
System.out.println("Secondo cerchio.");
System.out.println("Circonferenza = " +c.Circonferenza( ));
System.out.println(Area = +area);
}
}

In questo programma stato utilizzato il metodo Math.round, che effettua un


arrotondamento del numero.
Diverse variabili possono riferirsi allo stesso oggetto attraverso luguaglianza
do oggetti.

Esempio:
Libro l1 = new Libro(21);
Libro l2 = l1;

Se creiamo unaltra variabile 13 = new Libro(21) avremo che:


l1 == l3 falsa perch vengono confrontati i riferimenti e non i contenuti.

ATTRIBUTI E METODI STATIC

Un attributo di tipo static legato alla classe, cio vengono creati diversi
oggetti per quella classe ed esiste una sola copia dellattributo, condiviso da
tutte le istanze della classe. Un esempio costituito dallattributo PI (pi greco)
nella classe Math e visto nel precedente programma. Una dichiarazione pu
essere la seguente:

public static final double PI;

I metodi statici vengono richiamati senza creare un oggetto di una classe e la


loro dichiarazione :

<nome_classe>. <metodo_static>

Un esempio il metodo random( ), la cui dichiarazione pu essere:


public static double random( );

ARRAY DI OGGETTI

Diversi oggetti si possono raggruppare per creare degli array di oggetti, cio
array i cui oggetti sono istanze della classe. In riferimento alla classe Libro,
129

vista precedentemente possiamo dire che, se vogliamo creare un array di 10


libri, si procede cos:

Libro collezione[ ] = new Libro[10]; devono essere allocati anche gli oggetti:

collezione[0] = new Libro[26];


collezione[1] = new Libro[19];

EREDITARIET

In Java esiste solo lereditariet singola, cio ogni classe pu avere al pi una
sopraclasse. Una sottoclasse si dichiara aggiungendo nellintestazione il nome
della sopraclasse, con la parola chiave extends. Il prototipo di dichiarazione
il seguente:

class <sottoclasse> extends <sopraclasse> {


.
}

Esempio: class a {
public int numA;
}
class b extends a {
public int numB;
}

Se abbiamo un oggetto creato nella classe b in questo modo:


b oggB = new b( ); esso pu accedere sia a numB sia a numA cos:
oggB.numB = 10;
oggB.numA = 5;

Esempio: creare la classe cilindro usando la classe cerchio gi utilizzata nel


programma progCerchio.
Cerchio
raggio

setRaggio
Circonferenza
Area

Cilindro
altezza

volume
130

Nellesempio seguente viene usata la parola chiave super, che si riferisce alla
sopraclasse della classe in cui viene utilizzata.

Esempio: creare una classe cilindro e scrivere il programma per stampare larea
del cerchi e il volume del cilindro.

class cerchio {
protected double raggio;
public cerchio(double r) {
raggio = r;
}
public void setRaggio(double r) {
raggio = r;
}
public double Area( ) {
return (raggio*raggio*Math.PI);
}
}
class cilindro extends cerchio {
private double altezza;
public cilindro(double raggio, double altezza) {
super(raggio);
this.altezza = altezza;
}
public double Volume( ) {
double vol = Area( ) * altezza;
return vol;
}
}
public class Cilindro {
public static void main(String argv[ ]) {
cerchio c = new cerchio(5.5);
cilindro cil = new cilindro(5.5,7.0);
double area;
double volume;
System.out.println("Area cerchio:");
area = c.Area();
area = (double) Math.round(area*1000)/1000;
System.out.println("Area = "+area);
c.setRaggio(8.0);
volume = cil.Volume( );
System.out.println("Volume cerchio = " +volume); } }
131

IL POLIMORFISMO

Le sottoclassi, oltre ad ereditare i metodi e gli attributi delle sopraclassi,


possono aggiungere nuovi attributi e metodi. In questo contesto abbiamo
loverridding, che consiste nel ridefinire un metodo ereditato allo scopo di
modificarne il comportamento. Il nuovo metodo deve avere lo stesso nome e gli
stessi parametri del metodo sovrascritto.
Con il termine overloading invece, si intende la possibilit di utilizzare lo
stesso nome per compiere operazioni diverse. Un esempio di overloading il
metodo println, che pu assumerw comportamenti diversi, tipici del
polimorfismo. Loverloading anche usato per offrire pi costruttori.

Esempio: class numero {


private int num;
public numero( ) {
num = 0;
}
public numero (int num) {
this.num = num;
}
}

Esempio: overridding del metodo Area nella classe cilindro, per calcolare la
superficie totale di un cilindro.

class cerchio {
protected double raggio;
public cerchio(double r) {
raggio = r;
}
public void setRaggio(double r) {
raggio = r;
}
public double Area( ) {
double AreaCer;
AreaCer = raggio*raggio*Math.PI;
return AreaCer;
}

public double Circonferenza( ) {


double circ = 2*raggio*Math.PI;
return circ;
}
}
class cilindro extends cerchio {
private double altezza;
132

public cilindro(double raggio, double altezza) {


super(raggio);
this.altezza = altezza;
}
public double AreaTot( ) {
double supBase, supLaterale;

supBase = Area( )*2;


supLaterale = Circonferenza( )*altezza;
return supBase + supLaterale;
}

}
public class CilLaterale {
public static void main(String argv[ ]) {
cerchio c = new cerchio(5.5);
cilindro cil = new cilindro(5.5,7.0);
double area;
double supTotale;
System.out.println("Area cerchio:");
area = c.Area();
area = (double) Math.round(area*1000)/1000;
System.out.println("Area = " +area);
c.setRaggio(8.0);
supTotale = cil.AreaTot( );
System.out.println("Superficie totale = " +supTotale);

}
}

Un oggetto di classe numero pu essere creato in due modi:

numero n1 = new numero( ) senza parametri


numero n2 = new numero( ) con parametri

Una classe dichiarata final non potr avere sottoclassi.

Esempio: dichiariamo una classe final come final class ultima { }. Se scriviamo:
class nuova extends ultima { } commettiamo un errore. Anche i metodi possono
essere dichiarati usando la parola chiave final.

LE STRINGHE

In Java le stringhe sono un tipo di dato predefinito e usano la classe String


inclusa nel package java.lang, utilizzato per creare oggetti che rappresentano
array di caratteri. Dopo aver fissato la dimensione della stringa, essa non pu
133

pi essere modificata, a meno che non si crei un nuovo oggetto. Mediante la


classe String possibile contare i caratteri, leggerli o modificarli, creare
sottostringhe, effettuare conversioni da maiuscolo a minuscolo e viceversa. Il
costruttore di String il seguente:

String s = new String ( ); oppure String s = aabbcc;

Le stringhe possono essere create anche usando i metodi contenuti in String e


che restituiscono un oggetto di classe String, come ad esempio:
String s1 = s.substring(1,4).

Loperatore di concatenazione tra stringhe loperatore matematico +.

Esempio: int a = 10;


String = Il numero +a + pari;

la rappresentazione della classe String, mediante il diagramma della classi


la seguente:

String

charAt(int)
equals(String)
length
substring(int,int)
toLowerCase
toUpperCase

Per vederne il funzionamento, applichiamo questi metodi alloggetto:


String s = Internet la rete delle reti;

1) Il metodo lenght restituisce la lunghezza della stringa, quindi s.length(


) restituisce il numero 29.
2) Il metodo charAt restituisce il carattere che si trova nella posizione
indicata dal parametro. Il primo carattere si trova in posizione 0 e
lultimo carattere si trova in posizione s.length( ) 1 . Nellesempio
specifico, abbiamo che s.charAt(2) restituisce la lettera t.
3) I metodi toLowerCase e toUpperCase convertono rispettivamente in
minuscolo e maiuscolo i caratteri. Quindi s. toUpperCase( ) restituisce la
frase INTERNET LA RETE DELLE RETI.
4) Il metodo substring restituisce una sottostringa della stringa a cui
applicato. Ad esempio String s1 = s.substring(15,19) restituisce la parola
rete.
134

5) Il metodo equals controlla se la stringa uguale a quella a cui viene


applicato. Il valore di ritorno di tipo booleano. Nel nostro esempio
s.equals(Internet) restituisce false.

Esempio: analizzare una frase inserita da tastiera, calcolando la frequenza


delle vocali e degli spazi bianchi.

import java.io.*;
public class Analisi {

public static void main(String argv[ ]) {


InputStreamReader input = new InputStreamReader(System.in);
BufferedReader tastiera = new BufferedReader(input);
String Testo = new String ( );
char Carattere;
int Vocali = 0;
int Spazi = 0;
double FreqVocali,FreqSpazi;
System.out.println("Inserisci il testo da analizzare:");
try {
Testo = tastiera.readLine( );
}
catch(IOException e) { }
Testo.toLowerCase( );
for(int i = 0 ; i < Testo.length( ); i++) {
Carattere = Testo.charAt(i);
switch(Carattere) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u': Vocali++;
break;
case ' ': Spazi++;
break;
}
}

System.out.println("\nNumero di caratteri= " +Testo.length( ));


System.out.println("\nNumero di vocali= " +Vocali);

FreqVocali=(double) Vocali/Testo.length( );
FreqVocali=(double) Math.round(FreqVocali*100)/100;

System.out.println("\tFrequenza di vocali= " +FreqVocali);


System.out.println("\nNumero di spazi= " +Spazi);
135

FreqSpazi = (double) Spazi/Testo.length( );


FreqSpazi = (double) Math.round(FreqSpazi*100)/100;

System.out.println("\tFrequenza di spazi= "+FreqSpazi);


}
}

Esercizi

1) Descrivere in Java la seguente classe:

Bicicletta

NumeroMarce
Peso

Il primo attributo deve essere privato, il secondo pubblico.


Successivamente estendere la classe Bicicletta con unaltra classe,
specificando due nuovi attributi.

2) Dichiarare un metodo pubblico chiamato moltip che restituisce un valore


di tipo int e riceve due parametri interi.

3) Descrivere in Java la classe Autobus.

4) Implementare un metodo che restituisce un numero casuale tra 1 e 90.

5) Descrivere la classe che calcola lipotenusa di un triangolo rettangolo,


dati in input cateti e scrivere il relativo programma.

6) Dati 20 nomi di persona, contare quelli che iniziano con la lettera M.

7) Creare una classe quadrato contenente: un attributo lato, un metodo per


calcolare il perimetro e uno per calcolare larea. Successivamente creare
una classe rettangolo che offra gli stessi metodi della classe quadrato.

8) Usando la classe del precedente esercizio, dati in input la base e


laltezza di 4 rettangoli, determinare larea e il perimetro maggiori.

9) Dichiarare una classe di nome casa che ha come attributi privati la


superficie e il numero di vani, e come attributi pubblici la via e il
numero civico.
136

10) Scrivere il codice Java che implementa la seguente classe:

Esagono

lato
apotema

perimetro
area

Successivamente scriverne il relativo programma.

11) Scrivere un programma che elenca le potenze di 2 a partire da 20 fino a


220. (Suggerimento: usare la classe Math.pow(int, int))

12) Dati 10 nomi di persona contare quelli che iniziano con una vocale.
137

CAPITOLO XVIII
LINTERFACCIA GRAFICA AWT

La parte di unapplicazione che interagisce con lutente si chiama interfaccia


grafica. Le interfacce si possono classificare in base agli strumenti che usano
per rapportarsi con lutente. Esse, quindi sono:

1) Interfacce a caratteri: esse sono molto semplici e visualizzano solo


caratteri che, di solito vengono introdotti da tastiera.
2) Interfacce grafiche: esse sono composte da immagini, bottoni, finestre
e sono dette anche GUI.

La videata degli schermi grafici composta da matrici di punti detti pixel, ai


quali sono associati i colori. La loro unione forma limmagine. Un punto
interno ad una videata viene indicato da una coppia di numeri (x, y) che sono
le coordinate. Lorigine (0,0) sullo schermo il punto in alto a sinistra.
Mediante lo spostamento verso destra si incrementano le x, mentre con lo
spostamento verso il basso si incrementano le y.
Nella figura sottostante viene mostrato il sistema di riferimento di uno
schermo di dimensioni 800x600. Il punto A che si trova nel centro dello
schermo ha coordinate (400, 300).

x
(0,0)

y A(400,300) 800 pixel

600 pixel

Il principale dispositivo di puntamento il mouse che fa muovere il puntatore


sullo schermo.
Lelemento principale di uninterfaccia grafica la finestra, che unarea
dello schermo contenente alcuni elementi grafici come i bottoni e che a volte
coincide con lintera videata. Un bottone pu essere etichettato come stringa o
immagine e di solito lazione associata al bottone coincide con la sua pressione.
Troviamo poi le caselle di testo che sono celle in cui si possono inserire righe
di testo, le caselle combinate, che mostrano alternative tramite caselle di
testo, incorporanti un menu a tendina, le caselle di controllo, che
permettono di effettuare scelte di tipo booleano e hanno la forma di un
quadratino.
Per costruire unapplicazione grafica, bisogna eseguire due operazioni:
138

1) Individuare gli elementi grafici che occorrono


2) Disporre tali elementi in una finestra. In sostanza, per lesecuzioni di
programmi che fanno uso di GUI, si passa da un output visualizzato in
MSDOS ad uno di tipo grafico, sicuramente pi complesso, ma con
maggiori facilitazioni nellinterazione con lutente.

PROGRAMMAZIONE GUIDATA DAGLI EVENTI

La programmazione guidata dagli eventi associa ad ogni interazione


dellutente, un evento che deve essere gestito richiamando unazione
appropriata. Un evento un avvenimento che pu manifestarsi senza
rispettare scadenze precise. Ad esempio, possibili eventi in una GUI possono
essere lapertura o chiusura di una finestra oppure la pressione di un bottone.
Dopo aver generato un evento, si deve provvedere alla sua gestione, affidata al
cosiddetto gestore degli eventi o handler, che risponde istantaneamente
allazione di un utente.

LA LIBRERIA AWT

In Java la parte grafica contenuta nel package java.awt, che deve essere
importato in ogni programma che preveda luso di uninterfaccia grafica. Una
GUI formata da due elementi principali:

1) Componente: essa un oggetto grafico che garantisce linterazione con


lutente e pu essere un bottone, un menu, una casella di testo oppure
una barra di scorrimento.
2) Contenitore: esso un oggetto che contiene le componenti, le quali
possono essere aggiunte o eliminate dal contenitore, grazie allausilio di
metodi appropriati. Un contenitore molto comune la finestra, costituita
da un titolo a da bottoni che gestiscono la chiusura, lapertura e il
ridimensionamento. Il contenitore e le componenti sono visti come
ununica entit, formando cos una gerarchia di componenti che ha come
padre la classe Component. Tale classe possiede come sottoclassi:
Button, Label, Canvas, Frame, Panel, TextArea e TextField. La
classe Component possiede anche una sottoclasse detta Container e
rappresenta i contenitori.

I CONTENITORI

Diamo di seguito lelenco dei contenitori pi comuni usati in Java:

FINESTRA: la finestra il contenitore principale, realizzata tramite la classe


Frame. I due costruttori della classe sono:
139

1) Frame ( ) che genera una finestra senza titolo


2) Frame (String) che genera una finestra il cui titolo viene specificato da
una stringa di testo.

Esempio: Frame f = new Frame( Titolo )

La finestra non visibile finch non viene richiamato il metodo


setVisible(boolean), che nel nostro caso diviene setVisible(true).
Per modificare le dimensioni di una finestra si usa il metodo setSize(int, int),
mentre il metodo setLocation(int, int) specifica la posizione iniziale della
finestra.

Esempio: creare una finestra vuota con il titolo

import java.awt.*;
public class Vuota {

public static void main(String argv[ ]) {

Frame f = new Frame("Finestra vuota");


f.setSize(500,500);
f.setLocation(100,0);
f.setVisible(true);
}
}

In questo modo si aprir una finestra che pu essere modificata ma non chiusa,
infatti levento di chiusura avviene solo se chiudiamo la finestra del dos che
appare assieme alleseguibile dellapplicazione.

Finestra vuota

Se si vogliono fissare le dimensioni di una finestra in modo da renderla non pi


ridimensionabile, si usa il metodo f.setResizable(false).

PANNELLO: il pannello un contenitore molto usato per raggruppare le


componenti ed inserirle in un altro contenitore. I pannelli sono rappresentati
dalla classe Panel ed esiste un unico costruttore, che il seguente:
140

Panel p = new Panel( );

Per inserire le componenti allinterno dei contenitori, si usa il metodo add, che
polimorfico. Se ad esempio si vuole aggiungere un pannello p ad una finestra
f si scriver: f.add(p);

Esempio: creare una finestra con sfondo verde.

import java.awt.*;
public class Sfondo {

public static void main(String[ ] args) {

Frame f = new Frame("Finestra con pannello");


Panel p = new Panel();
f.setSize(300,300);
p.setBackground(Color.green);
f.add(p);
f.setVisible(true);
}
}

Finestra con pannello

N.B. il metodo setBackground serve per modificare il colore di sfondo del


pannello p.

LE COMPONENTI

Le principali componenti, che possono essere inserite in una finestra sono:

ETICHETTE: le etichette vengono gestite dalla classe Label e possono


contenere solo una riga di testo non modificabile. I costruttori di tale classe
sono tre:

Label ( ), che crea unetichetta vuota.


Label(String) , che crea unetichetta con una strina passata come
parametro allineata a sinistra
141

Label(String, int) dove int indica la modalit di allineamento della


stringa che pu essere destro (Label.RIGHT), sinistro (Label.LEFT)
oppure centrato (Label.CENTER).

Le istruzioni per definire una stringa sono le seguenti:

a) Label vuota = new Label ( );


b) Label nome = new Label(Mario);
c) Label completa = new Label(Sono unetichetta, Label.CENTER);

le etichette possono essere aggiunte ad un pannello p, invocando pi volte il


metodo add, nel seguente modo:

p.add(vuota);
p.add(nome);
p.add(completa);
I metodi usati per le etichette sono i seguenti:

1) setText(String) , che modifica il contenuto del testo.


2) setForeground(Color) , che modifica il colore del testo.
3) set Background(Color) , che modifica il colore di sfondo.

BOTTONI: i bottoni vengono creati usando la classe Button e contengono una


stringa. Ogni bottone creato attivo e pu essere cliccato.

Esempio: Button OK = new Button(OK);

per disattivare il bottone si usa il metodo setEnabled(boolean), e quindi in


questo caso, scriveremo OK.setEnabled(false);

CASELLE DI TESTO: le caselle di testo vengono realizzate mediante la classe


TextField, che a sua volta sottoclasse della classe TextComponent. La
classe TextField crea una casella con una sola riga usata per operazioni di
input/output di stringhe. I costruttori di questa classe sono quattro:

1) TextField ( ) , che crea una casella senza contenuto e dimensione.


2) TextField(String), che crea una casella con dimensione pari alla
lunghezza della stringa.
3) TextField(int), che crea una casella con dimensione specificata dal
parametro.
4) TextField(String, int), che crea una casella con dimensione e contenuto.

Esempio: creare una maschera di input per inserire il nome di un oggetto e il


suo prezzo.
142

import java.awt.*;
public class Input {

public static void main(String[ ] args) {


Frame f = new Frame("Input");
Panel p = new Panel( );
TextField nome = new TextField(20);
TextField prezzo = new TextField("0",10);
p.add(new Label("Inserisci il nome: ", Label.RIGHT));
nome.setBackground(Color.yellow);
p.add(nome);
p.add(new Label("Inserisci il prezzo: ", Label.RIGHT));
prezzo.setForeground(Color.red);
p.add(prezzo);
f.add(p);
f.setSize(200,200);
f.setLocation(100,100);
f.setVisible(true);
}
}

Input
Inserisci il nome :

Inserisci il prezzo :

Esiste anche il metodo setText(String), che modifica il contenuto di una casella


di testo, e il metodo getText ( ) , che legge il contenuto di una casella.

AREE DI TESTO: le aree di testo sono create dalla classe TextArea e sono
formate da pi righe di testo.

Esempio: TextArea messaggi = new TextArea(10,30); definisce unarea di testo


di 10 righe e larga 30 caratteri.

I metodi a disposizione per la classe TextArea sono gli stessi visti per la classe
TextField, con laggiunta del metodo append(String), che consente di
inserire nuovo testo alla fine dellarea senza cancellare il contenuto esistente.
143

Esempio: aggiungere un testo di 20 righe e 50 colonne ad una finestra.

import java.awt.*;
public class Area {

public static void main(String[ ] args) {


Frame f = new Frame("Area di testo");
TextArea messaggi = new TextArea(20,50);
f.setSize(500,300);
f.setLocation(100,0);
f.add(messaggi);
f.setVisible(true);
}
}

Area di testo

AREA DI DISEGNO: esiste la possibilit di disegnare liberamente allinterno


di unarea di disegno, mediante la classe Canvas, che contiene il metodo
paint, richiamato in automatico. La classe appena citata consente di tracciare
linee, rettangoli, cerchi, al fine di visualizzare stringhe o immagini. La
struttura generale della classe la seguente:

import java.awt.*;
class area extend Canvas {
public void paint (Graphics g) {
// metodi
} }
144

Esempio: disegnare 5 linee parallele e scrivere un messaggio.

import java.awt.*;
class area extends Canvas {
public void paint(Graphics g) {
g.setColor(Color.red);
for(int i=1; i<=5; i++) {
g.drawLine(50, 10*i, 200, 20+10*i);
g.setColor(Color.blue);
g.drawString("LINEE PARALLELE", 50, 100);
}
}
}
public class Disegno {

public static void main(String argv[ ]) {


Frame f = new Frame("Disegno");
area a = new area( );
f.setSize(300,200);
f.setLocation(100,100);
f.add(a);
f.setVisible(true);
}
}

Disegno

LINEE PARALLELE

Il metodo setColor(Color) indica come parametro il colore da usare. Il metodo


drawLine(int, int, int, int) disegna una linea con colore impostato. Il metodo
drawString(String, int, int) aggiunge del testo ad unarea grafica.
145

CASELLE COMBINATE: le caselle combinate, dette anche combo box,


raggruppano un elenco di voci e consentono la scelta di una di esse, tramite un
menu a tendina. La classe che gestisce le caselle combinate Choice.
La creazione di una combo box avviene attraverso due fasi:

1) Creazione delloggetto di classe Choice.


2) Aggiunte di voci alloggetto.

Il costruttore non contiene parametri e il metodo usato addItem(String).


Il seguente esempio crea una casella combinata contenente lelenco di quattro
colori:

Choice colori = new Choice( );


colori.addItem(rosso);
colori.addItem(verde);
colori.addItem(bianco);
colori.addItem(arancione);

Input

rosso
rosso
verde
bianco
arancione

In Java il gestore dei contenitori si chiama Layout Manager, che deve essere
assegnato ad un contenitore, mediante il metodo set Layout, il quale riceve
come parametro un oggetto rappresentante il gestore. Per assegnare ad un
frame f il gestore FlowLayout si procede in questo modo:
f.setLayout(new FlowLayout ( ));
FlowLayout = new FlowLayout ( );
f.setLayout(gestore);

FLOWLAYOUT: questo gestore viene usato per disporre le componenti su una


stessa riga, una dopo laltra, centrate e separate.

Esempio: creare un pannello con tre bottoni.

Panel p = new Panel( );


Button b1 = new Button(b1);
146

Button b2 = new Button(b2);


Button b3 = new Button(b3);
p. setLayout(new FlowLayout ( ));
p.add(b1);
p.add(b2);
p.add(b3);

Bottoni

b1 b2 b3

BORDERLAYOUT: mediante questa classe, il contenitore viene diviso in 5


regioni: North, South, Center, East, West, dove la zona centrale occupa pi
spazio delle altre.

North

West Center East

South

Per usare questo gestore con i pannelli, si utilizza il metodo setLayout in


questo modo:

Panel p = new Panel( );


p. setLayout(new BorderLayout ( ));

Il metodo add riceve due parametri, che rappresentano il nome e la posizione,


come ad esempio: f.add(b, South);

GRIDLAYOUT: questa classe posiziona le componenti in una griglia simile ad


una tabella, formata da righe e colonne. Il costruttore di tale classe il
seguente:

GridLayout(int, int), che specifica il numero di righe e di colonne.


147

Esempio: creare uninterfaccia grafica per inserire il nome, cognome e numero


di telefono.

import java.awt.*;
public class Tabella {

public static void main(String argv[ ]) {

Frame f = new Frame("tabella");


TextField nome = new TextField(30);
TextField cognome = new TextField(30);
TextField telefono = new TextField(30);
f.setSize(200,120);
f.setLocation(100,100);
f.setLayout(new GridLayout(3,2,10,10));
f.add(new Label("Nome", Label.RIGHT));
f.add(nome);
f.add(new Label("Cognome", Label.RIGHT));
f.add(cognome);
f.add(new Label("Telefono", Label.RIGHT));
f.add(telefono);
f.setVisible(true);
}
}

Tabella

Nome

Cognome

Telefono

LA GESTIONE DEGLI EVENTI

Lobiettivo di chi gestisce uninterfaccia grafica al rapidit di risposta alle


azioni dellutente. La gestione degli eventi viene affidata solo a che si registra
come gestore. Questo tipo di modello viene detto a delegazione, poich il
programmatore delega chi pu essere abilitato a gestire un evento. Gli eventi
sono generati da un oggetto detto origine, come ad esempio un bottone, che
genera un evento alla sua pressione. Diversi ascoltatori possono registrarsi
148

nellorigine per essere avvisati della generazione di un evento. Un ascoltatore


un oggetto la cui classe deve avere un costruttore di tipo listener. Per la
gestione degli eventi si deve procedere alla:

1) Creazione degli ascoltatori nel seguente modo:

import.java.awt.event.*;
class GestoreFinestra implements WindowListener { }

Esempio: se si vuole chiudere una finestra:

public void windowClosing(WindowEvent e) {


System.exit(0);
}

2) Registrazione presso lorigine, che pu avvenire con lausilio di due


metodi:
a) addWindowListener, usato dalle finestre.
b) addActionListener, usato dai bottoni.

CHIUSURA DI UNA FINESTRA

Le applicazioni viste finora non consentono di chiudere una finestra che


normalmente viene aperta assieme alla videata del dos, se non mediante la
combinazione di tasti Ctrl+C. necessario quindi gestire levento di chiusura
di un frame.

Esempio: creare una finestra e registrare il gestore per gli eventi legati ad
essa.

import java.awt.*;
import java.awt.event.*;
public class Vuota1 {

public static void main(String argv[ ]) {


Frame f = new Frame("Finestra vuota");
f.setSize(200,200);
f.addWindowListener(new GestoreFinestra( ));
f.setVisible(true);
}
}

class GestoreFinestra implements WindowListener {


public void windowIconified(WindowEvent e) { }
public void windowDeiconified(WindowEvent e) { }
149

public void windowActivated(WindowEvent e) { }


public void windowDeactivated(WindowEvent e) { }
public void windowOpened(WindowEvent e) { }
public void windowClosed(WindowEvent e) { }
public void windowClosing(WindowEvent e) {
System.out.println("Programma terminato.");
System.exit(0);
}
}

PRESSIONE DI UN BOTTONE

Lunico evento riguardante un bottone la sua pressione. Linterfaccia


utilizzata ActionListener, e lunico metodo actionPerformed, che riceve
come parametro un oggetto di classe ActionEvent. Per acquisire lindicazione
delloggetto che ha generato levento, si usa il metodo getActionCommand( ).

Esempio: creare uninterfaccia con due bottoni e un area di testo. In base al


bottone premuto, viene stampato un messaggio nellarea di testo.

import java.awt.*;
import java.awt.event.*;
public class Bottoni {

public static void main(String[ ] args) {

Frame f = new Frame("Finestra vuota");


Button sup = new Button("Superiore");
Button inf = new Button("Inferiore");
TextArea a = new TextArea(50,10);
f.setSize(450,300);
f.add(sup, "North");
f.add(a, "Center");
f.add(inf, "South");
f.addWindowListener(new GestoreFinestra( ));
sup.addActionListener(new GestoreBottone(a));
inf.addActionListener(new GestoreBottone(a));
a.setEditable(false);
f.setVisible(true);
}
}
class GestoreBottone implements ActionListener {
private TextArea a;
public GestoreBottone(TextArea a) {
this.a = a;
150

}
public void actionPerformed(ActionEvent e) {
String bottone = e.getActionCommand( );
if(bottone.equals("Superiore")) {
a.append("E'statopremuto il bottone *superiore*.\n");
}
if(bottone.equals("Inferiore")) {
a.append("E' stato premuto il bottone *inferiore*.\n");
}
}
}
class GestoreFinestra implements WindowListener {
public void windowIconified(WindowEvent e) { }
public void windowDeiconified(WindowEvent e) { }
public void windowActivated(WindowEvent e) { }
public void windowDeactivated(WindowEvent e) { }
public void windowOpened(WindowEvent e) { }
public void windowClosed(WindowEvent e) { }
public void windowClosing(WindowEvent e) {
System.out.println("Programma terminato.");
System.exit(0);
}
}

Finestra vuota
Superiore
stato premuto il bottone superiore
stato premuto il bottone inferiore

Inferiore

LETTURA DA UNA CASELLA DI TESTO

La lettura da una casella di testo avviene usando il metodo getText( ), dopo


che lutente ha inserito il valore.

Esempio: creare uninterfaccia grafica che simula un convertitore da gradi


centigradi a gradi fahreneit, ricevuto in ingresso il valore in centigradi.

import java.awt.*;
import java.awt.event.*;
151

public class Convertitore {

public static void main(String argv[ ]) {


convertFrame f = new convertFrame();
f.pack( );
f.setVisible(true);
}
}
class convertFrame extends Frame implements ActionListener {
private Panel p1 = new Panel( );
private Panel p2 = new Panel( );
private TextField centigradi = new TextField(15);
private TextField fahreneit = new TextField(15);
private Button converti = new Button("Converti");
public convertFrame( ) {
super("Convertitore Centigradi/Fahreneit");
addWindowListener(new GestoreFinestra( ));
p1.add(new Label("Gradi centigradi: "));
p1.add(centigradi);
p2.add(new Label("Gradi Fahreneit: "));
p2.add(fahreneit);
setLayout(new GridLayout(3,1,5,10));
add(p1);
add(converti);
add(p2);
converti.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
String bottone = e.getActionCommand( );
double cent, fahr;
if (bottone.equals("Converti")) {
try {
String numeroLetto = centigradi.getText( );
cent = Double.valueOf(numeroLetto).doubleValue( );
fahr = 32 + (cent/100)*180;
fahreneit.setText(" "+fahr);
}
catch(Exception exc) {
fahreneit.setText("");
}
}
}
}
class GestoreFinestra implements WindowListener {
public void windowIconified(WindowEvent e) { }
public void windowDeiconified(WindowEvent e) { }
public void windowActivated(WindowEvent e) { }
152

public void windowDeactivated(WindowEvent e) { }


public void windowOpened(WindowEvent e) { }
public void windowClosed(WindowEvent e) { }
public void windowClosing(WindowEvent e) {
System.out.println("Programma terminato.");
System.exit(0);
}
}

Convertitore centigradi / fahreneit

Gradi centigradi 0

Converti

Gradi fahreneit 32.0

LETTURA DA UNA COMBO BOX

Per la lettura da una casella combinata si usa il metodo getSelectedIndex(),


che restituisce un numero corrispondente allindice della voce selezionata.

Esempio: tramite un menu, si consenta di modificare il colore di sfondo di


unarea grafica, scegliendo tra sette colori.

import java.awt.*;
import java.awt.event.*;
public class Cambia {

public static void main(String argv[ ]) {

ModificaFrame f = new ModificaFrame( );


f.setVisible(true);
}
}
class ModificaFrame extends Frame implements ActionListener {
private Color sfondo = Color.white;
private Panel p = new Panel( );
private Canvas c = new Canvas( );
private Choice colori = new Choice( );
private Button cambia = new Button("Cambia");
153

public ModificaFrame( ) {
super("Cambia sfondo!");
setSize(400,250);
addWindowListener(new GestoreFinestra( ));
inizializzaCombo( );
c.setBackground(sfondo);
p.add(new Label("Colore di sfondo: "));
p.add(colori);
p.add(cambia);
add(p, "North");
add(c, "Center");
cambia.addActionListener(this);
}
private void inizializzaCombo( ) {
colori.addItem("bianco");
colori.addItem("rosso");
colori.addItem("arancione");
colori.addItem("giallo");
colori.addItem("verde");
colori.addItem("blu");
colori.addItem("nero");
}
public void actionPerformed(ActionEvent e) {
String bottone = e.getActionCommand( );
if (bottone.equals("Cambia")) {
switch (colori.getSelectedIndex( )) {
case 0: sfondo= Color.white; break;
case 1: sfondo= Color.red; break;
case 2: sfondo= Color.orange; break;
case 3: sfondo= Color.yellow; break;
case 4: sfondo= Color.green; break;
case 5: sfondo= Color.blue; break;
case 6: sfondo= Color.black; break;
}
c.setBackground(sfondo);
}
}
}
class GestoreFinestra implements WindowListener {
public void windowIconified(WindowEvent e) { }
public void windowDeiconified(WindowEvent e) { }
public void windowActivated(WindowEvent e) { }
public void windowDeactivated(WindowEvent e) { }
public void windowOpened(WindowEvent e) { }
public void windowClosed(WindowEvent e) { }
public void windowClosing(WindowEvent e) {
System.out.println("Programma terminato.");
154

System.exit(0);
}
}

Cambia sfondo

giallo cambia
Colore di sfondo giallo
bianco
rosso
arancione
verde
blu
nero

Esercizi

1) Creare una finestra di dimensioni 320 x 240.

2) Creare un pannello con tre bottoni disposti verticalmente.

3) Creare due bottoni con la scritta Ok e Annulla e modificare il loro colore


di sfondo.

4) Creare tre etichette utilizzando i tre diversi costruttori messi a


disposizione.

5) Creare una casella combinata che consenta allutente di scegliere tra i


seguenti valori: ottimo, buono, sufficiente, insufficiente.

6) Implementare un metodo paint che disegna un triangolo rettangolo.

7) Scrivere allinterno di unarea di testo i primi 20 numeri pari.

8) Dopo aver inserito dal prompt di Ms Dos le dimensioni di una finestra,


visualizzare la finestra con quelle dimensioni.

9) Creare uninterfaccia composta da una casella di testo, un bottone e


unarea di testo. Lutente utilizza la casella di testo per inserire dei
155

nomi, e ogni volta che viene premuto il bottone, i nomi vengono ricopiati
nellarea di testo.

10) Costruire unarea di disegno con due linee che si intersecano.


156

CAPITOLO XIX
LE APPLET JAVA

Per poter proseguire nella trattazione di questo argomento, dobbiamo fornire


sommariamente gli elementi fondamentali del linguaggio HTML.

IL CONCETTO DI IPERTESTO

Un ipertesto formato da un insieme di documenti, collegati tra loro tramite


riferimenti ipertestuali, denominati link. Questi documenti possono essere
costituiti da testo, immagini, suono. A differenza del normale testo, che deve
essere letto sequenzialmente, i link permettono a chi naviga lipertesto di
accedere alle sue componenti in un ordine non rigido, ma seguendo un percorso
a piacere tra quelli possibili al suo interno.
Anche se i documenti che si trovano sul Web hanno una natura ipertestuale,
luso di questo termine non necessariamente collegato allaccessibilit di un
documento sul Web. Un ipertesto pu infatti essere memorizzato su un
supporto (un disco fisso, un floppy) a cui si accede localmente.
I documenti HTML permettono di scrivere gli ipertesti per il Web. Si tratta di
documenti memorizzati sui server Web che vengono visualizzati dai client
Web, ovvero dai browser (Netscape Navigator, Microsoft Internet Explorer,
Opera, ).

CARATTERISTICHE DI HTML

HTML (Hyper Text Markup Language) un linguaggio per la costruzione di


ipertesti. costituito da un insieme di comandi che permettono di definire la
struttura e laspetto di un ipertesto, di inserire oggetti (immagini, tabelle,
moduli) e di creare link ipertestuali interni al documento oppure ad altri
documenti. Un documento HTML costituito da un semplice testo, che in
quanto tale pu essere visualizzato attraverso qualsiasi editor di testo. Per
vedere il documento HTML come ipertesto necessaria invece unapplicazione
(il browser) che interpreta i comandi contenuti nel testo producendo la
visualizzazione definita rispetto a questi comandi.
Alla base di HTML esiste una standardizzazione che garantisce che ad ogni
comando (testuale) corrisponda una certa visualizzazione da parte del browser.
Per creare un file HTML possibile usare due strumenti:

un editor di testo (ad esempio WordPad)


unapplicazione per la preparazione di documenti HTML (Microsoft
Frontpage, Netscape Composer, Macromedia Dreamweaver) del tipo
WYSIWYG (what you see is what you get)
157

Mentre nel primo caso occorre conoscere HTML e scrivere i comandi tramite
leditor di testo, nel secondo caso la conoscenza di HTML non necessaria, in
quanto lapplicazione permette allutente di comporre il documento a partire
dallaspetto risultante: i comandi vengono aggiunti man mano dalleditor a
seconda degli elementi (testo, grafica, ecc) inseriti dallutente.
Il file HTML creato tramite leditor deve essere salvato come documento
testuale con estensione .html o .htm; in caso contrario, il documento verr
visualizzato come testo e non come documento HTML.

COMANDI HTML

I comandi HTML sono detti tag (o marcatori) e devono sempre essere scritti
allinterno di parentesi uncinate (<NOMETAG>). I tag, tranne alcune
eccezioni, devono essere aperti e chiusi, e la loro influenza si esercita sul testo
contenuto al loro interno (tra lapertura e la chiusura del tag, che avviene
facendo precedere il comando dal carattere /).
Inoltre, i tag possono avere degli attributi che assumono dei valori (scritti tra
virgolette). Gli attributi (scelti tra un insieme predefinito) sono scritti di
seguito al nome del comando, allinterno delle parentesi.

STRUTTURA DI UN DOCUMENTO

Un documento HTML interamente contenuto allinterno del tag <HTML> e si


compone di due parti essenziali (che vedremo in seguito in maggiore dettaglio):

head (intestazione)
body (corpo del documento)

Lintestazione (head) pu contenere il titolo, oltre ad alcune informazioni


generali (tipo di editor usato, contenuto del documento, ecc.).
Il corpo del documento (body) contiene il documento vero e proprio, che verr
visualizzato nella finestra del browser.
Allinterno del body possibile inserire:

testo (e la relativa formattazione)


liste
tabelle
immagini
collegamenti
moduli
158

LAYOUT DELLA PAGINA

possibile rendere pi gradevole una pagina inserendo nel body degli attributi
che modificano laspetto del testo e lo sfondo della pagina. Ad esempio, si pu
colorare lo sfondo della pagina, modificare il colore del testo, e laspetto dei
link.

TESTO E FORMATTAZIONE

Tutto ci che viene scritto dentro il corpo del documento, tranne naturalmente
i comandi e i loro attributi, viene visualizzato dal browser come testo. Per
inserire la formattazione (a capo, corsivo, grassetto, centratura del testo, ecc.)
si utilizzano i comandi appositi.
A questo punto opportuno notare come i comandi di HTML possano essere
annidati, cio inscatolati uno nellaltro. Cos facendo si possono ottenere
effetti sofisticati come:

unimmagine allinterno di un link crea un collegamento associato


allimmagine
i punti di una lista possono contenere testo formattato, immagini,
altre liste

I TAG DEL LINGUAGGIO

Vediamo ora pi in dettaglio i tag che HTML mette a disposizione del


progettista di pagine per il Web.
Come abbiamo gi visto, i tag hanno una forma sintattica particolare:

<NOME-TAG>
informazioni
</NOME-TAG >

Le informazioni tra <NOMETAG> e </ NOMETAG> vengono visualizzate


secondo quanto specificato dal tag stesso.

I tag hanno nomi mnemonici.


Molti tag hanno degli attributi che servono per fornire ulteriori
caratteristiche alle porzioni del documento. I valori degli attributi
dovrebbero essere scritti tra gli virgolette, lordine con cui si scrivono
irrilevante.
Per aumentare la leggibilit dei file HTML si possono indentare i tag.
I nomi dei tag possono essere scritti usando le lettere maiuscole o
minuscole ( consigliabile essere consistenti per facilitare le correzioni).
Fino a qualche anno fa, i tag venivano scritti con i caratteri maiuscoli
159

per aumentare la leggibilit dei documenti HTML. Oggi si usano anche i


caratteri minuscoli, principalmente per compatibilit con le estensioni
pi recenti dei linguaggi di markup (es. XML).
HTML non sensibile ai blank (spazi) e alle linee vuote, ovvero
indipendentemente dal numero di spazi e di linee lasciati vuoti, il
browser visualizzer sempre un solo spazio.

Tutti i documenti iniziano con il tag <HTML> e terminano con </HTML>


Un documento HTML costituito da due parti:

<HTML>
<HEAD>
descrizione delle caratteristiche del documento 1
</HEAD>
<BODY>
documento vero e proprio 2
</BODY>
</HTML>
Lelemento fondamentale nella parte di head il titolo del documento che
verr visualizzato come titolo nella finestra del browser.
Poich il titolo viene usato anche per costruire gli indici automatici usati
daimotori di ricerca importante che esso sia significativo.

Esempio:

<HEAD>
<TITLE>Titolo della pagina</TITLE>
</HEAD>

Osservazione: I contenuto del tag <TITLE> viene scritto automaticamente


nellelenco dei siti preferiti quando si salvano usando il browser.
Esistono poi altri tag, detti META tag, che permettono di associare delle
informazioni al documento HTML. Le "keywords" (parole chiave), per esempio,
sono i termini che descrivono il contenuto di una pagina Web e sono gli stessi
termini che vengono poi usati dai motori di ricerca per lindicizzazione.

La parte BODY contiene il documento (pagina) vero e proprio, cio il contenuto


che viene visualizzato nel browser. Il testo pu essere inserito liberamente e
verr visualizzato secondo le direttive di formattazione.

Titoli
<H1> titolo1 </H1>
<H2> titolo2 </H2>
...
<H6> titolo6 </H6>

permettono di indicare quali parti di testo vengono usate come titoli.


160

Osservazione: <H1>, ..., <H6> sono usati anche per controllare le dimensioni dei
caratteri: <H1> corrisponde a caratteri grandi, ..., <H6> a caratteri piccoli.

COMANDI PER ANDARE A CAPO

<BR> {a capo}
<P> {a capo e inizio nuovo paragrafo}

Esempio:

<BODY>
<H1> Scienze Matematiche </H1>
<P>Questo documento descrive il corso di laurea.
<BR>Il documento diviso in pi capitoli.
<P>
<H2> Durata del corso </H2>
....
</BODY>

Il comando <BODY> ha degli attributi che permettono di stabilire il colore dello


sfondo e il colore del testo.

<BODY bgcolor="colore sfondo"


text="colore testo"
background="pathname del file con limmagine per lo sfondo"
link="colore link da visitare"
vlink="colore link visitati" >

Il colore pu essere specificato con


parole chiave: red, yellow, ...
codice esadecimale: esprimendo la sua codifica RGB

DIMENSIONE DEI CARATTERI

Si usano i tag <BASEFONT> e <FONT> con lattributo size che permette di


definire le dimensioni dei caratteri da 1 (piccolo) a 7 (grande)
Il comando FONT ha tre attributi:

size {per cambiare la dimensione dei caratteri}


color {per cambiare il colore dei caratteri}
face {per cambiare il tipo di font}
161

Esempio:
<FONT size="5" color="red" font="Courier">
Questo testo viene visualizzato in rosso, ha dimensione 5 e font Courier
</FONT>
Esistono vari modi per cambiare il formato dei caratteri.

Stili fisici

<B> testo </B> {testo in grassetto}


<I> testo </I> {testo in corsivo}
<TT> testo </TT> {testo typewriter}

Stili logici

<EM> testo </EM> {enfasi (di solito corsivo)}


<CITE> testo </CITE> {citazioni (di solito in corsivo)}
<CODE> testo </CODE> {per codice di computer}
<STRONG> testo </STRONG> {forte enfasi (grassetto)}

ALLINEAMENTO

Il comando <P> ha un attributo align per l'allineamento del testo nel


paragrafo.

<P align="left"> testo allineato a sinistra </P>


<P align="right"> testo allineato a destra </P>
<P align="center"> testo allineato al centro </P>

La centratura del testo si pu ottenere anche con il comando <CENTER>.


<CENTER> testo da centrare </CENTER>

Indici e pedici

a<SUB> 1 </SUB> produce a1


b<SUP> 2 </SUP> produce b2

Esempio:
<HTML>
<BODY bgcolor="white" text="red">
<BASEFONT size="4">
<H1>
<CENTER> Scienze Matematiche</CENTER>
</H1>
<P align="right">
<FONT size=+1>Laurea triennale nuovo ordinamento</FONT>
162

</P>
Presentazione del <EM> Corso di laurea </EM>
<P>
<H2> Durata </H2>
La durata &egrave di <STRONG> 3 </STRONG> anni. <BR>
Il corso prevede <STRONG> 180 </STRONG> crediti.
<BR>
<FONT size=-1 color="blue">
La laurea specialistica non stata ancora attivata.
</FONT>
<BR>
<ADDRESS>
pagina creata da X Y
</ADDRESS>
</BODY>
</HTML>

IMMAGINI

Fino ad ora abbiamo visto come si pu formattare il testo; HTML permette


anche di inserire delle immagini usando il comando <IMG>.
L'immagine deve essere su un file a parte; i browser supportano formati quali
GIF, JPEG, PNG, BITMAP.
Il comando IMG ha vari attributi

<IMG
src="pathname o URL dell'immagine"
align="left" | "right" | "center"
alt="text" {testo alternativo all'immagine}
border="numero" {larghezza in pixel del bordo}
height="numero" {altezza in pixel dellimmagine}
width="numero" {larghezza in pixel dellimmagine}
hspace="numero" {spazio in pixel a destra e sinistra dell'immagine}
vspace="numero" {spazio in pixel sopra e sotto l'immagine}
usemap="nome" {permette di creare image map} >

Esempio:
<IMG src="images/foto.gif" align="left" width="100" height="120" vspace="20">
Gli attributi height e width istruiscono il browser sullo spazio che deve essere
lasciato per la visualizzazione dellimmagine. Il caricamento delle pagine
diventa quindi pi veloce perch il browser pu cominciare a scrivere il testo
successivo prima ancora di aver caricato completamente unimmagine (tanto sa
quanto spazio occuper limmagine).
Tuttavia, luso di questi attributi sconsigliato per cambiare le dimensioni
delle immagini perch queste verranno visualizzate in forma distorta o
sgranata. Se si vuole imgrandire o rimpicciolire unimmagine conveniente
163

lavorare sul file dellimmagine, usando un programma di grafica, piuttosto che


forzarne le dimensioni con gli attributi height e width.
necessario scrivere esplicitamente lestensione del file dellimmagine

LEGAMI IPERTESTUALI

Fino ad ora abbiamo visto come creare singole pagine HTML. Per avere un
ipertesto sono necessari dei collegamenti (link) tra le pagine. Prima di vedere
come si definisce un collegamento necessario capire come formato un
indirizzo URL per il Web. Un URL costituito da varie parti:

protocollo:// indirizzo internet /pathname#label

Il protocollo descrive il tipo di collegamento da realizzare


http: {per file remoti da trasferire con http}
ftp: {attiva trasferimento dati con ftp}
news: {attiva collegamento a server news}
telnet: {attiva sessione di collegamento remoto}
mailto: {attiva spedizione di mail}

Il protocollo pi importante per i legami ipertestuali http.


Lindirizzo internet lindirizzo del calcolatore remoto sul quale risiedono i
documenti (server Web).
Il pathname indica il nome del file che si vuole scaricare, con il relativo
percorso.
#label serve per indicare una porzione allinterno di un documento HTML

Esempio:
1)http://www.disi.unige.it/index.html {file index.html sul server
www.disi.unige.it}
2) mailto:ribaudo@disi.unige.it {attiva il programma di invio mail}
3) ftp://ftp.disi.unige.it/didattica/materiale.pdf
{attiva trasferimento del file materiale.pdf che si trova nella cartella didattica
dal server ftp.disi.unige.it}
4) telnet:elios.disi.unige.it {attiva la finestra di interazione remota}

Unesempio di pagina html corredata di tutti i tag visti finora e detta anche
modulo di feedback, presentata di seguito:

<HTML>
<HEAD>
<TITLE>Osservazioni e Commenti</TITLE>
</HEAD>
<BODY BGCOLOR = "FFFFCC">
<H2><B>Mandaci le tue osservazioni</B></H2>
<P>
164

<FORM METHOD="post" ENCTYPE="text/plain"


ACTION="mailto:rossi@prova.it">
<P>Il tuo nome:<INPUT TYPE = "Text" NAME = "mittente" SIZE ="35">
<P>La tua Email:<INPUT TYPE = "Text" NAME ="email" SIZE ="35">
<P>Scrivi qui il tuo commento
<P>TEXTAREA NAME="domanda" ROWS="10" COLS="50">
</TEXTAREA>
<P>Premi sul tasto <I>Invia</I>quando hai completato il modulo,
sul tasto <I>Annulla</I> se vuoi rifare
<P><INPUT TYPE = "submit" VALUE = "Invia" NAME = "B2">
</FORM>
</BODY>
</HTML>

Questo modulo, completato dallutente, viene inviato tramite posta elettronica


cliccando su un bottone di comando inserito nella pagina.

N.B. provare a scrivere tutti gli esempi in html visti finora, ricopiandoli su un
blocco note e salvando il file con estensione.html.

I programma scritti in Java si dividono in due categorie:

1) Le applicazioni, che abbiamo visto finora.


2) Le Applet, che sono programmi eseguibili solo allinterno di un browser
web, favorendo cos linterattivit e rendendo le pagine web sicuramente
pi accattivanti.

LA CLASSE APPLET

La classe Applet contenuta nella libreria java.applet, che una sottoclasse


della classe Panel e quindi eredita tutte le sue propriet. Unapplet viene
eseguita direttamente nella finestra del browser, quindi la applicazioni di tipo
applet non hanno pi bisogno della creazione del frame, poich esso viene
direttamente fornito dal browser. Lapplet, che rappresenta un pannello,
occupa una zona rettangolare allinterno del browser, le cui dimensioni
vengono definite da un particolare tag HTML.

Browser

Finestra

Applet

Pannello
165

La struttura generale di unapplet la seguente:

import java.applet.*;
public class <nome_applet> extends Applet {
// attributi
// metodi
}

Nelle applet manca il metodo main, che viene sostituito dal metodo init,
contenente di solito le operazioni di inizializzazione, come ad esempio il
posizionamento delle componenti nellapplet e il caricamento delle immagini.
possibile trasformare una delle applicazioni precedentemente viste in
unapplet, spostando semplicemente il contenuto del main nel metodo init.

Altri metodi della classe Applet sono:

1) start
2) stop
3) destroy

Quando unapplet viene caricata, vengono richiamati il metodo init e il metodo


start. Se ci si sposta su una pagina diversa, il browser richiama invece il
metodo stop. Se si ritorna alla pagina in cui si trovaav lapplet, si richiama
nuovamente il metodo start. Infine, quando il browser viene chiuso, si invoca il
metodo destroy. Lo schema che riassume il ciclo di vita dellapplet il
seguente:

caricamento

init

start

stop

destroy
166

La struttura dellapplet precedente la seguente:

import java.applet.*;

public class <nome_applet> extends Applet {

public void init( ) { }


public void start( ) { }
public void stop ( ) { }
public void destroy( ) { }
}

Lapplet, per essere eseguita, deve essere caricata in una pagina web, quindi
bisogan creare il modulo di feedback contenente i comandi per eseguire e
visualizzare lapplet. Il documento pu essere il seguente:

<HTML>
<HEAD>
<TITLE>Applet di prova</TITLE>
</HEAD>
</BODY>
<CENTER>
<APPLET CODE = applet.class WIDTH = 300 HEIGHT = 150>
Applet non eseguibile
</APPLET>
</CENTER>
</BODY>
</HTML>
Se non si ha a disposizione un browser web o esso molto vecchio e non
riconosce il tag APPLET, possibile usare il programma appletwiewer, che
simula un browser, pur non visualizzando le pagine html.

Esempio: costruire unapplet con unetichetta e unarea di testo. Riempire poi


larea con 10 numeri generati casualmente.

import java.awt.*;
import java.applet.*;

public class Semplice extends Applet {


private TextArea ta;
private Label l;
public void init( ) {
ta = new TextArea(10,8);
l = new Label("Elenco di numeri casuali",Label.CENTER);
l.setBackground(Color.yellow);
setLayout(new BorderLayout( ));
add(l,"Center");
add(ta,"East");
167

generaNumeri();
}
public void generaNumeri( ) {
int casuale;
for(int i = 1; i<=10; i++) {
casuale = (int)(Math.random( )*1000);
ta.append(" > " +casuale+ "\n");
}
}
}

Applet Wiewer :semplice.class


Applet
-> 272
-> 356
->142
-> 125
-> 231
-> 949
Elenco di numeri casuali
-> 587
-> 191
-> 943
-> 673

Applet avviato

I PARAMETRI

Il tag <APPLET> pu anche contenere dei parametri che devono essere passati
allapplet, e sono molto utili perch permettono di costruire applet generiche
che vengono poi adattate in base ai valori dei parametri. Ad esempio un
parametro pu specificare il colore di sfondo dellapplet, oppure le sue
dimensioni.
La struttura del tag <APPLET> contenente i parametri la seguente:

<APPLET CODE = nomeApplet WIDTH = xxx HEIGHT = xxx>


<PARAM NAME = nome del parametro VALUE = valore parametro>
<PARAM NAME = nome del parametro VALUE = valore parametro>
..
168

</APPLET>

Esempio: <PARAM NAME = colore VALUE = rosso>


<PARAM NAME = grandezza VALUE = 10>

Per leggere il valore di un parametro in unapplet si usa il metodo


getParameter.

INTERAZIONE CON IL BROWSER

Le applicazioni Java usano normalmente il metodo System.out.println per


visualizzare i messaggi su video. Tale metodo pu essere utilizzato anche con
le applet, visualizzando per i messaggi su una particolare finestra detta Java
Console, che pu essere aperta scegliendo la voce corrispondente nel menu del
browser, ed molto utile anche per mostrare i possibili errori che avvengono in
fase di esecuzione dellapplet.

Esempio:

import java.applet.*;
public class ordine extends Applet {

public void init( ) {


System.out.print(Eseguito INIT);
}
public void start( ) {
System.out.print(Eseguito START);
}
public void stop ( ) {
System.out.print(Eseguito STOP);
}
public void destroy( ) {
System.out.print(Eseguito DESTROY);
}
}

Un possibile risultato dellesecuzione di questa applet il seguente:

Eseguito INIT.Eseguito Start. Eseguito STOP. Eseguito START. Eseguito STOP.


Eseguito START. Eseguito STOP. Eseguito DESTROY.
169

I DISEGNI

Le applet possono essere costruite usando le stesse componenti grafiche usate


per le applicazioni viste nel capitolo precedente. Le classe che gestisce ls
grafica delle applet Graphics mentre la classe che gestisce la creazione delle
are di disegno Canvas. Per modificare il contenuto di unarea di disegno
bisogna definire il metodo paint. La sintassi la seguente:

public void paint (Graphics g) {


// metodi per disegnare nellarea
}

Esempio: la seguente applet, visualizza a video la scritta JAVA.

import java.awt.*;
import java.applet.*;
public class messaggio extends Canvas {
public void paint(Graphics g) {
g.drawString("JAVA", 10, 10);
}

Esempio: scrivere unapplet che traccia le diagonali dellarea di disegno.

import java.awt.*;
import java.applet.*;
public class disegno extends Canvas {
private int w, h;
public void paint(Graphics g) {
w = getSize( ).width;
h = getSize( ).height;
g.drawLine (0, 0, w 1, h 1);
g.drawLine (0, h 1 , w 1, 0);
}

Applet

Per disegnare un rettangolo si deve usare il metodo:


drawRect(int x, int y, int largezza, int altezza);
170

Per disegnare un ovale si usa invece il metodo:


drawOval(int x, int y, int largezza, int altezza);

Per disegnare un arco si usa il metodo:


drawArc(int x, int y, int largezza, int altezza, int angIniziale, int
angolo);

Per definire un colore, si deve creare un oggetto di classe Color:


Color c = new Color(255, 100, 100);
g.setColor(c);

Per disegnare figure piene si usano i metodi fillOval per lovale e fillArc per
larco.

Per inserire una scritta in un grafico si usa il metodo drawString, mentre per
il font si usa il metodo setFont(Font).

N.B: Font.BOLD scrive I caratteri in grassetto, Font.ITALIC in corsivo e


Font.PLAIN caratteri normali.

Esempio: il seguente frammento di codice consente di tracciare un rettangolo:

.
g.drawRect(0, 0, w 1, h 1);

Esempio: frammento di codice per disegnare un ovale vuoto.

g.setColor(Color.red);
g.drawOval(0, 0, w 1, h 1);
.

Esempio: frammento di codice per disegnare un ovale pieno.

g.setColor(Color.red);
g.fillOval(0, 0, w 1, h 1);
.
171

Gli output sono:

Esempio: visualizzare unapplet con la scritta GRAFICA, separando tra loro i


caratteri ed inserendo ciascuno in un cerchio colorato.

import java.awt.*;
import java.applet.*;

public class Completo extends Applet {


private String scritta = "GRAFICA";
public void init( ) {
setBackground(Color.yellow);
}
public void paint(Graphics g) {
g.setFont(new Font("arial", Font.ITALIC, 30));
Color testo = new Color(190, 240, 160);
for(int i = 0; I < scritta.length(); i++) {
g.setColor(Color.blue);
g.fillOval(25+50*i, 20, 40, 40);
g.setColor(testo);
g.drawString(" "+scritta.charAt(i), 35+50*i, 50);
}
}
}

Loutput del programma il seguente:

G R A F I C A
172

Per caricare unimmagine si usa la classe Image, contenuta nel package


java.awt, e in particolare viene utilizzato il metodo getImage, fornito dalla
classe Applet. Il costruttore della classe Image il seguente:

Image img = getImage(getDocumentBase( ), foto.jpg);

Per visualizzare le immagini si usa il metodo drawImage allinterno del


metodo paint, come mostra il seguente frammento di codice che visualizza
limmagine img nel punto (0, 0):

public void paint(Graphics g) {


g.drawImage(img, 0, 0, this);
}

Nelle applet con luso della grafica, importante gestire linterazione con gli
eventi del mouse, che possono essere:

1) eventi segnalanti lingresso del mouse nellarea grafica


2) eventi di pressione del mouse, del clic e del suo rilascio
3) eventi generati alluscita del mouse dalla Canvas o dallapplet

Tutti i metodi riguardanti il mouse hanno come parametro un oggetto di classe


MouseEvent, mentre linterfaccia che deve essere implementata
MouseListener, attraverso la parola chiave implements.

Esempio: creare unapplet che modifica il colore di sfondo al passaggio del


mouse.

import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class Animazione extends Applet implements MouseListener {

public void init( ) {


addMouseListener(this);
setBackground(Color.red);
}

public void mouseClicked(MouseEvent e) { }


public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
public void mouseEntered(MouseEvent e) {
setBackground(Color.green);
showStatus("Impostato il colore verde");
}
173

public void mouseExited(MouseEvent e) {


setBackground(Color.red);
showStatus("Impostato il colore rosso");
}
}

Loutput del programma il seguente:

stato impostato il colore verde stato impostato il colore rosso

Esempio: creare unapplet che consenta allutente di disegnare cerchi e quadrati


di dimensioni e colori fissati. Deve essere inoltre previsto un bottone per
cancellare tutto il disegno e pulire lapplet.
(N.B. la posizione dei quadrati e dei cerchi viene memorizzata in un vettore di
dimensione variabile. Questa unoperazione necessaria poich ogni volta che il
metodo paint viene eseguito, esso ridisegna da capo tutta lapplet.)

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.Vector;

public class Disegno1 extends Applet {


private Choice forma = new Choice( );
private Button pulisci = new Button("Pulisci");
private area a = new area(forma);

public void init( ) {


Panel comandi = new Panel( );
forma.addItem("quadrato");
forma.addItem("cerchio");
pulisci.addActionListener(a);
comandi.add(forma);
comandi.add(pulisci);
setBackground(Color.lightGray);
setLayout(new BorderLayout( ));
add(comandi,"North");
174

add(a,"Center");}
}
class area extends Canvas implements MouseListener,ActionListener {
private Choice forma;
private Vector punti = new Vector(1,1);
private Vector forme = new Vector(1,1);
private final int lato = 20;
private final int diametro = 20;

public area(Choice forma) {


this.forma = forma;
addMouseListener(this);
}
public void paint(Graphics g) {
Point p;
String f;
for(int i = 0; i < punti.size( ); i++) {
p = (Point) punti.elementAt(i);
f = (String) forme.elementAt(i);
if (f.equals("quadrato")) {
g.setColor(Color.blue);
g.fillRect(p.x-(lato/2),p.y-(lato/2),lato,lato);
}
else if (f.equals("cerchio")) {
g.setColor(Color.yellow);
g.fillOval(p.x-(diametro/2), p.y-(diametro/2),diametro,diametro);
}
}
}
public void mouseClicked(MouseEvent e) { }
public void mousePressed(MouseEvent e) {
Point p = new Point(e.getX( ), e.getY( ));
punti.addElement(p);
switch(forma.getSelectedIndex( )) {
case 0: forme.addElement("quadrato");
break;
case 1: forme.addElement("cerchio");
break;
}
repaint( );
}
public void mouseReleased(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void actionPerformed(ActionEvent e) {
String bottone = e.getActionCommand ( );
if(bottone.equals("Pulisci")) {
175

punti.removeAllElements( );
forme.removeAllElements( );
repaint( );
}
}

disegno
Applet

cerchio Pulisci
quadrato

Applet avviata

GRAFICI MATEMATICI

Il grafico matematico un disegno che mostra landamento di una funzione f(x)


al variare della variabile indipendente x. La difficolt nella rappresentazione
dei grafici la presenza di due sistemi di riferimento, quello della funzione e
quello dello schermo, rendendo quindi necessarioa la conversione tra i due
sistemi. La finestra nel sistema cartesiano si chiama window ed identificata
da quattro valori: XMAX, XMIN, YMAX, YMIN, i quali definiscono un
rettangolo.. la finestra del sistema dello schermo invece detta viewport ed
ha larghezza ed altezza misurate in pixel. La trasformazione tra i due sistemi
viene anche detta window viewport. I poxel sono indicati mediante la
parola UNITA. Per gestire i punti si usa la classe Point, contenuta in java.awt.
176

Esempio: tracciare il grafico di una parabola di tipo y = ax 2 + bx + c, dove i tre


coefficienti a, b, c, vengono inseriti dallutente in input.

Descrizione degli oggetti

Parabola

a
b
c
valuta

import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class Grafico extends Applet implements ActionListener {


public TextField a = new TextField(5);
public TextField b = new TextField(5);
public TextField c = new TextField(5);
private Button disegna = new Button("Disegna");
private piano p = new piano( );

public void init( ) {


Panel comandi = new Panel( );
disegna.addActionListener(this);
comandi.add(new Label("A = ", Label.RIGHT));
comandi.add(a);
comandi.add(new Label("B = ", Label.RIGHT));
comandi.add(b);
comandi.add(new Label("C = ", Label.RIGHT));
comandi.add(c);
comandi.add(disegna);
comandi.setBackground(Color.white);
setBackground(Color.lightGray);
setLayout(new BorderLayout( ));
add(comandi,"North");
add(p,"Center");
}
public void actionPerformed(ActionEvent e) {
String bottone = e.getActionCommand( );
String numero;
double ValA, ValB, ValC;
parabola parab;
177

if (bottone.equals("Disegna")) {
try {
numero = a.getText();
ValA = Double.valueOf(numero).doubleValue( );
numero = b.getText();
ValB = Double.valueOf(numero).doubleValue( );
numero = c.getText();
ValC = Double.valueOf(numero).doubleValue( );
}
catch(Exception exc) {
parab = null;
p.setParabola(parab);
return;
}
parab = new parabola(ValA, ValB, ValC);
p.setParabola(parab);

}
}
}
class piano extends Canvas {
private parabola parab = null;
private final double XMAX = 20.0;
private final double XMIN = -20.0;
private final double YMAX = 18.0;
private double YMIN;
private double UNITA;
private int w, h;

public void paint(Graphics g) {

w = getSize( ).width;
h = getSize( ).height;
UNITA = (double) w/(XMAX XMIN);
YMIN = YMAX ((double) h/UNITA);
disegnaAssi(g);
if(parab != null) {
disegnaParabola(g);
}
}
public Point trasforma(double x, double y) {
Point schermo = new Point ( );
schermo.x = (int) Math.round((x XMIN)*UNITA);
schermo.y = (int) Math.round((YMAX y)*UNITA);
return schermo;
}
public void disegnaAssi(Graphics g) {
178

Point p1, p2;


g.setColor(Color.black);
g.drawRect(0, 0, w-1, h-1);
p1 = trasforma(XMIN,0);
p2 = trasforma(XMAX,0);
g.drawLine(p1.x,p1.y,p2.x,p2.y);
p1 = trasforma(0,YMIN);
p2 = trasforma(0,YMAX);
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}
public void disegnaParabola(Graphics g) {
double incremento = 0.01;
double x;
Point p1, p2;
g.setColor(Color.blue);
p1 = trasforma(XMIN, parab.valuta(XMIN));
for (x = XMIN+incremento; x <= XMAX; x += incremento) {
p2 = trasforma(x, parab.valuta(x));
if((p1.y > 0) && (p1.y < h) && (p2.y > 0) && (p2.y < h)) {
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}
p1.x = p2.x;
p1.y = p2.y;
}
}
public void setParabola(parabola parab) {
this.parab = parab;
repaint( );
}
}
class parabola {
private double a, b, c;
public parabola(double a, double b, double c) {
this.a = a;
this.b = b;
this.c = c;
}
public double valuta(double x) {
double y;
y = a*x*x + b*x + c;
return y;
}
}
179

Loutput il seguente:

disegno
Applet
A= 2 B= -3 C= -4 Disegna

Applet avviata

GRAFICI STATISTICI

I grafici statistici forniscono una rappresentazione grafica dei dati ricavati da


un fenomeno osservato. La scelta del tipo di grafico dipende da quale aspetto si
vuole mettere in evidenza. Per esempio, un grafico a torta mostra le
proporzioni dei vari elementi rispetto al loro totale, mentre un istogramma
mostra le variazioni dei dati nel tempo, consentendo il confronto tra elementi
diversi.
Il grafico a torta rappresenta i dati usando un cerchio diviso in settori, dove
la dimensione di ogni settore proporzionale al dato corrispondente
allampiezza dellangolo che forma. Per rappresentare in Java i grafici a torta,
si usa il gi noto metodo fillArc, specificando lampiezza del settore e langolo
da cui partire.
180

Esempio: dati cinque valori forniti in input, disegnare il corrispondente grafico


a torta.

import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class Statist extends Applet {


public TextField valori[ ] = new TextField[5];
public Color colori[ ] = new Color[5];
private Button disegna = new Button("Disegna");
private torta t = new torta(valori, colori);

public void init( ) {


Panel comandi = new Panel( );
disegna.addActionListener(t);
inizializzaColori( );
comandi.setLayout(new GridLayout(7,1,0,10));
comandi.add(newLabel("***VALORI***", Label.CENTER));
for(int i = 0; i < valori.length; i++) {
valori[i]= new TextField(10);
valori[i].setBackground(colori[i]);
comandi.add(valori[i]);
}
comandi.add(disegna);
setBackground(Color.lightGray);
setLayout(new BorderLayout( ));
add(comandi,"West");
add(t, "Center");
}

public void inizializzaColori( ) {


colori[0] = Color.yellow;
colori[1] = Color.pink;
colori[2] = Color.cyan;
colori[3] = Color.white;
colori[4] = Color.green;
}
}

class torta extends Canvas implements ActionListener {


private TextField valori[ ];
private Color colori[ ];
private double val[ ];
private double totale = 0.0;
private int x, y;
181

private int dimensioni;

public torta(TextField valori[ ],Color colori[ ]) {


this.valori = valori;
this.colori = colori;
val = new double [valori.length];
for(int i = 0; i < val.length; i++) {
val[i] = 0.0;
}

public void paint(Graphics g) {


int w = getSize( ).width;
int h = getSize( ).height;
if(w > h) {
dimensioni = h/2;
}
else {
dimensioni = w/2;
}
x = (w/2) (dimensioni/2);
y = (h/2) (dimensioni/2);

if(totale != 0.0) {
disegnaTorta(g);
}
}

public void disegnaTorta(Graphics g) {


int startAngle = 0;
int ampiezza = 0;
for(int i = 0; i < val.length; i++) {
if(val[i] != 0.0) {
ampiezza = (int) Math.round(val[i]*360/totale);
g.setColor(colori[i]);
g.fillArc(x, y, dimensioni, dimensioni, startAngle, ampiezza);
startAngle = startAngle + ampiezza;
}
}
}
public void actionPerformed(ActionEvent e) {
String bottone = e.getActionCommand( );
String numero;
if(bottone.equals("Disegna")) {
totale = 0.0;
for(int i = 0; i <val.length; i++) {
182

try {
numero = valori[i].getText( );
val[i] = Double.valueOf(numero).doubleValue( );
}
catch(Exception exc) {
val[i] = 0.0;
}
totale = totale + val[i];
}
repaint( );
}
}
}

Loutput del programma mostrato nella pagina seguente:

Statist
Applet

*** VALORI ***

10

23

56

78

14

Disegna

Applet avviata
183

La rappresentazione grafica mediante istogramma si ottiene visualizzando


tanti rettangoli quanti sono i dati dellosservazione statistica e aventi laltezza
uguale al valore che rappresentano.

Esempio: dati cinque valori forniti in input, disegnare il corrispondente


istogramma.

import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class Statist1 extends Applet {


public TextField valori[ ] = new TextField[5];
public Color colori[ ] = new Color[5];
private Button disegna = new Button("Disegna");
private istogrammi ist = new istogrammi(valori,colori);

public void init( ) {


Panel comandi = new Panel( );
disegna.addActionListener(ist);
inizializzaColori( );
comandi.setLayout(new GridLayout(7,1,0,10));
comandi.add(newLabel("***VALORI***", Label.CENTER));
for(int i = 0; i < valori.length; i++) {
valori[i] = new TextField(10);
valori[i].setBackground(colori[i]);
comandi.add(valori[i]);
}
comandi.add(disegna);
setBackground(Color.lightGray);
setLayout(new BorderLayout( ));
add(comandi,"West");
add(ist,"Center");
}
public void inizializzaColori() {
colori[0] = Color.yellow;
colori[1] = Color.pink;
colori[2] = Color.cyan;
colori[3] = Color.white;
colori[4] = Color.green;
}
}
class istogrammi extends Canvas implements ActionListener {
private TextField valori[ ];
private Color colori[ ];
private double val[ ];
184

private final double XMAX = 7.0;


private final double XMIN = 1.0 ;
private double YMAX = 0.0;
private double YMIN = 0.0;
private double UnitaX = 1.0;
private double UnitaY = 1.0;
private int w, h;

public istogrammi(TextField valori[ ],Color colori[ ]) {


this.valori = valori;
this.colori = colori;
val = new double [valori.length];
for(int i = 0; i < val.length; i++) {
val[i] = 0.0;
}
}
public void paint(Graphics g) {
Point p1 = new Point( );
Point p2 = new Point( );
w = getSize( ).width;
h = getSize( ).height;
if(YMAX != 0) {
UnitaX = (double) w/(XMAX XMIN);
UnitaY = (double) h/(YMAX YMIN);
disegnaAssi(g);
for (int i = 0 ; i < val.length; i++) {
g.setColor(colori[i]);
if(val[i] > 0) {
p1 = trasforma((double) i+1, val[i]);
p2 = trasforma((double) i+2, 0);
}
else {
p1 = trasforma((double) i+1, 0);
p2 = trasforma((double) i+2, val[i]);
}
g.fillRect(p1.x, p1.y, (p2.x p1.x), (p2.y p1.y));
}
}
}
public Point trasforma(double x, double y) {
Point schermo = new Point( );
schermo.x = (int) Math.round((x XMIN)*UnitaX);
schermo.y = (int) Math.round((YMAX y)*UnitaY);
return schermo;
}
public void disegnaAssi(Graphics g) {
Point p1, p2;
185

double incremento,arrot;
g.setColor(Color.black);
g.drawRect(0, 0, w 1, h 1);
p1 = trasforma(XMIN,0);
p2 = trasforma(XMAX,0);
g.drawLine(p1.x, p1.y, p2.x, p2.y);
p1 = trasforma(0,YMIN);
p2 = trasforma(0,YMAX);
g.drawLine(p1.x, p1.y, p2.x, p2.y);
incremento = (YMAX YMIN)/10;
for(double y = 0; y < YMAX; y = y + incremento) {
p1= trasforma(0, y);
g.drawLine(p1.x-2, p1.y, p2.x+2, p2.y);
arrot = (double) Math.round(y*10)/10;
g.drawString(" " +arrot, p1.x+2, p1.y);
}
for(double y = 0; y>YMIN; y = y incremento ) {
p1= trasforma(0, y);
g.drawLine(p1.x-2, p1.y, p2.x+2 , p2.y);
arrot = (double) Math.round(y*10)/10;
g.drawString(" " +arrot, p1.x+2, p1.y);
}
}
public void actionPerformed(ActionEvent e) {
String bottone = e.getActionCommand( );
String numero;
double spazio;
if (bottone.equals("Disegna")) {
YMAX = 0.0;
YMIN = 0.0;
for(int i = 0; i < val.length; i++) {
try {
numero = valori[i].getText();
val[i] = Double.valueOf(numero).doubleValue( );
}
catch(Exception exc) {
val[i] = 0.0;
}
if(val[i] > YMAX) {
YMAX = val[i];
}
else if(val[i] < YMIN) {
YMIN = val[i];
}
}
spazio = (YMAX YMIN)/10;
YMAX = YMAX + spazio;
186

YMIN = YMIN spazio;


repaint( );
} } }

Loutput il seguente:

disegno

Applet

*** VALORI ***

12 35

30
23
25

8 20

15
31
10
10
5

0
Disegna

Applet avviata

Esercizi

1) Definire, usando il linguaggio html, un parametro da passare ad


unapplet. Il parametro ha come nome peso e il suo valore 30.

2) Sapendo che il file principale di unapplet titolo.class, mostrare il tag


html che consente di visualizzare lapplet in unarea di dimensioni 100 x
300.

3) Dati i punti P1(10,10) e P2(100,50), scrivere il metodo per tracciare una


linea che unisce i due punti e il metodo che disegna un rettangolo avente
come spigoli opposti i due punti.
187

4) Creare unapplet che scrive un messaggio sulla Java Console.

5) Indicare il metodo con cui si pu disegnare una circonferenza che ha


centro nel punto (50,50) e diametro di 20 pixel.

6) Visualizzare in unapplet la stringa Benvenuto, usando il font Courier,


grassetto e dimensione 40.

7) Scrivere unapplet che calcola la somma di due numeri, che devono


essere inseriti in due caselle di testo. Il risultato verr visualizzato in
una terza casella di testo.

8) Scrivere unapplet che disegna un quadrato avente vertice nel punto


(10,10) e il lato specificato da un parametro.

9) Tracciare il grafico di uniperbole definita dalla funzione y = k/x, dove il


valore di k viene scelto dallutente.

10) Creare unapplet che mostra tre caselle di testo disposte una sotto
laltra.