Book per le terze - Accesso alla applicazione

Transcript

Book per le terze - Accesso alla applicazione
Presentazione
Il presente lavoro nasce dalla volontà di fornire uno strumento nello studio
di Tecnologie Informatiche del biennio della scuola secondaria superiore,
una nuova disciplina introdotta con la riforma Gelmini.
Proprio questo delicato momento di transizione verso il nuovo assetto degli
Istituti di Istruzione Superiore ha fatto riflettere il gruppo di lavoro su quali
competenze questa nuova disciplina potesse caratterizzarsi intravedendo
nell’insegnamento di Tecnologie Informatiche non un mero addestramento
sui pacchetti software per l’ufficio e per la comunicazione più diffusi ma
una prima scoperta di “ciò che sta dietro le quinte” , di ciò che fa “girare”
tutto il software che i ragazzi già utilizzano ( non dimentichiamo che molti
ragazzi iniziano gli esami ECDL già nella scuola secondaria di primo
grado).
Lo sforzo non semplice è quello di presentare dei concetti di una certa
complessità in modo preciso e contemporaneamente
in un linguaggio
semplice ed immediato che susciti l’interesse dello studente nella scoperta.
Tenuto conto della fascia di età alla quale sono rivolti questi appunti, il
gruppo ha deciso di non trattare in modo esaustivo gli argomenti ma di
offrire degli spunti per la riflessione, un primo approccio (abbastanza soft)
all’informatica nella convinzione che il primo biennio delle superiori debba
essere soprattutto orientativo; gli stessi argomenti saranno approfonditi in
modo più puntuale nel secondo biennio e nell’ultimo anno da tutti quei
ragazzi che sceglieranno un indirizzo informatico.
Gli autori
Book in Progress
Pagina 1
Book in Progress
Pagina 2
INDICE PRINCIPALE
CODIFICA DELL’INFORMAZIONE
P.
4
LA STRUTTURA DI UN CALCOLATORE
P.
18
I SISTEMI INFORMATIVI
P.
33
I SISTEMI OPERATIVI
P.
49
ALGORITMI E DIAGRAMMI DI FLUSSO
P.
69
IL LINGUAGGIO DI PROGRAMMAZIONE UNITA’ 1
P.
87
IL LINGUAGGIO DI PROGRAMMAZIONE UNITA’ 2
P.
113
LAVORIAMO IN LABORATORIO CON IL DEV C++
P.
143
APPUNTI SUL FOGLIO ELETTRONICO
P.
205
APPUNTI “LINGUAGGIO HTML”
P.
247
Book in Progress
Pagina 3
BOOK IN PROGRESS
CODIFICA DELL’INFORMAZIONE
Competenze
Abilità
Conoscenze
Utilizzare, con autonomia e
responsabilità, le reti e gli
strumenti informatici nelle
attività di studio, ricerca e
approfondimento
disciplinare.
Riconoscere le caratteristiche
logico-funzionali di un
computer e il ruolo
strumentale svolto nei vari
ambiti.
Dati e informazioni
Codifica dei dati
Indice
Introduzione
5
codice Morse
6
Il bit 7
Rappresentazione dei numeri
Il byte
8
9
La codifica ASCII
9
Concetto di “programma”
Dal reale al virtuale
11
12
Codifica delle immagini 12
La rappresentazione RGB del colore
14
Codifica del video 14
Codifica dell’audio 15
Classificazione dell’informazione
16
A cura di Paolo Lillo
Adattamenti di Salvatore Madaro
Book in Progress
Pagina 4
Codifica dell’informazione
Introduzione
Diamo una definizione di “INFORMATICA”:
“L’informatica è la disciplina che si occupa della codifica, della
memorizzazione, della trasmissione e dell’elaborazione
dell’INFORMAZIONE”
Intendiamo per INFORMAZIONE
“Ogni messaggio o elemento conoscitivo che è possibile comunicare
o acquisire”
La parola e le espressioni del corpo, i segni (dai graffiti preistorici alla scrittura) e in
generale tutto ciò che può essere percepito dai sensi, hanno soddisfatto e perfezionato nel
corso della storia la necessità dell’uomo di comunicare, cioè di trasferire l’informazione
non solo da uomo a uomo ma anche da generazione a generazione. I modelli culturali di
oggi sono il risultato della lunga evoluzione del processo.
Se la comunicazione è alla base del trasferimento delle
informazioni, il ragionamento e quindi l’uso della
capacità logica-deduttiva hanno da sempre avuto il
compito di elaborare l’informazione attraverso l’uso di
modelli interpretativi che con lo scorrere del tempo sono
divenuti sempre più articolati e raffinati.
L’uomo, del resto, si è sempre ingegnato di superare i suoi
limiti utilizzando tecniche e strumenti per rendere
sempre più efficace la sua capacità di comunicare: dall’uso
dei tam-tam e dei segnali di fumo alle moderne tecnologie.
L’introduzione dell’informatica ha
avviato
un’epoca
in
cui
l’informazione e il trattamento
dell’informazione,
emancipandosi
dall’uomo grazie all’evoluzione della
tecnologia
elettronica,
hanno
assunto
forme
sempre
più
automatiche.
Al fine di potere essere ‘gestita’ da
processi
automatici
è
stato
indispensabile
rendere
l’informazione sempre più autonoma
cioè indipendente dalla capacità
interpretativa dell’uomo.
Il lettore avrà certamente sentito
parlare
del
”codice
Morse”;
quando nel 1838 si realizzarono i
primi telegrafi via cavo (e successivamente via radio) gli unici ‘segnali’ che era possibile
produrre e distinguere in modo chiaro e immediatamente comprensibile erano due segnali
acustici di lunghezza rispettivamente lunga (linea) e breve (punto); la produzione dei
segnali avveniva da un lato della linea telegrafica (trasmettitore) agendo su un interruttore
a molla: ad una pressione breve corrispondeva un segnale del tipo punto mentre ad una
pressione lunga faceva seguito un segnale del tipo linea; dall’altro lato della linea telegrafica
il segnale elettrico ricevuto attivava un elettromagnete il cui movimento spostava una
penna su una striscia di carta trascinata da un meccanismo a orologeria.
Book in Progress
Pagina 5
Il messaggio più famoso del codice Morse è certamente l’SOS, il segnale di richiesta di
soccorso (“Save Our Souls” cioè “Salvate le nostre anime”) corrispondente alla sequenza:
Dove i primi tre punti stanno per ‘S’, le tre linee stanno per ‘O’ e gli ultimi tre punti stanno
nuovamente per ‘S’. Nella seguente tabella riportiamo la codifica delle lettere dell’alfabeto
inglese, omettendo la codifica delle cifre, dei segni di interpunzione e di altri segni
convenzionali.
L’alfabeto Morse è un primo esempio di CODIFICA BINARIA: il termine ‘binaria’ fa
riferimento all’uso esclusivo di DUE SIMBOLI (il punto e la linea) per la costruzione delle
lettere dell’alfabeto e quindi dei messaggi tra trasmettitore e ricevitore.
Dovrebbe risultare piuttosto chiaro il fatto che nessun tipo di codifica e quindi di
comunicazione sarebbe possibile con l’uso di UN SINGOLO e UNICO SIMBOLO (per
esempio solo il punto oppure solo la linea) perché cadrebbe ogni possibilità di DISTINGUERE
un segnale dall’altro.
Così come dovrebbe essere chiaro che per la rappresentazione codificata dell’informazione è
necessaria una CONVENZIONE (detta anche PROTOCOLLO), cioè un accordo tra le parti
che devono comunicare sul SIGNIFICATO da dare alle sequenze di simboli: tanto più diffusa
è tale convenzione tanto più estesa sarà la platea di possibili fruitori.
Book in Progress
Pagina 6
Il bit
Possiamo ora definire il concetto informatico di bit (Binary Digit = cifra binaria):
“Il bit è l’unità elementare di informazione cioè la minima quantità
di informazione codificabile”
Essendo indispensabili, come appena visto, almeno due simboli per rappresentare
un’informazione potremmo ridefinire il bit come uno tra i DUE simboli possibili adottati
nello specifico contesto binario (‘punto’ e ‘linea’ nell’alfabeto Morse oppure ‘0’ e ‘1’ nel
sistema numerico binario).
L’uso di un alfabeto binario (cioè basato sull’adozione di un alfabeto di due simboli) è
largamente utilizzato nella tecnologia in virtù della facile e quindi economica riproducibilità
nei vari contesti della fisica (elettricità, magnetismo, ottica) di uno tra due stati fisici:
tensione/non
tensione
(elettricità)
,
magnetizzato/smagnetizzato
(magnetismo),
luminoso/non luminoso (ottica).
E’ così
•
•
•
possibile memorizzare informazioni:
nella memoria centrale del PC (elettricità),
nel disco interno (hard-disk) del PC (magnetismo),
nel CD oppure nel DVD (ottica);
oppure ricevere informazioni dalla rete internet:
• nel PC attraverso una linea telefonica tradizionale (elettricità),
• nel PC attraverso una linea in fibra ottica,
• nel cellulare/smart-phone attraverso segnali radio (elettro-magnetismo)
E’ consolidata nell’informatica l’abitudine di riferirsi al BIT come a uno tra due valori scelti
tra ‘0’ (zero) e ‘1’ (uno). Questa scelta è dovuta all’ampio uso del SISTEMA NUMERICO
BINARIO nell’ambito dell’elaborazione matematica dei dati. In tale sistema le cifre ‘0’ e ‘1’
non hanno più un valore simbolico convenzionale ma realmente numerico.
Trasformando il PUNTO dell’alfabeto Morse in ‘0’ e la linea in ‘1’, codificheremo il messaggio
SOS originario:
‘· · · – – – · · ·’
Nel messaggio:
‘0 0 0 1 1 1 0 0 0’
dove ‘000’ (equivalente di ‘· · ·’) rappresenta la lettera ‘S’ mentre ‘111’ (equivalente di ‘–
– –’) rappresenta la lettera ‘O’.
La corrispondenza tra la sequenza di bit ‘111’ e la lettera ‘O’ è PURAMENTE
CONVENZIONALE.
Book in Progress
Pagina 7
BLA BLA BLA
BLA BLA BLA
BLA BLA BLA
101011101010
10001010001
01010001010
100010111011
Rappresentazione dei numeri
Siamo abituati a rappresentare i numeri nel Sistema Decimale nel quale è possibile
scrivere qualsiasi numero partendo da 10 simboli fondamentali. Il sistema decimale è un
sistema posizionale nel senso che ogni cifra assume un valore diverso a seconda della
posizione occupata nella rappresentazione del numero. Ad esempio 75 è diverso da 57
perché nel primo caso la cifra 7 indica il numero delle decine e la cifra 5 quello delle unità (
7*10 + 5*1 ) mentre nel secondo caso è esattamente il contrario ( 5*10 + 7*1 ).
Nel Sistema Binario, per rappresentare un numero, è sufficiente usare i due simboli 1 e 0;
con la differenza che lo stesso numero, rappresentato nel Sistema Binario, sarà scritto con
un maggior numero di cifre che nel Sistema Decimale.
Ad esempio il numero 7 del Sistema Decimale corrisponde a 111 del Sistema Binario
perché:
1*22 + 1*21 + 1*20 = 4 + 2 + 1 = 7
Il simbolo ‘*’ è stato utilizzato per rappresentare la moltiplicazione: questa convenzione è
ampiamente utilizzata nell’informatica.
Si definisce BASE della numerazione il NUMERO DI SIMBOLI (detti CIFRE) usati nella
rappresentazione dei numeri.
La base naturale per l’uomo è BASE 10 fondata sull’uso delle 10 cifre ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’,
‘6’, ‘7’, ‘8’, ‘9’. Un circuito che deve ricevere, trasmettere, memorizzare o elaborare dei dati
è tanto più semplice quanto più piccolo è il numero degli stati fisici che deve interpretare;
per questo motivo in informatica è stato scelto il Sistema Binario.
Nel Sistema Binario ci sono solo due stati fisici e quindi è il più semplice da utilizzare per
una macchina (non lo è per l’uomo). Anche mediante l’uso di due sole cifre ( 0 e 1) è
possibile rappresentare qualsiasi numero con la convenzione che ogni cifra viene
moltiplicata per una diversa potenza di 2 partendo da 20 e aumentando l’esponente man
mano che si procede da destra verso sinistra; così ad esempio (110101)2 (si legge uno uno
zero uno zero uno in base due) si trasforma in base 10 come segue:
1
1
0
1
0
1
*
*
*
*
*
*
2
5
(32)10 +
2
4
(16)10 +
2
0
3
+
2
2
(4)10 +
2
0
1
+
20
(1)10
=(53)10
(ossia 53 in base 10).
Book in Progress
Pagina 8
E’ quindi chiaro il fatto che la POSIZIONE delle cifre in un numero è tanto più importante (si
dice PIU’ SIGNIFICATIVA) quanto più A SINISTRA si trovano: la cifra MENO SIGNIFICATIVA
è quella più a destra, rappresentativa delle ‘unità’.
Se il lettore si sta ponendo la domanda “perché abbiamo sempre usato base 10 e non
piuttosto base 5 oppure base 3” sappia che la risposta più verosimile è “perché da sempre
per contare abbiamo usato le dieci dita delle mani!”.
Se avessimo otto dita per mano quale sistema di numerazione saremmo abituati a
utilizzare? La risposta non può che essere una: un sistema in BASE 16!
Come rappresenteremmo il nostro “trecentocinquantotto” ( in base 10)?
Per rappresentare le cifre in base 16 useremo le solite 10 cifre ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’,
‘8’, ‘9’ completate dalle sei lettere ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’; 16 simboli in tutto: i primi (da ‘0’
a ‘9’) con il significato numerico tradizionale, le lettere (da ‘A’ a ‘F’) con un NUOVO
SIGNIFICATO numerico: A=dieci, B=undici, C=dodici, D=tredici, E=quattordici e F=quindici.
Possiamo allora rispondere alla domanda!
In BASE 16 la posizione delle cifre non fa più riferimento a decine (10), centinaia (10*10),
ecc. ma piuttosto a sedicine (16), sedicine di sedicine (16*16) ecc.
Ecco la soluzione: il “trecentocinquantotto” in BASE 16 verrà scritto così:
15C
Da NON leggere “QUINDICI c” ma “uno cinque C in base sedici” e da interpretare (in base
10) come: 1*162+ 5*16 + 12 cioè 256+90+12=358; si scrive:
(15C)16 = (358)10
Dove le cifre tra parentesi indicano la rappresentazione posizionale del numero nella base
indicata in ‘pedice’ dopo le parentesi.
L’uso della base 16 in realtà è molto usata nell’informatica, come vedremo a breve.
Il byte
Abbiamo introdotto il concetto di BIT e spiegato come sequenze di bit possano essere
utilizzate per codificare simboli e per rappresentare numeri in base 2.
Si definisce BYTE una sequenza di 8 BIT: in informatica si ha una naturale predilezione per
le potenze del 2 come evidente conseguenza dell’uso della codifica binaria; uno dei primi
obiettivi della codifica è certamente quello della memorizzazione e della trasmissione di
messaggi e documenti testuali, scritti dunque concatenando lettere, cifre e simboli di
interpunzione; essendo codificabili su 8 bit 256 combinazioni distinte di 0/1 si ritenne che
tale quantità di bit fosse sufficiente per rappresentare tutti i simboli utilizzabili nella scrittura
di messaggi e documenti e da allora il BYTE (sequenza di 8 bit) è divenuta una sorta di unità
di misura della codifica (1 BYTE=1 carattere) e tuttora utilizzata per definire la capacità di
memoria: sempre privilegiando le potenze del 2 e utilizzando il simbolo ‘B’ per riferirsi al
byte, si definisce:
1KB
1MB
1GB
1TB
(1
(1
(1
(1
kilo-byte) = 1024 bytes
mega-byte) = 10242 bytes = 1.048.576 bytes
giga-byte) = 10243 bytes = 1.073.741.824 bytes
tera-byte) = 10244 bytes = 1.099.511.627.776 bytes
Una unità a disco da 1TB (un tera-byte) è dunque in grado di memorizzare più di un
miliardo di caratteri.
Book in Progress
Pagina 9
La codifica ASCII
Si è detto che su 1 byte cioè su 8 bit è possibile codificare un carattere: come stabilire
allora la corrispondenza tra byte e carattere?
La corrispondenza non può che essere basata su una “convenzione” cioè su un accordo
stabilito da un’apposita commissione composta da tecnici, studiosi, rappresentanti di
aziende, istituzioni e governi; una delle più famose e tuttora utilizzate convenzioni è quella
nota con il nome di ASCII, acronimo di “American Standard Code for Information
Interchange” (codifica standard americana per lo scambio di informazioni). Un codice ASCII
è dunque la rappresentazione binaria di un carattere: sono sufficienti 7 bit (quindi 128
combinazioni di 0/1) per rappresentare tutti i caratteri maiuscoli e minuscoli dell’alfabeto
inglese, le cifre da 0 a 9, i simboli di punteggiatura, le parentesi, gli operatori matematici
(‘+’, ‘-‘, ‘*’, ‘\’, ‘%’), gli operatori relazionali (‘=’, ‘>’, ‘<’) oltre ad alcuni caratteri ‘non
stampabili’ cioè non corrispondenti a simboli ma testuali utilizzati originariamente come
comandi nelle trasmissioni telegrafiche.
Segue la tabella delle codifiche ASCII su 7 bit, cioè dei primi 128 caratteri; si è riportata la
rappresentazione decimale (base 10), ottale (base 8) e esadecimale (base 16) della codifica
dei caratteri: la rappresentazione in base 2 è facilmente deducibile dalla rappresentazione in
base 16 e ciò ne giustifica il successo; per esempio il carattere ‘M’ è rappresentato in base
16 dal numero (4D)16 che nella tabella si riporta nella notazione equivalente 0X4D:
l’equivalente binario si ottiene semplicemente trasformando ogni singola cifra esadecimale
nell’equivalente binario, in questo caso:
(4D)16 = (0100 1101)2
Dove 0100 è l’equivalente binario di ‘4’ (esadecimale) e 1101 è l’equivalente binario di ‘D’
(esadecimale).
Book in Progress
Pagina 10
A titolo di esempio, la sequenza ASCII di codifica del testo “Ciao, mondo!” cioè:
C
i
a
o
,
0x61
0x6F
0x2C
01100001
01101111
00101100
m
o
n
d
o
0x20
0x4D
0x6F
0x6E
0x64
0x6F
00100000
01001101
01101111
01101110
01100100
01101111
è la seguente:
0x43
0x69
in binario:
01000011
01101001
Si vede bene dunque che il messaggio “Ciao, mondo” è stato ‘ridotto’ ad una FILA (in
inglese “FILE”, pronuncia ‘fail’ ) di byte: se volessimo memorizzarlo su un disco lo
memorizzeremmo proprio così, assegnando ad esso un nome per poterlo riconoscere e
recuperare in qualunque momento successivo.
E’ piuttosto evidente che se dovessimo codificare in binario un documento senza l’aiuto di
un qualche automatismo (vedremo il concetto di ‘programma’) ci troveremmo in grave
difficoltà così come nella stessa difficoltà si troverebbe chi dovesse decodificarlo nella
necessità di ricostruire il documento originale.
“Ciao, mondo” > codificatore > file binario
File binario > decodificatore > “Ciao, mondo”
Nel precedente schema il ‘codificatore’ e il ‘decodificatore’ sono degli strumenti che,
conoscendo perfettamente il criterio (cioè le regole) di codifica sono in grado di effettuare
tanto la trasformazione da documento testuale a documento binario quanto la
trasformazione inversa.
Concetto di “programma”
E’ difficile parlare di informatica evitando l’uso del termine ‘programma’. Più volte nei
paragrafi precedenti si è accennato al concetto di ‘automatismo’ cioè di un processo
automatico, non eseguito da un essere umano ma da una macchina: quali sono le azioni
eseguite dalla macchina? in che sequenza? Possono essere ridefinite?
Introduciamo allora una prima definizione di programma che sarà certamente approfondita
e diversamente formalizzata in un prossimo capitolo di questo testo:
Un programma è una sequenza di comandi la cui esecuzione è
finalizzata alla elaborazione di dati e alla produzione di effetti
predeterminati.
Un semplice esempio di programma può essere l’insieme delle operazioni da svolgere per
ricavare l’area di un rettangolo quando sono note la base e l’altezza:
Inizio
leggi la base;
leggi l’altezza;
moltiplica il valore della base per il valore dell’altezza;
Book in Progress
Pagina 11
mostra il risultato;
fine.
Queste istruzioni devono essere scritte in un linguaggio comprensibile al PC ossia un
qualsiasi linguaggio di programmazione (Basic, Pascal, C++, Java, …. ).
Il Book in Progress presenta in seguito degli appunti sulla programmazione.
Dal reale al virtuale
Introduzione
Si parla sempre più spesso di “virtualizzazione”: “virtualizzare” vuol dire riprodurre in forma
digitale fenomeni della realtà sensibile (il termine “digitale” deriva da digit ossia cifra e in
questo contesto indica una rappresentazione “binaria”); l’evoluzione tecnologica ha reso
possibile a più persone, per esempio, di incontrarsi in video-conferenza via Internet: come è
realizzabile tutto ciò? Il computer di ogni singolo partecipante e i dispositivi ad esso collegati
trasformano immagini e voce in sequenze di bit che attraverso la connessione Internet
giungono agli altri partecipanti dove vengono ricostruite e riprodotte rendendo così possibile
la comunicazione.
Così come un documento testuale può essere ‘virtualizzato’, cioè codificato in una sequenza
di bit utilizzando una convenzione come l’ASCII, anche altri OGGETTI come per esempio le
fotografie, i filmati, le registrazioni audio possono essere codificati utilizzando convenzioni
adeguate al caso.
Le “convenzioni” relative alla codifica di oggetti vengono anche dette “formati”; molto
spesso oggetti dello stesso tipo possono essere codificati in formati diversi in quanto basati
su criteri di codifica distinti; non sempre le convenzioni sono stabilite ‘a tavolino’ da una
commissione ma molte volte nascono dall’esperienza dei singoli produttori che, quando non
se ne riservano i diritti, le rendono pubbliche imponendo un cosiddetto “standard de facto”
al quale si adeguano altri produttori.
Codifica delle immagini
Parliamo della rappresentazione delle immagini (fotografiche o artificiali): i principali formati
usati nel web sono: JPG, BMP, GIF, PNG; la stessa immagine può essere codificata in uno
qualunque di tali formati ma con risultati variabili in termini di qualità, spazio occupato,
nitidezza, trasparenza, ecc. : non esistendo tra questi il formato ‘perfetto’ va scelto quello
che meglio si presta al particolare uso dell’immagine.
Un’immagine non è composta da ‘caratteri’ ma possiamo immaginarla come una
composizione di ‘punti’ che nel gergo informatico si dicono ‘PIXEL’ (Picture Element). Se
l’immagine è in ‘bianco e nero’ o, per essere più precisi, in ‘toni di grigio’ ogni pixel può
essere visto come la rappresentazione di un tonalità variabile dal ‘bianco’ al ‘nero’ passando
per un numero di livelli di ‘grigio’ legato al numero di bit utilizzati per la codifica (tale
numero si dice anche ‘profondità’): maggiore è il numero di bit e maggiore sarà il numero di
livelli di grigio rappresentabili; utilizzando per esempio 1 byte (cioè otto bit) è possibile
rappresentare 256 livelli di grigio: intendendo il valore numerico della codifica come un
indicatore di LUMINOSITA’ il numero 255 (il massimo rappresentabile su 8 bit,
corrispondente al valore binario 11111111) rappresenta il BIANCO (massima illuminazione
di una superficie bianca) mentre il numero 0 (il minimo rappresentabile su 8 bit,
corrispondente al valore binario 00000000) rappresenta il NERO (assenza totale di luce).
Book in Progress
Pagina 12
Esempio di immagine a livelli di grigio
Nel precedente esempio abbiamo illustrato una rappresentazione grafica di un albero
ottenuta con quattro distinte tonalità di grigio (dal bianco al nero): ogni pixel è dunque
codificato su 3 bit rappresentativi del livello di luminosità (111 = massima luminosità, cioè
“bianco” e 000 = assenza di luminosità, cioè “nero”).
Utilizzando un byte (8bit) al posto dei 3 bit potremmo disporre di una scala di 256
sfumature di grigio (dal bianco al nero) e quindi di una “tavolozza” più ricca per la
descrizione dei dettagli.
Il numero di bit utilizzato per ogni singolo pixel si dice “profondità” dell'immagine.
La rappresentazione codificata di un’immagine a colori non si discosta molto dalla
rappresentazione delle immagini a livelli di grigio: la ‘teoria del colore’ afferma che una
parte piuttosto ampia dei colori percepiti dai nostri occhi può essere immaginata come
sovrapposizione di TRE componenti
monocromatiche dette PRIMARIE; il lettore avrà
certamente avuto modo di sperimentare come nella pittura alcuni particolari tipi di ROSSO,
BLU e GIALLO si prestino ad essere combinati tra loro per riprodurre gli altri colori: il
BIANCO viene usato come una sorta di diluitore cioè di dispersore del pigmento colorato con
l’obiettivo di ottenere tonalità più chiare mentre il NERO è utilizzato per scurire i toni; la
necessità del ‘nero’ (a dispetto della teoria) scaturisce dal fatto che il miscuglio in parti
uguali dei tre colori primari produce il cosiddetto BISTRO, un nero piuttosto imperfetto a
causa delle impurità presenti nei colori primari. Anche nella tecnica tipografica si fa uso dello
stesso principio adottando il MAGENTA (un rosso violaceo), il CIANO (un celeste) e il GIALLO
come colori primari con l’aggiunta del NERO necessario per aggiungere ‘forza’ alle tonalità
scure ottenute con la sovrapposizione dei tre colori primari; nella tecnica tipografica si parla
di ‘quadricromia’ e si usa l’acronimo ‘CMYK’ intendendo proprio ‘C’ per ‘cyan’ (ciano), ‘M’ per
‘magenta’, ‘Y’ per ‘yellow’ (giallo) e infine ‘K’ che, nonostante in origine indicasse altro (‘Key
plate’, tecnica di allineamento delle lastre CMY), nella prassi corrente si intende per ‘nero’.
Tanto in pittura che in tecnica tipografica, tuttavia, il colore viene riprodotto per SINTESI
SOTTRATTIVA in quanto ciò che i nostri occhi vedono e percepiscono come colore è la parte
riflessa della luce (solare o comunque ‘bianca’) incidente su ciò che osserviamo: la parte
non riflessa viene in effetti assorbita, dunque SOTTRATTA, dal pigmento colorato.
In effetti siamo in grado di ‘vedere’ un quadro oppure un’immagine stampata SOLO se
siamo in un ambiente luminoso: riuscireste a vedere qualcosa in una stanza perfettamente
al buio?
Ben diversa è la situazione quando guardiamo lo schermo del computer oppure un
televisore: a differenza di quadri e stampe lo schermo EMETTE la luce e tanto meglio
vediamo quanto meno illuminato è l’ambiente circostante. Si parla allora di riproduzione del
colore per SINTESI ADDITIVA in quanto ciò che vediamo in effetti è la sovrapposizione di tre
sorgenti luminose primarie che in questo caso sono state individuate nella luce ROSSA, nella
luce VERDE e nella luce BLUE unite nella famosa sigla RGB (‘Red’, ‘Green’, ‘Blue’); l’assenza
del giallo e soprattutto il fatto che il giallo si ottiene come sovrapposizione di luce rossa e
Book in Progress
Pagina 13
luce verde, può forse creare un po’ di perplessità nel lettore, abituato a percepire il colore in
sintesi sottrattiva (quella del pittore).
La rappresentazione RGB del colore
Abbiamo precedentemente introdotto il concetto di rappresentazione di un’immagine per
mezzo di pixel organizzati in righe e colonne; nei precedenti esempi riferiti a immagini su
livelli di grigio abbiamo ipotizzato che ogni singolo pixel fosse rappresentato da un byte (8
bit); cosa cambia nelle immagini a colori? Per ogni pixel colorato, da rappresentare in
codifica RGB, occorre distinguere tre distinti valori riferibili alle componenti di luci rossa,
verde e blue; utilizzando un byte per ogni colore primario, dunque 3 byte (3*8=24 bit in
tutto) per ogni singolo pixel, possiamo così rappresentare un pixel nella tonalità più
luminosa di giallo:
R
G
B
11111111 11111111 00000000
0xFF
0xFF
0x00
255
255
0
Dove la prima riga rappresenta la codifica binaria, la seconda la codifica esadecimale (cioè
in base 16) e la terza la codifica decimale; un tono di giallo più scuro si può ottenere
riducendo la luminosità di rosso e verde, per esempio:
R
G
B
11000000 11000000 00000000
0xC0
0xC0
0x00
92
92
0
Per ottenere invece un giallo più chiaro occorre aggiungere un adeguato livello di luce blue:
R
G
B
11111111 11111111 10000000
0xFF
0xFF
0x80
255
255
128
Utilizzando 3 byte quindi 24 bit possiamo codificare ben 224 = 16.777.216 colori distinti: una
enormità, ben superiore alle nostre capacità percettive, tanto da ipotizzare nel criterio di
codifica l’uso di un numero minore di bit senza un sensibile degradamento della percezione
di un’immagine ma con il vantaggio di un minore ‘peso’ in termini di quantità di byte.
Codifica del video
Alla base della codifica dei “filmati” c'è l'osservazione, antica quanto la storia del cinema,
che osservando in rapida velocità sequenze di immagini fotografiche (dette “frame”)
contenenti piccole variazioni si ha la percezione della continuità e quindi del movimento.
Una buona velocità in tal senso è 30 frame al secondo.
Allo stesso modo, sequenze di immagini digitalizzate producono la stessa percezione:
possiamo dunque pensare un video digitale come ad un oggetto codificato in un file
contenente, in successione, i vari fotogrammi che compongono la sequenza video.
Quanto spazio occupa in termini di byte un filmato? Facciamo alcune ipotesi e... qualche
conto!
Immaginiamo che un filmato di 10 minuti sia composto da sequenze di immagini in alta
definizione 1280x720 (per un totale di 921.600 pixel). Ipotizziamo una codifica del colore
RGB su 24 bit (3 byte): ogni frame è codificato su 3x921.600 byte cioè 2.764.800 byte.
Book in Progress
Pagina 14
Se consideriamo 30 frame al secondo, equivalendo 10 minuti a 600 secondi, otteniamo un
numero di frame complessivo pari a 18.000 e quindi 49.766.400.000 byte che valgono più
di 46 GB (gigabyte) : una quantità di memoria enorme per soli 10 minuti di filmato!
In realtà una drastica riduzione della memoria può essere ottenuta utilizzando tecniche di
compressione al prezzo di una riduzione della qualità; si può tuttavia trovare un buon
compromesso tra compressione e qualità rendendo effettivamente fruibili i filmati, anche
attraverso internet.
Codifica dell’audio
Anche nel processo di codifica di un segnale acustico si ha la necessità di procedere “per
punti”, passando da un segnale evidentemente “continuo” (si dice “analogico”) ad un
segnale “numerico” (si dice “digitale”) consistente nella misura in istanti successivi del
segnale originale.
Tale misurazione (detta “campionamento”) deve avvenire ad intervalli di tempo molto vicini
tra di loro e tali da non “perdere” dinamiche significative (le “onde” rappresentate nella
figura): la successione delle misurazioni (si dicono “campioni”) deve garantire la
“ricostruibilità” del segnale originale!
Nel processo di trasformazione il segnale originale viene trasformato in una sequenza di
misure e dunque di numeri rappresentabili ovviamente in codifica binaria: 16 bit per ogni
singolo campione (quindi 65.536 livelli distinti di ampiezza) sono solitamente sufficienti per
una buona qualità di codifica del segnale acustico insieme ad una frequenza di
campionamento di 44.100 Hz (cioè 44.100 campioni ogni secondo) utilizzata per una qualità
CD (compact-disk).
Facciamo qualche calcolo: quanti byte sono indispensabili per codificare quattro minuti di
segnale audio (per esempio un brano musicale)? Presto detto:
numero di secondi
4 minuti = 4 X 60 secondi = 240 secondi
numero totale di campioni
44.100 campioni al secondo per 240 secondi = 10.584.000 campioni
numero totale di byte (16 bit = 2 byte)
2 byte X 10.584.000 = 21.168.000 byte = circa 20,18 MB (megabyte)
Quindi un brano musicale di 4 minuti necessita di oltre 20 megabyte di codifica per una
qualità audio di tipo CD (compact-disk).
In realtà è possibile ridurre di circa dieci volte il numero di byte facendo uso delle cosiddette
“tecniche di compressione” come per esempio MPEG (noto come MP3 nella versione MPEG-1
Audio Layer 3) che rendono facilmente “trasbortabili” i file audio sia attraverso la rete
internet sia con l'uso di memorie e strumenti di lettura (cioè di ascolto).
Book in Progress
Pagina 15
Classificazione dell’informazione
Giunti a questo punto torniamo sulla prima definizione del capitolo che qui riportiamo
arricchendola con l’aggiunta di un solo aggettivo:
“L’informatica si occupa della codifica BINARIA, della memorizzazione, della
trasmissione e dell’elaborazione dell’informazione”.
Il riferimento all’uso generalizzato della rappresentazione binaria dell’informazione
dovrebbe ora risultare chiaro: ogni genere di informazione che deve essere trattata da
sistemi automatici DEVE essere rappresentabile virtualmente come sequenza di BIT.
Viceversa per poter riprodurre l’informazione codificata in una sequenza di bit è necessario
conoscere i criteri adottati nella codifica. Una sequenza di bit del tipo:
101011110111011010001101011110111011011001101001100101010010000101001110
000101010111010000001101010110111111110011011000001101011111111011110011
010101010100000101010100010101111011010111001001011101010001110101010010
001000111010010011001100111010101010111101010001000010011101000010101000
non è interpretabile fintanto che non viene assegnato un criterio per decifrarla ossia un
criterio di decodifica.
Solo quando è stabilito il criterio di codifica (e dunque di decodifica) ha dunque senso
parlare di virtualizzazione dell’informazione secondo il seguente schema:
INFORMAZIONE >> CODIFICA >> INFORMAZIONE CODIFICATA
INFORMAZIONE CODIFICATA >> DECODIFICA >> INFORMAZIONE.
Quando l’informazione, dopo essere stata codificata, viene memorizzata in un FILE
memorizzato su un supporto fisico (per esempio il disco interno del PC) si assegna un NOME
a tale oggetto (il ‘file’) allo scopo di caratterizzare in modo chiaro ciò che rappresenta; nel
caso per esempio di un documento di testo contenente il curriculum vitae di un tale ‘Mario’,
codificato in ASCII, si può assegnare un nome del tipo:
curriculum_mario.txt
dove si distinguono due parti, la prima ‘curriculum_mario’ detta propriamente NOME; la
seconda ‘txt’ si dice ESTENSIONE e segue il PUNTO che fa da SEPARATORE.
Ciò che determina in modo chiaro il TIPO di informazione (quindi il criterio utilizzato nella
codifica) è l’estensione ‘txt’ che con una convenzione piuttosto diffusa nel mondo
dell’informatica indica un contenuto di tipo testuale ‘semplice’ cioè codificato con l’uso di
ASCII. Il nome, “curriculum_mario”, più che avere valore per l’operazione di decodifica ha
valore di ‘descrittore del contenuto’ ed è liberamente scelto dall’autore dell’oggetto come
‘pro-memoria’ sul contenuto: in questo modo, chi si trovasse a leggere nell’elenco dei file:
curriculum_mario.txt
curriculum_cesare.txt
curriculum_rosa.txt
mare.jpg
Book in Progress
Pagina 16
dedurrebbe senza fatica il tipo e il contenuto dei file (JPG è una tipica estensione per
immagini).
Nella seguente tabella si indicano le estensioni più utilizzate insieme al tipo di informazione
che generalmente caratterizzano:
Tipologia
Estensioni
Grafica bitmap o raster
bmp, jpg, gif, tiff, png, ico
Grafica vettoriale
eps, ai, wmf
File eseguibili, codice oggetto, librerie dinamiche
exe, com, lib, jar, war, ear, class, dll
Documenti
doc, docx, html, rtf, odt, txt, pdf
Audio e musica
wav, wma, au, mp2, mp3, mid
Archiviazione e compressione
zip, 7z, jar, arc, gzip, tar, tar.gz, rar
Linguaggi di programmazione
c, cpp, for, java, lisp, cob, asm, bas, php, asp, jsp, pl, py, rb
Linguaggi di descrizione e stilizzazione pagina
pdf, postscript, xsl-fo, css, xslt/xsl
Book in Progress
Pagina 17
BOOK IN PROGRESS
LA STRUTTURA DI UN CALCOLATORE
Competenze
Abilità
Conoscenze
Utilizzare, con autonomia e
Riconoscere le caratteristiche
Architettura e componenti
responsabilità, le reti e gli strumenti
logico-funzionali di un computer e il
informatici nelle attività di studio,
ruolo strumentale svolto nei vari
ricerca e approfondimento
ambiti.
di un computer
Interfacce e periferiche di
un computer
disciplinare.
INDICE DEGLI ARGOMENTI
La struttura di un calcolatore
Schema Funzionale di un Calcolatore.
19
Schema Concettuale di un Calcolatore.
19
Capacità di un Calcolatore.
20
Le Istruzioni.
21
Le unità di ingresso e di uscita.
22
La memoria secondaria.
23
Schema della macchina von Neumann.
24
Rappresentazione delle informazioni nella Memoria Centrale del
calcolatore .
25
Schema dell' Unità di Memoria Centrale.
28
Architettura dei calcolatori elettronici.
30
Funzionamento dell' unità di elaborazione.
32
Elaborazione delle istruzioni fetch decode execute.
A cura del prof Giuseppe Cavallo
Book in Progress
Pagina 18
La struttura di un calcolatore
Schema Funzionale di un
Calcolatore
Ambient
e
Esterno
Trasferimento
Elaborazione
Memorizzazi
one
Controllo
Schema concettuale di un
Elaborazione
Archiviazione
Comunicazione
Interconnessione
Book in Progress
Pagina 19
Il calcolatore è capace di:
a) Contenere Informazioni
b) Trasferire Informazioni ( da un punto all'altro al suo interno, da dentro a fuori e
viceversa)
c) Fare Calcoli con le informazioni che possiede
b) e c) significa ELABORARE, MANIPOLARE Informazioni in modo "preciso" e veloce.
Le istruzioni per eseguire queste manipolazioni sono scritte nei programmi.
Ci chiediamo adesso che cosa sono le Informazioni:
per comprendere ciò consideriamo un esempio di informazioni
Quali dati sono coinvolti nel calcolo dell’area di un triangolo ? :
a) il valore della base di un triangolo in cm.
b) il valore della altezza in cm.
c) il fatto che dobbiamo moltiplicare base per altezza.
d) il valore 2.
e) il fatto che dividendo base x altezza per 2 si ottiene l'area del triangolo.
DATI e ISTRUZIONI rappresentano quindi l'informazione che da ora in avanti
indicheremo con il termine INFORMAZIONI.
Il comportamento umano per la soluzione del su detto problema e’ il seguente :
- sapere quanto è la base e scriverlo su un foglio di lavoro b=5
- sapere quanto è l' altezza e scriverlo su un foglio di lavoro h=6
- fare il prodotto b x h=30 scritto sempre sul foglio
- dividere il prodotto ottenuto per 2, il risultato scritto sul foglio
- dire che l'area del triangolo è uguale a 15.
Il calcolatore lavora allo stesso modo , ma il foglio su cui normalmente appuntiamo
le nostre operazioni coincide con la memoria centrale, che e’ rappresentabile come una
matrice in cui le celle sono le locazioni dove sono memorizzate le informazioni .
Book in Progress
Pagina 20
Esempio di locazioni di memoria centrale dove sono coinvolte le informazioni precedenti
5
6
2
30
15
Le Istruzioni
calcolare bxh
dividere per 2
stampare l'area
Normalmente le istruzioni, cioè particolari tipi di informazioni, sono azioni che una
macchina deve eseguire e sono memorizzate in locazioni di memoria consecutive
Le informazioni nel nostro caso sono i passi del problema, cioè la base è da sapere,
l'altezza è da sapere, la moltiplicazione, la divisione per 2, il problema trovare l'area del
triangolo è da assegnare.
INPUT
Input
CPU
MEMORIA
Memoria
OUTPUT
Output
Possiamo immaginare che nella memoria sia già contenuto il programma da far
eseguire al calcolatore.
Quello che avviene può essere schematizzato cosi':
i dati vengono trasferiti dall'unita' di INPUT nella memoria; infatti c'e' bisogno di
far transitare da "fuori" a "dentro" il calcolatore i dati che dovranno servire alla
soluzione.
Book in Progress
Pagina 21
Questi dati vengono memorizzati in due locazioni (quelle con 5 e 6), che chiameremo
base e altezza .
Eseguendo l'istruzione: "calcolare base per altezza", il calcolatore esegue 6x5 e
memorizza il risultato in un'altra locazione che chiameremo prodotto. Eseguendo
l'istruzione calcolare prodotto/2, il risultato viene memorizzato in una locazione che
chiameremo area. Poi, eseguendo l'ultima istruzione, stampare area (cioe' il valore 15)
viene trasferito all’esterno del calcolatore, verso l'unita' di OUTPUT.
Nel calcolatore possiamo riconoscere le seguenti componenti strutturali fondamentali:
La MEMORIA è la parte del calcolatore per contenere le INFORMAZIONI. Per essere
più precisi in un sistema di elaborazione la memoria ha lo scopo di memorizzare
programmi, dati di ingresso, risultati parziali e finali.
La CPU è la parte che elabora INFORMAZIONI ed esegue calcoli e trasferimenti.
Infatti noi possiamo pensare la CPU come costituita da due parti :
la Unità Logico-Aritmetica (ALU) avente la funzione di eseguire calcoli logici
ed aritmetici
la Unità di Controllo (CU) che governa il funzionamento complessivo
dell'elaboratore.
L' INPUT è la parte ( Unità ) che è il canale attraverso cui le informazione vanno
memoria ( dall'esterno del calcolatore al suo interno ).
in
L' OUTPUT :
è il canale di trasferimento delle informazioni dalla memoria all'esterno
Quindi l' elaboratore esegue istruzioni di :
Input (ingresso)
Calcolo Trasferimento
Output (uscita)
controllate/eseguite dalla CPU (Central Processing Unit) cioè il processore del
computer.
Le unità di ingresso e di uscita
Ci limitiamo a presentare solo alcune delle unità che sono attualmente in uso.
UNITA' DI INPUT
Book in Progress
Pagina 22
La tastiera, il mouse,lo joystick, il microfono, il telefono (modem), il touch screen,
gli strumenti di misura.
UNITA' DI OUPUT
Il video (monitor), la stampante, lo speaker, la cuffia, gli strumenti medici, plotter.
Attraverso la tastiera l'utente invia al computer comandi e dati mentre attraverso il
video l'utente riceve sia l' output dei programmi sia la visualizzazione delle
informazioni da lui inserite.
La memoria secondaria
La memoria centrale che abbiamo visto è destinata ad archiviare istruzioni e dati che
siano immediatamente disponibili per essere trattati dalla CPU.
Se si vuole (e si deve) memorizzare le informazioni in modo permanente serve la
memoria secondaria o ausiliaria chiamata anche memoria di massa .
Queste informazioni vanno trasferite in memoria centrale ogni qualvolta vanno
elaborate. La memoria secondaria (MS) è strutturalmente diversa dalla memoria
centrale (MC) la quale ha la caratteristica di cancellare tutte le informazioni ivi contenute
ogni qualvolta non sia alimentata elettricamente; innanzitutto è molto più grande in
termini sia fisici che di capacità di immagazzinamento di INFORMAZIONI, poi è
più lenta nel senso che per prelevare qualsiasi informazione da essa l'elaboratore
impiega un tempo maggiore per l’accesso ai dati . Esempi di memoria secondaria sono:
i floppy disk, i cd-rom, l'hard disk, i nastri magnetici. L'hard disk può avere una
dimensione da 100 a 1000 volte maggiore della MC, ma queste INFORMAZIONI
contenute nello hard disk devono essere trasferite sempre in memoria centrale.
Quanto detto fin qua coincide con l'Architettura di Von Neumann.
Lo scienziato John Von Neumann nel 1946 pubblicò un articolo sul progetto di una
macchina per il calcolo automatico che introduceva il concetto di programma registrato
in memoria.
Il calcolatore digitale moderno nasce all'inizio degli anni '40 per merito di John von
Neumann, J. Presper Eckert e John William Mauchly. Questi concettualizzarono l'idea
di macchina ad accesso casuale (RAM Random Access Machine).
Tale nomenclatura sta a indicare che il calcolatore ha una memoria organizzata come
sequenza di celle di informazione, in cui il tempo per accedere a una cella non dipende
dalla cella stessa (non si devono scorrere le celle sino a trovare quella cercata, la si
accede immediatamente).
Tale macchina è anche detta macchina di von Neumann.
Book in Progress
Pagina 23
La caratteristica fondamentale della macchina di von Neumann è che la memoria
contiene sia i programmi che i dati. Il programma è:
la sequenza di istruzioni che devono essere eseguite
i dati le informazioni che il programma elabora per produrre il risultato (queste
informazioni includono:
i dati di ingresso
parte dei dati intermedi (che possono anche essere memorizzati
nei registri interni della CPU per poi essere cancellati
i risultati della computazione.
Questa rappresenta la fondamentale differenza tra le macchine costruite o pensate
sino a quel momento e i moderni calcolatori digitali:
il programma memorizzato nella stessa memoria dei dati e la possibilità che un
programma modifichi un altro programma nel senso che possa scrivere nell’area di
memoria dove risiede un altro programma .
Schema della macchina von Neumann
Gli elementi funzionali della Macchina sono quattro :
Unita’ di elaborazione ( CPU , Central Processor Unit)
Memoria centrale
Periferiche
Bus di sistema
CPU
Book in Progress
Memoria
Interfaccia
periferica 1
Interfaccia
periferica 2
Interfaccia
periferica n
Pagina 24
L'Elaboratore Elettronico è una macchina costituita da vari organi, dette UNITÀ, che
possono essere così suddivise:
•
•
•
Unità centrale di Elaborazione (Microprocessore) composta dall'UNITÀ di
CONTROLLO, che ha la funzione di governare tutte le attività di sistema, e
dall'UNITÀ ARITMETICO-LOGICA (ALU), che realizza le operazioni di tipo
aritmetico (addizioni, sottrazioni, moltiplicazioni, ecc.) e logico decisionale (AND,
OR, NOT, confronti, ecc.).
Unità di INPUT e OUTPUT, in pratica tutti quei dispositivi che consentono di
immettere informazioni nel sistema e di leggerne le risposte.
Unità di Memoria Centrale (ROM e RAM) e di Memoria di Massa (Nastri e
Dischi), in altre parole tutti i dispositivi atti a contenere informazioni binarie, con
metodi differenti secondo la tecnologia usata; la scrittura e la lettura di queste
informazioni avvengono sotto il controllo dell'Unità Centrale.
Questa struttura di massima (schema di Von Neumann) è comune sia ad un grande
elaboratore sia un microcomputer; tutti i componenti fisici che costituiscono la base
dell'elaboratore sono indicati con il termine HARDWARE, mentre l'insieme dei
programmi che consentono alla macchina di funzionare formano il SOFTWARE.
Il tempo necessario per l'esecuzione di ogni istruzione elementare è variabile secondo
l’operazione e secondo il microprocessore, ma è misurabile nell'ordine dei nanosecondi
(miliardesimi di secondo); il dispositivo che scandisce questo tempo è un oscillatore al
quarzo (detto CLOCK) la cui frequenza è misurata in MegaHertz.
Le informazioni si misurano in termini di celle elementari binarie:
BIT la singola cifra binaria che può assumere il valore 0 o 1.
BYTE un gruppo di 8 bit, generalmente identificato con una cella di memoria.
KILOBYTE Kb pari a 1024 byte = 2 ^ 10
MEGABYTE Mb pari a 1048575 byte = 2 ^ 20
GIGABYTE Gb pari a 1073740800 byte = 2 ^ 30
TERABYTE Tb pari a 1024 Gb = 2 ^ 40
Rappresentazione delle informazioni nella Memoria Centrale del calcolatore
Precisazioni
I
: acquisizione di nuovi dati che vanno in memoria centrale(Input).
O
: dati da memoria centrale all'esterno (Output)
MS : memorizzazione permanente dei dati ( Memoria di Massa )
MC : è l'area di lavoro che contiene dati e istruzioni da usare (Memoria
Centrale).
Book in Progress
Pagina 25
CPU : usa quel che c'e' in memoria centrale per eseguire operazioni di
trasferimento e di calcolo (Central Processor Unit) .
L'informazione elementare prende il nome di bit (binary digit) e può assumere il
valore zero od il valore uno. Dal punto di vista fisico tale informazione è realizzata in
memoria con dispositivi a due stati (FLIP-FLOP) , es. stato spento 0, stato acceso 1.
Possiamo schematizzare ciò dicendo che :
il bit vale 0 se è NO, FALSO, SPENTO, NON PASSA CORRENTE.
Il bit vale 1 se è SI, VERO, ACCESO, PASSA CORRENTE.
La memoria è una struttura mono-dimensionale suddivisa in celle di dimensione
fissa. Ogni cella può essere individuata univocamente mediante un' indirizzo
(numerico) ed è costituita da una sequenza di N valori binari (valori 0 e 1).
Quindi abbiamo detto che un bit o meglio il circuito fisico che lo realizza è già sufficiente
a rappresentare due informazioni numeriche
0 oppure 1 .
Tanti bit implicano tante informazioni distinte.
Esempio se abbiamo 2 bit possiamo rappresentare i numeri da 0 fino a 3 , non di più! ;
con 2 bit rappresento 00, 01, 10, 11 rispettivamente: 0, 1, 2, 3. Il numero 4 con 2 bit non
lo si può rappresentare.
Nel caso che la MC avesse una capacità di 3 bit potrei rappresentare 8 informazioni
diverse ad esempio i numeri da 0 fino a 7.
000, 001, 010, 011,100, 101, 110, 111 che corrispondono ai valori 0,1,2,3,4,5,6,7
Con 4 bit si rappresentano (2 ^ 4) informazioni diverse valori da 0 a 15.
Ad esempio tutti i numeri decimali che vanno da 0 fino a 15. In generale con n bit si
rappresentano (2 ^ n) informazioni diverse. Se le informazioni sono numeri, si riescono
a rappresentare tutti i numeri compresi fra 0 e (2 ^ (n) -1) estremi inclusi.
Codifica binaria dei numeri naturali tra 0 e 31con 5 bit
0
00000
8
1
00001
9
01001
17
10001
25
11001
2
00010
10
01010
18
10010
26
11010
3
00011
11
01011
19
10011
27
11011
Book in Progress
01000
16
10000
24
11000
Pagina 26
4
00100
12
01100
20
10100
28
11100
5
00101
13
01101
21
10101
29
11101
6
00110
14
01110
22
10110
30
11110
7
00111
15
01111
23
10111
31
11111
La codifica di ogni dato avviene con sequenze di bit.
In realtà la memoria centrale contiene centinaia di milioni di bit, questo implica che si
possono rappresentare molte informazioni. Per comodità si indicano con il termine di :
byte gruppi di 8 bit
word gruppi di 16/32 bit.
Quindi abbiamo detto che la MC è immaginabile come un insieme di celle
indirizzabili (ogni
cella o locazione di memoria è distinta dalle altre da un
numero detto indirizzo ) in cui l'indirizzo (ADDRESS) è un numero progressivo.
Ad ogni cella corrisponde la coppia < indirizzo, valore >
cella n. 100
< indirizzo , valore >
"
“
101
"
"
“
102
"
"
“
103
"
"
Specificando un indirizzo la CPU può accedere alla cella corrispondente per leggere
l'informazione contenuta o memorizzare una informazione (numerica) nella cella.
Accedere ad un dato ( informazione ) significa quindi :
selezionare mediante l'indirizzo la cella in cui esso è memorizzato
prelevarne il valore.
Il valore della cella è sempre una stringa binaria (sequenza di bit).
Per la memorizzazione di un dato, bisogna stabilire l'indirizzo della cella in cui si
vuole introdurlo.
La MC è costituita da RAM (random access memory) memoria ad accesso diretto od
uniforme, dato che il tempo per accedervi è costante, cioè non dipende dalla posizione
della cella nella RAM.
Il tempo di accesso, definito nel periodo di tempo che passa tra quando si chiede una
informazione e quando tale informazione viene resa effettivamente disponibile, nelle
Ram dell'ultima generazione è inferiore ai 10 ns.
Book in Progress
Pagina 27
Anche le ROM (read only memory) fanno parte della MC, ma non vi si possono
memorizzare nuovi valori; la RAM ( detta anche memoria volatile ) quando si spegne il
computer si smemorizza, mentre la ROM conserva le informazioni ivi contenute.
Una breve parentesi : la definizione del concetto di algoritmo.
Un algoritmo è un procedimento risolutivo del problema, cioè un insieme di regole di
calcolo che, eseguite ordinatamente, permettono di calcolare i risultati del problema a
partire dalle informazioni a disposizione.
Perchè un insieme di istruzioni possa considerarsi un algoritmo deve rispettare le
seguenti proprietà:
Non ambiguità :
le
istruzioni
devono
essere
univocamente
interpretate
dall'esecutore dell'algoritmo (macchina o uomo).
Eseguibilità :
l'esecutore deve essere in grado, con le risorse a disposizione, di
eseguire ogni istruzione ed in un tempo finito.
3) Finitezza :
l'esecuzione dell'algoritmo deve terminare in un tempo finito per
ogni insieme di valori di ingresso.
Per delegare ad un calcolatore la soluzione di un problema, cioè l'esecuzione di una
serie di calcoli si deve:
individuare almeno un algoritmo adatto alla risoluzione del problema,
individuare una rappresentazione dell'algoritmo, dalle informazioni a
disposizione e di quelle utilizzate dall'algoritmo per mezzo di un linguaggio
detto: linguaggio di programmazione.
Il programma è la rappresentazione / traduzione
programmazione.
Book in Progress
dell'algoritmo in un linguaggio di
Pagina 28
Schema dell' Unità di Memoria Centrale
AR Address Register
B
Decodifica
U
CPU
S
MC Memoria Centrale
DR Data Register
Struttura del Data Path ( percorso dei dati)
Registri
A
A
+
A
B
Registri Uscita Dell’ALU
ALU
Registri Ingresso ALU
B
ALU
A
+
B
B
La comunicazione fra la memoria ed il BUS avviene attraverso i
Registri , cioè aree
di memorizzazione aventi tale compito. Precisamente attraverso il registro degli
indirizzi AR ( ADDRESS REGISTER ) ed il registro dati DR ( DATA REGISTER ).
E' appunto attraverso questi due registri che avviene:
il
prelievo del contenuto di una cella di memoria ( la lettura, che non
distrugge il contenuto della cella )
la scrittura in una cella ( che cancella il contenuto precedente della cella ).
Book in Progress
Pagina 29
Il registro AR e la memoria hanno una ovvia correlazione: dato che il registro è formato
da 32 bit la memoria non può avere un numero di celle maggiore di ( 2 ^ 32) , perchè il
massimo numero di indirizzi che si possono rappresentare con 32 bit è appunto ( 2
^ 32). Il blocco DECODIFCA. "Decodificatore di indirizzi", ha il compito di selezionare
tra tutte le celle della memoria, quella cella che ha l'indirizzo contenuto nel registro AR.
Più è grande la MC, più grandi e complessi saranno i programmi e la quantità di dati
che essa potrà contenere.
Le Ram degli home computer di ultima generazione hanno dimensioni che vanno ben
oltre il Gb.
Architettura dei calcolatori elettronici
Abbiamo visto che la CPU (processore ) è il cervello del computer ossia è un insieme
di circuiti integrati che gestiscono la Esecuzione di istruzioni macchina
di
calcolo e di trasferimento .
Con trasferimento intendiamo:
ricevere un dato in MC da Input
emettere un dato da MC verso Output
copiare un dato da MS a MC.
Col termine calcolo intendiamo: accedere ad una cella di memoria e ad esempio
sommare il suo contenuto con qualcosa.
Quindi l'istruzione macchina è una istruzione eseguibile (attivazione di un circuito) dalla
CPU.
Un programma eseguibile coincide con una sequenza di istruzioni macchina.
Ciascuna istruzione macchina è CODIFICATA <----> RAPPRESENTATA in una cella.
Es. se vogliamo caricare nel registro R1 il contenuto della cella di indirizzo 144 (144 che
in binario si rappresenta con 10010000), allora "caricare" (load) è una operazione
identificata da un certo codice operativo es. 0000, per cui nella cella della memoria
centrale avremo questa istruzione:
0000
10010000
codice operativo
( OC Operative Code )
indirizzo operando
( OA Operand Adress )
La sequenza di istruzioni macchina, memorizzate in MC è accessibile dalla CPU che
così può vedere ed eseguire le istruzioni.
Book in Progress
Pagina 30
Per la CPU possiamo pensare ad una divisione di comodo CPU=CU+ALU+REGISTRI
dove Unit Control (CU) , ha il compito di:
prelevare dalla memoria le istruzioni di un programma
interpretarle attraverso un organo di decodifica
farle eseguire regolando le azioni delle varie unità
del trasferimento dei dati .
Per queste azioni necessita di una funzione di temporizzazione il clock che
coordini le varie azioni.
L'ALU si occupa del calcolo, infatti essa riceve dalla CU il comando da eseguire,
insieme con l' operando o gli operandi, su cui l'operazione deve essere effettuata.
Per quanto riguarda i REGISTRI
elaboratori possiede:
si puo’ asserire che :
la maggior parte degli
il Program Counter ( contatore di programma PC ), che contiene in ogni
istante l'indirizzo della prossima istruzione che deve essere eseguita
l'Instruction Register ( registro istruzione IR ) in cui è contenuta l'istruzione
che deve essere interpretata e poi eseguita "istruzione corrente ",
gli Accumulatori ( ACC ) in cui sono contenuti gli operandi di una data
istruzione ed al termine dell'esecuzione della istruzione contengono il risultato,
il registro Program Status Word ( parola di stato PSW ) che fornisce con il
suo contenuto particolari informazioni sull' ultima istruzione eseguita - ad
esempio se il risultato dell'operazione aritmetica sia zero od il segno del risultato
od il riporto del risultato ecc.
Quindi nel PC c'e' l'indirizzo della prossima istruzione da eseguire, (cioè quella dopo, in
memoria centrale, di quella copiata in IR )
ACC è memoria (poche celle) ausiliaria per operazioni.
PSW contiene info nell' ultima esecuzione (risultato= 0,pos.,neg.; riporto; overflow ecc ).
Book in Progress
Pagina 31
Funzionamento dell' unità di elaborazione
Elaborazione delle istruzioni
Immaginiamo che un programma eseguibile cioè una sequenza di istruzioni macchina
sia stata caricata in MC a partire da un certo indirizzo es. 100.
La CPU accede a queste istruzioni una alla volta e le esegue:
1. Fase di Fetch ( Alimentazione ) :
l'istruzione che deve essere eseguita viene prelevata dalla cella di
memoria 100 e trasferita nel registro PC
il contenuto della cella di indirizzo PC viene trasferito nel registro
istruzioni IR
il Program Counter viene incrementato di 1 cioè PC = PC + 1; adesso
dentro PC c'e' l'indirizzo della prossima istruzione da eseguire .
2. Fase di Decodifica ( Decode ) :
In base al contenuto dell'IR l'istruzione viene "decodificata" ( che istruzione è ) .
3. Fase di Execute ( Esecuzione ) :
In base al codice operativo OC, si attiva il circuito della CPU corrispondente, che
userà OA ed eseguirà l'istruzione.
4. Torna al punto 1.
Book in Progress
Pagina 32
BOOK IN PROGRESS
I SISTEMI INFORMATIVI
Competenze
Abilità
Conoscenze
problematiche che coinvolgono un
Riconoscere le caratteristiche di un
Ciclo di vita del sistema informativo
sistema informativo
sistema informativo
Analizzare in maniera autonoma le
A cura del prof Giuseppe Cavallo
adattamenti a cura di Salvatore Madaro
Book in Progress
Pagina 33
INDICE DEGLI ARGOMENTI
I SISTEMI INFORMATIVI 35
Il Ciclo di vita di un sistema
informativo
38
Componenti del sistema
informativo 41
Centro del controllo ed attività
critiche.
42
Sistema Informativo Automatizzato
43
Il Sistema Informativo dal punto di
vista strategico . 43
Evoluzione dei sistemi informativi
44
Sistema di elaborazione dati EDP
45
Sistema di reporting aziendale MIS
45
Sistema di supporto alle decisioni DSS
46
Le tipologie di sistemi informativi.
46
Sistemi di gestione
dei flussi di lavoro.
Sistemi gestionali 47
Sistemi per l’automazione d’ufficio.
47
Sistemi di comunicazione.
47
Sistemi per il governo dell’azienda.
47
Sistemi statistici. 47
Sistemi territoriali.
Book in Progress
47
48
Pagina 34
I SISTEMI INFORMATIVI
Definizione
Un Sistema Informativo è un insieme di apparecchiature, procedure e persone
che hanno il compito di:
Raccogliere
Organizzare
Selezionare
Archiviare
Comunicare i dati riguardanti l’attività di un’organizzazione.
Con l’obiettivo di :
mettere a disposizione dei responsabili delle decisioni operative tutte le
informazioni necessarie per effettuare le migliori scelte possibili .
Il sistema informativo è una componente fondamentale di ogni organizzazione.
La definizione del sistema informativo di una organizzazione richiede l’identificazione:
della missione
degli obiettivi
delle risorse disponibili
dei processi di gestione delle risorse.
Il processo è considerato l’elemento chiave di un’organizzazione e rappresenta l’
insieme delle attività tra loro correlate e finalizzate alla realizzazione di un risultato
definito misurabile, che coinvolge più risorse ed attraversa più ruoli e strutture.
I
sistemi
informativi
devono
essere
coerenti
con
i
processi
identificati
nell’organizzazione.
Nel seguente grafico è rappresentato l’insieme dei processi coinvolti nell’attuazione di
un sistema informativo contabile che ha come obbiettivo la produzione dei cedolini
paga dei dipendenti di una azienda
Book in Progress
Pagina 35
.
Secondo un’ottica tradizionale i processi si distinguono in :
Processi operativi
Processi di controllo
Processi direzionali
Di conseguenza anche i sistemi informativi che li supportano e realizzano risentono di
questa classificazione, richiedono perciò diverse modalità di realizzazione .
L’evoluzione dei sistemi informativi ha portato ad affrontare in ordine consecutivo :
l’automazione dei processi operativi
l’automazione delle attività di controllo
l’automazione delle attività direzionali.
Il percorso di evoluzione dei sistemi informativi ha comportato una loro graduale
integrazione, corrispondentemente l’informatica si è evoluta da tecnologia di
produzione, con obiettivi principalmente di efficienza , a strumento di governo delle
aziende.
Book in Progress
Pagina 36
In un sistema informativo è necessario stabilire quali tipologie di dati e di attività devono
essere trattati: la loro identificazione guida alla scelta delle opportune tecnologie e
metodologie da impiegare per lo sviluppo.
Realtà
da
Rappresenta
re
Sistema Informativo
Rilevazione
Tecnologie
Modalità
Strumenti
Book in Progress
INFORMAZIONI
QUANTITATIVE
QUALITATIVE
Pagina 37
Il Ciclo di vita di un sistema informativo
Le fasi di realizzazione di un sistema informativo sono generalmente le seguenti:
nascita dell'esigenza
Data una specifica realtà si tende a migliorare la situazione
esistente tramite il perseguimento di determinati obiettivi.
studio di fattibilità
serve a definire in maniera per quanto possibile precisa:
•
quali potrebbero essere i vari componenti del sistema ;
•
i costi di realizzazione
•
le varie alternative possibili,
•
l’analisi costi/benefici per singola alternativa
•
stabilire le priorità della realizzazione delle varie componenti
del sistema.
raccolta e analisi dei requisiti:
consiste:
•
nell'individuazione e nello studio delle proprietà e delle
funzionalità che il sistema informativo dovrà avere;
•
nel coinvolgimento di tutti coloro coloro che dovranno
utilizzarlo effettivamente al termine della realizzazione;
•
nel produrre una descrizione completa ma generalmente
informale di tutti i dati coinvolti e delle operazioni su di essi;
•
nella descrizione , in maniera il più possibile precisa , degli
input da fornire al sistema e degli output attesi;
•
nel definire i requisiti software e hardware del sistema
informativo.
progettazione:
riguarda :
•
la progettazione dei dati : definizione delle strutture dati che
conterranno in seguito le informazioni elementari
•
la progettazione delle applicazioni: le caratteristiche dei
progetti applicativi
•
la progettazione dell'architettura tecnica di sistema :
rappresenta l'infrastruttura individuandone le caratteristiche
in termini di sistemi (server), connettività, sicurezza fisica e
logica.
Book in Progress
Pagina 38
sviluppo:
consiste:
•
nella realizzazione del sistema informativo secondo la
struttura e le caratteristiche definite nella fase di
progettazione.
•
nella creazione e caricamento di una base di dati
•
nella produzione del codice dei programmi.
validazione e collaudo:
consiste :
•
nella verifica del corretto funzionamento di tutte le
applicazioni ( il sistema risponde correttamente a tutti i
requisiti?)
•
nella verifica della qualità del sistema informativo.
•
nella attivazione di una fase sperimentale che possa
coinvolgere tutte le condizioni operative anche in situazione
di stress del sistema
avviamento:
Book in Progress
consiste :
•
nella messa in funzione del sistema
•
nell’affiancamento per un periodo transitorio all’utente finale
•
nell’individuazione di possibili affinamenti delle procedure e
di possibili bug di analisi scaturiti dalla messa in funzione e
dall’utilizzo delle nuove procedure
•
nell’erogazione di corsi di formazione al personale addetto
all’utilizzo del sistema
•
nel recupero e travaso di dati strategici provenienti da
applicazioni preesistenti
•
nell’attivazione dei collegamenti tra tutte le procedure e le
applicazioni
•
nell’avvio della operatività reale.
Pagina 39
funzionamento:
•
consiste nell’operatività a regime del sistema che svolge tutti
i compiti per il quale e’ stato progettato. Se non si verificano
malfunzionamenti o revisioni delle funzionalità del sistema,
questa attività richiede solo operazioni di gestione e
manutenzione
manutenzione:
consiste :
•
nella manutenzione correttiva nella quale si consolida e si
correggono eventuali anomalie non rilevate nella fase di
collaudo e di avviamento
•
nella manutenzione evolutiva dove
il sistema cresce
arricchendosi con altre funzionalità scaturite in un secondo
momento dopo la fase di analisi e di sviluppo dovute
all’insorgere di nuove esigenze applicative .
Il processo su indicato non è detto che sia sempre strettamente sequenziale, in
quanto spesso durante l'esecuzione di una attività citata bisogna rivedere decisioni
prese nell'attività precedente. Quello che si ottiene è un ciclo di operazioni di tipo
ripetitivo che termina con il corretto funzionamento del sistema .
Molto spesso , in accordo con le disponibilità finanziarie , si aggiunge una ulteriore
attività accessoria che prevede :
•
realizzazione rapida di un prototipo semplificato del sistema mediante
l’utilizzo di sistemi software
•
sperimentazione delle funzionalità del sistema mediante il prototipo
In genere tale fase di verifica porta, di conseguenza, un affinamento dei requisiti del
progetto e quindi revisioni successive con l’inevitabile riprogrammazione di tutte le
attività coinvolte.
Book in Progress
Pagina 40
Componenti del sistema informativo.
Il sistema informativo è da interpretarsi come un sistema aperto interagente con le altre
parti costituenti l'azienda, nonché l'ambiente esterno all'azienda.
Il sistema informativo si configura come un insieme ordinato di elementi , anche molto
diversi tra loro, che raccolgono, elaborano, scambiano e archiviano dati con lo scopo di
produrre e distribuire le informazioni alle persone che ne hanno bisogno, nel momento e
nel luogo adatto.
Il sistema informativo in una impresa deve quindi essere visto come quel complesso di
elementi in grado di fornire le informazioni necessarie alle persone che lavorano a tutti i
livelli della struttura .
Storia
Il primo tentativo di identificare il concetto di sistema informativo è stato fatto da
Forrester intorno al 1960. La sua intuizione deriva dall’osservazione che i sistemi
sociali, e quindi le aziende, presentano al loro interno attività che necessitano di un
elevato grado di attenzione da parte di organi di controllo:
si tratta di attività critiche per il conseguimento degli obiettivi del sistema.
Book in Progress
Pagina 41
Centro del controllo ed attività critiche.
INTERVENTI
INFORMAZIO
NI
OBIETTIVI
RESPONSABIL
E
DEL
CONTROLLO
AZIONI
AZIONI
ATTIVITA’
CRITICHE
RISORSE
RISULTATI
RISORSE
Il centro del controllo è un punto di decisione: interviene quando le informazioni
sull’andamento delle attività dell’organizzazione indicano la necessità di azioni
correttive.
In questa ottica il sistema informativo può quindi essere visto come un sottosistema del
sistema di controllo aziendale e deve svolgere un ruolo di standardizzazione nella
rilevazione e misurazione dei fenomeni aziendali.
Book in Progress
Pagina 42
Sistema informativo si può avvalere di un sistema informatico.
Con la denominazione di Sistema Informativo Automatizzato si intende quella
parte del sistema informativo che è realizzata con tecnologie informatiche.
Le informazioni vengono :
raccolte,
elaborate,
archiviate,
scambiate mediante l’utilizzo delle tecnologie dell’informazione e della
comunicazione.
Nelle varie istituzioni , prima dell’introduzione delle macchine d’ufficio e degli elaboratori
elettronici, le informazioni venivano gestite con metodi manuali.
Si sono così instaurate complesse e lunghe procedure finalizzate a:
registrare e gestire i dati su supporti cartacei
archiviare i documenti
ricercare negli schedari
La manualità di queste operazioni comportavano una notevole lentezza nei riscontri
nonché una elevata generazione di errori .
Il tasso di errore elevato dovuto ai motivi su indicati costringe ad introdurre cicli di
controllo delle informazioni: determinando la bassa efficienza del sistema.
Queste procedure si basano sulla gestione di processi anche complessi attraverso
meccanismi che richiedono attività non strettamente necessarie. Si pensi ad esempio al
documento o fascicolo che arriva sulla scrivania di chi deve poi effettuare una
lavorazione:
l’oggetto sul quale si basa il funzionamento del processo è il documento
cartaceo.
Per il funzionamento del processo in questo caso è necessario:
fotocopiare il documento in numero quantomeno pari alle lavorazioni in parallelo
che deve subire!
Le tecnologie informatiche e di comunicazione incidono proprio sull’esecuzione delle
varie operazioni accelerando le funzioni di registrazione, elaborazione, archiviazione,
ricerca dei dati.
Book in Progress
Pagina 43
Il Sistema Informativo dal punto di vista strategico .
Un caso molto particolare di risorsa su cui operano tutte le aziende è l'informazione.
L'informazione è infatti una risorsa che implica tutte le altre risorse.
I processi, per poter essere eseguiti, si basano sulla conoscenza delle risorse sulle
quali agiscono, in altri termini hanno bisogno di informazioni: l'insieme delle informazioni
gestite, - generate, utilizzate, elaborate dai processi costituisce il sistema informativo.
Per esempio, i processi aziendali che riguardano la gestione del personale hanno
bisogno di informazioni riguardanti :
i dati sulla disponibilità, sul mercato del lavoro, di personale con specifiche
caratteristiche professionali
le informazioni relative alle persone contattate
la modalità di valutazione del personale
l’individuazione del tipo di formazione idoneo
la raccolta dei dati relativi alle singole persone presenti nell’azienda in organico
Quella parte del sistema informativo in cui le informazioni sono raccolte,
elaborate, archiviate, scambiate mediante l’uso delle tecnologie della
informazione e della comunicazione costituisce il Sistema Informatico.
Evoluzione dei sistemi informativi: dal supporto all’operatività alle decisioni.
Inizialmente le imprese sono partite dalle applicazioni di natura operativa. Gli
investimenti richiesti dall'automazione erano giustificati dai volumi di dati trattati e dalla
ripetitività delle procedure (tipicamente l'elaborazione di stipendi e fatture). Si tratta in
sostanza delle applicazioni basilari che storicamente rappresentano il risultato tangibile
e positivo dell'introduzione di calcolatori nelle aziende.
L'insieme di queste applicazioni è stato denominato sistema di elaborazione dati, nella
letteratura anglosassone EDP System (Electronic Data Processing System).
In un secondo tempo sono stati costruiti sistemi informativi aventi lo scopo di supportare
le attività di controllo. Il fine è rappresentato dal controllo costante sull'andamento delle
attività operative. Sono applicazioni che forniscono alla direzione informazioni
standardizzate in modo ciclico . Si tratta di applicazioni di controllo di gestione e
reporting statistico sulle attività aziendali.
Book in Progress
Pagina 44
L'insieme di queste applicazioni è stato denominato sistema per la produzione di
informazioni per il controllo direzionale,
(Management Information System).
nella
letteratura
anglosassone
MIS
Infine troviamo i sistemi per il supporto alle attività strategiche. Si tratta di sistemi che
supportano le attività direzionali non predefinite e poco strutturate.
Sono stati denominati sistemi per il supporto alle decisioni, nella letteratura
anglosassone DSS (Decision Support System).
Questi tre aspetti del sistema informativo automatizzato si differenziano in modo
sensibile, nella tabella che segue si presentano in sintesi le principali caratteristiche di
questi tre aspetti.
Sistema di elaborazione dati EDP (Electronic Data Processing System )
Sostituisce e integra le attività impiegatizie manuali
È utilizzato passivamente
Ha come obbiettivo l’efficienza nel risparmio del tempo e nella qualità
Gestisce
abilmente
sincronizzazione
attività
concorrenti
effettuandone
la
Punta sulla precisione e cura i risultati
Utilizza standard per la produzione
Rimane costante nel tempo
Sistema di reporting aziendale MIS (Management Information System).
Fornisce periodicamente dati di sintesi
per favorire il controllo
periodico aziendale
Richiede una attenta analisi interpretativa dei dati da parte dell’utente
È orientato all’efficacia e all’efficienza
Mantiene il riferimento ai dati relativi a situazioni pregresse
Usa modelli standard per la comunicazione delle informazioni
Mette in risalto in maniera evidente le situazioni rilevate fuori norma
Rimane costante nel tempo
Book in Progress
Pagina 45
Sistema di supporto alle decisioni DSS (Decision Support System).
E’ di supporto agli staff manageriali
Deve essere utilizzato continuamente
Punta all’efficacia
Ipotizza , prevede possibili scenari futuri in base alla analisi delle
situazioni passate già consolidate
Accetta l’approssimazione se è attendibile e giustificata
Estremamente flessibile
Le tipologie di sistemi informativi.
I sistemi informativi possono essere rappresentati in diverse categorie in dipendenza di
diversi fattori:
la natura delle informazioni trattate
i domini applicativi interessati dal sistema
il contesto organizzativo di riferimento
la tecnologia utilizzata
Si possono quindi distinguere sistemi informativi con diverse caratteristiche.
Sistemi gestionali (o transazionali).
Si tratta dei sistemi più tradizionali, perseguono l’obiettivo dell’informatizzazione delle
attività strutturate e ripetitive. Riguardano prevalentemente i processi ed i settori
operativi.
Ad esempio si tratta di: sistema di bilancio, gestione degli stipendi, gestione di
un’anagrafe comunale, magazzino , fatturazione ecc.
Book in Progress
Pagina 46
Sistemi di gestione dei flussi di lavoro.
Sono i sistemi che normalmente vanno ad integrazione di quelli gestionali. L’obiettivo
che
perseguono è la formalizzazione dei flussi di lavoro che coinvolgono più persone e
settori, per consentirne la massima automazione.
Sistemi per l’automazione d’ufficio.
Sono i sistemi che si sono diffusi a seguito dell’introduzione dei personal computer e dei
relativi software per lo svolgimento di attività tipiche d’ufficio (elaboratori di testo,
gestione di tabelle, grafici e disegni).
Lo sviluppo delle reti, in particolare di quelle locali, e l’integrazione con i sistemi di
gestione dei flussi di lavoro ha portato all’evoluzione di questi sistemi dall’utilizzo
individuale al lavoro di gruppo.
Consentono quindi la condivisione di dati, funzioni e risorse tecnologiche (stampanti,
scanner, ecc.).
Sistemi di comunicazione.
Sono quei sistemi che facilitano lo scambio di informazioni tra operatori coinvolti in
diverse attività, consentono comunicazioni informali. La modalità più utilizzata è la posta
elettronica.
Sistemi statistici.
L’obiettivo di questi sistemi è la rilevazione di dati dalle fonti di origine, la loro
organizzazione, analisi, omogeneizzazione, aggregazione statistica, per fini conoscitivi
e di pianificazione.
Sistemi per il governo dell’azienda.
Sono rivolti agli alti livelli aziendali per le decisioni di tipo gestionale ed operativo:
DSS – Decision Support System, per la valutazione di ipotesi alternative di
supporto a decisioni poco strutturate
MIS – Management Information System, per il supporto all’analisi e
valutazione di decisioni strutturate tipiche del livello di controllo dell’azienda
EIS – Executive Information System, per prospettare al top management i dati
di sintesi con elevata interattività ed alta flessibilità di presentazione (cruscotti
aziendali)
Book in Progress
Pagina 47
Sistemi territoriali.
Sono i sistemi che trattano le informazioni in modo georeferenziato, tramite carte,
mappe e sovrapposizione di dati tematici.
Book in Progress
Pagina 48
BOOK IN PROGRESS
IL SISTEMA OPERATIVO
Competenze
Abilità
Conoscenze
Riconoscere le caratteristiche
Struttura e funzioni di un sistema
logico-funzionali di un computer e il
operativo
Utilizzare, con autonomia e
ruolo strumentale svolto nei vari
Interfacce e periferiche di
responsabilità, le reti e gli strumenti
ambiti.
un computer
informatici nelle attività di studio,
Tipologie ed evoluzioni di un
ricerca e approfondimento
Sistema Operativo.
disciplinare.
Tipologie ed evoluzioni di un
Sistema Operativo.
A cura del prof Luca Peresson
adattamenti a cura di Salvatore Madaro
Book in Progress
Pagina 49
INDICE DEGLI ARGOMENTI
Il Sistema Operativo
51
I diversi sistemi operativi
caratteristiche tecniche del
51
La struttura di un sistema operativo
53
computer………………………………..……
…..63
la memoria di massa
L'utilizzo dell'interfaccia grafica
59
Le principali operazioni del sistema
ridurre a icona
64
ridimensionare
64
cestino
65
operativo mediante l’interfaccia
funzione “cerca”
grafica
61
Backup
61
pannello di controllo
desktop
barra delle applicazioni
62
64
66
66
66
gestione delle stampanti 66
gestire gli account 67
rimuovere dei programmi
Book in Progress
67
Pagina 50
Il Sistema Operativo
Con il termine Sistema Operativo (o talvolta software di base) si indica quell'insieme di
programmi destinato -genericamente- alla gestione del computer. Tra le principali funzioni da
esso svolto troviamo la gestione dell'hardware, la memorizzazione dei dati nelle memorie di
massa, l'esecuzione dei programmi applicativi e l'interazione fra il computer e l'utente.
Gestione dell'hardware
CPU, RAM, Stampanti, ...
Sistema Operativo
Gestione delle memorie di massa
File system
Esecuzione dei programmi
Organizzazione del sw applicativo
Interazione Computer
Utente
Interfaccia Utente
I diversi sistemi operativi
Nel mercato mondiale esistono numerosi sistemi operativi che possono essere classificati
secondo diversi criteri:
–
per famiglia
seguendo questa classificazione possiamo individuare i sistemi della famiglia Unix
e Microsoft. Alla prima famiglia appartengono, fra gli altri, i sistemi operativi di
tipo Linux (nelle diverse “distribuzioni” quali Slackware, Fedora, Ubuntu, Debian,
Suse, Gentoo, Mandriva,...), BSD (tra i quali è d'obbligo citare FreeBSD,
OpenBSD e DarwinOS) e gli stessi sistemi Unix;. Alla famiglia Microsoft
appartengono i sistemi operativi XENIX, MS-DOS, OS/2 e la serie di sistemi
operativi di tipo Windows (tra i quali le recenti XP, Vista, Server 2008, Mobile, 7,
…);
Book in Progress
Pagina 51
–
per tipo di licenza
seguendo questa classificazione si individuano i cosiddetti sistemi proprietari e i
sistemi open source;
–
per dispositivo
è una classificazione che tiene conto del tipo di elaboratore sul quale è destinato a
funzionare il sistema operativo. In questo caso potremo individuare sistemi
operativi orientati alla gestione di smartphone (computer integrati a dispositivi
telefonici), di lettori di eBook (dispositivi portatili orientati alla lettura di
documenti in formato elettronico), di personal computer (computer da tavolo o
portatili) fino alla gestione di mainframe (detti anche sistemi centrali, gli
elaboratori considerati di alta fascia e destinati alla gestione di applicazioni
particolarmente delicate che necessitano di alta affidabilità);
–
per applicativo;
è una classificazione che tiene conto dei programmi che verranno utilizzati dal
sistema. In questo caso potremo individuare sistemi operativi in grado di eseguire
particolari e specifici programmi orientati a specifici settori quali la grafica, l'office
automation, l'amministrazione/gestione aziendale, il controllo automatico di
processi produttivi, l'intrattenimento, ecc..
Book in Progress
Pagina 52
La struttura di un sistema operativo
Nell'immaginario legato all'uso del computer, un sistema operativo viene individuato dal tipo di
gestione del monitor e del mouse, di quel programma che tecnicamente viene indicato con il
termine interfaccia grafica. Siamo quindi abituati ad associare un dato sistema operativo a come
esso si presenta graficamente al suo avvio.
Book in Progress
Pagina 53
Questa semplificazione è perfettamente giustificata dal fatto che è l'innovazione rappresentata
dall'uso del mouse e delle finestre ad aver permesso la straordinaria diffusione dei computer in
questi ultimi decenni.
Poter “aprire” delle finestre, essere in grado di visualizzare il contenuto di una memoria di massa
attraverso la sua rappresentazione in icone e cartelle ha semplificato l'organizzazione dei
contenuti nei supporti di memorizzazione; poter avviare dei programmi attraverso un doppio clic
del tasto di un mouse o selezionare aree di un documento attraverso l'azione di trascinamento ha
consentito di velocizzare l'accesso e l'utilizzo dei programmi applicativi.
Tuttavia, il software di interfaccia grafica non rappresenta nemmeno la millesima parte dei
moduli che vengono controllati e gestiti da un sistema operativo. E solo la componente del
sistema operativo più “vicina” all'uomo. Non l'unica e certamente non la più necessaria al suo
funzionamento.
Volendo schematizzare il sistema operativo nelle sue componenti essenziali possiamo
individuare:
–
il kernel, o nucleo
che è l'insieme dei programmi destinati a gestire l'accesso di tutti gli altri
programmi all'hardware della macchina. L'efficienza di questo modulo determina
la velocità con cui i programmi vengono eseguiti considerato che è questo modulo
ad assegnare ai programmi l'accesso a risorse quali il processore e la memoria
centrale;
Book in Progress
Pagina 54
Applicazioni
Graphical User Interface
Drivers
Kernel
–
il file system
che è l'insieme di regole che stabiliscono come viene identificato un file all'interno
dei dispositivi di memorizzazione di un computer. Il concetto di file system (e, in
conseguenza di ciò, di file) è uno dei concetti più importanti e delicati
dell'informatica, basti pensare che dagli stessi dispositivi periferici (tastiera,
stampante, ecc.) alle risorse di rete (sistemi remoti, pagine html, …) viene
associata una rappresentazione basata sul modello del file system;
–
il memory management;
Book in Progress
Pagina 55
il gestore della memoria è quella parte di sistema operativo destinato a gestire la
memoria centrale. Lo scopo di questo modulo è quello di assegnare ad ogni
processo una porzione di memoria centrale facendo attenzione a che il
funzionamento di un dato programma non vada a occupare zone di memorie già
utilizzate da altri programmi
–
la memoria virtuale
è una complessa tecnica di gestione della memoria che riguarda l'estensione dello
spazio disponibile nella RAM attraverso l'utilizzo di una parte dello spazio di
memoria dell'hard disk. Considerata la significativa differenza di capacità e di
velocità fra i due dispositivi il migliore bilanciamento fra gestione dello scambio
dei dati e l'utilizzo delle risorse permette di “simulare” una memoria centrale
significativamente maggiore di quella disponibile senza una sensibile diminuzione
delle prestazioni della macchina;
–
i driver o -più correttamente- i device driver
sono quei moduli software che consentono al sistema operativo di gestire un
determinato dispositivo fisico attraverso l'uso delle interfacce standard.
L'utilizzo di questi moduli è di estrema importanza nel funzionamento di un
elaboratore perché permette da un lato la semplificazione della gestione delle
periferiche e dall'altro un notevole aumento della flessibilità nella configurazione e
Book in Progress
Pagina 56
nell'aggiornamento della configurazione hardware del sistema;
–
il multitasking
concetto ormai acquisito da molte generazioni di elaboratori, è la capacità di un
sistema di eseguire contemporaneamente diversi programmi assegnando ad
ognuno di questi l'utilizzo delle stesse risorse (CPU, RAM, hard disk, monitor,
ecc.);
–
ll gestore delle connessioni di rete
conferisce al sistema la capacità di
effettuare uno scambio di dati attraverso
le infrastrutture di rete con altri sistemi.
Tale funzione è legata all'utilizzo di
diversi protocolli di rete ed alla capacità
di supportare i programmi applicativi e
i processi ad essi correlati;
–
la gestione di utenti
è la caratteristica di un
sistema di creare
registrare e organizzare
diversi metodi di
accesso che garantiscano
una graduale scala di
priorità e un controllato
utilizzo alle proprie
risorse. A questa
caratteristica è
fortemente legato il tema
della sicurezza e della
vulnerabilità del sistema
ad attacchi esterni;
Book in Progress
Pagina 57
–
l'interfaccia grafica o GUI (Graphical User Interface)
è quel software
che consente
all'utente di
inviare dei
comandi
all'elaboratore
facendo uso di
dispositivi fisici
(mouse e tastiera)
che gestiscono
oggetti grafici
bidimensionali
(puntatore, icone,
finestre). In tal
modo l'utente viene liberato dall'obbligo di utilizzare la sola tastiera per la scrittura
e l'invio di comandi testuali (la più antica forma di utilizzo del sistema: la CUI,
Character User Interface ossia interfaccia utente basata sul carattere);
L'utilizzo dell'interfaccia grafica
Il funzionamento dell'interfaccia grafica si deve principalmente all'invenzione di un
piccolo dispositivo di puntamento chiamato mouse, che consente, attraverso il proprio
spostamento, di muovere un puntatore (un'immagine, generalmente una freccia, talvolta
indicata con il termine cursore) sullo schermo e -attraverso la pressione su di uno o più
pulsanti- di eseguire particolari operazioni.
Questo semplice e rivoluzionario dispositivo viene ideato dall'inventore statunitense
Douglas Carl Engelbart e realizzato come prototipo nel 1963. Solo dopo vent'anni, agli
inizi degli anni '80 il dispositivo inizia a diffondersi e acquisisce notorietà nel 1984 con il
computer Apple Macintosh, che presenta una semplice interfaccia grafica il cui
funzionamento si basava su finestre e icone. Attualmente ogni sistema che preveda una
frequente interazione di tipo uomo-macchina (tipicamente i sistemi installati su personal
computer) rende disponibile uno o più tipi di interfaccia grafica.
Book in Progress
Pagina 58
Utente
Applicazioni
Interfaccia Grafica
Sistema Operativo
Hardware
Le più diffuse interfacce grafiche sono, come si è già accennato, la Microsoft Windows, la
Mac Os X e la X Windows System. Ognuna di queste presenta uno, stilisticamente diverso,
ambiente desktop che simula un piano di lavoro (definito scrivania) sul quale vengono
disposti alcuni oggetti grafici:
–
la cartella
rappresentazione grafica della
“directory”, l'area di memoria destinata
all'archiviazione di documenti e
programmi;
–
i documenti
rappresentazione grafica dei “file di dati”,
la struttura di dati destinata alla
memorizzazione dei risultati di
un'elaborazione;
Book in Progress
Pagina 59
–
i programmi
rappresentazione grafica dei “file eseguibili”, la struttura
di dati destinata alla memorizzazione dei programmi;
–
le finestre
rappresentazione grafica dei programmi in esecuzione. All'interno di questo
elemento grafico si distinguono diversi altri oggetti fra i quali citiamo le barre, i
menu, i pulsanti, ecc.;
Le principali operazioni del sistema operativo
mediante l’interfaccia grafica
Book in Progress
Pagina 60
Mostriamo adesso praticamente come è possibile utilizzare le principali caratteristiche di un
sistema operativo; usiamo Windows 7 per presentare le potenzialità di un sistema operativo
ad interfaccia grafica perché è tra i più recenti, in rapida espansione tra gli utenti dei
personal computer, dei notebook e dei
netbook oltre al fatto che è molto stabile e
sicuro.
Innanzitutto il desktop: è possibile
personalizzarlo con un semplice clic destro
del mouse; il menù a contestuale ne consente
la sua modifica
Dalla voce “Personalizza” si apre una finestra
dalle quale si possono apportare le modifiche
desiderate:
Nella barra delle applicazioni, in basso a destra, si trovano delle icone che permettono di
configurare l’orario, la scheda audio, il collegamento alle reti wireless, la tastiera.
Book in Progress
Pagina 61
Se invece vogliamo vedere le caratteristiche tecniche del computer è sufficiente partire
dal pulsante Start
Computer clic destro sul pulsante Proprietà
Così è possibile vedere il tipo di processore, la quantità di RAM installata, la versione del
Sistema Operativo ecc. .
Book in Progress
Pagina 62
Si vede dal precedente esempio come il sistema operativo opera con le finestre come ogni
sistema ad interfaccia grafica; vediamo insieme le parti essenziali di una finestra:
I tre pulsanti in alto a destra di ogni finestra
servono rispettivamente nel
ridurre a icona la finestra nella barra delle applicazione (che si trova in basso al desktop),
a ridimensionare e a chiudere la finestra.
Se vogliamo vedere la memoria di massa disponibile sul PC, le cartelle e i files in esse
contenuti è sufficiente seguire il percorso: Pulsante Start Computer Doppio clic sul
disco del quale interessa vedere il contenuto:
Book in Progress
Pagina 63
Notiamo nella finestra la presenza di cartelle (directory) e files con la data dell’ultima
modifica, la loro dimensione e il loro tipo.
Book in Progress
Pagina 64
Se tutte queste cartelle e questi files sono importanti allora è necessario pensare a
tutelarli mediante delle copie di sicurezza. Questa operazione di copia dei dati ai fini
della sicurezza in caso di blocco del computer, di danneggiamento o di furto si
chiama Backup ed è particolarmente importante quando si tratta di dati di un certo
rilievo. I files si possono copiare ( selezionare, clic destro, copia,
selezione della destinazione, clic destro incolla ); si possono spostare (
selezionare, clic destro, taglia, selezione della destinazione, clic destro
incolla ); si possono cancellare ( selezionare, clic destro, elimina ).
Quando si cancella un file o una cartella, questi vengono spostati nel
cestino dal quale si possono ancora ripristinare in caso di necessità; tale operazione
è possibile fintanto che il cestino non viene svuotato. Per ripristinare un elemento
dal cestino si procede come segue:
doppio clic sull’icona del cestino clic destro
sull’icona dell’elemento che si vuole recuperare ripristina.
Nei dischi rigidi dei PC sono presenti migliaia di files
dispersi all’interno di tantissime cartelle e molte volte
è davvero difficile ritrovare qualche documento che
avevamo registrato qualche tempo prima; il sistema
operativo offre la funzione “cerca” che aiuta nella
ricerca in diversi modi.
Per attivare questa funzione si parte dal pulsante
Start e quindi si inserisce qualche elemento che
identifichi il file o la cartella nel campo “Cerca programmi e files”.
Quando vogliamo inviare dei files o delle cartelle attraverso Internet oppure vogliamo
registrarli su un supporto a bassa capacità, è necessario ridurre il più possibile la loro
dimensione; l’operazione che permette di fare questo è la “compressione”: clic destro sul
file invia a cartella compressa.
Quando si copiano o si scaricano files da origini non affidabili è necessario difendersi dai
possibili attacchi di virus informatici che possono arrecare danni anche gravi ai dati del PC
o che possono inviare dei dati sensibili a destinatari sconosciuti
che possono usarli a nostra insaputa.
Ci sono degli appositi programmi antivirus che servono a
proteggere il nostro computer; alcuni sono “free” (ossia possono
essere usati liberamente senza alcun costo) altri a pagamento
ma più performanti.
Un elemento molto importante in un sistema operativo è la gestione delle stampanti. Nel
caso di Windows 7 , per accedere alla relativa scheda bisogna seguire il percorso: pulsante
start dispositivi e stampanti in questa scheda si può modificare le impostazioni delle
stampanti già istallate (con un clic destro sull’icona corrispondente alla stampante prescelta)
oppure decidere di istallarne una nuova.
Book in Progress
Pagina 65
Il pannello di controllo (pulsante start pannello di controllo ) è l’interfaccia grafica
attraverso la quale è possibile impostare tutte le funzioni del computer; intervenendo in
esso è possibile elevare le prestazioni del PC come è possibile attirittura inibire delle funzioni
o, addirittura bloccarlo del tutto quindi nel momento in cui si decide di intervenire su di esso
bisogna fare molta attenzione.
In questa sede è possibile gestire gli account (ossia la possibilità di accesso ai vari utenti
del PC anche mediante delle password), la configurazione di accesso alla rete LAN di
computer e a Internet e di rimuovere dei programmi che riteniamo di non dover più
usare. Questa interfaccia è nello stesso tempo molto intuitiva e potente perché racchiude in
se tutte le funzionalità del Sistema Operativo.
Book in Progress
Pagina 66
Book in Progress
Pagina 67
Book in Progress
Pagina 68
BOOK IN PROGRESS
ALGORITMI E DIAGRAMMI DI
FLUSSO
Competenze
Abilità
Conoscenze
Utilizzare, con autonomia
Rappresentare la soluzione di un
problema con diagrammi di
flusso.
Concetto di algoritmo.
metodologica ed esecutiva,
procedure e tecniche per trovare
soluzioni efficaci ed efficienti, in
relazione a semplici problemi nei
Analizzare e risolvere semplici
campi di propria competenza.
problemi con i principi della
.
Fasi risolutive di un
problema e
rappresentazione con
diagrammi di flusso o
pseudocodice
Fondamenti di programmazione
strutturata.
programmazione strutturata
A cura di Giuseppe Cavallo
Book in Progress
Pagina 69
INDICE
CONCETTI FONDAMENTALI SUGLI ALGORITMI; 71
DEFINIZIONE FORMALE DI ALGORITMO; 72
ESEMPIO DI ALGORITMO; 73
RAPPRESENTAZIONE DELL’ALGORITMO MEDIANTE LA TABELLA DI
VERITÀ; 74
I DIAGRAMMI DI FLUSSO; 75
TIPI DI ISTRUZIONI; 80
LA SELEZIONE; 81
LA SEQUENZA; 81
LE STRUTTURE DI CONTROLLO;81
L’ITERAZIONE; 83
ACCUMULATORI E CONTATORI; 83
Book in Progress
Pagina 70
CONCETTI FONDAMENTALI SUGLI ALGORITMI
Per molto tempo si pensò che il termine algoritmo derivasse da una storpiatura del
termine logaritmo. L’opinione attualmente diffusa è invece che il termine derivi da alKhuwarizmi, nome di un matematico arabo, autore di un libro di aritmetica e di uno di
algebra: nel libro di aritmetica si parla della cosiddetta numerazione araba (quella
attualmente usata) e si descrivono i procedimenti per l’esecuzione delle operazioni
dell’aritmetica elementare. Questi procedimenti vennero in seguito chiamati algoritmi e il
termine passò ad indicare genericamente qualunque procedimento di calcolo.
L’algoritmo esprime le azioni da svolgere su determinati oggetti al fine di produrre
gli effetti attesi. Una azione che produce un determinato effetto è chiamata istruzione e
gli oggetti su cui agiscono le istruzioni possono essere costanti (valori che restano
sempre uguali nelle diverse esecuzioni dell’algoritmo) e variabili (contenitori di valori
che variano ad ogni esecuzione dell’algoritmo). Si potrà dire brevemente che un
algoritmo è una elaborazione di dati: i dati, cioè l’insieme delle informazioni che devono
essere elaborate, sono manipolati, secondo le modalità descritte dalle istruzioni, per
produrre altri dati. Ciò porta l’algoritmo ad essere una funzione di trasformazione dei
dati di un insieme A (dati di input) in dati di un insieme B (dati di output).
In questi appunti, dato che ci si pone il fine di una introduzione alla programmazione,
più che una definizione rigorosa di algoritmo se ne fornirà una definizione intuitiva. In
questo senso si può definire l’algoritmo come ".. un insieme di istruzioni che definiscono
una sequenza di operazioni mediante le quali si risolvono tutti i problemi di una
determinata classe".
Per chiarire meglio il concetto di algoritmo è bene fare riferimento ad alcune proprietà
che un insieme di istruzioni deve possedere affinché possa chiamarsi algoritmo:
•
•
•
•
La finitezza. Il numero di istruzioni che fanno parte di un algoritmo è finito. Le
operazioni definite in esso vengono eseguite un numero finito di volte.
Il determinismo. Le istruzioni presenti in un algoritmo devono essere definite
senza ambiguità. Un algoritmo eseguito più volte e da diversi esecutori, a parità
di premesse, deve giungere a medesimi risultati. L’effetto prodotto dalle azioni
descritte nell’algoritmo non deve dipendere dall’esecutore o dal tempo.
La realizzabilità pratica. Tutte le azioni descritte devono essere eseguibili con i
mezzi di cui si dispone.
La generalità. Proprietà già messa in evidenza nella definizione che si è data: un
algoritmo si occupa della risoluzione di famiglie di problemi.
Book in Progress
Pagina 71
DEFINIZIONE FORMALE DI ALGORITMO
Un
algoritmo è un insieme ben ordinato di operazioni non
ambigue ed effettivamente calcolabili che eseguito , produce un
risultato e termina in una quantità finita di tempo.
Insieme ben ordinato
Ordinamento delle operazioni da eseguire;
deve essere chiaro e non ambiguo
Il controllo deve procedere senza ambiguità
da una operazione alla successiva
Di solito nei linguaggi di programmazione
Le operazioni sono elencate come passi
numerati
In assenza di altra indicazione
(
operazioni condizionali o iterative ) il
controllo passa sempre al passo successivo
Operazioni non ambigue calcolabili
Tutti i passi devono essere chiari per chi l’esegue le
operazioni .
Una operazione non ambigua è detta primitiva
Analizzando la stesura della prima versione di un
algoritmo occorre verificare che tutte le operazioni
coinvolte siano primitive
Produce un risultato
Gli algoritmi risolvono problemi
Per
comprendere
se
una
soluzione
algoritmica è corretta , il suo risultato deve
poter essere confrontato con il risultato atteso
Se il risultato non è determinabile , l’algoritmo
deve produrre un messaggio di errore , o
fornire un approssimazione del risultato
corretto
Book in Progress
Pagina 72
Termina in una quantità finita di tempo
L’algoritmo deve produrre un risultato dopo l’esecuzione di un numero finito
di operazioni
E’ sempre buona abitudine chiudere l’algoritmo con una frase di chiusura
È facile incorrere in situazioni dove gruppi di istruzioni vengono ripetute
all’infinito perché non vengono mai a verificarsi le condizioni di chiusura di
ciclo
ESEMPIO DI ALGORITMO
Vogliamo costruire un algoritmo che stampi 4 volte “prova”
Una possibile soluzione potrebbe essere:
1. poni k = 0
2. stampa “prova ”
3. ripeti il passo 2 sino a quando k < 4
4. Fine
Questo algoritmo dato in input ad un agente esecutore non termina mai perchè :
ESEGUE IL PASSO 1: inserisce il valore zero in K
ESEGUE IL PASSO 2: scrive “prova ”
ESEGUE IL PASSO 3 CHE LO RIPORTA AL PASSO 2 PERCHE’ K CHE E’
ZERO QUINDI E’ SICURAMENTE MINORE DI 4
In questo modo il passo 2 ed il passo 3 sono ripetuti all’infinito .
Come possiamo modificare l’algoritmo affinchè possa terminare ottenendo il risultato
voluto cioè la stampa di quattro volte “prova” ?
Basta aggiungere una ulteriore istruzione nell’algoritmo, così :
1.
2.
3.
4.
5.
poni k = 0
stampa “prova ”
aggiungi 1 a K
ripeti il passo 2 ed il 3 sino a quando k < 4
Fine
Questo algoritmo termina perchè :
ESEGUE IL PASSO 1: 0 K
ESEGUE IL PASSO 2: ( “prova ” in output )
ESEGUE IL PASSO 3: 1 + K K ( K = 1 )
ESEGUE IL PASSO 4 CHE RIMANDA IL CONTROLLO AL PASSO 2 E POI
IN SEQUENZA AL PASSO 3 PERCHE’ K, CHE VALE 1, E’ SICURAMENTE
MINORE DI 4
ESEGUE IL PASSO 2: ( “prova ” in output )
ESEGUE IL PASSO 3: 1 + K K ( K = 2 ) PERCHE’ PRIMA ERA k = 1
ESEGUE IL PASSO 4 CHE RIMANDA IL CONTROLLO AL PASSO 2 E POI
IN SEQUENZA AL PASSO 3 PERCHE’ K, CHE VALE 2, E’ SICURAMENTE
MINORE DI 4
Book in Progress
Pagina 73
ESEGUE IL PASSO 2 : ( “prova ” in output )
ESEGUE IL PASSO 3: 1 + K K ( K = 3 ) PERCHE’ PRIMA ERA k = 2
ESEGUE IL PASSO 4 CHE RIMANDA IL CONTROLLO AL PASSO 2 E POI
IN SEQUENZA AL PASSO 3 PERCHE’ K, CHE VALE 3, E’ SICURAMENTE
MINORE DI 4
ESEGUE IL PASSO 2: ( “prova ” in output )
ESEGUE IL PASSO 3: 1 + K K ( K = 4 ) PERCHE’ PRIMA ERA k = 3
ESEGUE IL PASSO 4; POICHE’ CHE LA CONDIZIONE K < 4 NON E’ PIU VERA. IN
QUANTO K E’ UGUALE A 4, PASSA IL CONTROLLO AL PASSO SUCCESSIVO, IL 5
PASSO 5 ( FINE ) TERMINE DELL’ALGORITMO.
RAPPRESENTAZIONE DELL’ALGORITMO MEDIANTE LA TABELLA DI VERITÀ
Un modo diverso di rappresentare un algoritmo si basa sulla tabella di verità.
La prima colonna indica la posizione ordinale del passo che viene eseguito
Le altre colonne indicano i valori degli oggetti così come evolvono con il susseguirsi dei
passi eseguiti .
PASSO
1
2
3
K
0
OUTPUT (PROVA)
1
K<4 ? SI
TORNA A 2
4
2
3
OUTPUT (PROVA)
2
K<4 ? SI
TORNA A 2
4
2
3
OUTPUT (PROVA)
3
K<4 ? SI
TORNA A 2
4
2
3
OUTPUT (PROVA)
4
K<4 ? NO
PROSEGUI
4
5
Book in Progress
Termina algoritmo
Pagina 74
I Diagrammi di Flusso
I diagrammi di flusso sono dei disegni che rappresentano graficamente un algoritmo,
permettendo così una comprensione immediata del funzionamento del nostro percorso
logico e un controllo accurato sulla funzionalità e la casistica del ragionamento.
Un diagramma a flusso (o flow chart) è un linguaggio formale di tipo grafico utilizzato
per rappresentare algoritmi (in senso lato), attraverso la descrizione delle differenti
operazioni sotto forma di uno schema in cui le diverse fasi del processo e le differenti
condizioni che devono essere rispettate vengono rappresentati da simboli grafici detti
blocchi. I blocchi sono collegati tra loro tramite frecce che indicano la cronologia.
I diagrammi trovano la loro applicazione in diversi ambiti: a partire dall'impiego nella
programmazione informatica, si sono diffusi in campo industriale, come strumenti per
schematizzare i processi produttivi e/o organizzativi. Da qui l'impiego anche in campo
valutativo, in particolare nelle metodologie della qualità, per la rappresentazione dei
processi da valutare e da tenere sotto controllo (sia di tipo organizzativo, sia di tipo
educativo).
Come si costruiscono
Il linguaggio della programmazione individua cinque tipi di blocchi elementari, collegati
tra loro attraverso frecce:
• un blocco iniziale, rappresentato da un ovale contenente la parola "INIZIO"
• un blocco finale, rappresentato da un ovale contenente la parola "FINE"
• i blocchi di azione, rappresentati da un rettangolo indicante una data operazione
• i blocchi di lettura/scrittura, rappresentati da un parallelogramma
• i blocchi di controllo, rappresentati da un rombo con un ingresso e due uscite
Book in Progress
Pagina 75
Osserviamo la presenza del blocco condizionale; esse serve per eseguire un blocco di
istruzioni quando è verificata una condizione oppure, in alternativa, un altro blocco di
istruzioni se la condizione è falsa.
In realtà l'uso dei diagrammi di flusso in campo organizzativo risulta più libero nelle
forme di rappresentazione, mantenendo l'idea di fondo di rappresentare un processo
attraverso un algoritmo composto da una sequenza di passaggi, tra loro collegati
logicamente e cronologicamente.
La costruzione di un diagramma di flusso richiede di individuare i passaggi chiave che
caratterizzano un dato processo e li rappresenta, evidenziando con frecce le loro
reciproche
relazioni.
Può
essere
utile
START
accompagnare un algoritmo con una breve
descrizione verbale che aiuti a riconoscere la
logica connessa alla sua costruzione.
K0
L’algoritmo precedentemente analizzato :
1.
2.
3.
4.
poni k = 0
stampa “prova ”
aggiungi 1 a K
ripeti il passo 2 ed il 3
sino a quando k < 4
5. Fine
Stampa
“prova”
K  K+1
possiamo rappresentarlo graficamente
con il diagramma di flusso a lato:
V
K<
F
STOP
Book in Progress
Pagina 76
Qui a lato è rappresentato
Il Diagramma di Flusso
per il calcolo dell’area
di un rettangolo
Qui a lato è rappresentato
Il Diagramma di Flusso
per conversione Lira/Euro
Qui a lato è rappresentato il Diagramma di Flusso
per lo scambio dei valori contenuti in due variabili.
La variabile Aux serve per “appoggiare” temporaneamente i
valori delle due altre variabili.
Book in Progress
Pagina 77
START
Leggi
Diagramma di flusso
Per il calcolo del massimo
tra tre numeri
x, y, z
Max  x
falso
Max < y
vero
Max  y
falso
Max < z
vero
Max  z
Stampa
Max
STOP
Book in Progress
Pagina 78
START
Diagramma di flusso per il calcolo del
minimo valore (m) e del massimo
valore (M) data una sequenza di
numeri generica
Leggi N
I1
F
V
I<=
N
K
Stampa
m,M
F
V
I =1
STOP
F
K<m
V
MK,mk
F
K>M
V
mK
MK
I  I +1
Diagramma di flusso per il calcolo della somma di una sequenza di numeri generica
Book in Progress
Pagina 79
START
Leggi N
I  1, Somma  0
F
V
I<=
N
Stampa
Somma
K
Somma  Somma +K
STOP
I  I +1
TIPI DI ISTRUZIONI
Gli algoritmi operano principalmente su variabili che conterranno i dati sui quali si vuole
svolgere una determinata elaborazione. I valori da elaborare devono
essere assegnati alle variabili prima di effettuare l’elaborazione. Si pensi infatti ad una
variabile come ad un contenitore. Le istruzioni operano sui valori contenuti: se questi
non ci sono non ci si può attendere alcuna elaborazione. Ogni variabile è identificata da
un nome che permette di distinguerla dalle altre.
Book in Progress
Pagina 80
•
•
•
L’istruzione di assegnamento fa in modo che un determinato valore sia conservato in una
variabile. In questo modo si prepara la variabile per l’elaborazione o si conserva nella variabile un
valore intermedio prodotto da una elaborazione precedente. Si può assegnare ad una variabile
un valore costante come anche il valore risultante da una espressione aritmetica.
L’istruzione di input fa in modo che l’algoritmo riceva dall’esterno un valore da assegnare ad
una variabile. Nel caso di algoritmi eseguiti da un elaboratore, questi attende che da una unità di
input (per esempio la tastiera) arrivi una sequenza di caratteri tipicamente terminanti con la
pressione del tasto <Invio> . Il dato verrà assegnato alla variabile appositamente predisposta.
Praticamente si tratta di una istruzione di assegnamento solo che stavolta il valore da assegnare
proviene dall’esterno.
L’istruzione di output fa in modo che l’algoritmo comunichi all’esterno i risultati della propria
elaborazione. Nel caso di un elaboratore viene inviato su una unità di output (per esempio il
video) il valore contenuto in una determinata variabile.
Esaminiamo adesso due versioni di un algoritmo per il calcolo dell’area di un rettangolo
(i nomi delle variabili sono scritti in maiuscolo):
Algoritmo A
Algoritmo B
Assegna a BASE il valore 3
Ricevi BASE
Assegna a ALTEZZA il valore 7
Ricevi ALTEZZA
Assegna a AREA valore
BASE*ALTEZZA
Assegna a AREA valore BASE*ALTEZZA
Comunica AREA
Comunica AREA
Nell’algoritmo A si assegnano alle variabili BASE ed ALTEZZA dei valori costanti, l’algoritmo
calcola l’area di un rettangolo particolare e se si vuole applicare l’algoritmo ad un diverso
rettangolo è necessario modificare le due istruzioni di assegnamento a BASE e ALTEZZA:
l’algoritmo ha perso la sua caratteristica di generalità. Questo esempio non deve portare a
concludere che non ha senso parlare di costanti in un algoritmo perché, per esempio, se si
fosse trattato di un triangolo il calcolo dell’area avrebbe assunto l’aspetto: Assegna a AREA
valore BASE*ALTEZZA/2. La costante 2 prescinde dai valori diversi che possono essere
assegnati a BASE e ALTEZZA, essendo parte della formula del calcolo dell’area di un
triangolo qualsiasi.
Nell’algoritmo B i valori da assegnare a BASE e ALTEZZA provengono da una unità di input.
L’algoritmo ad ogni esecuzione si fermerà in attesa di tali valori e il calcolo verrà eseguito su tali
valori: l’elaborazione è sempre la stessa (l’area di un rettangolo si calcola sempre allo stesso
modo) ma i dati saranno di volta in volta diversi (i rettangoli hanno dimensioni diverse).
LE STRUTTURE DI CONTROLLO
Gli algoritmi, a causa della loro generalità, lavorano utilizzando variabili. Non si
conoscono, al momento della stesura dell’algoritmo stesso, i valori che possono
assumere le variabili. Ciò se permette di scrivere algoritmi generali può comportare
problemi per alcune istruzioni: si pensi al problema apparentemente banale del calcolo
del quoziente di due numeri:
Ricevi DIVIDENDO
Book in Progress
Pagina 81
Ricevi DIVISORE
Assegna a QUOZIENTE valore DIVIDENDO/DIVISORE
Comunica QUOZIENTE
Il quoziente può essere calcolato se DIVISORE contiene un valore diverso da 0, evento
questo non noto in questo momento dipendendo tale valore dal numero proveniente da
input. Inoltre è chiaro che, in questa eventualità, sarebbe priva di senso anche
l’istruzione di output del valore di QUOZIENTE non essendoci nella variabile alcun
valore.
È necessario introdurre, oltre alle istruzioni, degli strumenti che permettano di
controllare l’esecuzione dell’algoritmo: le strutture di controllo. La programmazione
strutturata (disciplina nata alla fine degli anni 60 per stabilire le regole per la scrittura di
buoni algoritmi) impone l’uso di tre sole strutture per la composizione degli algoritmi:
LA SEQUENZA
È l’unica struttura di composizione che si è utilizzata finora. In poche parole questa
struttura permette di specificare l’ordine con cui le istruzioni si susseguono: ogni
istruzione produce un risultato perché inserita in un contesto che è quello determinato
dalle istruzioni che la precedono. Nell’esempio di prima il calcolo di QUOZIENTE, per
poter contenere il valore atteso, deve essere eseguito dopo gli input.
LA SELEZIONE
Questa struttura permette di scegliere tra due alternative la sequenza di esecuzione. È
la struttura che ci permette, per esempio, di risolvere in modo completo il problema del
calcolo del quoziente fra due numeri:
Ricevi DIVIDENDO
Ricevi DIVISORE
Se DIVISORE ≠ 0
Assegna a QUOZIENTE valore DIVIDENDO/DIVISORE
Comunica QUOZIENTE
Altrimenti
Comunica ‘Operazione senza senso’
Fine-se
La condizione espressa nella struttura “Se” permette di scegliere, in relazione al valore
di verità o falsità, quale elaborazione svolgere. La sequenza contenuta nella
parte “Altrimenti” potrebbe mancare se si volesse soltanto un risultato laddove
possibile: in tale caso se la condizione DIVISORE ≠ 0 risultasse non verificata, non si
effettuerebbe alcuna elaborazione.
Book in Progress
Pagina 82
L’ITERAZIONE
La struttura iterativa permette di ripetere più volte la stessa sequenza di istruzioni finché
non si verifica una determinata condizione. Si voglia, a titolo di esempio, scrivere un
algoritmo che calcoli e visualizzi i quadrati di una serie di numeri positivi. Si tratta in altri
termini di effettuare la stessa elaborazione (calcolo e visualizzazione del quadrato di un
numero) effettuata su numeri diversi (quelli che arriveranno dall’input):
Ricevi NUMERO
Mentre NUMERO > 0
Assegna a QUADRATO valore NUMERO*NUMERO
Comunica QUADRATO
Ricevi NUMERO
Fine-mentre
Dentro la struttura iterativa (la parte compresa fra le parole “Mentre” e “Fine-mentre”)
sono specificate le istruzioni per il calcolo del quadrato di un numero: l’iterazione
permette di ripetere tale calcolo per tutti i numeri che verranno acquisiti tramite
l’istruzione di input inserita nell’iterazione stessa. La condizione NUMERO>0 viene
chiamata condizione di controllo del ciclo e specifica quando deve terminare
l’elaborazione (il valore introdotto da input è non positivo): si ricorda che l’algoritmo
deve essere finito e non si può iterare all’infinito. Il primo input fuori ciclo ha lo scopo di
permettere l’impostazione della condizione di controllo sul ciclo stesso e stabilire,
quindi, quando terminare le iterazioni.
In generale si può dire che la struttura di una elaborazione ciclica, controllata dal
verificarsi di una condizione, assume il seguente aspetto:
Considera primo elemento
Mentre elementi non finiti
Elabora elemento
Considera prossimo elemento
Fine mentre
Le strutture di controllo devono essere pensate come schemi di composizione: una
sequenza può contenere una iterazione che, a sua volta, contiene una selezione ecc..
Rappresentano in pratica i mattoncini elementari di una scatola di montaggio le cui
diverse combinazioni permettono la costruzione di architetture di varia complessità.
ACCUMULATORI E CONTATORI
L’elaborazione ciclica è spesso utilizzata per l’aggiornamento di totalizzatori o contatori.
Per chiarire meglio il concetto di totalizzatore, si pensi alle azioni eseguite dal cassiere
di un supermercato quando si presenta un cliente con il proprio carrello pieno di merce.
Il cassiere effettua una elaborazione ciclica sulla merce acquistata: ogni oggetto viene
Book in Progress
Pagina 83
esaminato per acquisirne il prezzo. Lo scopo della elaborazione è quello di cumulare i
prezzi dei prodotti acquistati per stabilire il totale che il cliente dovrà corrispondere.
Dal punto di vista informatico si tratta di utilizzare una variabile (nell’esempio potrebbe
essere rappresentata dal totalizzatore di cassa) che viene aggiornata per ogni prezzo
acquisito: ogni nuovo prezzo acquisito non deve sostituire il precedente ma aggiungersi
ai prezzi già acquisiti precedentemente. Tale variabile:
1. dovrà essere azzerata quando si passa ad un nuovo cliente (ogni cliente dovrà corrispondere
solamente il prezzo dei prodotti che lui acquista)
2. si aggiornerà per ogni prodotto esaminato (ogni nuovo prezzo acquisito verrà cumulato ai
precedenti)
3. finito l’esame dei prodotti acquistati la variabile conterrà il valore totale da corrispondere.
La variabile di cui si parla nell’esempio è quella che, nel linguaggio della
programmazione, viene definita un totalizzatore o accumulatore: cioè una variabile
nella quale ogni nuovo valore non sostituisce ma si accumula a quelli già presenti in
precedenza. Se la variabile si aggiorna sempre di una quantità costante (per esempio
viene sempre aggiunta l’unità) viene chiamata contatore.
In generale si può dire che l’uso di un totalizzatore prevede i seguenti passi:
Inizializzazione totalizzatore
ciclo aggiornamento totalizzatore
…
Aggiornamento totalizzatore
Fine ciclo
Uso del totalizzatore
L’inizializzazione serve sia a dare senso all’istruzione di aggiornamento (cosa
significherebbe la frase: aggiorna il valore esistente con il nuovo valore se non ci fosse
un valore esistente ?), sia a fare in modo che l’accumulatore stesso contenga un valore
coerente con l’elaborazione da svolgere (nell’esempio di prima il nuovo cliente non può
pagare prodotti acquistati dal cliente precedente: il totalizzatore deve essere azzerato,
prima di cominciare l’elaborazione, affinché contenga un valore che rispecchi
esattamente tutto ciò che è stato acquistato dal cliente esaminato).
L’aggiornamento viene effettuato all’interno di un ciclo. Se infatti si riflette sulla
definizione stessa di totalizzatore, è facile prendere atto che avrebbe poco significato
fuori da un ciclo: come si può cumulare valori se non si hanno una serie di valori ?
Quando i valori da esaminare terminano, il totalizzatore conterrà il valore cercato.
Nell’esempio di prima tutto ciò si tradurrebbe: finito l’esame dei prodotti acquistati, si
potrà presentare al cliente il totale da corrispondere.
Si voglia, a titolo di esempio di utilizzo di un accumulatore, risolvere il seguente
problema: data una sequenza di numeri positivi, se ne vuole calcolare la somma.
Inizializza SOMMA con valore 0
Ricevi NUMERO
Mentre NUMERO > 0
Book in Progress
Pagina 84
Aggiorna SOMMA sommando NUMERO
Ricevi NUMERO
Fine-mentre
Comunica SOMMA
Il totalizzatore SOMMA è inizializzato, prima del ciclo, al valore nullo poiché deve
rispecchiare la somma dei numeri introdotti da input e, quindi, non essendo ancora
stata effettuata alcuna elaborazione su alcun numero tale situazione viene espressa
assegnando il valore neutro della somma.
L’output di SOMMA alla fine del ciclo indica il fatto che si può utilizzare (in
per la conoscenza del valore contenuto) il totalizzatore quando il suo
coerente con il motivo della sua esistenza: SOMMA deve accumulare tutti
avverrà quando tutti i numeri da considerare saranno stati elaborati, cioè
ciclo.
Book in Progress
questo caso
contenuto è
i valori e ciò
in uscita dal
Pagina 85
Book in Progress
Pagina 86
Il Linguaggio di programmazione Unità 1
I Linguaggi di programmazione.
pag. 88
Il Linguaggio C.
pag. 89
La Struttura di un programma.
pag. 89
Variabili e Assegnamenti.
pag. 92
Costanti.
pag. 97
Incremento di una variabile.
pag. 98
Pre e Post Incremento.
pag. 100
Immissione ed Emissione dei dati.
pag. 101
La Selezione ( IF ).
pag. 104
Istruzioni Composte.
pag. 107
L’operatore ?.
pag. 108
Cicli e Istruzione di While.
pag. 108
Cicli e Istruzione di For.
pag. 109
Cicli e Istruzione di DO While.
pag. 111
A cura di Giuseppe Cavallo
Book in Progress
Pagina 87
I linguaggi di programmazione
I linguaggi di programmazione permettono di scrivere algoritmi interpretabili da un
sistema di elaborazione. Un algoritmo scritto in un linguaggio di programmazione viene
chiamato programma e il processo di scrittura del programma, a partire dall’algoritmo,
viene chiamato codifica. I linguaggi di programmazione sono costituiti da un alfabeto e
da un insieme di regole che devono essere rispettate per scrivere programmi
sintatticamente corretti.
Il linguaggio macchina costituito da zero ed uno è l'unico che pilota direttamente le unità
fisiche dell'elaboratore in quanto è l’unico comprensibile dall’elaboratore stesso. È però
estremamente complicato scrivere programmi in tale linguaggio naturale per la
macchina ma completamente innaturale per l’uomo. Per poter permettere un dialogo più
semplice con la macchina sono nati i linguaggi di programmazione.
Il più vecchio linguaggio di programmazione è il linguaggio assembly. Il linguaggio
assembly è una rappresentazione simbolica del linguaggio macchina. La scrittura di
programmi è enormemente semplificata rispetto a quest'ultimo. Per essere eseguito
dall'elaboratore un programma in linguaggio assembly deve essere tradotto in
linguaggio macchina; tale lavoro è a carico di un programma detto assemblatore. Questi
due tipi di linguaggi, detti anche linguaggi di basso livello sono propri di ogni macchina.
I linguaggi di alto livello sono più vicini al linguaggio naturale, sono orientati ai problemi
piuttosto che all'architettura della macchina. Non fanno riferimento ai registri fisicamente
presenti sulla macchina ma a variabili. Per essere eseguiti devono essere tradotti in
linguaggio macchina, e tale traduzione viene svolta da un programma
detto compilatore.
I linguaggi di alto livello sono in larga misura indipendenti dalla macchina, possono
essere eseguiti su qualsiasi elaboratore a patto che esista il corrispondente compilatore
che ne permetta la traduzione.
I linguaggi di alto livello si caratterizzano per essere orientati a specifiche aree
applicative. Questi linguaggi vengono anche detti della terza generazione.
Per ultimi in ordine di tempo sono arrivati i linguaggi della quarta generazione, ancora
più spiccatamente rivolti a specifiche aree applicative e, nell'ambito del loro
orientamento, utilizzabili in modo intuivo dall'utente non esperto. Il più famoso di questi
è SQL (Structured Query Language), che opera su basi dati relazionali. I linguaggi di IV
generazione sono detti non procedurali poiché l'utente specifica la funzione che vuole
svolgere senza entrare nel dettaglio di come verrà effettivamente svolta.
Book in Progress
Pagina 88
Il linguaggio C
Nel 1972, presso i Bell Laboratories, Dennis Ritchie progettava e realizzava la prima
versione del linguaggio C. Ritchie aveva ripreso e sviluppato molti dei principi e dei
costrutti sintattici del linguaggio BCPL, sviluppato da Martin Richards, e del linguaggio
B, sviluppato da Ken Thompson, l'autore del sistema operativo Unix. Successivamente
gli stessi Ritchie e Thompson riscrissero in C il codice di Unix.
Il C si distingueva dai suoi predecessori per il fatto di implementare una vasta gamma di
tipi di dati (carattere, interi, numeri in virgola mobile, strutture) non originariamente
previsti dagli altri due linguaggi. Da allora ad oggi il C ha subito trasformazioni: la sua
sintassi è stata affinata, soprattutto in conseguenza della estensione object-oriented
(C++). Nel 1983, l’Istituto Nazionale Americano per gli Standard (ANSI) ha costituito un
comitato per una def ne del linguaggio C non ambigua e non dipendente dalla
macchina: il risultato è lo standard ANSI per il C. A questo standard si farà riferimento in
questi appunti.
Struttura di un programma
Iniziamo esaminando il programma del seguente listato.
#include<stdio.h>
main()
{
printf("abc");
printf("def");
printf("ghi");
printf("lmn");
printf("opqrs");
printf("tuvz");
}
Eseguendolo verrà visualizzata la stringa delle lettere dell’alfabeto italiano:
abcdefghilmnopqrstuvz
Dalla parola main, seguita da parentesi tonda aperta e chiusa, inizia l'esecuzione del
programma. Il corpo del programma, che comincia dalla parentesi graffa aperta e
Book in Progress
Pagina 89
finisce alla parentesi graffa chiusa, è composto da una serie di istruzioni printf che
verranno eseguite sequenzialmente.
L'istruzione printf permette la stampa su video di ciò che è racchiuso tra parentesi tonde
e doppi apici. Per esempio
printf("abc");
visualizza
abc
Ogni istruzione deve terminare con un carattere di punto e virgola.
Per poter utilizzare printf, come le altre funzioni di entrata/uscita, si deve inserire all'
del testo la linea
#include <stdio.h>
che avverte il compilatore di includere i riferimenti alla libreria standard di input/output
(stdio sta per standard input/output).
Il C distingue tra lettere maiuscole e minuscole; dunque occorre fare attenzione, se si
scrive MAIN() o Main() non si fa riferimento a main().
La struttura del programma C che abbiamo usato nell'esempio è:
inclusione_librerie
main()
{
istruzione1;
istruzione2;
istruzione3;
........
istruzioneN;
}
Il punto e virgola conclude l’istruzione.
Se si desidera che l'uscita di ogni istruzione printf venga prodotta su una linea separata,
si deve inserire \n al termine di ogni stringa e prima della chiusura dei doppi apici, come
nel seguente Listato.
Book in Progress
Pagina 90
#include <stdio.h>
main()
{
printf("abc\n");
printf("def\n");
printf("ghi\n");
printf("lmn\n");
printf("opqrs\n");
printf("tuvz\n");
}
Eseguendo il programma si otterrà la visualizzazione delle seguenti stringhe di caratteri
abc
def
ghi
lmn
opqrs
tuvz
In questo caso la prima stringa (abc) viene stampata su video a partire dalla posizione
attuale del cursore. Se si vuole cominciare la stampa delle stringhe da una nuova riga
basta inserire\n anche all’ come in:
printf("\nabc\n");
Qui prima si passa ad una nuova riga, poi si stampa la stringa specificata e quindi si
posiziona il cursore in una nuova riga.
In generale è bene tenere presente che ogni printf stampa a partire dalla posizione in
cui si trovava il cursore (in generale a destra dell’ultima stampa). Per poter modificare
tale comportamento è necessario inserire gli opportuni caratteri di controllo. In effetti la
sequenza \n corrisponde ad un solo carattere, quello di nuova linea (newline).
Nella printf possono inserirsi altri caratteri di controllo di cui si forniscono di seguito
quelli che possono avere utilizzo più frequente:
Book in Progress
Pagina 91
•
•
•
•
•
\n porta il cursore all’ della riga successiva
\t porta il cursore al prossimo fermo di tabulazione (ogni fermo di tabulazione è fissato ad 8
caratteri)
\a (alert) fa emettere un suono dallo speaker
\’ stampa un apice
\" stampa le virgolette
Variabili e assegnamenti
Supponiamo di voler calcolare l'area di un rettangolo i cui lati hanno valori interi.
Entrano in gioco due variabili, la base e l'altezza, il cui prodotto è ancora un valore
intero, l'area appunto.
#include <stdio.h>
/* Calcolo area rettangolo */
main()
{
/* dichiarazione delle veriabili */
int base;
int altezza;
int area;
/* parte elaborativa */
base = 3;
altezza = 7;
area = base*altezza;
/* output dei risultati */
printf("%d",area);
Book in Progress
Pagina 92
}/* fine programma */
Per rendere evidente la funzione espletata dal programma si è inserito un commento:
/* Calcolo area rettangolo */
I commenti possono estendersi su più linee e apparire in qualsiasi parte del
programma, devono essere preceduti da /* e seguiti da */, tutto ciò che appare nelle
zone così racchiuse non viene preso in considerazione dal compilatore e non ha alcuna
influenza sul funzionamento del programma, è però importantissimo per chi legge il
programma: è infatti nelle righe di commento che viene specificato il senso delle
istruzioni che seguiranno. Cosa, questa, non immediatamente comprensibile se si
leggono semplicemente le istruzioni del linguaggio.
Subito dopo main() sono presenti le dichiarazioni delle variabili intere necessarie:
int base; int altezza; int area;
La parola chiave int specifica che l'identificatore che lo segue si riferisce ad una
variabile di tipo intero; dunque base, altezza e area sono variabili di questo tipo.
Anche le dichiarazioni così come le altre istruzioni devono terminare con un punto e
virgola. Nel nostro esempio alla dichiarazione del tipo della variabile corrisponde anche
la sua def ne che fa sì che le venga riservato uno spazio in memoria centrale.
Il nome di una variabile la identifica, il suo tipo ne definisce la dimensione e l'insieme
delle operazioni che vi si possono effettuare. La dimensione può variare rispetto
all'implementazione; molte versioni del C, come quelle sotto i sistemi operativi MS-DOS
e Unix, riservano per gli int uno spazio di due byte, il che permette di poter lavorare su
interi che vanno da -32768 a +32767. Tra le operazioni permesse fra int vi sono: la
somma (+), la sottrazione (-), il prodotto (*) e la divisione (/).
Effettuata la dichiarazione, la variabile può essere utilizzata. L'istruzione
base = 3;
assegna alla variabile base il valore 3; cioè inserisce nello spazio di memoria riservato a
tale variabile il valore indicato. Effetto analogo avrà altezza=7. L'assegnamento è
dunque realizzato mediante l'operatore = .
Nel linguaggio C è possibile assegnare lo stesso valore a più variabili
contemporaneamente. Per esempio se le dimensioni riguardavano un quadrato, si
sarebbe potuto scrivere:
base = altezza = 5;
In questo caso prima verrebbe assegnato il valore 5 alla variabile altezza e quindi, il
risultato dell’assegnazione (cioè 5), viene assegnato alla variabile base.
L'istruzione:
Book in Progress
Pagina 93
area = base * altezza;
assegna alla variabile area il prodotto dei valori di base e altezza .
L'operatore asterisco effettua l'operazione di prodotto tra la variabile che lo precede e
quella che lo segue, è dunque un operatore binario.
L'ultima istruzione
printf("%d",area);
visualizza 21, il valore della variabile area. Tra i doppi apici, il simbolo di
percentuale % specifica che il carattere che lo segue definisce il formato di
stampa della variabile area; d(decimale) indica che si tratta di un intero del quale si
desidera la visualizzazione nel sistema decimale.
Le dichiarazioni delle variabili dello stesso tipo possono essere scritte in sequenza
separate da una virgola:
int base,altezza,area;
Dopo la dichiarazione di tipo sono specificati gli identificatori di variabile, che possono
essere in numero qualsiasi, separati da virgola e chiusi da un punto e virgola. In
generale quindi la dichiarazione di variabili ha la seguente forma:
tipo lista_di identificatori;
Esistono inoltre delle regole da rispettare nella costruzione degli identificatori: devono
iniziare con una lettera o con un carattere di sottolineatura _ e possono contenere
lettere, cifre e il carattere di sottolinuatura (under-score) _. Per quanto riguarda la
lunghezza occorre tenere presente che soltanto i primi trentadue caratteri sono
significativi, anche se nelle versioni del C meno recenti questo limite scende a otto
caratteri. Sarebbe comunque opportuno non iniziare il nome della variabile con il
carattere di sottolineatura ed è bene tenere presente che le lettere accentate, permesse
dalla lingua italiana, non sono considerate lettere ma segni grafici e le lettere maiuscole
sono considerate diverse dalle rispettive minuscole.
Oltre a rispettare le regole precedentemente enunciate, un identificatore non può
essere una parola chiave del linguaggio, né può essere uguale ad un nome di
funzione libreria o scritta dal programmatore.
Allo scopo di rendere più chiaro l'effetto ottenuto dal programma dell'esempio
precedente, si possono visualizzare i valori delle variabili base e altezza.
printf("%d ",base);
printf("%d ",altezza);
printf("%d",area);
Book in Progress
Pagina 94
Nelle prime due printf si è inserito all'interno dei doppi apici, di seguito all'indicazione del
formato di stampa %d, uno spazio, in modo che venga riportato, in fase di
visualizzazione, dopo il valore della base e dell'altezza, così da ottenere
3 7 21
e non
3721
È opportuno, per motivi di chiarezza, far precedere la visualizzazione dei valori da una
descrizione. In questo caso è sufficiente inserirla tra doppi apici.
printf("Base: %d ",base);
printf("Altezza: %d ",altezza);
printf("Area: %d",area);
Quello che si ottiene in esecuzlone è
Base: 3 Altezza: 7 Area: 21
Per ottenere una distanza maggiore tra il valore di base e altezza e le seguenti
descrizioni si possono aggiungere ulteriori spazi
printf("Base: %d",base);
printf("\tAltezza: %d",altezza);
printf("\tArea: %d",area);
così da avere
Base: 3
Altezza: 7
Area: 21
Per far in modo che ad ogni visualizzazione corrisponda un salto riga si deve
inserire \n prima della chiusura dei doppi apici:
printf("Base: %d\n",base);
printf("Altezza: %d\n",altezza);
printf("Area: %d\n",area);
Si possono effettuare più output con la stessa istruzione. Per esempio:
printf("Base: %d Altezza: %d Area: %d",base,altezza,area);
visualizzerebbe:
Book in Progress
Pagina 95
Base: 3 Altezza: 7 Area: 21
In questo caso figura una lista di variabili da mandare in output. In sede di esecuzione
ogni simbolo di formato si riferisce ad una variabile (il primo %d si riferisce a base, il
secondo adaltezza ecc…). Ovviamente si sarebbero potuti pure inserire diversi caratteri
di formato per formattare, a seconda delle preferenze, l’output (per es \n per andare a
capo e \t per distanziare).
Osserviamo nel listato il programma C modificato seguendo alcune delle caratteristiche
introdotte.
#include <stdio.h>
/* Calcolo area rettangolo */
main()
{
/* dichiarazione variabili */
int base,altezza,area;
/* parte elaborativa */
base = 3;
altezza = 7;
area = base*altezza;
/* output dei risultati */
printf("Base: %d Altezza: %d\n Area: %d",base,altezza,area);
}/* fine programma */
L'esecuzione del programma avrà il seguente effetto:
Base: 3 Altezza: 7
Area: 21
Book in Progress
Pagina 96
Mentre int è una parola chiave del C e fa parte integrante del
linguaggio, base, altezza e area sono identificatori di variabili scelti a nostra discrezione.
Lo stesso effetto avremmo ottenuto utilizzando al loro posto altri nomi generici
quali x, y e z solo che il programma sarebbe risultato meno comprensibile.
La forma grafica data al programma è del tutto opzionale; una volta rispettata la
sequenzialità e la sintassi, la scrittura del codice è libera. In particolare più istruzioni
possono essere scritte sulla stessa linea. E indubbio che il programma risulterà
notevolmente meno leggibile del precedente.
E' quindi consigliato scrivere le istruzioni su righe diverse e separare i blocchi di
istruzioni in funzione del loro significato utilizzando i commenti per rendere il codice
facilmente leggibile.
Lo stile grafico facilita enormemente il riconoscimento dei vari pezzi di programma e
consente una diminuzione di tempo nelle modifiche, negli ampliamenti e nella
correzione degli errori. In generale è inoltre bene dare alle variabili dei nomi significativi,
in modo che, quando si debba intervenire a distanza di tempo sullo stesso programma,
si possa facilmente ricostruire l'uso che si è fatto di una certa variabile.
Costanti
Nel programma visto precedentemente i valori di base e altezza sono costanti, dato che
non variano durante l'esecuzione del programma. Evidentemente avremmo potuto
scrivere direttamente
area = 3 * 7;
Quando un certo valore viene utilizzato in modo ricorrente è opportuno rimpiazzarlo con
un nome simbolico; per farlo dobbiamo definire, all'
del programma, mediante
l'istruzionedefine un identificatore di costante in corrispondenza del valore desiderato.
Queste sono appunto dette costanti simboliche:
#define BASE 3
Grazie a questa istruzione potremo utilizzare, all'interno del programma, BASE al posto
del valore intero 3.
La stessa def
ne di costante implica che il suo valore non può essere
modificato: BASE può essere utilizzata in un'espressione a patto che su di essa non
venga mai effettuato un assegnamento.
Vediamo nel Listato come viene modificato il programma del paragrafo precedente con
l'utilizzazione delle costanti.
#include <stdio.h>
Book in Progress
Pagina 97
/* dichiarazione costanti simboliche */
#define BASE 3
#define ALTEZZA 7
/* Calcolo area rettangolo */
main()
{
/* dichiarazione variabili */
int area;
/* parte elaborativa */
area = BASE * ALTEZZA;
/* output dei risultati */
printf("Base: %d\n",BASE);
printf("Altezza: %d\n",ALTEZZA);
printf("Area: %d\n",area);
}/* fine programma */
Il nome di una costante può essere qualsiasi identificatore valido in C, comunque
abbiamo scelto di utilizzare esclusivamente caratteri maiuscoli per le costanti e caratteri
minuscoli per le variabili per distinguere chiaramente le une dalle altre. Le
costanti BASE e ALTEZZA vengono considerate di tipo intero in quanto il loro valore è
costituito da numeri senza componente frazionaria.
Invece di utilizzare direttamente i valori, è consigliabile far uso degli identificatori di
costante che sono descrittivi e quindi migliorano la leggibilità dei programmi. Inoltre, se
ci si rende conto che un certo valore utilizzato più volte deve essere cambiato, nella
prima ipotesi, è necessario ricercalo con attenzione all'interno del testo e modificarlo
dov'è il caso, nella seconda ipotesi è sufficiente intervenire sulla sua def ne. Per
esempio, per fare in modo che il programma precedente calcoli l'area del rettangolo con
Book in Progress
Pagina 98
base 102 e altezza 34,
l'istruzione define.
è
sufficiente
modificare
le
linee
dov'è
presente
#define BASE 102
#define ALTEZZA 34
In sintesi, l'uso delle costanti migliora due parametri classici di valutazione dei
programmi: flessibilità e possibilità di manutenzione.
La define è in realtà una macroistruzione (brevemente, macro) del precompilatore C
che offre altre possibilità oltre a quella di definire delle costanti.
Incrementare una variabile
Ogni nuova assegnazione ad una variabile, distrugge un valore precedentemente
contenuto nella variabile stessa. Per cui, nel successivo esempio:
...
voto = 3;
...
voto = 6;
la variabile voto varrà 6. E ciò qualunque sia stato il valore precedente.
Per aggiungere uno al valore contenuto in una variabile si deve assegnare alla
variabile il valore precedente più uno. Ad esempio, questa istruzione aggiunge uno al
contenuto della variabile n:
n = n+1;
Difatti il C calcola per prima cosa il valore dell'espressione posta a destra del segno di
uguale, cioè n+1. Se ad esempio n vale 5, n+1 vale 6. Questo valore viene poi
assegnato alla variabile indicata a sinistra, cioè alla stessa n. Quindi n, che prima
valeva 5, dopo l'esecuzione dell'istruzione vale 6.
Questo si chiama incrementare una variabile, cioè appunto aggiungere un nuovo valore
al valore precedente (nel caso esaminato si aggiunge 1). L'operazione opposta
(togliere, per esempio, 1 al valore della variabile) è chiamata decrementare la variabile.
Ovviamente si può usare lo stesso sistema per compiere qualunque operazione sul
contenuto della variabile:
area = area*2; /* raddoppia l’area */
segmento = segmento/k; /* divide il segmento per k */
Book in Progress
Pagina 99
Il linguaggio C dispone di un operatore speciale per incrementare una variabile di una
unità. Scrivere:
contakm++;
equivale a scrivere:
contakm = contakm+1;
Cioè ad incrementare di una unità il valore della variabile contakm. L'operatore ++ è
l'operatore
di autoincremento.
L'operatore
reciproco -- (due
simboli
meno) decrementa di una unità il valore di una variabile:
altezza--; /* riduce l’altezza di 1 */
L'operatore -- è quindi l'operatore di autodecremento.
Si sono viste, quindi, due tecniche per aggiungere uno al valore contenuto in una
variabile:
fogli = fogli+1;
fogli++;
Esiste anche una terza tecnica:
fogli += 1;
La combinazione += è un esempio di operatore di assegnazione. L'istruzione:
km += 1;
si può leggere: aggiungi uno al valore corrente della variabile km. L'operatore += non è
limitato ad aggiungere 1 ma somma il valore alla sua destra alla variabile alla sua
sinistra. Ad esempio:
km += 37;
k1 += k2;
a += (b/2);
equivalgono rispettivamente a:
km = km+37;
k1 = k1+k2;
a = a+(b/2);
L'operatore += non è l'unico operatore di assegnazione, si possono usare tutti gli
operatori aritmetici:
km -= 6; /* toglie 6 ai km percorsi */
lato *= 2; /* moltiplica il lato per 2 */
volume /= 3; /* divide il volume per 3 */
Book in Progress
Pagina 100
...
Nel seguito di questi appunti si converrà di utilizzare:
•
•
•
gli operatori di autoincremento e di autodecremento tutte le volte che una variabile dovrà essere
aggiornata con l’unità
il doppio operatore (es. +=, -= ecc…) tutte le volte che si parlerà di aggiornamento generico di
una variabile (per es. negli accumulatori)
l’operatore di assegnamento generico (cioè =) in tutti gli altri casi.
Pre e post-incremento
Per aggiungere uno alla variabile z si può scrivere in due modi:
z++;
++z;
cioè mettere l'operatore ++ prima o dopo del nome della variabile.
In generale, le due forme sono equivalenti. La differenza importa solo quando si scrive
una espressione che contiene z++ o ++z.
Scrivendo z++, il valore di z viene prima usato poi incrementato:
int x,z; /* due variabili intere */
z = 4; /* z vale 4 */
x = z++; /* anche x vale 4 ma z vale 5 */
Difatti, prima il valore di z (4) è stato assegnato ad x, poi il valore di z è stato
incrementato a 5.
Scrivendo ++z, il valore di z viene prima incrementato e poi usato:
int x,z; /* due variabili intere */
z = 4; /* z vale 4 */
x = ++z; /* ora x vale 5 come z */
Difatti, prima il valore di z (4) è stato incrementato a 5, poi il nuovo valore di z (5) è stato
assegnato ad x.
Immissione ed emissione di dati
Book in Progress
Pagina 101
Il programma scritto non calcola l'area di un qualsiasi rettangolo ma soltanto di quello
che ha per base 3 e per altezza 7, supponiamo centimetri.
Per esempio, per trovare l'area di un rettangolo di base 57 e altezza 20 si deve
intervenire sul programma stesso, scrivendo
#define BASE 57
#define ALTEZZA 20
Oppure nel caso della versione del programma dove non si sono utilizzate le costanti
ma le variabili, dovremmo scrivere
base = 57;
altezza = 20:
Dopo aver effettuato nuovamente la compilazione, la successiva esecuzione
restituirà 1140, cioè l'area del rettangolo in centimetri quadri.
Per rendere il programma più generale, si deve permettere a chi lo sta utilizzando di
immettere i valori della base e dell'altezza; in questo modo l'algoritmo calcolerà l'area di
un qualsiasi rettangolo.
scanf("%d",&base)
L'esecuzione di questa istruzione fa sì che il sistema attenda l'immissione di un dato da
parte dell'utente.
Analogamente a quello che accadeva in printf, %d indica che si tratta di un valore intero
in formato decimale, tale valore verrà poi assegnato alla variabile base .
Si presti attenzione al fatto che in una istruzione scanf il simbolo & (e
commerciale, ampersand) deve
precedere
immediatamente
il
nome
della
variabile; &base sta ad indicare l'indirizzo di memoria in cui si trova la variabile base. È
infatti noto che le locazioni di memoria in cui sono conservati i dati, sono distinguibili
una dall’altra mediante un indirizzo. Il nome della variabile è una etichetta che viene
assegnata, per nostra comodità, ad una o più locazioni di memoria consecutive.
L'istruzione scanf("%d",&base);può allora essere così interpretata: leggi un dato intero e
collocalo nella posizione di memoria il cui indirizzo è &base (praticamente l’indirizzo
corrispondente alla variabile base).
Durante l'esecuzione di un programma può essere richiesta all'utente l'immissione di
più informazioni, perciò è opportuno visualizzare delle frasi esplicative; a tale scopo
facciamo precedere le istruzioni scanf da appropriate printf.
printf("Valore base: ");
scanf("%d", &base);
Book in Progress
Pagina 102
L'argomento di printf è semplicemente una costante, quindi deve essere racchiuso tra
doppi apici. Non è necessario neanche richiedere un salto a linea nuova mediante
un \n, in quanto l'immissione può avvenire sulla stessa riga.
Quello che apparirà all'utente in fase di esecuzione del programma sarà
Valore base: _
In questo istante l'istruzione scanf attende l'immissione di un valore. Se l'utente
digita 15 seguito da <Invio>.
Valore base: 15 <Invio>
questo dato verrà assegnato alla variabile base
Analogamente possiamo modificare il programma per l'immissione dell'altezza e magari
aggiungere un'intestazione che spieghi all'utente cosa fa il programma, come nel listato
seguente:
#include <stdio.h>
/* Calcolo area rettangolo */
main()
{
/* dichiarazione delle variabili */
int base,altezza,area;
/* input dei dati */
printf("Calcolo AREA RETTANGOLO \n \n");
printf("Valore base: ");
scanf("%d",&base);
printf("\nValore altezza: ");
scanf("%d",&altezza);
/* parte elaborativa */
area = base*altezza;
/* output dei risultati */
printf("\nBase: %d Altezza: %d\n",base,altezza);
Book in Progress
Pagina 103
printf("Area: %d",area);
}/* fine programma*/
Vediamo l'esecuzione del programma nell'ipotesi che l'utente inserisca i valori 10 e 13.
Calcolo AREA RETTANGOLO
Valore base: 10 <Invio>
Valore altezza: 13 <Invio>
Base: 10 Altezza: 13
Area: 130
Notare l’uso del newline per controllare il modo in cui il programma visualizzerà i suoi
risultati. I due \n della prima printf, per esempio, servono: il primo per passare ad una
nuova linea, il secondo per lasciare una linea vuota.
Con una sola istruzione di input è possibile acquisire più di un valore, per cui i due input
dell’esempio precedente, avrebbero potuto essere sostituiti da:
printf("Introdurre Base e Altezza separati da una virgola\n");
scanf("%d,%d",&base,&altezza);
In questo caso, quando il programma viene eseguito, alla richiesta di input si risponderà
con due numeri (che saranno assegnati rispettivamente a base e ad altezza), separati
da una virgola. Il motivo della presenza della virgola è dovuto alla specifica presente
nella scanf: infatti ci sono due %d separati da una virgola.
Istruzione if
Quando si desidera eseguire un'istruzione al presentarsi di una certa condizione, si
utilizza l'istruzione if.
Per esempio, se si vuole visualizzare il messaggio "il valore attuale di i è minore di 100"
solamente nel caso in cui il valore della variabile intera i è minore di100, si scrive:
if( i<100 )
printf("\n il valore attuale di i è minore di 100");
La sintassi dell'istruzione if è:
if( espressione )
istruzione;
dove la valutazione di espressione controlla l'esecuzione di istruzione: se espressione è
vera viene eseguita istruzione.
Book in Progress
Pagina 104
Nell'esempio seguente il programma richiede un numero all'utente e, se tale numero è
minore di 100, visualizza un messaggio.
#include <stdio.h>
/* Esempio utilizzo if */
main()
{
/* dichiarazioni di variabili */
int i;
/* input dei dati */
scanf("%d",&i);
/* parte elaborativa */
if (i<100)
printf("\n minore di 100");
}/* finr programma */
L' espressione i<100 è la condizione logica che controlla l'istruzione di stampa e
pertanto la sua valutazione potrà restituire soltanto uno dei due valori
booleani vero o falso che
in
C
corrispondono
rispettivamente
ai
valori
interi uno e zero.È appunto per tale ragione che l'assegnamento a=i<100, è del tutto
lecito. Viene infatti valutata l'espressione logica i<100, che restituisce 1 (vero) se i è
minore di 100 e 0 (falso) se i è maggiore uguale a 100: il risultato è dunque un numero
intero che viene assegnato alla variabile a.
L'operatore != corrisponde a diverso da, per cui l'espressione a!=0 significa: il valore
di a è diverso da zero.
Chiedersi se il valore di a è diverso da zero è lo stesso che chiedersi se il valore di a è
vero, il che, in C, corrisponde al controllo eseguito per default (effettuato in mancanza di
differenti indicazioni), per cui avremmo anche potuto scrivere
scanf("%d",&i);
a = i<100;
if (a)
printf("\n minore di 100");
Book in Progress
Pagina 105
La sintassi completa dell'istruzione i f è la seguente:
if(espressione)
istruzione1;
[else
istruzione2;]
dove la valutazione di espressione controlla l'esecuzione di istruzione1 e istruzione2:
se espressione è vera viene eseguita istruzione1, se è falsa viene eseguita istruzione2.
Nell'esempio anteriore è stato omesso il ramo else: il fatto è del tutto legittimo in quanto
esso è opzionale, come evidenziato dalle parentesi quadre presenti nella forma
sintattica completa.
La tabella seguente mostra gli operatori utilizzabili nell'istruzione if :
Operatore Esempio Risultato
!
!a
(NOT logico) 1 se a è 0, altrimenti 0
<
a<b
1 se a<b, altrimenti 0
<=
a<=b
1 se a<=b, altrimenti 0
>
a>b
1 se a>b, altrimenti 0
>=
a>=b
1 se a>=b, altrimenti 0
==
a==b
1 se a è uguale a b, altrimenti 0
!=
a!=b
1 se a non è uguale a b, altrimenti 0
&&
a&&b
(AND logico) 1 se a e b sono veri, altrimenti 0
||
a||b
(OR logico)1 se a è vero, (b non è valutato), 1 se b è
vero, altrimenti 0
È opportuno notare che, nel linguaggio C, il confronto dell’eguaglianza fra i valori di due
variabili viene effettuato utilizzando il doppio segno ==. Si confrontino i seguenti due
frammenti:
Programma A
Book in Progress
Programma B
Pagina 106
if( a==b )
If( a=b )
printf("Sono uguali\n");
printf("Valore non zero\n");
Il programma A confronta il contenuto della variabile a ed il contenuto della variabile b:
se sono uguali stampa la frase specificata.
Il programma B assegna ad a il valore attualmente contenuto in b e verifica se è
diverso da zero: in tal caso stampa la frase specificata.
Una ulteriore osservazione va fatta a proposito degli operatori logici ! (NOT
logico), && (AND logico) e || (OR logico) che vengono usati per mettere assieme più
condizioni. Es.
if (a>5 && a<10)
if (a<2 || a>10)
Printf("a compreso fra 5 e 10");
printf("a può essere <2 oppure >10");
Istruzioni composte
L'istruzione composta, detta anche blocco, è costituita da un insieme di istruzioni
inserite tra parentesi graffe che il compilatore tratta come se fosse un'istruzione unica.
Un'istruzione composta può essere scritta nel programma dovunque possa comparire
un'istruzione semplice. Si noti la differenza di esecuzioni dei due frammenti di
programma seguenti:
Programma A
Programma B
if (a>100)
if (a>100) {
printf("Prima frase \n");
printf("Prima frase \n");
printf("Seconda frase \n");
printf("Seconda frase \n");
};
Il programma A visualizzerà "Prima frase" solo se a è maggiore di 100, "Seconda frase"
verrà visualizzato in ogni caso: la sua visualizzazione prescinde infatti dalla condizione.
Il programma B, qualora a non risulti maggiore di 100, non visualizzarà alcuna frase: le
due printf infatti sono raggruppate in un blocco la cui esecuzione è vincolata dal
verificarsi della condizione.
Un blocco può comprendere anche una sola istruzione. Ciò può essere utile per
aumentare la chiarezza dei programmi: l’istruzione compresa in una if può essere
opportuno racchiuderla in un blocco anche se è una sola. In tal modo risulterà più
evidente la dipendenza dell’esecuzione della istruzione dalla condizione.
Book in Progress
Pagina 107
l’operatore ?
L’operatore "?" ha la seguente sintassi:
espr1 ? espr2 : espr3;
Se espr1 è vera restituisce espr2 altrimenti restituisce espr3.
Si può utilizzare tale operatore per assegnare, condizionatamente, un valore ad una
variabile. In questo modo può rendere un frammento di programma meno dispersivo:
Programma A
Programma B
if (a>100)
sconto=(a>100 ? 10 : 5);
sconto=10;
else
sconto=5;
Cicli e istruzione while
Le strutture cicliche assumono nella scrittura dei programmi un ruolo fondamentale, non
fosse altro per il fatto che, utilizzando tali strutture, si può istruire l’eleboratore affinché
esegua azioni ripetitive su insiemi di dati diversi: il che è, tutto sommato, il ruolo
fondamentale dei sistemi di elaborazione.
È in ragione delle suddette considerazioni che i linguaggi di programmazione mettono a
disposizione del programmatore vari tipi di cicli in modo da adattarsi più facilmente alle
varie esigenze di scrittura dei programmi. La prima struttura che prendiamo in
considerazione è il ciclo while (ciclo iterativo con controllo in testa):
while(esp)
istruzione
Viene verificato che esp sia vera, nel qual caso viene eseguita istruzione. Il ciclo si
ripete fintantoché esp risulta essere vera.
Naturalmente, per quanto osservato prima, istruzione può essere un blocco e, anche in
questo caso, può essere utile racchiudere l’istruzione in un blocco anche se è una sola.
Scriviamo, a titolo di esempio di uso del ciclo while, un frammento di programma che
calcola la somma di una serie di valori positivi immessi dall'utente:
...
somma = 0;
printf("\n Inserisci un intero positivo:");
Book in Progress
Pagina 108
scanf("%d", &numero);
while(numero)
{
somma += numero;
printf("\n Inserisci un intero positivo:");
scanf("%d", &numero);
}
In questo caso il controllo all’
del ciclo garantisce la fine della elaborazione non
appena la variabile numero assume valore zero: il ciclo viene ripetuto mentre numero è
diverso da zero. L’input, fuori ciclo, del primo numero da elaborare permette di
impostare la condizione di controllo sul ciclo stesso. Il totalizzatore somma cumula tutti i
valori provenienti da input.
Cicli e istruzione for
L’istruzione for viene utilizzata tradizionalmente per codificare cicli a contatore: istruzioni
cicliche cioè che devono essere ripetute un numero definito di volte. Il formato del
costruttofor è il seguente:
for(esp1; esp2; esp3)
istruzione;
Si faccia attenzione ai punti e virgola posti tra parentesi. Il ciclo inizia con l'esecuzione
di esp1 (inizializzazione del ciclo) la quale non verrà più eseguita. Quindi viene
esaminata esp2(condizione di controllo del ciclo). Se esp2 risulta vera, viene eseguita
istruzione, altrimenti il ciclo non viene percorso neppure una volta. Successivamente
viene eseguita esp3(aggiornamento) e di nuovo valutata esp2 che se risulta essere
vera dà luogo ad una nuova esecuzione di istruzione. Il processo si ripete
finché esp3 risulta essere falsa.
Se supponiamo di voler ottenere la somma di tre numeri interi immessi dall'utente, si
può scrivere:
...
somma = 0;
for(i = 1; i <= 3; i++)
{
scanf("%d", &numero);
Book in Progress
Pagina 109
somma += numero;
}
Il programma per prima cosa assegna il valore 1 alla variabile i (la prima espressione
del for), si controlla se il valore di i è non superiore a 3 (la seconda espressione) e
poiché l’espressione risulta vera verranno eseguite le istruzioni inserite nel ciclo (l’input
di numero e l’aggiornamento di somma). Terminate le istruzioni che compongono il ciclo
si esegue l’aggiornamento di i così come risulta dalla terza espressione contenuta
nel for, si ripete il controllo contenuto nella seconda espressione e si continua come
prima finché il valore di inon rende falsa la condizione.
Questo modo di agire del ciclo for è quello comune a tutti i cicli di questo tipo messi a
disposizione dai compilatori di diversi linguaggi di programmazione. Il linguaggio C
mette a disposizione delle opzioni che espandono abbondantemente le potenzialità
del for generalizzandolo in maniera tale da comprendere, per esempio, come caso
particolare il ciclo while. Il frammento di programma per la somma di una serie di numeri
positivi, scritto in precedenza, potrebbe, per esempio, essere riscritto:
………..
printf("\n Inserisci un intero positivo:");
scanf("%d", &numero);
for(somma=0;numero;)
{
somma += numero;
printf("\n Inserisci un intero positivo:");
scanf("%d", &numero);
}
Il ciclo esegue l’azzeramento di somma (che verrà eseguito una sola volta) e subito
dopo il controllo se il valore di numero è diverso da zero e, in questo caso, verranno
eseguite le istruzioni del ciclo. Terminate le istruzioni, poiché manca la terza
espressione del for, viene ripetuto il controllo su numero.
L’inizializzazione di somma avrebbe potuto essere svolta fuori dalla for: in tal caso
sarebbe mancata anche la prima espressione.
Poiché, nel linguaggio C, ogni ciclo while può essere codificato utilizzando un ciclo for e
viceversa, è bene tenere presente che la scelta del tipo di codifica da effettuare va
sempre fatta in modo da ottenere la massima chiarezza e leggibilità del programma.
Cicli e istruzione do-while
Book in Progress
Pagina 110
L'uso della istruzione while prevede il test sulla condizione all' del ciclo stesso. Ciò
vuol dire che se, per esempio, la condizione dovesse risultare falsa, le istruzioni facenti
parte del ciclo verrebbero saltate e non verrebbero eseguite nemmeno una volta.
Quando l'istruzione compresa nel ciclo deve essere comunque eseguita almeno una
volta, è più comodo utilizzare il costrutto:
do
istruzione;
while(espr);
In questo caso viene eseguita istruzione e successivamente controllato se espr risulta
vera, nel qual caso il ciclo viene ripetuto.
Come sempre l'iterazione può comprendere una istruzione composta.
È bene precisare che in un blocco for, while o do...while, così come nel blocco if, può
essere presente un numero qualsiasi di istruzioni di ogni tipo ivi compresi altri blocchi
for, while o do...while. I cicli possono cioè essere annidati.
Book in Progress
Pagina 111
Book in Progress
Pagina 112
Programmazione e linguaggio C
Unità 2
I Tipi di dati e i modificatori di Tipo.
pag.
114
Il Costrutto Cast.
pag.
118
Array a una dimensione.
pag.
119
Gli Algoritmi di ordinamento e di ricerca pag.
123
Stringhe.
pag.
129
La scelta multipla : istruzione else if.
pag.
131
istruzione switch case e break.
Array a più dimensioni.
pag.
pag.
134
136
Array di stringhe.
pag.
138
La scelta multipla :
A cura di Giuseppe Cavallo
Book in Progress
Pagina 113
Tipi di dati e modificatori di tipo
Negli esempi trattati fino a questo punto tutte le variabili sono state dichiarate di tipo int.
È bene però chiarire che esistono anche altri tipi di dichiarazione delle variabili in modo
che, le stesse, possano contenere valori di natura diversa. D'altra parte ciò è facilmente
intuibile: basta pensare alle limitazioni dettate appunto dal tipo int. In realtà i vari
linguaggi di programmazione permettono di definire le variabili in diversi modi; ciò in
relazione al tipo di dato da contenere e alle esigenze specifiche del tipo di problemi cui
si rivolge il linguaggio stesso.
Nel linguaggio C esistono cinque tipi di dati primari: carattere, intero, reale, doppia
precisione e indefinito. Le parole chiavi utilizzate per dichiarare variabili di questi tipi
sono: char,int, float, double e void. La dimensione del dato contenibile nella variabile
dipende dallo spazio riservato in memoria per ogni tipo di dichiarazione e dalla modalità
di conservazione.
Per quanto riguarda il tipo void (tipo indefinito), si tratterà di ciò in un secondo tempo.
Per il momento l'attenzione sarà rivolta agli altri tipi.
I tipi di dati primari, eccetto il tipo void, ammettono dei modificatori di tipo. Tali
modificatori (signed, unsigned, long, short) sono impiegati per adattare con maggiore
precisione i tipi di dati fondamentali alle esigenze del programmatore.
Nella tabella successiva sono elencati le varie combinazioni più comunemente usate
con un esempio di utilizzo (per i valori ammessi si fa quì riferimento alla
implementazione del C nei PC con processori a 32 bit):
Tipo
Dim. in bit
Valori ammessi
Utilizzo
char
8
da -128 a 127
Numeri piccoli e caratteri ASCII
unsigned char
8
da 0 a 255
Piccoli numeri e il set di caratteri
del PC
short int
16
da -32.768 a +32.767
valori booleani ( 0/1 )
int
32
da
-2.147.483.648
2.147.483.647
unsigned int
32
da 0 a 4.294.967.395
long int
32
da
-2.147.483.648
2.147.483.647
float
32
da 3,4x10
double
64
da 1,7x10
-38
Numeri e cicli
38
a 3,4x10
-308
a 1,7x10
a contatori, accumulatori, etc...
308
a come gli int
Notazione Scientifica (7 cifre di
precisione)
Notazione Scientifica (15 cifre di
precisione)
È bene fare qualche osservazione sulla tabella:
Book in Progress
Pagina 114
•
I tipi signed (char, int, long) conservano in memoria dati utilizzando il metodo del complemento a
2
•
Il tipo float e il tipo double sono rappresentazioni floating-point: vengono comunemente indicati,
rispettivamente, come numeri a singola precisione e a doppia precisione
•
Si noti che il tipo char viene utilizzato sia per conservare piccoli numeri che per conservare il set
di caratteri, cioè dati apparentemente completamente diversi fra di loro dal punto di vista della
elaborazione. La cosa è meno strana di quello che può sembrare a prima vista, basta riflettere
sulla circostanza che, anche se si tratta di caratteri, la conservazione in memoria avviene
associando ad ogni carattere una configurazione binaria e, quindi, un numero. Si può allora
considerare la stessa configurazione come numero o come carattere corrispondente a quella
configurazione binaria: la configurazione 0100.0001 (secondo per esempio la codifica ASCII) può
essere il numero 65 come anche il carattere ‘A’. Tutto ciò può tornare utile per certi tipi di
elaborazione sui caratteri.
•
La specificazione int, se accompagnata da un modificatore, può essere omessa. Si può quindi
dichiarare una variabile indifferentemente long int o solo long
Per ogni tipo è prevista dal C una stringa di controllo per l'output formattato
della printf (per il tipo int, come si ricorderà, tale stringa è %d): per la conversione del
tipo char la stringa %c, per quella di tipo float o double la stringa %f, %l sta
per long e %u per unsigned, la stringa %e fa in modo che il valore della variabile
mandata in output sia visualizzato con il formato esponenziale.
Nelle assegnazioni è spesso necessario specificare meglio il valore da assegnare:
..
long a;
double b;
char c;
..
a = 12L;
b = 15.0;
c = ‘A’;
Il valore 12 andrebbe pure in una variabile di tipo int, il suffisso L fa in modo che venga
espanso in un long.
Nelle assegnazioni ai tipi in virgola mobile è necessario specificare sempre la parte
decimale anche quando, come nel caso precedente, non sarabbe indispensabile.
Nelle assegnazioni alle variabili di tipo char il carattere da assegnare deve essere
racchiuso fra apici.
Book in Progress
Pagina 115
Esaminiamo adesso un programma che trasforma un carattere minuscolo nella sua
rappresentazione maiuscola. Le righe più significative sono commentate da etichette
numeriche cui si farà riferimento poi per alcune osservazioni:
/*
Conversione di un carattere da minuscolo a maiuscolo
Vale per la codifica ASCII
*/
#include <stdio.h>
#define SCARTO 32 /*1*/
main()
{
/* dichiarazioni variabili */
char min,mai;
/* input dati */
printf("\n Conversione minuscolo-maiuscolo");
printf("\n Introduci un carattere minuscolo");
scanf("%c",&min); /*2*/
/* parte elaborativa e output risultati */
if (min>=97 && min<=122) /*3*/
{
mai = min-SCARTO; /*4*/
printf("\n Rappresentazione maiuscola %c",mai); /*5*/
printf("\n Codice ASCII %d",mai); /*6*/
}
Book in Progress
Pagina 116
else
printf("\n Carattere non convertibile");
}/* fine programma */
Nella riga con etichetta 1 è definita la costante SCARTO. Il valore 32 dipende dal fatto
che, nel codice ASCII, tale è la distanza fra le maiuscole e le minuscole (es. ‘A’ ha
codice 65, ‘a’ ha codice 97).
Nella riga con etichetta 2 si effettua l’input del carattere da elaborare. Si noti l’uso
di %c per indicare che si tratta appunto di un carattere.
Nella riga con etichetta 3 si controlla, utilizzando la sua rappresentazione numerica, se
il carattere immesso rientra nei limiti della codifica ASCII delle lettere minuscole. Le
lettere minuscole, in ASCII, hanno codice compreso fra 97 (la lettera minuscola a)
e 122 (la lettera minuscola z). Il confronto poteva anche essere fatto sulla
rappresentazione alfanumerica:
if (min>=’a’ && min<=’z’)
Nella riga con etichetta 4 si effettua in pratica la trasformazione in maiuscolo. Al codice
numerico associato al carattere viene sottratto il valore 32. In questo caso è utilizzato il
codice numerico del carattere. Si noti che in questo contesto ha senso assegnare ad
un char il risultato di una sottrazione (operazione numerica).
Nella riga con etichetta 5 si effettua l’output di mai inteso come carattere (è usato %c),
laddove nella riga 6 si effettua l’output del suo codice numerico (è usato %d).
Le direttive di conversione possono avere varianti che specificano l'ampiezza dei campi,
il numero di cifre decimali e un indicatore per l'allineamento del margine sinistro.
Un intero posto fra il segno di percentuale e il carattere di conversione indica l'ampiezza
minima del campo (vengono aggiunti spazi per assicurare che questa ampiezza sia
garantita, se, invece degli spazi si voglio tanti zeri, basta aggiungere uno zero prima
dello specificatore di ampiezza). La direttiva %05d, per esempio, usa zeri come caratteri
riempitivi in modo da portare la lunghezza totale a cinque caratteri. Per specificare il
numero di cifre decimali di un numero in virgola mobile, si scrive, dopo lo specificatore
di ampiezza, un punto seguito dal numero di cifre che si vuole siano stampate. La
direttiva %10.4f, per esempio, stampa un numero di non meno di 10 cifre con 4 cifre
dopo la virgola. Si può inoltre fare in modo che la stampa sia allineata a sinistra (per
default lo è a destra) ponendo un segno meno: %-10.2f.
Il costrutto cast
Book in Progress
Pagina 117
A volte può interessare effettuare dei cambiamenti al volo per conservare i risultati di
determinate operazioni in variabili di tipo diverso principalmente quando si va da un
tipo meno capiente ad un tipo più capiente. In tali casi il linguaggio C mette a
disposizione del programmatore un costrutto chiamato cast.
Es:
main()
{
int uno, due;
float tre;
uno = 1;
due = 2;
tre = uno/due;
printf("%f",tre);
}
Tale programma nonostante le aspettative (dettate dal fatto che la variabile tre è
dichiarata float) produrrà un risultato nullo. Infatti la divisione viene effettuata su due
valori di tipoint, il risultato viene conservato temporaneamente in una variabile di
tipo int e, solo alla fine, conservato in una variabile float. È evidente, a questo punto,
che la variabile treconterrà solo la parte intera (cioè 0).
Affinchè la divisione produca il risultato atteso, è necessario avvisare il C di convertire il
risultato intermedio prima della conservazione definitiva nella variabile di destinazione.
Tutto ciò è possibile utilizzando il costrutto in questione che ha la seguente sintassi:
(nome-di-tipo) espressione
Utilizzando questo costrutto, il nostro programma, si scriverebbe così:
main()
{
int uno, due;
float tre;
Book in Progress
Pagina 118
uno = 1;
due = 2;
tre = ( (float)uno )/due;
printf("%f",tre);
}
In questo caso il programma fornisce il risultato atteso. Infatti il quoziente viene
calcolato come float e quindi, dopo, assegnato alla variabile tre.
In definitiva il costrutto cast forza una espressione a essere di un tipo specifico (nel
nostro caso una divisione intera viene forzata a fornire un risultato di tipo virgola
mobile).
Array a una dimensione
L' array (in italiano conosciuto anche come vettore), è la prima struttura di dati trattata
in Informatica. È quella più comunemente usata ed è quella che sta a fondamento di
quasi tutte le altre.
Un array è un insieme di variabili dello stesso tipo cui è possibile accedere tramite un
nome comune e referenziare uno specifico elemento tramite un indice. Possiamo
pensare all’array come ad un insieme di cassetti numerati: per poter accedere al
contenuto di un cassetto deve essere specificato il numero ad esso associato (l’indice).
Nelle variabili semplici per accedere al valore contenuto in esse è necessario
specificare il nome ed, inoltre, una variabile con un valore diverso avrà un nome
diverso. Nell’array esiste un nome che però stavolta identifica l’array come struttura (il
nome farà riferimento all’insieme dei cassetti dell’esempio precedente: questo concetto
sarà chiarito meglio più avanti). I singoli elementi dell’array verranno referenziati
specificando la loro posizione relativa all’interno della struttura (l’indice): l’elemento a cui
ci si riferisce dipende dal valore assunto dall’indice.
Gli elementi dell'array vengono allocati in posizioni di memoria adiacenti e, per tale
motivo, è necessario dichiarare un array prima del suo uso in modo che il compilatore
possa riservare in memoria lo spazio necessario per conservarlo.
Il formato generale della dichiarazione di un array a una dimensione è:
tipo nome_variabile[dimensione];
dove tipo è il tipo base dell'array, ovvero il tipo di ogni elemento dell'array; e il numero di
elementi dell'array è definito da dimensione.
Book in Progress
Pagina 119
Il seguente esempio dichiara un array chiamato numero contenente un massimo di 10
elementi interi:
int numero[10];
Poiché il C assegna gli indici agli elementi di un array a partire da 0, gli elementi
dell'array di interi appena dichiarato vanno da numero[0] a numero[9]. Quindi, per
quanto osservato precedentemente: numero è il nome della struttura, identifica
l’insieme degli elementi cioè 10 numeri interi, numero[0], numero[5] individuano il primo
ed il sesto numero della struttura. Se si utilizza numero[i], l’elemento a cui ci si riferisce
dipende dal valore assunto dalla variabile i che deve essere di tipo int.
Essendo poco abituati a concepire un elemento in posizione zero potrebbe essere
opportuno, almeno inizialmente, sistemare gli elementi nell’array a cominciare dalla
posizione 1: si sprecherà memoria riservata ad una posizione non utilizzata, ma i
programmi potrebbero risultare più leggibili.
È bene ricordare che, seguendo tale convenzione, un array dichiarato contenente un
massimo teorico di 10 elementi, può conservare gli stessi dalla posizione 1 alla
posizione 9 (di fatto non potrà contenere più di nove elementi).
Il programma di esempio carica il nostro array con numeri provenienti dall'input:
main()
{
int numero[10], conta;
for (conta=1;conta<=9;conta++)
scanf("%d",&numero[conta]);
}
Si noti nel programma di esempio l’uso della variabile conta: con una sola istruzione di
input ripetuta il programma acquisisce valori da assegnare ai vari elementi dell’array. Il
primo input viene effettuato su numero[1] (conta la prima volta vale 1), il secondo viene
effettuato su numero[2] (conta vale 2) e così via fino al nono.
Questo tipo di array vengono detti ad una dimensione perchè per individuare un
elemento all'interno della struttura, basta specificare un solo indice.
Il linguaggio C non esegue una verifica sui limiti dell'array, pertanto esiste la possibilità
di superarli. Se ciò si verifica, per esempio in un assegnamento, si corre il rischio di
alterare un'altra variabile o un pezzo di codice del programma. In altri termini si può
utilizzare un array di dimensione n oltre i suoi limiti senza che vengano segnalati errori
di compilazione o di esecuzione, ma con il risultato che probabilmente sarà il
programma a mostrare dei malfunzionamenti.
Book in Progress
Pagina 120
Come caso di applicazione di un array numerico consideriamo il seguente esempio: le
temperature rilevate nel corso della giornata in una determinata località sono
conservate in un vettore, si richiede di scrivere un programma che, acquisita una
determinata temperatura, determini se nella località considerata si è avuta nel corso
della giornata tale temperatura e, in caso positivo, in quale rilevazione è registrata tale
temperatura.
In termini informatici si tratta di effettuare una scansione sequenziale di un vettore per
verificare se tale vettore contiene un determinato valore e, in caso positivo, se ne vuole
conoscere la posizione.
Nelle righe più interessanti è presente un commento numerico per le osservazioni
successive.
/* Ricerca un elemento in vettore e restituisce la posizione */
#include <stdio.h>
main()
{
int temp[8],temprif; /*1*/
int i,posiz;
/* Acquisizione delle temperature rilevate */
for (i=0;i<=7;i++)
{
printf("\nRilevazione temperatura n° %d ",i);
scanf("%d",&temp[i]);
}
/* input chiave di ricerca */
printf("\nTemperatura da ricercare ");
scanf("%d",&temprif);
Book in Progress
Pagina 121
/* Scansione del vettore delle temperature */
posiz = -1; /*2*/
for (i=0;i<=7 && posiz==-1;i++) /*3*/
{
if (temprif==temp[i])
posiz = i; /*4*/
}
/* Risultati della ricerca */
if (posiz == -1) /*5*/
printf("\nTemperatura non rilevata");
else
printf("\nTemperatura acquisita nella rilevazione %d",posiz);
}/* fine programma */
Nella riga 1 si dichiara un array di 8 interi per conservare le rilevazioni delle temperature
e una variabile per conservare la temperatura da cercare.
Nella riga 2 si inizializza una variabile che conterrà la posizione nella quale si troverà la
temperatura cercata. Il valore –1 dipende dal fatto che le posizioni ammesse vanno dal
valore 0 in su e, quindi, per indicare un valore che non indichi una posizione valida
occorrerà utilizzare per esempio un numero negativo.
Nella riga 3 inizia il ciclo di scansione dell’array alla ricerca della temperatura di
riferimento. Il controllo di fine ciclo si basa su due eventi che devono verificarsi
contemporaneamente: elementi non finiti (i<=7) e temperatura non trovata (posiz==-1).
Se infatti la temperatura cercata viene ritrovata è inutile continuare ancora ad
esaminare gli altri elementi dell’array. Più avanti si esaminerà un modo diverso di uscita
anticipata da un ciclo a contatore.
Se la temperatura ricercata è presente nell’array allora, nella riga 4, se ne conserva la
posizione nella varabile posiz.
La riga 5 seleziona il caso temperatura non trovata (volere di posiz non modificato) dalla
rilevazione ritrovata.
Book in Progress
Pagina 122
L’algoritmo sviluppato si basa sull’ipotesi che, se c’è, la temperatura ricercata si
presenta una sola volta. Per togliere tale limitazione è necessario predisporre un vettore
per contenere le posizioni delle varie ricorrenze. Le modifiche da apportare al
programma saranno:
•
•
•
•
Nella 1 dichiarare
un
vettore
per
conservare
le
posizioni.
Per
esempio postemp[8]
Nella condizione di uscita del ciclo presente nella 3 occorre togliere il test
su posiz. Qui infatti se si trova la temperatura cercata occorre esaminare tutto
l’array alla ricerca delle eventuali altre ricorrenze.
La riga 4 verrebbe modificata in: postemp[++posiz]=i; bisogna cioè conservare la
posizione i nell’array postemp nella posizione successiva a quella indicata
daposiz (si tenga presente che il valore iniziale è –1). Il contatore posiz va
quindi prima incrementato e poi utilizzato come indice dell’array.
Naturalmente la struttura condizionale 5 viene modificata per permettere di
mandare in output l’array postemp. Si può utilizzare un ciclo a contatore simile a
quello utilizzato per l’input delle temperature: l’indice i varierà fra 0 e posiz e il
ciclo conterrà una printf per la stampa dell’elemento dell’array postemp.
Algoritmi di Ordinamento e di Ricerca .
Data una sequenza disordinata è molto spesso utile ordinarla in modo crescente o
decrescente per migliorarne ad esempio l’efficienza nella ricerca di un elemento .
Tullio
Selection sort
Il selection sort invece è un metodo che cerca il valore più grande e lo mette alla fine
del vettore facendo lo scambio fra la posizione con il valore maggiore e l'ultima cella del
vettore.
void selection(int a[ ],int n)
{
int tmp;
int i,j,min;
for(i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
{
if(a[j]<a[min])
min=j;
}
tmp = a[min] ; a[min] = a[i] ; a[i] = tmp ; // scambia a[min], a[i]
}
}
Book in Progress
Pagina 123
Insertion sort
Un esempio di insertion sort occorre nella vita di ogni giorno mentre giochiamo a carte.
Per ordinare le carte nelle tue mani estrai una carta, "scala" le carte rimanenti,
e inserisci la carta estratta nel posto corretto. Questo processo è ripetuto finchè tutte
le carte sono nella sequenza corretta.
Il metodo di ordinamento ad inserzione trae lo spunto dall'idea che un vettore ordinato
si
ottiene inserendo le sue componenti una per una "al posto giusto". Non si introduce un
secondo vettore, ma si "simula" l' inserzione degli elementi nel vettore dato
void insertion(int a[ ],int n)
{
int i,j,val;
for(i=1;i<n;i++)
{
val=a[i];
for(j=i; j>0 && a[j-1]>val; j--)
{
a[j]=a[j-1];
}
a[j]=val;
}
}
Bubble sort
Il bubble sort e' un algoritmo di scambio. L'algoritmo implica la ripetizione di confronti e,
se necessario, lo scambio di elementi adiacenti. Gli elementi sono come bolle in un
serbatoio di acqua, ognuna delle quali cerca il proprio livello.
Supponiamo di voler ordinare questi elementi DCAB
passo 1 ADCB
passo 2 ADBC
passo 3 ABCD
void bubble(int a[],int n)
{
int i,j,tmp;
for(i=1;i<n;i++)
for(j=n-1;j>=i;j--)
{
if(a[j-1]>a[j])
{
tmp = a[j-1] ; a[j-1] = a[j] ; a[j] = tmp ; // scambia a[j-1], a[j]
}
Book in Progress
Pagina 124
}
}
Volendo migliorare l’efficienza dell’algoritmo , potremmo introdurre una variabile nel
ciclo interno che effettua il conteggio degli scambi .
Se all’uscita del ciclo interno , la variabile indica che non sono stati effettuati scambi
questo sta a significare che la sequenza risulta essere già ordinata per cui si può
interrompere il processo di ordinamento.
void bubble(int a[],int n)
{
int i,j,tmp;
int scambio = 1;
for(i=1;i<n && scambio > 0;i++)
{
scambio = 0 ;
for(j=n-1;j>=i;j--)
{
if(a[j-1]>a[j])
{
tmp = a[min] ; a[min] = a[i] ; a[i] = tmp ; // scambia a[min], a[i]
scambio = scambio +1;
}
}
}
}
Book in Progress
Pagina 125
Gli algoritmi di ricerca su un vettore .
In questa sezione trattiamo del problema di ricercare un valore intero k (per comodità lo
intensifichiamo nella chiave di ricerca in un vettore di interi V.
Le funzioni descritte nel seguito risolvono questo problema, ritornando come valore :
• la posizione in cui x viene trovato nel caso la ricerca abbia successo,
• il valore convenzionale -1 se la ricerca non ha successo.
Ricerca sequenziale .
Tale ricerca effettua una scansione lineare del vettore confrontando elemento per
elemento gli elementi che lo costituiscono con la chiave k data in input .
Se il confronto è positivo allora comunica in output la posizione dell’indice del vettore
dove è stata trovata la chiave di ricerca .
int ricerca_sequenziale (int V[n],int x)
{
for(int i=0; i<n;i++)
if (V[i]==x)
return i;
return -1;
}
Ad esempio se il vettore V è questo rappresentato
3
6
8
9
11
15
17
19
21
22
27
29
66
con K = 11 il processo effettua il confronto partendo dalla posizione 0 V[ 0 ] = 3
e va avanti confrontando sino alla 4 posizione dove V[ 4 ] = 11 , per cui il
processo restituisce il valore 4 cioè la quarta posizione del vettore dove si trova
la chiave con valore 11.
Il caso peggiore , ovviamente , e quando la chiave non è presente sul vettore , per
cui il processo effettua tanti confronti per quanti sono gli elementi del vettore .
Esiste un altro metodo di ricerca , denominata Ricerca Binaria o Dicotomica .
Questa ricerca è sicuramente più efficiente della sequenziale perché effettua una
notevole quantità inferiore di confronti ; vediamo perché.
Prerequisito : Perché si possa applicare l’algoritmo della ricerca Binaria su un vettore è
necessario che quest’ultimo sia stato ordinato in maniera crescente .
L’algoritmo prevede l’utilizzo di tre indici :
• Inizio ( inizialmente è rappresentato dalla prima
posizione del vettore in genere 0 )
Book in Progress
Pagina 126
•
•
Fine ( inizialmente è rappresentato dall’ultima
posizione del vettore : se sono n gli elementi l’ultima
posizione è n-1)
Centro sarà sempre calcolato cosi:
parte intera di ( inizio + fine )/2 e rappresenta la
posizione centrale nella sequenza da 0 a n-1.
Esempio
Data la chiave K = 11 e il vettore V :
POS.
VALORE
0
3
1
6
2
8
3
9
4
11
5
15
6
17
5
15
6
17
centro
7
19
8
21
9
22
10
27
11
29
12
66
8
21
9
22
10
27
11
29
12
66
fine
Inizio = 0 , fine = 12
Centro = parte intera di ( inizio + fine )/2 6
POS.
VALORE
0
3
inizio
1
6
2
8
3
9
4
11
7
19
A questo punto si confronta la chiave K con il valore indicato dalla posizione centro V[ centro ] = 17 ; dal confronto risulta che la chiave e’ inferiore al valore , da cui se ne
deduce che sicuramente se e’ presente sul vettore è collocata a sinistra del centro . In
questo modo si può escludere metà del vettore che sta a destra del centro .
Nell’ipotesi di un vettore con un 1.000.000 di elementi , già con il primo confronto
escludiamo 500.000 elementi da consultare .
Per escludere la parte del vettore collocata a destra del Centro sarà sufficiente
porre l’indice Fine = Centro – 1 per cui ricalcolando il Centro = parte intera di (
Inizio + Fine )/2 il posizionamento degli indici cambia ora così :
POS.
VALORE
0
3
inizio
1
6
2
8
centro
3
9
4
11
5
15
fine
6
17
7
19
8
21
9
22
10
27
11
29
12
66
Fine
Ripetiamo il processo :
si confronta la chiave K con il valore indicato dalla posizione centro V[ centro ] = 8 ;
dal confronto risulta che la chiave e’ maggiore del valore , da cui se ne deduce che
sicuramente se e’ presente sul vettore è collocata a sinistra del centro . In questo modo
si può escludere la metà del vettore che sta a sinistra del centro .
Nell’ipotesi di un vettore con un 1.000.000 di elementi , già con il primo confronto
escludiamo 500.000 elementi da consultare , con il secondo ne escludiamo 250.000 .
Per escludere la parte del vettore collocata a sinistra del Centro sarà sufficiente
porre l’indice Inizio = Centro + 1 per cui ricalcolando il Centro = parte intera di
( Inizio + Fine )/2 il posizionamento degli indici cambia ora così :
POS.
VALORE
0
3
Book in Progress
1
6
2
8
3
9
4
11
5
15
6
17
7
19
8
21
9
22
10
27
11
29
12
66
Pagina 127
inizio
Centro
Fine
Fine
Ripetiamo il processo :
si confronta la chiave K con il valore indicato dalla posizione centro V[ centro ] = 11
; dal confronto risulta che la chiave è uguale al valore non essendo né maggiore e né
minore . Il processo termina comunicando all’esterno la posizione sul vettore della
chiave K.
Dall’analisi di quanto scritto si può notare che per l’effetto dell’avanzamento del
processo di ricerca , i due indici, Inizio e Fine, subiscono uno spostamento in
avanti ed indietro tendendo così a convergere .
Il processo avanzerà sino a quando la chiave K non la troviamo sul vettore alla
posizione indicata dal Centro e contemporaneamente risulta essere l’indice Inizio
minore uguale all’indice Fine ; se per effetto della convergenza di cui sopra, il
primo indice dovesse superare il secondo, questo ci indicherà che tutti gli
elementi del vettore sono stati esclusi dalla ricerca e quindi la chiave da cercare
non è presente .
Con questo metodo si elimina ad ogni accesso sul vettore la metà degli elementi
oggetto di ricerca .
Se N è il numero degli elementi oggetto di ricerca , si hanno al massimo
LOG 2
N accessi per trovare l’elemento o stabilire che non esiste . Il numero n di accessi
, cioè è quel numero tale che 2n ≥ N.
Ad esempio se :
• N = 10
il numero massimo di accessi e 4 infatti 24 = 16 > 10
• N = 100 il numero massimo di accessi e 7 infatti 27 = 128 > 100
• N = 1.000 il numero massimo di accessi e 10 infatti 210 = 1024 > 1000
• N = 1.000.000 il numero massimo di accessi e 20 infatti 220 = 1.048.576 >
1.000.000
Da quanto indicato si può notare che quanto più è alto il numero degli elementi su cui
applicare tale algoritmo tanto è più veloce ed apprezzabile la ricerca , infatti si passa dai
4 accessi su 10 elementi ai 20 accessi su un 1.000.000 di elementi.
L’algoritmo in codice :
int ricerca_binaria (int V[ ], int K, int inizio, int fine)
{
int centro;
while (inizio <= fine)
{
centro = (inizio+fine)/2;
if
( K==V[centro] )
return centro;
else
if ( K<V[centro] )
Book in Progress
Pagina 128
fine = centro-1;
else
inizio = centro+1;
}
return -1;
}
Stringhe
In C uno degli utilizzi degli array ad una dimensione riguarda la conservazione in
memoria di stringhe di caratteri: queste in C sono array di tipo carattere la cui fine è
segnalata da un carattere null (carattere terminatore), indicato come '\0'.
Il carattere null è il primo codice ASCII corrispondente al valore binario 00000000 e non
ha niente a che vedere con il carattere 0 che ha, in ASCII, codice binario 00110000.
char a[10];
dichiara un vettore costituito da un massimo di dieci caratteri e:
char frase[] = "Oggi c'è il sole";
dichiara l'array monodimensionale frase il cui numero di caratteri è determinato dalla
quantità di caratteri presenti fra doppi apici più uno (il carattere null che chiude la
stringa).
È importante notare la differenza tra le due assegnazioni:
char a = 'r';
char b[] = "r";
Nel primo caso viene assegnato il solo carattere r, nel secondo la stringa r\0. In
definitiva: se si vuole fare riferimento ad un solo carattere, questo deve essere
racchiuso fra apici singoli; se, invece, si vuole fare riferimento ad una stringa, occorre
racchiuderla fra doppi apici.
Sono disponibili parecchie funzioni specifiche per il trattamento delle stringhe
nonostante il linguaggio C non possieda un dato di tipo stringa:
gets e puts
Le funzioni gets e puts sono funzioni specializzate nell'input e output di una stringa. Il
programma seguente riceve in input una stringa e, subito dopo, la rimanda in output.
Notare che in queste istruzioni si fa riferimento alla stringa nel suo complesso e, quindi,
viene utilizzato il nome:
#include <stdio.h>
main()
Book in Progress
Pagina 129
{
char s[80]; /* dichiara la stringa */
gets(s); /* riceve l'input */
puts(s); /* fornisce l'output */
}
Altre funzioni per il trattamento delle stringhe sono disponibili, per usi particolari, a patto
che si includa nel programma la linea: #include <string.h>.
strcpy
Questa funzione copia una stringa in un'altra. Può essere utilizzata, per esempio, per
assegnare un valore a una stringa. La sua sintassi è:
strcpy(s1,s2);
Si può immaginare che tale funzione equivale, come effetto, all'assegnamento nelle
variabili di altro tipo (in altri termini è come se si scrivesse: s1=s2 assegna, cioè, alla
stringa s1 il valore contenuto in s2. In realtà, come si vedrà più avanti, tale istruzione è
valida ma assume altro significato).
strcat, strlen e strcmp
La funzione:
strcat(s1,s2);
concatena la stringa s2 alla fine della stringa s1:
strcpy(s1,"buon"); /* stringa specificata in s1 */
strcpy(s2,"giorno"); /* lo stesso per s2 */
strcat(s1,s2); /* s1 conterrà "buongiorno" */
La funzione:
strlen(s1);
restituisce un valore numerico che rappresenta la lunghezza della stringa s1.
La funzione:
strcmp(s1,s2);
Book in Progress
Pagina 130
può essere utilizzata per effettuare comparazioni sul contenuto di due stringhe. In
particolare tale funzione:
•
Restituisce un valore positivo se vale s1>s2
•
Restituisce un valore negativo se vale s1<s2
•
Restituisce 0 se s1 ed s2 sono uguali
Per tenere conto mnemonicamente di tali valori, basta pensare al confronto come ad
una sottrazione: fra l’altro ciò è non è molto distante da quello che avviene in effetti. Se
da s1 si sottrae s2 si avrà un valore positivo nel caso s1>s2, negativo se s1<s2 e nullo
se sono uguali
La scelta multipla: istruzione else-if
Può essere necessario, nel corso di un programma, variare l’elaborazione in seguito a
più condizioni. In questi casi il linguaggio C fornisce la struttura:
if(espressione)
istruzione;
else if(espressione)
istruzione;
..
else
istruzione;
In questo caso le espressioni vengono valutate nell’ordine in cui sono scritte: se è vera
la prima espressione si esegue l’istruzione specificata e poi si passa all’istruzione
successiva alla chiusura della struttura. Se la prima condizione non è vera si passa ad
esaminare la seconda e così via. Si tenga presente che:
•
Ci possono essere tante else if quante ne occorrono per l’elaborazione richiesta. Per ogni
elaborazione l’istruzione eseguita è solo quella soggetta alla condizione verificata
•
La clausola else finale, se presente (in quanto, come l’equivalente nella if già vista in precedenza,
può mancare) gestisce l’istruzione eseguita quando nessuna delle espressioni specificate è
verificata.
Al fine di mostrare un esempio di alcune delle istruzioni esposte ultimamente scriviamo
un programma che, data una espressione algebrica, calcoli quante parentesi graffe,
quadre e tonde sono contenute nella espressione stessa. Le righe più significative sono
etichettate per permettere un commento successivo:
Book in Progress
Pagina 131
/*
Conta i vari tipi di parentesi contenute in una espressione algebrica
(non fa distinzione fra parentesi aperte e chiuse)
*/
#include <stdio.h>
main()
{
/* dichiarazione variabili */
char espress[30]; /*1*/
int pargraf,parquad,partond;
int c;
/* input dati */
printf("\nEspressione algebrica ");
gets(espress); /*2*/
/* parte elaborativa */
pargraf=parquad=partond=0;
for(c=0;c<=29 && espress[c]!=‘\0’;c++) /*3*/
{
if(espress[c]==‘{’ || espress[c]==‘}’) /*4*/
pargraf++;
else if(espress[c]==‘[’ || espress[c]==‘]’) /*4*/
parquad++;
else if(espress[c]==‘(’ || espress[c]==‘)’) /*4*/
Book in Progress
Pagina 132
partond++;
}/* fine ciclo for*/
/* output risultati */
printf("\nGraffe = %d",pargraf);
printf("\nQuadre = %d",parquad);
printf("\nTonde = %d",partond);
}/* fine programma */
Nella riga con etichetta 1 si dichiara un vettore di tipo char e di lunghezza massima
di 30 caratteri, cioè una stringa di 30 caratteri.
Nella riga con etichetta 2 si acquisisce dall’input la stringa (cioè l’espressione algebrica
da elaborare).
Nella riga con etichetta 3 c’è l’
di un ciclo a contatore che servirà per la scansione
della stringa: i caratteri verranno esaminati uno per volta per verificare se sono
parentesi. Nellagets la stringa è vista nel suo complesso, qui si esaminano i singoli
elementi dell’array cioè i caratteri che compongono la stringa. Si noti il controllo di fine
ciclo: il contatore del ciclo, che qui assume il compito di indice del vettore, non può
superare 29 (l’array ha 30 elementi al massimo) ed inoltre il carattere esaminato non
può essere null (qualora lo fosse, la stringa sarebbe terminata). Le due condizioni
devono essere verificate contemporaneamente: se una delle due non è verificata
(superamento dei limiti fissati o fine stringa) l’elaborazione passa all’istruzione
immediatamente dopo la chiusura del ciclo: la printf dopo la chiusura della parentesi
(qui le parentesi sono state aggiunte per aumentare la leggibilità infatti, contenendo il
ciclo una sola istruzione, non sarebbero indispensabili).
Nelle righe etichettate con 4 si esaminano i vari casi possibili (i tre tipi di parentesi). Il
carattere esaminato può essere indifferentemente la parentesi aperta o quella chiusa e,
a seconda del tipo, viene conteggiato nell’apposito contatore. Se il carattere esaminato
non è una parentesi, mancando la clausola else, non viene preso in considerazione.
Book in Progress
Pagina 133
La scelta multipla: istruzioni switch-case e break
Esiste nel linguaggio C un'altra istruzione per codificare la scelta multipla. È necessario
fare attenzione però alle diversità di comportamento. Sintatticamente la struttura si
presenta in questo modo:
switch(espressione)
{
case valore: istruzione;
case valore: istruzione;
..
[default: istruzione;]
}
In pratica in questo caso vengono valutati i diversi valori che può assumere una
espressione. Nelle varie istruzioni case si elencano i valori che può
assumere espressione e che interessano per l’elaborazione. Valutata l’espressione
specificata, se il valore non coincide con alcuno di quelli specificati, viene eseguita
l’istruzione compresa nella clausola default. Occorre tenere presente che,
sostanzialmente, i vari case esistenti agiscono da etichette: se espressione assume un
valore specificato in un case, vengono eseguite le istruzioni a partire da quel punto in
poi. Il valore specificato in case, in definitiva, assume funzione di punto di
ingresso nella struttura.
Se si vuole delimitare l’istruzione da eseguire a quella specificata nella case che verifica
il valore cercato, occorre inserire l’istruzione break che fa proseguire l’elaborazione
dall’istruzione successiva alla chiusura della struttura.
Per chiarire meglio il funzionamento della struttura riscriviamo il programma del
conteggio delle parentesi di una espressione algebrica facendo uso della nuova
struttura.
/*
Conta i vari tipi di parentesi contenute in una espressione algebrica
(non fa distinzione fra parentesi aperte e chiuse)
*/
#include <stdio.h>
main()
Book in Progress
Pagina 134
{
/* dichiarazioni variabili */
char espress[30];
int pargraf,parquad,partond;
int c;
/* input dati */
printf("\nEspressione algebrica ");
gets(espress);
/* parte elaborativa */
pargraf=parquad=partond=0;
for(c=0;c<=29 && espress[c]!=‘\0’;c++)
{
switch(espress[c]) /*1*/
{
case ‘{’:
case ‘}’: pargraf++ /* 2 */;
break; /*3*/
case ‘[’:
case ‘]’: parquad++;/*2*/
break; /*3*/
case ‘(’:
Book in Progress
Pagina 135
case ‘)’: partond++; /*2*/
break;
}/* fine switch */
}/* fine ciclo for */
/* output risultati */
printf("\nGraffe = %d",pargraf);
printf("\nQuadre = %d",parquad);
printf("\nTonde = %d",partond);
}/* fine programma */
Nella riga con etichetta 1 viene specificata l’espressione da valutare: espress[c] cioè il
carattere estratto dall’espressione algebrica.
Nelle righe con etichetta 2 si esaminano i casi parentesi aperta o parentesi chiusa. I
singoli valori sono seguiti dalla istruzione nulla (il solo carattere ;) e, poiché
l’elaborazione continua da quel punto in poi, sia che si tratti di parentesi aperta che di
parentesi chiusa si arriva all’aggiornamento del rispettivo contatore.
Nelle righe con etichetta 3 si blocca l’esecuzione del programma altrimenti, per
esempio, una parentesi graffa oltre che come graffa verrebbe conteggiata anche come
quadra e tonda, una parentesi quadra verrebbe conteggiata anche come tonda. Si noti
che, anche se sono presenti due istruzioni, non vengono utilizzate parentesi per
delimitare il blocco: il funzionamento dellaswitch-case prevede infatti la continuazione
dell’elaborazione con l’istruzione successiva. L’ultima istruzione break è inserita solo
per coerenza con gli altri casi. Inoltre se in seguito si dovesse aggiungere una
istruzione default, il programma continuerebbe a dare risultati coerenti senza necessità
di interventi se non nella parte da inserire.
Array a più dimensioni
Un array a più dimensioni è un insieme di elementi dello stesso tipo, ognuno
referenziabile da un insieme di indici: tanti quante sono le dimensioni dell’array stesso.
Se si ha un array bidimensionale, per esempio, occorrono due indici per identificare
un elemento della struttura.
Il formato generale della dichiarazione di un array a più dimensioni è:
tipo nome_variabile[dimensione] [dimensione] [dimensione]..
Book in Progress
Pagina 136
Gli array bidimensionali (matrici), che sono quelli più comunemente utilizzati, possono
essere pensati come un insieme di elementi posizionati in una tabella: il primo indice
identifica la riga, il secondo la colonna. Un elemento viene identificato specificando la
riga e la colonna in cui si trova.
Come esempio di uso di un array a due dimensioni scriviamo un programma che
costruisce e poi visualizza la tavola pitagorica. Le righe più significative sono, al solito,
corredate da etichette numeriche che serviranno per i commenti successivi:
/* Stampa su video la tavola pitagorica */
#include <stdio.h>
main()
{
/* dichiarazione della tavola e degli indici per scorrerla */
int tavpit[11][11]; /*1*/
int i,j;
/* Costruisce la tavola */
for (i=1;i<=10;i++) /*2*/
{
for (j=1;j<=10;j++) /*3*/
{
tavpit[i][j]=i*j; /*4*/
}/* fine ciclo for interno */
}/* fine ciclo for esterno */
/* Manda in output la tavola */
for (i=1;i<=10;i++)
{
for (j=1;j<=10;j++)
Book in Progress
Pagina 137
printf("%3d ",tavpit[i][j]); /*5*/
printf("\n"); /*6*/
}/* fine ciclo for esterno */
}/* fine programma */
Nella riga con etichetta 1 si dichiara una matrice di 11 righe ed 11 colonne.
Nella riga con etichetta 2 si inizia il ciclo per la scansione delle righe della tabella
(l’indice i viene utilizzato per identificare la riga esaminata della tabella). L’indice viene
inizializzato ad 1non avendo interesse a visualizzare la riga formata da tutti valori nulli.
Nella riga con etichetta 3 si inizia un nuovo ciclo, interno al primo, per la scansione delle
colonne. L’uso delle parentesi mette in evidenza il funzionamento di questo doppio
ciclo: si esamina la prima riga (i=1) e quindi le varie colonne di quella riga
(per i=1 l’indice J varia da 1 a 10) . Si passa poi alla riga successiva e così via.
Nella riga con etichetta 4 si assegna il valore all’elemento della tabella che sta nella
riga i e nella colonna j: nel nostro caso sarà equivalente al prodotto fra i due indici.
Nella riga con etichetta 5 viene mandato in output l’elemento generico. La stringa di
formattazione dell’output consente l’allineamento e l’incolonnamento dei numeri della
tabella.
La printf della riga 6 manda in output semplicemente un newline che consente di
passare a capo quando si tratta di stampare su video una nuova riga della tabella.
La printf è infatti posizionata alla fine del ciclo controllato da j (quello che stampa le
colonne di una riga), quindi dopo la stampa di tutte le colonne di una riga, e prima della
chiusura del ciclo controllato da i (quello che stampa le righe) quindi prima di passare
alla prossima riga.
Array di stringhe
Una applicazione interessante delle matrici è l’array di stringhe. La stringa è un array di
caratteri e quindi potremmo dire che un array di stringhe è un array di array di caratteri.
Per chiarire la gestione di questo tipo di array esaminiamo un programma che si occupa
di cercare delle parole in un vocabolario e ci dica, per ognuna, se è contenuta nel
vocabolario stesso
/* Cerca parole in un vocabolario */#include <stdio.h>
#include <string.h> /*1*/
main()
{
Book in Progress
Pagina 138
/* dichiarazione array e indici */
char vocab[10][20], parcerc[20]; /*2*/
int i,trovata;
/* Acquisisce parole da inserire nel vocabolario */
for (i=0;i<=9;i++)
{
printf("\nParola %d ",i);
gets(vocab[i]); /*3*/
}/* fine ciclo for */
/* Acquisisce la parola da cercare */
printf("\n\nParola da cercare (Invio per finire) ");
gets(parcerc);
while (strcmp(parcerc,"")) /*4*/
{
/* Cerca la parola */
trovata=0; /*5*/
for (i=0;i<=9;i++)
{
if (!strcmp(parcerc,vocab[i])) /*6*/
{
trovata=1; /*7*/
break; /*8*/
}/* fine if */
Book in Progress
Pagina 139
}/* fine ciclo for */
if (trovata) /*9*/
printf("\nParola trovata");
else
printf("\nParola non trovata");
/* Prossima parola da cercare */
printf("\n\nParola da cercare (Invio per finire) ");
gets(parcerc);
}/* fine ciclo while */
}/* fine programma */
La dichiarazione della riga 1 permette l’utilizzo all’interno del programma delle funzioni
per il trattamento delle stringhe.
Nella riga 2 viene dichiarato l’array di caratteri vocab[10][20]. Il nostro vocabolario
conterrà quindi un massimo di 10 parole ognuna composta di un massimo
di 20 caratteri. La prima parola è contenuta in vocab[0] e con vocab[2][7], qualora
dovesse interessare, si individuerebbe l’ottavo carattere della terza parola del
vocabolario. Ogni riga della tabella conterrà una parola e in ogni colonna ci sono i
caratteri che compongono le parole. L’array parcerc[20] servirà per contenere la parola
da cercare.
Nella riga 3 si acquisiscono le parole da inserire nel vocabolario: la prima volta
l’istruzione si leggerà gets(vocab[0]), quindi gets(vocab[1]) e infinegets(vocab[9]) in
relazione ai diversi valori assunti dal contatore i. L’uso di un solo indice dipende dal
fatto che, con la gets, si acquisisce una stringa e quindi nel nostro caso una intera riga
della matrice. Se avessimo voluto acquisire le stringhe un carattere per volta, si
sarebbero dovuti gestire due cicli uno annidato nell’altro, così come nell’esempio della
tavola pitagorica, contenenti l’istruzione scanf("%c",&vocab[i][j]). Alla fine avremmo
dovuto aggiungere il carattere null.
Nella riga 4 si gestisce la condizione di uscita dal ciclo. La stringa ricevuta dall’input
viene comparata con la stringa vuota (due doppi apici consecutivi): se alla richiesta di
input della stringa da cercare si risponde premendo solamente il tasto Invio, viene
acquisita una stringa contenente solo il carattere terminatore null. Ciò rende falsa la
condizione e quindi il ciclo ha termine (strcmp in questo caso restituisce 0).
Book in Progress
Pagina 140
La variabile trovata che viene azzerata nella riga 5 registrerà l’eventuale ritrovamento
della stringa all’interno del vocabolario. Il valore assegnato non ha il senso di un valore
numerico a tutti gli effetti ma il senso di un valore logico (0 = falso, un valore non
nullo=vero). Una variabile usata in questo modo viene chiamata solitamente variabile
logica, switch o flag.
Nella 6 si confronta la parola da cercare via via con le parole contenute nel vocabolario.
L’equivalenza delle due stringhe, quella da cercare e la parola del vocabolario
esaminata, rende vera la condizione. In questo caso, riga 7, si rende vera la
variabile trovata assegnandole un valore non nullo e con la break della riga 8 si forza
l’uscita dal ciclo poiché è inutile continuare a confrontare la parola cercata con il resto
delle parole del vocabolario: la ricerca viene sospesa.
Nella riga 9 si esegue un test sul flag trovata: se è vero (cioè è stata eseguita
l’istruzione della riga 7) la parola è stata trovata, se è falso (è rimasto inalterato il valore
assegnato nella istruzione della riga 5) la ricerca ha avuto esito negativo.
Book in Progress
Pagina 141
Book in Progress
Pagina 142
•
Lavoriamo in Laboratorio con
il DevC++
•
BOOK IN PROGRESS
Autori:
Prof. Giampaolo Brancatello
Prof. Valter Pierangeli
IIS Volterra-Elia - Ancona
Data ultima revisione:
Book in Progress
lunedì 19 settembre 2011
Pagina 143
Competenze
Abilità
Conoscenze
Utilizzare, con autonomia
Rappresentare la soluzione di
un problema con diagrammi
di flusso.
Fondamenti di
programmazione strutturata.
metodologica ed esecutiva,
procedure e tecniche per
trovare soluzioni efficaci ed
efficienti, in relazione a
semplici problemi nei campi
di propria competenza.
Analizzare e risolvere
Elementi di struttura di un
linguaggio di
programmazione.
semplici problemi con i
principi della
programmazione strutturata
.
Sommario
1.
INTRODUZIONE .................................................................................................. 146
2.
SETUP.................................................................................................................. 148
2.1.
Procedura di installazione ........................................................................................ 148
2.2.
Configurazione .......................................................................................................... 152
2.2.1.
2.2.2.
3.
Opzioni di compilazione ............................................................................................................ 154
Opzioni dell’editor ...................................................................................................................... 154
SESSIONE DI LAVORO ...................................................................................... 155
3.1.
Il progetto ................................................................................................................... 155
3.2.
Esecuzione del programma ...................................................................................... 161
3.3.
Salvataggio del codice .............................................................................................. 166
3.1.1.
3.1.2.
3.1.3.
Creazione di un nuovo progetto ................................................................................................ 155
Apertura di un progetto/file esistente ........................................................................................ 157
Modifica del codice sorgente ..................................................................................................... 159
3.2.1. Compilazione ................................................................................................................................ 161
3.2.2. Compilazione, link ed esecuzione ................................................................................................ 163
3.2.3. Esecuzione con parametri ............................................................................................................ 165
4.
LABORATORIO N. 1 - FUNZIONI MATEMATICHE: LA LIBRERIA MATH.H .... 167
4.1. Scopriamo il funzionamento della funzione floor() ..................................................... 168
4.2. Lavoriamo con la funzione round() ............................................................................... 168
4.3. Lavoriamo con la funzione ceiling() .............................................................................. 169
4.4. Lavoriamo con altre funzioni matematiche. ................................................................ 170
Book in Progress
Pagina 144
4.5. Creazione di espressioni matematiche in C ................................................................. 170
4.5.1. Esempio ........................................................................................................................................ 171
4.5.2. Esercizi di Laboratorio .................................................................................................................. 172
5. LABORATORIO N. 2 - LE ISTRUZIONI CONDIZIONALI ....................................... 172
5.1. Espressioni Booleane .................................................................................................... 172
5.2. Istruzioni IF ed IF () … ELSE …. .................................................................................... 173
5.2.1. Esempio 1 ..................................................................................................................................... 174
5.2.2. Esempio 2 ..................................................................................................................................... 174
5.2.3. Esercizi in laboratorio.................................................................................................................... 176
5.3. Istruzioni IF nidificate (nested ) ..................................................................................... 179
5.3.1. Esempio ........................................................................................................................................ 180
5.3.2. Esercizi in laboratorio.................................................................................................................... 180
5.4. Istruzione SWITCH (selezione multipla) ........................................................................ 182
5.4.1. Esempio ........................................................................................................................................ 183
5.4.2. Esercizi in laboratorio.................................................................................................................... 185
6. LABORATORIO N. 3 - I CICLI (STRUTTURA ITERATIVA ) - PARTE PRIMA ..... 187
6.1. Ciclo WHILE .................................................................................................................... 187
6.1.1.
6.1.2.
6.1.3.
6.1.4.
Esempio 1 ..................................................................................................................................... 189
Esempio 2 ..................................................................................................................................... 189
Esempio 3 ..................................................................................................................................... 190
Esercizi di Laboratorio .................................................................................................................. 191
6.2. Ciclo DO ... WHILE ........................................................................................................... 193
6.2.1. Esempio 1 ..................................................................................................................................... 193
6.2.2. Esercizi di Laboratorio .................................................................................................................. 194
7. LABORATORIO N. 4 - I CICLI (STRUTTURA ITERATIVA )
- PARTE SECONDA ..................................................................................................... 195
7.1. Ciclo FOR ........................................................................................................................ 195
7.1.1. Esempio 1 ..................................................................................................................................... 196
7.1.2. Esempio 2 ..................................................................................................................................... 197
7.1.3. Esercizi di Laboratorio .................................................................................................................. 198
8.
APPENDICE ......................................................................................................... 199
8.1.
Help in linea ............................................................................................................... 199
8.2.
Bloodshed.net ........................................................................................................... 199
8.3.
SourceForge.NET ...................................................................................................... 199
8.4.
Esempio di Relazione di Laboratorio ....................................................................... 200
Book in Progress
Pagina 145
1.
Introduzione
DevC++ è un ambiente di sviluppo integrato (IDE, ovvero Integrated Development
Environment) che permette di scrivere e verificare programmi in linguaggio C o C++, sia in
modalità Windows (cioè con interfaccia grafica) sia in modalità Console (cioè con interfaccia
testuale). E’ open-source, quindi completamente gratuito, compatibile con qualsiasi sistema
operativo e con lo standard C89 o ANSI C.
Per i nostri scopi l’IDE verrà utilizzato per sviluppare applicazioni in linguaggio C
in modalità Console.
Fig. 1.1: Informazioni su DevC++
ANSI C è uno standard proprio perché la maggior parte dei compilatori soddisfa le specifiche da
esso previste per il linguaggio.
Grazie alla sua interfaccia grafica, un ambiente IDE consente di utilizzare in modo semplice gli
strumenti offerti dal compilatore senza dover ricorrere necessariamente alle istruzioni da riga di comando
(command-line).
L’ultima versione ad oggi disponibile è la 4.9.9.2, che si può reperire facilmente su Internet in
diversi siti che ne permettono il download (ad esempio http://sourceforge.net/projects/devcpp/files/Binaries/Dev-C%2B%2B%204.9.9.2/devcpp-4.9.9.2_setup.exe/download ).
L’IDE della versione 4.9.9.2 si presenta come in fig. 1.2.
Book in Progress
Pagina 146
Fig. 1.2: L’IDE DevC++ 4.9.9.2
Ogni progetto che verrà sviluppato in laboratorio, dal più semplice fino al più complesso, dovrà
essere opportunamente documentato in una Relazione, secondo uno schema standard che ripercorre le
fasi comunemente comprese nell’espressione Ciclo di vita del software. Un esempio concreto di
Relazione di Laboratorio è mostrato in Appendice 4.4.
Ecco una descrizione sintetica delle attività fondamentali che l’allievo dovrà percorrere, simulando
quello che il mercato del software richiede quando un problema reale deve essere risolto attraverso lo
sviluppo di una applicazione informatica:
• la fase di analisi, che ha lo scopo di definire (il più precisamente possibile) il problema da
risolvere, evidenziando i dati di ingresso/uscita e il procedimento risolutivo. Verrà utilizzato in
questa fase il linguaggio naturale.
• la fase di progetto, in cui si mette a punto l’interfaccia per l’utente e l’algoritmo risolutivo,
partendo dall’analisi svolta. Questa fase ha lo scopo di definire in maniera dettagliata la soluzione
del problema con uno strumento formale, che può essere lo pseudo-linguaggio con parole-chiave
prestabilite oppure il diagramma di flusso.
• la fase di implementazione o codifica del sistema, ovvero la sua realizzazione concreta; questa
tipicamente consiste nella traduzione del progetto in un linguaggio per Computer.
L'implementazione ha lo scopo di realizzare la soluzione, che nel nostro caso passa attraverso la
conoscenza del Linguaggio C e dell’ambiente di sviluppo DevC++.
• la fase di collaudo, volta a misurare in che modo il sistema realizzato soddisfa i requisiti stabiliti
nella fase di analisi, ovvero a valutarne la correttezza rispetto alle specifiche. I test verranno
svolti a partire da dati di esempio, possibilmente agli estremi degli intervalli ammessi, per
verificare che i risultati attesi siano effettivamente quelli prodotti del software
• la fase di manutenzione, che comprende tutte le attività di modifica del software successive al
suo collaudo per correggere eventuali marginalità o estenderne le funzionalità.
• la fase di documentazione, che si realizza attraverso tutte le precedenti fasi nella scrittura della
relazione finale.
Book in Progress
Pagina 147
2.
Setup
Per installare e configurare DevC++ 4.9.9.2 è necessario:
1.
installare DevC++ versione 4.9.9.2 mediante doppio clic sul file devcpp-4.9.9.2_setup.exe;
2.
configurare DevC++ per prepararlo all’utilizzo.
2.1. Procedura di installazione
Prevede i passi di seguito riportati (wizard o procedura guidata).
Per prima cosa viene chiesto di non installare il programma se una sua versione precedente fosse
già installata. E' quindi necessario disinstallare l'eventuale versione di DevC++ presente sul proprio
computer, riavviare la procedura guidata e premere OK per proseguire.
Fig. 2.1: Messaggio di benvenuto
Un messaggio avviserà quindi di attendere l'estrazione dei dati compressi dal file di installazione e
subito dopo verrà chiesto di confermare la scelta della Lingua (nel nostro caso l'Italiano).
Fig. 2.2: Data unpacking - Language selection
Infine occorre accettare l'accordo di licenza (licence agreement - DevC++ è gratuito): premere
Accetto per proseguire.
Book in Progress
Pagina 148
Fig. 2.3: License Agreement
Poi le opzioni di installazione: l’installazione tipica è di default e prevede la selezione automatica
dei componenti necessari. Premere Avanti per proseguire.
Fig. 2.4: Installazione tipica
Si conferma quindi la cartella di installazione. Premere Installa per proseguire.
Book in Progress
Pagina 149
Fig. 2.5: Cartella di installazione
Vengono estratti nella cartella specificata i file compressi contenuti del file di installazione.
Book in Progress
Pagina 150
Viene infine chiesto se rendere disponibile DevC++ a tutti gli utenti eventualmente configurati sul
computer.
Fig. 2.6: Installazione in corso
La procedura guidata è così conclusa ed è quindi possibile avviare per la prima volta DevC++ per
terminare la fase iniziale di installazione-configurazione, al termine della quale finalmente sarà possibile
scrivere e testare le prime applicazioni in linguaggio C.
Book in Progress
Pagina 151
2.2. Configurazione
La configurazione iniziale di DevC++ consente di scegliere la lingua, l’aspetto grafico ed altre
opzioni. Seguire le indicazioni delle figure seguenti, premendo Next per proseguire e alla fine OK.
Fig. 2.7: Configurazione iniziale
Book in Progress
Pagina 152
Se si vuole evitare la comparsa della finestra in figura ogni volta che si avvia DevC++ basta
mettere il segno di spunta nella casellina in basso a sinistra e cliccare su Chiudi.
Fig. 2.8: Disabilitazione dei suggerimenti iniziali
È inoltre possibile configurare i parametri di compilazione e personalizzare l’editor del codice
sorgente tramite le apposite voci del menu Strumenti.
Fig. 2.9: Menu Strumenti Opzioni di compilazione
Book in Progress
Pagina 153
2.2.1.
Opzioni di compilazione
Ci interessa la compilazione di programmi C e non C++.
Fig. 2.10: Opzioni di compilazione
2.2.2.
Opzioni dell’editor
Fig. 2.11 : Opzioni dell’editor
Book in Progress
Pagina 154
3.
Sessione di lavoro
Una tipica sessione di lavoro con un ambiente di sviluppo prevede una serie di azioni, spesso
svolte in modo ciclico.
Durante una sessione di lavoro:
1.
si crea un nuovo progetto o si apre un progetto esistente;
2.
si inserisce o si modifica il codice sorgente;
3.
si salvano le modifiche apportate;
4.
si effettua la compilazione;
5.
in caso di esito positivo il programma viene eseguito, altrimenti si ritorna al passo 2.
3.1. Il progetto
Dal momento che un programma potrebbe essere costituito da più file, l’IDE prevede il concetto di
progetto, ossia un gruppo di file di codice sorgente in linguaggio C che costituisce il programma da
compilare ed eseguire.
Anche se nei nostri esempi il programma sarà costituito da un unico file sorgente, la creazione di
un file progetto è indispensabile per la creazione del’unico file sorgente. In altri termini, anche se il
programma risiede in un unico file (ad esempio Area di un Triangolo), è necessario creare dapprima il
progetto che lo contiene.
3.1.1. Creazione di un nuovo progetto
Fig. 3.1: Creazione di un nuovo progetto
Book in Progress
Pagina 155
Ci occuperemo di applicazioni console, cioè che utilizzano come standard input e standard output
una finestra MS-DOS., impostando il C come linguaggio predefinito (vedi Fig. 3.2).
Fig. 3.2: Applicazioni console in C
Nel caso di progetti costituiti da un unico file, è possibile assegnare al progettto (file con estensione
.dev) lo stesso nome del file sorgente (file con estensione .c).
D’ora in poi tutta la trattazione prenderà come esempio il problema Area di un Triangolo, oggetto
della Relazione di Laboratorio standard inserita in Appendice 4.4.Pertanto daremo come nome al nostro
progetto e al relativo file sorgente AreaTriangolo: si noti come sia opportuno evitare spazi nei nomi
assegnati ai file (per compatibilità con altri sistemi operativi) e che un utilizzo opportuno delle iniziali
maiuscole renda comunque intellegibile la separazione tra le diverse parole unite. Nelle figure seguenti
viene mostrata la corretta sequenza delle operazioni di salvataggio, che è opportuno effettuare fin
dall’inizio, in una cartella creata precedentemente dal nome Progetti Informatica.
Fig. 3.3: Salvataggio di un nuovo progetto
Book in Progress
Pagina 156
Fig. 3.4: File sorgente standard (main.c), da salvare
con il nome corretto cliccando sul pulsante indicato dalla freccia.
Fig. 3.5: Salvataggio del file sorgente con il nome corretto (AreaTriangolo.c)
Book in Progress
Pagina 157
3.1.2. Apertura di un progetto/file esistente
L’apertura di un file o progetto esistente consente di modificare il codice sorgente. La funzione è
accessibile dal menu File Apri Progetto o File… (vedi Fig.3.6)
Fig. 3.6: Apertura di un progetto/file esistente
Book in Progress
Pagina 158
3.1.3. Modifica del codice sorgente
L’IDE dispone di un editor che, oltre ad offrire l’evidenziazione automatica delle parole chiave
(keyword), permette di:
1. effettuare ricerche e sostituzioni di testo;
2. di spostarsi ad una determinata funzione del programma;
3. di spostarsi ad una determinata riga (linea) del programma.
Queste funzionalità di ricerca/sostituzione testo sono accessibili dal menu Cerca.
Fig. 3.7: Ricerca del testo PAUSE
Scegliendo l’opzione Trova nei Files… i risultati della ricerca nei files del progetto si trovano nella
apposita scheda della finestra di output in basso.
Fig. 3.8: Risultati ricerca sui file del progetto
Book in Progress
Pagina 159
Ora possiamo inserire il codice relativo al nostro progetto Area di un Triangolo (vedi Appendice
4.4).
Fig. 3.9: Codice relativo al progetto Area di un Triangolo
Book in Progress
Pagina 160
3.2. Esecuzione del programma
3.2.1. Compilazione
La voce Compila consente di effettuare la compilazione ed il link del progetto, ossia dell’insieme di
file di codice sorgente .C di cui è costituito (nel nostro caso un solo file .C). Il comando comporta il
salvataggio automatico del progetto.
Fig. 3.10: Compilazione
Se la compilazione è avvenuta con
successo compare la finestra di dialogo
Compile Progress con status “Done.”.
Fig. 3.11: Progetto compilato
Book in Progress
Pagina 161
Gli eventuali errori di compilazione sono presentati nella scheda Compilatore, in basso.
Fig. 3.12: Scheda “Compilatore” con errori di compilazione
Nella scheda Log di compilazione si possono vedere, indipendentemente dalla presenza di errori o
meno, i risultati (log) dell’attività di compilazione.
Fig. 3.13: Scheda “Log di compilazione”
Book in Progress
Pagina 162
3.2.2. Compilazione, link ed esecuzione
L’esecuzione del comando Compila & Esegui comporta nell’ordine:
1.
compilazione del file sorgente .c (generazione del file di codice oggetto .o);
2.
qualora siano presenti, compilazione dei rimanenti file sorgenti .c componenti il progetto
(generazione dei rispettivi file di codice oggetto .o)
3.
link del progetto (generazione del file progetto.exe).
Il comando comporta il salvataggio automatico del progetto.
Fig. 3.14: Compilazione, link ed esecuzione
In presenza di errori il programma non viene eseguito e, nella scheda Compilazione si possono
vedere le tipologie di errore riscontrate (compilazione, link e build).
Fig. 3.14: Scheda “Compilatore” con errori
Book in Progress
Pagina 163
Nella scheda Log di compilazione si possono vedere i risultati (log) delle attività di compilazione e
di link. In essa sono riportati gli eventuali errori generati.
Fig. 3.15: Scheda “Log di compilazione” con errori
Book in Progress
Pagina 164
Con il comando Pulisci si elimina dalla cartella corrente il file .exe generato. Si consiglia di utilizzare
questo comando prima di una nuova azione di compilazione ed esecuzione.
Fig. 3.16: Eliminazione dell’eseguibile generato
3.2.3. Esecuzione con parametri
È possibile parametrizzare l’esecuzione di un programma attribuendo un valore ai parametri della
funzione main.
int main (int argc, char *argv[])
Per specificare il valore di tali parametri si deve richiamare il comando Parametri... dal menu
Esegui. I parametri (stringa) devono essere separati da spazio.
Fig. 3.17: Specifica di parametri nella funzione main()
Book in Progress
Pagina 165
3.3. Salvataggio del codice
I comandi di salvataggio sono contenuti
nel menu File.
Le opzioni di salvataggio sono 4:
4. salvataggio del file sorgente .C corrente
(comando Salva);
5. salvataggio con rinomina del file
sorgente .C corrente
(comando Salva Come);
6. salvataggio con rinomina del progetto
(.dev) corrente
(comando Salva il Progetto come...);
7. salvataggio di tutti i file aperti
(Salva Tutto).
Fig. 3.18: Opzioni di Salvataggio
Il salvataggio con nome prevede di specificare la cartella in cui il file deve essere salvato.
Fig. 3.16: Salvataggio con nome del file sorgente .C
Book in Progress
Pagina 166
4.
Laboratorio n. 1 - Funzioni matematiche: la libreria
math.h
In aggiunta agli operatori aritmetici (+ - * /), il linguaggio C mette a disposizione di chi
programma una serie di funzioni matematiche, tutte richiamabili da un insieme (libreria)
denominato math.h
Nella tabella che segue ne riportiamo alcuni:
Funzione
Valore calcolato
abs(x)
logx(x)
log10(x)
round(x)
floor (x)
Pow(x,y)
Valore assoluto di x |x|
Logaritmo naturale di x
Logaritmo in base 10 di x
Arrotondamento di x
In matematica, la funzione parte intera è la
funzione definita come segue: per un numero
reale x, la parte intera di x, indicata con int(x) o
floor(x) (dalla parola inglese floor che significa
"pavimento") è il più grande intero minore od
uguale a x.
Per esempio int(2.9)=2, int(−2) = −2 e
int(−2.3) = −3
Correlata alla funzione floor è la
funzione ceiling (dalla parola inglese ceiling che
significa "soffitto") definita nel modo seguente:
per ogni numero reale x, ceiling(x) è il più
piccolo intero non minore di x. Per esempio,
ceiling(2.3) = 3, ceiling(2) = 2 e ceiling(−2.3) =
−2
Funzione potenza: xy
sqrt(x)
max(x,y)
min(x,y)
sin(x)
cos(x)
X base ed y potenza
Radice quadrata di x
Maggiore fra x ed y
Minore fra x ed y
Seno di x , x espresso in radianti
Coseno di x , x espresso in radianti
ceiling(x)
Definizione di costanti :
Costante
#define pigreco 3.14159
Pi greco (circa 3.14159265358979323846)
#define E 2.71828
E = numero di Nepero
circa 2.7182818284590452354
Book in Progress
Pagina 167
4.1. Scopriamo il funzionamento della funzione floor()
Digita le seguenti righe di codice in c:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{float j;
printf("Funzioni matematiche : ");
//===================================
printf("Il valore calcolato per j è : %f\n", j);
system("PAUSE");
return 0;
}
Ora, utilizzando la tabella sottostante sostituisci la riga 7 :
(la riga di commento: //
=========================================) con le istruzioni
opportune , che si trovano sulla colonna di sinistra della tabella (una istruzione per volta) e
completa la colonna di destra della tabella con i risultati derivanti dall’ esecuzione del
programma.
Istruzione
Risultato osservato (valore di j)
J=floor(1.1);
J=floor(1.2);
J=floor(1.3);
J=floor(1.4);
J=floor(1.5);
J=floor(1.6);
J=floor(1.7);
J=floor(1.8);
J=floor(1.9);
J=floor(2.0);
1
Book in Progress
Pagina 168
4.2. Lavoriamo con la funzione round()
Utilizzando ancora il precedente programma, sostituisci alla funzione floor () la funzione
round() , con i valori indicati in tabella nella colonna di sinistra, e riporta sulla colonna di
destra i risultati del tuo programma.
Istruzione
Risultato osservato (valore di j)
J=round(1.1);
J=round(1.2);
J=round(1.3);
J=round(1.4);
J=round(1.5);
J=round(1.6);
J=round(1.7);
J=round(1.8);
J=round(1.9);
J=round(2.0);
1
4.3. Lavoriamo con la funzione ceiling()
Utilizzando ancora il precedente programma, sostituisci alla funzione round () la funzione
ceiling() , con i valori indicati in tabella nella colonna di sinistra, e riporta sulla colonna di
destra i risultati del tuo programma.
Istruzione
Risultato osservato (valore di j)
J=ceiling(1.1);
J=ceiling(1.2);
J=ceiling(1.3);
J=ceiling(1.4);
J=ceiling(1.5);
J=ceiling(1.6);
J=ceiling(1.7);
J=ceiling(1.8);
J=ceiling(1.9);
J=ceiling(2.0);
1
Book in Progress
Pagina 169
4.4. Lavoriamo con altre funzioni matematiche.
Scrivere un programma per trovare il valore della variabile risultato, utilizzando le
istruzioni presenti sulla colonna di sinistra della tabella che segue.
Quindi riportare sulla colonna di destra l’output osservato.
Istruzione
Espressione matematica
Risultato
j=abs(-1);
j=pow(2,5);
j=pow(5,2);
j=ow(5,0.5);
j=sqrt(2);
j=log(0);
j=log(10);
j=log10(100);
j=log(2);
|-1|
1
2,236068
4.5. Creazione di espressioni matematiche in C
Obiettivo : convertire le espressioni matematiche a sinistra in tabella in una corretta
istruzione C , quindi riporta un esempio numerico con relativo risultato.
NOTA: in caso di difficoltà si può iniziare con il programma riportato al punto successivo
(4.6)
Espressione
matematica
xy + z
cos(2π ) + log e ( x)
Istruzione C
Esempio
numerico
Risultato
Pow(x,y) + z
Cos(2*PI)+Log(x)
x+ y
x2 + y2 + z2
sin 2 ( x) + cos 2 ( x)
5
a+b
Book in Progress
Pagina 170
4.5.1. Esempio
Sviluppo di funzioni matematiche
“Calcoliamo xy+z”
Book in Progress
Pagina 171
4.5.2. Esercizi di Laboratorio
1. Equazione di secondo grado
Data l’equazione :
Ax2+Bx+C
In cui supponiamo per semplicità di immettere valori non nulli sia per A che per B e C;
scrivere un programma in linguaggio C in grado di trovare le radici.
Esempio di ouput:
Inserisci a: 2
Inserisci b: 3
Inserisci c: -20
x = 2.5, -4
2. Proprietà del cerchio
Utilizzando le formule note, calcolare area e circonferenza di un cerchio di raggio r, assegnato da tas
Riportare I risultati con 2 cifre decimali.
Suggerimenti ;
#define pigreco 3.14159 nella sezione iniziale del codice
a) Definire in questo modo pigreco:
b) Per limitare a 2 il numero dei decimali in output:
printf("\n circonferenza: %.2f",c);
Esempio di output:
ll raggio del cerchio è 4.00
La circonferenza risulta : 25.13
L’area del cerchio è:
50.27
Book in Progress
Pagina 172
5. Laboratorio n. 2 - LE ISTRUZIONI CONDIZIONALI
5.1. Espressioni Booleane
Una espressione booleana può assumere solo due valori: true e false. In C , si possono
utilizzare i seguenti simboli all’interno di espressioni boleane:
Relazione
Notazione C
Esempio
Significato
Uguale
diverso
Maggiore
Maggiore o uguale
Minore
Minore o uguale
==
!=
>
>=
<
<=
X
X
X
X
X
X
X
X
X
X
X
X
==Y
!= Y
>Y
>=Y
<Y
>=Y
è
è
è
è
è
è
uguale a Y
diverso da Y
maggiore di Y
maggiore o uguale a Y
minore di Y
minore o uguale a Y
Le espressioni booleane possono essere combinate tra loro, utilizzando gli operatori logici:
&& operatore AND. Per esempio l’espressione (x>10) &&(x<10) è vera se x è
compresa tra 1 e 10.
|| operatore OR. Esempio: (x<1) ||(x>10) è vera quando x è minore di 1 o
maggiore di 10.
! operatore NOT. Esempio , !(x= =1) è vero quando x è diverso da 1.
Esercizio: Ipotizziamo che x, y e z siano 3 variabili di tipo int e ch di tipo char.
Indicare la condizione che rende vera ciascuna della seguenti espressioni booleane:
(completare la tabella…)
Espressione
La condizione è vera quando …
x > 2
x%2 = = 0
(x%5 = = 0)
(x%y = = 0)
((x%y = = 0) && (z%y = = 0))
ch == ’a’
((ch >= ’a’) && (ch <= ’z’))
((ch >= ’A’) && (ch <= ’Z’))
((ch >= ’0’) && (ch <= ’9’))
(ch != ’*’)
!(ch == ’*’)
vera quando x è maggiore di 2
vera quando x è pari
Book in Progress
vera se ch è un carattere tra ‘0’ e ’9’
Pagina 173
5.2. Istruzioni IF ed IF () … ELSE ….
La parola riservata if introduce l’uso di una istruzione condizionale che permette di
controllare se una certa istruzione debba o meno essere eseguita sulla base del risultato di
una data condizione.
Sono possibili due forme di utilizzo, come vediamo nei seguenti esempi
•
Forma 1:
istruzione if semplice: istruzione sarà eseguita solo se condizione è true
i f ( c o n d i z i o n e)
i s t r u z i o n e; / / e s e g u i t a s e
In C , una coppia di parentesi graffe
istruzioni da eseguire.
if
is
is
is
}
•
Forma
(co
truz
truz
truz
ndi
ion
ion
ion
z i o n e)
e1 ;
e2 ;
e3 ;
2: istruzione
condizione ==
({}) si usa per delimitare
un gruppo (blocco) di
{
/ / eseguita se condizione=true
/ / eseguita se condizione=true
/ / eseguita se condizione=true
if...else.
In questa caso istruzione1 sarà eseguita se
mentre se è falsa sarà eseguita istruzione2 .
if
is
el
is
true
( c o n d i z i o n e)
t r u z i o n e1 ; / / e s e g u i t a
se
t r u z i o n e2 ; / / e s e g u i t a
se
se
condizione è true;
condizione ==
condizione ==
true
false
In maniera analoga, utilizzando gruppi di istruzioni tra parentesi ({}).
if (condizion
istruzione1;
istruzione2;
}
else {
istruzione1;
istruzione2;
}
Book in Progress
e) {
//eseguita secondizione == true
//eseguita se ondizione == true
//eseguita se condizione ==
//eseguita se condizione ==
false
false
Pagina 174
5.2.1. Esempio 1
Consideriamo la seguente pseudo-codifica:
Se la valutazione (score) dello studente è maggiore o uguale a 60
stampa ("Promosso") altrimenti stampa ("Bocciato");
La possiamo tradurre con il codice seguente in C :
if (score >=60) printf("Promosso");
if (score < 60) printf("Bocciato");
o anche con:
if (score >=60) printf("Promosso")
else
printf("Bocciato");
5.2.2. Esempio 2
Progettiamo un programma C per stabilire se una variabile N è pari o dispari
• Versione 1: utilizzando una istruzione if semplice:
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{int N ;
printf(" inserisci un valore per N \n");
scanf("%i",&N);
if (N % 2 == 0)
printf("%d e' un numero pari \n",N);
if (N % 2 != 0)
printf("%d e' un numero dispari \n",N);
system("PAUSE");
return EXIT_SUCCESS;
}
• Versione 2: utilizzando la versione if… else:
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{int N ;
printf(" inserisci un valore per N \n");
scanf("%i",&N);
if (N % 2 == 0)
printf("%d e' un numero pari \n",N);
else
printf("%d e' un numero dispari \n",N);
Book in Progress
Pagina 175
system("PAUSE");
return EXIT_SUCCESS;
}
5.2.3. Esercizi in laboratorio
1. Dopo aver inserito il seguente codice, risolvere i quesiti proposti:
• Inserire 3 differenti valori di N in modo da ottenere sempre il messaggio: “numero
negativo”.
• Inserire 3 differenti valori di N in modo da ottenere sempre il messaggio:
positivo”.
“numero
• Cosa succede se inserisci 0 da tastiera ?
• Modificare il programma precedente in modo da ottenere l’indicazione “valore nullo” se si
inserisce 0.
Book in Progress
Pagina 176
2. Piano cartesiano e quadranti
Il seguente segmento di programma in linguaggio C, incompleto, ha lo scopo di
individuare il quadrante corrispondente alle coordinate x,y di un punto P, inserite
dall’utente.
Se le coordinate appartengono ad un punto dell’ asse X o Y , l’output sarà:
“Non so indicare nessun quadrante…”.
Completare il programma precedente, sostituendo lo spazio indicato dalle lettere (A.. E) ,
come nel primo esempio riportato nella tabella sottostante.
Spazio da riempire
(..
(..
(..
(..
A
B
C
D
...)
...)
...)
...)
Book in Progress
Codice mancante…
(X>0) && (Y>0)
Pagina 177
(.. E ...)
3. Una compagnia di telefoni cellulari ha un piano telefonico per i propri clienti: il tempo
di conversazione è tariffato come segue:
• I primi 2 minuti costano 0,50€
(per minuto),
• I rimanenti minuti costano 0,20€ (per minuto).
Il seguente programma richiede all’utente il numero di minuti di durata della conversazione
e calcola la corrispondente tariffa da pagare.
Modificare il programma in modo da:
a) poter variare in qualsiasi momento i costi dei minuti
Book in Progress
Pagina 178
5.3. Istruzioni IF nidificate (nested )
Una istruzione if ( o if.. else) “NIDIFICATA” è una istruzione if che fa parte di un’altra
istruzione if (che si trova all’interno della precedente).
Un programma che utilizza questa forma, presenterà una struttura simile alla seguente:
if(condizione1)
istruzione1;
else if (condizione2)
istruzione2;
else
if (condizione3)
istruzione3;
….
else
istruzione N;
in cui :
istruzione1 si esegue se è vera condizione1;
istruzione2 si esegue se è falsa condizione1 e vera condizione2;
istruzione3 si esegue se sono false condizione1 e condizione 2 e vera condizione 3 e così
via..
Quindi, istruzioneN verrà eseguita se le precedenti (N-1) condizioni sono tutte
false.
5.3.1. Esempio
Consideriamo un programma che mostrerà la valutazione di uno studente sulla base
della seguente tabella di valutazione:
Condizione
Risultato
Punteggio < 50
50 <= punteggio <60
60 <= punteggio <70
70 <= punteggio <80
Punteggio >=80
“Insufficiente”
“Mediocre”
“Sufficiente”
“Buono”
“Ottimo”
Una struttura con IF NIDIFICATI in C potrebbe essere la seguente:
if (punteggio <50) printf(“Insufficiente”);
else if (punteggio <60) printf(“Mediocre”);
else if (punteggio <70) printf(“Sufficiente”);
else if (punteggio <80) printf(“Buono”);
else
printf(“Ottimo”);
Book in Progress
Pagina 179
5.3.2. Esercizi in laboratorio
1. Body Mass Index (BMI)
Il calcolo dell’indice di massa corporea (Body Mass Index) fornisce una idea della forma
fisica di una persona.
Il BMI si ottiene con la formula BMI=P/(H*H) (P=peso in kg, H=altezza in metri) e si valuta
utilizzando la seguente tabella:
BMI
BMI < 18.5
18.5 ≤ BM I < 25
25 ≤ BM I < 30
BM I ≥ 30
Interpretazione
Sottopeso
Normale
Sovrappeso
Obeso
Completare il seguente codice per il calcolo del BMI, riempiendo gli spazi indicati con le
lettere (a,b,c).
Book in Progress
Pagina 180
Esempi di output
Inserisci il tuo peso: 65
Inserisci la tua altezza: 1.75
Il tuo BMI risulta 21.22. Sei normale
Inserisci il tuo peso: 100
Inserisci la tua altezza: 1.60
Il tuo BMI risulta 39.06. Sei obeso
Spazio da riempire
Espressione booleana
___(a)___
___(b)___
___(c)___
2. Identificare un intero
Scrivere un programma C per verificare se un numero, inserito in input è intero.
(suggerimento: Usare il metodo Math.Round())
Esempi di output:
Per favore inserire N:
1.5 non e’ un intero.
1.5
Per favore inserire N:
99 e’ un intero.
99
Book in Progress
Pagina 181
5.4. Istruzione SWITCH (selezione multipla)
L’istruzione switch è una istruzione di controllo che permette di gestire le selezioni
multiple.
Switch esamina un ventaglio di possibilità. e devia di conseguenza il flusso de ll‘esecuzione.
Ogni condizione esaminata esprime la coincidenza del valore di un‘espressione con una
costante intera.
Assume la seguente struttura, in cui viene eseguito una sola istruzione quella
corrispondente al ‘case’ che risulta verificato.
switch (espressione)
{
case espressione-costante:
istruzioni;
break;
case espressione-costante:
istruzioni;
break;
case espressione-costante:
istruzioni;
break;
default:
istruzioni
}
Nella struttura sintattica riportata (espressione) detto anche selettore, può essere o una
variabile di tipo intero o una espressione-stringa o una variabile booleana.
•
Ogni caso (clausola case) è etichettato da una o più costanti (o espressioni costanti)
intere.
•
Se uno di tali casi coincide con il valore dell’espressione, l‘esecuzione prosegue dal
caso in questione.
•
Tutte le espressioni delle clausole case devono essere diverse.
•
La clausola default è eseguita se nessuna delle altre è verificata ed è facoltativa; in
sua assenza, se gli altri casi non sono soddisfatti non accade nulla.
•
L‘istruzione break provoca l‘uscita immediata dal costrutto switch.
Book in Progress
Pagina 182
5.4.1. Esempio
Il seguente programma mostra il “punteggio ” di uno studente sulla base del valore
di una valutazione (in LETTERE) inserita dall’utente, in accordo con la seguente tabella:
Valutazione
A
B
C
D
F
Punteggio dello studente
4.0
3.0
2.0
1.0
0.0
Il programma può risultare piuttosto lungo, per cui si ha la possibilità di raggruppare i valori
costante del selettore se si devono effettuare le stesse scelte.
Nella pagina seguente la versione modificata del programma:
Book in Progress
Pagina 183
Esempio di output:
Book in Progress
Pagina 184
5.4.2. Esercizi in laboratorio
1. Scrivere un programma che ricevuto in input un numero intero tra 1 e 12 ,
corrispondente ad un mese dell’anno, restituisca in OUTPUT i giorni di quel mese.
(supporre Febbraio da 28 giorni).
2. Dopo aver inserito ed eseguito il seguente programma in C:
Rispondere alle seguenti domande:
a) Cosa si potrà aggiungere per mantenere il costo inferiore a 45 baht ?
[1 € = 42,44 baht , al 24/2/2011]
b) Se l’utente inserisce -1 quale sarà il risultato del programma ?
3. Modificare il programma in questo modo: in caso di input non valido il costo del caffè
deve essere posto a 0.00 e dovrà apparire l’indicazione “Scelta non valida !”
4. Scrivere un programma C che traduca una lettera in numero sulla base di una mappa
assegnata: la successiva si riferisce alla codifica di un tastierino di cellulare :
Lettere
ABC
DEF
GHI
JKL
MNO
Book in Progress
Numeri
2
3
4
5
6
Pagina 185
PQRS
TUV
WXYZ
7
8
9
Esempi di output:
Per favore inserire una lettera : A
Il numero corrispondente alla lettera A è 2
Per favore inserire una lettera : q
Il numero corrispondente alla lettera q è 7
Per favore inserire una lettera : *
Nessun numero corrisponde alla lettera *
5. Calcolare il costo di una spedizione
Ti trovi a Londra e devi spedire un pacco all’ estero.
A Londra si usa ancora la Sterlina (1€=0,845 GBP); ti viene richiesto di scrivere un
programma in C per calcolare il costo delle spedizioni che dipendono sia dal peso del
plico da consegnare che dal tipo di spedizione sulla base della seguente tabella:
Tipo di consegna
Peso
Costo (GBP) /grammo
regolare
regolare
espresso
<=2000
>2000
Come regolare + 1 GPB fisso
0,005
0,007
L’output del programma dovrà riportare il costo totale di spedizione sia in Euro
che in Sterline (GBP).
Book in Progress
Pagina 186
6. Laboratorio n. 3 - I CICLI (STRUTTURA ITERATIVA ) - PARTE
PRIMA
6.1. Ciclo WHILE
Il ciclo while si utilizza in tutti i casi in cui è necessaria la ripetizione di una istruzione (o
di un un blocco di istruzioni) che verrà eseguita finché una data condizione si mantiene
vera.
La forma generale del comando è la seguente:
while (condizione)
istruzione;
In maniera analoga a quanto visto con la struttura if , la sequenza di istruzioni da
ripetere , se (condizione) è vera, può essere costituita da un gruppo racchiuso da
parentesi graffe:
while (condizione)
{
istruzione1;
istruzione2;
istruzione3;
….
istruzione-n;
}
6.1.1. Esempio 1
Ciclo di conteggio
Scriviamo un programma in C per stampare a video i numeri compresi tra 1 ed N, dove
N è un numero intero stabilito dall’utente ed inserito in input. Un possibile programma è
riportato di seguito :
Book in Progress
Pagina 187
Esempio di output:
Totale numeri da elaborare : 4
1
2
3
4
Spiegazione:
All’avvio del programma , le istruzioni di riga 1 e 2 permettono all’ utente di inserire un
valore numerico intero che verrà memorizzato nella variabile N.
Successivamente, riga 3, si imposta il valore iniziale (1) per la variabile k che si
utilizzerà come indice del ciclo while.
Il ciclo inizia alla istruzione 4: finchè la condizione indicata (k<=N) si mantiene vera il
calcolatore eseguirà il gruppo di istruzioni racchiuse dalle parentesi graffe: riga 5 e 6.
Esercizio:
- Modificare il programma precedente in modo che vengano stampati i numeri in
senso decrescente : da N a 1.
- Indicare quali istruzioni inserire negli spazi contrassegnati da (…A…) , (…B…) e
(…C…)
Book in Progress
Pagina 188
6.1.2. Esempio 2
Il programma dell’ Esempio 1 può essere modificato in modo da permettere anche la
stampa della somma dei numeri interi compresi tra 1 ed N.
Esempio di output
Book in Progress
Pagina 189
6.1.3. Esempio 3
Ciclo con ‘Sentinella’
[In gergo informatico il temine “sentinella” indica l’uso di un particolare valore dell’indice
di ciclo che non verrà utilizzato ai fini del calcolo, ma permetterà di uscire dal ciclo.]
Scrivere un programma C che richiede di continuare ad inserire un qualsiasi numero
intero, nullo o positivo. L’ elaborazione si deve interrompere appena l’utente inserisce un
numero negativo (valore ‘Sentinella’).
Esempio di output
Book in Progress
Pagina 190
6.1.4. Esercizi di Laboratorio
1. Modificare il precedente programma in modo da stampare la somma dei valori inseriti
dall’ utente, escludendo il valore negativo finale (sentinella).
Come in precedenza , nelle zone indicate, inserire le istruzioni mancanti.
Esempio di output
Per favore inserisci un numero:
Per favore inserisci un numero:
Per favore inserisci un numero:
Per favore inserisci un numero:
Per favore inserisci un numero:
Somma calcolata: 604
Ciao ciao !!!
Book in Progress
3
2
599
0
-5
Pagina 191
2. Modificare l’ultimo programma realizzato in modo da produrre a video la somma dei
soli numeri pari inseriti dall’ utente.
Un possibile output potrebbe essere :
Per favore inserisci un numero: 4
Per favore inserisci un numero: 2
Per favore inserisci un numero: 599
Per favore inserisci un numero: 1024
Per favore inserisci un numero: -1
Somma dei numeri pari calcolata: 1030
Ciao ciao !!!
Book in Progress
Pagina 192
6.2. Ciclo DO ... WHILE
Il ciclo do.. while, è simile al precedente: ripete una istruzione ( o un gruppo di
istruzioni) finchè una determinata condizione risulta vera. Non appena la condizione
diventa falsa, si esce dal ciclo.
Attenzione però: il corpo del ciclo (gruppo di istruzioni da ripetere) questa volta, a
differenza del precedente caso, verrà eseguito almeno una volta in quanto la
condizione si trova alla fine del ciclo. Si parla di ciclo post-condizionato, in
contrapposizione al ciclo while che è detto ciclo pre-condizionato.
Vediamo le strutture sintattiche:
Forma 1:
do
{ istruzione;}
while (condizione);
Forma 2:
do
{ istruzione1;
istruzione2;
istruzione3;
….
istruzione-n;
} while (condizione);
6.2.1. Esempio 1
La seguente versione di programma è analoga a quella dell’ esempio 6.1.3
Book in Progress
Pagina 193
si nota ancora l’utilizzo della sentinella,questa volta almeno un numero sarà
sempre inserito !
Esercizio:
Risolvere nuovamente l’esercizio 6.1.4, sostituendo alla struttura while() la struttura
do…while().
6.2.2. Esercizi di Laboratorio
1. Manifestazione sportiva (prima versione)
Ad una manifestazione sportiva partecipa un gruppo di studenti.
La prova di ciascuno viene valutata con un numero reale da 0 a 100.
Redigere un programma in C che permetta di inserire i dati degli studenti (terminare l’input
con valore sentinella = -1) , terminata la fase di input il programma dovrà mostrare il
totale degli studenti inseriti e la media dei punteggi. (con 2 cifre dopo la virgola)
Esempio di output:
Inserire un punteggio, o -1 per terminare
Inserire un punteggio, o -1 per terminare
Inserire un punteggio, o -1 per terminare
Inserire un punteggio, o -1 per terminare
Inserire un punteggio, o -1 per terminare
Inserire un punteggio, o -1 per terminare
Inserire un punteggio, o -1 per terminare
Numero degli studenti: 6
Punteggio medio della prova: 77,23
:
:
:
:
:
:
:
76
56,7
87,4
53,5
90,8
99
-1
2. Manifestazione sportiva (seconda versione)
Modificare il precedente programma inserendo in fondo la stampa del punteggio migliore e
di quello peggiore.
Esempio di output:
Inserire un punteggio, o -1 per terminare
Inserire un punteggio, o -1 per terminare
Inserire un punteggio, o -1 per terminare
Inserire un punteggio, o -1 per terminare
Inserire un punteggio, o -1 per terminare
Inserire un punteggio, o -1 per terminare
Inserire un punteggio, o -1 per terminare
Numero degli studenti: 6
Punteggio medio della prova: 77,23
Punteggio peggiore: 53,5
Punteggio migliore: 99
Book in Progress
:
:
:
:
:
:
:
76
56,7
87,4
53,5
90,8
99
-1
Pagina 194
7. Laboratorio n. 4 - I CICLI (STRUTTURA ITERATIVA ) - PARTE
SECONDA
7.1. Ciclo FOR
E’ il caso di ricordare che nell’ utilizzo di un ciclo while() o do…while() il codice C può
essere diviso in 4 parti:
1. Inizializzazione del contatore: di solito si esegue immediatamente prima dell’ inizio
del ciclo
2. Corpo del ciclo: parte principale del ciclo, composta da una o più istruzioni da ripeter
più volte
3. Condizione: utilizzata per determinare se il corpo del ciclo deve essere ripetuto
4. Aggiornamento del contatore: di solito una singola istruzione che aumenta o
diminuisce il valore del contatore (generalmente di una unità).
Considera il seguente programma esempio:
Poiché i cicli di conteggio sono largamente utilizzati in molti programmi , il linguaggio C (al
pari di altri) mette a disposizione una particolare struttura sintattica per gestire questo tipo
di cicli: il ciclo for.
La struttura è la seguente:
For (inizializzazione_contatore;condizione;aggiorna_contatore)
Corpo del ciclo;
In maniera analoga a quanto visto con la struttura while , la sequenza di istruzioni da
ripetere , se condizione è vera, può essere costituita da un gruppo racchiuso da parentesi
graffe:
For (inizializzazione_contatore;condizione;aggiorna_contatore)
{istruzione1;
istruzione2;
…
Istruzione-n;
}
Book in Progress
Pagina 195
Si osservi come la condizione deve essere valutata ogni volta e risultare vera per poter
entrare nel corpo del ciclo, in tal senso il ciclo for risulta molto simile come logica di
esecuzione al ciclo while.
7.1.1. Esempio 1
Ciclo di conteggio da 1 a 20
Esercizi:
1. Il seguente programma intende stampare la sequenza numerica 0,-1,-2,-3,…,-56;
ma è incompleto.
Completalo indicando le istruzioni da inserire al posto di (…A…), (…B…) e (…C…)
Posizione
Istruzione
(... A ...)
(... B ...)
(... C ...)
Book in Progress
Pagina 196
2. Come potresti modificare i punti (…A…), (…B…) e (…C…) del precedente programma
in modo da stampare la sequenza: 7,14,21,28,…70 ?
7.1.2. Esempio 2
Il prossimo programma richiede in input un numero intero N e stampa tutti i numeri
interi positivi che sono divisori di N.
Esercizio:
Modificare l’ultimo programma realizzato in modo da CONTARE e NON STAMPARE tutti i
divisori di N.
Esempio di output:
Book in Progress
Pagina 197
7.1.3. Esercizi di Laboratorio
3. Ricerca numeri primi
Come noto un numero primo ammette unicamente 2 divisori, se stesso ed 1.
Ad esempio 7 è un numero primo, essendo divisibile solo per 1 e per 7; 10 non è un
numero primo infatti i suoi divisori sono 1,2,5 e 10.
L’ esercizio consiste nel determinare se un numero N immesso da tastiera è primo
oppure no.
Esempio di output:
Inserisci N : 19
19 è un numero primo
Inserisci N : 10
10 non è un numero primo
4. Triangoli con asterischi
Scrivere un programma C in grado di disegnare dei triangoli utilizzando il carattere ‘*’.
La base del triangolo deve corrispondere al valore di un numero inserito da tastiera.
Esempi di output:
N=2
*
**
N=5
*
**
***
****
*****
Book in Progress
Pagina 198
8.
Appendice
8.1. Help in linea
Fig. 4.1: Help in linea
8.2. Bloodshed.net
È il sito ufficiale di presentazione del compilatore DevC++ in lingua inglese.
http://www.bloodshed.net/dev/devcpp.html
8.3. SourceForge.NET
È un sito di sviluppo in inglese che tratta anche del compilatore DevC++.
Dalla pagina http://sourceforge.net/projects/dev-cpp/ è possibile:
8. scaricare il compilatore;
9. scaricare aggiornamenti (patches & bug fixes);
10. scaricare informazioni sulle precedenti versioni del compilatore (release notes);
11. consultare forum;
12. consultare l’elenco dei bugs;
13. consultare news sullo stato della documentazione, sulle versioni, sulla soluzione di problemi,
ecc..
Book in Progress
Pagina 199
8.4. Esempio di Relazione di Laboratorio
Relazione sul progetto: AREA DI UN TRIANGOLO
1. INTESTAZIONE
Testo dell’esercizio: Eseguire il calcolo dell’area di un triangolo qualsiasi, note le
misure dalla base e dell’altezza
Lavoro svolto da: ___________________________________________________
Data di inizio: ____________ Data di fine: _______________________________
2. ANALISI DEL PROBLEMA
Dati di Ingresso: misure della base e dell’altezza di un triangolo
Dati di Uscita: valore dell’area del triangolo
Obiettivi: l’obiettivo del programma è quello di calcolare l’area di un triangolo,
note le misure dalla sua base e della relativa altezza
Procedimento risolutivo: Acquisiti i valori di base e altezza, la soluzione del
problema si ottiene moltiplicando tra loro i due valori e dividendo il risultato per 2:
AREA = (BASE * ALTEZZA) / 2
Alla fine deve essere visualizzato il risultato.
3. PROGETTO DELL’INTERFACCIA UTENTE
Progetto grafico:
Book in Progress
Pagina 200
Note per l’utilizzatore: l’utente, una volta avviato il programma, deve digitare
quando richiesto i valori della base e dell’altezza del triangolo di cui vuole
conoscere l’area, terminando ciascun valore con il tasto Invio. I valori inseriti non
possono essere modificato dopo che è stato premuto Invio.
Dopo che è stato visualizzato il risultato, per uscire dal programma si può chiudere
la finestra usando il tasto x sulla barra del titolo o premere un tasto qualsiasi sulla
tastiera.
4. PROGETTO DELL’ALGORITMO:
Tabella di dati:
Identificatore
B
H
A
tmp
Tipo
Numero reale
Numero reale
Numero reale
Stringa
Direzione
Input
Input
Output
Interna
Valore
Variabile
Variabile
Variabile
Variabile
Note
Base del triangolo
Altezza del triangolo
Area del triangolo
Variabile temporanea
per utilizzare la
funzione ReadLine()
Algoritmo in pseudolinguaggio:
1) Inizio
2) Scrivi (“Questo programma esegue il calcolo dell’area di un triangolo qualsiasi, note
le misure dalla base e dell’altezza”)
3) Scrivi (“Inserisci la misura della base: ”)
4) Leggi (B)
5) Scrivi (“Inserisci la misura dell’altezza: ”)
6) Leggi (H)
7) A  B * H / 2
8) Scrivi (“Il valore dell’area è: ”, A)
9) Fine
Book in Progress
Pagina 201
Diagramma di flusso (in alternativa allo pseudolinguaggio):
Inizio
Scrivi (“Questo programma esegue il calcolo ….”)
Scrivi (“Inserisci la misura della base: ”)
Leggi (B)
Scrivi (“Inserisci la misura dell’altezza: ”)
Leggi (H)
AB*H/2
Scrivi (“Il valore dell’area è: ”, A)
Fine
Book in Progress
Pagina 202
5. LISTATO DEL PROGRAMMA (in linguaggio C)
int main(int argc, char *argv[])
{
// dichiarazione delle variabili
float B; //base
float H; //altezza
float A; //area
// messaggio di cortesia
printf("Questo programma esegue il calcolo dell'area di un triangolo\n");
printf("qualsiasi, note le misure dalla base e dell'altezza\n\n");
// richiesta dati di ingresso
printf("Inserisci la misura della base: ");
scanf("%f",&B);
printf("Inserisci la misura dell'altezza: ");
scanf("%f",&H);
// calcolo dell'area
A = B * H / 2;
// stampa del dato di uscita
printf("\nIl valore dell'area e`: %6.4f",A);
// messaggio di cortesia
printf("\n\n.... arrivederci!!\n\n");
// stop del programma in attesa che l'utente visualizzi la Console
system("PAUSE");
return 0;
}
6. PIANO DI TEST
Dati di ingresso
Base: 4
Base: 4,3
Altezza: 3
Altezza: 3,6
Uscita prevista
Uscita reale
6
7,74
7. OSSERVAZIONI E CONCLUSIONI FINALI
La realizzazione del programma ha/non ha incontrato particolari difficoltà, perché ……………
……………………………………………………………………………………………………
Crediamo di aver/non aver capito bene il meccanismo di progettazione di un algoritmo a
partire da una situazione reale ed in particolare il procedimento che ha portato alla
soluzione di questo semplice problema. Spiegare:
Varie ed eventuali:
Book in Progress
Pagina 203
Book in Progress
Pagina 204
BOOK IN PROGRESS
APPUNTI SUL FOGLIO ELETTRONICO
A cura dei prof. Madaro Salvatore e Martina Giorgia
Book in Progress
Pagina 205
Competenze
Abilità
Conoscenze
Utilizzare, con autonomia
operativa ed organizzativa,
strumenti di comunicazione
visiva e multimediale, anche
con riferimento alle strategie
espressive e agli strumenti
tecnici della comunicazione
in rete.
Utilizzare i principali
software per la produttività
individuale
Software di utilità e software
applicativi
Raccogliere, organizzare e
rappresentare informazioni
Rappresentare ed elaborare i
risultati delle misure di
grandezze fisiche utilizzando
strumenti informatici
Metodi dirappresentazione
dei dati e di documentazione.
Foglio elettronico
INDICE DEGLI ARGOMENTI
IL FOGLIO ELETTRONICO
207
PER INZIARE
210
LA CELLA
210
I RIFERIMENTI DI CELLA
212
OPERATIVITA’ SUL FOGLIO
213
AREE DI RETTANGOLI
215
QUADRATI, CUBI E RADICI QUADRATE DEI PRIMI 10 NUMERI INTERI
216
POSITIVI
RISOLVERE LE PROPORZIONI
218
SEMPLICI CALCOLI STATISTICI
222
GRAFICO DELLE TEMPERATURE
225
GRAFICO DELLE COMPONENTI DEL PERSONALE DELLA SCUOLA
226
IL CONTO PERSONALE
228
DENSITÀ DI UNA SOSTANZA
230
SOLUZIONI E CONCENTRAZIONI
233
MOTI RETTILINEI
235
EQUAZIONI DI 2° GRADO
238
SISTEMI LINEARI
239
LA RETTA NEL PIANO CARTESIANO
240
SOLUZIONE GRAFICA ED ALGEBRICA DI UNA DISEQUAZIONE DI I
243
GRADO
Book in Progress
Pagina 206
Il Foglio elettronico
chiamato anche Foglio di Calcolo
(inglese “spreadsheet”)
A cura dei proff. Salvatore Madaro e Giorgia Martina
Il foglio elettronico è uno strumento utilizzato per risolvere problemi matematici di vario genere più
o meno complessi.
In generale questo tipo di applicativi permette di tenere sotto controllo una serie di dati numerici
strutturandoli in tabelle e di eseguire calcoli semplici (come somme, prodotti, etc) oppure
elaborazioni più complesse; permette, inoltre di realizzare grafici di ottima resa estetica
e di
semplice lettura e di elaborare informazioni non numeriche per estrarre dati da cui si ha bisogno di
ottenere tabelle riassuntive.
Il foglio di calcolo elettronico è un programma interattivo, che mette a disposizione dell’utente
un’area operativa strutturata in modo reticolare ed identificabile attraverso righe e colonne. Le
righe sono indicate da numeri, le colonne da lettere. L’intersezione di una riga con una colonna
individuano l’elemento fondamentale del foglio elettronico: LA CELLA.
Uno dei vantaggi più significativi di un foglio elettronico è il ricalcalo automatico del risultato di tutte
le formule nel momento in cui viene modificato il contenuto di una cella, se questa cella è inserita,
come riferimento, all’interno della formula stessa.
Pertanto, una volta impostato il foglio elettronico, questo può essere usato come modello sia per
l’elaborazione di nuovi insiemi di dati e sia per analisi di previsione.
Breve storia del Foglio elettronico …
Partendo da VisiCalc (Ms-Dos),
è nato negli anni ’80 Lotus 1-2-3 (S.O. Ms-Dos)
che è stato superato da Microsoft Office Excel (S.O. Windows).
AppleWork INumber (S.O. Macintosh)
Book in Progress
Pagina 208
Al momento con l’intensificarsi delle attività volte a realizzare software libero di vario genere sono
nati OpenOffice:Calc (S.O. Windows)
Gnumeric (S.O. Linux)
Book in Progress
Pagina 209
D’ora in avanti, in accordo con la filosofia del “Book in Progress”, utilizzeremo il foglio
elettronico di Open Office, CALC, che si può scaricare gratuitamente da Internet;
notate come la differenza con gli altri fogli elettronici non sia poi così tanta! Per questo
i nostri problemi saranno risolti in CALC .
Per inziare ….
LA CELLA:
La cella è l’elemento fondamentale di un foglio elettronico, in quanto è proprio in
questo contenitore che si possono inserire tutte le possibili informazioni di tipo
numerico ed alfanumerico che vengono classificati in:
DATI (o numeri): che comprendono le 10 cifre, i segni “+” e “-“ e la virgola decimale
“,”. Normalmente è possibile fare operazioni di ogni genere con celle di tipo “DATO”.
ETICHETTE (o testo): comprende tutti i numeri, lettere e simboli. Celle con questo tipo
di
informazione
vengono
utilizzate
per
definire
un
aspetto
grafico
di
facile
consultazione e comprensione.
FORMULE (espressioni matematiche): contengono valori numerici e/o riferimenti a celle
contenenti dati numerici. Il risultato dell’operazione scritta viene immediatamente
visualizzata nella cella stessa. Le formule devono:
iniziare con il segno “=”
possono essere indicate le priorità di operazioni da eseguire con le parentesi tonde “(“,
“)”.
Le operazioni vengono indicate con “+” (addizione), “-“ (sottrazione), “*”
(moltiplicazione) “/” (divisione).
L’eventuale elevamento a potenza viene indicato con “^” (es 52 5^2)
FUNZIONI : Le funzioni sono procedure memorizzate nel foglio stesso che svolgono
calcoli anche complessi. Tutte le funzioni esistenti sul foglio elettronico sono suddivise
in categorie (tra cui “Matematiche e trigonometriche”, “Statistica”, “Logiche”, etc).
Una funzione viene scritta nel seguente modo:
=NomeFunzione(argomento1;argomento2; …;argomenton) dove gli “argomenti” non
sono altro che i dati in ingresso che saranno elaborati dalla funzione per ottenere un
risultato in uscita.
Book in Progress
Pagina 210
DATO NUMERICO
ETICHETTA
FORMULA
FUNZIONE
I RIFERIMENTI DI CELLA:
Un riferimento nel foglio elettronico rappresenta la posizione di una o più celle dell’area di lavoro e
consente l’individuazione di valori o dati che si desidera utilizzare in una formula o funzione.
Tramite i riferimenti è possibile utilizzare in una formula, dati contenuti in diversi punti di un foglio
di lavoro oppure utilizzare il valore di una cella in più formule. E’ anche possibile fare riferimento a
celle di altri fogli della stessa cartella di lavoro (solitamente quando si apre un foglio elettronico si
hanno a disposizione più fogli su cui scrivere e l’utente può decidere di aggiungere o toglierne).
Book in Progress
Pagina 211
È possibile copiare il contenuto di una cella in un’altra zona ma quando di copiano formule o
funzioni allora l’indirizzo delle celle inserite nelle formule stesse viene aggiornato, adattandosi alla
nuova posizione; in questo caso si dice che il riferimento delle celle è relativo. Normalmente tutte le
posizioni possibili che può occupare un dato sono “riferimenti relativi”. In alcuni casi
però è
necessario fissare alcuni riferimenti per fare in modo che, se si copia una formula in più punti del
foglio, questa non cambierà automaticamente i suoi collegamenti ad altre celle. Per fare questo è
necessario inserire il simbolo “$” sia prima del riferimento di riga che di colonna se si intende
bloccare entrambi gli elementi ( riferimento assoluto) oppure prima di uno solo di essi:
Riferimento relativo
Riferimento
assoluto
Book in Progress
Pagina 212
È possibile usare ripetutamente il tasto-funzione F4 (premuto assieme al tasto delle maiuscole)
per rendere assoluti i riferimenti di cella; in particolare quando si seleziona il riferimento ad una
cella e si preme Maiusc +F4 si blocca contemporaneamente il riferimento a
riga e colonna,
premendo ancora si blocca solo il riferimento di riga e premendo di nuovo si blocca solo il
riferimento di colonna. Premendo ulteriormente Maiusc+F4 si ottiene un comportamento periodico.
OPERATIVITA’ SUL FOGLIO
Ci si può muovere all’interno del foglio in diversi modi:
utilizzando il mouse
utilizzando le barre di scorrimento
utilizzando i pulsanti PgUp e PgDw ( rispettivamente Pag ↑ e Pag ↓)
utilizzando le frecce direzionali (← ↑ → ↓ ) presenti nella tastiera
scrivendo direttamente l’indirizzo della cella nella casella del nome:
Tutti i comandi che si decide di attivare, agiscono immediatamente nella cella attiva in quel
momento (che appare con un contorno nero marcato) e quindi è importante selezionare la o le
celle interessate utilizzando il mouse con la tecnica del “trascinamento” per celle adiacenti oppure
tenendo premuto il tasto “CTRL” e cliccando su celle non adiacenti.
Per cancellare i dati inseriti precedentemente, invece, si può:
selezionare la cella o la zona e premere il tasto “Canc”
Book in Progress
Pagina 213
selezionare la cella o la zona e andare alla voce di menu “Modifica” Elimina contenuti
Per copiare o spostare il contenuto di una cella o più celle, utilizzare i comandi Copia/Incolla
(per duplicare le informazioni presenti nelle celle), Taglia/Incolla (per spostare le informazioni in
un’altra parte del foglio).
Problemi relativi alle formule e ai valori di errori
Se non è possibile calcolare il risultato di una formula, verrà visualizzato un valore di errore. E’
possibile ad esempio che si verifichi un errore se si utilizza del testo laddove la formula richiede un
valore numerico, se si elimina una cella a cui fa riferimento una formula oppure se si utilizza una
cella non sufficientemente ampia da consentire la visualizzazione del risultato. Per esempio, tra gli
indicatori di messaggi di errori più comuni troviamo:
Errore ##### :
il valore numerico immesso in una cella è troppo esteso per essere
visualizzato all’interno della cella. E’ possibile ridimensionare la colonna
trascinando il bordo che si trova tra le intestazioni di colonna.
#VALORE!
Viene visualizzato quando viene utilizzato un tipo di argomento o di
operando errato, e cioè un’immissione di testo quando la formula richiede
un numero. Controllare che le celle contengano valori validi per
l’operazione che si vuole fare
#DIV/0!
Viene visualizzato quando il divisore di una formula è uguale a 0.
Elenco delle funzioni più usate in un foglio elettronico
=somma()
Restituisce la somma di un gruppo di celle
=media()
Calcola la media aritmetica di un gruppo di celle
=min()
Visualizza il valore più piccolo in un gruppo di celle
=max()
Visualizza il valore più grande in un gruppo di celle
=potenza()
Restituisce il risultato di un numero elevato a potenza
=radq()
Restituisce la radice quadrata di un numero
E così via ….
Tutte le funzioni utilizzabili con i fogli elettronici si possono trovare alla voce “Inserisci” “Lista
delle funzioni” . In questo riquadro di dialogo potrai trovare una funzione e con la creazione guidata
potrai fare tutti i calcoli che desideri. In alternativa vicino alla “Riga di digitazione” è presente il
pulsante per la “Creazione guidata formula”.
Osserviamo che quando all’interno di una cella scriviamo una formula o una funzione, quando
confermiamo con il tasto “Invio” noi leggiamo nella cella solo il risultato delle diverse operazioni
mentre continuiamo a leggere la formula o la funzione nella “Riga di digitazione”
Book in Progress
Pagina 214
Esercizio n.1
Aree di rettangoli
Inizieremo a risolvere una classe di problemi molto semplici: il calcolo dell’area dei rettangoli.
Prepariamo il foglio scrivendo gli elementi essenziali del problema:
Ora inseriamo i valori della base e dell’altezza
Book in Progress
Pagina 215
Infine nella cella B7 scriviamo la formula che leghi tra loro i valori dei dati inseriti e mostri il valore
dell’area; ogni formula inizia con il simbolo di uguale ( “=” ) e poi bisogna dichiarare dove sono i
dati e come bisogna elaborarli: attenzione, si scrive l’indirizzo dove sono contenuti i valori e non i
valori stessi. Scriviamo “ =B4*B5” (senza le virgolette) per indicare che si deve moltiplicare il
contenuto della cella B4 con quella della cella B5; confermiamo con “Invio” e notiamo che nella
cella B7 è presente il valore dell’area mentre nella Riga di digitazione è visualizzata la formula.
Quadrati, cubi e radici quadrate dei
primi 10 numeri interi positivi
Esercizio n.2
Cominciamo ad inserire le etichette
quindi, usando gli appositi strumenti,
modifichiamo il tipo e la dimensione del
carattere
e
applichiamo
l’effetto
“Grassetto” dopo aver selezionato le celle
interessate:
Book in Progress
Pagina 216
Sotto la cella A2 scriviamo i primi
due numeri interi positivi e
successivamente
trasciniamo
verso il basso il pulsantino di
riempimento automatico; apparirà
così la successione dei numeri
sui quali dobbiamo eseguire i
calcoli.
Ora nelle celle B3, C3, D3, bisogna inserire le corrispondenti formule per calcolare il quadrato, il
cubo e la radice quadrata del
contenuto della cella A3 ossia
“=A3^2”, “=A3^3” e “=radq(A3)”.
(Naturalmente le virgolette non
vanno scritte).
Man mano che scriviamo le formule,
nelle celle
appariranno i risultati
mentre, selezionando le singole celle,
nella riga di digitazione potremo
vedere le formule inserite.
Utilizzando come prima il pulsante di
riempimento automatico ricopiamo le
formule nelle celle sottostanti ed il
gioco è fatto.
Magari possiamo dare un aspetto
migliore al foglio se selezioniamo le
celle che contengono i valori e
applichiamo un allineamento al centro.
Book in Progress
Pagina 217
Osserviamo che è stato necessario
allargare la colonna D per far entrare
nella cella D2 tutta l’etichetta; tale
risultato si può ottenere tenendo
premuto il tasto sinistro del mouse
mentre il cursore è nel punto di
separazione tra le intestazioni delle
colonne D ed E ed allargando la colonna
D oppure semplicemente facendo un
doppio clic mentre il cursore è sulla linea
di separazione dell’intestazione delle
colonne.
Esercizio n. 3
Risolvere le proporzioni
Ora intendiamo creare un foglio per la risoluzione delle proporzioni; terremo conto dei diversi casi
che si possono presentare e, per ognuno di essi scriveremo la formula risolutiva. Intanto scriviamo
le etichette ed inseriamo alcuni valori; riduciamo la larghezza delle colonne (vedi esercizio n. 2).
Dobbiamo fare attenzione a scrivere in celle separate i valori numerici distinguendoli dai simboli
alfanumerici . Selezioniamo le celle con i valori e le etichette e applichiamo un allineamento
centrale.
Book in Progress
Pagina 218
Osserviamo che per scrivere il carattere “=” è stato necessario premettere un apice per far
riconoscere al foglio elettronico che non è l’inizio di una formula.
Aumentiamo la dimensione del carattere e applichiamo il carattere grassetto al titolo.
Ora vogliamo evidenziare le celle nelle
quali si potranno inserire valori numerici;
per fare questo è necessario selezionare
delle celle che non sono vicine (non
contigue) tenendo premuto il tasto “Ctrl”
mentre si clicca sulle diverse celle e quindi
si sceglie il colore di sfondo con il tasto:
ed il colore del carattere con il tasto
ottenendo un effetto più gradevole.
sono le celle sulle quali intervenire.
Book in Progress
Questo serve anche per mostrare ad un
eventuale utente del foglio elettronico quali
Inseriamo la formula che risolve la
proporzione: “=C3*E3/A3”.
Analogamente si procede quando
l’incognita x si trova nell’altro estremo
oppure tra i medi.
Pagina 219
Alla fine variando i valori numerici otterremo nuove soluzioni per le proporzioni.
Rinominiamo questo foglio di lavoro “Quarto Proporzionale “ con un clic destro sulla linguetta in
basso per distinguerlo dagli altri fogli nei quali risolviamo il problema del medio proporzionale e del
terzo proporzionale.
Book in Progress
Pagina 220
Ecco il calcolo del medio proporzionale e del terzo proporzionale:
Book in Progress
Pagina 221
Anche questo foglio è stato rinominato; per passare da un foglio all’altro basta cliccare sulle
relative linguette. Se gli altri fogli non sono visibili basta agire ai pulsanti di avanzamento:
.
Esercizio n. 4
Semplici Calcoli Statistici
Nel laboratorio di Fisica ( o di Scienze o di Chimica) sono state effettuate le seguenti rilevazioni
sperimentali della massa di un oggetto e si intende ricavare i principali valori statistici (media
aritmetica, valore minimo, valore massimo, errore assoluto, errore percentuale, scarti, deviazione
standard).
Ricordiamo che la media aritmetica si calcola eseguendo la somma di tutti i valori e dividendo per il
loro numero; il foglio elettronico però offre una funzione apposita.
L’errore assoluto commesso in una serie di misure è dato dalla semidifferenza tra il valore
massimo ed il valore minimo; l’errore relativo è il rapporto tra l’errore assoluto e la media aritmetica
mentre l’errore percentuale si ricava moltiplicando l’errore relativo per 100.
Di seguito le principali formule applicate e i valori corrispondenti:
Book in Progress
Pagina 222
Osserviamo che le celle da B8 e B9 hanno un numero di cifre decimali maggiore per visualizzare
dei valori molto piccoli. Per ottenere questo si agisce nel menu dei comandi : Formato celle si
modifica il numero di decimali da visualizzare. Dalla stessa posizione si può intervenire per altre
personalizzazioni della cella; si consiglia di provare le diverse opportunità. Osserviamo che alcune
funzioni che abbiamo introdotto (Media, Min , Max) agiscono su un intervallo di celle e questo
viene rappresentato scrivendo gli indirizzi delle due celle estreme separati da “ : “. Nel caso
dell’errore percentuale, nella corrispondente formula non è stato eseguito il prodotto per 100 ma è
stato assegnato alla cella il formato percentuale utilizzando lo stesso percorso descritto sopra.
Book in Progress
Pagina 223
Adesso inseriamo gli scarti e la deviazione standard. Per quest’ultima funzione usiamo il tasto di
creazione guidata funzione
; si apre una scheda con un elenco molto consistente di funzioni
di diversa natura con la relativa descrizione.
Book in Progress
Pagina 224
La situazione finale si presenta come segue:
Con i valori numerici:
Osserviamo che nel calcolo degli scarti la formula è stata scritta solo nella cella A13 utilizzando il
riferimento relativo per A3 ed il riferimento assoluto per B5 in modo che una volta ricopiata la
formula, la parte con riferimento relativo si aggiorna automaticamente e quella con riferimento
assoluto rimane sempre uguale.
Esercizio n. 5
Grafico delle temperature
In laboratorio si è portato ad ebollizione un liquido
registrando le seguenti temperature al variare del tempo.
Si vuole realizzare un grafico che rappresenti il
fenomeno.
Occorre selezionare i dati dell’intervallo di celle A4:B12
quindi si preme il pulsante
.
Si attiva così la “procedura guidata grafico” nella quale
occorre selezionare le voci che interessano per ottenere
il grafico che più si presta a rappresentare il fenomeno.
Book in Progress
Pagina 225
Nel nostro caso selezioniamo il tipo di grafico xy con l’effetto seguente:
Esercizio n. 6
Grafico delle componenti del personale della scuola
Si vuole rappresentare con un grafico a torta le componenti di un istituto scolastico.
Innanzitutto inseriamo le etichette e formattiamole con dei caratteri di dimensione 14 punti,
grassetto e di colore blu; adeguiamo la dimensione delle colonne in modo che contengano per
intero le etichette ed applichiamo l’allineamento centrale. Osserviamo che per selezionare una
intera colonna oppure una intera riga è sufficiente cliccare sulla relativa intestazione mentre per
Book in Progress
Pagina 226
selezionare l’intero foglio basta cliccare sul tassellino all’incrocio tre le intestazioni di riga e le
intestazioni di colonna. Introduciamo i valori e assegniamo un colore rosso su fondo giallo.
Ora selezioniamo i dati e clicchiamo sul tasto di creazione guidata grafico
Scegliamo un grafico a torta 3D esploso
STUDENTI
DOCENTI
ASSISTENTI
TECNICI
COLLABOR
ATORI
SCOLASTICI
ASSISTENTI
AMMINISTR
ATIVI
DSGA
DIRIGENTE
SCOLASTIC
O
Personalizziamo il grafico nella voce “Elementi del grafico” ed il
gioco è fatto:
Facciamo un clic destro sul grafico appena creato e
selezioniamo la voce “Inserisci etichette dati” per visualizzare
sul grafico anche i valori numerici inseriti
Poiché ci interessa
vedere le percentuali
delle singole componenti facciamo ancora un clic desto sul
grafico a torta e selezioniamo la voce “Formato etichette
dati” e nella nuova scheda scegliamo “Mostra il valore come
percentuale” e deselezioniamo “Mostra il valore come
numero”.
STUDENTI
1 1 10 15 13
120
DOCENTI
ASSISTENTI
TECNICI
1200
Book in Progress
.
ASSISTENTI
AMMINISTR
ATIVI
DSGA
DIRIGENTE
SCOLASTIC
O
COLLABOR
ATORI
SCOLASTICI
Pagina 227
Ecco l’effetto finale:
Esercizio n. 7
Il conto personale
Intendiamo progettare un semplice foglio di calcolo che ci aiuti a registrare gli introiti e le spese,
che evidenzi con colori diversi le spese e gli incassi e mostri costantemente la disponibilità
finanziaria residua.
Cominciamo con l’inserimento delle etichette e dei primi valori:
Book in Progress
Pagina 228
Osserviamo che il testo presente nella cella B3 ha un ritorno a capo e quello della cella D3 ha un
orientamento obliquo; questi effetti si possono ottenere dalla barra dei menu seguendo il percorso
“Formato” ”Celle” scegliere la cartella “Allineamento” nella nuova finestra che si apre:
Scriviamo nel foglio le formule iniziali e poi le ricopiamo in basso con il pulsantino di riempimento
automatico.
Inseriamo quindi gli incassi
e le uscite. Ora faremo
rappresentare al foglio
elettronico le entrate con
colore blu e le uscite con
colore rosso ricorrendo alla
formattazione condizionata
mediante il percorso
“Formato” “Formattazione
condizionata” e scegliendo
Book in Progress
Pagina 229
le voci adeguate dalla apposita scheda.
Ecco il risultato finale:
Il valore della cella D3 si ottiene con la formula =SOMMA(C8:C104;D7) che addiziona al valore
iniziale presente nel conto (D7) tutte le successive operazioni ( C8:C104). Nella cella B5 è stata
inserita la formula =SE(D3>0; "Conto in attivo";" Conto scoperto")
che utilizza la funzione “ =se” per scrivere “Conto in attivo” quanto il saldo è maggiore di zero ( la
condizione è scritta come D3>0 ) e “Conto scoperto” in caso contrario.
Esercizio n. 8
Densità di una sostanza
Si intende calcolare la densità di una sostanza e verificare che essa è indipendente dalla quantità
di sostanza considerata. A tal proposito faremo delle misurazioni della massa e del volume su
quattro corpi della stessa sostanza e riportiamo nel foglio di calcolo i dati come in figura:
Book in Progress
Pagina 230
Ora nella cella D5 inseriamo la formula per il calcolo della densità =B5/C5 e ricopiamo in basso: i
riferimenti relativi si adatteranno alla nuova posizione. Evidenziamo le celle nelle quali sono
previste le immissioni.
Blocchiamo le celle con le formule in modo che non vi sia qualche modifica accidentale.
Per far questo, selezioniamo soltanto le celle da rendere modificabili e quindi dal menu seguiamo
il percorso: Formato Celle scheda “Protezione celle” ed eliminiamo il segno di spunta dalla
voce “Protetto” e confermiamo con il tasto “OK”.
Book in Progress
Pagina 231
Passiamo di alla voce “ Strumenti” del menu e scegliamo “Proteggi documento”. Da qui è possibile
indicare anche una password per evitare modifiche da parte di altre persone.
Rappresentiamo il grafico volume- massa con i dati inseriti:
Se tentiamo di scrivere in una cella protetta si
presenterà il messaggio di errore.
Dobbiamo osservare il grafico che si ottiene è
quello di una proporzionalità diretta tra massa e
volume; la pendenza della retta rappresentata nel
grafico indica la densità della sostanza.
Precisiamo che è stata inserita la coppia di valori
Book in Progress
Pagina 232
(0,0) ( massa=0 quando volume=0) per fare in modo che la retta del grafico inizi dall’origine degli
assi inoltre il grafico presenta sull’asse x i volumi e sull’asse y le masse nonostante nel foglio la
colonna delle masse preceda quella dei volumi e quindi automaticamente il foglio elettronico
disporrebbe le masse sull’asse x. Per forzare il foglio di calcolo a fare al contrario bisogna
modificare gli indirizzi della serie dei dati durante la creazione guidata del grafico:
Basta selezionare la serie e assegnare i nuovi indirizzi nella riga “Area nome”.
Un modo più semplice è quello di cambiare l’ordine delle colonne del volume e delle masse.
Esercizio n. 9
Soluzioni e concentrazioni
Il foglio di calcolo offre un aiuto per stabilire la concentrazione delle soluzioni.
Per stabilire la concentrazione di una soluzione occorre sapere quanto soluto è presente in 100
unità di soluzione. Solitamente la concentrazione è espressa come la massa di soluto presente in
3
100 g di soluzione oppure come il volume di soluto presente in 100 cm . Nel foglio non inseriremo
le unità di misura. Se indichiamo con St la quantità di soluto, Sz la quantità di soluzione e con c la
concentrazione, vale seguente proporzione:
St : Sz = C : 100 e quindi
Sz
C = SzSt *100 , St = 100
* C , Sz = StC *100 .
Il seguente foglio è predisposto in modo che dati due elementi dell’insieme {St, Sz,c}, si possa
determinare l’elemento mancante. Inoltre se indichiamo con Sv la quantità di solvente, vale la
relazione Sz = St + Sv e quindi è previsto anche il calcolo del solvente Sv con la formula Sv = Sz –
St.
Book in Progress
Pagina 233
Le celle corrispondenti alla concentrazione hanno il formato percentuale ( Formato Celle Numeri Percentuale ); nel foglio sono sbloccate solo le celle evidenziate per evitare che
accidentalmente si cancellino o si modifichino le celle con le formule ( Si scelgono le celle del foglio
che si intende sbloccare quindi si passa a Formato Celle Protezione celle si toglie la
spunta dalla voce Protetto; poi si passa a Strumenti Proteggi documento ). Se vogliamo che
abbiano senso i valori immessi nel foglio è necessario richiedere che questi siano non negativi e
per fare questo impostiamo una regola di validazione seguendo il percorso Dati Validità e quindi
impostando quali valori sono consentiti e definendo anche un messaggio di errore opportuno.
Ora per rendere più evidente le proporzioni tra soluto e solvente costruiamo dei grafici a torta.
Osserviamo che nel foglio le due voci Soluto e Solvente non sono vicine e quindi prima di avviare
la composizione automatica del grafico bisogna selezionare, tenendo premuto il tasto Ctrl, le celle
Soluto e le celle Solvente con i relativi valori quindi si costruiranno i grafici come di solito. Durante
la costruzione del grafico sono state selezionate le voci: Serie dati in riga; Prima riga come
didascalia; è stato chiesto di spostare la legenda in basso; dopo la costruzione del grafico è stato
fatto un clic destro su di esso e dal menu contestuale è stato scelto Inserisci etichette dati; il
carattere delle etichette è stato modificato dal menu contestuale ottenuto con un clic destro su di
esse; poiché si è voluto dare un effetto di trasparenza all’area del grafico, è stato eseguito un clic
destro sul grafico chiedendo di modificarlo e dopo un ulteriore clic destro verso l’area più esterna si
è selezionato Formato area grafico Trasparenza Aumentare il valore della trasparenza
(85%). Ecco l’effetto finale:
Book in Progress
Pagina 234
Si intende salvare il foglio in formato html per essere pubblicato eventualmente su Internet. Si
sceglierà File Salva con nome si sceglie il percorso di destinazione del file Si attribuisce il
nome del file dalla voce “Salva come” è possibile scegliere il formato che ci interessa tra tanti
disponibili.
Esercizio n. 10
Moti rettilinei
Vogliamo costruire un foglio per lo studio dei moti rettilinei uniformi ed uniformemente accelerati.
Partiamo dalle leggi del moto uniforme : s = s0 + v0*t e del moto uniformemente accelerato: s = s0
2
+v0*t + ½*a*t ; vale inoltre la legge: v = v0 + a*t quando l’accelerazione a è costante. Notiamo che
Book in Progress
Pagina 235
la legge del moto uniformemente accelerato si riduce a quella del moto uniforme quando a=0
quindi nel foglio useremo solo la formula più generale.
Si richiede di inserire i valori iniziali s0, v0, a e alcuni valori del tempo t ( t>=0).
Il foglio calcola i corrispondenti valori di s e li rappresenta in un grafico. È interessante far valutare
per quali valori delle costanti inserite, il grafico s è crescente o decrescente al variare di t, è una
semiretta, è un arco di parabola, passa per l’origine degli assi.
La formula =B3+B4*F4+(B5*F4^2)/2 inserita in G4 non è in grado di genere valori attendibili
quando viene ricopiata nelle celle sottostanti perché in tal caso si modificano anche i riferimenti alle
celle B3, B4 e B5; prima di ricopiarla con il riempimento automatico è necessario bloccare i
riferimenti alle suddette celle premendo contemporaneamente Maiusc+F4 sopra ai singoli
riferimenti.
Ora rappresentiamo il grafico Spazio-Tempo di tipo xy personalizzandolo secondo i nostri gusti (
clic destro sul grafico e modificare i diversi elementi )
Intanto è necessario aggiungere anche la situazione all’istante iniziale t=0: è sufficiente selezionare
l’intervallo di celle da E4 a G13 ( si indica con E4:G13) tenendo premuto il tasto sinistro del mouse
mentre il cursore è all’interno dell’area selezionata è possibile trascinare nella direzione voluta. Ora
però è necessario modificare l’estensione delle serie dei dati alle quali fa riferimento il grafico: clic
destro sul grafico Aree dati Modificare la riga Area dati in modo che contenga solo il
riferimento $Foglio1.$F$3:$G$14.
Book in Progress
Pagina 236
L’effetto finale è:
Ora è possibile studiare il moto al variare di s0, v0 e dell’accelerazione a.
Book in Progress
Pagina 237
Esercizio n. 11
Equazioni di 2° grado
Ora introduciamo un foglio per lo studio delle
equazioni di 2° grado. Dopo l’inserimento delle
etichette, scriviamo l’equazione di secondo grado in
forma normale facendo attenzione a scrivere i
coefficienti in celle separate rispetto ai caratteri
alfanumerici. Si faccia attenzione quando si
inserisce il simbolo di
uguaglianza; per evitare
che il foglio elettronico
lo interpreti come l’inizio
di una formula è
necessario premettere
un apice cioè si scrive:
‘= .
Scriviamo le formule
per calcolare il
discriminante e le
soluzioni.
È necessario distinguere i diversi casi di ∆ >0, ∆=0 e ∆<0 poiché in ognuno di essi occorre che
il foglio dia un diverso messaggio; ci serviamo della funzione =SE.
Sotto la condizione di ∆<0 il foglio deve scrivere “equazione impossibile” altrimenti deve calcolare
le due radici x1 e x2.Vogliamo interpretare adesso l’equazione di secondo grado come
l’intersezione tra una parabola e l’asse delle ascisse con un grafico
Nell’intervallo I5:J8 è stato inserito un piccolo calcolo per determinare quanti valori di x bisogna
considerare per passare dal valore minimo di x al valore massimo con un dato incremento.
Book in Progress
Pagina 238
Di questo si è tenuto conto nello stilare la
tabella dei valori nell’intervallo A11:B22
scrivendo nella cella A12 la formula: ”=J5” e
nella cella A13 la formula: “ =A12 + $J$7” ;
quest’ultima formula è stato ricopiata in basso
per le celle necessarie. Nella cella B12 è stata
scritta
la
formula
=$A$3*A12^2+$C$3*A12+$E$3
che
successivamente è stata ricopiata in basso.
Blocchiamo le celle diverse da quelle di input
(quelle evidenziate sono quelle di input) e
salviamo in modalità compatibile con Excel XP
dal percorso File Salva con nome Salva
come.
Esercizio n. 12
Sistemi Lineari
Il calcolo con le matrici è facilmente accessibile con il foglio elettronico e quindi si può applicare
alla risoluzione dei sistemi lineari. L’esempio che riportiamo è per sistemi 3x3 ma è generalizzabile
a tutti i sistemi lineari nxn. Si useranno le funzioni relative alle matrici accessibili dal tasto di
creazione guidata funzione
:
Le formule inserite sono le seguenti:
Book in Progress
Pagina 239
Il risultato finale è:
Esercizio n. 13
La retta nel piano cartesiano
Ora presentiamo un foglio elettronico utile nello studio della retta nel piano cartesiano; attraverso di
esso è possibile studiare come varia la retta al variare dei parametri m (coefficiente angolare) e q
(intercetta). Useremo due barre di scorrimento per far assumere ad m e a q diversi valori. Per far
questo è necessario visualizzare la barra degli strumenti “Strumenti” dal percorso: Visualizza Barre degli strumenti Strumenti
Book in Progress
Pagina 240
Bisogna agire sul pulsante “Campi di controllo” e selezionare il pulsate “Barra di scorrimento”.
Ora
basta
trascinare il mouse in una regione qualsiasi del foglio di lavoro e
viene disegnata una barra di scorrimento che deve però essere
ancora configurata.
Iniziamo con un clic destro sulla barra di scorrimento per accedere
alla personalizzazione dell’oggetto.
Dal menu contestuale scegliamo la voce “Campo di controllo”,
impostiamo il valore minimo e massimo che si possono
selezionare con la barra poi nella scheda “Dati” inseriamo l’indirizzo
dove compariranno i valori che vengono selezionati con la barra.
Ora torniamo alla Barra degli Strumenti e clicchiamo nuovamente
sul pulsante “Campi di controllo” quindi facciamo un clic sul
. D’ora in avanti se variamo il cursore, nella cella A1 compariranno i diversi valori.
pulsante
Se intendiamo modificare le impostazioni della barra di scorrimento ritorniamo a cliccare sullo
stesso pulsante
.
Questi strumenti li usiamo adesso per costruire il nostro foglio per lo studio della retta.
Book in Progress
Pagina 241
Queste barre di scorrimento sono inserite nel primo foglio della cartella che rinominiamo “Grafico” (
clic destro sulla corrispondente linguetta del nome in basso a sinistra). Nel foglio successivo, che
rinominiamo “Dati xy” , inseriamo i valori delle ascisse e delle ordinate dei punti appartenenti alla
retta. Notiamo che le formule fanno riferimento ai valori di m e di q che si trovano nel primo foglio
“Grafico” e che questi riferimenti sono stati impostati come assoluti (maiusc + F4).
L’effetto finale è il seguente; al variare dei
cursori si noterà come cambia la posizione
della retta nel piano.
Book in Progress
Si è scelto di far variare il valore di
x tra -100 e 100.
Ora selezioniamo i valori di x ed y
e costruiamo il grafico xy.
Una volta costruito il grafico nel
foglio “Dati” è possibile copiarlo e
incollarlo nel foglio “Grafico”.
Un clic destro in corrispondenza
degli assi cartesiani ci permette di
evitare che il foglio adatti
automaticamente la scala e di
fissare una volta per tutte il valore
minimo e massimo che si potrà
rappresentare nel grafico.
Pagina 242
Esercizio n. 14
Soluzione grafica ed algebrica di una disequazione di I GRADO
Risultato finale
Aspetto matematico:
Una disequazione si dice di primo grado quando la variabile indipendente x compare con massima
potenza uguale a 1
es: 2x + 3 > 0
Book in Progress
Pagina 243
Per risolvere una disequazione di I grado valgono le stesse regole delle equazioni di primo grado;
solo che le equazioni di primo grado hanno come soluzione un solo valore (e cioè quel valore che
sostituito alla x rende l’equazione vera), invece le disequazioni hanno come soluzione un insieme
di valori.
Es: 2x + 3 > 0
è vera per x > -3/2
Quindi la soluzione e' l'insieme delle x maggiori di -3/2.
La soluzione può essere espressa nei seguenti modi:
{x ∈R / x > - 3/2}
oppure
]-3/2 , ∞[
Oppure
3/2
Quest'ultimo metodo di solito e' il piu' usato (quando anche il valore terminale e' compreso vi si
mette un tondino)
Aspetto Informatico:
Prima di procedere allo svolgimento di questa esercitazione è necessario conoscere una funzione
molto importante:
la funzione =SE() è una delle più importanti funzioni dei fogli elettronici in genere; infatti permette di
far visualizzare in una cella due differenti valori a seconda che la condizione risulti vera o falsa.
La sintassi della funzione SE è la seguente:
=SE(condizione; se condizione vera; se condizione falsa)
Condizione: E’ una espressione che come risultato deve restituire VERO o FALSO. In questo
primo argomento vengono utilizzati gli operatori di uguaglianza in genere come:
“> ; < ; >= ; <= ; <> (diverso); =”
Es: A1>5 oppure B3=C5 oppure c1=D6*4 oppure F2=”ok”
Da notare: il contenuto delle celle di tipo alfanumerico (Etichette) vengono indicate con “”.
Se condizione vera / se condizione falsa : può contenere: un valore, una formula che viene
inserito nella cella se il risultato della condizione è rispettivamente vero o falso.
Es: 5 oppure B2+C1 oppure C3/2 oppure “valore positivo”
Per provare …
Bisogna controllare la media dei voti di uno studente. Se la media (che è stata calcolata
nella cella A5) è uguale o maggiore di 6 il ragazzo è PROMOSSO altrimenti è BOCCIATO
=SE(A5>=6;”PROMOSSO”;”BOCCIATO”)
Book in Progress
Pagina 244
Naturalmente questo è un esempio di uso abbastanza semplice della funzione SE ma nelle
prossime esercitazioni vedremo come è possibile utilizzare questa funzione per controlli più
complessi strutturando la funzione stessa con molti SE nidificati e con gli operatori booleani.
Procedimento:
Titolo dell’esercitazione
Rif.cella
Cosa scrivo
A1
Disequazione di I GRADO
A2
Soluzione grafica ed algebrica
Cosa visualizzo
Disequazione di I GRADO
Soluzione grafica ed algebrica
Impostazione dell’intervallo per lo studio della espressione data
Rif.cella
Cosa scrivo
Cosa visualizzo
A5
Limite inferiore
Limite inferiore
A6
Limite superiore
Limite superiore
A7
Numero dei valori
Numero dei valori
A8
step
Step
B5
-10
-10
B6
10
10
B7
20
20
B8
=(B6-B5)/B7
1
Selezionare da A5 a B8 , attivare “bordi” Tutti i bordi e colorare le celle a piacere.
Impostazione maschera di acquisizione Disequazione di I grado:
Rif.cella
Cosa scrivo
Cosa visualizzo
E5
a
A
H5
b
B
I5
Segno
Segno
F6
x
X
G6
‘+
+
I6
J6
<
0
<
0
Selezionare da E5 a J6 e colorare le celle con un colore a scelta. Ridimensionare le celle dalla
colonna E alla colonna J per ottenere il risultato della Fig.1.
Impostazione della tabella
Rif.cella
Cosa scrivo
B10
X
C10
Y
D10
segno
E10
positività
B11
=B5
B12
=B11+$b$8
B13-B31
Trascinare
C11
=$E$6*B11+$H$6
C12-C31
Trascinare
D11
=SE(C11<0;”-“;”+”)
E11
=SE(D11=”+”;1;-1)
D12-D31
Trascinare
E12-E31
trascinare
Book in Progress
Cosa visualizzo
x
y
Segno
positività
-10
-9
Da -8 a 10
-19
Da -17 a 21
Il segno “+” oppure “-“
Il valore 1 oppure -1
Pagina 245
Selezionare da B10 a E31 , attivare “bordi” “Tutti i bordi” e colorare le celle con un colore a
piacere.
Soluzione grafica
Selezionare 3 colonne della tabella:
Selezionare da B10 a C31 e premuto il tasto “CTRL” selezionare da E10 a E31.
Attivare la creazione guidata grafico e scegliere tra i vari Tipi di grafico quello a Dispersione.
Soluzione algebrica
Rif.cella
B35
J35
K35
Cosa scrivo
La disequazione è verificata per x
=J6
=-H6/E6
Cosa visualizzo
La disequazione è verificata per x
<
-0.5
Selezionare la cella K35 e modificare il tipo di numero come “frazione”.
Selezionare da B35 a K35 e cambiare il colore a tuo piacere.
Avendo impostato il foglio in questo modo ora sarai in grado di risolvere qualsiasi
disequazione di I Grado. Dovrai, infatti, semplicemente modificare i coefficienti a,b ed il
segno e il risultato sarà immediato.
Book in Progress
Pagina 246
BOOK IN PROGRESS
Appunti “Linguaggio HTML”
Massimo Mancino
I. I. S. S. “Ven. Capizzi”
Bronte (CT)
Book in Progress
Pagina 247
Competenze
Abilità
Utilizzare la rete
Internet per ricercare
dati e fonti
Utilizzare, con
multidisciplinari e per
autonomia e
responsabilità, le reti e attività di
comunicazione
gli strumenti
interpersonale
informatici nelle
attività di studio,
ricerca e
Analizzare e risolvere
approfondimento
semplici problemi con i
disciplinare
principi della
programmazione
strutturata
Conoscenze
Fondamenti di
programmazione
strutturata.
Principali servizi e
strumenti per la
comunicazione su
Internet
INDICE DEGLI ARGOMENTI
Introduzione
249
Struttura e prime informazioni sul
linguaggio 249
Evoluzione del linguaggio
250
Quali strumenti per sviluppare in
HTML?
251
Struttura globale di una pagina 253
Formattazione del testo 256
Inseriamo le immagini
260
I collegamenti ipertestuali
Le tabelle
261
264
Indicazioni generali per la
realizzazione di un ipertesto 269
Appendice
272
Book in Progress
Pagina 248
Introduzione
Il linguaggio HTML (HyperText Mark-up Language) è lo strumento che ha
permesso la nascita del Web (o WWW) e il suo sviluppo a livello mondiale, facendo
diventare questo ambiente della rete Internet un potente mezzo di comunicazione.
Questo linguaggio, dotato di una specifica sintassi ed inizialmente creato a scopi
di ricerca, consente la creazione di ipertesti multimediali ponendo in relazione, tramite
dei collegamenti, informazioni riportate in documenti diversi ed archiviati in computer
sparsi per il mondo.
Struttura e prime informazioni sul linguaggio
Il linguaggio è costituito da elementi sintattici di base detti tag. In generale
possiamo dire che i tag permettono di strutturare un documento (o pagina html)
definendone le varie sezioni e i relativi contenuti. Precisamente ogni tag ha un
identificativo, per esempio html, head, body, table, …, che viene racchiuso tra le
parentesi < e >, ottenendo così <html>, <head>, <body>, <table>, … Inoltre ogni
sezione della pagina viene aperta dal relativo tag, esempio <body>, e viene terminta dal
tag di chiusura, </body>.
Il codice html viene conservato in un file con estensione htm o html, come per
esempio home.html. Ma come si osserva il risultato di un codice scritto in html?
Semplicemente aprendo il relativo file con uno dei tanti browser oggi utilizzati (MS
Explorer, Firefox, Safari, …); infatti, il browser si occuperà di interpretare il codice scritto
nel file e visualizzare il risultato in una finestra (rendering). Se il file si trova in un altro
computer della rete, come accade durante la navigazione Web in Internet, il browser
lavorerà in modalità HTTP, un protocollo di comunicazione per il trasferimento degli
ipertesti HTML che sfrutta l’architettura client-server.
Book in Progress
Pagina 249
Fig. 1 – Architettura client-server per il protocollo HTTP
Evoluzione del linguaggio
L’ideatore di HTML (Tim Berners-Lee, ricercatore del CERN) progettò nel 1989
questo linguaggio per collegare più documenti descrivendone allo stesso tempo sia
l'aspetto estetico, come colori, caratteri tipografici, ecc., sia la sua struttura,
intestazione, corpo, ecc.; successivamente, il consorzio W3C (www.wrc.org), l'ente che
si occupa di mantenere lo standard, ha operato una scelta molto importante e
significativa: separare la struttura di una pagina dalla sua veste grafica. Così al
linguaggio HTML è rimasto il compito di strutturare i contenuti mentre ad un altro
linguaggio, il CSS (Cascade Style Sheet),
si è dato il compito di gestire l'aspetto
grafico. Con questa scelta la stessa pagina HTML apparirà completamente diversa, pur
preservando gli stessi contenuti e la stessa struttura, se abbinata a fogli di stile diversi.
Book in Progress
Pagina 250
Fig. 2 – HTML e CSS
Tuttavia nei nostri appunti utilizzeremo un unico file dove mettere il codice html
specificando all'interno dei tag quale sarà lo stile che si vuole applicare (metodo inline),
così ad esempio con la sintassi
<body style = “background-color: red”;>
stiamo aprendo la sezione riguardante il corpo della pagina, ma stiamo anche
specificando il colore di sfondo, ovvero rosso, una caratteristica che fa parte dello stile.
Quali strumenti per sviluppare in HTML?
Chi vuole oggi cimentarsi nella creazione di siti Web tramite questo linguaggio ha
sostanzialmente due strade:
14. utilizzare un editor di testo e scrivere per ogni pagina il relativo codice HTML;
15. oppure, fare affidamento su dei software di sviluppo che utilizzino un'interfaccia
grafica.
Entrambe le scelte hanno dei vantaggi e degli svantaggi, vediamo quali.
L'utilizzo di un editor di testo comporta un buona conoscenza dei vari tag HTML,
quindi è necessario dedicare inizialmente parecchio tempo allo studio del linguaggio
affidandosi ad un buon manuale. Inoltre, l'occorrenza di errori nel codice provocherà
risultati non desiderati. D'altra parte avremo un controllo completo sul codice, che oggi
Book in Progress
Pagina 251
è più facile realizzare e mantenere grazie agli editor di testo che riconoscono ed
evidenziano gli elementi sintattici sfruttando una sintassi colorata (colouring sintax).
Con la seconda scelta avremo dalla nostra la capacità di realizzare il nostro sito
senza apprendere prima il linguaggio, ma utilizzando direttamente un'interfaccia grafica
di tipo WYSIWYG (What You See Is What You Get), controllando i risultati finali nel
momento stesso in cui si opera la realizzazione. Lo svantaggio sarà quello di perdere il
controllo diretto sul codice, in quanto ci affideremo a quello che il software genererà per
noi, situazione che a volte causerà la creazione di un HTML non sempre ottimizzato e
mantenibile.
Quindi quale delle due strade scegliere? Dipende. Se, ad esempio, un titolare di
una ditta di manifatture vuole realizzare il sito per la propria azienda, probabilmente non
avrà il tempo né la voglia di imparare un linguaggio informatico ed opterà quindi per un
software che gli semplifichi il lavoro e magari pubblichi automaticamente il sito.
Viceversa, uno specialista informatico che vuole progettare e realizzare un sito può sì
appoggiarsi ad un apposito programma di sviluppo, ma deve in ogni caso conoscere le
specifiche del linguaggio per operare direttamente sul codice in quei casi in cui il
software non riesce a generare i risultati attesi. In questi appunti faremo uso di un
semplice editor di testo!
Book in Progress
Pagina 252
Struttura globale di una pagina
Con il primo esempio studieremo la struttura di una pagina Web, passando in rassegna
i principali tag.
1. <html>
2.
3. <head>
4.
<title>Esempio 1 - Struttura della pagina</title>
5. </head>
6.
7. <body>
8.
9.
<div style="text-align: center;">
10.
<h2>Book in Progress</h2>
11.
</div>
12.
13.
<br>
14.
15.
<p>Benvenuto nel modulo HTML, questo è il primo esempio!</p>
16.
17. </body>
18.
19. </html>
Fig. 3 – Codice Esempio 1
Book in Progress
Pagina 253
Ecco il risultato:
Fig. 4 – Risultato Esempio 1
Il primo tag che incontriamo è il tag <html>, questo tag specifica l'inizio della
pagina; il rispettivo tag di chiusura, </html>, terminerà il codice del nostro primo
esempio (riga 19).
Una pagina viene divisa in due sezioni: intestazione e corpo. L'intestazione viene
specificata con il tag <head> (riga 3), mentre il corpo con <body> (riga 7).
Nell'intestazione viene messo il tag <title> (riga 4) per scegliere un titolo che comparirà
nella barra del titolo della finestra del browser. Sempre nell'intestazione è possibile
inserire alcuni programmi detti script, in Javascript, che arricchiscono di funzionalità il
nostro documento.
Nel corpo ci sarà il vero e proprio contenuto della pagina. Con il tag <body> è
possibile specificare, oltre che l'apertura del corpo della pagina, anche alcune
Book in Progress
Pagina 254
caratteristiche visive utilizzando gli stili (attributo style). Ecco alcuni degli attributi
utilizzabili con questo tag.
Attributi del tag <body>
Descrizione
background-color: white
Colore di sfondo
background-image: url(“sfondo.jpg”)
Immagine di sfondo
color: black
Colore del testo
a.link: blue
Colore dei collegamenti
a.visited: purple
Colore dei collegamenti già
visitati
Continuando con l'esamina del codice troviamo alla riga 9 <div style="text-align:
center;">; il tag <div> permette di specificare una o più caratteristiche di una sezione
come ad esempio l’allineamento degli elementi (testo, immagini e tabelle), in questo
caso il testo “Book in Progress” risulta essere centrato.
La scritta “Book in Progress” è specificata come intestazione, infatti è contenuta
nel tag <h2>. I tag per creare un'intestazione sono 6: da <h1> il più importante a <h6> il
meno importante. Anche per questi tag è previsto il tag style che potrebbe essere usato
per esempio per avere un'intestazione colorata in blu:
<h2 style = “color: blue;”>Book in Progress</h2>
Il documento termina con il testo “Benvenuto nel modulo HTML, questo è il primo
esempio!” che è gestito come un paragrafo con il tag <p>. Come vedremo nel prossimo
paragrafo questo tag è molto utile per gestire la formattazione del testo.
Book in Progress
Pagina 255
Formattazione del testo
Diversi sono i tag che HTML dedica alla formattazione del testo, il secondo
esempio ne chiarirà l’utilizzo.
1. <html>
2.
3. <head>
4.
<title>Esempio 2 - Formattazione del testo</title>
5. </head>
6.
7. <body>
8.
9.
<p style="text-align: left;">Testo allineato a sinistra</p>
10.
<p style="text-align: right;">Testo allineato a destra</p>
11.
<p style="text-align: center;">Testo centrato</p>
12.
<p style="text-align: justify;">Testo giustificato</p>
13.
14.
<p>
15.
Puoi scrivere parole in
16.
<span style="font-weight: bold;">grassetto</span>,
17.
<span style="font-style: italic;">corsivo</span>
18.
e
19.
<span style="text-decoration: underline;">sottolineate</span>.
20.
</p>
21.
22.
<span style="color: red;">Puoi</span>
23.
<span style="color: blue;">anche</span>
24.
<span style="color: purple;">utlizzare</span>
25.
<span style="color: gray;">diversi</span>
26.
<span style="color: green;">colori</span>.
27.
28. </body>
29.
30. </html>
Book in Progress
Pagina 256
Fig. 5 – Codice Esempio 2
Fig. 6 – Risultato Esempio 2
Come con i programmi di videoscrittura anche HTML mette in campo diversi
metodi per formattare il testo, ancora una volta utilizzando i tag e le loro proprietà. Nella
Fig. 6 osserviamo il risultato finale dell’esempio 2, dove:
− con le righe da 9 a 12, il testo di un paragrafo è stato allineato in diversi modi (a
sinistra, a destra, al centro e giustificato);
− con le righe da 14 a 20, il tag <span> e gli attributi di stile font-weight, font-style e
text-decoration hanno attribuito a determinate parole di un paragrafo gli stili
grassetto, corsivo e sottolineato;
− ed infine con le righe da 22 a 26, le parole appaiono di diverso colore.
Book in Progress
Pagina 257
Continuando con la formattazione del testo prenderemo in esame un altro utile
elemento: gli elenchi puntati (liste non ordinate) e numerati (liste ordinate).
1. <html>
2.
3. <head>
4.
<title>Esempio 3 - Elenchi puntati e numerati</title>
5. </head>
6.
7. <body>
8.
9.
Elenco puntato:<br>
10.
<ul>
11.
<li>voce 1;</li>
12.
<li>voce 2;</li>
13.
<li>voce 3.</li>
14.
</ul>
15.
<br>
16.
17.
Elenco numerato:<br>
18.
<ol>
19.
<li>voce 1;</li>
20.
<li>voce 2;</li>
21.
<li>voce 3.</li>
22.
</ol>
23.
<br>
24.
25. </body>
26.
27. </html>
Fig. 7 – Codice Esempio 3
Book in Progress
Pagina 258
Fig. 8 – Risultato Esempio 3
Gli elenchi puntati vengono definiti con il tag <ul> (unordered list) e le voci in
elenco con il tag <li> (list item). Nella seconda parte dell’esempio con le righe 18-22
viene definito un elenco numerato con <ol> (ordered list).
Negli esempi fin qui presentati vi sarete accorti dell’occorrenza del tag <br>, ma
a cosa serve? Il fatto che durante la scrittura del codice HTML si vada a capo non
implica che nel documento visualizzato il testo o l’elemento successiva venga riportato
in una nuova linea, per ottenere ciò è necessario specificare una nuova linea (ritorno a
capo) con <br>.
Book in Progress
Pagina 259
Inseriamo le immagini
In questo paragrafo vedremo come far diventare la nostra pagina un ipertesto
multimediale, imparando ad inserire le immagini nei nostri documenti Web. Ecco di
seguito l’esempio 4.
1. <html>
2.
3. <head>
4.
<title>Esempio 4 - Le immagini</title>
5. </head>
6.
7. <body>
8.
9.
<div style="text-align: center;">
10.
<h2>Leonardo da Vinci (1452 - 1519)</h2>
11.
<img src = "leonardo.jpg" width = "50%" title = "Autoritratto
1510-1515 circa" alt = "Autoritratto di Leonardo da Vinci">
12.
</div>
13.
14. </body>
15.
16. </html>
Fig. 9 – Codice Esempio 4
Book in Progress
Pagina 260
Fig. 10 – Risultato Esempio 4
La riga 11 della Fig. 9 mostra il tag <img> (image) per l’inserimento dell’immagine
“leonardo.jpg”, gli attributi impostati sono i seguenti:
− src = “leonardo.jpg”, è il percorso del file che contiene l’immagine;
− width = “50%”, l’immagine viene caricata con una larghezza pari al 50% della
larghezza finestra del browser;
− title = “Autoritratto 1510-1515 circa”, è il titolo dato all’immagine, come si può
vedere nella Fig. 10 esso compare non appena il puntatore del mouse sosta
sull’immagine;
− alt = “Autoritratto di Leonardo da Vinci”, è il testo alternativo che il browser
presenterà in luogo dell’immagine qualora il relativo file fosse danneggiato o non più
presente.
Formati riconosciuti per le immagini sono: JPEG, GIF e PNG.
I collegamenti ipertestuali
Le pagine realizzate fino a questo punto non possono essere definite ipertestuali,
poiché manca l’elemento fondamentale, il collegamento o link. La fruizione di un
documento ipertestuale passa attraverso i collegamenti tra un pagina ed un’altra.
L’esempio 5 illustra uno stesso collegamento (tra la nostra pagina e la home
page di Google) realizzato in tre modi differenti.
Book in Progress
Pagina 261
1. <html>
2.
3. <head>
4.
<title>Esempio 5 - I Collegamenti</title>
5. </head>
6.
7. <body>
8.
9.
10.
<a href = "http://www.google.it/">Clicca per Google</a>
<br>
11.
12.
<a href = "http://www.google.it/" target = "_blank">
13.
Clicca per Google in una nuova finestra
14.
</a>
15.
<br>
16.
17.
<a href = "http://www.google.it/">
18.
<img src = "Google_logo.gif">
19.
</a>
20.
21. </body>
22.
23. </html>
Fig. 11 – Codice Esempio 5
Book in Progress
Pagina 262
Fig. 12 – Risultato Esempio 5
Le sintassi utilizzate per specificare il collegamento richiesto sono queste
9.
<a href = "http://www.google.it/">Clicca per Google</a>
per ottenere un collegamento che “salti” dalla pagina dell’esempio 5 a Google cliccando
sul testo “Clicca per Google”;
12.
<a href = "http://www.google.it/" target = "_blank">
13.
Clicca per Google in una nuova finestra
14.
</a>
per attivare un collegamento come nel caso precedente, con l’unica differenza che
cliccando sul testo la pagina di Google verrà caricata su una nuova finestra e resterà
disponibile la finestra con la pagina dell’esempio 5;
17.
<a href = "http://www.google.it/">
18.
<img src = "Google_logo.gif">
19.
</a>
Book in Progress
Pagina 263
In questo ultimo caso il collegamento viene eseguito cliccando sull’immagine di Google.
Le tabelle, indispensabile strumento
Come una griglia ordinata formata da righe e colonne allo stesso modo le tabelle
HTML hanno il compito di facilitare la disposizione degli oggetti all’interno di caselle
chiamate celle. Una tabella viene specificata indicando le righe con il tag <tr> (table
row) e per ogni riga le appartenenti celle con <td> (table data). Le tabelle sono un
potentissimo mezzo di disposizione (layout) in quanto permetto di definire innumerevoli
caratteristiche: bordi, dimensioni, allineamenti, distanza tra le celle, colori di sfondo,
immagini di sfondo e molto altro ancora. In questo paragrafo grazie agli esempi 6 e 7
introdurremo il lettore al loro utilizzo.
1. <html>
2.
3. <head>
4.
<title>Esempio 6 - Le tabelle</title>
5. </head>
6.
7. <body>
8.
9.
10.
11.
12.
<table border = "1" width = "100">
<tr>
<td>
<h1>1<h1>
13.
</td>
14.
<td>
15.
16.
17.
<h1>2</h1>
</td>
</tr>
18.
19.
20.
21.
<tr>
<td>
<h1>3</h1>
22.
</td>
23.
<td>
Book in Progress
Pagina 264
24.
25.
<h1>4</h1>
</td>
26.
</tr>
27.
</table>
28.
29.
30. </body>
31.
32. </html>
Fig. 13 – Codice Esempio 6
Fig. 14 – Risultato Esempio 6
Con la riga 9 del codice inizia la dichiarazione di una tabella con bordi di
dimensione un pixel e larghezza 100 pixel; le dimensioni intese come numero di righe e
numero di colonne vengono specificate in seguito. Le righe sono due: la prima viene
specificata con le righe 10-17, mentre la seconda con le righe 19-27. All’interno di
ciascuna riga vengono indicate due celle con i tag <td>. Quindi in definitiva siamo
davanti ad una tabella 2x2.
Book in Progress
Pagina 265
1. <html>
2.
3. <head>
4.
<title>Esempio 7 - Le tabelle</title>
5. </head>
6.
7. <body>
8.
9.
10.
<table border = "1" cellpadding = "5">
<tr>
11.
<td align = "center" valign = "middle">
12.
<img src = "monnalisa.jpg" width = "50%”>
13.
</td>
14.
<td>
15.
<span style="font-weight: bold;">Titolo</span>: La Gioconda (Monna
16. Lisa)<br>
17.
<span style="font-weight: bold;">Autore</span>: Leonardo da Vinci<br>
18.
<span style="font-weight: bold;">Data</span>: 1503-1514 circa<br>
19.
<span style="font-weight: bold;">Tecnica</span>: Olio su tavola<br>
20.
<span style="font-weight: bold;">Dimensioni</span>: 77x53 cm<br>
21.
<span style="font-weight: bold;">Ubicazione</span>: Parigi, Museo del Louvre
22.
</td>
23.
</tr>
24.
25.
<tr>
26.
<td align = "center" valign = "middle">
27.
<img src = "vitruviano.jpg" width = "50%">
28.
</td>
29.
<td>
30.
<span style="font-weight: bold;">Titolo</span>: L'uomo vitruviano<br>
31.
<span style="font-weight: bold;">Autore</span>: Leonardo da Vinci<br>
32.
<span style="font-weight: bold;">Data</span>: 1490 circa<br>
33.
<span style="font-weight: bold;">Tecnica</span>: Matita e inchiostro su
34. carta<br>
Book in Progress
Pagina 266
<span style="font-weight: bold;">Dimensioni</span>: 34x24 cm<br>
35.
<span style="font-weight: bold;">Ubicazione</span>: Venezia, Galleria
36. dell'Accademia
37.
</td>
38.
</tr>
39.
</table>
40.
41. </body>
</html>
Fig. 15 – Codice Esempio 7
Book in Progress
Pagina 267
Fig. 16 – Risultato Esempio 7
L’esempio 7 presenta una situazione più interessante nella quale una tabella,
della stessa struttura dell’esempio precedente, è stata utilizzata per collocare due
immagini, due opere di Leonardo da Vinci, e le relative descrizioni.
Book in Progress
Pagina 268
Indicazioni generali per la realizzazione di un ipertesto
Concludiamo questi appunti con dei consigli pratici che possono aiutare nella
realizzazione di un buon ipertesto e facilitarne la manutenzione.
Progettazione
In quei casi in cui il documento ipertestuale è costituito da diverse pagine è
opportuno creare prima uno schema su un foglio di carta per avere le idee chiare prima
di cominciare la successiva fase di realizzazione.
Fig. 17 – Struttura di navigazione di un ipertesto
Editor di testo
Nel caso si decida di ricorrere ad un editor di testo è opportuno scegliere
accuratamente quello più adatto al nostro caso. Caratteristiche da tenere presente
sono:
− numerazione automatica progressiva delle linee di codice scritte;
− sintassi colorate dei tag;
− indentazione dei blocchi e sotto-blocchi per migliorare la struttura logica del codice.
I commenti
Il linguaggio HTML, come altri linguaggi informatici, permette di inserire dei
commenti che verranno ignorati dal browser in fase di rendering della pagina, ma che
Book in Progress
Pagina 269
sono utilissimi per rendere il codice più leggibile. Non sono presenti nei nostri esempi
solo per non distrarre il lettore dall’apprendimento degli altri tag in questione, ma in
realtà andrebbero sempre usati.
<!-- Questo è un commento HTML -->
Utilizzo dei font
Se a prima vista l’utilizzo di font diversi può sembrare un’arma vincente per
“abbellire” il nostro testo, bisogna tenere in considerazione che: 1) i font menu diffusi
andrebbero evitati perché non presenti in alcuni sistemi operativi e quindi non
riproducibili dal browser del client; 2) è importante preservare la leggibilità del testo,
scegliendo font che permettano una lettura scorrevole.
Utilizzo dei colori
Come per i font anche per i colori valgono le stesse indicazioni, essi devono
essere utilizzati in modo appropriato:
− non cambiare continuamente lo sfondo passando da una pagina all’altra;
− scegliere dei colori non troppo accesi che non stanchino la vista;
− scegliere dei colori che facilitino la lettura e stacchino lo sfondo dagli elementi del
documento.
In appendice è presente una tabella con i colori più utilizzati: è possibile specificare il
nome del colore o il alternativa il suo codice.
Struttura delle cartelle
La raccolta dei dati multimediali, come immagini, audio e filmati, deve avvenire
tramite apposite cartelle (img, audio, movie) e la struttura fisica delle cartelle deve
essere ben chiara fin dall’inizio. Particolare attenzione bisogna dare alle specifiche dei
link, in particolare all’attributo href: infatti se i nostri collegamenti funzionano benissimo
quando proviamo l’ipertesto sul nostro computer, ciò potrebbe non accadere quando lo
stesso ipertesto viene pubblicato sul Web oppure spostato in un'altra cartella. Una
causa è molto spesso dovuta all’utilizzo di percorsi assoluti piuttosto che relativi, quindi i
percorsi (path) dei file delle risorse come le immagini e i link dovrebbero essere
Book in Progress
Pagina 270
espressi utilizzando percorsi relativi alla pagina in questione in modo tale da garantire il
buon funzionamento dell’ipertesto a prescindere dalla sua posizione.
Book in Progress
Pagina 271
Appendice
Tabella dei colori
Black = “#000000”
Green = “#008000”
Silver = “#C0C0C0”
Lime = “#00FF00”
Gray = “#808080”
Olive = “#808000”
White = “#FFFFFF”
Yellow = “#FFFF00”
Maroon = “#800000”
Navy = “#000080”
Red = “#FF0000“
Red = “#0000FF“
Purple = “#800080”
Teal = “#008080”
Fuchsia = “#FF00FF”
Aqua = “#00FFFF”
Book in Progress
Pagina 272
Book in Progress
Pagina 273