Sunteți pe pagina 1din 9

21

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.
@

Per individuare una definizione di Informatica, analizziamo l'esempio seguente.


Es.
Un'azienda vuole preparare le buste paga dei suoi dipendenti. Il suo Ufficio Stipendi (= US) compila gli sti-
pendi in modo tradizionale, eseguendo queste operazioni alla fine di ogni mese:
1. L'US legge, sul cartellino di ogni dipendente, il numero di giorni di assenza e le ore di lavoro straordinario.
2. L'US elabora queste ed altre informazioni (ritenute, ecc.), verifica se le assenze gli straordinari sono stati
autorizzati, e calcola l'ammontare dello stipendio dovuto dall'azienda al dipendente.
3. L'US conserva tutte queste informazioni e le comunica al dipendente.
Alternativamente, l'US può compilare gli stipendi in modo automatico mediante un programma che, alla fine
di ogni mese, esegue automaticamente queste operazioni:
1. Il programma rappresenta, mediante opportune convenzioni, le ore di lavoro di ogni dipendente.
2. Il programma elabora queste ed altre informazioni (ritenute, ecc.), verifica se le assenze e gli straordinari
sono stati autorizzati, e calcola l'ammontare dello stipendio dovuto dall'azienda al dipendente.
3. Il programma conserva tutte queste informazioni e le comunica al dipendente.
@

Dall'esempio precedente, possiamo estrarre la seguente definizione.


L'Informatica è la scienza che studia la rappresentazione, l'elaborazione, la conservazione e la comunica-
zione delle informazioni, mediante strumenti automatici.
La parola "Informatica" è nata dalla fusione delle parole "informazione" e "automatica".
L'Informatica studia problematiche molto più generali del semplice uso del computer; ad es., l'Informatica
studia l'efficienza degli algoritmi.
22
Antonio Giunta / Programmazione in C / Sistemi di elaborazione 1 per Matricole dispari di Statistica nell'a.a. 2018-19

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.
@

Un problema è una questione che devo risolvere.


Questo problema richiede di elaborare alcune informazioni, dette dati.
Un dato di un problema è un’informazione che è necessaria per risolvere il problema.
L'Ec. precedente è un problema "nel senso matematico", perché il testo specifica i valori dei dati. Il solutore
del problema deve individuare i risultati.
Invece, un problema "nel senso informatico" descrive i dati ma non specifica i loro valori. Quindi, la risolu-
zione di un "problema "informatico", rispetto ad un problema "matematico":
~ è più complessa, perché deve elaborare correttamente valori qualsiasi dei dati per ottenere i risultati corri-
spondenti;
~ è più utile, perché è applicabile su valori qualsiasi dei dati per ottenere i risultati corrispondenti ai dati.
Riformulo il problema precedente nella forma "informatica"; quindi, sostituisco il valore specifico di ogni da-
to con un valore variabile individuato da un nome. Ottengo così l'Ec.1.b, che corrisponde alla definizione di
problema.
Ec.1.b
Un gruppo di v viaggiatori ha concluso un viaggio in automobile.
Il contachilometri dell'automobile segnava kmP km al momento della partenza, e kmA km all'arrivo.
Il viaggio è durato g giorni.
L'automobile consuma mediamente un litro di carburante ogni kmPLitro km.
Un litro di carburante costa costoBenz euro.
Calcolare il contributo personale per coprire la spesa del carburante.
@

Un problema è composto da:


~ La descrizione dei dati, che hanno un valore variabile. Ogni dato del problema è detto input (d'ora in poi,
I).
~ La descrizione dei risultati, che dipendono dai dati mediante un ragionamento che il solutore del problema
programmatore dovrà individuare. Ogni risultato del problema è detto output (d'ora in poi, O).
Affrontiamo adesso la risoluzione di un problema, che richiede queste fasi:
1. Analisi del testo del problema ed individuazione dei risultati e dei dati.
2. Definizione di un ragionamento, detto algoritmo, che individua i risultati.

1.1.3 Analisi del problema


L'analisi di un problema richiede queste sottofasi:
1. Individuazione e descrizione dei dati.
2. Individuazione e descrizione dei risultati.
3. Impostazione del test.
Descrivo ognuna di queste sottofasi.

1.1.3.1 Individuazione e descrizione dei dati


In questa sottofase dobbiamo associare ad ogni dato:
~ Un nome evocativo (cioè che ricorda il significato del dato), e la sua descrizione.
23
Antonio Giunta / Programmazione in C / Sistemi di elaborazione 1 per Matricole dispari di Statistica nell'a.a. 2018-19

~ 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 }
@

1.1.3.2 Individuazione e descrizione dei risultati


In questa sottofase dobbiamo descrivere ogni risultato, mediante un nome evocativo e la sua descrizione.
Talvolta, dobbiamo anche specificare l'insieme dei valori che il risultato può assumere.

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.
@

1.1.3.3 Impostazione del test


