Documente Academic
Documente Profesional
Documente Cultură
Antonio Giunta / Programmazione in C / Sistemi di elaborazione 1 per Matricole dispari di Statistica nell'a.a. 2018-19
1
PROBLEMI E PROGRAMMAZIONE
1.1
Problemi
1.1.1 Informatica
La società attuale richiede di gestire una quantità sempre maggiore di informazioni.
Es.
Un'azienda gestisce informazioni che riguardano lo stipendio dei propri dipendenti, l'elenco dei propri fornito-
ri, l'elenco dei propri clienti, e così via.
@
Fino agli anni ottanta, le informazioni erano gestite mediante strumenti e procedure tradizionali (registri carta-
cei, compilazioni manuali di documenti, ecc.). Le operazioni aritmetiche erano effettuate automaticamente da
calcolatrici da tavolo, ma i dati da elaborare e i risultati ottenuti erano comunque trasmessi manualmente.
Questo tipo di gestione era (ed è) lunga, faticosa, ripetitiva e ad alta probabilità di errore.
È nata quindi l'esigenza di automatizzare il più possibile la gestione delle informazioni; ciò ha dato origine al-
la scienza denominata Informatica, che tuttora continua a svilupparsi.
Lo sviluppo dell'Informatica sta modificando la società attuale sia negli aspetti che riguardano la realtà del la-
voro sia in quelli legati al costume e alle abitudini.
Infatti, a partire dagli anni ottanta sono nate nuove professioni che richiedono conoscenze ed abilità molto ap-
profondite nel campo informatico. Ma anche le professioni esterne all'ambiente informatico sono state tra-
sformate; infatti, quasi ogni professione attuale richiede conoscenze (più o meno approfondite) nel campo in-
formatico.
Do una definizione informale di informazione.
Un'informazione è un elemento che aumenta la conoscenza di un fatto.
Es.
Quando qualcuno mi comunica l'orario previsto di partenza per un treno che voglio prendere, ricevo un'infor-
mazione.
Inoltre, se qualcuno mi comunica il ritardo attuale di quello stesso treno, ricevo una seconda informazione.
@
1.1.2 Problemi
L'Informatica ci può aiutare a risolvere alcuni tra i problemi che ci circondano.
Nel linguaggio comune, un problema è un quesito che devo risolvere.
Nel senso informatico la definizione di problema è un po' differente. Per individuare una definizione di pro-
blema nel senso informatico, analizziamo il problema seguente.
Ec.1.a
Un gruppo di 4 viaggiatori ha concluso un viaggio in automobile.
Il contachilometri dell'automobile segnava 2000 km al momento della partenza e segna 2300 km all'arrivo.
Il viaggio è durato 5 giorni.
L'automobile consuma mediamente un litro di carburante ogni 15 km.
Un litro di carburante costa 1.2 euro.
Calcolare il contributo di ogni viaggiatore per coprire la spesa del carburante.
@
~ Il suo dominio, cioè l'insieme dei possibili valori del dato affinché il problema abbia senso.
Ec.2
Ci sono nC caramelle e nB bambini. Calcolare il numero di caramelle da dare ad ogni bambino distribuire uni-
formemente.
Individuazione del dominio dei dati
Il problema ha significato soltanto se i dati nC e nB appartengono a questi insiemi:
~ nC IN NUM_N
~ nB IN NUM_N+
@
Se il dominio di un dato è un insieme enumerativo, dobbiamo descrivere il significato di ogni suo valore.
Ec.3
È dato l'esito es di una squadra di calcio in una partita.
Calcolare il numero di punti ottenuti dalla squadra nella partita
Individuazione del dominio dei dati
Dobbiamo specificare il simbolo di ogni possibile esito e il suo significato. Quindi, il dominio dell'esito è l'in-
sieme enumerativo seguente:
{ VITTORIA, PAREGGIO, SCONFITTA }
@
Ec.4
Sono dati i tre lati di un triangolo. Classificare il triangolo basandosi sui lati.
Individuazione dei risultati e del loro codominio
L'unico risultato di questo problema è il tipo tTr del triangolo, che può assumere tre valori: scaleno, isoscele,
equilatero; quindi, il codominio del risultato tTr è un insieme enumerativo, e dobbiamo descriverlo esplicita-
mente:
~ {Scaleno, Isoscele, Equilatero}.
@
Ec.5
Sono dati un cognome cogn e un elenco, composto dal cognome e dal numero di telefono di alcune persone.
Trovare il numero di telefono della persona cogn.
Individuazione dei risultati e del loro codominio
L'unico risultato di questo problema è il numero di telefono numTel della persona di cognome cogn. Per indi-
care anche quando il cognome cogn non esiste nell'elenco dato di persone, aggiungo il valore convenzionale
NOT_FOUND al codominio di numTel:
~ numTel:= Il numero di telefono di cogn, se e` nell'elenco; NOT_FOUND, altrimenti.
@
Notate che:
~ esito è enumerativo, e quindi ho descritto il suo codominio.
~ Quando l'equazione è indeterminata o impossibile, x non dà un'informazione utile; il risultato esito è
quindi più "importante" del risultato x, perché esito indica se x è valido oppure no.
Test
esito ha un codominio composto da tre valori; quindi ci sono almeno tre insiemi di test. Questi insiemi sono
sufficienti, poiché posso ragionevolmente considerare equivalenti tutti gli input che generano lo stesso esito. I
tre insiemi sono:
~ T1: L'equazione è determinata. I:= {3, 6}. O:= {DET, -2}.
~ T2: L'equazione è indeterminata. I:= {0, 0}. O:= {IND, ?}.
~ T3: Altrimenti (cioè, l'equazione è impossibile). I:= {0, 2}. O:= {IMP, ?}.
Notate che, quando esito vale IMP o IND, x ha un valore indeterminato, che ho indicato con ?.
@
25
Antonio Giunta / Programmazione in C / Sistemi di elaborazione 1 per Matricole dispari di Statistica nell'a.a. 2018-19
1.1.4 Algoritmi
La fase 2 della risoluzione di un problema richiede la definizione di un algoritmo.
È dato un problema p.
Un algoritmo che risolve p è un procedimento logico che:
~ è suddiviso in passi interpretabili in modo univoco ed eseguibili uno alla volta;
~ per ogni possibile input del problema p, fornisce l'output corrispondente dopo un numero finito di passi.
In altre parole, un algoritmo che risolve un problema p è un ragionamento, costituito da un elenco di istruzio-
ni, tale che, per ogni insieme di dati di p, produce l'insieme dei risultati corrispondente.
Ec.1.d
Individuare un algoritmo che risolve il problema esposto nell'Ec.1.b.
Soluzione
1. Individuo il numero di chilometri percorsi, mediante una sottrazione tra la segnalazione finale e quella ini-
ziale del contachilometri.
2. Individuo il numero di litri di carburante consumati, mediante una divisione tra il valore ottenuto al passo 1
e il numero di chilometri percorsi mediamente consumando un litro di carburante.
3. Individuo la spesa del carburante, mediante una moltiplicazione tra il valore ottenuto al passo 2 e il costo di
un litro di carburante.
4. Individuo il contributo personale per coprire la spesa del carburante, mediante una divisione tra il valore
ottenuto al passo 3 e il numero di viaggiatori.
@
Possono esserci più algoritmi che risolvono lo stesso problema. Quasi sempre possiamo stabilire qual è il mi-
gliore tra questi algoritmi; nella 3^ parte del libro vedrete i criteri per valutare e migliorare la qualità di un al-
goritmo.
1.1.5 Programmi
Approfondisco adesso la fase 3 della risoluzione di un input di un problema, che richiede di individuare i valo-
ri dei risultati associati a valori dati di Input.
Risolvo un input eseguendo manualmente i vari calcoli.
Ec.1.e
Applicare l'algoritmo individuato nell'Ec.1.d per risolvere l'input specificato nell'Ec.1.a.
Soluzione
Eseguo questi passi:
1. Il numero di chilometri percorsi è 2300 - 2000 = 300.
2. Il numero di litri di carburante consumati è 300 / 15 = 20.
3. La spesa del carburante è 20 * 1.2 = 24.
4. Il contributo personale per coprire la spesa del carburante è 24 / 4 = 6.
@
Ci piacerebbe eseguire questi passi mediante una macchina capace di interpretare un algoritmo (come quello
esposto nell'Ec.1.d), e non manualmente. Questa macchina è detta computer.
Un computer (o calcolatore) è una macchina che, usando un input di un problema e un algoritmo che ri-
solve il problema, individua l'output corrispondente.
Un computer non sa interpretare direttamente un algoritmo, ma deve trasformarlo in una forma comprensibile,
detta programma, che descrive, nei minimi dettagli, i passi che sono necessari per risolvere un determinato
problema.
Un programma è un insieme di istruzioni eseguibili da un computer.
In questo libro, userò (come succede spesso, anche se il termine è improprio) la parola programma anche per
indicare l’elaborazione nel tempo di un programma dal momento in cui inizia la sua esecuzione al momento in
cui la finisce.
1.1.5.1 Programmazione
La programmazione è la progettazione e la realizzazione di un programma.
Questo corso insegnerà a programmare un computer.
Molte persone usano il computer nella loro vita, ma non hanno mai programmato. Ad es., chi scrive un docu-
26
Antonio Giunta / Programmazione in C / Sistemi di elaborazione 1 per Matricole dispari di Statistica nell'a.a. 2018-19
mento mediante un word-processor, usa un programma progettato da qualcun altro.
La programmazione non è l'unica competenza richiesta ad uno studente di Informatica, ma è una componente
importante, affascinante e piacevole, che continua ad attrarre e a motivare gli studenti. Lo studente di Informa-
tica è particolarmente fortunato perché la sua formazione comprende la programmazione, e perché può realiz-
zare personalmente il prodotto del proprio studio ed ingegno usando materiali facilmente reperibili e poco co-
stosi.
Uno studente acquisisce, mediante la programmazione, alcune capacità che può usare anche in altri contesti;
infatti la programmazione irrobustisce l'attitudine a:
~ progettare un ragionamento e scomporlo in passi fondamentali;
~ strutturare informazioni mediante schemi standardizzati (ad es., le matrici o le relazioni);
~ scomporre un grosso lavoro (ad es., la redazione di un manuale) in parti che sono risolubili separatamente;
~ individuare analogie tra alcuni oggetti e gestire queste analogie in forma unificata (ad es., possiamo gestire
i titoli dei capitolo di un documento in modo unificato mediante gli stili);
~ riusare il più possibile schemi di informazione e procedure di elaborazione;
~ classificare informazioni.
Gli esercizi di programmazione del libro sono più semplici dei programmi sofisticati che usiamo quotidiana-
mente, ma le conoscenze apprese e le capacità acquisite in questo corso costituiscono una base importante per
la programmazione. Inoltre, la realizzazione di un programma è molto stimolante; infatti, è molto gratificante
riuscire a realizzare un programma originale ed efficiente e vedere il computer che svolge, in modo preciso e
rapido, un'attività che avrebbe richiesto ore di lavoro umano.
1.2
Il computer
Illustro soltanto le conoscenze indispensabili per affrontare la programmazione. Rimando ad altri libri chi de-
sidera una trattazione più dettagliata del computer.
1.2.1.1 Memoria
Il computer immagazzina dati e programmi nella memoria. La memoria fisicamente è composta da dispositivi
elettronici; il più elementare di questi dispositivi può memorizzare soltanto due diversi valori ed infatti è detto
bit.
Un bit (abbreviazione di binary digit (= cifra binaria)) assume un valore che può valere 0 o 1.
Poiché un bit può assumere due valori, un insieme di n bit può assumere pow(2,n) valori. Il multiplo di bit più
importante è il byte , che è composto da 8 bit e quindi può assumere pow(2,8)= 256 valori differenti.
Un computer può sempre rappresentare qualsiasi informazione (un numero intero, un numero periodico, un
carattere alfabetico, un testo, un disegno, una fotografia a colori, una musica, un filmato, ecc.) o istruzione
(somma, lettura di un valore, ecc.) mediante un codice convenzionale interno, composto da una serie di 0 o di
1.
Possiamo classificare la memoria in varie categorie, a seconda del contesto che stiamo affrontando. Per gli
scopi di questo corso, distinguo la memoria in:
1. Memoria centrale (o memoria principale).
27
Antonio Giunta / Programmazione in C / Sistemi di elaborazione 1 per Matricole dispari di Statistica nell'a.a. 2018-19
2. Memoria di massa (o memoria secondaria).
La memoria di massa è una memoria permanente, cioè mantiene le sue informazioni anche quando il compu-
ter è spento. Risiede solitamente su questi dispositivi fisici: disco flessibile (o floppy disk); disco rigido (o
hard disk); cassetta; CD; DVD; penna USB.
Un insieme di informazioni memorizzato sulla memoria di massa è detto file . Ogni file è identificato da un
nome composto da una serie di caratteri, divisa in due parti dal . (= punto). La prima parte del nome evoca il
contenuto delle informazioni; la seconda parte del nome (detta estensione del file) individua il formato delle
informazioni. (Ad es.: l'estensione di un file scritto in Java è c.)
La memoria centrale è una memoria più veloce e più costosa della memoria di massa, perché è realizzata
mediante componenti fisici più sofisticati. Di conseguenza, la memoria centrale è presente in quantità minore
nei computer rispetto alla memoria di massa.
La memoria centrale è distinta in RAM (= Random Access Memory) e ROM (= Read Only Memory).
Descrivo le loro caratteristiche fondamentali.
La traduzione letterale di Ram è "Memoria ad accesso casuale".
Il computer memorizza nella Ram i programmi in esecuzione e le informazioni usate dal programma. La Ram
è una memoria volatile, cioè perde le sue informazioni quando il computer è spento.
Ogni byte della Ram è identificato da un numero detto indirizzo. Gli indirizzi sono consecutivi e partono da
0.
Se un'informazione da memorizzare richiede due o più byte, questi byte hanno indirizzi consecutivi.
Da un punto di vista logico, la Ram è equivalente ad una serie di motel situati lungo una strada rettilinea; ogni
motel è identificato da un numero civico e condivide le sue pareti con quello che lo precede e quello che lo
segue. Ogni motel corrisponde ad un'area di memoria contenente un byte; il numero civico del motel corri-
sponde all'indirizzo dell'area di memoria.
Il computer impiega lo stesso tempo per accedere a qualsiasi indirizzo; per questo motivo, la Ram è detta me-
moria ad accesso "casuale" (perché l'accesso ad un qualsiasi indirizzo "a caso" richiede lo stesso tempo) o ad
accesso "diretto" (perché è consentito l'accesso "diretto" ad un qualsiasi indirizzo senza dovere accedere prima
ad altri indirizzi).
La traduzione di ROM è "Memoria a sola lettura"; infatti il programmatore non può modificare le informa-
zioni conservate in questa memoria.
Questa memoria contiene i programmi che il computer deve sempre memorizzare (ad es., contiene i pro-
grammi necessari per avviare il computer). La ROM è una memoria permanente.
1.2.1.2 CPU
La CPU (= Unità centrale di elaborazione) coordina l'esecuzione dei programmi, cioè:
1. Attende un segnale di attivazione.
2. Intraprende un'azione quando riceve il segnale di attivazione.
3. Individua ed esegue le istruzioni richieste dal programma.
4. Preleva o invia informazioni dalla memoria o dai dispositivi di Input/Output. Solitamente la CPU inserisce
ogni informazione in un'area detta registro.
La CPU equivale al "cervello" del computer: a differenza di una persona, non sa prendere decisioni autonome,
ma soltanto decisioni per le quali è stato programmata.
1.2.2.1 Hardware
L'hardware di un computer è l'insieme delle sue componenti fisiche specifiche per l'Informatica (scheda
madre, periferiche, ecc.) .
L'hardware non comprende componenti esterne all’Informatica come il cabinet e il trasformatore.
1.2.2.2 Software
Un computer è utilizzabile soltanto se possiede, oltre le componenti hardware, anche alcuni programmi.
Il software di un computer è l'insieme delle sue componenti logiche, cioè dei programmi.
Il livello software è scomponibile nei livelli: programmi di base; sistema operativo; programmi applicativi;
programmi di sviluppo.
I programmi di base sono necessari al funzionamento di base del computer (caricamento del sistema operati-
vo di avvio, ecc.), e tipicamente risiedono nella memoria ROM. Questi programmi sono scritti in linguaggio
macchina (vedi par.7), che è l'unico linguaggio comprensibile direttamente dal computer.
I programmi del sistema operativo gestiscono le risorse del computer. L'utente può usare direttamente alcu-
ni programmi del sistema operativo (stampa di un file, trasferimento di un file da disco rigido a disco fisso,
ecc.). Invece, soltanto il sistema operativo può usare altri programmi (gestione della CPU, gestione della coda
dei programmi che attendono di essere stampati, ecc.).
1.3
Linguaggi di programmazione
1.4
Editor di testo
Intuitivamente, un file di testo è composto dai caratteri che tipicamente sono reperibili in una comune tastiera.
Definiremo formalmente un file di testo più avanti (vedi più avanti).
Un editor di testo (d'ora in poi, editor) è un programma che
~ crea un file di testo o lo modifica, mediante l'inserimento o la cancellazione dei caratteri del file.
Un editor fornisce alcuni servizi che facilitano le modifiche di un file. I servizi più importanti sono:
~ Annulla, che annulla l'ultima modifica effettuata sul testo;
~ Taglia, che cancella dal file i caratteri selezionati dall'utente e li copia in un'area di memoria temporanea;
~ Copia, che copia nel file i caratteri selezionati dall'utente in un'area di memoria temporanea;
~ Incolla, che inserisce nel file il contenuto dell'area di memoria impostata dal servizio Copia;
~ Trova, che trova nel file la serie di caratteri specificata dall'utente.
Le istruzioni scritte da un programmatore in uno specifico linguaggio di programmazione sono memorizzate
in un file di testo detto file sorgente.
Ogni sistema operativo fornisce almeno un editor. Ad es., il sistema operativo Windows possiede l'editor Note-
pad (=Blocco Note in Italiano); il sistema operativo Ubuntu possiede l'editor gedit.
Un editor specifico di un linguaggio di programmazione facilita la scrittura di un file sorgente, ed offre tipi-
camente questi servizi:
~ L'editor indica, mediante una formattazione visiva, la categoria lessicale di ogni parola contenuta nel file
sorgente. Ad es., un editor può indicare:
~ una parola chiave mediante caratteri grassetti;
~ un commento mediante caratteri inclinati;
~ una stringa mediante caratteri di colore rosso.
~ L'editor indenta una linea, cioè inserisce automaticamente un numero opportuno di spazi all'inizio di una
linea (vedi più avanti).
~ L'editor facilita al programmatore l'uso di altri programmi di sviluppo, come il compilatore e l'ambiente di
esecuzione.