In questa sottofase dobbiamo impostare il test, che è la verifica della correttezza dell'algoritmo.
Teoricamente, dovremmo testare l'algoritmo su ogni possibile valore di ogni input, ma praticamente questo è
impossibile; infatti un problema, anche molto semplice, ha quasi sempre un numero molto elevato di possibili
valori di input.
Per individuare e minimizzare il numero di input da usare per il test dell'algoritmo, dobbiamo suddividere
opportunamente il dominio dei dati in uno o più sottoinsiemi, detti insiemi di test.
Grazie a questa suddivisione, dovremo testare l'algoritmo soltanto sugli input di ogni insieme di test.
Dobbiamo descrivere ogni insieme di test mediante:
1. La proprietà che caratterizza l'insieme e che è condivisa da tutti gli input dell’insieme.
2. Un Input qualsiasi tra quelli che soddisfano la proprietà espressa.
3. L'Output che corrisponde all'Input precedente.
Purtroppo, non c'è un criterio generale per individuare quanti e quali sono gli insiemi di test. Potete imparare a
individuarli correttamente mediante l'esercizio e l'esperienza.
24
Antonio Giunta / Programmazione in C / Sistemi di elaborazione 1 per Matricole dispari di Statistica nell'a.a. 2018-19
Sicuramente dobbiamo definire un insieme di test per gestire ogni valore convenzionale di un risultato.
Ec.1.c
Analizzare il problema esposto nell'Ec.1.b, seguendo le sottofasi elencate.
Comprensione e integrazione del problema
La situazione descritta è chiara; quindi, non sono necessarie ipotesi aggiuntive.
Dati
~ nViagg Numero di viaggiatori. > 0.
~ kmP Chilometri alla partenza.
~ kmA Chilometri all'arrivo.
~ kmPLitro Chilometri percorsi mediamente consumando un litro di carburante. > 0.
~ costocarb Costo di un litro di carburante. > 0.
Il testo fornisce anche g, che è il numero di giorni del viaggio. Questa informazione è superflua, e quindi la
escludo dall'elenco dei dati.
Risultati
~ contrPers Contributo personale per coprire la spesa del carburante.
Il codominio non è un insieme enumerativo e non comprende valori convenzionali, quindi la sua descrizio-
ne è facoltativa.
Test
L'individuazione degli insiemi di test in questo problema è particolarmente semplice; infatti:
~ Nessun dato ha un dominio enumerativo.
~ Il codominio del risultato non è enumerativo e non può assumere valori particolari.
~ Tutti gli input sono "equivalenti"; quindi c'è un solo insieme di test e non è necessaria una proprietà che lo
distingue.
Individuo un Input e l'Output corrispondente dell'unico insieme di test.
~ T1: I:= {4, 2000, 2300, 15, 1.2}. O:= {6}.
@

Ec.1.6 Risolvere un'equazione di primo grado.


Comprensione e integrazione del problema
Il testo non specifica:
~ se il coefficiente dell'incognita può valere anche 0;
~ se l’equazione è nella forma a*x+b = 0 oppure nella forma a*x = b.
Per questo chiarisco, mediante un'ipotesi aggiuntiva, che voglio risolvere un'equazione del tipo:
a*x + b = 0
Dati
L'elenco di ogni dato e del dominio relativo è composto da:
~ I a Coefficiente dell'incognita. IN NUM_R.
~ I b Termine noto. IN NUM_R.
Risultati
L'elenco completo di ogni risultato è composto da:
~ O esito. {DET (:= equaz. determinata), IND (:= equaz. indeterminata),
IMP (:= equaz. impossibile)}.
~ O x Valore della soluzione.

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 Configurazione fondamentale di un computer


Una persona, quando possiede un algoritmo scritto su un foglio e vuole risolvere un input del problema su car-
ta, esegue questi passi:
1. Acquisisce dall'esterno i dati d'ingresso e li scrive sul foglio.
2. Legge dal foglio ogni istruzione dell'algoritmo, la esegue, e legge o scrive informazioni sul foglio.
3. Invia all'esterno i risultati dell'elaborazione contenuti nel foglio.
Quindi la persona usa alcune risorse per memorizzare l'algoritmo e alcune informazioni, per decidere le azioni
da eseguire e per comunicare con l'esterno.
Il computer, quando esegue un programma, procede in modo molto simile, ed usa le seguenti risorse interne
che svolgono funzioni analoghe alle risorse usate dalla persona:
1. Usa una componente detta memoria per memorizzare le istruzioni e le informazioni usate dal programma.
2. Usa una componente detta CPU (= Central Processing Unit) per decidere l'azione da eseguire.
3. Usa alcune componenti dette dispositivi di Input/Output per ricevere o inviare informazioni all'esterno.
Esaminiamo adesso queste componenti.

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.1.3 Dispositivi di Input/Output


Ogni computer comunica informazioni con l'esterno sia in ingresso che in uscita.
Se un computer non inviasse all'esterno i risultati di un programma, sarebbe completamente inutile perché i
risultati delle sue elaborazioni andrebbero perduti. Analogamente, se un computer non ricevesse dall'esterno i
dati, elaborerebbe soltanto le informazioni contenute al suo interno che genererebbero sempre gli stessi risul-
tati.
I dispositivi sono distinguibili in:
1. Dispositivi di Input, che acquisiscono informazioni dall'esterno. I più diffusi sono la tastiera e il mouse .
2. Dispositivi di Output, che inviano informazioni all'esterno. I più diffusi sono il video e la stampante.
3. Dispositivi di Input/Output, che possiedono le caratteristiche di entrambi i dispositivi di Input e di
Output. I più diffusi sono i dischi e le porte di comunicazione.
28
Antonio Giunta / Programmazione in C / Sistemi di elaborazione 1 per Matricole dispari di Statistica nell'a.a. 2018-19

1.2.2 Livelli di funzionalità di un computer


Chi adopera un computer, usa soltanto alcune tra le molte funzionalità offerte dal computer. (Ad es., un pro-
grammatore usa funzionalità molto differenti da quelle usate da un navigatore in rete.) Partendo da questa
considerazione, possiamo classificare le funzionalità in alcuni livelli.

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.).

I programmi di sviluppo consentono di realizzare altri programmi. Un programma è progettato mediante un


insieme di istruzioni detto codice sorgente (d'ora in poi, sorgente).

I programmi applicativi risolvono un problema specifico. I programmi applicativi sono numerosissimi:


word-processor, fogli elettronici, presentazioni, ecc.

In questo libro, approfondiremo soltanto i programmi di sviluppo.


Gli altri livelli di programmi sono materie di altri corsi; in particolare, i corsi sui programmi applicativi sono
solitamente rivolti a chi esercita una professione esterna al campo dell'Informatica ed usa il computer per ap-
plicazioni particolari (lavoro di segreteria, disegno mediante computer, ecc.).

1.3
Linguaggi di programmazione

1.3.1 Linguaggi e regole


L'attività principale di un programmatore è scomponibile in:
1. Analisi del problema.
2. Definizione di un algoritmo che risolve il problema.
3. Traduzione dell'algoritmo in un programma.
Un computer comprende direttamente soltanto il linguaggio macchina; però, può comprendere indirettamente
altri linguaggi, detti linguaggi di programmazione.
Un linguaggio di programmazione è un insieme di regole che consentono di descrivere un algoritmo me-
diante istruzioni che sono comprensibili ad un computer.
Es.
Il C segue il paradigma di programmazione procedurale.
@

Mediante un linguaggio di programmazione, possiamo comandare l'esecuzione di un algoritmo ad un compu-


ter, che sarà un esecutore "fedele" di ogni istruzione. La fedeltà del computer è assoluta; quindi se invierò al
computer un'istruzione incomprensibile oppure, peggio ancora, errata, il computer, rispettivamente, non la e-
seguirà oppure individuerà un risultato errato.
29
Antonio Giunta / Programmazione in C / Sistemi di elaborazione 1 per Matricole dispari di Statistica nell'a.a. 2018-19

1.3.2 Errori di programmazione


Chi programma in un dato linguaggio deve rispettare le regole previste; se viola una di queste regole, commet-
te un errore di programmazione. Ci sono due tipi di errori di programmazione: errori di sintassi ed errori di
logica.
Un errore di sintassi è una violazione delle regole del linguaggio. Ad es., quando:
~ usiamo una parola che non appartiene al lessico, oppure,
~ usiamo l'operatore di divisione senza il dividendo.
Esistono dei programmi di sviluppo (detti compilatore e linker, e che vedremo tra poco) che segnalano auto-
maticamente ogni errore di sintassi e ogni warning (= avvertimento). Un warning è causato da un'istruzione
che è incoerente rispetto alle altre del sorgente; pertanto, probabilmente (ma non necessariamente) un warning
contiene un errore di logica.
Il compilatore indica, insieme ad ogni errore di sintassi e ogni warning, la loro causa (più o meno chiara).
Il programmatore deve eliminare sempre ogni errore di sintassi e, quando è possibile, ogni warning.
Un errore di logica avviene durante l'esecuzione perché il programmatore ha usato un'istruzione differente da
quella che produce il risultato corretto. L'effetto è che l’esecuzione del programma qualche volta darà un risul-
tato differente da quello desiderato.
Il computer non può individuare gli errori di logica, perché ignora l'intenzione del programmatore e il proble-
ma da risolvere. Il programmatore può individuarli soltanto testando il programma; però, un programma può
possedere un errore di logica anche se ha superato ogni test.
Quando il programmatore scopre la presenza di un errore di logica, deve individuare l'istruzione errata.

1.3.3 Errori di esecuzione


Un errore di esecuzione avviene quando un programma durante l’esecuzione ha effettuato un'operazione
proibita. (Ad es. il programma ha diviso un numero per zero.) Un errore di esecuzione interrompe
l’esecuzione del programma.

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.

S-ar putea să vă placă și