Vous êtes sur la page 1sur 297

Sommario

P REFAZIONE .. ......... ............ .... .......... ..... .. ... ........... . ............ ..... .. Xl

e
Corso completo di programmazione
Titolo originale:

C How to Program, Second Edition


Autori:

Harvey M. Deitel, Paul J. Deitel


Published by arrangement with the or.igioal publisher, PRENTICE HALL, INC.,
a Pearson Education Company
Copyright 1994 - PRENTICE HALL, INC.

Lo scopo di questo libro ............................ .................................................................... xi


La metodologia di insegnamento .................................................................................. xii
Lapprendimenro attraverso il codice ................................ ......... ...................... xii
Laccesso al Wodd W ide Web .......................................................................... xii
Obiettivi ............................ ..................................... ...... ................................... xi i

~i;:c: ~~a~i:~~~.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:
Consigli e suggerimen ........................... ... ...................................... ....... ....... xiii
Esercizi di autovalutazione ............................................................................... xiv
Esercizi ........... .. ..... ....................................... ... ........................................ ........ xiv
Indice analitico ...................................................... .......................................... xiv
Panoramica sul libro .. .......... ......... ............................. ............................................ ....... xiv
C APITOLO I : N OZIONI SULLA ELABORAZIONE ELETTRONICA .... ... . .... .. .... .. .... I

1.1

Inn:oduzione ...................................................................................................... 1
Che cosa un computer? ................................................................................... 3
1.3
L'organizzazione del compucer ........................................................................... 3
1.4
L'elaborazione batch, la multiprogrammazione e il timesharing ........................ 4
1.5
L'elaborazione personale, distribuita e dient/server .......................................... 5
1.6
I linguaggi macchina, assemb.ly e di alto livello ....................... .. ...................... .. 6
1.7
La sroria del
7
1.8
La libreria standard del
8
1.9
Gli altri linguaggi di alto livello .......................................................................... 8
1.1 O La programmazione strutturata .................................................................. ........ 9
1.1 1
Le basi dell'ambiente c ................................................................................... 10
1.1 2
Note generali sul Ce su questo libro .... ................... ... ..................................... 12
1.13 Il Concurrenr C ................ .................. .. ... .... .................. ....... ..................... ...... 13
1.1 4 La programmazione orientata agli oggetti e il C++ .............................. ... ......... 13
Esercizi di autovalutazione .............. .................................... .......................................... 14
Risposte agli esercizi di autovalutazione ............... .................. ...................................... 14
Esercizi ..................................... .................................................................................... 15
Letture consigliare ....... ... ................... ........................................................................... 16
1.2

Copyright per l'edizione italiana 2000 - APOGEO stl


Viale Papiniano 38 - 20123 Milano (ltaly)
Telefono: 02-461920 (5 linee r.a.) - Fax: 02-4815382
Email
U.R.L.

educati on@apogeonline.com
www. apogeonline. com

ISBN 88-7303-669-4
Traduzione cli Michele Trulli
Revisione di Ivan Scagnetto
Impaginazione di Guido e Gianfranco Giuseppini
Realizzazione editoriale di Spock s.a.s. di Augusto Vico e c.
Editor: Alberto Kratter Thaler
Copertina e pcogetto grafico: Enrico Marcandalli
Responsabile di produzione: Vitiano Zaini

Tutti i di.ritti sono riservati a norma di legge e a norma


delle convenzioni intrnazionali. Nessuna parte di questo ]jbro
pu essere riprodotta con sistemi elettronici, meccanici
o altri, senza l'autorizzazione scritta dell'Editore.
Nomi e marchi citati nel testo sono generalmente depositati o registraci
dalle rispettive case produttrici.

c ...................................................................................................
c ..................................................................................

CAPITOLO

2:

INTRODUZIONE ALLA PROGRAMMAZIONE IN C .... .... ....... . . ...

I9

2. 1
2.2

lnuoduzione ................... ......................................................................... ........ 19


Un semplice programma C: v.isualizzareuna riga di tesro .. .............................. 19
2.3
Un altro semplice programma C: sommare due interi .... ................................ 23
Nozioni sulla memoria .. .................................................................................. 28
2.4
2.5
L'arianetica del C ............................................................................................ 29
2.6
Prendere delle decisioni: gli operatori di uguaglianza e relazionali .................. 33
Esercizi di autovalutazione ..... .. ............. ........................ ... ............. ................................ 37

Sommario
P REFAZIONE ........ ... ........ ... .... ... ... .. ............. ..... .. Xl

e
Corso completo di programmazione
Titolo originale:

C How to Program, Second Edition


Autori:
Harvey M . D eitel, P aul J. D ei tel
Published by arraogcmenr with the origiaal publisher, PRENTICE HALL, lNC.,
a Pearson Educacion Company
Coprnght 1994 - PRENTICE HA.LL, INC.
Copyright per l'edizione italiana 2000 -APOGE O srl
Valc Paptniano 38 - 20123 Milano (h aly)
Telefono: 02-461920 (5 linee r.a.) - Fax: 02-4815382

Email education@apogeonline .com


U.R.L. www . apogeonline. com
ISBN 88-7303-669-4
Tmduzione di Michele Trulli
Revisione di l van Scagncu o
l mp aginazione di Guido e Gianfranco Giusppini
RcaJizzazlone eclito ria le di Spock s.a.s. cli Augus to Vico e c.
Editor: Alberto K.rnttcr Tbitler
Copertina e progetto g rafi co: Eru:ico M arcandalli
.Responsabile dJ proclnrionc: 'Vitiano Zaini

Tuto i diritti sono riservaci u norma di le~ e a no.an,1


delle convenzioni intc:roaz1on:i. Nessuna pane di questo libro
pu esi.erc ciprodoua con s1stcmj elettronici, mcccaruct
o aJm, senza l'aucorizzaz1one senna dell'Edito!e.
N omi e mardu citati nel resto sono generl}lmente depos1cat o ccgistraa
dalle rispettive case produrtnct.

Lo scopo di questo libro ................................................. ........................................... .... xi


la metodologia di insegnamento .................................................................................. xi i
I.:apprendimcmo aa:raverso il codice ............................................................. xii
t.:accesso al Wotld Wide Web .................... .. .................................................... xii
Obic:n.ivi .......................................................................................................... xii
Il codice e gli esempi ................. .. .................................................................... xii

.
.
. .
..
Ftgur~ : 11nmag~ 1 : ............................... ...................................... ............... ~ '.'.

Consigli e suggenmentt .... ........... ........~ ..... ................. .. ................................. x 111


E..~e rci1.i di autovalucazione ............ .......... ........ .............. .. ........ ................. ... .. ... xiv
Esercizi .............. ............................... ...... .. ..... ................ .................................. xiv
1n<licc: analitico ........ ................................. .................. ................................. .... xiv
Panoramica sul libro .................................................................................................. ... xiv
C APITOLO I : N OZIONI SULLA ELABORAZIONE ELETTRONICA ... . . . I

1.1
1.2
1.3
l.4

Inrrod uzione .................................................. ............... ............................... ...... 1


C he cosa un computer?................................................................................... 3

L'organizza:Lione del computer ........................................................................... 3


L'elabor.nione bacch , la multiprogrammazione e il timesharing ........................ 4
l.5
L'elaborazione personale. dimihuita e dient/server .......................................... 5
1.6
I linguaggi macchina, asscmbly e di aJro liveliQ................................................. 6
1.7
La scoria del
7
1.8
La l.ibrcna scand..ard del e .................................................................................. 8
1.9
Gli altri linguaggi di alto livello .......................................................................... 8
LIO
La programmazione scrucrurara .......... ............................................... ................. 9
L.11
Le basi dell'ambic:n cc: e ................................................................................... 1o
1. U
Note generali sul C e su qucst0 lib ro ............................................................... 12
I .1 3
li Concurrent
13
1. L4
La programmaz:ione orientata agli oggetti e il C++ ......... ................................. 13
Esercizi d.i aurovaJurazi<;> ne ........ .............. .............. ..................................... ................... 14
R:isposcc agli esercizi di aucovalurnziMc .................... .. .......... ............ ........................... 14
Tuercizi ............ ......................... ............ ............ ,.. .. .. ... .. .. .. . .. .. .. .. .. .. .. . .. .. ... . .. .. . .. . .. .. .. . ... .. 15
Letture consigliate ................................................................ ........................................ 16

e ...................................................................................................

e ...............................................................................................

C APITOLO

2.1
2 .2
2.3
2 .4

2: INTRO DUZIONE ALLA PROGRAMMAZIO N E IN C

.... ... ..........

19

fn rroduriooc: .................................................................................................... 19
Un semplice programma C: visualizzareuna riga di resco ................................ 19
Un altro semplice programma C: sommare due interi .................................... 23
Norion.i sulla memoria ....................................- .............................................. 28
1.5
L'arirmetica dcl C ....... ............................................. ........................................ 29
2.6
Prendere delle decisioni: gli operatori di uguaglianza e relazionali .................. 33
Esercizi di aucovalut:u.ionc ............................................................................................ 37

SOMMARIO

IV

Risposcc agli esercizi di aurovalutazione ....................................................................... 39


Esercizi ................................................................. ........................................... ............. 40
CAPITOLO

3: Lo SVILUPPO DI PROGRAMMI STRUTTURATI . .............. . . ....... 45

3.1
3.2
3.3

Introduzione .................................................................................................... 45
Gli algoriuni ................................. ................................. ................................. . 45
Lo pseudocodicc .............................................................................................. 46
~.4
Le strutture di conaollo ................................................................................... 47
3.5
L;i scrui:o.u:a di selezione lf ................................. .............................................. 49
3. 6
La suutcura di selezione lf/El~e ............................ ,..............................,,.......... 51
3.7
La scrucrura <.li iterazione wbile ............... ......... ........ ........ ................................ 55
3.8
Formulazione degli aJgoani: srudio di un caso 1
(icerazione Gontrollaca da un concarore) ........................................................... 56
3.9
Formulazione degli algoritmi con processo top-down
per raffinamenri successivi: srudio di un caso 2
(irer.Wene controllata da un valore sentineUa) ................................................. 58
3.1 o rormulazine degli algocm.i con processo rop-down
per raffi n;unemi successivi: studio di un caso 3
(suurrure di conrroUo nidificare) ...................................................................... 65
3.11 Gli ope.rarori di assegnament ......................................................................... 69
3.12
Gli opcrarori di incremento e di decremento .................................................. 70
Esercizi di aucovalucazione ............................................................................................ 73
.Risposte agli esercizi di aurovalutazione ............................................................ ........... 74
Esercizi ................................................... ...................................................... ,............... 76
CAPITOLO

4: IL CONTROLLO DEL PROGRAMMA ........... ..................... ......... 85

4.1
4.2
4.3
4.4
4_5

lnuoduzione .................................................................................................... 85
Gli elemem:i della iterazione ............................................................................ 85
Jcei;azioBe cntrollara da un contatore ..............................................."" 86
La strurcura di icera7one for ..... ............................ ................ ..... ... ........... ........ 88
La struttura for: noce e osservazioni ................................................................ 91
4,.6
Esempi di utilizzo della srrurrura tor ................................................................ 92
4.7
La sm:rrrura di selezione mulcipla swicch - 95
4.8
la struinl.Ea di iterai.ione do/while ................................................................. 101
4.9
Le isrn1zi0ni break e concioue ............................................................... .. .. .... 103
4. 10 Gli operatori logid .................................. ..............".. 105
4.1 1 Confondere gli operacori di uguaglianza (:=) e di assegnamento C=.) .... I08
4.12 Riassumo ddla programmazione sr:rurturaca .................................................. 110
Esercizi di aurovalurazione. .................... .. ..... ...... .... ................. ............ .. .. ........... .... . ... I 15
Risposte agli eserizi di autovaJuraz.ioqe ..................................................................... 117
Esercizi ................................................................................................. ...................... J 18
'C APITOLO

5.1

5.i
5.3
s.4

--~-

5: LE: FUNZIONI . . . . . ... . . . . .. .. . . . . . .. . . . .. .. . .. . . . . . . . . . .. . . . . . . . . . .. . .. . . . I25

lnrroduzione .................................................................................................. 125


1 moduli di programma jn_ e ......................................................................... 125
Le funzioni della libreria maremacica ................................. ......................... ... 126
te funzioru .................................................................................................... 127

-=-- -_

SOMMARIO

Le definizioni di funzione ................................. ... ................................. ......... 129


I prototipi di funz.lone ............. ...................................................................... 133
I file di inresrazione ....................................................................................... 136
Invoca.re le funi.ioni: chiamata per valore e per dferimento .......................... 137
Generazione di numeri casuali ...................................................................... 138
Esempio: un gioco d'azzardo ................................. ................................. ....... 142
Le classi di memoria .................................................................. ................... 145
Le J:egole di visibilit ...................................... ,.............................................. 1.48
La ricor~ione ................................................................................................. 151
Esempio di ut:ilizzo della ticorsione: la serie di Fibonacci ............................. 155
Ricorsione e iterazione .................................................................................. 158
di autovalucazione .......................................................................................... 161
Risposte agli esercizi di autovalucazione ..................................................................... 163
Eserci?.i ............................................................................................... ........................ 165
5.5

5.6
5.7
5.8
5.9
5.10
5.11
5.12
).13
5.14
5.15
.Esercizi

C APITOLO

6.1

6:

I vEnoR1 ...... .... . ...... ........... ........... ... ... .. .. ................. ................

175

6.2

lnrroduzione ................................. ................................. ................................ 175


I vettori ................................. .............................................. ........................... 175

6.3

La dichiarai.ione dei ven:qri ........................................................................... 177

6.4

Esempi di ucili220 dei vecroci ......................................................................... 178


Passare i vertori alle funzioni .................................................................. ....... 190
6.6
L'ordinam.coco dei verto.ri ................ .......................................... ,................... 195
6.7
Srudio di un caso: calcolate la media, la mediana e la moda usando i vettori 197
6.8
La ricerca nei vettori .................................................................... ,................ 201
6.9
I vercori mulcidimensionali ............................................................................ 206
Esercizi di autovalutazione .......................................................................................... 212
Risposte agli es~rcizi di aurovalurazione .................................................... ._............... 2 14
Eserci2i ................. ............................................................................................... ,...... 215
Esc::,rcizi sulla rieorsione ..................................... .. ...................................... ................. 225

6.5

CAPITOLO

7.1

7: I PUNTATORI ................. ........................ ................... ...... ... .......... 227

Introduzione ........................................................................................... _...... 227


7.2
Dichiarazione e iniziaJjzzazione dci puntarori ................................................ 227
7.3
Gli operatori sui puntatori ............................................................................. 228
7.4
la chiamara per riferimento delle fun?.ioni .................................................... 231
7:5
Ucilizz.are il qualifcarox:e const con i punratol'i ................................. ............. 235
7.6
L'ordina.mento a bolle utilizzando una chiamata per riferimento ................... 241
7.7
Le espressioni con i puntatori e l'atmetica dci puntatori ............................ 246
7.8
La relazione tra i puntatoci e i verrori ............................................................ 249
7.9
l vettori di puntatori ................................. ..................................................... 253
7.10
Srudio di un caso: simulazione di un mescolacore e discribucore cli carte ...... 254
7.11
I puntatori a fun1,ionj ................................................... .. ,............................... 259
Esercizi di aurov-aluta.7.ione ........................................... ,.............................................. 264
Risposce agli esercizi cli aucovalutrione ...................... ., ............................................. 266
-Esercizi ....................................................................................................................... 267
Sezione speciale: cosrruire il vostro computer ............................................ - 270

SOMMARIO

Vl

8: I CARATTERI E LE STRINGHE ............................. ............................. . 281


lnrrod:uzione ........................................................ ,......................................... 281
8.2
1 concerti fondamenrali deUe stringhe e dei ca.racreri ..................................... 281
8.3
La libreria per la gestione dei carartcri ................................. ......................... 283
8.4
Le fu.m.ior per la conversione deUe srringhe ................................................. 289
8.5
Le funzioni deUa libreria per l'iopuc/oucpur standard .................................... 293
8.6
Le funzioni per la manipolazione delle stringhe incluse neUa libreria
per la gcscione delle so:inghc;: .......................................................................... 297
8.7
Le fi;m~ioni di confromo.in:cluse nella libreria per la gestione delle so.inghe .. 299
8.8
Le fu.rrzion i d i ricerca incluse nella libre.ria pcr ta -gestione delle stringhe ...... 302
8.9
Le funzioni per la maniplai.iorn: della mc.moria incluse nella libreria
per la gestione dcl le stringhe .......................................................................... 308
8. 1O L alrre fu.oz.ioni della libreria per La gestione delle stringhe .......................... 312
Esercizi di aurovalurazione .......................................................................................... 3 L3
Risposte agli esercizi di autovalutazione ................................. .................................... 3 14
Eserciz.i .... - ...... .. .................................................................. ............................. . 315
Sezione speciale: esercizi di manipolazione avanzata: dclle stringhe ............... ;............ 31 8
Un progetto impegnativo per la manipolazione delle stringhe ..................................... 322
CAPIT OLO

8.1

CAPITOLO

9: lA FORMATTAZJONE DELL'INPUT/OUTPUT . .......... ................. .... ........ 323

SOMMl\RJO

10.1 1 Le cascanti d i enumerazione ................. ............. ...... ................................. ..... 371


Esercizi di autovalutazione .... ........................... ...... .. ................................. ........... .. ..... 373
Risposte agli esercizi di aucovalucazi.on e .... ........................................ ............ .. ........... 375
Esercizi ........................ ........... ......................................................... ........................... 375
CAPITOLO

11. I
11.2
11.3

C APITOLO

12.1

I 0: LE STRUTTURE,

LE UNIONl1 L GESTIONE DEI BIT E LE EN UMERAZIONI

349

ln rrod~one

10.1
10.2

................................ .... ......................................... ..................... 349


La definizione delle srrurrure .. ................................... .................................... 349

10.3

Inizializzare le srrurrure .......... ..................................... ................................. .. 352


Accedere ai membri delle suunure ................................................................ 352
Usare le suurrure con Le fun~ioni ................................. .................................. 354

L ElABORAZIONE DEJ FILE ........................ ........ . .......... .. . . ......... ...

379

] 1.4
Creare un file ad accesso sequenrt.iale ............ ................................................ 382
11.5
Leggere i dari da un file ad a-ccesso sequenziale ............................................. 387
11.6
I file ad accesso casuale ................................................................................. 392
11.7
Creare un fe ad accesso casuaJe ........................ ........................................... 393
11.8
Scrivere i dari in modo casuale in. un file ad ac::esso casuale ................_........ 395
11.9
Leggere i dari in modo casuale da un fle ad accesso casuale ......................... 398
11.10 Studio di un caso: un progratllJilll pe.r l'elaborazione delle mll1s;I2oui .......... 399
Esercizi di aurovaluraz.ionc .................. ........................................................................ 404
Risposte agli esercizi di autovalutazione .................................................................. ... 405
'Esercizi ................................................................... ..................................................... 406

9.1

CAPITOLO

11 :

Introduzione .......................................... .. ............ .......................................... 379


La ger.arGh ia dei dari ...............-...................................................................... 379
I fil.e e g.li Strea.in .... .................. ................................. ........... ............. ... ........ .. 38 1

9.2

lnrroduzione .................. ........ ........................ ..................... ........................... 323


Gli srrearn ...... .. .... ......................... ...... .......... ...... ....................... ............. ....... 32.3
9.3
f oanattit'e l'output con priurf ........... ............................................................ 324
9.4
Visua.lizz.are gl.i interi .......... ........................................................................... 324
9.5
Visualizzare i owneri in virgola mobile ......................................................... 326
9.6
Visualizzare le stringhe e i caratteri ............................................................... 328
9.7
Gli altri indicatori di conversione ...................., ............................................. 329
9.8
Visualizzare co11 le d imensioni di campo e le p .recisioni ................................ 330
9..9
Utiliz1..are j H.ag nella srri:oga.di coum'>.llo del fo.anato ................................. ... 333
9.1 O Visualizzare i ~lerterali e le s.e.que112e di escape: ................................................ 336
9.1 l
Pormarciire l'input con scanf. .. ....................................................................... 336
Esercizi di aurovaJutazione ........................................... ............................................... 342
Risposte agli esercizi di aucovalucazione ................................. .................................... 344
..Esercizi ....................................................................................................................... 345

Vll

I 2:

L E STRUTTURE D I DATI ..................... . ................. ........................

41 I

U.2
12.3

lorroduzion!! ............................................... .. ,................................................ 4 11


Le srrumrr ricorsive .................. ........................... .. ................................. ..... 412
Allocazione dinamica della memoria ............................................................. 412

12.4
12.5
12.6

Le liste concarenace ..... .......................................................................... ........ 414


Le pile ............................. ..................................... ............................... ........... 422
Le code ........................................................................................................ .. 428

12.7
Gli alberi .............................. .......... ................................................................ 434
Esei:cizi di :turqvalut:az.ione .................................................................. ........................ 439
-a
.. di aurovaluEaZione
. .
t,rspoSte agli eserClZJ
..................................................................... 4"11
Esercizi .............................................................. ............... ......... ... ............................ .. 442
Sezione speciale: costruite il voStro compilatore .... .................................................... 449
Primo passaggio ............................................................................................. 452
Secondo passaggio ........................................................... ........................... ... 454
Un esempio completo .................... .............. ........ .... ......................... ............. 454
Un ~e passo per passo del processo di compilazione ............................... 456
C APITOLO

13:

I L PREPROCESSORE .......... ......... .............. ..... ........... . .. .... .............

463

Typedef.......................................................................................................... 354
Esempio: simulazione di un. mescolatore e distributore di carre

13.5

ad alt.a. efficienza .......................................................................................... .. 355

13.6

L0.8
Le un.ioni .. ..................................................................................................... 3 57
L0.9
Gli operatori bicwise ...................................................................................... 360
10.10 l campi dj bit: ................................................................................................ 368

Tnrroduz.ione ................................. ................................................. ,............... 463


La ~rriva del preprocessore # include ...................................... ................... 463
La diretva del preprocessore #defne: le cosran simboliche ....................... 464
La diren:iva del preproces.soce #define: lt: macro ..... ...................................... 464
La compilazione c0ndizi0nale .................. ....................... ,.............. ................. 466
l e direttive del prcprocc,:ssorc #errar e #pragma .........................- ......... ....... 468

13.7
1 3.8

Cli operatori# e ## ............. .......................................... ................................ 468


I numeri di riga ................................. ............................................................ 469

13.9

Le cosranci simboliche predefinite ........................................................... .. .... 469

10.4
10.5
1.0.6
L0 .7

13.1
13.2
13.3
13.4

./ . , ......).,. .
~'f~1, :~
~~-

Vili

SOMMARJO

13. J O Le asserzioni .......................... -....................................................................... 469


~erciz.i di autovalutazione .......... ................................................ .......................... ...... 470
R1spo~t~ agli esercizi di aurov-.tlutazi.one ..................................................................... 471
Eserc1z1................................................................................................................... .... 472
UPITOLO

14: ARGOMENTI AVANZATI . .............................................................. 473

Introduzione .................................................................................................. 473


Re~rezioo.are l~in~~t:/?utpuc sa sistemi UNIX e DOS .................................. 473
GL1 elcn~hi variabili di a:rgomenci .................................................................. 474
Usare gli argomemi della riga di comando .................................................... 477
1 .I
14.5 Noce sulla compilazione cl.i programmi fqrmari da vari file sorgente ............. 478
Chius~a dei pr~g~ c:pn Exit: e Acexir .................................................... 480
1!.6
Il qua116carore di npo Volatile ........................................................ ............... 481
1 .7
J:8 l Sllffissi per le costanti ~n(r e in virgola mobile ..... .................................... 4 82
1 .9 Ancora sai file .. ,............................................................................................ 482
14.10 La ges'l!ione dei segnali ................................................................................... 484
14.11 Allocaz.ione dinamica della memoria: le funzioni calloc e rea11oc ................... 4.85
.14. l~ . IJ salto iacondzi()nacq: goto ............. ............................................................. 486
Eserc1z.1 di aucpvaluraiione ................................................ .................. .. ...................... 489
Rispo~t~ agli esercizi di aurovalur;u.iqne ........................ ............................................. 489

14.1
1!2
\;.

Eserc1z1 ....................................................................................................................... 490

lA SINTASSI DEL C ............. ............... ......................................... 49 1


Sommario della sin cassi del linguaggio ....................................................................... 491
A PPENDICE A :

A. l
A.2
A.3

Grammacica lessicale ..................................................................................... 491


Grammatica della suunura della frase ........................................................... 495
Oircrcive del preprocessore ........................................................................... . 501

APPENDICE

B. l
~.2
B~
.~
8B ~
B:7

818
B.9

B.10
B.l l
B.12
B.13
B.14

B: LA LIBRERIA STANDARD ........ ........................................................ 503

Erroci <erroo1h> ............................................................................................ 503


Oefinizini comuni <srdde.f.h> ...................................................................... 503
Diagnostica <asserr.h> .................................... ............................................... 504
Gestione dei caratteri <crype.h> ............................... ................... .................. 504
Localizz.~one <loci.le.h> ....................................... ........................................ 505
~r~e:~~~~c~~srher.~m> ~_..................................................... ..................... ..... 509
) P.JV> ................. .. ...... ..................................... 51 I
Gesrione dei segnali <signalh> ...................................................................... 512
.Argomenti v.ariabili <stdarg.h> ...................................................................... 513
lnpur/Oucpur <stdio.h> .................................................................... .. ........... 514
Urilir generiche <srdlib.h> ............................................................................ 525
Gestione delle stringhe <suiog.li> .................................................................. 532
Data e ora <time.h> ...................................................................................... 536
Lim.ici dell'imp1e.mencazione .......................................................................... 539

:~:[~:.::::::::::::::::::::::::~::::::::::::::::::::::'.::::::::::::::::::::::::::::::::::::::::'.::'.:'.:::::::: ;!~

APPENDICE C: PRIORIT E ASSOCIATIVIT DEGLI OPERATORI ........... .......................

543

SOMMARIO

. ~ }iH
.\;'.:~~'
. . . . .~~ID,
,~ .... ,
"i'. .
'.Cj l;~,\>'

A PPENDICE

D: LINSIEME DEI CARATTERI ASCI I ................................................... 545'~

A PPENDICE

E: I SISTEMI NUMERICI ................................ ..................................... 547

lncrodu.zione .............................................................. .................................... 547


L'abbreviazione dci numeri binari in oaali ed esadecimali ........................... 550
La conversione dei numeri oaali ed esadecimali in binari ............................ 551
La conversione da binario, orcale o esadecimale in decimale ........................ 552
La conversione da decimale a binario, ocrale o esadecimale ........ .................. 553
E.5
I numeri binari negativi: la notazione con rnmplernenco a due ..................... 554
E.6
Esercizi di aurovaluraz.ione .......................................................................................... 555
Risposte agli esercizi di aucovalurazione ..................................................................... 556
Esercii.i ................................ .. .......... ............................. ..... .................................. ..... .. 557

E. I
E.2
E.3
E.4

INDICE ANALITICO ....................................... .. . ......... ..... ... ...............................

559

Prefazione

Benveouci nel mondo del C. Q uesco libro scaro scrirro da un padre, l:larvey M. Deitel, e
da. suo figlio, Paulj. Deicel. JI padre ha programmaco e/o insegnaco la programmazione per
38 anni, menrre il figlio h:1programmato e/o insegnar.o la programmazione per 18. Il padre
programma e insegna grazie all'esperienza maturam; il figlio, invece, programma e insegna
gazie a un'inesa.uribile riserva di energia. Il padre pwita alla chiarezza, U figlio alle presta"!li.oni. H padre cerca l'eleganza e I.a bellezza, iJ figlio vuole soprammo risultati eone.reti.
lnsieme hann0 cercaco di rcafu.zarc un libro che speriam0 possiate trovare mi.le, complero
e diverre.nce.

Lo scopo di questo libro


Il Professor Harvey M. Deird ha cenuco corsi universirari. inrrodurrivi sulla programmaz.ione pe!r 20 anni, punrando soprarruno a insegnare come sia possibile sviluppare programmi
ben scrirri e ben srrurcuraci. Mol dci suoi inscgnamen riguardano i concetti fondamentali della programmazione, con particolare ~i suU'ucilizzo efficace deile strutture d i
q>nrrollo e sulla funzionalit. Questi argomenti vengono presentati all'interno di quesro
libro esanamente nel modo in cuj il Professor Deicd li ba sempre proposti ai propri
.srudeori universirari.
t

In base aila noma esperienza, gli srudenti affronranp i temi presentaci io questi capitoli
n~llo sresso modo in cuiaffrontaoo i corsi di Pascal. G, comunque, un'importante differnza:: gli srudemi sono escre.mame.nre motivaci dal farro che sranno imparando un linguag-

gio che porranno ucilizzare immediacameme quando lascer.lDilo l'universit e a.ffromeran-

.110 il mondo del lavoro. Turro quesro aumenta notevolmente il I.oro entusiasmo nei confronci del

e, nonostante ci siil moltissimo da impatare.

U l10StEO obiettivo er.a. chiaro: offrire un testo .sul C d6L.naco ai corsi W'liversirari a
livilo inrroi:lurrivo, per quegli studenti che non bruino -ak:una esperienza nell'ambito del.la
programmazione, pur fornendo, allo sresso rempo, la ~omplerezza rcorica e pratica ricb ie
sra ai tradizionali corsi avanzati di C.

11 resro segue lo srandard ANSl C; rene(e presence d1e moire funzionalit dell'ANSI C
.nn sono implementate nell.e versioni pre-ANSI deJ C. Per avere informazioni pi derca:gliate sul linguaggio vi conviene consultare il manuale di riferimemo dd vostro sisrcma o
pn;>curarvi una copia dd documento ANSiflSO 9899: l 990, "Amecican National Scandar9 for lnformaon Sysccms-Programming Language C", clell'AmericanNationaJ Standards
1nsrure, 11 Wcsc 42od Streec, New York, New York 10036.

Xl!

PREFAZrONE

La metodologia di insegnamento
Questo libro contiene un'ampia varier cfj esempi, esercizi e progerri che prendono spunto
da moire situazioni e che offi:ono agli smdenri la possibilit di risolvere problemi reali. Il
libro prende in esame i principi dclla progena:iione dd software, insistendo sulfimponanza della chiarezza dei programmi ed evicando J'uso cfj cerminologfa complessa a favore cfj
esempi chiari e cLretti, il cui cocLce sia scaco collaudato sulle piaccaforme C pi diffuse.

l:apprendimento attraverso il codice


D libro presenta una grande quantit di esempi basaci sul cocLce. Ogni argomento viene
presencaco neU'ambico di un programma C completo e funzionante, seguito sempre da una
o pi finestre che mostrano l'oarput del p rogramma in questione. Viene quindi usato il
Llriguaggio per insegnare il Llnguaggio, e la lettura di questi programmi offre un'esperienza
molto simile alla loro eseuzione reale su di un omputer.

L:accesso al World Wide Web


Tu ero il codice presente nel lhro si m;>va .anche in lnrerner, nel booksite abbinato a quesco
libro, all'indirizzo http: I /www. apogeonline. com . education . booksite. Il nostro consiglio quello di scaricare turro il c>dice, eseguendo poi ogni singolo programma via via
che appare nd resto. Potere anche modificare iJ codice degli esempi e vedere cosa succede,
imparando cosl a programmare prograiimando. Tutto questo marcriaJe protetto da dirirci d 'aucore, quindi urilizzatelo liberamente per studiare il e, ma noo pubblicatene alcuna
parre senza l'esplicito permesso da pane degli aurori e ddla casa editrice.

Obiettivi
Ogni capirolo inizia con la presenrazione degli Obiativi. Gli srudenci possono cos} sapere
in anticipo ci che andranne ad apprendere e, alla fine della l.errura del capitolo, porranno

verificare se hanno raggiunro o meno questi obiettivi.

PREFAZIONE

Xlii

Consigli e suggerimenti

d . 1 roo-rammazione per amcare glt srudenr1 a


. .
nguar ~udlla p 0iluppo di pr~grammi. Questi consigli
Il libro offre mola sugge:iro.en~1mporcann
J
e o sv
pi
r
e
Coilaua()
tip1c(),
En()re
Buo na abitudine
. . _L.
concenrrarst sug I asperu le sez10111
.
'

cn1amare
6 miti acrraverso
,,n;r 'enza, Qb,ettivo p()rtabilit, lngegnma del software.
. "JJ"''
Ob.u:mvo
o
vengono
a punto,
messa
.

ali"

B uona abitudine

interto!!Iammare e la.chiarezza, e
hi . . .
d li cniche er la scrittura
U concerro pi imporranre per c mma a p 0
P '
no delle sezioni Buona abitudine vengono pre_s~tare e e ~il'
di programmi chiari, comprensibili e pi. facilmente ges

I.

.
ono a
cen
linguaggio
nuovo
un
volta
rinia
r la
affr .
.
se:ion i Errore ti.pico ai urano gli
Le
Tucci gli sn1d;nt1 che
_.
. .,
com me ere re rrequencemen
stu.denri a evirare di commettere I Plll comun i.

Errore tipico

o~caeng~i ps~essi ~rrori.

Collaudo e messa a punto

Quesce seiioni forniscono consig~ circa le attivit di tese e debuggrng dei programmi C, anche a livello prevenavo.

b~e

Obienivo efficienza

c~rso

nosrr~b~pdC:~ti~U:~ l'obi~civo
.

nare

li studenri come scnvere programmi

pi imporrante di qualsiasi
alla
Jn.
, vogliono normalmenre im parare a scnve.
.
ch1an e compre.nst
h ti.l.izzino poca memoria,
l
di programmauone. Gli swdenu'. p~o, d.
. h
0 esegum i.n mo o ve oce~ c e u
. di comandi e che offrano presrazioni eccelre programrru
auntma quanut
. hi d c e ven?~
cb
. offion. o suggerimenti su come migliorare le
. . effic1enui
~o ~na
e neLe esezioni
Obiettl/Jo
lenti.
prestazioni dci propri programmi.

Il codice e gli esempi


Le funzionalit del C vengono preseruare nelJ'ambiro di programmi completi e funzionanti.
Ogni programma scguiro dalle immagini degli ourpuc che vengono prodotti, cosl che gli
studenti possano assicurarsi della corrc:rcezla _d ei risultati. I programmi presencati vanno da
poche linee di codke a esempi compo~ti da varie centinaia di righe. Gli studenti doVIebWeb http: \\ www. apogeonl1ne. com/ education I
bero scaricare cucco il codke dal
booksi te, eseguendo poi ogni progtnma via via che questo viene preseararo all'incemo
del resto.

~i.co

Obiettivo ponabilit

Al
un'applicazione e, questa
plementando
grammaron. pensano ehe,
di
cl' mente porta)I ile .su rurrn" ,,,.... p1'attfiorme' sforcunacamente, oon
1 pro
cun
b'L' , .: ... 0 gU sruden ti t scrivere: co ce
.
sta 11nme 1ara
di
do
1
sempre cost Le se-l.oni Obiettivo port4 .t..it:a a1u:3. .
tm:'

realmente portabile, fornendo inoltre i nfo~aztom su come


raggiungere quesco elevato livelJo di portabilit.

C .. ,

sia tn gra

Ingegneria del software

Figure e immagini
11 libro offre un'ampia variet di grafcj, immagini e outpuc di programmi. Nelle sezioni
dedicare alle srrua.ure di contrqllo_, per ciempio, appaiono vari diagrammi di flusso molto
ucili. [N()ta: l diagrammi di Busso non vengono presenrati come uno srrumenro di sviluppo, ma ricorriamo a- una breve presenra:iione basara su questi diagrammi per specificare le
singole: operazioni di ogni struttura di conrrolJo C.]

Llnguaggt~

efficacenell'ambiro della progerrazione del sofrware, e


.
.
d 0 in esame gli asper[i architetturali e
molto
Il C un
di sisremi software, specialmenre
le sezioni Ingegneria .del sofrwarulJ.ae pr~n o~
.
..
rea izzaz 1one
ali eh 1. flwscono s
e ~ su vasta scala Molce di quesre informazioni saranno unli agli
progerru
caso d1. s1.stem1
nel
studenri nei corsi pi avanzaci, olcre che nel mondo dd lavoro.

XJV

PREFAZIONE

Esercizi di autovalutazione

Capitolo 4 - I l controUo del programma: raffina le nozioni di programmazione smmuram

gr

.
d
~ Jibro propone moJci esercizi corredati di. risposte cos che
J sru ~ntJ po~~o prepararsi alle esercicaz.ioni vere e proprie. Gli sruden:ri d~ bb
vre ero essere incoraggiati a svolgere
turti questi esercizi di aucovalutazione.

.e .inrroduce altre srrurcwe di controllo; esamina in dettaglio l'icerazione e paragona i cidi


_conrrollaci da un contatore con quelli conrrollati da tm valore seminclla. La Struttura for
pres'enraca come uno strumento adatto a implementare i cicli conrroUati da un concarore.
Sono inrrodocre anche la scrumua di sele'Lione swi tch e quella di irerazione do /while. Il

Esercizi

spicola termina con una discussione sugli operatori. logici.

eh
. .
Ogni capirolo si conclude coo uo insieme di eserciz1 d.1
e permettono agli
vano tipo,
1 L . .
insegnanti di dart
..
ai:e e propne ez1onJ alle esigenze pa.rricolari di ogru' classe Cli
, a
esercm
.
. . ., .
verifica no I apprendimenro dei concett: d .
denri di scrivere singole istr . . . . . i el e1 re~mu:i1 ~JU imponanci, chiedono agli sruuz1oru> ptcco e porzioni di funzio . fun . .
z1oni e programmi
n1,
.
. .
.
ali

compled fino ad
arnvare a cos.i:ru21one di rnten progeru.

Indice analitico
al'
di
Alla Boe del Llbco possibile trov-ar
legge questo libro per la prima ~oJ~ ~~:t"'procgre~ttco. cchompl leco, molto ur~e s~a a chi
aron e o usa.no come nFenmento.

Panoramica sul libro


.
Capitolo i - Nozioni sulla elaborazione elettronica s .
. p1:ga cosa sono J compurer, come
funzionano e in che modo possono
essere programmaa. Questo capicolo introduce la
.
proo-rarnrru.zi
rivoiuzione n::e~~:;:u:~~:;';~t perch qu:sro insi~me di tecniche abbia favorito una
p~og~.rru:1 1 : TI capscolo offre una breve storia dello
sviluppo dei lingu di
.
cchin . r
programmazione, dai linguaggi
aggi
. a, ~J inguaggs assembly,
ai linguaggi di alco livello. ~ dis~ussa anche l'o . . d 1 rma
Il capicolo indude uo'inrrodl17.ione alI' b' agd1~e e mgu~o d1 programmazione C.
am ienre 1 programmazione del C.
fc .
.- .
Capitolo 2 - Introduzione alla P rogrammaz1one
.
d
m orrusce
un Lntro UZJOne Stnterica ai
.
programmi di SCrrtura. C e offie
aritmetiche del C Dopo ave . d'-:1 ((aeramento. derragltaro delle operazioni decisionali e
. r sltu . taro questo cap1mlo, lo scudcnce avr imparato a scrivere
rogrammi se 1" .
P
mp 1c1 ma comp ea.

::-:::ttu.rau:

.
. ,
.
Capitolo 3 - Lo sviluppo di pro
e pro~a?tlrnence_il capiro.lo pi impq.rtnte del testo, specialtnerrce
nozione di algoritmi (proced:e) p: 1 ? I te. srud<len.re di rnfo.rmaaca. Esso introduce la_
d il
r anso uz1one e1 problemi spiega 1"
unponam;a e .a
.'
.
d .
programmazione s1trurturara et I
1
abbt pro . ,llZto~ ~-pr~~tm-"! comprensibiJi, che siano
t ollaudabili e modifkaci e
~nz~onare c~rrettame.nte sin dal
primo tentcivd. Lotroduce anche 1::~~:;:r~ ~~~t
tro o on amenral1 della programma.
zione Strutrw:ata . ' l
(while). U capi;o%o~pj::a~ttmpr~ d1seque~za, seleud'one (ife if/else) e di iterazione
.
gramm.auone rop- own a raffinarne
t>

rm success1v1, una
.
ii
tecruca unporrance per produrre in.
mo o c:orrerro _programmi srrurrurari. Esso presenta u:n
popolare strumento di . - al1
. I
aiuto a progettazione dei programm
1, ov:ero~~ O pseudocodice
Strutturato. f metodi e gli approcci usaci nd C . j
aptto o 3 sooo applicab1l1 alla programma.
.
zione struttttrata in o . lin
capirolo aiuta lo scud~ce a ~~19 di pr.ogrammaz.ion~ n~~ s~lo a quella in C. Questo
programmazione che lo
prepareranno ad affrontare gli . ppa:~ ~elle buone ab1_rudin1
programmazione p1u consisten ti del resro dd
eserC1Z1
libro.

eh:

1/

.?1

---

xv

PaEEAZIONE

::e

--

Capitolo 5 - Le fum.io.ni: trarra della progettazione e co.scruzione dci moduli del programma. Il linguaggio include funzioni d i libreria sraodard., funzioni dclnice dal prograrnmarore, la ricorsione e la possibilit di effeccuare delle hiamace per valore. Le tecniche presentare sono essenziali per la produzione e la comprensione di programmi strutmrar.i,
specialmente di queUi pi.1 grandi, e del software elle i progmmmarori di sistemi e di
applieazioni svilupperanno pi probabilmente nelle app1icazioni del mondo reale. La srrategii\ "dividi e conquisr' presentata come un mezzo efficace per risolvere i problemi pi
mplessi; le fi.111?..ioni aiutano il programmatore a suddivide.re i programmi complessi in
compnenci pl.1 semplici d1e inceragiscono rra di.1Qru, Agli studenti piae avere a che fare
con i numeri tasuali e le simulazioni e apprez.zan.o la rrag;iz!one del gioco di dadi craps che
fu un uso eleganre d elle munure di conrrollo. il eap:irnlo offre una soHda inrroduzione alla
.r:ieorsione e include una tabella che riassume i 31 sropi ed esercizi s ulla ricorsione
distribuici nel resro del libro. Alcuni libri affrontano la ricorsione solo verso la loro fme,
.ma noi pensiamo che sia meglio trattare l'argomento in modo graduale Ilei corso di rutto il
lib.ro. I.:esceso gruppo di 39 esercizi p resenraco alla fine del Capitolo include vari proble.mi
clissici sulla ricorsione come le Torre d i Hanoi.

Capitolo 6 - L venoci: discure la srrurrurazione dei dari in vettor, cio gruppi di d ati
corrdaci dello stesso tipo. U capitolo presenra numerosi esempi sia sw verrori con un solo
indice che su quelli con indice doppio. .Limportanza della smmurazione dei dati ampramenre riconosciura al pari dell'utilizzo delle srmrrur~ di controllo nello sviluppo di programmi srrurruraci. Alcuni esempi del capimlo appr-ofondiscono varie tipiche elaborazioni
dei vettori, la scampa degli isrogrammi, la classificizlone dei dari, il passaggio dei verrori
alle funz ioni e UJn troduzione all'analisi dei sondaggi di opinione. Un pumo cararrerisrico
di questo capitolo un'accurata presentazione della ricerca binaria, un enorme miglioramemo di quella lineare. Gli esercizi alla fine del capitolo l.ocludono una vasca selezione di
probleini inreressanri e sti molanri , Questi includonQ t~niche di ordina.memo migliorare,
la progercaiione di un sis.cema di prenotaz.ion per linee aeree, W'l'incroduzione al concerto
d-efla Turtle Graphlc (resa famosa dal linguaggio LOGO) 'e i problemi del giro dd cavallo e
dlle otto regine che !rmoducono la nozione d i prog.rani.miliorle euristica, molto urilizzata
'
'
nel<::ampo deU'inrelligenza artificiale.

Capitlo 7 ~ T puntatori: prcsenra una delle caratteri_stich pi parenti del linguaggio C. U


capirolo fornisce spiegazioni dertagHace sugli operatori dej puncacori, sulla chiamata per
rifetimento, sulle espressioni con puntatori, sull'arirmerica d ei pumarori, sulla relazione
u:a. puntatori e vettori, sui venori d i puntarori e sui punracori a funzioni. GH esercizi del
capitolo includono una simulazione della classica gara tra.. la rarraruga e la lepre e vari
algoritmi per il mescolamento e la distribuzione delle cane. inclusa anche una speciale
s~one in.ncolara "Cosrruice il vostro computer", che spiega la programmazione in linguaggio macchina e prosegue con un progerto che ompreide-Ja progertazione e l'implemencazone di un simulatore che permerta al lecrore di sciivere e far funzionare i p rogrammi
sviluppati in linguaggio macchina. Questa caratteristica unica del libro sar ucile soprarruc-

XVI

PREFAZI01.~R

al I.errore che vorr ca~e i.l reale fuazio namc:nro dei compu
ter._Ai nostri srud~nci piace
questo progetto e spesso implementano sostanziali
mi<>li,oramenfr molri di questi sono
pJop0sci alJ'inrnrno degli eserci7.i. Nel Capitolo 12,
~'alua scri~ne spedale ~ider il
lerror; attraverso la_ cosrr~z.ione d_i un ompilamre;
il linguaggio macchina prodoa:o dal
compilator_e sar poi esegruto con il sirnularor di lingua
ggio macchina prodocco nel Capi~~

XVII

1:0

Capitolo g - l caratteri e le stringhe: mma dei prin.cipj


fondamenrali dell'elaborazione dei
da~i non n_umerid..n capitolo include una panoramica comp
leta delle funziohi per l'elabo r-az1one dei canlttcri e delle scrifilghe disponibili neUa libreri
a del C. Le tecnide discusse in
~uesro contesto sono ampiamnre utilizzate nello
sviluppo dj woi:d processor, software di
u;np~~~on~ e applicazin i per l'daboriiz.one del tesco.
Allo scudence piaceranno gli serC12J. sw luner1ck, sul~a gen~razione ~suale di
poesie, sulla o.nversione dall'inglese al pig
Launo, s~a. generazione d1 parole d1 sette lettere che
equivalgono a un numero telefonico
dato, sull allineamcnro dd test, sulla protez.ione dgLi
assegni, sulla scrirtura della cifra di
un assegno in lettere, sulla generazione del Codice Morse
, sulle co1wersioni metriche e
sulle lettere di sollecito. L'ultimo esercizio invirn lo stude
nte acl utilizzare un dizionacio
compute~aro per creare un generatore di
cruciverba!
Capitolo .9 - U, fo.rmattaz.ione ~ell'Input/Output:
presenta rurce le potenti capaci~ di
forma:n:az,1one di pnruf e scanf. D1scureremo ddle capac
it di formattaz.ione del I' oucpur ru
ftrintf, come l'<!.llorondamenm dci valori in virgola
mobile a un dato numero cli cifre
decimali, l'incolonnamemo dei numeri, l'allineamen
to a destra e a sinistra, l'inser.memo
di in.fi>rnurz,io~i letterali, la forzarura.del seg110 positivo,
la stampa degli zeri iniziili, l'uso
ddla .num.ra210ll esponenziale, !'a.So dei numeri oro
ed esadecimali e il controllo delle
dn~nsion~ di campo e dclla precisione. Dscureremo
tutte le scqunze di es~pe di princf
per 11 movtmeru:o del cursare, per la $rampa dei cararr
eri speciali e per la produzione di un
allarme acuscico. Esamineremo curce le possibilit di
formacta7.one dcll'inpm: di scanf incluso l'in?~t di spe~ifci tipi di dari e come ignorare
dei catatceri spedfci presenti sullo
scream. ~1 1:Pu:. D1s~uterern~ ru:r~ le :~pecifcbe di
conversione dj scanf per leggere i
n~e l.eamah, ottali, esdecJrnalt, in Vtrgola mobile,
i caratteri ed i valori di una srrin:ga.
D1scureremo della scansione dell' input in modo che
corrisponda (o meno) ai caratteri
udusi in un gruppo d:i stansione. Gli esercizi del capito
lo verificano virtualmenre rune le
eapacir di inpur/ourpur foananato.

C:apitoio 10 - ~ .stru~~' le ~on.i, le elaborazione de.i


bit: e Penumernzione: prcsenca
diverse caratterist1ch~ 1mporrana. Le srrucrure sono
come i record del Pascal e di alrri
linguaggi: esse raggruppano dati di ti.pi diversi. Le scrutt
ure sono usace rrcl Capi.colo 11 per
formare file composti da record di infonnazioru. Nel
Capitolo J 2 le srrurrure sono Wate
in~ieme ~ p~tacoci e ~H'allocazione dinamica d~lla memo
ria, per formare strutture dinamiche ru daa come le lisce concarenace, le code, Le pile
e gli alberi . Le union i consentno
~i utliiizare un'area di memoria per diversi cipi di daro
in tempi differenti; que.sra condiviSJ(>ne
ridurre. la ~uan~t di memoria principale o s~c::ndacia
richiesra da un prgramlllll'. Le. enumerazioru forlllScono un
modo conveniente per definire delle costanci simbolic:J:e u.rili; ci ai':11'4 a rendere i programmi pi amoesplica:r
ivi. te porenci capacit di manipola2~one dd b1c ~el C Consentono ai programmacori di
scrivere programmi thc USaD(1> Je
cap~c~t: a basso livilo dell'harclwate. Ci aiuca i progr
ammi ad elaborate ming he di bic,
ad .lmposcare a on o a off i singoli bit e ad immaga?:l.n
'are le informaz,ioui in modo pi
l':Ornparro. Tali capacit, spesso disponibili solo ne.i
linguaggi assembly di basso livello,

eu

sone parcicolarmence appr~te d~ programmar~~ ne.li.a


scrirrura ~i sofcware per i si.st_e~i
. elativi e per la gestione delle rea. Una caratte.nst1ca
cli questo captrolo la nuova vers10ope ad alra efficienza della
simulazione del me.scoIacore e dism'bmore di
n.
'
~ccellente opportunit per l'insegnante per porre L'nccento sulla qualit carre. '<-uesra e una
degli algorrrmi.
Ca:p1colo l1 - L'eJ.aborazione dei file: disc~re d~e. ~ecnic
he ~~are per .elaborare i file ~
st ad accesso se~uenz.ialc e casual e. Il
captto
lo
1111z1a
con
un 1D.rroduz1one alJa gerarchi.a
te
dei .dati: dai bic ai'-i byre, ai campi, ai recor d, aJ"f1le. S

' presenta~
ucccsswam
emc e.
una
semplice panoramica sui. file e sugli scream del C. I file
ad acces~o seql).e!1z1ale s~no discus:...
usando una serie dj ere programmi che mostrano
come aprue e h1udere 1 file, come
SJ
immagawinare i dari in modo sequenziale in un file e
.I .
come legge~~ i~ mo do sequeDZJa
e '.
dari da un file. Si discnre dei file ad ace.esso casuale usand
o una serie di quarrro pr.ogrammt
che mostrano come creare un file ad accesso ca5uale,
come leggere e se.rivere i dati con
acc~o q1.5uaJe, e c9me lcgge.i:e J daci in modo sequenziale
cl.a ~m file ad ~c~esso casual~. _li
quarto programma combina molce ce~ic he. ~ accesso.
ai .file, ~1a seque~7.1~ che ~asual.1, 1~
un programma completo per Felaboraz1one ~1 tr3:saz1on!.
Gli s~udenu ~ei nosa;i semm aa
indllscriali ci hanno detto che dopo aver studiato _il mater
iale suU elaboraz.1one dei file, sono
mci capaci di produrre programmi corposi per l'~abo
razione dati che sono stati immedi:i-iamente utili all'imerno delle loro aziende.
Capitolo 12 - Le strutt ure di dati: discute le ;ecnic
he usate P,er ~reare del!e scru~rure
dinamiche di dari. U capitolo inizia di.scurendo dc.Ile
strutture ncors1ve e deU aJ1ocaz.1o~e
din11IDica deUa memoria e pi:osegue con um discussione
su come_ creru:e e conserva:e van~
struuure dinamiche di dati come le lisce concareriace,
le code (o Ime di arcesa), le pile e gli
alberi. Per ogni tipo di struttura di dati presentiamo dei.
prgrammi funzion.anti e com~leti
e mosrciamo degli esempi di ourpuc. li Capirolo 12 c?nse
nce .aJl? s:'~enre di f.ad~on~ggiare
eff:ttivamence i punrarori. li capitolo include molu
esempi di ut1lnzo dell m,dirC'Z.lone e
della doppia indirei.ione (un concetto parcicolarrnenre
difficile). Uno dei problemi ~ega~
alJ'mifu.zo dei pumatori che gli studenti hanno difficolr a
visual iz~c le _srnmur~ ~ d:ia
e i1 modo in cw i loro nodi sone colJegaci, cos abbia
mo incluso delle illusrr:moru che
mostr:ll1> i collegamemi e la sequenza in cui essi sono
~reat:i. eesernpio d~'al~ero b~ari?
una stupenda pi~rra miliare per lo_scu~o d~i puncatn
e de.I.le ~rr~n~e ~che~ d~t1.
~qwo esempio crea un al~ero .bmano,' s1 pr~ccup.a
dell ~~mmaz_ione ~1 d~pl1ca~ e
mr.r-0duce l'attravcrsarnenco n comvo dell albero ID ordm
e anacrpaco, 1.0 ordine e m ordine
pOStjcipaco. Gli scudenri rirengono realmente esaustivo
lo sturuo e Fimplenient~ii.one . di
que5ro esempio e apprezzano in modo particolare il veder
e che l'~crrav~rsamemo ID ordine
dell' aJbero stampa i valori dei nudl nll'ordine stabil
ito. li tap1colo 11iclude un gruppo
consistente di esercizi. Rilevance la sezione specia
le "Cosrruite
Gli. eserci7.i ;iccompagnano lo studente nello sviluppo di un progril vosuo oompilacor:".
amma ~i con~ersiane
<4Jl;i notazione infissa a quella polacca i1wersa e di un progr
amma di valutazione di espressioni in norazione polacca inversa. Abbiamo qwndi modif
icatq l'algoritmo di v~u~zio.ne
di espressioni in notazione polacca inversa_ i~ m~do da poteI
g~ner~re un codice lll linguaggio macchina. 11 compilatore immagazzinCi 11 s.ud~
~no c~dic_e 1~ un f~ (usand~ Le
teenich.e del capitolo 11). Gli studenti ~ono qw.nd
1 il co~ce 1n ~ngua~o macch_ina
prodotto dai loro compilatori suJ simulatore di sofcware
cosrru1co negli esercm del Capi colo 71
Capit olo 13 - 11 preprocessore: offre una ruscussion
e denagLla:a ~elle direa ive del
pteprocssore. TI e,ipicolo inqud e informazionj pi comp
iere sulla duert1va #inc lude che

XVIII
I

PREFAZIONE

I
induce l'inclusione d.i una copia di un file specificato in sosciruzione della direrriva, prima
che il 6le sia compilarn, e sulla direttiva #defil"le che definisce deUe cosrant! simboliche e
delle macro. Il capitolo spiega la c9mp1azione condiziona~a per conscnd.re aJ progran1matore di concrollare l'esecU7.ione delle dirercive del preprocessore e la compilazione dcl codice del pr0gramma. Si parla dell'operacore # che converreil suo operando io unasrringa e
dell'operatore ## che concarena due token. Sono presentate le cinque coscanri simboliche
LLINE_. _FILE_. _DATE_, _TIME_ e_STDC_J. AJla fine rracma la macro
assert del fle d.i incesrazione assert. h. Ac;sert preziosa nel collaudo, la messa a puDto,
la verif:ca e la convalida del programma.
Capitolo 14 - Argomenti avanzati: prescnca vari argomenti avanzaci che di solito non sono
.affrontaci nei <:orsi introduttivi. La sezione 14.2 mosrra come redireiionare l'input di un
programma in modo che provenga da un file, come redirezionare I'ourpuc i.o .modo che sia
immagaz.z.inaco in un file, come redirezionare l'oucpuc di un programmain modo che vada
a costitu ire l'iopm di un alrro programma (piping) e come accodare l'ourput di un programma ad un file gi esistente. La sezione 14.3 discute di come sviluppa.re funi.ioni che
usano elenchi va.ria.bili di ai:gomenri. La .sezione 14.4 tnostra in che modo gli irgomend
della riga di comando possano essere passati alla funzione main e come urilizzali all'interno
di w1 programma. La sezione 14.5 craaa della compilazione di programmi i cui componenti possono es5ere discribuici in vari file. la sc:z.ione 14.6 discute della registrazione delle
funzioni con acexit io modo che possano essere eseguite al teanine dell'~euziooe di un
programma e come terminare l'esecuzione di un programma con la funzione. exir. La
se~i~ne 14.7 discute dci qualifcaroci di tip0 consce vola:cile. La sezione 14..8 moma come
speclfiare il tipo di tU1a costante 11l1Illerica, usando dei suffissi per gli inreri e i numeri in
virgola mobile. L;i sezione L4.9 crarca dei file binaci dell'uso dei file remporaoei. La
sezione 14.10 mostra come usare la libreria per Ja gestione dei segnali per inrercerrare degli
eventi inamsi. La sezione 14.11 discute della creazione e dell'uso dei veccori dinamici con
le funzioni calloc e realloc.
Moire Appe:Cidit;i forniscono un -valldo materiak di riferimento. In parricolare, ndrAppen.dice A fomiam~ la sinrassi del Lin.gu.aggi0 C; nell'Appendice B un cle.oco commeJltai:o di turce le-funzioni della libreria standard dcl C; nell'Appendice Cuna cabeUa compleca
della priorit e dell'associarivit degli operacori; ndl'Appendice D l'insieme dei codici dei
cararrc ASCII e. nell'Appendice E, una discussione sui sistemi numerici binari, ottali,
decimali ed esadecimali. CAppeod.ice J3 scara escratta dal documento deU'ANSI standard
con l'esplicito permesso scritto dell'American Narional Srandards Insrirure; la suddccra
appendice fornisce un riferimenro-vfili4o e dertagliam per l'esercitazione del programmatore C. tAppendit E una spiegazione compleca dei sistemi numerici, che include molti
esercizi di auro-valutazione e le relarive risposte.
Vi preghiamo di inviarci i vostri coilllilenti, suggerimenti, critiche e correzioni, al f ne
di migliorare ulteriormente questo libro. e indirizzo a cui scriverci il segueme:
deitel~deitel.com

Bene, pet ota rutto. Vi rinnovi;imo il benvenuto nel mondo del C e dcllo sviluppo
delle applicazioni clel futuro. Buona fortuna e buon lavoro!
Harvcy M. Deitel - Paul

J. Dcirel

CAPITOLO

Nozioni sulla elaboraz ione


elettron ica
Obiettivi
Comprendere le nozioni elementruirelative ai computer.
Familiarizzare con i diversi tipi di linguaggi di programmazione.
Conoscere la sroria del.linguaggio di programmazione C.
Venire a conoscenza.della libreria standard delC.
ComprendereJ'ambienredisviluppo dei programmi C.

1.1

Apprezzare le ragioni per le quali appropriato apprendere il C in un primo corso di


program.maz.ionc.
Apprezzare le ragioni pe.r le guaii il C fornisce lehasi fondamentafj per i succ:essivi scudi
sulla p.r<ignim mazione, lii generale, e sul C++ .in particolare.

Introduzione

Benvenuti n.d mondo del C! Abbiamo lavorato dmamente per creare quella che, speriamo
sinceramente, sar per voi una esperienza inform::rdva_ e divertente. Il e un linguaggio
difficile che nMmalmeme insegnato soltanto ai pr9gram.matori esper, perci questo
libro unko ua quelli sul C:

adacco a chi ha u11a conoscenza tecnica, ma ha poea o nessuna esperienza di programmazi0ne.


adatto aiprogrammacor esperti che desidera.no una rran:u.ione rigorosa e approfondita
del linguaggio.
Come pu un libro piacere a entrambi i gruppi? La cisposca che il libro cofucizza il
raggiungimento della chiarezza del programma, actraverso le provare tecniche di "programmazione srrurruraca". QueUi che non sono ancora dei programmacori impareranno sin
dal.l'inizio il modo "giusco". Abbiamo ce:ncaco d i scrivere in un modo chiaro e diretto. Il
libro abbondanremente illuscrato. Cosa p robabilmente anche pi imponame, il libro
presenta U!l enorme numero d.i programmi
nm7..i:nanci e mosrra gli output (risultaci)
prodotci, quando quesci programmi sono esegui.ti su un computer.

l primi quattro capitoli introducono i principi della elaborazione elemooica, la programmazione dei computer e il linguaggio C. Le discussioni sono corredare da una incroduz.ione alla pm~rarnmazione dei c0mputer, usando fapproccio srruccurato. I prindpian

CAPITOLO l

che hnno st;guiti i no:m:i <;mj ci haum:> a_ssicumo eh.e il materiale di questi c:apitoli
:fumjs_e una silid;i b_a.se per l'approfo-i:+!imerrro del C svilupp.ato nei Capiqll dal 5 al 14..
Di solito, l prog1:ammatri esp~rci leggeratu10 vclCenJf'.ne i primi quattrc:i cmpicoli e scoprii::ann0 in seguiti'.> che il e tnttCato nci Capitoli dl 5 al l'4 fil rilo.d.l r~goroso e~ a.!Je
stesso remp, in:.rSsarrce. &si apprez.?..eranno in modb parri~.l.3.r~ i cipir6li avanzati, con
la 101:0 ttatr-.izio ne dercagliata dei . puntateri, delle striflghe; dei. fil.e e delle s.rruttDX:e di dati.
.Molri pi:ogra.ril.rti:tori speru ci h:an:uo riferito Il loro a.pp:rez.zaniemo i;er la nqstra
di:scu-&sione. sulla progra.tll.Iili4ione stturrurarn. Per quanto ave~cr-0~.togratlJ.Ula.t;o sp~s in
un linguaggi@ strunuraro come il Pa.Sc.I, non erano ili gradg di sciivre il miglior mdice
possibile (?rch non avevano .mai conosciuto in modo formale la programmat.ione srrutturara. Ora, d9p9 a:vr .imparam il C da quesrq libro, hanno la possibilka di mLgliofare il
p~opriq stile d.l pr.gr.ammazio_
ne. Per oli, che siate dei prinjpianti e;> dei pr9grammaT<,ffi
esperti, in qu~o libro ci serio .niolre q:se cl1e potran.IlQ inf9nu:arvi, diverciwi e sti:milarv:i.
,Molti hanno familia:rir con le cose interflSsanti che i compurer sono in grado di fare.
In q.Uesto ors_Q, imparerete a: Goma.nda.rn i ompur.e:c P,erch !facciano quelle cose. il
so_frtP,41e (Q'vveJ:Q~~a, le istrn,7. tOni eh~ vgl stiv~re rei: qrdinare al C.Omp.uter dJ ~seguJ re delle
~eo.:i e ptend~re ddle deci$-ioni) ~be GoQtr{')IJa i o;\U_p.l.[cer. (dettispess_p, hartl;ti.1,4r~) . e il C'
oggigiomo urro dei.:-lingua_ggi dJ f?Ie&faill.maz.in,e pi pop9la.ci. Qu,es-i;o testo fo.rp.istte un.a
i.iirioduzione alla _progmtnazioe dell'ANSI C, la .versione sfand.ard.iizata. nel 198.9 Ji,egll
StatiUhici dall'lstituto N'azionale Americano per gli Standard (AN.SI). e-, nl re.Sto deLriion~~ claJJfO.rganizzazi_one [ncemazionale per gli St~dard (ISO) .

Emilino dei computer sca crescendo in q_urud rutti i cam_pl delle arrivic W.n;til. In
un'.crn:,di. cosri cosfamememe in cre5Cita, quelli della elaborafilone lettionicasono. dimnuici verrlgin osamG11te, a ca~sa degli impress.fonanri sviluppi deUa cecnologia hardware e
sqF.twa:rG. Qu~i c-Q:mp.u~ el:!, 5~0 25 anni fa, po-i:evll.!10 riemi;>ire grandi stanze e costavano
ntiUol di dQllar4 Qggi pq~.On() ..essere pi;odott su lamine qi silici<:.> (hip) pi pl~le Q.i
Un'unghia, eh~ Gpsrape.fors'e.. pochi doll;ui Itonicamen~e, il siUci.o uno dei mare.ciali pi
ahB.ortdand ~uH teri:-at un i..ngtedi~~.nte dcl.la. s~bbi_a c.rtH1ne. b :rec-nol9gia dl ch.ie j.i
silicici ha -res0 l'dab0:razion'e demonica cosl econo.miGi. cli~. 1P rutto il Jttndo, sorr9 iJl Liso
cenci~aia di milioni di, com.pucer general ~purpse (per stopi generjci), .a.itttando la gente
negli affari, ndl'indusrria, nel goveino e nelie loro virn personali, che potrebbero facilmenre .ra_M9ppiars.:i io una ;manciac.a c4_
anni.

PuO'..il Q esse.te ..illiegnam in 1Jil pmno <::O.tS0 di programmaiionc~ ovve.r.sia adart;o al.
pubblGo; a cui si riv.olge questo libro? Noi c1.:ediamo di sl. Qwilne arino fa. :?])oifuho
accertato questa sfida, q_ua.ndo il lingaggi0 affermaco nei primi corsi di informarica era il
P,ascal. ~biamo se.ritto C Boli! To Pr_ogram~ k prima: edizine d i que.to esco, e 0eminaia
li up.iyr.si~~ in ;tuq-q. iJ m.onc;lo lo haf.1.no LJtiliZ?<aro. [ cQr.si b<!-:saci ~u quel libro hatu;l-p
d.i:mqs'tr-are di esser~ lC::af"i tanto qu.;tn,ta i, lo.re predeces59ci ba~ari suLPas.oal. N!!>.n $pno
smre sse~are 'cl:ifferenze: significmiv~ eccettO d1i.gli l!l'Ud~ti ~<;i.no m<:gli~ ~'ociyari, perch S'ilino rle .nei 10.ro fusi di livello superiore e nelle proJJ.tie aa.rrie.re;. use.ranno. con
maggior probabil i.e~ iJ C die non il Pascal. m i studenti Ghe appiendon il C sann anhe
ehe sarannomegHo preparaci ad apprendere velocemente-il C++.Il C+.+ una sevrascruuura
dl. 'G, ci'VOlt<} ai prGgr.arn.Qlatqri che vogUono s~vc;re pr<;>grammi q_ri~rati agLi oggerri.
"Oil"e~O quaJ~QSci Jn pi.t sul C+t neU~ S.ezfon~ l.1 4,
1

N~NISUilA ELABOR,AZJONE ELE:ITRON.LCt\

!fn funomeno imeressame, che ~i $J:a: veritc_ando .nel mrcaco dei linguaggi di programmaz.iq_.ne, t che molti dei fornitoci prineipali, piuttli)Sto che offrire .~~ prodorti s,e pa.raci,

b ve-nd.n: semplicemente. un CYC++, eo.qibinate. Ci d. al)..'uf:.nc(!, se lo desi.de(a, , la


posiibill~'&. ~mitn.rare a prqgta)1i1.n.;i.re in Ce di n:iigrare 15radualme.n~e al C++, quando .lo
.ii teu op.poi;:i:u.Qp,
S~.J;e" 4!mque per intraprender un p.erQrso i.ntel'~S!lftre e, s~riamo~ ~munerac:ivo.
proi;:eder~~. se :v.orrece;c::omuuicit'e tron noi, inviateci una email su Tritemer

"M:ai:l rifa:ti' cbe

>allhdi'rim'o d.eitel~(le.i.tel . com. F:remo rutro i l possibile per rispondrv.i vd0cememe.


Buona fO.l'run.a!

l.2

Che cosa un computer?

tJ'.n (fPPJJu'tgr un d.isp0,si~ivq in ,gradQ di ~egw.re. dei ca.leali e di p-repdere dcl) decisiQn.i,
logj;~.Q.~, jJ cuct0 a una veloeit~ superiote cl.i .milioni e a nch~ .nii.liai:-di d..i -voke a quella degli
~~ti umani. Oggi per ese:oipi:o, ril.olti persona! computer possono eseguire decine di
:mili0'fi'.i ili ~rd d.izion:i per sec.nd.6. Una persona che operi a una calcolarrice- da tav:olo
;p&tEebbe. av.er Disogho di deGenni 1 per COIDj>le-tare lo Stesso llWttero di ~q:>lj cil.e un
p~onal computer pu e.seguire in un secqnd.o. (Punto li illlessione: ~ome potres.te sap~re
'S,'e.:G ,pers~maJ1a.sommato correra,mente..i numeci? Com pocr~'t~.sapre se il oropure'r ha
s<:>ftllillir/ ~Q.cr~tQliileme i nurner.Ln . [ superconputer pi~1 vdoci oggi possono ~guire ceu~tta:U. di rnilia1:di di addiziori'i pi' seCt'.fodo: aJJ'in<;:i.r<::a quanto i alcoli che nrinaia di
llllgliaia :i p~due -pottebbero eseguire in un anno! E nei lbraror1 di ricera stanno gi
filn'iionanlo computer i n grado l.i segufre migliaiadi miliardi di, iscruzioui per secondo.

:r

'CQJUpute.x ~labo.ran.o i dati serto il co.ilrrollo di i.risiemi tli ism.izion.i c.h.ia:mati


pfefl!l!,.mtn.'iper'coiftpz;ter. Tali programmi guidano il cc>mpurer per mezzo di insiemi ordinaci dkai'i.on1. specific:;ati da persone. chiamare prof!t11hrhatiJ1i di computer..
I va.ci disposici:'ti che t:P.mp,_ongt>no. un sisc~tn di cpmpurer (m'e la rastiers., lo sdierJn~, i.~~. lameii;loria, e l'uniT di da.b.e r_
azione)-sono chiamaci co-mplssiyanience.hardware.
1 Ift~i che p0.$Sono ~sete ~e-gu.i.ti su ll'.ll C.Om.puter s.6ne. ch.ia.n'lati >'oftware. Il costo
n;ll'Jia.fdware diminuite >T&riginosamn-te negli ukimi anni, al punto che il personal
l>o.fu~ucer diventato un oggerro di uso comune. Sforrunata.meme, i cosci di ~ilupp<;> del
skw<,U;e.sono andati aurmmcando costan~em:e .mah ma.np che i pr~grarn.maroti hanno
svil~gpat([l iip,plii_qni sempr.e' pi potenti e omplesse, SltIIZ:1. peraltro. esser:~ capaci d i
Qctea.ere un .II)..glioramento orrispo.nd!!nre .nella tecnok~gia di sviluppo del softww. In
SJ,~t<:l libro, iinparerer metodi di Sviluppo cl,el sl)frw.are the ne ciduc;on0 sesr.anz,ialme.nte
i'*1S:d e ac~lerano iJ processo di SYiluppo d:i applicazioni softwar:e porn e di alta qualit.
.Q._l!.lesti merodj ..i.nclodono -la priJgratnrtJ.azio.ne StrUftt.f,rata, la pro.grarn.mazione top4!J.wnj n!f. r.affinamenfi suGcessivi; la progr:ammttzione modulzzre.

1.3' L'organizzazione del computer


fu'dtpe,nden:cem.!5nt dalle diffeteil.ri ;appal'eiize foi~he, ogni rompueer pu e.sser.e virtualm~i:e (;nepito .come s.ttddivi.so in sei unit. logiche o seZioni. Qusre sono:
1.

CFnit di irtp1J.t (ingresso t/i dati). Qu~ra la sezi.Qne ~'cev:enre" d~ ~ompu.cer. Es.~a c:tiene
in~r~oni (dari e.progi:a.mmi per il c0mputeJ) da y.r.i t/ispositivi di i'!:ipu.te. mene .queste
Jofomiai.i.on~ a dispqsi2iane delle altre unit, in modo che possano essere el.abrare. La

WlfOLO l

maggior pane delle infoanazion.i o~gigiomo '.mmessa nei computer arrravcrso una
tasriera simile a quella di una ma:ccbina per scnvere.
2. Unit di output (uscita di doti). Quesra la sezione di "spc~io~e" d~I co.m~ute~..~~~
tende l'informa2ione che stara_el;i.borata dal computer e lauw1aa diversi dtspo~i~tn a:t
Offtpiit. lll modo da render.la disponi.bile per r utilit.'ZO all'escemo del c9mpurer, Ogg1g1or.o
la m~gg!or parte delle informazi0ni invi.ara all'escerno dei mmpu.rer amavcl'so la visualizzazione sullo schermo o la srampa su carta.
3. Unit di memoria. Questa l"3. scz1one di "magazzino" coo aecesso rapido e ~apaci r
cdvamenre bassa dd computer. Essa conserva Le informazion.i che sono state immesse
arn'averso l'unit di inpur, in m<:>do che possano essere rese irnmediai:a.mente ~is~oni
bili quando saranno necessarie. "Lunir_di memoria consei:va ~nch~ l~ 1nf~r;n:iz1.oni che
sono gi srare elaborare, Enran t che; possano ancora essere mvi~te :u dispos10v1 di ouc_pm
dalla corrispondente unit. L'unit di memoria spesso chiamata anche memorut o

memori prima.ria.
4. Unit aritmetica e /.Qgictt (ALU). Ques!"l la sezione di "produzi~ne'.' d.el con~p ucer..

resp~nsabile dell'esecU'iione dei calcoli c~m~ I~ sori:n:e, le som3.Z.10nt, le molnp kaz10ni e le divisioni. Essa conciene i me.cdill1Sm1 di decisione cbe con~enrono al compucer,
per esempio, di confrontare due demenci p relevaci dalla un.i~ cli memoria, per determinare se sono uguali oppure no.
5. Unit di elaborazione centrale (CPU). Questa la se:Vone "amminisu:aciv' del compu~
tee. E il coordinatore del computer ed responsabile della supe.rvis.ione ?er ~e ope~on~
delle altre sezioni. La CPU indig alla unit di input il momemo m cru Le 1nformauon1
dovnnno essere lerre nella uni(3 di ~emoria, indica alla ALU. il momento in cui le
ia.formazinl della memoria dovr:i.n9 essere uriliz.zate per i cakli, e indica alla UJ1ir
diomput jJ momento in cilldovr inviare le informazioni dalla unit cl.i memoria a certi
di.sposiv:i di output.
6. Unim di memoria second(lria: Questa la sezione di "magamino" a lungo termine e.con
alu capacit de.I cqmpurer. l programmi e i dati, ~e in ~n certo ~on~e~iro o.on sono
utiliztari dalle altre unir, saranno normalmenre s1sceman su un d1sposiuvo d1 .memoria secondaria (come i dischi), finch non saranno nuovamem:e necessari; probabilmenre
ore, ?iorni, mesj o anche anni pi tardi.

1.4

l!elaborazione batch, la multiprogrammazione


e il timesharing

I primi ompucer erano in grado di ese;guire sciltai;ico un Jo.b (processo) e un. task (lavoro) alla
volta. Questo modo di operare dei computer spesso chiamato tlaboraztone batch (e.labo~

razione a l/Jtti) .mOnOUCCnte. U compurer esegue. un solo progra.nula_per volt.a,, menc::e I da~
sono laboc-ati in gruppi ossia batch. [n questi p~imi ~istern.i, .g~eralmenre, gli ucenc~
sottoponevano i loro processi al centto di elab?raz~one. Ln mazz~ di sche_dc perforare: ~~
ucemi dovevano spesso aspettare ore, o anche g1orru, puma che i tabulau fossero resmum
alle loro scrivanie.
Man roano che i compurer son9_diveucaci pi potenti, si reso evidente cbe l'elabora~
zione barch mn<:>utence ucilizw.v_a r;rrameme in modo efficiente le risorse del computer. S1
p~ guiudi dj fare i.n mode che molti processi o lavofi .pc;>ressern conJ_ividere (share) le
risorse del eoroputcr per ottenerne un miglior utilizzo.. Questo modo di operare decro

N OZIONI SULLA EJ..ABORAZ.lONEELErTRONlCA

mtdtiprogrammnzione. La mulciprogrammaz.ione richiede l'elaborazione "simultanea" dimolci


processi sul computer: questo, in altre parole, condivid,_e le proprie risorse tra i vari processi che comperano per la sua actenzione.. Con i primi sistemi in multiprogrammazione
perii gli urn,ri dovevano ancora sorroporu i processi su mazzi d sched.e perforate e
attendere ore o giorni per i risultati.
Negli anni '60, 1110ki gruppi indusrriali e le u nivenfrm esplorarono il concrro di tirne.shari1zg
(co,tdiJJisione del tempo). JI rimesharing un caso speciale di mulprogrammazione per
mezzo del quale gli urenti accedono al compurer arrraverso dispositivi di input/ourpur o

terminali. In un tipico sistema di compucer in rimesharing, pocrcbbero esserci dozzine o


anche centinaia di ucenci che condividono conremp<;>raneamenre il computer. In realr, il
compurer non serve rnrci gli urenti in modo simulra:n~o. Esso esegue piurrosto una piccola
p.o.rz.iooe del processo di un utente e in seguire prese-a il proprio servizio all'urence successlvo, Il compurer fa rutto ci cos) velocemente che, in un secondo, in grado di fornire
moire volre il proprio SCJVZO a ogni u rente. In questo modo gli urenti s,mb1ano essr
serv.iti si111 uItaneam.enrn.

1.5

l!elaborazione personale, distribuita e client/server

Nel 1977, la Appie Computer rese popolare il fenomeno della elaborazione pmonale. Al
principio, questa era il sogno di ogni hobbisra. l computer divennero abbastanza ecinomiei perch la genre potesse comprarli per il proprio uso personale o per i propr1 affari. Nel
1981 , la TBM, il maggior fornico re di comp urer nel mondo, imrodusse il
Persona! Compmer IBM. L'elaborazione personale, lerreralmenre nel giro di una -nme,
divent legirtima negli affari, nell'indumia e nelle 01:gani:a.azioni governative.
Questi computer ~ralio per delle unir "indipn.d.emi": la gente eseguiva il propri0
sulla propria maccltlna e quindi rraspo.n:ava avami ediecro dei disch i, per condividere lt: ioformabioni. Per quanro i primi personal compmer non fossero abbastanza potenti
da gestire molti urenti in timeshacing, quesre macchine potevano per essere collegate
insieme in reri di compurer; a volte su linee telefoniche e a volte in re locali all'imenio di
una organizzazione. Ci ha portaco al fenomeno della dnborazione distribuita, in cui il
Garico di daborazione di una organ.iu.azione, invece di essere eseguito necessariamente in
qualche insrallazione centrale di compurer, distribuito attraverso le reci alle varie posrazioni
in cui vjcne svolto effertivmeme il lavoro. I personal compurer erano sufficientemente
potenti da gesrire Le richieste di elaborazione di urenti individuali e le fondamentali atti_vir
della comunicazione: passare avami e indietro le infonnazioni in forma c:leruonica.
b~0to

Oggigiorno, i persona! compucer pii1 poremi lo sono tanto quanto le macchine da un


milione di dollari di solo dieci anni fu. Le macchine desktop (da cavolo) pi porenci_ (dette
workstation) forniscono ai singoli ucenci delle capacit enorrn.i. I.;informazione . facilmente
condivisa artraversole rr:i dicomputer, nelle quali alcunt.macchine, derrefile server (fornitori
di servizi. per i file). offrono un magazzino comune di programmi e dati che pu essere
utilizzato da macchine client (clienti) d isrribuire in runa la rece; da cu i il rennine
elaborazione cliem/server. Il e e il C++ sono divem:aci i limmaggi di programmazione scelti
_pe,r scrivere il software dei siscem.i operacivi, delle reti c;mpmer e deUe applicazioni
distribuire in ambiemi cliem/serv.er.

dl

CAPITOLO

1.6

I linguaggi maccbjna, assembly e di alto livello.

I programmatori scrivono le iscruzi0 niin vari linguaggi <li programma2iooe, alcuni <liretta:
mente comprensibili dal compucer e alrriche richiedono dei passi inrermedi di traduzione.
Oggigiorno si utilizzano centinaia di linguaggi ptt i computer. Questi possono essere sud
divisi in rre categorie generali:
1. Linguaggi macchina

2. Linguaggi assembly
3. Linguaggi di alro livello
Ogni computer pu comprendere direttamente s0 ltanco il proprio linguaggio macchina.
Il linguaggio macchina la "lingua naturale" di un particolare computer. Esso stretta.mente correlaro con la p.rogertazione deUtli.ardware del computer. I Linguaggi macchina cons1stono generalmenre di sequenze di numeri (riducibili in defniciva a successfoni di l e )
che ordinano ai compurer di eseguire, una per volta, le loro operazioni pi elemen~ari. I
L~nguaggi macchina dipe1~d-0no dalla ma:cchin4: in altre parole, un parrkolare linguaggio
macchina pu essere ucillzuuo solrantQ..su un tipo cli compm:er. l linguaggi macchina sono
scomodi per gli esseri wnani, com.e si pu vedert: dal seguente frammento di programma
in linguaggio macchina, che aggiunge la paga degli st:raordina.ri a quella base e immagazzina il risuJraco nella paga lorda.

+1300042774
+1400593419
+1200274027

Man mano che i compurer sono diventaci pi popolari, e divenuto evidente che la
programmazione in linguaggio macchina era semplicememe troppo lenca e noiosa per Ja
maggior pane dei programmatori. Invece di us.are le sequenze di numeri che i computer
potevano capire di.rettameme, i programmatori cominciarono a usare delle abbreviazioni
simili all' inglese, per rappresenrare le oper:az:ioni elementari del compurer. Tali abbreviazioni formarono le basi per> i linguaggi assembly. Furono sviluppa dei programmi traduttor,
chiamaci assembler (assemblatori), per convenire in linguaggio macchina, alla velocit del
computer, i programmi sericei in linguaggio assembly. Anche il seguente frammento di
programma i.o !Jnguaggio assembly ~ggiunge la paga degli straordinari a quella base e immagazzina il risultato nella paga lorda, .ma in modo pi chiaro del suo equivalente in
linguaggio macchina:

LOAD
ADD
STORE

BASEPAY
OVERPAY
GROSSPAY

I:utilizzo dei computer aumen rapjdamentecon l'avvento de.i linguaggi assembly, ma


questi richiedevano ancora molte iscruzrni per eseguire anche il pi semplice dei compiri.
Per accelerare il processo di pmgramm.a:zione, furono sviluppaci dei Linguaggi di 11/UJ Li'l!e!Jo
in cui si poteva scrivere una singqla istruzione per eseguire un compico essenziale. I programmi cradurtori, che convertono in linguaggio macchina il codice scritto io quello di alto
livello, sono cb.iama compilatori. l linguaggi di alro Livello consentono ai programmatori
di scrivere delle istruzioni, che sembr:i.no quas.i simili all'inglese di ogni giorno e contengono le notazioni matematiche urilizzare comunememe. Un programma per la busca paga
scrirto in un linguaggio di alto livello porrebbe conrenere una isrruzione come:

..

N QZt!ONl Sl!J[l.,/\ EIA130RJ\ZIONE BLETI'RONlCA

grossPay = basePay

overTirnePay

Ovviamente dal punto di vista dei programrnamci, i lingaggi di alto livello sono molro
pi desiderabili, in confronco ai linguaggi macchina o a quelli assembly. li C e il C++ sono
rra j pi potenti e pi diffusamente utilizzati lingua!W di alto livello.

1.7

La storia del

Il C si evoluto da due precedenti linguaggi: il BCPL e il B. li BCPL fu sviluppato da

Martin Richards, nd 1967, come un linguaggio per srive.re il sofrware de.i sistemi operativi e dei compilatori. Kcn Thompson prese a modello il -SCPL, per moire cararce.cistiche
el suo Jinguaggio B, e us B per creare le prime vrsieni del sistema operacivo UNlX nei
Beli Laboracories, nel 1970, su un computer DEC PDP-7. 11 BCPL e il B erano linguaggi
"non tipizzati": ogni unit di .informazione occupava una "word" (parola) nella memoria e,
per esempio, l'onere di considerare un dato come un numero imero o come uno reale
dt!deva sulle spalle del programmarore.
TI Linguaggio C fu 1.ma.evoluzione del B sviluppara da Dennis Ricchi.e, .nei Be.LI Laboratorics,
-e tii implemenraro originariamente su un computer DEC PDP-11, nel 1972. li C ini'~al
menre divenne famoso come il linguaggio in cui era ~t:ato sviluppato il sistema operacvo
l.il$llX. Oggi, sono scritti in Ce/o in C++ quasi rurri i principa!J sistemi operavi dell'ultima. generazione. Negli ultimi vent'anni, il C divenrato disponibile sulla maggior parre
dei compurer.11 C indipendence dall'hardware. Con una progcrra.zione arrenca, possibile scrive.re in dei programmi che siano portabili sulla maggfor parre de.i computer. "
utilizza molti imporrami conceni del BCPL e del B, mentre aggiunge la cipizzazione dei
dari e altre potenci caratteristiche.

Dagli ulrimi anni '70, il C si evoluro io quello che oggi chiamato "C tradizionale".
La pubblicazione, nel l 978, del libro di Kernighan e Rirdiie,1/ linguaggio di programmazione C,
ha arraro moire artenzioni su questo linguaggio. Quesra pubblicazione diventata, in
cam,po informacico, uno dci libri di maggior successo di cucci i rempi.

La rapida espansione dd C sui diversi cipi di computer (detci, a voi ce, piattaforme hardware)
ha prodotto molte varlanci. Queste erano simili, ma spesso incompatibili. Ci rappresentava un problema serio per i programmarori, che avevano bisogno di sviluppare un codice

-che potesse girare su piarcaforme diverse. Divenne allora evideme che era necessaria una
'!~fS.ione standard del C. Nel J983, per "fornire una de.fi.n.i.zione dd Linguaggjo che non

tli>sse ambigua, e die fosse indipendente dalle machine", si cre U com.itaro tecnico X3J 11 ,
lle'Clif:'>eni:lenze del Com itato Nazionale Ame.tic(!.no pef gli Scan<:lard dei Compurer e l'Ela-

bofazfone della lnformazione (X3). Lo standard fu a.pprcivaro nel 1989. Il documento si


chiama ANSI/ISO 9899: l 990. Copie di qtLesto docum.mb possono essere richieste al~
L'lstituco Nazionale Americano per gli Standard, il cui indirizzo riporcam nella. Prefazione
di quesro cesto. La seconda edizione del libro d i Kernighan e Ritchie, pubbUcaca nel 1988,
:riflecre questa versione, chiamara ANSI C. usata ancora oggi in cucco il mondo (Ke88).

Obiettit10 porrabiLit I. I
Dato che il C un linguaggio indipendente dagli hardware ed largammte diffuso. le
applicazioni scritte in C possono essere ese~ite, ccn poche o nessuna modifica, .m una
vasta gamrna di sistemi di computer differenti.

CAPl'l'OLO 1

N @ZIONI SULLA ELADOtMZ IONE cLEn"RNtcA

~=-\:] \: .'] ~
lf>;,911't+t. ~

1,;f ;i. ~'lo )(',)

..~,; ,t.

r>..}1

1.8

La libreria standard del

1 programmi scricti in e, come apprenderete nel Cai;>itolo 5, consisrooo di moduli o peni


chiamati funzioni. Voi porrcce programmar~ tu.ree le funzioni di cui avrere bisogno per
scrivere un programma c. ma la maggior: pane dei programmatori
traggono vantaggio
da una ricca collezione di funzioni gi esisremi, chiamata libreria standard del C. Di conseguem.a, ci sono in realt due asperri del "mondo" del e da jmparare. li primo imparare
il linguaggio C in s, menrre il secondo imparare a utilizzare Je funzioni dclla libreria
standard del C. Nel corso di questo libro, parleremo di molte dj quelle funzioni. l.:Appenruce B
(condensara e adartata a partire dallo stesso documenro dello srandard ANSI C) elenca
runele funz.ioni disponibili nella libreria standard del C. il libro di Plauger (Pl 92) dovrebbe essere letto dai programmatori d1e abbiano bisogno di una profonda conoscenza delle
funzioni incl.use nella libreria, di come implementarle e di come usarle per scrivere un
codice porrabi1e.

ln questo corso, sarece intoraggiari a utilizzare un approcci di costruzione a blocchi


per creare i programmi. Evirate di invenrare nuov;.uneme la ruoca e urili1!t.ate i pezzi gi
esistenti: questa si chiama riusabilit.dal software. Quando programmerete in e, L!S~rete
tipicanrcnce i seguenti blocchi:

Le funzioni della librea srandard


Le fum.ioni create da voi stessi
Le funzioni cbe sono state sviluppare da alrre persone e che vi sono state messe a dispo-

siz.ione
Il vantaggio ru creare le vosrre funzioni che saprete esarr.uTiente in che modo funzionino.
Sarete io grado di esaminare i1 codice C. Lo svanraggio dato dal dispendio di rempo
richiesto dallo sforto per progernrre e sviluppare delle nuove funzioni.
Usare le funzioni gi esisccnci vi evirer di invenrare nuovamente la ruota. Nel caso
deUe funzioni dello srandard ANSt saprere che sono state scritte con molta cura e che i
vosrri progra.mmj avranno un'alta probabilit di essere portabile, poich stace miliZ7.ando
delle funzioni ch sono virrlialmenre disponibili su mere le implemenr-azioni ANSI C.

Obiettivo efficienza 1.1'


Utilizzare le fim.zioni della Libre_ria standard ANSI, invece di srri.vere le uortre corris-pondenti versioni~ potr migliorare l'efficienza del progmmma, perch quelle funzioni
sono state scri'tte con ~ura per wria e,ser:uzione efficiente.
Obiettivo portabilit 1.2
Utiliz.zare le funzioni de//4 libreria [tandard ANSI, invece di scrivere le vostre corrispondenti vmi()ni, porr migL/oratt:c la portahilit del programma, perch quelle fimzioni
sono state incluse in qu@ tutt<: le versioni del C.

1.9

Gli altri linguaggi di alto livello

Sono stati sviluppati ceocinaiaru linguaggi di alco livello, ma solcanto alcuni hanno orrenuro
un largo consenso. 11 FORTRAN(FORmuh -ptANslacor, Traduttore di formula) fu sviluppato dalla IBM, rra il 1954 e il 1957, p~r essere ut:ili'l.Zaco nelle applicazioni scientifiche e

>\ t

r'

;k'. .r~.~ .i.'5


\,,/;>('........,

di ingegneria che richiedono complessi calcoli matematici. 11 FORTRAN urili~"-~''A .?-~~~~


..1:a::..
.
11.1r..
QJ.U.=ameote ancora oggi.

Il COBOL (COmmon Business Orienced language, Linguaggio orienraro alle comuni


attvit commerciali) fu sviluppato nel 1959 da un gruppo di produrcori di computer e di
urenti gove.mavi e industriali. li COBOL milizzam principalmente per le applicazioni
commerciali che richiedono una precisa ed efficiemc manipolazione di granili quancir di
dati. Ancora oggi, pi della mer di nmo i1 sofrware commerciale programmato in COBOL.
pj di un_milione ili persone sono impiega.ce come programmacori COBOL.

lJ Pascal fu progettaro circa nelJo stesso periodo del C. Esso era desrinaro a un uso
aecademico. Diremo qualcosa di pi a proposiro del Pascal nclla prossima sei.ione.

1.1 O

La programmazione strutturata

JJw;ante gli anni '60, molti grandi progcrti dj sviluEpO di software inconrrarono delle serie
dlffkelr. Si er,:i tipicamente in rirardo risperro ai piani di sviluppo del softw<ue, i cosci
et;edevano notv0lmenre i budger e i prodorri finiti non. erano affidabiu. La geore comin:lliiQ .a eomprendere che lo sviluppa del sofcware era una .;mi:vit pi complessa di quanto
>3Ve5;5~ immaginato. I.:arcivic di ricerca degli annj '6!) ebbe C(lme risultato lo sviluppo della
prop:amm.11.Zionc Strtttt'Jlnltll: UJl apprOCCO rusciplinato alla scrirrura di programmi chiari,
'.fililla correttezza dimostrabile e semplici da modi.6rue, Il Capitolo 3 e il Capitolo 4 presenteranno llOa panoramiet generale sw principi della. programmaz.ione scrurrurara. Il re:sm del cesco affronrer lo sviluppo di programmi suurruraci in C.
_ Vno de~ risultati pi tngibili prodocci da questa rit':erca fu lo sviluppo, da parte dcl
.Professor N1cklaus Wtrrh nel 1971, del linguaggio ru programmazione Pascal. 11 Pascal,
me prese il suo nome dal matemarico e 61osofo dd d.iciassecresimo secolo Blaise Pascal, fu
p.rogectato per insegnare la programmazione srrua:uraca negli ambienti accademici e divenee rapidamcnce il linguaggio di inrroduz.ionc alla programmazione preferico nella maggior
parre delle w1iversir. Sforrunatamence, il linguaggio mancava di moire delle srrua:u.re oec::c;ssarie per reoderl.o utile nelle appHca.zioni commerciali, .indusrriali e governacive, perci
nen fu accenaco dilfusamence in quesci ambienri. La stri pu ben ricordare che la sua
selezione come base del unguaggio di programmaziruie Ada stara la reale imporranza del
~cal.

:L.Ada fu sviluppato sorto iI panocinio del Diparrimenro della Djfesa, degli Sraci Unici
'80. Per produrre gli imponenri siscemi
t~frw~e di comando e di co~rrol~o del ~OD, ern.no s.rati a.~za.ci cemtinaia di ling~1aggi
d,tvers1. Il DOD voleva un lUll.CO lmguaggw che potesse andare mcontto alle proprie nece.ss~t'. ll Pascal fu scclc~ come. base m~ Ada, i1 linguaggio finale, risult completamente
diverso dal Pascal. Il l111guagg10 prese i1 suo nome da Lady Ada Lovdacc, figlia dcl poeta
Eord Byron. A Lady Lovelace genera.Imenee amibuito i1 merito. di avere seri reo, all'inizio
del 1800, il primo programma per computer del mondo. Una imporrante caraccescica
dcli' Ada il multitasking. questo consente ai progra.mmacori di specificare che molte arrivit dovranno verificarsi io parallelo. Gli al cri linguaggi dj alto livello ucilizzaci diffusamente
di cw abbiamo discusso (inclusi il Ce il C++), ~onsentono di scrivere programmi eh~
eseguono soltanto una activic per volca. Resta da vedere ~e l 'Ada abbia raggiunco U suo
obiecvo: ovverosia, produrre un software affidabiJe e ridurre soscanz.ialmence i cosci di
~iluppo e manucenziooe dd sofcware.
~IJ>QD.)., durante gli anni '70 e alJ' inizio degli

CAPITOLO l

10

1.11 Le basi dell'ambiente C


Tutti i sistemi C consisrono generalmeme di ue parti: l'ambience, il linguaggio e la Libreria
scandard del C. La discussione seguente spiegh.r il tipico ambiente di sviluppo C, mostrato nella Figura 1.1.

Fase 1:

Fase 2:

Fase 3:

Fase 4:

L...--~}

'---Edi-tor----'

~ -~}
Preprocessore!Complatore

..

..,..

Disk

)}

0Gk)}

Llnker

nprogramma scaco
crearo con l'editor ed
immagaz.inaco nell'hard
disk

11 programma
preprocessore esegue il
codice
li programma
compilatore crea il codke
oggetco e lo immagazioa
nell'hard dlsk

Il linker colleg iJ
codice oggerco con le
librerie, crea a. out e lo
memorizz.a sul disco

Memoria
Primaria

Fase 5:

Loader

,.

Memoria
Primaria

Fse 6:

Figura I . I

CPU

Un tipico ambiente C.

N0ZIONT ~HL.LA f.'.IA~ORAZlONEELETIRONJCA

Jl

r programmi scritti in e passano tipicamente attraverso 6 fasi , prima di essere eseguiti


(Figura 1.1). Queste sono: editrm:, p1eelaborar.e, compi-fare,, linknre (cotlegnre), caricare ed
-estJguire. In questo contcsco ci concentreremo su un tipico sistema C basaro su UNIX.
Qualora non sciare utiliz1.ando un sistema UNIX, fue riferimento ai manuali del vostro
sjsrema, o chiedete al vosrro insegnanre di eseguire queste attivit nel vostro ambience.
La prima fase consisre nella scrittura del codice (editing) in un file: quest'a si esegue
con un programma chiamato editor. Il programmacore scriv~ un programma in C con I'edicor
~. se necessario, eseguir delle correzioni. 11 programma sar quindi i.m.magazzinaro in Wl
dis_posivo di memoria secondaria, come un disco. Il nome del .file del programma C
dovr terminare con l'estensione . c. 11 vi e l'emacs sono due ediror largameme ucilizzaci
sill sistemi UNIX. 1 pacchetti software de! C/C++, come il Borland C++ per i PC lBM e
compadbili e il Symancec C++ per l'Apple Macinrosh, dispongono di ediror incorporati
che sono agevolmence integrati nell'ambiente di programmazione. Supponiamo che il letw re sappia come editare un progranlina.

1n seguico, il programmacore immccrcr iJ comando di compilazione dcl programma. ll


nel codice in linguaggio macchina (detto anche
ompilatore tradurr il programma
f:<Jdice oggetto). I n un sistema C, prima che incominci la fuse. di r:ra.duz.ione, sa.r es~uico
~u~omati'camenre li programma preprocessore: 11 preprocessore del e obbedisce a comandi
speiaJi, chiamati diretti11e del pre:processore, con le quali si indi.ca che sLLI programma doVl'no esse.re e.~eguice determinare manipolazioni, prima della compilazione vera e propria. Tali manipolazioni consistono generalmente nella inclusione di alrri file in quello da
crompilare, e nella sosciruzionc di simboli special i con un tesro del programma. Nei primi
mpiroli, saranno discusse le dirercive pi comuni dcl preproeessore; nd Capitolo 13 pre~enreremo una crarcazione dettagliata di tutte le cararreristiche dd preprocessore. Questo
sar invocato auromaticamenre dal compilatore, prima che il programma sia converro io
linguaggio macchina.

Il linker carica in
memoria il
programma

La qwirra fase chiamaca linking (collegamenta). I programmi se.cirri in C conrcngono


tipicamente dei ciferimenc.i a fu.nz..ioni definire alrr0ve, per esempio nelle librerie standard
0 in quelle di un gruppo di programmatori che lavorano su Wl particolfe progetto. Di
c~mseguenza, il codice oggerco prodotto dal. compilatore oncerr tip'icamenrc dei "buchi"
fl.ovmi a queste parti mancami. Il link" collega il cdite oggecro con quello delle funzioni
mancinci per produrre una immagine eseguibile (senza pezzi mancami). In un tipico sisccma
basam su UNIX, iJ comando per compilare e collegare j pezzi di un programma cc. Per
~~empio, per cempilare e collegare i pe-;;:.d di un programma: cliiamaco welcome . e scdverece

La CPU esegue
un' iscruziorlc per
volta
immagazinando i
nuovi dari oa:en.uci
dall'esecuzione del
programma

(f(;

welcome . e

al prompt di UNIX e premerete il tasto invio. Ne.I c~o il programma sia staro compilaco

e collegato corrcrramencc, sar prodotto u.n file c:h.iamaro a . out. Quesro sar l'immagine
eseguibile dd nstro programma weloome.c.
La ~uinta fase d1iamara ctJt:amento. Prima eh.e possa essere eseguiro, un programnella memoria. Questa operazione 5ar~eseguiradal !.oader (caricatore)
che prender l'immagine eseguibile. dal disco e la trasferir ne.Ila memoria.

ma dovr essere caricato

FinaJmenre, soLTo iJ controllo della swi CPU, il compmer eseguir il programma, una
istruzione per volta. Per caricare ed eseguire il programma in un sistema UNIX, scriveremo a. out al prompr di UN1X e premeremo il casco invio.

12

I
I

I
I

CAPITOLO 1

La maggior parte dei programmi scritti in


ricevono e/o produco no dei dari. Certe
funzioni scritte in
prendono il propri<;> inp ut (i dari in ingresso) dalle stdin (il
t;/.ispcti.#vo standardperI'input), che assegnato normalmente alla cascic:.ra, ma lo stdin
porrbbe :tnche essere eonnesso a un alrro clispositivo. .Loutpltr {i dari io uscita) inviato
allo stdout (il dispositivo standard per /'outpuJ, che normalmenre lo schermo del compurer, ma che potrebb anch e e.ssere connesso a un altro dispositivo. Q uando affermiamo
che w1 programma scampa un risuharo, normalmente, imencliamo affermare che quello
vis~zzaro sullo scherm. I dati possono essere inviati ad altri dispositivi, come i<eischi e
le stampanti (scampa su cana:). C' anche un dispositivo sttmdardper L!Torecb.iamaro stderr.
Udisposit"ivo dello stderr (normalmente cotl.lil$SO allo schermo) utilizzare per visualizzare
i messaggi di errore. uso comune dirigerei dari dell'output regolare, ovverosia lo stdout,
vers un dispositivo diverso dallo schermo, mentre si mantiene I stderr assegnato allo
schermo, cos che l'urente possa immediacamenre essere informato degli errori.

1.12

NOZlON l SUUA ELABORAZIONE El.EJTRONICA

Noi abbiamo preferito Umica.re la nostra discll5sione all'ANSl C. Moire tt.u:attcrisciche


incluse nel,l 'ANSI C non sono corn.pa bili con. le altre implementa'l.ioni d el C~ perci porreste verifarre ch alcuni dei programmi di questo testo non funrionano sw compilarod
pi darari.

Buona abitudine 1.2


leggete i manuali della vers;one det C che state usando. Consultate frequentemente qu.esti
manu.dli per essere sicuri di conoscere la ru:ca colfe.Uone di caratteristich-e dei e e Jj 11.sarle
in modo conetto.

Buona abitudine 1.3


Il vostro computer e il vostro compilawre sono dei buoni in.segnanti. Qua/ara non s111te
siciui di come fanzioni una caratteristica dcl C, scrivete un programma di esempio con
quella caratteristi.ca, compilatela ed eseguitelo e osservate quei/o che succede.

Note generali sul C e su questo libro

Il uu lingt1aggio difficile. A volte, i p rogrammacori es~eni S"OUO org<>gliosi d i essere


capaci di creare u cilizzi bizzarri, conrorri e c_omplicaci del Unguaggi. Quesra una cartiva
abim.d ine di programmazione. Essa rende i programmi difficili da leggere, maggiormcme
soggetti a comporramemi suani e pi difficili da collaudare e correggere. Questo lihio
ade~ro ai programmatori principiami, p erci ci sjamo sforzaci di scrivere prpgrammj
chiari e ben srrurcurari. Uno dei nostri o biettivi principall, in q uesto libro, q uello di
P~.~ui.re la chir.zrezza dei program m i, am a.ver.s o le comp rovare re.c;niche di programma:z.in s trumtrara e le molte correlate buone :abirudini di p rog4\Iiullazione.

Buona abitudine 1.1


Scrivete i vostri programmi C in u1za maniera semplice e diretta. Qu.emt 1egola tktta
volte KIS ("keepit simpLe '~ mamienilo semplice). Non 'forzate" il linguaggio, tef:J,tando d.elLe "stranezze''.
4

l'otrei;te ave.r sentiro dire che il C un linguaggio portabile e che i programmi sccitti in

C possono essere eseguiti su molti computer differenti. La pqrtabiifr un obiettivo sfuggente; Il documento deUo standard ANSI (An90}annovera ben J 1 pagine di insidiosi probiemi
rigtiardanti la pon:abilic. Sono srari scritti libri interi sull'argomento della porrabilii: nel
(fa89) (Ra90).

Obiettivo por.tabilit 1.3


Per quanto sia possibile scrivere programmi portabili., ci sono molti problemi tra 'le tan-

te implemenrawmi de.I Ce i vari com_puter, che rendono laportabi/~ un obiettivo difficile

da raggiungere.. Scrivere semplicemente dei programmi in C non ne gara11ti.sce In portt1bi/it.


Abbiamo eseguiro una attenta vedfca del docwnenco deUo srandard ANSI Ce ahbiamo onfronraro con q ueij9 la nostra presentazione per complerez.za e accuratezza. Turravia
1
il C un l i.nguaggio molto ricco e ci sono akWJe sortigliezze nel liguaggio e cerci argomenti avanzati d Je non abbiamo uartaco. Vi suggeriamo di leggere lo stesso docum.en te d eUo
Standard ANSI
o il manuale di riferimento di Kcrnighan e Ritchie (Kc88), D~ caso
dovCre aver b isogno di ulteriori dercagli recn.ici sull'ANSI C.

13

1.13

Il Concurrent C

Altre version.i del C sono State sviluppate per mezzo degli sforzi continui della ricerca nei
Bel! Laboratories. Gehani (Ge89) ha svilupparo il Concurrenr C: un superinsieme del C
che include delle primitive per specifiearc delle anivitl...multiple che porranno essere eseguite in parallelo. E n rro i prossimi dicci anni, con l'aumento dell't1cilizzo dei multiprocessori
(ovverosia, dei romputer con pi. di u na CPU), i linguaggi come i.I Con~urtcn t C e le
caratteristiche de.i sistemi operativi che supporcano il parallelismo ne.Ile applicai.ioni dell'utente, divenrecanno sempre pi popolari. Per quanco riguarda questo testo, il Concurrent C
ancora principalmente un linguaggio di ricerca. I corsi e i libri ili testo sui sistemi
operativi (De90) includono solirameme rratta.iioni corpose sulla programmazione concorrente.

1.14

La programmazione orientata agli oggetti e il

e+ +

Un alcro supecinsieme del C, oss,ia il C++, fu sviluppato da Srrousrrup (Sc86) nei


BelJ Laboratories. Il C++ fornisce diverse cararceristiche che migliorano il linguaggio C.
Ma, cosa pi imporrante, fornisce delle primitive per fare una programmqzume orimtt1.to

agli oggetti.
Gli o.ggetti sono essenz.ialmenre dei componenti sofrware riusabili che mo dellano glj
d ementi del mondo reale. C' u na rivoluzione in preparazione nella comnnic del sefcware.
Costruire il software velocemenre, corretcameme e io m0do economico cimane un obiettivo sfuggenre e questo in un perioqo in cui aumeman o vertiginosamente le richieste per
un software nuovo e pi porenre.
Gli svilupparori di software stanno scoprendo che, utilinando un approccio modulare
e orienram agli oggetti per la progenaz.iooe e l'implementazione, si porrebbe. fare in modo
che i gruppi d i sviluppo siano dal Oa 100 volce p i p!7Ciduttivi di qua nro fosse. possibile con
le tecn iche di p rogrammazione convenzionali.
Sono stari sviluppaci molti linguaggi di programmazione oriemari agli oggerri. Molti
docenti sono convinri che la migH<'.lr suacegia educativa oggigiorno sia cli imparare a fondo
il C e di studiare, io seguito, il C++.

L4

,,

CAPITOLO

N oz1.0NJi SULLA F.l.ABORAZIONE ,Ebc'JTRONICA

Esercizi di autovalutazione

Esercizi

1.1

J .3

Riempire gli spazi in ognuna delle segue.nei frasi;


a) r:azienda che ha scacenaw il fenomeno della elaborazione personale nel mondo sr.ira la
b) li compuccr che h.1 legirtimaro l'elaoor-azione personale nel commercio e ncll'indumia

staro il _____

e) l computer elaborano i dari sonoilcormoUo dj insiemi di imuzioni chiamati _ _ _ __


per computer.
d) Le sci principaLi unit logiche del compurer sono - - - - - - - -- e----e) U
~ un caso speciale deU:i. multiprogrammazione in cui gli urend accedono
al compurer ama verso dispositivi ch..itria ceoninaJi.
f) Le rre classi di linguaggi discusse in qusro capitolo sono _ _ _ __, ____ _ e

r programmi che Lr;tducono in lingu<lggio mai:;china quelli scritti in linguaggio dj alro


livello sono chiamali
.
h) TI C largamenre c;onosciuto corire il linguaggio di sviluppo dl sistema operaiivo
g)

Quc$tO libro prescnra .la versione del G <iliianiara


C. che stata sc;utdardiizaca recentemente dalJ'!sruro Nazi_on.aleAmei:ici010 per gli Standard.
j) li linguaggio
fu sviluppato da Wirth per insegnare la programmazione
strutturata nelle universir.
k) tl Dipartimento della P .ifesa sviluep il linguaggio Ada con una caraneriscica dena
_ _ _ __, che c_onscnce ai progr;unmacor{ di specificare che moire acrivic possono
procedere in paraUelo.
Riempire gli spazi in ognuna delle seguencifrasl riguardanti l'ambiente C.
a) J ptogrammi C S(JDO normalmente mniCSS in un computer usando UD programma
i)

1.2

b) 1n un sisrema C, prima che incominci la fase .di rrad1J2ione, sar eseguito auromacicamenre
un programma _ _ __ _
c) l due i:ipi pi comuru c:U direrrive del prprocessore sono
e _ _ __ _
d) TI programma
/
c;pmhiua l'output del compilarore con le varie funzioni di
libreria, per produrre una immagine esguihile:
e) li programma
crasferisq: l'i1lllilagine eseguibile dal disco alla memoria.
f) Per caricare cd eseguire iJ programma c9mpila:ro pi recenrcmeme su un sisremaUNIX,
digirace
-

Risposte agli esercizi di autovalutazione


1.1
a) Appie. b) PersonaI Compurcr della JBM. c)' programmi. d) unit di i npur, unir di oucpuL,
unit di memoria, uoitll aritmeriea e logica (ALU); unit. di dabo.raztone centrale (CPU), unit di
~emoria secondaria. e) rimeshacing. f) linguaggi macchina, linguaggi assembly, linguaggi <li alco
liveUo. g) compilarorl. h) UNIX i) ANSI. j) P.asc:al. k) muJcixasking.
1.2
a) ediror. b) preprocessore. e) includere altri 1le in quello da compilare, sosciruire i simboli
speciali con il tesro del programma. d) linker. e) loader. f) a . out.

15

Classificate ognuno dei seguenti elementi come hardware o software:


a) CPU

b) c:ompilatorc e
e) ALU
<l) preprocessore
e) unit di input
I) un programma dj elaborazione di resti.
1.4
Perch dovresce preferire scrivere un programma in unlinguaggio indipendente dalla macchina, invece che in un linguaggio dipendcme dalia macchina? Perch un linguaggio dipendcnre dalla
macchina potrebbe essere pi appropriato per scrivere cerci tipi di programmi?
1.?
I programmi cradunori, come gli assemblatori e i compilatoci, convertono i programmi da un
lil).guaggio (detto sorgente) In un al ero (demo oggctco). Oeterminace quali delle seguenti affesmaz.ioni
sono vere e quali sono fulse:
a) Un compilatore traduce in linguaggio oggeno i progr-;unmi $crini in un lngua.ggio di alro
livello.
b) Un asse.mblarore converte in programmi in linguaggi rnacd n:i quelli scritti in linguaggio sorgente.
e) Un compilatore converte in pC0grammi in linguaggio oggetro quelli scritti in linguaggio
socge.nre.
d) I linguaggi di alto livello sono genecalmerue indipendenti dalla macchina.
e) Un progr::imma in linguaggio macchina richiede una rradurione, prima che il programma
possa essere eseguito su un computer.
1.6
Riempite gli spa bianchi delle seguenti fusi:
a) I disposir.iv attraverso i quali gli urenri accedono ai sistemi di computer in cimesharing
sono chiamaci di solito _ _ _ __
b ) Un programma per computer che converte in programmi in linguaggio macchina quelli
scritti in linguaggio assembly chiamato _ _ _ __
c} i:unir logica dd computer, che riceve daU'esterno le informai.ioni affinch il calcolacort le
possa uciliu:are, si chiama _ _ _ __
d) Il processo di istruzione del computer per risolvere problemi specifici chiamaro _ _ __
e) Quale tipo di linguaggio per computer urilizza dclle abbreviazioni simili all'inglese per le
ismwoni in li11guaggio macchina? _ _ _ __
f) Quali sono le sei unir logiche del compucer? _ __ _ _
g) Quale unir logica del computer invia ai vari dispositivi le informazioni che sono gi srate
elabe rate dallo stesso, in modo che queste poss.ano essere utilizzate all'esterno del compute r ? - - - - h) li nome generico di un programma, che c;onverte in linguaggio macchna 1 programmi
scritti in un cerco linguaggio per computer, _ _ _ _ _
i) Q uale unit logica del computer conserva le infor01az0Qi? _ _ _ __
j) Qual.e unit logica del computer esegue i calcoli? _ __ _ _
k) Quale unit logica del computer prende le decisioni logiche? _ _ _ __
I) l:abbreviazione comunememe utilizzata per l'unir di conrrollo del compuler _ _ _ __
m) 11 livello del linguaggio per compucer pi conveniente per il programmacore, per scrivere
i programmi pi velocemente e facilmence, _ _ _ __
n) TI linguaggio oriencaro alle comuni applicazioni cornmerciaJj usaco pi diffusamente oggigiorno il _____
o) runico linguaggio che un compucer pu comprendere dfrettamente il
del
computer.

16

CAPLTOLO I

p,) Qu.a.le unit .logica dcl comp uter coordina


le atrivid\ di nme le ahre unc logiche?

1.,7

Deren ninai:e se ognuna delle segue nti affermazioni


sia vera o falsa. Spiegare le vsrre risposce.
a) I linguaggi macchina dpend onQ generalmen
te dalla macchina.
b)' ll dmdh aring consente realm enre a molci utenci
di usare simul~eameme un computer.
) Come gli alrri linguaggi di allo ljvello, il C
generalm.enre considerato indipendenrc dalla
m.acchhia.
1.8
Discutete il significaro dj ognuno dei seguenti norr
in ambieme ONIX:
~) stdin
b) stdou t
e) stder r
1.9
Quale caratteristica cbfave fornita cW Conc urren
t C che non sia disponibile in ANSI C?
1. 10 Perch oggigiorno c' cosl c:anca armu.ione
conemrarn sulla progr am=. ione orienrara agli
oggecci, in generale, e sul
m particolare?

e-

Let ture consigliate


(An90) ANSI, Amerim11 Natioru1LSr.a1ulardfor_l1rfarmnt
~o11 Sysr.emr-Rrogrammi11g language C (ANS
I .Dommcn r ANSJ //S() 9899: 1990), New York,
NY: Arnecican Nacio nal Standards lnstitutc, 1990.
Qucs~o ll qocuruem che de.finisce i'ANS
I C. Il documen to ilispouibile in vend.ira prc:~so l'Amc
rican Narional Srandard. lns1 imce, 1430 Broadway,
New York, New York I 0018.
(De90) Dci rei, H. M. , Opmifing .S)rmns (Second
Edltiqn), Redlng, MA: Addison-Weslcy Publlshing
Company, 1990.
un manuale.: per JI midizionalc rso dj informatica
U sistemi operativi. J capitoli 4 e 5 presen
tano
una approfondita discussione sulla prgramma:r.iom:
conco.mmcc.
{Ge89) Gchani. N. , and W. D. Room c, The Conmrrmt
C Programmmg 1..m1gu11ge, Summir, NJ: Silicon
P.ress, L989.
~uesro il libro

.ru _defin_iuonc del Conc~m:m C: u.n


pro.grammacorr ili specificare un:a esecoz1one pralldaSl1pcri~ieme d~l linguaggio ~ che cons~nre
di attivit multiple. f. anche mduso un compenwo del Concurrcm C++.
Oa89) Jaeschke, R. Portabiiity ond the e Language. Jndian
apol.i$. fN: Hayden Books. 1989.
Questo 1ib.ro discute la sori.rmr:i in 4i progrruruni
porwbili. Jacscbke ha pancdp:iro ai coniitaci
ANSI e ISO pergli srandard del C.
(Ke88) r<.ernigh:m, B. W:, :md D. M!.Ricchie, Tht
C Pmgmmmi11g l011g11age (Second Edicion), Englewood
Cliffs, NJ: Pr.cncrce Hall, 19.88,
Qucsco libr un classico nd settore. Il libri'! ampia
mente ucilin.'lro, nei corsi di C e nei seminari
p i Rrogrammatori di ruolo, e iriclude un eccellcnce
manuale di i:iferifncnro. Riccrue L'aucore de.I
linguaggio C e uno dci progettisa dcl sistema operar
ivo ONIX.
Wl 92) .I'.lauger, P. ]., '!11e Srmul11rd C Libmry, Engle
wood Cliffs, NJ: Prentic<lfall, 1992.
Definisce edimo ma l'utiliri..o delle funzioni incluse 11c:lla
libruria sc:a:nda rd del C. Pla.gcr. nell'ambito
del comicaro che ha sviluppaco lo st:anchud ANSl C.
staro il capo del sonocomitato pr la libreria
ed anche Slato <:<;>Jui il quale ha convotlato. il COiJJj
l3CO [$Q per l'evoluzione dcl C.
(Ra90) Rabinowicz, H., aod C. Scha3p, Portab/.c C,..En
gbvood Cliffs, N); Prencice Hall, l990.
Quesro libro stato svUppaco per u.n corso sulla porrnb
ilic tenuto neglLAT&T Beil L!borawries.
Rabinowirz..hvora presso il Laboratorio ili lncelligenz.a
An:l6ciak della NlN.EX Corpor-Jcion, mentre
Scbaap un.Jirigent dc.Ila Ddfi Consulting Corpo
ration.
(Ri78) Ritchie, D. M.; S. C. Jobnson; M. E. Lesk; and
B. W. Ketnghan, "UNL,'{Tune-Sha:riog Syscem: The
C Programmlng Language", Th11.Btll Systn11 Tech11ical
Joumal, Voi. 57, No. ~. Pan 2, July-Augusr
1978, pp. 199!-20.19.
ai.

Questo uno degli arri.coli classici di inrroduz.ione al


linguaggio C.Apparve..in un num~ro spec;iale!
deUa rivisr;i Bei~ Systm1 1iodmk11l foumiil dedicar.a al
"Sistema dJ funcsharing jo UNIX".

Nozr oN1sulli \ Fl.ABORAZIO NE ELETrRGNIC


A

17

(lli84;) Rir.chie. D. ~I. . "The UNlX $ysccm: The Evolu


on of the UN rx Time-Sh:uing Sys~m~. AT&T &Il
Labor;nrpries 111:hnicn,ljournn.J.Vol. 63, No. 8. P.ort 2,
Oc;tobcr 1984, pp. 1577-1593.
Un articol o classico sul siscema operativo UNIX. Quest
o anicoJo apparve in una edizione :;peciale
della rivistn Bd./ .'>)stem Tedmkttlfoltrnal complecame
nre dedicata al "Sisrema UNIX".
(Ro84) Roslc.r, L., "Thc UNIX Sysrcrn: Thc F.voluc
.ion ofC- Past ;md Future", A116-T BellLnborniories
Technical. jo1m10/, Voi. 63, No. 8, P:m 2. Ocrober 1984.
pp. l 685-L699.
t w 1 cccdlenn: artico lo, da far seguire ~dRi78) , per il !errore interes
sato a craciare In scoria del C
e le radici dello sforz0 per srandardizzare i'ANSI C. App3r
vc in una edi:t.Jone speciale della rlv1sra B,l/
System 7echnical jonrnal dedicira al "Sistarna UN IX".
(Sc84) Srrouscrup, B., "The UNlXSysU!fT1: Data.Ahsrrac
tion in C,Ar &T BellLnb.o.mtorit:s Tcchnic11ljoumal,
Voi. 63. No. S, Pan 2. Octoher l984. pp. 1701- 1732.
t:arcicolo classico di introdLLiione al C++.Comparve in
una edizioni; speciale ddl:t r.ivi.sra Bcl!Syswrn
Tethnicoljoumol dcdk ara al "Sisrema UNlX ".
~St9J.) Srrousuup. B. The c.~+ Progmmming Lmti11
1ge (Sccon d Edition), Reading, MA: Addison-Wesley
Serics in Computer Science, l 991 .
Qoesc olihro 'il riferimenro per la definii.ione del
C++: un supecinsieme dd C, che apporca vari mi
glioramemi al e, specialmente le car:arrerisciche per l<t
progr3mrnaiione orientata agli oggctri. Srrousrrup ha sviluppato il C++ negli AT&T Be.li Laboc
:uories.
(To89) Tondo, C. L. and S. E. Gimpel. The C.A1isw
er 'Bo(Jk, Englewood Cliffs. NJ: Prentlce Hall, 1989.
Qacsro libro unico fornisce le risposte agli eserciti nel
Kernighan e Ricchie (Ke88). GJi autori mo
strano w10 ,m ie di progro.mm:azione esemplare, merur
e fumlscono spiegazioni sui loro approcci alla
soluzione dei problemi e sulle scelte di progemiiione.
Tondo 111.vora presso la l&M Corporation e la
Nova Ullivcrsicy in Fr. Lauderdalc, Florida. Giinpl
un consuliinre.

CAPITO LO

Intro duzi one


alla prog ramm azio ne in

Obietti vi

Esserdngr ado discrivere semplici programmj per computer in C.


Essere in grado cli usare semplici istruzioni cli input e cli outpuL

Familiarizzare con.i tipi cli dato fundarnent:ali.


Comprende re il funzionamem:o della memoria del computer.

Essere in grado cli usare gli operarori aritmetici.

Comprengere le regole cli pcioric degli op.eracor.i ari:rm.etici.

Essere in grado cli saivere semplici istruzioni decisionali.

2.1

Introduzione
11 linguaggio e fac.ilira u.n a(>ptocci.O scrurturato e discipLlnat o alla

progenazio ne ru un
pr ogramma per computer. In questo ca.pi.tolo introducia mo la programm aziqne in
e
presentiam o molci esempi che illusrrano varie importami cararrccistiche del linguaggio .
Ogni esempio .aualiz:1.aco aaencamem e, una isrru1.iooc per volca. Nd Capitolo 3 e od
Capi cole 4, prescmiam o una inc:roduzione alla programmazione stnetturata in C. lo seguim,
useremo l'approccio srrumirato in rutta la parre rirnanenre del libro.

)'

2.2

Un semplice programma C: visualizzare una riga di testo

u.rilizz.a alcune notazioni che possono apparire strane a eh.i non ha mai programm ato
un computer. Comincere mo consideran do un semplice program.m.a C. ll .nosrro pcimo
esempio visualizza una riga ru cesto. Il programm a e la schermata dell'ou rput risultante
sono mosc:raci nella figura 2.1.
Il

Per quanto questo programm a sia- semplice, iJlusrra mqlce cararrerisciche importa:a.ri
del linguaggio C. Consideria mo ora nel dettaglio ogni riga del programma . La. ciga
1

Un primo programma e */

incomincia coh /*e termina con ""/ per indicare che la riga un commentc. l progra.mmacori inseriscono dei commenri per documentare i programmi e migliorare la leggibilil
degU stess.i. [ conimnci non. p rovocano l'esernzion e di nessuna azione da pnrte del computer, quando il prof,rrn.mma viene eseguito. l commenti sono ignorati dal compilator e
e

20

CAPITOLO 2

non inducono la generazione di alcun codice oggerro in linguaggio macchina. ncomme1no


Un primo programma C descrive semplicemence gli scopi del programma. I commenri

aiunuio anche le alcre persone a leggere e comprendere iJ vostro programma, ma rroppi


commenti potrebbero rendere diffiile la lettura dello stesso.
Un primo programma C */

/*

ma i n()
{

l NTilOOtr.llON E ALU\ PROGRA.W.IAZIONE IN C

21

c::ararcere backslash (\) den:o carattere di escope (fuga). fusq indica alla printf clie dovr
fare qualcosa fuori dell'ordinario. Nel momcnco in cui avr i.nconcraro un backslash, l'istruzione printf guarder il c:arnttere successivo e lo unir con il backslash per foi;mare una
se_qu.enztJ di escape. La sequenza di escape \ n significa iu:wline (nuova rig--~) e prvoca il
posia.ionamento de.I cursore nella pusizione iniziale della riga successiva dello schermo.
Nella Figura 2.2, sono elencare alrre sequenze di escape tipiche. Lisrruzione printt ~una
delle rance funzioni fornite dalla Libreria standard del C (ed dencate nella Appendke B).
Sequenza

printf('Wel come to

C!\n ~) i

di escape

Descrizione

\n

Newline (nuova riga). Posiziona il cursore all'inizio della riga successiva.


Tabulazione orizzontai~. Muove il cursore alla tabulazione successiva.

Welcome to Cl

\t
\r

Ritorno carrello. Posiziona il curS-Ore all'inillo dclla riga crreme; non lo fa


av3.Jl7..a.re a quella successiva.

Errore tipico 2.1

\a

AUarme. Fa suonare il cicali no dd sistema.

Dimtmicare di urmzare un commento co11 "/.

\\

13ackslash. Visualizz.a un cararrere backslash in una isrrLI2ione printf.


Apice singolo. Visual izza un carattere apice sin?olo in una istruz.ioue p-rintf.

Figura 2. 1

Un programma che visualizza del testo.

\'

Errore tipico 2.2

, ~

Jncominciare Ull COmmenJo (()Il caratteri

''/O temlllllTW C01l /"'.

La riga

Figura 2.2 Alcune sequenze di escape tipiche_

Le ultim'e tre sequenze di escape nella Figw'a 2.2 pou.ebbero semhrare srrane. Dato
che il backsl:ish ha un significato speciale per l'isrruzione primf, ovverosia essa lo ricono-

ma i n()
una parre presente io rutti i programmi C, Le parentesi dopo main indica.no che main
un blocco di costruzione del programma. hiamaco fimzione. r programmi e com:eogono
una o pi funzioni., fina delle quali deve :essere main. Ogni p1ogramma C comincia eseguendo la funzione main.
1

Virgolette. Visualizza un cararre.re virgolen:e. in una istruzione printf.

Buona abitudine 2.1

l(2J

Ogni fitnzione do!lrehbe 'ssere preceduta da un cotnmento che ne descrivag/ scopl.


La parentesi graffa aperta, {, deve aprire il corpo di ogni funzione. Una corrispondente
parmtesi graffe chiusa deve chiudere ogni funzione. Q uesra coppia di parenresi graffe e la
porzione di programma racchio_sa in esse sono and1e cl.erre blocco. Il blocco w1a importante unir dei prog(ammi C.
La riga

printf( "Welcome to C!\n');


ordina a1 computer di eseguire una azione. visualizzare sullo schermo la stringa di caratteri
indicata era le virgolette. Una stringa a voi ce detta stringa di c11.mtteri, messaggi-O o letterale.
L'intera ciga, incluso printf, i suoi argomemi all'inrerno delle parencesi tonde e il
prmto evitgoltt (.; ), . derm istruzione. Ognuna di queste deve cermU:i.a.re coo un punto e
virgola (detto anche. te.nninatore di istruzione). Nel mo~ento in cui sar e.seguira, risrruzione printf precedente visualizzer sullo sch~rmo il mes~o Welcome to e I Normalmente, i caraneri sono visualizzati nello sresso modo in ct appaiono m le virgoierre della
i ~'Ull2One printf. 0$~ervate che i ~cararlcri \n non sono srati vis1:1alira.ad sullo schermo. TI

sce come un carartere di e.scape, piurrosto che come un qualcosa da visu.a.liu.are, utilizzeremo un do ppio backslash (\\) per indicare che oe dovr essere visu.alizzaro uno singolo.
An.che scampare le virgolette presenca un problema per l'istruzione prinrf, p0ich essa
normalmente presume. che queste ultime indichino i limi di una stringa e che le stesse
non debbano essere effetrivamence visualizzate. Usando la sequen7.a di <:Satpe \", informeremo prinrf che dovr stampare le virgolette.
La parentesi graff chiu;a, }, indica che stata raggiunta

la fine

dcl main .

j~ Errore tipico 2.3

~ hn.mettere in un programma il norne.detl:afunzi.one di output pr-intf

comeprint.

Abbiamo affermato che l'istruzione printf spinge il computer a seguire una azione.
Nel momento in cui in esecuzione un programma qualsiasi, il computer svolge una serie
di azioni memre il programma prende delle decigoni. Alla fine di quesro capicolo, aatreremo delle. isauzion.i de<':isi0nali. N'el Capirnlo 3, spiegheremo ulceriotmence questo
modello di azione/decisione della pr9grammazione.

impo-rtanre osservare che le funzioni della libreria srandard, come printf e scanf,
non faru10 parte del linguaggio di programmazione C. Di conseguenr.a, il ompilamre non
potr trovare, per esempio, un errore di batcinua in printf e scanf . Nd momenro in cui
l'istruzione. printf sar compilara, iJ compilaro.r:e fornir semplicemente uno spazio, nel
progr:tmma_ oggerto, per una "chiamata" a quella. funzione della libreria. U compilatore

22

!NIRODUZION Al.l.J\ Pl~UGRAMMAZION!! IN

non sa dove sir.rovino le funzioni ddla libreria a differem.a del linker che, quando sar cseguico, individuer le funzioni della libreria e inserir od programma oggerco le ch.iamace appropriare
a queste funzioni. A questo pumo il programma o&,aerro "completo" e promo per essere
eseguito. Il programma prodorro dal linker, infarr.i, spesso chiamato eseguibile. Nel caso
dovesse esserci un errore di digicazione nel nome della funzione, quesco sar individuato dal
linker, perch, per quel nome nel programma C, esso non sar in grado di trovare una corri~
spoudenza era i nomi di rune le fumjoni noce delle librerie.

23

/* Visualizzare righe multiple con una singola printf */


main {)
-{

printf('Welcome\nto\nCl\n');
}

Buona abitudine 2.2


L'ultimo carattere stampato da u114 fanzione che Megue qualsiasi visualizzazione dovrebbe
essere un newline (\ n). Ci assictmt che la fon.zione /,asci il cursore dello schermo nella
posizione iniziale di una nuova rig4, Li> un.ve,n.g;ioni di questo genere incoraggiano la
riusabilit dci sofiware: un obkttiv forrdo.ment.ale negli ambienti di sviluppo.

Welcome
to

e1

Figura 2.4

Visualizzare righe multiple con una singola printf.

Buona abitudine 2.3

2.3

Fate rientrare l'intero corp" di ogtd fu:n.2iivnt: qi un Livello (tre spfl.7-i), all'interno deile
parem:esi gr1iffe che definiscono il corpo de(iafimzione. Ci enfatizza ltt strutturtt fimziotude del programma e aiuta tt renderlo pi leggibile.

TI nostro prossimo programma milizza la funzione scant della libreria standard per leggere due
interi digirat:i alla rascic:ra daJl'ureme, calcolare la somma ~ei due valori e visualizzare il risulrato
U;Saodo la funzione printf . Il programma e I'oucpur d i esetnpiq son0 mostraci neUa Figura 2.5.

Buonn abitudine 2.4

/* Programma di addizione */
#include <stdio.h>

5'-egliete una convenzione pr la dimnsione del rientro che preferite e qwndi appiicateiA uniformemente. Potrebb essere utilizzato il tasto di tabulazione per cretlre i rientri, ma tenete pres-ente che i punti di 4rrestv delle tabulazioni potrebbero variare.
Rm:comttndiamo di usare delle tabulazioni da 114 di pollice (6,35mm) oppure di contare manualmente tre spazi per ogni livello di rientro.

main()
{

La fum.ione printf pu visualizzare Welcome to e I in molci modi differenci. Per


esempio, il programma della Figura 2.3 produce lo stesso ourput dcl programma in Figura 2.1. Ci accade perch ogni printf riprende la visualirtaz.ione dal punto io cui s.i era
fermata quella della printf p'recedeme. La prima printf visuaHua Welcome seguito da
un.o spazio, meoc:re la seconda printf inmmincia a scampare immediarameme dopo lo
spazio.
Usando il cruartere newline come nella figura 2.4, uua sing0la funzione printf porr
visualizzare diverse ~ighe. Ognl volta che inconcrer la sequenza di escape \n (newline), la
funzione printf si posizioner all'ini~io d~ll~ riga successiva.

Un altro semplice programma C: sommare due interi

i nt integer1, integer2, sum;

/ * dichiaraiJ.oni */

prifltf('Enter first integer\n ") ;


scanf( "%d", &integer1);
printf( "Enter second integer \n');
scanf("%d", &integer2);
sum ; integer1 t integer2;
printf("Sum is \d\n'', sum);

/"
/*
I*
/*

return 0;

/* i ndica c he il prog r amma t erminato con successo

EntFer f irst

inte~er

45

ma in()

Enter second integer


7.2.
suin is 117

printf("We lcome ");


printf("to Cl\n");

Figura 2 .5

Wel oome to Cl

Figura 2.3

Visualizzare su una riga con iscruzioni printf distinte.

~1

/*. Visualizzare su una riga e<on due i struZioni printf *l


{

prompt */
l egge un intero */
prmpt */
legge un intero */
1~ a~seBnamento della somma 'I
t visualiz.z.a la somma t

'

Un programma per la somma.

Il comrru:nro / * Programma di addizione * I dichiara lo scopo del programma. L'l riga


#incl!Jde <stdio.h>

uoa direrriva per il preprocessore del C J..e righe che LnCOlflncianO COD /I SOUO eJabocace daJ
preproessore, prima che il programma sia compilaro. Questa specifica riga indica al preprocessore

G\PITOLO 2

24

d indudcrenel programma il concenuco del file di intestazione per l'input/output rMndard (stdio. h).
Quesro file di imes.roziQne conriene Le informazioni e le dichiarazioni u.sace dal compilarore
durame la compilazione de.ile funzioni per l'input!ourpur srandard, come printf . Il 61e di
inu:sraz.ione contiene anche infurmaz.ioni che aimano il compilatore a dererminaie se le chiama.re alle funzioni deit Hbrecia sian0 sc:ace scrirte correttam en~e. Nel Capitolo 5 spiegheremo
pi decragliatamenre i conrenuri dci fil dl inresw.ione.

Buonr1 abitudine 25
Per quanto I'inclu.sme di <$tdio. h> sia op~onafe, esst1 dovrebbe essere effettuata in
ogni programma e dh utilizzi u.nn qfl._11'1p1q1-{e delle funzioni di inptf.t!output della libretia standard. Ci aiuter iJ' compilatore tt sempilfico.l'vl l'individuazione-degli e1:rori durante fafr.se di compilazione del vostro progrrzm~ piuttoSJ che durante quei/a
di esecuzione (quando gli errori sono di solito pi onerosi da correggere).
Come abbiamo affermam in prncedem,a, ogni prowam.ma cominc_:ia la propria esecuzione con la fonzione main. la parenresi graffa aperca { marca l' inizio del co~p9 del main
mentre la 9rrispon dcnre parentesi graffa chiusa marca la fnc d.i quesr'ulti mo. La riga
i nt

inte~er1,

integer2 , sum;

una dkhitt1112.ione . .Le voci integer1 . i nteger2 e sum sono i nomi delle 11ari.-dbili. Una
immagazuv~bile una locazione (posjzione) della memoria in cui un valore pu essere
che le
specifica
ione
dichiaraz
,Questa
na:ro perch possa essere utilizzato da un programma.
variabili
queste
cbe
significa
Ci
int.
variabili integer l, integer2 e sum sono di cipo
conrcrranno dei va.lari interi, ovverosfa, dei numeri. inte.ri come 7, - 11, O, 31914 e simili.
Tutce le variabili devono essere dichiarare con un nome e un tipo di dam, i.mmed.iatamence
dopo la parentesi graffa aperta che inizia il corpo del ma in, prima d1c possano essere
urilizzate in w1 programma. In C. ci sono altri tipi di dato oltre a int. In una dichiarazione
possono essere dichiarate molte variabili dello stesso tipo. Avremmo poruco scriver tre
dichiarazioni, una per ogni varfabile, ma la fo rma ~ta prec::edentemence p concisa.
~ Buona abmdine 2.6

25

Buono abitudine 2.7


Scegliere nomi signifiC11.ri11i di variabile n.iute:rlr n rendere ilprogmmma auto esplicativo. ill altre paro/. sara1mo 1tecellrzri meno commenti.
Bi~ona

abiNtdine 2.8

ln prima lettera di un identificatore usato e<mte un semplice nome di variabile M11reb


be essere tttw let:tan. minuscola. Pi avanti, in qu.ette libro, asseg;nerenw 1111 sif!iificato
particolare agii identificatori che incomiiiciano con m1a lettem maiuscolit e a quelli che
usano soltanto lettere maiuscole.

Buona abitudine 2.9


I nomi di vario~ile fonnati da pi parok possono aiutare a rendere il programma pi
leggili.ile. Evitate di tombinme le di11er.se pctroLe r.ome in totalcom mi$Sion s. Sepnmtele piuttosto con carntteri di sottolineatum, come in total_ commiss ions o, se 11olt
re legarle insieme, cominciate ogni parola dapo la prima con una Lettera maiuscol'l, COlnl!
in totalCom missions .
Le dichiarazioni devono essere sisremace dopo la paremesi graffa aperta di una fum.ione e prima di ogni struiione es!guibile. Per esempio, nel programma _della f.igura 2.5 ,
l'inserimento della dichiarazione dopo la prima printf avrebbe causato un errore di sin.cassi. Un errore di sint.'lssi causato quando il compilat0re non in grado di riconoscere
una iStrll'"1.ione. Il cornpilarore normalmence emene un messaggio di errore per aiurare il
programmamre a loelizzare e correggere l'istruzione errata. Gli errori di sincas$i sono
violazioni delle regole del linguaggio. Essi sono anche chiamati errori di cqmpilazione, (}
1
-

errori a tempo di compilazione.


Errore tipico 2.5
Sistemare le dichiarazioni di 11arit:zbile tra le istrt1Pioni eseguibili.
Buona abitudine 2.10

Mettete uno spazio dapo ogni virgola(, ) per rendere il programma pi leggibile.
On nome di variabile in C qualsiasi id.emi.fictltori valido. Un ide.uti:fcacor~ una serie
di caratteri, comprendente lettere, numeri e caratteri di srtoli.Jiearura LJ, che non comincia on un numero. Un idenPfcacore pu avere qualsiasi lungh1=zza, ma soltanto i primi 31
l dell'ANS IC.
c;ua:tterid~0no CS$~{e riconosciuti dal o.mpilaro re C, i.o accordo tou loscandar<
in C,
dlffernci
sono
ninuscole
1
Il e e case sensitive, ovvero, le letrere Jna.iuscole e quelle
perci a 1 e A 1 sono idencificarori discinti.
Errore tipico 2.4

Us.are una lettera maiusco/11 laddope ne dovrebbe essere utilizzata una


est:fnpio, sr.riuent;/Q Min in.v.eue di ma in).

INTRODUZIONE ALl.1\ PROGRAMMAZI ONE. IN

mimtsc~la

(per

Obiettivo portabilit 2.1


Wate identificatori di non pi di 31 caratteri. Ci aiuter ad assicurare I.ti portabillttt
epotr evit{Jre alcuni subdoli errori di programmazione.

Separa.te le dk.hiarazi.oni e le i.stmzioni eseguibili dJ una fimzmc crm una riga vuotn, per
enfatizzare il ptmto in cui finiscono le dichiarazioni e i11cominciano I.e irtmzioni eseguibili..
L'isrruzione
printf( "Enter fi rst integer \n " )i
visualizza il letterale Enter f irst intger sullo schermo e si po~ iziona all'inizio della riga
successiva. Quesco messaggio derro prompr perch chiede all'i:icence di e.$eguire una azione specifica.
L'iscruzone

scanf(" \d", &intege r1);


urllizz.a scanf per ottenere un valore dall'ucenre. 1..a funzione scanf prende i dati in ingresso dallo srandat:d input che di solito la rasriera. Questa scanf ba due aigomenci: '%d " e
&int eger1 . li primo argom.enro, la st11ingadicm:1trollodeljrmato, indica ,il tipo di dato
che dovr essere immesso dall'Uience. La rpecific.a di conversione \d indica che il dato dovr

26

C1\:l'ffOLO

essere un incero (la lettera d sca per "inrero decimale"). Il %, in questo con.resto, consideraro dalla funzione scanf (e come vedremo anche da printf) alla stessa srregua di un
carattere di C!Scape {come \) e la cornbi.naz.ione %d una sequenza di escape (come \ n). li
secondo argomemo della scanf incomin'i'ia con una E commerciale ( &), detta in C
opertttore di indirizzo, seguita dal nome della. variabile. La E com merciaie (o ampersand),
quando combi.nara con il nome deU~ variabile.., indica alla scanf la locazi~t(e di memoria
in cui irnmagazzinani. la variabile i nteger1 . Il cbmputer quindi immagazziner il valore
della variabile integer1 in quella locaiioo.e, I:uso di ampersand (&) confonde spesso i
programmarmi principianri o queUi che hanno gi programmato in alrri linguaggi cbe non
richiedono quesca nocazione. Per ora, ricordare solcanro di far precedere ogni variabile da
un arnpersand in rurre le isrruzioni scanf . Alcune eccezioni a questa regola: saranno discusse nel Capicolo 6 e nel Capirolo 7. li reale significato dell'uso di ampersand diventer
chiaro dopo che avremo srudiato i puntatori nd Capitolo 7.
Nel momento in cui il computer eseguir la precedente scanf, arrender che l'urente
abbia immess9 llI! valore per la variabile integer1 . LLLCente risponder digirando un
incero e premendo il tasto retum (a volte dea;o t(!sto enter o tasto di invio), per inviare il
numero al computer. Quesco assegner allora U suddecro nwnero, o w;lore; alla variabile
integer1 . Ogni sucessvo riferimcnm a integer1 nel programma user Tale valore. Le
funzioni printf e scanf facilitano l'inrerazione tra l'ucente e il compmer. Daro che quesca
incerazione somiglia a un dialogo, spesso chiamata elaborazione interattiva.
Cistruzione

visualizza il m~o Enter second i ntegr sullo schermo e quindi posiiiona il cursore
all'inizio della rig.i.~successiva. Anche questa' printf chiede all'uceme di eseguire una azione.
I.:istnt.:z,iqne

L'istruzione
printf( "Sum i s %d\n " , sum);
usa la funzione printf per visualizzare suUo schermo il len:erale Sum is seguito dal valore
numerico della variabile sum. Quesca printf ha due argemenci, ' Sum is l\id\n" e sum. IJ
primo argomento la ~rringa di conrrollo del formato. Quesca contiene alcuni caratreri
JerreraH che dovranno essere visualizzati e la specifica di conversione l\sd indicante che sar
visualizzato un intero. U secondo ti.rg0 menco spedfa il valore da visualizzare. Osservare
che la specifica di conversione per un incero la stessa sia in printf, sja in scanf. Questo
accade per la maggior parte dei cipi di daco in C.

I calcoli possoo.o anche essere eseguiti all'inreroo della istruzione print f . Avremmo
potuto combinare le due precedenci istruzioni in

printf("Sum is %d \ n " 1 integer1

integer2);

I.:isrruzione

r eturn 0;
resc:ici,1isce il valore 0 all'ambiente del sistema operadv in cui il programma stato eseguito. Questo indica al sistema operativo che il programma stato eseguito con succ~sso.
Consulcace i manuali del vostro specifico sistema operativo, per ottenere informazioni su
come comunicare un parti9>lare ripa di falljmento del programma.

ottiene dall'urente un valore per. la variabile integer2. I.:istmzione di assegnamento


I

Errore tipico 2. 7
Dimenticare una:0 entrambe /,e virgolette che circondano la stringa di contro//,o delfirmuttQ
i"n una printf o in una scanf.
Errore tipico 2. 8

scanf('%d", &lnteger2);

= integer1

27

La parentesi grafl chiusa. }, indica che stata raggiunta la fine della funzione main.

printf( "Enter second integer\n ")i

sum

I NTRODUZIONE ALlA l'ROGRAMMAZlONElN C

integer2;

calcola la somma.delle variabili i nt egr1 e integer2 e assegna il risulcaro alla variabile sum,
usando l'operatore di assegnamento= . .Listruzione lea:a come "sum prende il valore di
i nteger1 + integer2". La maggior pane dei calcoli sono eseguici ncUc istruzioni di assegnamento. I.:operamre = e quello+ sono chiamari '<1p.erat01i binari percb ognuno di qu.esti ha due
operandi. Nel caso, dell'operatore +, i due operandi sono i nteger1 e in1;eger2. Nd e::aso
dell'operqtore =, i due oper3l1di sono sum e il valore deJJa espressione integer1 + integer2.

Buona abitudine 2.11

Dimenticare il % in una specifico di conversionr nello_ minga di controllo del formato


di una printf o tli uno scanf.
Errore tipico 2.9
Inserire untt sequenza. di escape come l n all'estemo della sttinga di controllo de.I.formato di una printf o di uha scanf.
Enore tipico 2.1 O
Dimenticare di includere le espmsioni di cui dovranno mere visualizzati i valori, in
una p rin tf contenente delu specifiche di conversione.
Errore tipico 2.11

Inserite degli spazi su entrambi i "1ti di un operatore binario. Questo mette in risalto
/'operatore e rende pi leggibile il programmo.

Non fornire, nella stringa di controllo del formato di una printf, una specifica di
converrione, qualora sia neces;aria per visualizuire una espre;sione.

Errore tipico 2. 6
Ertore tipico 2.12
Il calco/,o <in una istruzione di assegnamento deve.essere a destra dell'operatore =. un
en-oredi sintrmi sistemare wn: calcolo a sinistra di u.n operatore di as>egnamento.

Inserire, a/L'interno della stringa di controllo delformato, la virgola che dovrebbe separare la stessa dalla eiprcssione da visualizzare.

28

C1\J>!TOLO

Errore tipico 2.13


inteper1

Dimenticare, in una irtruzione scanf, di far precedere da un ampersand una variabile, quando quma dovrebbe, di fotto, esserepreceduia da un ampersand.
Su molti sistemi, questo errore rilevaco nella.fase~ecuva deuo "errore di scgmencaz.ione"
o "violazione di accesso". Un simile errore occorre, quando il programma di w1 utente
cenca cli accedere a una parte della memoria del computer per cui il p rogramma Stsso non
ha clirirti cli accesso. La causa precisa di quesrn errore sar spiegata nel Capitolo 7.

li

Errore tipico 2.14


Far precedere da un ampersrtnd. in una istn1zwne printf, uno vm1hle quando, di
fotto, questa non dovrebbe essere pr.ecedttta d<.1. tm ampersand.

Nd Capitolo 7, srudieremo i pumamri e-vedremo dei ca.si ill cu:i VO(remo far precedere da w1 a,mpersand un nome di variabile, per visualizzare l'indirizzo della scessa. Per molti
dei prossimi capitoli, rurtavia, le istruzioni printf non includeranno tale uso dell 'ampersa.nd.

2.4

29

lNIRODUZIONEALLA PROGRAMMAZIOl'JE IN C

integer2
Figura 2.7

8
8

le locazioni di memoria, dopo che entrambe le variabili sono state ricevute in input.

che esegue !'addii.ione, comporta anch'essa una scrimira disucmiva. Ci accadr quando la
so111Il3. ca1co1:u:a da integer1 + integer2 sar siscem:ara nella locazione sum (dism1ggendo il
-valore he poreva essere gi contenuro io sum). Dopo che sum sar stata calcolata, la memoria
apparir come nella Figura 2.8. Osservate che i valori di integer1 e integer2 appaiono
~menre com'erano prima di essere urilizzaci nel calcql<;> di sum. Questi valori sono ~tari
rrriliz.za.ti, ma non dimurci, quando il computer ha esegu.irn il calcolo. Di <::o1l5egue117..a, quando
un valore lerro da una locazione di memoria, r:a.le processo detto lettura non distrur.tiva.

Nozioni sulla memoria

i ntepe r1

45

i nteger2

72

sum

117

I nomi cli variabile come intege r1 , intege r2 e sum corrispondono in.realt a locazioni (o
posizioni) nella memoria del cmpurer. Ogni ~bil ha un ffome, un tipo e un va/ore.
Ncl programma per la somma della Figura-2.5, quando sar eseguita l'iscruz.ione
Fig ura 2.8

scanf( "%d", &integer1);

il valore digitato dall' utenre sarimmesso nclla._posizione dimemoria alla quale ilnome in t ege r1
stato assegnato. Supponere che l'uccnte i.mmerra comev-alore per integer1 il numero 45. Jl
ompurer sisremc:r il 45 nella locazione integer1 , come mosrrato dalla Figura 2.6.

int~11er1
Figura 2.6

Una locazione di memoria che mostra i1nomee il valore di una variabile.

Ogniqualvolta un valore si.~remaro in una posi1johe di memoria, esso si sostirujsce a1


valore comenuco in precedenza in quella locazione. Dam che quesca informazione precedenre
sar discruna, il processo di scrittu(-a in una l0cazi9ne di memoria detto scrittura distmfitiva.
Supponete che l'urente immerta il valore 72 quando l.'isrruzione
scanf( ~%d " ,

&integer2);

eseguica. Quesro valore sar siStemato neUa locazione integer2 e la memoria apparir
come nella Figura 2.7. Osservare che quesre po!!izioni non saranno necessariameme adiacenti ill memoria.

Una volca che il programma avr orrenuro i valori per integer1 e integer2, esso li
sommer e sistemer il risulcaco nella vari.abile sum. I.:isuu.zione
sum = integer1 + integer2;

Le locazioni di memoria dopo un calcolo.

2 .5 L 'aritmetica del C

la maggior parte dei programmi esegue dci calcoli. Gli operd.t<tri aritmetici del sono
Iiassun nella Figura 2.9. Osservare l'uso cli vari simboli speciali non utili7.zati in algebra.
I:.asterisco ( ") inclica la moltiplicazione, mentre il segno di perwm~ale (%) denota l'operarore modulo che sar inuodotto in seguito. In algebra, se volessimo molciplicarc a per b.
porremmo semplicemenre sistemare quesri nomi di variabili, composti di lettere singole,
l'uno di fianco all'akro come in ab. In C invece, se avessimo scrirro cosl, ab sarebbe stato
interpretato come un singolo nome (o idencifcamrc), composco cli due letrere. Di conseguenza, il e (come gli ali:ri linguaggi di programmaz.i0ne, in generale) richiede che la
moltiplicazione sia espliciram'eme denoraca, lltUizzando l'of?~rar>n~ , come in a * b.
Ope razioni in C

Operator e a rit m e tico

Espressione a lgebrica

Espressione C

Addizione

h7

p -c

p . e
b

* m

I y

Sorrraz.ione
Molciplicazione

bm

Divisione

x/y o

MGdulo

+ 7

Fig ura 2.9

..

Gli operatori aritmetici del C.

r mod s

o x+y

r %s

30

CAPITOLO 2

GLi operatori aritmecici sono rurri operarori b.inari. Per esempio, l'espressione 3 +
7 c.onciene l'opeJatore binario + e gli operandi 3 e 7 .

La divisiom tra interi resciru:isce un risulcato incero. Per esempio, l'espressione 7 I 4


sar_ :valutata 1, menrre il valore di 17 I 5 sar 3. lJ C fornisce l'operatore modulo, lii, che
r~tiruisce il resto cli una divisione rra inceri. Questo un operatore incero che porr essere
ut.i.Uzza.to soltancd ton operandi.-rueci. L:espressione x lii y resr:iruit il resco della divisione
aa x e y. Di conseguenza, 7 lls 4 restitui.r 3 , mencre 17 lls 5 produrr 2 . Discuteremo
melre interessami applicazioni dell'operarore .modulo.

lNTRODUZIONEAllA PROGRAMMAZ.IONEJN C

Le regole di priorit degli operat01i son direrrive che consentono al e cl.i valutare le espressioni
neU'orcline corretto. Nd momento in cui affermiamo che la valutazione procede da sinistra a
desrra, ci sciamo riferendo all' associati.vt degli operatori. Vedremo che alcuni operatori associano da destra a sinistra. LaEigura 2.10 riassume le suddette regole di priorit degli operatori.
Operatore/i Operazione/ i
Ordine di valutazione (priorit)
Parentesi

( )

Sono valucate per prime. Nel caso che le parenresi siano


nidificare, saranno valutare per prime le espressioni nel
la coppia pi interna. Nel caso che ci siano pi coppie
di parencesi "allo stesso livello" (ovve~osia non nidificate),
queste saranno valur.ar da sinistra a. destra.
Sono valutare per seconde. Nel caso che ce ne siano
moire, saranno vaJmare da sinisrra a destra.

Errore tipico 2.15


Un terittivo di divisione per zero di solito indefinito in un computer egeneraimente
causa un errbre fatale, vale a dire, uno di quelli che provqcano la terminazione immediata del programma, se!lZ'A che questo possa compktare con successo il proprio lavoro.
Gli errori non fatali consrotoM ai programmi di continuarefino al wro compktamentb,
producendo spesso per qei risultati non corretti,
Le espressioni aritmetiche in C dovranno essere scritte su una riga per facilitare l'immissione dei programmi nel computer. Di conseguenza, espressioni come "a diviso b "
dovranno essere scritte come a / b, cos che rurri gli opcrarori e gli operancli appaiano su
una stessa riga. La. noraz.iooe algebrica

*, I o

Molciplicari_ooe
Divisione
Modulo

9s

o.

Addizione
Sottrazione

Sono vaJutate per ultime. Nel caso c::he ce ne siario


molce, saranno valutate da stnistra a desaa.

Figura 2.1 O Le priorit degli operatori aritmetici.


Consideriamo ora diverse espressioni a.Ila luce deU regole cli priorit degli operatori .
Ogni esempi0 elenca una eSpressione algebrica e il suo equivalenre in C.

a
b

non generalmence accertabile dai compilatori, sebbene esistano alcuni pacchetti software
sgecializzaci, che supportano una noraz.ione pi naturale per le espressioni macemaciche
c0mplesse.
Le parentesi s,ono urilizzate oeile espressioni C in una maniera molto simile a quella
ucil.izzata nelle espressioni algebriche. Per esempio, per molripli.Care a volre la quancic b +
e , scriveremo:
a

31

(b

e)

Il e valuta l e espressioni a:raneciche in una sequenza precisa, dete.rm.ina1a dalle seguenti regole di priorit degli operatori, che sono generalmeme le scesse adottare in algebra:

l:esempio seguente cfilcola la media aritmetica di cinque termini:


a+b+c+d+e

Algebra:

n1

C:

m = (a

s
+ b + e + d + e) I 5;

Le parentesi sono necessarie perch la divisione ha una priorit maggiore della addizione.
Dovr essere divisa per 5 l'intera quanric. (a + b + e + d + e ). Nel caso le parentesi
dovessero essere erroneamente omesse, ottrremmo a + b + e + d + e / 5 che sareb.be

valutata in modo scorretto come

e
a+b+c+d+ -

l. Le espressioni o parti cli esse, <iomenure all'imemo cli coppie di parentesi, saranno valucare

_per prime. Di conseguenza, le parentesi potranno essere utilizzate per forzare l'ordine di
valutazione, in moda-che quesf.ultima si svolga nella sequenza deside,.ata dal programmatore. Le parentesi hanno il "massimo livello di priorit". N~ caso le parente.si siano nidificau saranno valurare per prime le espressioni della coppia pi inrerna.
2. In seguico saranno valutare le operaz.ioni di molciplicaz.ione, clivisione e modulo. Nel caso
che un'espressione contenga diverse operazioni di moltiplicaz.ione, clivisipne e modulo, la. va.lutazione proceder dasinistta a descra. La molripliCa!rione, la divisione e il modulo
si crovano allo scesso livello di priorit.
3. In ultimo saranno valutare le operazioni di ad.di.i.ione e cli sottrazione. Nel caso che una
espressione contenga diverse operazioni di ad.diz.ione e cli sottraz.iooe, la valutazione proce4er da sWsa:a. a desua ..Ancbe l'addiz.ione e-14 sottra.ione.hnno lo stesso Iivello di priorit.

I.:esempio seguente l'equaiione cli una linea retea:


Algebra.:

y = rnx+b

C:

y = m* X+

bj

In quesro ~ non sono richieste delle parentesi. La moltiplicaz.ione sar valutata per
prima poi:h essa ha una priorit maggiore della addizione.
!:esempio successivo contiene le operazioni di modulo (%), moltiplicaz.ione, divisione,
addizione e soruazione:
Algebra:

C: z

= p

= pr%q+w/x-y

* r lls q + w I x - y;
<D@ G)

'
CAPlTI:0.2

32

I nu)ne.r:i c~chia,ti sotto l':i.sr.ruzigne mdiean9 l;ordin:e ifl cui il C valuter gli operarori. La
mol4pl.k;1rione, il mo.dul0 e la diyi$.i'ofi!! saranno \7alutati per pnirni in ordine dasiuistra a
tle.5tra (ov,v~sa a!\SOCl)..FIO da sinistra a deste~), po~t:h.hantio una priorr~ .rnagg!o~~ della
addjii_ll fol[a so.ttrazione-. ln seguito sarruillo va!utre fal!dizjone e ta s~jne. Anche
queste savanno valmare da.sinisrra a desua.

N:n rurre le espre~sioii eri divers~ coppie di pare,nr<;sl eq11tengo!\.9 dlle parentesi
tridfc.a'te.

eesp r~sslone

(b

e)

+ e

(d + e)

non eontiene patentesi nidificate. Diremo invece

che le parentesi sono "allo stesso livello".

~ ql1~t~ s~ruazign i,. il valuter per prime le espre.<ts:ioni ndu.S rrelie parenresi in ordine

da sin'i'sc:ra a deso:a,
m<;>

Per sviluppare una miglior comprension delle regole di priorir .d,egli opetamri, vediae:Qm.e il C valuta Wl polinomio di secondo gtado.

y:

a* X* X+ b

*X + ,Cj

CD@$
J aumeci erbiati sorto l'isrru7-iene indlcano l'ordine in cill il C eseguir le operazioni. Nqn ~iste n~sun opeFator.e adrmc;tic.9 in
per 1'elevamenro a ptnza, pere
a.bbiamo tapprcsentiJ.to x2 tome X * X . La libreria: st.andard del e include La funzione
pow ("p$;lwr'", porehza) pe.r ~guire 1'.ele.varnento a f>.0tei,a. A caus;i; .~ a!Guni .insidiosi
pteolmi correlati ai tipi di &c .rithiesei da pow, rimandiamo la spiegazione derragiiara di pow fmo al Capitolo 4.

Sup,po.nete the-a = 2, b = 3, e = 7 e x
il precedeme polinomi!) di s<k:orido gra.:do.

= 5. La Figuni 2.11 mosua come sar. valUtaro

.JNrrRQlJU:llON l~ ALLA l'ROGR.<UYIM.PmONE IN C

2.6

33

Prendere delle decisioni: gli operatori


di uguaglianza e relazionali

Le isrruz.ioni ese~1ibili del. e e;:ompiono delle azioni (come dei calcoli o l'input e l'ourpm;
dei d;rti), oppure prendono delle decisioni (vedremo eresrn malti esen'\pi di questo ripq). Jn
un programma; per e.?rupiQ, pq~remm~ ptenqe:r una decisione per d_c:;termb:iawse il voto
di .Ufia persona in un. esame maggio<e o uguale a 60 e, in ral caso, vf$.ualir.tru: .iLme$s:aggie
"Cm1:gratula:z.ionil Aver $1'1peraro l'~am". Questa se-,ione i.1m:0duee mi semplice versi.o.ne dell stmttur di t'ontrollo i f del G, che clisente .a un pr.ogrmrima di prendere delle
dee::isoo basate sull<t verit 0 sulh falsit dl alcun.e esj:>re5siol chiatnare per l'appumo
atmdizioni. Nel cas.o in cui la: condizione sia sraua soddisfatta, oYVerosia nel caso in cui
risulti vera, verr ese:;guira i'istruzione pre~cr1teall'memo del eorpo della srnnrua i f. N el
gaso in :ui la. ;om;liziOD.~Jlon sia soddisfa rea. owerosia nel caso in cui cisl ci falfil, ~srruzio11.e prese);lr~ ;JJl' i qreot~ qel corpo nqn verr e.seguita. Oopq il compler;ne_
.ro dcUa stmttui'~
f, i.ndipendemen)ente dal faqo che l'istnqjone del corpo sia cs~guiI;'!. o noi l'esiuzjone
proceder cn l'istruzine succc:s.sicva alla srrmrura i f.
Le c<:>ndiziqni nelle $trtttture ' f sono formate usando gli vp1qJori di" ugr14glil!''n.Y4 e gli
o-perawri n:ktzi.fin_ttli rip.s.s_unti n,clla F.igru:a2.12. Gli OJJe1'acori re4izon~li h~fi.0 lo sc~so livello
di priocicl.i: e ,assoti:mp da s.iriistr:a a dStra. Gli pratori di uguagliru:iz banno un. livello di
pciorir pi basso degli 'Operatoci r.elazionali e associano da s.illisrm a destra. (Nora: in C, una
ndzi:bne pu e-ssere .in realt una espressiene che generi un valore. ugual (fulso) o diverso
(\tero) da ieEO. VedremG moke applicazioni dl ei nd corso del libr9).

O peratori aJgebr ici


di uguagli.nia
re lazi.o na li standa rd

Operatori
di uguaglianza o Esempio di
relaziona li in e condizio ne e

Significato de lla
condizione e

Op~rori di uguaglian2a

P~s.~1.

I=

f: y

x non ugul a y

>

>

X >

<

<

y
< y

x maggio.i;~ di y
x min0re di y

>=

X >=

:::;:

<=

X <= y

#.

x uguale a y

Operatori .relazionali

Pmso2.'

(l!J:inU.la ni()ltipll~ ne dell'addizione}

Figura 2. 12

Of!!~ratorl

y.

x maggiore o u,guale a y

x tnin.pre o u:iwale a y

di uguaglianza e retazional.

Errore. tipit'f> 2: 1()


(L'ad~ii'o'uc p_i:.uinsrrn)

$4t gentrato tjrt, -e:rron: di sintassi, se si s-epmera?zno '"{{'1 degli spazi i tf.11.'e sirnbii che
~omppngotfo pgi1uno .4.egli qperafjJ.ri --, I= , >= e <=.

Errore tipico 2.17

Figura ;2.11

Va!ut~ione 'd

un polingmie di secondo grado.

SarlJ:gertf!rat 1irz. envre di sintr;ts_si fl:' si :Jvertin;mw i.dite.simboli che com,pongarlQ ognurio
degli operatori I=, >=e <=, rispettivamente in =I, =>e=<.

UPITOLO

34

35

l.Nrn.ODUZIONE Al.I.A PROGRAMMAZIONI:. IN C

~ Error tipico 2.18

int n.uml , num2;

printf(.Enter two ntegers, and I Will ~ell you \ n");


printt { "the relationships they satisfy: );
/ *legge due interi*/
scanf{"\d%d ' , &num1, &num2);

Confondere l'operatore di uguaglianza == con quello di assegnamento =.

Per evirare questa confusione, l'operatore di uguaglianza dovrebbe essere ferro


1mme "doppio uguale?1 mentre l'operarore di assegnamento dovrebbe essere letto come
''prende". Confondere questi operatori, come vedremo presce, non prnvocher uecess.ariamente un errore di sintassi facilroenre riconoscibile, ma potr causare degli errori
logici molto subdoli.

~ Errore tipico 2. 19

ln.rerire un punto e virgo/,a subito dpo La parentest destra della condizione, t una
stmttura i f .
I.:esempio<lella Figura 2.13 uliua sei istruzioni i f per confronrare due.numeri immessi
dall'uceme. Qaaloca la condizione in qualcuna di queste isrruzioni 1f dovesse essere soddisfatta, sarebbe eseguita la funzione printf .SSociara a quell'if. Nella figura sono mostrati
jj -programma e. ere output di esempfo.
Osservate che il programma in Figura 2.13 ufu.z.a scanf per prendere i:n input i due
numeri. Ogni specifica cli COilYersione ha un argomento co_rrispondente io cui dovr essere immagazzinato un valore. U primo ~d convertir un valo.re che sar immagazzinato hella
variabile num1 , mentre il secondo convertir un valore che sar immagazzinato nella yariabjJe num2. Far _rientrare iJ corpo cli ogni isrruziooe i f e inserire delle righe vuote sopra e
sotto ognuna di queste, aumenter la leggibilit del programma. Nora.te anche che ogni i f
della Figura 2.13 ha una singola istrUZione .nel suo corpo. Nel Capi colo 3. mosrreremo
com e specificare delle i f ton corpi composci da pi isrruzioni.

if

<n~~1 == num2)
printf(''%d is equal to %d\n", num1, num2);

if (num1 I= num2)
printf(" \ d is not equal to %d\n', num1, num2);
if (n um1 < num2)
prntf(.%d is less than %d\n , num 1 , num2);

i f (num1 > num2)


pri n-tf( "%d is greater than % \n, num 1 , num2);
if (num1 <~ num2)
printf ("\d is less than or equal to %d\n",
num1 , num2) ;
if ( nurn 1 >= num2)
printf( 0 %d is greater than or equal t
num1, num2);

return 0;

\d\n~,

/1' i n.d ica che i l programma terminato con successo /

Buona abitudine 2 .12


Fare rientrare la/e istruzione/i nel corpo di una srruttura i f .
Buona abitttdine 2. I3
ln.serire.yer I.a lef,gibilit, una riga vuota prima e dopo ogni n:rtttturll. di controllo ih un
programm/J..

a fs

Buona abitudine 2.14

&nter t wo int elJers, and I will t ell ~eu

Non ti do1mbbe essere pi di una istruzione per riga i un programma.

the re l ationships tbey -satisfy: 22 1.2


~ 1s not equal t~ 12

Errore tipico 2.20

Inserire delle virgol.e (qt1ando non sono richieste) tra le specifiche di convmione nella
stringa di corztrolw del formato in una istruzione scanf.
/* Usare le istruzioni if, gli operatori
relazionali e quelli di ug uaglianza t
#include <stdo.h>
man()
{

Ent er two i nte ger s, and ! will tell ye.u


the relationships they s atlsf y : 3 7
3 is not e~ua4. to 7,
3 l s less thn 7
les s tha o o r e qual t o 7

22 is greater than 12

22 is greater than or equal to 12


Enter two integers , ana I Will tell
the relaflonslti~~ the~ s&tisTy : 7 7
7 i s equal to 1
7 is le~s tnan o r equal to 7
7 ~ greater than or equal to 7

yo~

Figura 2.13 Usare gli operatori d i uguaglinza e relai:ronali.

CAPITOL02

36

11 commento nella figura 2.13 spczzaro su due righe. Nei programmi C, i carartcrj

di spazio bianco come le tabulazioni, i newlinc e gli spazi, sono normaJmeme ignoraci. Di
conseguenza, le istrui.ioni e i commenti potranno essere spezzari su pi righe. Non in
ogni caso corretto spezzare gli idencifcamri.

LvrRODUZJONE Al.LA l~J~OG RAMMl\7.ION~. IN

37

stessi da parre dell'urente, l'esecuzione di calcol i le scruz.ioni decisiotiali. Nd prossimo


capitolo, ci baseremo su quesrc tecniche mentre incrodurremo la programmazione rtrurturata.
Lo studente diventer pi familiare con la tecnica ru applicare dei rientri al codice. Srurueremo come specificare l'ordine in c ui le isuuzioni saranno eseguire: il cosiddcuo

fl1tsso di controllo.

Buona abitudine 2.15

Una istruzione lunga potrlt eere distribuita su molte righe. Nel caso che una istmzione possa essere spezzotll su. pi righe, scegliete dei pumi di interruzione che abbiano
un senso (per esempio dopo urw vir,,'(o.fa in un elenco separato da virgole}. Nel caso
che una istrnzione sia stattl spezzata su due o pi righe, fate rientrare tutte quelle
successive alla prima.
L;i. tabella nella Figura 2. ] 4 mostra le priorit degli operatori in""rodorci in guesco
capitolo. Gli ppcracori sono mostrnti dall'alto in. basso, in 9rdine decrescente di priorit.
Osservare che anche il segno ru uguale un op.eraro,i:e: 1rti questi opera.cori, a eccezione
di quello d i assegnamento =, associano da si.illsu:a. a deStra. J...:operatore di assego,:uncnto
(=) associa da desr.ra a si nisrra.

Parole chiave
auto
const
double
float
int
short
struct
unsigned

break
continue
else
fo r
long
signed
switch
void

case
default
enum
goto
register
sizeof
t ypedef
vola1;ile

char
do
extern
if
return
stati e
union
While

Figu_r a 2.15 Le parole chiave riservate del C.

Brtona abitudine 2.16


Ogni volta che scrivete delle espressioni contenenti molti operatori, fate riferimento alla relativa tabella de/le priorit. Assiettratec11i che gli operatori nella espressione
siano eseguiti nell'ordine appropriato. N el caso non siate sicuri di tm ordine di
valutazione in una espressione complessa, usate le parentesi per forzare l'ordine,
esattamente come avreste fatto nelle espressioni algebriche. Assicuratevi di osservare che alcuni operatori del C, carne guello di assegnamento ( =) ,11ssoci11.no da destr11
a sinistra, invece che da sinistra a destra.
Operatori

Associativit

()

da sinistra a desua

<;

da sinistra

<= > >=

da sinis.mt a desrra
da ,sinistra: a destra.
da. si.nisr:a a. desrra

I -=

l. l

di ogni funzione.
c) Ogni isrruzione t~na con un ----~
della libreria standard visuafu.za le infocm:n:ioni sullo schermo.
d) La funzione
che muove: il cursore nella
e) La sequeo2a d'escape \ n rappresenra il cmmere
posizione ini7.ia.lc: dc:Ua riga successiva sullo schermo.
della librera standard utilizzara per leggere i dati dalla
f) La funzione:
r:iscic:ra.
. usara in 1rnastringa di con1rolio del formato di
g) L.'l specifica di conversione
una funzione scanf, per indicare che sar. immesso un incero, menrrc in uoa stringa di
controllo del formato cU una funzione printf, per indicare che sar visua.lizzaco LLD incero.
h) Ogniqualvolta un nuovo valore sar sis.remato in ~1na loc.1zionc di memoria, esso si sosri1uiri\ a.I va.lore conrenuro in preccdenz.1 in quella lueazione. Qucsco processo noto come

da desa:a a sinistra

Quando un valore nr lotAo da una locizione di mcm<iria~ il valore in quella locazione sar
preservato; questo proces.~o detLO _ _ ___.
urili7..Zata per prendere de.Ile decisioni.
j) ' I:istru:t,ione
i)

Figura 2.14 Prio rit e associativit degli operateri discussi finora.

Alcune delle parole che abbiamo usato nei ptogr:mmi C di quesro capitolo, in particolare i nt , retu rn e i f , sono keyword (parole chiave) ovverosia parole riservare del linguaggio. Linsjeme completo delle parole chiave dd C mostrato nella Figura 2. 15. Quesce
hanno un signifcaro speciale per iJ compilamre C, perci il progcammarore dovr3 srare
auenro a non ucili.zzarle come idencifcaroci, per esempio, nei nomi di variabile. In questo
libro, discuteremo di cucre le parole chiave.

ln quesro capirolo, abbiamo introdotto moire caraner:isciche imporcanci dcl linguaggio


di programmazione C, inclusa la visualizzai.ione dci da sullo schermo, l'immissione degli

Riempite gli sp:izi in ognun:i delle seguenri rigne.


a) Ogni programma C incomincia la propria escuzione con la funzione - - - - reanina il corpo
inizia il corpo di ogni funzionemenrre la
b) La

a destra

I %

Esercizi di autovalutazione

2 .2

Srabilire quali delle seguenti affermazioni sono vere e quali fulse. Nel caso siano f.lse, spiegarenc:

il morivo.
a) Quando sar invocata la funzione printf, questa comincer a visuali=re sempre dall'inizio d1 una nuova riga.
b) I commenci inducono computer a vUualizzare sullo sc~ermo il cesro racchiuso era/ e /
dwanre l'esecuzione del programma.
e) La sequenza di escape \ n, quando usaca in una stringa di controllo dcl formaro di una
funzione printf, mduce il cUISorc a posizionarsi all'inizio della riga successiva sullo schermo.

38

CAJ."JTOLO

d) Turce le variabiLi devono essere dichiarare prima di essere utilizzare.


e) A curce le variabili dovr esscre~segnaco un tipo, quando saranno dichiarate.
f) 11 C considera identiche le variabili number e NuMbr.
g) Le dichiarazioni possono a~parire in quals.iasi parre dd corpo di una funzione.
h) Tutti gli argomenti successivi alla srringa di cencroUo dcl formaro in una funzione printf
devono essere preceduti da un ampe.rsand ( &)
i) I:operacorc modulo (l\s) pu esse.re urilizz.am solramo con degli operandi interi.
j) Gli opera cori aricmetici , / , \ , + e - hanno runi lo S(esso livdlo di priorit.
k) Vero o falso: i seguenri nomi di variabili sonoidencici in curci i sistemi ANSJ C.

INTRODUZIONE /\Ll..J\ PROGRAMMAZ!ONE IN

2.3

2. 1

a) main. b) pare?tesi graffii aperu ( {) . e) parentesi graffa chiusa (}) . c) punto e virgola. d)
printf. e) ncwlrne. f) scanf. g) \d. h) scrirrura disrrurciva. i) Jetrura non distruttiva. j) if.

2.2

a) Falso. La funzione princf incomincer sempre a visualizzare laddove sar staro siscem:no U
cursore, e quesro potr essere ovunque su una riga.dello schermo.
b) fulso. 1 commen non causano l'esecuzione di nessuna azione durante l'esecuzione del
programma. Essi sono usaci per documeocare i programmi e migliorare la loro leggibilit.
e) Vero.
d) Vero.
e) Vero.
f) Falso. ue disngue fra maiuscole e mlnusool, perci queste variabili sonc> diverse.
g) Falso. le dicbiarazioni dovranno apparie dopo la pa.rC.ntesi graffa aperta del corpo di una
funzione e prima di ogni istruzione eseguibile.
h) Falso. Gli argomenci in una funzione printf clinoJ l2 non dev.ono e$sere preceduti da un
ampersand. Gli argomend successivi alla stringa p~ controllo del formaro di una funzione scanf dovranno essere preceduti d1 norma da llia ;.mpersand. Discureremo delle eccezioni nei Capi coll 6 e 7.
i) Vero.
j) Falso. Gli operacori " , I e \ hanno lo stesso livello di priorir, menr:re gli operarori +e - sono
a un livello di priorit pi basso.
k) Falso. Alcuni siscemi possono disringuere degli ide.nti:ficatori con pl di 3 J caratteri.
I) Falso. Una istruzione printf con moire sequenze di escape \ n pu visuaLiz.zare canee righe.

2.4

Vero o fulso: un programma C che visualizzi tre righe di output dovr, concenerc ue
istruzioni printf.

Scrivete una singola istmzione C per eseguite 9gmmo dei $eguenti compid:
a) Dichiarate le variabili e, thisVariable, q'78354 e number di ci po int.
b) Richiedete aU'ucence di immettere unlntero. Terminatell vosr.romessagglo di richiesra c-0n
un due punri ( : ) seguito da uno spaziQ e lasciate il cursore posizionato dopo lo spa:iio.
e) Leggere in input un .intero dalla tastiera e immagazzinare il valore immesso nella variabile
intera a.
d) Se La variabile number non uguale a 7, vistlizzare ' The variable number is not
equa! to 1 .
e) Visualizzare il messaggio "This is a e program. su una riga.
f) Visualizzare il messaggio "This is a e program. su due righe, dove la prima termina
eon e .
g) Visualiwue il messaggio "his is a C program . con ogni parola su una riga separata.
h) Visualizzare il messaggio "This is a e program . con ogni parola separata da una
tabulazione.
Scrivere una iscruzione (o un commemo) 11et esguire ognuno dei seguenti compiti:
a) Indicate che un programrha cakolei: il prodrro cli rre inreri.
b) Dichjame le variabili x, y, z e result di po int.
c) Richiedece all'utente di immeu:ere ue-interi.
d) Leggere in input cre iarerl dalla mciera..c immagazzinaceli nelle variabili x, y e z.
e) Calclate il prodocro dei ae inceri ct>ntenuti nelle variabili x, y e z, e assegnare il risulcaro
alla YariabiJe resul t .
f) Visualizzare "The product is seguit d;il valore dlla variahllc re sul t .

.2.3

int e, thisVariable, q76354, number;


printf("Enter an integer: ");
scanf ( .,\d", &a );
if (number I= 7)
printf('The varia.ble number is not equa! t.o. 7. \n);
e) printt ( ' This is a C program. \n ) ;
f) printf( ' This is a C\nprogram.\n ' );
~ printf (' This \nis\ na \ nC \ nprogram.\n ");
h) printf( "This\tis\ta\tC\tprogram . \n);

2.4

a)
b)
e)
d)
e)
f)

2.5

a) /."' Calcola i l prodotto di tre interi


#inlude <stdio. h>

2.5

Usando le iscruzioni che ave ce sericeo aell'Escrdzio 2 .4, scrivete un programma complem che
calcoli il prodocro di ere inceri.

2.6

ldentifcacc e correggere gli errori in ognuna delle seguenti istnttioni:


a) Pl"'intt ( "The value is '!\id\ n, &number );
b) scanf ( "\d\d , &number1 , number2 l;
d)

i f (C < 7);

printf("C is less than 7\n);


d) i.f (e => 7)
printf( e is equa! to or less than 7\n");

39

Risposte agli esercizi di autovalutazione

thisisasuperduperlongname1234567
thisisasuperduperlongname1234568
I)

a)
b)
c)
d)

I* Calcola i l prodotto di tre interi ~ 1


i nt x, y, z, result;
printf ( ''Enter t hree integers: ") j
f
soanf ( "%d%d%d" , &x, &y, &z) ;
tesult = x * y z;
printf("The product is %d\n", result) ;

ma.in()
{

int x, y, z, result;
printf('Enter three integers: ');
scanf( '\d%d\d', &x, &y, &z);
result = x y z;

*/

CAPrro1.o 2

40

rNTRODUZIONE f\IlJ\ PROGRAMMAZIONE IN e

d) Una espressione aricmecica in C valida, cbe non comicne parenresi, sar valurata da
sinistra a cl~stra.
e) Quelli che scgitono sono e.uni nomi di vari:tbilc noh validi1 ~g, 87, 67h2, h22, 2h.

prlntf( "he prodl.lct is \d\n, result);


return 0;

2.6

Errore: &number. Correi.ione: eliminare il carattere &. Pi mrdi nel tesco discuteremo deUe
eccezioni a quesca regola.
b) Errore; number2 non ha un ampcrsand. Corre-tione: number2 deve essere &number2. Pi
avanti nel libro diseiueremo delle eccezioni a quesm regola.
c) Errore: il pumo e yirgola dopo la parcncesi dcsrra della condizione dcll'iscruzione i t .

a)

Correzione: ri muovere il punro e virgola dopo la parentesi destra. Nota: il risultato di


questo er.rorc sar che l' istruzione prntf sar esegrril'l) ind.ipc!lldentcrnemc dal fatro
che la condizione della istruzione 1 f sia>'cra o no. Il punrcl e virgola dopo la parentesi
destra sar consideraco alla scessa stregua di una isa:uzione vuoca: una isrru1.ione che
non fa n.ience.
d) Errore: l'operatore relazionale=>:, dovr essere cambiaro in>=.

2.11

2 .12 Che cosa sar visualizzare (se lo sar), quando ognuna delle seguenti.istruzioni C-verr esegui
ca? Nel caso in cui non venga visualiu-A1co nien.ce, rispandete "niente". Assum~~ che x ~ 2 e y " 3.
a) printt('\d '', x);
b} prntf( ' \d", x + x);
e) pr.i,rrtf ( qc= .. ) ;
q) pritJtf ( X=%d11 1 X) j
e) printf(u%d =%d .. , x + y, y + x);
Z =X + y;
g) scairf( %d%d, &x, &y) ;
h) /W printf(X + Y = %cJ, X+ y); T/
i) prirrtf( \O);

fdencifcarc e correggere gli errori in ognuna delle seguc.-nri istmzioni (Nora: pouebbe esserci
2.7
pi cli un errore per iscru7.ione):

f)
g)

scanf("d", value);
printf( "he product of %d and %d is '.\ld''\ n, x, y);
firstNumbe r + secondNumber = sumOfNumbers
i f (number => largest)
laq:_iest = number;
"I Program to de:termine :the largest of three intgers /
Scanf(.%d" , aninteger) ;
printf( "Remainder of l\sd divided by %d is\n", x, y, x % y);

Ji)

if

i)

printf(\d is equal to %d\n'', x, y);


print ( "The sum is l\sd \n, x + y) ;
Pri ntf('The vaiue you entered is : %d\n, &value);

b)
e)
d)

e)

j)
2.8

2.9

(X:

y);

Riempite gli spai.i in ognun:i'deile seguenci dghe:


sono uciliz.zari per docum.ntare un programma e migliorarne la leggibilit.
a) l
per visu;tlizzarele informazioni sullo schrmo _ _ _ __
utilizz<tra
funzione
b) La.
e)' Una iscruzione C che prenda una decisione um _ _ __ _
d) I calcali sono nonnalmcnrc eseguld dalle istru.iio1 di _ _ _ _ _
prende in input: dilla casciera dei valori.
e) La funzione
Scrivcce una: singola istruzione C o una riga che esegue pgnuno de.i ~egucnci compiri:
a) Visualizzate il messaggio "Enter t wo numllers.
b) A.~scgnare alla variabile a il prodorro di be c.
) Tndia.te che un programma esegue lLD sempio di calcolo dello stipendio (ovverosia,
ucilizz;;tte un resro che aiuti a docurncncare un programmn).
d) Prende.te in inpuc dalla rasciera ue valori inceri e memorizzaceli nelle variabili a.b e c .

2.1 O S"Ci.bilfre quale delle seguenti alfo:mazi<mi vc.ra e quale falsa. Morivace le vome cisposre.
ti) GJj Operacori del C sono V:'lluraci da .'ifl'listra a destra.
b) Quelli die scguon9 sono tun:Lnomi cli variabile validi: _unde r _bar_, m928134, t5. j 7,
her_sales , his_~ccount_total, a, b, c.z,z2 .

e)'1 I.: i ~i.one printf( "a

= 5;. ~ ) i un lipic;o esempio di istruzione di assegnamento.

Riempite gli spa1j bianchi in ognuna delle segucnci righe:


a) Quali operazioni aricnmiche hanno lo sccsso livello di priorit11 della molplica1.ionc?
b) Quando le parentesi sono nidificate, quale gruppo di paremesl sar valutalo per primo in
.
una espressione arirmeci~
e) Una l9c:uione della memoria di un computer che pu conrcnere valori diffcrenci, in vari
momenti della esecuzione di wi programma. rrna - -- - -

Esercizi
~)

41

2. 13

Quale delle seguenri istrniioni C, se ce n' una, contiene delle variabili coinvolte in Ltna lemmi

d.isrrutciv:'I?

a) scanf("%d\d%d%d%d, &b, &e , &d, &e , &f);


b) p = i + J + k + 7;
e) printf(''De structJ.ve readin ");
d) printT("a = 5');

2. 14 Oarn l'equazione y =
per quesca equazione?

a.~

+ 7, quale delle seguemi isrruzion i C, se-ce n' una. quella c:orrerta

a) y = a X * l( X + 7;
b) y = a~ X .. X (X + 7) j
c) y = (a " x) ./,. X (x + 7);
d) y = (a x) .. X X + 7;
e) y = a " (X * X,. X) +7;
f) y=a .. x (X )( + 7);

2. l 5 lnJicate l'ordine cl.i valutazione degli operarori, in ognuna delle segucmi isau7jonj C, e mostme.il valore di x dopo che.ogni iscruzioue sar stara cscguica.
~

X= 7 t

3 ~ 6

I 2 - 1j

=2

% 2 + 2 2 - 2 I 2;
~ X= (3 . 9 ~ (3 + (9 3 I (3))));

b)

2.16 Scrivete un progrnmma che chieda all'urente dj immerrere due nur,ned, ottenga i n.unwri
dru.l'ureme e visualizzi la loro somma. prodorw, differenza, quozienre e niduJo.
2.17 Scrivere un programma che vi.sualizi.i i numeri da I a 4 sulla stessa_riga. Scri~ce il programma
utilizzando i seguenti mctdi:

42

CA.PrroLO 2

lNTROD UZlONE ALLA PROGRA'MMAZfONE l:N

a) Usando una jscrui.ione pri ntf .senza specifiche dj conversione.


b) tJsando una isuuzione printf con quaccro specifiche di conversione.
c) Usand_o quarr;ro istruzioni printf.

A p
p
p

JJ
J
J
J
JJJJJJJ

tdJUhi)
D
O

rniJQt three differen t integers : 13 27 14


SLln is 64

D
D
D
I>
mllO

A'Vrage iw i.e
Product .i8 4914

Slllallest :ts 13
'Laf&est fs:Zl

2.20 Sc.civete un programma cne legga il raggio di un cerchio e visualizzi


il diametro, la circonferenza
e l'area dello stesso. Usare il valore rostame 3,14159 per pi. Eseguite ognuno
di questi calcoli all'interno della/e isrruzione/i printf e usare la specifica di conversione%f. (Nora:
in quesco ca_picolo abbiamo
a:atcato solranto oosronti e variabili ince,re. Nel Capitolo 3 discuteremo
i numeri in virgola mobile,
ovverosia quei valori che possono.cootcneye dei decimali.).
2.21 Scrivete un programma che visualtti una scacola, un qvale, una
freccia e un diamance come i
segucnri

,,*

*
,.*
*

,. .,

il'

llfllt

2.22

il'i-

..

...

!/t

......,..
...

"'

2.27 Visualizzate il disegno di una scacchkra utilizzando ono istruzion


i pri ntf e quindis c:unpare
lo stesso disegno, con il m'inor nu.merq possibile d'isrruz.ioni pri ntf.

** *

.. .. ,.,., .

1*

"*

"* *
...
...

Che cosa visualiz.zecl il codice seguente?


prlntf( 01 \n**\n~ \n ~ \n* \n);

2.23 Scrivere un progt-amma che legga cinqu inceri e quindi determin


i e visualizzi quclli che,
all'interno dd gruppo, sono il maggiore eiJ minore. Usare soltanto le tecniche
di programmai.ione che
ave.te appreso in quesco llpirolo.
2.24 Scrivere un programma che legga un incero e dececmilli e visualizz
i ~e sia pan o dispan.
(SuJ;gerimChto: usare l'oprarore modulo. Un numero pari un multiplo
cli J:l ue. Ogni multiplo di
due d un resto u~ale a zero, quando dlviso per 2.)
2 .25 Visualizzate le vo~.tre iniziali i1ummparef10 in direzione del fo n~o
dellapagirui. Costruire ogni
lene.ca in srampacello ucilizzandolo StC:SS'El caran:ere che essa rapprcsenra,
come segue:

* *

lil"* it

*"'

:jl

.....

2.26 Scrivece un programma che legga due interi e determilli e visualizz


i se il primo sia un multiplo
del secondo. (S,uggccimenco: usace l'operato re modulo.).

*"'*

p
p

Pi'

2.19 Scrivete un programma C che prenda in in pur dalla casera tre diversi
inceri e qujndi visualizzi
la somma, la media, il prqdorro, il minore e il maggioi:e dj quesci numeri.
Usare soltanto la form:i a
selezione singola della isl'.CUzione if che-avete appreso in quesco capitolo .
Lo schermo di dialogo dovr
apparire come il seg_ucnce:

il'

43

PPPPPPPPP

2.18 Scrivete un programma che chieda all'ucenre di imrem:ll due


imeri, orcenga i numeri e
visualizz i quello maggiore seguito daUe parole is larger. . Nd caso
che j numeri siam> uguali,
s~anipate il messagg io rhese numbers are equal. . Usare soltanco
la forma a selezione: sing,ola della
istruzione if che avere appreso in questo capitalo.

~;~ Il*

2.28

Discinguerc era i termini errore fatale ed errore non farale. Perch pouesce
preferire di incorrere

ja un errore fatale, invece che in uno non facale?

2.29 Diamo ora una sbirciataJn avanti. f n quesco capirolo avere appreso
degli imeri e del tipo int.
Il pu rapprese ntare ancheJe lertere maiuscole, quelle minuscc:>le e una
considerevole varier di
simboli speciali. IJ usa incemamcnre degli interi di un hyre per rapprese
ntare ogni singolo caracrere.
Linsieme dci caratteri usati da un c_ompur~r e la <;c:>([ispondence rapprese
acazjone incera per quei
carartcd J'insieme dei caratteri di quel computer. Porrete visualiziare l'intero
equivalente ddla lettern
maiuscola A, per esempio, eseguendo l'immionc:

printf( 9gj, 'A') ;

Scrivete un progrnmma ch.e -visualirn gli inceri equivalenti ad alcww lettere


ml!iusco le, minuscole,
numeri_e simboli spe'c.iali. Decerminare, come nlinimo. l'imero equivaleme_
di: A B C a b e 0 1 2 S
" + I del cararrere spai.io.

2.30 Scrivete un programma che prenda in in pur un numero di cinque cifre,


lo spCZ1.etti nelle sue
Singole cifre e le visualizzi ognuna separata dall'slrra da m: spazi. Per esempio
, se l'utcme digira.sse
42339, il program ma dovrebbe; visualizzare
4

44

CAPITOLO

2.31 Usando solranto le tecniche che avere appreso in quesro c:apirolo. ~crivere un progr:imma che
calcoli i quadraci e i cubi dci numeri da Oa IOe uc$ni le Eabul_azioni pervisual.iu:u:e 1::1 seguente rabclla
ru valori:

nunero

quadrato

G!tlo

0
1

0
1

21

5
6

9
16
25
:Il

8
9

64
81
100

10

6'I
125

CAPITOLO

Lo sviluppo di programmi
strutturati

"216

3113
bl2

Obiettivi

Comprendere le tecniche fondamentali per la risoluzione de.i pcoblemi.

100;0

Essere 11 grado di sviluppare algoritmi, utilizzando il processo rqp-dowo per


raffinrunenci successivi.

ESsere io grado di ufiHzzare le stmmue d.i selezione ife i f I else, per selerioun.re le
azioni.

Essere in grado di utilizzare la smurura di iterazione while, per eseguire


ripetuta.mente delle i.struzioni, io un programma.

Comprendere i cicli concrollati da un contatore, o da un valore sentinelJa.


Comprendere la programmazione scrum.a.rat.a.
Essere in grado di ucilin.are gli opera roridi incremenco, di decremento e di

assegnamento.

3. 1

Introduzione

Prima d i secivere un programma che risolva un particolare problema, essenziale avere una
piena comprensione di qucsr'uhimo e un approccio pianificata con cura per risolverlo. I
p rossimi due cap.iroli rrarrcranno delle rccniche che facilirano lo sviluppo di programmi
si;rurtura per computer. Nella Sezione 4.11, presence.remo un sotn.mario della program.JDazione srrutturara, che merrer insjeme le tecnjche sviluppate in .quesro e ne.I Capirolo 4.

3.2

Gli algoritmi

La risoluzione di ogni problema di elaborazione c0mporta. l'esecuziorre, in un ordine spcuna serie di azioni. Una procedura che risolva un wablema in termini di

cific:o, di

l. azioni che devono essere eseguire e

2. l'ordine in cui rali azioni devono essere eseguire


derra algoritmo . .eesempio seguente dimoscra che impora.nre specificare correrr.amenre
l'ordine in cui le azioni devono essere esegillre.

Considerate l'algoritmo "al7.ari e briUa" adorrato da un giovane dirigeme per alzarsi dal
lerco e andare a lavorare:

46

C APITOLO

Alzarsi. dal letto.


Togliersi il pigjama.
Fare una doccia.
Vestirsi.
Fre colazione.
Prendere l'auto per recarsi al lavoro.
Questa procedura p.ona al lavoro il dirigente, ben preparato ~er
prender~ delle decisioni critiche. Suppc,mete, ttmavia, che quegli stessi passi siano eseguit
i in un ordme Leggermente diverso:
Alzarsi da! letto.
Togliersiil pigiama.
Vestirsi.
Pare una doccia.
Fare colai.ione.
Prendere l'auro per recarsi al lavoro.
In quesro caso, il nomo giovane dirigent~ gi~gerebbc ,al la~or~
con;ipl~tam~tc .inzuppato. 1n un programma per computer, la specificaz..Jon deU erdlne
m cude isr_ruz10111 ~evo
no essere eseguite chiamata controllo del programma. In questo
e nd prosstmo cap1tolo,
esam:ineemo con.cura le possibilit offerte dal per il controllo
del programma.

3.3

Lo pseudocodice

Uno_pseudocodice un linguaggio artificiale e inform ale, che aiuta


i programmac?ri a sviluppare gli algorirmi, Lo pseuciocodice che presenciamo i.o. ~uesto
contes~o parucoLai:mente
utile per 19 sviluppo di algocito~ che sai:n~o c.on.veru~ .m .pro~
~mt .e si;rua:uraa. U~o
pseuliiocodlce un linguaggio si.mile ali'ttal.1ana dt rutti 1 gior~;
e pranco e maneggevole,
scbb:ne non sia realmente un vero linguaggio di pro~ramrna:z.iorte.
furcal r, i pr-0grammi scritti ~ pscudocodice non possono essere
esegui.ci sui comput~r.
Essi, piucrosto, aiutano il prograaimacore a "riflettere" sul pr~gra
mma, ~rima c.h~- provi _a
scriverlo in un linguaggio di prngrammazione, Ome il C. Fornire
mo mol_a ese~~ rn questo
capit):>lo, per mostrare come uno pseudcodlce possa essere efficac
emente urilizzaro flello
sviluppo di programmi C Strutturati.
Uno p.seudocodlce composto semplicemence da cararteri . perci~
~ programm~tori pottanDO immercere in un compu ter i programmi
in pseudocodice~ uri!iz:an~o contorcevo~
menre un edlcO'r di cesto. U computer ptr v.isualiz:iare o scampa
re, a nch1e5ta, una cop!a
aggiornata di un programma in pseudocodice. Questo, se prepa.r<
tto c?n c~ra, po~ facilmente essere convertito in un corrispondente programma C. I.a
moln casi, ruc.co CL .sar
ottenu to ~osruendo semplicemente le istruzioni in pseudoodice
con quelle equNalenn nd
linguaggi C.
Uno pseudocodice consiste unicamente di istruzioni~ azione: oy.ve.co
sia,. qelle che sa:
ranno eseguite, quando il programma sar s~o ~rrv::rn~ ~~
psewiocodice al e e .sara
srac9 eseguito in C. Le dichiarazior non sono JStruz1on1 esegrnb1l1.
Queste sonq messaggi per
il compilarore. Per esempio, la dichiarazione
i.nt i i

LOS\filUl'[IU 111 PROGRAMMI ~TRUTT1JRJ\Tf

47

indica. semplicemente il tipo di daw della variabile i, al. compilarore,


e induce quesr'uJciml>
aJ:iservarc uno sp~io in memoria per la suddet ta variabile. Quesca
dichiarazione, dunque.
non provocher l'esecuzione di nessuna azione (come un iopuL,
u-n ourpm, o LI.Il calcolo),
quando il programma sar eseguito. Alcuni programmatori scelgon
o di elencare ogni variabile e di menzionare brevemente gl i scopi di ognuoa di quesre, all'iui~
io di un programma in
pseudococUce. D'alrroode, uno pscudocodice un aiuto inform
ale allo sviluppo dei progr.untni.

3.4

Le strutture di controllo

Normalmente, le isuuzioni prescnri iu un programma sono eseguir


e, un:a dopo l'alua, nclf'ordine in cui sono srare scrirte. Parleremo perci di esecuzme
sequenzl/e. Varie istruzioni
del C. delle quali discur.eremo presto, consentono al progr:a.mmaro
re di specificare che la
successiva istrll7ione da eseguire possa essere diversa da quella
efforrivameme susseguence
nella sequenza. Quesro cipo di indicaz.ione det{a tmrftrimento
del controllo.
Duram e gli anni '60, divenne evidcnce che l'urili27.o indiscriminat
o dei trasferimenri di
con crollo raJa cau.sa prima di una gran quanc di difficolt sperim
entate nei gruppi_ per 10
sviluppo del sofrwa.re. Cindice deJl'accusafu puntato sulla ~truzio
ne goto, d1e consen va al
programmatore dl specificare w1 rr;isferirneoco di comrollo verso
una di lln v.astissimo raggio di possibili destinazioni all'interno di un programma. La
nozione della cosiddetta
programrnaz10ne strutturato divenne quasi un sinonjmo di ''elimi111
zzione dei goto".
La ricerca di Hohm e J:u:opini (13ohm, C., and G. Jacopini, "Plow
Diagrams. Turiog
Machines, and Languages witb Only Two Formarion Ru.les," Commu
nioatioru of the.ACM,
Voi. 9, No. 5, May J 9Q6, pp. 336-371.) ha dimosrrato che i
programmi possono essere
scritti sem.a usa.re nemmeno una is.truzione goto. La ~fida dell 'epoca,
pr i prgrammamri,
divenne qudla di cambiare il proprio stile in una "programmazione
senza goto". Ma fu solo
nel pieno dt;!gli anni '70 che Ltna gran quanti~ di progr:ai:nmacori
comincio a prendere
ser.iafueme io considerazione la programmazione srrunucata. l
risulraci sono stad davvero
imp(essi.onaoti, dato che i gi:_uppi di svifoppo (}ttenneco: tempi
di produzione ridotti, punrualir pi frequente nd consegnare i sistemi, e una maggior freque.
rua di compleramenri
dei progetti software m.j termini previsti dal budget. La d1i::1ve di
questi ~Lttessi sempJkememe il l'atto che, con l tecniche scnmurare, i programmi prodot
ti sono pi ch:iari, facili da
mettere a punco e modificare e, innanzi turro, con maggiori probab
ilit di esse.re esenti da
errorJ.
U lavoro di B0hm e Jacopini ha climoscrato che cutti i programmi
posson o essere sccirri in
termin i di tre sole strutture di comrolfu: la stn1ttu rn di sequenza,
la sm1ttu rtt di selezione, e la
struttura di iterazione. La struttu ra di sequenza implicita i.11 C. Sempr
e che non gli si ordini
diversameme, il computer esegue automaticamente le isrruzio
ni dd C, una dop() l'altra,
nell'o.rdin.e in cui sono sr-aresccitte. Il segmento illdiagramrnadifluss
o (flowclmrt}' nella l?lgura 3.1 illusrra la srrumu:a di sequeni;i dd C.

Oo digr:unma di flusso una rappresentazione grafica di uo algoria


no o di una porzione cli guesco. I diagrammi di flusso sono disegna usando cerri simbol
i con signil~ speciali, come i re.mmgoli, i rombi, gli ovali t i cerchierli; quesri simbol
i sono connessi tra loro da
frecce chiamare linee di flusso.
1

~1

48

CAPITOLO 3

LOSV14UP.PO DI PROGRAMMI S'IRUlTURATI


due differenci :12i0ni. La struttura swicth detta sti'Uttra
se)eziona una tra v.a.cie d.i.ffeten- qoi.

di felezione?(~'l:lltip/a,

perch

li C forni.sce tre ripidi strutture di iterazione: il wh_ile (Sezione ~.7), iJ d(> / Whi le e il
for (emrambi d:is_cussi nel Capit9l9 4).

aggiun_gl Il voto
al totale
totai = total + grade;
6ountr ~ eountr 1' '1 ;

aggiungi I
al contatore

Figura ~. l

49

Il di~ramma di flus~o ~ella struttura di sequenza del C.

Allo stesso modo dello pseuCl0codice; seblkne qaes:ro sia piefecito da molti programmatori, i diagr.ammi di flusso sono uli per sviluppare e rappresentare gli algoritmi. I
diag_rammi di 'flusso n10scrano con chiarezza il modo in <::ui operano le sb:urrure i conrrol~
1111; in q~m resro li useremo sqlo per tale scQpo.
Cnsiderare il sgmenro di diagramma di flusso per la structuca sque.nzi.al mosrrato
nella figur-a 3.1. Us~mo il sfmbokJ .rattangp/.o, chiamato anche simbolo di aifo11e, per indicare o,gni ripo di artiv.it che iotjuda uo.cralcolo o una ~peraz.ione di inpur/ourpm. Le linee di
fl.sso preseot:LneUa 1igll.CiJ. imijcano liordb;le in ~ui le azimi de:>v,i;anno esse[e eseghe: in
ptimo. ltu).go, grade pp:v:r essere :J.ggiunro .oa tot al, : quindi 1 ~ovr ess~r; spmm.ato -a
ou'nt~r. 11
<::i ~#rte di ave.r-, in Q.na s.truttt.iia di ~e.quer;iza, P!nte azioill q.qai;1.te ne
V:ogli)mo. Come-vedremo p.!i.~(o, porranno e:ssre inserite niolre isrruzio.niiMequ~zaladHove

n pssa ciser~ss'tniata una.

NeJ dis~w.r;rre un..P.iagraj:nnf~ li Auss~ cbrapp.r~enri un alg!:'> riimo co1r_ipi~o, il primo a


essete ucili:iz;uo sart il simbolo ovate cont.enenre la ~parola "Iriizi0";. melitl'e un srmb~IO ovai~,
~oncenenr.1a parola "Fine!' ,sai l'ultimo simb.olo urilizzatb.. Nd dlsegnate sol.o una porzione
ai un algoritmo, come nella Figura 3 .1, i sjmboli ovali saranno omessi, in favore ddfiuiJizzo
di simbolicerchietto decti anche simbolidi connessione.

T1 simb0l pi imporrame dej diigramm,i .di flusso forse il simbofp romb'Q, derro anche
si.rilbo.lo di d.csiinze, .indieanre che dovr, SSre.eseguica ima selta..Disea.trillo .dcl s.iri:.th.lo
romb0 nella prossima sezione.

TI Cfomi.St rre tipi di srrutnire di selz.ion~. La stn.i'ttura d i selezione. i f (Seri9rie 3 .5};


nel Gso 'Gh una "data. condizione sia ver-a, eseguir (selezioner)' una eerta a.Ziorie, m.ntre la
ignrera, nd c::aso che la cndizione sia falsa. La strutrura dj sel.ezione i f /.els (S:Zione 3.6)
e5eguir. una certa az.ione1 nel caso <::he u~<J. data condi.zienesia v.el'<l, mentre ue es~guir una
differente, nd. ~ clic; la S:Jlddeyca. 9ndizon. sia: fal~.a. ~ ~!J'.oa:ura. di Clip}le swi tcb
(dJi.su.<;Sa
eipitolo 4). scgll~r ~d eyguir. una ~tante ~emi ~n.i, s~cn,d.o il valo-

nel

:r_e' as,sun,r(! .da p.na ~.ra, espr.s:sJene.

La struttur"- i f detra strutturadi selezione singola, perch seleziona o ignora una singola azio!le. La $trumir-a i f I else 4etta str/t'tttl.rq di selezione i/.ppia, p.erch'-s~eziona una di

Qu.stotutto.11 Chasolramo sem:srrurrure di conrroilo: la sequenza., ue tipi di.st;Iezion.e e altretranci di iterazione. Ogni programma C fomUJ.to dalla c9mbinaz_ione di 9gnuo11
dlle Sildderie srrua:rae- di controllo; uriliz1.are .in q,ua:.nrit. appropciaJ:e .al pcigramma che
lmplementa l'algoritmo. Vedremo che ogni strurtw'.a di conrtoll0, .Ome quella sequenziale
della Figura :3..1, ba due sin1b0li cetcbiectq, ua nel punto di enrr_ara. e Val.rro in quell0 di
uscita-. Queste-mtUtlffe ef/i i;ontr'o{ln can 1"Jl ingre{fQ. l t+'M uscita singoli sempll:fiduio la cosrmzione dd progt-Mnrni. L:stro:ttute di cont:rllo possn:o essere arratace Funa all'altra, colleg<111do il punfo di uscita di urta di.esse con"'qu.1.16.di entrara della successiva. Tutro i9 .moltt>
simile. al modo in ui i l:5amb.ini lnnesrano i mattoncini delle costruzioni, p~ci cltiamianio
quesro modo di operare ttacatastttmento dellestruttu.re di omrollo. L:npareremQ che c:' solcamo 'Ul1 altro modo in cui l~ ~trurrure di coni:rqllo porranno essere ~~te: QVV'ecos:ia, un.
merodi c_h.ia.maro nidificazjqne .delle sttttur- di tgtrttoll.o. Di q:mseguenza., qualsiasi prgntmma Cl di q.ti'po.rremm0_.y.er bisogno, potr itsser.e cosuuito ucilii,zando solamente serre
cipj di srrurruie di ontrbilo, .c::ombinate in due soli modi.

3.5

La struttura di selezione lf

Bna suutturn. di sdezit<me U$ata per scegliere r.ta per corsidi azi0ne :ilremacivi. Per ~ernpo,
suppgnere cly; la votazione pe:r superare un es:ue s'1<1: 60. l!isti:uzione in pseudomdlce

Se il 11oto dllo studente maggiore o uguale a 60


ViiualiZ2!1l '"Promosso" .
,deremi;na: se l;i.. condizione "vero dello srudente m.ggiore o uguale a 60'" vera o fal~a.
Nd c;aso in ci la c0ndizi-0r sia. v.ra, sar visuali'zzato ''Promosso" ed "eseguita"; l'tstruzione succeS-Siva, nell'online. indicato dallo pseudoeodice (riqirdace che_q.uesto non un vero
linguaggio di pi:ogp.mmazione). Nel. qiso in c;ui la condizione ~ia fab~, la visual.izzzione
sar ignorat:a: e ~ar. eseguita ristruzio'qqutces~iva, nell'ordine i ndka'to c:lallo l'~udo-cod.i.ce.
Osservat.e che h seeonda riga di questa struttul1!; di sdezione cien.a;ara. Tale rienrro
opzinale, ma a:j.rameiit~ ritccomandaro, poith iuta a dare cisako alla scrunura intcia.seqi dei programmi. Applicheremo con mol~ cura l c.nvenzioni dei r.ientri in rutto il libfQ.
Il compilato-re C ignora i caratteri di spazio bianco, come gli spazi, le cabula,zion.i e l~
newliri.e utilizzate per i rientri e la spaziacura verricale.

Buona -abitudine 3.1

/!pp#care le conven.zi0.ni dei rierltii, in modo '<?onsistente e respomabile, miglioro. en,ormemente lti le(tibilit dei programmi. Peti rientri suggeriamo unat{lbuf4zione fissa d.i
114 di pollice (6,3:fmm) o d h'e ~pazi.
L_ precederit istruzione se in.pseudoaJdice pu essere seri.tra in Q; Game
f (grade >~ 60)
p~inif(~Promossa,n");

C,w1TOLO

50

Osservare che il codice C corrisponde sa:eria:rileuce allo pscu<locodice. Questa una


delle propriet deUo pseudocodice che lo rende un utile srrumcmo di sviluppo dei programmi.
~

B11on11 abitudine 3.2

Lo pseudocodice spaso utilizmto per "riflett.ere" S1t 1111 progranm1a, durante la fasi' tli pr<>gettazione dello stesso. Il programma in pseudocodice sar successivamente convertito in C.

Il diagramma di flusso della Figura 3.2 illusrra la struttura di sele~ione singola if.
Queste contiene quello che forse il simbolo pi imporrante dei diagrammi di flusso: il
si;nbo!o rombo, detto anche simbolb di ilccisfone, il quale indica d 1e dovr essere effccruara
una scelta. Il simbolo di decisione conriene una espressione, per esempio una condi:dollc,
che pu essere vera o falsa. li simbolo di decisione ha due li nee di flusso che emergono
da.ilo stesso. Una indica la direzione da seguire quar:ido l'e.spressione all'interno del simbolo
vera; l'altra indica la dirC?.ione da segu ir~ quando l'espressione fa lsa. Nel Capitolo 2,
abbi.amo appreso che le dedsioni possono essere prese secondo delle condi11joni, che conrengno operatori rela'lJionali o di uguaglianza. In realtlt, una $Celta porr essere compiura
bas;1Jldosi su qualsiasi esp~essione: se essa vahu:ara zero, sar cratcaca come falsa, memce
~e il suo valore diverso da zero, sar considerata vera.
Osservate che anche if una srrurmra con un ingresso e una uscica singoli. Apprenderemo presto che:: anche i diagrammi di Elusso per le rimanenti strurrure di concrollo
contengono (a parre i cerch ierri e le lince di 1:1usso) solca.mo dei simboli rerraogolo, per
indicare le azioni da eseguire, e dei simboli rombo, per indicare le decisioni da prendere.
Questo il modello cli programmazione basato su azioni e decisioni che abbiamo evidcnziaco.

lo SVlLUEPO 0 1l'ROGRANL.'vfl STRUTIURATI

51

3.6 La struttura di selezione lf/ Else


La sa:urrura di l'selezione

. .i f esegue l'aziolle indicata solo quando la condl.Zl0 ne vera,. 111


caso conr_rano,. azione e ignorara. 1:-3 s~rrura di.s~lezione i f / else consence al programm~rore ~1 specificare che, nel c~o m cw la condizione sia vera, dovr essere eseguira una
a:1on~. diffe~enre. da quella che St dovr eseguire qualora la condizione sia falsa. Per esempio, I 1Struz10ne rn pseudocodice
Se il voto dello studente maggiore o ugual.e a 60
Visualizza "Promosso"
altrimenti
Visualizzo "Bocc1.to
vsu.alima
Promosso
m:moiort- o uguale a 60 , m e nere vrsu
al'12za
B
iJ
dse la vocazione dc:llo srudence -=
o~ci:;t(1 Se . ~o~? eU? scudcnte _inferiore a 60. la entrambi i casi, dopo la visualizzazione,
sara . esegica 1'.stmz1one succzess1va nella sequenza dello pseudocodice. Osservare cbe anhe il corpo dell altrimenti rienrraro.

~ Buon~ abitudine 3.3


Fate rientrare entrambe le istruzioni del corpo di una stmtmra f / else.
Qualunqu~ conv.ei:z~one di rientri abbiace scdt0 dovr ~scr~ applicara coll cu-ra nei vostri

progra~". i?.. d1fh~ile leggere un programma che non obbedisca in modo uniforme alle
convenzioni di spaz1arura.

Buona abitudine 3.4


Nel c~o ~ovess~ro ess~rci diversi Livelli d1 rientri, per ognutUJ di essi impiegare /o stesso
qwzn.twwvo di spazio.

stampa " Promosso"

La precedeme srrurrura selaltrimenri in pseudocodice pu_ essere scritta in e come


1-f (grade >= 60)
. printf ("Promosso\n");
e1se
pr i ntf("Bocciato\n");

falso
Figura 3.2

vero

Il diagramma di flusso della struttura di selezione singola del C.

Possiamo immaginare sette concenirori, ognuno dei quali contiene solo uno tra i serre
tipi di suutture di conrrollo. Tali srrurrure sono vuoce. Non scritto nicncc nei renangoli e
altrettanto nei rombi. Il compito del progra.rfu:fiarore qu.U1di quello di assemblare un programma, con rance srrutrure di concrollo di ogni cipo quante ne richiede: l'algoriuuo. combinandole in due possibili modi (ovverosia impilandole o nidi6candole) e complecandole, in
un secondo momenro, con le azioni e le decisioni appro_pare all'algoritmo. Discuteremo in
seguico le varier dei modi in cui possono essp-e scrirre le azioni e le decisioni.

stampa "Bocciato"

Figura 3.3

stampa "Promosso''

Il diagramma di flusso della struttura di selezione doppia i f / else del c.

52

CAPITOLO

li diagramma della Figura 3.3 illustra esarramerue il flusso di controllo per la srrutrura
i f I else. Ancora una volra, osserva:ce che, a pane i cerchietti e le frecce, gli unici simboli
presenri nel diagramma di flusso sono i reaangoli (per le azioni) e il rombo (per la decision e). Conrinuiamo a evidenziare iJ modello di elaborazione basaco su a'l.ioni e decisioni.
Immaginare nuovamente un conreniw re cap-ienre, empico con tante srructure vuoce di
selezione doppia quante ne possono servire per cosuuire qualsiasi programma C. li lavoro
deJ programmacoJ'c, ripetiamo, quello di assemblare le suddertc srrurrure di selezione,
accarasrandole e nidificandole, con qualsiasi alrra ~rrura di controllo possa essere richiesta dalJ'algocmo, e complerando i rettangoli e-i rombi -vuoti, con le az.ioni e le decisioni
appropriare per l'algorirmo che si sra implemenrando.

1J C fornisce l'operatore condizionale ( 7:) che strcuamente correlato con la smmura


if I else. Quello condizionale l'unico operatore ternario del C: in alrre parole, accetta ere
operandi. Gli operandi , insieme all 'op_eracose condiziona le, fo rmano una
espressione condiziomdc. Il primo operando l,lI~ cpndiiione, il sccpndo operando il valore
che assumer l' incera espressione co11dizionale, qU:.alora l;t condizione sia vera, menrre il
ceno operando il valore che assLLmer l' imera espressione condizionale, qualora la condizione sia falsa. Per esempio, l'istruzione printf
prin tf{" %s\ n ", grade >= 60?

P~omosso

: ' Bocciato );

conde.ne un'espressione condizionale che rescimir la scnga letterale ' Promosso" , qualora la
condizione grade >= 60 risulti vera, mentre restlcuirJasainga lecrerale ' Bocciato , qualora
l:i. condizione risulci Falsa. Lasrcinga diconaollo del formato per la pr'intf contiene la specifica
di conversione !\ss per visualizzare una scringa dj caracreri. .Oi conseguenza, J'iscruzione printf
precedence eseguir essenz.ialmence la scessa operazione ddl'isrruzione i f I else precedente.

r valori

in una espressione condizionale possono anche essere delle azioni da eseguire.


Per esempio, l'espressione condizionale
grade >: 60 ? printf ( '' Promosso\n') : printf ( "Bocciato\n);
si legger, "Se grade maggiore o' uguale a 60 allora printf ( Promosso\n ), alrrimenci printf ( Bocciato\ n ) ". Anche quesra ~prn.~sionc condizionale comparabile con la
struttura i f I else precedente. Vediemo che .gli operarori condizionali potranno essere
ucilizzaci in alcw1c situazioni dove non potranno essere ucilizzace Je ismizioni i f I else.

Le stmtture i f I else nidifiate sono in grado d ~e.rificare diversj casi, se :;i slscc.mano
dclle if I else a.ll'incern0 di akre mmmr dello scesso pe. Per sempio, la seguenr scru7.lone in pseudocodice., visualizzer A per vorazioni di esame maggiori o uguali il 90, B pe.r
v9d maggiori o uguali a 80, C per voti maggiori o uguaD a 70, O per vocazioni maggiori o
uguali a 80, F per nttte le al tre votazioni.

Se il voto dello studente maggiore o ugi,1ale a f)O


Visualizza ';4"
altrimenti

Se il voto dello studente maggiore o uguale 11 80


Visualizza "B"
altrimenti
Se il voto de//q studente maggiore o ugtlllk a 70
Visualizza "C"
-

Lo SVlLUl'PQ DI PROCl~AMMl STRLDTURA"rl

53

altrimenti
Se il voto dello studente maggiore o uguale a 60

Visualizza "D"
altrimenti

Visunlizu1 "F"
Questo pseudocodicc pu essere scritto in

e come

i f (grade >= 90)

printf ( "A\n");

el-se
f (grade >= 80)
printf (''B\n ");
else
if (~ rad e >= 70)
printf ( "C\n '');

else
i f (grade

>= 60)
printf( "D\n");

else
printf("F\n");

(ual~ra la var~abile grade ~ia m~iorc o uguale a 90, saranno vere le prime quamo condizioni,

ma. sar ~1ta solcane~ I 1srruz1one printf s ~ccess.iva al p~o conrrollo. Dopo che quella
prin.tf sara stara ~gwca, la parte else dell 1srrt1Z1onc i f /else "pi escerna" sar saltata.
Molri programmacon C preferiscono scrivere la precedenre srrurrura i f come

H (grade >= 90)


printf("A\n");
el se i f (grade >= 80 )
printf ( B\ n ) ;
eise i f (grade >= 70)
printf(''C\n");
else i f (grade >~ 60)
prntf( 1' D\ n'' );
else
printf( "F\n '' );

Per
il compilacore
fu come
, , COncepiro
cl.ifft.c

e,

encrambe. le fo arre
lenc1- .1..
Tl I .
sono e(nriv
L"
1.1 urna
rma e pm . sa perc~ evita un rientro del codlce troppo profondo vt:rso jJ margine
descro. Un mie nenrro lascta spesso poco spazio suite righe, c:Ostringndo alla frammentai.ione
delJe scesse e facendo diminuire la leggibilit del programma.

~:t~~rnu:a d.i selezione i'. si asperca un~ sola istruzione nd proprio corpo. Per includere
pm
nel corpo
~ire ({ e }) il gruppo di
.
. .1struzJoru
U
. . di. w1. i f , racchiudete rra pa:renresi 5cu11
1stru~on 1 .. n gruppo d11Strt121on1 concenmo all'io remo di una coppia di pareutesi graffe
una utrttz1one wmposta.

~ _l~ng.~e~w._1e._r_in_d._e_l_so~ifiw _a_re~3~.~'~~~~~~~~~~~~~~~~~~~
Una iJt;uzione composta pu essere imerira in qualsiasi ptzrte del programma in cui pcssn
esure sistemata ima istruzione singola.

CAJ>ITOLo

54

l.:esempi o successivo include una istruzion e compost a nella par~e else c:ji una
.strumua i f I else.
i f (g1'ade >:o 60)

printf ( Promosso. \ n" ) i


else {
print 'f("B.occ iato. \ n");
printf ("Devi ripetere questo corso. \n );
}

ln quesro caso, qualora b votazione fosse inferiore a 60, il programm a seguirebbe entrambe le isrruzioni printf presemi ad corpo di else e visualiz.zerebbe

Bocc.iato .
Devi r ipetere questo corso.
Osservate le parentesi graffe che circondano le due isrruzioni della clausola else. Quesre

parentesi graffo sono i11Jpbrtanri. Senza di esse, l'istruzion e


printf(" Devi ripete r e questo corso.\n ");
se la
sarebbe esterna: al ramo else dell'istruz ione i f e verrebbe seguira. senza conside_rare
votazione sia ono inferiore a 60.
~

co dovranno cissere sistemate all 'inizio di q_lLest'uhi mo, prima d1 ogni isrruzione d i azione.
Discutere mo dell'uso dei blocchi nel Capimlo 5. Eino a qud mome.nrn, il lerrore dovr
evirare l'utilizzo dei blocchi (eccezion futca per il main, nattiralm cme).

La struttura di iterazi one while

3. 7

Una muttttra di iterazione consence al p r.gmmm~to re di specificare che una a1.ione ehe

dice
dovr essereriperut.a finch alcune condiziortl marrann o vere. Lisrruz.inne in pseudoco

Finch ci sono ancora atticoii nelw, mia lista della pesa


Cpmpra ilprossimo articolo e c1111C1:[/Dlo dalla mia Lista
e
1
descrive l icerazioae che si verifica durante una passeggiata per gli acquisri. La condizion
vern,
saJ"
Se
falsa.
o
vera
essere
potr
"ci sono ancora articoli nella mia lisca della spesa"
allora sar eseguita J'az.ione "Compra il prossimo .arcicolo e cancellalo dalla mia lista".
Le
Questa azione sar esegi1ita riperucamence fncaato che la condizion e rimarr vera.
scessll..
della.
corpo
il
ono
istruzioni comenure nella strurrura di i.ceraz.ione finch costimsc
Quesco porr essere fon:naco da una isrruzione singola oppure da una composta.
Infine, la condizion e divencer falsa (quando l'ultimo articolo della lista sar sc:no
acquisraro e cancellato dalla scessa). A quesro punto, il cido potr rerminare e sar eseguca
la prima istruzione dello pseudocodice successiva alla srrurrura di iterazione.

Erro.rf! tipico 3. i

Errore tipico 3.3

~ JJimentican: una o mtrttmbe leparente.si gmffe che delimitano una istruzione composta.
'U.fl errore di sin cassi incercerrato dal compilarore. Un erro.re logico ha il ~uo effetto
predurante l'esecuzione. Un errore logico furale conduce al fallimenco e alla terminazione
e
continuar
di
a
programm
al
corrsenre
fatale
non
matura di un programm a. Un errore logie-o
errati.
risultati
J'eseclrz.io ne ma anche di pr0durrc

Non fornire, nel corpo di :ma strutturtt whil e, una f1.?.?one che faccia eventualmente
dJemare falsa la condizione del while. Notmalmente, 1.ma tafe:st:ruttur.a di iterazione
non avr mai fine: un errore chiamato ''ciclb infinito".
0

Enore tipico 3.4

Scrivere la parola chiave while con ima Wmaiuscola come in While (ricordate che il
C un linguaggio .che distingui! le maiusct)fe i/4/le minuscole). Tutte le parole chia.ve riservate del e come whi le, i f cd else contengono soltanto l.ettere mimacol.e.

Errore tipico 3.2


inserire un punto e virgol.a, d,Qpo la condizione di ttna strtm1'ra i f , cb11d1mebbe a un
errore logico nelle strutture di reiezione singola i f, mentre provocherebbe un errore di
sintassi nelle struttttre di selezione doppia i f I else.
Buonti abitudine 3.5

Alc11.nip1ogra1rtmatoriprej-l'istono digirare lo ptmntesi graJ! ini.zi{l/e e quel/a finale tii


u.na istmzione composta, prima di digitare le singole istruzioni 11il'hnemo delle parentesi grafj. Ci ai11ra a wit1tre di omet:tere u.na o entrambe le parentesi graffi.
ingegneria del software 3.2
Proprio come una istruzione composta potr4 ssere imerha. laddovc potrebbe es.rere sistemata una istruzione singol.a, sar anche possibile non averne j>er nulla, in altre parole, avei-e i'istrrezione vuota. l'i.rtmzione uuONl rappresm.til.ta. dall'ins.erimento di un
punto ~ virgola (;)laddove nonna/mente ci sal'ebbe stn.ta uria istrt1zian,e.
In quesca sezione abbiamo imrodouo la nozione di isrruzione composta. Una istruziodi
ne composra ,pmr anche conreaere <leUe dicbiacw.ioni (come fa per esempio il corpo
blocun
in
ioni
dichiaraz
Le
main). [n questo caso, J'isrruzione eomposra sar detta blbcco.

55

L O SVILUPPO Dl PROGRAf\L"11 STRtrrrtJR ATI

Consideriamo ora, come esempio di una while reale, un segmento di programma progecraro per trovare la prima potenza di due maggiore di 1000. Supponere che la variabile irrrera
product sia stata inizializzata con 2. Nel momento in cui la seguente strumrra di iterazione
while aYJ' terminato la propria esecuzione, product conterr. la rispo~u desidera.ca:

produc t

= 2;

wh ile (product <= 1000 )


product = 2 * product;

rl

scrurrura di
diagramm~ della Figura 3.4 illustra precisamenre il flusso di conrrollo per la

a
iterazione while, Ancora una volca., osse1vare d1e, a parre i cerGhiecri e le frecce, il diagramm
rc.
conceniro
un
di flusso contiene soltanto un rettangolo e un rombo. Immagin ate, ancora,
alue
capiente pieno di smmure while vuoe che potrann0 essere accatastare e nidificate coo
di
controllo
di
usso
fl
strutture di conuollo, per furmare una implmencazione strutturata per il
e
azioni
te
appropria
un algoriuno. l reaangoli e i rombi vuoti saranno quindi completati con Je
emergente
flusso
di
decisioni. ll diagramma di :flusso mostra chiaramence t'iteraz.ioae. La linea

f
56

CAPffOLO

Lo SVlWPPO DI PROGRAMMI S'rRLTTTURATl

dal rerrangolo torna indietro alla decisione, che sar verifcaca ogni volra all'imerno del ciclo,
finch la stessa non divcmer evenrualmeme falsa. A quesrn pumo, la srrurrura while avr
complecaco il suo cornpico e iJ concroUo passer all'istruzione successiva del programma.
Al momento dell'ingresso nella :.truttura while; il va.lore di product era 2. La variabile
product sar. molciplicaca riperuramerue per 2, assumendo nel umpo i valori 4, 8, 16, 32, 64.
128, 256, S 12 e 1024. Nel momento io cui product avr assunto il valore 1024, la condizione
nella srrumu-a while , product <= 1000, sar divenrara falsa. Ci provocher il termine dd
ciclo e il valore finale di product sar 1024, 'Cesecuzione dcl programma continuer con la
prossima isrruzione dopo il while.

immagav.inare i torali nom1alinente devono essere azzerate, prima di poter essere utilizzate in
ua p~g~; alrr~menti la somma includerebbe il valore imm3t>oazzinaro in precedenza nella
J~o.ne_ di mi:morra del totale. Secondo il loro utilizzo, le variabili.contatore sono normaJmenTI'.. i_n~illnare c?n. zero o.~~ ~pr~enrer:mo degli esen;pi che momano ognuno di questi
~). Una vanahrle non inrzial.izzara conaene un valre 'i.mmondiZia": l'ultimo dato imm.agaz21naro nella Jocazione di memoa riservara per quella variabile.

Errore tipico 3.5


Nel cnso irJ cui un contatore o un coral.e non sia stata imz:iali:izato, probabilmente i ri.sultad
dei vostro programma non stmtnno corrett_i. Quest() un esempio di errore logico.
lnizializz11re il totale a zero
Inizializzare il contatore dei 11oti 11.

produet = 2 product

Figura 3.4

3.8

Per mosrrare come sono sviluppati gli algoritmi, risolveremo diverse variami di un problema
per il calcolo della media di una das.5e. cOns.idcrarc la scguemc enunciazione del problema:

Una classe di dieci studenti sos'far1e un esame, Avete a disposiz;ne le vqrazicni. (degli interi
ne/J'interval/Q dn O11 100) per questo esame. Detnninate la media della classe in questo esame.

La media della classe sar uguale alla somma dclJe votazioni divisa per il numero degli studenti.
Calgoricmo per risolvere questo problema su un ~ompurer dovr prendere in input ognuna delle
votazioni, eseguire ll calcolo <leUa media e visualizzare il risultato.
'Usiamo lo pseudococlice, elenehiamo leazioru che dovranno essere eseguire e specifichiamo
l'ordine in cui quesre azioni dovranno esser~ es~guite. U,s.eremo ur,a i'terr:wionc controllata dtz un
eortta~ore, per prendere infoput una pervolra le votazioni. Questa tecnica ur.ili7..7.a una variabile
detta contaJ:ore, per spccilcare il numero di volre che un insieme di isrruz.ioni devr essere eseguito. In ques~o esempio,. l'iterazlone cerminer quai:tclo il conracore avr superato il valore I O. In
quesra sezione, presenteremo solamente Jo psellliococlice per Ialgorirmo (Figura 3.5) e il corrispondente programma C (Figura 3.6). NclJa prossuna sezione, mostreremo come vengono
sviluppaci gli algoritmi in pseudocodice. Una irer:v.ione coorrollara da un conrarore spesso
chiamata iteraziane rkfinita, poich il numero ddJe ireraz.ioni noco prima che il ciclo incominci la propria esecuzione.
Osservate ndl'algoritmo i riferimenti a un corale e a un wncarore. Un wtak una variabile
ucilizi.ara per accumulare 1a somma di una se.rie di valori, Un contatore una variabile ucifo..7.ata
per concare; in quesco caso, per conrare il numen;> dei vori immesso. I.e variabili usare per

w10

Finch il contiltfne resta rhinore o uguale d. dieci


Pn!ndi;re drttl'inpttt il prossimo voto
Aggiungere il voto aL totale
Aggiungere tmo al contatore
Impostare il vawre della media al totale diviso dieci
.
Vi.su.aliz.zare la media

Il diagramma di flusso della struttura di iterazione while.

Formulazione degli algoritmi: studio di un caso


(iterazione controllata da un contatore)

57

Figura 3.5 L'.algoritmo in pseudocodice che utilizza una iterazione controllata da un


contatore, per risolvere il problema del calcolo della media di una classe.
/* Programma per il calcolo della media di una classe
cn una iterazione controllata da un contatore 1

#include <stdio.h>
mai11()
{

int counter, grade, total, average;

I* fase di i nizializ.zaziohe */
total = 0;
counter = 1;

/.* fase d:i elaborazione * /


while (oount er <= 10) {
printf( Enter grade: '' );
scanf( '%d", &grade);
total = total + grade;
counter = counter + 1;
11

/* fase di chiusura * /
average = total / 10;
prirrtf( "Class average is %d\n, average);

(Cb11tinu11)

CAPITOLO

return 0;

/* indica ohe i l programma terminato con successo */

Enter
Enter
Enter
Enter
Enter
Enter
Enter
Enter
Ent_er
Er,ter
Class
Figura 3.6

ff]

grade: 98
grade: 76
grade: 71
grade: 87
grade: 83
grade: 90
gt'ade: 57
grade: 79
grade; 82
grade: 94
aver,age is 81
Programma C ed esecuzione di esempio per il problema del calcolo della
media di una classe, con una iterazione cori~rollata da un contatore.

Buonn. nbirudine 3. 6
Inizializzate i contatori e i totali.

Osservate che il calcolo deUa media ud prngramma ha prodotto un risulcaro intero. ln


realt, la somma delle vot.azioni in quesm esempio 817 che diviso per dieci dovrebbe produrre 81,7, in alrre parole, un numero con una virgola decimale. Vedremo come rrattare
questi numeri (decri in virgola mobile) nella prossima sezione.

3.9

Fonnulazione degli algoritmi con processo top-down


per raffinamenti successivi: studio di un caso 2
(iterazione controllata da un valore sentinella)

Generalizziamo il problema dd calcolo della media di una classe. Considerate il seguente


problema:

Svilitppate ttfl p1'ogramma per iL ca.kof() dtlkt medi di una cl4S$e, che elaborer un nun'll'1'0 arbitrario di votazioni ogni volta che il programma sar eseguito.
Nd primo esempio di calcolo della m~dia di una classe, il nume.ro delle vocazioni (1 O) era
nco in anticipo. fo que$t esempio,. non . sw,~ ~ca alcuna inclicazione su quante vocazioni saranno immesse. JI progl'amma dovr clabmarn un numero arbir~ario di v.ocazioni. ln
quale modo iJ programma pocr determinare cfliando terminare l'immissione deUe votazioni? fn quale modo potr sapere quando calcolare e visualizzare la media della classe?
Una maniera per risolvere quesro problema ru usare un valore speciale, detto
val.ore senti.nella (o anche vakJre di segnd.la.7ion.e, valore durnmy (fitti.zio) o 11alore flag (bandiera)),
per indicare la "fine della immissione dei dati". I.:utenre immerrer le vocazioni finch rurte
quelle legittime saranno state immesse. I:utente irnmetcer quindi il valore sentinella, per
indicare che l'ultima valutazione sar stata imm~a. Le iterazioni controllate da un valore
sentine.Ila sono spesso deru: iterazioni indefinite perch, prima che inizi I'esecuz.ione del
ciclo, il numero delle iterazioni non noto,

Lu SVILUPPO nr PROGRAMMI ~TIHJl" f'lJMTI

59

Cb iar:imenre, iJ valore senciaelJa dovr essere sdrn in modo che non possa essere
confuso con un valore. di input accerrabile. Daro <ilie le valurazioni di un esame sono
nom1almeme degli interi non negarivi, -1 sar un valore seminella accettabile per questo problema. Di conseguenza, una esecuzione del programma per il calcolo della
media di una classe porr elaborare:: un flusso di irrpm q:1me 95, 96, 75, 74, 89 e - 1. LI
programma quindi calcoler e visualizzer la media della clas~e per le \TOta'l.ioni 95. 96,
75, 74 e 89 (-1 il valore sentinella, perci non dovr e:~sere inserito nel calcolo della
media).

~ Errore tfpico 3. 6

Scegliere un vawre sentine/La che sia anche i-m vahre Legittimo per i timi.

Affionteremo ora il problema del calcolo della media di una. dasse, con una tecnica
<':.biamara, top down (datl'a/t(J in basso) per rajfnamenti successivi: una recnica essenziale per
Lo svi luppo di programmi ben strucrurari. Cominciamo con una rappresentazione in
pseudocodlcc del top:

Determinare .Id rntdia della classe per l'esame


Il rop un.a ~in.gola isnuzione. clic specifica rutte le .funzioni del programma. Per come
definito, il rop in effetri w1a rappresencazione complero. di un prgramma. Sfortunaramente, il top speci.ficaiaramenre una quanrir sufficieme di dei:tagli da cui ricavare un programma C.

Per quesco morivo ora diamo il via al processo di raffina.mc.neo. Dividiamo il rop in
una serie di piccole arvir e le elenchiamo nell'ordine in cui dovranno essere eseguite.
Ci produrr il seguenre primo reffinommto.
Jniziaii2.Z11re le variabili
Prendere in input, sommare e conftzre le votazioni deU'esnme
Co/col.ore e uimalizzore I.o media della classe
In quesro caso scara usata solramo la srrurtura di s~quenza: iofu.rci, i passi elencari dovranno essere eseguici in ordine, uno dopo l'akro.

f1['1

Ingegneria del softWarr: 3.3


Ogni rnffinmnento, cos corno lo stesso top, una
varia solo i! livello di dettaglio.

erumci~ione completa de/L'ttlgoritmo,

Per procderc verso il livello succe.~sivo di raffi.uamenco, ovvero$ia il secondo, ci impegneremo nella specifc<i delle variabili. Abbiamo bi$ogno di un totale progressivo dei numeri, un
comatorc de.Ila quanrir di quelli che sono stari elaborati, una v;u:iabilc per ricevere il valore
di ogni valutazione, quando sar scaro immesso nell'input, e una variabile per conservare la
media calcolara. Cistruzione in pseudocodice
Inizializzare le variabili

porr esse.re raffinata come segue:

lnizializzare il totak a zero


Inizializzare il contntore n :uro

'

CAPITOLO 3

60

Osservate che occorrer i.nizialiizare solo il rorale e il contatore. Le variabili per la media
e le vaJutazioni (sperrivamence, per la media calcolaca e l'input deU'uteme) non dovranno
essere necessariamente inizializzate, perch i loro valori saranno sostituiti dal processo di
scrittura distruttiva, di cui abbiamo discusso ud Capitolo 2. L'isrruzione in pseudocodice

Prendere ln inp1(t, sommare e contar.e /, uo(a.zion.i dell'esarrie


richiede una strumua di irei:azione (ovver<;>~ia un ciclo) che prenda in input consecurivamenre ogni vah.1tazione. Dato che non sappiamo in anticipo quante valurazioni dovranno
essere daborare, uril.izzeremo una iterazione contrllaca da un valoresenrindla. l.'.utente digiter
una per volta le-valutazioni legictime. Una volt;i_che l'ultima valutazione legittima sar sr.aca
digitata, l'uteritelnimerrer il valore sentinella.. Per ognuna delle valucaz.ioni immesse, il programma controller l'evenruale immissione dehalreseminella e terminer il iclo quando
l'avr inconrrato. Il raffinamento della precedence iscruzione in pseudocdice s:rr quindi

Prendere in inpu.i fa prima valutazione


Finch l'u'tente non. ha ancora.irttmesso il vale.. sentinella
Aggiimgere questa valutrn:;ione al total.e cor.rente
Aggiungere uno al contatore di valutazioni
Prendere in input /,a prossima valutazione {o forre il valore sentinella)
Osservare che, nello pseudocodice, non utilizziamo parentesi graffe intorno all'insieme di
istruzioni che formano il corpo della srrucmra finch. Facciamo rienrrare semplicemente
queste istruzioni sono il finch, per mosrrare che appartengono rucce a finch. Di nuovo, lo
pseudocodice solr.anto un aiuco informale allo sviluppo del programma.
I:isttuuone in pseudocodice

Calcokme vi.su(J../izzilre I.a medJa della class


potr essere raffinata come segue:

Se it contatore mm uguale a uro


fmpostare I.a media con ili totale diviso per il comatore
Visualizzare la media
altrimenti
VisU11,/Jzza.re "Non sono state immesse valutazioni"
Osservare che~ questo caso siamo scaci artemi a verificare la possibili~ di una divisione
per zero: un errore fatale che, se non fosse stato individuato, avrebbe causato il fallimento
del programl}ia (detto spesso bombing o orashing). Il secondo raffinamento compleco
mostrato nella Figura 3.7.

~ Errore tipico 3.7

Un tentativo didivisione per zero generer un errore forai.e.

Inizializzare il totak d zero


/nizittli.7.zare ii.contatore a zero
Prender.e i'll input la prima vaiutaziohe
Finch i'utente'hon ha ancora immesso il valore sentinella

61

Lo SYILUl'PO DI PROGl~MI STRUTfURATI


Aggiungere questa valutazione al rotale corrente
Aggiungere uno al c_qn>atore di valutazioni
Prendere in input '4 prossimfl valutazione (o forse il valore sentineliti)
Se il contatore non ~ uguale a zero
Impostare la niedid con il totale divi.so per il contatore
Visualizzare la med1.
altrimenti
Visualizzare "Non sono Itate immesse valutazioni"
Figura 3.7

Lalgoritmo in pseudocodice che utilizza una iterazione controllata da un valore


sentinella, per risolvere Il problema del calcolo della media di una classe.

Buona abitudine 3.7

Quando esegrtite 1ma divisione per una espressme chpot1 ebbt: asmmere tm vqfore uguale
r1 uro. tontrollate.esplicitamente quella evetiimza e gestitela in modo '1.J>prpr:tt(J nel vast1Q
programma, per esempio, stampand.o un messaggio. inuet:e di lasciare che urt lfn'Ore fatale
1

ne intenwnpa l'esecuzione.
Nella Figura 3.5 e nella Figura 3.7, per una maggiore leggibilic, abbiamo incluso
aJJ'imerno dello pseudocodice alcune righe complecamenre vuoce. In realr, le righevuoce
separano questi programmi nelle loro varie fasi.

Ingegneria del software 3.4

Mo/Ji programrnipossono essere s11ddivid logicaf!tent in ttefas;, imafase di iniziaji~itme,


che inizializza k var.iabili de/.pro!!amma; unafosi: di elborazione, che prewJe in input
i valori dei dati e imposta conseguentemente Le variabili del programma; uria fase di
chiusura, che calcola e visualizza i risultati finali.
l!aJgoriano in pseudocodice della Figura 3.7 risolve il problema pi generale del calcolo della media di una classe. Quesro algoritmo sraco sviluppato dopo d ue soli livelli di
raffinameoco. A volte saranno necessari pi livelli di raffinamenco.

Ingegneria del seftware 3.5

li programmatore termina ii processo top down per raffinttmenti successivi;. quando


L'algor.itmo in pseudocodice specificato sujfic:ntcmmte dettagliato perch it progrmmatote possa essere in grado di convertirlo in C. Normalmente, a quel p:U.nto,
l'implementazione-~! programma sar lineare.

Nella Figura 3.8 s6.n mosrrati il programma Ce l'esecuzione di e.sempio. Nonostaoce vengano i..mmesse solcanrn delle valutazioni intere, il calcolo della media produrr probabilmence un numero decimale con una virgola decimale. Il cipo di dato int
non pu cappresencare un tale numero. Il programma introduce perci iJ ripo di daro
float per gescire i numeri con Ulla virgola decimale (detti numeri in virgola mobile) e
un operatore speciale, dcto operruore cast (operatori di Gomersione), per g~srire il al~
colo della media. Queste c.ararterisriche saranno spieg!li:e in dettaglio dopo la presentazione del programma.

CAI'tTOLO

r Programma per il calcolo della media di una classe con


Una iterazione controliata da un valore sentinella /
#include <stdio.h>
ma in ()
{

/* il ~uovo tipo di dato * I

float av(:?rage;
int counter, grade, total;
/* fase d i inizializza zione *I
total = 0;
cotJnter "' 0;

chius~ra */

if (counter I= 0 ) {
av.erage = (float) total I counter;
printf("Cla ,s average is %.2f' 1 average);
else
printf ('No grades were entered\n) ;

1 indica ohe il programma termi nato oon successo '/

Enter.
EnteP
Entr
Enter
Enter

Enrter
Enter
Enter
En~er

Class

FiguraJ.8

grade, ~1 t;o end :


grafe, ~ 1 tO end:
grade, -1 to en :
grade, - 1 to end:
grade, 1 to -end:
gr:-ade 1 1 t@ eh'd :
grad.e, -1 to efld :
grade, 1 to end:
grade, 1 to en<I:
a v.e.rage is 8 2"-5'0

Osservare l'istruzione composta nel ciclo while della Figura 3.8. Ancora una volra, le
parentesi_ graffe sono necessarie perch cu[[e e quattro le istru1.ioni sia.no eseguire all'inrerno del ciclo. Senza le parentesi graffe, le tre istruzioni nd co rpo dcl ciclo .ricadrebbero
aJ l'escerno dclla iterazione, indhlcendo il compun:r a inrerp'l'etare erroneament e il codice
nel modo seguente:
while ( grade I= - 1)
total = total + grade;
oounter = counter + 1;
printf( "Enter grade, -1 to end: " );
scanf( "%d " , &grade);
lutazione.

while (grade != 1) {
total = total -t grade;
co.unter = cqunter + 1 ;
printf( "Enter grade, -1 to end: ");
scanf( "%d " , &grade);

return 0;

63

Ci provocherebb e un ciclo i.rifinito, qualora l'urenrt non immettesse -I come prima va-

/* fase di elaborazion e t
printf ("Enter grade, - 1 to end: ");
scanf('!%d", &grade);

/* fase di

LOSVTLUP"PO I)[ PROG l~\fMI STRU"ITTIRJ\11

75

94
97
88
70

64
83
89
-1

li programma e e l'esecuzione di esempio per il problema del calco~o della


media d! una classe, con una iteraiione c?ntroll~ta da un valore sentinella.

Emma abitudine 3.8

lk2J

In un ciclo controllato da nn valore Sifntinelln, ilptoin.pt pr.r la richie.;ta di lmmissione


dei dati dovdt rico1dare esplicitamente rrll'1m11te qual il valore senti11elln..

Le medie non saranno sempre dei valori inceri. pesso, una media sar un valore
7,2 o - 93,5 che comengo no una parte Frazion~ria. Questi valori sonQ indicati
come numeri in virgola mobile e sono rappresenra dal Lipo di daro float. la variabile average dichiara ca con il ripo f loat cos) che possa <:<murare il risultaco frazionario
del noscro calcolo. U.risulram del calcolo tot al I counter sar run:avia un incero,
poich. total e counter sono emrambe del le variabili inrefe. Dividere due inceri
produce una divisionem1 iflter in cui ogni parre frazionaria del calcolo persa (ovverosia
troncata). Daro che il calcolo sar eseguiro per primo, la parre frazionaria sar persa
prima che il risultato possa essere assega4ro ad average . Per produrre un calcolo in
virgola mobile aon dei va.lori inceri, dovremo creare dci dari temporanei che siano dei
numeri in virgola mobile. Per eseguir.e quesm com pico, il C fornisce l'operatore unario cast
(od operatore di conv~rsione). J..:isuuzione

come

average

(f loat) total I counter;

iod ude l'operacore di conversione ( float) che creer una copia tmporanea in virgola mobile dcl suo operand o total. L'utilizzo di un openrore di conversione in questo
modo derto conversione esplicita. Il valore immagazzin ato in total ancora un incero. I.I calcolo, a questo pum:o, consister d i un valore in virgola mobile (la versione
float temporanea di total) d.Ivi.so per un valore incero immagazzina to in counter. Il
per sa solo valutare espressioni in cui i tipi di dato degli argomenri
compilaJ.'ore
assicurarsi che gli operandi siano dello scesso ripo, il compilacore
Per
sono id.en.ci.
se lez iona ci una operazione derta promozione (o anche
quelli
su
eseguir
Per esempio, in una_espres~ione c0ntenenre i ripi di dato int e
impiici't'o).
co1111ersione
speci f<>a che dov ranno essere esegui re delle copie degli operandi
ANSl
standard
lo
f loa t .
essere promosse al cipo float . Nel noscro esempio, una
dovranno
quesce
int e che
la copia di counter e che questa sar stata promossa al
eseguira
v<>lca che sar stata
e iJ risultato della divisione in vi rgola mo):>i lc sar
calcolo
il
tipo fl~at , sar eseguico
ANSI fornisce un insieme di regole per I.a promostandard
Lo
assegna:ro ad average.
Il Capimlo 5 prescmer una discussione di cur i
operandi.
di
pi
zione dei differenti
cli promozione.
ordine
rela.vo
del
e
tipi cli dato stand<trd

CAPITOLO

64

Sono disponibili operatori di conversione per ogni ripo di daco. I.:operar9re di conversione composta inserendo delle parentesi tonde iruorno al nome del tipo di dato. roperarore di conversione un operatore unario, ovverosia un operarore che accerra solo un
operando. Nel Capicolo 2 abbiamo studiato gli operaro aritmecici binari. Il C supporta
anche delle versioni unarie degli operatoci pi(+) e men0 (-),perci il programmatore
pou scrivere espressioni come - 7 o +5. Gli operato.ri di conversione associw da destra
a sinistra e hanno la m:ssa priorit degli altri operatori unari, come il + e il - unari. Tale
priorit a un livello pi aJro di quella degli opctat.ori moltiplicativi.*, I e 9ts e a un livello pi
basso di quella delle parentesi.

li programma nell~ Figura 3.8 urilirz.a per la printf la specifica di conversione lii. 2f
per visualiz.zare il valore di ave rage. La f specifica che sar visualizzato un valore in virgola
mobile. li . 2 la precisione con cui il valore sar visualizzato. Quesca stabilisce che il valore
sar visualizzato con due cifre a desrra della virgola .dci decimali. Nel caso fosse stara u.riliz.zat:t
la specifica di conve.(sione 5\sf, ovverosia senza indicare la precisione, sarebbe stata urilizzara
quella d;. defareltdi Qcifre, proprio come se fm'Se stam mitizzata la specifica di onvers.ione
%. 6f. Nel momenro in cui saranno visualizzari dei valori in virgola mobile ort una dara
precisione, il va10fe visualiz;zato sar arrotondato al numero i.nd.icaco di posizioni decimali. Il
valore nella memoria rester jnalteraco. Una volra che le seguenci istruzioni saranno state
eseguire, sara.nnQ visualizzati i valori 3,45 e 3,4.
/ visualizza 3,45 /
printf {"%. 2f\n", 3.446);
/* visualizza 3,4 */
printf("\. 1f\n", 3.446);

Lo SVl.LUPPO DI PROGRAMM1 srn.1.!ITURAn

65

solamente una quanril: prefissata cii spazio; quindi evidente che il valore in virgola
mobile immagazzinato porr essere solranro una approssimazione:.

3.1 O Formulazione degli algoritmi con processo top-down


per raffinamentj successivi: studio di un caso 3
(strutture di controllo nidificate)
Lavoriamo ora su un altro problema compleco. Utilizzando ancora una volta lo pseud.ocodice
e il processo cop down per raffioamc.mi successivi, formuleremo un algoriono e scriveremo
un corrispondente programma C. Abbiamo visco che le stm:rrure di controllo possono essere
accatastate l'una sull'altra (in sequenza), proprio come i bambini accatastano i marroncini
delle cosrruzioni. ln qucsro srudio di un caso, vedremo l'unico alrro modo strutturato anraverso il quale le strutture di o.mrollo porranno essere connesse in C: ovverosia amaverso la
nidificllZione di una struttura di conrrollo Jn un'altra.
Considerate la segueme..enunciazione del problema:

Una universit offre un corso chepreptzra gli studeizti per l'efrtrne della Licenza di staJ:oper agenti.
immobiliari. Lo scorro nno, mo/Ji degli studenti che hanno completato questo corso ha:no
superato l'esame per ottenere fa licenz,a. Naturalmerrte, l'universit vorrebbe sapere quale sia
staro L'esito dei propri studenti al termine dell'esame. Vi stato chierto di scrivere un progi-amma
che sommi i risultati. Vi sta'fll anche ronsegnata una li.sto. tfi 1Ostudenti. A fianco a ogni nome
stato scritto un L, se lo studente ha supmuo l'esame, e un 2, se lo studente stato respinto.

Errore tipico 3. 8

Il vostro programma dovr analizzare i risultati dell'esame come segue:

e.n-ato usare 1.a precisione in una specifica di cnversione nef/,a stringa per il controllo
delfamu1to diu:na istmzione scanf. Le prcisioni possono essere 11ti!izzate soL{O.nto n~lle
specifiche di conversione di printf.

Buona 4b,_it;14imr 3.3

L Prendere in in pur ogni risulraro della prova (ovverosia un 1 o un 2). Visualizza.te i.I mes~
sggio "Enter resulc'' (im:mer;rere il risultato) sullo sthcrm ogni volta c::he il prgramma
richiede un alrro risulcit della prova.
2. Comare le occorrenze per ogni po di risultato deUa p rova.
3. Visualizzate un riassumo dei risuJcaci, che fodichi il numero degli srudenci che han.no
superato la prova e quello degli scudenci che sono stari respinti.
4. Nel ca.so pi di 8 stude11ti abbiano superato l'esame, visualizzate il messaggio "Ra.ise miiion"
(aumentare le ta.s;e}.
Dopo a~er .letto atrentamen_ce J'enunci:tzione del problema, sviluppiamo le seguenti
oss.ervaz1on1:

N<m esegtJi.te un confionto di ug;u.agliii.rii:f!. di va.Lori in virgola. mobile.

1.

Errore tipico 3.9


Utilizzare i numeri in virgola mobile, presumendo che siano rappresel'Ittlti in un modo

preciso, potri condurre a risultati incorretti. l numeri in virgolll mobile sono rappresenrati
da{fa moggigr parte dei comp1tter solo in moda approssimato.

I numeri in,virg~la mobile banno numero~ applicazioni, nonostante n0n siano sempre "precisi al 100%" . .Per esempio, quanq<;> pa.diamo di ui1a "normale" temperacura corporea di 98,6 gradi..Fahrenheit (37 gradi Celsius), non abbiamo bisogno di essere precisi
fino a un gran numero di cifre. Nel momento in..filli vediamo la temperatura di un termometro e leggiamo 9'8,6, questa porrebbe essere in r.ealr 98,5999473210643. La questione
che leggere sernplicememe quel numero come 98,6 andr bene per la maggior pa.r:t delle
applicazioni. In se~iro diremo qualcosa in pi a proposito di questo problema.
Un altro JI!odo per mezzo del quale potrebbero essere prodotti dei numeri in virgola
mobile artra.ve~sp l~ dlvisioni. Quando dhrid.iamo 1O per 3, li risulmto 3,33.3J333 ... on
la sequenza dci ~ che si r.ipere all'infmito. Per comenere un mie valo.re, il co-i'hpllt-c alloca

n programma dovr elaborare 10.risulcati per la prova. Sai quindi uti lizzato lUl ciclo

controllaco da un conrarore.
2. Ogni risultato della prova sar un nun1ero: un 1oun.2. Ogni voka che legger un_risulcaro della prova, il programma dovr determinare se qud numer sar scaco un l o an.2.
Nel nosrro algoano ci limireremo a controllare il numero 1. Qualora il nwnero non sia
un 1, supporremo che si tracci di un 2. (Un esercizio alla fine del capitolo considerer le
conscgueo.zc di questa supposizione).
3. Saranno urilizzaci due concacori: uno per comare il numero degli studenti che hanno
superato l'esame e l'altro per contare il numero di qu~ che sono stari respinti.
4. Una volta che il programma avr elaborato i risultaci, esso dovr decidere se avranno superato
l'esame pi di 8 scudenti.

66

CAJ'ITQLO

Pro.cediamo con LI processo top down per raffinamenci success


ivi. Cominciamo con

una rapprc!Senrazionc in pseudocodice dd rop:

Amrlizwre i rimlt11ti de/L'tsame e decidere se debbrmo essere numen


tnte le tasse scolastiche
Ancora w ia voi ca, . imporrante mettere in risalto che il top una
rappres<:Ilmzione completa del programm~. ma che probabilmenrc saranno necessari div~rsi
raffinamemi, prima
be Lo pseud0codice possa evolvere natm almeme in un ptqgra
mroa C. li nscro primo
raffinamenro sar
Inizializzare le varJ'abili
Prenden: in input 10 vnlutt1Zioni della prova e contare le promoz,ioni e
IF bocci11t11.re
Visualizzare un sommario dei iisultati de/l'es11me e deddtte se le ttWe
scolartiche debbano
essere aummtate
Anche a questo punto, sebbene abbiamo una rappresenrazione
romplera dell'incero programma, sa.r necessario wl successivo raffina.memo. Ci impegn
eremo ora a specifica.te le
variabili. Saranno necessari dei concarori per regiscrare le promo
zioni e le boroarnre, un
c::ontaro.r.e sar ucilizzaro per conrrollare l'elabotazi0ne del ciclo e
sar occ~aria una variabile per immagazzinare l'input dell'urente. I:isrruzione in pseudocodice
lf1izirtli:z,zrire I.e variabili
porr e.">sere 1affi114ra come segue:

[nizialiZzo:re le promozioni a zero


Iniziali.zuire le bqcciature n zero
lni.zia/i22,llre gli mulenti ti uno
sservace che sono stati ini2ializ7.ari solranco i contatori.e i corali. L:isrrm
ione in pseudocodice
Prendere in input 1() valutazioni dell.1 prova e ctmtare Le promozioni
e le boci:iatur
richieder un ciclo che prender in_ input conse.curivamente i
risulrari di ognuno degli
esami. In quesro caso, si conosce in anricipo ch ci saranno precisa
meme dieci cisulraci di
esame, perci ~ appropriato u.riliuafe un ciclo rnmrollaro da un
C()lltatore. Una str1;1rrura
di selezione doppia all'i.memo dcl <".ido, owerosia nidific~
nel corpo della .irerazione,
determiner se ogni risultato di esame sar sraro una promoz
io)1e o una boccia:rura e
increm~ocerdi oorueguenza i contatori appmpciati.
Il raffinamento della precedeme istruzione
in pseudocodice sar quindi

Finch ii conta,tore degli studenti inferiore o uguale a dieci


Prem/.ere in input il prossimo ri$1,ftato. d'esanu:
Se lo uudente stato pr(Jmo.rsq
Aggiungere uno ai promossi
altrimenti
Aggiunger~ uno aj bocciati

Lo SVILUPPO DI PROGRAMMI STlll.JTf'IJRATI

67

Vsualizzare un sommario di Timitari deLL'esnme e decidere se le t.a..rse


sco/11.Jtiche debbano
essere aumenrote
porr essere raffinata come segue:

Visualizzare il numero delle promozioni


Vsu4ljy.zare_ il mnnero delle bocciature
Se pi di otto studenti sono stati promossi
Vrsualizzare il mesu1ggfo ''Raise mition" (aimibztare le tmse)
Nella Figura 3.9 appare il secondo raffinamento complero. Osserval'e
che le righe vuote sono
usate anche per e.vjderiziare .la srrucrur a dd finch e migliorare la leggibil
ira del programma.

lniziali.zzi1re le promozioni a zero


lw~ia!izznre le bocciature a zero
fnizialiuare gli studenri n uno
Finch iL contatore degli smdenti inferiore o ugU11./e a dieci
Prer.idere in input il prossimo risultato di mzme
Se /.Q studente. stato promosso
Aggiungere uno ai promossi
1dtrimenri
Aggiungere uno tli bocciati

Aggiungere uno ai contatore degli studenti


Visualizzare l.I numero deile promozioni
Vima.Lizzare il numero delle boccint:ure
Se pi di otto J'titde.nti sono stati promossi
Visualizzare il mmaggi.o ''Rahe tuition" (aumentai-e Le tasse)
Figura 3.9

Lo pseudocodice pe r il proble ma dei ri~ultati dell'esame .

Ora questo pseudocodice sufficientemente raffinato per (:$Sere


convertito in C. Nella Figura 3.10, sono .mostr~ ti il progra mma C e due esempi cU
esecuzione. Osservace che
abbiamo approfittato dj una caratcerisrica del che cqnsenre di incorp
orare le inizializzazioni
nelle cUchi:arazioni Una siffatta inizializzazione sar eseglta d urarite
la compilazione.

Obiettivo efficienza 3.1


Inizializza.re le va.rU!bili contestualmente. al/4 Loro dichiar~ione riduce
il tempo. di
esecuzione di un prognimma.
l'!J.geg;neria del software 3.6

Aggitmgere uno al contatore degli studenti


Osservate l'utilizzo delle cighe bianche, per evidenziare la strumu
a di controllo se!nltrimenti
e migliorarela leggibilir del _programma. I:isrruzione in p~eudo
codice

L'esperienza ha dimostrato che, S1{ un computer, la parte pi1~ difficil


della risoluzione
di un problem4 lo sviluppo deil'algoritmo per la sua soluziane. Norma
lmente, una volta
che sia rtato specifica.to un algoritmo corrett-0, il processo di p.roduz.ione
di un p rogramma funzionante sar lineare.

GAPJ.l'OLO 3

p
t

69

fng.egheria. e/et sofrware-3..1

'Erii:te.r: res_U195 ('T=:pa.S.& 1 2='fiafil~ :


E-n:t:e'f ' .r-e's ul?!f (1=pas.s ;~=tail j :
EJJ:te.r fe'sl!llt" (-1=p!B.s.'S-:1 2;;;if.aii:j:
O't.er r"&s.t1J..t ,(i-=pass,,~ail): 2
~nt"er rrt.S.un ( =pas.s 12-=fai ): 1

lYlolti progrdmmatorlscrivoiw; progr"tJ.rf?mi serzi;il rrl!,d uti.ii~tr_rnmo St'/'lmtent(J ~i ~11i


lzppo come lo pseudocodiee. (edono che ~l loio. ~biettivo ~r~n_ctJ,d/. sr'n qt1e~o d1 rrsoL11re il prohl-ema ~u im corn.pt~te1; e che s.m.vere. lo pseudoc(}t/u;e serpa so/o a nttt:rt/d.re la
prod~t.:ione dei risult:_ati ji11'f1./,j,

'E'ntrer r-esui:t (1=pass,.~fail:): ~


Ent-er ris'llilt (1='pass 2=-fail): 1

Anali:si di risul t9.-ti dell'esame *I

~in,~Tude

E.n1!0.r re,soul .(1 =pass j)~fai1.) : 1


'erite1ri ~e:su1't 1 =pas:s,~fall) : 1

<st'di. h>

main()

:Jlt&

/* inl.zalizz-a le varia.bili nelle- dichlarazoni *I


= 0 1 fail.ures = 0, student = 1, result;

passes = pas-ses

else
failures
s'~de nt

faill:ll"~!J);

3.1 I Gli operatori di assegnamento

1111.d~bi/e

k rdarive espre"SS.i0ni.

Per

vartb~/e o;ert(J.r spr'ssian.e;

dove opt1,atore. sia un.o degli ope',ra:tori binar.i +, - , *, / o % ( a.Itri cli cui discuteremo nel

/ * chiusuf a con sucsesso


}

Enit~f'! re'S~l,t (!1=f>YalS-'S,2:-taii) :


rie su u (l =e-ts~ , 2:otail )': 2
Ent~H' r~!J.l::t ( 1=-~sis , 2=-kll).: 2
Erl~~r t'e.~W.1 (1=pa:s---s, 2=fai1): i
Erfter res:i.11~ (1=p'8'ssJa=faai) :

fili~e t'

6fi'1!~1' r~U-J;t (1:'1)a;&si;i 2=fl&il.) I 1

~1

'Capr_roJo 10). po_tr essere scritta J1.eHa focma


ililrabi/e. opi!ttttortt~?SptSsioiJi;
Di conseguenza l'a.sse_gnamenro e += 3 aggiungera 3 a c. L;:i 'Fi'gura 3.11 mostra gU
operawr1 a r iun ;~ici di assegnamento, alcne espressioni di seinpio che li urilinano e
Je rela:.cive spiegazfoni.
Operatore
di assegnamento
Assume~:

int e = 3,

Espressione

di esem,pio

Spieg~.ione

Assegna

12j

= e

+ 7

d = d

1 a d

e * == 5
t /= 3

e = e

2~

'/=

f = f I 3

\=

g %= 9

d = 5, e = 4, f

+=

e += 7

( f.=-pa~, 2=fta~l) : 2

*=

~
Ente.r r,ts~lt ;{1=p~_$,2=1"@.-jl): 1

.Pl;$-l;J4'0 6
Fa.11:~1' 4

Figura 3.1 O Il programma C e l. esecuzioni di esempio pr il problema del risultati


dell'es;;im.

Eperaw[e +~aggiunge il valere ddl'e$pressiooe alla destra ddl'0pera~9re alla var1abile alla
sua sin.isrra, lnmagazzinf.Ilclq il ris.ultato in quesr'itlcim.a. Ogni istruzion.e deLl forma

pass~s);

f tpasses > 8)
J)'r.int'f ( "Rri.S!! "tuition\n'");

E~il~ re~l>t

p.ocr: essere ahbrevi3..~ c6a. l"opera:tre di -assegnamento addizione += c.qme in


e ~= 3;

1i

'*t~fl' 1'esu.it (8f=~assJ2=f.:il'ili):


Elner re:su-it (1=pan,, ~t.:ai~.) :

t ;:G'l;i 0 r:i

print:f .("Pass.ed %d\n'1 ,


prl ntf( "File9 %, i\n",

Ra .1:5"eJ

Il C fornisce divers.i oper~tQri di ass~gnaincnto p:cr a~brviare


~pio, L'isn:uzione e
e + 3;

+ 1;

= failures + 1;

= student +

P,-SS.eCl 9
P&fle,d 1'

irit passs

/* !llabera 1 0 studeni;j,.; ciclo controLlatd da un c.oh'tatore *I


ivhil~ (student <= 10) {
printf (Enter result ( 1==pass 1 2=fail) : " ) ;
scanf("%d", &result);
f .(r!Jsult = 1)
/* if/else nidificato nel wlile "/

r'..sUlt (1<="~8:SS,~"ll;l;;f:ail) :

-=

6, g

= g

Fi_g ura 3. 11 Gli operatori aritmetici di assegnamento.

'

10 a e

ae

2 a 'f
3

a g

70

CAPITOLO

Lo SVILIJPPO 01 PROGRAMMl SrRlflTURAII

JJ. programma visualizzer il valore di e prima e dopo l'utilizzo deJl'pperatore ++. I.;pperatore di decremento ( - ) funziona in modo simile.

Obiettivo efficienza 3.2


Una i.sfTIJ.Zone che utilizzi tm operatore di assegnamento (come in e += 3) sar compilata pi velocemente del siw equivalmte nelltt forma estesa (e = e + 3),_perch la e
della prima espressione tar valutaia soltanto una volta, mentre quella della seconda
es-pressione sar 1;alu.tt1.ta due volte.

Obiettivo efficienza 3.3

/ * Preincrementa re e postincrement are */


#include <stdio . h>
I

111ain ()

int e;

Molti t/ei sur,gerimenti che menzmiaino in questo libro producono dei miglioramenti
irrisori, perci l'utente po'trebbe mere tentato di ignorarli. In realt, sar proprio L'effetto cumula.tivo di httd questi miglioramenti di pmt~ioni ahe consentir unti eseuzione significativammtepi rapida del programma. Un incremento ri'fevante dell'efficienza
sar rfalizzato, inoltre, quando 1111migliornmento1tpparen:temmte in-iforo sar stato
inserito in rm ciclo che potr essere riper:uto un gran numero di volte.

3. 12

I,

71

o = 5;
pri ntf( "%d\n", e) i
printt( "%d\ n", e++);
printt( "%d \n\n'1 , e) i
e = 5;
printf( "%d\n", e) i
pr intf ~"% d\n",

Gli operatori di increment o e di decremen to

Il e forn isce anche l'operatore di incremento ++ unario e l'opera:tore di decremento - unario


che la Figura 3. 12 riassume. Qualora una variabile e debba ess.ere iocremenraca di I, pou:
e~sere utilizzato l'operatore di incremenro ++invece dell'espressione e = e + 1 o e += 1.
Quando gli op.eratori di incrememo o di decremento sono sis[emati prima di una variabile, si dicono risperrivamente o-peratori di preincremento o di predecremento. Quando gli operatoci
di incremcruo o di decremento sono sistemati dopo una variabile, si dicono risperrivamente operatori di postincremenro o di postdecremento. Il preincremento (o il pc.edecremento) di
una variabile provocher in primo luogo l'incremento (o il decremento) di una unir della
variabile e, in ~guito, i1 nuovo valore della va:riabl le sar utilizzato nell'espressione in cu
<!ppare. fl postincremc.nto (o il postdecremenco) deU_a variabile far in m.odo che, nella
espressione in coi appare, sia ucilizzato il valore cocrenre della variabile e solo in seguim
quesr'ulrimo s;u: incremematb (o decremenram) di una unir.
Operatore Espressione di es'empio

Spiegazione

++

++a

lncremenca a di 1 e quindi ucilizza il nuovo valo


re di a nell'espressione in cui essa occorre.

++

a++

Utilizza il valore wrre.me di a nell'espressione in


cui essa occorre e quii;id.i incrementa a di 1.

-b

Decremenra b di 1 e quindi ucili:zrla il nuovo


valore di b nell'espressione in cui essa occorre.

b-

Uciliz.za il valore correme di b nelfespressione in


cui es~a occorre e quin:di decreuienta b d i 1.

t +c);

!* prein oreme nto /

printf{ "\d\n", e);

return 0;

t chiusura con successo * /

5
5
6

fi
Figura 3. 13 Mostrare la differenza tra il preincremento e l postincremenco.
~

Buo.na 11bit1tdln.e 3.10


Gli opemtol'i ima1i devono essere sistemati direttamente n ridosso dPi loro operandi, senza
l'int1'omi.ssione di spazi.

Le rre istruzion i di assegoamenro della f igura 3 .10


passes = passes + 1;

1, 1

Figura 3. 12 Gli operatori di incremento e di decremento.

Il programma della Figura 3.13 mostra la differenm era la versione di preincremenro e


quella di posti:nG!mento dell'operatore ++. Il postinc:remcnto della variabile e prqvocher il suo
incremenco, d0po che la stessa sar st:ara u~ nella istruzione print f . Jl preincrememo
della variabile e provocher il suo incremento, prima che sia utili:z.zaca nella..ist:ruz:ione printf.

I* p.ostin cremente * /

11

fa i lurs = failures + 1 j
st udent = student + 1i

porranno ~sere scritte in modo pi conciso utilizzando gli operatori di assegnamenro, ome in
passes += 1 ;
failures += 1 i
stud ent += 1;
o con gli operacori di preincremenco, come in

1:

++passes;

li

++fail ur,es i
++student;

UJ1LT01.0

71

Lo SVILUPPO ()I PROGRAMMI STRUrrURATI

73

o con gli operatori di postincremenro, come in

Esercizi di autovalutazione

passes++;
failures++;
student++;

3.1

imporcance notare in questo caso che, quando s incrernencer o si ~ecre~encer una

variabile in una istruzione isolata, la forma di preincremenco e quella di posnncrememo


avranno lo stesso effetto. Il preincrememo e il poscincremenm avranno effetti differenti (e,
iIL modo simile, anche il predecremcnro e il poscdecrmenco), solo quando una variabile

b) I.:indicazione dell'ordine: di c:.secuzione delle istruuoni da parce dd compmer detta


e)

urilizzara per l;S\!guire una azione, qualora una


d) La. struttura dJ selc-iionc
condizione sia vera, e un'altra azione qualora qui:lla qmcfu.ionc sia fulsa.
e) Molte istru1.ioni raggruppare all'inrerno d.Lp:arem~i graffe ({ e }) form:ino un - - - - specifica che una isrruzione o un loro gruppo
() La struuura di iterazione
dovr cssel'c eseguico riperuramente, finch~ w1a cerca condr1.ione re.scer vera.
g) I.:ite.ra.zionc dj un insieme tli iscrut.ioni per un numero specifcaro cli volte derra iterazione

Come operando di un operatore di incremento o di decremento, porr essere ucili,zato


sQlo un semplice nome di vaciabiJe.

Errore tipico 3.1 O

Tent11re di tttilizzan: L'operatore di incremento o di decmilento iri una espressione di11ent1 da


un semplice nome di 1.11tttbile, iwaltreparole, scrivere ++ ( K + 1) un errore di sintassi.

h) Quando non noto in anticipo il nu mero di volte che un insieme cli i$truiioni sar
per terminare l'Iterazione.
riperuto, potr essere udli1,wro un v.:ilorc

Buona abitudine. 3.11


.ltJ staruia>dANSJ generalmente non specifica l'ordine in cui s'(lranno valutati gli opertmd~
di un opemwre (anche se mi Capitolo 4 vedremo delk eccezioni a questa 11orma, per al.cum
operatori). Di consegumza, ii programmatore dovr evitare di utiur.zare delle istruzioni, con operatori di incremento o di decremen_to, nelle quali una particolare variabile,
che sia stata incrementata o decremiltara_, compaia pii't volte.

3.2

-=. :::,

ra 3.14 associano da siniscra a destra.


Operatori

Assocjativit

Tipo

( )

da sinis.rra a destra

parentesj

da descsa a sinistra

unaci

da sinistra a des-rra

molci plicatlvi

(tipo)

da sin istra

+
<

<=

>

>=

l=

?:
+=

--

/:::

%=

a destra

addirivi

da sinisrra a destra

relazionali

da sinistra a destra

di uguaglianza

da de5tra a sinistra

condizionale

da desrra a sin:isrra

di assegnamento

Figura 3.14 Priorit degli operatori incontrati sinora nel libro.

Scrv.ete quanro dilTcrcnri istrui.ioni in

e cbeaggiung.auo 1 alla variabile incera X.

Scrivecc un:i singola isrruzionc in C per eseguire ognuna delle artivic scguenri:
a) Asscgrme la somma clix e cli y a z e incrementare il valorc di x di 1 dopo il calcolo.
b) Molripli01re la variabile product per 2, utilizzando l'opcracorc *=.
c) Moltiplica.re la variabile product per 2, utilizzando gli operacori =e *.
d) Controllare se il valore della variabile count maggiore cli rn. Nel caso lo fosse, visualizzate
"Count is greater t han 10 .
e) D ecrementare la variabile x di I e quindi sottraerela dalla variabile tot al.
f) Aggiungere la variabile x alla variabile total e quindi decrememacc x di I.
g) Calcolare il resto della divisione cli q per dvisor e assegnale il risulcaro a q. Scrivere
quesra iscruzione in due modi diversi.
h) Visuali1,zacc il valore 123. 4567 con 2 cifre di precisione. Quale valore sar visualiiz.aro?
i) Visualizza ce il valore: in virgola mobile 3. 14159 con tre cifre a desua del punro decimale.
Quale v;ilore sar visualfaiato?

La tabella in Figura 3.14 mosrra la priorit e l'associativit degli operatori incrodo~


sino a q uesto punto. Gli operatori sono mosmui dall'alto in basso in ordine decrescente di
priorlc. La seconda colonna descrive l'associacivit dgli operatori a ogni livello di priorit. Osservace che l'operatore condizionale (?:) , quelJj unari di incremento ( ++), decremenro ( - ) , adciiz.ione ( +) , socrrazione ( - ) e di conversione, noncb gli operatori di
/=e %= associano da desua a sinisua. La tena colonna
assegnamento=, +=,
assegna un nome ai vari gruppi di operatori. Turci gli akri operatori presenti nella Figu-

Turri i programmi possono essere seri rei in termini di rre srrmrure cli conrrollo: ----~

-----e-----

apparir in una espressione pi grande.

+t

Rispon<lern a ognuna ddle seguenti domande-.


Una procedura per risolvere un problema. defi.n.ira in reanini di azioni che dovranno
essrc csegui1e e dcJl'ordi1ic in cui quelle azioni dovranno essere eseguile de1ea un

a)

3.4

Scrivete una isrruioae C per eseguire ognuna ddle seguemi acrivic.


a) Dichiarare le variabili sum ex di lipo int.
b) laizializzacc la variabile x con 1.
e). lnizializzacc la variabile sum con 0.
d) Aggiungere la variabile x a sum e as~egnace U risultato a quesr'ulrirna.
e). Visualim.atc "The sum is: " seguico dal valore della variabile sum.

Combinale le iscruzioni che a.vete sc;;ritto ncll'Eserci1,io 3.4 in un programma che calcoli la
somma degli inleri da l a 10. UciJizzare la srrumtra while per iterare l isauzioni cli calcolo e di
incremento. li ciclo dovr rcrrrunare quando il valore di X divmer uguale a l L

3.5

Decenninare i valori w ogni variabile dopo l'es~on del calcolo. Supponere che tutte le
variabili abbiano jl valore 5, quando ogni istruzione cominf;e.r la propria esecuzione.
a) product = x++;
b) result = ++x + x;

3.6

74
3.7

CA!"ll'Ol.O 3

Scrivere una singola istruzione C che


a) Prenda in inpul la variabile inrcra x con scanf.
b) Pren.da in inpur la variabile inrer:i y con scanf.
c) Inizializzi la variabile inrera i con 1 .
d) Inir.ializzi-la variabile incera power con 1.
e) Molriplit bilayariabile powe r per x e assegHi il risuJcato a power.
f) Lncre11len.ti la. variabile y di 1.
g) Concrolli y per verificare se sia inferiore o uguale a x.
h) Visualici la variabile intera power con printf.

Lo SVLLUPP() DI PROCRJ\MMI STRUITURl\Tl


c) SUl\I = 0j
d) sum += x; osum = slJJll + x;

e) printf ( ' The sum is: %d\n' , sum);

3,5

t ca1oola la somma degli interi da 1 a 10 I


#include <stdio. h>
main()
{

int sum, x;
X =i j
sum =0;
wtlile (X <= 10) {
sum += x ;
++x;

Scrivete un programma e che ucil.ini le ismriioni ddl'Ese.-ci2.io 3.7 per calcola.re X elevata alla
poumza y. li programma dovra conce nere una ruucrura di controllo cli iccraiione while.

3.8

3.9

ldcmifc:ue e correggere gli erro ri in ognuna delle segut:nti istruzioni:

a) while (e

<= 5) {

product

++e;

= e;

prJ.ntf( "The sumis: %d \ n', sunl);


}

b) scianf( "%.4f", &value);


e) if (gender = il
printf ( "WOman\n') ;

3.6

3.10

3.7

D ice cosa a:on va nella segucnccsrrurru.rn di icerazione while:

while (z >= 0)
sum += z;

Risposte agli esercizi di autovalutazione


a) i\lgotl.rmQ. b) ntrollo di programma. e) Sequenza, selezione, iccraiione. d) i f I e.lse. e)
Istruzione compesra. f) while. g) comrollata da un contatore. h) Scnrinclla.

3.2

3.3

x=x+1;
X t= lj
++x;
x++;
a)

a) product
b) result

else;
printf( "Man\n );

3.8

..

=1;

h)

printf('1o~w ,

power) ;

I eleva x alla potenza y


#include <stdio.h>

~I

main()

int x,y,i,power;
i

=, ;

power " 1;
scanf("%d 11 , &x) ;
sc.anf( '%ci ", &y);

c) product =prod!lct " 2;


printt("Count is greater t nan 10. \11 )..;

while (i<=

e) total -= -x;
f) total += i;<- ;
g) q 9s= divisor;
q = q % divisor;

power
++i;

y) {

x;

printf(''od', power);

return 0;

b) printf( ' %.2f", 123.4567);

visualiizaro 123, 46.

a). 1,nt surn, x~


b) X= J;

=, i

pOl'1er

g)

d) if (oount > 10)

3.4

l.

power = x;
y++;
i.f (y < x)

z = x++ + y;

printf['%. 3f\n" , 3.14159);


h isuali:z:z:ato 3, 142.

scanf( \d, &xl;


scanf( ' ll'D , &y);

a)
b)
c)
d)
e:)
f)

b) product ..=2 ;

i)

=25, x = 6;

=12, x =6;

3.9

n) Errore: manca la p arcnrcsi graffa cli chiusura per il corpo della while.
Correzione: aggiungern la parentesi graffa di ch iusura dopo l'is:rruzione ++e; .
b) e rrore: srata uri.lizzara la precisione nella specifica di conversione dl una scanf.
Corrc~ion e: rimuovete il . 4 dalla spccirica di conv~r.siomt.

75

76

ITOLO

LO SVILUPPO DI l)ROGRA.MM I,STRU'ITUl'tATI

77

int x = 1 , total = 0, y;

c) Errore: il punto e virgola dopo la parte else della smurura i f /else produrr un errore
logico: la seconda printf sar eseguita sempre.
Correzione: rimuovete il punto e virgola dopo I'el se.

while (x <= 10) {


y :o X x;
prir1tf( ,.%d\n~,

"valore deJl3 variabile z non sam mai modficaro all'imemo dellasrrurrura while. staro quindi
crearo un ciclo infinito. Per evitare il ciclo infniro, z dovr essere decrementata in modo da assumere,
ad un certo momcnco, il valore 0 .

3. 1o

y);

tot al +:o Yi

++x;

printf("Total i s \d\n, total);


re.turn 0;

Esercizi
Jdencifoce e correggete gli errori in ognuna delleseguen imuz.ioni (Nota: porr esserci pi di
un errore in ognuno dei pez2i di codice):
a) if (age >= 65);
printf("Age is greater than or e~ual to 65\n");
else

3.1 1

3.14

Scrivere una singola istruzione in pseudocodice che eseg_ua ggnuna delle seguenti azioni:
a) Visualizzate il messaggio Enter two numbers .
b) &segnate a p la somma delle va.ri:ibili x, y e z.
e) La seguente condizione dovr essere concrolhtra in un.a sm.mura di sd enone if I el se: il valore
corrente della vari:ibile m maggiore del doppio di qudlo:comenmo nella varjabile v?
d~ Octenece dalla rasciera dci valori pe~ le v;u:iabili.s, r e t.

~.14

Formuface un algorirmo in pseudocodice Ber ognuna delle seguen:ci anivim:


a) Otcenete due numeri dalla rasciera, calcolarene la somma e visualizzare il risultaro.
b) Ocrenere due nwueri dalla casticra e quilldi dcceaninarc e visuali.zzate il maggiore dei

pr.1,ntf('Age 1s less than 65\ n');

b) int x = 1, total;
While (X <= 10) {
total += x;
;+x;

e) While (x <"' 100)


total += x;

++x;

d) while ( y

> 0) {
pr.iiltf( ''t!d\n, y);

-Hy;
}

3.11

Riempire gli spazi in ognuna delle &asi seguenri:


a) la soluzione di ogni problema richiede !'~cm.ione di una serie di azioni in un _ _ _ __
specifico.
b) Un sinonimo di procedura, _ _ __
c) Una variabile che accumula la somma di diversi nume~i u n - - - - d) 11 processo in cui si impostano certe variabili cqn dci valori specifici all'ini1jo di un programma detto - - - - e) Un valore speciale uriliu.aco per indicare Ja ufuie della immissione dei daci" dccro valore

- -- - - o - -- - una rappreseucazione grafic;i di un algorim\o.


f) Un
g) la un dla.gramma di Bussb, fordi.ne in cui dovranno essere eseguici i passi sar indlcatc:i
dai simboli di _ _ __
di ogni algodtmo.
~ la
h) li simbolo di teaninai,ione iodica l'
i) li simbolo rctta11golo corcisp9nde ai cakoli, eh~nor:tnalmcnte saranno eseguiti dalle istruzioni
_ _ _ __, e alle operazioni dj inpuc/ourpuc! cb:e normalmente saranno eseguite dalle
de.Ila libreria standard.
e
chiamate alle funzioni
) J.:demenco scrirro all'interno cll un simbolo ~ decisione dcrto _ _ _ __

3.13

Che cosa visualizzer il seguente programma?


#include <stdio.h>
main()
{

due, se c'.
c) Orrcnece una serie di numeri posirivi dalla casc.iera e qui11di decerminare e visualizzate la
loro somma. Supponete che l'uceme immecca il valore sentinella -1 per indicare la "fine
dcU'immissione dei dari".
3.16 Scabilfre quali delle seguenti affermazioni sono vere e quali sono fulse. Qualora una alfermazion~ sia falsa, spiegacene iJ morivo.
a) I.:esperienza ha dimoscrato che la parte pi difficile ~lla risoluzione di un problema, su
un compuccr, la produzione di UD progtamma C funzionante.
b) Un valore sentinella dovr essere tale che non possa essre confuso con un valore legirmo
per i dari.
e) Le linee di flusso indicano le azioni da eseguire.
d) 1.e condb.ioni scrirte all'iucemo dci simboli di decision onn;I)gono sempre degli operacori arinnecici (ovverosia+, , , I e %).
e) Nd processo cop down per raffinamenti successivi, ogni rnffinamenro una rappresencazione compleca dell'algoricmo.

Per gli Esercizi daJ 3.17 al 3.21 , eseguite ognuno di~uSti i;iassi:
l. Leggere l 'enu o cia~ione dcl problema.
2. Foun ulate l'algoritmo usando I.o pseudoodi'ce e il proces.so rop down per rffn ttmenti
s.u.ccessivi.
3. Srivctc un programma C.
4. Collaudre, mmote a punto ed eseguire il programma C.
3.17 A.causa dell'alto prezzo della benzina, gliautomobilisciso_i;iointeressati alnumero di chilomerrj
percorsi dalle proprie aucomobili. Un aucomobilsca.bamanccnutQ traccia di diversi pieni di beniina,
!egisc:rando i chilornec percorsi e i liLri uliu.ari per ogni pieno. Sviluppare un programma che
prenda ininput i d1ilometri percorsi e i lirri utilizzati per ogni pieno. Il programma dovr calcolare e
visualir.zare i chilometri per litro orrenuti da ogni pieno. Dopa aver elaboraco rurce le informazioni in
input, il programma dovr calcolare e visualizzare anche i chilomecri per liuo ottenuti complessivamente da rurri i pieni.

CAr1ro1 0 3

78

Lo sVJLu r1c>0 or PROCRAM.Ml STRmTuRJrn

Enter the gallons 1,1sed ( ~ tltci entl) : 12. a


Enter the miles driven: 28T
The miles / -@!on tor tnistank was 22.421875

Entersaies in dollars (1 to end): 00,0.00


-

Sa1afy is: $650. 00

Ent-er r~es in dellal's (-1 to end). : t"234-. 56


Salary fs: $311 . 11

Enter the gallons used ( 1 t0o end) : 10. s


~tef:th.e tfiil~s Qll'ven: z~
The miies I g_1lloh fo.r th'is.:ttank Was 19.'4q1747S

enter S'ahlt in .d:ll.14l'~H


SiiliJr~ is: $298. 00

Enter tlle g_illons used ( -1 tQ end): 5


Enter tfle Aiiles driven: 1~
Tlle miles I !lalion tor this tank was 24. 000000
Enter the :gatlons used ( -l to eni.t) : 1

3.18 Sviluppate un programma C, che detemuni se il clience di un grande magazzino abbia superato il limice di.a;edico sul suo com o. Per ogru cUtnre saranno disponibili i scguemi dati:
I . U numero di como
2. Il saldo all'inizio del mese
3. Il cotale di rnrri gli articoli che il clicme ha messo in como. durame il mc:Se corrente,
4. li totale di curri i credici applicati al corno di questo dieme. durance il mese corrente.
5. li Limire di credico concesso
Il prqgram rna dovr prendere in input meri ques da , cnkol:1re il nuovo saldo (= saldo iniziale +
ardc::oli messi In cciilro-ctediri) e dereaninare se il nuovo saldo super.i il Limi ce di eredit del dicnic. Per
quei dicnri d ie avranno su peraro ilJ1m ire di credito, il programma dovr vjsualizz.'lre ilJoro numero di.
com o, il limire cU credito, il nuovo saldo e iJ messaggio "Credit limir exceeded".
Enter abeo1,1nt

3.20

l:interesse semplice ~u un mutuo calcolato dalla fo rmula


rate

days I 365

'alter dean prino1pal ( 1 'l:o nd) : 1:000 .00


Ent-er ~terest rat: .0Q375
Enter 'term of the lOC!ll in days: 224
The i.nterest charge i& ssi .400

Enter 1-11$1 pr:i.noa.pal ( 1 te end) :

10000...00

Entar ~ere&t riat-: :


En(-er term Of ttie loan in days: 1460
The inte,,est charge iS S3600.00

Enter J.oan principal ( 1 to end) : 1

Enter total cba1ges: 274,73

Enter loan principal ( 1 to end) : 1000 .0'0


Enter ioterest rat: .1
fntep unn of the roarr in days: 385
The mterest oharge is $100.00

Enter tta1.,~r'cli.ts': 500'.00


Enter credi.t l.mit: 5500.-~

Enter account number ( -1 ilo end): 300


Eniter beginhing balance: 500 .00

= principal

precedente.

Enter bei~o:fOg bahlni:e: s394 .18


Ei:iter tota[ oharges: 1:000 00

Enter aceeunt number ( 1 to'.;end): 200


-enter beginning balance: ~000.00
Entertotl oharges: 12:3.45
Enter total credits: 321.00
Enter gr~r,$! lmit: 15~.~

1~8. 89

La formula precedente presume che rate sia il ra.~o di interesse annuale e quindi include la divisione
per 365 (giorni). Sviluppare un progmmma C che prenda in inur principal (e!picale), rate (r:isso)
e days (giorni) per dJversi mmui e visullJiz1.i l'in:reresse semplice per ogni muruo, acllizzando la foa:irnb

number (1 to ;.end) : 100

100
Account:
Credit limlt: 5500. 00
5894.78
Balance:
Ctedi.t Limi-t:E seeJJed.

to ene >:

Enttir sales i n dolllil's ( -1 to end) : - 1

i nter.est

Tue ovrall average miles/~ori was 21.601423

79

3.21

Sviluppare Ull programma e che <lecermii1i la paga lorda per ognuno dci d~vrsi impiegaci. I:aziefr

da, per le prime 40 ore lavorare da ogni impiegam, paga il "salru:io rario di base", .men:rre per rurte le ore
lavorare in aggiunra alle 40. elargisce "una volra e mezza il salario di ase". Vi sono scarifumiri: una.lista degli
impiegaci dell'azienda, il numero di ore lavorare.da ogni impiegar nell'ultima settimana e il salario orario di
base di. ogni impiegaco. Il vosno programma <lovn\ prendere incinpur, per ogni impiegato, le suddecre
i11formazioni e dovr, quindi determinare evisual.iz.-1.are la paga lptii;1di ognuno di loro.
Enter Il of hours worked e 1 to end) : s9
Enter tiourly rate of the YK>rker ($00.00): 10.00

Enter-tota! credits: 100.00


Enter crflit l:i,lnit: 800.~

salcy is S390. 00

Enter a'<:l~ur:ft,nqmber ( 1 -te el'!d): 1

Efite'n ff~J:JPLY rate.,n f ~he wor.l<er (s00.00): 10.00


Salaryis $400.00

Una grande industria chimica rerribuisce i :propri vcn<l.icori basandosi sulle provvigio11i. LI
vendirore riceve $200 la scrcinuna pi il 9 per cento delle proprie vendire lorde portare a termine
durame la sccrimana. Per esempio, un venditore che in una seuimana venda prodorri.rhimici per un
valore di $5000, cicevcr $200. pi i l 9 per cemo di $'5000, ovverosia un tolale di. $q50. Scrivete Lm
programma C, che prenda n inpuc le vencilte lorde di ogni veriditore per l' uJci111a $Crtirm1na C quindi
G<coli e visualizzi il salario per ognuno di loro. Elaoora,n: i <:Qnri d1 un vcndfrore pervolra.

Enter

~- of

tiours worklk'.d H

~o

erio):

4~"

3.19

EnteP:it of hours worked ( 1 to end): 41


EJtter h.o urly rate Of'' the 1110r1<er {$00.00) : 10.00
Salatf,i.$ '$415. ~

Enfor, 4f of tiours Wt>rkel ( 1 to end) : 1

CAPITOLO

80

int oount = 1;

Scrivete un prog:mmma Cche dimosrri la differenza cr:i il pcedecrcmenco e il posl<kcrcmenro,


udli'l.zac;lo l'operatore di decremento-.

3. 2~

while ~count <= 10) l


pr intf( "%s\n', count % 2 1 . ........ ,

3.23 Scrivere un programma che utilizz un ciclo_, per visualizza~e i numeri da I a IO ala.nco a
fianco sulla st<!SSa riga e con tre spazi rra ognuno di essi.
3.24 li processo di ricerca del numero pi grande (ovverosia, del valore massimo in un gruppo di
numeri) ~utilizzaro frcquencemenre nelle applica7.ioni pr corT)pucer. Un programma che dccc.rmini il
vincitore di una gara di vendite; per esempio, prender in .input il. numero degli an~coli v.nduci da
ogni venQ.lt qte. Vincer la gara il venditore che av.r venduto il maggior numero di articoli. Scrivere un
programma in pseudocodice e quindi uno in e, che p.renda in i11put una serie di 1o numeri e in
segui~ de~ermini e visualizzi il maggiore dj qudli. Suggerimenro: il vosrro programma dovr ut:il.i:zzan:

ere vMiabili, come segue:


per mantene.re rraccia di quanti numri
(ovve.resia,
O
I
a
fno
comare
per
concacore
un
counter:
saranno sm immessi e per determinare quando tutti i IO numeri &1.ranno srnri elaborati).
il numero correnre immesso nel programma..
nlJlt>er:
l argest: il nwncro pili grnnde rrovaro sino a questo p.uoto.
3.25

.Sccivecc un programma d1c uriliz un ciclo per visualiz7.are la seguente cabclla di valori:
N

10-N

100'N

10

100

31?

300

40

400

SI)

500
600
700
800
900
1000

81

Lo SVlLUPl'O DI PROGRAMMI STRlJJTUR.>\TI

'++++++++");

++count;

return

3.30

~;

Che cosa-visualii.zer il seguente pragrnmma?


#include

<sttjio.h>

ma.in()
{
111t row = 10, column;

While {row >= 1)


oolumn ~ 1 ;
vihile ( column <= 10) {
printf( '%s", r~v % 2 ? '<': ">');

-=;

l~N

++column;

4
5
6
7
8
9

00
70
8'
00
100

...
1000
2000

- row;
pri ntf ( \ri");

iJ00
7000

return 0;

B000

9000

~
li c:arattcre di ra bulaziooe, \ '1:, pe.. e,~s'ere u ciliz~.:im nll_a iscruzicmc pdntfpr s~par:u:e le colo.bne i::On
1~

delle tabulazioni.
3.26

Scrivere un programma che ucillu.i un ciclo per produrre la seguence tabella di valeri:
~

At2

A+4

'S

10

12

j1

15

12
15

1~

13
16
19

17

18
21

3.27 'Frovace i due numeri maggiori era IO valori, usndo un approccio srnile-all'.Esercizio 3.24.
Nora: porcele prendere in input ogni valore soltanto un:i volta.

3.28 Modificace il programma della Figum 3.1 O, i.n rn;4o da convalidare l'ffipuc. Rei cera.ce su ogni
input, qualer-a.il valore: imtne.i;i;o fqss'c dlvers() tla I o da.2, finch l'mence non immcma un valore corFetto.
3.29

Che cosa visualizzer._il seguente programma?


l#incl.ude .;std10. h>
main()
{

3.31 (Problema deil'else appeso) Dccermirrace l'output d'ognuna delle scgLten istruzioni quando
x 9 e y 11 e quando x 11 e y 9. Osservate che il compihMre ignora i tiemci all' inremo di un
programma C. llcomp .ilarore e inolrre as:socer~ sempre. un !!lSe all'if precedente, sempre che non gli
sia stato derro di fue :rrimenLi. ama.verso la dsposiiion ddleparenresi graffe { }. Daro che, a prima
vista, il programmatore non pu es~ere sicuro ddl:i corrispondenza di Ull else con un i f , questo
problema defnico "dcll'dse appeso". Abbiamo eliminaro i rientri dal codice successivo, per rendere
pi inccressame il problema. ($u.ggerime.mo: applicace le convenzioni dei rientri che a.vece appreso).
a) if (X < 10)

if

(y > 10)

printf( "**"' ..\n" l;

e1Se

pr inrt( ~#####\n 1' l;


printf( '$$$$S\n'');

b) if (X< 10) {
if (Y > 10)
printf('*~\n'li

}
eise {

printf ( "###11#:\n ) ;
pri ntf("$$$$$\n");
}

3.32 (Un alrro problema dell'else appeso) Modi1cace il codice seguence in modo che produca
l'outpur mostraro. Ucilir.lacc le cecaiche di riemro appropriace. Non pocrece cscgLLire..alue modifiche

82

CAPITOL03

che non sia110 degli inserimenti cli parentesi graffe. li ompilarore ignora i rienrri in un programma C.
Abbiamo eUminato L rientri dal coclice seguente, per rendere pi 1meress;1nre il problema. Nora:
probabile che non sia necessaria alouna modifica.
if (y = 8)
if (X _:_ 5)

printf ("@@00!!\n );
else
printt( ' #####\n");
printt( 'S$$$$\n' );
pr intf ( '!&&&&&\n");

a) .Assumendo x

=5 e y

= 8, s_ar prodocro l'0t11:puf seguente.

[
b) Assumendo x

= 5 e y = 8, sar prodono l'orpur seguente.

e) Assumendo x

= 5 e y = 8, sar prodocro l'ourpurseguencc.

Lo svu.urro DI PROGRAMMI STRLfnURATJ

rio" una per volta da de~-rra a sinisrca, u:ti.Li7.zate gli opemrori di divisicme e dl modulo. Nel siscema
numerico decimale, la cifra pi a dscr h;t un valore posiz.ion;tle di I e quclle che si susseguono a
sinima hanno un valore posiaionale di lO, poi '1 00, poi 1000, ecc.; it.llo stesso modo, nel sistema
numerico binario, la ci.fu pi a descra ha un valore posizionale di 1 e quelle ch si susseguono a sinistra
banno un valore posii.ionale di 2, poi i. poi 8, ecc. Di conseguenza il numero 234- pocr essere
inccrpretaro come 4 I + 3 ' 10 + 2' 100. l.:cquivaJcnre decimale del binario 1101 sar I I
+ O 2 + I 4 + I 8 o l + O ~ 4 + 8 o 13).
3.37 Sentiamo p;tclare spesso dj quan.co sian.o veloci i computer. ln che rno<lo peri> tJOtece dt.!rerm lnarequa11to rea,l1nc11 te veloce l:i voscra m acchina~ Se.rivere tLn programma con 'Un dclo while chcconri
uno per volta da 1 a 3.00().000. Ogni volra che il conto raggiungerli un mulriplo dj 1.000.000,
visualizzerete il numero sullo schermo. Ucilizziae il vomo orologio per misurare il cempo impiegaro da
ogni milione di iterazioni :l'inremo dcl ciclo.
3.38 Scrivere un programma che visualizzi J 00 ascerisch.i uno per volta. Ogni dieci asrecischi, il
vostro programma dovr visualizw.re un ca ratte.re newline. (Suggerirne.neo: concare da 1 a I00. Usate
l'operatore di modulo per individ'ua.r:e rurre le volte che Il comarore raggi unge un mufr:ipl.o di 10).

3.39 Scrivece un programma che le&,oain.iaput un incero c. inseguito, determ in.i e-visualizzi quami
7 sono compresi nelle cifre dcll'inrero.

3.40

.-- ... .. '*

..

,_,

[I._ _. . =
:=~---------]
3.33 ScriYce un programma che legga in input illaco di un quadraro e quindi lo disegni uci l iu~1ndo
degll asteris_chi.11 vostro programma dovr funzionare _can runi i quadrati con dilrn:nsioni dei lari
comprese tra 1 e 20. Per esempig, se la djrnensione !erra dal vostro programma fosse 4, dovrebbe:
visualizzare:

vosuo

.. .

..._

Il vos1-ro progran:umt porr utiliz1.are solramo ere istruzioni printf: una della forma
pri~tf( ' ");
una della forma
prirrtf ( ) ;
e una della forma

printf( \ n") ;

visuJi,rncj

Scrivete un prog.r;rnuna che contin_u.i a visualiizare i multipli dell'incero 2, ovverosia 2, 4, 8,

16, 32, 64, eec. Il vostro ciclo non dovr J.lll!:i terminare (dovrcce insomma cre-.t.re un ciclo infnico).

Che cosa succede.cl quando eseguirece qnesro programma?


~ ..

3.35 Un palindromo un numero o una fr.m~ di resto che. da sinistra a desu:a o da desrra a sinistra,
si legge nello Hesio modo. Per esempio, ognuno dei seguenci in ceri di cinque cifre un palindromo:
1232 l, 5555'5, 45554 e !1611. Scl:.ivete un programma che legga in input un lnrero di ci nq ue ci&c
e determini s~ si tratta o n di un palindromo. (Suggcrimemo: per scindere iJ ownero nelle sue singole
cifre, uriliv.ace gli opemrori di divisione e di modulo).

3.36

.~

.. .. .. .... * '
...... . '* ...

3.4 t
[

,.. ~

,.. ~

* ... "' ...... * *

Modificate il programma che avete serino nell'Esercizio 3.33 in modo che visualizzi un qua~;
J, dimc.,,;onc lca> d,J
programm """ 5, "'bbe

vuf ;'."<mpio,

Scrivete on programma che visualizzi il seguente diseg!lo di una scacchiera:

.. . . . "
..
"* " "" * "' .Jr*
...
-- ....

d) Assumendo x = 5 e y =7, sar prpdocto l'ourpuc seguente. Nora: le ulrime ere printf sono
mere parei cli un'istruzi-Ooe composta.

3.34
dn<o

83

Prendere in inpuc un incero corueneme ~oltamo degli O e degli I, ovveiosla un incero "binario", e visualizzare il suo equivalente decimale. (Suggerimento: per prebiare le~cifre del numero "bina-

3.42 Scrivere un programma che legga il raggio di un cerch.io (come un valore di cipo floa:t) e quindi
calcoli e vism1Jl?:7j il diametro, la circonferenza e l'area. Utilinare il valore 3.14159 per te.
3A3 Cosa .non va nella seguente ibtruz.ione? Riscrivere l'ib-:rmziqnc in modo che esegua quello che
probab iI111 ence il prograJilmato re stava rnatando di ocre.nere.
printf ( ' %d' , ++(x + y)) ;

3.44 Scrivere un programma che legga in inpur tre valori di c:ipo float diversi da 1.ero e, quindi,
determini e visualini se possono r:ippresenrarc 1 la di un triangolo.

CAPITOLO

84

3.45 Sccivecc un programma che legga in inpur rre inc:erl diversi da zero e, quindi, determini e
visualizzi se possono essere i lari di un triangolo r~ttangolo.
3.46 Una azienda vuole rrasmerterc: dei dati sulla line;i. telcforuca, ma i suoi responsabili sono
preoccupari dal facto che i propri cdefoni porrebbero essere spiaci. Trnci i loro dac i sono trasmessi come
inceri di quamo cifre. Vi h:inno quindi chiesco di scrivere un programma che crirrograf i loro dari io
modo che possano essere rmsmc:ssi con maggior sicurezza. Il vosno programma dovr leggere un inreco
di quamo cifre e crittograF.ufo nel modo seguente: sostiruice ogni cifra con (la somma di quella cifra pit1
7) modulo 10. 111 scguiro, scambiare la prima cifra con la cerza, e scambiace kt seconda cifra con la
quana. Visuafo.7.are quindi l'incero crirrografuto. Scrivere un programma a parre 'Che prenda in input
un intero crinogrtifaro di quamo cifre e lo decifri, in modo da formare il numero originale.

3.47

nfattoria.le di un intero non~ neg:u:ivo

l1

CAPITOLO

Il controllo del programma


Obiettivi
Essere in grado di utilizzare le srrutnu:e di iterazione fo r e do /while.

si scrive nl (pronunciaco "falforiale di n") cd defnico

come segue:

n!

=11 ...(11- 1

11!

1)

~11-

(per \;ilpri c!i 11.m~ggiori o uguali a I)

2) ... I

(pe.ii

Il=

I
2!

I
3!

e=I+-+-+-+ ...
c) Scrivere un programma che approssimi il valore di , urilizz.ando la formula

J- ~
X
e" =l+-+-+-+ ...
l! 2! 3!

Comprendere la selezione multipla, u.tilnaodo Ja.strucru.m di scle7.iooe switch.


Essere in grado di utilizzare le isrruzioni break e continue per il conrroUo del
program.ma.
Essere in gr:tdo di utili:u.1.re gli operat ori logiei.

O).

Per esempio, 5! =5 4 3 2 l che 120.


a) Scrivere un programma che legga in inpm un lorero non negativo e quindi calcoli e
visualizzi il suo fattoriale.
b) Scrivere un prognunmacheapprossimi ilva.loredeUa cosmmemaremaca e, ucifo..z.ando la
formula:
I
I!

4.1

Introduzione

A questo punro, il !errore dovrebbe essere a proprio agio . on il processo d i scrimira cJj un
semplice ma completo programma C. In questo capitol, sar tr:rrtara pi derraguat:unenre
!'ire.razione e, nello sresso rempo, saranno presentare :llrre srrurru:re cJj controllo per qoe~i:'ul
cima, ovverosia la Struttura for e quelb do / while. Sar imrodorra anche la srrurcur:i. di
selezione multipla swi tch. Discureremo della istruzione break, per uscire immcruacamcnce e rapidamemc da certe srrurrure di controllo, e deUaiscnrzione continue, per ignorare
la parre rimanemc dcl corpo di una srrum1Ta di iterazione e procedere con la successiva
ire.i-azione del ciclo. Il capitolo ruscucer inoltre degli operatori logici utilizzaci per combinare fra loro le cond'Lioni e, infine, concluder con un riassumo dei principi della pl'ogrammazo.ne smmuraca presemad nel Capirolo 3 e nel Capitolo 4.

4.2

Gli elementi della iterazione

I.a maggior parre dci programmi rich iede delle iceta?.ioni o cfrli. Un ciclo (/.Qop) l Ul gruppo
di !!tnrLoni die il computer csc~tlr r iperutamente, f nc.h una .na crmdizio11e di cqnrin.utizi'<>ne del ciclo rimarr vera. Sinora abbiamv discusso cli du~ ci ~J di iterazione:
J . .eicera.zione conrro1lara da un contatore
2. I:iceraz.ione conrrollaca da

Wl

valore sentinella.

J;iterazione concrollara da un contatore derra a volte iterarione definita, perch conosciamo esanamente in andcipo il numero di volte che il cjclo sar~ eseguito. !.:iterazione conrrollara da un valore sentinella decca a volte iterazinne indefinita, perch non noto in anricipo
.U numero di volre che il ciclo sar eseguito.
Nella icerv.ione comrollaca da un contatore, urilizz.a.ra una varinbile di controllo per
comare il numero delle ireraz.ioni. La variabile di controllo sar incremenrara (di solim di 1)
ogni volra che sar eseguito il gruppo di imuzioni. l i ciclo terminer quando il valore della

CAJ11TOLO 4
variabile di controllo indicher cbe sar sr::no eseguito il numero corretto di iterazioni; a
q uel punto, il compurer porr continuare l'esecuzione con Liscruzione successiva alla srrucrura di c-0nrrollo.

I valori sentinella sono uciliz.zaci per conrrollare una icerazione quando:


l. il numero preciso delle iterazioni non noto La.ruicipo e
2. il ciclo include delle isrruzioni che oncrran.no dci dari ogni volca che qucsc'ulcimo sar
escguico.

/* Iterazione controllata da un contatore * /


#include <stdio.h>
main ()
{
int counter

I* inizializzazione *I
1~

condizione di iterazione */

/* increment o * /

d.stinri dalle informazioni vere e proprje.

Iterazione controllata da un contatore

= 1;

while (counter <= 10) {


printf ( ' %d\n", counter);
++counter;

11 valore sentinella indica la "fine dei dati" e sar immesso dall'utente dopo che rutti i veri
elementi informarivi saranno stati fornici a1 program.111:l. l valori sentinella. dovranno essere

4.3

87

lL GONLROU..O Olil. l'ROGRAMM1\

return 0;
,_

Una iteraiiio11e concro.Uara da un comatore richiede;


t. I l nome dj una variabile di controllo (o comacore del ciclo).
2. Il valore iniziale della variabile di conrrollo.
3. Lincremento (o decremento) con cui la variabile di controllo sar modificata ogni voica

2.

a
4

5
6

nel corso del ciclo.

4. La condizione che verificher il val.ore finale della variabile ili conrroilo (ovverosia:, quella
che determiner se il ciclo dovr conrinua.re).
Considerare il semplice programma mostrato nella Figura 4. l che visualizza i numeri da
1 a 10. La ruchiarazione

'T
8
~

10

int counter = 1;

Figura 4.1

assegna un nome alla variabile di conrroUo (counter), la dichiara di tipo inrero, le riserva
uno spazio nella memoria e le assegna il valore iniziale 1. Quesra dichiarazione non una

ra 4. L, inizializzando counte r a 0 e soscicuendo la scrurrur.a while con

istruzione eseguibile.

Avremmo anche potuto d ichiarare e i.nizializzaI:e counter <::on le istruzioni


int countr;
c oljn t~r

= 1;

La dlchiar~one, anche in quesro caso, non una isuuzi:gne eseguibile, mencre l'assegna-memo lo . In seguj co ucili2zerem'o entrambi i merod i per l'iniziali.zzazione deUe variabilL
I:iscruzione
++counter;

iflcretnenter iJ contatore dcl ciclo d i l ogni volta che quesw sat eseguito. La condizione di
cominuazioue del ciclo nella scruccura while comroller se il valore della variabile di conrrollo sia inferiore o uguale a 1 0, ovverosia l'ultimo valore per il quale la condizione risulrer vera. Osservate che il corpo d i questo while sar esguito anche quando la variabile
di conrrollo varr 10. li ciclo terminer quando l<t variabile di <::on aoUo avr super.uo 10
(counter avr assumo il valore 11 ).

Iterazione controllata da un contatore.

Normalmente, i prograrnmamri C renderebbero pi c0nciso il programma della Figuwhil (++counter <= 10)
printt c%d\n", counter);

Q uesto codice consentirebbe di risparmiare una .istruzione, poich l'incremento sarebbe


eseguito direttamenre nella condizione del ciclo while, prima che la sressa ~ia vecifcara.
Questo cod ice el iminerebbe anche le parentesi graffe intorno al corpo del while, perch a
quel punto ess con terr!!bbe u.ua. sola isrruz.ione.. Scrivei:dl c::odice in un modo cosl conciso
richiede una. cerra pratica.

Errore tipico 4. 1

Dato ,he i valori in virgola moble potrebbe:ro essere approssimati, utilizzare dc!Le variabili di quel tipo per il controllo dei cicli, potrebbe produ.rre dei valori impreci del
contatore e provocare dei conrrolli di termitutzi.oiie 1wn acitrati.
Buona abitudine 4. 1
Controllate le iterazioni determinate con dei va/ori interi.

88

UPITOLO

Buona abitudine 4.2

Fate' ~:ientrare con degli spr1.zi e.delle tabul.azioni le istruzioni nel corpodi ogn.111111 delle
stnttture. di controllo.

Buona abitudine 4.3


Inserite una riga vuota prima e dopo ogni principale strzmum di controllo in modo da
e11idrnziaritl afl'interno del progrttmma.

Buona abitudine 4. 4
Troppi livelli di nidificazione potrebbero rendere il programma incomprensibiit>. Come
regola generale, cercate d roitttre l'utilizzo dipi di tre livelli di rientro.

propria co,ndiz.ione di continuazione. Dare che la v:iriahile di conrrollo sar ora uguale a 2,
il valore finale non sar scato ancora superaco e di conseguenza iJ progr<l!l~ma eseguir
ancora l'istruzione pri ntf. Questo processo continue( f ncb la variabile di controllo
count er sar srara incremenmra al suo valore finale 11 . Ci far fallire la verifica della
condizione di continuazione per il ci~lo e ne provocher la term inazione. l1 programma
conrinuer eseguendo la prima istruzione dopo la scrurruri for (in quesro caso, l'isrruzione
r eturn .alla frne dello stesso).

La Figura 4.3 ill usrr-.a pi dett;;igliammente la stru.rrura fo r della Figura 4.2. Nocare
che la struttura for ''fa cucco": specifica ogni elemenro eessario a una iterazione conuollara da un contatore con una variabile di conrrollo. QuaJorancl corpo del for siano presenti pi isrru?;ioni, saranno necessarie delle parenresi graffe per defmire il corpo del ciclo.

Bitona abitudine 4.5

for

e.ii iterazione fOr gScisce aucomacicamente mrri i dctcagU di una l.rerazioue


controllat <li'I un contatore. Riscti.viarno il programma della Figura 4.l, eer .illusrrare la
potenza dell.._ isITU2ione for. n ristrato sar mosrraro nella Figura 4.2.
La Strl:Jtt~tta

main()
{

int counter;
I* inizializ,azione, condizione di iterazone e incremento */
/ * sono tutti inclusi nella intestazibne della struttura for */
for ( count er = 1 ; countr <= 10 i counter++)

printi ( "%d\n", co unte r)';


return 0 ;
}

Figura 4.2

Iterazione controllata da un contatore con la strutturafor.

li progrl).Illila operer come segue. Nel momento in cui la srrurrura for incomincer
a e~sere esc~m, la variabile di ~0 n.rroll.o counter sar ini::dalizzata a 1. In sc.guiro sar
venf.caca la condizi.one di cominuaz.ione del ciclo: counter <= 10. Da1:0 che iJ valore
iniziale di counter sar 1, la condizione sar soddisfatta e quindi l'is;U2one pr intf
visualiu.cr il valore cli count er, vale a dire 1. La variabile di conrrollo sar quindi incremcmaca dalla espressione counter++ e il ciclo ripartir nuovamente, con la verifca dclla

for ( counter

La struttura di iterazione for

/* Iterazione control lata da un contatore con la struttura tor /


#include <stdio.h>

Valore finale
della variabile
di controllo

Nome della
variabile di
controllo

Cqrt1bin411efo le ~pazillhit'e 71tic11,/i inserite pi:ima e dopo le stru.ttiJri! di. co11.tro!lo con
ii rientro d.ei loro corpi in ima porizione pi ifrternn rispttto aile relative testate, ddiete al vostro programma llrut apparenza bidimensionale che ne mig;lio1er enormemente la kggibiiitl.

4.4

89

Il. CONTROLLO DEL l'ROGRAJvlMA

parola chiave

Figura 4.3

1;

counter

Valore iniziale
dell .variabile
di controllo

<=

counter++)

10;

Incremento
della variabile
di controllo

I componenti di una tipica intestazione di un for.

Osservare che la Figura 4.2 milizza la condizione di .conrinuazione Jd ciclo counter


<= 10. Nel caso .in cui il programmatore avesse erroneameme seri.tra counter < 10, il
ciclo sarebbe staro esegulro soltanto' 9 volre. Questo sarebbe stato un ripico errore logica
chi.amaro "errore di imprecisione di uno''.

Errore tipico 4.2


Utilizzare. un operatore relazionale errdto o usare un valore finale erraio per il L'01ltatore d~L dc.lo, tdl'interno df!Lla cond1$ione di una struttura whi le o tor, potrl provocare 4.egli errori di i1nprecisione di uno.
Buona abitudine 4. 6

Urarc il valorefinak insieme all'operatore rektzionak <=, all'interno della condizione di un11
str11tt1m1 while o tor, aiuter a evilflre gli errori di imprecisione di uno. In un ciel.o utilizzato-per vis11hli.2mre i valori da 1 n 1O, per esempio, la condizione di crmtimrazme del
ciclo dovr e!sere counter <= 10 piuttosto che ont:er < 11 o counter < 10.
Il formato generale della smmru:a for
for (espressione]; esprenione2; espresri.one3)
ismlZione

90

CAPITO!,() 4

dove espressiont!l inizialiuecli la variabile di concrollo del ciclo, espressione2 sar la condizione di
concinuazione ed epressiond incrementer la variabile di controllo. Nella maggior parte dci ca~i
lasmmura for potr essere rapprescnram da un while equivalente, come segue:

Errore tipico 4.3


Usnrc le virgole invece dei punti e virgq/11 nella inteitazione di un tor.

espressione] ;

Errore tipico ef.4

while (espressione2)

istruzione
esprmmd;

L'inserimento di un punto e virgola immediatamente alla destm della intestazione di un


tor nnderJ il corpo di quella stmtturn tor una istruzion~ vuota. Questo ' normalmente
un errore di lot)ca.

C~ una eccezione a questa regola che sar discussa nella Sezione 4.9.
Spesso, espressione] cd esprersioru3 saranno delle liste .di esp ressoai separare da
virgole. Utilizzace in questo modo, le virgole saranno in realr d egli operatori virgola
che garant iranno la valutazione da sinistra a d estra dell' elenco di espressioni. Il valore
e il cipo dJ una lis.ta cli espressioni separare da virgole saranno quelli dell' ultima espressi-One ~deUa lii;.ra. l:operarnre virgola utilizzarn m<;>ltQ ~pesso nelle s[rutcurc far . Il suo
ucilii.zo prladpale quello di consenrire al programmatore di uttlizzare le inizializzazioni
e/o le espressioni di incremento multiple. Per eserpio , in una singo la ~trurtura for
potranno esserci due variabijj di conuollo che dovi:ann essere inizializzare e incremencare.

Buona abitudine 4.7


Nelle sezioni di inizializzazione e di incremento di untr struttura tor, inserite solo delle
espmsi<mi che coinvolgano k varia.bili di control/,o. La gestione de/I.e altre variabili dovrebbe
comparire o primo del ciclo (se dovranno essere eseguite una sola volta, come le istruzioni di i11izializ.zazione}, oppure all'interno del corpo del ciclo {se dovranno essere eseguite una volta per ogni iterazione, come le istruzioni di incremento o di decremento).
Le rre espressioni di una scrunura for sono opzionali. Qualora erpressione2 sia omessa, il C presumer che la condizione sia,sempre vera, cre:ndo q uindi un ciclo infinito. Si
porrebbe omcmere espressione], qualora la variabile di conrrollo fosse stata inizializzata
alcrove nd programma. Cespressione3 porr e.sere omessa, ~ualora l'incremento fosse calcol.aro dalle istruzioni interne al corpo della srrurruca for, o qualora no11 sia richicsco alcun
incremen:ro. L'espressione di incremento all'imerno della struttura for agir come se fosse
una isrruzione Ca s srame, posta aUa fine del corpo d<ll for. Di conseguenza, nella sezione
di incremeoro della struttura for, le espressioni
~ou nt~ r count er
co.unter += 1
++counter
counter+ +

91

h. CON'l'ROI 1.0 OL\l. PROGMMMi\

saranno tutte equivaleo. Molti programmatori C preferiscono la forma counter++, perch l'incremcmo avverr dopo che sar sraro eseguito il ciclo all'interno del corpo. Per
q~esro metivo la forma del poscincremenro sembra pili naturale. Daro che il preincremenro
o iJ poscincrcmenro della variabile in quesw caso non ai;>pare in una espressione, entrambe
le forme di incremento avranno lo sresso effetto. Entrambi i punci e vrgola nella scrurrura
dd for sono obbligatori.

4.5

La struttura for: note e osservazioni

1. L'inizializzazione, la cond.iz.ione di concinuazione del ciclo e l'incremento po rranno


co11[enere delle espressioni arkmetiche. Per C$empio, supponcie che X = 2 e y =
10, l'istruzione
for (j = M; j <= 4 * X

* Yi

+= y I X)

$acil equivalente alla isrruzione

tor ( j 2; j

<= 80; j + 5)

2. ".I.:increroeuro" potr essere negacivo (in cal caso sar in realt un decremento e il ciclo
effettivamente coruer a ricroso).
3. Qual.ora la condizione cli concinuaz.ione ~el ciclo sia ~Isa sin dall' ~o, la porno.~e aJJ'~
1
rerno del corpo del ciclo non sar esegum1. 1.esecu:1.1one
proceder mvece con l 1scru210ne successiva alla suucrura far .
4. LavaciabHe di conr:rollo spesso visualizz.aca o ucilirz.ata nei calcoli all'inrerno del corpo
di un ciclo, ma non necessario cbe lo sia. :t. pico usare la variabile di conr:rolJo per
couaollare l'iterazione, senza menzionarla mai nel corpo dclcido.
5. Il di;igrammaddla scrurrura far rnolro simile a quello dellasrnmura while. Per esempjo,
il diagramma di flusso della isrruzione for
fo r (counter = 1; counter
printf( "%d ", counter);

<

10; counter++)

moscrato nella Figura 4.4 . Questo d iagramma di flusso rende evidence cbe l'i1lizializ.7.azione sar effocruara solo u na volta, mencre l' incremento sr eseguico solo d opo che
s;tr stara compleraca l'istruzione all' interno del corpo. Osservare che (a pan:e i cerchiecti
ele frecce) il diagramma di flusso conricf}c solra:m;o dei rerrangoli e un r~mbo. l~ma
ginace, anco(a llna vol ta, che Il programmatore po$a accedere a un conten 1 r~r~ capiente
di srrurmre for vuote. La quantit d i queste cale che, a:ccaca.standole e n1difcanclole
con le alcre suutture cli controllo, egli porr formare unalmp1emenrazione stru rwxara
per i l flusso di controllo di un algoritmo. [ reaangoli.e i rombi saranno quindi completati con le azioni e le decisioni appropriare per l'algociuno.

Buona abitudine 4.8


Nonostante iL valore della variabile di co11trollo poJra essere modificato tmche all'interno del corpo di ttn ciclo far, ci potr generar.e degli errori Logici difficili da
individuare. Quindi sar meglio non cambiare tale valore.

92

CAPITOLO 4

93

It. cm-rmo~.o l)f.L l1ROCRAMMA

Buonn abitudine 4. 9
Le istruzioni d1e precedono un tor e quelle aU'intcnUJ del tuo corpo potmnno spesso essere
compattate nrfla intestazione del f or, ma evitate di farlo poich ci render meno leggibile il programma.

Stabilisce il valore
iniziale della variabile
di controllo
Verifica se stato
raggiunto il valore
>--

finale della variabile


dJ conrrollo

Figura 4.4

printf(.%d,
-.i count er);

counter++

Corpo del dclo.


Pu essere
composto da
molte ltruzioni

Increment a la
variabile di

/* Somma con for */


#include <stdio.h>

ma in ()
{

int sum

controllo

number;

far (number = 2; number


~ um += num.ber;

Il diagramma di flusso di una tipca strutt1,1 ra for.

<= 100 ;

number

+= 2)

printt( ~s um is M\n", sum);

4.6 Esempi di utilizzo della struttura for


l seguenti esempi mosrrano dci metodi per far variare la variabile di conrrollo in una
srrurrura for.

a)

= 0,

r et urn 0;
}

Far variare la variabile di conrrollo da 1 a 100 in incrememi d i 1.

sum is 2 550

for (i= 1; i<= 100; i++)


b) Far varia.re la variabile di conrrollo da 100 a 1 in incremenci di -1 (decremenri di 1 ).

for
c)

(i= 100; i>:::

1; i -)

la variabile di connollo da 7 a 77 a passi di 7 .

_Far variare

tor (i = 7; i

<= 77; i

+= 7)

d) Far variare la variabile di conrrollo da 20 a 2 a pa5si di - 2 .

e)

= 20;

i >= 2; i = 2)

Far variare la variabile di controlJo sullasegueatesequenza di valori: 2 , 5, 8, 11 , 14, 17, 20.

to r ( j = 2; j <= 20 ; )

-t=

3)

f} Far va.ri;ue la variabile di c.ontrolJ0 slla seguente sequcnrza di valori: 99, 88, 77, 66, 55,
44 , 33, 2 2, 11 , 0 .
f or ( J = 99 ; j >: 0 ; j = 11 )

l prossimi due esempi forniranno alcune semplici appliarioni della stmrrura for. Il programma della figura 4.5 ucilizza la srrucrura for per sommare tutti gli interi pari da 2 a 100.

05;5ervace che il corpo della srrucrura for nella -Figura 4.5 in realt porrebbe essere
unico alla sezione pi a destra della incestai.ione del for , utilizzando l'operatore virgola ncl
segoenre modo:
for (number

= 2;

ili.ni7.ializzazione sum

number <= 100; sum += number, number

Somma con fo r.

Buona abitudine 4. 1O
Ljmiutte a una sola riga, se possibile, la dimemione delle intestazioni di uno struttum
di controllo.

Il prossimo esempio calcoler l'inreresse composto, urilizzando la muuu.ra f or. Considerare la seguenrc enunciaiione del problema:

for (i

Figura 4.5

+= 2)

= 0 porrebbe anch'essa essere unica alla sezione di inizializzazione dd for.

Una pmonn investe $1000, 00 i11 un libretto di rispannio, che re7lde il 5 ?erc~nto di
intresse. Calcolate e viswilizznte l'ammontare dcl dntrfo rziil aonto rdbt fine dt. ogm anno,
per JOanni. supponendo che tutto !'interesse sia sw:to ltzJ.citt.to in deposito sul conto. UtiiizMte fa seguente formula per detenninare le suddette cifte:
a= p(l

+ r)"

dove
p

l'ammontare dell'investimento zi:i;i.ale (ovverosia il capitale)

,.

il tasso di interesse a;muale

il numero degli 11nni


/izmmonttire nel deposito alla fine dell'anno n-esimo.

Il

Quesro problema richjedey un ciclo che eseguir i calmi.i indicaci per ognuno dei 1O
anni in cui il denaro rimarr nel deposico. La soluzione mosrrata nella Figura 4.6.
L'lSrrunura fo r eseguir il corpo del ciclo 10 volre, variando una variabile di conrrollo
da 1 a 10 in incrementi di I. li C non include un operm~re per l'operazione di elevamento

9.4

CAPrt"OLQ 4

CQNIROLl.O DE.I.. PROC)RAMMt\

a . I:>Qtem.~, ruravi.a porremo utilizzare a ques.to stopo la Fu.n.zine pow. della libreria srandard. La fu.ntione poW(Ji(, y) ~kola iJ valoi:e dix devaro al.la.y - e.sima pbrenza. Il double
e un tip:o di dat!> in v:go.l rnobile rno.lto Simile .aJ fioat , ma una variab.iJe di tipo doubie
pu immag~ztnare numeri molro pll gr-a:ndi, cwn una precisione pi alca di Ili! float.
Os:Servare che, qtial.ra venga miliuaca una funzione man;matka come pow! dovr essere
focluso il file di intestazione math. h. In Feal:t, ques-t~ programma funzioDerebbe, ina
male, anche senza l' inclusim cli math . h. L.a tu.ni,ioiie pow richiede due argoiiirnd double.
Osserva:re ch year perQ illl iorei:o, Ii fil~ math . h iodu.de appunto dcl.le in.ff>nn.a:zioril cht5
i.o.dic;aao al ompilatore di Gotivertire il v.alore di yar in una rapprSorazione double
-i:.mp.or.;ina, prima di rid1iama.re Ja funzione. "l'hli informazioni sono contenute in WHl
enrit. chlrilara pro.tori.po di jnzione d.i pow. I ,prnrotipi di funzione. sono una n.uqv:a impor~
tarfre e.racterisrici deH'ANSf C e saranno spiegarj nel Capjolo ? Nello stessu c.:iP.it.9lq,
forniremo un compendio di pow e delle al_cr~ funzioni marematiche (!.ella libreria.
./'" Galcolare l ' .i:nte.resse c omposto ,. ,

#include ~s taio . hj
#inlude <math.n>

95

Bu.otta abitudine 4.11


Non .utiliZZ1Jte vartbifi 4it:ipo float o doubl~per (J}eg1/ite cf!.kofi}irian?ifrri. l.'i?'ri.prPsione de;im1meri in pfrgo/!1 mobi/fpotrprovocm'c degli 'mori chp;-6tfumumo vahri.mo'netali
n(m t;'tfrtetti. Negli r:'I1ttki .e.rplor:ri'no {'J.,tifizzq d.e intllri j><rr esegi.tire i CtJlto!if.nanzit1ri.
Ecco una semplice spieg;iz.i9nc;; di quello che potrebbe andar ma.le. qu:aJpra si utilizz;i:s~e il ripp float 9 double per ..rappresenr:a.re d~li foiporti .i.n dollari.

Due qua1frirariv~ di dolfari, espressi in float e im.rn:ag.aminari nella: 4llil'tchioa_. pocrcl;>-bern essere 14,23.4 (che sarebbe visualizzato come !(23 i;:oo ~ . 2f) e l8,<?1B h:q cen
% 2f sarebbe sramparo c::om.e 18,67). Nel momcmto irr cui le suc(d~tte ccifte sa.r:a.n.no s0ni:rflare; produ.rran.no la ~omm 3.2,97 che, ton % 2f sareb.he visua.lizz.'l~<t com 32,Q 1. Di onseg11enza, ~a vo~m vi1>.ualiz.~a.Zione pott~bbe apparire c.Qme:
14,23

+ 1'8,67
32' 9:1

ma.in ( )

~ per evide.nre che la 1iOmrI1'1. d~ singoli nuri:fec-i, cos) or:ne vertgon visualizzaci, debba
ss,efo 32,90! Siet .stati a..v.v.,sa!

int

y~ar;

d'otfb-le amount 1 prinG'ipal


printf ,("~As~21 s'\ n ~ ,

for

1000. 0 1 rate "' . 05;

"Year", "Amount on deposi,i "). ;

(y.~ar : 1; ye.ar .:;= 10; yea.r++) {


amount = prlndp.al :,;,: pow(1.0 ,+,rate, year);
printf("!\i4d7621.2f\n", yearJ amount);

ret.u rn 0'j

>'

Y-ear
1

:Am"U.unt

10!E0. 0'0
11!0~. 5'0

11~.6.2

1 ~15:. 5:il

1'~16' .2'8

1340. 10
14011 . 10.
1#;77 .46

8
9

1551.83

10

M~8'.S9

Figura416

me

a,ppar\r, in 21 pos'izio.fu di visualizzazi.one.11 2 spcifica la previsione .(v.ale a dire, il numer9


d:iposizioni deciinall). Qualora anumero dei caraeteri vsualizza:ci sia inferio re a.14. qimeosio~
oe del <..'ampo., iJ valore sar automaticamenre gjusti.fi.aato a d.fst1-a all'i.n te(Ilo dd 9UTlP.0 .10
sar- p<1rtic0la.rmenre utile per allineai:~ d_~ valori 'in virgola.mobil~ con I(}. ste~a precisione.
Jnserire un - - ($_egpo men9) tra .i.I% e.la dime~ione del qrmpc.'i; per gt,'W;i:fic4Y.a sinistra. ii
valore.iriseci~Q in quel c;amp.o. Osse.r:v.-are..1z.he il se.gp:o nieno porr anche essere urili2.11aro per
giusrifGa.te...;i sinistra gli interi (&me in 515 _6d), o [e srrioghe di cai:a.ti:e1:i ~come in% - as). Nel
Ca:pimlo 9 cr;mei:etno .in dettagli.o le pocenri apa:cir di formattazione U printf e scanf.
0

Gfl depo:sdi~

ru

4spe~il-ca
cmwcrsifm.e %21 2f .~c~r.a urifo.ui..a nd pr:ogram:m~ p.e.r v.is.ualiz?.,ir.e il
val9ce della v~riabile uount f1 21 nel.la.speci6_a.d.I ciinv.e;c;sine-de.noca la difncmme..del campo
io uj i I valore sar wsu.a;l.i.zza.ro. Una d.i.mcttsione di campo 21 specifica
il valore visualizz-at0

Caleelar.e l'interesse composto con far,

Ossn(ate che ob:iam0 dichiararo Ie variab_Jlj amount, princ-:j.pal e rate con .il dpo
.d ouble. A'bbimo "farro ci per scmplici.r, p~rch avremo a cl1 a:re wn parr:i raz.ioriarie
di d.Bllari.

4.7

La struttura di sele~ione multi.pia switch

Nel Cap~co{o,3 , ahbiam0 discussa' della struttura ~ i selezion.e singol.a i .f e di que.Ua di


seleziqne dopfiia i f / .else. A vol.ce per l1.ll ~lg0ririilo perrebbe rid'uede.rl': -che una data
variabile od: ~p ressione venga cuo.fromatil lisdmamerue .con ogmmo dei valori che essa
pu assume.te. e che,, a s'ec:;nda dcl cisufrato del c.onfrruo, .vengano inrraprese delle azioni
d.imnte. u e fo.r.nisce la struttura di selezione mulcipla switoh (interrmrore) per g<!!Scire
una ral ser.ie di d ~isioni.

La strua:u.ra switch cnsistedi una sede di eti-c;bctte'casec.(c:;aso) di un caso 0pzi.onale


default. 11 pr:gramrrm. nella Figu.r.a 4.7 lilizza sw tch, per comare il numer::o di og1runa
delle teccer omilltrre dagli studenti come votazione al rermiDe di un esame.
Nel progra,mm, 11utme i.rtunerter le lettere di yotazi:n d'.1e ~ state ssegnare
un'' dasse. Alfinfruo della irirest!l~ine del whll~
whHe ( (

~Tade

= get<::har ()

) J; EOF)

96

CAllJT()LO

/* Contare le lettere dei voti * /


#include <stdio.h>

97

CONTROLLO DBL PROGRAMMA

printf('C : %d\n', cCount);


printt( "D: %d\n, dCoun t);
prin tf ('F: %d\n, fCount);

main ()
{

retur-n 0;

int grade;
int acount
dCount

0, cCount ;: 0,
0;

0, bCount
0 , fCount

Enter the letter grades.


Enter the E'OF haracter to end nput.

printf("Enter the letter grades.\n');


printf("Enter the EOF character to end input. \ n") ;

A
B

while ( ( grade = getchar() )

switch (grade)

!:

/* switch nidificato nel while * I

aI

case ' A' : ca se


++aCount;
break;

case ' B' : case


++bCount;
break;

I b I:

EOF) {

/ * i l voto er a una A maiuscola


/* o una a minuscola "'/

.,

e
E

1ncorrect lettr grade ente ved. ETitr a new gr ada.


I " i l voto era una B maiusco l a */
/ * o una b minuscola /

case ' C': case e:


++cCou nt;
break;

I " i l voto er a una C maiuscola


/ * o una e minuscola *I

case ' D': case 'd':


++dCount;
break;

I* i l voto era una

D maiuscola
o una d minuscola */

..

.,

/* i l voto era una F mai uscola *I


/* o ~na f minuscola */

case

I*

\ n': case ' '

otals far each l&tter grade are:


A: S
B: 2
e: -s
D: 2
F: 1

Figura 4.7

case 'F ' : case 'f' :


++fCount;
break ;
1

D
F

gnor~.

Gjuesti caratte ri nell' in,put * I

br~ak;

default:
/* intercetta tutti gli altri caratteri */
pri ntf ( 1 rncorrect letter grade ent ered. ");
printf( " Enter a new grade. \n")~
break;
}

Un esempio di utilizzo di switch.

l '~-segnamenco incluso nelJe parenresi ( grade = getchar( ) ) sar eseguito per primo.
La funzione getchar (dalla librerja srao.dard di inpurfourpur) legger tm cararcere daUa
tastiera e lo immagazziner nella variabile incera grade. Normaltner:ite i cararceri sono
immagazzinati in variabili di tipo char. Una importante carnueristica del C runavia che
i earattcri possono essere immagaz1iinaci in qualsiasi cipo di dato intero, poich all'inrerno
del computer sono rappresenrati come interi di 1 byr~. Di cnseguenza, porremo rrarrare
un carattere sia come inrero sia come caratrerc vero e propria, secondo il suo uti lizzo. Per
~empio, l'isrruiione

pr i ntf( ''The character

(\e)

has the value %<1.\n", ' a 1 , ' a ' );

uri.Lizzer le specifche di conversione %e e %d per visualiizare rispenivamence il cararrere a


e il suo valore incero. Il cisulraco sar:

The character (a) has the value 97.


printt ( \nTotals f or each letter grade a_re: \n") i
printf( "A: %d\n", acount);
printf("B: %d\n ", bCount);

J..:.incero 97 la capprcsenrazione numerica del carattere ud compurer. Molri compucer


uciliu.ano oggi l' irmemc di caratteri ASCIJ {American Standard Cwlefor lnformation lnterchtmge,
Codice Americano Sttlndard per lo Scambio delle Informazioni), nel quale il 97 rap presenca la

98

C\l'ITOL.0

lener<i minuscola ' a '. Un elenco complem dei ca.racreri ASCII e dei loro valori decimali
sar presentato ndl'Appc,ndicc O. I caratteri possono esscreJerti coa scanf , utilizzando la
specifica di conversione 91ic.

Le istruzioni di assegnamento, considrare nel loro complesso, hanno in realc un


valore. Qucsm precisamente il valo(e che sar assegnam alla varfabile alla sinistra del
segno=. Il valore dell'assegnamenro grade ~ getchar () sar il cararcere resriruico dalla
getchar e assegnaco alla variabile grade.

li facto che le isrru1.ioni d i assegnamente abbiano dei valori porr essere urile per
inizializzare diverse variabili con lo Stesso valore. Pcr esempio,
a

= b = e = 0;

valurer in primo luogo l'assegnamento e = 0 '(pE>ih l'operaco,re = associa da destra a


sinisrra). Alla variabile b sar g uindi assegnam il valore delPassegnarnento e = 0 (ovverosia
O). In seguito, alla variabile a sar assegnam jJ valore dell'assegnamcnco b = (e = 0)
(anch'esso O). Nel programma, il valore delfassegnrunen.ro grade = getchar() sar confrontato con.i l valore di EOF (un simb lo Hct acr")nimo sca p~r "end ot fJe" , "fine dcl file").
Noi u tilizzeremo EOF (che r10rmalrnence vale - 1) coi:ne valore senrinella. L:utente premer
una combinazione di casti dipendente dal sistema, per in dic.'lre la "fine del fle", ovverosia
"Non bo pi1 dari da immettere". tEOF una costante simbolica ruera definita nel file di
intesrazione <stdio . h> (vedremo come si definiscono le costanti simboliche nd Capitolo 6).
Qualora il valore assegnato a grade sia uguale a EOF, il pr?gramma terminer la propria esecuzione.1nquesro programma, abbiamo scelro di rappreseru:are icaracreri con degli int, poich EOF
ha un valore incero cbe, lo ripcriamo ancora una volra, normalmente -1.

1J. CONTROLLO DEJ. l'R()GRAMMA

99

ognuna delle etichette case. Supponece che l'ureme abbia immesso come vocazione la
lecrera C. Questa sar auromaricamence confroncara con ogni case dello switch. Nel caso
sia scara verificata una corrispondenza (case 'C ' : ), saranno eseguite le istruzioni di quel
case. Nel caso della lettera C, cCount sar .incrementara di 1 e la scrurrura swi tch sar
abbandonata iromediatamenre con J'isrnuione break.
:Cismu.ione break induce il conrrollo deJ programma a con tinuare con la prima istruzione dopo la struttura switch. I.:ismu.ione break urilizzaca perch alaimenci sarebbero
eseguici insieme rurri i case di una istruzione switch. NeJ caso in cui break non fosse
tilizzara. in nessun posto della sc:ruttura switch, allora ogniqualvolca fosse riscontrata una
corrispondenza all'ime.rno della struttura, sarebbero eseguite anche Je istruzioni di rurci i
case rimanenti. Qualora nos1 sia srara riscomrara nessuna occotrehza, sar eseguito iJ caso
default s.ar. visualizzaco un messaggio di erro re.
Ogni case pu contenere una o pit1 azioni. La strutmrn. switch differe.me da rurce l
altre smitnate, poich in u11 case dJ switch no n SOFIO m:.eessarie le parentesi graffe incorno
alle az.ioni. m ultiple. li diagramma di filusso generi.ca per una stru.uura d i selezi'o ne multipla
switch, che utilizzi u n break per ogni case, moscram nella Figura 4.8.

azione del
caso a

break

azione del
caso b

br eak

azione del
caso z

'bre.ak

Obiettivo portabilit 4.1

Le combinazioni di tasti per immettere EOF (fine del file) dipendono dal sistema.

Obiettivo porr:abilitlt 4.2


Controllare la costante simbolic11 EOF, invece che -1, rtn.der i programmi pi portabili.
I.o standmd ANSI srabilisce che EOF deb.ba essere un valore intero negativo, ma non
necessariamente -1. Di conseguenza EOF pot:rebbe avere valori diversi m sistemi differenti.
Sui sistemi UNIX e molti altri l'inclicacore cli EOF immesso premendo la seguenza di casti

<return> <ctri-d>
Q uesra notazione indica di premere il Easro rerum (o em er, o invio) e gujndi d i premere
simultaneamcnce entrambi i tasti ctrl e d. Su alrri sistem i, come sul VAX VMS della
Digical Equipmenc Corporacion o in MS~DOS deUaMicrosofi: Corporarion, l' indicatore di
EOF pu essere immesso p remendo

<ctrl-z>
I:uccrue immetcer le vor.azioni alla tastiera. Nl momento in cui sar scato premuro il
tasto recum (o encer, o invio), i caratteri saranno lerci uno per volta dalla funzione getchar.
Qualora. il carattere immesso non sia uguale a EOF, si entrer nella srrurrura swi tch. La
parola c;hiave swi tch seguita dal nome della variabile grade ua parentesi tonde. Q uesca
denominata espressione di controllo. Il valore di questa e,sprssione sar confromaco con

azione di
default

Figura 4.8

La struttura di selezione multipla switch.

. 100

CAPITOL04

lL CON'm.QLI.O l)l! L PROGRAMMA

Il diagramma cli flusso rende eviderue che ogni istruzione break, alla fine cli un case,

B11ond abitu.dlne 4.. I5

fa in modo che:il comrollo esca. immediatam ente dalla struttura switch. Ancora w1a volra,

osservate che, a rarce i cerchietci e le frecce, il d iagramma di flusso contiene selo rcmu1goli
e rombi. Immaginare, :mco.i;a, che il programmato re abbia accesso a un conrenicore capienre pieno di strurrure swicth vuote. [a quantit di queste raie che il p rogrammaror e,
acc:uasrando le e nidificandol e con le. altre srrurrme di conrrollo, possa. formare una
implemenra4ion<;' scrurrurara per jj flass di controllo di un algori tmo. J rettangoli e i rombi
saranno quini completati con le azioni e le decisioni appropriate all'algorirmo.

Errore tipico 4.5

Dlmentftm-c una trugione break qualom ne iip. necmaria una in una stn~ttura swi tcfi.
Bttona aliitudine 4. I 2
F,mzite .un caso defa.u l t nelle istruzioni swi t;_ch. Nonrt11lm'ente i casi no.n controllati
in modo e~plicito a/L'interno di u1w swi tch saranno ignorati. I/ ctt.so default aimm}
a evitarlo, spingmdo ilprogrammatore a concentrarsi sulla necessit di elobomre le
condizio.n i eccezionali. Ci sonlJ s.ituazioni in cui non sar necessario nemma elaborazione per il ,aso default.
Buona abitudine 4.13

Sistemare il caso default per ultimo ~considerata una bur,mn 11bittJdi'f'te di program.trmzione, sebbene Le clf.t,-usofe case e quella del coso defaultiossa110 p1esentarsi in qualsiasi
ordine tlll'intemo di .una struttttro swi tch.
Buona abitudine 4.14
[r1 una struttura swi tch, tp.mlra la clausolli default sia sistenuita per ultima, l'ism1zfone break ali'intemo di quejl'ultimo caso TlDn sar necemzria. ALettni programmatori per includ.ono 1,guafmente un break per motivi di chiarezza e simmetria con gli
altri case.

l?icordn.te difamelc tn1zioniper l'el11,bomzionc dei camtteri net()/ini: presemi rte!L'inpw,


quando ciahorate i cnratteri imo per volta.
Ossei:vare che le d iverse etichette di caso sistemare insieme (come c ase ' O' : c ase ' d ' :
nella Figura 4.7) significano semplicemenre che per cnrrambi i casi sar esegu i ~9 lo sresso
insieme cli azioni.

Quando urilizzare 1:1 scrurrura swi tch. ri.cordacc che pu e.~sere urilizzara solranto per
conrrollare u na espressio1~e intera costrmu, ovverosia, ogni combina~ione di costanti di caracrere e Lncere che possano essere valutare come v:alori inreri Una costarrre d i tipo carattere
rapprcsenrara con il carattere specifico po$ro tra apici singoli, come in ' A' . Per essere riconosciuti come coscami di tipo carar:rere, quesci.devono essere racchiusi alfinrerno degli apici
singoli. Le cosranri ince.r e sono semplicemem c dei valori inceri. Nel noscro esempio, abbiamo
urili7-zam delle cosrami d i tipo cru;arrere. R icordate e.be i ca.ratceri sono in .retJ lt dei valori
inceri mcroGrin.aci in tJJl byce.

I lingu~ ponabili, come iJ C, devono avere delle climensioni Elessi bili per i tipi cli daro.
Applicazioni differenti possono ave.re bisogno d i i meri cli dimensioni differenti. 1L C fornjsce
d iversi cipi di daro per rappresentare gli inceri. .tintcrvaHo dei valori interi per ognuno dci
tipi fornici dipende @I particolare hardware del computer. In aggiunta ai tipi int e c har,
il fornisce i ripi s hort (una abbreviazione per short int) e long (per l ong int) . Lo
srandard ANSI specifica che il campo di variabilit minimo dei valori i.nreii short dc\(C
essere 32767. Per la gran magg!oranza dei calco!i inreri. sa.r;lnno sufficienti degli interi
long. Lo standard specifica che il campo di variabilit minimo dei valori long deve essere
214748;3647. Sulla maggior parre dei compurer, gli int sono equivalenti agli short oppure ai long. Lo standrd srabifa~ce che iJ campo di vari.abilit dei valori int deve essere
grande almeno quanco q ueUo degli iareri short, ma che non pu e-sserc pi grande i
quello degli inceri long. U cipo d i dato cha r porr essere uciliz.zaco per rappresear.are degli
inceri nel t'.affipo cli va riabilir 127, oppure ognuno dci ca:rarrcri facenri parce dell'insieme
dei caratteri d.el computer.

Obiettivo portahilit 4.3

Nella srrunura switch della Figura 4.7, le righe


case ' \ n ' : case ' ' ;
break;
indurrru.mo il p rogramma a ignorare i caratteri cli newline e di spazio. Leggere i caratteri
uno per volta pu causare -alcuni problemi. Per fare in modo che il programma legga i
cara.a:eri, questi dovranno essere inviaci al computer premendo il tasto invio sulla tastiera.
C i provocher l'inserimento nell'inpu t del carattere newline, subito dop9 quello che si
desideri elaborar~. Tale cara,ttere d i oewline d ovr spesso essere tracrato in modo speciale,
per far funzionare correrrament e il programma. Con l'inclusione dei casi precedenti, nella
nostra scrurrura swi tch, preverremo appunto la srampa del messaggio cli errore od caso
default, ogru volta che nell'input sar .oconrraro tu1 newline o uno spazio .

Errore tipico 4. 6

Non ekt.borare i caratteri di newline nell'inpttf, q11.ando si l.eg,gono dei caratteri rmo per
vtJLt11;. -p_otr prrn10CtLre degli errori Logi.ci.

Qu/ora prroediate di elaborare degli intf!T che possano ricadere n.LL'e.stmio del campo
di. varittbilit 32767, ma desideriate essere in grado dijrfimzio1zare il vostra programm su diversi sisrcmi tli compute1; allora dovreste utilizzare degli interi long. giacch
la dimensione degli i nt pqrrebbe variare dlJ sistema a sistema.
Obimivo efficienza 4. 1

In situazioni in cui le prestazioni sono importanti, in cui la memoria prezioso o necesS1t1ia una cerra velocit, sipotrebbepreferire l'uti&zo della dimensione pi piccola degli. interi.

4.8

La struttura di iterazion e do/while

La srrurmra di irerazione do / while simile alla smmura while. La condizione di


continuazion e del ciclo, nella saun u ra while, controllata aJl'inizio dello sress.o, pri-

ma che sia eseguiro il corpo delJa iterazio ne. L a strucrura do / while conrrolla la condizione di conti n uazione del cid o dopo ch e stato eseguiro il corpo deUo srsso; d i

CAJ!ITOl.O

conseguenza, le istruzioni alJ'imerno del corpo del ciclo sarfillno eseguire almeno una
voka. Al termine di una istruzione do / wh i le, l'esecuzione continuer con l'istruzione
sa ecessiva alla clausola while . Osservate che nella suurrw:a do / while non sar necessario ucilizzare le parentesi graffe, qualora all'interno del corpo ci sia soltanco una
istruzione. Tuttavia, le parentesi graffe sono indas,e di solito per evirare la confusione
tra le srruuure while e do / while. Per esempio,

lLCONTROl.1.0 DF.t PROGRAMMA

103

accesso a un capienre contenitore di srrurcure do / whi le vuote. li numero di quesrc


tale che il programmatore, accatastandole e nidificandole con le alue scrurrure di conrrollo, possa formare una implemenrazione srrurrurara per il Busso di conrroJlo di un
algorirmo. I renaogoli e i rombi saranno quindi complerari con le azioni e le decisioni
appropriare all'algoritmo.

I * Usare la struttura di iterazione do/while */

while(condizme)

#include <stdio.h>

normalmenre vista come l'imescazione di una struttura while. Una struttura do / wh ile
senza parentesi graffe incorno a un corpo formaro da una singola isrcuz.ione apparirebbe
come

main()
{

int counter = 1;

do
irtru:i:ione
v1hile(condizione);

do {

che porrebbe creare confus ione. I:ulrima riga, while (condi zione ); , potrebbe essere
fraintesa dal lettore come una strutrura while conrenente tma istruzione vuora. Di conseguenza, per evirare confusioni una struura do/While on una istruzione si ngola sar
spesso scriua nel modo seguen te:

do {

istruzione
}' while (condizione);

, count er);
printf ( "%d
} wh i l e (++co un ter <= 10 ) ;

ret urn 0 ;
}

Figura 4.9

10

Usare la struttura do / while.

Bu.onrt abitudine 4.16


Alcuni programmatori includono sempre /,e parentesi graffe all'intemo di una struttura
do / while, anche quando rum sono necessarie. Ci aiiaa a eliminare l'ambiguit tra
la struttura do / while contenente una isrruzione singola e la struttura whil e.

azione

Errore ripo 4. 7
i

I cicli infiniti. sono provocati quando la condizwne di continuazione del ciclo in ttna
smmura while, for o do/while non diventa mai falsa. Per prevenirli, assicuratevi
d1e non ci sia zm punto e virgola immediatamente dopo l'intestazione di una struttura
while o tor. In un dcLo controllato da -un contatqre; a.ssicurarevi che-la variabile di
controllo sia ir1crermmtat11 (o detremrmtat:a) n:ei cqrpo dei d.cio. In un cialo contro/!11to
da 1.1:n valore stntineL/a, a.ssicurrttroi che aLla.fjn:e qittfto siapreso in inpitt.
Il p.1:0gramma nella Figura 4.9 utiliza.a una st.rutmra do /while per visualizzai:e i owneri da l a 10. Norace che la variabile cli comrnUo counter stara incremenrara (con un
prdocre.mento) nella sei.ione per il con(.rollo della continuazione dcl ciclo. Osservate anche
l'utilizzo delle parentesi graffe per racchiudere il c;erpo della srmrmra do/while formaro

da u.na isrruzione singola.


11 diagramma di flusso della struttura do / while mom~ro nella Figura 4.1 O. Questo
diagramma dj Busso evidenzia che la condizione cli continuazione del ciclo non sar
ve:rifcaca, fintanto che l'azione non sar srata esegufra a lmeno una volca. Ancora una
v0ha., osservare che, a parce i cercbje:tti e le frece, il diagramma di Ausso contiene
solcanro un rettangolo e un rombo. Immaginate, di nuovo, che il programmarore abbia

vero

o
Figura 4. 1O La struttura di iterazione do / while.

4. 9

Le istruzioni break e continue

Le isrruzioni break e continue sono utiliu.ate per alterare il flusso di comrollo. J.:isrruzione break, qualora sia eseguita in una struttura while, fo r, do / while o switc h, provocher ruscir.a immediata da quella struttura. 'Lesecuzio:nedel p rogramma coorinuer con la
prima isrruzione successiva alla srruttura. I.: utilizzo pieo della istruz.ione break per ancicip~re l'uscita da un ciclo, oppure: per ignora.re la parre rimanente d.i una srn.mura switch
(come nella Figura 4.7). La Figura 4.11 dimosrra_ l'utilizzo della isrrazione break in una

l
CA:rrroLo4

104

smmura di icerazione for . ~iscruzione break sar eseguita quando La Strtlrtura if avr
determinaco che x avr assumo il valor 5. Ci tcrminetl l'esecuzione deUa isrruzioue for
e il programma potr conrinuare con la funzione printf susseguente. TI ciclo s_ar est<guiro
completameme soltanro quarrro volre.
Q ualora sia. esegu ita in una strurtu r'.t While, for o do/while, l'istruzione conti nue far in modo ~he quelle rimanenti nel corpo della. sourmra siano ignorue e che
sia eseguita l' iterazione successivtl del ciclo. Nelle suunure while e do / while, la
condizione di cominuazione del ciclo sar valutata immediacamente dopo l'esecuzione
della istruzione continue. Nella struttura for, prima sar cseguira l'espressione di
incremento e in seguiro sar valutata la condizjcme di continuazione del ciclo. In precedenza, abbiamo affermaco che la srrurrura whi_le p otrebbe essere urilizzaca, nella
maggior parte dci casi, per rappresentare la srrur(\lra for . !:unica eccei.ione si verifica
quando l'espressione di incremento all'interno deUa srrurtura Wh ile segue l'istruzione
continue. 'In questo caso, 1.'incremento non sar cscguiro prima della condizione di
c0minuazio11e della iterazione e .il while no.n sar sguirn allo sresso modo del tor.
La Figu ra 4.12 utilizza L'isuuz.ione continue in una strmmra for. per sakare l'isrrui.ione printf nella sumrrn:a e cominciare l'iterazione successiva del ciclo.

11. CONTim u

/* Usare l ' istruzione


#inlude <stdio.h>
ma in ()
{
int

105

o DEL JIROGltAMMA

con~inue

in una struttura for * /

x;

far (x = 1; x <= 10; x++) {

i f (x -

5)

continue;

printf("%d

/ * saLta i l codice restante del ciclo solo


se x == 5 */

x);

printf ( '' \nUsed continue to skip prin'ting the IJ,alue S\n");


return 0;
}

Buona abitudine 4.17


Almni programmatori pensn110 che break e continue violino le nom1e della programmazione strutturata. Dato che l'effetto di queste istruzioni potrlt anche essere ottenuto
da recniche di progrnmmnztom strutturata, come impareremo presto, questi. programmrttori non itti{izzano break e continue.
/* Usare l'istruzione break in una
#111olude <stdio.h>

struttu~a

Figura 4 . 12 Usare l'istruzione continue in una struttura for .

Obit!tr.ivo efficienza 4.2

for */

Le istruzioni break e continue, qwmdo snnn u.tiiizztJ,te in mod1J apprpriato, samrmo


eseguite pi 11eLoceme11te delle corrp<>ndenti tecniche strutturati/ che a.pprenderer11o
presto.

main ()
{

int

1 2 3 4 6 7 B 9 10
Used continue to skip printing the value 5

Ingegneria del software 4. I

x;

tor (x = 1 .I

C' una dicotomi(l tra la ricerca di una progeu4zione di software di qualit e quella
di software pi efficiente. Spesso uno di questi obiettivi raggiunto a discapito
detii1ltro.

<::e 10 j x++) {

--

5)
if (X
Qreak;

!"'

interrompe i l

~ic lo

solo se

--

~1

4.1 O Gli operatori logici

printt ( '%d n I x);

Fino a questo punco abhia.mosrudiato $olranco delle condigi.oni setnplicicome coun te r <= 10,
total > 1000 e: number I= sentnelValue. Abbiamo espresso quesrc cond-iz.ioni con.
l'uso degli operatori relazionali >, <, >=, <= e di quelli di uguaglianza == e I =. Ogni
decisione ha verificato precisamcncc una condiz ione. Se avessimo voJuro conrrollare delle
condii.ioni multiple in una deci$ione, avremmo dovuto e.seguire i suddetti conaolli con
delle isrruzioni discinte o con delle strucrure if o if /else nidificate.

printf( " \nBroke gut of loop at x -- %d\n " , x);


return 0;

, 2 3 4

Broke out O'f

io~

at x

=:

Figura 4. 11 Usare l'istruzione break in una struttura for .

l i C Fornisce degli operatori Logici che possono essere uciliz7.aci per formare condizioni
p.iw complesse. combinando q_ueUe semplici. G li operatori logicd sono: && (AND logico) ,
: i (OR log~co) e I (NOT Log;o derro anche negaz,one logica). Considereremo degli esempi
per ognuno dei suddetti.

1'ci6

CMI.:TQLQ4

.Sup-ronete he, prima di stegli.re Un determinato percorso di esecuzione, vogliamo


in un cerco punto del programma due condizioni siano entrambe v:ere. In
queste <::as0, porremmo utilizzare f'operat9n; J<i>gJ && o~ segue:

~siturarci <::he

if (:gende r = 1 && age >o: 65)


++$e niorF11mals;

==

Quesr-a istr:zion~ i f contiene due r:.:ond.izioni sempU.eL La condiziQne gender


1 porr./i
essere valutara, per esempiq, p\er detem1.i.n~re se una_p.ersoa:a s~ di-sesso fe.IIllilini.le. La con~zione ~ge >= 65 saj valucai:a pr dete~are. se. un erta persona si.a. urL cittadino
a:n.Ziano. Le du..c0ndi.zioni semplici sil..rarrnO'va1uta1:e. pe.r prime perch le priorit di= >=
scirrd pi alte-di queJJa di&&. lti SegUW, J'i srrazine.i f Gnsid r.t .Ja<ionruz.ione comb.inata
9.~ n d~ r

La. tabella deUa Figura 4. 13 descrive l' 0peramre &&. L1 rabe11a mosrra rurte I.e quattro
possibili combin.az.ioni ~valori zero (falso) e diversi da zero (vero) pernspressione l ed e~pres
sione2. Le tal;>elle di qm;sro, gen~r~ ~ono- sp~~so d1famace ta.k#ledi 1!,"erit. 11 e valuta oo l
ttnte le espres~kuii che includa.n9 degli opeta:t9.r.i c~lazi9nall, !-'li ugugli;tn:>..a ~/Q_logii. S:bb~e il C 4n1?osri_iJ -y,aJore ver:o COI!I l , esso acttr~ come ver ogni v;lliare-dkvrs.o d.a 'Zero.
espressione I

espresslone2

espressione I && espressiene2

diver$o da zero

dive(SO da zero

1Q7

e preruicr lo srudenre on una '~!\." qualora una o eumunbe le co.ndi1,ioni semplici siano
ve.re. Osservare d1e il messaggi'0 '"Student grade is A" n.o n sar visualizzar9 ~0Jo quando
enrrambe !e condizioni sem,plici sa.ranrro false (e.ero). La Figura 4. ~4 una tabclla di \'.e dt
per loperatore JQgio OR (l : ) .
espressione I

espres5n2

espressione I 11 espressione2

(j

diverso d zero

diverso da zero

di verso da :ie.rn

diverso da zero

1 lk& ;;i,@e >= 65

Questa condi:ziorte sar ver:a se e solo se entrambe le amdizio.ni semplici saranno ver.e. Infine,
se 1a sudderra condizione wmbillata saF effetcivamenm vera, alfora il comacore s en io r Fe mal es
sar increniemaco di 1 . Qualqra una f> enrramb le ~onclizj_o,n;i semplici siano false, Ll programmaJgno.rer. l'int,remeoto e procedei: c>n l'kruzione suees.~iva alla struttura if.

Figura 4. 14 Tal:>elladiveritprl'operatore: : .(QRlogco) .

I:operamre && ha una _p1iori-r maggi.o.r lj l :. Emr.ambi g!i <:>_petatod assodano c;la
sinistra a. d~src-a. Una espressone cqnteneme gli opetarori && 0 i : ~ar valutar~ . solranto
fincamo che non sar ntn Jasua verit_0 falsic, Di Cnseguenia, la valmcione della c,:ondirione
~ end er

==

&& age

>::

65

fotmr:, qualora gender 11011 sia uguale a 1 (a qucl pun.ro, l'i.nter:i: espre5sio.ne sar
skurainence falsa); mentre com:inuera, q ualora gender sia uguale a 1 (poich..l'mera espressione
porrebbe ancora essere vera se age >= 65}:

$.

Obietti/lo fficianZIJ 4.3

.
/
cl.iversq da zero

diverso da z.ero

Figura 4.13 Tabella d i verit per l'operatore&& (ANO lo~iCo).

Cot.fsideriam ora l'operarorc : : (OR logico). Supponete he, pr-ima di s~eglie(e un


e.rtti perc0~0 d i esecuzion, vogliamo assjeu:ra.rci clie a un c.eno punt del prdgramma
u.n:i. o eotrambc:. le condi?ioni s.iano vere. 1n ques.to caso useremo l'oprar0.re : : , com nel
s.egueme 1:rui:u:nenrci cl.i programma:
H

lL CGNTRQLLE> DEL l.'.ROG.11AMMA

('s.ernest.erAverage >= 90 : : f.i.nal Exam >-= 90)


prin t'f ( "Student grade iS A\ n") ;

Q11e~ta i~ttu"z.~911.e q ;rn.tie.n.,e anch'e,s~a due .odi1,ieni semp lici. La .cBn.d.i-ti.Q:ne


seme$terl\verage >= 9~ sai'~ vaht.ra~a p:er= deternina.re S:e lo stud~re del cm;so meri
uru1 "A"; grazie -a. un n:mdi-me.n to coname nel cotse .d el semesfre.. La Gbil.di.z:io'n:e
f inaJ;E'xam >= 90 S<it+. valutata. pe.r deterrn.inare: se lo srudence del corso m eriri .urna "A", a
C1isa di'wi t't'mdimento straordin.aci~ nell'esa1mdnale.1n seguico, t'isrruzio11ei f con~idere.
r~ la: condizione combin~ra
se me~ter;A.vrag e

>"' 90_ : : fna l Exam

>"' 90

N~L(nspr.ifi0:11i che tilizzana l'Qpera~iire

&&.-fate in nHJ.tlo che ltt.pr.ima condizione si.a


rptella,.che avr pit pibabUit di essere falsa. Nette e5pressioni che.rJ,tiliZZt.tno .l'operatore f f,fate in mo.do che fa prima condizione sia que/u;. che avr_pi.pvobabilit"di ~J~ere
vera. Cibpotr ridurre il ternpo di esernzione dl prqgrammn.

li C fomis<;e I ~la negazione logka) ().r consentire al prograi:tuna[(;>r.e di .iuverrir.~" il


valore di llna <':ndiziotie. A iiffereu-za. degli operarori && e l :" che combinano due condizi0.ni (e sono qtndi degli operatori binaci), quello di negazione logica. hac solo un:a.. singola
c::ondizi0nc come operando (ed quindi un ope:Ea+9I!! un.aria). 1.'.opetatore di _negazione
legica-a.11<k1 inserito prima di LI.Ila condiziom;, nel caso incui sia.mq ner<;ssm:i a s.cgliere un
pernorso di esecuzi9ne qua.ride la cond.iz.i:011e originale (s~n1,a l'ope.fat0.re cli negazione k>gica) 'Sia falsa, come nel s.egueme &:.ammntodi oli'te:

if (I (.grade =-=- sentine1Va1 ue))


pr i ntf(" The n&xt grade is %f\n, grade);

Le parenresi jucorno a1Ja condfai.one grad = sentinlValue sono necessarie perch


l'operatdre di negw-i.n.e logica -ha. una priorifa m&gire- dell'operato.re di uguaglianza, la
Figura 4.15 una tabella d.i verit per f opcrarore di negnziohe logica.
Ne.Ila, maggior j>:art dei cisi, Ll progam.rtl.4rb,te porr. evitare di u.liz:za:re la rigazio1i.e
logica, e,c;primtndo la condi7jo.ne in mod diverso. con uri a:ppropr.iam operatore relazionale.
P.r e.Sen:1pio., l'isrrnz.ine pm:ed.eme porr essere sGrirra anche nel modo seguen te:

Cwrro1.04

108

if (grade I= sent i nelValue)


printf("The next grade is %f\n", grade_);

La tabella nella Figura 4. 16 mostra la priorit e l'associarivit dei vari operarori introdon:i sino a questo punto. GU operarori sono mostraci dall'alto in basso in ordine decrescence di pciocit.
espressione

lL CONTI~Ol.1.0 DEL l'J{OGRAMMA

rura ru controllo. Lespressionc sar crarrara come flsa qualora il suo valore sia O, mcmrc sar
consider.ira vera ael caso cbe il valore sia diverso da zern. ll secondo aspetto che nel linguaggio
gli assegnamenti producono un valore, ovverosia quello che s~ Ss~aro alla variabile a
sinistra ddfoper-.icore di assegnamento. Per esempio, supponere che vogliamo scrivere:

if (payCode == 4)

printf("You get a bonus!");

!espressione
ma

che acciden.calmeme scriviamo

= 4)
printf('You get a bonus!");

it (payCode

diverso da z:ero

Figura 4. 15 Tabella d verit per l'operatore! (negazione lgica).

Operatori

Associativit

Tipo

( )

da sin istra a de~rra

parentesi

da destra a sinjsrra

unan

da sinistra a destra

molciplicativi

da sinistra a destra

additivi

da sinistra a destra

relazionaJj

da sinistra a destra

di uguaglianza

&&

da sinisrra a desa:a

ANO logico

I I

1 1

da sinistra a dcsrra

OR logico

?:

da desua a sinisrra

condizionale

da destra a. sin.i.ma
,
da sinisrra a desrra

di assegnamento

++

109

( tipo )

+
<

<=

I=

+=

>

>=

*-=

/=

%=

virgola

Figura 4. 16 Priorit e associativit degli operatori.

4.1 I Confondere gli operatori di uguaglianza ( = = )


e di assegnamento ( =)
C' un po di errore che i programmatori e, indipendememente da quanto siano esperti,
rendono a commettere cos) frequenremence che l'abbiamo ritenuto me:citevole di una sezione disr:inra. raie errore consiste nello scambiare accidemalmenccgli operatori == (uguaglianza) e = (assegnamento). Ci che rende questi stambi cos dannosi che essi, solimmence, non provocano degli errori di sintassi. Di solito, infarti, le istruzioni cbc conccngono questi errori sono compilare correttarnenre e il programma sar eseguito fino al suo
compleramenco. generando probabilmcme dei risultaci non correai a causa ru degli errori
logici, durame la fase di esecuzione.

Ci sono due aspccri dcl C che causano qucsri problemi.. Uno che, nel linguaggio C, ogni
~pressione che p1oduca. un valore pu essere utilizzata ndla sezione di decisione di ogni srruc-

Li. prima isuuzionc i f assegnerebbe correrramenre un bonus alla persona il cui codice dJ
pag;imento uguale a 4. La secoi1da isrruzione i f i.nvee, quelJa on l'errore, va.lurerl!bbe
l'espressione di assegnamenco alJ1intcmo della sua condiziorie. Questa espressione un asscgnamenro se,rn:plice il cui valore la cosmnrc 4. Dato che ogni vak>re ,Lverso da zero interpretato
cqme "ve,ro", la condiiionc di qucsca isrruzione i'f sarebbe.considerata vera e la persona riceverebbe semp.re un bo.nus, indipendenccmcme da quale sia il suo reale codice di paga.memo!
r~

Enore tipico 4.8


Usnre L'opemtore ==in un nssegnnmento o uti/i$Ztl.r'I: !'opemtore =in 1m1t crmdiziom
di ugitaglianur.

Normalmeuce i programmatori scrivono le condii.ioni in questo modo x == 7 , con il


nome della variabile a si nisrra e la. cosranre a destr!. Jnvercendo le loro posizioni, facendo cio in modo che la cosrance sia a sinistra e il nome della variabile a destra, come
in 7 == x, il programmarore che soscicuisse accidentalmc:nce l'operatore == con =
sarebbe protetto dal compilacore. li compilarore, infan:i, lo mmerebbe come un errore
ru sintassi, poich sul Lato sinistro di una isrruzione ru assegnamento pu essere sisremaro soltanto il nome di una variabile. Quesro evirer almeno la potenziale devaswione di un errore logico durante l'esecuzione.

1 norill delle variabili sono detti anche lvttlm: (per "lcfr value", valore di sin istra) proprio perch possono essere urilizzari sul laro sinistro ru u n operatore di assegna.memo. Le
comrnci sono dette invece rvttluc (per "righr value", valore di desrra) proprio perch possono essere urilizwre solcanro sul lato destro di lLO opefatore di assegnamento. Osservate che
un lvalue pu anche essere utilizzato come rvalue, ma nQn viceversa.
B11on11 ttbi1udi11e 4. J 8
Qurmd una espressione di .u.guttglianza contiene mm llttricchife e una costt1nt11, come in
x == 1, akuni propmnmatodpreferiscono scriverla con la costante a -sinistra e /11 vnrirzbife
a desh'a, per proteggersi tlati(rrore Logico che si verificherebbe, qualora sostituissero 11ccider1talmente t'operatoie == co11 =.
Caltro lato della medaglia porrebbe essere alrce.rcanro spiacevole. Supponete che il programmatore voglia assegnare un valore a una variabile con una sempUcc isuut.ione come:

= 1;
ma scriva
X== 1;
X

invece

1 LO

Q&rroL04

}mchdn qm.;5r9 ~0 1 non s. crarr.a di un errore di sintassi. 11 ompilaJere valu~e.r pfott>sto catidi'dameru l'espressione condi.zipnale. Qualora x fosse gilllle a 1, b ondizion
sarebbe <'lnsiderar~ vera e l'espre~s_i0ae r~ti tn::ii:ebh~ il valore 1. Qua'.lora x ll'0Il f-0.sse
uguale a 1, la colldizion,e s!:bbe G:ons.iderafa fhl'sa. .. l' esp11essi6ne reSttuirebb:e J1 yalor.e 0.
&id.pendente mente da quale v.aJ.or.e sa:ra resiimim, noti ci sar nessun operarore di a.~se.gn.a
memo, per.ci, il .val:ox;e andr sempliG:ememe pers0, e quello di x x;ester~ inai'trata, eau5ando prnbabilmente un enrore logico durame l'esecuzione; Sfonunatamente non abbiamo a
dispgsizjone un n::ucc:i pr;iJi> per aiu~i cpn ques.ro probl~a!

4. 1l Riassunto della programmazione strutturata


L prngr<miaiaro.ci dvreb.Ber-0 progerutre i programni pioprir on'le glj ardiirerri pigernmo i
f!.Tuzlj, iillpi~l0 l sapienza co1lecriva del.la loro categoria. Il nostro campo e,fir p1 giQvane di, quanm lo sia l'arc::hirettura e la nostra sapienza collettiva considerev01meme pill limitara.
Abbiamo ;ippreso una gran mole di co,se, in ~olq cinquam'auni. Fe>rse, cosa ancora pi importante, abbiamo app(t'So che la prog~:un:.ma.zl0m: stmttur:'1.ta prodqce program.mi che sono pi
sc;rpiiti (ri:pen,o a qdli non stnl.tfuiWi) da co.mp.rendcre e quindi cl~ collaudare, mett~re l\
pw:m), modifiaue e anche da dimos.cyare to:rrem ncl senso matmarico dcl rtrmine.

4- CONTROLLO DJ!.L PROGRAMMA

<Il

<Il
r-i

..-.
.e

~
.e

~
::i
t:

:;:
._
G>

e
o

.H
~

Ul

!!

"O

11'
L..

::i
._.,
.

.b
lii

::J

>

t..

::J

t:

..,::J
L..

lii

1 Capircili ~ e;~ SL$on11> s.offeana,ri sulle stI'l,l~ur.e di 01m0Uo del C. Qgni s.aurrura
sratt presenrara, rappresentata in diagranimi cli flusso e discussa: _separa,ra,rnente con degli
esmpi. Ot:t cicap.icolere.mo l..risu4;i.ti dci Capitoli 3 e 4 e lntrodw:rem o !+Il srnpliG.e lrrsillr:i;le d r~golc per la cs1;rzioae cli progf~mi st'rUrruriti e pr le foro prtop#e.r..
.LaBigra-4.17 cias~lJ.Dl~ Le ,srrurrure cli controllo dl'scusse nei C,apiroli ;3 e 4. l c,;~riliierci
s0no utilizzati.n'ella:fgup per indicare gli unici punti di enc.rara e di uscita di ogni struttura. Collega.::arbirra:cianrent~ j singqli simboli dS UB diagrarrim:a di flusso _pou. nducre a

ptogrfuntili non scrutt4rci. Di ci)a.Segu,nia, la categoria dei -prgtamma'.(ori ha scelto di


itb,mb:in ar'e i simboli per i diagrilrillhl di -flusso, i'n :itiodo rale da formare uri imieme lim.Ltaro di struttur di controllo e di cosrruire sokamo prngiammi srtmrurari, combinando
appwpriatamente le strutture di con troHo ~econdo due sole semplici modalicii. -Per sempliei.r, SQ!IQ ~&.t.e rilizzar soJ~t<;! srrqrrure d:i conrr.0llo ~on \ill:J. s_.agela nr:mJ'a qsi:;ii:a: c'
solo un mq:do per entrare e 4Jll sfila ID4Uie:ra pr ~i~e dalla Stryr_m ra di c0_rrtrqll9. CoJlegar.e !e s.m,i.rttu~_li c;onrr.l!)llo fil.sequenza, in moq0 da fo rm_are-dei _p.rogra.mtni strui!1;urar;i,
sin'p.lice: il punro di uSc.irJi cli lilla scructu r~ di cmrollo. crine~s.6 di.mtameme ;li pumo
li enrrara della stl'w:rura di concrollo scrccessiva, Iti altre parole. le muctuie di comrbllo
saranno S:Stfuate in un pr.ogramma unicamente l\ma dopo l'alrra: ab.biamo perci ehiarnato questo processo "acca~StaJJ,J,ento delle -sa urmre di comrello". Le regole di formazi<r
ne dei programmi scmttrap CQl"l~n-rpe ancht; la_ni~g.zione dellpgmrre di con~U9.

La Pigura_4.J 8. moscra le ri:gol.e per foaiiare ppropriai:ameute dei programmi strurrurati. 1.e regole assumono <::he 0gni simb.olo cli remmgolo nei diagrammi di flusso . possa
essere utiliu~to per Indicare qU;alsiasi a'Zione, incluse quelle cli input/ouq;>ut.
Vap:plicarione dlle regble della Figura 4.18 piodnrr un.diagramma di-flusso sttJJ.tru:r:aro eo'n un aspetto ordunrb e .simile ai mmiiiciti.l delle CdsrruiJoni. Per illsmpi0, applicando ripllitarneme La regola 2' al diagramma di Ausso elemenrart; se ne- produrra uno
scrutnuato c0nte11ente molti rettauge).i in sequenza (Figma 4.20). O sservare che la regala 1
g~nerer u-na Ga't~~ a_ di Sl:rJ.loU: ur~ qi coatrol1o; per questo motivo l:a chiamei;-e:m:0
regqla di tu:ctt:{Jfstamt:nto.

Figura 4. 17 Le strutture di sequenza, selez.ione e riptizk>ne con un ingres'so e una wscita


singoli del lnguagglo C.

11 2

CAP1T01.0

l t. CONTROLLO DEL. PROGRAMMA

113

Regole per la formazione di programmi strutturati


1) Incominciare con il "diagramma di flusso elememare" (Figura 4.19).
2) Ogni renangolo (azione) pu essere sostituito da due recra.ngo.l.i (ai.ioni) in sequenza.
3) Ogni rerrangolo (azione) p u essere sostituito da una qualsiasi suurrura di controllo (sequenza, if, if/else, switch, while, do / while q for).
4) Le regole 2 e 3 possono essere applica.te cip~ruraroenre e in qualsiasi ordine.

L-~--' ',

''

ti

''

''

Regola 3

',,

''

Figura 4 . 18 Le regole per la formazione di programmi strutturati.

''

''

\~

r-------------- --------------,
I
I

I
I
I
I

Figura 4. 19 Il diagramma di flusso elementare.

,,

lt
,~

,.

I
I
I

, 1..---- ------ -

__ ________ f___
I
I
I

I
I

'

I
I

--.

Regola 2

...

Regola 2

Regola 2

...

,
,,

I
I

I
I

I
I

I
I

-------- ---,'
'----------- -- ---~---

;:.

La regola 3 dena regobi di nidificazwne. Applicando ripetutamence la regola 3 aJ


diagramma di Ausso elementare, .5e ne produrr y.no con srrurrure d1 conuoilo nidificare in
modo ord:inaro. Per esempio, nella Figura 4.21, iJ rttallgoJo dd diagramma di 8usso elementare sar prima sostituito da una struttura di selezione doppia (if / else). In segllito la
regola 3 sar applicata di nuovo a enrrambi i rettangoli della srmrmra di selezione doppia,
sostiruendo ognuno di quei renangoli con altre srrurrure di selezione doppia. I rettangoli
traneggiati incorno a ognuna delle struaure di selezione doppia rappresenrano i rettangoli
che sono stari sosciruiri.

I
I

I
I

___________ _
.___
I

'

...

:I
II

I
I

I,
,---- ------ ----- ----- -- --- , I

-------------II'
elementare.

'
,''
'
------------------------,------I

I
I

iI

'

I
I

Figura 4.20 Applicare ripetutamente la regola 2 della Figura 4. 18 al diagramma di flusso

'

'
,,

I
I

Regola 3

,I

''

'

Regola 3

I
I

'
I
I

'I

I
I

I
I

I
- - - - -----~ ---

-------------'

I
I
I

Figura 4.21 Applicare la regola 3 della Figura 4. 18 al d iagramma di flusso elementare.

114

WPITOL04

La regola 4 generer delle $t:rutrure pi grand i., pi complesse e pi p rofondamenre


n idi ficate. 1 diagrammi di Ausso che possono essere formaci, applic-and0 le regole d ella
Figura 4.18, costituiscono l'insieme d i turci i p ossibili diagra.romj dJ Ausso srrutcurati e,
quindi, l'insieme di curti i possibili programmi smmu.rari.

h. CONTROllO DEL PROGRAMMA

La programmazione strurruraE:L promuove la semplicit. Bobm e Jacop.ini hanno dimostrato che sono necessarie solo i'.re forme di controllo:

Mattoncini accatastati

Mattoncini nidificati

D
D
D

Sequenza
Selezione

p roprio grazie all'eliminazione della isc:ruzione goto che questi marroncini di cosuuzione non si sovrappongono mail' uno suH'alrro. La bellezza dell'approccio srrunuraco che
utilizziamo soltanto un piccolo numero di semplici pezzi, con un singolo ingresso e una
sola uscita, e li assem bliamo soJtanco in d ue semplici maniere. La Figura 4.22 mostra i ti pi
di cos~ruiioni, onen ute con L'acc'-a rascam ento dei mattoncini., che si possono formare attraverso l'appliCazio ne della regola 2 e i tipi d i costruzioni, ottenute con l'accarascamento dei
mactonciru, ehe non possono apparire n ei cliagiamm i di Busso scrua:w:ati (grazie alla eliminazione della istruzione goto).

11 5

Iterazione

La sequenza banale. La selezione; implementata in uno dei rre modi:

strutl'ura i f (selezion e sem plictZ}


stru ttura i f I else (selezjone doppia)

struttura swi tch (sele-1.ione mnlcipla)

D i fatto, elementare dimosrrare che la semplice struttura i f sufficieme a fornire ogni


forma di selezion e: mero ci che possa essere fatto con le scrucrure 1f / else e swi tch
porr essere implemencaco con La stru ttura i f .
t:iceraziooe im plcmenrara io uno d ei ere modi:

srru rrura while


struttura do / while
srrurrura for

Mattoncini sovrapposti
(illegali in programmi strutturati)

elementare p r-0.vare che la scrucrura While suffiienre a fornire ogn i forma d i iterazione.
Tu tto ci che p.oss:a essere farro con le srrurrm do/while e for porr essere implemenraro
con la scruccura while.

La combinazione di ques risulraci dimostra che q ualsiasi forma di controllo di cui si


potr aver bisogno in un programma C porr essere espressa con rre sole d i esse:

sequenza
srrurcura if (selez.ione)

Figura 4.22 Mattoncini accatastati, mattoncini nidificati e mattoncini sovrapposti.

Se le regole della Figura 4.18 sono rispettare, ua diagramma di flusso non strurruraco
(come quellq d ella Figura 4 .23) non porr esse.re crearo. Se non siece situ.ci che un particolare diagramma d i flusso sia srrutrurato, appUcate le regole della Figura 4,18 all' inverso in
modo da pro:vate a ridu r.re il di agr~a. di flusso a quello elemencru:e. Se il diagram ma di
fl usso pu essere ridorco a q uell0 elem entar e, allora il diagramma d i flusso originale scrutruraco; altrimenti, nordo .

srruccura

wn ile (iterazione)

Queste srrurrure di controllo potranno es.sere combinare in due soli modi: accarastaodolc e
nidificandole. La programmazione sutLcturaca promuove di cerro la semplicir:.

Nei Capimli 3 e 4, abbiamo discusso di come comporre i programroj wn murrure d i


controllo concenemi azion i e decisioni. Nel Capitolo 5, introdu rremo un'altra u nit di
srrum 1razione del programma chiam ata .f!mzione. Apprenderemo come costruire dei programmi. complessi combina ndo le fun zioni, che saranno formare a loro vofra da scru tr:u re cli
controllo. Discuteremo anche del modo in cui l'urilizzo delle funz ioni promuova la riusabilit
del software.

Esercizi di autovalutazione
4. 1

Figura 4.23 Un diagramma di flusso non strutturato.

____

Riempire gli spazi. in ognuna delle segu<md Frasi.


_,
a) Una .Eerazione concrollara da un co11rarore nora aache come iterazione
perch noco in amicipo il numero di volre che il ciclo sar. cseguiro.
b) Una irerazione concroll:it:1 da un valore scnneUa nota anche come icer:izione_ _ _ __,
perch non noto in ancicipo il numero d volre che il ciclo sar: riperuro.

11 6

CAPITOLO

e) Nelle ripecizioni concrollace da un concacore si utiliz.ta una


per concare il
numero di volte che un gruppo di istruzioni dovr essere ripenuo.
d) L1struzionc:
quando eseguita in una sttucrura di ice.razione, indurr l'esecuzione immc:diara della irerazione successiva dd ciclo.
e) l.:imu1.1one
, quando eseguica in una srruuuradiirerazione o in uno switch,
causer~ l'uscita immediata dalla srrurtura.
f) La
miliu.aca per coorrollare .una parricolare variabile o espressione per
ognuno dei valori costanti inceri d1e essa porr assumere.
4.2
Stabilite se le seguenci affermazioni sono vere o false. Qualora la .risposa! sia falsa. spiegacene .il movo.
a) Il caso default obblgawrio nella srrunura di selezione switch.
b) !.:istruzione break obbligaroria nel caso default di una strurrura di selezione switch.
e) Cespressio11c ( x > y && a < b ) ~ar conside= vera qualora lo sia x > y oppure qualora
In sia a < b.
cl) Una e.~pressione contenerne l'operator~ : : src:;onsidcra'ra vera se uno o entrambi i suoi
openwdi sono veri.
4.3

Sc.i;ivete una isu-uzione o un loro insieme per c~cguire ognuno dei segueoci Cmpili:
a) Sommare gli !meri dispari tra I e 99 urilizz~ndo uua srrurrurn for . Supponete che siano
mtte dichiarate le variabili sum e count.
b) Visualiz1.are Uvalore 333,546372 in un campo lungo 15 caratteri co11lcprccisioni1 , 2. 3.
4 e 5. Giusrilcate a sinisrr.i l'ourpur. Quilisarann,o i cinq.ue valori visualizzaci?
e) Calcola ce il valore di 2, 5 elevaro alla poren.za 3 uriliizando la funzione pow. Visualizzare il
risulrato con precisione 2 i:n un c.unpo con dinie.nsione pari a 10 posruoai. Quale sar il
valore: visualiu,uo?
d) Vsualizutc gli imcri da l a 20 uriliz7.ando un cido whle e la variabile contacorc x.
Supponc1e che x s:1 ~ srara dichiarara, ma mm inizializzal3. Visualiuace solo 5 inceri per
riga. Suggeri memo: usate il calcolo x % 5. Scampacc un caraccere newlinc: quando il valore
di questo calcolo sar 0, akcimenci visualiv..ate un Ctratter di cabuhzione.
e) R.ipecc:te l'Esercizio 4.3 (d), uciJ~zzaude una smmura tor.
I

4.4

1iovate l'errore in ognuno dei seguenci frammenti di codi.c e e spiegate come correggerlo.
a) x=1;
while (X <= 10);

lL CON' rROLLO DEL f)ROCRAMM.I\

Risposte agli esercizi di autovalutazione


4.1
:~) definita. b) indefnit3. c) variabile di conrrollo o conm:ore. d) con1:inue. e) break.
suuuura di sclt'Z.ione swi toh.

4.3

a) sum = 0;
fo r (count = 1 i count
sum += count i
b) Prlntff "%15.1f\n ",
printf( 1'% 15. 2f \n~,
printf('"% 15 . 3f\n",
printf( "% 15.4f\n",
printf( "% 15.5f\n",

case 2:
printf("The number is 2\n");
break;
default:
printf('The number 1s not 1 or 2\ n');
break;
cl) 1l codice seguente dovrebbe visualiu.are i valori da I a I O.
n = 1;

wl.le (n < 10)


printf ( '%d

<=

333.546372);
333. 546372);
333.546372);
333.546372);
333.546372);

i f (X % 5

0)

printf ( \ n ) ;
else
pnntf("\t");
x++;
}

o
X = 1;

while (x <= 20)


i f (X% 5 == 0)

printf("'isd\n', x++l;
else
pr.intf("l\sd\t", x++);
o
X

= 0;

while (+tx <= 20) {


if (x % 5 ="' 0)
prifltf("%d\n", x);
else
printf('l\sd\t", X);
e) for (x = 1; x <" 20; x++)
printf("%d ", x);
if (X \ 5 == 0)
printf ( \n);
else
prntf( \t);
o

n++) i

99; count

e) printf ( "%10. 2f \n", pow(2 .s, 3)).;


d) X = 1 i
while (x <= 20) {
printf( \d", x);

e) switch (n) {
case 1:
printf( 'The number is 1\n");

4.2
a) Falso. Il caso default opzionale. Se non necessaria nesi:una azione di defauJ. t , allora
non ci sar nessun bisogno di un caso default.
b) falso. I.;is1rur.ione break u1.Wzzara_per uscire dalla siruttma switch. l.:is1ru1.ione break
non sar richiesta qualora il caso default s.ia l'u1rimo.
e) 1:a1so. Quando si utilliza l'opera1ore &&, e1:u:ra.mhe le i;spressioni relazionali dovranno essere
vere perch l'inrera espressione sia considerata tale.
d) Vero.

XHj

b) for {Y., .1; y I= 1. 0; y += .1 )


printf(Dilf\n, y);

1 17

for (x

1; x

<=

20; x++)

+~ 2)

I*' visu.alizza a3a 1 s.

f"' visualizza 333,55


I" visualizza 333 , 546
/" visualizza 333,5464
visualizza 333,54637

I* visualizza 15,63

...,,
*I

*/
*/

*/

CAr1ro1.o 4

11 8

g) Il codice segucnre dovrebbe sommare gli i meri da 100 a 150 (supponere cne tot al sia gi
mua inizializzata a 0):
for (x = 100; x <= 150; x++);
tot al. += x;

if

(X\ 5 = 0)
printf("\d \n', x);
else
printf( "\d\t , X)i

4.4

a) Errore: il punco e virgola dopo l'intcswione del while provocher un ciclo inlnito.
Corraione: sosciruire il pumo e virgola con una { oppure rimuovcce il ; e la } .
b) Errore: l'uciliz.w <li un numero in virgola mobile per controllare la scruuura cli itcl3Z.ione for.
Corre.donc: utilizzare un intero ed eseguire j calcoli appropriari per ocrcncre li valore che
desiderate.
for

4. 6
Stabilire quali valori della variabilo:: di controllo x saranno visual.izzati da ognwia delle seguenti
istruzioni for:
~ for(x = 2; x <= 13; x += 2)
printf("\d\n", X);
b} tor(x = 5; x <= 22; x += 7)
printf("%d\nM, x);

(y = 1; y t= 10; y++)
pri.ntf(\f\n .. , (float) y I 10);

e) for(x

t) Errore: manca l'istruzione break tra quelle delprimo case.


Corre-Lione: aggiungere un break.alla1ne dcllelmuzioni del primo case. Osservace d1c questo
potrebbe non essere necessariamente un errore. qualora il programmatore avesse voluto che le
istruzioni dcl case 2: fossero eseguire ogni volta <Shefosse smco eseguito il case 1 : .
d} Errore: sraro utilizzato un operatore r~azionale inappropriato nellacondi21onc di cominuazione della iterai.ione.
Corre2iooe: u~ilizzare <=invece cli<.

= 3; x <= 15; x += 3)
printf("%d\n", x);

cl) tor(x = l; x <= 5; x += 7)


printf("%d\n", x);
tj for(x = 12; x

~= 2; x = 3)
printf( "%d\n ", x);

4 .7

Scrivere delle iscruzion i f or che visualizzino le seguenti sequenze dj valori:


a) 1, 2, 3, 4, 5, 6, 7

b) 3, 6, 13, 18, 23

Esercizi
4.5

11 9

lL CONTROU..O O.EL PROGRAMMA

C) 20 J 14 J 8 t 2 ! "4 I 10
d) 19 , 27' 35, 43, 51

Trovare l'errore in ognuna delle seguemi lsmrzioni CNota: dpotrebbe essere pi di un errore):
a) For (X = 100, x >= 1, x++)
printf(.%d\n ' , x);
b) TI seguente codice dovrebbe visualiZ?.are se un daro intero pari o dispari:
switch (value \ 2) {
case 0:
printf("Even integer\n);
case 1:
pri ntf( 'Odd integer\n);
}

e} U codice scguenre dovrebbe prendere in input un intero e un carattere e visualizzarli.


Supponete che l'urente immerca come input 100 A.
scanf ( "\d" , &intVal) ;
charVal = getchar();
printf( '' Integer: %d\nC'l1aractel": %c\nr, intVal, harval);
d) for (X

= .000001;

X <=

printf(~%.7f\n " ,

.0001 j

e) rl codice scgucnle dovrebbe inviare in OLicpUl gli ioceri clisprui da


for (x 999; x >e 1; x T=2)
printf('\d\n", Xli

f) il codlce segueoce dovrebbe visualizzare gli interi pari da 2 a 100:


counter = 2;

counter += 2;
While (counter < 100);

Ghe cosa far il programma segueme?


~include

<stdio.h>

main()
{

int i, j ,

X, y;

printf(aEnter integers i n the range 120:


scanf( "'6d\d ' , &x, &y);

u);

= 1; i<= y; i++)
tor ( j = 1 ; j <= x; j ++ l

for (1

printf("@");

printf("\n");

X += .000001)

return 0;

x);

Do {
if (counter % 2 =~ 0)
pr1ntf("%d\n, counter);

4.8

999 a 1:

4.9
Sccivere un programma che sommi una sequeaza cli i.ri:teri, Supponete cbeil primo intero leLCo con
la scanf specifichi il numero dei valori d1 dovranno c:ssere. immessi. Uvostro progr.urunadovrli leggere
solo un valore per tigni volra che la scanf sar eseguica. Un.a tipica ~equenza di input porrebbe essere:
5 100 200 300 400 500
dpve 5 inruca cbe dovranno

CS$Cre sommaci i 5 valori sucessiYi.

4. 10 Scrivere un progr.uruna che calcoli e visuali:z:Li la merua di diversi ince. Supponete che l'ultimo
valore lecco con la scanf si:i quello ddla sentinella 9999. Una cipica sequenia di iopur porrebbe essere:
10 8 11 7 9 9999
che indica che dovt essere calcolata la media di umi i valori che precedono 9999.

120

CAJ'lTOL.0

4.11 Scrivere un programma che rrovi iJ minore di diversi imeri. Supponere che il pdmo v::dore letto
specifichi il numero di quelli ancora da leggere.
4.12

Scrivere un progr;'lmma eh..- calcoli e visualizzi la somma degli inreri pari da 2 a 30.

4.13

Scrivere un programma che calcoli e visualizzi il prodorro degli inceri dispari da I a J 5.

la funi.ione faaoriale urilizzara frequ<:ncemern:e nei problemi di probabilica. Il fuccoriale cli


un incero positivo n, scricro o!<.' pronunciaco "f.moaledi n", uguale al prodo tto degli inceri posicivi
da l a n. Scrivere un prQ!,rramma che valuti i furrociali degli inceri da I a 5. VisuaHuare i risulcaci in un
formaro cabularc. Quale ,tifficolr porr impedirvi cli calcolare il furroriale di 20?
4. 14

4.15 Modificare il programma deU'incer\!sse composro deUa Sezione 4:6 in modo che ripeca i suoi
passi per cassi d'imercsse dcl 5, 6, 7, 8, 9 e 10 percenro. Dcilizzare un ciclo fo r per va.tiare il casso di
ince.resse.
4.16 Scrivere un programma che visuafu.zi separaramence l'uno sorro l'akro i seguenti disegni.
Urilizzare <lei cicli for per generare i disegni. Tuni.g~L3l!tcrischi ( ) dovran no essere stampaci da una
singola isru1.iMC printf della forma printf { ); (ci call$er la visua.fizwz.ione fianc0 a fianco
degli asrcrishl) . Suggerimenro: gli ulcimi due disegni richiederanno che ogni riga incomi11ci con un
numero appropriato di spazi.

4. l~ Un:i azienda di vendita per corrispondema vende cinque diftnmri prodoc[i i cui prezzi 11.I
denaglio sono mosLraci nella seguente cabell:i:
Numero di prodotto

(B.)

......

......... ...:1'-t lii"'!\'

1dl1f:Jf. .... -"Jt;_'Ji:lt


~~

*"**

........

ff~~ -.

~~

""1 1

..................

"'*"..

~--
'llw

*......,,. .........

_,.__.. ....... . . . . .

:Jt"**-'fH!r

.,..

(C)

'.lt.t**-"'"'

"'li" *'.fF**c..;"'-***~#A
*'if'if{ii~*

*''*'

..._., .... ~1'"

.......

~.

-'*
..,. ~

(D)

...
lt

~-

*if11 1c
A-+1' lt

t-ri*
~****'ti'

.._.-"*"'"* --

......... ""*
*"

Prezzo al dettaglio

2.98
4.50
9.98
4.49
6.87

3
4

Scrivere un programma che legga una seri.e dj coppie di numeri come segue:
I) Numero d.i pro<lono
2) Quanric venduta i.n un giorno

uo rogramma dovr ucilizt.are umL istruzione switch per aiutare a decennin:ire jl pre-lZO <Il

TI

de;~~lio ~ ogni prodotto. 11 vomo, pr~gr:unm'.1 dovr calcol:tre e visualiz.zare il valore corale al demt-

.glio

cl! turri i prodotti. venduci ndl uluma semmamt.

4.20
{A)

Completate le seguenti tabelle di veric, .riem.pit.mdo i relativi spazi con O o 1.

Condizione I

Condizionel

o
o

o
diverso da 7.ero

d.ivcso da zero

J. TI numero di conto ~d djente


2 . TI limire di aredico del cliente prima della re.::essione
3. Il saldo corrente del dienre (vale a dire, l'ammon:care che il cliente deve all'azienda).
Il voscro programma dovr calcolare e visualizzare. il nuovo lim'ite di credito, per ogni dientc, e dovr
and1e dererrninan: (e visuali~:wre) quali di loro hanno dei saldi correnci che ~cdono il loro nuovo
limire di credito.

4. 18 Una inceressanre applicwone dci computer il disegno di diagrammi e di grafici a barre


(derri a volte aiscogramrni"). Scvere w1 programma che legga cinque numeri (ognuno compreso tra
I e 30). Per ogni numero leuo. il voscro programma dovr visuali7.7.are una riga contenente qul
numero di ascerischi adfaccnli. Per esempio, se il vostro programma leggesse il numero serre, dovr
visualizz.a re .

Condizione I && Condizionel

o
o

diverso da.zero

diverso da zero

Condizione I

Condizione2

Condizione I 11Condizionel

o
o

***"......,. ...... *

4. 17 Riscuotere il denaro divenm sempre pi difficile nei periodi dj recessione, per quesLo
morivo le aziende porrebbero resrringere i loro limi.r.i di cred iro. per evitare che i propri comi di
credito (il denaro loro dovuto) divnrino troppo s.osraniiosi. Come risposta ;t una recessione
prolungara. una aiienda ha dimezzaro il Limice di crcdco dei propri clienti. Di conseguenza, se
un parcicolare cliente avesse avuco un Li.mire di crediro di $2000, questo sarebbe ora di $1000.
Se un clience avesse avuto un limite d i crelico di $5000, ques.ro sarebbe ora di $2500. Scrivete
un programma che analizzi lo scaco di credito per: m: clienti di quesra a7.ienda,. Per ogni cliente vi
saranno fornici :

I i. J

lL CONTROLLQ DEL PRClCRAMMA

di versQ da zero
diver~ da 1.eco
Condizione I

dive rso da zero

o
divecso da zero
!Condizione I

o
diverso da 1.Cro

4.21

Ri,scrjvre il programma della Figura 4.2 in modo chel'iniz.iali7.zazione della variabile counter
sia. esegu:iLa nella dichiarazione, invece che ocUa suurcura f.or.
la vo.rwone media della classe.
della f'gura 4 7 in modo che calcoli
1
"

1
4.22 Mod.i ncate 1. programma

4 2 3 Modificare iJ programma della Figw:a 4.6 in modo che utilizzi sol~ruo degli inr~ri ~er calco~
nerar1e come quanm intere di
I cifr

.
. . . .
lare l'inreresse composro. (Suggerimento: rran:ate ru.uc . e. . e mo . .
rispecualizzando
cencesmu,
e
dollari
di
pomoni
sue
nelle
risultato
1

"separare"
co

In

1
.
.
ceocesuru. segui ,
civamence le.opera2ioni di divisione e modulo. Inseme un punco}.

122

4. 24

GA:l>lTO L.0

&i].1onere che i -"' 1, j = 2, k

3em

2. Che cps;1 visu:izier ~gnu!):i

d,eJlt- -seguenti

i$quz:ion}
:i.} pfintf( "%d", i = 1 ) ;
l'!) pririt f( " ~d " . I = 3);
e) printf ( "%d" ,
\i)' print'f( "%d ",
) priritf ("~e " ,
{) pri,ritf ( "%d',
g') prin'tf ( ' %d ",
h) printf ( 't%d',
i) printf (-''%ti'! ,
j). p.r intf ( "%i:I"" ,

<

= 99

>= i

&~ k <

11 k

--

m);
m);

11
k
111 < j 11 ~ .. j >= k);
tm);
tH . . m).) i
l(k "> m)J;
Hf > kO;

! (,X < 5) && I ( Y :>= 7')


b~ l(a == b) :: !(,g J= 5)

7t=4-.!;1-!_i+i_.!+...
5 7

9 !1

VJsuiiliiz~te una ab:lla: clic mS:u;i il

valore di 7t approssi..maco d;i uno, . du; ere- ... c_crmini di

e) I ((X <= 8) && (Y > 4 ))


d) l ((i > 4) : : ( j <= 6))

rus.aivete il progr:i.mma deUa Figura 4.7 SOSticuendo l'istruzione switch con d,elle. scmrrure
defaul:t. Riscrivere quindi
questa nuova versione, sstituendo le storurrure ff/lse nidi.fie<are wn una s.ecie di i.srruiic:\ni if;
anche questa volta, sfa~ arren a cnmare :i.ppropcia#riiem il ajo di dfaUl t (ci. ~.ar pili dik.il<;
cbe con la ve.i'sion~ delle St;rUCTU!e i f /else nidificare). Questo es_erl;faio dil'nostrer l.1e la smmuta
switch una comodi.c e che ogni switch porr e~ser sostituito on istruzioni di sekzic;m~ singola.

4.3.0

if /else nidifcace: scare ari;em; a c:rrtare appropriataiuc;me il caso di

Cakvlat.c il valore cLi TI a partire dill.a Seri(! in:6n.ita

di cui il v:O..fu. program1,1\_a avr b~og1~0 per caleqlareJa paga di Qglli lip'encl1=:me, in b1.1$e
al pn,>prio codice cli p,a~entoappropriati

a)

4.2:5 v;isualfaz.ate una tabdla di equivalenza rra decimali , binari, ()[rali ed e.sadecima.li. Q ualora non
abbi.are famWarit. c::ou i suddetri. sisi:emi. numerici, cm1sulc:ace prima l'Appendice E, se-volere remare
di eseguire questo eserci11io.
4 .26

123

4. 29 (Leggi di De Morgan) 1n questo capfrolo abbiamo discusso degli opmori logici&&; : : e I . Le


Leggi di De Morgan pou~~o a volte renderci pi prarica la formulazione di un1nsp.ressione logka.
Queste leggi srabiliscono che l'espressione I (conliiionel && concli7.in2) laglcamen.c~ equjvaJeme
alla espressiom: ( I amdiziond : : I 10011dizi1:me2 ); lnolcrc, l'esp.ressione I ( contli:tio.n 1 : I coildizione2) logicamente equivalemeaU.a espressione ( lc;ondizionel && lcondkiooe2) , Utilizzare le L.eggi
di De Morgan per scFivere delle espressioniequivalenti per ognuna di quelle seguenti e quindi scrivere
un programma che .diinosrri ehe l'espressfo.ne-0riginale-e quclla n.uov.a sono, in ogni.ciso, e.quivalenci:

i. >= 1 &g. j < 4) i


ITT

lL CONTROLLO DEL J?ROGlti\MMA

qu~sta

sef.i'e. Qua.i)ci crmini di qt1~$ta '-5Jirie dovrece utiliz.za:r, priin dj ocrcn_


ee 5,14? 3,141? 3, 1'415?

3; Ul);;).?
4.27 ('Fe~ne pitagoriehe) Un rriang0lo retrango.lo f'U avere fari che .siano rutti interi. Dinsieme dei
tre valori interi per i Ia~i dj. .un ttiariKolo rettangolo detto rema pitagoriea. ~uesri rre laci de.v.ono
soddi'sfarcda relazione.secontlo la quale la somma dei quadrati dei due ca~eti uguale:al quadrato della
ipore.nusa: Trovare wrr I.e. reme p.iragoriche per latoi , lato2 e ipotenusa che non sian~ maggio10i di
S:tlfl. Utilizzatoe un tiiplo .Giclo fo.r nd.ifkaro ,che ,provi semplicememe: mrr.e le possib.i.lh. Questo
un esempio cli la.boraiione een "forza bruta'.. Non piaee a mofr dal pt1ro di visra esrecieo.-Esistono
pi:r moh~ ragion l?e'f cui quesrerern.iche ~on0 imporrami. fu p.11i.m'.0Juogo, con .f.ineremenro della
po16mt di cakolo a un t irmo cosl-feaomeJ'ale, le.soluzien che av,r.ebbero richiesto anni o addirirru.ra
secoli di elae.oraiioM; per esse.re ocrenme con_;! a cetnologia di solo un po' di anni fa, o~gio=o
pl:rebor esS'~t Citemtte in.ore, in m.i.oud o addirim1rain.secondi! lnsecondo luogo,.aome aflPr.e nden~re nei-co;rsj pru a-Vailiari di inf6m1acica, e'~ un gran numero di problemi inte_r~sami per i quali
illfo, s'i~r n~sail a1fprO-cio algotirrnico 11oc6' li.yrso da quello alla. fraa rut. fo qudro lbro
nvescigheremo su. ml')lfi tip di mecOlO.gie 'per la s.olui ine dci pr.oblemi. Considereremo mld
;tppr.Qc;cL<.on. fu,rz;i bm~a .a di.versi pio5lani in,teressa:na..

4.28 l.)na azic11la feaibuis~~ j PfO,PQ cLipendenti d.iscin15!1endoli tra managet (.eh<;: riq:vom> un
s-alario fiswsertim;ina1_e), lav~rar9ri ;i ~re(~~ !'i~v<;>no ima p-aga oraria .fi.s:$a p.er le p9m~ 49 ore cli
lavoro e "un'ora e me-1.z.a", gw~r9sia t,5 VQite la [>aga OJ'ar.~, pe_r le Ofe ,cLi ~Cl'OJclimri.9 'effertua.~e),
Li.vero.tori a tJrDV\~giene (che riceNqno $250 p.i il ).7% delle loro vendite lprde serrim3naH), qpp.ure
lavoratori a eorrimo (ehe ricevone unacifra fissa di denaro ad arduolo; per ognuno di quelli proclot:ri:
in q_uesra azienda ogni laverarore a cotmo lav~ra:solramo su un upo d.i arcicoll?} Seri.vere un .progpunma che calcoli I.a g~~a settimanale di egni dipendrote. Non eonoscete in anticipo il .numero dei
dipendcmi, Ogni cipo di dipendente ha il p,roprie codice d.i pagamemo: i n;ianag~r hanne 1, i lavora~
rori .a ore hanno 2, q_uelli a provvigione 'h an.ne ,3,e quelli a eo.rtimo hanno 4. l:Jrilizmre una sa:unura
swi te h per <!a.lcol;ire.1a pag~ di ogni dipe11denre in base al suo eod.ieecli pagru;nemo. All'interno della
Stnutmra:. swi tch, Fichiedere:ll' utenre (o'l'.Verosia all'impiegato a.d detto alle paghe) di immettere i farri

Sc_civere un prqgramma che visua.li1.2.i il scgueme diseg_no di un rambo. Po.crete utiliz.1.re delle
is_rt~iqni pr.intf che visuali.za.ino ogpuna un. singolo asrerisro (*) o Lmo spazio. Massnii.1.are rl
vo~9 uriliz.zo delle ripe:ckieni (con strucmrc for nidificare) e minimizzate il numero di imuzoni

4:.31

printf.
'lr1J,"lf

..,.,"',,.....
"

it',it';ill'

ili/}*.--~

,lo~!-.f~~
,,,~~

A.32 .tvf9dificarc il prog~ che avere scdcco nell'Ese.rcizie 4.31, in modo.da.leggete un numero
4iwarLcompres.o n:ell'imervallo da I a I 9 per specifiGare il numero di righe compte~e ud rombo. li
V<:).SU'fl programma; dovr quindi visualizzare un rombo della. misuta apptpria:ta.
4 .33 Se ayee familW-it 911 i numeri ramani, s.rivece un prO:gtamma eh~ visuali.7.:zi una rabeUa
conceneme m:rri.i llllffi~ti romani equivalemi a quelli decimali bmpre.si ne.ltirtrervallo da l a: 100.
4.~4 Scrivere wi programma che visualizzi una tabella comenellte i numeri binari; orta.li ed esadecimali
equivalenti a quelli decimali rnmpresi nell'lmervaUo dal a 256. Se non avete fumiJi.cit con ql.i.s~i
siscemi rrumerici, consultate prima J"Appendice E; se volere tentare iii eseguire ques.ro .sekizio.

4.35 Descriveteil pr~~ che u$erste per 50stitu.ir LU'I cklq dO'/while oon una.scructur'1-.W'hile
qli,iv";Ilen.r. Qu,i.ie prE:lbie.tna intonrre.re:ste qu.a1er-a cenca~ce cli sO;stiwire Lm ciclo while con una
strurm1:a do/while quivalence? Supponete che vi s.ia scaco chiesEo cLi rimuavr~ un tido while ? di
$osritull:l0 cpn una sJrrrura 'do/while.Di qule alt(.sr.ruttra di eonrroll0 avt\!te b~ggn_o e ime l~
userere, pr ;issi<:;urarvi h iJ prog.m.ma cisultame si omporti esm:ament\! c;omeJ'ori~?

L24

CAJ>l1'9W4

4.36 Scrivere un programma che prenda in inpm un anno compreso nell'intervallo dal 1994 al
1999 e utilizzi una irerazioac con un ciclo for per produrre rrn calendario compend.iat0, v1sualiz.z.aro
in modo ordina.ro. Artenti agli anni bisestili.
Una cricica alle istrui.ioni break e continue che non sono srrua:urace. In realt le isrruzioni
break e continue pos.~ono sempre essere sosriruire con isrruziooi smnru.rare, sebbene furlo possa essere
scomodo. Descrivere in generale come rimuovereste mm: le:isouzioni break dal cido di un programma, e come le sostituireste con qualche istruzione stmnw:ar.a qun~etue. (Suggeri memo: l'istruzione
break abbandona un ciclo dall'interno dd suo corpo. I..'.altra,maniera per abbandonarlo facendo in
modo che il controllo di continuazione dd ciclo fallisca. Nel controllo di continuazione dcl ciclo
considerare l'urilizzo di un secondo concrollo che in~chi "usi;ita.anricipaca a causa di una condizion~
di 'hrea.12"). Ucili7.7.atc la tecnica che avere appreso in quesco esercizio per rimuovere l'iscrm.ionc di
interruzione dal programma delfa Figura 4.11 .

CAPITOLO

4.3 7

4 .38

I )

Le funzioni
Obiettivi
Comprendere come cosrruire i programmi in ~odo modulare partendo da piccoli
pezzi chiamati fum.ioni.

far il scgueme frammento di prngramma?


fo r (i= 1 ; i<= 5; i++) {
Che cosa

Inrrodurre le comuni funzioni matematiche disponibilinella libreria standard del C.


Essere i.n grado di creare nuove funzioni.

-fo r ( j = 1 ; j <= 3; j ++) {


for '( k = 1; k <= 4; k++)
printf{ "~ '');
printf{ '"");

Comprendere i meccanismi tLtilizzari per passare le.infomiazioni alle fi.u11.iot;.

Introdurre le tecniche disimulaz.ione d1e utili7Zlllle1a generazione dinurneri c.'l.Suali.

C-<>mprendere come scrivere e urili'l.z.a.r le funzionj che richilnano se stesse.

pr i ntf ( '' \ n ) ;

Descrivete in generale comesimuovcreste ruue le isrru2i11i continue dal ciclo di un programma, e come le sosri 11 resre con qualche ist:ru.zione smm:w:ara ~quivaleme. U cilizzau: la tecnica che avcte
svilupparo in questo cserci:iio per cimuovere l'istruzione continue dal programma della Figura 4 .12

4.39

Descrivete in generale come rimuoveresre le istruzioni break da una srruuura switch e come
le.sosrituiresce con qualche iscruzione strurruraca equivalcnre. Ucil.izzare la recnica (forse scomoda) che
avere sviluppato in questo esercizio per rimuovere le ismuionj break dal programma della Figura 4.7.

4.40

5.1

Introduzione

La maggior parre dei programmi per computer che siano stari scritti per risolvere problemi dd mondo reale sono pi corposi dei programmi presentati sinora, in questi primi
capiroli. I.:esperienza ha dimostrato che il modo migliore, per sviluppare e amministrare
un pTOgramma corposo, di cost:ruirlo panendo a pezzi p_i piccoli o moduli ognuno dei
quali sia pi maneggevole del programma originale. Questa tecnica derra dividi e conquista
(dal larino divide et impera). Questo capirolo descriver le cararrccistiche dd Linguaggio C
che Facilitano la progertazione, l'implementazione, il funzionamento e la manutenzione di
programmi corposi.

5.2

I moduli di programma in C

1 moduli in C sono chiamatifim.zioni. I progra.mmi C sono scrirci tipicamente combin<indo le nuove fon1.ionj scritte dal programmatore con quelle "preconfezionate" disponibili neUa libr~ri11 sta11dard:del C. In questo capitolo discuterem<;> d i enrrambi i
ci13i di fun.z.ione. La libreria standard deJ C fornis~e una cicca collezione di funzioni
per esegu ire i comuni calcoli macemacici, per la .w;lnipQl~<.me delle stri nghe e dei
cararreri, per l' inp ur/oucpuc e per moire altre operazioni utili. Ci render pi sempUce il lavoro del programmatore, poidl l suddette fu nzioni forniranno molte delle
capacit di cu i egli avr bisogno.

Buona abitudine 5.1

Familiarizzate con la ricca collezione di funzioni ;ncLuse nella libreria rtttndard


de/i'ANSI C.

126

CAPrrorn 5

LEFUN210NI

127

I ngeg;neria dei suftware 5.1


Evitate di inventare nuovamente In ruota. Util~te le fimzioni incluse nella Libreria
standard rlell'ANSI C, qual.ortt sia possibile, invece di scrivere delle nuove fimzi.<ini. Ci
ridurr il ti!rtpo di sviluppo dei progrttmma.
Obiettivo portabilit 5.1
worker 1

worker 2

worker 3

Utilizzare le fimzioni della libreria standard d.eli'ANSI Caiuter a renderepiportabili


i programmi.
Per quamo le funzioni della libreria standard n<>a facciano cec.nicamente parte dd
linguaggio C, esse sono fornire immancabilmente con tut i sistemi conformi allo sraudard
ANSI C. Le funzioni printf, scanf e pow che abbiamo utilizzato nei capiroli precedenr.i
sono appunto delle funzioni della libreria standard .

Per defnire dei compiti specifici, il program.mai;m porr scrivere delle funzioni che
possano essere ucilizzate in molti punti del programma. Queste sonp a volre c;hlauiace
fonzioni definite dal programmatore. Le ist:rnzioni che dd.niscono effetti vameme la funzione, sa.ranno scritte solo una volta e saranno nascoste alle alrre funzioni.
Le funzioni sono invocate da wu chiamata di fimzione. Q uesta specifica il nome della funzion e e fornisce d~e i.nfurmaz.ioni (gli argomentt) di cui la funzione chiamata ha bisogno, per
mmplewe le anivir per le quali scaca progerrara. Una cipica malogia per runo ci queUa
dclla scrurrura gcrarchic::a di un'azienda. Un capo (la funzione chiamante o chiamante} chiede a
un' operaio (la fonzione chiamata) di eseguire un compito e tornare indietro a. riferire, quando il
lavo( sar staco e.seguito. Per esempio, una funzione che voglia visualizzare delle informazioni
sullo schermo richiamer la funzione operaia printf per eseguire quel compito, in ~guito
printf visualizzer le.suddette informazioni e comedLindie.cro a riferire, ovverosia restituir il
controllo del programma, alla funzione chiamante quando il suo compito sar stato complerato.
La funzione capo non sa in che modo quell'operaia ~ i compici che le sono sc;rri assegnati.. Eopcraia potrebbe anche nchiamare alrre funzioni op etaie e il capo non ne sarebbe a conosc.enz.a. Vedremo presto in che modo questo "incapsulamento" dei dercagli dcll'mplemntazione
promuover una buona progettazione dcl sofrwre. La Figura 5.1 mostra la funzione main
mentre comunica c:On diverse operaie in modo gerarchico. Osservare che worker 1 agisce
come una fimzione capo per worker4 e worker5. le relazioni craJe funzioni potrebbero and1e
essere diverse dalla strurrura gerarchica mostrata in questa 6.gW'a.

S.3

worker 4

Figura 5. 1

Re lazione gerarchii::a tra la fu nzione capo e.quelle operaie.

printf( '%.2f", sqrt(900.0));

Nel momento in cui quesra iscruzione sar eseguica, sar invocata la funzione sqrt della
libreria matematica per calcolare la radice quadrar.a del numero conrenuto nelle parentesi
(900 . 0 ) . li n umero 900 , 0 l'argomento della funzione sqrt. I.:isrru1.ione p recedente
visu.alizzer 30, 00. La funzione sqrt accerta un argomento di po double e resciruisce un
risultato double. Tutte le funzioni della libreria matemarica restiruiscono il tipo di dato
double.

Bu.ona abitudine 5.2


f ndudete ii file di intestazione matematico, 11.ti.lizzando la direttiva del pteprocessore
#include <math. h>, quando utilizzo.te Le fanzmi della libreria mmematica.

Errore tipico 5.J


Dimenticare di includere ilfile di irrtestazione mateJnal:ico, quando si utilizzano lefimzmi
della libreria matemnta, potr provocare dei risultati strani.
Gli argomenti della funzione possono essere delle qmanci, variabili o esprSsioni.
Supponendo che c1 = 13,0, d = 3,0 e: f = 4,0, l'istruzione
printf(",9 6.2f", sq 1t ( c1

Le funzioni della libreria matematica

Le funzioni ddla libreria .matematica consencono al programmatore di eseguire celi cipici


calcoli matematici. In quesco conresro urilizzeremo v arie funzioni maremariche per introdurre il concerto di funzione. Pi tardi nd libro, discureremo moire delle alcre ~oni
incluse nella libreria srandard deJ C. Una lista completa delle funzioni incluse nella libreria
standard del C sar fornita oell'Appencilce B.
NonnaJmeme le fum.ion i sono utilizzare in un programma scrivendo il nome delle sresse,
seguiro da una parentesi tonda aperta, dall'argomentu (<;>ppure da una lisca di argomenti separati
da vicgole) della funzione e da una parentesi conda chiusa. Pei: esempio, un program,m ~tored1e
desideri cakolare e visualiz.z.are la radice quadraca cli 900, 0 pocr scrivere:

worker 5

+d

t) )i

calcoler e visualizzer la i;adice quadrata d i 13,0 '+- 3,0 ~ 4,0

= 25,0, vale a dire 5 1 00.

Nella Figura 5.2 sono rissunte alcune delle funzion i incluse nella libreria mare_m atica
del C. Nella figura le variabili x e y sono cli cipo doubi.e.

S.4 Le funzioni
Le funzioni conseruon0 al programmatore di suddividere in moduli un programma. Tu a:e
le variabili dibiarate nelle ddnizioni d funzione sono variabili locali: esse sono n oce
solmnto in quella in cui ,soao srate definite. La ma~gior parte delle funz.ioni con_ ene una
lista di parametri.. Questi forniscono il mezzo per comunicare l_e infoana.7.ioni tra le funzioni. Anche i parametri di una funzione sono delle variabili locali.

12$
Funzione

Descrizine

Esempio

sqrt ( x)

.radk:e quadrata di x

s qrt(900.0 ) ~30 1 0
sqrt (9 .~) 3 1 0

exp(?C)

.funzione esponenziale e

exp( 1 .0) 2 , 7f8282


exp(2.0) 7 ,389056

l og(x)

logaritrri.0 namralc di x (in b.ase e)

log(2 . 7182&2} ~ 1,.~


16g(7 ..389056) . 2 , 0

l,og10(X)

lgl!.ritmq di x (in. bas~ l )

log:10(.1 . 0 ) 0 , 0
log10 ( 10. 0.) 1 , 0
lo_g1~ ( 100 . 0) 2,0

di ~tarda.ripri:t.i.one del odic;.all'in,remo di un prgramn1a. lmpadiertare il C0dicein forma di


fu..dzi~n~ OP.senti~ allo sr~o di essete eseguit.o in div<!:rsi ptmri del programma rihiamande
sempllcem.nte la funziorie.

Ogrti fanz;n dtivr.b}J /Ji'nitr11.-si a sfJ.tlre w1 compito iir.z.goliJ e ben definito, m111ztre il
n~1t d.dlafim~ione. dmirebbe.esjfrfmere.efficac17~ente quel cony>ito. Gi faciliter l'astt-a-

zume upromuo.ver: ltt riusabilit del softwtlre.


Ingegneria del ~oftware 5. 4
Se non ;isdte Il sctgUi tt?l. f1a'IJ1 onr:iso cheJ1tprhnii t'at.tiviti'I. svolta dalla vomnfrtnz.iime, problibile che t{l.tttst sti tffntndii di eseguire troppi compibi diversi. m questi. ~asi,
di solito meglio s.uddivideda in.diverse fan.zioni pi piceale.

val.o re asso Iuro l.i .x

se x > 0 allora fabs(x) x


$e x = 0 aUora t abs (X ) 0 1 0
se x < 0 allora fabs( x ) - x

arrotonda x aU' imero


pi_. pii;:.eqlo non minore dix

ceil(9 .2)

floo r (x )

arroroncla iX" all'in ter0


pi:.i: grande nh n m3:~1ore dix

f .loor (9 . 2 ) 9 , 0
floor (-9 . 8 ) -10,0

p9w(x,

x elev~co alla _pgrnz.a y O

pow( 2 , 7) 128 , 0
pow(9 , . 5) 3.0

degli mcen cpmpreJ tra 1 e J.O (Figy.ra 5.3).

fmol(x, y)

resto di x:!r in-virgola rnobile

fmod(13 . 657 , ? . 333) 1,912

#i~eludi

sin (x )

.~ei'le> rrigonametrlco di x

s i n(0 . 0 ) 0 ,0

fab$ (X)

ceil(x)

y)

(x espr.essa..n
cos(x)

tan( x)

~ 10 , 0

ceil( -9.8) -9 , 0

(adiaotP

coseno rrigonomfiltico dix


(1! ' espressa in ntdiru;ri)

.65 ( 0. 0) 1 , 0

ra.ug~tevi.go.norn~tdca di x

t an(0 . 0 ) 0, 0

5.5 Le defmizioni di funzione


Ognuno :d.ei programmi c:he :i_bbiamo presen~to stato for.Lliaro da: una :fun,ziQ'ne clriarnata
main c;hc;, pi';r eseguire i propri compiti, ha ri:hia.rnaro quelle della li'.brer.i scandard. Consider.iaoio 'o ra in che modo i programmacori possano scrivere le proprie fun:zion i pers0nalizzare.
~;~nsi~rate . un .pmgramma ch urili.zJ.;i

r1iCl
P.

funzione square

per c1k:'olare j

quadraci

I * l)na funzione :?Quare qefJ.n-ita dal p.rog rammatore * /


<stdio.h>

i nt square(int);

I* prototipo a.ella funzione */

main ()
{

i nt X;

(ic espressa in J:':\iliami):


Figu"a S. 2

u.ri

for (x

Funzioni comunemente utllizmte.della libreria matematc~

Ci son ruvr.Semt>.tiyazioni per "Sl;lddividere in funziom".1+11 programma. l'.~pf!rQcie div.idi


e conqu ista rende maneggev:>l lo -svilup,p0 del pmgramm. Un'-alrr~ moriv(lzione l
riusabzY.it del-software. u~eJe funzioni esistenti come l;)Jmiehi di-cosrruzjoru: p,er deare i tiuovi
p.rogtammi. La du~abillr. de! ~.oftware UJl0 degli d emenl!i principali del mov.im.fro per la pto~6.pe . orienr.a.ta. agli qggetti. Con ill! brnn_1.ng!11e di funzione e uAa buona.ddnizioae, i
prog~~pa-rri no e'S.$e tea_ri da fl.1nzigni sranda:rdizzare4ie ~eguao<;> dei compici sped:fki,
piut:o:sro che es5t:e co5trllii uti:llzzando un odie per-g~r'I~. Ql!est.a te~ni~ eqno~ciuta
6nie astrazi.om. Noi usiamo l'astrazl.bneogni volta.cl serivia:.ino dci.prqgrammi che includano
de.llefunuon:i incluse nella librcii:israndard, come printf sanf pow:Un.a ter~.a rqocivaziou
I

r,

10 ; l!<++)
sci uare(x));

r:i ntf ( ~ \n");


l"'eturn 0;

htgigntrin. dt.L ijt:War 5.2


Nei programmi contenenti molte fimzioni, main potxebbe.essr impkment_q.to ciJfhe u71
gruppo di hiamate a fim;liioni che eseguono il grosso Il.et lavbro deiprogram1nit.

= 1j x -=

pri.ntf("%d

'/" De'tini:ilorie dlla funz;ione *.I

int

squ a r~(irit

Y)

,.

returh y .. y;
}

['

Fig ura S.3

16

~li

36

49

64

81

1100

Usare una funzione definita dal programmato r.e.

CAPITOLO

130

~ B11ona abimtline 5.3

lf2J

La funzione squa re sar invocata o richiamata nel eorpo di ma in all'illrerno dell' iscru-iione printf
", squar-e(x));

La funzione square riever una copia del valore di x nd parametro y. In sguito square
calcoler y y. li risulraro sar restituito alla funziqqe printf all'imerno del main n~I
punco dell'invocazione di square e printf visualizzer il risultato. Questo processo sara
ripetuto J O voi ce uciliz.zando la srrurrura di iterazione far.

La definizione di square mosa:a che questa attender il paramerro inrero Y. La parola


cbjave i nt che precede il nome della funzione in-dica che square restituir un risulraco
incero. L'imu'Zione return neJla fum.ione square i:estin, il risultato deJ eak9lo alla
funzione chiamame.

La riga
int square(int);
un prototipo di fo~one. I.:int all'incemo delle pareruesi informa il ~n~pilawreche square
si aspercer di ricevere un valore intero dal chiama:nre. L ~n~ alla s1~1sua del no~e della
funzione square- infoDDa il compilacore che qu~ca resmwr al ch1amance un n~ultato
incero. Il compilarore far riferimemo aJ protocipo della funzione, p~r .c~ncrollare.. ~e le
c:hiamate a s quare contengano il tipo di riromo correrro, il numero e 1 cip1af'propnan per
gli argomenti e che questi siano forniti nell'ordine corretto. I prococipi di funzione sara.Jino
trattati in dettaglio nella Seziaoe 5.6.
Il formaro d una definizione dj funzione

Dimenticare di rertituire un valore da una funzione che dovrebbe farlo potr condurre a erro1i inattesi. Lo standard ANSI stdbilisce che il ris11lt11to di questo tipo di omissmi sar indefinito.
Error tipico 5.4
Restituire un dato dtt untt funzione il cui valore di ritorno sia stato dichiarato di tipo
void provocher. un errore di sintassi.
Buona nbitudin 5.4
Stabilite sempre in modo esplicito il ripa di doto restuo, anche se lo, sua omissione farebbe
restir:uirc un int per default. Il tipo restituito da main, invece, normalmente omesso.
La lista dei par4men-i un elenco concenc11re le d i.i:hiariu.ioni dei paramelri, separati da
virgok, c;he saranno ricevu ti dalla funzione quando sar richiamata. Qualora una funzione
non riceva alcw1 valore, la lista deiparnmetri s:u void. Il tipo di ognuno dei pata:nerri
dovr essere specifcaro esplici(amente, salvo che .non siano di tipo int . Infimi, qualora
non sia scaco specifcarq il con~pilacore presumer che si trarci d i un int.

Errore tipico 5.5


Dichiarare i parametri della funzione, qualora siano dello stesso tipo, usando la fimna
float x, y invece che float x, float y. La dichiarazione flost x, y in realt renderebbe y un parmnetro di tipo int, poich int il default.
Errore tipico 5. 6

! ul'z iJrrore di sintassi inserire un punto e virgola, dopo la parentesi destra che chiude
l'elenco dei parametri in una definizione di funzione.

tipo-del-valore-di-ritorno 11ome-delln-fitnzione(lirta-dej-paramem)

131

Errore tipico 5.3

Inserite una riga vu()ta tra le definizioni di funzione, per separarle e aumentare lo leggibilit
det programma:

printf(''%d

LEFVN7.IONJ

Errore tipico 5.7

dichiarazioni

,! rm errore di sim-assi ridifini;e un parametro d~Lla funzione come variabile loc11le alla
stessa.

istruzioni

di.

Il nome della funzione un qualsiasi idenrifcacore vilido. Il tipo dei vawr:e ri~rno quello del risulraro restituiro al chiamame. Il tifo def.:valore di ritorno void tnd1ca che un-a
funzione non resruir alcun valore. Un tipo det valore di ritorno non specificato sar sempre conside~o un int <dal compilatore.

Errore tipico 5.2


Omettere il tipo per il valore di rirorrw in una definizione di funzione causer tm errore di sintassi, qualora il proeotipo della fimzione specifichi per il valore di ritorno un
tipo diverso da int.

Buona abitudine 5.5

lndudere ii tipo di dato per ogr.1i parametro presente nel relativo elenco, nnche qualora
fosse d.el tipo di defouit int.
Buona abitudin~ 5. 6
Per quanro non sirf. scorretto farlo, non utiliuate gli stessi nomi pttr gli argomenti passati fl una fimzme eper i corri.rpondenti parametri inseriti nello, relativa definizi.one.
Ci aiuter a evitare ambiguit.
Le dichiarazioni e le istruzioni inserire all' imern delle parentesi graffe for.mano il
cotpo della j.nzione. U cor_p della fum.ione chiamato an~he blocco. Un blocco semplkemeni:e un'i,muzione r:omposta che include d elle dichi:arazioni. Le variabil i potranno essere

CAITI'rn.O 5

152

di'chiarat.e in qualsiasi b locco~ questi pottanne ess,~re nidificati. Una fitnzione non pu..rnai
l!s41t .4ef'1'iitil "aitintenw r.li u1la/.trt1 fonzffJ..tre.

El
~

Enw:e tipico 5. 8
Defi.nire una. funzione all'interno di un!aftra funzione im errore di J'intassi.
Buona abit11Jd.in5. 1
Scegliere dei nomi. difunzione e. di pttrllmetto.sig11#ficaiivi i'rtndrl/. i progrtli'!lttI pif.t le%2}.b/.li
e ahtter a eu.itar.e L-'itsn. eccessivo d commenti.
lngegt1flria del rtiftwm 5.5

133

S.6 I prototipi di funzione


Una delle p i impga~~crsrilie ~lrANSJ il prowtipo di,fatizio~ncpmimw.ddi'ANSl
pr~~ in pre,stito quesra. Gtt:arreriscica dagli syil.npp-ar0ri del t++. Un prorocipo di fu.niioe
inl.ica aJ compiL"U,or;, il cipo dd dam tesri'PJJ-rv cblla fun~ion.e, il nurnerb dei p~ameai.clie quella
si aspecra di r.ieev~:~, il cipo dci paramerri e l'ordine in ui questi sono arresi. Il tompilacore
utilizzer i pro:tot!ipi per<ZQovalidare le cliia.mare di funzione. Le versiohl prci:edent'i del e non
eseguivano qucsm tlpo di cnn:ollo, perii:i era possibile richiamare !e funzioni in m0d0 impro~
prio senza che iJ compilarote individuasse degli euori. Dmante la fuse cli esecuzione, tali .c:hia,.
mate avrebbero poruri;i 01usare degli errori furali, Q anhc; npn ~<ali, m~ che avrebbero provoato gegli erro~ lqgici $ubdoli e difficili d:t inclivJdua.re. I prororipi di funzione dell'ANSl C
p<>.ngono rim:ediq a questa la.cuna.

Una ftmzin non dovrebbe essere pi L1mg4. d.i i1:Ua pO:g/n11.1v1;eglio ancora,, 11-1111 jtnzione non do11reb'be es.sere pi lu.nga di una mizza pag:i.a,. Lefo'ri$iorii picolif fo.voriseono la riusabilit dei sofiwa111:.
.

1 * Trovare i l. mC1,ggiore di tre interi "/


#in~lude <std i o.h>

]ng'f;flleriu, del !Oftware5.6

m:ain ()

I prgrarhmi dovrebbero essere scritti come cq[Jezio'tli di fim~i.n~p.iccole. Ci ti tende.rn pi semplici da'scrivere., c'Oi/audt1r., mitt.ere n. pttitto e modifica.re.

r1l:l

printf ( 11,Enter thre-e integers: 11 ) ;


scanf(-%d%d%d , &a, &b, &e);
printf( 11 Maximum is: %d\n 11 .J m.a.x.imum(a, b, e::.));

Und.fa.i:i::itit. chericbiet:/4. u~,gil~n nt.f;ntro:diprmettip'(ft:rebbul_o'l/.P-wolgel'e troppi compiti.


Gniitfertttet/ po1sibilim di SJ4d.i.vidrla in funzmi pi pitcok che tef.gt:lit:Jto de.i ciimpi#
diliimi.. Eitestazme del/afimzion tlovre.bbe 1ientrare in 1d14 rigtJ.., se passi.bile_.
lt.tg~gner.ia dei softwq,re 5. 8

l/.pi<itotip.a, l'in.t{tjzjori' '4 thi4J?'Nft4.d4/liffi~urie dovrbhehl l'u/fi onor4/fre 11eln1mtero,


nei tipotJ nell'Ordine dgli. argo.ftpiti edei pariiinmf. oltre cb.l"1Jl tip.o d.el ualbr tes:ti.tJJi't/J.
E$j~tjn9 tre; mg~i pc;r (~cit\,lire i] pmr_qllo al puntq i.n cui una funzigpe

retu r n 0;

1* Defi ni.z_ion-e della funzione maximum * /


int max_imum(i.nt x, int y, int z)
{

int

srara i.tw0cm~

espressione;

restituir a1 chiamante il valore del!' espressi.one.

Il no~tio-second~ sempie .utiliziJ: 1.ali:u:,ionemaximom defnirn dall'ueen.ce, per de..terroinar e .resrituir il .rD.a~iore fra rr.e inreri {Figura ).Zi). I rre interi s:a:rann.0 presi in
input con sc~nf. In seguiro, gli inceri saranno pass.ri lla .funzione maxirilum che derer;:mineF quale sia il roaggime di essi. QueStO val'oJie sara resmitO aJ ma i n dfil'isrruzi.oae
re:turn deI;!. funz.lone maximum. 11 val~r.c: :r~rituiro sar assegnato alla variabile l argest
he ~ v1~1,1a!izta in s(lgito ..d.a printf .

= ~i

H (z > max)
max

r:-turn;

~etur~

max

i f (y >= max)
max = Yi

ca. N:Gl casp io cui Ja l.m:do'.ne non re.s.tiruisca alcnn risulta.Co, iJ controllo sar r~cituito
sempliemcm,.r qua,nd!) sar r~ggiunra. l;i p:aremesi graffa destra che ch.iude la. fun~ione,
oppure .ei;egueud l'isrrnz1cine
Nel caso che la flmzi0ne rescitujsca .un risultare, J'is.rmziohe

dell.a f. unzione

i nt a, i. g;;

lngegn'ria del s-oftware 5.1-

I"' (1rito'tipQ

int maximum(int, nt, int};

= z.;

return max;
}

linteP 'l:fr.-ee in,1:e:gers:

2~

85 H

Mtttdrllu(ll is: 00

Ente.a tllooe i(lte\QEHis : 85 .22. 17


Mpxd.rnum is: 85

Enter ttrr.:e'El :llnte,ger..s :

.22.

17 8&

Matcimuf!l is;: 8'5,

Figura 5.4

la funzione maximum definita dal progr?mrnatore.

*f

CAPITOLO

Buona abitudine 5. 8

lnrludete per tutte /,e fimzioni; rekttiviprowripi in nwdo da trn.rn vn.ntag,gio daUe cop1uit
di controllo di tipo implementate 11el linguaggio e Utilizzate k dirl!tti11e liinclude del
preprocessore per ottenere, dai file di intestazione op-propria.ti, i prototipi delle fimzioni incluse nello libreria rtandard. Utilizzate inoltre liinclude per ottenere i.file di intertazione
contenenti i prototipi di fimzione utiliuati da voi e dai membri dei vostro gruppo.

Il procoripo di funzione per la maximum dellii.Figura 5.4

135

L BFVNi.'.IONt

Le regole: di promozione si applicano automaric:ameme alle espressioni che contengono dei


valori di due o pi cipi di daro, derte anch.e espressioni di tipo mi.sto. Ogni valore in un'espressione di cipo misco sar promosso aucomacicamcme a quello pi alro dell'espressione (in realc,
sar creaca e urilizzata w1a versione cemporanea cli ognWlo dci valori: quelli originali rimarranno invariati). La Figura 5.5 elenca i tipi di dato nell'ordine da quello pi alto a queUo pi basso,
con le relative specifiche di conversione per printf e scanf.
Specifiche di conversione
per printf

Tipi di dato

Specifiche di conversione
per scanf

int maximum(int, int , int) ;


Quesro prototipo di funzione stabilisce che maximum ricever re argomenti int e restiruir un
risultato dello stesso tipo. Osservare che il prorocipo deUa funi.ione maximum uguaJe alla prima
riga della sua definizione, eccetto che i nomi dei paramecri (x, y e z) non sono stati inclusi.

Buona eibitudine 5.9


A volte, i nomi dei ptll'tJTtietri sarann incli1si nei prototipi di funzione pet scopi documenmtivi. In ogni modo ii compilamr' li igm7rrit_.
Errore tipico 5.9
Dimenticare ii punto e virgolo alla fine deL prototipo di funzione provocher un errore
di sintassi.
Una chiamata di funzione che non corrisponda aJ suo proropo provocher un errore di
simassi. Sar generato un errore anche qualora il prmopo e la defn.izione della funzione non
concordino. Per esempio, se il prococipo della funzione nella Figura ?.4 fosse sra.co serino come
void maximum(int , int , int) ;

il compilatore avrebbe generato un errore perch il po di ritorno void, indicato nel protocipo
della funzione, sarebbe scaco dive~o da quello int specifc::aro nell'inn:sraziooe della Stessa .

Un'alcra imporcanre cararceci.scica dei procoripi di fu.azione la com:izione degli argomenti,


ovverosia la amversione forzara degli argomenci al ripo appropriaro. Per esempio, la funi.ione
della libreria macemacica sq rt porr e.ssere richiamata con un argomento incero, fi.ul.Zionando
ancora correcramente anche se il suo prototipo in math. h specifica. che l'argomento debba
essere di tipo double. t:iscruz.ione
pr'int"f (" %.3f\n 1'

sqrt (4));

valurecl correrramence sqrt ( 4) e visu.afuzer. il valore 2, 000. n protecipo di funzione f in


,modo che il compilarore converta il valore intero 4 in qudlo cli tipo double 4, 0, pdma che lo
'Scesso sia passare alla sqrt. ln generale, i ~alori degli argoin~n.ri che non corrisponda.no precisamenre ai cipi dei para.merci defoci nel prococipo s.rnno converri:ri in modo appropriato,
prima che la funzione sia richiamata. 1li conversioni po.crebbero per causare dei risulraci
scorretti, qualora non fossero rsperrare le regol di. prortJozione del C. Tali regole specificano in
quale modo i vari tipi dj dato possano essere convertiti tra loro sem..a perdita di informazioni.
Nel nostro esempio con sqrt, un int sar convertiroautomaticuneme in un double senza che
ne sia modificaco il valore. Nondimeno un double ~oovertito in int troncherebbe la pane
fuu.ionaria del valore double. Anche converrire i ripi pi grandi degli inreri in quelli pi piccoli
(per esempio, un long in uno short) potr produrre dei_val.ori modi:frca.

l\slf
long double
l\sf
double
l\sf
float
unsigned long int
l\slu
long int
!lsld
unsigned i nt
!lsu
int
l\sd
short
l\shd
!\se
char
Figura 5.5 Gerarcha di promozione per i tipi di dato.

\Lf
\lf
\f

\lu
\ld
\u

l\sd
l\shd
\e

Convertire dei dati nei cjpi pi bassi produce normalmente dei valori scorrerti. Di
conseguenza, i valori potranno essere convenici in un tipo pi basso solo assegnandoli
esplicicamence a una variabile di ripo pi basso, o utilizzando l'operacore di conversione. 1
valori degl i argomenri d i funzione saranno convertici ai ~dpi dci parametri defin iri nel
relarivo prororipo, come se fossero stati assegnaci direrramencc a variabili di quei ripi.
Qualora la nosua funzione square che ucilizza un parame.rro incero (Figura 5.3) fosse stara
richiamata con un argomenc:o io virgola mobile, quSro sarebbe sraco converrito in un int
(un npo pi basso) e square avrebbe resruiro un valore sco.rrerro. Per esemp.io. square (4 . 5)
resrimirebbe 16 invece di 20, 25.

[iJ

Errore tipico 5. J O

Convertire w1 tipo di dmo pi alto, rispetto 1tlla gerarchia di promoziom:. in uno pi


basso potrh modlfic1m1 iL vawre dei dati.
lL compilatore forme r un $UO prorodpo di funzj9ne, qu;tlo.ra questo non sia staro
incluso in un programma, urilitzando la prima qi;:arreru:a del.la fll.flzione: ovverosia. la
dfni.i iooe o una sua chiama.ca. Per default, il compilacore assumer che la funzi one rescicut...-ca un. int e non presumer nulla relacivam.ence agli .argomemi. Ne consegue che, qualora gl i a.rg0menri passati aJla funzione non siano corretti, gli errori non sarann o individuaci dal compilatore.
Error~

tipico 5.11

Dimenticare un prototipo provocher un errore di sintt1.ssi, 9ualora ii ripo restituito dalla


funzione non sia un int e la definizione di quei/a appaia nei programma dopo una sua
chiamata. In caso contrario, dimenticare iLpr(!t(Jtipo di una ftmzme potr causare tm
errore durante la fase di esecuzione, oppure u11 risu./tato inatteso.

136

CMrro.LO 5

Ingegneria del software 5.9


Un prototipo inserito all'esterno di ogni defini:.one di fimzme si applicher a tutte le relati vi: invocazioni che appariranno nel file dapo il prototipo. Un prototipo
inserito a/L'interno di ima funzione si applicher so/o alk chiamate eseguite all'interno
della stessa.

S. 7 I file di intestazione
?gni Libreria standard ha un rorrispondenre file di, ir:te:rtazibneche ronriene i prototipi per tu ree le
tunzioni incluse in qudla libreria, olrre che le defnizioru dei vari tipi di daro e delJe cosrami
oecessa.rl a quelle funzioni. La Figura 5.6 elenca alfabeti<::ameme i file di intestazione della
libreria srandard che potranno essere inclusi nei programmi. Il termine "macro", usato diverse
volte nella Figura 5.6, sar rrarrato in dercaglio nd Capitolo 13, "11preproces.5ore".

137

lEFUNZIONl

File di intestazione
della libre ria standard
<stdd~f. h>

Comiene le defnifjoni comuni dei tipi di daro utiliz-Lari dal

c per eseguire cenj calcoli.


<stdio. h>

Conriene i prototipi per !e fun7.ioni d i inpuc/ourpuc della libreria s1.andard e le informazioni utilin.ate da queste ulrimc.
Contiene i prorocipi delle l;nzoui per 1a conversione dei numeri io ceSto e viceversa, p.r l'allocazione della memoria, per
i nwneci casuali e per altre funz.iouidi ulit generica.
Contiene i promcipi delle funzioni per l'elabora;o,ione delle
srrtogbe.
Contiene i prororipi di fuzine e j [ipi per la manipolazione
dll'o.ra e dllc dat,e.

<~tdlib. h>

<string . h>
<time.. h>

File di intest azione


della libreria standard

<assert .h>

<ctype.h>

<errno.h>
<float.h>
<limits.h>
<locale.h>

<math.h>
<setjmp.h>
<signal.h>

<stdarg.h>

Spiegazione

Conriene le macro e le informazioni per aggiungere delle


istruzioni diagnosridie che forniscono un aiuco duranrc la
messa a punto del programma.
Contiene i prototipi per le funz ioni che verifcano talune
propcier dei ca.rarrcri, nondi per quelle che porranno esse
re utilizzare per convertire le lettere minuscole in maiuscole e
viceversa.
D efinisce le macro che saranno utili per comunicare le con
dizioni di errore.
Contiene ~ limiti del sistema per la dimensione dei valori in
virgola mobile.
Contiene i limjci del sistema per la dimensione dei valori inceri.
Conciene i prorodpi difuazio:ne e alrre informazioni che conseo
tiranno a un pro~ram:ma ili essere ada[tato alla localit in cui
sar eseguito, La nozione dj localit co:nsenre aJ siscema di gesti
re le diverse convenzioni delle-varie aree del mondo per espri
mere infori:naziqpj c0 m<;; la dara, l'ora, la valuca e i grandi
numen.
Concieoe i protocipi per le. funzioni della Libreria matemarica.
Contiene i prototipi per le funzioni che consentono di aggi
rare l'usuale sequenza di chi<1mara e ritorno da Funzione.
Contiene i prococipi di funzione e le macro per gestire le va
rie condizioni che porranno insorgere durance l'esecuzione
del programma.
Definisce le macro che conscritono di gestire delle funzioni
per le quali il numero e i tipi d~i argomenti siano sc.onosciuri.

Spiegazione

Figura S.6

I file di intestazione della libreria standard.

Il programmatore poc:r creare dei file di inresrnzio.ne permnalizzaci. Anche i me di inccsrazione definiti dal programmatore dovranno rerminare in . h e potranno essere inclusi utilizzando la dlrettiva del preprocessore #include. Per esempio, il file di intestazione square. h
potr essere incluso nel nosrro programma dalla dlretriva
#include square.h "
posta all'inizio del programma. La Sezione 13.2 fornir ulteriori informazioni sull'inclusio-

ne de.i fle di inresrai.ione.

5.8 Invocare le funzioni:


chiamata per valore e per riferimento
ln molti lillguaggi di programmazione esisrnno due moru per invocare le funzioni: la
chittmatt1 per valore e la chirm111tn per rijrimento. Quando gli argomenti saranno passati in
una chiamata per valore, sar preparata una copia dei loro valori e questa sar passara alla
funzjone_cb!amara. ~e modi~che efferruate alla copia non inreres.seranno il valore originale
della va:rn1bile definita nel chiamante. Quando un argomento sar passato in un.a chiamara
per riferimento, il chiamanre eonsemir efferrivameme alla funuione chiamara di modi.fcare il valore originale della variabile.

Le chiamare per valore dov,rebbero essere ucilizzare ogniqualvolta la funzione chiamata


non abbia la necessit di modificare il valore ddla va:riahile originale defLllita dal chiamante. Ci pr.ev.e rr gli effetti collaterali accidcmali che inrralciano pesanremente lo sviluppo di
sisremi sofrware correrci e affidabili. Le chiamare per riferimemo dovrebbero essere urili1.zate solo con funzioni affidabili che abbiano bisogno di modifcare 1a variabile originale.
In C, curte le chiamate di funzione sono per valore. per~ possibile simulare la chiamara per riferimento, come vedremo nel Ca.pirolo 7, urilizzando gli operatori di indirizzo
e quelli di deriferimenco. Nel Capirolo 6 vedremo che i verrori sono passad aurornacicamenre
con una chiamata per riferimento simulata. Dovremo aspettare fino al Capitolo 7 per una
piena comprensione di questo complesso argo memo. Per ora, ci concenrreremo sulla chiamata per valore.

138

CAJ'ITOLO

Generazione di numeri casuali

S.9

LE FUNZIONI
{

int i;

Ci prenderemo ora un breve e, si spera, diverrenre diversivo con una popolare applicazione della programmazione, vale a dire la simulazione e il gioco. In questa e nella prossima
sezione, svilupperemo un programma di gioco ben strutturato che includer moire funzioni. 11 programma utilizzer molre delle strurrure di :onrrollo che abbiamo scudiaro.

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


printt("%10d ", 1 + (rand()% 6));
if (i % 5 == 0)
printf("\n");

C' qualcosa nell'aria di un casin che rinvigorisce ogni tipo di persona; dai giocatori
incallici che aaomiano i lussuosi cavoli in mogano e felrro per il gioco dei dadi a quelli che
infilano monetine nelle macchinerre mangiasoldi. l'elemento della casualit, la possibilit
che quesra possa convertire una manciata di monere in una montagna di riccheuc. I.:clememo della casualit pu essere incrodorto nelle applicazioni per compurer, urilizzando la
funzione rand della libreria standard del C.

ret urn 0;
}

5
2
5
:5

Considerare la seguenre isrruzione:


i

r and{);

La funzione rand genera un intero coh1p.reso rra O e RAND_MAX (una cascame simbolica
defnita nel frle di incescazionc <stdlib. h>). Lo standard dell'ANSJ stabilisce che il valore
di RAND_MAX debba essere almeno 32767, cli and 1 il v;tlore massimo per LU1 intero di
due byte (ovverosia 16 bic). I programmi di questa sezione sono stati coJlaudati su un
siscema C con un valore massimo per RAND_MAX di 32767. Qualora r a nd generasse davvero degli inceri a caso, ogni numero era Oe RAND_MAX avrebbe la scessa possibilit (o probabilit) di essere scdco oglli volra che r a nd fosse cichiamaca.
L'imervallo dei valori prodorri direccamenre da rand spesso differente da quello che
sarli necessario in una specifica applicazione. Per esempio, un programma che simuli il
lancio di una monccina potrebbe cichiedece solcanco O per "resca" e 1 per "croce". Un
programma che simuli iJ lancio di un dado a sei fcce richiederebbe degli inceri compresi
nell'incervallo da l a 6.
Per mostrare l'utilizzo cli r and, svilupperemo un pregramma che simuler 20 lanci di
un dado a sei facce e visualizzeremo iJ valore onenmo da ogni lancio. li prototipo per la
funzione rand pu essere rfrrovaro in <s t d lib . h>. Uri.lizzeremo l'operatore modulo(%) in
congium...ione con rand nel modo seguente:
rand() % 6
per generare degli inceri compresi nell' interv<Jo da O a 5. Questa opct"azionc si chiama
1-iduzione in scala, mcnrre il numero 6 detto fattore di scafa. ln seguiro trasleremo l' intervallo dei nwncri generati, aggiungendo l al nosuo ristJtato precedencc. La Figura '5.7
conferma che i risultati sono compresi neltinre.rvfillc:i da 1 a 6.

Per mosrrare che questi numeri si presnterann6 approssimat:ivamence con la stessa

probabillr, simuleremo 6000 lanci di un dado con iJ programma della Figura 5.8. Ogni
intero da 1 a 6 dovrebbe presentarsi approssimacivan1eme 1000 volre.

/* Gli interi, ridotti in scala e trasl_a ti, generati da 1 + rand() % 6


~1

#include <stdio.h>
#include <stdlib.h>

ma in ()

139

[
Figura 5.7

3
2
2

5
5

14'

Gli interi, r idotti in scala e traslati, generati da I

randO o/o 6.

/* Lanci a un dado a sei facce 6000 volt.e */


#include <stdio.h>
#include <stdlib.h>

ma in ()
{

int face, roll, frequency1 = 0, f requency2


0,
frequency3 = 0, frequency4
frequencys = 0, frequency6 = 0;

0,

tor (roll= 1; roll<= 6000; rol~++) {


+ rand() % 6;
tace =
switch (tace) {
case 1:
++frequency1;
break;
case 2:
++frequency2;
break;
case 3:
++frequency3;
break;
case 4:
++frequency4;
break;
case 5:
++trequencys;
break;

{cominutt)

14.0

CAPITOLO 5

6:
++f requency6;

break ;.
}
}

Nella Figubl. 5.9 m0.sr:fato t',miliizZ<;> della. fum.iqne srand. Nel prqgrarnma utilizziamo il tip0 di dar un s i g'ned.1 cli unabbrevaz.io1tpe.r un s i gned i nt. uni nt immagazzim1:r in. alm:c.no d!:! byre di tncmJia e pu wntenere valori. posicivi e n.ega:vi. Aoche
una v.liabil cli rip n signd iftu:RagaZizina.ra in almn due byte di memoria. Un
unsigned i nt di l.ue byte pu conrenere s0lcanc0 valori posit ivi compresi nell' inte.r:vallo
da O a 6B5~5. Un uns ~g n_ed i nt di quattro byre pu avere solo valori posiii:vi omprnsi
ne!l'int<;.FVailo da O ;i 4294~6729?. La funzion:e -srand ac.Get:ta come ai:goa:reuro Ufl v;tlqre
1,m ~igned . La ~peci-fca di <::QnVsine \u uriliz?-ata p:e.r Ie;gg~e uo yafo.re. unsgned c0n
la fi.uni0n scanf. TI prQ.to-i;ip,o di funzione pers r and si, trova in. <.s tdlib . h>.

printf ( "%S%13.s \ n", " Face:'' , ' F-reqy,en'.~Y" J;


pr.intf("
1%13.d .\n ff ~ fre<Juency1);
pr)..ntf ( '
2%13d \ n ff , frequen.cy :n;
printf("
3%13.d\n ''., f-requnc'y3);
printrf ("
<t%qd\n", frequeh.c y4);
prir.ltf ( p
!:!.%13d \ n 10 , trequencys};
printf('
.o %13d\n" , tre.quency6);
re.t urn 0;
1

aat
9.6~

Qualora volessimo randoIIJ..izzan: senza la necessita di imrnetwre un se.me qgni volta


porremmo milizz;_rre un'i:sm.izi,ooe c:ome:

10~.

9;74.

11004

11/l~

Figura 5.8

Eseguiamo diverse volre il programma e analizziam9 i risulrari.. o~srv~e cilie ~i ott~r


r una sequem.a diversa di numer.I casual i ogni volta clie iJ pr<'lgramma sa4 eseguito,
pucch ve.i;lg;i fornito un seme diffe~enre.

Fre<111ie.n ifl~

1
:2

srand(tme(NULL));

Landare 6000 vo!t un dado a si fa~c.

Riducendo in scala e rraskn.d:0 l 'i:nte.rvalfo, c;o!Jle mustra l'putput del programma, al;>bi_wie. miliz.t(lro la :fu4tjon~ ran.d p~r s:mula.te re;ilisricamente il lanci9 di un chdq 3 sei
facc~. Qsifetv.ar th' nojl 'Staro fO.miro itessim GL,s~:r ru d~faul t ueJ.ia strattu111 SWtCh.
Osseiyate anche J' urilia.o della sp:ecifka di cnvei:si0ne %s per virualizza.Ee le stringhi: cli
carneri " face ~ e 11 Frequency 11 ~<.mi~ ihresraz.ioni di ctilenna. Dopo aver midiatO. i vettori nd Capitolo 6, mostreremo come sostituire elegantemente l'i'nrera srmrrura swtch
9J1 1,1n'i$~z.ine di una ~9J~ riga.

&eguendo nubv.amem:e i:! programma de.Ila Figura 5.7 si produrr

4
'3
1

2<

5
!ii

141

in g\:lrgo rm1d01ni~o11ce (da. random, a caso) c;;d ~ ($eguira. con la. funzione s rand della
l_ib.r:eri~ St:).,0<4fd. La funzio ne. s rand ricey~ uri rg6meur0 inrcro uns i gned e /11jemi1:1a la
fumone r and, in modo da indurla a generare una diversa s:cqutnza di numeri casuali ad
ogni c:Secuzifle del p.rgramma.

crn~e

~~

l.F. FUNZ.ION)

'5

5
'5
2

f$.q
j

Ql,lesta in:durre.bbe Uocnputer a leggere il su9 orologio interno _r;i.er ottenere a:uro.m.acic;;amnr n v~lor~ per i.I seme. La fon.tlone time restituisc~ l'om cqm;nte clej giorno e:Spn~ss.
in sec.oodL Qu~sro valer!;: sa.r. colivefcim. in uo ~m li.cii:z;t segn e uri.lizzato d>i:i:l: seme
per il generatore cU numeri casuali. La funzitme t me riceve.. come argomento NULL
(nor.tti.iil.mnr.e t ime :i1 gra:do di forci:r al prdgrammarme un. s:rr.inga &e rai:prese.nra
l'ora .del giorno; iJ NULL dsabilirn appunro quc:;sra capacii per una chiamata speoifca di
time). Il premripo di fwl1..ione per time iu <time . h>.
!* Randomz_a re i l pr.0g P.amma .di lan.e io del dado *I
#.inclu.de <stdlib. h>

#J ncJ, ude <'St di9 . h>


ma:in ()

Osservacc che srara visuaJizza~a la sressa sequenza d i valmi. C:ome JlOSsibile che siano
dci numeri casuali? i ronicamente, 'iuesra riprod ucibili& essenziale per cfunostrare che le
:;o uezioni ~ un prngramma fW12i0nano apprnp.ri.arame.nre:

La fu.nzi.oo rand ,gofa in rl.Lt dei mlmeri pseudottasuati. Rid1un:i.ndc;uipemtamenrn


ra:nd> s prodmrebbe utia sequen7.a, di numeri che sembra essere Gasuale; 1n realt; la
sequenza si ripeE~~:c- ogni volra che il programma sar. eseguiro. Una volra che il programma
~a,.r. stato eompletarneate m ~o a p,untQ, pot r eS.~e1e cond.iz.ionaro in_m0cl0 ~ produrr:
,una sequenza diver~ di m.J..01C<ti c<I,SQ.al.i a5'\ ogni sua eseeut.iohe~ Qw~ca op.raZione der:ra:

int

i j

unsi~ned

s'eed ;

printf(" Enter seed: ")i


scanf( ''%u 1' , &S"eed);
$r and.(seed);
for:: (i = I i i <= i 0 i i++) {
pr.inti("%1 0d'1 , 1 -~ (r~nd()

==

f ( % 5
0}
pr-i!lt f( 11 \ n".) i.

% e))i

143

lA-2

facce r1olr:e. ve.i-so l'al'io. Nel e.oso "'4 sorttrtUJ. fos.se 7 o 11 4/ primo tiro, iL gi.ocittre avrebhe
uinto.. Nel Cll$O che lr.i. sommafass.e 2, .3 il 12 iii primo tfro {detta "crtips"), il giocatore avrebbe
pmo. (ovvurosia tt.vreb'be vinto il "banco"): Nit ctt.so fa somma fosse 4, 5. 6; 8, 9~ o 1 (:) -a l
pdrno t:o, 11l/~m quelf.a s.011V!17fl div1J1iterebbeit punteggio" dci giocatore. Per vincere, si deve
i;oirtirr u.ai-e a Ultzciare i d4di ftno 11 '.'attrentie ii vostro pimuggi_q ''. 11 giocar:ore pmlerebbe

return 0;
}

,
[ s

Etit~ ,geti:

fP1

"

:3.

6111~~1" ~e,a:

1
1

\ tf2

.4

_2-,

4,

.Eh)~ ,dea~ 6V

6
6

<~:

Figura 5.9

! valop

6:

-3

4
2

Rndomizirii programma di lancio del dado.

prodotti cl.ir.et:t~ente da rand s,ono sepiptt Col.llp~esi ndl'incervallo:

0 = rnd ( )

= RAND""""MAX

fn p.rec;etl!'.!-nta abbiam9 mo,sp:ato ~ome srivece una singola. i'struzon~ C p.er simulare il
tap:cio d.i J.J n dad0. <t si fac,c~:
tace = 1 .r rand() %. 6j

Q~~l:;l ismii9ne.4~egne~ alla v.arabilface sempre un val.ore intrn (:Scelto a a:so) 'C'.oi:n,pres.b
nell'.inr&-vallo 1 = face = 6. Osservate .che l'mpierut. di qnest lrirervallo, in alue piol la
qillmci.ffi dj inreci consecucivi oompresi nello sresso, sar 6 e d1e il numero di pan:em..a sar 1.
Facndo riferi.mente all'.istn.1.zione pn~cedente, nornre.m.o che l'arnpiema dell'imervall0 S,ar gererminata da:l valore u~to pt;l ri9urrela sca:la rand cqn l'oper:irore moduJo (owerosia-(i), e
che il num~ro. di part~ dcltn.tervallq sar guale a quello eh~ sar stato aggiunta ~ rand ' 6
(pvvergsia 1). Possimo ~cneralizi.ate' ~tiesto tisul.tato ~me segue-:

n =oa + r.and()
dove a ~r~

%b;

il valore di tri/~on (di sa..r uguale.al primo numero d,ell'intervallo d nreri

q11{l(r(I r:eajrR:-Zf!Sse .i~rJ. 7 prim.tt /i o"tft)1er il pri,J?rio pu.nte-ggi..

11 prngpunrna nella F~ura 5,.1.0 simuler il sudderm gioco di dadi. La Figum. 5 .11 mostra
di"1ers~ es~ioni

di

es~mpi .

Osse!'Vat clie .il gioQi:rf.e cl:v-r~ lanciare due dadi con il primo lancio e d.ovr far.e
altreu:anro pi nirdi. con quelli su.cc~siv.i . Definiremo Wl.a fum:ione rollDice pe.r Lanciare
i dadi e calcolare e visualizza.re !almo soJil.Jila. La funzione ro11D.ce sar de6.nica urra sola
volta, ma sar invocata .in ciu pumi del .,pr!;)gram:ma. interessante norare eh.e rollDi.ce
nm dever argontend ~ che. perci abbi.a.mo indkam void nella sua l.is.ta dj paramcrri La
funzi one rollDice rescicwr la sorti ma dei d.l.te dadi, pcu;cib nell'itu~r:io.b.e de.Ba funiio1,ie sat iridica.to un tipo di rirorn int.

n gioco ctbbasumza complicaro. li giocato.re porr vi_nere o :Pet~r con il primo


lancio, oppure potr vincere o perdere q:m qgnu.no di quelli s.vccessi,.,i. La. variabH~ g~mestatus
stani w:lizzara proprio pej: mmen:ere traccia di curo ci.
Quando il gi([l~Q sar sr~ro vinro, al primo lan<eio o a quelli successivi, gameStatus
sar i.qiposta.ra a l. Quando iJ giqco sa.d. stato perso, al primo lancio I) a quelli. succ;essivi,
gamestatus sar~ .imp0sr.ar:i..- a. 2. ln nmi. gli al!ri c;tsi gam~St_a~us varr zcr.o e il giocq
dovr c.ndnuare.
I* Crap-s ii I
#'include <s td'io. li;?#'i n.clude <stdlib. h>..
#in cl.ud.e <t "ime. h>
int roHD.ice(void) i

main ()
{

t:Ohsecucivi desiderato); ,mentre b sar il faccore di scala (che .sar ugual.e all.a amf>i~z
deU' inrervaJ.lo di interi consecutivi desiderato). NegJi esercizi, vedrem0 che sar possibile
sce&llere degli inceri -a i;:aso provenienti da insiemi di valori diversi dagli intervalli di inceri

i nt gamStatu.s , sum, myPoint;

c0nsec.utivi.

sum

I* primo lancio del dado

switcf1 (-sum) {
case 1 :. case, 11:
gamest-.;itus = i ;

/~ v~nce

Errofe tip.ifo. 5.. I 2

Util.zZttre srandir.zvece.di rand per t,ene1iare dei numeri casuali.

5. 1O Esempio: un gioco d'azzardo


Uno dei gi~li d':tl.!za.ajg pr p9p94i.ri qndlo dei d;i.di conosi_u.ro com "mps"" (tiro sfumu:i;it9), che:-& gioc;a~o 1,1ei ca:s.in .e 11~i 'ricali d tlllt U riind$. Le regol d:.l giofo sono semplici:

Un giocatore iaricia due dadi. Ogni-dado ha seifire, 'QJ,estefm-c.ontengono 1~ 2, ~?. 4, 5


e 6,puntini. Dopo che i tfn,di si Sflr.i1n;1 formati, sicakoLrlf, !:a somma dei ptifltinJ !tf/le'!/{{e

sranl(tilile(NUH))i
= roliDi ();

br.eak;
ease 2: ease 3 :. case 12:
2I
gameStatus
break;
default:
9.ameStatus = 0;
rny.Point = sum;

i< J

al prlmo l ancio */

/'* perd.e a.1 prlrn

/* memorfzza

lanc io * /

i l punteggi

1'

i
(continua)

144

CAJ>ITOLO

printf("Point is \d\ n '', myPoint);


break;

while (gamestatus == 0) {
sum = rollDice();
if (sum == myPoint)
gameStatus = 1;
else
if (s um == 7)
gameStatus = 2;

v i n~e

145

Player rolled 1 + 3 = 4
Point is 4
Player rolled 1 + 4 = 5
Player roll ed 5 + 4 = 9
Player rolled 4 + 6 = 10
Playr rolled 6 + 3 = 9
Pla,yer roll ed 1 + 2 = 3
Player t'olled 5 + 2 = 7
P.1ayer loses

I* ntintia a l anciare * /
/*

L E FUNZIONI

ott enendo il punteggi o /

/* perde ott enendo un 7 */

Figura S. I I Esecuzioni d esempio per il gioco dE;li dadi craps.

Dopo il primo lancio, qualora il gioco foss~ fniro, la srrurmra while sarebbe ignorata
perch gameStatus non sarebbe uguale a zero. Il programma proceder con la smmura
if /else che visualizzer "Player wins" se gameStatus varr 1 ~ "Player loses" se
gamestat us varr 2 .

(gameStatus == 1)
pri ntf('Play er wi ns\ n");
el se
pri ntf('Player loses\ n") ;

i f

Dopo iJ primo lancio, qualoJa il gioco 11011 fosse ancora fn ito, sum sarebbe! mem orizzata in myPoi nt. eesecuzione pr.oceder. con la si:rum1ra while perch gameStat us v~m
ancora 0 . Per produr re Wla nuova sum, rolIDice sar invocata ad ogn i irernziooe della
srrurrura while. Qualora sum couispondesse a myPoint, gameStatus sarebbe impostata
a 1 per indicare la vicroria del giocarorc, il comrollo dcll'isrruzione while fallirebbe, la
srrurmra if/else visuali?,Z.erebbe "Player wins" e l'esecuzione tcr.oUnerehbc. Qualora
sum fosse ugu ale a 7, gameStatus sarebbe imposcara a 2 per indicare la sconftca dd
giocacore, il conrrollo dcl while falf oebbe, l'ist ruzione i f I else visualizzerebbe "Player
loses" e l'esecuz.ionc cerminerebbe.

retu r n 0;

int rollDice(void)
{

int die1, die2, workSum;


die1 = 1 + (rand()\ 6 );
die2 = 1 + (rand() \ 6 );
workSum = die1 + die2;
printf("Player rolled %d + %d
return wo r kSum ;

Osservare l'imeressanre srrunura di controllo del programma. Abbiamo ucilizzaro due


funzion i, main e rollDice, e le smmure switch, while, if/ else e delle i f nidificare.
Negli esercizi investigheremo su varie interessanti carattec:isticbe del gioco dei dadi.

%d \n", d1e1 , die2, workSum);

5.1 I Le classi di memoria


Figura S. IO Programma per simulare il gioco dei dadi craps.

Player rolle'd 6+5=11


Player w;i,ns

Player rol.le~ 6 + 6
Player loses

(!(

Player roJ.led
P-0int is 10
Player roll ed
Player roJ.led
Piayer roll ed
Player r oll ed
Player wi ns

4 "' 6

4
6 "I 5
3 + 3
6 + 4
i

12

= 10
6

11
6

10

]
)

N ei Ca:piroli dal 2 al 4, abbiamo utiliuato degli idencifcaro-ri per i nomi di v<1riabile. Gli
attributi cl-elle variabili includono il nome, iJ tipo e iJ valore. In quesco capirolo, ucilizzererno gli idemificatori a.nchc come nomi per le funzioni definite dal.l'urente. In realt, ogni
.idem ificarore in un programma ha anche alui .attributi che in:dudono: la classe cli memoria,

la permam:nza (o durata) in memoria, la vihilit1} e il collegamento.

n e fornisce quamo classi di memoria indica: dal.le Jpecifir:hc di e/asso di menwritt:


auro, register, extern e static. La permanenza in memoria. di un idcmifcarore iJ
period o durante iJ quale quell'idemifcamre esisre in memoria. Alcuni idenci6carori csisrono per un rempo limitato, altri sono creati e djsuurti ~ipemramerue, mentre altri ancora
esiscono duranre l' incera esecL1zione del programma. La visibilit d i un identificatore il
punto deJ programma in cui si pu far riferimento atridemifcarore. Si porr far riferimen
co ad alcuni idencificatori in turco il programn1a, rnnm: ad alrri ~i porr farJo solo da
determinate porzioni del programma. Per Wl progr.itrii:fla farmaco da diversi file sorgcnre,
un argomento che tratteremo nel Capitolo 14, il collegamento di un idencificarore deccrmi.na se un iden rificarorc sia noro solo in quello corrente o in qualsiasi altro file sorgen te che

146

CAPITOLO 5

LEFUNZIONr

147

abbia le dichiarazioni app ropriare. Quesra sezione discucer delle quamo classi di memoria e della permanenza all'incemo della sressa. La .S~one 5.12 cUscu1em invece della visibilit degli idenrificacori. Il Capicolo 141 ''Argnienri avanzac:i", affronrer i cemi el collegamenro dell'idencifcacore e de11a programmazione con cUversi file sorgence.

il compilatore pu ignorare le d ichiarazioni register. Per esempio, porrebbe non


esserci un numero sufficienre di regimi d isponibili all'urilizzo del compilacore. la dichiarazione segueme suggerisce che la variabile. inrera counte r sia sisremaca in uno dei registri
del computer e inizializza.ca a 1:

Le quarrro specifiche ili classe di memoria: possono essere suddivise in due cipi di
permanenza: la permanenza automatica in memorid e la permanenza statica in memoria. Le
parole chiave. auto e register sono uriliuare per dichiarare variabili con permanenza
automatica in memoria. Le variabili con permanenza auromacica nella memoria saranno
creare ogniqualvolta si entrer nel blocco in cui sono scate dichiarate, esisteranno finch
quello rester attivo e saranno distrutte quando si uscir chilo stesso-

register int counter = 1 ;

Solo le variabili possono avere uua permanerrLa au.romarica ncJla memoria. Le


variabili l.ocali di una funz io ne (quelle d ichiarate nella lisca. d ei parametri o nel corpo
d ella funzione) hanno normalrnenre u na permanem..a aumrnarica nella memoria. La
parola chiave auto d k hiarer. espUcitamente delle v~Tia~ ili con perma nenza automac.ica nella memoria. Per esemp io, la seguente dihi;u~z ione ind ica c he float x e y
sara nno delle variabili locali auro mariche e che esisrera:nno solo nel corpo della funzione in cui comparir la d ichfarazione:
auto float x, y;
Le vciabili locali hanno per default uli peananenia auromacica nella memoria, perci la parola chiave auto sar ucilizzara raramenrc. Per il resro del resro, ci riferiremo alle
variabili con uaa permanenza automacica nella. memoria chla.ma.ndole semplicemente va.ciabili automatiche.

Obiettivo efficienza 5. 1
La memorizzAzione au:romatica un mezzo_per rispam1iare la memoria, poich le 11ariabili automatiche esisteranno solo fintanto che saranno necessarie. Esse saranno create qtumdo si entrer nella fonzione in cui sonQ !tllte dichiarate e mr11.1mo di.strutte quando
si t1scir1 da/In stessa.

Ingegneria del softwme 5. l O


La memorizzazione automatica~ u.n &empio del pPincipi() deL minimo P"ivilcgio (ad ogni
istante un utenre o un processo deve averetutri e solo i d i.ritti necessari per proseguire la ompurazione). Per qrtqle fnotivq)e wtiUil;ili dc111rebbe10 essere conserva.te in

memoria ed essere accessibili q1/.ando, d fatto,

7{011 sd:no

neces.silrie?

1 d ari per i calcoli e le alrre el.ahorazii;mi, n,ella. verione in linguaggio macchina d i un


programma, sono caricaci normaimerue nei :registri.

Obiettivo efficienza 5.2


La specifica di classe di memoria registerpotr essere inserita prima della dichiamzione di una variabile 11momtaic11, per suggerire 11L compilawre di conservttre la variabile in 11110 dei registri hard1u11re ad 11lt1111e/()cit detcomputer. Qualbm k variabili utilizznt~
i11tens11mmte, come i conttttori o i totali, potessero essere mantermte nei registri hardware,
potrebbe essere e/;mi1111to il costo ripetuto doV!~to tt1 caricamento deUe variabili dalla memoria
nei regimi e ali'mm11gazzi11ammto dei risultati di nuovo nella memoria.

La parola chiave regster pu essere ucili1.z.ata solo con le variabili con permanenza.
automarica nella memoria.

Obiettivo efficienza 5.3


Spesso le dichiarazioni register non sono neceSS'arie. Le procedure di ottimizzazione
dei compilatori di oggigiorno sono in grado di riconoscere le variabili utilizzare pi
frequentemente e possono decidere di sistemarle nei registri, senza che si renda necessari.a una dichiar11zjone register dD parte d,.L pr(}grtpnmotore.
Le parole chiave extern e static sono urili'l'Za.re per dichiara.re degU idenrifcarori
per variabili e funzioni con una permanenza starica nella memoria. G li identlflcacori con
permanenza statica nella memoria esiscono dal mom.ento in cui il programm.a inizia la sua
esecuzione. Per le variabiJi1 la memoria sac allocata e inizializzata solo una voi ta, quando
il programma in izier la propria esecuzione. Per le funzioni, il nome della funzione esister
sin dal momento in cui il programma inizier la propria esecuzione. Tuttavia, sebbene le
v ariabili e i nomi delle funzioni esisrano sin dall'inizio deU' esecuzione del programma, ci
non significa che quesri idenrifcacori possano essere utilizzaci in tutto il programma. La
permanenza nella memoria e la visibilit (in quali pu.nci del programma pu essere ucili1,zaco UJLilorru:) sono cose disti.me, come vedremo nella.Sezione ).12.
Esistono due ti pi di idenci6cacorj con permanenza sracici nella memoria: gli idenrifcacori
esterni (come le variabili e i nomi di funzione globali) e le variabili locali dichiarate con la
specifica di classe di memoria static. Le variabili e i n omi di funzioni globali sono
definiti per default con la classe di memoria extern. Le variabili globali saranno creare,
inserendo le loro d ichlarazioo.i all'esterno di ognj d~niz.iene di funzione e conserveran no
i p ropri valori durante rutta l'esecU?.ione del progra.mcna. Le vari<!bili e le funzion i globali
potranno essere oggetto di riferimemi da parre di qualsiasi funzione, purch questa sia
successiva alle loro dichiarazioni o definizioni all'imm6 deU.le. Q usta u.na delle ragion i per l' ucilizzo dei prorot:ipi d i fonzione. Nel momenro in i;:ui includeremo stdio. h io un
programma che r1ichiami printf, il proCO'cipo della funzione sar sjscemato all'inizio del
nostro file in modo da far conoscere al resto delle stesso il n>me printf.

~ _l~nt~e~-gn_e_r_
itt_d_e_l_wftw~
~a_1~_5_._l_l~~~~~~~~~~~~~~~~~~

Una variabile dichitzrata globale, invece che locale., consentir il verificarsi di ejferti
collaterali indesiderati, qualora tma fimzione che n.on avesse bisogno di accedervi la
modificasse acculentttLmente omaliziosamente. In generale, l'un'/izzo delle variabili glob11li
dovrebbe essere evitato, tranne che in certe situilzjll.n i in cui sitt richiesta 1m'efficienz.a
particolare (CQme sar discusso nel Ctpitolo J.ef).
Buona abimdine 5.1 O

le variabili utilizzate esclusivamente all'interno di una particolarefimzione dovrebbero


essere dichiarate locali a quella, invece che sfertl:e.

148

C'..APJTOLO

Anche le vttriabili loca.Li dichiarare con la parola chiave sta tic saranno note solo alla
funzione in cui sono definire ma, a differ~ di quelle aummaciche, le variabili locali
scariche conserver..i.nno il loro valore anche quando si sar usciti dalla funzione. Alla successiva invocazione della fum.ione, la variabile starica Loele conterr ancora il valore dell'ultima volra che si usciri dalla funzione. I.:isrruzione successiva dichiarer la variabile locale
count di tipo static e la inizializzer a l.
static int count

= 1;

Tune le variabili numeriche con permanenza statica nellii memoria saranno iuizializzare a zero,
qualora non siano state inizializzate esplicitamenre dal programmatore. (Le variabili di tipo
puruatore, di cui crartercmo nel Capitolo 7, saranno invece inizializzate con il valore NULL).
~

Errore tipico 5. 13
Utilizzare diverse specifiche di cfllSse di memoria per rm ident(fie11.1ore. A
aatore pu essere dppiicrtta solo untl specifica di cit1.Jsu di memori.il.

1111

ideutifi-

Le parole riservate extern e static avncnno w'.l significate speciale quando saranJ10
applicate esplicira.mente agli denrifcacorj esterni Nel Capitalo 14, "Argomenti avanzati'',
discuteremo ddl'uri lizzo espliciro di extern e di static con gli i.denrifcacori estern i e i
programmi formaci da molci file sorgente.

5. 12

149

LEE'UNZlON I

del blocco p ii:1 inrerno. Ci sign ifica che, durame l'esecuzione del blocco pi interno,

q11est0 vedr il valore dcl suo idcnrifcarore locale e non quello dell'identificatore omonimo
dichiarato nel blocco che lo racchiude. Ancbe le variabili locali dichiarate static hanno
una visibilir nel blocco, sebbene esistano sin dal momemo in cui inizia l'esecuzione dcl
programma. Ne consegue che la permanenza in memoria non inAuisce sulla visbilic di un
idenrifcacore.

Gli unici identificatori con una visibilit neiprototipo dijimziv11r sono quelli milizzaci
nella lisi.a dci parametri inclusa in un prorocipo di funzione. Come meoziomno in precedenza, i protoripi di funzione non richiedono dci nomi nella lisra dci parametri: solo i cipi
sono obbligatori. compilarore ignorer ogni nome incluso nella lisca dei parametri di un
prototipo di funzione. Gl i idencifcatori u.rilii:Larl in un prorotipo di funzione potranno
essere riutilizz~.ti altrove nel programm:~, senza generare ddfo ambiguic.

En-ore tipico 5. 14
.Urare accidentalmente, in m1 bloccopit. i,nJm;.o, lt; sttsso rt.MU! di rm identiflc11torC<dichiarato irJ iJn bfoG'l:IJ pi. estern q11a/(1ra iL programmato.re volesse, di fatto, che l'identificatore
dei blocco pi esterno tinumesse attivo per tutta la permanenza di quello pi iiitel'~O.
Buonrz abitudine 5. JI
Evitate nomi di wiriabile che nascondano q1Jelii co.11 visibilitlipi esrente. Ci porr essere
ottenuto evitando iremplictmente di utilizzare in un progn1mma degli identificatori duplicati.

Le regole di visibilit

la visjbilit di un identificatore la pan.ione ciel programma in cui quello porr essere


oggetto di riferimenci. Per esempio, quandu in un blocco dichiareremo una variabile locale; questa potr essere oggetco di riferimenti solo all'imemo di quel blocco o di quelli che
vi si an n idano. I quacrro ripi d i visihilir possibili per un idenrificatorc sono:
visibilit nella funzione, visibilit nelfile. visibilit nel blocco e visibilit nei prototipo di fimzione.

Le echette (un identifcarore seguito da un due punti, come start: ) sono gli unici
idemiftcatori d1e hanno una visibiljt ne!lafimzione. L~ ericbene porranno essere utilizzare
in qualsiasi parte della funzione in cui compaiono, ma non porranno essere oggetto di
riferimenti escemi al suo corpo. Le ecicherte sono utiliZ7..ate nelle scrutru.re swi tch (per
esempio, quelle dei case) e nelle isrruzioni goto (consultare il Capitolo 14, "Argomenti
avanzaci"). Le etichette sono dei dettagli di implem~tazione che le funzioni si nascondono
f unacon l'alrra. Questo oculramenw, duo p i formalnu;nte inapstdizmm~o delle injmur:doni,
uno d ei pri ncipi fondamenrali dl una buona ing~\l~a del sofrware.
Un jde11tificacore dichiarato all'esterno di qualsiasi fum.ione ha una visibilit nei file.
Un tale identif.cacore sar "noto" in tutte le funzioni incluse.fia il punto in cui quello stato
dichiarato e la fne de.I fc. Le variabili global , l~ defmizioni e l prototipi di ru rn.io ne
inseri all'esterno di una funzione hanno run;i visibili nJ file.
Gli idenrifcacori dichiaraci all'inremo di un blocco hanno una visibilit nei blocco. La
visibilit nel blocco termina con la paremesi graffa
di chiusW'a dello stesso. Avranno
quindi visibilic nel blocco le variabili locali che sono scace dichiarate aU' inizio di una
funzione, come pure i suoi parametri, che quella considera alla scregua di variabili locali.
Qualsiasi blocco porr conrenere delle dichiaraiiru di variabili. Qualora i blocchi fossero
nidificaci e un ideot:ifcacore di quello pi esterno avesse lo stesso nome di un identificatore
di quello pi mreroo, l'idcntificarore di quello pi esterno sarebbe "nascosco" fino all:l fine

0)

11 programma della Figura 5.12 illustra i problemi di visibilit relativi alle variabili
globali, alle aJ.LLomaciche locali e a quelle loc.w stati~ . stara dichiarata e inizializzata a l
una variabile globale x . Quesca sa.r nascosta in ogru biodo (o funzione) in cui ne sar stam
dichiarata una, locale, chiamata X. Nella funzione main, Stata dichiarata e miziali'l..Zara a
5 una variabile lo<.-ale x. Questa sar quindi visualizzao per dirn9strare che all' inremo di
main la variabile globale x nascosra. t srato quindi defin ito un nuovo blocco all' incerno di
m~in con un'altra variabile locale x inizial izzata a 7. Questa variabile sar visualizzata per
dimostrare che nasconde la x dichiama nel blocco pi scerno d1 main. La vadabile x coo
il v.alore 7 sar distrutta aucomaricameme all'uscita dal blm:co, menrre la variabiJe locale x
dichiarara jn quello pi esrerno di main sar visualizzata 11U.Ovameme per djmosLrarc che
non pi nascosta. li p rogramma defin isce rrc funzioni che noo richiedono argomenri, n
restiruiscon.o dei risultaci. La fUJizione a dichiarer w1a variabile am9mat:ica x e la iniziali1.1.er
a 25. Quando a sar stara invocata la variabile sar visuaJiZZ1tta, incrementata e visualizzata
nuovamente, p rima dell' uscita dalla funzione. Ogni vilrn che qtJ.e.sta fu11ii9 11e sru: scaca
uwocata Ja va,riabile automa.n X S<'lr in,ii'.iaJ iz~ttll nuovamente a.25. La fumio ne b dichiater~ una variabile static x e b i11izialiZ'ler a 50~ Le variabili locali dichiarate s t atic
couservano i loro valori anche quando sono al di fuori della propria visibilit. Quando b
sat stata invocara X sar visualizzarn, incremcnrara e visualiu.ata nuovamente prima delr uscira dalla funzione. Nell 'invocazione successiva d i g uesm funzione la variabile loc;e
static x conterr ancora il valore 51. La firnzione e non dichiarer alcuna variabile. D i
conseguenza, quando far rifcrimenro a x sar utiJizzaca la variabile. globale. Quando e sar
stara invocarn la variabile globale sar visuafo.zara, moltiplicara per 1 O e stampata ouovamnte prima dell' uscita dal la funzione. L"l prossima volta che la fun7.ione e sar srata
invocata la variabile globale conterr ancora il suo valre modifcaco: 10. lnfLnc, il programma visualli.zer ancora una volta la variabile locale x dichiarata nel main, per dimo-

150

CAPrTOLO

sa:are che nessuna delle funzioni chiamate ne avr modifGaro il valore, poich rum: loro
hanno farro riferimento a variabili con alu:e visibilit.

_LE FUNZIONI
static int x
avviene solo * /

#include <stdio.h>

int

printf( "local static x is %don exiting b\n ", x);

,.,.

I* prototipo di funzione */
prototipo di funzion e *I
prototipo di funzione *I

void c(void)
{

printf( \nglobal x i s !\sd on ente r ing c\n" 1 x);


X*-= 10;

main ()

printf("global x is %d on exiting

int

= 5;

/* variabi l e l ocale rna ln */

t incomincia una nuova visibilit /

int

= 7;

printf("loal

in inner scope

Of

main is %d\n",

a();
/ *a ha una variabile x locale automatica*/
b();
/* b ha una variabile x locale statica*/
c();
/ *e usa la variabile x globale*/
a ();
/* a inzia!lzza la variabile x locale automatica */
b();
/* la variaole x locale statica conserva il suo
valore precedente */
c ();
/ * anche la variabile x globale conserva i l suo valore
precedente */
printf ( "local x i n ma.in is %d\n", x);
r etu rn 0;
void a(void)
int x

= 25;

1~

inizializzata ogni volta che a chiamata */

++x;
printf("local x in a is %d before exiting a\n " , x);
void b(void)

X
X

loC'ai

in euter ~ cop~ !'J'f main i'S 5


;i:n inner scope or m~tin is 7
in outer scope of m~~n is 5

local static x is 50 on ente~ing b


local static x is 51 on exiting b
global
global
loeal
lo e al

r;in entering e
10 on exi ting e

X l.S 1
)( l.S

X
)(.

in a :l.s 25 after entering a


in a is 26 before exitil'lll a

local stati e )( j.s 51 on enter.J.ng Q


local static x .iis 52 on ex:i.ting b
globa1 X ;i...S j'0 on J'lt~ring e
g,;t.obal x is 1e0 on e~UJi'lf;I e

lQbal x in

m~i~

1s

Figura 5. 12 Un esempio di visibilit.

printf("\nlocal x in a is %d after entering a\n', x);


}

local
Loca!

X);

printf("local x in outer scope of main s %d\n ", x);

x);

loca! X io a is 25 after entering a


locai x in a is 26 before exj.ting a

/* fine della nuova visibilit */

c\n ~,

printf("local x in outer scope f main i %d\n", x);

/* l ' inizializzazi.one della variabile statica

++x;

I* variabile globale */

1;

= 50;

/ * la prima volta che b chiamata */


printf( "\ nlocal static x is %don entering b\n " , x);

I* Un esempio di visibilit */
void a(void);
void b(void);
void c ( void) ;

151

5.13 La ricorsione
I programmj dj cui abbiamo discusso sono generalmeiue.strum.i.rari comefuru.ioni che s.i chiamano l'una con l'alrro in modo disciplinato e gerarch.ico. Per alcuni tipi di problemi sar invece utile
avere delle funzioni che richiamino se stesse. Una fimzione ri..corfiva wia funzione che richiama se
stessa direuamente o indirccramcnre attraverso un'alaa funzione. La ricorsione un argomento
c9mplesso discusso a lungo nei corsi superiori di informatica. ln quesra sezione e nella prossima,
saranno presenrati dci semplici esempi di ricocsione. Q"1esro Libro contiene una cliscussionc csrcsa
ddla ricorsione diStribuha nei Capiroli dal 5 al 12. La Figura 5.17 riassume i-31 esempi ed esercizi
sulla ricorsione presenti in quesoo libro.lo primo luogo considereremo la ricorsione dal punto

152

CAPITOLO

considereremo la rioorsione dal punro di visca concenuale e quindi esamineremo diversi


programmi conrenenti delle funzioni ricorsive. Gli approcci ricorsivi alla soluzione dei
problemi hanno un certo numero di elementi in comw1c. Una funzio ne ricorsiva sat
invocata per risolvere un problema. La funzion in realt sa come risolvere soltanto i casi
p.it1 semplici, ovverosia i cosiddcrd casi di basi?. Nel i::sU che la fu n1J0ne veng'd invocaca su
un caso di base, resrimir dirertamenre trn cisulcaco. N.el caso invece che la funzione venga
invocata su Llil problema pii1 complesso, lo suddivider in due patti concerruali: una che la
funzione sa come risolvere e un'al tra che invece non sa come risolvere. Per rendere fattibile
la ricorsione, la seconda parre del problema dovr assomigliare a quello originale, ma
dovr anche essere una versione leggermente pi semplice o pi piccola dello stesso. Daro
che questo nuovo problema assomiglier a quello originale, la funzione lancer (invocherlt)
una nuova copia di se stessa perch Lwori sul problema pi piccolo: questa appuruo ci
che viene defnira chiamata rfrorsilld o an che passo ricorsivo. Il passo ricorsivo includer
anche la parola chiave r~tu rn perch il suo J:isul,raco sar tombinaco con la po.rz.ione del problerna cht! la 6.inrione sa c.bme risolvere, in modo da 'formare il dstdcaro eh.e sar finalmente
restin1ito al chiamante originale, probabilmente i1 maiTI.

TI passo _ricorsivo sar eseguito fnca.nco che la chiamata originaria della funzione sar
ancora aperta, ovvc;rosia non avr ancor terminato la sua esecuzione. Il passo ricorsivo
potr generare moire altre chiamare ricorsive si:mili, man mano che continuer a suddividere nelle <lue pa:rci concettuali ognuno dei problemi su cui scato invocaro. PeJch la
corsione possa lnalmence. terminare, ogni volca che la .funzione richiamer se sressa ron
una versione leggeanente pi semplice del problema originale, questa successione di problemi sempre p i pjc-qli dovr convergere alla fine; ad un caso di base. A quel punto, la
funzione riconosceclL il casq dj base, rcscimir un cisult;tro alla ~ua cop41. p.recedeme e ne
conscguir-. una s~quenza cli resciruzioni lungo tutfa la catena di chiamate, finch quella
della fu nzione originaria non rescicuir. fnalmefn:e al main il risultato fi nale. Tutto ci
sembra alquamo esotico se confrontato con il ripo di risoluzione convenzionale~ problemi cui siamo sciri abituaci fino a qiJesto punto. Scrivere dei programmi ricorsivi, richieder cerramence una buona dose di pratica, prima che il processo appaia na.m.rale. Come
esempio di funziona.me.mo di questi concetti, sriveremo un programma ricorsivo che
eseguir un tipico calcolo matemacico.

153

UFUNZIONI

Per esempio, 5! sar chiacamemc uguale a 5 4!, come dimosrraco di seguita:

5! = 5 . 4 . 3 . 2 . 1
5! = 5 . (4 . 3 . 2 . l )
5! = 5. (4!)

La valut:a7.ione. di .S! proceder nel modo mosn:ato nella Figura 5. L3. La Figura 5.13a
mosrra in che modo la successione delle chiamare ricorsive proceder fiacb l ! sar.. valucaro 1 e rerminer la ricmsione. La Figura 5.13b mostra i valori resriruiri da ogni clllamaca
ricorsiva al suo cb iamanre finch sar staro calcolato e restiruiro il valore finale.

il programma della Figrua 5 .14 u ciLlz.zc.r la ricorsione, per calcola.re e visualizzare il


fatto riale degli inceri compresi era O a 10 (la scclrn del cipo di daro long sar. spie.gara rra
breve). La fi.mzione ricorsiv factorial conrroller in primo luogo se una delle con.dizio.ni
di ceroii n~izio nesia vera, ovverosia se number sia infotiore o uguale n l. N'el caso cbe number
sia sicun~meme minore o uguale a 1, f actorial resciruir: 1, non saranno necessacie al.rre
[icotsioni e il programma tetmined1. Nel caso che number sia maggiore di l , l'ism.1.zi:.one
return number

* f actorial(number - 1);

esprimer:\ il problema corne il prodotto tra number e un.a chiamata ricorsiva di fac1;orial
che valucec il farror iale di number - 1. Osservare che factorial ( number - 1) s~ un
problema lcggermeore pi semplice del calcolo originale facto r i al ( number }.
Valore finale

5! = 5 24 = 120': valore rest ituito

5
4! = 4

3!

Si orten un.<J. dfnizione ricorsiva della funzi0ne Hmorial.e, osservando la segunre


relazione:

n! =n (n -1)!

= 3 .. 2 = 6: valore rest1tu1to
2! = 2 I = 2: valore restituito

con ll uguale~ J e Q! ddniro uguale a l. Per esempio., 5! sar~ il prodrto 5 * 4"' 3 * 2"' l,
che sar uguale a 1..20.

factorial = 1;
for (counter = number; counter >= 1; c'ounte r -)
factorial *= count erj

= 24: valore restituito

l) (n -2)" ... . 1

n farroriale di un intero, number, maggiore o uguale a zero, porr essere ~!colato


itenmvamente (non i.runodo ricorsivo) urilizzando la srruttura fo r come segue:

*6

ll farroriale di un intero non negativo n, scrirrq n! (e proounciaro "fattoriale di n"), il


prodorto
il, (n -

= 120

I: valore restituito

a) successione delle chiamate

b) valori restituit i a ogni chiamata ricorsive

Figura 5. 13 Valutazione ricorsiva di 5!

La funzione factorial sraca dichiarara in modo da ricevere un paramerro di tipo


long e resti tuire W1 risultato ddlo stesso tipo. Q uesta una notazione abbreviata per
long int . Lo standard WSI specifica che una variabile di tipo long int debba essere
mmagazznaca in almeno quarrro byte e, di conseguenza, che possa conrencre un valore
g[ande quanro +2147483647. Come si pu vedere dal.la.Figura S.14, i valori del furro riale

154

CAPITOLO

diventano rapidamente grandi. Abbiamo scelco il tipo di daco lo ng proprio perd1 il


programma possa calcolare dei farcoriaJj mag.gioci di 7! anche su compucer con interi
piccoli (come quelli da 2 byte). La specifica dico!1Versi<;me !lsl d stata utilizzata per visuafrr.z.are
dei valori di tipo long. Sforrunacamente, la funzione f acto rial produrr dei valori grandi cos velocemente che anche un l ong in t non ci aiuter a visualizzare molri vafori
farrociaJi, prima che sia superar la dimensione di una variabile di quel tipo.
Jn definitiva. come esamineremo negli ~ercizi, aJJ'ucente che desideri caJcolare i farroriali
di numeri pi grandi porranno essere necessari clej float e dei doubl e . Tuno ci rende
evidente una debole'"aa del
(peralcro comune aJla maggior parce degli altri linguaggi di
programmai.ione), ovverosia il Fano che esso non possa esse.re ampliato con facilit affinch possa gestire i parricolari i;equistri delle vari.e applic:iz.oni. li C++ invece un linguaggio che si pu estendere e che quindi, qualora lo volessimo1 ci consentuebbe di creare
degli inceri arbimuiameme gran di.

1!

=1

2!

2
6

~!

4!
24
-5 ! = 120
6!
720
7 1 : 5040
40320
8!
9! = 3628l!0
~01 = 3628800
~

Figura 5.1 4 Calcolare i fattoriali con una funzione rico r,;iva.

Erro1'e tipico 5. I 5

5. 14 Esempio di utilizzo della ricorsione:


la serie di Fibonacci

Dimenticare di restituire ~n valore da un funZion ricorsiva, qualora sia nqcessario.

La s.ccie di Fibonacci

o,

Errore tipico 5.16

Omettere ttt1 caso di base oscrivere scortettamnte ilptis.ro di ricorsione 71 modo tale che
non converga ad un caso di base provoche-4.delle ricorsioni infinite, finendo per euwrire la memoria. Ci analogo al problema del ddo infinito di una soluzione iterativa
(non ricorsiva). Una ricursione infinita potr. essereprovocata anche fornendo zm input
inatteso.

l, 1, 2, 3,

s. 8, 13, 2 1, ...

comincia con O e 1 e gode della propriet ch ogni sus_seguenre numero di Fibonacci la

somma dci due che lo precedono.


La serie ba dei risconrri in vari fenomeni naru.rali e descrive in parcolare una forma
di spir;i.lc. il rapporco era i ou.meri consecutivi di Fibonacci converge verso il valore cosrance di 1,618 .... Anche questo numero ha ripecmi riscontri in narura ed staro ddnico

rapporto aureo o divina proporzione.

/* Funzione fattoriale ricorsiva /


#include <stdio.h>

Gli esseri umani banno la cendcnza a considerare la divina proporzione piacevole: dal punro
di visra esreco. Gli archiceni progena.no spe5so finescre, sranze e palazzi le cui lunghezze e
alrezze sono in un rapporto pari alla divina proporzione. Anche le canoline poscali sono
disegnare spesso con un rapporto lunghexz.a/largberia pari alla divina proporzione.

long factorial(long);
;

main()

La serie di Fibonacci pu essere dcfinic:a in. modo ricorsi.va come segue:

i nt i;

fibonacci(O) = O

for ( i= 1 ; i<= 10 ; i++)


p ri n tf ( ~%2d l = %ld\n", i, factorial ( i) );

fihona"i(l) = I

I* Definizio ne ricorsiva d e l l a f unzione fattoria l e */


long factorial(long number)
{
i f (number <= 1)

return 1;
else
return (number

fibonacci(n)

=- fibonacci(1i

- J) + j.borzttcci(1i - 2)

il programma della Figura 5.1 S calcoler in modo rirorsivo Pi-esimo nu mern di Fibonacci,
utilizzando la funzione f i bonaoci. Osservare eh~ i n umeri di Fibonacd tendono a diventare grandi rapidamente. Per questo movo abhillll!Q selto il cipo di dato long per iJ

ret ur n 0 ;

155

LEFVN7JONI

* factorial(number -

1));

parametro e: per il valore resricuiro daHa funzion: fibonacci. NeUa Figura


coppia di righe deU'ourpuc mostra un'esecuzione discinta d el programma.

5.15.

ogni

Cinvocazione di fibonac c i da parre di main non una chiamata ricorsiva, mencre lo


cSaranno rua:e le invocazioni successive di f i bonacci. Ogni volra che f i bonacci sar
stara invocaca, essa controller Lmrnediacarnenre il caso di base: n uguale a O o a I . Verrebbe resciruico n se questa condizione dovesse essere vera. fn modo interessante, se n dovesse
essere maggiore di I , il passo della ricorsione gener~bb.e due chiamare ricorsive, ognuna
delle quali sarebbe effettuata per un problema leggen:nenre pi semplice di quello della

156

Ci\l'ITOl.O

L I! ,~UNZI ONI

157

chiamacaoriginaria a fibonacci. LaEigura 5.16 moscraln che modo la funzione fibonacc i


valucer la chiamaca fibonacci(3) : abbiamo semplicemente abbreviato fibonacci in f
per rendere la figura pi leggibile.

Enter an i nteger: 10
Fibonacci(10) = 55

1~ Funzione r icorsiva fibonacci * /


#inc lude <stdio.h>

Enter an integer: 20
Fibonacci (20)
6765

long fibonacci(long};

Enter an integer: 30
Fibonacci(30) = 832040

ma in ()
{

Enter an i nteger: 35
Fieonacci(35) = 9227465

long result , number ;


printf ("Enter a n i ntege r : ");
sc anf(,,%lo"; &number);
result = f i bonacci(number);
printf("Fi bonacoi(%ld) = %ld\ ~ ", numbef, rsult);
return 0;
}

Figura 5. 15 Generare I numeri di Fibonacci in modo rcorsivo.

I restitu isc e

1~ Defi nizione ricorsiva della funzione fibonac ci */


long f ibonacci( long n)

if (n == 0 : I n == 1)
return n;
else
r eturn fibonacci(n - 1) + fibonacci(n . 2);

restituisce

f( 1)

restituisce
1

~~~~'--~1~~~~~~

restituisce
Enter an integer: 0
fibonacci(0) = 0
Enrer an integer :
Fibonacci~1) = 1
Ent"er an integer: 2
Fibonacci (2) = 1
Enter an infeger: 3
Fi6onacci(3) = 2
Ertt~r an intger: 4
Fibonacci(4) = 3

Enter an integer: 5
Fibonaoci(5)
5

Enter an integer: 6
Fibonacci(6) = 8

}'

restit uisce
0

Fig ura 5. 16 Gruppo di chiamate ricorsive alla funz.ione fibonacci.


Questa figura soUeva alcuni inrercssanri problcnii riguardan l'ordine in cui il compilarorc
prnhlnia d.i.fferenre da quello relarivo
all'ordine in <:U gli operatori saranno applicati ai propri o_perandi, ovverosia all'ordine dettato
daile regole di prjocir degli oper.irori. Dalla Figui:a 5.1 6 appare evidenre che nel valurare f ( 3)
~amnno cffccruare due iJwocazi011i ricorsive, owerosia f (2) e f ( 1). Ma in quale ordine saran-

e valuter gli operandj degli operaroti Questo un

oo effettuare queste chiamare? Molti programmatori presumer;tnnosemplicernence che gli ope.randl


&anmno valucici da siu~ma a dcsrra. Stranamente, lo st:.;l:.ldard ANSI non specifica .l'ordine i.n
cui debbano essere valutaci gli operandi dcUa maggior parre degli operamri (lDcluso +). Ne
eonsegue d i.e il programmatore non porr presumere alcundi sull'ordine in cui saranno eseguite le suddette chiamate. lnfarri f(2) porrebbe essere eseguim prima di f(1 ), ma le sres~e
invocazioni porrebbero a11d1e essere eseguire nell'ordine inverso1 f ( 1) prima di f (2). ln questo e nella maggior parce dei programmi il cisulrat('.) s.arJo sre.sso in ogni caso. In alcuni
programmi, invece, la valuraz.ione di un operando porr pr.odurre degli e.ffmi coUacerali che
potrebbero a loro volra influenzare il risultato fnal dell'es2res.sione. Lo srandard ANSl specifica l'ordine di valuw.ione solo per quarrro dei ranci operacori cnc.lusi nel e, vale a dire &&, : :
l'operatore virgola (,) e 7: . l primi rre sono operacori binari e per i loro operandi sar garamica
la valurazione da sinisua a destra. I:ulrimo l'unico operamre cernario del C. Il suo operando
pi a sinisr:ra sar valucaro sempre per primo; qualora i' operando pi a sinistra fosse diverso da

158

CArrrmo 5

zero, seguirebbe la valurazione di quello di mev,o e l'nlci.mo sarebbe ign.orai:o; qualora l'opcrarore pi a sini~rra fosse valumrp zro, segui1ebb(: invece la vaJurazione dcl cerw operando e quello
di meL.ZO sarebbe ignorato.

Errore tipico 5.17


Scrivere dei programmi che dipendano dall'ordine di va/u(ttzine degli operandi di
operatori diversi da &&, ,' ,', 7: e dall'operatQre virgo/11 (, ) pntr pr<)tJOCare degli errori
perch i compilatori p:f}tr{f.nno f)tt/ut11re gli i7peranai 1 un o.rdine Ghe non sar necessariamente quello atteso dal pr.ogrtt.mmatore:
Obiettivo portabilit 5.2
1 p1fJgrammi clu dipendono dall'ordine di valutazione deg/; operandi di <>peratori d-

vmi do &&, / /. 7: e dall'uperaUJre virgola(, ) potranno funzionare in mode diffemz-

te m sistemi ,on compilatori diversi.


doverq~o spendere una parola clj awcrtimenro sui pr0gr-.lmmi r.icorsivi come quello che
abbiamo usaro qui per geneta.re i numeri Fibonacci. Ogni livello di ricorsione della funzione
fibonacci ha un effecco rnddoppiancc sulla quamic.delle invocazioni; in altre parole, il numero delle chiamate ricorsive che saranno eseguire. per Gaicolare lennesimo numero dj Fibonacci
sar dell'ordine 2 11 Ci andr rapidamente fuori controllo. li solo calcolo dd 20 numero di
Fibonacci richieder una quamir di invocazionj dell'ordine di 220, ovverosia circa un milione
di chiamate; calcolare il 30 numero di Fibonacci rid1iedet Wl.1. quanrir di.invoo1zioni dell'ordine di 2~0, ovverosia ua miliardo di chiamare e cos) via. Gli studiosi di informacica si riferiscono a ci~ con l'espressione complessit esponenziale. I problemi di quesra na.rura sono in grado
di morrfeare anche il pi potente dei compurer! I problemi relacivi alla complessit in generale
e a quella: esponenziale in pan:icolare saranno discussi in dettaglio in "Algoritmi e Suurcure
Dari": un corso di livello superiore incluso nel programma di srudi di informatica.

ru

Obiettivo efficienza. ).4


i'

E.vit11te i progntmrni ricorsivi nello stile di fibonacci che produrano una "esplcsione
ponenziaie di invocazioni.

S. I5

Ricorsione e iterazione

Nelle sezipni precedenti, ah!:>iamo studiato due fw:rtioni che possono esser.e facilmenre implementate in molo. dco.rlivo o itrarivo. I 111 questa: sezione <l:nfroare.reno i due approcci e
discuteremo le ragioJli per le quaLi, in situ:v..ioni parriCobri, un programmatore poa scegliere
un approccio piuaosco che l'frro.
I.:irenrz.ione e la ricorsione SQno basate entrambe su una srrucmra di controllo: l'iterazione
urilizza. urra ripc;rizione; la ricorsione utilir.La una selezione. I.:iceraz.ione e la ricorsione richiedono enrramb~ una ripecizione: la prima urilizza e5pliciramonce una struttura di quel ci:po; la
SeGonda: la ottiene invece attra.v:rso ripecute chiamate di funzione. ~ire~orre e la ricoFSione
richledono entrambe un concrollo di terminazione: l'ireraz.ione cermineF quando sar fullimla
condizione di continuazione del ciclo; la ricorsione ~er invece quando sar scato riconOsciuco un aso di ba.~e. I:ic:crazione con una ripecii.ione concrollaca da un conratore e la ricorsione
si approssimeranno graduahnene alla condusione: l'it~one continuer modificare un con-

UFUNZIONI

1 59

racore finch questo assumer w1 ,ralore che far fallirela rondizione di comi rm.az.ione del ciclo;
la ricorsione co.miru.ier: a produl'J:e versioni pi.1 semplici del problema <>rigina.rio finch non
sar stato otte.nuro un caso <li base. Gterazione e la ricorsione potranno CTll.rambe ripercrsi
all'infniro: con .Pirerazione ol:errerilo un ciclo inCnico qualora il relativo conrroll di continuai.ione non diverui mai f.lso; orn:rrenb una ricorsione infnira qualor-a il passo di ricorsione non
riduca ogni vlca il problema in modo da convergere vcrso un caso di base.

La ricorsione ha molti asperri negacivi. Coinvolge riperuramente il mecc.an:ismo, e di conseguenza il pS0, di una invocazione ili funzione. Ci poa esse.re oneroso in termini di tempo
dcl processore e di spazio di .memoria, Ogni chiamara ricorsiva provocher la creazione di
un'alt.ra copia della funzione (in realt so.lo delle sue variabili); ci potr conswnare una considerevole quamic di memoria. L:iterazione invece normalmeme avverr all'iruerno di una funzione, perci sai.- evicaro il peso dovurq alle ripetute chiamare di funzione e all'assegnamenro cli
memoria aggiuntiva. Pertanro perch scegliere la ricorsione?
Ingegneria del software 5.U
Qua/,Jio,si problema che poJ.StJ. essere risolto in modo rkorsivo potr anche essere risolto
in mani.era iterativa (nn ricorsiva). Nomzaimenu l'approcdo ricorsivp sar preferito
a que!lb iteralivo, qualora il primo rispecchi in modo pi naturale ilproblema e produca un programma che sia pi facile da comprendere e col/au,dnre. Un'altra ragione per
scegliere una soluzione ricorsiva che q11ella iterativa potrebbe non essere evidente.
Obiettivo cjfidenzo 5.5
Evit4.te di usare le ricorsioni in situazioni in roi l'efficienza sia zm aspetto critico. Le
chia1nate rfrorsive richiedonu tempo e consumano pi memorin.
Errore tipico 5. 18

Fare in modo che una funzume non rictmiv11 richiami ttccid.entttlmente se stessn in modo
diretto o indire/Jto attraverso un 'altm frmzione.
La maggior parte dei libri di testo sulla programmazione affrancano la ricorsione pi
rardi dj quanro abbiamo fatto in questo libro. Noi crediamo che la ricorsione sia un
argomenro eos1 ricco e complesso che preferibile affrontare al pi presro, disseminando
il resro del libro con degli esempi. La Figura 5.17 riassume per capiroli i 3 1 esempi ed
esercizi di ricorsione presenti in que,ro resto.
Lasciareci ch iudere quesm capirolo con alcune osservazioni che abbiamo formuJaco
r!pcrucamenre n.el corso del libro. Una buona prngecrazione del software imporrante.
Anche l'efficienza imporrance. Sfortunatamcnce, questi obiettivi sono spesso in contra.sro
l'uno con l'aluo. Una buona progettazione del software di imporcanza vitalet per rendere
pi rnaneggev9l lo sviluppo dei sistemi software pi corposi e complessi di cui abbiamo
bisogno. L'efficienza di imp>rtanza virale, per realir,zare i sistemi del fumro che sorroporranno all' h.a.rd.ware delle esigenze di elaborazione sempre maggiori. Quale sar il ruolo delle
fun7..ioni in questa situazione?

Ingegneria del software 5. 13


La suddivrsione dei programmi in funzioni in una maniera ordinata e gerarchica favorir una buona progettitzione del sofaMre, f(la questo ha un prezzo.

160

CAPITOLO

Obietti110 efficienza 5.6


U11 programma eccessivnmente suddiviso in funzioni, 1ispcuo 11 u1w monolitico (ovverosia
in un unico pezzo) che non k abbia, eseguirpotmzialmenJc un gran numero di chiamate di fimzioni e ci consumer il tempo di esecuzione dei processori di un comp11te1:
Tuttavia, i programmi monolitici smmmo tfijficili da programmare, collnud11re, metrere a pm110, mantener11 e far evolvere.
Suddividete quindi il vosrro programma in fun7.ioni con giudiz.io, renendo sempre a
menre il delicato equilibrio tra l'efficienza e la buona progettazione del software.
Capitolo

Esempi ed esercizi di ricorsione

Capitolo 5

r unzine faccoriale
Fu nzione di Fibonac.ci
Massimo cornun divisore
Somma cli due intt'!ri

Capitai.o 6

LE FUNZIONI

161

Esercizi di autovalutazione
5.J

Rispondere a ognuna delle scguemi domande:


a) Un modulo di programma in C una _ _ _ __
b) Una funzione invocaca con una _ _ _ _ _
c) Una variabile che sia nota solo all'inrerno ddJa funzione in cui sma defniLa una
di una funzione chiainata sar ucilizz3la per resdruire a quella
d) Cisuuzione
d1iamancc il valore di una espressione.
sar uciJ izzarn neJrinresraziont! <li una fu nzione. per indie) La parola ehin ve
care che non re.sciruir un valore o che non c:oort:crr dei pnramerrL
di un idcmifc:ttore la pon.i0ne del programma in cui quello pOLr
f) La
essere udliZ?.aro.
g) 1 ere modi per resriruire il controllo da una funzione chiamaca al chiamanre sono
_ _ __ _

e _ _ _ __

consente nl compilatore di verificare j( numero, i dpi e l'or<lJne degli.


h) Un
argomenti passaci a una t'uni.ione.
ucilizzara per generare dei num~rl casuali.
i) La funzione
utilizzata per impqstarell srne ddnumero c.tsunJci, in modo
j) La fonzionc

Moldpliuiooe cli du~ imeci


E levamenro di un inreyo a una po tenza ill cera
Le corri di Hanoi
La fu nzione man rico(siva
Visuali1.zare al contra.ci.o l'input deUa casriera
Visualizzare la ricorsione

da randomizwre un programma.
k) Le specifiche di classe di memotht sono

Somma degli dementi cli an veuore


Visualizzare un vcrrorc
Visualizzare al cona:ari nn venre
Visualizzare al con rrario una scringa
Verificare se una scringa sia palindroma
Valore minimo cli un vettore
O rdinaptento per selcri9ne

una raccomandai.ione rivolra al compilam) La specifica di classe di memoria


tore affinch immagazzini una vana.bile in uno deLJegisrri dcl compucer.
n) Una variabile dichiarata ali'esrerno di qualsiasi bloeco.o funzione una variabile----o) Perch una variabile locale di una funzione possa conservare il proprio valore lra le diverse
cliiamare alla funzione stessa, essa dovr essere dichiarata c9nla specifica di classe di memoria _____

Quickson:
Ricerca lineare
Ricerca binaria
Le orco Regine

Capitolo 7

Atttaversameruo cli un l:ibirinro

Gapitolo 8

Visualizzare al o.ncrari0 una minga immessa dalla ca.~tiern

Cnpitofo 12

lnserimcmo in uful lista concrenara


Eliminazione da una lisra concatenaca
Ricerca in w1a lisra conea(enata
Visualizzare al conccario una Usca concacenaca
lnserimemo in un albero binario
Visita amicipara di un a.Ibero binario
Visira in ordine (simmetrica) cli u11 albero binario

Visica differita di un albero binario


Figura S. 17 Sommario degli esempi e degl esercizi sulla ricorsione presenti in questo testo.

I) Le variabili dichiara ce m un blocco o nella lisra dei parametri di una funzione, sempre che
non sia scaco speci fcalO diversamemc, saranno considerate della classe di memoria

p) Le quacrro possibili visibilit per un idenficaEore sonQ _ _ _ __, ______,

- - --- e-----

q) Un3 fu nzionc che rk hia ma se stessa ia modo direcro o indiretto una fum.ionc - - - - r) Una funzione ric~miva avr cipicnmente due parti: una che fornisca LUl mezzo per cermie l'alrra che esprima il
nare la ricorsione, verificand0 l'occorrenza di un easo

problema con una chiama.ca ri.corsiv<La Lmo leggcrmeme pi semplice di quello dcUa
chiama(;\ originaria.
Per il scgucrtte programma, stablllte la visibilit (nella funzione, nel llc, nel blocco o nd
5.2
procot:ipo di fum.ionc) di ogow10 dci seguenti elemenci.
a) La variabile x nella funzione main.
b) La variabile y in cube.
e) La funzione cube.
d) La funzione main.
e) Il prorocipo di funzione per cube.
f) I:idenrilcarorc y nel prococipo di funzione di cube.
#include <Stdio.h>
int cube(int y);

162

CAPITOL05

LE lUNZlONl

main()
{

163
return 0;

i.nt

else

Xj

li+

for (X= 1; X<= 10; X++)


printf('\G\n', cube(x));

surn(n - 1) ;

d) void f (float a);


float a;

printf( %f, a);

int cube(int y)

return y y ~ y;

e;)

5.3
Scrivere.un p.rogramma checonrrolli se gli esempi di chiamare :i funzioni della libreria mmemacica mosrrati nella Figura 5.2 producano davvero i risultaci mdica.
5.4

5.5

5. 6

E<once l'inrcsca1.ione per ognuna delle seguenti funzioni.


a)' La funzione hypotenuse che riceva due argomenti in virgola mobile:' a doppia precisione,
side1 e side2, e rescituisca un risulraco in virgola moble a doppta precisione.
b) La funone smalle~t che prenda lreinceri, x, y 2, e re.~cicuisca un incero.
e) La funzione instructions cbe non riceva alcun argomento, n rStiluisa un valore.
(Nora: t:tli funzioni wno ucilizzace per visualizzare delle istruzioni per l'urente.).
d) La funzione intToF1oat che prenda un acgameato incero, number, e restuisc:i un risu.haro io virgola mobile.
Fornire il prororipo di funz.ione per ognuna delle seguenti funzioni:
a) Ca funzione descrit~a. neJJ'.Esercizi.o 5.4a.
b) La ftmziooe descdna nell'E.5ercizio 5.4b.
e) La funzione descrirca ncll'Eserciz.io 5.4<.
d) La fum.ione desccina nell' Esercizio 5.4d.
Scrivete una dichiarazione per ognuna delle seguenti variabili:
a) 'Ci mero count i.'.he dovrebbe essere immagazzinato io un registro. 1niiializure count a 0.
b) La variabile in virgola mobile lastVal che devr conservare il proprio valore rra le chia:111ate alla funz.ione in cu.i verr.clefiniro,
c) 1 l:'incero esterno number fa>~l visibilic dovr esse1e limitata al resco del File In cui verr
definito.

5.7
Trovare l'errore in ognuno dei segucnci segmenti cli progr.unma e spiegare come pou~ essere
correcto (consulrace anche l'Esercizio 5.50):
a) int g (void) {
printf("Inside function g\n");
i nt h(\loid) {
printf( "Inside function h\n');
}

b) int sum(int x, int y) {


int result;
resUlt "' x + y;
c) int sum(int n) {
if (n

0)

voi.d prt:luc't (void) {


l:rit !J, b, e, result;
printf('Enter three integers: ")
scanf(\d\d\d , &a , &b, &e);
result =a b e;
printf ( "Result is %d", re5ult);
return result;

Risposte agli esercizi di autovalutazione


5.1

a) Fuicione. b) Chiamaca di fum.ione. e) Variabile locale. d) return. e) void. I) Visibilit. g)


return; o return espressione; o inoonrrando la paremesi graffu di chiusura d una funzione. h)
Prototipo di funzione. i) rand. j) srand. k) auto, register, extern, static. 1) Auromatica. m)
register. n) E~ma, globale. o) static. p) Visibilit ndJa funiione, visibilic nel file, visibilirl1 nel
blocco, vis.bilit n~ p rototipo di fwizi.ne. q) Ricorsiva. r} Di base.

5 .2
a) Yisibilir; nel blocco. b) Visibilir nel blocco. e) Visibilit nel f:lc. <l) Visibilit nel file. e)
Visibilit nel file: f) Visibilit nel pr0 ~ripo di fum.ione.

5.3

f ' Verificare le funzioni della libreria matematica/


#include <:Stclio.h>
#include <math.h>
main()
{

prntf( sqrt(%. lf) =%.1-f\n', 900.0, sqrt(900.0));


printf('sqrt(\.1f) = %. 1f\n', 9.0, sqrt(9.0));
pri.ntf ("exp(\. tf) =%f\n', t.0, exp(l .0) );
printf('exp(\.lf) = %f\n' , 2.0 1 exp(2.0));
printf('log(%f) = %.1f\n', 2.718282, log(2.71 8282));
printfj ''log(~) =%.1f\n", 7.389056, log (7 .3890~));
printf-("log10 (\.1f) : \,if\n", 1.0, log10(1 .0));
priirff( "log10(%.1 f) =%. lf\ n', 10. 0, 10910 (10.0));
printf('log10(\.1f) =%.1f\n , 100.0, 10910(100.0));
printt(fabs(!k.1f) =%.1f\n", 13.5, fabs(13. 5)li
printf( 'fabs(\.1f) =%. 1f \ n', 0.0, fabs(0.0));
printf("f.abs(%.1f) = \.lf\n', 13.5, fabs(13.5));
printf ( ceil(\.1f) "'%.1f\n" , 9.2, ceil(9.2));
printt(c_e.(%.1f) = %.1f\n1o 1 9.8, ceil( -9.8));
printf( ufloor(9e.1'f) =%.1t\n~, 9.2 , floor (9 .2.) ) ;
prin'tf( "floor(\. lt) = %. 1f\n', 9.8, floor( 9.8 ) l;
printf( "pow~%. 1f, \.1f) =\.1f\n', 2.0, 7.0, pow(2.0, 7.0));
printf("pc.v(\.lf, %.1f) -=%.tf \n' , 9.0, 0.5, pow(9.0 1 0.5));
printf("fmod(\.3f /\.3f) = %.3f\n",

164

LlrlTOIO

LEFUNZ.LONr

13.675, 2.333, fmod(13.675, 2.333));

d) Errore: il punro e virgola dopo la parentesi clcsrrn che chiude la lista dei parametri e la
riclclnii.ione del parametro a nd corpo d.eUa funzione.
CorrC?.ione: eliminare il punto e virgola dopo la parcnce~i desrra della lisra dci para.metri, cd
elimin:ire la dichiarazione float a;.
e) Errore: la funzione resrirniscc un valore.: e non dovrebbe farlo.
Correi.ione; climn;m: l'isr.ruzionc return.

printf("sin(%.1f) =%.1f\n', 0.0, sin(0.0));


printf{"cos(%.1f) = %, 1f, n', 0.0, cos(0.0));
printf('tan{%.1f) =!\l.1f\n" , 0.0, tan(0.0))i
sqrt(900.0~ =30.0
S(li"'tf-9.0) =.'0'
eJ<p(1.0) "'2':n:~
exp(2.0) -=- 7.'389056
log(2.]l82B2) =-1 ..0
109(7 .~o::.2.0
log1 0 (i .0) >=' 0.0
log10(10.0) =-1 ~-0
log10(100.) =2.0

fabs(13.5)

Esercizi
5.8

2., =- \G;,e~
:0-:g.,.:0

a) double hypotenuse (double side1, dol.Jbl.e side2)


b) int sm&J.l~~t(int x, int y, int i)
e} vod .iri's trl.1ctions ( void)
d) float intToFloat(int number)

5.5

a) double hypotenuse ( double, double ) ;


b) i nt smallest(1.nt, int,int);

= fabs(0.0)

x
x

= ceil(0.0l
= fabs(-6.4)
= ceil(-6 .4)

g)

1<

= ceil( fabs.( -B+floor( -5.5 )))

tloor('--9.8), =' 1~_.0


pcN(2.0, i.0) = 128. 0
pbw(9. 0, Q:.S.j =-3.0
fmod(13.~, 2..~) =2.010
sin(0.0) =~.0
cos(0.0) = I .0
tan(0, 0) =0.0

5.4

d) x

ceil:Hi.s) = cs,.0
floqr(.9~2)

Mosr.rare il valore dix dopo che sar.\ smm eseguita ognuna delle seguenti istruzioni.:
a) x = fabs(7 . 5)
b) x = floor(7 .5)

-::e ~3.5

fabs(0.0) ~ 0.0
fabs(-13.s) =13.s
ce;il(~

165

5.9
Un garage addebita un imporro minimo di $2..00 per 1111 parcl1eggi<l fino a cr ore. Dgar.age
:iddebira un'addizionale di $0.50 per ogni ora o frazione cli essa 1:;hc ccce<l:t le ere di base. J.:addebit
massimo per ogni daw periodo di 24ore~S10,00. Assumete che ne.c;suna auto parcheggi pf pi di
24 ore per volra. Scrivecc un programma che calcoli e visualizzi gli addcbit i per ognuno dci ere clienti
che hanno parcheggiam le proprie auto io quesro g:iragc ieri. Dovrete immellcre le ore di parcheggio
per o~ni cliente. li voSIIo programma dovr visualizzare i risu.lraci in un fornmo labulare ordillato e
dovr calcolare e visualizzare il rorale delle ricevuce di ieri. Il programma dovrft utilizzare la fun~ione
calculateCharges per determinare l'addebito di ogni clieme.l vosrri risultaci dovranno apparite nd
segueme formaco:
ear
1

HQUr

1 .S

~Wflle
2.00

4.0

2.50

2~.0

10 .00
14 ..50

TOTAl

29.5

c) void instructions ( vol.d);

d) float ntToFloat(int);

5.6

a)

register rnt count

= 0;

b) stat.ic float lastVal;


e) sta tic int number;
Nota: .l'ultima dichiarazione dovr comparke.all'estc.rno di ogni definizione di funzione.
a) .Errore: la funzione h smra defnirn all'interno della funzione g.
Correzione: spostate la definizione di h alresccrno della definizione di g.
b) Errore: la funzione dovrebbe resciruire un intero, ma non lo fa_
Correzione: eliminare la variabile resU11: e irlsericc nella funzione l'iscruzionc seguemc::
return x + y;

c) Errore: il risultato cli n + sum ( n - 1) oan staro r~ciruico: sum restiru'U: un cisu.lcaco
inappropriaro.
Correzione: riscrivete l'istruzione ncUa clausola else come
return n + sum(n - 1);

5.10 Un'applicazione della funi.ione floor l'arrorondamenro di


I.:iscruzione

un

valore all'irnero pi vicino.

y =floor(x + .5) ;

.arrotonder il numero x all'intero pi. v[cino e :isscgner il ri.su!-raro a y. Scrivete un progra.mrrui che
legga diversi numeri e urilizzi l'istruzione precedente per ltr!'.otondare ognuno dl questi numeci aU'incero pit1 vicino. Per ogui numero chbornto, visualizzate quello originale e quello arrorondaco.
5.1J La funzione floor pu9 es.sere u1ili1.zaca per ai:romnde un numero a unn specifica posraione
dcctmale. L'imuzionc
y

=floor(x

10 + -5) I 10;

arrotonda x alla posizione dei decimj (la prima a desrra dcli.i virgola dei decimali). Cimu7.ionc
y

=floor(x

100~

.5) I 100;

;urotouda x alla posizione dei centesimi .(la seconda :t d.es.cra ddb virgola dd <lt:cimali). Scrivere un

prgramma che de.finisca qtLactro limzioniper 311ocondare un nw::lc.ro x i11 vari medi

166

CAPITOLO

a) roundTointeger(number)
b) roundToTenths(number)
e) ro unctToHundreths(number)
d ) ro undToThousandths(number )
Per ogni valore lcrco, il vostro programma dovr visualiwu:e il numero originale e quelli arrot0ndarhll'intcro, al decimo, al centesimo e al millesimo pi vicini.
5.12

Rispondere a ognuna delle seguemi domande.


a) Cosa significa scegliere dei numeri "a c;aso" ~
b) Perch la funz.ionc rand utile nella simulazione dei giochi d'azzardo?
c) Perch dovreste randomizzare un programma, uJiz.z.ando srand? ln qualJ circostanze
preferibile non randomiz.z.are?
cl) Perch spesso necessario ridurre in scala e/o rraslare i valo.ri prodotti da rand?
e) Perch la simuJaz.ione compucerixzara di situazioni del mondo reale una tecnica utile?

5. 13 Scrivete delle istruzi.oni che assegnino allavari~bile n degLl inter ca~ual i compresi nei seguenti
intervalli:
a) I = n ., 2
b) I = n = 100
e) O= n = 9
d) 1000 = n = 111 2
e) -I = n = I
I) -3 = n = r I
5.14 Per ognuno dei seguend gruppi di imeri, srivece una singola istmzione che visualizzi un
numero casuale uarco dal gruppo.
a} 2, 4, 6, 8, IO.
b) 3, 5. 7, 9, 11.
e) 6. IO, 14, 18, 22.

LE ruNZIONl

5.18 Scrivete uo programma che prenda in inpuc una serie di inrcri e li passi, uno per volm. alla
funzione even, che ucilizzer l'operatore modulo per dererminare se un inrero pari. La funzione
dovr ricevere un argomento incero e rcsriniire 1 qualora l'imero sia pari e 0, in caso conrrario.

5.19 Scrivete una fum.ione che visuaLlzzi al margine sinisnq dello schermo un quadrato pieno di
~cerischi il cui laro sia staro specificaro nel pa.ramet:r0 incero side. Per e.sempio, qualora side fosse 4 . la
funzione dovrebbe visualizzare:

Lato I

Lato 2

3,0
2

.S,O

8,0

4,0
12,0
15,0

5.16

Scrivete una fimzione integerPower (base, exponent) che re.sri.cuisca il valore di

bast!XP011ent
Per esempio, integerPower ( 3 , 4) "' 3 3 3 3. Supponete d1e exponent sia un incero posicivo
diverso da z,ero e che base sia un incero. la funzione integerPower dovr utiliz.zare for per conrrollare
iJ calcolo. Non uciliuarc nessuna funzione deJJa libreria.macematica.
5. 17 Scrivere una fu.nz.iona multiple che per una coppia di inceri determini se il secondo sa un
mulplo del primo. Li fun1.ione dovr ricevere due argo.menri interi e resrituire 1 {vero), qualora il
secondo si.a un muluplo del primo, 0 (falso), in casQ conuacio. Ulixzace qu.esca funzione in un
programma che prenda in inpul una serie di coppje di interi.

5.20 Modificare la funzione cream nell'Esercizio 5.19 in modo da formare il quadrato con qualsia$i
cararrere siac.onreouro ne! paramerro di cipo ca.rartere fillCharacter . O.i conseguenza, qualora side
fossi! 5 e fillCha r acter fosse"#", la fi.mzionedovrebbe.visuali.z.zare:

).21 Ucilizzarc delle tecniche simili a quelle sviluppate negli Esercizi 5.19 e 5.20. per produrre un
programma che cracc1 un'ampia gamma cli forme.

5.22

5.15 Definire una funzione hypotenuse che calcoLl la lunghezza dell'ipotenusa di un triangolo
rettangolo quando siano dari gli alrri due lari. Utilizzare questa funzione in un programma che
dereanini la lungbcz.za dcU'iporenu.~a i>er ognuno dei seguenri rriangoli. La funzione dovr ricevere
due argomenri di cipo double e resciruire l'iporenusa c-0me un double.
Triangolo

167

Scrivete dci segmc.nci di progr.imma che eseguano ognuno dei seguenri compici:
a) Calcolate la pane incera dcl quozienrc ottenuto clal1t divisione degli inreri a e b.
b) Calcolare il resro incero occtnuro dalla divisione degli inceri a e b.
e) Uriliw1te i pe:ai di programma sviluppari in a) e b) per scrivere una funzione che prenda
in input un intero, compreso rra 1 e 32767, e lo visu:i.lizzi come una sequcnia di cifre,
separando ogni coppia dJ esse con due spazJ. P-er esempio~ l'incero 4562 dovr essere
sc:amparo come:
4 5 6 2

,S.23 Scrivete una fum.ione che acceni in in pur lora, ?Uddv!~a in tre argomenci inreri (per le ore, i
minuti e i second), e restituisca il numero dei second~i traSCei!t~i dall'ultima volta che l'orologio "ba
rinwc,aco .le 12". l:Jtilli.iace questa funzione per calcolate la q.u;tnri:t di rempo in secondi che incercorre rrJ due orari, cnrrambi i quali siano compresi all'inremo dl un ciclo di L2 ore ddl'orol(!gio.
5.24

Imple;nenra.ic le seguenti fuozionj intere:


a) La funzione celsius restiruisce l'equiv"J.leme Celsius di una remperarura Fahren heit (utilizzare la formula 0 C={5/9) )( e F-32), dove C rappresenra la tempcrarura in gradi Celsius
e F quella in gradi Fahrenheit).
b) La funzione fahrenheit restituisce l'equivale.me F-ilirenheit di una temperatura Celsius
(utilizzate la formula F:(9/5)C+32. dove C rappreserua la temperarura in gradi Celsius
F quclla in gradi Fahrenheit).
e) Urili21.ace qucsrc fu nzioni, per scrivere un progfl!Jllm3 che visualizzi delle tabelle che
mostrino gli equivalenti Fahrenheit di rum:. le re.mperatur Cdsius comprese era O e I00
gradi, nonch gli equiv:i.lcnri Celsius di rurrele remperarure Fahrenheic comprese era 32 e

168

CAPITOLO

211 gradi. Visualizzate i rsulmci in una forma cabulan.: ordinarn che minimi1.zi il numero
di righe dell'output". puc rimanendo leggibile.

5.25

Scrivete una funzione che re.stiruisca il minore di

tre numeri

in virgola mobile.

5.26

Un numero intero deno numero perfeno qua!o(a I.a somma dei suoi fattoci, incluso l (ma
non se stesso), sia pari a quel numero. Per esempio 6 un numero perfeno pt!!ch 6 ,. I i- 2 + 3.
Scrivete una funzione perfect che detennini se il paramerro number sia un numero pcrfcuo. Utili1zar.e ques1a funzione in un programma che determini e ~-isualizzi rurri i numffi pcrlni trn I e I 000.
Visualiv~re i fattori di ogni numero pcrferco. pcr CQi;ifrm:aredie lo sia vec:l.ll1cn1c. Sfidate la porcm~1
del vscro computer, provando con numeri maggiori di 1000.

5. 27 Un incero dmo primo qualora sia divisibile solranco per 1 e per se stesso. Per esempio 2, 3. 5
e 7 sono primi, mcnc:re 4, 6, 8 e 9 non lo so110.
a) Scrivere una funzione che drm:rmini se un, nu mero sia primo.
b~ U rili'l.z:1tc questa funzione in u11 pmgr;unmache determini e visualizzi tu~ti i numeri primi
mi l e W.000. Quand ili quesci I0.00"0 nuneri dovrete realmente v.erifcare primr;.d i
essere $icuri di aver crov:ic turci i nlillleri p~?
c) [oizioJmcnce pocresre pensa.re eh~ .nfQ sia il limire superiore che dovrete verificirc p.er
vedere se un numero sia primo, m;i in realdi vi baster ;1rriv:1rc alla radice: ql..l<ldratn di n.
Perch? Riscrivere LI programma e fatelo eseguire Ln entrambi i modi. Scimacc li miglior:imenro dd le presrazioni
5.28

Scrivere un;L funzione che prenda un valore imero e lo restituisca dopo avere iovcnito le sue

cifre. Per esempio. dato il numero 7631, la funzione dov resciruirc 1367.
5.29 li massimo comun divisore (MCD) di due inceri l'incero pi grande che possa dividere
es;m:unenre ognuno dci due numeri. Scrivere una rum.ione gcd che rcsriruisca il massimo comun
divi.o.ore di due incc.
5.30 Scrivcle una furo.ione quali tyPoints che prenda in inpuc la media cli uno srudencee resciruisca 4 qualora la sua media sia compresa rra 90 e I 00, 3 era 80 e 89, 2 tra 70 e 79, I tra 60 e 69 e O

qualol'1l sia inferiore a GO.

,.

5 .31 Scrivete un programma che simuli il lancio di una monena. l'cr ogni la1icio della monerina il
programmadovr visualizzare Heads o Tails. l.a.sc,iar che il programma lanci la monetina per I 00
volte e co1lt1lt U numero di <)ccorrcnze per la comp~~ di qgni foccia della monetina. Visua1i1.um~ 1
risulraci. Il programma dovr chiamare ltM fum.ion discinta fUp, che non ricever argomenti e che
r"st.ituLr 0 per croc e 1 per resta. Not;i: qualora il progr:muna simuli realiscicamentc il lancio cli unn
monecina, allora ogni faccia della srcss:i d(.)Vr apparire approssimar:ivameate la met delle volte, per un
torni<.' app ro.ssim:uivo di 50 ~cm e 5() croei.
5.32 1 computer giocano un. niolo sempre p iimportance nell'educazione. Scrivere un programma
.che ai u.ci uno srudenre di scuola elemento.re a(L apprcnd..:rt! la molciplic:izione. Utilzv.ace rand per
produrre due inceri positivi i una cifra. Dovrer..: quindr visualiz1~'lre una domanda come:
1-iow much is 6 times 77

rn seguico lo srudente diglrcr la risposra.11 vosrro prograrmnaconcroUer:\ la risposta dello studcncc. Q.1alora
s:ia correcm, visualizzare very good I e smop0nete quindi un'altra domanda sulla molciplica7jonc. Nd
caso che la risposta.sia sbagliara, visualixzace No . Please 1:ry aga in. e lasci.are quindi che lo srudem.e
provi ancora ciperuramcore la stessa domanda, finch alla fine non avr asposro corremunence.
5.33 turilizzo dei computer nell'educazione dcna iscruzone assistira dal computer (CAl, compucer-assisced insr:ruccion). Uno dei problemi che si sviluppa negli amhienri CAI l'affiuicamento dello

LE 1'0N7.JONT

L69

smdenre. Questo pu essere dirninato, variando il di:tlogo dd computer in modo da manrenere viv:i
l'arrenzion.e dello rudcnt..:. Modifcace il programma ddl'Escrcizio 5.32 in modo che siano visualiv.ati
vari commenri a fronte di ogni risposm corrcrra e sbagliata, come segue:
Commenti per una ri~po~ta correna
Very goodl
Excellentl
Nice work!
Keep Up the good workl
Commenri per una risposra sbagli:ira

No . Please try again.


Wrong. Try once more.
Don' t giVe upl
No. Keep trying.
Utiliu.1tc li generatore ul numeri casuali per ~ccgl iemc ,Uho compres<> rra l a 4 e ~elezio na re un
cotnn:into appropdnto <1 ogni risposta. Uril.izz.ate la srru rtura ~witch con.delle ism.11.ioni pri ntf per
emetrere i commenri.

5.34 I s_isccmi pi raffinaci di ism17.io11c.: assiHit;1 dal compmer mon.icora.no lt: pr~tazioni dcll'uccntc
du rante un cerco pt:riodo. La decisione di incominci.are un. nuovo argomento sar spesso b:i~:im sul
~so dello studenre con gli argomenci prcccdenri. Modificare il programma dell'Esermio 5.33 in
modo da contare il numero di risposte correrce e sbagliare immesse dallo srudentc. Dopo che lo
sruderue avr digimto I Orisposte, il vosrro programma dovr calcolare la percentuale di quelle comme.
Qualora la percentuale. sia inferiore al 75 pe.rcemo, il vosrro programma dovr visuaL1.2..'lre Plesse
ask your inst r uctor for extra help ' e quindi termin'<lt'e la propria t:Secuzione.
5.35 Scrive.ce un programma C che proponga il gioco "indovin:Li..I nwnero" nd modo ~eguence: il
vosuo programma sceglier il numero da indovina.re, sele-Lionan_d o un incero a caso compreso ncll'incervallo d-a 1 a I000. U programma quindi visualined:
nave a number between 1 and 1000.
Can yeu guess my number?
P.lease type your fi rst guess.

11 glocarore :.loro digiter una prima pores. U programma risponder con una delle scgwmti frasi :
1 . Excellent I ~ou gUessed t he number I
Wpu:l:Q Y,o\I ll,ke; to pl~y agaifl ,(y or n,)?
2. Toe low. Try .agun.

.3. TPQ hig~ TQY a~ain.

Q ualora L'ipotesi dcl giocarore sia sbagliata, il voscro pr:ogramina dovr reiterare finchil giocatore non
avr lnalmenrc. indovinaro il numero correno. li vostro programma dovrll continuare a indicare Too
hgh o Too low, per aiurare il giocacorc a "prendere la mira" sulla risposc correcc:t. Nora: la tecnica di
cicerc:i impicgmn in q_uesro problema dena ricerc.i. binari.a. Diremo qualcosa in pi su ci nel prossimo
problema..
5.3 6 Modifcacc l'f--5ercizio 5.35 in modo da comare il numero di ccnra.tivi del giocarorc. Qu;ora il
numero sia inferiore o uguale :i I O, visualizzare "E.it her you know the secret or you got lucky I .
Qualora il giocatore: indovini il numero in 10 renrarivi, visualizzare "Ahah I You know the secret 1".
Qualora il gioca.core faccia pi di IOcenrari,i, visua!izz:rre ''you should be able to do better I. Per
quale motivo non dovranno essere consenrici pi di IO cemarivi! Ebbene con ogni "buona iporesi" il

170

UPlTOL05

giocarore dovrebbe essere in grado di eliminare 1a mec dei numeri. Dimostrare ora in che modo ogni
numero era l e 1000 possa essere indovinaco in 10 cenrarivi o meno.
5.37

Scrivere una fumione ricorsiva power (base, exponent) che quando invoca.ra resriruisca
bnseexpommt

Pel' esempio, power(3, 4) == 3 3 " 3 3. Sup pone~eche exponent sia un incero maggiore o uguale
a 1. Suggerimen:co: il p~so dlricorslone dovr ucilizzare la relazione
bnsPPPnent = base. bnstP-'fJtment-1
e la condizione di rerminazione sar verilcara quand~ exponent sar uguale :t 1 perch

base1 "'base
5.38

L'l serie di Fibonacci


0, 1,

1, 2, 3, s, a, 13, 21,

incomincia con i ce.r:mifli Oe 1 e gode della propriel per la quale ogpj temine Successivosafa pari alla
somma dci due rerrnioiprecedend. a) Scrivere una funzione f ibonacci ( n) 1i,on rricorsivache calcola il
numero ncsimo di.Fibonacci. b) Dcrecminare il numero di Fibonacci pii1 grande che passa essere
visualizzato sul vostro sistema. Modificate il program:ma_della parte a) in modo da usare dei double,
invece degli int, per alcolare.e rcsdcuirc i numeri di Fibonacci. Lasciare reiterare il p(ogramma fnclt
non fallisca a causa di un vAlorc eccessivamente alco..
5.39 (le toai-di Hani) Ogniinfoanarico in erba dovr venire alle prese coo cerri problemi <lassici e le
corri di Hanoi (co~ la Figura5.18) uno dei pi fumosi di questi. La leggenda narrache,.in un rempio
ddl'E.memo Orienre,.~ preri stavano remando di.muovere una pila di dischi da WJ paleuo a un alrro.
La pilo iniz.i:tle avev.a 64 dischi infla su un paletto e ordina io misu.rn decrescenrc dal basso all'alto. J preti
stavano ccmmndo cli muovere fa. pla da qucsco a un secondo palerco, risperta.ndo del.le r<11ole serondo le
quali: pocevl! ssere t'rlo.ss,i:i esarta.menrc un disco per volr;acin_n_es$un momenro un disco pi grande poteva
essere sistenmo su uno pi piccolo. Era disponibile un cerzo pitletto per riporre cemporane:inicnre i dischi.
Secondo la leggenda, qualora i preti avessero complecaro il Loro compiro, sarebbe giuora la fne:dd mondo,
perci non abbiamo molco interesse nel fucifuare i loro sforzi
Supponiamo clte i preri sciano rericando di muovere.i dischi dal p;iletro l al 3. Vogliamo 5viluppare un algoricmo che visualizzi l'esatta sequenza di a:a.sferimemi di paletto elisco per disco.
Se dovessimo affroruarc questo problema Cn.J metodi convenzionaJi, ci rrovererilmo presto
clispcrac.a:mence ingarbugliaci.od ia manipolazione dei dischi. Se invece affrontiamo il rroblema tenendo in mence la ricorsione, esso diventer immediatarileiire trarrabile. Lo spostamento di n clisd porr
essere vism come lo sp.ostamento di soli n - 1 dischi (eq_uncli la ricorsione) come segue:

LEFUNZIONl

171

I . Muovere n -1 dischi dalpalecro I aJ 2, ucilinando il3 come :m<1 di deposito tempoianea.


2. Muovere l'ulcimo elisco (il pi grande) dal paletto I al 3.
3. Muovere gli n - I dischi dal palen:o 2 al 3, urili1..7.ando il palecro l come :tn:a di deposito
temporanea.
il proce,so rerm i.nera quando l'ultimo com piro richied.ei:lt.Jo ~O&tnme.mu di n.,. J dischi, ovverosi;\
i.I caso di base. Ci s;u eseguito sempliccrnenrc spostando il disco, senza la necessit di un'area di
dcp.osico temporanea.
Scrivere un programma che risolva il problema ddle t~lr.ti di Hanoi. U1ilinate una funzione
ricorsiva con quartro paramerl'i:
I. Il numero dei dischi da muovere.
l.
palecro sul quale quesci dischi saranno iniz.ialmeme infilati.
3. li paletto sul quale quesca pila di dischi dovr es.sere spostata.
4. Il palerro eh.e dovr essere udlizzaro come area cli deposito 1emporanea.
li voscro programma dovr v1sualiz.zare le istruzioni precise necessarie per lo sposramemo dci
dischi dal palerco di partenza a quello di desti nazione. Per esempio, per muovere una pila di rre dischi
dal paleno I al 3, il vostro programma dovr visuafo:z.arc la scguenre setie di mosse:

1 -7 3 (Quesw significa muovere Ltn isco <la1 palecro I al pnkrro 3).


l -72
3--+ 2
I--+ 3
2-7 l

2-73
l -7 3
5.40 Ogni programma che possa essere implemem aro in modo ricorsivo porr essere costruito in
maniera iterativa, scbbC!he a volte con maggior.i if6c0lc e minor chiare-ci.a. Cercare di scrivere una
verli(l ne irer;tcivn dcllc torri di Hanoi. Qualon~ vi riusciste, con.frnnrace la vostra vers.ionc ireratlva con
queU<l ricorsivn che avere svilpparo ndl'Esercizio 5.39. Analizzare i probJemi di efftcienza, di.cbia.rezz.1 e la voma capacicl nd dimostrare la corretter.ro dci programmi.
5.41 (Visualizzare la ricor:;ione) interessante osservare la ricor:s.ione "in azione". Modificare la
funzione dcl fanonale della Figura 5.14 inmodo da visualizz.'1.Je le sue variabili locali e i parametri delle
cbiamace ricorsive. Per ogni chiamata ricorsiva. visualiziace gli ourpunu una riga separata e aggiungete
un livello di rienrro. face del vesrro meglio per rendere l'oucpul chiaro, interess:tnrc e signifcarivo. li
vostro obicrrivo in quesro caso sar cli disegnare e implemenrare un foanaro dcll'ourput che aimi una
perso1n a capire megljo la ricorsione. Porresre voler aggiunge.re queste capacit di visuafrzzaz.ione a.i
molti altri esempi cd esercizi sulla ricorsione prc.cnti in quesro cesto.
5,.42 11 massimo coruun divisore dcgliinreri x e y (: l'inrero pi: grande che divida. esanamente:: sia x
che y. Scrivere una funzione tkorsiva god che rescituisc:t il massimo com un divisore dix e y. IJ gcd di
x e y sar del.niro i.o modo rkorsrvo come segue: se y .uguale a 0, allora gcd (x, y) sar x; alcrimenti
gcd(x, y) sar gcd(y, x \ y) dove l\ s:tr l'oper:rmre modulo.
5.43 Pu il ma in essere chiarnaco in modo ricorsivo? Scrivere un programma che conrenga una
funuone ma i n. I ndudcre la variabile locale static count iaizi-alizzaca a I. Ogni volta cht: lafuozione
ma in invocata, applicate l'operatore di postincrcmenro e visualizzate il valore di count. Eseguire il
progr:unma. Che cosa succede?
5.44 Gli Esercizi <la1 5.32 al 5.34 hanno permesso di sviltippare ua programma di istruzione
aJ;sisdra dal co111pucer, per .insegnare la moltipllcwione a u.nci scud.e.nre di scuol:i clemt!ntare. Questo
esercizio suggerlscc dei migli:Otfilnenci a quel programma.

Figura 5. 18 Le torri <:li H anoi per il caso con quattro dischi.

172

CAPITOLO

a) Modificare il programma in modo da consenrire alJ'utcnce di im.mecrere un hvcUo di

d.ifficolr. Un Livello l signHicher utilizzare solo_nwm:ri di una cifra all'inmmo dci problemj, un livello 2 significher utili L7.are aneli~ numeri di due cifre. ecc.
b) Moilc:lie il programma in modo da conspitin. all'urenre di scegliere iJ tipo di problemi
aritmetici che lui o lei dcsidern studia.re;. tJn'0pz1one I signlfdm solo problemi suJl'addizio11e, 2 solo sulla somazione, 3 solo sulla molriplicazione, 4 solo sulla divisicme menue 5
signifdxcr mischiare a ciso problemi di (utri questi tipi.

LE fUNZIONl
5.50

l73

Trovate l'errore in ognuno dei seguenti segmemi di programma e spiegare mme correggerlo:
a) float cube(float); 1~ prototipo di funzione /

Scrivece l:t funzione distance che calcoli l:i cfu~


numeri e i valori resriru.iti dovranno essere di tipo float.

5.45

S.46

tra

due punci (xl. yl) e (x2. y2). Tuni i

cuba (float r111Jliber}

f * definizione d funzione .. f

return number * number numbe r;


}

b ) register auto int x =7;


e) int randomNumber = srand ( ) ;

d) float y = 123.45678 ;

Che cosaf.uJl seguenre programma!

int

main()
{

Xj

X = y;
printf("%f\n", (float)

ilit :;
if ((e = getchar()) l= EOF) {

~);

e) double square (double number)

maiin o;

double number;

printt( "%e!' , e);


}

return number -number;

return 0;
}

5 .47

f)

1nt

sum(urt n)

Che cosa far il seguente programma?


int mystery(int, wt);

main()

if (n = 0)
returfl 0;
else

return n + sum(n) ;

i nt x, y;

printf (<.Enter

two i ntegers: .. ) ;

scanf("%!\id', &x, &y );


prllitf( 1he result is l\id\nr, mystery(x, y));

return 0;

t i l parametro b deve essere un intero po;;itivo


per pN!venire una ricorsione infinita /

int mystery(tnt a, int b)


{

if

(ti

"'= 1)

return a;
else
return a+ mystery(a, b 1);
}

S.4 8 Dopo clieavrere decerminato cosa far il programma dell'Esercii.io 5 .47, modifcacclo io modo
che funzioni correuamente, dopo la rimozione della restrizione riguardamc In posrivil: del secondo
pararneero.
5.49 Sctivet~ un programma che concrolli t:ane_funzioni deJJa libreria matematica deJh figura 5.2
quante ne p0rer_e. Eserdtarevi con ognuna dj queCCf~111'l.oni, facendo n modo che iJ vostro program
ma 11is11;izzj del.le cabeUG: comenen'ri i valori restituiti da. una molteplich di argomern:i.

5.51 Modificare il progrnmm ~t per il gioco dei dadi della Figura 5.10 in modo da consenrire delle
scommesse. lmpacchemue in una fun-1.ione la poc:zione del programma che eseguir un singolo gioco
ai dadi. Iniz.ialinace la variabile bankBalance (saldo) a 1000 dolJa.ci. Ch iedete al giocacore di imme[
cere una wage r (pancica). U liZzate un ciclo while per conuollare che wager sia inferiore o uguale a
bankBalance e, in caso cona:ario, per cliiedere :ill'uu:nce ru immettere ouovamence wage r finclie non
ne si:i St:lt:l immessa una valida. Dopo che sar sc3t:l immessa una wager correcta, eseguite un gioco ai
dadi. Nel caso in cui il giocatore vmca, incremenrerere bankBalance dj wager e visualizzcrece Unuovo
bankBalance. Nel C.'lSO in cul il ~ocamre perda, d.ecremenrerecc bank.B alance ru wager. visuaJiz:Lerete
il nuovp bal)kBalance. verificherete ehe bankBalance non sia diventato zero e, in ca.m contrario,
visu,alizzerere iJ messaggio so,rry, You busted l ".Man m;lil.o h.: il gioco progrt>c.-Llr, visu:llimeretc
vari mess;1.ggi per fu.re un po' ili "chi;Jcchi.e1t'" come "Oh, you ' re going for broke, huh? ", o "Aw
cmon, take a chancel" , o "Yu're up big. Now 1 s the time to cash in your chipsl" .

CAPITOLO

I vettori
Obiettivi

6. 1

Presenrare la scrucmra di da vettore.


ComprendereJ'uso dej vettori per immagazzinare, ordinare e ricercare elenchj e rabelle
di valori.
CoQlprendere come dichiarare e inizializzare un vetro.re e come fure rikcimento a.i
singoli elementi.dello sresso.
Es$ere in grado di pas.:;arc i vettori alle funzioni.
Comprendere le tecniche fondameocali di ordina.mento.
Essere io grado ili dichiara.re e manipolare dci vettori mulcidimensionali.

Introduzione

Q uesto capitolo fu da inn-o.duzione all'imporrante argomemo delle scnmure di dati. l litfttori


spn0 delle srructwe di dati he consist0no di uqfr cii infoni1azione dello ste.~so tipo. Nel
Capitolo 1Odiscuteremo la nozione di struct (suurrura) nd C: una struttura di dari formaiada
unit ili informazione correlare ma con cipi cvenmalmcnce.differenci. I vecrori e le srrurrure sono
"enrir" SC'dtiche, giacch manrerranno le proprie dimensioni durante l'esecuzione del programma. Naruralmenre, essi porranno apparccncrc alla classe di memoria aucomacica ed essere
quindi creaci e disrrurri ogni volra che si entrer e si uscir dai blocchi in cuj saranno stati
dciniri. Nel Capirolo U irurqdurremo le strucrure ru dati dinamiche come le lisce, le code, le
pile e gli alberi che porranno crescere e decrescere durante l'esecuzione del programma.

6.2

I vettori

Un vertore un gruppo di posizioni (o locazioni) di memoria Gorrdace dal facto che tutte
hanno lo stesso nome e tipo dj dam. Per far riferimem.o a una particolare posizione o
elemento ail'ime.rno dd verrore, specificheremo il nome deUo stesso e. il numero di posizione
ru quel parcicolare elememo nel vettore.
La Figura 6.1 mosrra un veccore di interi chiamarn c. Questo vettore conriene doruci
elementi. Ognuno di questi elementi potr essere puncaCQ CQILil nome del venoro::, seguito tlal

.numero ru posizione per quel particolare elemento racchius a:a parentesi quadre ([ J). Il primo
elemc.11co di ogni vercore l'elemento zero. Di consgnenza, il primo elemenro del vettore~ s;it
p.umaco da e [ 0]. iJ secondo elemento del vettore e {;ar punraco da e [ 1 ). il settimo dem.enco
del veccore e sar punrato da e [ 6] e, ln generale, l'iesirilo elemenro d'el verrore e sar puncaco
da e [ i -1]. 1 nomi dei wtto:ri seguono le scesse conveozioru deglj alcri nomi di variabile.

176

CAPITOLO

J VETrORI
Errore tipico 61

Nome del puntatore(da notare che


tutti gli elementi del puntatore
hanno lo stesso nome, e)

importante 1wtare /11 differenza tra "il seitimo elemento dei vettore" e "l'elemento sette
dei vettore~ Dato che gli indici dei vertori incominciano da zero, "ii settimo ekmemo
del vettore" avr l'indice 6, mentre "l'elemento sene del vettore" avr L'indice 7 e sart in
realt l'ottavo elemento del vettore. Questa la causa di errori di "imprecisione di uno ''.

c(0)

-45

c( 11

cf 2]

C[3J

72

C(4}

1543

c [ 5J

- 89

c [ 6J

++

e [? ]

-3

c[8J

6453

I
+ .

c[9]

62

e I 101

e [ 11 J

78

Numero di posizione dell'e~mento


all'interno del vettore c.

177

In C le parentesi quadre urilizzare per racchiudere J'indice di un vettore SODO considerate in


realt un operatore. Esse hanno lo stesso livello di priorit delle parentesi tonde. La tabella nella
Figura 6.2 mosaa. la priorit e l'associacivir degli operatori introdotti sino a questo punro nel
libro. Essi sono mosua dall'alto in basso in ordine dec;rescenr~ di priorit.
Operatori

Associativit

Tq><>

da sinistra a destra

massim a

da destra a sinistra
da sinistra a destra
da sinistra a destra

molti pi i cari vi

da sinistra a destra

relazionali

da sinistra a dcsrra
da sinisrra a_ destra

di uguaglianza

&&
11
11

da sinistra a desrra

OR logico

( )

<

--

-- I

( tipo )

l\s

<= > >=


I=

?:
= +=

/= %=

unari
addidvi

ANO logico

da desu a a sinisrra

condiz.ionale

da destra a sinisrra

di ~ssegnarnento

da sinisua a destra

virgola

Figura 6.2 Priorit degli operatori.

Figura 6. 1 Un vettore di 12 elmenti.

JI numero di posizione contenuw all'imero delle parenresi quadre pi formalmente


noto come indice. Un indice deve essere un incero o un'espressione intera. Nd caso dle un
programma ucilizzi come indice un'espressione, qu~ s;u valutata per determinare l'indice . .Per esempio, se a = 5 e b = 6, allora l'istruzione
cf a + b]

+=

2;

aggiunger 2 alJ'elemento e [ 11 ] dl verrore. ~erva~e he un nome di verrore indiciZ?.aro un


lvalue: ovverosia un'entit che pu essere utilizzata nella parte sinistra di UD assegnamenti:>.
Esaminiamo pi da vicino il vettore e della F igura 6.1. ll nume del vettore c . I suoi
dodici elcmenci sono pLLntari da e ( 0] , e ( 1 ), e [ 2]. ... e [ 11 ] . Il valore di e ( 0] - 45,
quello di c[1] 6 , quello di c(2] 0 , quello di c[7] 62 e quc.llo di c [11 J 78. Per
visualizzare la somma dci valori contenuti nei primi rre dementi del vettore e , scriveremmo

printf( "\d " , c(0] + c[1] + c[2J)i


Se volessimo dividere per 2 il valore del setcimo dememo del vettore e e assegnare il
cisulraco alla variabile x , scriveremmo
X

c[6 ) I 2;

6.3

La dichiarazione dei vettori

1 vettori occupa.no dello spa%io io memoria. Il programmatore specificher il cipo di ogni


.elemenro e il numero di quelli richiesci da. ognuno dei v~-0ci, cos che il computer possa
riservare l'appropriata quantit di memoria.. i>~r ord;ina.re a.I comp u ter di riservare 12
elementi p er il. vetto.l'e di inceri e sar utilizza.ca la dichiarazione:
::lnt e[ 12);

sa:r possibile riservare ddla memoria per diversi verco ri con una singola dichiarazione.
Per riservare 100 elementi per il vercore di inceri b e 27 per il vettore di inceri x, sar
uti.liziata la segueace dichiarazione:

int

b[~00 J,

x[27J;

I vettori potranno essere dichiaraci anche per contenere altri tipi di dato. Per esempio,
un vettore di cipo c har potr essere uciliz.z.aco per immagazzinare una stringa di cararreri.
Le stcioghe di caratteri e la loro somiglia.ma con i vettori saranno discusse nel Capiwlo 8.
La relazione tra i puntacori e i vettori sar invece discussa .nel Capirolo 7.

CAPITOLO 6

178

Esempi di utilizzo dei vettori

6.4

IJ programma ddla Figura 6.3 urilizzer una struttura di ripetizione for, per azzerare i 10
elemenri inreri di uo vea:ore n e visualizzarlo in formaro cahulare.
Osservate che abbiamo scdto di non inserire una riga vuoca tra Ja prima istruzione
printf e la srrurrura for della Figura 6.3, perch esse sooo srrcrrameme correlate. In
quesrn caso l'istruz.ionc printf visual izza Le intestazioni per le due colonne visualizzare
all'imerno della struccura tor. I programmato ri omerrono spesso le righe vuote tra una
scrurrura for e le istruzioni printf srrea:amente correlare.

/* iniZializzare un vettore *I
#include <stdio.h>

1 VEJTORI

179

d1e azzererebbe il primo clemenco in modo esplicito e in amomarico i rimanenti nove, giacd1
ci sono meno inizia.li.zz.acori degli elemenri presenti nd ~QI(!. imporranre ricordare che i
verroci non saranno azzerari auromaricamence. Il progmn:umuore dovr azzerare almeno il pri.IllO elemcnco perd1 quelli rimanemisiano azzeraci amomaricamente. Quesco metodo di azzeramento
degLi dementi di un ven:ore sar eseguito durante la compilazione. Il mecodo urilizzaro nella
Figura 6.3 potr essere: usaco ciperuramcme duranre l'eseavlone dd programma.
1~ Inizializzare un vettore con una dichiarazione */
"include <stdio.h>

main ()
{

int n( 10 )
int i;

ma in()

{32 I 27 I 64 J 18 l 95 l 14 J 90 J 70 l 60 I 37};

i nt n ( 10) , 1 ;

pri nt f { ''%s%13s \n '' , "Element", "ValLl" );

for (i = 0; i <= 9; i++)


n [i] = 0;

I* iniZia:lizza i l vettdre

11

f9r( 1

printf( "%S\13s\n", "Element", " Value");


1 ~ vsualizza l vettore */
f or (i = 0; i <= 9; i++)
printf('%7d% 13d\n", 1, n[i]);

= 0;

<=

9; i++)

printf("%7d%13d\n'', 1, n[i]}i
return 0 ;
}

Element
return 0;

Element

Value

0
1
2
3

0
0

2
3
4

0
0

7,

Figura 6.3

Inizializzare a zero gli elementi d un vettore.

Gli elemen ti di un verrore potrann0 anche essere inizializzaci comesrualmeme ctlla sua
dichiarazione, facendo seguire a questa un segno di uguale e una Lisca (racchiusa tra parcmresi graffe) di inizi11li:<Z11ton separaci da virgole. U programma della Figura 6.4 inizializza
un vercorc di inceri con dieci valori e lo visualizza in formaro tabulare.

Nel caso ci fossero meno inizializzarori lcg1i dememi del vea:ore, quelli rimanenti ,

14
90

6
7

0,
0

Value
32
27
64
18
95

Figura 6.4

70
60

37

Inizializzare gl elementi di un vettore con uria dichiarazione.

~ Enon: tipico 6.2

Dimenticare di inizializ:a.rre gli elememi di tJn vettore qiu1wm debbano essere inizialiZZdri.

La seguente dichiarazione di vettore


int n[SJ

= {32 ,

27, 64, 18, 95, 14};

prqvocher un errore di sinrassi perch ci sono 6 in.izialii.zatori e solo 5 elementi nel


\tenore.

Enore tipico 6.3

sarebbero aucomacicamente azzeraci. Per esempio, gli clementi del vettore n nella Figura 6.3 potrebbero essere azzeraci con la dichiarazione

rm errore di sintnssifornire in una lista di in;p11fizz4ziohe di vettore pir iniz1/ia,atori

int n [ 10] : { 0} ;

di quanti elementi ce ne siano nello stesso.

CAPITOLO O

180

Qualora in una dichiarazione con un.a lista di inizializzazione sia scara omessa la dimensione del verto re, il numero dci suo elementi sar dererminaro da quello degli inizialimtori
inclusi nella lisca di inizializzazione. Per esem_pio,

181

VETI'ORl

Clement

Value

0
1
2
3
4
5
6
7
8

10
12
14
16
18

20

int n [ J = { 1 1 2, 3 , 4 , 5} ;
creer un venare di cinque elemcnci.
Il programma della Figura 6.5 inizializzer i dieci elemenci di un vercore s con i valoci
2 , 4 , 6, ..., 20 e lo visualizzer in formaco rabulare. 1 valori saranno generaci moltiplicando
per 2 il conrarore del ciclo e aggiungendovi 2.
In quesco programma scata inrrodotrala direrriva del preprocessore #define. La riga

6
8

ltdefine SIZE , 0
defmir una costante simbolietl SIZE il cui valore sar 10. Una coscance simbolica un
idenrificatore che sar soscituito con il test di sosftt:uzme dal p reprocessore del e, prima
che il programma sia compilato. Quand0 il programma sar elaborato dal preprocessore,
curre le occo(!'enze della cascante simb9lica SIZE sru:anno sosticuicc dal cesto di sosrituz.i011e
10. Utilizzare le costanci simbollche per specificare le dimensioni dei vettori render i
programmi pit1sca/abifi. Nella Figura 6.5, jJ primo ciclo for potrebbe riempire un vettore
di 1000 elementi cambiando semplicemenre il valore di SIZE nella dirctriva #define da
10 a 1000. Qualora uon fosse scaca ucilizzatala cosranre simbolica SIZE, avremmo dovuro
cambi.ire il programma in ree pos discinri per adattarlo alla gesri.one di un vettore di 1000
elemen. Questa recnka diventer sempre pi ucile per scrjvere dei programmi chiari,
man mano che questi divemeranno pi corposi.

~ Errore tipico 6. 4

Terminare con ttn punto e vgola ttna direttiva #define o #include delpreprocessore.
Ricordate che le direttive del preprocessore mm sono istruzioni del linguaggio C.

/* Inizializzare gli elementi del vettore


'
s con gli interi pari da 2 a 20 * /
#include <stdio.h>
#define SlZE 10

s[j]

=2

/* imposta i valori */

+ 2 j;
1

printf("%s\13s\n", "Element~, "Valu~' );

for (j = 0; j <= SIZ.E - 1; j+-i-)

return 0;
}

Assegnare un vai.ore a una costant.e simbolica in una istruzione es11guibile 1m errore di


sintassi. Una COf'ftlflte >imbolica non una variabile. IL compilatore non le riserva nessuno spaz;o di mmwria, come accade invece con /,e Mriabili che commgono dei valori
durante L'eseettzione.
Ingegneria del software 6.1
Definire In dimensione di ogni vettore con una costanfe simbolica render i programmi
pi scalabili.

~Jemenci in[eri. I.:istruziooc nd corpo dcl ciclo for m ;guir iJ calcolo del rotale-

<= SIZE 1; j ++)

printf('%7d%13d\n ,

Erro1'e tipico 6.5

11 programma nella Figura 6.6 sommer i_ valori eom_enuci n un vercore a di dod ici

int s[SIZE.J, j i

0;

Se la precedente direrriva: del preproce-~sore fosse stara terminata con ua punco e virgola~ mere le occorrenze della cosrame simbolioo SIZE incluse nd progpmma sarebbero stare
sostituite dal preprocessore con il cesto 10;. Ci avrebbe potuto provocare degli errori di
si'ntassi durante la compi lazione o degli errori Logici durame l'esecuzione. Ricordate che il
preprocessore non il C: solo un manipolarorc di resto.

Utilizzate soltanto dei/e lettere maiuscole pe1 i nomi delle costanti simboliche. Ci le
roidenz:r a/L'interno del programma e ricortjer a[programmatore che le costanti simboliche non sono delle v1.~rzbili.

Generare i valori da inserire negli elementi di un vettore.

Bruma abitudine 6.1

ma in()

for (j

Figura 6.5

s[ j]) ;

/*visualizza

valori" /

Il nosrrn esempio urlixzer dei vettori per riassumere i risulrari dei dati raccolti durante un'indagine. Considerare l'enunciato del problema.
>th.to chiesto o quaranta. studenti dfomire zm.a valutazione .sulla qualit dt>L cibo servito
nella mensa dello studente, in conformit a una 1ca/,a da 1 a I O (1 significa tenibile e 1O
eccellente). Sisterrulte i quai-ama responsi in un vettore di interi e riassumete i risultati dei

sondaggio.
/* Calcolare la somma degli elementi del vettore * /
#.incJ.ude <stdio.h>
#define SIZE 12

(e01rti.nua)

C.wrrOLO 6

182

lVEUORl

ma in()

main ()

int a[SIZE] = {1 1 3 1 5, 4 1 7, 2, 99, 16, 45, 67, 89, 45} ;


i nt i 1 tot al = 0;

183

int answer, ratin11;


i nt responses [ RESPONSE_SIZE] = {1, 2 , 6, 4 , a, 5, 9, 7, 8,
10, 1, 6, s, 8 , e, 10, 3, a, 2, 1, 6 , 5, 1 , 6, 8, 6, 1,
5, 6, 6, 5, 6, 7, 5, 6, 4, 8, 6, 8, 10};
ir'lt frequency[ FR'EOUENCY_SIZE] = {0'};

0 ; i <= SIZE - 1; i H)
total += a[il;

f0 r (i

for(answer = 0; answer <= RESPONSE_SIZE - 1; answer++)


++frequency[responses[answ er l li

printf('Tot al of array element values is %d\n", total);


return 0;
}

Figura 6.6

printf( "%s%17s\n, "Rating , "Frequency " );

Total of arl'ay element va lues is -38'3

for(rating = 1; rafing <= FREOUENCY_SIZE . 1; rating++)


pr intf("%6d%17d\n", rating, f r equency( r ating]);

Calcolare la somma degli elementi di un vettore.

Q uesca una tipica applicattion e dei veCToci :{co.nsulcace .la Figura 6.7). Vogliamo riasSllmere il nwner d ei responsi di ogni ripo (vale a d ire, da 1 :i 10). LI vettore responses
sar d u nque formato da 40 elementi che comerra.nno le risposce degli srudeoci. Utilizzeremo uo veccore di undici elementi, f requency, per contare il numero di occorrenze di ogni
responso. lgnoFeremo il primo elemento, frequen c y[0 ]. perch pi logico incremenmre di 1 il responso f requenc y [ 1] che f r equency [ 0 ]. Ci ci consenrir di miliuare
diretcameme ogni responso come indice del venare frequenc y.

ret u r n 0 ;
}

Buona abitudine 6.2


Adoperat~i per la

chit1rezt;11 del progrilmma. A volte potr essln utilerftl1J1u:1/e ad uri


iufo:vm:e-rj'i 1{na ~eritt1m1

11so piu efficiente dt'Lla rnem<1r1, o de.I tempo.dcl proe.rsore,


pi chiara dei programmi.

1:

Rating
1
2
3
4
5
6
7
8
9
10

Fr equency
~

2
2
2

5
11

5
~

Obiettivo efficienza 6 1

A volte L'elemento de/L'efficienza ha molta pi importanza di quello della chiarezza.


Il pdmo ciclo for rilever le risposte, una per volta, dal vettore responses e incrementer uno dei dieci conrarori (da f requency[1] a frequency [ 10]) inl.usi nel vettore
frequen oy. l:imuzione principale nel ciclo :
++frequency,[rspo nses t answer]J;
Q uesta istruzion e incrementer in frequency il comacore appropriac secondo il va.lare di
responses[answer]. Per esempio q uando la variabile coocarore. answer varr 0 ,
responses[answer] varr 1, perci ++frequency[responses [ answer] J; sar;i inrerprerara in realr come
++frequency[1 j;
/* Programma per i l sondaggio degli studenti
#include <stdio . h>
#qefine AESPONSE_SIZE 40
#define F REQU EN C~_S I ZE 11

~1

Figura 6.7

Un semplice programma per l'analisi del sondaggio degli st udenti.

cheincremenrer l'elememo uno del vcccore. Quando answer varr 1. responses [answer]
varr 2, perci ++frequency [ responses ( answer]]; sar interpretata come
++frequency(2J;
che i,ncremenrer l'elemenco due del veccore. Quando answer varr 2, responses [ a nswer J
varr e; perci ++frquency[ responses [ answer]]; .sar interpretata come
+H r equency l 61 i

che incrementer l'elememo sei dc.I veccore e cosi via. Osservare che, indipendememenre
dal numero dc:lle risposte elaborate nel sondaggio, per riassumere i risulraci sar necessario
un"Vetrore di solo undici demenri (ignorando quello con indice O). Qualora i dari concenessero dei valori non validj , come 13, il programma avrebbe centaco dj aggiungete l a
f req uency[13] . Quesro indice per avrebbe superato i timici del veccore. Il C non ha
nessun controllo mi Limiti dei vettori che consentii di evitare che il computer faccia riferir>terr.to
a un elemento inesutentl/. Ne consegue che un programma in esecuzio11e porrebbe ol.rrepassa.te i conft.ni d i un vttore sen~ alcun avviso. Il p rogrammatore dovr quin di assieurarsi.
cbe tu rti i riferimenti al vettore rimangano all'interno dei suoi lim iti.

184

CAPITOLO

E1rore tipico 6. 6
Fare riferimento 11 un elemento errerno ai limiti del vettore.
B11011a

Element
0

Value
19

2
3
4
5
6
7
8
9

15

abitudine 6.3

Quando scorrere un vettore, il mo indice non dovrebbe mai scendere sotto lo Oe dovrebbe
essere sempre inferiore al numero totale degli elententi indusi nel vettore (dimensione I). AJiicuratevi che I.a condizione di terminazione del ciclo prevenga l'accesso a elementi esterni al sudderto imervall{J.
Buona abitudine 6.4

Menzionate l'indice pi alto di ttn vettore in u:ru1 struttura tor, in modo dd aiuture a
climinal"c gli errori di imprecisione-di imo.
Buona 11bintdinc 6.5

) pogmmmi dovrebbero vi:rifli:me lb g,1-rh:te'zza di tutti i v1dori presi in input, in modrJ


da evitare che delle informazioni emJtepssno influenzo.te i calcoli di un programmtt.
Obiettivo efficienza. 6.2

Gu effetti (11ormalmeme gravi) di riferimenti a elementi esterni ai limiti di un vettore


dipendono dai sistmut.
Il nostro prossimo esempio (Figura 6.8) leggera alcun.i numeri da un vettore e preseoccr
quelle informazioni in un grafico a barre o isrogralnma: a fianco a ogni numero sar visualizzato
una barra composta di alrreuanci asterischi. Il ciclo for rudincaco disegner effenivarneme le
barre. Osservare l'ucilizzo di printf ( \ n ) ~ renninare ogni barra dell'istogramma.
/ * Programma per la visualizzati!)ne d::i,
#i nclude <stdio.h>
#define SIZE 10
;

i~tog rammi

185

VETTORI

Figura 6.8

11
9

13
5
17
1

Histogram
..,.~

* 11"*** 'lt lr-lo i!**

***

"'***-**lt.***'*****

.........*'..

,,. **.'I*~~-
**-** ..****
**'******":*:***
"'****

lr ... ***-'!: +;.*dt."ri. lr ...........

"

Un programma che visualizza Istogrammi.

. _ Nel Capirol~ 5, abbiamo affermaro che vi avren;:urr rilosu:aro un metodo pi elegante


diqueUo dcUaF1gura 5.10 par scrivere il programma di }ruJci dei dadi li problema richiedeva di lanciare 6000 volte un dado con sei facce, in mlo da verificare se i.l generatore di
numrj casuali producesse effecti.vamence dei valori a caso. Nella Figura 6.9 mostrata
una -versione con vettori dello scesso programma.

Fino a quesro ptmro abbiamo discusso solranco dei vetto[i di interi. I vercori per sono
in grado di conservare dati di qualsiasi ripo. Discuteremo ora dell'immagazzinamenco delle
stringhe nei vettori di cararceri. Pi.no a questo punrn, l'unica capacit di elaborazione delle
stringhe di cui abbiamo crarraro stara la stampa di una stringa con printf. Nel linguaggio C una stringa come "hello" in realt un verrore di cararu:.ri individuali.
/* Lanciare 6000 volte un dado a sei facce */
~include

<stdio.h>
#include <stdiib.h>
#include <time.h>
#define SIZE 7
ma in ()

main()

int tace , roll, trequency[SIZE] = {0};

int n[SIZEl :: {19, 3, 15 , 7, 11, 9 1 13, 5, 17, 1};


int I j j

srand(~ime(NULL));

prin'tf.( "%s%13s\17s\n" , "Elern!lht"J "V?l.u.i;l", "Histogram")i

f6r (roll = 1; ro ll <= 6000; roll++) {


tace= rand() % 6 + 1;
++frequency[face];
I* sostituisce lo swtch di * /
}
/* 20 righe della Figura 5.8 */

for (i= 0j i <= SIZE - 1 ; i++) {


printf('' %7d%13d
, i, n[i]);
for(i = 1; j <= n[i J ; j++)
printf("%c'', '*');

/* visualiLZa una barra */

printf( "\s%17s \n", "Face, "Frequency')i


for (tace= 1; tace<= SIZE - 1; face++ )
pr intf( "%4d%17d \n", tace, frequency[face])i

printf("\n ' );
}

return 0;

return 0;

(contimill)

186

CArrrnLo6

Fa ce

farro con le altre variabili . Normalmenre l'operarore & utilizzaro per indicare a scanf
la posizione di una variabile all'interno della memoria, cos che vi ci possa imrnaga:u.in.are un valore. Nella sezione 6.5 discmeremo del passaggio dei veaori alle funzioni.
Vedremo che il nome di un ver;rore in realt l'indi.rizw dd suo primo elemento;
proprio per questo motivo che l' opcrarore & non necessario con la scanf.

Fr equency
1037
987
1013
1028

2
3
4
5
6

95~

983

Figura 6.9

Programma per il lancio di un oad c he utilizza i vettori invece di una


struttura switch.
Fi.no a questo punto abbiamo discussQsolranto dc;i vettori di interi. J verrori per sono
in grado di conservare daci di qualsiasi cipo. Uisqicercmo ora_ddJ' immagazzinamenco delle
stringhe nei veuori di caratteri. Fino a questo punro, l'wca capacit di elaborazione delle
srrmghe di cui abbiamo rratraco s tata I.a scampa di una srringa con pri nt f . N el linguaggio C m1a srringa come "hello" in realt un vettore dl caratteri Individuali .

l veuori .di cararte~i hanno molce q ua:lic, singolari. Essi possono essere ini"l.ial izzari
utilizzando una stringa lerterale. Per esempio la d ichiarazione
char string1[] = 'first';
iniz.ializzer gli elementi del vercore string1 con i caratteri individuali della stringa letterale "first . La d imensione del vecrore string1 della precedenre dichiarazione sar decerminata dal compilatore in base alla lunghezza della stringa. importante notare ch e la
stringa f irst conterr cinque caraneri pi n9 speciale, deno carattere nullo, per la
reonioaz.ione della stringa. Di consegueru<L il veuore s tring1 conterr in realt sei dementi. La rapp rcsen razione come coscaoce di caranere del cararcere nullo '\0 '. Turce le
stringhe in C cerroinano con quesco earaccere.. Un ven ore di caraaeri cbe rapp resenti una
srringa dovr sempre essere dichiaraGl con una dimensione sufficiente a contenere il numero dei cararteri della srringa e quello nullo di terminazione.

J vecrori di caracreri possono an che essere ini7.ializzati con singele costanti di caranere
sistemare all'interno di una lista di inizializza,tori. La dichiarazione precedente equivaleore a
char string 1 []

= {'f',

'i ' ,

187

1VEIT0RI

r',

s'! ' t ', '\ 0 '};

responsabilir del program.marore assicurarsi che il veaore destinarario sia in


grado di contenere qualsiasi suinga l' meme possa digirare alla rascicra. La funzione
s canf Legger i dari dalla tastiera finch non avr inconrraro il primo carattere di
spazio bianco: non si preoccuper di quanro sia grande il vertore descinacario. Di
conseguenza, sca nf porr scrivere anche olcre la fine del vetrore.

Errore tipico 6. 7
Non fornire a scanf u.n vettore di camtteri St,(,ffidr~temente grande pt:r imrrlllgnzzinnrc
tt1ir1 stringa digit'titrl ali.a tastiertt, poh" causare in tm progrdmrna una p1:1-dita di dati e
altri errori durnnte l'iecitzione.
Un vetrore di caratt;eri che rapp resenrj una s.tringa porr ssere inviato in ourpur
il venore stri ng2 sar visuali.z.zato con
l'ismiz.ione

~on pri ntf e la speci fi ca di conversione !\ss.

printf( "%s\ n", string2);


Osservate che anche p ri ntf , come sc a nf , non si preoccupa di quanro sia g rande il
vettore di caratteri. I caratteri della srringa saranno visualizzaci finch 1100 verr inconrraro
un carattere nullo di terminazione.

La Figura 6.10 mostra l'inizializzazione di un verrore di cara.aeri con una stringa le.ccerale, la leccura d i un a stringa in un vermre d i cararceri, la stampa di un vettore di caratteri
come una srringa e l'accesso ai singol i caratteri di una srringa.
/*Trat tare i vettori di caratteri come stringhe */
#include <stdio.h>
main()

ctiar string1 [20], s t ri ng2[ 1

~st ring

literal";

Daro cbe una stringa in realt un venre di caratceri, potremo accedere direttamente
a ogrruuo dj essi uriliz1.ando la notazione con gli iodiei di vercore. Per esempio, s tri ng1 {0)
sar il car<'tttere 'f ' menrre string1 [3] sar 's '.

int i;

Porremo anche prendere in input-dalla mstiera w1a stringa e siscemarla di rettamente in


un vettore di cararreri, u tilizzando scanf e la ~ecifiqi di conversione !\ss . Per esempio, la
dichiarazione
char string2[20];

print'f("Enter a s t ring: ");


string 1 );
printf ( 11 string1 is: %s\nstring2: is %s\n"
"stringi with spaces bet wen chara cters is: \ n'',
string1, string2);

creer un vecrore cli caratterj io grado di immagazzinare una stringa di 19 caratteri olrre a
quello nullo di terminazione. I.:isrruzione

fo.r ( i = 0; s t ring 1[ i ] I= ' \ 0 ' ; i ++)


printf( "%c ~ . string1[i]);

~canf ( "%s",

scanf( "%s " , s t rng2);


legger una scrioga dalla casciera e la immagauiner in string2. Osservate che il
nome dd veaore srato passato alla s canf se:nza farlo precedere da &, come abbiamo

p r i ntf( " \n " );


r eturn 0 ;
}

(etmtimUJ)

188

CAPITOLO 6

Enter a string: ~ello there


is: H~tlo
string2 iS: string literal
stringt with spaces between

189

t I vettori statici sono inizializ zati a zero * /


#inolude <~tdio.h>

str~ngt

He l 1 o

I vrnoru

char~cters

s:

Figura 6.1 O Trattare i vettori di caratteri come stringh~.

void staticArr aylnit(vo id);


void a utomatic Arraylnit (void);
main ()
{

printf( First cali to each function: \n'') i


st aticArr ayinit();
automati cArrayin it();
printf( "\ n\ nSecond call tO each function :\n ") i
staticArr ayin it();
automaho Arrayinit () ;
return 0;

La Figura 6.10 ucilizZ. una scrurrura for per scorrere il vettore string1 e visualjz~.re
i singoli ~atteri_, separati da spazi, milizzando la specifica di conversion e ~c . La condizione della smmura for , stringt [i] I= '\ 0' , sar vera finch nella srringa non verr
inconttato il cararrere nullo di rerminazione.

Il Capicolo 5 ha trarraco la specifica cli classe di memoria static. Un variabile loc;ale


static dichiara.ca all'iorerno di una definizione & funzione esister per runa la durata di
un programma, ma sar visibile solcamo nel corpo della funzione. Ponemo applicare static
alla dichiarazione di un vertere locale, per fare in modo ch quesro noo sia crearne inizializzato
ogni volta che la funzione sar imrocara, e che non sia discrurco ogni-volta che il programm a
uscir dalla funzione. Ci ridurr il tempo di esecuzione dd programm a, io modo parricolare per quelli ch prevedono frequenti iovoooon i di funzioni che dichiamoo dei veEtori
di dimensioni ragguardevoli.

I * funzione per di mostrare l ' uso di un vettore locale statico * /


vois staticArr ayinit(vo id)
{

st'at i c int a [ 3] ;
int i;

Obiettivo efficienza 6.3

printf("\n Values on e ntering staticAr rayinit:\ n ");

Qualora una /unzione cnmbiMse fretj11mtemente il suo stato di visibilit e contenesse


dei vem>ri automatici, questi d!Jvrebbero essere resi static in mod!J da evitare che siano
creati <rgni volta che fa fanzione sar richiamata.

tor ( i = 0; i <: 2; 1++)


printf( "array1[% d] = %d

f vercori dichiarati static saranno iizializzaci aucomacicamenre una sola volra, durante la fase di compilat..ione. Qualora un venare static non fosse sraco inizializzato
esplicitamenre dal progralUnator~, sarebbe azzeraco dal compilawre.

ati));

printf("\n Values on exiing staticArr ayinit: \ n" );


tor (i = 0 ; i <= 2; i++-)
pri nt f ( "array1 [%dl = %d

La Figura 6.11 JllOStra la funzione staticArr aylnit che utilizzer un vercore locale
dichiaraco static, e una fum,ione automati cArrayin it che user invece un ven:ore
locale amomaric.o. La funzio ne staticAr raylnit sar ri.chiamarn due v9lre. Il vettore
locale static dichiararo nella funzione sar azzerato dal compilacoI"e. La funzione visualizzer
il vettore, aggiunger 5 a ogni suo elemenro e lo vlsualiu.er nuovamen te. Quando la
funzione verr rkhiamaca _per la sec<;>nda volta, il veccore static coo(crr i valori immagazzinati durante la prima invocazione della funzione. Anche la funzione automtic Arrayinit
sar tichiamaca due volte. Gli elementi del vettore locale aucomacico dichiarato nella funzione saranno inizializzaci con i valori 1, 2 e 3. La funzione visualizzer il vettore, aggiunger 5 a ogni suo elemenco e lo visualizzer nuovamente. Quand0 la fw1zione verr ric.::hiamara per la seconda volca, gli elementi del vercore saranno nuovamente inizializzaci a 1, 2 e
3 poich il vettore avr una permanenza aucomarica nella memoria.

i , a[il += 5)j

}
f~ funz ione per' mostrare l ' uso di un vetto re locale automatic o *I
vod automati cArrayln it(void)

i nt a[~l
int i;

{1, 2 1 3};

printf( "\ n\nValues on enteri ng automati cArrayin it: \n") ;


tor (i = 0; i <= 2; i++)
printf( "array1[%dJ = %d

0[i]) j

Errore tipwo 6.8

printf("\n Values on exiting automatic Array init:\nijl i

Presumere che gli elementi di im vettore locai.e, che sia stato dichiarato static, siano
azzerati ag12i volta die sar richiamata la fonzione in cui il vettore stato dichiarato.

for (i

= 0;

i <= 2; i++)

printt( ija rr~y1[ %d ]

= %d

i, ali) += 5);

(continua)

190

WffbL06

F!irst ~-1;. to eaeh funotto:n:


Value-s on ~nt-e.riong statiGArrayln't:
array1[0J' = 0 ~ rray1l = 0 array1[!2.]., 0
Val.ues. 't>Q ltXiting s.'t'iJ\ ieAr.-raylni.Lt:
ar.'~~y1{0J =- 5 .arrvay1[1j = 5 -<ttr'y1[2] =5
Vi~lues Oli errt~J'-in.Q automraticArrl!~!n!t:

'PraY,ll!l.fl.J = 1 arl?a,y;2[1 l
V~I11~s

=~

arr.ay2t~l ~ r4

Oll eJ<'*';L;ftfl a:LI""to111a1J..0Ar.raytn'it:


e ~~ray_~(1J = .,., arl"afif')

al"r-ay2r0r=

Valffes S:R
~PPQ.V<1 !0]

.on

= -~.

,e!5!,~~ng

'2J

Liil

'aPra$2~tJ

"'!:

2 ~pr~~~1'2l : ~

~e<S on &~~t:<i:n:g ~utomatie-h:P'P~~Init:


~rray2[Q.~ -= 6'' ,af'~lil~.2( ~ .J = 1' !ff~j'.2 (2.)

Obiettivo efficienza 6.4

ll passa~io dei vettori iJ:Z una ,h!'rnataper riferiflf.iifo 1rul4t.ttt. h'ti U:n senso. per ragioni di efftien7,;1z. 1'ijlztti;_passan: unvettore pr valore iip.1ifc4 pmsdre unacopiti di ognuno
t/i siH eLetifenti. Ovvit.zv~e1it,e, per dei v11ttw.i. di dimensioni ragguardeuoli passatifit!qua7itemenfe, ci sarebbe dispendioso in termini di r:empo e si w7mtmerebbe itnaonsidert:110le quantit di memor:ia.per I.a lm"O copia.

/* t1 r'lme di un vettore equivalente a &ar.ray[0J '!!./


#nclud !<stdio.h>.
main.()

Vi..a.lue:s e.A ~ni:eR~ng ~u"j.;,~llfa'ti~A~R<l'YI-noi}-:

i:l"r~ir'U -,,,: i

191

t!sai:;l per vL~l)aliizarq.gli indicizzi. Laspedfca di conversione %p normalmente visualizza gli indir2Z corhe numeri esadecimali. 1 numeri esade<i;in:m.li (in base I 6) si;mo forma.ti dalle cifiei:d~.O a 9
eda.Ue lettere da A a .F. Essi sono uriliza.ari spes;s9 come nor.az.iom:.:abbi;tvi,aca per dci v.lori. interi
g~andi. tAppcndie.e E, "I ~isremi numerici", fomis-ce un~ trarraziomi approfondira. sulle ~ela.zion.i
.rra:gliJ:nreri binaci (in base 2), gli ottali .(io base 8), i d~irna.li (in base IO; gli i.rireri-srandard) e gl.i
~~decimali. Cou:tp~1t1m;istte)" che aiiray e &arry [0 J av.ranno:Io sresso v.lor, vale a ~fae F.FF.0.
I..ipurput.di (JLi_St'o progti:tuina di_pendet dal sisretna, ma gli indirizzi saranno sempre identiei.

en;t~pi,n.g ~a~~A.r.RJlyln,'i.t-:

~r'ra~ tt f4J ,. '5 arrB1yi '2l -= -5..


S*.!iti'OArrtay In.it~
.
am~~1[0J ;:: 1,10 '1fr:ray 1n J "';' 1~ a:p,r-l!iY.1
= 10

Va1ueis

] VEJITORL

='

char array[5J;
pd.ntf ( lo

arr:ay .:: %p\n&array r0] : %p'\ 0 li 1

array, &array[0]);

Figura 6.1 I I v~ttari. statici saranno azzerati _automatic;llTieme; qualora non siano.stati

return 0;

inizjalizzati ~plicitamente dal programmatore.

6.5

Passare i vettori alle funzioni

Indichere[e il nome.del vettoresenza. paremesiq.uadre per passa.re a una JiUIZioii~ un argomento


d.i quel po. -J?-er .esempi~ ~e .il..vbwre hour1yTemper atures fosse staro dichia.ram come
irit heurlYTempratufesf 24 J ;

l':istt.uzioae per la chia:111ata della funzl:one

~rra,y =-

&arr~~(0J

FFF0

=- Fi:F..0

Eigura 6. 12 Il nome di un vettor-e equivalente all'indirizzo del suo prime;> e lemento.

~ Ingegnm,ia.del software 62

modi'fyMray(hourlyTemperatures, 24-) i

p.;issereb.be il ve.ttot~ ho1,1rlyTemperatures e la. sua dimensione alla.-f;i:inzione ~odif~Arra~.


Q.u;i.:ndo $.i p.Ssa a lUl<I, funzione Ili'.) v~r<;>re, sp.esso sar passata anche la sua dimensione, 1~
motlo che fa funzione pssa elaboru,e il 11umcr9 spe.i.fioo degU eJ.ernenci in:duSi nd verror~ Il C
passa i vert0ri ru.le fumoru u.riliz1.arfdo aurmaricamerrre una cliiamam p:cir cifetiti:tenro sim.ufata:
la funzione chiamara porr .modificare i valoti dgli. elmeri inclusl nel vetrQre 0tiginale dd

te, d.a11\tltro i suoi singoli e!em~ri.smfl passati pervalote esato~..irien \e me_actacleper lesempliti

chiama.me. ll nome del vettore in realt l'indirizzo del suo .primo elemenw! Daro che sar
passato l'iodiri220 lnizlal~ dd vrtor, la funi.ione chiamar.a. conoscera precisamente le locazioni
in cui q~t\Jcimo ~rac~ m~orizzarp, Di "onsc:gueoza, quando a.ltimemo del suo corpo la
fi:rmione dllinata modifiche.. gJj dem_nci ~I v.rtort; ~a sr modi.fieando effettiva:rnence
quelli del .c;hiapiante dirertam!'lte. nelle lorq lacZ.ioni di mrndti!j: ocigi.n;i.rie,

La Eigura 6.12 cl:im_ostrero che-:il nome di un venofe in realt l'incilma:o del suo pcimo
e.lem~mo, vis!Jafuzando, ar~y e &array[0] e usando %p: una spe~~.spcifka di ,.onversione

Sar>p,qssibi{f!,j>assa'rt: ttn-tiettoreper iJii!pr, 7.fti/iZZ(l,tu/,p


remq nel Ca.pitoh IO:

i'rt st:mp(ice mtco che spighe-

S.e&t un lato i vmori eompleci sono passa.ti con uua&mulazione de~ G.b.iatna.ta. p:Cr rifcrimen~
variabiJi. Qti~ci semp.lici.siagoli pezzi di dat),sgno dc;tr.i scal~ri o tjil!t1J:#t{J siJ./ifi. Per p:!S.Sarea una
on<; p:n_el~meot9 di un v<;i;rote; uriLiZZ(?reteil .suo nme tn<li.cizizati:> come argoiento nella
,~~tjtdeUa_funzisine. Nel 01piwlo 7" mo-sermo eome siri:rnl:te rrrra.chiamata.per rifeci.men~o p:w,.gll ~ari (ovyerosia, per le sing0lev.i:ribili e gli elemeflti dei vettori)',

La liru..~~i parametri di una fonz.ipne dovr~ s_pecif<;are .es.pliciramente th.e sar rkevufo
u1n:ett~et affint:b_. quest-0 _possa~ere ric;aruro arrtaveri la diiamaca. Pe.1' esempi.o., .l'ini:esrai iqne p.e_i: la funzione modifyArray poa:ebbe esre.re.scrftta ron:ie

1/oid modifyArray(irit b[J,

int

!?iz~)

192

CAPITOLO

J vrri-roru

e Lndicherebbc che modifyArray accetter nel parametro b un veccore di inceri e in


size il numero degli clemenci inclusi nello stesso. La dimensione del vettore all' incerno delle parencesi quadre non obbligatoria. Qualora fosse stata inclusa, il compilarore l'avrebbe ignorata. Dato che i verrot=i so.no passati aucomatica.mence con una chiamata per riferimenco simulata, quando la fwuione chiamaca urilizzer il nome del
vettore b, in realt far riferimenco a quello effecrivamenre dichia.caro dal chiamante (il
veuoce hourlyTemperatures nella chiamata precedente). Nel Capicolo 7 incroduricmo alrre notazioni per indicare che un veu:Oie verr ricevuto da una fum.ione. Queste
no.razioni, come vedremo, sono basare sull srrena correlazione che intercorre ua 1
vettori e i puntarori del linguaggio C.

printt ( Effects of passing enti re array c al "


' by reference:\n \ nThe val ues of the
"original array are:\n");
far (i= 0; i<= SIZE 1; i++)
printf( "\3d " , a[ i J);
printf( "\ n" );
modifyArray(a, SIZE); / * i vettori sono passati per riferimento /
printt( "The values of the modified array are:\n " );

Osservare lo sc:rano asperro dd procotip.o di funzione per modi fyArray

f ar

voi d modifyArray(int (], i nt );


Avremmo poruto scriverlo anche come
void modifyArray(int anyArrayName [ ), i n'I;

~ Buona abitudine 6.6

Alcuni programmatori includano i wmi de!li! vttriabtli all'intemo deiprototipi di fimzione,


in mada da rendere pi chiaro ii programma. Tuttavia, il compilatore li ignorer.

void modifyArray(int b(J, int size)


{

int j;

Ricordare: il procoripo indica al compilatoce il numero degli argomenti e il tipo di


ognuno di quelli che vi appaiono {nell'ordine in cui saranno convalidaci).

TI programma ddla Figura 6.13 mosrrer la differenza tra il passaggio di un incero


vettore e quello di un suo dememo. Il programma visualizzer in primo luogo i cinque
elememi del vertore di interi a . lrr seguiro, a e la sua dimensione saranno passaci alla
funzione modifyArray, dove ogni elemeruo di a sar moltiplicaco per 2. Quindi, a sar
visualizzaco nuovamente alJ' intemo di main. Come dimostrer l'oucpur, gli dementi di a
saranno srari indubbiamente modificaci da modi fyArray. A quesro punto il programma
visualizzer il valore dJ a [ 3) e lo passer alla fumione modi fyElement. Quesca molriplicher per 2 i suoi argomemi e visualizzer il lqro nuovo valore. Osservate che, quando
a[3] sar visualizzato nuovamente all'in r~.mo di main, esso non risulter modificare perch gli elemenci individuali dei vettori sar;mnc;i scati passati per valore.
1~ Pas sa~e alle f unzioni i vettori e i singoli elementi di un vettore */
#include <stdio .h>
#define SIZE 5

void modifyArray( i nt [], int);


vo i d modifyElement(int);

1~ s~ mbra

main()
{

int a[SIZE]
int i;

(i~ 0; i <= SIZE


1; i ++)
prfotf( "%3d", a ( i));

printf("\.n\n\nEffects of passing array element call"


"by val u e:\n\ nT~ e valu e of a[3J is %d\n 11 , a[3 J)i
mod ifyE_lement(a[3));
printf( "The value of a(3) is %d\n", a[3J);
return 0 ;

anyVaria b leNam~);

ma, come abbiamo appreso nel Capitolo), il compilatore C ignora i nomi di variabile
posti all' interno dei prococipi.

193

{ 0 I 1 1 2 l 3, 4.} j

strano */

for (j = 0; j <= size . 1 ; j++)


blj) *= 2;
}

void modifyElement(int e)
{

printf("Value in modifyElement is %d \ n ", e*= 2);


}

fff.&cts of passin:g entfre array eall hy r.efe1renc9:


T~e valu~s o~

ttie originai arra~

0
The

ar.:

values o'f tl'le niditied array ar.e :


2

4. 6

Effects of

pas~ing

array element call

by

value:

Th value of a[3) ia 6
Value in odifyElement ls 12
The value of a[3J is 8
Figura 6.13 Passare alle funzioni i vettori ei suoi singoli elementi.

....................... .................1911...................... ...............aj


194

CAPITOLO

Nei vostri programmi, ci saranno molte situaiioni in cui a una funzione non dovr
essere consenciro di modificare gli elemen t i di u n ven:ore. D aro che i vea:ori saranno
semp re passati per riferimen to simularo, sar difficile conaollare che i valo ri non
fornisce lo special~ qua.lifcatore di tipo con st proprio per
siano m odificari. l i
prevenire, all'interno di una funzione, la modifica dei valori conrenuci in un vertore.
Quando un parametro di cipo vetcore sar preceduto dal q uaLfcarore c o nst , i suoi
elementi d iventeranno delle costan ti nel torpo della fu nzio ne e ogni rencacivo di modificarli, in quel concesco, p rovocher un_ euore in fase di compilazione. Ci consentir
al programmatore di correggere un programma in modo che non provi a modificare
gl i clemen ti del vercore. Per q uanto il q ua.life_a tore c on st sia scato ben defniro nello
scandard dell'AN SI, i vari sistemi C no.n lo appli<:'ano allo stesso modo.

VETTORI

COmpillng FIG6_14.C:
E~ror FIG6_14.C 1o: Cannot mod if~ a ~onst object
Er r or FIG6_14. C 17: Cannot modify a const obje.ct
Er ror FIG6_14 .C 18: Ca nnot modfy a const object
Wa r ning FIG6_14 . C 19: Par ame'ter ' b ' i s never us ed

.La Figura 6. l 4 mosrra l'uso d elqualifca.tre con st . .La funzio ne t r yMod ifyArr ay
s;tr definira con il parametro cons t int b [ ), il quale d ichiarer il vettore b come
una costan te che, in q uruuo cale, no n porr esere modificata. L'o urput mostra i messaggi dj en orc che saranno e messi dal compilacere Bo.rland C ++. I ere rcnracivi della
fu.azione di rnodifcare gli elementi dd vertore p rpvocheranno ognuno l'errore "Cannot
modify a co ns t o bj ect . " ("Lnpossihile modificare un oggetto const.") del compilarore. li q ualifcacore c onst sar discusso nel Capirolo 7.

~L_s0Lifw.~a-~_e_6.~.3~~~~~~~~~~~~~~~~~~~
~ia_de
rti("l _l~1zg;~e2-gn_er

Nella definizione di unn fa1rzJne, il qualij{clltore di tipo const potr mm applicato


a un parametro di tipo 11ettore, per evitare he il vettore originale sia modificatn net corpo
della funzione. Questo un altro esempio del principio dei minimo privilegio. Alle fonzioni non dovrebbe essere mai tUita la possibilit di modificare un vettore, sempre che
non sia assolutamente necessario.

Dimost rare l ' uso del qualifi catore di tipo const */


#include <stdio. h>

figura 6. 14 Dimostrazione dell'uso del q ualificatore d i tipo c onst.

6.6

ma i n ()
{

i nt a [ ] = {10 , 20,

~0} ;

tryToModi fyArr ay( a) ;


pr intf("%d %d !\ld\ n", a [ 0J, &[11, a[2]);
r eturn 0 ;
void tryToModifyArray(con st i nt
{

b[ 0) /= 2
r= 2'
b[2] != 2'

b( 11
}

'

.,.,

I* e r ro re */
I* e rro re
/* erro r e

b [])

L'ordinamento dei vettori

T.:ordinamento dei dati (ovverosia, la loro siscemazione in u n ordine particolare, come


a.s1>endcnce o .d iscendenre) uaa delle ;i.pplicaz.ioni pi imporrami nel campo dell'elaborazione demonica. Una banca ordina rurci gli assegni per numer di i::ooco, cosl che possa
preparare i singoli esrrat:ti conca alla fine di ogni mese. Le comp;ign ie telefoniche ordinano
i propri elenchi per cognome e, nell'ambico di quello, per 110me, in me do da sempliGcare
la rieerca d ei numeri cclefonici. ln reoria, rurre I~ or:ganizzaz_io ni devqno o rdinare qualche
dato e, in molri casi, delle massicce quantit di dati. t:o rdina:menro dei daci un problema
inreressa:nte che ha arri raro alcuni degli sforzi pi intensi ddla rkerca informatica. ln
ge,sro capitolo, d iscuteremo quello che forse lo schem di ordinamento pi semplice tra
quelli no ti. Negli esercizi dd Capitolo lZ esam ineremo cori cura deg!L schemi pi complessi che forniscono prestazioni norevolmeme superiori.

Obiettivo efficienza 6.5


Gli algoritmi pi semplici sono rpersopoco efficienti. La loro virt la facilit con cu;
possono essere scritti, collaudati e messi a pmrtu. Ne co.nsegue che saranno spesso neces-

sari degli tdgormi pi complessi per ottenere il massimo dell'ejficienuz.

/*

void tryToModifyArray(const int [J)i

195

Il p rogramma nella Figura 6.15 ordiner in modo asendente i valori dei dieci elernenci .inclusi nel verrorc a. La tecnica d1e utilizzeremo dcrra bt.1bble sort(ordinameruo a bolle)
o sinking sort (ordinamento con sprofondamento), peh::h i valori pi piccoli "risalgono"
gradualmearc a galla sino in cma al verrore (la prima posizione), proprio come nell'acqua
fe bolle d'aria risalgono in superficie, menrre i valo ri pi grandi sprofondano verso i1 fondo
del yeccore (l'ultima posizione). La tecnica preve!e l'esecuzione di diversi passaggi sul
v~i;r9r~. I n ogn uno di essi sar confroa cata ogni coppia di elementi adacenti. Lasceremo i
v\dgrj c.osl come li avremo r:rovaci, q ualora un~ oppi!l si.a gi in o rdine crescente (o nel
ase che I valori siano identici) . I loro v.alori saranno invece scambiaci di posizione all'interno del vectorc, qualora una coppia sia i n ordine cleerScenre.
/'" Questo pr ogr amma ordina i n modo ascendent .e
i val ori di un vett or e */
-#inlude <stdio.h>
-#define S I ZE 10

mai n()
{

int a[SIZE] = {2, 6, 4,


i nt i, pass, ho"ld;

a, 10, 12, 89,

6~ ,

45, 37};
(a>ntinua)

196

CAPITOLO

printf ("Data items i n original order\n");

1;

pass <= SIZE

a[i]~a (i+1J;

/* passaggi I

1; pass++-)

for (i = 0; i <= SIZE - 2; i++)

/ * un passaggio /

if (a[i J > a[ i + 11 ) (
hold = aL1J;
a[i) = a(i + 11;
a(i + 11 = hold;

/ * un confronto

/ * uno scambio 1

pri ntf("\n Data items i n ascending order\ n 11 ) . ;


f or (i= 0; i <= SJZE 1; i++)
p rintf(~%4 d", a[ i]) ;

a[i + 11

ite~s

in original order
4

1e

12

89

68

45"

~1

Data items in ascending order


8 10 12 31 45 68 89
6
4
2
Figura 6. 1S Ordinamento di un Yettore con il bubble sort.

U programma confronrer prima a[9) con a[1] , quindi a( 1] con a[2] , poi a[2] con
al completamemo del passaggio con il confromo cra a[8) e a[9) . Osserva-

a[3] e cosi via fino

te che saranno eseguici solcamo nove confronti sebbeF1e ci siano 10 elementi. A causa dcl modo
in cui saranno effetruari i con&onci sucSSivi, in un singolo passaggio, un valore grande potr
muoversi di molte posizioni verso il fondo di dcl yttre, mencre un valore piccolo potr
~'luoversi di una sola posiz.ione v:erso l'alro. Dopo il primo passa~io, il numero pi g.rand si
sar s.icurameme adagiato sul fondo dl verrori!, V.vrsia a [ 9). Dopo il secondo pas.~aggo, il
secondo valore pi grande sar sicurameme.affondaro in a ( 8 ) . Dopo il nono passaggio, il nooo
valore in ordine di grandezza sar affondato in af 1] . Tutto ci lascer il valore pi piccolo in
a[0] , perci saranno necessari solo nove passaggi sul vettore per ordinarlo, nonostance questo
concenga dieci elernenci.

!:ordinamento sar eseguito dal ciclo tor nidificato. Qualora sia necessario uno
scambio, quesro sar eseguito dai ere assegna.mena

hold=a[iJ;
a[iJ = a(i + 1];
a[i + 1) = hol d;

a[iJ;

La vi.rc principale dcll'ordinarnenco a bolle la sua facilit di implemencazione.


L:ordinamento a bolle per lenro. Ci diventer evidenre quando si ordineranno dei

vet:cori di dimension i ragguardevoli. Negli esercizi svilupperemo delle versioni pi


effcienri dell'ordinarnenro a bolle. Sono anche srari:sviluppati degli ord inamenti notevolmente pit1 effcienci di quello a bolle. Pi ava.nei in questi) cesro, esaminerem.o con
,u.('3 alcuni di essi. I corsi pi, avanULci esamineranno pi approfondiramen ce l'ordinamen.ro e 1a ricerca dei dati.

Studio di un caso: calcolare la media, la mediana


e la moda usando i vettori

6.7

return 0;

Per esempio, se a [i) fosse 7 e a [i + 1 ) fosse 5 , dopo il p rimo assegnamento entrambi j valori sarebbero 5 e il 7 andrebbe perso, da cui la necessit della variabile suppleme.mare hold.

printf("\n ") ;

Data

197

dove la va riabile su pplemenca.re hold immaganiner remporanearnence uno dd due


valo.ci che dovranno essere scambiaci cli posto. Lo scambio non pu essere esegujro
con due soli assegnamenti:

for (i = 0 j i <= SIZE - 1; i++)


printf("%4d", a[i));
for (pass

l vrrrol\I

Co_nsjdereremo ora un esempio pi corposo. l cemputer sono utiliu.ati comunemente per


la compilazione e l'analisi dei risultaci delle indagini e dei sondaggi di opinione. li programma della Figura 6.16 ucili2zer il vercore response ia.izializzaro con 99 opinioni (iJ
et numero rappresencaco dalla coscame simbolica SIZE) raccolce durante un'indagine.
Ognuna delle opinioni sar un numero da 1 a 9. Il -programma calcoler la media, la
mediana e la moda dei 99 valori.
/ * Questo programma introduce l ' argomento dell 1 analisi dei dati di
un' i ndagine.
Esso calcola la media, la mediana e la moda dei dati */
~include <st dio.h>
#-efine SIZE 99

void
void
voi d
voi d
vo:id

mean(int [ ) ) i
median(int [ J ) i
mode(int [], i nt I 1) ;
bubbleSort(intr I );
printArray( i ntr I l;

main ()
{

int frequency[ 10) = {0}.


response[SIZEJ = {6, 7, 8, 9, !;!, 7, 8 J 9 , 8 , 9,
7, 8,
6, 7,
7, 8,
6, 7,
7, 8,

9,
8,
9,
8,
9,

5, 9 ,
9, 3 ,
8, 9 ,
7, 8 ,
8, 9,

8, 7, 8, 7,
9 , 8, 7, 8,
8, 9, 7, 8,
7, 9, 8, 9,
8 , 9, 7, 5,

8,
7,

9,
2,
3,

(amtin1U1)

198

CAPITOLO

5, 6, 7, 2,
7, 8, 9, 6,
7, 4, 4, 2,
4, 5, 6, 1 J

5, .a J 9, 4,
8, 7, 8, 9,
-5 J ;:i J 8 , 7,
6, 5, 7, 8,

I vmoru

6, 4,
7, 8,
5, 6,
7};

199

for (rating = 1; rating <= 9; rating++)


fre q(rating ) = 0;

mean(response);
median(response);
mode(frequency, response);
return 0;

for ( j =0; j <= SIZE. 1 ;


++f req[answe r[j]) ;

j t+)

pr1ntf('%s%11s%19s \n\n%54s \n%54s \n\ n",


' Response ", "Frequency, 'Histogram ,

void mean (int answer[J)


{

2' ' 5

= 0; ) <= SIZE 1 ; j ++)


total += answer[jj;

pri ntf ('The mean i s the ave rage value of t he data\n"


Mitems. The mean is equal to the total of\n"
"all the data iterns divided by the nu~ber\n'
"of data i tems (%d). The mean vaiue for\n"
'this run is: %d I %d = %.4f\n\n',
SIZE, total, SIZE, (flO?t) total I SIZE) j
void median(int answer [ ])

for (h = 1; h <= freq[rating ] ; h++)


printf("*" ) i
printf( '\ n');
}

printf( ' The mode is the most frequent value.\n "


' For t his run t he mode is %d which occu rred '
%d times.\n", modeValue, largest);
}

printf( \ n\s\n%s\n%s\n%s ",


"****"*** ", ' Melian , '**"'"' "'*** "
"The unsor t ed a ~r ay of respon~es is ");

v~id

bubbleSort(int a[))

int pass, j, hol d;

printArray(answer);
buhbleSort(answe r);
printf( ~ \n\nThe sorted array is")i
printArray(answer);
printf(~ \n\nThe median is ele:ment %d of\n 1'
"t he Sli>rted %d element ar r ay. \,n'1
''Far t l"! is run the medi.an is %d\n\n",
SIZE J 2, SIZE, answer[SIZ~ I 2]);

for (pass

1; pass <= SIZE 1; pass++)

for ( j

0;

<:=

SIZE

2j

j++)

> a[J+11 )' {


hold = a I j I;
a[j ) = a [ j +11 i
a [ j +1 J = hold;

if (a [ j J

}
}

void mode( i nt freq[ J, in t answer[])


{

1t1t* *"".

5 ');

i f (freq[rating] > largest)


largest = freq[rating J;
~odeValue = rating;

far ( j

pr intf("\n\s \n\s\ n\ s \ n' ,

tor (rating = 1 ; rating <= 9; rating++) {


printf ( "%8d%11 d
rating, freq [ratingJ);

int j , total = 0;

int rating, j, h, largest = 0, modeValue

0 J

Vid printArray (int a [ J)

int j;
for

(j

0;

<= SIZE 1; j ++) {

200

G'l_Pl1'0LO

if (j % 20 =

i[ ME'croru

2CH

0)

printf ( 11 \n " );

Ttle

.sQ~~ ~rr'~~ is
., .2 2 ~ t1 ~ s &, 11, ~ 4 '4 4 s e1 s fi a s. s
~ 6 6 '{i' ~ 6 6 61 6 6 '(f,, 7 'ife 'if il- il 7 7 7' '!/
7 7 1 7&. 7 71 i 7" 1. 1 7,. 7 7 e; 8 8 S:rie. $ ~

printf( 11 %2d", alj J);


}
}

tB88~~88881&BaBB~J$

Figura 6 . 16 Programma per l'analisi dei dai di un'indagine.

::S

La media proprio quella arirmetie::a cakolata sui 99 val0ri. La fum..ione mean c,akoler la media sommando i 99 ele.memi e dividendo il cisulrato per 99.
.

f}

a g i9. 9

!:),

;s

9 .9 9 9 9 'S ~

~ .~ ~,

Tfl J11e"d.f~n i'S u~m~nli: ~ ~


:t'fl,e ~. ~.a !ls; e1tim~TI~ arra~.
f'Q,r '14h:il 'f.llli ~h' me~l.,11n ~ 7'

1..a mediana. iJ "valo.re di mezzo!!. La funzione median determiner la mediana


:rkhhunando b.ubbleSort p orcLlnare in mado ascendente il vertore delle opinioni e
sdti0nare il valore di mezzo, answer[SIZE I 2J, del veaor oniinaro. Osservate
che qualora ci fosse un num~fO par.i di e.l(!menti, la m:ecliana dovre.b!:>e S'S'ere ealplata
eome la media dei due valoci di mezzo_,Al rnom:~tQ, la funzfone med.ian o.on dis.pqne
di que$.t a .facolr. La funzi'9 ne printArr'ay sar~ iuv.o c.ara per Lnviar in o~tt;putll yenore re~1:.1onse.
La moda il val:re ch ~i pr~senta pi trequencemenre era le 99 opinkmi. La
fun.z.i.me mode d~tetm.iner la moda cqntndp kocc_o-rr,etize di ~gni ri,po di op.iriione e
s_elezionand9 quella on. il vlore maggiore. Questa v.e1;sicme deUiJ. nlnZ!oae mode non
g~cir .n evenm~e pa.r.eggio (co,1lSWtare l'Eserdzio 6. i 4). La f um.ib.rl.e mode _produrr
~nd~"e un i$,togrmtria p-e r fornire un .supporto grafico alla determinazione deUa moda.
La..Pi_gma 6.17 ntiene un esempio di esecuzione di. q~esto prngrarnma. Que,ro e-$empi9
ctim.prend e la maggior P'!m : del1ri: c0muni manip9lazic;ull ciehies~ splitamen:re dai problemi ~he utilizzano i vecrori, inJ.~o il Loro pas.~aggio alleiun~igni.

1
0

2
.'0

2
5

1
~

8
4'.
g
6
7

2a

1;g

.fl*!-*.tt~

'3'
4
5.
8
g

"'' "*

11 .,

...

~.~ ~~

27

~e~TI

:'"*'*"'*'***

Th'e ~a~ .is ttre a~er11:~:e ~al~ g_f tifi~ ,d<ftQ;


it.R a,. Th~ 111ean ;t e-,,aua;J; ~t1> t-h'e toJ.. m
a1f' the: da;ta r,nms Et'~. l;,~~i:i !fy tne rru'fflt:>er
Qii i;.tatta l:t.e-m:s: {991). 'll:l;l m~iff VJlll:.le f~r
tt:Q:.s run. iS': 6:P1 I l'J.9 '" 6. 8.'1B8
1

tlt~~~

.M'edi:an
~......,*~*
The t;l.n~:gr:~~'.d arr(Y "f r~i:i'in;s'3s ls

eja~a7~9e~1~9s&a1s1B
a 7 a s ~. ~ a v- a r 1 ~ $ a a s s 1 s $
~ 1 a 1 a '1, s & s 2 .,, 1<0 e a g a g 1 :& ~
i) 7 '2 -5 ~ 9 4 6" 7 ~9 6 8.,, 8 9 7 8
.,, ~ f '? 5 3 8 7 5 6 4 ~ 6 1 ~ 5 7 8 7

F.igur.a 6.1 7 Esempio &esecuzione pr il programma di analisi dei lati di uh'indagine.

6~8

La ricerca nei vettori

Gpr~~a.mm.roti. lavci'retanrf~ spesso on grandJ quanti:t~ dl dati im,magazzjf,la:ti io yettpr.i.


A;"vohe, potf::.esse:re Jiecess.ario dernrrcinare se .Un vtl;Of<i: Cllt;etiga: Un lem:Jito .che. o'r~
aspnd.a Un dat va/ore. chiave, li pr0sso di .citrov.amerif.O di un par,cicoJru:e elrnento n
un v,ettore detto ricerca. In quesra $e'liane discuteremo dli.e!: reaniche di ricerca: una
semplic.re d~a ricerca lineare e un'altra pi efficienre detra r:erca binaria. Gli Jiserciz.i 6.~4
et~-?.$, alla fine di qu.esro capi:tolo, vi chiederanno di .imp!flm.e.nrar~ l(} v:e11Sioni ricorsive
d~a..ori<>i;;ra lineare i;' .di quella binaria.
L1.1:icercalineare (Figura 6.18) confronta ogoi.elemetH0 del vercore con la chitwe di ricerca.
Da:tQ eb.eil-vettore non~ in un o:rdin~ p;ucicolare, la probabilit che il valore ricm:ar9 $fa
tiitro:Vato n:l prime) ~emenro sar la sn:.ssa dell;ultim.o. fu mt;dia, quindi, il pregramma
Q.ov;r ceQ:fronJire la chiave di ci'tj!rQ! con Ja mer~, degli elementi inclusi nel verro.re.

202

CAPITOL 6

int linearSearoh(int (], int, int);


main()
{

int a[SIZEI, x, searchKey, element;


a[x]

= 0; x
=2 *

<= SIZE . 1; x++)

/*crea alcuni dati*/

x;

printf{"Enter integ~_r search key:\n");


&searhKey);
elemtint = linearSearh(a, search l<ey, SlZE).;
scanf{~\d",

if (element I= -1)
printf{ "Found value in element %d\n", element );
else
printf{"Value not found\n ");
ret.urn 0 ;
int .linearSearch {int array [], int key, int size)
{

for (n = 0; n <=- sue

VETTORf

203

ricerca lineare inefficiente. Nel caso che il ven:ore sia ordinato, potr essere uciliu.ata la
tecnica notevolmente pit1 veloce della ricerca binaria.

/* Ricerca lineare in un vettore *J


#includ e- <stdio. h>
#define SIZE 100

for (x

1; n++)

if (array[n] =-= key)I


retu rn n;
re-turn -1;
}

t,nter integer ~earctt l<eY(;


36
Pound 11a1ue in element 18

Enter integer seareh key:


37
'v'iillue not fpulltf

Figura 6. 18 Ricerca lineare in un vettore.


Il mccodo di ricerca lineare funziona bene con i vettori di picole dimensioni o con
quelli die non sono stari ordinaci. Per i verrori di dimensioni ragguardevoli, invece, la

Lalgori tmo della ricerca binaria, dopo ogni confronto, scarter mer degli elementi del
vcrrore in cui si eseguir la ricerca. I.:algorirmo individua l'demenro di mezzo dd vercore e
lo confronra con la chiave di ricerca. Nd caso corrispondessero, la chiave di ricerca sarebbe stara individuau e sarebbe rescituiro l'in dice di quell'demenco. Nel caso rum corrispondessero, il problema si ridurrebbe a una ricerca da eseguire in una delle d ue roer del
vettore. La ciensa Saiebbe eseguita nella prima mec del vertore, qualor;.i la cbfave dJ
J:i<.::e.rca fosse inferiore al suo elemenrp di mew.o, in cilSo conrrario, la ticerca saJebbc
eseguita nella sconda mec del vercore. l!algorirmo sarebbe riperum su un quarto del
YCn:ore originale, qualora la chiave di ricerca non fosse stata riuovara nel sottovcrrore
sptcifcaro (il frammento del venere originale). La ricerca continuer finch la chiave non
corrisponda aJJ'elememo di mezzo di un sonoverrore, o finch quesco non sia formaro da
un unjco elemento che non corrisponda alla chiave di ricerca (owerosia, qesta non ba
-alcuna corrispqpdem.a nel vettore).
Nella peggiore delle ipotesi, eseguire una ricerca. binarfa in un vetrnre di 1024
demenci richie~cr soltanto 10 con.fronti. Infarti, dividendo ripetutameme I 024 per 2
si otterrebbero i valori 512, 256, 128, 64, 32, 16, 8, 4, 2 e I. TI numero l 024 (21 O)
pu essere diviso per 2 solo 10 volte per orrenere il valore 1. La divisione per due
equivale a un confronro dell'algoritmo di ricerca binaria. Ne consegue quindi che per
ritrovare la chiave d i ricerca in un vettore di 1,048,576 (220) elementi .farebbero
necessari 20 c0nfromi aJ massimo. Per t:icrovare la chiave dj dcerca in un vettore di
un m iliardo di lemenci sarebbero necessari 30 confronri al massimo. Questo uno
straordinario iucremenco di efficienza rispetro alla ricerca lineare, che richiede invece
di eseguire un n umero medio di confronti con la chiave di ricerca pari alla mer degli
elemenri prcsenri od vettore. Per un vecrore di un miliardo di elementi, si rrarra della
differenza tra una media <li 500 milioni di confronci e un massimo di 30! n nwnero
massimo di confronti richiesti da un vecrore potr essere determi nato, trovando la
prima potenza di 2 ch e sia maggiore del numero di elementi presemi ne] vettore.
La Figur 6.19 presenta La versione ire.raciva della funzione binarySearch . Quesra ritever quarrro argomenri: un venore di interi b , un intero searchKey e gli indici
low e high dd vcrrore. Qualora La chiave di ricerca non corrisponda all'elemento di
mez.z.o di un sorrovettore, sar modilcaro l' indice low o quello high, in modo tale che
la ricerca possa essere eseguira su !1 sottovettore pi piccolo. Nel caso c::he la chiave
di ricerca sia Inferiore all' elemen.to di mezzo, l'indice high sar imposraco cpn middle 1 e 1a ricerca ~ar ripresa su.gli elementi compresi rra low e middle - 1. Nel caso
invece che la chiave di ricerc sia maggiore deU 1 elememo di wez.20, l'indice low sar
impostato con middle + 1 e la ricerca sar ripresa sugli elemenci compresi tra middle + 1
e high . ll progran'Ula ucilizz.er un verrore di 15 elemenci. La prima potenza di due
superiore al numero degli elemenci presenti in quesrn vettore sar dunq1,1e lp (i4),
petci saranno nece,~.$ari al massimo 4 confromi per riuovare la chiav~ di t icerca.
Q_uesrn programma utilizzer la fun.zjone printHeader per inviare in oucput gli indici
del veccore, mentre user la foozione printRow per inviare in ourpur ogni srcovercore
ducance il process_o di ricerca binaria. L'demcnco di mezzo di ogni sonovettore sar
marcato con un asterisco (*), in mGdo da indicare quello con il quale sar confroncaca
la chiave di ricerca.

204

CAPITOLO 6

/* Ricerca binaria in un vettore * /


#include <st dio.h>
#define SIZE 15

! VETIORl

205

/*Visualizza un'intestazione per l'output */


void printHeader(void)
{

int i;
int binarySearch(int [], int, int, int);
void printHeader(void);
void printRow(int [], int, int, int);

printf("\nSubscripts : \n");

main()

for (i= 0; i<= SI ZE . 1; i ++)


printf('%3d , i);

int a[S I ZEJ, i, key, result;

printf( '\n ");

for (i= 0; i<= SIZE 1; i++)


ari! = 2 lt i;

for (i= 1; i<= 4 * SI ZE; i+f)


printf ( '' - ");

printf("Enter a number between 0 and 28: ")';


scant("\d", &key);
printHeader() ;
result = binarySearch(a, Key, 0, SIZE -

pri ntf{''\n "} i


}

Visuali zza una riga di output che mostra la parte


.del vettore che i n corso di elaborazione. * /
vod printRoW(int b[ J, int low, int mid, int high)
1~

1);

(result I= - 1)
printf( '\ n%d found i n array element \d\n", key, result);
else
printf( "\n\d not found\n , key);

if

i nt i;
for (i= 0; i<= SIZE . 1; i++)
if (i< low :: > high)
printf (
);
else if (i == mid)
printf("%3d*", bli]); /*marca i i valore d mezzo "I
else
printf("\3d , b[i]);

return 0;
}

int binarySearch(int b[J, i nt searchKey, int low, nt high)


int middle;

printf ( "\n");
while (low <= hgh) {
middle = (low + high) I 2;

p.rintRow. ( b, low 1 middle 1 hig,h);

E_itte r a number 'between 0 anij 2a: 25

if (searohKey == b(mi-Odle] )
return middle;
else if (searchKey < b(~iddl])
high = middle - 1;
else
low = middle t 1;

Swf>scripts :
0

Hl

11

12

13

14

-- ----- --- - - --------- ~-- ----- 0


2
4
6
8 10 "1 2 1'4'* 16 18 20 22 24 26

16

return 1;

118

22 24
24

28
26 28
26" 28

24~

/ * sea r ch Key non trovata */

25 not tound

(continua}

206

CAPJTOL0 6

l VETIORI

207

Colonna O

Colonna I

Colonna 2

Colonna 3

Riga O

a[0J[0J

a[0][1 J

a[0][2J

af0J (3)

a[1 H01

a[ 1)[1]

a[i] [2J

a [ 11 (31

Riga 2

a[2J[0J

a[2 1 (1 ]

a[2J (2)

a[2][3 J

Enter a number between 0 and 28: 8


SubSerJ,pts:
0

0
0

:!!e

1111

11

12

13

18 20

22

24

26

-- - - - - - ---------------- -- -- --2
2

4.
4

6
6*

10 12
10 12
10* 12

8
8

14!. 16

14'

Riga

~8

8*

Indice colonna

8 fu nd lojl array element 4

Enter

Indice riga

nmber betw,een 0 and 28:

Nome del puntatore

Figura 6.20 Una matrice con tre righe e quattro colonne.


Subsi:lr J;pt'S:
0
2
1
-

0
0

-:J<-' -

!
2

- - - -

3
6
6*

8
8

5
-

6
-

10 12
10 12

7
-

8
-

, 4-1' 16

11

10

-- -

18

20

12

13

~4

_.._ - - -

22

2'4

26

28

6 f ound in a rray element 3


Figura 6. 19 Ricerc;a binaria in un vettore ordinate.

6.9

I vettori multidimensionali

I vectoc.i in C posspno anche avere pi di un indice. Va utilizzo tipico dei vettori mulcidimeosionali
la rappresencaz.ione cU ta.beik di valori formar da informazioni organizzare in righe e cokmJU.
Per idenrificare ua particolare clerpenro della cabella, dovremo specificare due indici: il primo
idemificher per convenzione la riga dcll'dememo, mentre il secondo (sempre per convenzione)
ne idencifcher la colonna. Le cabelJe o i vettori che per identificare un parriEolare elemento
richiedono due indici sono detti vettori bidimensionali o matrici. Osservare the i vettori
multidimensionali possono avere pi di due indici. Lo standard ANSI stabilisce che i sistemi
ANSJ e debbano supporra.(e per i Vettori un mini.mo di 12 indici.
La Figura 6.20. illustra una matrice a. Que~ta onterr rt' cighe e quam:0 colonne,
perci si usa definirla matrice 3 per 4. [n g~tieiile, una rn~rricc con m righe n colonne
sar detra rnatrit:e mper 1~. Ogni elemenco nella matrice a identifcaco nella Figura 6.20
da un nome di dencnco avence la forma a (il ( j] ; a rapprescnca il nome della matrice,
mentre i e j sono gli indici che idencifcano univocamente ogni elemen_co incluso in a .
Osservace che i nom i <legli elemenci nella prima riga hanno cucci 0 com~ primo indice;
mentre i nomi degli elemcmi nella guarta colonna hanno rutci 3 come secondo indice.

~ Et-rore tipico 6.9

PtJ,te rifiiripw,zto afl'elernento a [x) (y] dittna matrice usane/a la forma scnnma af x, y) .

UD vectore 111ukiclimensio11_ale pou essere in izi:tlizzaco cntcstualmence alla propria


dichfa.ra.zione, in un modo m olto simile a quello utilizzato per un vettore unidimensionale.
Per esempio, una marrice b [ 2] [ 2] porr essere dichiarara e inizializzata con
int b ( 2)[2 ] = {{1, 2 }, {3, 4}};

1 valori saran no raggruppaci per riga all'interno di parenresi graffe. Perci 1 e 2 serviranno
per ic:z.jafu.zare b [ 0] ( 0] e b [ 0] l 1 ] , menrre 3 e 4 inizializzeranno b [ 1 ) {0] e b [ 1 ] [ 1 ] .
Mell'evenrualic che per una data riga non sia srarn fornico un numero sufficience di
inizializ.zarori, gli elementi rimanend di qudla riga saranno inizialiu.ari :i 0 . Quindi, la
~.idiiarazione

int b [ 2 J[ 2 J = { { 1 }, {3, 4}} ;

mizi;iliu.er b [ 0] [ 0] a 1, b ( 0 ][ 1 ] a 0, b [ 1] [ 0) a 3 e b [ 1] [ 1] a 4.

La .Figura 6.21 mostra l' inizializzazione di alcune matrici conresrualmence alle loro
dichiarazioni. li programma dichiarer tre marrici di due- righe e rre colonne (ovverosia sej
dementi a cesla). La dichiarazione di array1 fornisce sei inii.ializz."lcori in due sottoliste.
la prima sonolisca inizializzer la prima riga della matrice con i valori 1, 2 e 3; memre la
seconda sortol isra inizializzer la seconda riga della marrice con i valori 4, 5 e 6. Qualora
d.a.Welenco degli inizializzarori di array1 fossero cimosse le rarentcsi graffe che raechiud9ho ognun.a delle sotcolisre, il compilacore provvederbbe !!-UCOmaticamence a inizializzare
prima gli elementi d!ilk prima riga e, solo in seguiro, quelli della seconda riga. La dichjarazione di array2 fornir cinque inizializzatori. Quesci saranno assegnati alla prima riga e
quindi alla seconda. Ogni eJemento che non avr un inizializzacore espliciro sar inizializzato
autoroacica.rnence a zero, perci array2[1 J [2] sar ai:z.eraco. La dichiarazione di array3
:fornir ree inizia1iz7-acorisuddivisiin due sonolisce. Que!Ja destinata alla prima riga inizializzer
esplicitamence i suoi due primi dementi con 1 e 2. I l terzo demenro sar invece azzeraco
automaticamente. La sorrolisra dcscinata alla seconda riga iniz.ializzer espliciramenre il suo
primo elemento a 9. Gli ~cimi due elementi saranno azz~i aucomaticamenre.

li programmainvocher gulndi la funzione pri ntArray per invia.re in outpllt ogni elemento della marrice. Osservace che la. definizione deUa funzione specillea il paramecro delJa matrice
come int a [] l 3] . Le parentesi quadre di un veccore nidimensionale sono vuore, nell lista

208

CAPITOL06

/ " Inizializzare i vettori multidimensionali */


#include <stdio.h>
void printAr r ay(int [](3J);
main()
{

int array1[2][3J
array2{2)[3)
array3[2) [3)

{ {1, 2, 3}, { 4 , 5, 6}},


{ 1 1 2, J 1 4 1 5 } I
{ {1, 2-}, {4} }j

pr i ntf("Values in array1 by row a re : \n);


printArray(array1)i
printf ( "Values i n ar ray2 by row 'a:re : \ n11 ). ;
print Array(arr ay2 ) ;
p rin t f(~ V al u es i n array3 by r ow
print Ar ray{array3);

a r~ : \ n ");

r etu r n 0;

Fornendo i valori degli indici, concescualmente .ali<! dichiarazione del parametro,


tonsent:iremo al cornpilarore di poter indica re aUa funzione il modo per individuare
un qualsiasi elernenco del vettore. Nelle matrici, ogru riga fondamcoralmence un
vetctore unidimensionale. Durame l'accesso aJJa marriGe, il compilarore dovr conoscer esattamente quanti elementi ci sono in ogni riga, cos che possa salrare la quantit
app ropcia~a di posizioni di memoria per individ uare un. elemento in una riga parcicola.re. 1)j conseguenza, il compilarore sapr cbe, q uando nel noscro esmpio dovr acce.de.re ~d a [ 1 ] ( 2], per giungere alla seconda riga (la riga 1), dovr s~ l tare io memotia i
tc'.clemenri della prima riga. Solo allora il cornp l:i,rore porr accedere al terzo element0 di quella riga (l'elemento 2).
Molte manipolazioni tipiche delle matrici uc.iliuano la struttura di ripetit.ione for . .Per
e.Sciupio, la srrum.lra seguente azzerer rutti gli elernenci della temi riga della macrice a nella
Figura 6.20:
<= 3;

column++)

Abbiamo specifcaco la terza riga, di conseguenza sappiamo che il primo indice sar sempre 2 (0 la prima riga, menrre 1 h seconda). Il ciclo for far dunque variare solo il
s&:0ndo indice (ovverosia quello della colonna). La. precedeme struttura for equivaleme
alle isrruzioni di asscgnamenro:

int i, j;
tor (i= 0; i<= 1; ii1-) {

= 0;

dci parametri di una funzione che la riceve come argome.nco. Non obbligatorio neanche
il primo indice di un vettore mulridimensiooale, mentre lo sono rutti quelli successivi. Il
ooffipjlarore ucilizzer que.sci indici per determinare le posizioni in memoria degli dc.menti
dei vettori multidimensionali. Tuni gli elementi dei vettori saranno immagazzinaci in memoria n modo consecutivo indipendencemence dal numero degli indici. La prima riga di
una matrice immagazzinaca in memoria sar seguita dalla seconda riga.

for (column = 0; column


a(2J[column] = 0;

void printArray(int a(][3])

<= 2; j++)
printf ( "\d 11 , a {i'][ j]) ; i

for (j

209

f VETIORJ

printf( 11 \n ) ;

a [ 2] [0J
a[ 2][ 1J
a[ 2 J [2J
a[ 2 J [3J

0;
0;
0;
0;

La seguem:e srrunura for nid.ifcarn dc:tecminer il totale di ttmi gli clemenci presenri nella
m:ance a .

i;iy row

ar-e~

4 5 6

11

Values 1n arr:-ayg Ili row

~r..e :

VQ.~Ue.s

i i:i array.1

1 2 ,3
1 2 3
4 5 0

Values i n ar r ay3

by

row are:

2 0
4 0 0
1

Figura 6.2 1 Inizializzare i vettori m ultidimensionali.

for (row = 0; row <= 2; row++)


f or (colum n = 0 j col umn <= 3;
tot al += a [ row][columnJ ;

c olum n +~)

:Ca srrurrura for sommer gli clcmcnci della matrice una riga per volca. La srrurrura for
pi esterna incomincer mposcando row (ovverosia l'i ndice della riga) a 0 , cosl che la
f!>rIDa riga possa essere sommata dalla struttura for pi incema. La srrurrura fo r pi
esterna incrementer row a 1 , cos) che possano essere sommati gli ebnenti della seconda
riga. la srruttura for pi esrerna incremen:rer row a 2, cosl che possano essere sommari
gli elementi della terza riga. Il risultaco sar visualizzare quando la srrumu:a for nidificata
avr terminato la propria c:secu2one.
] programma della Figura 6.22 eseguir molce alrre manipolazioni tipiche sulla matrice 3
per 4 studentGrades utilizzando delle srrucrure for. Qgni riga della marrice rappresenta uno

210

CAPITO L06

srudente, mentre 0gni colonna rappr~enta una votazione in uno dei quattro
esami che lo
Siudenre ha affroncaro durante il semestre. Le manipolazioni della matrice saranno
eseguite da
quamo funzioni. la fwJ1.ip_n e min i mum dereo:nioer il v0ro pi basso di ogni
srudente nel
semestre. la funzione maximum dcrerminer il \roco pi alto di ogni student
e nd Smcscre. La
funzione averag e determiner la media di un parcic0lare srudentc f1el semestre
. La fu.rrLione
pr in1;Array invier in ourpur la matrice bidimensionale in un fummo cabulare
ordinato.
Ognun a delle funzioni mini mum, maximum e pri ntArra y ricever tre:
argomenci: la
macrice st udent Grades (chiamata grades in ogni funzione), il numero
degli srndenci (le
righe della matrice) e il numer degli esami (le colonne della matrice
) . Ogni funzione
iterer.rulla mar.rice grades urili7.7.<lndo deUe strutture to r. La seguemestrurru
.ra t or nidifcaca
tratta dalla definizione della funzione min imum:
far (i= 0; i <= pupils - 1; i+'+ )
for (j = 0; j <: tests - 1; j++)
if tgrad es[iJ[ jJ < lawGra<:te )
lowGrade = grades ( i)(jJ;

2 11
{

int i, j, lowGrade

= 100;

far (i= 0j i<= pupils - 1; i++)


for (j = 0; j <= tests - 1; j++)
if {grad es(i][j ] < lowGrade)
lawGrade = grad~s[i ] (j ) ;
return lowGrade;
}

/ T ~o~a il voto massimo */


int maximum(int grades [ ] (EXAMS], int pupils , int tests}
f
int i, j, highGrade = 0 ;
far (i = 0; i<= pupils 1; i++)
far (j = 0; j <= tests - 1; j++)
if (grade s[ i ][jJ > highGrade)
highGrade = grade s(i)(j] ;

/* Esempio di matrice */

#mcl.ude <stdio . h>


#defin e STUDENTS 3
#defin e EXAMS 4

return highGrade;

int minimum {int rJr EXAMS ], in t I int) j


int maximum{int [J[EXAMS], int 1 int);
float averag e(int [], int);
void printA rray(i nt [ J[EXAMSJ, int, int);

/* Determina il voto medio per un partic olare esame */


f,loat a-verag e(int setOfGrades [ J, int tests)
{

main()

int i, tota! = 0;

int studen t,
studentGrades[STUDE~TS]( E XAMS]

,.

far (i= 0j i <= tests - 1; i++)


total += setOfGrades [il ;

{{77, 68, 86, 73},


{96, 87, 89, 78},
{70 I 90 I 86 J 81}};

printf {"The array is:\n" );


printA rray(s tudent Grade s, STUOENTS, EXAMS) j
printf( "\n\nL owest grade: %d\ nHighest grade: %d\n",
minimu m(studen tGrade s, STUDENTS, EXAM$),
maximum(studentGr ades 1 STUOENTS, EXAMS));

return (flaat ) total I tests;


}

1w Visual i zza la matric e */


void printA rray(i nt grades[][EXAMS], int pupils , int tests)
{

int i

for (stude nt = 0; studen t <= STUDENTS - 1; studen t++)


printf( ''The averag e grade for studen t %d is %.2f \n ",
studen t, average(~tudentGrades[st u dentJ, EXAMS));

j;
(0]

( 1]

[2]

[ 3] ")i

tor ( i = 0; i<= pupils - 1; i ++) {


printf( "\nstu dentG rades t%dJ , i)i

return 0;
}

/," Trova i l votci mi ni mo "I


int minimum(int grades(J[EXAMSJ, int pupils , int tests)

for (j ., 0; j <::e tests - 1; j++)


printf ( "%5d, grades [ i ][jJ)i
}
}

(continua)

,.

11

212

2 13

CAPITOLO 6

Th~

f) fl proa:Sso che<lete.rrni.nase un vetrore contenga un cerro val<>re d1iavd


detto

array is:
(0)

t, ]

[2:1

s~Udent'G~ades[0J 77
studen tGrade st 1 ) 96

68
87

8'6
89

70

9(ll

81l

studentG~adesr21

73

78
8l

6.2

Figura 6.22 Esempio di utilizzo delle matrld.

La srrun:ura for pi esterna incomineer imposta ndo 1 (ovverosia l'indice


del le righe) a 0,
cos che gli elementi della erima riga possano esser.e confron tati con
la variabile lowGra de
nel corpo della strurcu ra for pi. inrcrna. La srrurrur:i. for pi interna
iterer a sua volta
sulle quattro vocazioni di una riga panicolare e le confron ter con
lowGra de. Nel caso che
un v.oro si:a inferiw e a lowG r ade, quesra ne assume r jJ valore.
L<!- struttu ra for pi
esterna increme mer l'indice di riga a 1 . Gl i elemen ti deUa seconda
riga saranno confron tali con la variabil e lowGra de. La struttura for pi esterna iJ1creme
ncer quindi l'indice di
riga a 2 . Gli elc.menri della ceri.a riga sa.ranno confrontaci on la variabil lowGra
de. Quando !~esecuzione della struttura nidifcara sar stara complcrara, lowGra
de conrerr il voco
pi piccolo prci;ent c nella:.matcice. La fwizion e maximum lavorer in
modo simile a minimum.
La funzion e averag e .ricever due argome nti: i) vettore u nidimensionale setOfG
r ades,
che conterr i r isulrati degli esami per un dato smdent e, e il numero
dei risultaci di esame
presenti all'imer no del vettore. Quando averag e sar invocata, il
primo argome nto passato sar studen tGrade s( studen t] . Con questa istruzio ne sar passato
acl ave rage l'indicizzo d i una riga della marrice. I.;argomenco studen tGrade s [ 1)
corrispo nder all'indir izzo di pa1Tenza della seconda rig~ della matrice. Ricorda te,infat ti, che una
matrice fo ndamemalmerue un vettore di vettori unidim ensionali e h.e il nome di un
verrqre unidim ensionale
corrispo nde al suo indicizzo d i memor ia. La- funzion e averag e calcoler
la somma degli
elementi incltLSi nel vettore, divider il totale otrenu ro per il numero
degli esiti degli esami
e rcstirutr il risultato in virgola mobile.

63

6A

sia fal~a, spiega1cn.c il

a) Un vercore pu immagazzinare valori di molri ripi differemi.


b) _Eindice di un yecrore pui> essere del tipo di -dat float .
. .
.
.
e) Nel caso che in una lisra di inizializzaroci ci siano meno elemenD da quelli presemi nel
vetrore, il C inizializ2.erebbe amomaricameme quellLrimanenti utili:z.zan
do l'ultimo valore
loconcrato nella lista degli ini1.ializ7.acori.
. .
. .
.
d) un errore inserire in un:t lista di inizializzarori pi elemem1 di quano siano
presenta nel
verro re.
e) Qualo~ un singolo elemento di un veuore sia passato a u~a funzione
e ~i<t modific:ico dalla
s~essa., nella funzione chia:m~Te quel~elemenco corucm 11 valqrc m.od1l1caro.
Rispondere alle seguenci domande ciguardanci un yerrore chiamaco f rdac
t ionscl-_
. .
a) Dcfl.nire una costa.m e simbolica SIZE d1c possa essere rim piazzata 1
a rcsco 1 sosaruz1onc
10.
b) Dichiarate un vcrcore con SIZE clcmcnd di tipo float e inizializzateli
a 0.
e) "Puncate al quarto elemento dall'inizio dcl veccore.
d) fate riferimento all'elemento 4 dcl vercorc.
e) Assegnare il valore 1 , 667 all'.eleme nto nove del vertorc.
f) Assegnate il valore 3, 333 al settimo elemento del ve~tore-_
..
._
g) Visualjz:Late gli element i 6 e 9 del verture, con due cLfre di prec1s1one a destra
delia vu gola
decimale e moscr:ue l'outpm che sar cJTetcivamence visualia.."ltO sullo schermo
.
h). -Visualizzare rutti gli elememi del verrore usando lastru~ di ripeuzio
ae ~or. Suppone{e
cJ1e si.a scaca definita la variabile incera x per controllare il odo. Mostrate 1Outpm.
Rispondere alle seguerui domande riguardanti w1~ matrice chiam:na table.
_ . .
a) Dichiarare la matrice di cipo incero con 3_nghe e 3 colonne. Suppon
ete che s1a star-a
definira la cosrn.nre simbolica SIZE con cesm di sostinnione 3.
b) Quarui d ementi comert- )amatrice?
.
c) lJtiliuat.e una munura di pezione for, per inizi~e ?goi elemcn~
o della ma~nc~ con
la somma dci propri indici. Supponete che come van..tb11i i.Li conrrllo siano
srace dach1ar:ue

x e y.

I
. .
d) Visualizzare j valori di ogni elemento della m:mke table. Suppone
te che a marnce m
scat:niz.ia.lizzata con hdichia razione
int table(SIZEJlSIZE]

Esercizi di autov aluta zione


R_ispndere a ognuna ddle seguenti domande:
a) Le liste e le r~belle di valori .~ono i m~a7.7.inate nei - -- - b) Gli dementi di un veuore sono correlati dal farco che hanno lo sces.so

_ _ _ __

motivo.

Lowest grade: 68
Highes t grade: 96
The avera~e grade f'~r studen t' 0 is<. 76 . 00
The ave rage .grade f'Of"' st'UClent 1 is 87. 50
The averag e grade far stuen t 2 is 81.75

6. 1

nel verrore.
g)' 1Jn vettore che ut'.ilizzi due incl.ici detto \ietmre - -- - Smbilite se le seguenti affermazioni siano vere o false. Qualora la risposta

(3 )

={{1, 8}, {2, 4,

6}, {5}};

e che le variabili x e y siano state dichi:l.rute come variabili di conrroUo. Mosrrace


6.,.5
- - -- -e

t) l i numero ucilizzaro per fur rifrimemo u un particolare demem o


di un vecrore il suo
d) Per dichiarare la dimensione di un veaore, dovrebbe essere uciliztar
a una _ _ _ _ _,

perch renderebbe il programma pi scalabile;.


e) il processo di messa in <ndine degli elementi omen.uri in un ve~rore
dea.o _ __ _ _
dcl vcrcore.

Ti;ovate l'errore in ognuno dei seguemi segmenci dl programma e correggc


celo.
a) #de-fine SIZE 100;
~) SIZ:E = 10 ;
e) Assuruc tcintb[ 10J ={0), i;
for (i= 0; i<= 10; i++)

= {{1 ,

'I

b[i] = l i
d) llwcl.Ude <stdio.h >;
e) Assume teint a[21[2]
a( 1, 1J .. 5;

l'ourpur.

2}, {3, 4 }};

214

CAPITOLO

Risposte agli esercizi di autovalutazione

f VETl'ORl

6.5

a) Yeccori. b) Nome, cipo. c) lndice. d) Coscan~.simbolica. e) Ordinamento. f) Ricerca g)


Bidimensionale.

6.1

6.2

6.3

a)
b)
e)
d)
e)

Falso.~~ v~rcor~ pu.immagazzinare slcanco valori dello scesso tipo.


Falso. I.:indicc di un verrore deve essere un incero o una espressione incera.
Falso. Il C azzerer aucomaticameme gli demenri mancnri.
Vero.

F~. I singoli elem:nu di. un vecroTe sonQ passaci per valore. Le modifiche apporcare
alJ ~remo dclfa funzione chiamata sarebbero..riscpntrabili nel vettore originale, solo se alla
run21one fosse scaco passato l'incero verco.re.

a) lldefine SIZE 10
b)
e)
d)
e)
f)

float fraGtionsfSIZEJ

= {0};

6 .~

Output: 3. 33 1 . 67.
h) for (X= 0j X<= SIZE - 1; x++)
printf ( tractions[%dj -= %f\n', x, fractions[xJ);

=0.000000
fractions[l J =0.000000
traetions[21 = 0.000000
fract1ons(3J =0.000000
f raetions[41 = 0.000000
fractions[SJ =0.000000
traotions(6J =3.333000
tractions[7) "'0.000000 ,
fractions[8) =0.,000000
fractionsf91 = 1. ,667000

a) int table( SIZE li SIZE l j


b) Nove elememi.
e) for (X = 0; X <= SIZE . 1; x++)
for (Y =0; y <= SIZE - 1; y++}
table!Xl !Yl =X+ y;

tor

= 0j X<= SIZE. l; xt+}


(y =0; y <= SIZE - 1; y++).
pl'ifltf ( fftable [%d ][9iidl = 'td\ "", x,

y,

table rx J[ y I ) ;

6.7
Stabilire quaJj delle segue.nei affe.rmarioni siang ver quali fal$c; per quelle fa1$e. spiegare
p,crch lo sono.
a) Per far riCecimenco a u:ia particolare posizione o elemnCo all'imemo di un vettore, specificheremo il nome di quesco e il valore di quel parc;olare de.memo.
b) La dichiarazione di un vetrorc gLl riserver uno sparlo in memoria.
e) Per indicare che debbano essere riservate 100 posizioni per il vettore d incri p, il programmatore scrjvec la dichiaraz.ione

Ou:put:
table[0J [0)

p[100];

=l
=a

table(0][1J
table(0][2J = 0
table[l ][01 = 2
table( 11( 1 J = 4
table( I ][2] = 6
table[2) (01 =s
tablel2Jl1J = 0
table(2Jl2J = 0

Riempire gli spazi in ognuna delle seguenri cighe:


a) ne immag:izzina le lisce di valori nei - - - - b) GJi elementi di un vcrrore sono correlaci dal fatto c;he _ _ _ __
e) Quando si fa rifertmento a un clemenco di un vetto~. iLnumero di posizione conumuco
all'incerno delle parencesi quadre decco _ _ _ __
d) 1 nomi dci cinque elcmenci del vettore p sono _ __ _ _, ____ __. - -- - - '
_ _ _ __ e _ _ _ __
e) U cooccnuLO di un particolare elemento di un verrore il
dcll'elemenro.
f) Dare un nome a un vecrore, scabilime il cipo e specificare il numero degli elemenci conrenuci nello stesso la
del verrore.
g) Il processo di siscemazione in ordine ascenderne o discendente degli elementi contenuti in
un vercorc chiamato _ _ _ __
h) 1n una mauice, il primo indice (per convenzione) idcmifca la
di un demenco, mencre il secondo indice (per convenzione) identifica la
di un
clemenco.
i) Una matrice m per n conciene _ _ ___ cighe, _____ colonne e----clemenri.
j) 11 nome dell'elemenco n.ella riga 3 e nella colonna 5 di una rnatcice d _ __ __

Output:

fract:ions[0J

d) for (x

a) Errore: il punto e virgola alla fine della direiriYa #defi ne del preprocessore.
Corre-Lione: eliminare il punro e virgola.
b) Errore: assegnamemo dj un valore a una costim:e simbolica urili'l.7.3ndo un'isrruiione di
assegnamento.
Correzione: assegna ce il valore dclJa cosranre simbolici in una direcciva #def ine del
preprocessore, $enu ucilizz.are l'operatore di assegnamemo. come in #def ine SI ZE 10.
e) Errore: riferimento a un elememo merno ai limici del verrre (b [ 10 J).
Correi.ione: modifica ce a 9 il valore 6nale della variabile di controllo.
d) Errore: un punro e virgola alla fine della direuiva #include del preprocessore.
Corre1,ione: eliminare J punro e virgola.
e) Errore: indice della marrice scrro in.modo swrrertp.
Cor.rczione: cambi:ve l'isrru1.ione in a[ 1J l1 J = 5;

Esercizi

fr~ctl.OhS[3]

fractions[41
f.raoti()ns[9J =i .667;
fractions[6J = 3.333;
g) printf( ~9ii.2f %.2f\ni, fractions(6J, fractionsf9]);

6.4

215

d) Un programma C che azzeri i L5 elementi di un vettore dovr contenere un'isrruzionc 'for.


e) Un programma C che sommi gli elementi di una matrice dovr concenere delle istruzioni
for nidificare.
E) La media, la mediana e la moda del seguenre gruppo di valori sono risperrivameme S, 6 e
7: 1, 2. 5, 6, 7, 7. 7.
6.8

Scrivere delle istrw.ioni C che eseguano ognuna delle seguenri arrivic:


a) Visualiuare il valore conrenuro nel sercimo elemento del venore di caratteri f .

......mi................................................... .................................!!!!!!!!!!!!!!!!" '\

~~~~~--

216

CAJ 1TOLO 6
1

I VEJTQIU

a) Dopo il primo pa.r;saggio, il numero pigrande..sar staro si~entesi~c~aro ne_ll'clcmen~o


con l'indice pi alto del vettore; dopo il secondo p:issaggi~,J due~umen ~IU g~d1 s:iranno a
posto" e cos via. I nvecc di cseguircrn.ove confronti ad ogru~o, modifcare I o'.dinamento
'
a bolle cos che esegua ono confronti nel secondo pa.~ggi~, serr7 nel rerz::i.e cos via.
b) 1dati nd venore pocrebbcro gi essere nell'ordine appropnaro o m uno v1.C1J10 a ~ues~o, perc10
perch eseguire nove passaggi quando ne porrebbero basr.ar~ meno?.Modi~c:'1re I ~rdinan:ienro
a bolle in modo da verificare se alla fine di ogni passaggio Stano .srao eseguili degli scambi. Nel
caso che non ne siano sra eseg_uiti, allora i dari =no gi nell'ordin~ approp~aco, ~e:ci ~
programm:i dovr rerminare la propria esecuzio~e. Nel caso invece che siano scan esegwu degli
scambi, sar necessario almeno un alcro passaggi.o.

b) Prendete in inpur un valore: e siscemarelo ncll'elemcnro 4 dcl vea:orc unidimensionaJe di


valori in virgola mobile b.
e) lniz.aliz1.ne a 8 ognuno dei 5 clementi inceri q>menuci nel vctrore unidimensionale g.
d) Sommare i 100 elementi comcnu nel vettore di valori in virgola mobile c.
e) Copiace il verro re a nella prima panione del ven()re b. Assumere che sia gi stata scrina la
dichiarazione float a( 11 J, b(34 ];
f) Oererminare e visualizz.are il valore pi piccolo e quello pi grande conrenuci nel venare w
di 99 elementi in virgola mobile.
6.9

Considerare la m:u:cice di interi t di dimensioni 2 per 5.


b) Quance righe av r t ?
e) Quante colonne avr t?
d) Quanti elementi avr t ?
e) Scrivete i nomi di curri gli elemend corucnuti nella seconda r:ig.1 di t.
f) Scrivere i nomi di tucri gli elementi conrenuri nella rena colon1la di t .
g~ Scrivete una singola iscrl!Zionc: C che ai.Zeri glidemem i cl.i t contenmi nella riga I e nella
colonna 2.
a) Scrivere una ilichiarazione per t .

h) Scrivere una serie di isrruzioni C che azzerino ogni elememo cli t. Non utilizzare una
strunura di ripetizione.
i) Scrivere un:l srnmura for nidificata he azzeri ogni elemenrn di t .
j) Scrivece un'isrruzione e che prenda in inpur dal rermrn:ile i valori pe.r gli elementi d i t .
k) ScrivcLe una serie di istruzioni C ch dererminino evisualinino il valore pi piccolo
conrenuro nella matrice t .
1) Sc:rivcre un'iscruzione C che visualizzi gli elementi comenuti ncll:t prima riga cli t .
m) Scrivere un'isttu7.ione C che sommi gli elemenri conrenu nella quarta colonna cli t .
n) Scrivere una serie cli istruzioni C cli:e visualizzino la macrjcc t in un formaro tabulare
ordinato. Utilizzare gli indici delle colonne omeinccstaz.oni da porre in cima alla tabella
e, allo stesso modo, visualizzare gli indici delle rjghe a sinistra di ognuna di esse.

6.1 O Utilizzate un venore unidimensionale per risolvere il scguenre problema. Un'a:Lienda retri buisce i .suoi venditori con delle provvigioni. Un vendirore ricreve $200 la serrimana pi il 9 percento
delle proprie vendite lorde portare a 'cermi.nci a quell_a-sercimaoa. Per esempio, un vendi core che faccia
incassare $3000 di venduro lordo, io una setti.mana, ricever $200 pi il 9 percento di $3000,
ovverosia un cocaJc di $470. Scrivere un programma C, ucilizzando un veccore di contatori che
dercrmini quanti venditori abbiano guadagn;1ro una retribuzione compresa in ognuno dei seguenri
ime.rvalli (supponete che la recribuz.ione d.l ogni veodicor s:i.a troncata a una somma incera):

J. $200-$299
2. $500-$399
3. $400-$499
4. $500 -.$599
5. $600-$699
6. $700-$799
7. $800-$899
8. $900-$999
9. $I 000 e olcrc
6. J I L'ordinamenro a bolle presentaco nella Figur~ 6.15 inefficiente per verrori d i grandi
dimensioni. Apportare le seguenti semplici modifiche in modo da m igliora:re l'efficienza dell'ordinamcnro :i bolle.

2 17

6.12 Scrivere delle iscru1Joni singole d1e eseguano gnuna delle seguenti operazioni su vettori
unil.iri:Je.nsionali:
.
..
a) Azzerare i 10 elementi del venare cli imeri. count~ .
b) Aggitmgece La ognuno dei 15 elem~ comnmr nel veuore d1 mrcn bonus.
e) Legge~e dalla casLera i 12 valorifo virgola m_obile del va;~re m~nthlyTemperatures .
d) Visuali1.~.:tl~ in colonM i 5 va1<lri comenud nel ve.rr9re di.inteo bestscores.
6.13

Trovare l'errore in ognuna delle seguenci istruzfoni:


a) Assumere: chr str[5];
scanf(.%5 ", str); /L'utente digita hello */
b) Assumere: 1nt a(3J;
printf("Sd \d \d\n", af1], a(2], a(31);

c) float f[3) = {1.1, 10. 01 , 100.001, 1000.0001 };


d) Assumere: double dl 2 J f 10 J ;
d[1, 9] =2.345;

6.14 Modificare il program ma della Figura 6.16, in modo che la :um.ione ~ode. sia in grado ~
gesre an pareggio per il valore della moda. ModificaEe anche la funzione median, m ':o.do che sJ~
calcolaca la media dei due dementi cli mezzo, in un verrore che contenga un numero pan di elemeno.

6.15 Urilizzatc un vercore unidimensionale per solvere il seguence p~blema. Leggere in input 20
numeri, ognuno dci quali sar compr~ tm _LO e lO_O, esrremi inclu$i. ?~volta eh~ le~re u~ mt~~;o
visualizzatelo qualora non sia un duplicato d1 uno gi letto. Prepararev1 al caso peggiore .ro cw rurn 1 O
mtteri siano cllfferenci. Uciliu.are il vettore pi piccolo possibil per risolv.re questo problema.
().16 Ericherrare gli elementi della matrice 3 per 5 sales, in modo da indicare l'ordine in cui
essi saranno azzeraci dal seguen.re segmento di programma:

.
for (row = 0; row <= 2; row++)
far (column =0; col umn <= 4; columnt+)
salesfrOWJ( oolumn] =0;
6.17

Che cosa far il scgueme programma?


#include <Stdio.h>
#defi ne SIZE 10

nt wllatisThis(int I J, int) i
main()
{

int total, a(SIZEI = {1 , 2, 3, 4, 5, 6, 7, 8, 9, 10};


tota! = \tlhatlsThis(a, SIZE};

218

CArrrm.o 6
printf( "Tota.i ot array elemeht values is %d\ n" , total);
ret urn 0;
}

i nt whatrsThis(in t bi'], int si ze)


{

it (size

1)

return bl0J;

else
ret urn b [ size 1 ] + whatlSThis:(b 1 size . 1 ) ;

6.18

Che cosa far il sgueme programma?

sm 10

void someFuncton(int [ J, .int);


main()
{

int a[SfZE} = {32, 27, 64, 18, 95 , 14, 90 , 70, 60, 37};

printt( The vales in the array are:\n"li

someFunction(a, SIZf) ;
printt ( ' \n" ) ;
return 0 ;
voia SOl!leFunotion ( int b rI ' int size)
{

i'f (size > 0) {

someFunction(&b[1J, size. 1);


printf ("%d , bi 0)) ;
}

6. l ~ ~ere un pr~ma e che-runuli il lancio di due dadi. Il programma dovr uriliz:zare rand per
lanaare il ~nmo dad~ e mv~ nuov.ameo re per lanciare il secondo dado. Dovr quindi essere akolara la
so~ma dci ~e val on. ~ota: poich ogni dado pv moscrare UJl valore intero compreso tra J a 6, la son1 ma
d! due ;aJon ~ccl vaaare tra 2 e 12, con 7 come somma pi frequencc e 2 e 12 come somme meno
freq~en~. La P1~ 6.23 mostra I~ _% possibili combinl!7ioni dei due dadi. D vostro programma dovr
lan~e .due dadJ 36.?00volre. Uril!Z.Zatf: un vettore unidimensionale per sommare il numero di occonen7.i! di 0.~ s~p:una _poss1~ile. Visualizz.ate i $ulraci in un formaio cabuJare. Decerrninare anche
se i tclfali sono

sensaC1: Cl ~ono set

modaper ottenere un 7, perci cirai unsesro dei lanci dovrebbe ottenerlo.


2

IO

10 Il

IO Il 12

I
l
3

2 19

6.20 Scrivc1e un pr>gramma che esegua 1000 volte il gioco dei dadi (cmps) e rispondae a ognuna
delle seguenri domande:
a) Quanti giochi sono stari vind al primo lancio, aJ secondo, ... al \remesimo lancio e dopo il
ventesimo?
b) Quanci giochi sono scaci persi al primo lancio, al secondo, ... al venceslmo lancio e dopo i.I
ventesimo?
e) Quali sono le possibilit di vircoria al gioco dei dadi? (Nom: sappiate che il gioco d~ dadi
uno dei r iequi ma quelli dn casin. A quale conclusione vi porro questa con~idernzione?)
d) Qual la lunghezza media di un gioo a dadi?
e) Le probabilit dJ virroria aumentano con la lungheua dd gioco?

6.2 J (Sistema di p~enomzio ne per lince arce) Una piccola compagnia aerea ba appena comprato un
computj!r per il suo nuovo s.isw.ma di prenomzio.nt:.aucomari<;!i. TI presidenKvi b.<t chiesto di progr:unmare il nuovo sisrcma in C. Voi dovere scrivere un programma ch assegni i posti su ogni volo
dell'unico aereo dell'aerolinea (capacit: I O posci).
Il vostro programma dovr visualinare il seguente menu di scclrc:

I/include <stdio. h>

lldefine

J VETIORl

' .
Figura 6.23 I 36 possib1h
n sultatr del lancio d1 due dadi.

Please type 1 for "smoking"


Please type 2 tor "nonsmol<ing''
Nel caso che i.I cliemc digiti I , allor.i il vostro programma dovr assegnare un posro nella ~~.ione
fum.i.rori (quelli d:i 1 a 5). Nel caso che il clicmedigici 2, allora il vomo programrn3 dovrcassegnare un
posto nella sezione non fumatori (quelli da 6 a 10). U vosuo progrnmma dovr quindi scampate una
carra di imbarco, che dovr indicare il numero di posro assegnaro al passeggero e se quello si trova nella
senone} fumatori o non fumarori dell'aeroplano.
Utilizzare un vcnorc unidimensionale per rappresentare la mappa dei posti sull'aereo. Aizcrare
rutti ~li d ementi del verrore in m0do da indkare che nmi i [)Osti sono vuoti. Man mrum che i posri
sarann sr_ari assegnaci, imposte re re a l l'elemenro corrispondente del verrore in modo da indie.are che
il posco non pi disponibile.
Naruralmenre, il vostro programma non dovr mai assegnare un posro che sia gi stato assegnaco.
Quando la sC?.ionc fumarori sar piena, il vosrro programma dovr eh ic<lere al clience se sia disposto ad
accecrare w1a sisremaiione nella sezione dci non fumatoci (e viceversa); Eseguire l'appropriata assegnazione di pasco, qualora la sua risposra sia :iffcrmava. Visualizzare il messaggio "Next flight leaves
in 3 hours ( Il prossimo volo decoller f ra 3 ore), qualor.1 la sua risposra sia negativa.
6.22 u~Uizza.re lma ma.tricc per risolvere il seguenrc problema. Un'azienda ha qua.mo venditori
(numerari da .I a 4) che vendono cinque differerrri prodotti (numerari eh l a 5). Una volra al giorno,
ognuno dei venditori fornisce u.n ragliando per ogni tipo di prodorro venduro. Ogni ragliando
conaene:
L li numew del venditore
1. 11 numcw del prodorto
3. li valore corale, espresso in dollari, del vcnduro giornaliero di qud prodorro
Di conseguenza, ogni venditore fornisce era O e 5 ragliandi al giorno. Supponete che siano disponibili
i dari dei tagliandi delJ'uJrimo mese. Scrivere un programma che legga le suddette informazioni,
riguardami il venduro de.ll'u.ldmo mese, e sommi le vendi ce ro rali per venditore e per prodono. Tutci
i rotali d1,wranno esse immagaxz:inar nella matrice sal es. Dopo avere elaboraro 1ucrc leinformaz.ioni
dell'ultimo mese, visualizzare i risulcati in formato tabulare in modo che Le colonne rappresenno i vari
venditori e le righe rapprese.orino i singoli prodotti. Sommare ogni riga, in modo da onenereJe vendfoi
totali ilell'ulrimo mese pe.r ognuno dei prodotti; sommate ogni colon.na, in modo da orcenere il corale
delle vendite dcll'ulrirho mese per ognuno dei venditori. La vostra scampa tabulare dovr.lncludcre i
sudderri rotali a dcma delle righe e io fondo alle colonne.

220

Cl\'PITOLO

6.23 (Turcle G.raphics) !l linguaggio Logo, parricolanncme popolare tra g1i uccnri di persona! computer, ha reso famoso il concclto di rurcle graphics (grafici della tartaruga). fmmaginacc una can:aruga
meccanica che girow1ga in una sr:anza sorroil concrolhdi un programma C. La tart.arug:i ha una penna
iu una delle due posizioni, alzara o abbassata. La ra.rraruga traccia ddlc lince man mano che si muove
con la penna abbassata; <juando questa alzara, simuove liberamence senza scrivere niente. l.n questo
problema, siraulercre le operazioni della camu:uga e creerete, allo stesso cempo, un bloccherco per gli

~chizzi.

Significato

Abbas~a

Gira a destra
Gira a sinistra

5, 10

la penna

6
9

Fine dei dari (valore senrinella)

Suppoaere che la tartaruga sia in wta qualche posizione vicina al centro del pavimcnco. Il seguente
"programma" disegnerebbe e visualizzerebbe an qmulraro 12 per 12:
2
5, 12

o
2

6
7

3
3

Vai in avanti cl.i IOspazi (o un nwnero diversa da lO)


Visualiua la matrice 50 per 50

5, 12

Il cavallo compie ddle mosse a forma di L: due casdle in una direzione~ una in un~ dircmice
---L
scacchiera vuom,
perpendicolare aqucua precedente. Ne consegue che, da una casella centrale d1 unad-'
F"
G24
il cavallo porr eseguire ocro differenti mosse (numerare da Oa 7), come mostrato ;uJa 1gura -

Alza la poana
2

221 '

[.vlITTRl

Utiliz:zace una matrice floor SO per 50 e ;izze~ela. Leggere i comandi da un vettore che li contenga. fnogn momenro, manrencte crac.eia della posizione correnie della carcaruga e dello staro (alzar:i
o abbas$am) della penna. Supponete che la ranarnga comin9 sempre dalla posizione 0,0 dd pavimenw con la peana ah.ara. l:insieme dci comandi per la r:in:;i.ruga che il vostro programma dovr elaborare
sar:

Coma ndo

s, 12
3
5,12
1

6
9

Man mano che la tartaruga si m uover Con la penna abbassaca, impq~"l:erere gli elementi corrispondenri
della ma.rrice f loor a 1- Nel momenco in cui il programma avr imparrit0 il comando 6 (visualizza),
scamperete un asterisco, o qualsiasi altro carattere abbiate sc;:clco, in (;{,>rrispondenza di ogni 1 incluso
nella matrice. St:unperece invece uno $pazio in corrispondenza di ogni zero. Scrivete un programma C
che implementi le capacic grafiche dcUa ca,naruga discusse in quesco esercizio. Scrivete diversi programmi di rnrtle graphics, in modo che .siano disegnate delle forme interessanti. Aggiungete alrri
comandi per incrcrnencace la porenza dd vo.sc:ro linguaggio di rurtle gmphics.
6.24 (Il Giro del Cavallo) Uno dci problemi pi inrei:essanci per gli appassionaci del gioco degli
scacchi quello del Giro del Cavallo, proposto originariamente da,( maremarico Eulero. La questione
quesra: pu il pezzo degli scacchi chiamaco cavallo muoversi in una scacchiera YUOca, visitando una sola
volta ognuna delle 64 caselle? Studieremo approfondiwnenre questo problema affascinante.

Figura 6.24 Le otto possibili mosse per il cavallo.


a) D isegnare una scacchiera 8 per 8 su un foglio cl.i ~ e eco.rate~ po_rc~re a termine ma deI cavallo
un
n ualmenre un giro
.
. [nsecirere un .l . nell a pnma
. . easella
. . LD cw v 1 m uovercre.
f:
. 2
nella seconda, un 3 nlla terza, ecc-, Prim~ di mcommc1are il ~o, provare a .are ~1 na s~u;n~
delle mosse che riuscirete a compier.e, ricordando che un gtro completo cons.isce d1 6
mosse. Dove si.ere :mivati? Visi ecc avvicinati a.li.a vosrra.stim~ .
.
b) Ora svilupperemo un programma che muover il cavallo 111. giro per la scacchiera. La
scacchiera s.ressa sar rappresencara dalla marrice 8 per 8 boa:~ _Ognun:i, ~elle caselle sar
iniz.ialmeme azzerata. Descriveremo ognuna delle orro possibili mosse sandendole nelle
loro componenti oriZ'lOntali e verticali. Per es~pio, ~a. mos.sa cOIJle la O mostrata ncl_la
Figura 6.24 porr essere scomposta in untnovunemo. oazzonral: (d~e ~eUe a desrra) e m
uno spostamento verticale (una casella. in alto). La mossa 2 c~nsmera di uno s~osra.menro
orizzoncalc (una casella a sinistra} e di uno sposramenro ve.rucale_ (d~e caselle 10 _alro). l~
(zzoncali a sinistra e quelle vercicali verse L'll.lco saranno indicare con dea numeri
mosse o '

.di
. 1 h . o tal
negativi. Le orco mosse porranno essere descrmeda dne-verrori uni mens1ona 1, oru n
e ver t i cal, come ~egue:
horuontal[0J =2
horizontal[ 11 = 1
horizontal[2] 1

222

G\PlTOLO 6

horizontalf3J = -2
liorizontalf4J = -2

horizontalf5J

= -1

horizontal[6J : 1
=2

horizo~talI7J

vertioalf0J

=-1

= -2
verticall2J = -2
vertical[3) = - 1
vertical[4J = 1
vertical(S J = 2
vertical[ 6] = 2
verti:cal[1]

vertical[7]

Le variaJ>ili urrenrRow e ctU"renrColumn indicheranno rispcuivamenre la riga e la colonna della posizione correnrc del cavalJ.0. Per eseguire una mossa di tipo move'Number, dove
moveNumber sia comprc,o Ha O e 7, il vostro progra,mma utilizzer qusce istruzioni:
currerrfiow += veM:ical[moveNumber];

currentColOmn +,, hOrizontalfmoveNumberJ;


TJtlizzare un concacore che vari nell'imervaUo da 1a64. Regiscrace l'ultimo valore assunto
dal conta.rare di ogni casella visirat.'\ dal cavallo. Ricordare di veri fcare ognU:nossa potenziale pe.r aS.sicurarvi che il cavallo non abbia gi visiraco quella ca~lla. E, naturalmente,
verifcacc: ogni mossa poreniiale per asskurarvi che il cavallo non cada fuori della scacchiera. Ora scn:.ece un programma che porri il cavallo rn giro per l:t scaccluera. Eseguire il
programma. Quante mosse ha compiuro il cavallo?
c) DC>po a\.:ec rentaro di scrivere ed eseguire un programma cbe risolva il problema dcl Giro del
Cavallo, avrete probabilrnence svilupparo qualche preziosa iacuizione. U.lizzetemo proprio
quelle per Sviluppare uri metodo eurlsrico{ovverosia una strategia) per muovete jJ mvaJJo. I
metodi eurisrici non garantiscono il successo ma, se svlluppari ::1ccnmtame:ntc, awnencano
enormemente le probabilit di succe$O. Dovresre aver notato che le caselle piilesterne sono. io
un cerro senso, pi problematiche di quelle pi vicine al cencro della scacchiera, lnfutti, le caselle
pi pr0blemariche, o inaccessibili, sono proprio quelle dc.i quanro angoli.
wnruizione porr suggerirvi che. al principio, sar meglio tencarc di muovere il cavallo
nelle caselle pi problematiche, lasciando libere quelle pi facili ckmggiungere, in modo
da avere maggiori probabilit di successo verso la fine del giro, quando la scacchiera sar:.)
congesrionam.
Potremo sviluppare una '"euristica dcl.l'accessibilir", classilcando ognuna delle caselle io
base alla. loro actessibilic e movendo conseguentemente l cavallo neUa c!>c.lla. meno accessibile tta queU raggiungibili dal suo particolare movimeoro a L Etichene.reri:ro la marrice
accessi\>ilicy con dci valori che indichino, per ogni casella, il numero di cj'uelle dalle quali
essa p:ocr_essere mggiunro. {n una scicehiera vuota, le caselle del centro saranno dunque
valrmrre 8, quelle degli angoll 2, mentre le alrre avranno dei valori d'accessibilit pari a 3, 4
o 6, come segue:
2 3 4
3 4 6
4 6 8
4 6 8
4 6 8
4 6 8

6
8
8
8
8
3 4 6 6
2 3. 4 4

4 4 3 2
6 6 4 3
8 a 6 4
8 8 6 4
8 8 6 4

8 8 6 4
6 6 4 3
4 4 3 2

Vl!TIORI

223

Ora scrivete una ver~ione del programma per il Giro del Cavallo che urilizi.i l'c.:urisca
detraccessibilir.1n ogni momenro, il civalio dovr.muoversi nella casella con il numero di
accessibilit pi bassq. fn caso di parit a:a caseli~. il caY<llio porr muoversi verso u.11a
qualsiasi di quelle a pari merito. Di conseguenz:i, il giro pOtf cominciar ja uno ~asi
dei qua cero ang_o4. (Nora: il voscro programma d.ovr_ridu.rre i valorJ di acccssi billt:~ polc.b
con lo sposramemo del cavallo suUa scacchiera aumenter il numro di ca~ell gi visirnci:..
In questo modo, io un qualsiasi momento del giro, il nwnero di acccssibilic.di ogaicasella
rimarr esanamcnre uguale al numero di caselle dalle quali ~sa porr essere r:aggiuara).
.Eseguire quesca versione del voscro programma. Avere otcenuro un giro complero? Modificace ora il programma facendo in modo che il cavallo compia 64 giri, partendo da ognuna
delle caselle della scacchiera. Quanti giri compleci avere orrenuto?
d) Scrivere una versione del programma del Giro del Cavallo che, qualora si imharra in un
pareggio tra due o pi ca.selle, decida quale scegliere dopo aver dato uno sguardo alle c.aselle
che porranno essere raggiunte da quelle :i "pari meci.ro". Il vostro programma dovr m.uovere i.I cavallo nella caseUa da cui sar possibile raggiungere quella con li valore di accessif?ilit pi basso.

(,.25 (Il Giro del Cavallo: approcci brucali) Ndl"Escrcizio 6,24' abbiamo sviluppaco una soluzione
per il problema del Giro del Cavallo. I.: approccio uriliz1..ar9, detto "eUI.isc:ica dclt'accessibilir", gener,i
moire soluzioni ed eflc.;ienre.
Man mano che la potenza d ei compurcr continuer ad aumentare, saremo in grado di risolvere
~old problemi sfrurcando solamente le loco capacir di calcolo e degli algoritmi meno sofisticati. In
genere questo ripo di appro~o alla soluuone dei problemi detto "brutale o con la forza brum".
a) Urilizzare un gen.erarore di numeri C'..tSuali pe.r consentire al cavallo di girovagare a caso
per la scacchiera, naruralmen1e rispettando il suo legittimo incedere a L. Il vosuo
programma dovr t:;.segui.re un giro e visuali?,7..re la scacch.iera risultan1c:. Quanta suada ha percorsoJl cavallo?
lii) TI programma precedente avr prodono molro probabilmente un giro relacivam~ate
breve. Modifcate 9ra il vosrro programma in modo da tentare 1000 giri. Otilizz~re L1n
verrore uniclimensionale per conservare le occorrenze delle varie lunghe1.1.e ocrcmae
da ogni giro. Nel momcnro in cui avr completaw i suoi I 000 rcnrarivi, il vosrro
programma dovr visualizzare le sudderce informazioni in un formato rabula.re -ordinato. Qual Star-0 il risultato migliore?
c) TI programma precedente vi avr fornico molto probabilmcore qualche giro "degno di
nor:J'', ma nessun giro completo. Ora "lasciatevi andare" e lasciare andare anche il
voscro programma, finch non riesca a produrre un giro complero. (Aucnzione: questa versione dcl programma porrebbe durare per ore anche su un computer potenre).
Ancora un11 volca, conservate in una rnbella le occorrenze delle varie lunghezze oi:cenute da egni giro e visualiziarela, quando sar scaro rrovaro il primo giro compleco.
Quanci teatarivi ha compiuro il vostro programma, prima di produrre tm giro com~
pleto? Quanto tempo ha Lmpiegaro?
d) Confrontare la versione brucale del Giro dcl Cavallo con quella che ha ucilizzato
l'eurisric.a dell'accessibilit. Quale versione hs richiesto uno studio pi accura.ro del
problema? Qua.le algoritmo stato pi difficile da sviluppare? Quale ha richiesto pi
porcaia di elabor.azione? Sar possibile avere a priori la ccrrezza di ottenere un girq
complern, usando l'approccio dell'euristica dell'accessibilit? Sar possibile avere :1
priori .la cerrezza di oaenere un giro compi.ero, usando l'approccio con la forza bmra?
Argomen.race i pro e i contro della risolu1.ione dei problemi urilinando la furza bruca
in gencral.

224

CMffOLO 6

6.26 (Le orco Regine~ Un. altro problema per gliappassionari del gico degli $C'achi quello delle
Otto Regine. Decto sempUccmente: possibile sistemare Otto regine su una scaccb.icra vuota in modo
che nessuna di lor "artacchi" le alcre, ovverosia i.n..modo che non ci$iano due regine sulla stessa riga,
sulla medesima colonna o lungo la sressa diagonal Utilizzare il tipo dj ragionaJllnco sviluppa.ro
nell'Esercizio 6.2.4 per form ulare un merodo euriscio che risolva il problema dlle Orto Rt:gin.e.
Esegujtc l vostro programma. (Suggcrimenw: sar'. possibile assegnare un valore n.qmerico a o~rn.i
ctslla della scacchiera, tn modo da indicare il numero di quelle che saranno "escluse". in uoascacclera
vuota, unn volra che una regina sari stata sisremaca in quella casella. Per esempio, a ognuno dei quarrro
angoli sarebbe assegnato il valore 22, come mosrraro nella Figura 6.25.)

** ** * * .
*

...

Figura 6.25 Le 22 caselle esduse sistemando una regina nell'angolo in alto a sinistra.
Una volta ehe questi "numeri di esclusione" saranno semi sisremru:i io rune le 64 caselle, un
merodo euristico appropriato pocr~ essere: sistemare la prossima regina nella casella con il numero di
dimina:z.ione pi basso. Per quale motivo questa strategia iocuicivamence atcraence?

6.27 (Le orco Regine: approcci..brurali) In quesco esercizio sviluppeme diversi approcci brucali per
risolvere il probl.emadelle ono Regine introdono nelrEserciz.io 6.26.
a) Risolvere il problem.1 d_elle orro Regine, utilizzando la tecnica della forza brura casuale
~-vilupp,.ta nell'&ernizi.;i 6. 25.
b) Usare una temica sa~ti\l<I: tenmecio rum': le possibili combinai.ioni per il posizionamemo
delle otto regine sulla sEacchiera.
c} Per quale morivo pens:uecbe l'approccio esaustivo con la forza bruca non sia appropriato
per solvere il prob!emadd Giro del Cavallo?
d) Confronta.re e contrastate i due approci brutali, casuale:e:esaustivo, in generale.
6.28 (Eli~ione dei duplicati) Nel Capirolo l2 esploreremo le strutture di dari con ricerca
binaria ad alta velocira. Un:i caraneristica degli alberi di ricerca binaria che i valori duplicati samnno
sca.mlci, nello sre5so momento in cui ~i dementi saranno inseriti nell'albero. Questa cararrecisc:ica
detea appunto elimJnazione dei duplicati. Scrivere un programma cJie produca 20 numeri casuali
cpmpresi tra l e 20. Il programma dovr immagazzina.re in un vettore tutti i valori non duplicaci.
Ucilizzate il wmore pi piccolo possibile per portare a rermioe quesco ompico.
6.29 (Il Giro dd Cavallo: Verifica del Giro Cidico) Nel Giro del Cavallo, definiremo completo un
giro in cui il cavallo avr effenuaro 64 mosse, cocg mdo ogni casella della scacchiera una sola volta.
Definiremo ciclico un giro completo in cui la 64 p.osizione di sci una messa da quella in cui il cavaJJ.o
Ji::i comiociaro il giro. Modificar<; il programma del Giro del Ca~o ahc avere sc~.irro neU'Ese.rci7.i.o 6.24, in modo da verificare se un giro complero si~ anche ciclico.

6.30 (li Crivell9 cli Erarosceoe) Un oumero primo qualsiasi incero che possa essere diviso soltanto
per se stesso e per 1. n Crivello cli Eratosre.ne appunco un mecodo per rrovare i numeri primi. Es.so
funziona come segue:

l VETfORJ

225

l ) Create un vertoron runi gli elemenci inii.ializz.ali a 1 (vero). Gli dementi dcl vettore-i cui
ind.ici corrispondano a un nwnero primo rc:sceranno a I . Al ccrmine della elaborazione,
rucri gli al cri elemc.n dd vetro re saranno azzerari.
2) Pa.n:endo dall'indice 2 del vcrrore (l'indice l primo per definizione), qualor il valore
deU'elemcnco pumaco sia l , scorrere il res.co del verrore e zcratc g.Li dememi i cuLindici
siano mulcipli cli quello detl'elemcmro puncato. Nel caso dell'indice 2, saranno azzerati
tutci g1i elemenci successivi del venare con indici che siano mulripli di 2 (ovveros_ia gli
indici 4, 6, 8, 1O, ecc.}. Nel caso dell"indicc 3, saranno arterati cu:rci gli dcmenri successivi
del veccore con indici dle $iano nilripli di 3 (ovverosia gli indici 6, 9, 12, 15, ecc.).
Nd momemo in cui que~'to processo sar s.taro completato, g!i elemenri dcl venore che conrerranno
ancora il valore uno indicheranno che il loro indice un num(.{c.o pri.m0 e, di coo~enia, cl1 porr
essere visualizzato. Scrivere un programma che uci.Liz.z.i un vercore di 1000 elementi per detetrnin~re e
visualizzare i numeri primi compresi tra I e 999. Ignorare l'elemento Odel verror.

6.3 1 {Buckec Sorr) Un buckct son incom.ina dichi:i.r:mdo un vcrrore unidimensionale di inceri
posicivi, q4ello d1e dovr essere ordinato, t una marrlce di in.ceri con le righe indicizz.ace da Oa 9 e le
colon.oe da Oa n - L, dove n . iJ numero dei valori pre.5enti nel veno.re che dovr essere ordinato. Ogni
riga della marrice dctra bucket (secchio). Scrivere una funzione bucketSort che riceva come argomenti un verrore di inceri e la.sua dimensione.
Calgorirmo . iJ seguente:
I) Scorrere il venare unidimensionale e sistemate ognuno dci suol valori in u11a riga della
matce, basandovi sulla cifra delle unir. Per esempio, il 97 sarsi:stemaco nella riga 7~ il 3
sar inserito nella riga 3 e il 100 sar posco nella riga O.
2) Sorrecela marrice e riportare i valori nel vcccore originario. Nel verror<; unidimcnsionaleil
nuvo ordine dei suddeni valo ci sar: I 00, 3 e 97.
3) Riperece que!Sto processo per ogni succe~siva posizione delle cifre (decine, centinaia, migliaia, ecc.) e fermarvj quando sat srarn elaborata h cifra pi signilcava dcl numero pi
grande.
Al rcrmine del secondo passaggio.sul veno re, il I 00 sar siste:maro nella riga O, il 3 S4r inserito nelluiwi
O(poich ha solo una cifra) e il 97sar posro nella riga 9. I.: ordine.dei valori nel vettore unidimensionale
sar a quesr.o punro: 100, 3 e 97. Al termine del ceno passaggio, il 100 sai sisremaco .ndla riga L, il 3
:e 11 97 saranno inserici nella riga O(il 97 dopo il 3). 11 buckec sorr gar.1Jtisce che tuni i valori sirnno
ordinaci appropriacamence, 4opo cl1e sar stata. elaboraca la cifra pi significativa del numera pi
grande. Il buckec son sapr di avere cerminato il proprio compito, quando rurci i valori saranno st.aci
ricopiaci nella riga zero della.marcicc.
Osservare che la matce avr una dnlcnsfooe pari a dieci vo}te quella del vettore di inceri da
ordi nare. Questa recnica pi d:Ecieme di 4'1Udla dell'o.rdinamemo a bolle. ma richiede una ca:pacic
di memoria nocevolmenre superiore. I.:ordinamenro a bolle richiede solo una posizione di memoria in
pi per il tipo di daro da ordina.re. Il buck;t sorc un esempio di compromesso tra consumo di
memoria ed eflciema: vero che uufo.u pi ~emoria, ma anche vero che pi efficiencc. Questa
versione del bucket sorr richiede che per ogni passaggio i daLi siano ripon.ari nel vecrorc originale. Si
potrebbe anche creare una seconda marrice e sposrare ripetutamente i dati rra le due matrici.. fmch
non siano stati ricopiati ruu:i nella riga zero di una delle due. A quel punto la ri,,11a_ zero conrerrebb il
vettore ordinato.

Esercizi sulla ricorsione


6.32 (Ordinamento per selezione) Un ordinamen.to per selezione ricercher~ in un vertere l'demenro pi piccolo e, quando l'av.t.individuaro. lo scambier d.i posro con il primo elemento del vercore. Il
processo si ciperer per il soa:ovettore che comioda con il secondo elemento del vettore. Ogni passaggio

226

Ul'ITOL.06

sul vettore far in modo che un clemenco sia sisrt:rn:Honella posizione appropriata. Qu~ro ordinamenro richiede capacir di elaborazione simili a quelle deU'ordinamenro a bolle: per un venore di n
elementi, dovranno essere eseguiti n - l passaggi e, per ogni sorroverrore, dovranno essere compiud
n- l confronci per individuare il valo re pi piccolo. U vettore risulrer: erdfoaro nel momento in cui il
son:ovecrore da elabcmue coarerr W 1 solo ekm~nto. Scrivere una funzione cicorsiva selectionSort
d1e i.mplemenci questo algoprmo.
<i;.33 (Palindromi) Un palindromo una scringachesi legge aUo sr$So modo da sinisua a descra e da
desua a sinisua. Alcuni esempi di palfodrom.i sono: ".radar", uable was i ere i saw d ba" e "a man a pian
a canal panama". Scrivete una funzione ricorsiva testPalindrome eme rescirubca I , qiaaloxa la stringa
ili1m;1gallinara nj vectore sia un palltidromo, e Oin caso comrario, La fum;ione dovr igncma.re gli
SJ?azi e la punceggiarura cvenmalmentc presenti nella minga.

CAPITOLO

I puntat ori
Obiettivi

6.34 (Ricerca lineare) Modificare il programma della Figura 6.18, in modo da uriliZ:tare una fum.ione ricorsiva linearSearch che esgua una ricerca Jineare all'interno del venoce. La funzione dovr
c;:evere come argomenti un vercore di i meri e la sua dimensione. Nel caso che la diiavc di ricrc:i si~
S\a.ra cirrovam, restiruirere l'indice de.I vetrore, :da:im,enci rcsriruirere - l.
6.35 (Ricerca binaria) ModifC<1te il programma della Eigura 6.19, in modo che utilizzi una funzione rcersiva binarysear ch che esegua una ricerca binaria all'inrerno del vcLrore. LLfu:nziooe dovro
ricevere, come argomenri, un vettore cliin.ceri e gli indici di inizio e di fine dd sorrovettore in cui dovr
essere eseguita la ricera. Nel c:iso che la chiave di ricerca sia stata ricrovata, restimirere l'indice del
verrore, akrimenri rescitulrere - l.

6.36 (Le otro Regine) Moclitc<l!C iJ programma delle orro Regine che avere creato nell'Esercizio 6.26 cosl che solva il problema in modo ricorsivo.
6.37. (V$ualiZ?.are un vettore) Scrivere una funzio:nc ricorsiva printArray che riceva come argo
mentr un vercore cda sua dimensione e non resriruisca alcun daco. la fum.ione.dovi: terminare la
p.repria elaboraz.ione e rstiruire il d:mcrollo a quella chiamante, quando avr ricevuco un vertere di
dimensione O.
6.38 (VisuaJizza:r.e una stringa al mmrario) Scrivete w1a funzione I i:orsiva stringReverse che
riceva come a:rgomenro un vettore Jii caiarreri e non reslruisca nes:sun daco. La 'funzione dovr
rermina.re la propria. da bo.razione e rcsclruire il conaollq a quella cbiamanrc, quando avr incomraro il
tru:artere nullo di cea:nioaz.ionc della srringa.
6.39 (Trov;ue il valore tnlnimo in un vercore) Scrivere una funzione ricorsiva recursiveMinimum
:hciceva come argomenti un venare di interi e la sua dimensione e resrituisca l'elem~m pi piccolo
dt!~ veuore. La funzione dovr rerminare la propria elaborazione e restituire il controllo a quella
diia.man.ce, quando avr..riccvuco un vectore che coJltenga un solo elemenco.

7.1

Essere in grado cli acilizzare i punta.cori.

Essere in grado di utilizzare i puntatori per simulaie il passaggio perriferimento degli


argomenti delle funzioni.

Comprendere la stretta correlazione tc-.t i puntatori, i vettori e le ~-cringhe.


Comprendere l'urili1:Z0 dei puntatori a funzioni.

Essere in g;.ido di dichiarare e utillu.are i vettori di stringhe.

Introduzione

[n questo capitolo, cliscmererno una delle pi porenci cararreristiche del linguaggio di programmazione C: i ptmtatori. Questa una delle cararreristiche del C pi difficili da padroneg.,i:rlare. I
punracori consentono ai programmi d i simulare le chiamare per rifecimemo e di creare e
manipolare le strutture di dati dinamicb:e, ovverosia quelle che possono ~rescere e decre5cere
durante l'esecuzione di un programma, come le lisre Cbncarenate, le code, le pile e gli alberi.
Quesro capitolo spiegherl concerri fondamentali dei punrarori. li Capitolo 1O invece esaminer l'uciliz;zo dei puncarori con le scrucmre. U Capirolo U introdurr le tecniche di gesrione
dinamica della memoria e presenter degli esempi che creeranno e urilizzeranno le smm:ure di

dad dinamiche.

7.2

Dichiarazione e inizializzazione dei puntatori

J punc:amci sono delle variabili che come valore conc:engono degli indirizzi di memoria. Di
norma una variabjJc coririene diremunente un valore specifico. Un punrarore invece coiirieue
l'i.ndjriizo di una vadabile nella quale immagazzinato quel valore spec::ifc,o. In questo senso, il
nome di una variabile fa direttamente riferimento a un valore, mentre un punra.rore lo fa.in4iretrammte (Figura 7 .1). Per questo m otivo .iLciferimenro a un valore per mezzo di un puntatore

detto derifen'ment().

count

[]
countptr

fa direttamente
riferimento ad una variabile il cui
valore 7
COt:Jnt

count

count Pt r fa indirettam~nte
riferimento ad _una variabile il cui
valore 7
Figura 7. I

Far rife rimento a una variabile in modo diretto e indiretto.

228

CAPITOL O

I puntarori, come ogni altra variabile) devono essere dichiarati prima di poter essere utilizzati. La dichiarazione

I PUNTATO RJ

229

'

int *count Pt r, co unt ;


dichiarer la variabile countP tr di tipo int * (ow.erosia, un puntato re a un valore intero)
e si legger "count Ptr un puntatore a int" o "count Ptr punta a un oggetto di tipo
incero,,. Anche la variabile count sar dichiarata di tipo incero, ma non sar un puntatore
a un intero. I.:asrerisco (*) presence nella dichiarazione sar applicato solo a countP tr. Un
* che sia stato uriliz.zato in una dichiarazione nel modo che abbiamo visco, indicher che la
variabile dichiarata sar un puntatore. f puntato ri porranno essere dichiaraci in modo da
fare rife menro a oggetti di ql1alsiasi tipo di dato.
Errore tipico 7. 1

L'operatore di deriferimento ,.. non sar applicato a tutti i nomi di variabile che siano
stati inclusi in una dichiarazione. Ogni pun:tatore dovr essere dichiarato cori un ,.. che
precedfJ, iL suo nom.e.

yPtr

Figura 7 .2

Rappresentazione grafica di un puntato re che punta a una variabile intera


contenuta nella memori a.

La Figura 7.3 mosrra la rappr~senrazione del puntatore all'interno della memoria, suppo11endo che la variabile y sia stata immagazzinata nella locazione 600000 e che il puntatore yPtr sia
staro sistemato all'indirizzo 500000. Loperando delroperatore di indirizzo deve essere una variabile; l'operatore di. indirizzo non potr essere applicato quindi a costan, espressioni o~ variabili che
siano stace dichiarare con la specifica di classe di memoria registe r.

BUQna abitudine 7.1


yPtr

Includete le lettere ptr nei nomi per le variabili di tipo puntatore, cos da. rendere ezJidente che siano dei puntatori e che sar necessario manipolarli in modo approptiato.
1 puntatori dovrebbero essere inizializzati e ci potr essere fatto o contestualmente alla
loro dichiarazione o con un'istruzione di assegnamenro.. U.n puntatore porr essere inizialimto
con e, NULL o con un indi.rizzo.. Un ptintarore che contenga il valore NULL non far riferimento
a nessun dato. NULL una costan te simbolica definita in molti file di intestazione, tra cui
<stdio . h>. Cinizialirnz.ione di un puntatore con 0 equivalet1te a quella eseguita con il valore
NULL ma preferibile uril'izzare quest'ultimo. Ci perch uno 0 che s.ia staro assegnaco a un
puntatore sar prima converro in un puntatore di tipo appropriato. Lo 0 l'unico valore incero
che porr essere assegnato direttamente a 11na \iariabile di tipo puntatore. ~as.segnamenc dell'indirizzo di una variabile a un puntatore sar discusso nella Sezione 7.3.

Buona abitudine 7.2

Inizializzate i puntatori in modo da prevenire dei risultati inattesi.

7 .3

Gli operatori sui puntatori

Lampersand (&, e commerciale), od operatore di indirizzo, un operatore unario che restituisce l'indirizzo dd suo operando. Per esempio, assumen do le dichiarazioni

nt y = 5;
nt *yPtr;
l'istruzione

yPtr

= &y;

assegner al puntatore yPtr l'indirizzo della variabile y. Si dir quindi che la variabile yPtr c'punca
' y. La Figura 7 .2 mostra una rappresentazione schematiea della memotia in seguito all' esecuzione dell;~egnamenro precedence.

500000

Figura 7 .3

600000

y
600000

Rappresentazione di y e yPt r in memoria.

L'operatore *, detto comunemente operatore di deriferimento od operatore di risoliezione


del riferimento, restiruisce il valore dell'oggetto puntato dal suo oprando (ovverosia dal puntatore).
Per esempio, 'istruzione

ptintf( ''%d", *yPtr);


visualizzer il valore della variabile y, vale a dir 5. L ucilizzazione dell'ope rato re * in questo
modo detta risoluzione del r-iforirne11to di un puntatore.

Errore tjpico 7.2


Risolvere il riferimento di un pt-tntatore che non sia stato appropriatamente_inizializzato,
o che nn sia stato impostato in modo da puntare a una specifica locazione di memoria. Ci potr causare un error:e fatale in fase di esecuzi(Jne, o potr modificare accidentalmente dei dati importanti e consenti.re 41 programma di compktare la propria esecuzione,
producendo per dei risultati errati.
Il programma nella Figura 7.4 mostra l'urilizzo degli operator i dei puntatori. La specifica cli conversine %p della printf invier in output la locazione di memoria, convertendola in u11 intero esadecimale (consultate l'Appendice E, r sistemi numerici", per orrenere
maggiori informazioni sugli interi esadecimali). Noterete che nell'out put l'i.ndicizzo di a e
il valore di aPtr saranno identici, conferm ando cos che l' indirizzo di a sar stato sicuramenre assegnato illa variabile cli tipo punrarore aPtr. Gli operatori & e * sono l' uno il comp lemento ddl'altro: qualorafossero applicati consecutivamente ad aPtr in qualsiasi ordine, si
otterrebbe lo stesso risultato. La tabella deUa "Figura 7.5 mostra la priorit e l'associativit
degli operatori introdotti sino a questo punto.

CAPI TOLO

230

Ii

7.4

/ * Usare gli oper ator i & e * */


#inc lude <std io.h >
{

int a;
int *aPt r;

/ * a un inte ro */
/ * aPtr un punt ator e a un inte ro * /

a ~ 7;
aPtr = &a;

1
indi rizz o di a * /
i
con
stato
impo

/ * aPtr

prin tf (" Tne addr ess of a is %p\ n''


''The valu e of aPtr is %p\ n\ n'' , &a, aPtr );
prin tf( "Th e valu e of a is %d\ n''
"The valu e of *aPt r is %d\ n\ n" , a, *aP tr);
prin tf( "Proving that * and & are complements of ~
"each othe r. \ n&*aPtr = \ p\ n*&aPtr = %p\ n ,
&*aPtr, *&aPtr);
retu rn 0;

In

of a is FFF4

The valu e of aPtr is FFF4


The valu e of a is 7

The value of aPt r is 7


P:rov ing that
&'*aPtr- = FFF4
&aPtr FFf4

and

&

are cmplemertt:s of aach

Ope rato ri
( ) [

o1:t\e~.

'

Gli oper atori sui puntatori & e * .

Figu ra 7 .4

La chiamata per rife rim ent o delle funzioni

e,

i prog ramm atori ut ilizza no i puntato ri e l' oper atre di derif erim ento per

simu lare una chiam ata p e r ri ferim e nto. Per richi amare una fun zione co n degli argo men ti che d ebba no essere modi ficat i, si passerann o dunq ue i loro indirizzi. Norm almen te, ci potr esser e otten uto appli cand o l'ope rator e di indir izzo (&) alla varia bile
che d ovr essere modifi cata. I vetto ri invec e n on saran no passari u til iz.zando !,op erato re & p erch , come abbi amo visco 11el Capi tolo 6 , il C passe r auto mati ca men te la
locaz ione dj mem oria del loro prim o elem eno (poic h il loro .nom e sar se mpre equi valen te a &arr ayNa me[0 ] ) . Nel mQm ento in cui !, indir izzo d.i ttna varia bile sar stato
passa to a un a funz.io 11e, n el co rpo di ques ta potr esser e u tili zzato l'o peratore di
deriferi men to (*) per m odificare il valo re della varia bile imm agaz zinat a nella mem oria
del chiam a nte.

}
a~dress

23 1

Esist o no due mod i per p assare gli argo menci a una fun zio ne: per vaJore e per riferi ment o. Tu tte le chiam are di funz ione in C so no per valore. Com e abbi amo visco nel
Capi tolo 5, l' istruz ion e retu rn potr esser e utiliz zata per restit uire un valore da una
funz ione chiam ata a quella clu aman te (o anch e per restit uire il co nt rollo da tLna fun zione c hiam ata, senza resti tuire alcun valore). M o lte fu nzion i per porre bber o avere la
nece ssit di modi ficare alcun e delle varia bili ricevure d al c:hiam anre, o di passa re un
punt atore a un ogge tto di d ati di dimen sioni raggu ardev oli, per evita re il dispe ndio
causa to dal passa ggio del suo valor e (che, co me sapp iam o, richiedere b be la prep arazione di una copia deU ' ogge tto). Per ques ti scop i il C forni sce la possi bilit di simtt lare
un a chiam ata per rifer imen to.

main ()

The

I PUNTATORI

Associativit

Tipo

da ~in isrra a destr a


da destra a sinis tra

mass.tma

I prog ramm i most rati nel la Figu ra 7 .6 e n ella Figu ra 7.7 corri spon dono a due
versjoni di una funzione che eleve r al cubo un inter o: cube ByVa lue e cube ByR efere nce.
Quel lo della Figu ra 7.6 passer la v~ri abile rium ber alla funzi one oube ByV alue ut.i.lizza_ndo una chi a mata p er valor e. La funz ione cube ByV alue eleve r al cubo il suo argo men to e restit uir al main il nuov o valore utiljz zand o un,is uuzi one retu rn . Il nuovo
valor e sar asseg nato a num ber nella funz ione main .
Il prog r amm a del la Figu ra 7. 7 pass er la var iab ile n u mb e r all a ftJ nzio ne
cube ByR efere nce t1cilizzando una chiam ata per riferi ment o, ovve rosia passa ndo l'indirizzo di number. La funzi one cube ByR efere nce ricever come argo ment o un puntatore
a int chiam ato nPtr . La funz ione risolver il riferi men co del punt atore ed eleve r al
cubo il valo re punt ato da nPt r . C i mod ifich er il valo re di num ber co nten u to nella
mem oria delJa funzj on e main . Le Figu re 7.8 e 7 .9 an alizz ano graficame nte n ~ll'o rdine
i prog rariun.i della Figu ra 7.6 e della Figu ra 7.7.

da sinistra a destra

mol tiplicarivi

da sinist ra a destr a
da sinis tra a destra

addit ivi

da sinis tra a desu a


da sinistra a destra

uguaglianza
AND logico

da siniscra a destra
da destr a a sinis tra

OR logico
cond izion ale

/* Eleva al cubo una vari abil e usando una chiamata per valo re */
#inc lude <s tdio .h>

da destra a sjnist ra
da sinist ra a destra

assegna.men ro

int cubeByValue (int );

++

--

* & (tipo )

< <= > >=

--

1=

&&
I I
I I

?:

+=

---

*= /= %=

Figu ra 7 .S

Priorit degli operatori.

unar i

Errore tipico 7.3

relazionali

Non risolvere il riferimento di ut1 puntatore, qualora sia necessario farlo per ottenere il
valore cui fa riferimento il puntatore.

virgo la

main( )

(con"tinua)

CAI'lTOLO 7

233

lPUNTATORl

232
All'inizio

printf( "The original value of number is %d\ n", number);


number = cubeByValue (number);
printf(''The new value of number is %d\n'' 1 number);

r1ch1ama

int number = 5;
number

cubeByValue:
r;=-:---=-:-:-~-:--:~~~~~~----.

numb er

main()

int number = 5;

main

int cubeByValue(int n)

return n " n * n.
I

= cubeByValue (number) ;

indefinita

return 0;

}
Dopo

int cubeByValue(int n)
{

r eturn n * n * n;

/* eleva al cubo la variabile locale n */

int numbe r = s;

The originaL ~value of number is 5


The new val~ of nmber is 125
Figura 7 .6

number

ri~eve la chiamata:
r;:-=-~-:---=----~~~~~~~

number

main()

c ub eByValue

int cubeByValue(int n)
{

return n * n " n .

= cubeByValue(n umber);

'

Eleva al cubo una variabile usando una chiamata per valore.

/* Eleva al cubo una variabile usando una chiamata per riferimento */

#include <stdio .h>

Dopo

cu b eByValue fa il cubo del parametro n:

main()
{

int number

v0id cubeByReference(in t *);

ntimber

main()

= 5;

number

int cu beByVal ue(int

125

return

= cube6yValue(number);

0 * n Ji
n

int number

n)

= 5;

printf( "The originai value of number is %d\n", number) ;


cubeBy Referen ce(&num~r);

printf( "The new value of number is %d\n

Dopo

1
'

number);

return 0;

main()

number

int number

*nPtr

*nPtr * *nPtr * *nPtr;

= 5
I

ma i n:

int cubeByValue( int n)

125

return n n n.J

number =(cubeByValue(numbe r);

void cubeByReference(in t *nPtr)


{

cubeByValue

restituisce l valore al

/ * eleva al cubQ number nel main */

indefinita

The O'~ifinal v.alue Of nuqtber is 5

Dopo

main completa l'assegnazione a numb er:

T.he new, va1U<e f nutnber. is 126

Figura 7.7

,.

in t number

Eleva al cubo una variabile usando una chiamata per rif erimento.

Una funzione che riceva come argomento un indirizzo dovr definire un paramecro di
tipo puntatore. Per esempio, l'incestarione della funzione cubeByReference sar:

~i:n-::t--:-:-=--:--:-:--n)
cubeByValue(int:-------------.

n uni ber

ma in ()
{

= s
I

125

I.

number = cubeByValue(number)j

Figura 7.8

n " n.I
n

void cubeByReference(in t *nPtr)

r et urn n

Anaris1. di una tipica chiamata


per valore.

indefinita

234

CAPITOLO

number

i nt number = s;

void cubeByReference(int *nPtr )

235

utilizzata una chiamata per riferirnento. U compilatore convertir cucci i parametri di


funzi9ne che rappresentino u11 vettore unidimensionale, dalla notazione int b [] a
quella int *b co n puntatore. Le due forme sono dunque interscambiabili.

Prima della chiamata oer riferimento a e u be B V Re f ere ne e:

main()

J-pNTATORl

*nPtr = *nPtr nPtr * *nPtr;

Buo1za abitt,dine 7.3

cubeByReferen ce( &number);


}

n Pt r

Dopo la chiamata per riferitnento a

cu beByReference e

indefinita

prima che venga fatto il cubo di

*nPt r :
=

number

main()
{

int number

Utilizzate sempre una chiamata per valore quando passate degli argomer1.ti a itna fitnzione, sempre che non sia richiesto esplicitamente che qttel/a chiamata modifichi il valore
dell'argomento nell'ambiente della jitnzione chiamante. Qitesto un altro esempio del
principio del minimo privilegio.

= 5;

void cubeByRef erenc-e ( int *nPtr)


{

*nPtr

*nPtr *nPtr ,. *nPtr; ,,

cubeByReference(&number);
}

Utilizzare il qualificatore const con i puntatori

Il qualificatore const conse11tir aJ programmatore di informare il compilatore che il valore di una particolare variabile non dovr essere modificato. Il qualificatore const non
esisteva nelle prime versioni del C: stato aggiunto al linguaggio dal con1irato deJl'ANSI C.

Ingegneria del software 7. 1

nPtr

7.5

Il qualificatore const potr essere utilizzato per applicare il principio del minimo privilegio. Applicare il principio del 111inimo privilegio, per progettare in modo appropriato il software, ridttrr drasticamente il tempo di messa a punto e gli inopportuni effetti
collaterali e render pi facile kJ modifica e la manittenzione di itn programma.

Dopo che *nPt r stato moltiplicato al cubo:

number

ma in ()
{

int number : 5;

125

void cu beByReference(int *nPtr)


{

nPtr = *nPtr

~nPtr

*nPtr;

cubeByRefarence(&number);

nPtr
~

Figura 7.9

..;..

Analisi di una tipica chiamata per r iferimento.

La suddetta intestazione sp ecifica che cubeByReference ricever ome argomento


l'indirizzo di una variabile incera, immagazzinandolo localmente in nPtr, e che non
restituir nessun valore.
Il prototipo di fi1nzione per cubeByReference conterr int all,interno d elle
parentesi. Cos com~ acade con gli aJrri tipi di variabile, non sar ncessario includere i nomj dei puntatori all'interno dei prototipi di funzione. In ogni caso, quelli che
saranno stari inclusi per scopi documentativi saranno ignoraci dal compilatore C.
Qualora un,a funzione debba ricevere come argomento un vettore unidimensionale,
nella sua intestazione e nel suo prototipo porr essere utilizzata la stessa notazione con
puntatore usata nella lista dei parametri di cubeByReference. Per il compilatore, un a
funzione che riceva un puntatore sar equivalen te a una ch e riceva un vettore
unidimensionale. per questo moti vo che spetter alla funzione "sapere" se stia ri cevendo un vettore unidimensionale, o semplicemente una variabile per la quale sia stara

Obiettivo portabilit 7.1


Per quanto il qualificatore const sia ben definito ne/L'ANSI C, sappiate che alcitni .risterrii non lo applicano.
Nel corso degli an'ni, si accumulata un'eredit formata da una gra n quancit di
codic;e serit.to con le prime versioni del C, che non utilizzavano const perch non era
ancora disponibile. Proprio per questo mocivo, oggi esistono innun1erevoli possibilit
di miglioramento, ottenibili progettando nuovamente il software scritto co n le vecchie
versioni del C. Oggigiorno esiston o anche moJri programmatori cl1e, malgrado utilizzino I'ANSI C per sviluppare i loro programmi, non adoperano il qualificatore const
perch hanno incominciato a programmare on le prime versioni del C. Questi programmatori scanno ovviamente trascurando molte opportunit per una buona ingegnerj a del software.
Esistono sei modi di utilizzare (o di no11 utilizzare) const con i parametri delle ft1nzioni: due riguardano il passaggio per valore dei parametri e quattro quello per riferimento.
Che cosa guider la vostra scelta su una di queste sei possibilit? Lasciate che il principio
del minimo privilegio sia La vostra guida. Assicuratevi sempre cl1e una fun zione abbia un
diritto di accesso ai d ati contenuti nei propri parametrj tale che possa consentirgli di
svolgere il suo compito, _ma non di pi.

Nd Capitolo 5, abbiamo spiegato che in C tutte le invocazionj di fu r1zion.i so no per


v:alore: esse riceveranno dunque una copia dell'argomento passato attraverso l' invocazione.
Il val.ore originale della variabile rester immutato ncll'ambiente della funzione chiamante,
anche quando la sua copia sar stata 1nodificaca -all' interno della funzione chiamata. le
molri casi, il valore passato a una fi1nzione sar modificai:o in modo che quella possa

CAPITOLO

236

re di
portare a trm ine il proprio com pito . &is ton o tuttavia delle circostanze in cui il valo
ti
trat
si
lora
qua
e
nch
nea
a,
mat
chia
e
zion
fun
a
dall
rato
alte
re
esse
r
dov
non
to
men
argo
un
di una cop ia del valo re originale.
Co.nsiderate una funzione che ri.ceva com e argomenci un vettore uni dimensionale e la
rere
scor
nte
eme
plic
sem
r
dov
e
zion
fun
tale
Una
re.
o
vett
il
zi
aliz
visu
che
e
ione
ens
dim
sua
sar
one
ensi
dim
sua
La
so.
stes
o
dell
ento
elem
lo
ngo
si
i
ogn
put
out
in
iare
inv
e
il vettore
il
utilizzata nel corpo della funzione per determ inare l'ind ice massim.o del vettore, c-0sl che
La
ata.
plet
com
a
star
sar
one
zazi
aliz
visu
la
cui
in
to
men
mo
il
e
nar
rmi
dete
sa
pos
o
cicl
dimensio11e del vett ore non sar dt1nque modificata nel cor po della fun zion e.

Ingegneria rkl softzuare 7.2


Nel ca.so in cui 1.tn valore non sar modificato (o non dovr essere modificato} nel corpo
della funzione cui sar stato passato, quel valore dovr essere dicf1iarato con st per assicurarsi che non sia modificato accidentalmente.
o
stat
sia
cl1e
r
valo
un
are
ific
mod
di
o
ativ
tent
si
lsia
qua
ter.
rcer
inte
tore
pila
Il com
iso
dichiarato con st e, secondo la parricolare imp lementazione ucilizzata, eme tter un avv
o un messaggio di errore.

ere
gen
sto
que
di
re
tato
pun
Un
st.
con
e
ator
lific
qua
il
r
ude
incJ
non
li
dat i var iabi
in
pot reb be essere utilizzato, per ese mpi o, per ricevere un arg om ent o di cipo stri nga
e
ent
alm
ntu
eve
(ed
re
ora
elab
per
ri
tato
pun
dei
a
etic
itm
l'ar
izzj
util
che
e
zion
fun
una
uFig
a
dell
e
cas
per
Up
tTo
ver
con
ne
zio
fur1
La
.
ng~
sui
a
dell
i
ttr
cara
i
mod ificare)
abili
ra 7.10 dich iare r com e suo arg om ent o pro prio u11 pun tato re variabile a daci vari
a
volt
per
e
tter
cara
un
s
nga
stri
l
r
ore
elab
e
zion
fun
La
.
*s)
ar
(ch
s
o
dol
chia man
lusa ndo l arit met ica dei punc.atori. Nel caso che un cara tter e sia com pre so nell 'inte rva
nello a-z , e..sso sar con ver tito nella S\:la corrisp ond ent e le.etera mai usc ola com pre sa
io,
trar
con
caso
in
II;
ASC
ice
cod
suo
sul
aro
bas
olo
calc
un
ndo
izza
util
-Z,
A
l'int erv allo
cl1e
il cara tter e sar ign ora to e sar elab ora to que llo success.ivo dell a srringa. Oss erv ate
ri
inte
ri
valo
a
no
ndo
o
risp
cor
CII
AS
i
tter
cara
di
eme
insi
'
dell
ole
usc
mai
ere
lett
le
e
tutt
ate
sult
(con
32
o
men
la
sco
inu
m
.
era
lett
e
ent
ond
risp
cor
loro
a
dell
lli
que
a
i
equ ivalent
Cal'Ap pen dice D, per una rabeJla dei valori cor risp ond ent i ai caracteri AS CII) . Nel
vercon
la
per
c
del
d
dar
stan
eria
libr
a
dell
r
ppe
tou
e
zion
fun
la
o
erem
ent
pres
8,
lo
pito
sion e delle lett ere min uscole in mai usc ole.
1

/* Co nve rtir e le let ter e min usc ole in let ter e ma ius col e
/ * usando un pun tato re var iab ile a dat i var iab ili */
#in clu de <s tdi o.h >

Qitalora sia stata utiliuata 1.tna chiamata per valore, nell'ambiente della funzione chiamante potr essere alterato itn solo dato . Questo dovr esser assegnato dal valore di ritorno
della fanzione chiamata. Per modificare pi di t.tn dato nell'ambiente di una fanzione
chiamante, dovr essere utilizzata ur1.a chiamata per rifari1nento.

main ()
{

cha r str ing []

= ''ch ara cte rs '' ;

pri ntf {"T he str i ng bef ore con ver sio n is: %s \n" , str ing );
con ver tTo Up per cas e(s trin g);
pri ntf (''T he str ing aft er con ver sio n is: %s\n", str ing );
ret urn 0;

Buona abitudine 7.4

Prima di utiliua.re una funzione, controllate il suo prototipo per determinar se sia in
grado di modificare i valori cl-1e gli saranno pa.sfati.

Errore tipico 7.4

voi d con ver tTo Up per cas e(c har *s)

Ignorare che gli argomenti di una funzione invocata per riferimento siano dei puntatori,
pa.s.sandoli erroneamente come in una chiamata per valore. Alcuni compi/;a,tori potrebbero accettare questi valori e, dando per scontato che siano dei p1-1ntatori, risolverebbero i loro riferimenti. In fase di esecuzione, ci provocher spesso delle vio'4zioni di accesso
alla mmzoria o degli enori di segmentazione. Altri compilatori invece potrebbero rilevare la mancata co,rrispondenza tra i tipi degli argomenti e quelli dei paramett i e genererebbero dei messaggi di errore.

Esis tono ben qua ttro mo di per passare un pun tato re a una funzione: un pun tato re
a
e
abil
vari
re
tato
pun
un
i,
abil
vari
dati
a
te
I:an
cS
re
tato
pun
un
e,
abil
vari
dati
a
variabile
ni
dati costan ti e un pun tato re oostanre a dati costant i. Ogn una delle qua ttro com binazio
fornisce un diverso livello di diri tti di accesso.
i
dat
a
le
iabi
var
re
tato
pun
un
a
d
o
t,
anti
gar
sar
dati
ai
sso
acce
di
alto
pi
llo
Il live
ran variabili. In que sto caso, ovv iam ente dop o averne riso lto il rife rim ento , i daci pot
do
mo
in
to
bia
cam
re
esse
r
pot
sto
q,ue
e
re
tato
pun
il
so
V'er
attra
cati
difi
mo
re
esse
no
e a
che pos sa fare rife rim ent o ad alrr:i dat i. La dich iara zio ne di un pun tato re variabil

..... ...... ... ...... . ... ....... ..... ...... ...

...
.. . ,,
,

*/

voi d convertToUppercase{ cha r *);

Ingegneria d.el software 7.3

237

I PUNTA'"IORJ

'1,

wh ile (*s

1~

'\ 0 ') {

if (*s >: 'a' && *s


s -= 32;
++s;

<=

' z')

/ * conver te all a let ter a ma ius col a del l ' ASCII * /

/ * inc rem ent a s pe r pun tare al prossimo car att ere */

}
}

The str ng bef ore convtsion is: shar-acter-s


The str ing aft er conversion is: CHARACTERS
i
dat
a
e
abil
vari
re
tato
pun
un
ndo
usa
olo
usc
mai
in
ga
strin
una
tire
ver
Con
O
I
Figura 7.
vari abil i.

238

CAPITOLO

Un puntatore variabile a dari costanti potr essere modifLcato in modo che possa
fare rife rimento ad altri da.ci, purch siano del cjpo appropriato, ma questi non potranno essere nlodif.cari. Un puntatore d i questo genere potr essere uti lizzato, per esempio, per ricevere un ai:gomento di tipo vettore in un a funzione che elabori ogni elemento di quest' ul timo , sc; nza m odifica r11e i dati. Per es~mp io, la fu 11zion e
printCharacters della Figura 7.11 dichiarer il param etro s di tipo const char *.
La dichiarazione va Letta d a destra a sjnistra come ''s un puntatore a una cosranc:e di
carattere,,. Il corpo della funzione utilizzer u11a stru ttura for per inviare it1 output i
caratteri della stringa fi oche non sar stato inco ntrato quello nullo. Una volta che ogni
carattere sar srato stampato, il puntato re s sar incrementato cos che possa puntare
al carartere successivo deJla stringa.

/* Visualizzare una stringa un carattere per volta usando */


/* un puntatore variabile a dati costanti
*/
#include <stdio.h>
void printCharacters(co nst char *)i

239

I PUN1J\TOR1

cifecime_nro nell' invocazione di una funzione che lo riceva come argon1 ento. Le struttlLfe invece saranno sem pre passare per valore: sar dunque passata una copia dell'iarera struttura. In fase di esecuzione, ci rich ieder un cerco dispendio di tempo e di
spazio causato dalla preparazione di una copia d i rutti gli elementi prese nti nella srrurtura e, ovviamente, dal relativo immagazzinamento nella memoria delle funzioni chiamate. Porremo invece urilizza re dei puntatori a dati cosranri, qualora dovessimo fornire a un a funz.ione Je i11fo r.m azioni conrenure in un a struttUra, in modo da combinare
l'eff.c ienza di t1na chiamata per r iferirne.neo co.n Ja protezione di una cl1ian1ata per
val.e re. Nel passaggio di un puntatore a una struttura, dovr: essere preparata solo la copia
dell'indirizzo in cui qu.ella sar stata in1Jllagazzinara. Su w1a niacchina che utilizzi degli
indirizzi formaci da 4 byte, sara11no ricopiati solo t1uesri pochi byre di n1en1or.ia, invece
d~e centinaia o forse delle migliaia di byte che la struttt1ra potrebbe i11cludere.

/* Tentare di modificare i dati attraverso

*/

/ * un puntatore variabile a dati cost anti */


#include <stdio .h>
void f(const int *);

main()
{

cha r string [ ]

"print characters of a string" ;

main ()
{

int Yi

printf ('' Th e string is: \ n'') ;


printCharacters(st ring);
putchar( '\ n
return 0;

f(&y);
return 0;

);

void printCharacters(co nst char *s)


{

~oid f

for ( ; *s != \ 0
putchar ( *s) i

1
;

s++~

/* nessuna inizializzazione */

The string is:


print characters of a string
Figura 7. I I VisuaJizzare una stringa. un carattere per volta, usando un puntatore
variabile a dati costanti.

La Figura 7.12 mostra i messaggi di erro re prodotti dal compilatore Borland C++,
qualora si cenci di compilare una funzione che riceva u11 puntatore variabile a dati costanti
e, allo stesso tempo, si utilizzi il puntatore per rencare di modifc.are i dati.
I vetto ri, com sap pian10, sono un cipo d i d ato aggregaro che jmmagazzinano,
sotto un unico nome, molte informazio ni correlate e dello stess0 ti po. Nel Capitolo 1O, discuteremo un alcro ripa di dato aggregato detto struttura (ma anche record in
alrri li nguaggi). Una Struttura in grado di immagazzinare, sorra un unico nome,
molte informazio ni co rrelare e di tipo differente (per esempio, porr im magazzinare i
dati di ogni impiegato di un'azienda). Un vettore sar passato automacicamenre per

(const int

*x)

*x

/* f tenta una modifica i l legale */

= 100;

/* non si pu modificare un oggetto dichiarato const */

Compiling FIG7_12.C:
Error FIG7_12.C 17: canno.t modif'~ a const object
Warning FIG7_12.C 18: Paramet~ r ' x ~ is never used
Figura 7 .12 Tentare di m odificare dei valori attraverso un puntatore variabile a dati
costanti.

Obiettivo ejficier1za 7. 1

Passate gli orgetti di di112ensioni ragguardevoli, come Le strumt.re, uti,Liuartdo dei p.urttatori
a dati costorzti in modo da cornbirzare i benefici dell'efficienza di itt1a chitt1'J1'ata per
rifetimento con La sicztrezza di 1.tr1tl chit{.mata per valore.
u n siffatto utilizzo dei pt1n catorj a dati costanti un esempio di conipromesso tempo/
spazio. I nfatti , sar ,p referibile utilizza re i puntatori nei casi in cui la 1nemoria sia
scarsa e !,efficienza sia un interesse di primaria importanza. Mentre, nei casi in cui la
memoria sja abbondante e l'efficienza non sia un interesse di p rimaria importanza,
sar prefe ri bile passare i dati per valore, in modo da rispettare il principio del minimo

240

CAPI TOLO

privi legio . Rico rdare che alcun i siste mi non implemen rano co rrerr am enre il quali ficat ore
cons t, pe rci la chi am.ata per valo re sar semp re il mo.d o migli ore pe r preve nire la
modi fica dei dati.

Un punt arore cos tanre a dati varia bili fa riferj mento sen1p re alla stess a posiz ione
di mem oria, m enrre i dati che vi so no imma gazzi naci potra nno esser e modi ficaci per
mezz o d ello stess o. Quesro tipo di punt atore il defa ult per il n ome di un veno re.
Ques to, infar ti, un punt atore costante al l'iniz io d el vetto re. Tutti i dati d el vetto re
potra nno essr e letti e modi ficat i ut ilizzando il suo nom e e un indic e. Un punt atore
costa nte a d ati varia bili potr essere utiliz zato, pr esem pio, per ricevere un argo mento di tipo vetto re in una funz ione ch acced a ai suoi elem.eoti utiliz zand o esclusivament e la notaz ione co n gli indi. i di vetto re. I puntatori dichi arati con il q .u alifc atore
cons t dovr anno essere inizia liz-z ati co ntest ualm ente alla loro dichi arazi o ne (qual ora il
punt atore sia il param etro di una funz ione, sar inizia lizza to con quell o che sar stato
passa to nella sua invocazio11e) . Il ,p rogra mma della F igura 7. 13 tenter di mod ifica re
un punt atore cos tante , ptr che sar stato dichi arato di tipo int * con st. La dichi arazio ne va le tta da destr a a sinis tra come "ptr un pun tator e costa nte a un intero". li
puntato.re sar inizia lizza to co n l'indirizz o della varia bile inter a x e, quan do il program ma tente r
asseg nare a ptr !)ind irizzo di y , sar gene rato u n m essaggio
error e.

ru

/* Tent are di mod ifica re un punt ator e cost ante a * /

/ * dat i cost anti.


#inc lude <std io.h >

*/

m~in()

int X = 5, Yi
cons t int *co nst ptr = &x,
*ptr = 7;
ptr = &y ;
retu rn 0;
}

'Compiling FfG7_14. C'!


.
Erra r FIG7 14.C 10: Cannot modfy a cons t obje ct
"
Erro r FIG7 14. e 11 .~ Oannot modify a cons t obj eet
waraing FIGll<~:14. ~ 13: ' pt r-~ is assig ned valu e that is- neve r used
warning FIG1_14.C 13: 'Y' is decl ared but neve~ used

ru

/* Tent are ai mod ifica re un punt ator e cost ante a * /


/ * dati vari abil i
*/

241

I P9NT ATORI

'

Figu ra 7 .14 Tentare di modificare un punta tore costante a dati costanti.

#inc lude <s td io .h>

7 .6
main ()

I.! ord ina me nto a bolle utilizzando


una chiamata per rife rim ent o

int x, y;
int * cons t ptr

&x;

ptr = &y;
retu rn 0;

Mod ifich rem o ora il prog ramm a p er l'ord inam ento a bolle della Figu ra 6. 15, in mod o
da utiliz zare due funz ioni: bubb leSo rt e swap . La fun zione bub bleS ort eseg uir
l'ord inam ento del vetto re e rjchi amer swap , per scam biare di posto gli elem enti arra y[ j 1
e arra y[j + 1] del vetto re (con sultate la Eigu ra7. 15). R icord are che il C appli ca
!'inc apsu la ment o delle infor mazi oni tra le fun zio.r1i , perci swap . non avr accesso ~i
singo li elem enti del vetto re
bubb leSo rt . Dato che ques ta desidera che swap abbia
accesso agli elem enti del vetto re cos ch e possa scambi3:1"li di posto ,. ~u.bbleSo~t pas~
ser a swap ognu no di quegli elem enti artra verso una chiamata per r1fe r1me nto: tn altri
term ini, sar passa to in mod o espli ciro l' iodj rizzo di ogni elem ento del vetto re. U n
vetto re com pleto , come sapp ia mo, sareb be passa to auto mati came nte per rifer imen to,
ma i singo li ele ment i di un vetto re so no d egli scala ri e saran n o pa~s.ati nor~almente
per valor e. Di co nsegu enza, nella chiam ata a swap , bubb leSo rt ut tlizzer l oper ato re
di indir izzo (&) con ognu no degli elem enci del vetro re, ael mod o segu nte

ru

Compiling FIG7_13.C:
'
'
Erro r FIG7_13.C 10: Cannot modify a cons t obje ct
warning FIG7_13.C 12: 1 ptr' is assig oed a valu e that is neve r used
warning FIG7_13.C 12~ 'y' i% decl ared .but Aever used
'

Figu ra 7.13 Tentare di modificare un punt atore costante a dati variabili.


Il diritt o di accesso mini mo sar garan.rito da un puntatore costante a dati costanti. Un
punta tore di questo genere far riferimento semp re alla stessa locazione di memoria e j dari che
vi saranno conte nuti non porra nno essere modificaci. Questo il tipo di puntatore eh.e dovrebbe essere uti lizzato, per esempio, per passare un vena re a una funzione che la veda utilizza ndo
solo la nocazione con gli indici ili vettore e che non modifichi i valori dei suoi e1eme 11ri. 11
progr amm a della Figura 7.14 dichiarer un punta rore ptr di tipo cons t int * cons t. An:che questa dichiarazione va letta da destra a sinistra come <'ptr un punta tore costante a una
costa nte inter a". La figura mostra i messaggi di errore che saran no generati, qualo ra si cenci di
modificare i da punra ti da ptr o l'indirizzo immagazzinato nel punta tore.

swap (&ar ray[ j], &arr ay[j + 1]);


per esegu ire una chiam ata per rifer imen to. La funz ione swa.p ricever .&ar ray[ j] n~l
pun tato re elem ent1 Ptr. Sebb ene alla funzi o ne swap no n s1a conse nt ito con oscere 11
nom e arra y [ j] a causa d ell'incapsu lame nto delle infor mazi oni, essa potr coin unq u
utiliz zare *elem ent1 Ptr come un sillo nimo per arra y [ j) . D i co nsegu enza , q ua ndo
swap far rifer imen to a *ele men t1 Ptr, in realt st ar punt ando ad arra y[ j l di
bubb leSo rt. I n mod o simil e, quan do swap far riferi ment o a *ele men t2Pt r, in realt star punt ando ad arra y[ j + 1) di bubb leSo rt. Per quan to a swap non siano
cons entit e delle istru zioni co.m e

24 2

CA PITOLO

voi d swap (i nt *e l ement 1P t r , int *element2P tr)

temp = arr a.y [ j);


arr ay [j] = arr ay[ j + 1];
arr ay [ j + 1) = temp;

int temp;

lo stesso pre ciso effe tto sar o tten uto inse rei1do le istr uzi oni

tmp = *el em ent 1P tr;


*el em ent 1P tr = *el em ent 2P tr;
*el em ent 2P tr = temp;

temp = *el emen t1P tr;


*el em ent 1P tr = *el emen t2P tr;
*el em ent 2P tr = temp;
}

..

nella fi1nzione swap del la Figura 7.1 5 .

Data ite ms in ori gin a! ard er

l.
ina
re,
ord
tto
i
ve
/ ~ Qu est o programma i nse ris ce de i va lor in un
va lor i in modo asc end ent e , e vis ua l i zza il ve tto r e ris ult an te * /
#in clu de <st dio .h>
#de f ine SIZE 10

voi d bu bb leS ort (in t *, con st int ) ;


main ( )
{

int i, a[SIZE]

{2, 6, 4, 8 , 10, 12, 89, 68 , 45, 37} ;

pri ntf ( "Data ite ms in ori gin al ord er \ n") ;


for (i= 0; i< = SIZ~ - 1; i ++)
pri ntf ( 11 %4d 11 , a [ i]) ;
/ *o rdi na il ve tto re* /
bu bb leS ort (a, SIZE);
pri ntf ( "\ nData ite ms in asc end ing ord er \ n") ;
i ++ )
for (i = 0; i <~ SIZE - 1;
'.
pri ntf ( "%4d '1 , a[i ]); '
pri ntf ( \ n" );
ret urn 0;
11

voi d bu bb leS ort (in t *ar ray , con st int siz e)


{

int pas s, j;
vo id swap (in t * , int *) ;
for (pa ss
for

= 1; pas s <= siz e

(j -

2
I

l:

10

12

68

89

45

37
I'

asc end ing -0rder


in
ms
ite
Data

Fgura 7. I S

.8

I...'. ord ina me nto

10

12

45

3.7

68

89

_.

a bol le con chiamata per rife rim ent o.

ince L'
a.
not
di
e
egn
d
ero
avv
d
o
n
so
ort
leS
bb
bu
e
n
zio
fun
a
lJ
de
e
ich
rist
Mo ire car atte
,
[]
ay
arr
int
e
com
che
ece
inv
~
ray
*ar
int
me
co
ay
arr
rer
hia
dic
staz.ion e della fun zio ne
(rilc
ona
11si
i1ne
d
uni
re
ro
vet
un
nto
n1e
rgo
a
e
com

ver
rice
ort
leS
bb
bu
che
c
peI ir'ld icar
e
siz
o
etr
am
par
Il
).
bili
bia
cam
ers
int
o
son
li
o1
azi
not
ste
que
che
ta
vol
una
pet iam o an co ra
qua nto iJ
sar di chi ara to con st per obb edi re al pri nci pio del minLn1 0 privile gio . Per
e riceva una copia del valore conse rvato nella fun zio ne main e pe r qua nro

param etro siz


di
o
ogn
bis

avr
.011
n
.
ort
leS
bb
bu
,
ario
gi11
ori
ato
d
il
rare
alte
r
pot
non
la SLta mo dif ica
tor e rest er fissa
vet
del
e
ion
ens
n
di1
la
i,
att
111f
o.
pit
com
suo
il
re
gui
ese
per
e
siz
re
var ia
pe r
nst
co
rata
hia
dic

sar
e
siz
1za,
u.e1
seg
con
Di
.
ort
leS
bb
bu
di
ne
zio
ecu
dut ante lies
l algori t mo di o rdiass icu rars i che non sia mo dif i cara ac ide nta lme nte . pro bab ile che
sia mo dif i cat a
re
to
vet
el
d
ne
io
ens
dim
la
ora
ual
q
,
nte
e
tam
rret
co
ni
zio
fu11
non
o
nam ent
1

duran te l' ela bor azion e.

leS ort poid1


Il pro tot ipo della ft1 11zio ne swap sta ro i ncluso nel co rpo di bu bb
ort
leS
bb
bu
in
po
ri
ro
pro
il
re
eri
Ins
.
er
am
chi
ri
la
che
e
n
zio
fun
ca
LLni
l'

questa sar
gui re
ese
e
ell
qu
a
nte
me
iva
lus
esc
p
swa
ne
zio
fun
ella
d
i
bil
erta
acc
ni
zio
Limi ter le u1voca
re swa p
oca
inv
di
re
ta
n
te
ro
sse
ove
d
che
11i
zio
fun
e
alcr
Le
.
ort
leS
b

bub
d.i
rno
all' inte
pilacom
al
be
eb
tter
spe
i
c
per
ne,
zio
fun
di
ipo
t
to
pro
to
s
giu
al
o
ess
acc
ero
non avrebb
un pro co cipo clic
tor e gen era rne uno aurom aticam enr.e. M a ci pro dur r nor.n1al menre
Ltn err ore del co mp ilat o re,
r
ere
gen
e
ne
io
z
fun
ella
d
one
azi
est
int
all'

der
pon
rris
co
non
o
sian
tri
e
a1n
par
i
suo
i
e
ne
zio
fun
la
dal
ico
ricu
res
ore
val
il
e
ch
er.
sum
poi ch quesro pre
di tip o int .
I11geflzeti.a del software 7.4

1 ; pass++)

0; j <: siz e - 2; j ++ )

if (ar ray [j] > arr ay [j + 1])


swap (& arr ay[ j] , &a rra y[j + 1]) ;
}

24 3

I PUN1';\ TO RJ

ciprin
nl
sce
edi
obb
ni
izio
fier
e
altr
le
del
i
ior1
iniz
def
le
del
rno
inte
all'
pi
toti
pro
i
Inserire
pio del 1ni?zi1'1'10 privilegi.o, attraverso lo limitazio11e delle invocaz ioni amrnissibili alle
fi1nzior1i in citi compaiofJO i p rototipi.
d el
e
ion
e11s
dim
la
etro
am
par
ne
co1
er
ce\r
ri
ort
leS
bb
bu
e
n
u.io
fur
la
O sservate cJ1e
la s ua dim e nsi on e.
ver tore . Per poterlo ord ina re, infaTfi, la fu nzione dov r co nos ce re
ria rela 1no
111e
di
izzo
dir
l'in
ve
rice
a
est
qu
e,
n
zio
fun
u11a
a
e
tor
vet
un
di
io
g
Nel passag
ne ri gua rtivo al suo pri mo ele me nro . I.:indirizzo no n for11isce per alc una info rmazio

244

CArnow 7

dante il numero degli elementi presenti nel vettore. Di co nseguenza, coccher al prograroroaco re forn ire alla ft1nzione la dimensione del verco re.
Nel programma, la din1ensione del vettore sar passata alla funzione bubbleSo rt
in modo esplicito. Qwesto approccio offre due principali benefici: .la riusabilit del
software e una corretta progettazio ne dello stesso. Definendo la funzi9ne in modo cale
che riceva la dimensione del vettore per mezzo di un argomeoto, faremo s che la
funzione possa essere u tilizzata da un qualsiasi programma che abbia la necessi t di
ordinare dei vettoci tt n idimension ali di inreri che, tra l'altro, potranno avere una dimensione qualsiasi.

lngegn.eria del software 7.5

I PUNTAro~ 1

l,Ul

245

In fase di com pilazione potr essere determin ato anche il numero degli elemenci di
verrore. Considerate , per esempio, La segueoce dichiarazio ne di venore:

double real[22];
Le variabili di cipo double saran110 11or111aln1eate i1nrnagazzi11ar.e in 8 byte di memoria. Di
conseguenza., il vettore real conterr un totale di 176 byres. Per determinare il nL1mero
degli elemenci presenti nel vettore, porr essere uri lizzata la seguente espressio11e:

sizeof (real ) I sizeof(dou ble )


Questa determiner il numero di byte contenuti nel vettore real e divider quel valo re per
la q_uancir di byte util izzata per immagazzinare un valore double i11 m~moria.
/* i oper atore sizeof quando usato con il nome di un vettore */
/* restituisc e i l numero di byte presenti nello stesso
*/
1

Quando passare un vettore a una fanzione> fornite anche la si1.4 dimensione. Ci aiuter a generalizzare la. funzione. Le funzioni ge11eralizzate saranno spesso rizJ.tilizzabili
in molti programmi.
Avremmo potuto immagazzin are la dimensione del vettore in una variabile globale
che fosse accessib ile al l'incero programma . Questo approccio sarebbe stato anche pi
efficiente, poich non ci sarebbe staca la necessit di creare una copia della dimensione durante l'in vocazione della funzione. Tuttavia, gli altri program_mi che event uaLnente richiedesser o l'ordinamen to di vettori di interi porrebbero 11on contenere la stessa
variabile globale e, di conseguenz a, non potrebbero utilizzare la nostra funzione.

#include <stdio.h>
main {)
{

f l oat array [ 20 J ;

printf{ 'The number of bytes in the array is %d\n


sizeof{ar ray));
1

11
1

ret urn 0 ;

Ingegn.eria del software 7. 6

Le variabili globali vio/,ano ilprincipio del minimo privilegio e sono un esempio di una
scadente progettazione del software.

The nu~ber of bytes i n the array is 80


_____:_

..
_ ......:..::.;

Obiettivo efficienza 7.2

Il passaggio della dimensione di un vettore a t{na funzione richieder del tempo e avr
bisogrzo di uno spazio aggiuntivo nell'ambiente della. funzione., poich dovr essere preparata una copia della dimensione. Le v4riabili globali, invece, non richiederanno tempo
e spazio aggiuntivi, perch vi si potr accedere direttamente da ogrzi funzione.
Avremmo anche potuto inserire la dimensjone del vettore diretcaroent e nel la funi.ione. Questo approc.::.c o per avrebbe limitato l'utilizzo della funzio11e a vettori di una
particolare dimen.sjone e avrebbe ridotto notevol n1eote la sua riusabilit. La ft1nzione,
infatti, sarebbe stata u ril izzabile solo da p rogrammi che avessero elaborato vettori
unidimensi onali di interi co n una dimensione uguale a quella codificata al l,in terno
della funzione.

Il
fornisce l'apposito operatore unario sizeof per determ inare la dim ensione in
byte di un vetto re, o d ogni alrro tipo di dato, durante la .fase di compilazio ne. UtiJizzaro con il 11ome di un vettore, come mo$ trato neJJa Figura 7.16, l'o peratore sizeof
restituir un valore intero pari al nume ro totale di byte contenuto nello stesso. Osservare che le variabili di tipo f loat saranno normalmen te immagazzinar.e in 4 byte di
memoria e che array sar dichiarato con 20 elementi. Di conseguenz a, in array ci
saranno in rotale 80 byre.

_____

~--~

Figura 7 .16 L.:operatore sizeof, quando usato con il nome di un vettore, restituisce
il numero di byte presenti nello stesso .

Il programma della Fi:gura 7.17 calcoler il numero d i byte utilizzaci per immagazzinare
i tipi di dato standard su un PC compatibile .

Obiettivo portabilit 7.2

Il numero di byte utiliz,zati per irnmaga.~inare un particolare tipo di dato potrebbe


variare tra i diversi sistemi. Nello scrivere dei programmi che dipendano dalle dimensioni dei tipi di dato e che debbano essere eseguiti su diversi sistemi di computer,
utilizzate sizeof per determinare il ni1.mero di byte utilizzato pe,. immagazzinare
i vari tipi di dato.
L'operatore sizeof potr essere utilizzato con ogni nome di variabile, tipo di dato o
c~srante. NeJ caso che sia utilizzato con il nome di una variabile che non sia un vetroreJ
o c;:on q uello d.i una costante, sar restitu ito il n:umero di by~e usati per im magazzinare il
tipo specifico d i qu.ella variabile o costante. Osservate che le parentesi ucilizzate co n
sizeof saranno obbligatorie , qualora il suo operando corrisponda al nome di un tipo di
dato. Le parentesi non saran no necessarie, invece, qualora il suo operando corrisponda al
n ome di una variabile.

247

I Pl'lITATORJ

/* Dimostrazione di utilizzo dell operatore sizeof */


1

locazione

#include <std io . h>

3004

3000

3008

3012

3016

main ()
{

p ri nt f

s-i z e of ( eh a r) - %d \ n "
sizeof (short) = %d\ n
aizeof (int) = %d \ nll
Il
sizeof (long) = %d \n
sizeof (float) = %d \ n
sizeof (double) = %d\ n''
"
' sizeof (long double) = %d \ n'
sizeof ( char) 1 sizeof ( short) , sizeof ( int),
sizeof( l ong), sizeof(float), sizeof(double),
sizeof(long double))i

v[2]

v(4]

v[3]

("

11

11

11

11

1
'

11

variabile puntatore vPt r

'

return 0I
sizeof(char) sizeof ( short) sizeof (int) s izeof ( lon_g) sizeof ( f'loa't) siz_eof (do~b l e) sizeof (long double) =
~

Figura 7. 18 Il vettore v e una variabile puntatore vPtr che punta a v.

Obiettivo portabilit 7.3

La 1t1aggi-orparte dei comp1-1ter 11tilig::za110 oggigi.01?W interi di 2 o 4 byte. Aicztnc del/,e Pnncchinepit't recer1ti tJti!izzan1J invece degli interi di 8 byte. Lnritnzetic11 dei purztato1i dipemlente
dalla 1nacchina, giacch i stioi risultati dipendllno dalla dimensio11e degli oggetti puntati.

Nell'arianecica conve112ionale, la somm<l 3000 + 2 rescicuisce il valore 3002. Qusto


per non normalmente il caso deU 'ariunerica dei punta tori. Nel momento in cui si
sommer o si soraarr un incero da u11 puntator~, questo non sar sen1plicem ente incrementato o decrem entato con quel valo re, bens di qu.ell,inrero moltiplicato per la dimensione dcll,oggetto cui il punracore far riferimento. La dimension.e dcll'oggerco dipender dal
suo tipo di dato. Per esea1pio 1 l'istruzione

2
2
4
4

8
10

Figura 7.17 U sare l'operatore sizeof per determinare le dimensioni dei tipi di dato
standard.

7. 7

vf1]

v[0]

Le espressioni con i puntatori


e l'aritmetica dei> puntatori

I puntacori sono dei_validi operandi per Le espressio ni arirm.etiche, quelle di assegnamerito e


quelle di confronto. Tuttavia, non rutti gli operatori ucilizzati normalmente in. questi tipi di
espressione sara nno ammissibili in co mbinazione con le variabili di tipo puntatore. Questa
sezione descriver proprio quegli operatori cl1e porranno acceuare dei puntacori come loro
operandi e del modo in cui questi operatori sararino util izzati.
Con gli operacori potr essere utilizzaco un insietn e limitato di operazioni aritmetiche.
Un puntato re potr essere incremenrato (++) o decrementato ( - -), vi si potr sommare (+
o +=) o sottr<ure ( - o -=) un intero, o si potr sottrarre u11 puntatore da un altro.
St1ppon,ete che il vettore int v [ 100 J sia stato dicliiaraco e che il suo primo elemento
si trovi nella locazio ne di m emo ria 3000. Supponere ai1che che il ,p untacdr vPtr sia stato
i11izializzaro in modo da fare rit r,i mento a v[0] : in alt ri termini, che il valore di vPtr sia
3000. La Figura 7.18 .rappresenta co n u11 diagramma propri 0 que~ta sJruazione, u1 tina
n1accl1ina in cui gli interi siano di 4 byre. Osservate che vPtr potr essere inizializuiro, per
far s cli.e punti al vectore v, co n una delle seguenci istruzioni:

vPtr += 2;
prodtirr 3008 (3000 + 2 * 4), supponendo che un intero sia inunagazzinato in 4 byte di
memoria. Nel vettore v, vPtr punterebbe ora all'elem en,co v[2] (Figura 7 .1 9). Nel caso
che un inrero sia immagazzinato in 2 byte di memqria, allora il calcolo precedente avrebbe
w:odouo co me risulraro la locazione di n1emoria 3004 (3000 + 2 * 2). Qualora il vettor
fosse stato di un tipo di dato differen_te, il calcolo precedence avrebbe u1cren1encato il
puntatore di due volte il numero di byte necessari per immagazzinare un oggetto di q uel
ripe di dato. I risulrati dell'aritmetica dei puntatori co1nbaceranno co n gli esiti di queUa
regolare, sol o quando saranno eseguite delle operazio ni sui vetra ri di cara tteri, po ich
o~no di essi lungo un byte.

locazione
3000

3004

v[0]

3008

V[ 1]

3012

v [ 2]

3016

v [3]

v[4)

"

variabile puntatore vPtr

vPtr = v;

vPtr = &v [ 0] ;

Figura 7.19 Il puntatore vPtr dopo un'operazione di aritmetica dei puntatori.

248

CAPITOLO

I .PUNT ATORJ

dato senosciuro: di conseguenza, il con1pilatore non in grado di co11oscere il numero preciso


dei byre cui il puncarore fu riferimento. TI comp ilarore deve dunque conoscere iJ cipo di daro,
pe.r determinare il numero di byre in cui si risolver il riferimenro di uno specifico puntatore.
Nd caso di un puntatore a void, questo numero di byte- non potr essere determinato dal po.

Qualora vPtr fosse staro incrementato a 3016, che punterebbe a v [ 4 ] , !,istruzione

vPtr

-= 4;

av rebbe imposrato vPtr di nuovo a 3000, ovverosia all'in izio del vettore. Q ualora un
puntatore debba essere incrementato o decrern.en taco di uno, potranno essere utilizzati gli
operatori di incremento (++) e di decremenco ( - -). En rrambe le seguenti istruzion i

Errore tipico 7. 8
.Assegnare tJn puntatore di un tipo a uno di t./.n altro tipo qt1alora nessztno dei due sia ttn
void *provocher un errore di sintassi.

++vPtr;
vPtr++;

Enore tipico 7.9

increme11ceranno il puntatore in modo da fargli fare riferi mento alla posizione successiva
del vettore. Entrambe le seguenti istruzioni

- -vPtr ;
vPtr - - ;
decrem entera nno il punrarore in modo da fargli fare riferimento all' elemenro precedence
del vercore.
Le variabili di cipo punta-core possono essere sottratte l' una dall'altra. Per esempio, se
vPtr contenesse la locazione 3000 e v2Ptr contenesse !,indirizzo 3008, l'istruzione

= v2Ptr

- vPtr;

assegnerebbe a x il numero degli elementi dcl vettore compresi era vPtr e v2Ptr, in questo
caso 2. Laritmetica dei puntatori non avrebbe senso q_ualora non foss~ utilizzata con un
vettore. Non possiamo presumere che due variabilj dello stesso cipo siano immagazzinare
in modo contiguo nella memoria, sempre che quelle non siano due elementi adiacenti di
un vettore.

249

Tentare di risolvere il rifetimento di un ptcntat.ore voi d *.


I puntatori porranno essere confrontati uti lizzando gli operatori di uguaglianza e quelli
rlazionali, ma tali co11fronti non avranno significato qualora i pun ratori non facciano
riferimnto a m embri dello stesso vettore. I confronti era puncarori raffrontano gli indirizzi
che vi sono immagazzinaci. Un confronto rra due puntatori che si riferisco no allo stesso
vettore potrebbe moscrare, per esempio, che un puntatore fa riferimento a u n elemento
con un indice di veccore pi alco dj quello puntato dall'altro. Un unlizzo tipico dei confronti
era puntato ri di determ inare se un puntarore sia NULL.

7.8

La relazione tra i puntatori e i vettori

I vettori e i puntatori sono strettamente co.rrclaci in Ce porranno essere urilizzaci in modo


quasi interscambiabile. Il nome di un vettore porrebbe essere considerato com e un puntatore
costan te. I puntarori potranno essere utilizzaci per svolgere qualsiasi operazione che coinvolga gli indici di un vettore.

Errore tipicp 7.5

Obiettivo efficienza 7.3

Utiliu,a.re l't;.ri"tm.etica dei puntatori su un puntatore che non faccia riferirrie1zto a un


vettore di valori.
Errore tipico 7.6

La notazione con gli indici di vettore sar convertita in fase di compilazione irz quella
con i puntatori, perci utilizzare questa notazione con i vettori potr far risparmiare
del tempo in fase di compilazione.

Sottrarre o confrontare due puntatori che non facciano riferimento allo stesso vettore.

Buona abitudine 7.5

Errore tipico 7. 7

Usate la notazione con gli indici di vettore mvce di quella con i puntatori qitando gestite
i vettori. Il programma potr richiedere un tempo /.eggermentepi lungo in fase di compii.azione, ma sar probabilmente pii't chiaro.

Sttperare uno dei due linziti di un vettore quando si utilizz,a l'aritmetica dei pz~ntatori.
Un puncacore potr essere assegnato a un altro puntatore, qualora siano enrrambi dello
stesso ripo. Nel caso che non lo fossero, si porr utilizzare l'operatore di co:nversione per
7
assegnamento nel tipo di quello a. sinistra. reccezione a
dell
destra
a
puntatore
il
convertire
questa regola il puntatore a void (ovverosia void *), perch questo generico e pu rappresentare qualsiasi tipo di puntatore. Un puntatore a void porr esser assegnato a rutti gli altri
ti1)i di pu11tatori questi porranno essere assegnati a un puntatore a void. In entrambi i casi
non sar necessaria alcuna operazione di con.versio11e.

Supponete che il vercore di in teri b [ 5] e la variabile dj tipo puntatore a inceri bPtr


siano gi stari dichiaraci. Dato che il nome del vettore (senza !,indice) un puntatore al suo
pr:mo elemento, potremo imposrare bPtr con !,indi rizzo del primo elemento del vettore b
con l,istruzio,n e:

Non possibile risolvere i1 riferinlenco di un puntatore .a voi d. Per esem.pio, il con1pilarore


4
sa che un puntatore a int punta a quattro byte di memoria, su una macchina con interi
byte, ma un puntatore a void contiene semplicemente una locazione memoria per un tipo di

modo seguente:

ru

ru

l::>Pt r

= b;

Q uesta istruzione equivalente all,indirizzo del primo elemento del vettore rilevato nel

bPt r

&b[0 ];

250

CAPITOLO

I PUNTA1'0RI

Leiemen[o del venore b [ 3] porr anche esser~ pun[a[O usando tespressio11e con puntatore:

*(bPtr + 3)

11 3 nella st1.d detta espressi0 ne I' offiet (lo scosramento) dal pu!11tatore. I.: offset indicher
quale elem ento del vetto re dovr essere pur1cato e coi ncider con il suo indice, qualo ra il
puntatore faccia riferimento all'inizio di ur1 vetto re. La notazione precedente detta
nutazione con ptJ.ntatore e offset. Le parentesi sono ne.cessarie perch la priorit di * maggiore di quella di +. Sen?.a le parencesi, la suddetta espressione avrebbe aggiunco 3 al valore
di *bPtr (i n alrre parole, il 3 sarebbe srato aggiunto a b [ 0] 1 sempre supponendo cl1e bPtr
punti all'i1tizio dd vettore). Lelemenco di un vettore pocr dunque essere puntato co n una
~pressione d i ti~)O punrato re, ma an,che il suo indj rizzo

&b [ 3]

potr essere ottenuto co n I' espressio11e di tipo puntatose

bPtr + 3

Lo stesso vettore porr: essere aattato com e un pur1tato re e utilizzato sfruttando le regole
della relativa ariraneria. Per esempio, anche l'espressione

251

della FigUia 7.21. Enuambe le funzioni co pi eranno una stringa (ovverosia un vettore
d i cararceri) in un altro vettore di ca ratte ri. Dopo aver confrontato i prororipi per
copy1 e copy2 le due funzioni ci sen1bre rann o identich e. lnfattj, eseguiranno lo stesso
compito, ma nonostante l e apparenze, le d ue funz io .n i so no state irnpleme11tare in
manier a differe n te.
La ft1nzione copy1 urilizzer la notazione con gli indici di vettore per copiare la stringa
s2 nd vettore d i caraueri s 1. La furuione dichiarer un contatore, la variabile intera i , che
per utilizzer solo come indice del vettore. L'intera operazione di copia sa r esegwra
cW.l'mtestazion.e della struttura f or: infatti, il suo corpo un'istruzione vuota. .Linrescazion,e specifica cl1e i sar .Zzerata e incrementa ta di uno ad ogni iterazio ne del ciclo. La
Gendizione della struttura for, s1 [i] = s2[1] , eseguir l'o perazione di copia da s2 a s1
un carattere per volta. Nel momento in cui sar staro inco ntrato il carattere nullo di s2,
esso sar assegnato a s 1 e il ciclo rermir1er, poich il valore intero del carattere nullo
zero (falso). Ricordare che il valore di un'istruzion e di assegnamen to quello assegnato
all 'argomento dj sinistra.

/* Usare le notazioni con indici e puntatori per i vettori * /

#-include <stdio. h>

*(b + 3)

main()

panrer ali' elemento b [ 3] del vettore. In generale, tutte le espressio11i co11 gli indici di
vettore potranno essere convertite in quelle con punrarore e offset. In questo caso specifico, abbiamo urilizzato una notazione con p un tatore e offset in cw il nome del vettore
stato utilizzato nella sua veste di puntatore. O sservate che l' istrttzione precedente non m odificher in alcun modo il no1ne del vecrore: b punter ancora a1 suo p rimo elemento.

int i, offset, b[] = {10, 20, 30 , 40};


/ * ta puntare bPtr al vettore
i nt *bPtr = b ;
print f( "Array b printed with : \ n"
'' Array subscript notation\ n'');

I puntatori pocranoo essere usati in combinazio n i con gli indici. esattamente co.me i
vettori. Per esempio, l'espressione

f or (i = 0; i <= 3 ; i++)
prin t f( "b[ %d] = %d\n", i, b[i]};

bPtr[1]
punter all 'elemento b [ 1] del vettore. Questa appunto la notazione con puntatore e indice.
,

printf( "\ nPointer / offset notation where \ n"


'' the poi nter is the array name \ n''};

Ricordate che il nome di un vettore essenzialn1e nte un puntatore costante: esso fa


sempre riferimento all 'i.ruz.io del vettore. Di conseguenz a, l'es1)re_~sione
b

fo r (offset = 0; of fset <= 3; offset++)


pri ntf("*( b + %d) = %d \ n'' , offset, *(b +offs et)} ;

+- 3

non sar vaJida., perch tenter di modificare il valore del nome del vettore con l'aritn1etica
dei puntatori.

printf(''\n Pointe r s ubscript notat ion\n'' );

Errore tip ico 7.10

f or (i = 0; i <: 3; i++)
printf( "bPtr[%d ] = %d\ n" 1 i, bPtr [ i]);

Tentare di modificare il nome di urz vettore con l'aritmetica dei puntatori iJ.n errore
di sin tassi.

printf('' \ nPointer/ offset notat ion\ n'');

Il programma della Figura 7.20 utilizzer. i quattro 1netodi per puntare gli elementi dj
un vettore di cui abbiamo discusso ("con gli indici di verto re,,, "con puntatore e offset"
usando il nome del vettore come puntatore, "con gli illdici di puntato re", "con pun1acore e
offset" usando un puntacore) per visualizzare i quatrro elementi dd vettore d i tnteri b.
Per illustrare u1 reriorn1ente l'interscambiabil it dei vettori e dei puntatori, daremo uno
sguardo alle due funzioni per la co~-,ia di stringhe, copy1 e copy2, incluse nel programma

b */

for (offset = 0 ; offset <= 3; off set++)


printf( "*( bPtr :r %d} = %d\ n", f fset, *(bPt r +

offs~t});

r eturn 0;
}

{continua)

CAPITOLO

Array b printed with:


Array subscript notation

/* copiare una stringa usando la notazione con vettore

b[0] = 10
b(1]
20
b[2)
30
b(3]
40

=
=

main()
{

= 19
= 20;

*'(b + 1)

e la notazione con puntatore */


#include <stdio.h>
void copy1(char *, const char *);
void copy2(char *, const char *);

Pointer/offset notation where


the pointer iJ tbe array name
(b + 0)

char string1[10], *string2 = "Hello


string3[10], string4[] = Good Bye '';
11

11

*(b ... 2) = 30
*(b
+ 3)
~

copy1(string 1, string2);
p rin t f ( " stri ng1 = %s \ n stri ng1 ) ;
11

Pointe~ sub'se~ipt

bPtr[I]

- 10
21

bPtr(2)
bPtr[ 1]

bPtr(3J

....,,

nQtatien

copy2(string3, string4);
printf( "string3 = %s\ n" , string3);
return 0;

'
38

- 48

"

'

/* copia s2 in s1 usando la notazione con vettore * /

Pointer/offset. notation

253

PUNTAT ORI

(bPtr + I) \t
*(bPtr + 11 =ai

* (bPtr +. 2) = 4r

...

void copy1(char *s1, const char *s2)


{

int i;

*( bPtr + , 3) = 4@ ,

far (i = 0; s1 [i] = s2[i]; i++)


;
/* non fare niente nel co rpo */

Figura 7 .20 Usare i quattro metodi di puntamento agli elementi di un vettore.

La funzione c opy2 utilizzer invece i puntatori e la: lo ro ari~~etiea per copiare la


stringa s2 nel vettore cli caratteri s1 . Anche in questo caso l,i11testazione della struttura for
eseguir 1,inrera ope.razione di copia. !.:intestazione non include nessuna inizializzazione di
variabiu. Proprio come aella funzone copy1 , la condizione (* s 1 = * s2) eseguir I, operazione di copia. Dopo aver risolto i dferimenci dei due puntatori, il carattere puntato da s2
sar assegnato all'elemento cui s1 far riferimento. Dopo l'esec11zione dell'assegnamento
nella condizione~ i p11ntatori saranno entrambi incrementati in modo da puntare rispettivamente all'elemento successivo del vettore s1 e al prossimo carattere d ella stringa s2. Nel
momento in cui sar stato incontrato il carattere nullo della stringa s2, questo sar assegnato all'elemento puntato da s1 e il ciclo terminer.

o~rvate che iJ primo argomento di entrambe le funzioni, copy1 e copy2, dovr essere un
vettore sufficientemente grande pr contenere la stri nga del secondo argom~o. ln caso contrario potr verificarsi un errQre, qualora si tentasse di scrivere in una locazione di memoria che
non appartenga al vettore. Osservate anche che il secondo parametro di ognuna delle due
funzioni dichiarato come-const char * (una stringa costante). Questo perch in entrambe
nzioni il seeo.ndo argom"erito sar ricopiato nel primo: i suoi caratteri s:tranno letti uno per
ma non saranrto mai modificati. Per questo motivo, il secondo paramrro stato dichiamodo da puntare~ un valo.re costante, rispettando cosl il principio del min imo privile;suna delle due funzioni ha la necessit di modifica.re il secondo argomento, perci tale
a' non e' stata concessa a nessuna delle d ue.

copia s2 in s 1 usand o la notazione con puntatore */


void copy2(char *s1, const char *s2)
{, *

for ( ; *s1 = *s2; s1++, s2++)

/* non fare niente nel corpo */


}

'

string1 = Hello
string3 = Good Bye

'

Figura 7 .21 Copiare una stringa usando la notazione con vettore e quella con puntatore.

7.9

I vettori di puntatori

I vettori possono contenere anche dei punt~to~i. Un utili~zo tipico per questo genere di s_mit~
tura di dari la formaz.ione d i un vettore di stringhe. Ogru elemento del v~rrore una stringa~
ma in e questa essen'lialmeote un p untatore al suo p,rin10 carattere. 01 co~segue11za, og~
elemento incluso in un vettore di stringhe sar in realt un punratore al prl.Illo carattere di
una stringa. Considerare ora la dichiar~ione di u~ vettore di stringhe suit che possa essere
utilizz.aro per rappresentare un mazzo di carte da gioco:

char suit[4]

= {"Hearts", '' Diamonds", "Clubs " , "Spades "};

254
CArrl'OLo 7

La porzione suit [ 4] della dichiarazione indica un vecrore di 4 d e1nenri. La porzione char


della dichiarazione indica che ogni elemento del vettore suit sar del tipo "punrarore a char".
r q uarrro valori che dovranno essere inseriti nel Vettore sono n Hearts . (Cuoci)' a Diamonds .
(Quadri), clubs (Fiori) e spades (Picche). Ognuno di questi sar immagazzinato in
n1emoria come una stringa di caratteri terminata da un NULL e, proprio per questo, tale
stringa sar lunga un carattere in pi di quelli compresi tra le virgolette. Dunque le quarcro
stringhe saranno lunghe rispettivamente 7, 9, 6 e 7 caratteri. Per quanto le apparenze possano
lasciarvi supporre che queste stringhe saranno sistemate riel vettore suit, in realt in questo
saranno immagazzinati soltanto dei puntatori (figura 7.22). Ogni puntatore pt1nter al primo cararrere della stringa corrjspor1dente. Di conseguenzaJ sebbene l dirpeilSione del verro re
suit sia fissa, que~ro ci permetter di accedere a srringJ1e di qualsiasi lunghezza. Questa
flessibilit solo un esenJpio delle poten.ri possibilit per la strutturazio ne dei dati del linguaggio C.

..
I I
I I .

suit[0]
suit[1J

H'

'e'

'a'

' m'

~+-/---1~1 , e , ,1 ,

,u,

,b ,

..

I I

suit[3]

'r '

' l.. '

;=::::::;

su i t [ 2 J /

,a ,

's'

pI

,a ,

QI

,s ,

'\ 0 '
I

l ai
. l gioco
' .carte da
ddelle
.
. il mazzo
Utilizziamo la n1acr1.ce 4 per 13 deck per rappres~n tare
-. la rtga
deranno ai seilll.
.
(Fim1ra 7.23). Le righe corr1spon
. ialo ia deUe
. era at cuori,
d
. o corrispon
I 3 a1l icche Le colonne corospon eranno u1vece a1 ' r
.
. e
"'O-.
quadri,
al dall 'asso aJ dieci menrre
.
.
eP
la 2 ai r1or1 e a
.
'.
d O 9
. nderanno asper:avamenre a1 v ori
I vetto ri
al faore, alia regina e al re. Dovremo caricare
carte: quelle a a c?rr1spo

.
1no
ll d j LO al 12 corr1spondera1
. . he di caratteri che rappresentano risperrivainente i quattro semi
a
que
con le srr1ng
suitee face
e i udici valori dd le carte.

Cl)

::i

25 5

I pUl\t:rATO Rl

Q)

::i

G.>

5.~

o F

-G.>

dI

eI

.~

Cu.o ri 0
Quadri 1
Fiori 2
Picche 3

10

12

11

' \0'

, \0 ,
rappresenta il Re diFiori

deck [ 2 ] [ 121
I

o z o

V')

o
t:

I \

/'
Fiori

0I

Figura 7.22 Un esempio grafico della matrice sui t .


Avremmo potuto inserire i semi delle carte in ur1a matrice, sistemando .in ognuna
delle rigl\e un seme e in ogn i colonna le singole lettere dei loro nomi. Una rale stru ttura
di d.ati, per, avrebbe dovuto aveJe un numero fisso di colonne pari alla lunghezza
della stri11ga pi lunga. Ne conseguirebbe uno spreco di memoria causato dagli elementi che contengono le stringhe pi corre: uno spreco che diventerebbe moJco pi
co nsistente, qualora in1magazzina;simo un gran numero di stringhe e molt di queste
fossero pi corte di quella pi lunga. N eJla prossima sezione utilizzeremo i vettori di
stringhe per rappresentare un mazzo di carte.

7. IO Studio di un caso: simulazione di un mescolatore


e distributore di carte
In questa sezione, utilizzeremo La generazione dei numeri casuali per sviluppare un programma che simuli un mescol'atore e distributore di carte da gioco. In seguito, questo
programma porr essere utilizzato per svilupparne altri che implementino dei giocl1i di
carte specifici. Per evidenzi4re ale11ni impercettibili problemj di efficienza, abbiamo utilizzato inre.nzionalmenre d~gli algoritmi di n1escolamento e distribuzione non otrin1izzari.
N egli esercizi e nel Capitolo 10, svilupperemo degli algoritmi pi efficierui.

'

Re

utr
I izzata per il. mazzo di carte.
Figura 7 .23 Rappresentazione de11 a matrice

.. .

10
. gue. La( .matrice
. h.Lato cc>me se
e un
3) sara
. d Odeck
li mazzo di carte simulato porr essere 1rusc
.
.
. saranno scelte- a caso una row riga a a
. I
. .
primo lu(oglo az.zedrat~. . ~2s)eg~~',elemenro della matrice deck [ row] [ column 1 sar. inser1arta che sar distribuita dal mazzo
.
. . l
.
column co onna a a
52 in posizioni
.2 3
to il nwnero 1, per indicare che questa ~ar . .a prlIDadc.
11
e con l'1nser1n1ento ei numcr1 '
ale carra sar sistemata nel mazzo mesco. di
mescolato. processo conc1nu r
della matrice deck scelte a ~o, per LDd ~e q~.aa mano che la matrice deck comincer
.
crnquanta ues1m-a.
nda terza
I
i robabile !,estrazione di una carta gi se 1ez1on ara
' ...
a~ com.e ~eco. '
enere di selezioni dovr semplicemente
a riemp1rs1, d1 ve nrer s_err1p re p P) Q
(deck [ row] [ column 1 diversa da z:ro l. uestlo g ali di row e column finch non sar
52
,
. dovranno esegUlfe a tre sce te casu
.
ra selezionata Alla fn e i nu1neri da 1 a
. .,
esser~ ignorato e s1
carcall chde l~on s1~ g1~~~ . Solo a q_ues~o punto il mazzo di carte sar
stata ritrovata una
occuperanno le S2 case e e a marr1ce
. .
Stato mescolato completamence.
1

d . mescoJamenro potrebbe girare all' ir1fnito, qualora la selezione


.
.
Questo .algor1ano r 1 orre d.dJ e carte ehe s;,, ..,o gi state inserite tra quelle mescolare.
U1.LJ

di mescolan1ento m1g iore e e e in11ner

Utilizzando l approccio top-down per raffinamenti successivi , svilupperemo un programma cl1e 111.escolerl e distribuir un mazzo di 52 carte da gioco. L'approccio top-down
particolarmente utile quando si affrontano problemi pi corposi e complessi di quelli che
abbiamo affrontato nei capitoli precedenti.

Obiettivo efficienza 7.4


A volte un at orit:rno che venga in mente in modo 'pontane~"potre~be co~tenere degl~

"b .,~

11.n. diffiri1'nento indefinito. Ricercate degli


come
. blemi di. efficienza
.
.
.
t t p 10
tmpercettz
algoritmi che evitino il differimento indefinito.

256
up1r0 Lo

257

Per d istribuire la prima carta, dovremo rit rovare all'interno della matrice l'elemen to
che soddisfi la condizione deck [ row] [ column] = 1. La ricerca sar eseguita con una
srru~rura for nidificara che varier row da O a 3 e column da O a 12. A quaJe carra
corr1sponde'. que~a casella della matrice? Il vettore su i t sar stato precaricaro con i
quartro senu, perc10 per ottenere quello deUa carta appena individuata visualizzeremo la
stringa di car~tteri ~ui t [ ro~] . [n m odo si mile, per onei1ere il valore d i quella carta stam pere.mo . la srrm~a di caratteri f a~e [ column J. Stamperemo anche la m inga di caratteri 11
of (di), combmandol appropriatamente con le altre informazioni in modo da visua.Llzzare
ogni carra n ella fo rma King of Clubs (Re di Fiori), 11 Ace of Diamonds (Asso d i
Q uadri) e cos via.

Scegliere a caso 1-1na casella del mazzo di carte


Inserire ii nu1nero di estrazione nella casella del mazzo di carte scelta
"Trovare il ntimero dj estrazione n ella matrice dd mazzo di carte e visualizzare il valore e il
seme della carta" potr essere espanso come segue:

Per ogni casella della matrice del m~ di carte


Se la casella contiene ii numero di estrazione
Visualizvire il valore e il seme della carta
lpcqrporando queste espansio ni otterremo il nostro terzo passo d i raffi.n amen co:

Inizializzare il vettore dei semi


Inizializzare il vettore dei 1;alori
Inizializzare la matrice del mazzo di carte

Procediamo ora con il processo top-down per raffinamen ti successivi. U top sar sern p licem en ce

Mischiare e distribuire 52 carte

Per ognuna delle 52 carte

Il nostro primo raffinamnto produrr:

Scegliere a caso una casella dei mazzo di carte


Finch la casella del mozzo di carte ~ gi stata scelta in precedenuz
Scegliere a caso una casel/,a del ma~ di carte
Inserire il numero di estrazione nella casella del mazz,o di carte scelta

Inizializzare il Vettore dei semi


Inizializzare il vettore dei valori
Inizializzare la matrice dei mazzo di carte
Mischiare il mazzo di carte
Distribuire Le 52 carte

Per ugnt'na delle 52 carte


Pe,. ogni casel/,a della matrice del mazzo di carte
Se la casel/,a contiene il numero di estrazione
Visualizzare ii valore e il seme del/,a carta
E con questo passo avremo completato il processo di raffinam ento. Osservate che

"Mischiare il mazzo di carte,, potr essere espanso com e segue:

Per ognuna dei/e 52 car.te


Inserire il numero 4i estrazione in una casella libera del m.4ZZIJ di carte scelta a caso

questo programma potrebbe essere pi efficien te, qualora le po.nioni.delJ 'aJgorirm~ c~e si
ottupano del mescolamento e della distribuzione fossero co.mb1nate, in modo da d1str1buire le cane nello st esso m.o mento in cui sarann state sistemare nel mazzo. Abbiamo sclto
di implem entare separatamente queste operazioni perch le carte norm alm ente sono distrihite dopo essere state mescolate (non m~tre si m scolano).

"D istribuire le 52 can e" po tr essere espanso come segue:

Per ognuna delle 52 carte


Trovare ii numero di estrazione nella matrice dei mazzo di carte e visualizzare il valore
e ii seme def/,a carta

U programma di mescolamento e distribuzione delle cane mostrato della Figura 7.24


mentre nella Figura 7.25 sraro riportato un esempio di esecuzione. Osserv~te l'u~jzzo dell~
specifca di conversione 5'ss ndl'invocaz.ione di printf per visualim re le smnghe di caratten .
Largomento corrispondente a quella specifica nella chiamata di pri ntf dovr essere un puntatore
a char (o un vettore char). N d la funzione dea!, la specifica di formato %5s of %-Bs
vis11alizzer una stringa all ineata a destra in un campo di cinque caratteri seguita da Of e da
una srringa all ineata a sinistra in un campo di ono caratteri. Il segno meno in %-8s sign ifica che

Incorporando le suddette espansi" ni Otterrem o il nostro secon do passo di raffinamen to


co mpleto:

Inizializzare il vettore dei semi


lniziafizza,re il vettore dei valori
Inizializzare la matrice del mazzo di carte
Per ognuna delle 52 carte
inserire ii numero di estrazione in untt casel/,a liberti del mazz di carte scelta 11 caso

la sa:inga sar alli neata a sinistra in un ca mpo di lwigbexza 8.


/ * Programma per la distribuzione del le carte da gioco */

.Per ognuna delle 52 carte


Trovare ii numr.o di estrazione nella matrice del mazzo di carte e visualizzare il valore
.
e il seme della carta
"Inserire il n um ero di estraziGne in u11a casella libera del m azzo di carre scelta a caso,.
.
potra' essere espansa lll:

Scegliere a cas una case!/,a dei mazzo di carte


Finch la casella de.I mazzo di carte gi stata scelta in precedenuz

#inc l ude <stdio . h>


#include <stdlib . h>
#include <time . h>
I

void shuffle (int [][13)) ;


void deal(const i nt []( 13] , const char *l] , const char *[ ) ) ;
(conti.nU4)

CAJ'l'fOLO

25 8

I PU NTAT Oll l

Ace of Spades
Ace of Hearts
Queen of Clubs
Ten of tie-arts
Ten ot Spades
Ten of Di~monds
Four of Diamonds
Six of ' Diamonds
Eight Qf Hearts
Nine of Hearts
Deuo.e- of Spades
Five Of Clubs
Deuce of Dia_monds
Fi ve of Spa.des
Ki.ng of Diamonds
neuce of Hearts
Ace of Clubs
Three of Clubs
Nine of Clubs
Four of Hearts
Ei.ght of Diamon~s
Ja ok of Diamonds
Five of Httarts
Four of Olubs
Ja ck of Clubs

main()
{

;
"}
s
de
pa
"S
",
bs
lu
"C
,
"
ds
on
iam
"D
,
"
rts
ea
"H
ch ar *s ui t[4 ] = {
1 ,
10 ,
11 F ur 1
1
11
e
re
h
T
t1
,
'
e
e
0
u
e
o
c ha r *f a ce [ 13 ] = { Ace " , "
"Seven " , "Eig.h t ",
"Five ", "S ix
11
1
"King "};
,
een
Qu
'
,
''
ck
"Ja
,

en
"T
"Nine ",
in t de ck [4 ][1 3] = {0 };
11

srand(time(NULL));
sh ut tle (d ec k) ;
dea l (d ec k, fa ce , su it) ;
re tu rn 0;
}

vo id sh uf fl e( in t wDec k[ ][ 13 ])
{

in t ca rd , row, column;
f0 r( ca rd = 1; ca rd <= 52; card++) {
row = rand(} % 4;
co lumn = rand(} % 13;
whi le (wDeck[row][colum n]
row = ra nd () % 4;
co lumn = ra nd () % 13 ;

I= 0)

259

Diamonds
Qf Oiamonds
of Hearts
Of Clubs
Thnee of Spa~es
Four of Spades
Ten of Clubs

Ace -0f
aueen
Seven
Oeuce

Si x pf

Spa~es

Thr-ee of Diamonds
Th ree of Hearts
Six ef Hearts
Ei g.h t of Clubs
Ei gh t of Spades
King of Clubs
Ja ck of Spades
Que-en of Hearts
King of Spades
Kiing Of He ar ts
Nine of Spa-des
Qlleen ~'f Spaaes
Ni ne of Diamon(fs
Seven of Clubs
Five of >iamonds
Ja ck .e f Ha ar ts
Se\ien of Spades

rte da gioco.
ca
lle
de
e
ion
uz
trib
dis
la
r
pe
a
mm
gra
pro
l
de
e
ion
uz
ec
es
Fi gu ra 7 .2 5 Esempio di
pi
r
fo
e
ur
utt
str
e
du
Le
.
ne
zio
bu
tri
dis
di
o
rrn
ori
alg
o
str
C' un pu nt o de bole ne l no
an
qu
e
ch
an
,
ck
de
di
nr.i
me
ele
gli
tra
a
nz
de
on
sp
rri
co
in ter ne co nti nu era nn o a cercare un a
to dif ett o
es
qu
mo
ere
gg
rre
Co
.
ivo
tat
ten
0
n1
pri
al
ri
ga
ma
e
ra
do quella sa r gi stara trova
O.
negli ese rcizj e nello stu dio d i un caso de l Ca pit olo l

ce[],
Fa
*w
ar
ch
t
ns
co
,
J
13
](
[
k
ec
D
w
t
in
st
on
(c
al
de
id
vo
c ns t ch ar *w Su it[ ])

7. I I I pu nt at or i a funzioni

wOeC'k[row][column] =c ar d;
}

(j ab bia olo
pit
Ca
l
Ne
.
ria
mo
me
di
o
zz
iri
ind
o
su
il
e
ien
nt
Un pu nta ro r a un a fu nz ion e co
nme
ele
o
im
pr
o
su
l
de
ria
mo
me
di
zo
iriz
nd
l'i,
lt
rea
in
mo vis to ch e il non1e di un ve tto re
qu ale
daJ
ria
mo
me
di
o
izz
dir
l'in
lt
rea
in

e
ion
nz
fu
a
un
di
to. In mo do sim ile, il 11o me
po tr
ri
ato
nt
pu
di
o
tip
ro
es
Qu
e.
ion
nz
fi1
lla
de
ito
mp
co
inizia iJ co dic e ch e eseguir il
ri
al.c
ad
ato
gn
se
as
e
i
r.
tro
ve
in
to
ina
zz
ga
ma
im
,
i
essere pa ssa t e res tit uit o da lle fu nz ion
pu nta tor i a fu nz ion i.
a
mm
ra
og
pr
il
o
ac:
fc
di
mo
o
am
bj
ab
i
ion
nz
fu
a
ri
to
Pe r mo str ar l' ut iliz zo de i pu nt
a
ell
d
o
ell
qu
e
tar
en
em
pl
im
a
d
do
mo
in
,
15
7.
ra
pe r l'o rd in am en to a bo lle de lla F igu
bu bb le ,
ni
zio
n
fu
lle
da
e
in
ma
n
u
da
co
ma
for

a
mm
ra
og
Fi gu ra 7 .26 . Il no srr o nu ov o pr
en to
om
rg
a
me
co
er
ev
ric
rt
So
le
bb
bu
e
ion
nz
fu
L-a
swap , as ce nd ing e de sc en din g.
re di int e ri
tto
ve
un
e
ch
tre
ol
g,
din
en
sc
de
o
ing
nd
ce
as
e,
un pu n tat or e a un a fu nz ion
de bb a
re
no
ve
il
se
re
lie
eg
sc
di
te
en
ut
l'
al
er
ied
ch
rj
a
mm
e la su a dim en sio ne . U pr og ra
tta 1, alla fu nme
im
te
en
ut
J'
ra
alo
Qu
te.
en
nd
ce
dis
o
e
nt
de
en
asc
essere or di na to in mo do

i nt ca rd , row, colum n;
fa r (c ar d = 1; ca rd <=

52 ;

card++)

fa r ( r ow = 0; r ow <= 3; row++)
fo r (co lumn = 0; co lumn <= 12 ; co lumn++)
if (wDeck[row][co lu mn] == ca rd )
pr in tf ("%Ss of %- 8s%c " ,
wFac e[ co l umn], wS ui t[r ow ],
ca rd % 2 == 0 ? \ n : , \ t ' ) i
}

.
co
gio
da
rte
ca
lle
de
e
ion
uz
trib
dis
la
r
pe
ma
ram
og
Pr
Figura 7.24

260

CAPITOLO

essere ordinaco in modo ascendence o discendenre. Qualora l' urenc immecca 1, alla
funzione bubble sar passato un puntatore ad ascending , determinando cos l'ordi namento ascendente deJ vecrore. Qualora l'ucence immetta 2, alla funzione bubble sar
passato un puntatore a descending, determinando cosl l'ordinamento discendente del

void swap (int * 1 int *);

f or ( pass = 1 ; pass <=

vetcore. L'oucpuc del proiramma mostrato 11ella Figura 7.27.

va id bubble ( int 1 canst int, int ( *) ( int 1


i r:i t ase end in g ( eon s t in t , cons t in t ) ;
int descending(canst int, canst int);

1 1 pass++)

if ((*compare}(work[co unt] 1 work[count +


swap(&work[count], &work[count + 1]);

1)))

1
void swap(int *element1Ptr 1 int *element2Ptr)

int}} ;

int temp;
temp = *element1Ptr;
*element1Ptr = *element2Ptr;
*e1ement2Ptr = temp;

main(}
{

int a[SIZE] = {2, 6, 4, 8, 10, 12, 89, 68, 45, 37};


int counter, arder;

int ascending( const int a, const int b}

printf( dEnter 1 to sort in ascending order, \ n"};


printf( "Enter 2 to sort in descending arder: "};
scanf( "%d" , &arder);
printf( ~\ nData

51. ze

far (count = 0; count <= size - 2; count++ )

/ * Programma di ordinamento polivalente che utilizza dei puntatori a


funzioni I

#include <stdio. h>


#def ine SIZE 10

26 1

J PUNTATORI

return

< a;

itms in origina! order\n'l};

int descending(canst int a, const int b)

far (co unter = 0; caunter <= SIZE - 1 ; caunter++)


printf ( li%4d" J a[counter]);

if (.arder== 1) {

Figura 7 .26 Programma di ordinamento polivalente che utilizza dei puntatori a funzioni.

return b

far (countr = 0; counter <= SIZE - 1; caunter++)


printf( N%4d ", a[counter]);
printf( "\ n");
return 0;
}

void bubble(int *work, canst int size, int (*compare}(intJ int))


{

a;

bubble(a, SIZE, ascending);


printf(''\ nData items in ascending arder \ n'' );

,
}
else {
bubble(a, SIZE, descending);
printf( "\ nOata items in descending order \ nM};

>

Enter 1 to sort in ascending order,


Enter 2 to sort in descending arder: 1

Data items in origina! order


8 10 12 89 68 45 37
4
_
Data items in ascending arder
8 10 12 37 45 68 89
6
4
2
2

I
I

Enter 1 to sort in ascending order l


Enter 2 to sort in dscending o~der: 2
Data iteins in origina! o~dgr
8 10 12 ' 89
4
2
6

88

45

37

Data items in desoendi.ng Or"de f'


89

68

45

37

12

10

int pass, count;


Figura 7.27 Gli output del programma di ordinamento a bolle della Figura 7.26.

262

CAr>Jl' OLO

NeU,intestazione della funzion e bubble appare il seguente paramerro:

int ( *compare) (int, int)

263

I PUN1"A"f01?.l

La dichiarazione va lerra cominciando dall'insieme di parentesi pi a sinisrra, "f una


matrice di 3 pu11rarori a funzioni che riceveranno co111e argomento t1n int e che restituiranno voi d 11vettore sraro inizializzato con i nomi delle rre funzioni. 11 valore, con1preso tra O e 2, che l'ul:enre imn1errer sar urilizzaro come indice per il vetto re di puntatori a
fi1nz.ioni. 'Linvocazione della fw12ione sar quindi efferruata nel modo segue11re:
11

Questo avverte bubble che ricever come pararnerro un puntatore a una funzione che
accetta due argomenti inreri e che resruisce un risultato dello stesso tipo. Le paren tesi
intorno a compare sono necci>sarie perch * ha una priorir inferiore a quella delle parentesj che racchiudono i parameui della funzio ne. Se non avessimo incluso le parentesi, la
dichiarazione sarebbe diventata

i nt *compare ( int, int )


che avrebbe dichiarato una. funzione che riceve dLLe pararnerri i11reri e restituisce un puntatore
dello stesso ti po.
U parametro corrispondente nel prototipo della ft.1nzione bubble

i nt

(*)

(int, int)

Osservare che sono sra inclusi soltanto i pi, ma il progra1n1narore .porr indudere per
scopi documenravi dei nomi di paran1erro e di funzione che il compilatore ignorer.
La funzione passata a bubble sar invocata all'interno di un'istruzione i f come segue

( *f ( c h oi c e ] ) ( e h oi e e ) ;

In quesra chiamata, f ( c hoice] selezioner il punrarore immagazzi nato nella posizione


choi ce del vertore. Una volta risolto il riferimento del puntatore, la funzione sar invocata
e choice gli sar fornico coJ11c argo mento. Ogni funzion e visualizzer iI valore dell'argomento ricevuto e iJ proprio noJne di fu.o.zio:n.e pex indicare che sar stata richiamata correttttOJ~L1te. Negu esercizi svilupperete un sisterna guldaro da 1nc11u.

/ * Dimostrazione di ut ilizzo di un vettore di puntatori a funzioni * /


~include <stdio.h>
void function1(int);
void fun ction2(int);
void function3(int ) ;

if ((*compare)(work[c ount], work[count + 1] ))

main ( )

Occorre risolvere il riferimento di un puntatore a una funzio11e per invocarla, proprio


come necessario risolvere il riferimento di un punrarore a una va ri~b i le per accedere al
suo contenuto.

void (*f[3])(int) - {function1, function2, function3};


int choice;

printf( "Ente r a num ber between 0 and 2, 3 to end : ") ;


scanf (~% d" , &ch oice) ;

Avremn10 potuto inv.o_tare la funzione senza risolvere il riferimenro del puntatore,


come nell'istruzione

if fcompare(work[coun t] ,

wor~[count

+ 1]))

while (choice >= 0 && choice < 3} {


(*f[choice])(choic e);
printf( ' Ent er a number between 0 and 2, 3 to end : '' );
scanf('' %d'', &choice);

che utilizzerebbe dirttainenre il punrarore in sostituzione dd nome della funzione. Abbian10


per preferito il primo met-odo di invocazione, perch mostra in modo esplicito che compare
un puntatore di cui stato risolto' iJ riferimento per richiamare la fi1nzione. Nel secondo
metodo di invocazione il puntatore compare sembra essere invece il nome di una funzione.
Ovviamente, ci porrebbe creare confusione in un utente che desiderasse dare uno sguardo alla
definizione della funzione compare e scoprisse che non mai stata definita nel file.
I p untatori a funzioni sono utiliz-zati tipicamente nei cosiddetti sistemi guidaci da
menu. In questi sistem i si richiede all'urente di selezionare un'opzione d.a un menu (per
esempio, da 1 a 5). Ogni pzione sar servita da una ft1nzione differente. I puntatori che
fanno riferimento a ognuna di quelle funzioni sono immagazzit1ati in un verrore di puntatori
a funzione. La scelta dell'urente sar utilizzata come indice del vettore per rilevare il puntatore
che sar utilizzato per invocare la funzione.

printf ("You entered 3 t o end \ n");


return 0;
}

void fun cti on1 (int a)

{
p ri ntf( ~ You

entered %d s o function1 was called \ n\ n'' , a);

Il progra1nma della Figw:a 7.28 fornisce t1n esempio generico dei meccariismi per la
di.cl1iarazione e l'utiUzzo di un vettore di pur1 tatori a funzioni. Son9 state definire rre funziot1i, function1 , function2 e function3, ognuna delle quali ricever w,1 argornento
inrero e non restituir alcun valore. I puntatori cl1e fanno riferimento a queste ue funzionj
sono srati immagazzinati nel vettore f , dichiarato con1e segue:

void function 2(nt b)

void (*f[3]) (int) = {function1 , function2 , function3 };

void fun ction3 (int c)

printf( '' You entered %d so fun ctio h2 was called \ n\ nq, b) ;


}

(cor1tini1a}

264

C APffOLO

265

}PUNTATORI

e) Visualizzare gu elementi dcl vecrore numbers urilizzando la notazione con puntatore e


offset usando nPtr come puntatore.
f) Visualizzate gli demenci d~ vettore numbers urilimndo la notazione con puntatore e
offset usando il nome dcl vettore come puntatore.
g) Visualjzzate gli elen1enci del vettore numbers uciliz'la ndo gli indici applicati al puntatore
nptr.
h) Puncace all'demenco 4 del vettore numbers, ucilizZ<"lndo la nocazione con gli indici di
vectore, queUa con punrarore e offset usando il nome del vectore come puntatore, quella
con gli indici applicaci al puntatore nPtr, e la notazione con puntatore e offser usando

printf( '' You entered %d so function3 was called \ n\ n" , e);


}

Enter a number between 0 and 2, 3 to end: 0


You entered 0 so function1 was called
Enter a number batween 0 and 2, 3 to end: 1
You entered 1 so f unction2 was called

nPtr.
i) Supponel1do che nPt r faccia riferim.e nto all'.iillzio del vecror~ num~e rs, quale in~irizz~
sarebbe puntaro da nPtr + 8? Quale valore sarebbe immagazzinato 111 quella locazione d1
m.emor1.a.
j) Supponendo e.be nPtr faccia riferimenro a numbers [ 5] , quale indirizzo sarebbe puntaco
da nPtr -= 4? Quale sarebbe il val.ore iaJmagazzinato in quella locazione di n1emoria?

Enter a number betw.~~n 0 and 2, 3 to end: 2


You entered 2 sa function3"Was Galled

a number ~etwee~ 0 and 2, 3 to end: 3


You entePed 3 to end
~nter

Per ognuna ddle seguenti accivit scrivete una singola isrruz.ione che esegua il compito indicaro. Sup ponete che siano gi stare dichiarare le variabili in virgola mobile number1 e number2 e che
number1 sia stata inizializzata a 7 ,3.
a) Dichiarare la variabile f Ptr come puntatore a un oggetto di tipo f loat.
b) Assegnare l'indjrizzo della variabile number1 alla variabile di tipo puntatore f Ptr.
c) Visua lizzate iJ valore dell'oggetto puncaco da f Ptr.
d) Assegnare alla variabile number2 il valore ddl'oggerro puntato da f Ptr.
e) Visualizzare il valore di number2.
f) Visual izzare l'indiriz1,o di number1 . Utilizzate la specifica di conversione %p.
g) Visualizzare l'indirizzo immagazzinato in f Ptr. Uciliizace la specifica di conversione %p. 11
valore visualizzato identico a quello deU'indil:izzo dj number1 ?

7 .4
Figura 7 .28 Dimostrazione di utilizzo di un vettore di puntatori a funzioni.

Esercizi di autovalutazion e
7.1

Rispondete a ognuna delle seguenri domande:


a) Un .punratore ~ una variabile che contiene come suo valore !'_____ di un'altra
variabile.
b) I rre valori che porranno essere utilizzaci per inizial izzare un puncarore sooo _ ____,
- - -- - o - - -- -
.
e) I:'unico intero che possa essere assegnato a un puntatore

7 .2 . De~ermiJ1are se le segu~ci affermazioni siano ve.re o false. Qualora la risposta sia faJsa, spiegatene 11 motivo.
a) l:o~e.r~~or~ ~ indirizzo & pu.essere. applicar~ soltan~o alJ.e coscanti, alle espressioni e alle
variabili dich1~Te con la -Specifica dJ classe di memoria register.
b) Il riferimento cli a.n puncaror~ che sia stato dichiarato void pu essere risolto.
e) I puntatori di Tipo differencJ non possono essere assegnati gli uni agli alai senza un' operazione cli conversione.
Rispondete a ognun~ delle segue.nei domande. Supponete che i numeri in vi rgola mobile con
7.3
precision~ sing~la siano '.mmagazzinaci in 4 byte e che l'indirizzo di partenza per il verrore corrisponda
3!1a loc:iz1?ne di memona 1002500. Ogni parte ddl'esercizio, Jaddove appropriato, dovr utilizzare i
risultaci di qudle precedenti.
a) Dichiarare il vettore di cipo f loat chi amaro numbers contenente 10 dementi e inizializzateli
con i valori 0, 0 , 1, 1, 2, 2, ... 9, 9. Suppo11ece che la cosrante simOolic.a SIZE sia sTara
deflnita con il resto cli soscituzione 10.
b) Dichiarate un puntatore nPtr che faccia riferimento a un oggetto cli cip float.
c) VisuaUzzat~ .gli elementi del vectorc numbers utilizzando la notazione con gli indici di
verrore: U~il1zz.are ,~na s~ut:tura fo.r e supponete chela variabile di controllo intera i sia gi
scaca dichiarata. V1sual1zzate og111 nun1ero con l posizione di precisione a destra della
virgola decimale.
d) Fornire due istnizini distinte che assegnino all a variabile di cipo puntatore nPtr l'indirizzo di partenza del vettore numbers.

7.5

.
Esc;gu.ice ognuna delle seguenri attivic..
a) Sccivete l'intescazione di una funzi'one chiamata exchange che riceva come paramecr1 due
puntatori aj numeri in virgola mobile x I,! y e non restituisca alcun valore.
b) Scrivere il protori po per la funzione d.ella parre (a).
e) Scrivete l'intestazione di una funzione chiamata evaluate che resciruisca un incero e che
ciceva co me argomen.ci llintero x e un pW1ta-core alla funzione poly. La funzio ne poly
ricever un paran1ecro intero e restituir un incero.
d) Scrivere il prococipo per la funzion~ della parre (c).

7.6

Trovare l'errore in ognuno dei seguenti segmenti di programma. Supponece che


int *zPtr; /* zPtr punter al vettore z *I
int *aptr = NULL ;
void sPtr = NULL;
int number, i;
int ~[5] = {1, 2 1 3 1 4, 5};
sPtr = z;

a) ++-z:Pt r;
b) / "' usa un puntatore per ottenere i l primo valore del vett ore * I
number =zPtrj

e) / * assegna a number l ' elemento 2 del vttore (il valore 3 ) * /


number = zptr[2] i

266

CA PIT OL O

J PUNTATORI

26 7

vo id ex ch an ge (fl oa t *x 1 flo at *Y)


vo id ex ch an ge (fl oa t *, flo at *);
in t ev alu ate (in t x, in t (* po ly) (in t))
in t ev alu ate (in t, in t (* )(i nt ));

b)

Risposte agli esercizi di au to va lu ta zi on e


7.1
7.2

7.3

a) indirizw. b) 0. NULL, tu1 indirizzo. e) 0.

d)

ert:
ess

pu
n
no
e
ili
:iab
vru
alle
ro
Ean
sol
to
lica
app
ere
e$S
pu
zo
a) Falso. Voperaro.re di iridiriz
r.
applicato a quelle dichjarare con la classe di me mo ria r eg ist e
cli
do
mo
c'
n
Jlo
ch
per
,
lto
riso
ere
ess
pu
n
no
id
vo
a
e
tor
nta
pu
b) Falso. Il riferimenro di un
sape.re esarramence a quanri bycc di memorja si debba pu nta re.
ea
ore
rac
pun
di
i
tip
i
ala
gli
ci
cuc
i
1ac
egr
as
ere
ess
o
nn
tra
po
id
e) Falso. A un pu nta tor e vo
questi pdtr essere assegnato quello di tipo vo id.
, 6.8, 9.9 };
a) flo at numbers[SIZEJ = {0.0, 1.1 , 2.2 1 3.3 , 4.4 , 5.5 , 6.6 , 7.7
b) f loa t *n Ptr ;
c) fo r (i = 0; i <= SIZE; - 1; i++ )
pri ntf ( "%. 1f " 1 numbers[i]);

d) nP tr = numbers;
nptr = &numbers[0J;

e) fo r (i = 0; i <= SIZ E - 1; i++ )


pri ntf ( "%. 1f ", *(n ptr +i ));
f) fo r (i = 0; i<= SIZ E - 1; i++ )
pri ntf ( 1'%. 1f ", * (numbers + i)) ;

g) fo r (i= 0; i< = SIZE - 1; i++ )


pri ntf ( "%. 1f , np tr( i]) i

h) nu mb ers (4]
*(numbers + 4)
nPtr[4]
* (nPtr + 4)

i)
j)

7.4

c)

Cindirizzo 10 02 50 0 + 8 4 = 10 02 53 2. Il valore 8 , 8.
Cindi rizzo di numbers [ 5 J 10 02 50 0 + 5 * 4 = 10 02 52 0.
L'indirizzo di nP tr -= 4 10 02 52 0 - 4 * 4 = 1002504 .
il valore in queUa locazione 1 , 1.

a) flo at *fP tr;


b) fP tr == &number1;
e) pri ntf ("T he va lue of *f Pt r is %f \n" , *f Pt r);
d) number2 = *f Pt r;
e) pr in tf ( "The va lue of number2 is %f \n" , number2);
f) pri ntf (''T he ad dre ss of number1 is %p\n~, &number1);
g) pr in tf( "The ad dre ss sto red in fP tr is %p\n" , fP tr) ;
S. il valore lo sresso.

e)

f)

Errore: zP tr no n staco inizializzato.


Correzione: inizializzare zP tr con zP tr = Zj
Err ore: il riferimento deJ pu nta tor e non sc:aco risolc:o.
Correzione: cambiate l' istruzione i11 numbe r = *z Pt r j
lvere.
riso
da
ro
1en
crin
1if
sun
nes
c'
n
no
i
ind
qu
e
e
tor
nta
pu
n
u

Errore: zP tr[ 2] non


Correzio ne: cambiare *z Ptr [2] in zP tr[ 2] .
ai limici del
o
rn
csr
nto
me
ele
un
a
nro
me
eri
cif
fa
si
e
tor
nta
pu
del
ce
Errore: con l'i ndi
vecror.
utt ura fa r.
str
la
nel
llo
tro
con
di
le
i
iab
var
la
del
Je
fma
ore
val
il
4
in
re
bia
Correzione: cam
i d.
Errore: tentativo di riso lve re iJ riferimento di un ptlllcacorc a vo
ere converriro
ess
ma
pri
r
dov
sto
que
e
tor
nta
pu
del
o
enc
rjn1
rife
il
re
lve
riso
Co rrezio ne: per
t *) sP tr;
in
*(
=
r
e
mb
nu
in
e
on
uzi
istr
ta
der
sud
la
e
iar
mb
Ca
.
eri
int
a
in un puntacore
pu nta tori.
dei
a,
erjc
im1
l'ar
con
e
tor
ver
un
di
e
nom
iJ
re
ica
dif
mo
di
ivo
Error: tenrac
perazione
l'o
re
gui
ese
per
e
ror
''er
del
me
no
del
ece
inv
ore
rac
pun
un
a.re
Correzione: utilizz
vecrore per fare
deJ
me
no
il
con
ici
ind
gli
ate
lizz
uti
re
pu
op
,
ori
rac
pun
dei
di arirn1erica
riferim ent<') a un elemento specifico.

Esercizi
Rispond ere a ognun deJJe seguenti domande:
gazzinaro il suo
ma
im

cui
in
ria
mo
me
di
one
azj
loc
la
e
isc
riru
res
a) ~operacore
operando.
prio operando.
pro
dal
to
nta
pu
to
get
'og
l
del
ore
val
il
e
isc
titu
res
b) ~opcrarore
zione una variabile che
fun
a
un
a
si
pas
si
a
lor
qua
o,
enr
rim
rifc
per
ata
am
chi
a
un
re
ula
e) Per sim
della variabile.
I'
ne
zio
fun
alla
e
sar
pas
ario
ess
nec

sar
e,
tor
vec
un
no n sia
.
rivo
mo
il
e
cen
ega
spi
e
fals
no
sia
ra
alo
Qu
e.
fals
o
e
ver
no
sia
i
.ion
1az
Derermi.nare se le seguenti a.ffem
7 .8
vettori distinti.
a
o
enc
rin1
rife
no
cia
.fuc
e
eh.
ori
r:ar
pun
e
du
re
nra
fTo
con
so
sen
a) No n ha
i
tor
vet
dei
mi
no
i
,
nto
mc
eJe
mo
pri
suo
al
ore
car
pun
un

e
b) Poich il nome di un veccor
possono essere manipolaci ncllo sresso modo dei puntatori.
agazinim
no
sia
no
seg
za
sen
eri
inc
gli
che
ece
pt)n
Sup
de.
ian
don
ici
ucr
seg
Rispondere a ognw1adelle
7.9
memoria 100 25 00 .
di
one
ai.i
loc
alla
sia
e
ror
ver
il
per
za
ten
par
di
o
izz
dir
!,in
che
e
e
zinaci in 2 byt
nti e
n1e
ele
5
e
ent
ren
con
s
lue
va
ato
am
chi
t
in
d
ne
sig
un
o
tip
di
a) Dichjarare il verrore
bolica
sim
re
can
cos
la
che
ete
on
pp
Su
10.
a
2
tra
si
pre
com
i
par
eri
inc
inizializzaceli con gli
SIZE sia gi srata definita con il cesro di sosciruzio ne 5.
ne d in t.
sig
un
o
rip
di
o
err
ogg
un
a
o
ent
rim
rife
cia
fac
che
r
t
vP
e
tor
1ra
b) Dichiarare un pw
vertere. Usare
di
ici
ind
gli
con
e
iop
raz
no
la
o
and
lizz
uti
s
lue
va
di
n[i
nie
ele
e) Visualizzate gli
ta dichia rata.
sta
gi
sia
i
era
int
llo
rro
con
di
ile
iab
var
la
che
e
net
po
sup
e
r
una srrurrura fo
vP t r l' indirizorc
t:ir
pun
o
tip
di
ile
iab
var
aUa
i.rio
egn
ass
che
oni
uzi
isrr
re
cit1
d) Forn.ice dtLe cLls
zo di par tenza del verrore va lue s.
con pu nra tore e
one
a7i
not
la
o
and
lizz
uti
s
lue
va
e
ror
ver
del
nti
me
cle
gli
e) Vsualiv..ace
offser.
pu nta rore e offsec
con
e
on
azi
noc
la
o
and
lizz
uri
s
lue
va
e
tor
vet
del
i
ent
dem
gli
() Visualiz1.ate
e usando come puncatore il nome deJ vettore.

7.7

26 8

CA PIT OL O

un puntatore che
con
ici
ind
gli
.o
and
liiz
uri
s
lue
va
e
ror
ver
del
nti
me
ele
gli
ate
g) Visualizz
faccia rife rimento al vercore stesso.
gli indici di vettore.
con
one
azi
nor
la
o
and
lizz
uri
s
lue
va
e
tor
vet
del
5
nto
me
ele
all'
b) Puntate
ore, quella con oli
ra.c
pun
e
com
e
ror
vec
del
e
nom
il
o
nd
usa
set
off
e
e
tor
nta
pu
quella con
r:i
.
set
off
e
e
tor
nta
pu
con
lla
que
e
e
tor
nta
pu
indici di
in
ato
zin
gaz
ma
i.m
e
ebb
sar
ore
val
ale
Qu
3?
+
tr
vP
da
o
rac
pun
i) Quale indirizzo sare.bbe
quella locazione?
to da
nta
pu
e
ebb
sar
zo
iriz
ind
le
qua
4]
[
s
lue
va
a
~o
men
eri
rif
cia
fac
j) Supponendo che vP tr
one?
vP tr -= 4? Quale valore sarebbe immagazzinaco in quella locazi
pito indicacom
il
gua
ese
che
one
uzi
istr
la
go
sin
a
un
re
jve
scr

ivic
act
ri
uen
seg
7 .1 O Per ognun a delle
va lue 1 sici
che
e
2
lue
va
e
1
lue
va
g
lon
ere
int
ili
iab
var
le
e
rar
hia
dic
te
sta
to. Supponete che siano gi
stata ini zializzata a 200000 .
g.
lon
o
cip
di
o
ecr
ogg
un
a
e
tor
nta
pu
e
com
tr
lP
ile
iab
var
la
e
a) Dichiarat
e lP tr.
b) Assegnare l'indirizzo di va l ue1 alla variabile di tipo puntator
c) Visualizza.ce il valore dell'ogget to puntato da lP tr.
va lue 2.
d) Assegnare il valore deU 'oggerco pun tato da l Pt r alla variab ile
e) Visualizzare il valore di va lue 2.
f) Vis ualizzare l'ind icizzo di va lue 1 .
identico a quello
ato
lizz
ua
vis
o
rizz
ndi
I..:i
tr.
lP
in
ato
zin
gaz
ma
im
izzo
dir
l'in
te
g) V sua lim
di va lue 1 ?

7. 11 Esegt re ognuna dd le segi1enci attivit.


tore bi gin teg ers
vet
un
o
etr
am
par
e
om

avr
che
ro
ze
ne
zio
fun
la
del
e
ioo
caz
ces
l'in
a) Scrivere
di inceri lon g e non rescicujr alcun valore.
b) Scrivere il prototipo per la fun zione della parte (a).
tore di
vet
uo
o
etr
am
par
e
com

avr
che
um
ndS
1A
add
ne
zio
fun
la
del
e
e) Scrive re l'intestazion
interi on eT oo sm all e restirtur un incero.
d) Scrivere il prototipo per la funzione d~ccirra nella parte (c).
risolto
ere
avr
che
ta
vol
a
Un
ivi.
nar
peg
im
a
anz
ast
abb
o
son
.15
7
al
Nota: gli Esercizi dal 7 .12
comuni.
pi
te
car
di
chi
gio
i
e
enr
ilm
fac
re
nta
me
ple
im
di
do
gra
in
ere
ess
questi problemi, dovreste
dispensi
e
n
o.
uzi
uib
dis
di
e
n
.
zio
fun
la
che
do
mo
in
4,
7.2
t1ra
Fig
la
del
a
7.1 ~ Modifqi.re i.I program~
tive:
iun
agg
ni
zio
fun
ti
uen
seg
le
t
ive
scc
o
uit
seg
In
..,
ker
po
di
no
ma
le cinque carte d1 una
a) De terminate s la mai10 con tenga una coppia.
b) Determi nare se la mano contenga una doppia coppia.
ti).
e) Determinare se la mano contenga un tris (per esempio, rre fan
i).
ass
ro
att
qu
io,
mp
ese
r
(pe
ker
po
n
u
ga
ten
con
no
ma
la
se
ace
d) De t~rmin
sso seme).
ste
lo
dd
te
car
e
qu
cin
a,
osi
ver
(ov
ore
col
un
ga
ten
con
no
ma
la
se
e) Detrmjnate
consecutivi).
ori
val
i
cor
te
car
e
qu
cin
a,
osi
ver
(ov
la
sca
a
un
ga
cen
n
co
no
ma
la
f) Decenni.nate se
mma che distribugra
pro
un
re
ive
scr
per
2
7.1
io
ciz
ser
l'E
nel
e
pat
lup
svi
ni
zio
fun
7. 13 Utilizzare le
no migliore.
ma
la

l
qua
ini
erm
det
e
uti
val
le
er,
pok
di
ni
a
m.
e
du
di
re
car
e
isca le cinqu
te
car
que
cin
Le
.
ere
zzi
ma
un
re
ula
sim
da
do
mo
in
3
7.1
ura
Fig
la
7. 14 Modificate il programma del
. il
ere
ved
ssa
po
le
non
ore
cat
gio
il
che

cos
"
gi
in
cia
fac
"a
e
uir
trib
della mano del mazziere saranno dis
r~
dov
lla,
que
di
t
ali
qu
la
sul
osi
and
eas
e,
.
ere
zzi
ma
del
no
ma
la
progran1ma dovr quindi val utare
ndi
qui
r
dov
a
mm
gra
pro
Il
a.
ari
gin
ori
no
ma
la
dal
te
rta
sca
elle
~crar..re altre carre per soscicuire qu
difficile!).
ma
ble
pro
un

sro
que
ne:
zio
ten
(At
.
ere
zzi
ma
del
no
ma
la
e
tar
r1va1L1
amence la
atic
om
auc
tire
ges
sa
pos
che

cos
4
7.1
io
ciz
ser
l'E
nel
o
pat
lup
svi
.a
7 .15 Modificare il programm
grampro
U
ire.
citu
sos
no
ma
sua
la
del
te
car
li
qua
re
ide
dec
di
ore
car
gio
al
ta
mano del mai:zie~e, menrre consen
nuovo
sro
que
ora
are
lizz
Uti
co.
vin

avr
chi
re
ina
erm
det
e
ni
ma
le
be
ma dovr qwndi valutare entram

269

I PUNTATO RI

Fate giocare
ter?
pu
com
il
o
voi
,
pi
cli
nc
vi
ne
i
Ch
er.
put
com
il
tro
con
tire
par
prGgratnma per giocare 20
ltaci di quesre
risu
sui
i
dov
san
Ba
?
i
p.
ce
vin
ne
i
Ch
er.
put
com
il
tro
con
tire
par
uno dei vosrri ainici in 20
che quesro un
(an
co
gio
di
na
n:u
gra
pro
tro
vos
il
are
fin
raf
per
e
icb
clif
mo
une
orr
partite, apporrarc le opp
nuovo programma?
rro
vos
il
glio
n1e
ca
Gio
.
rire
par
20
e
alrr
e
cat
Gio
e).
icil
diff
ma
ble
pro
o
iam
abb
4,
7.2
ura
Fig
la
del
te
car
le
dd
one
uzi
trib
dis
la
e
o
ent
7 .16 Nel programma per il mescolan1

ilic
sib
pos
la
no
do
ero
in
ha
ch
te
ien
ffic
ine
o
enc
lam
sco
n1e
di
intenzion almente ucilizzaco un algoricn10
enro ad alca efficienza
lam
sco
me
di
o
tm
ori
alg
un
te
ere
cre
io
rciz
ese
o
est
qu
ln
i.
nir
efi
di differimenri ind
che eviter il differimento indefinico .
iile
cO
ck
de
e
tric
ma
la
re
zza
iali
lniz
ce.
uen
seg
do
mo
nel
4
.2
ura
Fig
Modificare il programma cl.ella
onna
col
e
riga
i
ogn
su
i
iter
che
do
mo
in
le
uff
sh
ne
z.io
fun
la
te
ica
mosuaro nella Figura 7.29. Modif
iato
mb
sca
ere
ess
r
dov
ro
1en
~en
ni
Og
ta.
vol
a
sol
a
un
i
ent
dem
li
della marri.ce, rocca.odo ogn uno deg
con un ilrr o selezionato a caso dalla ma trice.
scome
to
sca
sia
te
car
di
zzo
ma
il
se
re
ioa
etm
dec
te
sia
pos
che
l
cos
nte
Visualizzate la matrice risulta
ento
lam
sco
me
un
vi
rar
icu
ass
Per
.
io)
mp
ese
r
pe
0,
7.3
ura
Fig
la
nel
lato in modo soddisfacente (come
sh uf f le .
ne
zio
fun
la
ce
voi
pi
ni
iar
rich
a
mm
gra
pro
il
che
do
mo
in
e
far
soddisfacente pocresre anche

1
2
3

0
1
14
27

40

41

15
28

2
3
16
29
42

10

11

12

17
30
43

18

6
19
32
45

20

8
21

33
46

34
47

9
22
35
48

10
23
36
49

11
24
37
50

12
25
38
51

13
26
39
52

8
35
31
29
37

10

11

12

41
17
32
49

18
24

2
7

44
1

47
6

26
20

31
44

Figura 7.29 La ma trice de ck no n mescolata.

19
13

12

50

1
40

28
33
38

2
27
14
15
52

3
25
16
42
39

36
21
43
48

46

10
8
45
9

34
11
3

30

23
51

22

Figura 7.30 Esempio di ma trice de ck mescolata .


ro,
en
lam
sco
me
di
o
an
ori
alg
..
I
i
lior
mig
ma
ble
pro
sto
que
in
to
lim
uci
Osservate che sebbene l'approccio
oi
p
,
2,
la
per
poi
1,
ea
ca.r
la
per
k
dec
e
c
cri.
ma
la
nel
he
erc
ric
le
del
quello di distribuzio11e richieder ancora
nel
ca
car
a
un
e
car
cer
a

uer
tin
con
one
uzi
trib
dis
di
o
irm
gor
l'al
se
per la 3 e cos) via. Co me se non basras 1
in
4
7.2
ura
Fig
la
del
a
mm
gra
pro
il
re
ica
dif
Mo
ca.
bui
cri
dis
e
ta
mazzo anche dopo averla gi ritrova
che
e
a
arl
ov
ritr
per
vi
rari
ren
ri
erio
ulc
cia
fac
n
no
ta,
car
a
un
o
uit
modo che, una volta che abbia disrrib
un
o
em
per
lup
svi
O
1
olo
pit
Ca
l
Ne
a.
siv
ces
suc
lla
que
cli
one
uzi
proceda immediatamente con la distrib
algori tmo che richieder una sola operazione per carta.
rici pi
sto
nti
me
mo
dei
uno
ete
eer
ricr
io
rciz
ese
sto
que
In
e)
kpr
la
e
7 .1 7 (Sim ulazi..one: la tnrtttruga
casuali
ri
me
nu
dei
ne
zio
era
gen
la
te
ere
lizz
Uti
re.
lep
la
e
ga
aru
tart
La
era
sa
imporranri, vale a dire la classica cor
per sviluppare un a simulazione di questo memorabile eveno.
o il. p.ercorso
gon
pon
com
che
70
le
del
"
l
a
sell
"ca
la
nel
sa
cor
o
lor
la
nno
era
i11c
J nosrri contendenti com
a di arrivo
line
La
a.
gar
la
del
so
cor
per
il
go
lun
ili
sib
pos
ni
izio
pos
le
del
una
ta
sen
della gara. Ogni casella rappre
miato con
pre

sar
70
ella
cas
la
to
era
sup
o
ro
un
gi
rag

avr
che
1re
det
ren
con
n10
odia casella nu1ne ro 70. Il pci
a montagna
un
di
co
fian
sul
ndo
gia
peg
ser
ca
rpi
ine
si
so
cor
per
Il
.
che
fres
e
un .secchio di carote e larrugh
in quando.
ndo
qua
di
eno
terr
e
der
per
no
ritn
pot
ci
dcn
cen
on
i
ci
per
e,
vol
sdrucciole

f
I

CAPI TOtO

270

I plJNTATORJ

IJ Sirnplerron contiene u1J arcurn11/11.rore. un "registro speciale" in ~ui sru:nru10 .inseci~e rurce le .~nforn1a-

C' un orologjo che scandjsce ogni secondo. Ad ogni rie dell'orologio il vostro program1na dovr
aggiustare la posizione degli ani mali secondo le seguenti regole:

Anim ale

Tipo di mos sa

Perc entu ale di temp o

Mos sa effet tiva

Tartaruga

Arra11caca rapida
Scivolone
Arrancata lenra

Lepre

Dorm ita
Salto lungo
Scivolone lungo
alco corto
Sci,v ol0i1e corto

50 1Vo
20%
30/o
200/o
20%
10%
300/o

3 casell e a destra
6 caselle a siniStra
1 casella a destra
Nessuna mo sa
9 caselle a desrra
12 casell e a si nistra
l casella a destra
2 case li.e a sin isrra

20%

n1odi. Tutte le tnfonna. rima che il Simplerron possa urilizzarlc per i calcoli o per esammarle tn1var:t
d al e di
'
zioru, P
zioni saran no manipolact: all'interno dd Simpleuo11 come parole. Una paro a e un numero ec1rn
quattro cifie con segno, come ~3364 , -1 ~9~, +0007 , -0001 , ~cc. 11 Simpl~tr~n e~uipaggiaco coo una
aria di 100 parole alle qua.11 raremO riferunentOarrraversO I loro OUITICfl d1 }oCazL One 00, 01 , ... 99.
memPrima di porer eseguire un progcam ma LMS do,rre1no caricarlo o immetterlo nella memoria. La prima
istrGZione (o comando) di ogni plogramma LMS sar sempre ca.ricara ncUa posizione 00.
Qgnj istruzione scritt~ in LMS occuper una parola nella 1uen:oria del .Simplcrr?n .. ~ Co~eguen.z.a:
corrisponder a un numero Jecimale di quattro cifre con segi10. Owiamcnt~ 11 se?110 daogni 1sc:nwone.1!':1S
sar sempre quello ,positivo, n1entre quelli delle parole che concengai10 deJ ,~a ~ocran~o essere ~os1av1 o
rivi. Ogni locazione della niemocia del Siioplerron porr contenere un 1srruz1one, 'ti valore di un daro
:~naro daJ prograrnma, oppure un'area di memoria inurilizzata (e quindi indefirura). ~ prirne d.u~ cifre
di ogni isc:ruzione LMS corrisponderanno al codice dell'opt.'1't1zione eh~ dovr essere esegwca. Lcod1c1 delle
ope.@Zioni LMS sono riassunti nella Figura 7.31.

Codi ce dell' oper azio ne Sign ifica to

Ucilizz.ace le variabili per n1antcnere rraccia delle posizioni degli anintali (owerosia dei numeri da 1 a
70). Fare parrireog:i1 i animale dalla posizine 1 .(vale ad.ire dalle "gabbie di partenza"). Riportate nella casella
l l'animale d1e dovesse cvenrualmence scivolare i11dierro in una posizione precedente a quella.
Gene rare le percenruali mosrrare nella tabella p recedente producendo tLa incero casuale i compreso nell'i ntervallo 1 = i = I O. Nel caso della tartaruga eseguirete LLna "arrancata rapida" quando l = i = 5,
una ..scivolar' quando 6 = i = 7 o una ''arrancata len[a" quand o 8 = i = 10. Utilizzate una recnica
simile per far crrere la lepre.
Cominciate I.a gar:a visualizzando:

Operazioni di i1zputlou1put:
#defi ne READ 10
#defi ne WRITE 11

BANG !!!Il
ANO THEY' RE OFF 11111

#def ine STORE 21

Sez ion e speciale: cos tru ite il vos tro com put er
Nei prossimi esercizi abbandoneremo temporaneamente il ,mondo dcUa programmazior1e con linguaggi di alto UveJlo. Sbucceremo" un comp uter e daremo uno sguardo alla sua suucrura interna.
lnrrodurremo la programmazione in linguaggio macchina e con quesco scriveremo diversi programmi.
In seguic:o, per fare in modo che sia un'esperienza di parricolare valore, costruiremo un computer
(a erraverso la tecnica della sinzztit1zio1ze sofrwar} sul q u.aJe po tre ce far esegui re i vosc:ri progra 111rr sri rri
in lingu aggio nlacchi na!
7 .18 (Prograrntnazione in lir1g1.1aggio mttcchin) Creeremo ora un computer che cl1jarnererno Simplecron .
Come il suo nome lascia in.cend.er si cratra di una rnacchina semplice, n1a co1ne vedremo presto anche
potente. USimplecron eseguici dei programmi scritci nelJ'unico linguaggio che sia in grado di comprendere
direrramenre., vale a .dire il Linguaggio Macch.ina del Sin1p letron 1 che abbrevieremo in LMS.

Legge una pa rola dal te rminal e e la imma gazzi na i11 una


specifica locazione cli memoria.
Scriv e stil cerm i nale la parol a conr.n ura in tLna speci f ca
locazione di n1ernoria.

Operazioni di carica1nentolirnmagauir11lrr1ento:
#defi ne LOAD 20

In segui uo, per ogni tic delJ orologio (ovve tosia per ciascu na ripetizione del ciclo), visualimerere
una linea di 70 posizioni che mostri una lettera T in quella della ra.n:aruga e una L in quella della lepre.
D i quando in quando, i conre ndenci si ritroveranno nellastessa casella. ln tal caso la c:arcaruga morder
la lepie e il vostro program ma dovE visualizzare OUCH 11 I jn qt1ell~ posizione. Tutte le posizion.i di
visualizzazione diverse da T, L od OUCH 111 dovranno resmre vuoce.
Dopo che ogni linea sar scara visualizzata, controllerete se uno dei due animali abbia raggi unto o
superato la casella 70. Jn caso affermativo visualirz.erere il non1e del ' 'incitare e terniinerece la simul.azion.e.
Nel caso che abbia vi nco la tartaruga v.ispal izzerece "TORTOISE WINSI 11 YAYI 11 ". Nel caso che abbia vinco
la lepre visualizzerete " Hare wins . Yuch . N.1 caso d1c entrambi gli animali ragliassero il traguardo nello
stesso tic dell' o.roJogio, potreste favorire la carcaruga (poverina), oppure porreste visualizzare "It ' s a tie. ''
Nel caso cl1e nessuno dei due ai1imali abbia ancora villtoj eseguire w1'alcra volta il ciclo per simulare il
successivo rie dell'orologio. Radunate un gruppo di tifosi che assisrano alla gara, quando sarece pronti a
mandare in esecuzione il vosrro programma. Il coinvolgimen.co del vostro pubblico vi sorprender.

-.

Carica neli 'accu mu lacorc la pa.rola. conre nut a ia u11a specifi ca


loca:zio11e di memoria.
Arch ivia il conte nuto dell'accu_mulato re in una speci fica
locazione di me1no ria.

Operazioni arit1l1etiche:
#def i ne ADD 30

#defi ne SUBTRACT 31

#def ine DIVIDE 32

#def ine MULTIP LY 33

Aggi Wlge la parol a conrcnLLta in un a speci fica


mem oria a que ll a conre 11tica nel.l 'accun1u laror e
questo il risuJcaco).
Sottr ae la parol a co ncen u ra in una specifica
mem o ria d~ quell a once nuta a ell'ac cumu laror e

locaz ione di
(lasc ianclo in
locaz ione di
(lascianc:Lo in

questo il risuJcaro).
Divid e la paro la conc cnura in una specifica locaz ione di
m~mo ri a per quell a co n.tenu ta nel l 'acct~mulatore (lasci ando in
quesco il risultato).
Molc iplica la pa rola C:onrcnura io una s pecifica locaz ione di
memoria per quella conte nuta neU'accumulaco re (lasciando in
questo il risuJraro).

Operazioni di trasferi1nento del controllo:


Salta a ttnaspecifica locazione di memoria.
#def ine BRANCH 40
#def ine BRANCHNEG 41

#def ine r;3RANCHZERO 42

#def ine HALT 43

Salta a una specifica locai.iene di mem oria, se l'acc um ula'tore


cone ne un valore ncgacivo.
Salra a un a specifica locaz ione di mem oria, se l'acc umul aro re
conriene un valore uguale a ze ro.
Ferm a l'esecuzione del programma.

Figu ra 7 .31 I codci di operazione del Linguaggio Macchina del Sim,p letro n (LMS) .

27 2

CAPCTOLO

273

{ pUN TA TO Rl

~ ulti~1edue ~e di

un' istruzione Uv1S rappresenteranno invece l'oper11ndo, ovverosia l'indirizzo delJ


:l
locaz1~~e di memo~~ che concerr la parola su. cui l'operazio
ne sar applicaca. Consideriamo ora alcuni
semphc1 programmi u1 LMS.

e) Leggete una serie di numeri e detern1inate e visualizzate quell o maggiore.


Il primo numero
letto indicher quanti valori dov ranno essere elaboraci.

7.19

Es em pio I
Locazione
00
01
&:!

00
04

es
es
~

llB

es

Nu me ro

lsb'UZione

+1007

(Legge A)
{Legge B)
(CSricaA nel l 'acclJllJlatore)
(SOOlna B ali ' accu111Jlatore)
(Memorizza il valore del l ' acclJllJlatore in C)
(Staq>a C)
(Halt)
(Variabile A)
(Variabile B)
(Risultato C)

+1006

+2f/llfl
+3008
+2109
+1109
+4300
+0000
+t000
+t000

,. Q~ esco programma in LMS legger due numeri dalla tastiera e calcoler


e visualizzer la loro somma.
J.?,struztone +10 07 legger. il primo numero dalla taStiera e lo inserir nella loca
zione di me moria 07 (che sar
~a Stata 3 ~~ ra) In seguito + ~ 008 legger il secondo 11wn ero
nella locazion e 08. Listrui.ione load, +20 07,
SISten:ier 11 pnmo num~o nell accumulatore, menrre l'istruzione add, +30 08,
aggiunger jj secondo numero
a. que llo CO~ten Ut:() neUac~ unul~tore. Tutte I.e operazioni aritmetic/Je del ling
uaggio LM S lascia120 ii wro
multa~ tiell~ccttmu~tore. LIStnlZ.lone store, -t21 09, riporter
il risul caco nell a locazione di memoria 09 dal la
quaJe l 1scruz1on.e wnte, +11 09, lo prelever e lo visualizzer con1e un numero
decimale di quarno cilr ~
T: A

h
1
segno. ~tn.17Jon e ~ aa, +43 00, terminer r esecuzione del programma.
e con
A

Es em pio l
Locazione

Nu me ro

Ist ruz ion e

+1009

(Legge A)

00
01

+1010

&:!

+2009

+3110

04
E
06

+4107

06

es
10

+1109

+4300
+1110
+4300
-+t000

....

(Legge 8)
>' (carica A nel l' acclJllUlatore)
(Sottrae 8 dal l ' accunlllatore)
(sa lta a 07 se l' accUllllatore negativo)
{Staq>a A)
(Halt)
(Staq>a 8)
(Halt)
(Variabile A)
(Variabile 8)

<:luesto progra m ~a LMS le.gger. due numeri dalla msriera e determine


r e visualizzer quello
magg1o~e ..Osse~ate ~ uso della istr uzione +41 07 con1e un
rrasferimenco di con trollo co ndizionale
molco s~il~ ~J 1sauz1one i f del C. Scrivere ora dei p rogrammi in LM
S che eseguano ognuna delle
seguen ti acuvit.
a) Uti lizzate ~ ci~o con crollaco da un valore sennella per leggere
1O num eri positivi e
calcolare e v1sual1zz.are la loro somma.
b) Utilizzate un ~ido.conrrollaco da un contacore per leggere sette num eri,
positiv i e negativi,
e calcolare e visualizzate la I.oro media.

(Un sim11.latore di computer) Porr sembrare sage:raco, ma con questo eserciz


io coscruirece il
oscro computer. No, non dov rete saldare dei compo nenti. Ulimerete
piuttosto la 'potente tecnica
della simu.lazione sofau.1ar~ per creare un modelw software del Simplecron. No
n rimarrete del usi. LI vostro
simulatore Sim pletron uasfoane.r il computer cl1e scatc utilizzando in un
Simplec:ro n e sar!!te eficcivamente in grado cli eseguire, provare e meaere a pun to i programmi LM
S che avete serino nell 'esercizio 7. 18.
Nel mo mento in cui eseguirete il vostro simula tore Sirnpletron questo dovr
incom inciare
visualizzande:
*** Welcome to Smpletron l

***

Please enter you r prograrn one instruction ***


(or data word) at a time. I wi ll type t he ***
location number nd a quest ion mark (?) . ***
*** You t hen type the word tor tha t location. ***
*** Type the sentin el -99999 to sto p entering *'**
*** your program. ***
Simulate la me moria del Simplecron con il vettore unidimensionale mem
ory di 100 eleme11ci.
5,u ppo aete che il simulatore sia gi in escuzione ed esa min iamo il dialog
o eh.e si svil upper con esso,
ma n ma no che im mectiamo il programma mostrato nell'Esempio 2 dell'Es
ercizio 7.1 8:
00 ? +1 009
01 ? +1 010

02 ? +2009
03? +311 0
04 ? +4107
05? +1109

06 ? ~43 00
07 ? +11 10
08 ? +4300

09 ? +0000
10 ? +0000
11 ? -99999

*** Program loading completed ***


*** Program execution begins ***

O ra che il programma LMS scaroimmesso (o caricato) nel verrore memo


ry, il Sirnplecron provveder a esegui rlo. I; esecuzione co1n incer con l'istruzione nella locazio ne 00
e, come in C, contintter in
mo do sequenziale, sem pre che non si clirami in qualche altra parte del
programma a causa di un
trasferi mento di con trollo.
Ut ilizzare la variabile acc um ula tor per rappresen tare il registro accum ula
tore. Usare la v~ialJile

ins tru ct on co un ter per conservare- l'indirizzo di memoria in cui sar


conten uta l'istruzion e da
esegui re. Ucilizzace la variabile o.p era tio nC od e per indicare l'operazio ne
da eseguire, ovverosia le du~
cifre a sinistra nella parola dell'istruzione. Usate la variabile ope ran d
per indicare la locazio ne di
memo ria su cui o,perer 11iscru.zione corren te. 1n alrri cermin i, ope ran d cor
risponder al le due cifre pi
a descra dell'is auz.ione da eseguire. No n eseguite d.irercamente le istruzioni
contenuce nella mmoria.
Trasferire piuttosto q_uella da esegui re dal la memoria in una variab ile chiam
ata ins tru cti on Re gis ter .
ln seguito "staccherete" le due cifre di sinisaa per sistemarle in ope rat ion
Co de e "separerete" le due
cifre di destra per siscernarle in ope ran d.
Nel mo mento in cui il Sirnplerroo comincer l'esecu"Lio ne i registri spe
ciali SaraJ,1110 dun que
inizializzati nel modo seguenre:

'
I

274

CAPITOLO

+0000
00
+0000

accumulator
instructionCounter
instructionRegister
operationCode
operand

00

instructionCounter - operrand;
AEGISIERS:
accuiWatot" +0109

~ memory[ instructionCounter];

11 codice dell'operazione e I'operando saran110 estrarri dal registro delle istruzioni con:
operationCode = instructionRegister I 100;
operand =instructionRegister % 100;
O ra il Simplerroo in grado di determinare che il codice dell 'operazione co rrisponde in realc a
una rend (e no n a una write, una l.oad, ecc.). Una srrurtura swi tch discinguer le dodici operazioni dcl
linguaggio LMS.
Al l'interno della srrurrura swi t ch il comportamenco delle varie istruzioni sar simulato nel n1odo
seguente (lasciamo a voi ) alrre iscruzioni):

read:
load:
add:

tr" di istruzioni. Di conseguenza, l'istruzione di salto incondizionato (40) sar simulara all' interno
ddla suurrura switch con:

00

Ora "seguiamo'' l'esecuzio11e della prima isrruzione LMS: il +1009 sisremaro nella locazione di
memoria 00. Quello che seguiremo derto ciclo di esecztZione deii'struztze.
La variabile instruct i onCounter ci indica la locazione della prossima istruzione da eseguire.
"Preleveren10" dunque il contenuto di quella posizior1e dal vettore memory usa.ndo l'istruzione C:
instructionRegister

275

scanf ( "%d 1 &rnemory [operand] ) ;


accumulator = memory[operand];
accumulator +~ memory [operand) ;

Varie istruzioni di salto: ne discuteremo tra breve.


Questa i struzione visualizza il messaggio
**"' Simpletron execution terminated ***

halt:

e in segujco visualizzer'd il nome e il conrenuto di tutti i registri, cos co rne quello di rurca.1a memori a.
Un output di questo genere spesso chiamato dtttnp del cornpiJ.ter (ovverosia deposito del computer,
che no.n per il posto dove vanno a fmire i vecchi compurer). Per aiutarVi a irn.plmenrare la vostra
funzione dj durnp nella Figura 7.32 abbiamo riportato un esempi.o per il forn1aro dcl dump. Osservare che un dump esegillro alla fi ne d~U'csecuzione di un progran1ma Simplerron dovrebbe moscrare
i valori corre.ari delle iscruzionj e dei dari, cosl come sono in quel momento.
Procediamo con lesecuzione della prima isrruzione del nostro programma, vale a dire la + 1009 della
pos.iz.iot1e 00. Come abbiamo affermato prima, la struttura s wi t ch la simuler eseguendo l'istruzione e
scanf ( "%d 1 &memory [operand] ) ;
Prima che la funzione s canf sia esegui ca, dovr essere visualizzato un punr.o interrogativo(?) per
richjedere l'inpur dell'ucerite. Il Simpletron accender che l'utene.e immena u:n valore e prema iJ
tnsto invio. A quel punto il valore sar sistemato nella locazione 09.
La simulazione della prima istruzione stata fu1almcnce completata. Ci rimane soJo la preparazione del Simpletron all'esecuzione cieli.a prossima iscrw.ione. Dato che l' iscruz.lone appena esegwca 11on
era un trasferimento di controllo, avremo semplicen1ence bisogno di incremenrate il registro contacorc
dell.e istruzioni, nel modo seguente:
++instructionCounter;
Questo passo compi.eta davvero l'esecuzione sim ulata della prima istruzione. L..J1cero processo
(ovverosia il ciclo di esectJZione dell' istruzione) ricomincer nuovamence con il rcupero della prossima
istruzione da eseguire.
Ora esan1iniamo in che modo saranno sin1ulace le iscruzioni di salco, ovverosia i rrasferimenci cl.i
conrrollo. Ln effetti, sar necessario solo aggiornare in modo appropr:iaro il valore contenuto nel conca-

9
..., .......... ~ ........ +Me +00110 ~ . . .
+8010
te +eeee ..... ~ ........... +teee .. . .
a +eee ~ w +eeee t0111 +.a 1eeee +eeee +eeee +teee +eeee
0

+
.............. .................... ....
~

.............. .. . +eeee . . . +e801 "tl888 . . . . . . .

se .... ,..., .... ............ +8080

V. . .

. ....

.. .

61 ......... .. . . . . . . . . . . +8888 ,. . , . . . . +011188 ....


79 . . . . . . .. . . . . . . .. . . .. . . . . iMll .... +8010
. .. . . . . . . . . . .. . +1108 ........ ftee8 . . . .. . .

se ~ +ea eeee

0180

eeee....,.. -tteee +9000 +eeee +eeee

Figura 7.32 Un esempio di dump.


l.!istruzio,ne condizionale "salto se l'accum.ulato.r~ uguale a zero" sar simulata con:
if (accumul ator = 0)
instructioncounter

= operand;

A.questo punto, dovreste essere ia grado di in1plementare il vosrro simulatore di Simplecron e di


seguire ogL1uno dei programmi LMS che avete scritto nd.L'Esercizio 7 .18. Porrete abbellire il linguaggio lMS con delle caratcerisciche aggiuntive e implemntarle nel vostro sim ulatore.
Il vostro simulacore dovr efferruare dei con crolli per vari ripidi errore. Per esempio, du.ran ce la fase
di earicamento del programma, ogni numero che l'utente tenter di immettere ne.I verrore memory del
Simpletroo dovr essere compreso ne.ll' inrervallo da -9999 a +9999. IJ vostro simularore dovr quindi
ucilin.are un ciclo while per controllare che ogni numero immesso sia compreso in que.ll' incervallo e,
in easo contrario, continuare a richiederlo all' utente finch non n e avr immesso uno corretto.
D urante I.a fase di esecuzione, il vostro simulatore dovr effettuare dei controlli per vari errori
gravi, come i tentativi di eseguire de.Ile divisioni per zero o di eseguire dei codici di operazione non
validi. il su.peramenco della capacit dell'accumulacore (owerosia le operazioni arirmeriche che producono valori maggiori di +9999 o minori di -9999) e altre cose simili. Insonuna. occorrer gestic gli
errorifaU1li. Nel momento in cui avr inrercercaco un e.rior.e facale, il voscro simulatore dovr visualizza.re
un rn~~aggio di errore come:
*** Attempt to divide by zero ***
*** Simpletron execution abnormally te.rrninated ***

e ~isual i:zzare un dump completo del computer nel formato di cu abbiamo discusso in precedenza.
Ci aiuter l1urente a individuare l'errore dd programma.

7.20 Modificate il programma di mescolamento e distribuzione delle carte proposto nella Figura 7.24, in modo che le sudderre operazioni siano eseguire da una funzi.o ne unica (s huffleAndDeal).

C'\PJTOLO

276

Questa dovr contenere una srrurrura di iterazione nidificata simile a quella d~lla funzione s huff l e
mostra ca nella Figura 7 .24.
7 .21

277

I ptJNTATORl

7.23 Trovare l'errore in ognuno dei seguenti segmenti di programma. Spiegate in che modo sar
possibile correggerlo, sempre che lo sia.

a) int number;

Che cosa far quesro programma?

printf ( "%d\ n", *number);

#include <stdio.h>

b ) float *realPtr;
long integerPtr;
integerptr = realptr;

void mystery1(char *, const char *);

o) int * x, Yi
X =y;

main()
{

char string1 (80] J s't ritlg2(80);

d) char s [ J = uthis is a character array" ;


int count;
for ( ; *s I= '\0 ' ; s++)
printf ( 1'%c " , *s) ;

printf ("Enter two strings: ~) ;


scanf("%s%s", str.ing1, string2);
mystery1 (string1, string2);
printf( "%s\n" 1 string1);
return 0;

e) short *numPtr, result;


void *genericPtr = numptr;
result = *genericPtr + 7;

void mystery1(char *s1, const char *s2)

f) float x = 19.34;
f loat xptr = &x;

while (*s1 I= \0 ')


++s1;

printf( "%f\n", xPtr);

g) char *s;
for ( ; s1 =*s2; s1 ++, s2++)

/*istruzione vuota ~1
}

7.22

'

Che cosa far

qu~o

programma?

#include <stdio.h>
int mystery2(const char

~}i
I

main()
{
char string[80);

printf( "Enter a string: "};


scanf ( "%s , string) i
printf ('\d\n", mystery2(string));
return 0 ;
}

int mystery2(cnst char *s)


{

int X = 0j
far ( ; s I= '\0
++x;
return x;

st+)

printf( "%s\n", s);

(Quicksort) Negli esempi e negli esercizi dd Capitolo 6 abbiamo discusso le tecniche di ordinamenro a bolle (bubble sorr), di bucker sorc e pei: selezione (scleccion sorc). Presenteremo ora una cecn_ic~
(iCQJSivadi ordinamento cb.iamata Quicksort (ordinamento veloce). Valgorirm.o fondamentale per un
vettore di valori un idime11sionale il seguente:
1) />asso di ripartizione: prendere il primo elemento di un vettore disordinato e determinate la
sua posizione fLnale in quello ordinato. Ci avverr quando rutti i vaJori dd sorcovettore
sinistro, rispetto all'elemento, gli saranno inferiori e rutti quelli del sorcoverrore desrro gli
saranno superiori. A questo punro avremo undemenro sisremaro nella sua giusc:a posizione
e due sorrovercori disordinaci.
2) Posso ricorsivo: eseguite iJ passo 1 su ogni sotcoverrore disordinato.
Ogni volra che il passo 1 sar eseguito su un sottoverrore, un aluo elemento sar siscen1aro nella sua
posizione finale all'inrecno del vettore ordinaco e saranno creati due sorcovertori disordinati. Considerei:emo sicuramente ordinato un sorcovercore che sia formato da un solo elemento e, di conseguenza,
que-sro sar gi nella sua posizione finale.
Calgoriano di base sembra abbascanza semplice, ma in che modo determineremo la posizione
finale del primo elemento di ogni sorcovectore? Come esempio, consideriamo il seguente gruppo di
valori (l'elemento in grasserco quello urilizzaro per la riparrizio11e, ovverosia, quello che sar siscemato
nella sua posizione finale all'interno del vettore ordinato):

7.24

37 2 6 4 89 8 10 12 68 45

1) Partendo da quello pi a descra neJ vettore_,eoofroarate ogni elemento co n il 37 finch no,n

ne rroviace uno mil1ore che scambierete di posco coii il 37. Il primo elemento 1ninore cli 37
12, perci 37 e 12 saran no scambiaci di posto. Il nuovovercore sar:

}
12 2 6 4 89 8 10 37 68 45

LeJemenro 12 in corsivo per ricordare che stato appena scarnbiaro di posco con il 37.

27 8

CAPl1"0 LO

J PUNTATORJ

dd vecrore, ma cominciando da quello successi"vio aJ 12 con fjronrare


2) Parrendo dalla sinisrra

il
zare
aliz
visu
r
dov
e
zion
fun
La
.
orso
perc
del
lla
case
i
ogn
n
i.
x
e
crer
cara
il
rire
labirinro, dovr inse
o.
labirinto dopo ogni mossa cosl che l' urea.te possa seguire la risoluzione del labirint
argo1e
con
va
rice
che
r
rato
ene
zeG
ma
e
zion
fi1n
una
e
iver
Scr
i)
rint
labi
di
tale
cnsi
rle
7.26 (Generttzio
he
anc
r
dov
e
zion
fun
La
.
caso
a
o
rinc
labi
un
a
duc
pro
e
12
per
12
i
tter
cara
di
ce
mento una marri
delrse
ave
eTr
maz
e
zion
fun
rra
vos
la
vare
Pro
o.
rint
labi
dd
ita
usc
di
e
esso
ingr
di
restituire i punti
l'Esercizio 7.25 ucilizzando vari labirinci generaci a caso.
zeGenerator
ma
e
erse
rav
zeT
ma
i
zion
fun
le
ce
iz.ta
eral
Gen
e)
n
n
ensi
dim
si
lria
qua
di
nti
biri
7.27 (La
zza.
gli Esercizi 7.25 e 7.2 6, in modo da elaborare labirinti di qualsiasi larghezza e alre


. d. posto con
ogni e eme nto con il 37 finch non ne troviate uno maggiore cl1e scamb1e 1.ere
1
li
il
to. 11
pos
di
aci
mbi
sca
i1no
sara
89
e
37
i
perc
89,

37
di
e
gior
mag
o
ent
elem
o
prim
37.
nuo'.IO vecrore sar:
12 2 6 4 37 8 10 89 68 45

ogni eletare
fron
con
89,
a
nte
ede
prec
llo
que
da
do
a_n
inci
com
,ma
tra,
des
a
d~l
o
tend
Par
3)
37. Il
il
n
co.
to
pos
di
ce
iere
amb
c
sche
ore
min
uno
are
1
crov
e
n.
no~
he
f~c
37
il
con
m~nto
u nuov0
primo demenco m1Dore di 37 10, perci 37 e IO sa ran no scambiaci di posto.
verro re sar:

12 2 6 4 10 8 37 89 68 45

I
fro
con
10
al
ivo
cess
suc
llo
que
da
o
and
inci
con1
ma
,
stra
sini
a
dall
o
tend
Par
4)
nrace ogru e e,
.
fi h
- 1J
il 37. Ln
men co con 37 ~c non n~ rrov1ace uno ma,ggiore che sunbierece di posto con
co
questo caso non c1 sono alrr1 elementi maggiori di 37 perci>confrontando il 37
se
sres~o, sapren10 che sar gi stato siscemaco nella sua posizione finale all 'interno del vercnore
ordinaco.
ccori
rove
soc
due
nno
sara
ci
,
ione
rtiz
ripa
a
L
ta
lica
app
a
stat
sar
ore
vert
co
dec
sud
aJ
. U.na ~olca che
d v.aJ ori
.
8
10
4
6
.,
12

rerr
cn
37
di
ori
min
ri
valo
dei

ttor
ove
sorr
Il
e1
ac1.
o
qu
d1so rd1n
cre
men
,
e
~ ,
,
,
.J:

1
d
p
que
dun
'
ra
dov
ento
inam
ord
di
3
o
ion
gor
I:al
45.
e
68
89,
a
0 ce ere con a
magg1or1 w 7 conterr
r

b
dJ

U . al
ripartwone .enrram 11sorrovenori nello sresso modo ucilizzaro per riparcire que 0 ongin e.
d

Basandovi sulla d"1scuss1o


di
eh
ort
cks
qui
a
rsiv
rico
e
zion
fun
una
vere
scri
e
ent
e
prec
ne
. .
enti un ~;re;~~
om
arg
e
com
ere
ri~
r
dov
e
zion
fun
La
ri.
ince
..ri
valo
di
aJe
si~n
e?
t~
un
cro~~
\riaJ

di pare . a e uno di fiine. La fu nzio


v ori LDter1 ' un 1nd1ce
rich iamata da
re
esse
r
dov
n
tio
rti
pa
ne
enz
.
.
i k

.
ione
rriz
ripa
dJ
so
pas
11
wre
eseg
per
t
qu e sor

ell

di un labirinto
2
e
ion
nraz
rese
rapp
la

te
uen
seg
lia
grig
La
o)
rint
labi
t'n
di
o
e1'it
rsam
rave
(Att
7. 5
all 'interno di una marrice.
1 11 11 1 11 1 11 1
1000 1000000 1
00 10 10 11 , , 0 1
1110 10000 l 0 1
10000 1110 100
1 1 11 0 10 1 0 10 1
100 10 10 1010 1
11 0 10 10 10 10 1
100000000 10 1
111111011101
1000000 1000 1
1 11 11 1 1 11 1 11

o.
I num~i uno e zero ~appresenran-0 r.ispecrivamenre le pareri e i corridoi del labirint
il ritrovamento
, ~te un semplice algorinn o di attraversamenro di un lab.irinro che garanris
pun ro
al
vo
nuo
di
sre
vere
rirro
vi
e
foss
ci
non
cita
l'us
che
caso
Nel
.
)
una
sia
ne
ce
che
usa a (s;mpr~
in avanri
are
min
cam
a
ace
inc
com
e
rra
des
rra
vos
alla
re
pare
a
sull
tra
des
o
man
la
a~e
oggi
_par~enza.
rra .
des
a
ro
mu
il
ce
ui
seg
tra,
des
a
lra
svo
o
rint
labi
il
Se
re.
pare
a
dall
o
man
ra
vosc
!a
~n fi'muo~ere mai
vosrr~
la
osso
rim
te
avre
non
po
rem
fcar
nel
se
o,
rint
labi
del
a
s~t
all'u
re
me~
ura
s1c
te
vere
a me arri
so ma in
apr
inrr
re
ave
che
llo
que
di
e
brev
pi
o
cors
per
un
ta
esis
chile
bab
pro

e.
arer
mano dal ladp
'
quesco mo o avrete la cercqza di uscire daJ labirinco.

u
La.f
nco
biri
illa
sare
vec
arua
per
se
r
ave
eTr
maz
a
rsiv
rico
e
.ion
Scrivere la funz
ov:r: r.1.ceveone
nz.1.
.
di
.
.
re come ar
ne di
izio
pos
la
e
o,
rint
labi
il
re
enta
pres
rap
per
12,
per
12
i
tter
cara
nce
mat
una
g~m ena
.
l'uscira dal
e
uar
ivid
ind
di
er
tent
e
ers
rav
zeT
ma
che
o
man
n
Ma
so.
stes
o
dell
rno
mre
partenza all

1ell

279

ll modo da uriliz.2
6.2
ura
Fig
a
dell
a
mm
gra
pro
il
ere
criv
Ris
i)
zion
fun
a
ri
tato
pun
di
ori
Vtt
(
7 .28
ti 4 opzioni:
uen
seg
le
te
uren
all'
ire
offr
r
dov
a
mm
gra
pro
1
1
u.
men
da
data
gui
ia
acc
cerf
n
urii
zare

Enter a cb()i ee :
'

e Pr'l nt th array of grade&


1 Find the mininu!J grade
2 Find ttle nlSX:i nun grade
3 Pri nt t~ average on all tes ts for each student
4

EAd prt>,gram

.,

essere dello
ono
dev
ri
tato
pun
i
i
rutt
che

i
zion
fun
a
ri
tato
pun
di
ori
vett
di
zo
riliz
all'u
one
Una restrizi
stesso tipo
lo
e
cucc
no
isca
itu
rest
che
i
zion
fwi
a
ri
tato
pun
dei
re
esse
ono
dev
a,
enz
segu
Con
Di
stesso tipo.
ura 6.2 2
Fig
la
i
ne.
i
zion
fun
le
,
one
ragi
sta
que
Per
.
tipo
so
stes
o
dell
enti
om
arg
o
evan
..ric
di dato e che
o i medesim i
van
rice
e
dato
di
tipo
so
stes
lo
o
scan
itui
rest
che
o
mod
in
cate
difi
mo
re
esse
no
dovran
valore minimo e
il
zino
aliz
visu
che
do
mo
in
imum
max
e
m
imu
min
i
zion
fun
le
cate
difi
Mo
tri.
parame
ave rag e della
oe
z.io
fui1
la
ate
ific
mod
3,
e
zion
l'op
Per
re.
nien
o
scan
irui
rest
non
e
o
sim
mas
quello
uno specifico).
di
lla
que
che
ece
(inv
e
ent
stud
i
ogn
di
ia
med
la
pur
our
in
i
invi
che
do
mo
in
2
6.2
Figura
di pri ntA rra y,
tri
ame
par
si
stes
gli.

ver
rice
e
daco
sun
nes
re
itui
rest
r
dov
non
e
rag
ave
ne
zio
La fun
e
s
ade
sGr
ces
pro
ore
vett
nel
i
ion
funz
ttro
qua
alle
ri
tato
pun
i
ate
zzin
aga
minimum e maximum. Imm
fi1nzio ni.
utilizzare la sce:lta effettuata dall'urente come indice di vettore per richiamare le
e
war
soft
e
ion
ulaz
sim
una
tto
scri
e
aver
l9
7.
zio
erci
l'Es
Nel
ron)
plet
Sinz
ore
itlat
7 .28 (Modifihe al sim
(LMS). l n quesro
di un computer che esegue i programmi scritti nel Linguaggio Macch in-a Sin1plerron
26
12.
i
rciz
Ese
li
Neg
.
ron
plet
Sim
ore
ttlat
Sim
al
nti
ame
lior
mig
e
he
ific
mod
rse
esercizio, proporremo dive
liJ1un
in
rri
scri
i
mm
gra
pro
i
tir
ver
con
che
rore
pila
com
un
di
e
ion
truz
cos
la
o
e 12.27, proporrem
. Alcune
ron
pler
Sim
del
ina
cch
Ma
ggio
gua
Lin
nel
)
SIC
BA
del
ante
vari
a
(un
llo
live
guaggio ad alto
ni dal
o
d.
pro
i
mm
gra
pro
i
uire
eseg
pr
rie
essa
nec
re
esse
no
ran
pot
ie
lior
mig
e
che
dii
delle seguenti mo
compilacore.
ren.ere 1000
con
sa
pos
che
do
mo
in
,
ron
pler
sim
ore
ulat
Sim
del
oria
mem
la
ere
end
Est
a)
locazioni e consenrire al Simplerron di gestire programmi pi corposi.
rio aggiun essa
nec

Sar
o.
dul
mo
dd
olo
calc
il
uire
eseg
sa
pos
ore
ular
sim
il
che
do
mo
in
Fate
b)
gere un'istruzione al Linguaggio Macchina Simplecron.
n.ecessario
Sar
a.
enz
pot
a
o
enc
vam
l'cle
e
olar
calc
sa
pos
ore
ular
sim
il
che
do
mo
1
i1
Fare
c)
aggiungere un'istruzione al Linguaggio Macchina Simpletron.
que lli interi,
di
ce
inve
ali.
ecim
esad
ri
valo
dei
i
z
iz.
util
che
do
mo
in
ore
ulat
sim
il
cate
difi
Mo
d)
per rap.prese ncare le istruzioni del Linguaggio Macchina Simpletron.
line. Sar
e) Modificare il simulatore per consen rire la visualizzazione di un caratrere nw
necessario agginngere un'istruzio ne al Linguaggio Macch ina Simplerron.
virgola n1obi le
f) Modificare il sirnularore in modo che possa efaborare anche d.ei valori in
oltre a quelli interi.
ogni
g) Modificate il simulatore in modo che possa gestire l'input di srringhe. Suggerimenro:
intero
parola del Simplecron porr essere suddivisa in due gruppi concen enci ognuno un

\
280

CAPITOLO

di due cifre. Ogni inrero di due cifre rappresenter il vaJore decima'le ASCIJ cquivale1ire a
un. cararrer~ Aggiun?e ~: un'istruzi?ne in linguaggio mac d1in a che prenda in input una
srnn ~a e la 1mrn_agazz Lru ,m una specLfca locaz.ione della men1 oria del Simplerron. In qu ella
locauon~, la pr:1m a. mera della par~ la conterr il nLm1e.ro di caratteri inlusi nella srrio ga
(ovverosia, la sua lunghezza). Ogru me-zza parola successiva conterr un cararrere ASCU
e_s~resso. con un valo re decimale di due cifre . I.:isrruzione in linguaggio machina ~conver
t1ra o_gru c~tt~e nel suo equivalente ASCII e lo assegner alla mezz a parola.
b) Mod afi.cac e il _s1mulacore in modo che gesti sca l'ourpur deUe stringhe immagazzinate nel
f~rm ato des~ucr~ n~Ua parce_(g). Suggeri.mento: aggiungere al linguaggio macchina uniiscruz~one che visual1zz1 una scnnga com inciando da una cena locazione della memori2 dcl
~1 mp~tron. ln ~uella locazione, la prima met della parola co nterr il numero dei cararreri
lnclus1 nella srnnga (owerosia, la sua lung.h.ezza). Ogni mezza parola successiva conterr
un car~rrere ASCII C:Spresso con un v~lore decimale di due cifre. I..: istruzione in lingt.iaggio
~accbina co.nrrollera la l.unghezza e visualizzer la stringa, rraducendo ogni nu 111ero di due
cifre nel caraet~re equJvalence.

7 .30

CA PIT OL O

I ca ra tt er i e le stringhe
Ob iet tiv i

Che cosa far il seguente programma?


#include <stdio.h>

int mystery3 (const char *, const char *) ;

main ()
{

Essere in grad o di utilizzare le funzioni incluse nella libre ria per la


man ipol azio ne dei caratteri (cty pe).
Essere in grad o di ntiliu..are le fi1nzioni per l'inp ut/o utpu t delle strin ghe e dei
caratteri, incluse nella libre ria per l'inp ut/o u.t put star)dard (std io).
Essere in grad o di utilizzare le funzioni per la conversione delle strin ghe,
incluse nella Jibreria di utili t stan dard (std lib).
Essere in grad o di utilizzare le fi1nzioni per l'elaborazione dell e strin ghe,
incluse nella libreria per la man ipol azio ne delle strin ghe (str ing ).
Apprezzare la pote nza insit a nelle librerie di funzioni com e un mezzo per
otte nere la rius abil it del software.

char strin g1[80J, string2[80J;


prin tf( "Ente r two strin gs: ");
scanf('1%s%S, stringl , string2);
prin tf ("The resu lt is %d\n", mystery3(string1, string2)} ;

8.1

return 0I

1n ques to capi tolo pres ente rem le funz ioni incluse nella libreria Stan dard del C che sem -

i nt mystery3(const ohar *sl, const char *s2)


I

for ( ; *s1 I= '\0' && *s2 I= '\0' ; s1++, s2++)


if (*s1 I= *s2)
return 0;
\

Int rod uz ion e

plifi cano l,ela boia zion e delle strin ghe e dei cara tteri . Tali fi1nzioni co nsen tiran no al program ma di elab orar e i cara tteri, le strin ghe, le righ e di cesto e i bloc chi di mem oria .
Il capi tolo disc uter delle cecniche ucilizzate per svilu ppar e gli edic or di tes co, i wor d
processo r, i softw are per !~impaginazione, i siste mi com pute rizz aci .P er la co m posi zio ne
tipo graf ica e alui tipi di softw are per l'ela bora zion e dei tes . Le man ipol azio ni del res to
eseguire dalle fi1nz ioni per rinp ut/o utpu t form attat o, com e prin cf e scan f, potr anno essere
imp leme ntat e utilizzando le funz ioni discusse in ques to capi tolo.

return 1;
}

8.2

I concetti fondamentali delle stringhe


e dei car att eri

I cara tteri sono i m atto ncin i fond ame ntal i per la costrll2one dei program mi sorg enti .
Ogn i prog ram ma form ato da una sequ enza di caratteri che, qual ora sian o raggrupp ati in
mod o sign ifica tivo, sar inte rpre tata dal com pute r com e una serie di istru zion i da utili zzare per svol gere un com pito . Un prog ram ma potr cont ener e delle costanti di carattere. Queste
sono dei valo ri int rapp resen tati da un caranere post o tra apic i sing oli. li valo re della
cost ante di cara ttere co rrisp onde all' inte ro che gli sar stato asso ciato nell ' insi_e me dei
cara tteri della mac chin a. P er.esemp io 'z' rapp rese nc il valore inte ro di z e ' \n' quel lo
del cara ttere new line.

282

CAPITOLO

Una string a u11a serie di caratte ri trattat i come una singola unir. Una stringa potr
includ ere leuere , numer i e vari caratteri speciali com e +, - , *, / , $ e ranci altri. Nel lingua ggio C, le stringhe letterali o costanti di stringa si scrivo no tra virgol erre, co me nei se

guent i esemp i:
"John Q. Doe"
"99999 Main Street "
Walthal'I\, Massa chuset ts"
"(201) 555-12 12"

CARA1TE.RJ E LE STRINGHE

Buona abit11dirle 8.1


Assicuratevi che il vettore di caratteri iri cui immagazzi1zerete le vostre stringhe sia
dimensionato in trlodo tale da poter co11tenere qieella pit lztnga. ne n01'l pone li1niti lllla
li-tnghe:zza delle stringhe immagazzinate. Nei c~~ cl1e una strin~a ~ia pii ~ung~ del vett~re
in cui dovr essere iv1magazzinata, i caratteri in eccesso sosttt111ranno i dati merr1or1zza.ti nelle locazioni di memoria successive al vettore.

(un nome)
(un indirizzo)
(una citt e uno staro)
(un nt1mero relefonico)

Una string a porr essere assegnara a un vettor e utilizz ando _La funzi~ne scanf . Per
esemp io, la seguen ce istruzione assegner una stringa al vettor e di caratte ri word [ 20] :

Nel lingua ggio C una string a in realc un vettor e di caratte ri che termin a con li
carattere nullo (' \ 0 ' ) . Per accedere a un.a stri nga si utilizzer un punta tore ch far riferimen to a1 suo primo caratte re. Il valore di una string a corris pon.de lJ 'indiri zzo del suo
primo caratte re. Ne conse gue che nel lingua ggio C corret to afferm are che ttna stringa
un puntatore-. in effetti, un punta tore al primo caratte re della string a. In questo senso
le string he sono come i vettor i, poich anohe questi sono pu11ra to,ri aJ loro primo elemento .

scanf { h%s'', word) ;


La string a im1nessa dali' utence sar immagazzin ata in word . O sservate ch e wor~ u11
vettore, ovverosia un punta tore, e di conseguenza l'opera tore & non sar necessario con
l'argom ento word. La funzione scanf legger i carane ri finch no.n avr inconi;:rato _uno
spazio, un newlu1 e o l'indicaco~e ~ fine. del file. O~servate eh~ la lungh ezza .della ~tr1~ga
non potr superare i 19 caratteri poich si dovr lasciare lo spazio per quello di term1naz10ne (NULL).

Una string a potr essere utilizzata in una dichia razion e per inizializzare un vettor e di
caratte ri o una variabile di po char *. Le dichia razion i

Errore tipico 8.3

char color !] = ublue ;


bhar *colo rPtr = nblue ";

Trattare un carattere singolo come se fosse una stringa. Una strir~ga ttn punta~ore ed
quindi molto probabile che sia un i12tero comUlerevoLmente grande. Un car~~e, in~ec~,
un intero picolo (i valori dell'AS,CIJ sono co1rtpresi tra Oe 255). Su molti s1srem1 ci
provocher una "violazione di accesso ': perc~1 gli in1i.rizzi d~lla men:zoria bassa s~no
riservati per degli scopi speciali, come la gestione degli interrupt del sistema operativo.

inizializzeranno le rispett ive variabili con la stringa "blue . La prima dichia razion e creer
il vettor e color cl.i S eleme nti, conte nente i caratte ri ' b 1 , ' l ' , 'u 1 , 'e' e ' \ 0 '. La
second a dichia razion e creer la variabile di cipo punta tore color Ptr che far riferimenco
alla stringa blue irnmgazzinata da qualch e parte nella memo ria.

Errore tipico 8. 4

Obiettivo portabilit 81.

Fornire itn carattere co71'1e argomento di una fitnzio11e che ir1vece attende una stringa.

Alcuni compilatori potrebbero sistemare una variabile di tipo char * che sia stata
inizi.aliuata con una stringa letterale, in urla locazione di memor:ia in cui non possa essere
ntodifitata. irflmdgazzinate fle stringhe ktterali in vettori di caratteri, qualora abbiate
bisogno di modificarle e vogliate assici,rarvi di poterlfJ fare su tutti i sistemi.

Errore tipico 8.5


Fornire itna stringa come argorrlento di urta fitnzione che invece atte1ide un carattere.

Avrem mo potuto scrivere la dichia razion e del vettor e precedence anche in questo modo
char colo r[]= {'b', 'l', ' u ',

283

'e',

'\ 0 '};

Nd dichia rare un vettor e di caratt eri che debba conten ere una scringa, sar necessario
assicurarsi che il vettor e sia grand e a sufficienza per immag azzina re la string a e il caratte re
NULL di termin azione. La di chiara zione preced ente determ i ner autom aticam ente la dimensi one del vettore basandosi sul nume ro degli eleme nti inclusi nella lista degli inizializzatori.

Errore tipico 8.1


Allocare in un vettore di caratteri uno sp~io insufficiente a immagazzinare il NULL di
tenninazione della stringa.

8.3
\

La libreria per la gest ione dei caratteri

La libreria per la gestione dei caratteri includ e diverse funzioni che sv9lgono utili contro lli
e manip olazio ni sui dati di tipo carattere. Ogni funzi~ne ric~e come argom ento ~ carat~
cere, rappre sentat o da un int o un EOF. Come ~b~iam_o g1a ~~rmato nel Cap1rolo 4, _1
caratt eri sono gestiti ~pesso come se fossero deglt 1n ter1 pere.be tn C un caratte re cornspond e a un Lntero di un byre. Ricord ate che EOF c~~risponde _normalmen~e al v~ore - ~ ~
che alcune architetture hardw are non consenr.ono I 1mmagazz1narnenco di valon negactv1
nelle variabili di ci po char. per queste ragioni che le fu~zio11i per la ges~io~e. dei caratte ri
aattan o questi ultimi come degli interi. La Figura 8. J r1asswne le funzLon1 incluse nella
Libreria per la gestione dei caratteri.

Errore tipico 8.2

Buo1'1a abitudine 8.2

Visualizzare una "stringa che non contenga un carattere NULL di terminazione.

Dovrete includere ilfile di intestazione <ctyp e. h> qualora utilizziate Le funzioni cor1.tenute rzella libreria per La gestione dei caratteri.

CAPITOLO

Prototipo

Descrizione della funzione

int isdigi t ( int e)

Rescituisce un valore vero se e una cifra e O (falso) io caso

contrario.

int isalpha ( int e)

Resriruisce un valore vero se e una lettera e O in caso contrario.

int isalnum ( int e)

Rcm:ituisce un valore vero se e una cifra o una lettera e O in

caso contrario.

int isxdigi t ( int e) Restiniisce un valore vero se e una cifra esadecimale e O in caso
contrario. (Consultare l'Appendice E, nI sistell)j r1umerici", per
una spiegazione dettagliata dei numeri binari, ottali, decimaJi ed

~decimali).

int islower ( int e)

Restituisce un valore vero se e u11a lettera minuscola e O in caso

contrario.

int isupper ( int e)

Restituisce un valore vero se e una lettera maiuscola e O in caso

contrario.

int tolower ( int e}

Resrirwsce la lette ra mjnuscola corrispondente, se e una


maiuscola, e l'argomento inalterato in caso contrario.

int toupper {int e)


int isspace ( int e)

Restiruisce la lettera majuscola corrispondente~ se


minuscola, e l'argomento inalterato in caso conriario.

Restituisce un valore vero, se e un carattere ru spazio bian.c o


1
(newline ( \ n ' ), spazio ( 1 ) , salto pagina (' \ f 1 ) , ritorno
carrello ( r
tabulazione orizzontale ( t
o tabulazione
verticale ( 1 \ v 1 ) ) e O in caso co r1rrario.
1

int iscntrl(int e)

e una

),

R-estiruisce un valore vero se e un carattere di controllo e O in

c::aso contrario.

I 0ARA1TERJ E u : ~rRtNGHE

285

Il programn1a della Figura 8.2 ut'.limer. l,operat~re condizionale (?: ) in. c~m.bin~one
cn ognuna delle funzioni , per dererm111are se per ogni carattere conrrollaro dovra v1sual1zzar
la stringa is a o i.s not a . Per esempio, l'espressione
isdigit( 1 8 1 )?

11

8 is a

11
:

"8 is nota "

indica che se a 1 una cifra e quindi se isdigit rescicuisce il valore vero (diverso da
zero), sar visualizzata la stringa 11 8 is a ,mentre se 1 8 1 non una cifra e quindi se
isdigit restituisce 0, sar visualizzata la stringa 8 is not a .

/* usare le funzioni isdigit, isalpha, isalnum e isxdigit * /


#include <stdio . h>
~include <ctype .h>
main ()
{

printf( 11 %s\ n%s%s\ n%s%s\n\n", "According to isdigit: 11 ,


isdigit( 1 8 1 ) ? 11 8 is a " : 11 8 is not a 11 , 1'digit",
isdigit( 1 # 1 )? "# is a " : 11 # is nota", "digit '') ;
printf{ "%s \ n%s%s\ n%s%s\ n%s%s\ n%s%s \n\n", "According to isalpha: '' ,
isalp ha ('A
? "A is a n : "A lS
no t a " , "letter " ,
isalpha ( 1 b')? "bis a : "bis nota 11 1 "letter ,
isalpha('& )? "& is a " : "& is nota 11 , "letter " ,
no t a 1' , ~ 1etter " ),
isalpha('4
? "4 is a 11 : 11 4 is
printf( 11 %s\n%s%s\n%s%s\n%s%s n \ n 11 , "Accor d i' ng to isalnum : " ,
isalnum{ A
? "A is a " ' : "A is not a 11 1 "digit or a letter",

isalnum('8 1 ) ? 1' 8 is a 11 : " 8 lS


no t. a " , 11 d1"g1
. ' t or a letter",
isalnum ( 1 # 1 ) ? "# is a " : 11 # is not a " , ' 1 d ig1
t o r a 1et t e r 11 ) ,
p r intf ( 11 %s \ n%s%s \ n%s%s \ n%s%s \ n%s%s \ n%s%s \ n 11 ,
''Acoording to isxdigit:'' ,
isxdig it( 1 F 1 )? " F is a'' : 11 F is not a " "hexadecimal digit 11 1
isxdigit('J 1 )? ' J is a 11 : "J is not a ' l "hexadecimal digit ",
isxdigit ( 1 7 ')? '1 7 is a" : 0 7 iS not a " I "hexadecimal digit 11 ,
isxdigit( $') ? 11 $ is a " : 1'$ is not a " I hexadecimal digit " ,
isxdigit( ' f')? "f is a " : "f is nota" , "hexadecimal
digit Il);
return 0;
1

int ispunct ( int e)


int !sprint ( int e)

Restituisce un valore vero se e un carattere srampabile diverso


da uno spii.io, una cifra o una lettera, e O in caso contrario.
Restiruisce un valore vero se e un carattere stampabile, incluso
l spazio ('
e O in caso conrrario.
1

),

int isgraph ( int e}


Figura 8.1

Resciruisce un valore vero se e un carattere srampabile diverso


dalJo spazio (' ') e O in caso conrrario.

Tabella riassuntiva delle funzioni incluse nella libreria per la gestione dei
caratteri.

Il programma della Figura 8.2mostra1' utilizzo delle funzionj isdigit , isalpha, isalnum
e isxdigit. La funzione isdigit determina se il suo argomento un numero (0-9). La
funzione isalpha determina se il suo argomento una Jertera maiuscola (A-Z) o minuscola (a - z). La furuione isalnum determina se il suo argomento un numero, una lettera
maiuscola o una minuscola. la funzione isxdigi t determina se il suo argomento una
cifra esadecinJale (A - F, a - f , 0 - 9).

1
'

According t isdigit:
8 is a digit
# is not a digit
Aeic rd i ng to isalpha:

A ia a lett'er
b is a letter
& is not a letter
4 is not a letter
(continua)

286

u convert ed
7 con vert ed
Il $ con vert ed
" L conve r ted

t
to
to
to

Il

Accordi ng to isa l num:


A is a di git or a let ter
a is. a dig it or a lett er
# is not a dig i t or a lett er

Il

.
se
1S " ,
upp erca
. ..
se
1S
upperca
J

J
upp erca se l.S

low erca se 1S

to upp er( u ' ) ,


toup per ( 7
t oupper ( $
tolo wer ( L
1

Il

u converted to upperci!se
7 con vert ed t9 upper'Case
$
L

i~

prin tf ("%s\ n%s%s\ n%s%s\ n%s% s \ n%s%s\ n\ n" ,


"According to islo wer : ",
1
"p is not a ",
? "p i s a
)
p
(
er
i slow
"lowercase lett er n,
1
P i s not a '
P is a
) ?
P
(
islo wer
'
lowerca se lett er ",
1
,
' 5 i s not a
islo wer ( ' 5 } ? 5 i s a
"low erca se lett er
" ! is not a
? ! is a
i slow er {' !
11
low erca se let te r 11 ) ;
prin tf( %s \ n%s%s \ n%s%s \ n%s%s \ n%s% s \ n\ n",
Acc ord ing to isup per :
o is not an
isup per ( D ? ~ o i s an
'
"uppe r case lett er ",
? "d is an
isup per {'d
d is not an J
"upp erca se l ette r 11 ,
? 8 i s an
"8 is not an
isup per ( 8
'
up perc ase lett er '
? " $ is an
,
" $ is not an
i sup per { $
uppe rcas e lett e r '
p r int f ( "%s%c \ n%s%c \ n%s%c \ n%s% c \ n ' ,
11

11

1
'

11

11

Usa re islo wer , isup per , tolo wer e toup per.

La figura 8.4 mos ua l' utilizzo delle funzioni issp ace , isc ntr l, ispu nct , isp rin t e
isgr aph . La funz.ione issp ace dete rm ina se il suo argomen to uno dei seguenti cara tteri
ritQr no carrello ( \r' ),
salro pagi na ( ' \f ' ), newline ( ' \n
di spazio bianco: spaz io( '
1
\ v '). La funz ione isc ntr l dete rmi.n a se il suo
(
icale
vert
o
)
'
t
\
'
(
le
onta
orizz
tabulazio ne
argmenco un dei seguenti cara tteri cli conu ollo: rabulazio n oriz1 zontale ( ' \ t o 1verti1
1
1
) newline ( ' \ n ) . La
\ r
(
ello
carr
no
tor
ci
,
)
'
b
\
(
e
spac
cale ( ' \ v ' ) , allar me ( \a ' ), back
funz ione ispu nct determ ina se il suo argomen to u n carattere scampabile diverso dallo
spazio, da una cifra o da una lettera com e ad esempio $, #, ( , }, [ , ] , { , }, j , : , %, ec. La
fu nzione isp rin t dete rmjna se il suo argon1eruo un cara ttere che possa esse re visu alizzato
sullo sch erm o (incluso lo spazio). La funz ione isgr aph cont rolla gli stessi cara tteri di
!sp rin t escludendo lo spazio.

11

/ * Usare le fun zion i issp ace , isc ntrl , ispunct, isprint , isgr aph */

11

11

11

11

11

11

11

11

11

'

11

} ;

#i nclu de <std io . h>


#inc lude <cty pe . h>

11

),

11

11

) );

i$ 7

),

11

11

) ,

~qase;- is $
G.onv erts d to. uppe
<
converted to lowercase is 1

Figura 8.3

main ( )

11

Acepr.ding to i~ upper ~
o is an upper ~ase l~tter
d is ~ot an uppercase let ter
8 is not an uppercase lett er
$ is not an uppercase let t er

/ * Usare le fun zion i islo wer , isupper , tolower , to uppe r * /


#in clud e <std io.h >
#inc lude <cty pe . h>

),

Accord i ng to islower~
p is a lowerc~-se lett er
P is not a lowercase lett er
5 i$ not a lowe rcas e lett er
I i~ not a lower c as ~ lett er

Il prog ramma della Figura 8.3 mos tra l' utilizzo delle fu1izio11 i islo wer, isup per,
t~lower e toup per. La funzione islo wer dete rm ina se il suo a.l'.gon1en to una lettera
mm usco la (a-z ). La funz ione isup per determina se il suo argo men to una lettera mai uscol a (A-Z). La funz ione tolo wer converre una lettera maiuscola in una min uscola. Nel
caso che l'argome nto 119n sia wia lettera maiuscola, tolo wer lo restitui rebb e inalrerat o.
La funzione tou ppe r con verte una lette ra min usco la in una n1ai usco la. N el caso che
l'argomem o non sia una lerrera min uscola, toup per Jo restituire bbe invariato .

Usar e isd igit, isal pha , isalnum e isx dig it.

ret urn 0 ;

According to i sxd igft :


F is a hexadecimal dig it
J is not a hex.adeoinrl dfgi t
7 i s a hexadec i~al ~igit
$ i s not a hexadecimal dig it
f i s a hexadeeimal di git
Figu ra 8.2

28 7

CAAATTERl E LE STRTNGHE

main ()
{

"According to issp ace :" ,


prin tf ("%s \ n%s% s%s \ n%s%s%s \ n%s%s \ n\ n
i s a " : " is not a ,
"New lin e ", i.sspace( \ n )?
11
Horiz ont al tab " J
,
"
ter
rac
cha
"whi tesp ace
is not a "
is a :
?
is s pace ( \ t
'
(continua)
whi tesp ace cha rac ter
11

11

11

11

11

11

288

C APITO:LO 8

isspace{ '%' ) ? "% is a


"% is nota
'' whitespace character ");
printf ("%s\n%s%s%s \ n%s%s\ n\ n" , "According to iscntrl: " ,
"Newline ", iscntrl( \ n ' )? " is a " : " is nota ",
'' control Character " , iscntrl('$ ' ) ? '' $ is a " : "$ is nota
'' control character"};
printf( "%s\ n%s%s \ n%s%s \ n%s%s \ n\n " , "According to ispun ct : " 1
ispunct { ' ; ' ) ? "; is a " : 11 ; is not a ",
"punctuation character '' ,
ispunct ( 'Y ' ) ? "Y is a " : "Y is not a 1' ,
punctu ation charater ",
ispunct( #
? "# is a " : ' # is not a '',
np unctuation character '') ;
printf ( "%s\n%s%s\n%s%s%s\ n\ n" , "According to isprint: ",
is print ( ' $
? "$ i s a " : '' $ is not a ", "printing character " ,
"Alert " , isprint ('\a ' )? 11 is a" : " is nota ",
'' printing char~ter ") ;
printf("%s\ n%s%s \ n%s%s%s \ n" 1 "According t o isgraph: ",
isgraph (' Q'}? "Q is a " : "Q is nota ",
"printing character other tha n a s pace " ,
"Space " , isgraph ( ' ' ) ? is a " : " is not a ,
"pri nt ing characte r othe r t han a space'');
return 0;
11

11

11

8.4

Pr ot"tipo di funzione

Descrizione della funzione

double atof (const char *nPtr)

Converte la stringa nPtr in ur1 double.

int atoi(const char *nPtr)

Converte la stringa nPtr in un int .

long atol(const char *nPtr)

Convene la srringa nPtr in un long int.

double strtod(const char *nPtr, char **endPtr)


Converte la srringa nPtr in un double.
long strtol(const char *nPtr, char **endPtr, int base)
Converte la srringa nPtr i11 un long.
unsigned long strtoul(const char *nPtr, char **endPtr, int base)
Couverre la stringa nPtr in un unsigned long.

iscntrl:

Newline is a aontrol 'G'haracter


$ is not a contro! charaoter

According tQ ispunct:
; is a punctuation character
Y is nQt a punetuation character
# is a punctuat1:on character

According to isprint:
$ is a p.r.:inting character
Alert is not a printing character

Buona abitudine 8.3

Includete ilfile di intestazione <stdlib. h> quando utilizzate Le funzioni inclitse nella libreria di utilit generiche.
La funzione atof (Figura 8.6) restituisce il suo argomento (w1a stringa che rappresenta un
numfilo in virgola mobjle) convertito in un valore double. Nel caso che il valor.e convertir~ non
possa essere rappresentato (per esempio, qualora il primo carattere della srr1nga non sia un
numero) il comporta.mento della funzione atof sar indefinito.

/* Usa re atof *I

#include <stdio.h>
#include <stdlib.h >
main ()
{

double d;

Acc.Q rding to isqraph ~


a is a printing character other than a space
S,pace is net a p-Pinting charaeter ather th~n a SoPac-e
Figura 8.4

8.5 Tabella riassuntiva delle funzioni per la conversione delle stringhe incluse nella
libreria di utilit generiche.

According t9 1 s$p-ace:
N.e wline .i;s . a w(liteSfi>'E-e character
H.or~totrtal tab :L.s a wf:'titespao'e charapt r
% is nt a wtiite~pac~ ctiaractar

to

Le funzioni per la conversione delle stringhe

~ sezione presenter le fanz_io~i per la C(J1Wersione_ delle stringhe trarre dalla. ~ibreria ~~ util~t
gm:eriche (stdlib). Q~este funzi~ru convertono !e s:r1nghe formar~ da nwner1 1~ valor1 mcer1 e
in virgola mobile. La F1gura 8.5 riassume le funzioni per la ~nvers~on~ d~le s~mghe. Osservare l'utilizzo di const per dichiarare la variabile nPtr nelle mcestaZioru di funzione (che vanno
lette da desrra a sinisrra come "nPtr un puntatore a una costante di carattere"); const
dichiara che il valore dell'argomento non sar modificato.

figura

Accordio~

289

Q\RA'J"l'ERI .E LE STRINGHE

d =

at of( ~ 99 . 0, '' );

printf ( ''%s% .3f \ n %s% .3f \n~,

''The string \'' 99.0 \'' converted to double is '' , d,


"The converted value div ided by 2 is " , d I 2.0);
ret urn 0;

Usare isspace, iscntrl, ispunct, !sprint e isgraph.


}

(contint111)

290

CAPITOLO

29 1

CARTIERI E LE ST'R1NGl-IE

Th~

str 1rtg,

~ 99

l.onw

Tfre strino "1.0 00000" coru~erted to


iri~ iff 10000 00
lt'fe e<)nvertd \';alut di:via.ed l:ly 2 1-s 5'.00000

con"\i~r.tpa

te c:touble is 99 ;000
ifbe eonvl:trted v.alue d'i -vidd by 2 1s 49. 500
Figura 8.6

'

11

Usare atof.

Figura 8.8

La ft1ozione atoi (Figu.ra 8.7) restjruisce il suo argom~nco (una suinga di cifre che
rapprese.oca un intero) convertito in un valore int. Nel caso che il valore convertito non
possa essere rappresentato il comportamento della funzione atoi sar indefinito.

/* Usare atoi */
#iRciude <stdio.h>
#inciude <stdlib.h>

Li funzione strtod (Figl)!a 8.9) converte in un

val0re double una sequenza

di carar-

reri ehe ra.ppresenta un numero in virgola mobile. La funzione ricever due argomenti: Utia
stringa (char * ) e an. puntatre a una string.. La srrirtga coli.terr la seque.nza di caratteri
da ~onvertire in double. Al puntato re sar a~segn ata la locazine del primo carattere
SU<?<CeSSV9 alla porzio~e della stt.inga ch e sar Stata convertita. eisrruzQne
c;1

strtod ( string, &stringPtr);

tratta dal programma della Figura 8.9 in.dica c;he a d sar assegnaro il valore double
cenve.rtito da string, mentre a stringPtr sar assegnata la locazione del primo caraaere
successivo al valo.re cmv:ertiro (51 , 2) da stri ng.

main ()
{

int i

'

i= atoi( ' 2593 ~);


printf( "%-s96d \ n%s%d\ n
11
The string \" 2593 \" converted to int is 1' , i,
converted value minus 593 is r , i - 593);
return
1

11

,.

Y* Usare strtod

TJle stP'l:.ng

.
" ~,5/

~l\:Vertea

aonve rted t-0 'in:t . is

*/

#include <stdio.h>
#include <s tdlib.h>
main( )
{

rtt:e

Usare atol.

clOUbl.e d j
oha r *string = 51 .2% are admitted;
char *stringPtr;

~5:9S

value, mintJ'i. 59,a is 2'000

strtod(string, &stringPtr);
11
pr intf(~ The string \ %s\" i s converted to the \ n" ,
string);
printf( "double value %.2f and the string \ 11 %s\ ''\ n 1' ,
d, stringPtr);

cl =

Figur 8.7

Usare atoi.

La funzione atol (Figura 8.8) re,sricu.i.sce il syo argomemo (una stringa di cifre che
.rappr~$enta un numero jntero graqde) convertito in un valore long. N~ caso che il valore
convertito n.on passa essere rapp/esenra.to il oomportmenco di atol sar indefinito. 1.e
funzioni atoi e atol funzionera nno in modo iden tico qualra. gli int e i long siano
entrambi immagazzina:i in 4 byte.

return 0.;
.

/* U.sare atol */

'fti~ st ri ng ~51 .2& a-r-:e admift~dJf

#include .stdio . n>


#include <stdlib. h>

.do.utl

~irte 5'1

'2''

., a nd th

1-s

c~nveirtti 'to ttte

str~llg 11,i~ra tm:C'.tt~d"

main()

Figura 8.9

La fi1 11zione strtol (Figura 8.10) converte in un long una sequenza di caratteri che 14ppresenca un intero. La funzione ricever ere argementi: WJa stringa (char *), U.Q puntatore a
11na stringa un intero. La stringa conreri la sequenza di caratteri da convertire. Al puncator
t.lr assegnata la locazione del primo carattere successivo alla porzione ddla stringa che sar
scaca
r:intero indicher la base dd valore da co.aver:tire. ~istruzione
. convertita.
.

long l;
1 = atol( '' 1000000 '') i

printf( "%S%ld\n%s%ld\n'',
'' Th String \ 1000000\" co nverted to
' Th t onverted ~alue divid ed by 2 is
return 0;
11

~o ng
Il

'

int is " , 1,

1 I 2) ;

Usare strtod.

strtol(string,

& ~e mainderPtr ,

0);

trarc.a dal programma della Figura 8.10 india che a x sar ass~gnato il valore long convertito da string. Al secondo argomenro, remainderPtr, sar assegnata la parre rimanente

292

CAPffOLO

di string dopo la conversione . UriLzzare NULL come secondo argon1ento fa r in modo


che .il resto della srringa sia ignoraro. Il teJ;Zo argomento, 0, indica cl1e il valore da
convertire potr essere in un formato o reale (base 8), d ecimale (b.ase 1O) o esadecimale
(base 16). La base potr essere specificata come O o qua lsiasi alrro valore compreso tra
2 e 36. Consultate l'Appendice E, ccl sJstemi nL1mericin, per una spjegazione dettag1iara dei sistemi numerici otrale, decimale ed esadecimale. Le rappr~entazioni numeriche degli inreri nelle basi comprese tra 11 e 36 utilizzano i cararreri A-Z per rappresenrare i valori compresi era 10 e 35. Per esempio, i valori esadecimali possono essere
formaci dalle cifre 0-9 e dai caratteri A-F. Un. intero in base 11 pu essere formato
dalle cifre 0-9 e dal carattere A. Un incero in base 24 pu essere formaco dalle cifre 09 e dru cara.eteri A-N. Un incero in l)ase 36 pu essere formato dall e cifre 0-9 e da_j
caratteri A-Z.

I CARA'l'I ERI

E LE s rruNGHE

293

/* Usare strtoul */

#include <stdio.h>
#include <stdlib .h>
main ()
{

unsigned long x;
char *string = 0 1234567abc " , *remainde rPtr;

x = strtoul(st ring, &remainde rPtr, 0)i


printf(''%s \''%s\ ' \ n%s%lu\n%s\''%s\ 11 \ n%s%lu\n'',
''The original string is '' , string,
'The converted value is '', x,
The remainder of the original string is il,
remainderP tr,
"The converted value minus 567 is h ' x - 567);
return 0;
1

/* Usare strtol */

11

#include <stdio.h>
#include <stdl i b.h>
main()

long X.
'
char *string

The original string is q1234567abc"


The conv~rt~d v alue is 1234567
The rmander of th e origina! stri.ng is 11 abc 11
The converted value minus 567 is 1234000

= -1234567abc", *remainde r Ptr;


11

x = strtol(str ing, &remainde rPtr, 0) ;


printf("% s\"%s\"\ n%s%ld\ n%s\"%s\" \ n%s%ld\n " ,
"The originai string is , string,
'' The converted value is
x,
The remainder of the original string is
retnainde rPtr,
"The converted value plus 567 is '1 1 x + 567);
return 0;
11

11

Figura 8.11 Usare strtoul.

The origina! string is - 1234567abc ~


The converted vale is -1234_
5 67
The rernainder of the origi]ll s.-:tri n,g is abc 11
The converted value plus 567 is - 1234000
Figura 8.1 O Usare st rtol.
La funzione strtoul (Figura 8.11) converte in un unsigned long una sequenza
di caracteri che rappresenta un intero unsigned long. La funzion.e agisce in modo
identico a quello di strtol. Liscruzione

x: st r toul(stri ng , &rema in derPtr, 0 );


tratta dal programma della Figura 8.11 indica che a x sar assegn ato il valore unsigned
long convertito da string. AJ secondo argomento, &remaind erPtr, sar assegnata la
parte rimanence ili string dopo la conversione . U terzo argomento, 0, indica che il
valore da convertire potr essere in un formato ottale, decimale o esadecimale .

8.5

Le funzioni della libreria per l'input/o utput standard

Questa sezione presenter diverse ft.1nuoni tratte dalla libreria per l'input/out,p ut scandard
(stdio) e, in parcicolar modo, quelle per la manipolazio11e dei dati di tipo carattere e
stringa. La Figura 8.12 riassu me le funzioni p er l' inpuc/o urput delle stringhe e dei
caratteri incluse nella libreria per l,inpuc/out put scandard.

Bttona abitudir1e 8. 4
Includete il file di intestazione <stdio. h> quando utilizzate le fonzioni incluse nella
Libreria per LJinpittloutpttt standard.
Il programma della Figura 8.13 utilizzer le funzioni gets e putchar per leggere
u na riga di cesco dallo standard input (la casciera) e inviare i.n output in ordine inverso
i singoli caratteri della riga, usando una funzione ricorsiva. La funzione gets legger i
caratteri dallo scandard inpur e li immagazzin er nel suo argomento, un vettore di tipo
char, finch non avr incontrato u,n carattere newline o un Jndicatore di .fine d el file.
Un carattere NULL ( \ 0 ') sar accodato al vettore quando Ja lertura sar stata completata. La funzione putchar visualizzer il suo argomento di cipo carattere. U programma invocher la funzione ricorsiva reverse per visualizzare la riga ili testo in o rdine
inverso. Nel caso clie il primo cararcere del vettore ricevuto da reverse sia il carattere
NULL \0 ', reverse restituir il controllo alla funzione chiamante. In caso contrario,
reve-r-se sar invocata nuovament e con l' indirizzo del soctovecrore che incon1incia
1

I AMTfF.R f E LE S I RlNGHE

all'elemento s [ 1] , mentre iJ carattere s [ 0] sar inviaro in outpur con putchar quando la


chiamara ricorsiva sar srara completara. L'ordine delle due istruzioni nella porzione else
della strurrura i f cosrrioger reverse a raggiungere il ca.ratrere NULL di terminazione della
stringa, prima ch e possa sta mpare un qualsiasi carattere. Nel momento in cui saranno State
completare le chiamate ricorsive, i caratteri saran no inviati in output in ordine inverso.

else {
reverse(&s[ 1]);
putchar(s[0J);

294

CAPll.OLO

Descrizione della funzione

Enter a line of text;


Characters and Strings

int getchar(void)

Legge il prossimo carattere dallo Standard input e lo restituisce come valo re incero.

Thi! lioe prin.ted backwards i.s ~


stni.rts dna sretc:a.~ahC "

char *gets(char *s)

Legge i caratreri dallo standard input e li immagazzina nel


vettore s , finch non i11conrra un carattere newline o un
indicarore d i fine del file. Alla fine del vettore sar accodato
un carattere NULL di terminazione.

Enter a line of text:


able was I ere I saw elba

Visualizza il carattere immagazzinato in c .

int puts ( const char *s) Visual izza la stringa seguita da

lizzaro sullo sch ermo ma sar immagazzinato nel vettore s .

int sscanf(char *s, const char *format, .. . )


equivalente a scanf eccetto che l' input non sar lecco
dalla tastiera ma dal vettore s .

Figura 8.12 Le funzioni per i caratteri e le string~e incluse nella librerta per l'input/output
standard.

/* Usare gets e putchar */


#i nclude <s tdi9.h>

The line printed backwards is:


able was I ere I saw elba

un carattere di newline.

int sprintf(char *s, const char *format, ... )


equivalente a printf eccetto che l 'o utput non sar visua-

Prototipo di funzione

int putchar(int e)

Figura 8.13 Usare gets e putchar.


Il programma della Figura 8. 14 utilizzer le funzioni getchar e .put~ per leggere i
cuatteri dallo standard input, immagazzi narli nel vettore sentence e visualizzarlo come se
fosse una stringa. La funz.ione getchar Legger un carattere dallo standard input ~ lo
rescituit come un valore ir1tero. La funzione puts ricever come argomento una strrnga
(char '*) e la visualizzer facendola seguire da trn carattere di newline.
Il progra mma sm ercer di pren.d ere in input i cararteri q uando getchar avr letto il
newline immesso dall' ucenre alla fine della riga di testo. Un carattere NULL sar accodato al
'lfertoi:e sentence in modo cl1e possa essere trattato ome una stringa. La funzio 1te puts
visualizzer la stri11ga contenuta in sentence.

/* Usare getchar and puts */

ma in ()

#includ e <stdio .h>

char sentence [80 J;


void reve r se(char *);

main ()
{

char e, sentence[80J;
int i = 0;

printf( Enter a line of text: \n);


gets(sentence);

puts( ' Ente r a line of text : '') ;


while ( ( e = getchar() ) != '\n')
sent ence[i++] = e;

printf("\nThe line printed backwards is : \ n'' ) ;


r everse(sent ence) ;
return 0;

sentence[i] = '\0'; /* inserisce NULL alla fine della stringa*/


puts{ ''\nThe line entered was : ~) ;
puts{sentence) ;
return 0 ;

void reverse(char *s}


{

if

295

{ S [ 0]

==

return;

}
I

(continua)

CAPI TOLO

296
Enrer a l ine ot

I cARA.TfERI E LE STRfNGHE
char s[]
in t x;
f loat y;

te ~ t:

Tbis is a test .
Ttie !in.e
,. nter ed was:
Tni s is a t e s t .

/* Usare spri ntf */

'' 31298 87.3 75 n;

ssca nf(s , %d%f, &x, &y);


prin tf(n %s\ n%s%6d\n %s%8 . 3f \ nu,
"The valu es stor ed in char acte r arra y s are: ",
'' I nte g e r : " , x , "F1 oa t : '' , y ) ;
retu r n 0;

Figu ra 8.14 Usare gets e putc har.

Il ~ro~ della Eigura 8.15 utilizzer la fi1nzione spri ntf per riversare nel verrore di
caratten s '. dao ~ormattari. La funzione utilim le stesse specifiche di conversione di prin tf
(consultate il Capu:olo 9, per una disussione d~ttagliatadi tutte le potenzialitper la for.mattazioae
della stampa). Il programma ricever in inpu t un int e un floa t che dovra nno essere formaaati
e stampati nel vettore s . Quest'ultimo sar il primo argomento di spri ntf .

The a.lue s sto red in char act er


Inte ger': 312.98
8 7 . 3 75
.Float !

#inc lude <std io . h>

Figu ra 8.16 U sare ssca nf.

main ( )

8.6

char s[ 80 ];
int x;
f l oat y;
prin tf('' Ente r an inte ger and a floa t:\ nh) ;
scanf("% d%f'', &x, &y);
spri ntf( s, Int eger :%6d \nFl oat:% 8 . 2f, x, y);
pr intf( ''%S \n%s \ n 1' ,
''The form atted outp ut stor ed in arra y s is:'' , s);
retu rn 0;
}
~ nter

an inte ger and a floa t :

298 Bl. 87'~


The f ormatte d outp ut s to r ed in arra y s is :
29S
r:11 tege r:
87' . 35.
Float :

297

~r r a y

s are

Le funzioni per la ma nip ola zio ne del le stri ngh e


inc luse nel la libr eria per la ges tion e del le stri ngh e

La libreria per la gestione delle scru1ghe fornisce molre funzioni utili per manipolare le stringhe,
confrontarle~ ricercare in esse dei caratteri o altre stringhe, suddividerle in roken (separarle in

componenti Logici) e determinarne la lunghev..a.. Qt1esta sezione presenter le funzior per la


manjpolazioile delle stringhe tratte dalla libreria per la gestione delle stringhe. Le funzionj sono
riassunte nella Figura 8. 17.
Buona abituditze 8.5

Includete il file di intestazione <str i ng. h> quando utilizzate le fanzioni incluse nella libreria per la gestione delle stringhe.
Prot otipo di funz ione

Desc rizio ne della funz ione

Figu ra 8.15 Usar e spri ntf.

Il ~rogr~m~ della Figura 8.16 udlizzer la funzione ssca nf per leggere dal vettore di
caratteri s dei daa formarr.a. La funzione utilizza le stesse specifiche di conversjone di scanf .
Il progr~ma legger dal ' 'etrore s un int e un floa t e immagazziner i loro valori rispettivamente 111 x e y. In segui to i valori di x e y saranno visualizzati. Il vettore s sar il primo
argome.pxo di ssca nf.
/* Usar e ssca nf */

#inc lude <std io.h >


main ()
{

char *str cpy( char *s1, cons t char *s2)


Copia la stringa s2 nd vettore s1 . Restituisce il valore di s1 .
char *str no py{c har *s1, oons t char *s2, size _t n)
C9pia un massimo di n caratteri da lla stringa s2 nel vettore s1 .
Restiruisce il valore di s1.
1

char *str cat{ char *s1, cons t char *s2)


Accoda la stringa s2 al vettore s1 . Il primo carattere di s2 si sostituisce al NULL di rerminazione di s1 . Restituisce il valore di s 1.
char strn cat( char *s1, cons t char *s2, size _t n)
Accoda un massi mo di n caratteri dalla stringa s2 al vetto re s1 . Il
primo carattere di s2 sj sostitujsce al NULL di terminazione di s1 .
Restituisce il valore di s1 .
Figu ra 8. 17 Le funzioni per la mani polazione delle str inghe incluse nella librer ia
per la gesti one delle stringhe.

298

CAPITOl.O

La fun zion e strc py copia il suo secon do argom ento (una stringa) nel prim o, ovverosia
in un verto re cli carat teri sufficiente ment e grand e per imma gazzi nare Ja string a e il relativo
carat tere NULL di term inazi one. La funzione strn cpy equivalente a strc py, eccet to che
strn cpy specifica il num ero di carat teri che dovr anno essere ricop iati dalla strin ga nel
vetto re. Osse rvate che la funzi one st rncp y non ricop ier necessariam ente il carat tere
NULL di term inazi one dl suo seon do argom ento. Il cararrere NULL di termi nazio ne _sar
ricop iato, solta nto se il num ero dei carat teri da ricopiare sar supe riore alla lunghezza della
11 , il
t
tes
fosse
ento
argom
do
secon
il
ra
qualo
pio;
esem
Per
.
unit
t1nia
n.
alme
di
a
string
caraa ere NULL sareb be ricop iato soltanto se il teno argom ento fosse alme no 5 (4 carat teri
in tes t pi 1 NULL d i term inazione). Qual ora il _terzo argo ment o fosse stato magg iore di
5, al vetto re sareb bero sta:ti accod ati dei NULL fino al raggi ungim ento dd nume ro totale- di
carat teri speci ficato dal terzo argom ento.

Errore tipico 8. 6

299

I GARATrEru E LE STRINGHE
prin tf ( "The strin g in arra y z is:
retu rn 0 ;

%s\n ~ ,

z);

x is: Hapli)y airth day to VU


The strin g in arra y y is: Happy Birt hday to Vou

Happy Birt hday


is:
z
y
arra
'in
g
The strin

The >Stri ng in arra y

figu ra 8.18 Usare strcp y e strnc py.


/ * Ysar e strc at e strn at */

#inc lu de <s td io. h>


#inc lude <str ing.h >
main ()

Non accodare un carattere NULL di terminazione al primo argomento di una strn cpy,
qualora il terzo argo1nento sia minore o ugu.ale alla lunghezza della stringa indicata dal
secondo argomento.

char si [ 20] = ,. Happy ,. ;


11
;
Year
ew
"N
=
1
[
s2
char
char s3 [40 ]
-

Il prog ramm a della Figu ra 8. 18 uti l i~er strc py per ricopiare l'inte ra string a x nel
vettor~ y, ment re utilizzer strr:' lcpy per ricop iare i prim i 14 carat teri della string a x nd
1
1
vetto re z . Al vetto re z sar accodaco un carat tere NULL ( \0 ) perch l'invo cazio ne di
strn cpy nel prog ramm a non scriver un carat tere NULL d i termi nazio ne, dato cbe il terzo
argom ento infer iore alla lung hezza della stringa indic ata dal secon do argo mento.

La funzi one strc at accod a il suo secon do argom ento (una stringa) al prim o, ovverosia
a un veuo re di aratceri che conti ene una srr1ga. Il prim o carat tere deJ secon do argom ento sosti tuir il NULL ( \0 ' ) che term ina la sui11ga del ptin10 argom en to. Il prog ramm arere
dovr assic urarsi che il vetto re utilizzato per imma gazzi nare la prima string a sia sufficienteme nte gran de per imma gazz inare la prima strin ga la seco nda e il carat tere NULL di

prin tf( ''s1 = %s\ ns2 = %s\ n'' , s1, s 2);


prin tf( "st r cat( s1, s2) = %s\n~, strc at(s 1, s2)) ;
prin tf("s trnc at{s 3, s1, 6) = %s\ n", strn cat( s3, s1,
11
strc at(s 3, s 1));
,
%s\n
=
1)
s
(s3,
cat
r
("st
tf
prin
retu rn 0;

6) ) ;

s1
s2

= Happy

=New

Y~ar

strc at( s 1, s2) = Happy

term inazione che sar ricop iato ~Jla secon da stringa. La funzi one strn cat acco da .u n
num ero speci ficato di carat teri daIJa secon da strin ga alla prim a. Un carar rere NULL di
termi nazio ne sar accod ato auto matic amen te al risult ato. Il prog ramm a. della Figu ra 8.19
most ra l' utiliz zo delle funzi oni strc at e strn cat.

! l ii .

strn cat( s3, s1, 6)


strc t(s 3, s1)

N~w Ye~r

= Happy

= Happy

Happy New Vear

Figu ra 8.19 Usare strc at e strn cat.

/* Usare s trcpy e strn cpy * /

#inc lude <std io.h >


#inc lude <str ing. h >

8.7

main ()

Quesca sezio oe presenter le funzi oni per il conf ronto de~le strin ghe, strc~p e st.rncmp,
inclu se nella libreria per la gesti one delle strin ghe. Nella Figu ra 8.20 comp aiono le mtes tazioni e una breve descrizion e di entram be le funzi oni.

char x[] = "Hap py Birt hday to You " ;


char y[25 ], z[ 15J ;
printf(%s%s\n%s%s \ n,
"The strin g in arra y x is: , x,
~ The strin g i n arra y y is: ", strc py(y , x));
strn cpy( z, x, 14 );
Z[ 14 ] = '\ 0 1 j

Le funzioni di con fro nto incluse nella libr eria


per la ges tion e del le stri ngh e

Il prog ramm a della Figura 8.21 confrol1ter tre scri.ng he utilizzand o le ~zioni strom p
e strnc mp. La funzi one strcm p co nfron ta il suo prim o argo ment o con il seco ndo, un
carat tere per volta. La funzi one restit uir O qualo ra le strin ghe si~ o ugua li, un val.o re
la prim a
11egati vo qualo ra la prima sia mino re della secon da, e un ~alo re pos1t1vo qualo ra
sia m aggio re della secon da. La funzi one strnc mp eqwval~nte a strcm p eccet to c~e
strnc mp confr onta un nume ro di carat teri specificaro. La funzi one strnc mp non esegu u

300

CAPITOLO

~l confro~to con i caratt eri successivi al NULL in una string a. Il progr amma visualizzer
11 valore intero restitu ito da ogni chi amata di funzio ne.
Errqre tipico 8. 7
~resumere che strcmp e strncmp restituiscano il valore J qualora i loro argomenti

siano uguali. In caso di uguaglianza entrambe le funzio ni restituiscono O (il valore


falso ~n C).D i consegue12za, quando verificate l'uguaglianza di due stringhe per determtnare se siano uguali, il risultato di strcm p o di strnc mp dovr essere co11frontato con O.
Proto tipo di funzio ne

Descr izione della funzio ne

int strcmp(const char *s1, const char *s2)


Confr onta le s-rringhe s1 e s2. La filnzio ne restitu ir O, un
valore minore di O o maggiore di O qualo ra s 1 sia rispet tivamente uguale, mino re o maggi ore di s2.

int strncmp(const char *s1, const char *s2, size_ t n)


Confr onta un n1assimo di n caratt eri di s 1 con la string a s2.
La funzio ne restitu ir O, un valore minor e di O o maggi ore
dj O qualo ra s1 sia rispet tivam ente uguale , minor e o maggiore di s2.

Figur a 8.20 Le funzioni di confro nto delle string he incluse nella libreri a
per la gestio ne delle stringh e.

I* Usare strcm p e strncmp * /

cha r *s1 - "Happy New Year "


char *s2 -- ~ Happy New Year 11
cha r *s3 - 11 Happy Holid ays '1 ';
I

print f( "%s%s \ n%s%s\ n%s,s \ n\n%s%2d\n%5%2d \n%s%2d\n\ n" ,


as 1 =- " , s1, "s2 = 11 , s2, !'s3 = 11 , s3,
1
s2) - 0 , strcm p(s1, 52),
' strcm p(s1,
1
s3) - ", strcm p(51, 53),
' 5trcm p(s1,
"5trc mp(s3, 51) = ", strcm p(53, 51));
print f( "%s%2 d\ n%s%2d \ n%s%2d \ n'',
"strnc mp(s1 , 53, 6) - u , strnc mp(s 1, s3, 6) '
strnc mp(s1 , 53, 7) - , 5trnc mp(s1 , s3, 7)
'' strncmp ( 53, 51 7) -- " strncm p(s3, s 1 , 7) ) ;
retur n 0,
Il

Happy New Year


= ~appy New Year
&3 = Hap,py Holt days

s1
s2

strcmp(s1 , s2) =
strcm p(s1, s3) =
strc.rng ( s3 , s 1 I -=
strncmp(s1 1 s3,.
strncmp(s1, s31
&t Pncmp('s3, s1,

0
1

6) = 0
7) = 1
7) = -~

Figur a 8.21 Usare strcm p e strncm py.


Peir comp rendere esattan1ente cosa signif ica per una stringa essere "maggiore di" o
"mino re di>' un'alt ra stringa, consid erate il proces so di sistem azione in ordin e alfabe tico
di una serie di cogno mi. Senza dubbi o, il letto re sistem erebb e "Jones,, prima di "Smit h",
poich la prima lettera cli "Jones" preced e nell'al fabeto l'iniziale di "Smit h'' . Ma l'alfabeto pi che un sempl ice elenco di 26 lettere : U'n elenco ordina to di caratteri. Ogni
lettera occup a una posizi one specif ica all 'intern o dell'el enco. "Z" non sempl ieme nte
una lettera dell'al fabeto : "Z" la ventiseiesim a lettera dell'al fabeto .
M.a in che r:n9do il comp uter potr sapere se una partic olare lettera preced e un'alrra?
Tutti i cararr eri sono rappresentat i all' intern o d el comp uter co n dei codici numer ici;
nel mome nto in cui il comp uter confr onta due string he esso confr onta in realt i
codici nume rici dei caratt eri inclusi nel le stringhe.

I codici nt-tmerici interni usati. per rappresentare i caratteri potrebbero essere diversi st1.i
vari computer.

,.

30 1

CARATIERl E LE STRING HE

Obiettivo portabilit 8.2

#incl ude <stdi o .h>


#incl ude <stri ng.h>
main (}

Nel tent-avo di standa rdizzare Le rappre senrazio11i dei caratt eri, la maggi or parte
dei produ ttori di comp uter hanno proge ttato le propr ie macchine ir1 modo da utilizzare uno dei due schem i di codifi ca pi diffusi: l'ASC II o l'EBCDIC. A$Cl I l'acro nimo
di 'Me rican Stand ard Code for Inform acion Interc hange" (Codice Stand ard Amer icano per lo Scamb io delle Inform azioni ). EBCD IC l'ac.:ronimo cli "Exte nded Bi11ary
Coded Decim ai lnterc hange Code" {Codice di Scam bio D ecima le Codif icato in Binario Esteso). Esisto no altri schem i di codific~, ma questi due sono i pi diffus i.
L'ASC ll e l'EBC DIC sono chiam ati codici di caratteri o insiemi di caratteri. Le
manip olazio ni delle strin ghe e dei caratteri comp ortano in realt la manip olazio ne
degli appro priati codic i num erici invece dei caratt eri. Ci spiega J'inter scamb iabilit
dei caratt eri e dei piccol i inceri nel C. Dato che ha un senso afferm are che un codice
n t1merico maggi ore, minor e o uguale a un aluo codice nume rico, diven ta possib ile
mette re in relazio ne vari caratt eri o string he gli uni con gli altri, facend o riferim ento ai
codici dei cattt eri. I.:.Appendice D contie ne un elenco dei codic i utilizzati per i caratt~ri ASC II.

302

8.8

CAPITOL()

Le funzioni di ricerca incluse nella libreria


per la gestione delle stringhe

Questa sezione presenter le fi1nzioni incluse nella libreria per la gestione delle stringhe,
utilizzare per eseguire le ricerche di caratteri o di stringhe all'interno delle stringhe. Le
funzioni sono riassunte nella Figura 8.22. Osservare che le funzio ni strcspn e strspn
restituiscono un valore di tipo size_t . Il tipo di dato size_t definito dallo standard
come il tipo intero del valore rescituil:o daU'operarore sizeof.

Obietiivo portabilit 8.3

ll tipo size_t . u1i sinonimo, dipender1te dalla macchina, per unsigned long o
unsigned int.

Prototipo di funzione

Descrizione della funzione

char *strchr{const char *s, i nt e)


Individua la prima occorrenza del carattere e nella stringa
s . Qualora e sia srato trovato, sar restituito un puntatore
alla locai.ione di e in s . Altrimenci sar restituito un
puntatore NULL.

Descrizione della funzione

Prototipo di funzione

char strtok (char *s1, const char * s2)


Una sequenza di invocazioni di strtok suddivider la
stringa s1 in token" (componenti logici co~e, ? er esern~
pio, le parole in una r iga di test~) se~arac1 d~ cararter,1
co nrenuri-nella -suinga s2. La prtma 1nvocaz1one dovra
contenere s1 come primo argomento, mentre quelle susseguenti dovranno co ntenere NULL, .qualora si. ~esideri
continuare a suddividere la stessa su1nga. Ogru wvocazione res:tituir un puntatore al token corrente. Nel caso
non ci fossero pi token la funzione resticuir un NULL.

Figura 8.22 Le funzioni di r icerca contenute nella libreria per la gestione delle stringhe.

La funzione strchr ricerca in una stringa la prima occorrenza di un c:ratter~. Nel


caso eh~ questo sia staro ritrovato strchr r.esr.i~ UD puntatore alla locazione di quel
. ga altrimenti strchr resnrutra un punratore NULL. Il Programma della
carattere nell a Stnn ,
.
. ,
ila .
Figura 8.23 utilizzer strchr per ricercare la prtma occorrenza di a e z ne strmga
1

This is a test .

/ * Usare strchr /

s i ze_t strcspn(const char *s1, const char *s2)


D etermina e restituisce la lunghezza del segmento iniziale della stringa s 1 che non contenga nessuno dei earatteri ii1clusi in s2.

#inc lude <stdio . h>


#inclvde <string . h>

size_t strspn(co nst char *s1, const char *s2)


Determina e restituisce la lunghezza del segmento in!zia:le del la stringa s 1 che contenga sol tanto i caratteri
inclusi in s2.

main ()
char *string = "Th is is a test '
cha r characte r1 = 'a ' 1 character2
1

= ' z';

f ( st rch r ( st ring 1 character1) ! = NULL)


printf( "\ %c\ ' was found in \''%s\ " . \ n'' ,
character1 , string);
else
printf( "\'%c\' was not foun d in \"\s \" . \ n" ,
character1, string);

char *strpbrk(const char * &1, const char * s2)


Individua nella stringa s1 la prima occorrenza di uno
qualsiasi dei cararteri inclusi in s2. Qualora UD carartere della srri nga s 2 sia staro ritrovato in s 1, sar resti tui to un pun rarore al la lociz.ione di quel carattere nella
stringa s 1. Altrimenti sar restituito un puntatore NULL.

if (strchr(string, character2} I= NUL L )


printf( d\ 1 %c\ 1 was found in \"%s \" . \ n" ,
character2, string);
else
printf( ''\'%c\ was not found in \"%s \ '.\ n'' ,
character2, string};
return 0;

char *strrchr{const char *s , int e)


Individua l'ultima occorrenza di e nella stringa s . Qualora e sia stato rirrovaro, sar restituito un pu11tatore
alla locazione di e nella stringa s . In caso contrario sar
restituito un puntatore NULL.
char strstr{const char *s1, const ctlar * s2)
Individua la prima occorrenza della stringa s2 in s 1.
Qualora la stringa sia stara ritrovata, sar restituito un
puntato re alla locazione di s2 nella string s 1. In caso
contrario sar restituito un puntatore NULL.

303

CARA'l'l'ERJ E LE STRJNGHE

' a was fo.und i'l "Thi s i s a test ". .


z ' was not f ound i n rh s is a t~~t .
Figura 8.23 Usare strchr.

304

CAP'ITO LO

La funzione strcspn (Figura 8.24) determina la lunghez7:a del segmeoto jniziale della
stri nga indicata dal suo primo argomenro, che non contenga nessuno dei caratteri inclusi
in quella indicata dal suo secondo argomento. La fun7ione restituir la lunghezza del sudderro segmento.

305

l CAAAITllRI E I.E STRINGHE


'' is the first character to appear in ", string1};
r eturn 0;
}

tne

char acte r s in beware


' a ' is t he f irst character to aplfe-a r i n

Of

/ * Usare strcspn */

rhi s i s a t est '

#include <stdio . h>


#i nclude <string . h>

Figura 8.25 Usare strpbrk.


La funzione strrohr ricerca in una strin ga l' ultima occorrenza del carartere specifcat. Nel caso che questo sia staro ritrovato, strrchr restituir Utl pu n tatore alla locazione
di q uel carattere nella stri11ga, altrimenri strr.chr restituir un puntatore NULL. Il pro-

main()
{

char *st r ing1 : '' The value is 3.1 41 59'';


char *stting2 = "1234567890 '';
printf("%s%s\n%s%s \ n\ n%s\n%s%u",
stri ng1 = ", string1, "string2 = ", string2,
'' The length of the initial segment of string1
containtng no characters from string2 = " ,
strcspn(string1, string2});
return 0I

gramJI13. della Figura 8.26 ricercher l'ultima occorrenza dd carattere 'z' nella stringa "A

zoo has many animals includi ng zebras .

11

/* usare strrchr */

11
,

11

#include <stdio.h>
#i nclude <string.h>
main()
{

string1
string2

= The valua i s
= 1234567a90

char *string1
int c = ' z ' ;

3.14159

zoo has many animals including zebras'' ;

printf(,,%s\n%s '%c ' %s\ ''%s\''\n'',


"The remainder of string1 begin ni ng with the " I
11
e,
character
of
"last occurrence
1
1
i s : '1 1 s t r r c h r ( $ t r in g 1 1 c ) ) ;
'
r eturn 0;

The 11t,ngt:h q.l= tlte i ni tial segmerit of stri og1


contatning no har acte'rs f rom stri ng2 = 3
Figura 8.24 Usare strcapn.
. . La funzione strpbrk ricerca la prima occorrenza di un carattere qualsiasi della srringa
1nd1cara dal suo secondo argoment>" in quella indicata dal primo. Nel caso che un carattere
tra quelli inclusi nella srri nga indicata dal secondo argomento sia staro riuovaco, strpbrk
restituir un puntatore alla locazione di quel carattere nella stringa indicata dal primo
argomento, altrimenti strpbrk restituir un puntatore NULL. 11 programma della Figura 8.25 individuer in string1 la prima occorrenza di uno qualsiasi dei cararteri coorenuti in string2.

= ~A

Th remainder of stri ng f beg in ~ing with t he


l as t ocourrence of character z ~ i s ~ zebras
Figura 8.26 Usare strrchr.
La fun zione strspn (Figura 8.27) determinala lunghezza della parte iniziale della stringa
indicata dal suo primo argomento, che contenga soltanto i caratteri inclusi nella stringa
indicata dal suo secondo argomento. La funzione restiruir Ja lunghezza del segmento.

/* Usare strpbrk * /

#include <stdio.h>
#include <string .h>

/* Usare strspn */
#includ <stdio . h>
#include <string . h>

main()
{

ohar *string1
cha r *string2

= '' This is a test''


'
= "bewar e"
I

p r intf ( '' %s \ "%s \ " \ n '%c '%s \ n \ "%s \ '' \ n " ,

"Of the tharacters in '' , string2,


*strpbr k(string1, string2},

mai n ()
{

char *string1
char *string2

= ~ The value
= ''a ehilsTuv

is 3 . 14159 '' ;
'';

printf( 1'%s%s\n%s%s\n\n%s\n%s%u\n" 1

(continua)

CAPlTO LO

306

string 2,
Mstring 1 = ", string 1, ~ string2 =
"The lengt h of the initi al segment of strin g1",
~ containing only chara cters from strin g2 = ",
strsp n(str ing1, strin g2));
retur n 0;
11

string 1
strin~2

The via:lut is 3.14159

initi al segme nt of stripg 1


eonta inin,g only chara ct,rs from. strin g2 = 13

The lengt h of

~ne

Figur a 8.27 Usare strsp n.

La funzione strst r ricerca nella sCEinga ir.1dicaca dal suo primo argomento la prima occorrenza della stringa indicaca dal suo second o argomento. Nel caso che la seronda stringa sia srara
ritrovata all,inrerno della prima, sar rStiruito un puntatore alla locazione della seconda stringa
all'interno della prima. Il Programma ddla Figura 8.28 utilizzer strst r per ricercare la stringa
def. i.ti Il abcde f abcde f n

/ * Usare strst r */
#incl ude <stdi o.h>
#incl ude <stri ng.h>
main( )
{

char *strin g1
char *strin g2

11

'def

11

strto k(str ing,

11
);

assegner a token Ptr un puntatore al primo token individua:ro in strin g. Il secondo argomento di strto k, , indica che i token in strin g saran110 delimitati da spazi. La fi1nzione
strto k ricercher in strin g il primo carattere che non sia quello di delimirazione (lo spazio).
Questo carattere corrisponder all'inizio del primo token. In seguito, la funzione rice.rcb.er
1
1
) per
0
\
(
nullo
quello
con
ir
sostitu
lo
e
uente
susseg
e
nella stringa il ca:ratt:ere di delirnirazion
delimicare il token corrente. A questo punro, la funzione st rtok saJver un puntatore; aJ carattere successivo al token incliv:iduato in strin g e restituir un puncarore a quello corrente.

Per continuare a suddividere strin g, le invocazioni successive di strto k dovranno contenere NULL come primo argomenro. Largomenro NULL indica che 1'invocizione di strto k dovr
continuare la suddivisione in roken, cominciando dalla posizione all'inrerno di strin g salvata
durante l'ultima invocazione di strto k. Qualora non ci siano aJcri roke.11, strto k restituir un
puntatore NULL. Il programma della figura 8.29 urilizzer strto k per suddivide.re in token la
stringa This is a sente nce with 7 token s . Ogni coken sar visualizzaro separatamente.
O~rvate che la funzione strto k modifica la stringa ricevuta in input:; ru conseguenza, qualora
questa debba ~re ancora urilim ra all'interno del progra.1nrna dopo l'invocazione di st rtok,
sar meglio prepararne una copia.

#incl ude <stdi o.h>


#incl ude <stri ng.h>

11

print f( "%s%s\n%s%s\ n\n%s\ n%s%s\n",


strin g2,
str~ng1, "strin g2 =
"strin g1 =
"The remai nder of string 1 begi~ning with the",
"f irst occur rence of stri ng2 is: ",
strst r(str ing1 , strin g2));
11

11

/* Usare strto k */

= abcde fabcd et ;

roken, mentre gli spazi che separano le parole potrebbero essere consid eraci i cararreri di
c:fdimitazione.
Per suddividere una stringa in roken (presupponendo che ne conrenga pi cli uno), sar
neaa ria una serie cli invoqizioni di strto k. La prima invocazione cli strto k conterr due
argomen~: la sti:i nga che dovr essere suddivisa. in token e ~uella. clJe con terr i caraneri di
cldimitazione dei coken. Nel programma della Figura 8.29, l IStruz1one

token Ptr

= aehilsTuv

307

I CARA1TER1 E LE STRINGHE

main ()
{

char strin g[] =


char *toke nPtr;

'1 This

is a sente nce with 7 token s";

print f("%s \ n%s\ n\n%s \ n" 1


dThe strin g to be token ized is:'', strin g,
"The token are: "};

retur n 0I
}

string 1 = ab~databcdef
strin g2 = def

token Ptr

The remainder of string 1 . beginning with the


first ocul"r&nd' of strin ga iSt: .def~bcdef

while (toke nPtr I= NULL ) {


print f ( "%s \ n" , token Ptr);
token Pt r = st rtok ( NULL, " " ) ;

strto k(str ing,

11

11

);

Figur a 8.28 Usare strst r.

La funzione strto k utilizzata per suddividere una stringa in una serie cli token. Un coken
una sequen:za di caratteri individuata da caratteri di delimitazione (di soliro, spazi segni di
punteggiatura). Per esempio, in una riga di resto ogni parola potrebbe essere considerata un

retur n 0;
}

(continua)

CAPITOLO

308

Pr ot ot ip o di fu nz io ne

The st ring to be tokeni zed i s :


This i s a s ent e nce with 7 tokens

:t s

n)

e da
s1
da
ati
nr
pu
rri
ge
og
gli
de
i
ter
rat
ca
n
i
im
pr
i
ra
on
Co nfr
s2. La fun zio ne resritt1isce un valore uguale, mi no re o m ag gio o nu gre
1o
nir
1
le,
ua
ug
nre
me
va
cti
pe
ris
sia
s1
ra
alo
qu
0
di
regio re di s2 .

void *memchr{const void *s , in t e , si ze _t n)

senten-0e

o in u n
tit
er
nv
(co
e
di
a
nz
re
r
co
oc
a
im
pr
la
ua
vid
di
To
da
o
ar
nt
pu
o
ett
gg
ll'o
de
i
rer
rat
ca
n
i
im
pr
i
ne
)
ar
ch
unsigned
s . Q ualo ra e sia sta ro rit rovato , sar resriruito un pu nt ato re
tit uires
r
sa
o,
ari
ntr
co
so
ca
111
.
rto
ge
og
ll
11e
e
di
e
ion
zaz
alla loc
to t1n pu nta tor e NULL .

wi th
7

to lfns

Fi gu ra 8.2 9 Usare st rto k.

ia
or
em
m
a
ll
de
ne
io
az
ol
ip
an
m
la
er
p
ni
Le funzio
he
ng
ri
st
e
ll
de
ne
io
st
ge
la
er
p
ia
er
br
li
a
ll
incluse ne

.i11 qu est a
o
em
ter
sen
pre
e
ch
he
ing
str
lle
de
e
on
sti
ge
la
r
pe
ia
Le fun zio ni incluse nella lib rer
eQu
.
ria
mo
me
di
hi
c
blo
i
de
nto
ro
nf
co
il
e
ne
zio
sezion e facilitano la ricerca, la ma nip ola
in grado di
no
so
e
i
rer
rat
ca
di
e
h
ing
str
me
co
ria
mo
me
di
hi
cc
ste f un zioni rrarrano i blo
olanip
ma
la
r
pe
i
ion
nz
fi1
le
me
ssu
ria
0
8.3
ra
gu
Fi
La
ti.
ma nip ola re qualsiasi Wo cco d i da
lla
Ne
.
he
ing
str
lle
de
e
on
sti
ge
la
r
pe
ia
rer
lib
a
neU
e
zio r1e della me mo ria ch e ~o no inclus
nto a un
me
eri
rif
far
r
p~
o,,
ett
gg
o
ne
mi
ter
il
o
rem
use
ni
zio
trattazio ne delle su ddette fun
blocco di da ti.
rat i di tip o
hia
dic
10
aru
sar
i
ion
1nz
fi
e
est
qu
r
pe
ti
za
liz
uti
re
ato
nr
[ pa rametr i di tip o pu
iasi pu
als
qu
to
da
dj
o
tip
un
a
e
tor
nta
pu
uo
e
ch
to
vis
mo
vo i d *. Ne l Ca pitolo 7, ab bia
ere
ess

pu
to
es
qu
e
ch
e
*,
id
vo
o
tip
di
e
or
tat
n
essere assegnato dis ett am en te a un pu
o dj da to.
tip
i
ias
als
qu
uo
a
nto
me
eri
rif
cia
fac
e
ch
re
ato
llt
pll
un
asseg na to dir ett am en te a
a un
i
tor
nta
pu
i
dc
re
eve
rjc
o
nn
tra
po
ni
zio
fun
e
etr
dd
~u
pr op rio pe r quest o mo ti.vo ch e le
re
to
nta
pu
un
di
nto
me
eri
rif
il
ere
olv
ris
e
bil
ssi
po

q ualsiasi cipo di da to. D ato ch e no n


il nu mei
ch
ifi
ec
sp
e
ch
e
ieo
ns
me
ru
di
t
en
om
arg
un
ere
ev
ric
vo i d *, ogt1i funzione do vr
ole nip
ma
e
ion
sez
a
esr
qt1
i
d
i
mp
ese
gli
,
it
lic
mp
se
r
Pe
ro di ca rat teri (by te) da elaborare.
ran no so lo ve tto ri di caratteri (blocchi di ca rat teri).

Pr ot ot ip o di fu nz io ne

De sc riz io ne de lla fu nz io ne

_t
ze
si
,
2
*s
id
vo
t
ns
co
1,
*s
id
vo
t
ns
(co
mp
in t memc

The tokens ar e:
Th i s

8.9

309

CARATIER1 E LE STRll"1GHE

De sc riz io ne de lla fu nz io ne

void *memcpy(void *s1, co ns t void *s2, si ze _t

n)

ntato
pu
o
ell
qu
in
s2
da
ato
nt
pu
o
ett
gg
ll'o
da
i
ter
rat
ca
n
Co pia
da s1 . R esticwsce un ,p un tat ore all 'og ge tto ris ult an te.

void *memset(void *s , in t e, si ze_t n}

cararn
i
im
pr
i
ne
)
ar
ch
d
ne
sig
un
un
in
iro
ert
nv
(co
e
Co pia
og
ali
re
ro
nra
pu
n
u

sce
tuj
sti
Re
.
s
da
aro
nr
pu
o
ett
gg
ter i de ll'o
ge tto risulta n te.

e nella lib re ria


lus
inc
ria
mo
me
lla
de
ne
zio
ola
nip
ma
la
r
pe
ni
zio
Fi gu ra 8. 30 Le fun
per la ge sti on e delle str inghe.

dal
ato
nt
pu
o
ett
gg
ll'o
da
i
ter
rat
ca
di
to
ca
ifi
ec
sp
ro
me
nL1
1
La fu nz ion e memcpy co pia u1
un pu nta to re
ere
ev
ric

pu
e
ion
1nz
fi
La
o.
im
pr
l
da
to
nta
pu
o
ell
qu
in
su o seond.o arg om en to
or a i du e
al
qu
o,
nit
et
ind
r
sa
e
ion
nz
fu
a
est
qu
di
ato
ult
ris
Il
.
a un qu alsiasi tipo d i oggetro
og
sso
ste
o
all
o
an
ng
rte
pa
ap
i
ess
ra
alo
qu
ia
ros
ve
ov
og get ti sj soVTa ppongano in m e1no ria1
re s 1 la
tto
ve
el
n
.
e
iar
op
ric
r
pe
py
mc
me
r
ze
liz
uti
1
8.3
ra
gu
ge tto . Il pr ogran1ma de lla Fi

strtllg a co n ten uta 111 s2.


o
ert
gg
ll'o
da
te
by
di
to
ca
ifi
ec
sp
ro
me
n11
un
pia
co
,
cpy
La fu nz ion e memmove , co me 111em
esegw ta
sar
pia
co
La
o.
im
pr
l
da
to
nta
pu
o
ell
qu
in
to
en
om
pu nta to dal su o se co nd o arg
carat teri
ru
e
or
t
t
ve
un
in
.a
irn
pr
i
iat
op
ric
o
ser
fos
to
en
om
co me se i byte del secon do arg
a
un
di
a
pi
co
la

:ir
nc
nse
co

Ci
to.
en
om
arg
o
im
tem po ran eo e, qu ir1di, da qu esto 11el pr
po rzi on e di un a str ing a in un'alcra pa rte della stessa.

I * Usa re memcpy */
#i nc lu de <s td io .h>
#i nc lu de <s tr in g . h>
mai n( )
{

char s1 11 7] , s2 (]

void *memmove (voi d *s 1, co ns t void *s2, si ze _t n}

nt ato
pu
o
ell
qu
in
s2
da
ato
nt
pu
~o
et
gg
l'o
dal
i
ter
rat
ca
n
Copja
o
ett
gg
ll'o
de
i
ter
rat
ca
i
se
me
co
ita
gu
ese
r
sa
pia
co
da s1 . La
tem po rare
tto
ve
un
in
a
im
pr
i
iat
op
ric
o
ser
fos
s2
da
to
nta
pu
sce
tw
sti
Re
.
s1
da
to
nta
pu
o
ett
gg
ll'o
ne
to
es
qu
da
u,
inr
qu
neo e,
un pu nta tor e all'og getto risult ante.

- "Copy th is st r in g" ;

memcpy(s1, s2 , 17 );
pr i nt f (''%s\ n% s\' '% s\" \ n" ,
"A fte r s2 is co pi ed in to s1 wi th mempy,",
11
s 1 co nt ai ns ", s1 );
re tu rn 0;
}

{continua)

3 10

CAPITOLO

3 11

CARA'l'l ERl E LE. STRINGHE

H51 -- " I s1, "s2 = , s2,


"memcmp (s1, s2, 4) - '', memcmp(s1, s2 , 4),
"memcmp(s1, s2, 7 ) - '' , memcmp(s1, s2, 7) ,
"memcmp(s2, s 1 l 7) - , memcmp(s2, s1, 7));
ti

After s2 is cop1ed into s1 with memcpy,


s1 contains copy this string

return 0;

Figura 8.31 Usare memcpy.


}

Errore tipico 8.8

s1 = ABCDEFG

Escl1tdendo memmove, tutte le altre fanzioni per la manipolazione delle stringhe che copiano dei caratteri produrranno dei risultati indefiniti, qualora la copia avvenga tra porzioni della stessa stringa.

s2-= ABCDXYZ
memcinp(,s1, s2, 4) = 0
memetl'lp(s1, s2, 7) = 1
memrmlp(s2, s1~ 7) = 1
4

li programma della Fg ura 8.32 utilizzer memmove per Licopiare gli 11lrimi 1O byc;e del
vettore x nei primi 10 byte dello sresso.

/* Usare memmove */

Figura 8.33 Usare memcmp.

#include <stdio.h>
#include <string.h>

La funzio ne memchr ricerca la prima occorrenza d i un byte, rappresentato come un


unsigned char, in un numero specificato di byr-e di un oggetto. Nel caso che il byte sia
stato rrrovaco sar restituito un puncacore alla sua locazione all' interno dell,oggetto; altrimenti sa r restituito un puntaco re NULL. Il programma d ella Figura 8.34 ricercher il

main ()
{

char x[] = "Home Sweet Home " ;

carattere (byte) r nella stringa This is a st ring .

printf ( %s%s \ n" ,


"The string in array x before memmove is: " , x) ;
printf ( "%s%s\n",
'' The string in array x after memmove is: "
memmove(x, &x[5] , 10));

/ * Usare memchr */

11

#include <stdio.h>
jinclude <string. h>
main()
{

char *s

return 0

''T his is a string '';

printf(" %s \'%c\ ' %s\ "%s \ 1'\ n'' 1


'' The remainder of s after characte r
is found is " , memchr(s, ' r ' , 16 ));
return 0;

1
',

"
The string in arr.ay x 6efore
memmove is: Home Sweet Home
The siring in array x after memmove is: Sweet Heme Home
.
'

'

Figura 8.32 Usare memmove.

The remainder of s after character r is found is ring

La funzio ne memcmp (Figura 8.33) confronta un numero specificato di caratteri del suo
primo argomen to con quelli corrispondenci del seco ndo. La 1i.1nziooe rescituisce un valore
positivo se il primo argomento maggiore del secondo, O se so no uguali e un valore
negativo se il primo argomento inferiore al secondo.

Figura 8.34 Usare memchr.

/ * Usare memcmp */

numero specificato di byte dell'oggetto ,pur1rato dal suo primo <1rgom enro. Il p rogramma
della Figura 8.35 utilizzer memset per copiare 'b' nei primi 7 byc.e di string1.

#i nclude <stdio .h>


#include <s~ri ng . h >

__.

La fun zione memset copia il valore del byre indicato dal suo secondo argomento nel

memset */
#include <stdio. h>
#include <string . h>
/*

main()

Us~re

char s1[]

= ~ ABCDEFG '' ,

s2[]

'' ABCDXYZ " ;

main()
{

printf( "%s%s\n%s%s\ n \n~s%~ d \ n%s%2d \n%s%2 d \ n u,

char string1[15] - "BBBBBBBBBBBBBB " ;

{conti.nua)

312

CAPJTOLO

%s \ nu, string1 ) ;
printf (" string1 after memset = %s \ n'' ,
memset{string1, ' b' , 7));
ret urn 0;

313

I CARATfERI E LE. sr RrNGHE.

printf( ~ string1 =

La funzione strlen riceve un argomento di tipo stringa e restituisce il numero dei caratteri che la compongono, escludendo il NULL di rerminazione. 11programma della Figura 8.38

mestra l'utilizzo di strlen .


/* usare strlen * /

..

s-tring1 = 88BB81m8BBBBB8
string1 after memset = bbbbbbbBBBBBBB

#include <stdio.h>
#include <string.h>
ma in ( )
{

Figura 8.35 Usare memset.

char string1 = "abcdefghi jklmnopqrstuvwxyz " ;


char string2 = four'';
char *string3 = Boston
11

8.1 O Le altre funzioni della libreria


per la gestione delle stringhe

11

1
';

printf( "%s \ 11 % s \ 11 % s% lu \ n% s \ ' 1 %s \ %s%lu \ n%s \ ' % s \ '' % s% lu \ ~ ' ,


1

Le ultime due funzioni della libreria per la gestione delle srringhe sono: strerror e strlen.
La Figura 8.36 riassume- le ft1ozioni strerror e strlen.

"The length of " , string1, '' is


strlen(string1},
"The length of " , string2, " is " , strlen(string2},
"The length of ", string3,
is '' , strlen(string3) ) ;
11

11

Prototipo di funzione
char *strerror(int errornum)
size_t strlen ( const char *s)

Descrizione della funzione

return 0;

Traduce errornum in una stringa di testo dipende11re dal sisrema. Restituisce un puntatore alla stringa.
Determina la lungh.ezza della stringa s . Restituisce il
numero di caratteri che precedono il NULL di termi
nazione.

gestione delle stringhe.

La funzion.e strerror riceve il codice dj un errore, crea una string'<l che contiene il
relarivo messaggio e ne restituisce il pu11carore. Il programma della Figura 8.37 mostra
1urili1zo di strerror.
,.
/ * Usare strerror * /

#include <stdio .h>


#include <string .h>
main()
{

printf ( ri%s\n " , strerror(2));


return 0;
}

Errdr 2

Figura 8.37 Usare strerror.

Obiettivo portabilit 8. 4
I messaggi generati da strerror dipendono dal sistema.

The length of abcdefghijklmnopqrs tuvwxyz is 26

The length of four is 4


The lengtn of eoston ~ is 6
Figura 8.38 Usare strlen.

Figura 8.36 Le funzioni per la manipolazione delle stringhe incluse nella libreria per la

Esercizi di autovalutazion e
8. l
Scrivete una singola istruzione che esegua ognuna delle seguenti attivit. Supponete che le
variabili e (che immagazzina un carattere), x, y e z sianQ di tipo int, d, e e f siano di tipo f loat, ptr
siaru cipo char * e i verro ri s1 [100] e s2[100] siano di ripa char.
.
.
a) Convertite il cararrere concenuco nella variabile e in una leccera maiuscola. Assegnate iJ
risulcaco alla variabile c .
b) D eterminace se il valore della variabile e una cifra. Utilizzate l'operacore condizionale
come mostrato nelle Figure 8.2, 8.3 e 8.4 per visualizzare is a o is not a quando
stampate il risultato.
e) Convertite la stringa "1234567" in un long e visualimtene il valore.
d) D eterminate se il valore della variabile e un carattere di controllo. Utilizzate l'operatore
condizionale per visualizzare is a o is not a quando stampate il risulr~~o.
e) Leggete dalla castiera utJa riga cli testo e immagazzinatel.a oel vettore s1 . Non ut1l1zzare
scanf.
f) Visualizzate la riga di testo imn1agazzinata nd vettore s1. Non utilizzate printf.
g) Assegnate a ptr la locaz.ione dell'ultima occorrenza di e in s1.
h) Visi1alizzace il valore della variabile c. Non urilizzace printf.
i) Convercire la stringa "8.63582" in un double e visualizzatene il valore.
j) Determinace se il valore cli e una lettera. Utilizzate l'operatore condizior1ale per visualin.are
is a o is not a , quando stampate il risultato.
k) Leggete un carattere dalla castiera e im magaz.zinacelo neUa variabile c.

3 14

CAPITOLO

l CARA'l"I ERl

1) Assegnate a ptr la locazione della prima occorrenza ili s2 in s 1.


m) Derenninate se il valore delJa varia.bile e un C.'lfattere stampabile. Ucil izzace l'operacorc
condizionfile per visualizzare is a o is not a , quando stampare il .risultato.
n) Leggere tre valorj f loat dalla stringa 1 . 27 10. 3 9. 432 nelle variabili d, e e f .
o) Copiare nel verrore s1 la stringa immagazzinata in s2.
p) Assegnare a ptr la locazione della prima occorrenza in s1 di qualsiasi carattere di s2.
q) Confrontare la stringa in s 1 con quella in s2. Visualizzate il risultate.
r) Assegnate a pt r Ja locazione della prima occorrenza di e in s 1.
s) Ucilizzate sprintf per stampare nel vettore s1 i valori delle variabili intere x, y e z. Ogni
valore dovr ess~re stampato in 'un campo di lunghezza 7.
t) Accodate alla scringa s 1 1Ocararreri di s2.
u) Dere.rminate La lunghezza. della stringa contenuta in s1 . Visualizzare il r.sulraco.
v) Convertice la stringa -21 ~io un int evisuallzz.~rteneil val0re.
w) Assegnare a pt r la locazion.e del pruno coken di s2. I coken di s2 sono separati da virgolt:
(, ).

g) ptr = strrchr(s1, e);


h) putchar(c);

j)

c = getchar();
O ptr = strst r (s1, s2);
m) printf ( " 1 %c '%s printing cha racter \ n",
c, ispri nt (c) ? is a" : " is nota ")i

o) sscanf( "1. 27 10.3 9 . 432 " , "%:f%f%f", &d, &e, &f);


~

p)
q)

rj
s)
~

u)
v)
w)

8.2

char s 1(50] ="jack", s2[50] = "jill" 1 s3[50 ], *sptr;

8.4

printf ("%f\ n" , atof ("B.63582 ") ) ;


printf(" '%c'%slet ter\n" 1
e, isalpha ( c) ? " is a : is not a ) ;

Mostrare due merodi differenti per iniriali7.Zare il vettore di caratteri vowel con la stringa di
8.2
vocali "AEIOU .
C he cosa sar visualizzaro, se lo sar, dopo che ognuna delle seguenti istruzioni C sar srara
8.3
eseguica? Nel caso che un'isuuzione concenga un errore, descrivereJo e indicate come correggerlo.
Supponete che siano gi state effettuate le seguenci dichiarazioni di varia.bile:

315

E LE STRINGHE

strcpy(s1, s2);
ptr = strpbrk( s 1, s2);
pri ntf(" strcmp(s1, s2) = %d \ n", strcmp(s1, s2));
ptr = strchr(s1, c);
sprintf ( s1 , "%7d%7d%7d", x, y, z} ;
strncat(s1, s2, 10);
printf( "strlen(s1) = %u\ n", s t rien(s1)) i
printf( "%d\n", atoi( "-21 "));
ptr = strtok(s2, 1 );

char vowel [] - "AEIOU ";


char vowel [] ={' A ', 1 E 1 ,

1
,

0 ' , ' U', '\0 ' };

a) printf ( k%c%s", toupper (s 1 [0]), &s 1 [ 1]) ;


b) printt (%s 1' , str cpy (s3, s2));
~ printf( "%s", strat(strcat(strcpy( s3, s 1) , ~ and "), s2));
d) pri ntf( "%u 11 , strlen(s1) + strlen (s2)) ;
e) printf( "%u", strlen (s3))i

8.3

a) Jack
b) jill
c) jack and jill
d) 8
e) 13

Trovare l'errore in qgnuno dei seguenti segm.enri di programma e spiegate come correggerlo:
a) char s(10];
strncpy(s, "hell", 5);
printf("%s\n" J s)
1
-

8~4

) Errore: .la .funzione strncpy non inserir un carattere NUl-L di cerminaz.io11e nel vectore s ,
perch il. SllO cerzo argo1nenco uguale alla lunghezza della strir1ga hallo .
Correzione: cambiate il cerzo argomenco di st rncpy in 6 o assegnate 0 a s [ 5] .
b) Errore: re11cacivo di visualizzare una ~ostance di tipo carattere come se fosse una stringa.
Correzione: usate %e per inviare in outpur il carattere, oppure soscinuce ' a con a.
c) E rrore: il vectore di caratteri s non sufficientemence grande per immagazzinare il NULL di

cernunaz1one.
Correzione: dichiarare il vettore con un numero maggiore di elementi.
d) Errore: la funzione strcmp restituisce Oqualora le stringhe siano uguali; di conseguenza, la
condizione della scrunura i f risulcer falsa e la printf aon sar eseguita.
Correzione: neJJa condizione, confronrare il risultato di strcmp con 0.
1

b) printf("%s ", 'a ' ) ;


e) char s [ 12] ;
strcpy(s, w~lcome

Home~);

d) if (st rcmp(string1, string2))


printf( "The st ring s are equal\ n"};

Risposte agli esercizi di autovalutazion e


8.1

aj c = toupper{c);
b) printf( M1 %c 1 %sdigit\n ",
t ( c) ? ,, is a ,
e , isdim
l::I~

Esercizi
:

11

i'

s not a

"

) '

e) printf ("%ld\n", atol.( 11 1234567"));


d) printf {"'%c '96scont rol character\n",
is nota ");
c, isntrl(c) ? n is a :
Il

e) gets(s1);
f) puts(s1);

Scrivete un progra mma che prenda in input dalla tastiera un carattere e lo con trolli con
0gnuna delle funzioni incluse nella libreria ,per Ja gestione dei caracreri.. Il programma dovr visualizzare
li valore resriruiro da ogni funzione.

8.5

Scrivere un programma che prenda ln inpilt una rip di ~sro con la funz.ioM ,.ti e la
8.6
immagazzini nel vettore di caracceri I [ 111) . Inviate in ootpu.t Ja riga prima in lettere ma.iUICOlc e poi
in minuscole.

CAPITOLO

316

Scrivete un programma cbe prend a in inpur 4 scringhe che rappresencino degJi interi, le
8.7
converta in interi, som mi i v.alori otcenuri e visualizzi il loro cotale.

8.8 . Sccivece un ~rogramma che prenda in input 4 stringhe che rappresencino dei valori in virgola
mobile, le converta 1n double, sommi i valori ottenuti e visualizzi il loro corale.
8.9 , Scrivere un progra1nma che util izzi la funzione strcmp per co.nfronrare due stringhe immesse
dal I urence. Il programma dovr stabilire se la prima seri nga minore, uguale o m~.ggiore della seconda.

8. 1O Scrivete un programma che ucilizzi lafi1nzione strncmp per con&oncare due stringhe immesse
dall 'ucence. Il programma dovr ricevere in inpuT il numero di cararreri da confronra:re e dovr stabilire
se la prit11a stringa niinore, uguale o 1naggiore della seconda.
8.11 Scrivete un programma che utilizzi la gnerazione di n-11n1eri casuali per creare delle frasi. li
programma dovr u liz1.are quatuo vercori di puntatoci a char chiamati article , noun, verb e
preposi tion e dovr creare una frase selezionando una parola a caso da ognuno dei vettori nd
seguence ordine: article, noun, verb, preposition, article e no un. Man mano che selezionare le
singole parole quesce dovranno essere c0n.cacenac:e a quelle precedenti, in un verro.ce che sia sufficinremenre grande per contenere la frase in cera. Le parole dovranno essere separare da spazi. Quando la
frase finale sar inviata in output, q_uesca dovr incominciare con una lercera n1aiuscola e terminare con
un punto. Il programma dovr generare 20 frasi.
I vettori dovranno essere riempiti come segue: article dovr con cenere gli articoli the , a ,
"one , 'some e ' any' ; noun dovrconcenereinomi 'boy , g1r1 , dog, town e car" ; verb
dovr contenere i verbi 'drove , 'jumped ", ran, walked ' e "skippe d' ; preposi tion dovr
contenere le preposizioni to , f rom , ove r , un de r e on .
Una volca che il suddetto programma sar scato scrirco e sar funzionante, modi:fcacdo in modo
che scriva una breve scoria formata da una serie cli queste &asi. (Vi piace l'idea di uno sccirtore casuale?).
8.12 (Li11urick) Una limeciclc una poesia umoristica di cinque versi in cui il primo e il secondo
verso fa nno rima con il quinro, menrre il rert-0 fa rima con il quarto. Usando cecnicbe simili a quelle
sviluppa ce nell'Esercizio 8.1 o, scrivete un programma e cbe produca una serie dj Limerick a caso.
R~in~e questo programma in modo che generi delle buone limerick sar un compi to impegnativo,
ma 11 risulcaco varr bene la fa.cica farca!
>

8.1.3

Scri~ete un programma che codifichi delle frasi della lingua inglese in pig Lacin (Latino del

maJale). ll pJgLarin una forma dj linguaggio c::odifcato usaco spesso per diverrimenco. Esistono molre
versioni dei metodi utilizzaci per forma.ce delle frasi in pig Lacin. Per semplicit, utilizzare il seguence
algoritmo:
Pe.r formare una &ase in pig Larin formulatene una in lingua inglese e suddividetela in parole con
La funzJone strtok. Per tradurre ogni.parola inglese ndla corrispondente in pig Latin, spostare la prima
lettera de~la parola inglese in coda alla scessa e aggiungere le lertere ay . ln queSto modo, la parola
' 'hetay e comput er diverrtr omputercay .
jump divenr:era' ump j ay , ' th e s1 trasfo rmeram
Gli spazi rra le parole rimarranno tali. Supponete quanto segue: la frase in inglese consiscer di parole
separace da sp~, non ci saranno segni di punteggiatura e rurce le parole saranno formate da due o pi
let~ere. La ~z1.0ne printlat inWord dovr visualizzare ogni parola. Suggerimenro: ogni volca che una
chiamata di strtok avr- trovaroun token, passate il ,puntatore ortenuco alla funzione printLat inWord
e visualizUtte Ja parola in pig Latin.
8 . 14 Scrivete un programma che prenda in input llD numero t elefonico in una stringa del formato
(555) 555 - 5555. Il programma dovr ulimre la fi1ozione strtok per estrarre il roken del prefisso,

quello delle prime tre e delle ultime quarrro cifr.e del numero telefonico. Le serre cifre del numero
tdefonico dQvranno essere concatenate in una stringa. li programma dovr convertire iJ prefisso in. UD

1 CARATTERI E LE STIUNGHE

317

int e la stringa del 11wnero Lelefo nicq in un long. Dovranno essere visualizzare enrran1be le informazioni: prefisso e numero celcfonico.
8. 15 Scrivere un programma che prenda in input lilla riga cli resto, la suddivida in roken con la
funzione strtok e li invii in ourput in ordine inverso.
Scrivere un program ma cl1e prenda in input dalla tastiera una ga di cesto e una srringa di
ricerca. Utilizzando la funzione strstr, individuare la pcin1a occorrenza della srrnga di ricerca t1ella
riga di resro e assegnate la locazione ottenu ta alla variabile searchP tr di ripo char *.Nel caso che la
suinga cli ricerca sia srara rirrovara, cominciando da questa, visualizzate la riga cli resto. Urilizzare quindi
nuovamente strstr per individuare nella riga di resco la successiva occorrenza della stringa di ricerca.
Nd,aso che sia srata trovata una seconda occorre.tlza della stringa di ricerca, visualizzate la riga cli cesco
cominciando dalla seco nda occorrenza. Suggerin1ento: la seconda nvocazio ne di strstr dovr co ncenere searchP tr + 1 come suo primo argomento.

8.16

8.17 Scrivete un programo1a, basato sull'E.scrcizio 8. 16, che prenda in inpuc di verse righe di cesco
e una scri11ga di ricerca e utilizzi la funzione strstr per determin are il corale delle occorrer1ze della
suinga nelle righe di testo. Visualizzare .il risulcaro.
8.18 Scrivere un programma che prenda in input diverse righe di testo e un carar:cere da ricercare e
utilizzi la funzione strchr, per determinare il cotale delle occorrenze dcl cararcere ne.Ile righe cli resto.
8.19 Scrivece un programma, basaro su quello dell'Esercizio 8. 18, che prenda in inpuc cliverse righe
di cesto e utilizzi la fu_nzione strchr per der:erminare il corale delle occorrenze nelle righe di testo di
ogni carattere incluso nell'alfabeto. Le lettere maiuscole e qL1elle mint1sco le dovranno essere co ntate
insieme. Tmmagazzinate i corali di ogrlettera in un vercore e, una volta che saranno stati decerrr1inaci,
visuali1.zace i suddetti valori in un formato tabulare.

Scrivere un programma che prenda in input diverse righe di resto e urilizzi la funzione strtok
per c0:0rare il n111nero totale delle parole. Supponece che queste siano separace da spazi o da caracteri

8.20

newline.
Utilizz.ace Je funzioni cli confronco delle sninghe discusse nella Sezione 8.6 e le tecniche di
ordinamento dei venori sviluppate nel Capitolo 6, per scrivere un programma che clisponga in ordine
alfabetico un elenco di srringbe. Utilizzate i nomi di 10 o 15 cict della vosaa wna come dati per il

8.21

pro,gramma.
La tabella nell'Appendice D mostra le cappresen razioni in codic.e nun1erico dei cararreri del,.
l'insiemeASCTJ. Srodjace quesca cabella e quincli stabilire se ognuna delle seguenti afferm~oni sia vera

8. 22

o falsa.

a) La lercera "A" precede la "e".


b) La cifra ng" precede lo "0".
c) l simboli comunemence urilhzaci per l'addizione, la sottrazione, la 1nolriplicazion.e e la
divisione precedono rune le cifre.
d) Le ci&e precedono le lettere.
e) Nel caso che un programma di ordinamento ordinasse delle srringhe in modo ascendence,
allora quel programma sisremerebbe il simbolo dell a parentesi ronda chiusa prima di quello
della prentesi tonda aperta.

8.23

Scrivere UD programma cl1e l~gga una serie di sainghc e visualizzi solo quelle che iniziano con

laJercera "b".
8.24 Scrivere llD programma cbe legga una serie di sainghe e visualizzi solo quelle che terminano
con le lertere "ED?'.

318

CAP ITOLO

8.25 Scrivete un programma che prenda in input un codjce ASCII e visual izzi il cararrere corrispondente. Modificate questo programm a, in modo che generi rutti i possjbili codici di tre cifre compresi
ndf intervallo da 000 a 255 e tenti ili visualizzare il carattere corrispondent. Che cosa succeder
quando ques~e programma sar esegt.tito?

3 19

("JJlATfERl E LE STRINGHE

b) Scrivete un programma che legga diverse righe di resco e visualizzi una tabella indicante il
nu1nero di parole fo rmate da una sola lettera, da due, d,a tre, ecc che appaiono nel resro. Per
esem pio, la frase

Whether 'tis noble r in the mind to sutfer

Usando come guid-a la rabella dei caratteri ASCildeJJ'Appendice D. scrivete le vosrre versioni
delle funzioni per la gestione dci caratteri presentare .nella Figura 8.1.
8.26

conc1ene

8.27 Scrivete le vostre versi-0ni delle funzioni per I.a conversione delle stringhe in numeri presenTate
nella Figura 8.5.

Lunghezza della parola

Occorr-enze

8.28 Scrivete due versioni di ognuna delle funzioni per la copia e la concateoazio n,e delle stringhe
presentate nella Figura 8. 17. La prima versione dovr utilizzare gli ind ici di vettore, mentre la seconda
dovr utilizzare i puntatori e Ja relativa arltm.etica.

1
2

3
4

2
2 (indusa 'r1s)

8.29 Scrivere le vostre versioru delle funzioni getchar, gets, putchar e puts descritte nella Figura 8.12.

8.30 Scvete due versioni per ognuna deUe funzioni per la comparazione delle stringhe presentare
nella Figura 8.20. La prima versione dovr uciJizza re gli indici di vettore, me:n rre la seconda versione
dovr utilizzare i puntatori e la relativa aritmeca.
8 .31

c) Scrivere un programma cl1e legga diverse righe di resto e visualizzi una tabella indicante il
numero di occorrenze nel cesto di ogni parola diversa. La prima versione del vostro programma dovr includere le parole nella tabella sistemandole nell'ordine in cui ql1este
compaiono nel rcsro. In seguito , provate una visualizz..1zione pi in reressante (e ule) in
cui le parole siano ordinare alfabeticamente. Per esempio, le righe

Scrivere le vostre versi0ni delle funz.ion.i di ricerca nelle stringhe presentate ndla Figura 8.22.

8.32 Scrivere le vostre versioni delle fun zioni per la manipolazione dei blocchi di memoria presentate nella Figura 8.30.

To be, or net to be: that i s the question :


Whether ' tis nobler in the mind to suffer

8.33 Scrivere due versioni della funzione st rlen presentata nella Figt1ra 8.36. La prima versione
davr uJizz.are gli indici di vettore, mentre la seconda dovr utilizza re i puntatori e la relativa aritme
nca.

11

contengono l a parol a "to ere vo Ire, "be" due voI"te, "or" una, ecc.

Sezione speciale: esercizi di manipolazione avanzat a


delle stringhe
Gli esercizi precedenti sono stati incenerati sul resto progettaci per verificare la vostra comprensione
dei ooncetti fondamentali della manipolZione delle su.inghe. Questa sezione includer una collezione
di problemi di livello intermedio e avanzato. li lettore dovrebbe trovare questi problemi impegnarivi,
ma anche divertenti. La diffiolt dei problemi varier considerevolm ence. Alcuni richiederanno un'ora
o due per la scrittura del pro,gran1ma e per l'implementazione. Altri saranno utili per arcivir di
laboratorio eh.e potrebbero richiedere due o ere settimane per lo studio e per l'implemenrazione. Altri
ancora so,no progetti che vi impegneranno per un intero trimestre.

8.34 (Analisi del te!to) La disponihilit. dei computer, con le loro capacit di manipolazione delle
stringhe, b.a prodotto alcuni approcci piuttosto inreressanti per analizza re gli scritti dei grandi auto.ci.
Molta attenzione stara concentrata sul sosperco che William Shakespeare non sia mai esistito. Alcuni
srudiGsi ritengono che ci siano valide dimostrazioni secondo le quali Chriscopher Matlowe avrebbe
se.ritto in realt i capolavori attribuiti a Shakespeare. I ricercatori hanno utilizzato i computer per
trovare delle somiglianze neglj scritti di ques due auroi:i. Questo esercizio ~iner tre metodi per
analizzare i cesti con il computer.
a) Scrivete un programma che legga diverse righe di resto e visua lizzi ana tabella indicante il
numero di occorrenze nel cesto per ogni lettera delJ' alfabeto. Per esempio, la frase
To be, or not to be: that is the question :

contiene
una ''a>J , due "b>', nessuna et c, , , ecc.

'

8.35 (Elaborazione dei testi) I: approfondimento dedicato al la manipolazione delle stringhe in questo. libro da attribuire i.a gran parce all'emozi.o nante sviluppo dell'elaborazion e dei testi negli anni
ree-enti. Una funzione imporrante per i sistemi di elaborazione cesti la giustificazione tipografica:
l 'allineamento delle parole al margine sinistro e a quello destro della pagina. La giusficazione cipogralca genera un aspetto professionale del documenco, dando l'impressione che sia staro imposrato in
tipografia piuttosto che preparato su una macchina per scrivere. Sui compurer la giustificazion e
tipografica pu essere realimra inserendo uno o pi cirarreri di spazio tra ognuna delle parole presenti
in una nga, in modo che quella pi a destra sia ali ineara con il margine destro.
Scrivere un programma che legga diverse righe di tesco e le visualizzi con una giustificazione
cip0grafca. Supponete che il testo debba essere stampato su un foglio larg 8 pollici e mezzo (215,9
millimetri) e che, a sirustra e a destra della pagina scatnpaca, debba essere lasciaro un margine di un
pollice (25,4 millimetri). Suppoaece anche che il compucer scampi J O caratteri per. pollice. Di conseguenza, il vostro programma dpvr stampare 6 pollici e mezzo di cesco (165,1 millimetri), ovverosia 65

caratteri per nga.


8.36 (Visu.(l,lizzare le date in variforrnati} Nella corrisponden za co n1rnerciale le date sono visualizzare
di soJiro in molri formati . Due dei fo rn1ati pi cotnuru sono:
21 / 07 /56 e 21 luglio 1955

Scrivere un program ma che legga una daca nel primo formaro e la visualizzi nel secondo.
8.37 (Protezione degli assegni) MoJco spesso i computer sono impiegaci in sistemi per la compilazione
degli asse.gni, come le applicazioni per la gestione degli stipendi e per la contabilit del debito. Circolano molte strai1e scorie secondo le quali sarebbero stati scampaci {erroneamen te) degli assegni per la
paga settimanale con cifre he superino il 1nillone di dollari. Qu.elle strane cifre sono scampate dai

CAPITOLO

320

sistemi co mpure rinaci per La compilazione degli assegni solo a causa di errori umani e/o di dererioramenci della macchina. l progecrisci dei sistemi, naruralmence, fanno rutto il possib ile per implementare
nei propri sistemi dei co n.crolli che prevengano l'emi~sione di assegni sbagliati.
Un alcro grave proble ma l'alterazione intenr ionale de1J'ia1porto di un assegn o da parte di
qualcu no che intenda incassacloin modo fraudole nto. La maggior pane dei sistemi compu terizzaci per
la compilazione degli assegru impiegano una tecnica chiamata protezione degli assegni, proprio per
prevenire l'alterazione dei lore imporri.
G li assegni progettati per la compilazione da parte dei computt;r conrengono un numero fisso di
spazi in cui il compu ter pu stampare l'impo rro. Supponete che l'assegno di uno sci pendio contenga
otto spazi bianchi nei quali si suppone che il computer debba scampare l'ammontare di una paga
settimanale. Nel caso che l'imporro sia sostanzioso, allora sa.ranno riempici turri gli orco spazi. Per

esempto:
1,230 .60 (ammontare dell'a ssegno in dolla ri)

due pun ri e il pun to e virgola). Nei sistemi acustici, il punto rappresentato da un. suono breve e la
linea rappresencara da uno luago. Con i sistemi basaci su segnali luminosi o sull' utilizzo di bandierin e,
sono urilizzate alrre rappresentazio ni di punri. e lince.
La separazione aa le parole indicata da u110 spazio o, pi semplicemen te, dall'assenza di un
punro o di una linea. Nei sistemi acuscici, uno spaiio indicato da un breve periodo durante il quale
non crasmesso alcun suono. La versione internazionale dd codice Morse mostrata nella Figura 8.39.
Scrivete un programma che legga w1a frase in lingtl!l iraliana e la codific hi .in codice Morse. Scrivere anche un programma che legga una frase in codice Mo rse e la converra n.ell'eqwvalente in lingua
italiana. Utilizzate un o spazio era le lettere del codice Morse e rre fra le parole.

Cara ttere
A
B

-- -12345678 (numeri di posizi one)

Invece, nel caso che la cifra sia inferiore ai $1000 allora moJci degli spazi sarebbero ~ciati in
bianco. Per esempio,
99 . 87

--- 12345678

contiene rre spazi bianchi. Sarebbe sicuramente pi facile alterare l'impo rro dell'assegno, qualora
questo fosse staro scan1patq con degli spazi bianchi. Per prevenire l'alcerazione di un assegno, molti
sistemi per la loro compilazione inserisco no degli asterischi iniziali in modo da proreggere l,i.mporto,
come nell'esempio che segue:
***99 .67

32 1

I CARATfERl E LE ~llllNGHE

Codic e

Cara ttere

-...
--.

D
E
F
G
H
I

X
y

-.-..
-

K
L

M
N

3
4

....

-__ ,_

.....

--

--.

7
8

8.39 (Il codice Morse) Il pi famoso scbcetna di codifica probabilmente il codice Motse, sviluppato
da Samuel .Morse nel 1832 per iJ sistem a telegrafico. Il codice Mor.se assegna una serie ru punri e di
linee a ogni lettera dell'alfabero, a ogni oumero e a pochj cararteri speciali (come il pt1nco, la virgola, i

ONE HUNDRED TWELVF and 43 / 100

- -

--

12345678

8.38 (Scrivere in l.ett-ere l'importo di un assegno) Contin uando la discussione dell'esempio precedente, ribadiamo quanto sia imporrante progettare dei sistemi per la compilazione degli assegni che
prevengano l'alterazione de.I I.oro in1porc o. Un mecod9 di sicurezza comun e richiede che l importo
dell'assegno sia seri ero in cifre e "dichiarato" ancl1e i11 lertere. Qualc11no in grado di alterare l' importo
numerico di un assegno, ma esrremamnte difficile cambiare l' imporro espres5o in lettere.
Molti sistemi compu terizzati per la com pilazion e degli assegni non sran1pano l' importo in lettere.
Pr0babilmenre, la causa principale di quesra omissione che molri dei linguaggi di alto liveUo utilizzaci
nelle applicazioru commerciali non conrengono delle caracrerisciche adeguare per la manipolazione
delle stringhe. Un'alt ra ragione che la logica per scrivere in lettere gli importi degli assegni alquanto
complicata.
Scrivete un programma C che prenda in input L'ammo ntare numerico di un assegno e scriva il suo
equivalente in lerrete. Per esempi o, l'importo l 12.43 dovrebbe essere scritto come

-..

Numeri

assegno e lo visualizzi nel formaco proretto dagli asterischi iniziali, qualora siano necessari. Suppo nete
che per scampare Li.mporco siano djspodibili nove spazi.

-- -Scrivete un programma che prenda in inpu c l' importo in dollari che dovr essere scampato su uo

Codic e

Figura 8.39 Le lettere dell'al fabeto espresse nel codice Morse interna zional e.

8.40 (Prograrfirna per la cortversi.one rnetrica) Scrivete un prograrruna che assista l' urente con le
conv.ersjoni metriche. li voscro programma dovr consen tire all 'ure.nce ru specificare con delle stringhe
i nomi delle unit di misura (ovverosia, centimetri, Iieri, gramm i, ecc. per il sistema metrico decimale e
pollici, quarci di gallone, libbre, ecc. per il sistem a anglosassone) e dovr rispond ere a sempli ci domande come:
A quant i pollic i corris pondo no 2 metr~? u
M
"A quant i litri cor rispon dono 10 quart i di gallon e?"
Il vostro programma dovr riconoscere le conversioni non valide. Per esempio, la doman da
"A

quant i piedi corris pondo no

5 chil og~imm i?''

noo ha senso perch i "piedi sono un'unit di misura della lunghezza mentre il "chilogrammo
una ~t di misura del peso.

8.4 1 (Lettere di sollecito) Moire aziende commerciali spendono una gran quancic di cempo e di
denaro per il recupero del credito. Il sollecito appun to l'invio a un debitore di ripetute e insistenti
richieste, nel tentativo di incassare un credito.

322

CAPITOLO

Spesso i computer sono ucilizzari per generare aucon1aticamenre le lerrere di solleciro, con un
grado crescenre di severit man mano che il credito invecchia. La teoria alla base di ci che un credito
diventa pi difficile da incassare man mano che invecchia e, di conseguenza, Le lerrere di sollecito
devono diventare pi n1inacciose.
Scrivete un programma C che contenga i cesti di cinque lenere di solleciro c:on severit crescenre.
Il vostro programma dovr accertare come inpur:

I.
2.
3.
4.
5.

IL nome dcl debirore.


I.:indirizzo del clebicore.
Il conro del debitore.
La cifra dovuta.
Le[ della dfi-a dovuta (ovverosia, un rirardo di un mese, di due mesi, ecc.).

CAPITOLO

La formatta zione
dell'inpu t/output
Obiettivi

Utilizzare l'et della cifra dovura per selezionare uno dei cinque cesti dd messaggio e stampare la
lettera di solleciro, il1serendo in modo appropriato le alrre informazio11i fornire dall 'utente.

Un progetto impegnativo per la manipolazione


delle stringhe

8.42 (Un ge11eratore di cntciverba) Molte persone hanno risolto almeno una volta un cruciverba, ma
poche hanno centaco di generarne uno. Generare un cruciverba un problema di fficile. Lo proponiamo in quesco contesro come un progetto per la manipolazione delle sa:inghe che rjchieda un ragionamento e uno sforzo sostanziosi. TJ programmatore dovr risolvere mol problemi anche per onenere il
pi semplice programma per la generazione dei cruciverba. Per esempio, in che modo si porr rappresen care la griglia di un cruciverba in un computer? preferibile urilizzare una serie cli stringhe o deJle
marrici? Il programmarore avr bisogt10 di una fonte di parole {ovverosia, un dizionario computerizza.ro) cui il programma possa fare riferimento in modo direrco. In quale forma d-ovrebbero essere immagazzinace quesre parole, per facilitare la complessa manipolazione .richiesta dal programma? IJ !errore
molto ambizioso voTi generare anche La porzione deJle "definizioni" per il cruciverba, in cui siano
stampati i brevi suggerimenri f0roiri al solutore per ogni parola "orizzontale" e "vercicale". Anche
scampare semplicemente una versione vuota del cruciverba non un problema semplice.

,1

9.1

Comprendere i flussi di input e di ou_tpm.

Essere in grado di usare tutte le capacit di formattazione della stam,pa.

Essere in grado di usare tutte le capacit di formattazione dell,input.

Introduzione

Una parte importante della soluzione di ogni problema la pr~se.ntazio~e dei risul.tati. ~
questo capitolo discuteremo in modo approfondito le caratter1soche d1 formatt~1oae ~
scanf e printf. Queste funzioni prendono i dari dallo stream dello standard tnput e u
inviano allo stream dello standard output, rispettivamente. Nel Capitolo 8 sono state discusse altre quattro funzioni che ucilizz.ano l'input e J>output st~ndard: get~, puts~ g~tchar
e putchar. Includete il file di intestazione <stdio. h> nei programmi che r1cl11amano
queste funzioni.
Molte delle caratterisriche di pr1ntf e scanf sono gi state discusse in precedenza in
questo libro. Questo capitolo riasst1mer quelle cararceristiche e ne introdurr molte alae .
11 Capitolo 11 discuter molte al ere funzioni incluse nella ubreria per l,input/output standard
(stdio).

9.2

Gli stream

Tutto l'input e l'output eseguito attraverso gli stream: se~uenze ~ caratt~ri organizzate in
righe. Ogni riga consiste di zero o pi caran~ri e term.m a co~ il n~line. Lo standard
stabilisce che le implementazioni ANSI C dc;:bbano supportare righe di almeno 254 caratteri
- - > incluso il newline di terminazione.

Nel momento in cui com.inc.ia l'esecuzione di un programma, a questo saranno connessi automaticamente tre stream. Di solito, lo strearn dello standard inpuc connesso alla
tastiera e quello dell 'output allo sch ermo . .Spesso i $istemi operativi consentono il
redirezionamento di questi scream verso altri dispositivi. li terzo stream, lo standard error,
connesso allo schermo. I messaggi di errore saranno inviati in output sullo stream ~elio
standard error. Gli stream saranno discussi in dettaglio nel Capitolo 11 , "l:elaboraz1one
dei file".

CAPITOLO

324

LA FORMATTAZIONE DELL,INPUT/OUTPtJr

Formattare l'output con printf

9.3

Con printf pu essere otten uta una precisa formatta zione dell 'ourput. Ogni invocazione
di printf contien e una stringa di controllo del formato che descrive appunto il formaro
del l'o utput. La stringa di controllo del formato compos ta da indicatori di conversio11e,
flag, dimensioni di campo, precisioni e caratteri Letterali. Uniti al segno di percentu ale (o/o),
q uesti formano le specifiche di conversione. La funzione printf ha le seguenti ca pacit di
formatta zione, ognuna delle quali sar discussa in qusto capitolo:
L. Arrotondamento dei valori in virgola mobile al numero indicato di cifre decimali.
2 . Allineamento di una colonna di numer.i con i separatori dei decimali che compaio no uno
sull,altro .

3. Allineamento a destra e a sinistra degli output.


4. Inserimento di caratteri letterali in posizion i precise della riga inviaca in output.
5. RappreSe11cazione dei numeri in virgola mobile in formato esponen ziale.
6. Rappres entazion e degli inceri senza segno in formato ottale ed esadecimale. Consult ate
i,Append ice E, "I s.isremi numeric i", per otrenere maggiorj informa zioni sui valori ottali
ed esadecim ali.
7. V isualizzazione di tutti i tip i di dato in campi di dimensione e precisio ne prefissare.

pri ntf (stringa di controllo delformato, altri argomenti) ;

La stringa di controllo del formato descrive il formato dell,outp uc, mentre gli altri argomenti

Indicat ore
di convers ione

Descriz ione

Visualizza un intero decimal e con segno.

Visualizza un i.n tero decimal e con segno. (Nota: il compor ramento


degli indicato ri i e d sar diverso quando saranno utilizzaci con scanf).

Visualizza un incero ottale senza segno.

V isualizza un intero decimale senza segno.

xe X

Visualizza un incero esadecimale senza segno. X i11dL1ce la visualizzazione


delJe cifre 0 -9 e delle lettere A - F, men ere x .induce la visualizzazione
delle cifre 0-9 e delle lettere a -f .

h e 1 (lettera 1)

Posto dinanzi a ogni indicato re di conversione per gli inceri, per indicare cl1e sar visualizzato rispettiv amente un incero short o long.

Figura 9.1

Gli indicatori di conversone per gli interi.

/* Us are gli i ndicato ri di conver sione per gli interi */

#includ e <stdi o. h>

La funzione printf ha la forma:


I

main( )
{

455 ) ;
p r i nt f ( %d \ n
pri ntf( u%i \ n'' , 455); / * i lo stesso di d nella printf * /
printf( 11 %d \ n", +455);
printf (,,%d\n" , -455);
printf( ,,%hd \ n" , 32000) ;
printf( ,,%ld \ n", 200000 0000 );
455);
printf ( "%0\n
455);
printf ( "%u\ n
pri nt f("% u\n '' , -455);
p rin t f ( "%x \ n " , 455) ;
11

(che sono opziona li) corrispo ndono alle singole specifiche di conversione inserite nella
stringa di controllo del formato. Ogni specifica di co nvcrsione inco mincia con un segno di
pe~centuale e termina con un indicaro.r di convers ione. In una srring-a di controllo del
formato porranno essere inserite moire specifiche di conversione.

Errore ti.pico 9.1

11

11

Dimentica1'e di raccJ1i11.dere tra virgolette la stringa di C01'ltrollo del formato.


Buona abitudine 9.1
Curate la formattazione dell'ou"tput in modo da ottenere una presentazione ordinata.
Ci render pi leggibili gli output del vostro programma e ridurr gli errori dell 'utente.

9 .4

Visualizzare gli interi

Un intero un numero, come 776 o -52, che non contiene virgole decimali. I valori interi
possono essere visualizza'ci in molti formati. La Figura 9.1 descrive le specifiche di c<;>nversione disponib ili per gli inceri.
Il p rogramma della Figu ra 9.2 visualizzer un intero ut ilizzand o ogni indicato re di
convers ione disponi bile. Osserva re che sar stampat o soltanto il segno negativo; quelli
positivi sono soppressi. Pi tardi in qu~to capitolo vedremo in che modo sar po~sibile
forzare la visualizzazione dei segni positivi. Notate anche che, sui c.o mputer che utilizzan o
degli inceri di due byte, -455 sar letto da %u e conver to nel valore senza segno 65081 .

325

p r i n t f ( " %X \ n " , 4 5 5 ) ;

r eturn 0;
}

455
455

455
455
32000
2000u0 00
707

455
65881
1c7

1C7
Figura 9.2

Usare gli indicato ri di conversione per gli interi.

CAPITOLO

326

LA EOM1A1TAZIONE DELL,INl'lIT/OUTPUT

f . Nella parre frazionale di un vaJore inviato in o ucp uc con g o G gli zeri fi nali n on
saranno visualizzaci . Prch sia visualizzata la virgola d ei decimali sai: necessaria almeno una cifra d ecimale. Con la specilca di co nvers ione %g, i valori 0, 0000875,
8750000, 0, 8, 75, 87 1 50 e 875 sarebbero visualizzati com e 8, 75e 05, 8, 75e+06,
et 75, 87, 5 e 875. Il valo re 0, 0000875 utilizzer la notazio ne e perch, quand o sar
stato co nvertito in q uella esponenziale, il suo espo nen te sar minore di -4. Il valor
8750000, 0 util izzer la n otazione e perch il suo esponente sar uguale alla precisio ne
di defaulc.

Errore tipico 9.2


Visualizzare un valore negativo con un indicatore di conversione che si attende un valore
senza segno.

Visualizzare i numeri in virgola mobile

9.5

U n valore in virgola mobile co ntiene una virgola d ecimale come 33, 5 o 657, 983 . T
valori in virgola mobile porranno essere visualizzaci in mo lti formati. La Figura 9.3
descrive gli indicatoci di conversione disponibili per i numeri in virgola mobile.

Indicatore
di conversion e

Descrizione

Visualizza un valore in virgola mobile nella notazione esponenziale.

Visualizza un valore in virgola mobile.

f
g

Visualizza un valore in virgola mobile sia nel formato di f che in


quello di e (o di E).

oG

Posto dinanzi a un qualsisi indicatore di conversione per i nt1meri in


virgola mobile, per indicare che sar visualizzato lin valore in virgola
mobile long double.

Figura 9.l Gli indicatori di conversione per i valori in virgola mobile.


Gli indicatori di co nversione e ed E visualiz'Zano i valori in virgola mobile nella
notazione esponenziale. Nei co mpute r, la notazione espone nziale l'equivalent e della
notazione scientifica uriliz.zata in matem atica. Per esempio, iJ valore 150,4582 nella
notazione scientifica rappresenta to co me

1,504582

Per gli indicatori di convers io ne g e G, l precisione indica il numero massin10 di

cifue sjgnificaciv e cl1e saranno visualizzate, i_nclusa quella a sinistra della vi rgola decimale. Urilizz:a11do la speci"fica di conversione !\sg, jJ valo re 1234567, 0 sar visualizzaco
come 1 , 23457e+06 (ricord ate che tutti gli indicatori di con versione pe r i nun1eri in
virgola mobile hanno per defauJc una precisione di 6 cifre). O sservate che n el risultato
ci saranno app unco 6 cifre significacive. Nel caso cl1e il valore sia visualizzato in
notazione espo nenzial~,, la differenza era g e G sar la sressa che incercorre tra e ed E:
la g mi11uscola visualizzer una e minuscola, men tre la G maiuscola scamper una E
maiuscola.
Il programm.a della FigtLra 9.4 mostrer !,utilizzo d elle tre specifiche di co11versione disponibili per i valori in virgola mobile. O sservare che le specifiche di co nve rsione
%E e %g arrotonderann o il valore inviato in utpuc.
/ * Visualizz are i numeri in vi rgola mobile con
gli indicator i di co nv ersio ne per i valori in vir gola mo bile * /

#include <st dio .h>

mih ()
{

printf ( "%e \ n",


printf ("%e\ n ",
pri ntf ("%e \ n " ,
printf ( ~% E \ n '' ,
pri ntf ( "%f \ n " ,
pri ntf ( "%9 \ n " ,
printf ( 11 %G\ n 11 ,

102

mentre in quella esponenziale ' rappresenra to dal computer come


1,504582E +02

Q uesta notazion e indica che 1 , 504582 mol tiplicato per 10 elevat!o alla seco nda po,,

tenza ( E+02). L a E sta appunto per esponente .


I valori visualizzati con gli indicatoci di conversione e , E e f sarann o visualizzati.
per default co n 6 cifre di precisione a desrra della virgola decimale; le alcre precisioni
potranno essere specificate in modo esplicito. l:indicatore di conversione f visualizza
sempre almeno una ci&~ a sinistra della virgola decimale. G li indicatori di conversione e ed E visual izzane rispettivam ente una e minuscola e una E maiuscola davanti
all'esponen te, e sramperann o sempre e solo una cifra a sinistra dd]a virgo la decimale.
L~ indicacore

di conversion e g (G) vis ualizza i valorj nei formaci e (E) o f , ma

eliminando gli zeri finali nella parte d ecimale (in altri termini~ 1, 234000 sarebbe
visualizzaro come 1 , 2~4) . I valori saranno visualizzati nel formato e (E) qualora, dopo
la loro co nversione in notazione esponenziale, l'esponente sia inferiore a -4 oppure sia
maggiore o uguale alla precisio ne specificata (per d efaulc 6 cifre significarive per g e
G). In caso contrari.o, per visualizzare i valori sar utilizzato l,indicatore di conversione

327

1234567.8 9) ;
+1234567. 89 };
-1234567 . 89 };
1234567 .89);
1234567 .89) ;
1234567 .89 );
1234567 .89);

return 0;
}

1 234568+0 6
1 2~4568&+06
-1~234568e:f06

't.2G4568E +06
1234567. 890000
1.23457e+ 06

1.23457E+ 06
Figura 9.4

Usare gli indicatori di conversione per i valori in virgola mobile.

328

CAPl1'0L()

9.6

LA FORNtAITAZl ONE DELL>lNPUT/OUTI'UT

Buona abitudine 9.2

Elrore tipico 9.5

Quan.do inviate i dati in output, assict1.ratevi di informare l'uterLte delle situazioni in


etti i dati potrebbero non essere precisi a causa della fom1attazione (per esempio, per gli
errori di arroto1'zdamento dovttti alla precisione specificata).

un errore di si12tassi 11sare degli apici singoliper delimitare le stririghe di caratteri. QJJ,este,

Visualizzare le stringhe e i caratter i

Utilizzare le virgolette intorno alle costanti di carattere. Ci creer in realt tJ.na stringa formata da due caratteri, il seco1'zdo dei quali sar il NULL di terminazione. Uno costante di carattere invecr: ttn singolo carattere racchiuso tra apici singoli.

infatti, devono essere ra,cchi11se da virgolette.


Errore tipico 9. 6

Gli indicatori di conversjone e e s sono uriliz.zati rispettivame nte per visualizzare i singoli
caratteri e Je stringhe. l..dndicato re di conversione e richiede un argomento di tipo char,
mentre s richiede un puntatore a char. L'indicato re di conversione s provocher la
visualizzazione dei carar'teri finch non sar stato incontrato il NULL ( ' \ 0 ' di terinina7..io1

9.7

11 programma mostrato nella Figura 9.5 visualizzer alcuni caratteri e


sainghe utiJizzando gli inclicatori di co nversione e e s.
/ * Visualizz are s t ringhe e caratteri */
#include <stdio.h>

Gli altri indicatori di conversione

Gli ultimi tre indicatori di conversione ru11asti sono: p, n e % (Figura 9.6).

n~ della stringa.

Indicatore
di conversion e
J

Visualizza il valo re di Ltn puntatore in un formato definito dall' imple


mentaz1one .

Immagazzin a il 11umero di caratteri gi inviato in outpLl[ daJ l,istruzione printf corrente. Come argomento cor rispot1deare do-vr essere
fornito un puntatore a un intero. L'inrucatore ru conversione noa
visualizzer niente.

cl'lar character = i A' J


cha r string[] = '' This is a string";
char *stringPt r = "Th is is also a string'' ;
printf{ ''%c\ n " ,
printf( "%s\ n " ,
printf("% s\ n ",
printf ( "%s\ n ",
ret u rn 0;

Visua lizza il simbolo di perc~nruaJe.

c haracter) ;
"This is a string");
string);
st r irng Ptr);

Figura 9.6

L'indic1ztore di conversione p visualizza l'indirizz.o di un puntt+tore in un formato definito t:Uzll'implementazione (su molti sistemi, utiliz.zata la notazione esadecimale piuttosto che quella decimale).

Figura 9.5

Gli alt ri indicat ori di conversione.

Obiettivo port4bilit4 9.1

Thi s is a st~ing
Thi s i s "11 stri ng
1ttis i s also ' atring

Descrizion e

p
main ( )
I

329

'

Utilinare gli indicatori di conversione per i caratter i e le stringhe.

Errore tipico 9.3


Utilizzare %e per visualizutre il primo carattere di una stringa. La specifica di conversione %c si a-ttende un argomcrito di tipo char. Una stringa invece un p1.tntatore a char,
ossia un char *.
Errore tipico 9. 4
Utilizzare %s per visualizutre ttn argomento di tipo chsr. Laspecifica di conversione
%s si attende un argomento di tipo puntatore a chsr. Durante /,a fase di esecuzione, su
alcuni sistemi ci provocher i1-n errore fatale detto violazione di accesso.

Lindicatore di conversione n immagazzin a il numero cli caratteri gi inviati in output dalt1istruzione printf corrente: infatti, l'argomento corrispo11dente lin puntatore aJla variabile
intera nella quaJe sar immgazzin ato il vaJore. La specifica di co nversione \n non visualizza
niente. L' i11dicatore ru conversione \ visualizza un segno di percenruaJe.

Nel p rogramma della Figura 9.7, \p vist1a lizzer il vaJore ru ptr e l'indirizzo cli x; questi
dati saranno identici poich l' indirizzo di x sar stato assegnato a ptr. In seguito, \n immagazziner nella variabile intera y il numero dei caratteri che saranno stati inviati iJt output
dalla terza istruzione printf e il vaJore ru y s-ar visuaJizzato. LuJtima istruzio ne pri ntf
util izzer \\ per visualizzare il carattere \ all'ir1 rern,o di una stringa. Osservate che ogni chiamata di printf restituisce un valore: il numero dei caratteri inviati in output o un valore
negativo, qualora si sia verificato un errore nell'o utput.

Errore tipico 9. 7
Tentare di v-istJaliuare il simbolo di percentriale tisando % invece di %% nella stringa di
controllo del formato. Nel momento in cui in una stringa di control/Q del formato appare un %, questa deve essere seguito da un indicatore di conversione.

330

CAPITOLO

/ * Usare gli indicatori di conversione p, n, e%

1.A FQRMAITAZIONE DELL,INPUT/QUTPUT


Errore tipico 9. 8

*/

#include <std io .h>

Non fornire una dimensione di campo sufficientemente grande per gestire il valore da
visualizzare. Ci potrebbe spostare gli altri dati da visualizza.re e proditrre degli output
disordinati. Studiate i vostri dati!

main()
{

i nt *ptr;
i nt X = 12345, Yi

Visualizzare gli interi allineati a destra */


#include <std io .h>
1~

ptr = &x;
printf( "The value of ptr is %p\ n'' , ptr);
printf( ' The address of x is %p\ n\ n'' , &x);

ma,in ()
{

i:>rintf ("%4d \ n", 1);


i:>rintf { "%4d \ n", 12 );
printf ("%4d \ n", 123);
printf ("%4d \n", 1234);
printf ("%4d \n\n", 12345);

printf('' Total characters printed on this line is :%h" , &y };


pr i h t f ( " %d \ n \ n " , y ) ;
y = printf( ccThis line has 28 characters\ n);

printf( ''%d characters were printed \ n\ n", y);

printf ("%4d \ n" ,


p rin t f ( %4 d \ n " ,
prin t f ( %4 d \ n
printf ("%4d\ n",
printf("%4d\ n",
11

printf (" Printing a%% in a f ormat control st r i ng \ n");


return 0;

11

The value of .ptr is 001 F2BB4


001 F2BB4
of x. is
The addp,ess
.
.

.ti~s ~8- eharacters


chara~ter~ were pri~ted

Printing a %- in a
Figura 9.7

9.8

fQ~~at

contro! string

-1);
-12 ) ;
123 ) ;
-1234 ) ;
-12345);
-

return 0;
}

Total haragt,rs printed on this line is: 41


This line

11

28

33 1

12.
123
1234
12345

Utilizzare gli indicatori di conversione p, ne%.

Visualizzare con le dimensioni di campo e le precisioni

I:esatta misura del campo in cui saranno visualizzati i dati specificata dalla cosiddecra dimensione di campo. Nel caso he la dimensione del campo sia maggiore del dato
da visualizzare questo, di norma, sar allineato a destra all;inte.rno di quel campo.
Normalmente, all'interno della specifica d i conversione, l'intero che rap presenta la
dimensione del campo inserito tra il segno di percentuale (%) l'indicatore di conversione. Il programma della Figura 9.8 visualizzer du.e gruppi di cinque nt1meri,
allineando a destra quelli che contengon o meno cifre della dimensione del campo.
Osservate che, per visualizzare dei valori con una dimensione niaggiore di quella del
campo, questa sar incrementata auto maticamente, e che il segno dei valori n.egarivi
utilizzer una posizione all ~interno della stessa. Le dimensioni dei campi potranno
essere utilizzate con tutti gli indicatori di conversione.

1
12'
123
1234
-12345

Figura 9.8

Allineare a destra in un campo gli interi.

La fun zio.n e printf for.n isce anch e la possibilit di specificare la precisione con
cui il dato dovr essere visualizzato. La precisione ha un significato diverso per i vari
ripj di dato. Uciljzzata insieme agli indicatori ru conversione per gli interi, la precisioa~ indica il numero minimo di cifre da visualizza:i:e. Nel caso che il valore \ris L1alizzato
contenga meno cifre cl.i quelJe indicate dalla precisione, davanti aJ suddetto valore
saranno inseriri degli ze ri fnch il numero rotale delle cifre non risulti equivalente a
quello della precisione. La precisione predefinita per gli interi I . Utilizzata con gli
inrucatori di conversio ne e, E e f per i valori in virgola mobile, la precisione indica il

332

CAP1TOLO

numero di cifre che dovranno comparire dopo la vugola dei decimali. Utilizzata con gli indicatori di conversione g e G, la precisione indica il numero massimo di cifre significative da
visualizzare. Utilizzata con l'indicatore di conversione s , la precisione indica il numero massimo di caratteri della stringa che dovranno essere scritti. Per utilizzare la precisione, inserirete
un punto (. ) seguito dall'intero che rappresenta la precisione, tra il segno di percentuale e
l'indicatore di conversione. Il programma della Figura 9.9 mostrer l'utilizzo della precisione
nelle stringhe di controllo ciel formato. Osservare che un valore in virgola mobile sar arrotondato, qualora sia visualizzato con una precisior1e infe riore al numero originale delle sue
cifre decimali.
/* Usare la precisi one mentre si visualizzano gli interi,

333

LA FORMA11.AZIONE Df.LL'INPUT/OLITPUT

Sar anche possibile specificare la dimensione di campo e la precisione, ucilizz.ando


ddle espressioni intere inserite nella lista degli argomenti che segue la stringa di controllo
d1 formato. Per urilizzare questa caratteristica, inserirete un * (asterisco) al posto della
dimensione di campo o della precisione (o di entra mbe). In sostituzione dell'asterisco sar
valu~To e utilizzato l'argomento corrispondente. Per la dimensione del campo, il valore
dell'argomento p otr an che essere negativo, mentre quello della precisione dovr sempre
essere positivo. Un valore negativo per la dimensione dei campo provocl1er l'allineamento
a sinisrra dell,outpur, come descritto nella sezione successiva. "Lisrruz.io ne

printf( "%*.*f '', 7, 2, 98.736);

i numeri i n virgola mobile e le stringhe */


#include <stdio.h>

utilizzer 7 per la dimensio11e d.el campo, 2 per La precisione e visualizzer il valore 98, 74
allineato a destra.

main ()

9.9

La fi1nzione printf fornisce anche dei flag (segnalini o bandierine) per integrare le proprie
capacit di formattazione. I:utente ba a disposizione cinque flag da utilizzare nelle stringhe
di controllo del formato (Figura 9.1O).

i nt i = 873;
float f = 123.94536 ;
char s[] = "Happy Birthday'';
printf ( "Using pre cis ion for integers \ n");
printf ( "\ t %.4d \ n\ t %.9d \ n\ n" , i , i) ;
printf( '' Using precision for floating -poi nt nu mbers \ n'') ;
printf( 11 \ t%.3f\n\t% .3 e \ n\ t %. 3g \ n\ n 1' , f, f, f);
printf( ,, Using precision for strings \ n'' );
s);
printf ( \ t %.11 s \ n
return 0;
11

11

Flag

Descrizione

- (segno meno)

Allinea a sinistra l'output all' interno del campo specificato.

+ (segno pi)

Visualizza il segno davanti ai valori positivi

spazio

Visualizza uno spazio davnt a un valore positivo che non sia stato
visualizzato con il flag +.

,#

Visualizza uno 0 davanri al valore, qualora sia utilizzato insie1ne alf indicarore di conversione in ottale o.

..

Using precisiqn tor integers


0873
000008873

Forza la visualizzazione di una virgola decimale per i numeri in virgola


mobile che siano stari visualiz741ti con e, E, f , g o G e che non contengano una parte frazionaria . (Normalmente, la virgola decimale sar
visualizzata soltanto q_ualora sia seguita da una cifra.) Per gli indicatori
g e G, gli zeri in coda al valore non saranno elimi nati.

123.9451.239e+02
124

Happy BirtlY

quelli negativi.

presision f or strings

e a

Visualizza 0 x o 0X davanti al valore, qualora sia utilizzato insieme agli


indicatori di conversione in esadecimale x o X.

Using precisi.on for floating-point numbers

Using

Utilizzare i flag nella stringa di controllo del forrnato

0 {zero)

Riempie un campo inserendo degli zeri davanti al valore visualizzato.

Figura 9. I O I flag per la stringa di controllo del formato.

la precisione potranno essere combinate inserendo, tra iJ

Per utilizzare un flag in t1na stringa di controllo del formato, dovrete inserirlo immediatamente a desaa del segno di percentuale. All'interno di Lina specifica di conversione
potranJ~.o essere combinaci mo.lei flag.

segno di perc:entuale J'indicarore di conversioJ1e, la dimensione del campo seguita dal


punto e dalla precisione, ome nell'istruzione

Il programma della Figura 9. 11 mostrer l'utilizzo dell'allineamento a destra e a sinistra di una stringa, di un intero, di un caratte~ e di un numero in virgola mobile.

Figura 9. 9

Utilizzare le precisioni per visualizzare informazioni di tipo differente.

La dimensione del campo

printf ("%9 . 3f

11
,

123.456789);

che visualizzer il valore 123, 457 con rre cifre dopo la virgola dei decimali e al lineaco a
desrra in un campo di 9 posizioni.

Il programma della Figura 9. 12 visualizzer un nwnero positivo e uno negativo, con e


senra il flag +. Notate che il segno negativo sar visualizzato in ena ambi i casi, menae
quello posi rivo sar scamparo soltanto quando sar stato utilizzato il flag +.

CAPT"fOLO 9

334

335

J..AF ORMAITAZlONE DEI l.,INPUT/OUTPlJT

Il pro gran1ma della Figura 9.1 3 inse rir uno spazio davanti aJ numero pos itivo , usando
la
iano
abb
cl1e
i
ativ
neg
e
i
itiv
pos
eri
num
dci
eare
allin
per
e
uril
co
mol
sar
che
,
flag
ito
pos
l'ap
stessa quanc di cifre.

Il programroa nella Figura 9. 14 utilizzer il flag # per inserire uno 0 davant i al valore
re
orcale, ex e 0X davanti a quelli esadecimali e per forzare Ja virgola dei dec ima li in un valo
visualizzato con g.

/ * All ine are dei val ori a des tra e a sin ist ra * /

/* usa re il fla g # con gli ind ica tor i di con ver sio ne o, x, X
e ogn i ind ica tor e di con ver sio ne per nume r i i n vir g0l a mob i le * /

#in clu de <st dio . h>

#in clu de <st dio .h>

main{ )
ma in()

pri ntf ( ' %10s%10d%10c%10f \ n\n " , "he llo " , 7, a , 1.2.3 };
11
11
11
7, ' a ' l 1 . 23 ) j
l0
hel
I
n
\
0f
1
pri ntf ( "% -10S%- 10d%- 10C%-1
ret urn 0;
1

int G = 1427;
flo at p = 142 7.0 ;

hei lo

a 1. 230'000

hal lo

pri ntf ( %#0 \ n" , c};


pri ntf (' %#x \ n" , . c ) ;
pri ntf ( %#X \ n", c );
p);
pri ntf ( \ n%g\ n
pri ntf ( 11 %#g \ n 11 , p);
ret urn 0;
11

1.2 300 00

11

11

Fig ura 9.1 I Allin eare a sini stra le stri nghe in un cam po.
/ * Vis ual izz are dei numeri con e sen za il fla g + * /
#in clu de <st dio .h >

main(}

&26 23
8x5 93

'9X5 93

'

pri ntf ( "%d \ n%d\ n", 786, -786 ) ;


pri ntf ( %+d \ n%t d\ n 786 , -786};
ret urn 0;
11

11

Fig ura 9.1 4 Usa re il flag #.


786

-18 6
+786
7S6

un
in
452
zar
aliz
visu
per
o)
(zer
0
e
+
flag
i
er
bin
com
9.15
ura
Fig
a
dell
ma
gr1c1m
Il pro
campo con 9 posizioni, con un seg no+ e degli zeri davanti al valo re; in seguito visualizzer
nuovamente il 452 u,tiU zzando soltanto il flag 0 e un cam po con 9 pos izioni.

Fig ura 9.1 2 Visualizzare dei num eri pos itivi e negativi con e senza il flag
/ * Vis ual izz are uno spa zio dav ant i a val ori con segno
che non sia no pre ced uti da + o */
#in clu de <st dio .h >

+.

/ * Usare i l fla g 0 (zero} ser ve a com ple tare il campo


con deg li zer i dav ant i al val ore da vis ual izz are * /

#in clu de <st dio .h>


main ()

main( )
{

pri ntf ( 11 % d\ n% d\ n" , 547, -54 7);


ret urn 0;

pri ntf ( 11 %+09d \ n 1' 1 452 );


pri ntf ( %09d " , 452 );
ret urn 0;

...

11

}
"'f-00 080 452

547
-54 7

000000452
Fig ura 9.1 5 Util izza re li flag 0 (zer o).

Fig ura 9.1 3 Usa re il flag spazio.

336

CAPITOLO

9. I O Visualizzare i letterali e le sequenze di escape


Per essere visualizzari da un'isrruzion e pr i ntf, la maggior parte dei caratteri letterali
dovranno semplicemente essere inclusi nella stringa di concrollo. Esistono turcavia
mo lei caracceri "problematici", come le virgolette ( ") che delimitano la stessa scringa di
concrollo del fo rmato. Vari caratteri di controllo, come il n ewli ae e la tabulazio ne,
dovranno essere rapp resentaci da sequenze di escape. Queste sono rapprsentate da un
backslash (\) seguito da un particolare carattere di escape. La tabella nella Figura 9.16
elenca tutte le sequenze di scape e le azioni che provocheranno.

Sequenza
di escape
\

Descrizione
VJS11alizza il carattere apice singolo ( ' ).

\ n

Visualizza il carattere virgolette ( ).

\?

Visualizza il cararrere punto interrogativo (? ).

\\

VlSUalizza il caratrere backslash (\ ).

\a

Provoca un allarme acustico (cicalino) o visivo.

\b

Muove il cursore indierro di una posizione sulla riga corrente.

\f

Muove il cursore all,inizio della successiva pagina logica.

\n

Muove il ct1rsore all'inizio della riga successiva.

\r

Muove il cursore all'inizio della riga corrente.

\t

Muove il cursore sulla successiva posizione di tab ulazione orizzontale.

\V

Muove il cursore sulla successiva posizione di tabulazio n,e vert icale.

Figura 9. 16 Sequenze dj escape.

Errore tipico 9. 9

Tentare di visualizzare come dato letterale in ttn'istrt1.zione pri ntf un apice ringoi.o, de/I.e
virgolette, un punto interrogativo o il carattere backsl.a.sh, semafarli precedere dal backslash
per forrriare i-tna s~quenza di escape appropriata.

9.11 Formattare l'input con scanf

Con scanf porr essere ottenuta una formarca2ione precisa del l'input. Ogni istruzione
scanf contiene una stringa di controllo che descrive il formato dei dari da prendere in
input. La stringa di cc;>ntrollo del for.rnaito consiste di specifiche di conversione e ,dj
caratteri lette rali. La funzio ne scanf h a le seguenti capacit di formattazione:

LA F0fil1ATIAZ10NE DE.LL' INPU1"/0UTPUT

1,a stringa di co11trollo del formato descrive appunto i formati per l' input, menrre glj
altri argomenti sono punracori alle variabili nelle quali saranno immagazzinaci i daci
Iicevuci in in put.

Bi1ono abititdine 9.3


Richied~te all'utente ttno opochi dati per volta. Evitate di richiedere l'immissione di molti

dati a fronte di

La funzione scanf scritta nd seguente formato:

scanf (stringa di controllo delformato , altri argomenti) ;

t1r1a

singola richiesta.

La Figura 9 .17 riassume gli indicatori di conversione u ci I izzari per prendere in


inBut rurr:i i ripi di dato. La parte rim.an ente di questa sezione proporr alcLmi programmi che illustreranno la lectura dei dati eseguita con vari indicatori di conversione
per la scanf .
Iodicatori
di conversione

Descrizione

Interi
d

Legge un incero decimale con o senza segno. Cargomento corrispondente un puntatore a un intero.

Legge un intero decimale~ ottale o esadecimale con o senza segno.


l!argo.menco corrispondente un punrarore a un intero.

Legge un incero ottale. I.:argomenco corrispondente un puntatore

senza segno.
a un intero

Legge un u1cero decimale senza segno. I..:argomenro corrispondente w1 puntatore a un u1tero senza segno.

xoX

Legge Ltn intero esadecimale. I.:argo menco corrispondente un

Lntero senza segno.


w1
a
puntatore

Posto dinanzi a uno qualsiasi degli indicatori di conversione p~r


gli J1teri, indica che sar preso in input un intero short o l ong.

Numeri in virgola mobile


Legge un valore in vlr:gola mobile. Largomenco corrispondente
un puntatore a una variabile in virgola mobile.
l oL

Posto dinanzi a uno qualsiasi degli indicatori di conversione per


nt1meri in virgola mobile" indica che sar preso in input un valore
double o long double.

Caratteri e stringhe
e

Legge un carattere. Largo1nento corrispondente un puncacore a


char; il carattere nlillo ( ' \ 0 ' ) non sar aggi unto.

Legge una srringa. .Largomento corrispondente un puntatore a


un vetto re di tipo char, chesia stifficientemente grande per contenere la stringa e un cararrere null.o (' \ 0 ' ) di terminazione.

1. Prendere in input tutti i tipi di dato.

2. Prendere da uno stream di input dei caratteri specifici.


3. Ignorare dei caratteri specifici dallo stream di input.

337

(continua)

338

CAPTTOLO

Indicatori
di conversione

339

L\ FORMATfAZJONE DELL'INPUT/OUTPUT

I* Leggere dei nume r i in virgol a mobil e * /


#includ e <stdio . h>

Descrizione

main ()

Gruppo di scansione

flo at a , b 1 e;

[caratteri di scansione] Scandisce una stringa ricercando un gruppo di caraueri che saran

no Lmmagazz111at1 1n un vettore.

printf (" Ente r three flo ating-point num bers: \n");


scanf ( i'%e%f %g'' 1 &a, &b 1 &c);
printf ('' Her e ar e th e numbers ent ered i n pla i n\ n'
printf ( "fl oat i ng -point notati on: \ n '') ;
printf ( %f %f %f \ n" , a, b , e ) ;
retu r n 0;

vari

);

Legge l'indirizzo d i un puntatore .a vente lo stesso fa rmaco prodotto


qt1and un indirizzo invtato in outp ut con %p i n un' istruzione

11

printf.
Im m agazzina il n ume ro dei caratteri presi in inp ut fino a q uel
punto da scanf. I.: argomento corrispot1dente un puntatore a un

tntero.

asr

th ree f~loating . point .. _nutnber.s :


J .. 27987 1.27987e+l3 3.38476&-16

Ignora un segno di percentuale (%) nell'input.

:ff re are the n.u~ers entered '"in plain


f'lotingpoint notation :
d .. 27il878

Figura 9.17 Gli indicatori di conversione per scanf.

Il programma della Figura 9 .18 legger degli Lnteri usando diversi indicatori di conversione per quel tipo di daco, e li visualizzer come n t1rneri decimali. Osservate che %i
in grado di ricevere in inpur degl i inceri decimali, ottali ed esadecim ali.

~::.:.::<::'~.<1;278 .869995

~~,ma
figura 9.19 Leggere un input con gii indicatori di conversione per i numeri in virgola mobile.

f* Leggere gl i i nteri */

I caratteri e Je stri nghe sono presi in in put utilizzando rispettivamente gli indicatori di co nversione e e s . Il program ma della F igura 9.20 r ich ieder all' utente l' immissione di una stringa. Il programma pren der in input il p rimo carattere della stringa
c;:on %e e lo immagazziner nella variabile di tipo carattere x . In seguito, prend er in
input il resto della str inga con %s e lo immagazziner n el vettOlie di caratteri y .

#inc l ude <stdio . h>


main()
{

i nt a, b, e, d, e, f , g ;
printf ( "Enter seven integers : ");
scanf( '%d%i%i%i%0%u%x", &'a, &b, &c, &d, &e, &f, &g);
printf( "The input di splayed as decima! intege r s is: \ n") ;
printf( ''%d %d %d %d %d %d %d\ n 1 a, b, c, d, e, f , g);
re t urn 0 ;
1

1
'

/ * ~eggere i caratteri e le s t r inghe */

#include <std io .h>


main ()
{

char x, y[9 ) ;

Enter seven intege~s: -70 -70 070 0x70 78 78 70


The input displayed as deoimal integers is!
- 70 -70 56 11Z 56 70 112

pri ntf ( Ent er a string : u);


scanf ("%c%s " , &x, y);
print f ( "The i np ut was:\ n") ;
printf ( "t he character \"%e\ 11 1' , x) ;
printf (" and the st ring \"%s\"\ nu, y);
ret tJl" n 0 ;

Figura 9.18 Leggere un input con gli indicatori di conversione per gli interi.
Per prendere in inp ut dei n umeri in virgola mob ile, po tr essere ,u tilizzato uno
qualsiasi degli indicatori di co nversion e pe r i valori in virgola m obile e , E, f , g o G. Il
programm a nella F igura 9. 19 mostrer la lettura di tre numeri U;i virgola mob ile, esegui ta con ogn uno dei suddertj indicato ri di conversione, e visua li zier i tre nu meri
con la specifica di convei:sione f . O sservate che l'ourp u c d el programma confermer
l'imprecisione dei valori in virgo la mobile: questo aspetto sar reso evidente dalla
visuaJ izzazione del secondo ' 'alo re.

}
,

. Enter a string: Sunday


~The

in9ut .was :

th character s ano

"' unelay.
stri'ng

Figura 9.20 Prendere in input i caratteri e le stringhe.

340

CAPITOLO

34 1

Una sequenza di caratteri porr essere presa in input utilizzando un gruppo di scansione.
In una stringa di contr9Llo del formato, un gruppo cli scansio11e un insieme di caratte ri racch iusi era parencesi quadre [ ] e preceduti da un segno di percen tuale. Un
gruppo di scansio ne conseo rjr di esaminare i caracteci inse.rici nello strea m cli input,
selezionando solo quelli ch e corrispondono aj caratteri con.tenuti n el gruppo di scansione.
I caratteri che combacian con quelli cont enuci nel gruppo ili scansione saranno immagazz-nati nell'argomento corrispondente: un puntatore a un vettore di aratteri. li
gruppo di scansione fermer l' input dei caratteri quando ne avr Lncontrato uno che
non sia co ntenuto nello stesso. Nel caso che il primo carattere letto dallo stream di
inpu r non corrisponda a uno di quelli contenuti nel gruppo di scansione, n el vettore
sar immagazzinato soltanto il carattere nullo. Il programma della Figura 9.21 utilizzer il gruppo cli scansione [ aeiou] per scandire lo stream di input alla ricerca delle
vocali. Osservate ch e, nclJ 'esemiJio pro1Josro , sono stace lene solo le prime sene lettere. L'ottava l ettera (h) non inclusa nel gruppo di scansione e, d i_ Gonsegue nzaJ la
scansione stata ffiterratta.

/ * Usare un gruppo di scansione * /

#include <stdio.h>

/* usare un gruppo dl. scansione invertito * /

#include <stdio .h>


ma in ()
{

char z[9J;
printf ( Enter a string: ");
scanf( "% [ "aeiou] ", z);
printf( "Th e input was \h%s\ \ n'
return 0;
11

11

1
,

z);

Enter

string: String

Ttle input was P Str~

Figura 9.22 Usare un gruppo di scansione invertito.


/ * Prendere in input dei dati con una dimensione di campo */

#include <stdio.h>

main()
{

main ()

char z[9];

printf Enter string:


scanf( "%[aeiou] 11 1 z);
p r in t f ( T h e in put wa s \
return 0;
( ii

ii

11

irtt x, y;

) ;

11

%s \

11

printf (Enter a six digit integer: ) ;


scanf( %2d%d, &x, &y);
prir:itf ( The integ.e rs input were %d and %d \ n , x, Y) ;
return 0;

n" , z ) ;

Enter st.ri.ng: ooe-eooahah


The input was toe~e;ooa
,,,,
Figura 9 .21 Usare un gruppo di scansione.
Il gruppo di scans ione p orrebbe essere utilizzato anche p er selezio nare dei cararteri diversi da quelli che esso contiene, utilizzando un gruppo di scansione invertito. Per
creare un gruppo di scan,sioa e invertito inserirete un caret ("') all 'interno d elle parentesi quadre, prima de i caratteci di scansione. Ci provocher l ' immagazzinamento dei
ca ratteri che non sono inclusi nel gruppo di scansione. L'input sar interrotto quando
sar sraro inconrrato uno d ei cararreri contenuti nel gruppo di sca nsione Lnvercito. IJ
programma della Figura 9.22 urlizzer il gruppo di scansione invc:;rtitQ [ "aeiou] pe r
selezionare le conso nanti o, d etto in modo pi appropriato, per selezionare le ((non
vo cali '' .
Nella specifica di co nversione di scanf, la dime nsione dj campo po tr essere
utilizzata per leggere dallo stream di i.nput un numero specificato di caratteri. Il programma della Figura 9.23 piender in Lnput una serie cli numeri consecurivi, suddividendolj in un primo intero ili due cifre e in un secondo formato da quelle rimaste r1ello
stream cli input.

Enter a six digit inte~~~= ,23456


The integers input were 12 aod 3466
figura 9 .23 Prendere in input dei dati con una dimensione di campo.

Spesso necessario ign orare certi caratteri d ello scream di input. Pe r ese mpio,
una data potrebbe essere stata i_mmessa come

7-9-91

In quesco caso ogni num ero della d ata dovr essere immagazzi~ato, m e ntre 1. t~art1n1
che li sepa rano potra nno essere ig11oraci. Per eliminare i c~rat:ter1 n? n .necess.ar1, .i ncludeteli nella stri nga d.i controllo del formato di scanf (1 caratteri . d.1 .spazi~ b~anco~
co).]1e lo spazio, iJ newlin e e la tabulazione, faranno ig norare tutti gli spazi b1anch1
-ini~ali). Per ese mpio, per ignorare i trattini nell' input, Lttilizzate l'istruzione

scanf( 11 %d- %d -%d'1 1 &month, &day, &year );


Questa istruzior1e scanf elimina i trattini dall'input precedente, m a la data potrebbe anche essere immessa in un alcro formato:

7 / 9/ 91

342

CAPITOLO

LAFORMATfAZlONE DEIJ.'INPUT/OUTPUT

In questo caso !,iso:izione sca~f pre~ente no~ eliminerebbe i caratteri inucili. Per questa ragione, scan f fornisce il carattere di sopp ressione detl assegnarrzento *. Il tararcere di soppressione dell,assegnamento consente a .sc~nf l'input di un qualsiasi tipo di daro, che sar per ignorato e non sar
as~naro ad alcuna variabile: li pr~gramma.della Figura 9.24 utilizzer il carattere di soppressi
one
dcli assegnamento nella specifica ru conversione %e, per indicare che nello stream di inpu t ci sar
un carattere che dovr essere leccp e ignorato. Di consegueaz,a, solo il mese, il giorno e l'anno
~o ~mmagazzinaci. I va.lori delle variabili saranno visi1alizzati per climosrrare che saran
no stati
presi m mpu t nel modo corretto. Osservate che alle specifiche di conversione che utilizzano il
c:arattere.di soppressione dell'assegnamento "non corrisponde nessuna delle variabili incluse nella
lista degli argomenti, poich per quelle specifiche cli conversione non sar esegui co nessun assegnamento.

g) Gli indicatori di conversione


e
sono utiliZ7.ari per visualizzare
degli inter i seni a segn o risperrjvamen re in orcal e, decimale ed esadecim ale.
h) I modi ficatori

sono posci dina nzi agli indi cato ri di


conversio ne per gli inrri, per indicare che saran no visualizzaci dei valo ri inceri sho rt
o long .
i) I.:iodicatore di conversio ne
utilizzato per visu alizzare in nocazion e
espo nenz iale un valore in virgo la mobile.
j) li mod ifica tore
post o dina nzi a un indi cato re di co nvers ione per
num eri in virgola mobile per indicare che sar visualizzato un valo re long dou ble.
k.) Gli indicatori -di conv ersio ne e , E e f , qualor_a non sia stata specificata una precisione,
sara nno visualizzati con
cifre a destra della virgola dei decimali.
I) Gli indicatori di conversione
e
sono ulizzati per visual izzare
rispettivan1ente delle strin ghe e dei cara tteri .
m) Tucre le strin ghe term inan o con il cara ttere
.
n) In una specifica di conversione per l' istruzione prin tf, la dime nsio ne del cam po e la
precision e potr anno essere conr rollace con un'espressione intera , iuser endo al loro
post o un
e pone ndo nella Lista degl i argo men ti una corr ispo nden te

espressio
ne incer
a.
o) li flag
provocher l'allineam ento a sinistra dei dari visualizzati in un
campo.
p} Il flag
forzer la visualizzazione del segno positivo o negativo.
q) Con la fi1nzione
potr essere otten uta una furmacrazione precisa dell' inpu t.
r) Un
utilizzato per scan dire una srrin ga alla ricerca di cara tteri specifici
per imm agazzina rli in un vetto re.
s) L' indicatore di conversio ne
porr essere utilizzato per prendere in inpu t
degli interi con o senza segno espressi in Ottale, decimale o esad ecim.ale.
e) L' indicatore di co nversione
po rr essere ucilizzato per pren dere in inpu r
un valore dou ble.
a ) Il
utilizzato per leggere dei dati dallo stream di inpu t e igno rarli se nza
assegnarli a una variabile.
v) U na
pou. essere uriJizzata nel la specifica di conv ersione di scan f, per
indicare che dallo suea m di inpu t dovr essere lecco un numero specilcaco cli caracceci
o cli cifre.

/ * Leggere e ign ora re i car atte ri del lo stre am di inp ut */

#in clude <std io.h >


main ()
{

int month1, day1, yea r1, month2, day2, yea r2;


prin tf( "En ter a date in the form mm -dd- yy: '') ;
sca nf( %d%'c%d%*c%d
&month1, &day1, &ye ar1) ;
prin tf ( month = %d day = %d yea r = %d\ n\ n ,
month1, day1, yea r1);
prin tf( "En ter a date in the form mm / dd / yy: '' );
sca nf( "%d%*c%d%*c %d " , &month2, &day2, &ye ar2) ;
prin tf( '' month = %d day = %d yea r = %d\ n'',
month2, day2, yea r2);
retu rn 0;
11

11

11

9.2

Trovate L'errore in ognu na delle seguenti istru zio ni e spiegare come possa essere corretto.
a) La seguente istruzion e dovrebbe visualizzare il carattere ' e '
prin tf ( 1'%s\ n'' , 'e') ;

Figura 9.24 Leggere e ignorare i caratteri dello stream di input.

b) La segu enre istruzion e dovrebbe visu alizzare 9, 375%

Esercizi di autovalutazione
9.1

Riempite gli spazi. bian chi in ognu na delle seguenti righe:


a) Tutt o l'inp ut e l'out put trattato in forma di
.
b) Lo screa m di
connesso normalmente alla castiera.
c) Lo stream di .
. c~nnesso normalmente con lo scher mo del com puter.
d) Una formattazione precisa dell outp ut pu essere o-rtenu ra con la fii azione
.
e) L a scrin ga di cont rollo del fcroaco pu contener e
, - - -- - - ,
_ __ _ _ e
.
f) Per inviare in outp ut un intero decimale con segno, pu essere utilizzato l'i ndicatore di

conversio
ne
o _ _ _ _ _.

343

prin tf ( "%. 3f%'', 9.37 5%);


c) La segu ente istruzione dovrebbe visualizzare il prim o cara ttere della strin ga "Monday
prin tf ( "%c\ n' , l Monday k) ;
d)
e)
f)
g)

9.3

pri ntf (" A stri ng in quot e s"") ;


prin tf (%d%d, 12 , 20 );
prin tf ("%c " , "x") ;
prin tf ( "%s \ n" , ' Rie har d ' ) ;

Scrivere un' istruzione per ognu n-a delle seguenti arcivir:


a) Visu-alizza ce 1234 giustificato a destra in un campo di 10 cifre .

344

CAP JTOL O

b) Vjsual i.zzare 123, 4567 89 in nonu.ione ~po nenzaJ.e con un segno (+ o - ) e 3 cifre di

prec 1s1on e.
c) Leggere un valo re dou ble nella variabile number.
d) Visu.alizzace 100 in form aro ottale preceduto da 0.
e) Leggere una stringa nel veao re ru cararrerj stri ng.
f) Leggere dei cara neri nel vertore n finch no n oe inco ntrare uno noo numerico.
g) Utilizzare le variabili intere x e y per specifica re la dimensione di cam po e la precisio.ne usare
per visual izza.re il valo re dou ble 87, 4573 .
h) Leggere un valore oel formato 3, 5%. Immagazz inate la perce ntuale .nella varjabile floa t
perc ent ed elim inare il % dallo screarn ru in put. Non usare il carat tere di sopp ressione
dd l'assegnamento.
i) V isual izza te. 3, 3333 33 come w1 valo re long doub le con un segno (+ o -) in un campo d i
20 carat teri con una precisjon e ru 3.

LA FQRMATIAZIONE DEJ.t .'JNTUT/QUTPUT

Esercizi
9.4

9.1

9.2

a) Errore; l'inrucacore di conversio ne s si aaend.e un argo ment o ru tipo punrarorc a char.


Correzione: per visualizza re il quat tere e uril-izzate la specifica ru conv ersio ne %e o
cambiare 'e ' in e .
b) Erro re: ren rativo ru visualizzazione del carat tere letterale %senza urilizza re la specifica ru
conversio ne %%.
Correzion e: utilizzare %% per visualizzare un caracrere %letterale.
e) Errore: l'indicato re ru conversion e e si atten de un argomo to di rip o char .
Correzione: per visualizzare il prim o carat tere ru Monday utilizzare la specifica di conversione %1 s .
d) Erro re: ceo racivo di visualizzazione del cararcere letterale senza utilizzare la sequ enza d i
escape \ .
Correzjc>ne: sosti tuire le virgolette p i interne con \ .
e) Erro re: la strin ga di conrrollo del formato non racch iusa tta virgo lette.
Correzione: racch iudere 9tsd'6d tra virgo lea.
f) Erro re: il carat tere x racch iuso tra virgolette.
Correzio.ne: ,perch possa essere visualizza.ca con \c., ta costante di cararrere dovr essere
racchiusa tra apic i singoli.
g) Errore: la stringa da visualizzare racc hiusa era apjc i sin goli.
Correzion e: per rapp resffi tare una stringa, utilizzare le virgolette invece degli apici singo li.
a) prin tf ("%10d \ n" , 1234 );
b ) pri ntf ( ''%+. 3e \ n" , 123 ..4567 89 ) ;
c) s canf ( u%lf " , &num ber) ;
d) pri ntf ("%#o\ n" , 100 ) ;
e) s canf (b%s '' 1 s t r ing ) ;
f) scanf{ "% [ ~ 0123456789]", n ) ;
g) pr i ntf{ "% . *f \ n" , x, y, 87 . 4573 );
h) s canf {"%f %%", &perc ent ) ;
i) pri ntf("%+2 0 . 3Lf \ n", 3 . 333333 );
1

9.3

Scrivete un' istruzione pr intf o scan f per ognu na delle seguenti arcivit:
a) Yisualizzac:e l'in cero seoza seg110 4000 0 giustificcno a sinistra in un cam po di 15 cifre e con
un minimo d i 8 cifre.
b) Legger~ un valore esadecimale nella variabile hex.
e) Yisualiz.zace 200 con e senza segno.
d) VisuaJjm ce 100 in form aco esad ecin1ale preceduto da 0x.
6) Leggete dei ca ratte ri nel vetto re s finch non incoocrate la lettera p.
f) Visualizzare 1 , 234 in un camp o 9 cifre p reced uto da degli zeri.
g) Leggece un orario nel fo rmato hh: mm : ss immagazzinando le sue parti nelle variabili in cere
hour, min ute e seco nd. Igno rate i due p un ci (: ) inseri ri nello srream di inpu t. Utili zza cc il
caraccere di sopp ressio ne dell 'assegnamenco.
h) Leggere dall o standard inpu t una strin ga nel fo rmat o cha ract ers . Immagazzina tela nel
vetto re dj carat teri s . Elim inare le virgolerre dallo srream ru inpu t.
i) Leggere un orario nel form ato hh: mm : ss immagazzinan do le sue parti nelle variabili intere
hour, min ute e s econd. lg11orate i due pw1ri ( : ) inseriti nello srrea m ru in put. Non
utilizzate il carat tere ru soppressione dell' assegn amento.

ru

Rispost e agli esercizi di au tov alu taz ion e


a) $crea m. b) Standa rd inpu t. c) Stan dard oucpur. d) pri ntf. e) Indi catori ru conversio ne,
flag, dimensio ni di cam po, precisioni e caratteri leae rali. f) d, i. g) o, u~ x (o X). h) h, 1. i) e (o E). j) L .
k) 6. l) s, c. m) NULL (' \ 0 1 ) . n) asterisco(*). o)- (meno). p) + (pj). q) s canf . r) Gruppo di scansione.
s) i . e) le, lE, 1f , lg o lG. u) Carattere cli sopp ressio ne d.ell'assegnarnenco ( ). v) Dim ensio ne di camp o.

345

9.5

Mos trare che cosa sar visua lizzato d.a ognu na cl.elle segtLenti istru zioni. Nel caso che un' iscruzine non sia. correcca, indicatene i l .m orivo.
a) pri ntf {"%- 10d \n", 10000 );
b) pr i nt.f (" %c \ n", "This is a stri ng'') ;
e) pr i ntf ("%* . *lf \n" 1 8, 3, 1024 . 987654 );
d) prin t f( "%#o \ n%#X \ n%#e \ n ' , 17, 17, 1008 .836 89);
cl prin tf (''% ld \ n%+ld \ n", 1000000, 1000000) ;
f) prin t f ("%10 . 2E \ n", 444 .93738);
g) pri ntf ( "%19 .2g \ n" , 444 . 93738 ) ;
h) pr intf ( "%d\ n" , 10 .987 );

9.6
'Ifovare l'erro re (o gli erroci) in ognu no dei seguen ti segmenti di prograrn.ma. Per ognu no di
essi, spiegate com e possa essere corretto.
a) pr intf ("%s\ n" , ' Happ y Birt hday ' );
b) pr i nt f( "%c \ n" , ' Hel l o ');
~ pri ntf ("%c\ n", "Thi s i s a s trin g ");
d) I.: istruzion e successiva dovrebbe visualizzare Bon Voyage .
pr i ntf (" "%s ", " Bon Voya ge ) ;
~

char day[ ] = c(Sundayi


pri ntf( "%s\ n 11 , day[ 3) );

f) prin tf( ' Ente r your name: '} ;


g) pr i ntf( %f , 123 . 456 ) ;
h) tisrruzio ne successiva dovrebbe visualizzare i cara aeri ' O' e ' K'.
prin tf ( "%s%s \ n" , ' O' , ' K' } ;
i)

9.7

char s [10) ;
scan f ("%c", s[7J };

Scrivete un programma che inizia lizzi i lOelemenci del vettore number con degli incer i casuali
com presi era ] e J000. Visualizza ce ogni valore e il corale pr~g ressivo del .num ero ~. ca.i:a~e.ri visu alizzati.
B'tilizza-ce la specifica dj conversio ne ~n per dererminare il num ero ru cara aen tovia u m outp ut per

346

CAPITOLO

ogni valore. Visualizzare il corale dei cararreri inviaci in ourpuc per rutti i valori, includendo anche
q uello corrence, ogni volta che sar visualizzato. L'output dovr avere il seguente fo rmato:

Value
342

Tot a! characte rs
3

1000
963

7
10
11

etc.
Scrivete un programma che verifichi la differenza. tra gli indica-cori d i conversione \ d e \i
quando sono utilizzaci nelle istruzioni scanf. Ucilizzate le istruzioni

9.8

scanf ( "%i%d " , &x, &y ) ;


printf ("%d %d\ n 11 , )(, y );

per prendere in input e visualizzare i valori. Verificate il funzionamenco del prgramma co.n i seguenci
gruppi di dati:
10
- 10
010
0x 10

10
10
010
0x 10

Scrivere un programma che visualizzi i valori di un puncatore urilizzando rutti gli indicatori di
conversione per gli inceri e la specifica %p. Quale visualizzer dei valori strani? Quale provocher degli
errori? Sul vostro sistema, in quale formato visualizzer l'indirizzo la specifica di conversione 9tsp?

9 .9

9 .1O Scrivere un progrmma che verifichi i risulcati onenuti visualizzando il valore intero 12345 e
quello in virgola mobile 1,2345, in campi con varie dimensioni. Cl1e cosa succeder quando i valori
saranno visualizzati in ca mpi con una dimensione inferiore a quelle dei valori?
Scrivere un progra mma che visualizzi il valore 100 , 453627 ai:rotondato all'int~ro pi v icino e
al numero pi vieino a meno cli un decimo; di un centesimo, di un millesimo di un decimo di
millesimo.

9.11

Scrivere un programma che prenda in input dalla tastiera una sn:inga e ne determini la lunghezza. Visualizzate la stringa urilim ndd come dimensione di campo il dop pio della sua lunghezza.

9.12

9 .13 Scrivete un programma che converca degli inceri, corrispondenti a remperarure Eahrenheir
comprese era 0 e 212, nelle equivalenti Celsius espresse in numeri a virgola m,obile con 3 cifre di
precisio ne. Utilizzare la formula

celsi us = 5.0 I 9 .0 * (fahren heit - 32 );


per eseguire il calcolo. L'output dovr essere visualizzato giuscificaco a descra all'interno di due colonne,
ognuna di 10 caratteri, e le temperarure Celsius dovranno essere precedute da un segno sia per i valori
p ositivi, sia per quelli negativi.
Scrivere un programma che verifichi tune le sequence di escape della F~a 9.16. Visualizzare
un cararcere prima e dopo le sequenze di escape che sposcano il cursore, per rendere evidente lo
spostamento del cursore.

9.14

9 .15 Scrivete un programma che determ inj se il ? possa essere visua lizzaco come caranere lercerale,
nella stringa di controllo del formato di pri ntf, invece che con la sequenza di escape \ ? .
9 .1 6 Scrivete un programma che prenda in input il valore 437 utilizza ndo con scanf ognuno degli
indicatori di conversione per gli inceri. Visualizzare ogni valore ricevuto in input utilizzando rutti gli
indicatoci di con_versione per gli interi.

LA FORM.ATfAZTONE DELL'lN PUT/ OUTPur

347

Scrivete un programma cl1e utilizzi gli ind icatori di conversio11e e, f e g per prendere in in put
iJ valore 1 , 2345 . Visualizza ce i valori di ogni variabile per c:limoscrare che i suddetti indicatori di
convusione porranno essere ucilizzati per prendere in input lo stesso valore.

9.17

9.1 8 In alcuni Linguaggi di programmazione, le sainghe devono essere immesse delimi candole con
apici singoli o virgolene. Scrivete un programma che legga le a e stringhe suzy, suzy e 'suzy ' . Il C
ignora gli apici singoli e le virgolerce o li considera parri incegranri della scringa?
Scrivere 'un programma che determini se, utilizza ndo l' indicatore di conversione 9tsc nella
srri:nga di concroUo del formato di un' istruzione printf , il ? possa essere visualizzato con la costante di
carattre ? invece che con la corrispondente sequenza d i escape.

9. 19

Scrivete un program ma che ut ilizzi l' indicatore di co.nversione g per inviare in oucpu c il valore
S876, 12345. Visualizzate il valore con delle precis,ioni comprese rra 1 e 9.

9.20

CAPI TOLO

IO

Le str utt ure , le unioni, la gestione


dei bit e le enu me raz ion i

Obiettivi

Essere in grado di creare e usare le strutture , le unioni e le enumera zioni.


Essere in grado di passare le strutture per valore e per riferime nto nelle chiamat e di
fi1nzione.

Essere in grado di gestire i dati con gli operator i bitwise (arientati aJ bit).

Essere in grado di creare campi di bit per immagaz zinare i dati in modo compatt o .

l O. I Intro duzio ne
Le strutture sono colJezio ni di variabili correlat e (a volte dette aggregati} sotto un unico
name. Le strutture possono contene re variabili di diversi tipi di daco (conrrar jamence ai
vettori, che contn.gono soltanto d emenci dello stesso tipo di daco). Le struttur e sono usate
comune menre per definire i record da salvare nei file (c<;>nsul care il Capitol o 11 ,
"Celaborazion e dei file"). I puntato ri e le scrunure ~cilicano la for mazione di organizzazioni di dati pi complesse com e le lisce concatenate, le code, le pile e gli alberi (consultare il
Capitol o 12, "Le strutture di dati").

I 0.2 La definizione delle strut ture


I

Le strutture sono un tipo di da.to derivato (sono cio coscruite usando oggetti di alcri tipi).
Conside rate la seguent e definizione di scruttur a:

struct card {
ehar *faee;
char *suit;
};
I

La parola chiave struct introduc e la definizi one della suurrura. I.:identif icatore card la
srrucrure rag (etichett a della struttura). La structurg tag attribuis ce un nome alla definizio ne
ddla struttur a ed usata con La rarola chiave struct , per dichiara re le vari-abili di queJ
tipo di struttura . In questo esempio , il cipo di Strutt ura struct card. Le variabili dichiarare all'inter no delle parentes i graffe della definizi one sono j membri della Struttur a. f
membri di una stessa scruttur a devono avere nomi univoci, mentre due diverse struttur e
potrebbero con cenere n1embri c,o n lo stesso nome, senza creare conflitti (vedrem o presto
p~rch). Ogni definizio ne di struttura deve termina re con un punto e v-irgola.

350

CAP IT() LO

1o

Le uniche operazioni valide effetruabili con le strutrure sono: assegnare variabili di stru
ri (conmb
me
i
suo
ai
re
ede
acc
),
(&
zzo
diri
l'in
ne
var
rile
a,
ttur
stru
di
tipo
so
stes
o
dell
a variabili
ensione.
sultate la Sezione 10.4) e usare l'operatore siz eof , per determinarne la dim
rrura

Errore tipico I 0.1


Dimenticare il punto e virgola, al termine della definizione della struttura.
e su it. 1
e
fac
*:
ar
ch
cipo
di
ri
mb
me
due
e
tien
con
d
car
t
uc
str
di
e
ion
niz
_ La ~fi

Errore tipico 1O.2

:
(es.
o
dat
di
ale
enc
dam
fon
tipo
un
di
ili
iab
var
re
es~e
o
ber
re~
pot
re
me.mbr:i delle scrucru
abb iam o visco
nto
qua
Da
e.
ttur
stru
e
alrr
e
tori
vet
1
e
~om
aa,
reg
agg
~
.),
ecc
t,
l~a
f
in t,
le
del
ri
mb
me
I
.
ripo
so
stes
lo
del
ere
es
e
dev
e
cor
:e~
.w:1
di
nto
me
ele
J
ogn
nel Caprc~lo 6,
per esem,
yee
plo
em
t
uc
str
a
Un
rsi.
di~e
o
d~c
di
tl~1
d1.
re.
esse
o
son
pos
,
ece
rnv
re,
si:rurru
p~o'. porrebbe con tenere me mb ri d1 tipo stringa di car arte ri per il nom e e il cognom e
F per il~:

e
ent
ten
con
ar
ch
cipo
di
un~
o,
gac
~ie
'im
0
deU

l'et
d1 tJpo in t .P: r
pu con tenon
a
ttur
stru
a
Un
via.
l
cos
e
rio
ora
aao
sal
suo
il
per
t
loa
f
.
apo
di
~o
sesso,
pu
non
io,
mp
ese
per
d,
car
t
uc
str
o
tip
di
le
a.b~
vari
a
Un
sa.
stes
~~
di
nere un.1st~nza
luso
inc
re
esse

per
Pu
d.
car
t
uc
str
la
del
e
1on
n1z
def
la
del
rno
nte
1
all
es~ere dichiarata
un pun tato re

che
ro
mb
me
un
ga
ten
con
che
a
ttur
stru
a
Un
d.
car
ct
ru
t
s.
a
o~e
rat
un pun
Cap iro lo 12 per
allo sc~so r1~0 .d~ s~UrtUJ'a det ta struttura ricorsiva. Qu est a sar usa ta nel
cosrru ue vari ap1 di scrurrure di dari collegare.

Assegnare una strt'ttura a una di tipo differente.


o
son
non
sa
stes
la
del
ri
mb
me
i
ch
per
te,
nta
fro
con
re
esse
o
son
pos
Le stru ttu re non
stru ttu ra
una
in
te
vol
A
i.
utiv
sec
con
ria
mo
me
di
e
byt
in
na
zzi
aga
imm
e
ent
necessariam
e
nar
zzi
aga
imm
o
son
p?s
t~r
pu
com
i
c:he
o
fatt
~
u~
dov
i",
uch
-"b
pot reb ber o ss erc i dei
mezza par ola
la
e
com
u
ma
erm
dec
ben
ria
mo
me
di
fru
con
ro
enr
to
tan
sol
o
tlat
di
tipi
Crti
t sta nda rd
uni
un'

ola
par
a
Un
).
ord
ew
ubl
(do
ola
par
pia
dop
la
o
rd),
(wo
ola
par
la
),
(halfwerd
un
in
i
dar
i
are
rizz
mo
me
per
ta
usa
e,
byt
ttro
qua
o
due
da
e
ent
itam
sol
ta
ma
di memoria, for
e sample2
1
ple
sam
cui
in
a,
ttur
srru
di
e
ion
iniz
def
te
uen
seg
la
ate
der
nsi
Co
er.
put
com
sua nno di.c h,i ara te di ripo str uc t example:

str uc t example {
cha r e;

ma crea
ria,
mo
me
in
zio
spa
uno
alc
rva
rise
non
a
ttur
stru
di
e
i~n
niz
de~
e
ent
ced
. La_ pre
di
li
iabi
var
Le
ili.
iab
var
le
rare
hia
dic
per
to
usa

sar
che
o
dac
di
?
.aP
vo
~iuctosro un nu.o
Lt dichiarazione
apo Str uttu ra son o d ichi ara re allo stesso mo do delle variabili di altro cipo.

int i;

} sample1, sample2;

str uct car d a, dec k[5 2], *cP tr;


52 eledi
re
to
vet
n
u
e
com
k
dec
d,
car
t
uc
str
tipo
di
le
iabi
var
una
e
com
dichi~e~. a
di
ili
iab
var
Le
d.
car
t
uc
str
una
a
re
taro
pun
un
e
rom
tr
cP
e
d
car
uct
me nti di ~po s~r
sua def mialla
nte
me
ual
test
con
rate
hia
dic
re
esse
he
anc
o
son
pos
a
ttur
stru
d.1
tipo
?
~n dar
graffa
esi
ent
par
la
ua
,
ole
virg
da
raci
s~pa
le
abi
va
~
i
nom
di
c.o
elen
~
ndo
z1~ne, insere
sa. Per esempio,
du.u.sa ~ella. def inw one di stru ttu ra e il pun to e virg ola che chi ude la stes
della stru ttu ra
e
ion
iniz
def
la
nel
ta
ora
orp
inc
ere
ess
be
reb
pot
e
ent
ced
pre
n~
Zlo
rl
hia
la dic
str uc t car d 1n que sto mo do:

str uc t car d {
cha r *fa ce;
cha r *s uit ;
} a, dec k[5 2], *c Ptr ;

351

LE S"J'RUITlJRE, LE UNLONJ, LA GESTIONE DEI BIT E LE .ENUMERAZIONI

I'

Errore tipico 10.3


aldi
t
essi
nec
nti
ere
diff
e
dell
sa
cau
a
i,
ass
sint
di
re
erro
un

e
ttur
stru
le
tare
Confron
lineamento sui vari sistemi.

stru ttu ra non


Il nome della sti: icru re rag opzionale. Nel caso in cui una def iniz ion e di
ran no essere
por
non
ra
rru
cru
dis
ripo
l
que
di
ili
iab
var
le
,
tag
re
ctu
stru
di
e
nom
un
ga
c?nr~n
ttur a.
srru
la
del
e
ion
iniz
def
alla
nte
lme
tua
tes
con
solo
ma
e,
ent
tam
ara
sep
rare
dic hia

Obiettivo portabilitd. 10. 1

Buona abitudine 10. 1


e
ctur
stru
di
fze
noi'
Il
a.
ttur
stru
di
tipo
un
te
crea
m(o
qua
tag
re
ctit
stru
di
e
nom
un
nite
For
nel
a,
ttur
stru
di
tipo
l
que
di
ili
iab
var
ve
nuo
re
iara
dich
per
e
ient
ven
con
o
tag un mod
resto del programma.

e
ion
ens
dim
la
e
com
cos
,
ina
cch
ma
la
dal
e
end
dip
a
ttur
stru
una
di
one
tazi
sen
pre
La rap
dei dati di un partiaolare ti,po e le considerazioni sull'allineamento in memoria.

Byte

Buona abitudine 1O.2


spli
o-e
aut
a
mm
gra
pro
il
dere
-r:en
a
ta
aiu
o
ativ
ific
sign
tag
re
ctu
stnt
di
e
nom
Sce~liere un
cativo.

o con i con fini


Un com puter co n una par ola di d.ue byte por reb be richiedere l'alline am ent
le
mp
exa
t
uc
str
la
del
ri
mb
me
dei
uno
ogn
per
sa,
stes
la
del
izio
l'in
con
sia
ero
ovv
,
ola
par
della
in
nto
me
a
ne
alli
di
io
mp
ese
un
stra
mo
1
10.
ura
Fig
L?.
).
ina
cch
ma
la
dal
er
(tur to ci dip end
il
ati
egn
ass
ti
sta
o
sian
ri
mb
me
cui
ai
le
mp
exa
t
uc
str
tipo
di
ile
iab
me mo ria, per una var
bit dei valori.
in
e
ion
caz
n
se.
pre
rap
la
ta
stra
mo

io
mp
,ese
nell
97;
tero
l'in
e
'a'
re
car atte
l' imnel
,
ola
par
la
del
ici
lim
dai
iare
inc
com
a
aci
rizz
mo
me
ero
foss
ri
mb
me
i
Ne l caso in cui
buc o di un byt e
un
bbe
ere
cre
si'
le,
mp
exa
t
uc
str
tipo
del
ili
riab
v_a
le
del
to
en
am
m~
e sar ebb e
byt
un
di
o
buc
l
que
in
o
nat
zzi
aga
imm
ore
val
Il
ra).
figu
la
nel
,
uno
(il num ero
e
nch
nea
he,
ntic
ide
rle
era
sid
con
non
be
reb
pot
e
ttur
stru
due
le
del
to
indeflilto. Un con fron
ent e ugu ali ,
vam
etti
eff
sero
fos
2
ple
sam
e
1
ple
sam

mb
me
dei
ori
val
i
cui
in
o
cas
n eJ
un
di
hi
buc
due
nei
uti
ten
con
iti,
efin
ind
ori
val
i
che
le
abi
rob
imp
lto
mo
percli sar ebb e
byte, avessero lo Stesso con ten uto .

'

01100001

000 000 00

01100001

tipo
Figura I O. I Un possibile aJlineamento di memorizzazione per una variabile di

str uc t example mo stra un'area ind efin ita nella me mo ria.

352

LE STRU1"1 URE

I 0.3 Inizializzare le str ut tu re


d i inizializzazione. Per inizializzare una. stru ttura imm ette te nella sua dich iara zion e,
dop o il
nom e della variabile, un seg no di ugu ale e un elen co di inizializzatorj, racchiusi tra
par entesi graffe e separati da virgole. Per esem pio, la dicl1iarazione

Errore tipico 10.5

str uct car d a= { GThree " , uHe arts "} ;

Tentare di fare riferimento a un membro di r.tna stri-tttura, usando soltanto il 1zome del
membro.

cree r la variabile a di cipo str uc t car d (co me defi nita in prec ede nza) e inizial
izzer il
mem bro fac e con "Th ree " e suit con "He art s". Nel taso in cui ndJ 'ele nco ci
foss ero
mn o valo ri di inizializzazione di qua nti sian o i mem bri della stru ttura, que lli rim
ane nti
sarebbe ro inizializzaci automatic.a men te co n 0 (o NULL, qua lora il mem bro sia un pun
taco re).
Le variabil i di stru ctura dich iara ce all'ester no di una defi nizione di funzione saranno in irializza
ce
con 0 o NULL, q ualo ra non siano stat e inizializzare in mod o esplicico con tesr ualm ente
alla
.loro dichiarazion e. Le variabili di stru rru ra potr ebb ero anc he essere inizializzare con
istr uzion i di assegnameg.to, util izza ndo una variabile di stru ttura dell o stesso tipo, o asse
gna ndo
dei valori ai singoli mem bri dell a stru ttur a.

Errore tipico 1O. 6


Non usare le parentesi qualora si punti a tl.n membro di struttura, usando t"-n f~ntato~e
e l'operatore membro di stru.ttura (per esempio, *aP tr. sui t un errore dt sr.ntassi).
TI pro gram ma della Fig ura ] 0.2 mostrer l'uso degli ~pera.tori .n1~mbro di srru ttur a e ~u~to~
e
a struttura. Usando l'op erat ore mem bro di stru ttur a, aJ mem bn di a saranno assegnan
r1spe mvamente i valori "Ace'' e ''Sp ade s". Lin diri zzo della suu rrur a a sar assegnato al pun
tato re
apt r. U n'istruzione pri ntf visualizzer i mem bri della variabile a, usan do l'operator~ mem bro
di .srrurru.ra con il nom e di variabile a, l'op~ratore pun raro re a ~uurrura con apt r, e l operato re
mem bro di stru ttura on apt r, ovviamente dop o averne risolto il riferime nto.

I 0.4 Accedere ai me mb ri delle str ut tu re

prin1;f ( "%s" , a.s uit );

Lop eracore pun tato re a scruttura (che con siste in un segn o men o ( - ) e in un segno di mag
giore
(>), se11za spazi inre r::posci) accede ai mem bri di una stru ttur a, attraverso un pun tato re
alla
Supponete chsiastato di.chiara-ro ilpu ntatore aPt r , che sia stato farro puntare a str uct car d
e che l'indirizzo ddl a strurrura a sia stat o assegna to ad aPt r. Per stampare il mem bro sui
t della
suuttura a con il p11ncato re aPt r, porr ete usare t>isa uzio ne
p r i nt f ( %s
11

11
,

a Pt r -> s ui

1~

usa re gli ope rat ori membro di str utt ura


e pun tat ore a str utt ura */
#in clude <st d io . h>
str u ct car d {
cha r *fa ce;
cha r *su it;
};
m~in()

st ruc t car d a;
st ruc t car d *aP tr;

t );

L espr5Sione aPt r ->s uit equivalente a ( *aP t r) . suit , che risolve il riferimento del pun
tato re
e accede al mem bro sui t, usa ndo l'op erat or 1nemb.ro di stru tnir a. I n que sto caso, le
pare ntesi son o necessarie per ch 1'ope rato re mem bro di stru ttur a (. ) ha una prio rit
pi al ca
dell 'operato re di risoluzi one del riferimento (*). G li operatoci pun tato re a stru ttur a e mem
bro
di stru ttura, insieme alle parentesi tonde e a quelle qua dre ( [ ] ) usate per gli indici dei
vettori, han no la p:ciorit pi alca tra gli ope rato ri e associano da sinistra a destra.

a.f ace = ''Aceu;


a . s uit = "Spades " ;
aPt r = &a;

pr intf ("%s%s~s\ n%s%s%s\n%s%s%s \ n~,

a.f ace , " Qf '' , a. s ui t ,


aPt r-> fac e,
of ", aPt r-> sui t,
(*a Ptr ).fa ce, of u, (*a Ptr ) .s uit );
ret urn 0;
11

Buona abinvl.ine 10.3


Evitate di usare gli stessi nomi per i membri appartenenti a tipi di sb"t tttur a differenti.
li consentito, ma potrebbe ca11.sare confusione.

353

Errore tipico 1O.4


Inserire degli spttZi tra i caratteri "- "e '> "delL'operato~~pt.tntator~ a struttu,~a {co~ :~m~,inserirli
tra qit.elli di qu.al.siasi altro operatore formato da piu caratteri, a eccezione tir. ? : ).

Le stru rrur e pos son o essere in izial izzate, allo stesso mod o dei vett ori, usa ndo degli elenchi

Per accedere ai mem bri delle stru ttur e, pot rete usare due ope rato ri: l'operatore mem
bro di
struttura ( . ) (det to anc he operatore punto) e l'operatore pur1tatore a st1'7Uttura (- >) (tie tto
anc h operatore freccia). I..:operatore mem bro di stru ttur a accede a un mem bro dell
a stessa
attra~so il nom e della variab ile di stru ttura. Per esem pio , per sta1npa
re il mem bra sui t
della stru ttur a a della d ichiarazione prec ede nte, si use r l' istru zion e

LE UN IONI, LA GES'flON E DEI BIT E LE ENUM..f.RAZlON I

Bttona abitudine 1O.4

Ace of Spa des


Ace o! Spa.,oes

Non inserite degli spazi intorno agli operatori "> "e ''. ': Ci aiitter tJ evidenziare che
/,e <{Sflresiioni in cui quegli operatori sono contenuti sono essen~ialmente nomi di una singola
variabile.

Ac-e of Spades

Fig ura I O.l Usare l'op erat ore mem bro di stru ttur a e lop era tore puntatore a struttura.

354

CAPITOLO ] 0

LE STRUTTURE, LE UNIONI,

I 0.5 Usare le strutture con le funzioni

Spesso typedef usato per creare sinonimi per i tipi di dato fondamentali. Un programma che richiedesse un incero di quattro byre, per esempio, potrebbe usare un int su
un sist~ma e un long su un altro. I programmi p rogettaci per essere porcabiJi useranno
spesso typedef per creare u110 pseudonimo, come Integer per gli interi d i quattro byte.
Nel programma, baster modificare la sola definizione dello pseudonimo Integer, per
farlo funzio11a re su entrambi i sistemi.

,~er .p.assare una st~ut~a ~ una chiamata per riferimento, dovrete passare alla funzione l 1~d1r1zzo della variabile di struttura. Al pari di rune le altre, i vettori di srrurrure sono
passau automaticamente per riferipiento.
. Nel Capi~olo 6, abbi.a mo asser.iro che un vettore potr essere passato per valore me1
~an~e I uso di una struttura. Per passare un vettore per valore, dovrete creare una struttura
il cu1 men1bro sia il wttore. Dato che le scrutture sono passare per valore, il vettore sar
passato nello stesso modo.

Obiettivo portabilit 10.2


Usare typedef, per aiutare a rendere pi p ortabile il programma.

Errore tipico 1d.7


~it~ere che, in una c~iamattz_ di fun~ione, le strutture siano passate automaticamente per
riferimento, come avvzene per 1 vettori, e tentare di modificare i valori contenuti neUa strtittura del chiamante all'interno deUa fanzione chiamata.

10.7 Esempio: simulazione di un mescolatore


e distributore di car'te ad alta efficienza
Il progra m ma della F igura 10.3 basato sulla simulazione di un mescolatore e distributore
di carte discussa nel Capitolo 7 . Il program ma rappresenta il mazzo di cane in un vettore
di struttUie. Per mescolare e distribuire le caq_e, il programma utilizza degli algoritmi ad
alca efficienza. Nella Figura 10.4 mostr,ato l'output dcl programma.

Obie#ivo efficienza 1O. i


llJ:assaggio per rif:rimento delle _stro~re, in una chiamata a fonzione, un modlJ pit't ef
fiaente delpassaggioper valore (pozch il secondo mewdo richiede una cQj>ia de/Jzntera struttura).

I 0.6 Typedef
~ parol~ ~~v~ typedef ~o.~ce un m.eccanismo per creare dei sino nim i, o pseudon i-

m i, ~er 1 ap:1 di dato d~~a m precedenza. Per abbreviare i nomi dei rip di sTruttura,
questi sono spesso definiti con typedef. Per esempio, l'istruzione

typedef s tr uct card Ca rd ;

>

definir il nuovo nome di tipo Card come un sinonimo per il tipo struct card. Il pro~rammatore c usa sp esso typedef per definire un tipo di struttura) in modo da evirare
l uso della strucrure rag. Per esempio, la definizione seguente

t yped ef struct {
char *f ace;
char *suit
'
} Card ;
creer il tipo di struttura Card, senza la necessit d i un'istruzione typedef separata.
Buona abitudine 10.5

Scr_ivete in maiuscolo /,a prima lettera dei nomi definiti con typedef, in modlJ da rendere
evidente che sono dei sinonimi per i nomi di altri tipi di dato.
Card a questo punto potr essere usata per dicruarare ddle variabilj di tipo struct card.
La dichiarazione

Card deck[52 J ;

355

dichiarer un vettore di 52 srrucrure Card (ovverosia variabili di tipo struct card). C reare un
nuovo nome con typedef non significa creare un altro tipo; typedef crea sempJicemente un
nuovo nome di tipo, che potr essere usato come pseudoni mo per quello di un tipo gi esisrent. tJn nome significativo aiuter a rendere il programma auto-esplicativo. Per esempio, leggendo la dichiarazione precedente si sapr che "deck un venore di 52 Card".

Le strucrure possono essere passare alle funzioni, fornendo i singoli membri, l'intera srrunura 0
un pun.tatore ~stessa. Nd ~o in cui si for~sca a una fu nzione 11na srmcrura o i suoi singoli
membri, ~uesa s~o passau per valore. 01 conseguenza, i membri della strutrura dichiarati
nella funzione chiamante non potranno essere modificati da qudla chiamata.

, I

1.A G&i'TIONEDEI BIT E LE ENUMERAZJONI

All'interno del programma, la funzione f illDeck in izializzer il vettore di tipo Card


insere nd le carte, in modo ordinato, dall'Asso al Re d i ogni seme. Il vettore di tipo CarQ
sar q11indi passato alla funzione shuffle, in cui implementato l'algoritmo di mescolamento
ad alta efficienza. La funzione shuff le ricever come argomento un vettore d i 52 strutture di tipo Card. La funzione scorrer le 52 carte (gli indici d i vettore compresi tra zero e
51) usando una struttura far. Per ogni carta, sar selto un n11mero casuale compreso tra
zero e 51 . In seguito, la struttura Card corrente sar scambiata all'interno del vettore con
quella sdezionata casualmente. In un singolo passaggio sull'intero vettore di stru tture Card
si eseguira nno 52 scambi in rutto e, alla fine, questo risulter mescolato! Q uesto algoritmo
di mescolamento non p u dar luogo ad un differi mento in definito, come quello presentato
nel Capitolo 7 . Per distribuire le carte mesolat-e, l'algoi irmo di distribuzione ad alta_ efficienza implementato ndla fi 1nzione deal richieder soltanto un passaggio sul vettore, poi~
ch le strutture Card sono gi state scambiate di posto all'interno dello scesso.

Errore tipico I O.8

Dimenticare di includere l'indice di vettore, allorquando si faccia riferimento alle singole strutture di un vettore.

/* L' uti l izzo delle strutt ure nel programma per mescolare e
distribuire le car te * /
#i ncl ude <stdio.h>
#inc lude <stdlib . h>
(continua)
#incl ude <time. h>

356

LESTRU"I I'URE, LE UN tONl ,

CAPITOLO 10

voi d deal(Card *wDeck )

struct card {
char *f ace
char suit;'
};

i nt i ;
f or (i= 0; i<= 51; i++)
printf( . %5s of %- 8s%c'', woeck[ i ].face, woeck[i) . suit,
(i + 1 ) % 2? '\ t ' : '\n ' );

t ypedef st r uct card Card;


void f illDeck( Ca r d *, char * ( ), char *[] );
void sh uffle(Card *) ;
void deal(Car d *) ;

Figura I O.l Simulazione di un mescolatore e distributore di carte ad alta efficienza.

mai n()

.Eight of
Ei.ght of
seven of
Ace of
oeuce of
Sev'f!n of

Card deck[52];
char *face[ 1 = {"Ace", "Deuce *' , "Three ", "Four 11 , "Five '',
"Six", "Seven", "Eight ", '' Nine tJ , Ten ",
"Jack ", "Queen ", King ' };
char *s uit [] = { "Hearts", "Diamon ds
Cl ubs
"Spades
11

11

11

11

11

of
Jack
.
King of

};

srand(time(NULL )) ;
fi l l Deck(deck, f ace, s uit);
s huffle( deck) ;
deal (deck) ;
re tu r n 0;

Three of
Three of
Teo of
T~n of
Six of
Six of
Nine of
J ack oif
Kil\g of
Nihe of
Six of
oueen of
Ace of
.

vo i d f i llDeck(Card *wDeck , char *wFace[ ] , char *wSuit [ ])

i nt i

'

357

l.J\ G~"TlONE DEL BTT E LE ENUMER.AZlONI

>

f or (i = 0 ; i <= 51 ; i++) {
wDeck [ i]. f ace = wFace [i % 13];
wDeck[ i ] .su it = wS uit[i / 13 ];

King of

King of
aueen of
Four of
Four oi

}
}

Diarnonds
Clubs
Hearts
Clubs
Spades
Spades
Clubs
Hearts
Hearts
Clubs
Hearts
Clubs
Clubs
Hearts
Di-amonds
Spades.

Diamonds
Spades

Spades
Diamonds
Spades
Clubs
Spades
Hearts
Spades
Clubs
>

Ae-

,ttearts
Spades
of D.ramonds
of Diamonds
of Diamonds
o'f Clubs
of Spades
of Diamonds
of Diamonds
of Clubs

Of
FiY &-f

oeuc.e
Tn

Six

Deuce
Ten
Jacl<

Thr1!

Nin&
Deuce

:0f

Heart~

of Diamonds
Quen G-t Spades
Tnr~e . f Spades
Aee of Oiamonds
Fiv~ of Clubs
Se ~ 1 Cl:ubs
~OUf' Of H-earts
E.i glit {ff Spaes
Fiv of Diamonds
Nine f Hear ts
Five qf Hear ts
Four of Diamonds
'
Heig~t of Hearts
Jack of Hearts
ouen. of Clubs
Sv~n

'

void s huf f l e(Card *wDeck)


{

Figura I 0.4 L!output della simulazione di un mescolatore e dist r ibutore di carte ad alta

i nt i , j;
Card te mp;

efficienza.

f or (i = 0; i <= 51; i ++) {


j = ra nd() 9o 52;
t emp = woeck [i] ;
wOeck[ i] - wDeck [ j ] ;
wDeck[ j ] = temp ;
}
}

I 0.8 Le unioni
Un'ttnione, come una srruttura, un tipo cli daco derivaco i cui membri condividono lo
stesso spazio di m.emoria. In varie situazioni i11 un programma, alcune variabil i porrebbero
essere irrilevanti mentre aJtre porrebbero aon e~erlo; proprio per questo morivo, un11a io.ne co nd ivide lo spazio invece di sprecare la memoria per varjabiu che no11 siano uti lizzate.
I membri cli un,unione possono essere di qualsiasi tipo. li numero di byte utilizzato per
memorizzare un'u nione deve essere sufficiente a co nrenere il membro pi grande. Nella

358

WL1"0LO

1o

l$STRU'ITURE, LE UNlONI, LA GESTIONE DElBIT E LE ENUMERAZION I

maggior parte dei casi, le uo ioni conterranno due o pi cjpi di dato, ma si porr fa.re riferimento a un solo membro alla volca e, quindi, a un solo ripo di dato. Sar responsabilit del
programmatore assicurarsi che si faccia riferimento ai dari di un'unione con il tipo di dato

appropr1ato.

359

Errore tipico 1O. I1


Inizializzare un'unione, all'interno di una dichiarazione, con un valore di tipo differente da quello del sito primo membro.

Errore tipico 10.9

Obiettivo portabilit 1O.4

un errore logico usare un tipo di dato inadeguato, perfar riferimento a un membro definito

con un tipo diverso all'interno di un'unione.

La quantit di memoria richiesta pe-r memorizzare ttn'unione dipende


dall'implemnltaziorie.

Obiettivo portabilit 10.3

Obiettivo portabilit 10.5

Qualora abbiate fatto riferimento a un dato immagazzinato in un'unione usando un tipo


di dato diver:so da quello della sua dichiarazione, i risultati che, otterrete dipenderanno
da ll zmpkrrzent{!Zione.

Alcune unioni potrebbero non essere facilmente portabili su altri sistemi. La portabilit
di t,n'unione dipende spesso dalle necessit di allineamento in memoria, su un dato sistema, per i tipi di dato utilizz.ati dai membri dell'unione.

Un unione dichiarata con la parola chiave union usando un formato simile a quello
della d ichiarazione delle strutture. La dichiarazione della union

Obiettivo efficienza 10.2


Le unioni risparmiano la memoria.

union number {
int x;
float y;
};

Il programma della Figura 10.3 user la variabile value di cipo union number, per
visualizzare il valore immagazzinato nell 11oione sia come int e sia come f loat. Loutput dd
programma dipender dall 'implementazione. Lo stesso outpur dimostrer che la rappresencazion interna di un valore float potrebbe essere snsibilmente diversa da quella di un int.
1

indica che number sar un tipo union e che i suoi membri saranno int x e f loat y.
Normalmente, in un programma, la definizione di un'unione sar inserita in una posizione
precede1J,.te a quella della funzione main, cos) che la definizione possa essere usata in tutte
le funzioni del programma per dichiarare delle variabili.

/ * Un esempio di unione */

#include <stdio .h >


union number {
int x;
float y;
};

Ingegneria del software 10.1


Al pari di una dichiarazione struct, quella della union crea semplicemente un nuovo
tipo di dato. Posizionare una tlichiarazione union o struot al di foori di qua/si.asifanzione
non crea dunque una variabile globale.
Le operazioni ch_e possri essere eseguite con un'11nione sono: assegnare un'uoione a
un altra dello stesso tipo, rilv~ne l'indirizzo (&) e accedere ai membri di un'unione, usando gli operatori membro di srrunura e puntatore a struttura. Le i1nini non possono essere
confrontate, per le stesse ragioni per cui non possono esserlo le suuuw:e.

main ()
{

union number val ue;

value.x = 100 ;
printf{ "%s\ n%s\ n%s%d\ n%s%f\n\nn,
NPut a value in the integer member'',
"and print both members. " ,
value . x,
"int:
value . y};
"float:

In una dichiarazione, un 11oione pu essere inizializzata soltanto con un valore dello


stesso cipo del suo primo membro. Per esempio, con l'unione precedente, la dichiarazione

union number val u

11

= {10} ;

11

sarebbe una valida inizializzazione per la variabile value ddl' unione, perch questa sareb1be inizializzata con un int, mentre la seguente dichiarazione non sarbbe valida:

union number value

value . y = 100.0;
printf(''%s\n%s\n%s%d\n%s%f\nn,
''Put a value in the floating member d,
"and print both members . '',
value.x,
"int:
"float: ", value.y);
return 0;

= {1.43};

11

Errore tipico 10.1 O


Confrontare le unioni un errore di sintassi, a causa delle differenti necessit di allineamento sui vari sisttmi:

(continua)

CAPITOLO

36 0

Put a val ue in the int ege r member


and pri nt both members .

10

LE STRU'l' l'URE,

LE UNIONl, I.A GESTIONE DEI B11 E LE ENUMERAZIONJ

Op era tor e
,

100
int :
flo at: 0.000000

-a val ue in the flo a,t ing rnember


nd pri nt bot h members.
11096
int :
flo at: 100 .00 e00 0

Pu ~

mb ri.
me
i
bi
ram
ent
di
o
dat
di
tipi
i
con
one
uni
un'
di
ori
val
i
are
mp
Sta
0.5
I
Fig ura

I O. 9 Gli operatori bitwise


bit pu
ni
Og
bit.
cli
ze
uen
seq
e
com
er
put
com
dei
rno
nte
all'i
tati
sen
pre
rap
o
son
i
dat
L
Tutti
e
byt
un
a
form
bit
otto
di
za
uen
se:q
una
i,
em
sist
dei
te
par
or
ggi
ma
la
Sul
1.
o
0
ri
valo
assumere i
o
son
o
dat
cli
tipi
i
altr
Gli
.
r)
cha
ripo
di
ile
iab
var
una
per
ne
azio
rizz
mo
(l'unit standard di me
o usari
son
bit)
al
ati
ent
(ori
ise
bitw
ri
rato
ope
Gli
e.
byt
di
ore
ggi
ma
ero
num
un
in
ati
rizz
memo
1
Co1
.
ed)
ign
uns
o
d
gne
i
s
g;
lon
e
int
rt,
sho
ar,
(ch
ri
inte
di
ran
ope
loro
per gestire i bit dei
gli operatori bitwise si usano normalmente gli interi senza segno.

Obiettivo portabilit 1O.6


I rifultati delle manipolazioni bitwise dei da.ti dipendono dalla macchina.
le
te
stra
mo
nno
sara
e
ion
sez
sta
que
cli
ise
bitw
ri
rato
ope
li
sug
or1e
tazi
trat
a
o~ervate che nell
nua
em
sist
del
aca
agli
dett
e
ion
gaz
spie
wu
Pfil"
ri.
inte
cli
ran
pe
li
deg
arie
bin
oni
rappresentazi
emi
sist
"I
E,
e
dic
pen
l'Ap
ate
sult
con
,
2,,)
e
bas
in
ico
ner
nu1
a
tem
''sis
he
anc
tto
merico binario (de
vati su un
pro

sta
o
son
10
10.
e
9
10.
i
ion
Sez
e
nell
usi
incl
i
mm
gra
pro
i
,
ltre
Ino
i".
eric
num
bi
am
ntr
+.E
C+
1d
la1
Bor
il
ndo
usa
e
ibil
pat
com
PC
un
su
e
C~
ink
Th
il
ndo
usa
h
Apple Macintos
io11are sul
i sistemi usano interi cli 16 bit (2 byte). Questi programmi porrebbero anche non funz
.
wise
bic:
ni
zio
ola
nip
ma
e
dell
na
cru
m~c
a
dall
a
enz
end
dip
a
dell
sa
cau
a
,
ema
vostro si$t
ise
bitw
o
usiv
escl
OR
(0,
ise
bitw
vo
i1si
incl
OR
,
(&)
ise
bitw
D
AN
o:
son
ise
bitw
ri
Gli operato
bitwise
("), sconimento a sinistra (< <), scorrimento a destra (> >), e corrzplernerlto (,. ). Gli operator.i
eCop
di.
ran
ope
due
loro
dei
bir
olo
sing
i
ogn
o
tan
fron
con
o
usiv
escl
OR
e
o
usiv
incl
AN D, OR
i
enc
ond
risp
cor
lli
que
bi
ram
ent
lora
qua
o,
ltat
risu
del
bit
i
ogn
1
a
osta
imp
D
ratore birwise AN
l ogni bit del
a
osta
imp
vo
lusi
inc
OR
ise
bitw
tore
era
Lop
.
l
.o
sian
di
ran
ope
due
i
suo
ne;i
1.
sia
di
ran
ope
due
i
suo
nei
i
ent
ond
risp
cor
lli
que
di
bi)
a:am
e11
(o
W10
eno
alm
lora
risultato, qua
lli
que
di
uno
solo
lora
qua
o,
lrat
cisu
del
bit
u
ogr
1

osta
imp
o
usiv
escl
Loperatore bitwise OR
rrere in
sco
fa
isrra
si1l
a
o
ent
rrim
sco
di
e
tor
era
[op
1.
sia
di
ran
ope
due
i
suo
nei
i
ent
ond
corrisp
llo
que
da
cato
cifi
spe
te
vol
di
ero
num
un
per
,
stra
sini
di
do
ran
ope
suo
del
bit
i
quella direzi.one
del suo
di destra. I.:operatore di scorrimento a destra fa scor.rere in quella direzione i b.it
ise
bitw
e
tor
era
[op
ra.
desc
cli
llo
qt1e
,da
cato
cifi
spe
te
vol
cli
ero
num
W1
per
a,
istr
sin
di
oper:a11do
o
d.
ran
ope
suo
nel
i
nt
ond
risp
cor
lli
que
lora
qua
o,
lrat
risu
del
bit
i
1
a
osta
complemento imp
enti nel suo
ond
risp
cor
lli
que
a
alor
u
q
o,
lrar
risu
del
bit
i
0
a
osta
imp
nue
me
0,
a
ti
osta
imp
o
sian
re
rato
ope
i
ogn
cli
a
liar
tag
der
e
ion
uss
disc
W1a
are
crov
rete
Pot
.
1
a
ti
osta
imp
o
sian
operando
ura 10.6.
b.itwise negli esempi che seguiranno. Gli operatori bi.twise sono riepilogati nella Fig

361

Descrizione

I bit del risulearo son o impostati a 1, se quelli cor rispondenti


11ei due operandi sono enrrambi 1.
uno dei bir
: OR mclusivo bitwise I bir del risultato sono imposcari a 1, se aln1eno
corrispondenti nei due ope.rancli 1.
ricor
bit
dei
uno
solo
se
1,
a
ci
osta
imp
o
son
o
ltat
risu
del
bic
I
ise
birw
vo
lusi
" OR esc
spo ndenti nei due operandi 1.
num ero
un
per
do,
ran
ope
mo
pri
del
bit
i
a
istr
sin
a
e
rrer
sco
Fa
a
istr
sin
a
o
ent
rrim
<< sco
di voJte specifcato dal secondo operando; i bit rim.asti vt1oti a
destra sono riempici con 0 .
ero
num
un
per
do,
ran
ope
o
prim
del
bit
i
tra
des
a
e
rrer
sco
Fa
tra
des
a
o
ent
>> scorrim
cli volte specificato dal secondo operando; .il metodo di rien1_Pirnento dei bit rimasti vuoti a sinistra dipende dalla macchina.
1 son o
a
lli
que
ri
rur
e
1
a
ci
osta
imp
o
son
0
a
bir
i
tti
Tu
uno
a
nto
m
- comple
impostati a 0 .

& AN'D bitwise

Figura I 0.6 Gli ope rat ori bitw ise .

prerap
loro
a
11eU
ri
valo
i
zare
aliz
visu
e
util

ise,
bitw
ri
rato
ope
gli
no
izza
util
si
o
Qu and
Il
rj,
rato
ope
ti
det
d
su.
dei
o
fett
l'ef
nte
me
cisa
pre
re
stra
mo
da
do
mo
in
,
sentazione binaria
tazione
sen
pre
.rap
sua
la
nel
ned
sig
un
ro
inte
un
zer
aliz
visu
7
10.
ura
Fig
la
del
a
mm
progra
tore
era
l'op
r
use
ts
i
yB
pla
dis
one
nzi
ft1
La
bjr,
otto
di
ppi
gru
in
la
ndo
ide
div
binarla, sud
ise AN D
bitwise AN D per combinare le variabili val ue e dis pla yM ask . LOpfilatore birw
ostati a 1.
imp
bit
ci
cifi
spe
con
ro
inte
ore
val
un
ra:
che
mas
do
ran
ope
un
con
sso
spe
to
usa
gli
10
na1
--.cio
sele
si
e
ntr
me
,
ore
val
un
di
bit
uni
alc
e
der
o11
nasc
per
te
usa
o
Le maschere son
iJ
ato
egn
ass
sar
ask
yM
pla
dis
era
sch
ma
ile
iab
''ar
alla
ts,
i
yB
pla
altri. Nlla ft1.nzione dis
rsco
fa.r
a
istr
sin
a
o
ent
rrim
sco
di
tore
era
Lop
.
00)
000
000
00
000
100
(
15
valore 1 <<
ask
yM
pla
dis
di
tra)
des
a
pi
llo
que
,
osia
ver
(ov
o
ativ
ifLc
sign
no
me
bit
re.re il ~alore 1 dal
vuoti a
asci
rin1
bit
i
pir
riem
e
)
scra
sini
a
pi
llo
que
,
~ia
ero
(ovv
o
ariv
.ific
sign
pi
llo
a que
destra con 0 . I.:istruzione
0 ' };
pu tch ar ( val ue & dis pla yM ask ? '1
1

/* Vi sua liz zar e i n bit un int ero sen za segno */

#in clu de <st dio .h>


ma in ()
{

uns ign ed x;
voi d dis pla yB its (un sig ne d);
pri flt f ( "E nte r an uns ign ed int eg er: ") ;
sca nf ( "%u" , &x);
dis pla yB its {x );
ret urn 0 ;
}

(contin1111)

CAPIT OLO

362

/* usare gli opera tori biwis e ANO, OR inclu sivo,


OR esclu sivo e complemento * /

void displa yBits (unsig ned value)


{

un signe d c, displayMask

=1

363

LF. STRUTfURE, LE UNl ONT, LA G&>LJONE DEJ BIT E LE ENUMERAZJONl

10

<< 15;
#incl ude <st dio.h >

printf ("%7 u

= ",

value );
void displ ayBi ts (unsi g ned );

for (e= 1; e<= 16 ; e++) {


putch ar ( value & displyMask ?
value <<= 1;

1 ' : ' 0 1 );

man ()
{

if (e % 8 == 0)
putch ar( ' ');

numbe r1 = 65535;
mask = 1;
print f( "The resul t of comb ining the followi~g \ n ")
di splay Bits( number1);
di splay Bits(m ask);
print f( "usin g the bitwi se ANO oper~tor & is\n" );
displ ayBits (num ber1 & mask);

putch ar( '\ n

Enter an unsigned integ er: 65881


69891;

= i11 .l 1101

unsig ned number1, number2, mask, setB its;

:11181900

number1 = 15;
setB its = 241;
print f( "\ nThe resul t of combining the follow ing \ n");
displa yBits (num be r1 );
displ ayBi ts(se tBits );
is \ n'' );
print f("us ing the bitwi se inclu sive OR opera tor
displa yBits (num ber1 : setB its);

Figura I O.7 Visualizzare in bit un intero senza segno .


determ iner se per il bit pi a sinistr a della variabile value dovr essere visual izzato un 1
o uno 0. Suppo nete che la variabile value concenga 65000 ( 11111 101 11101 000). Nel
mome nto in cui value e displa yMas k sarann o combi nare usand o &, tutti i bic della
variabile value, eccett uato quello pi signifcanvo , sarann o "mascheraci" (nascosti) poich ogni bit "messo in AND" con 0 produ ce 0 . Qualo.r a il bit pi a sinistra sia un 1,
value & displa yMas k sar un valore diverso da O e sar quind i visualizzato un 1, altrimenti sar stamp ato uno 0. La variabile value sar quind i fatta scorrere a siniscra di un bit
dall'espressione value <<= 1 (che equivalente a valu e = value << 1). I sudde tti passi saranno ripetu ti per ogni bic del;J.a variabile unsig ned value . La Eigura 10.8 riepiloga i
risultaci che si otteng one dalla combi nazion e di due bit: con l'operatore bitwise AND.
Bit I

Bit2

Bit I & Bit 2

o
o
o

number1 = 139;
number2 = 199;
print f( "\ nTh e resul t of combining the follow ing \ n");
displ ayBit s(n umber1);
displ ayBit s(num ber2) ;
print f("us ing the bitwi se exclusive OR opera tor is \ nb);
displa yBits (num ber1 number2);
number1 = 21845;
pr intf(u \ nThe one 's complement of \ n ) ;
displ ayBi ts (number1);
pri ntf( "is\n ");
displ ayBi ts( - number1);

Figur a I 0.8 Risultati della combi nazion e di due bit con l'oper atore bitwis e ANO& .

Errore tipico 10.12


Usare l'operatore logicoAND (&&) invece dell'operatore bitwise AND (&) e viceversa.
1
uso degli operat ori bitwise ANO , OR
l
crer
d.imos
10.9
Il progr amma della Figura
inclusivo, OR esclusivo e compl ement o.Il progra mma use_r La funzione displ ayBi ts per
visualizzare i valori interi unsig ned. 'Lourpuc moscrato nella Figura 10.10 .

retur n 0;
}

void dispL ayBit s(uns igned val ue)


{

unsig ned cJ displayMask

1 << 15;

print f( "%7u = '' , vl ue );

(continua)

364

CAPil"O LO

1o

f or (e= 1; e<= 16; e++) {


putchar ( valu.e- & displayMask ? ' 1 '
value <<= 1

: '0' };

Lf: Sl'RU"l"fURE, LE UNIONT,

365

number1 e setBits saran no combi nare urili~ando ioperatore bicwise OR, il risultato
dell'espressione number1 l setBits sar 255 (00000000 11111111) . La Figura 10.1 1
riepiloga i risultaci che si ottengono dalla combi nazione di due bit co n l'o peratore birwise
OR inclusivo.

if (e % 8 -- 0 )

Errore tipico 10.13

');

putchar( '

LA GESTIONE DF.I BlT E LE ENUMEAAZJON I

Usare L'operatore Logico OR ( //) invece dell'operato1e bitivise OR ( / ) e viceversa.

putchar ( '\ n ' );


}

Figura I 0.9 Usare gli operatori bitwise ANO, OR inclusivo, OR esclusivo e complemento.
The result of cpinbining the f ollowing
65535 = 11111111 11111111
1 = 00000090 00000001
using the bitwise ANO operator & is
1 = 00000000 00000001
The result Qf combining the following
15 = 00@00000 00,001l11
241 = 00000000 11110001
using t he b>itwise inc.lusive
255 :::;, .0 000000 11 ~ 11111

' rhe

re~u1 t

139
199

using

L:operatore b itwise OR esclusivo (") imposta a 1 ogni bit del risultato, qualora uno solo
dei bit corrispo.n denti nei suoi due opera11di sia l. Nella Figura 10.9, alle variabili number1
e- number2 sono srari assegn.ati rispettivamente i valori 139 ( 00000000 10001011) e
199 ( 00000000 11000111) . Nel n1omento in cu i q ueste var.iab ili saran no con1b i.nate
1
usando l'operatore OR esclusivo, il risultato dll e5pressione number1 " number2 sar
00000000 01001100. La Pigtira I 0.12 riepiloga i risultaci che si ottengono dalla combinazioa~ di due bit con l'operatore bitwise O R esd usivo.
~pratore bicwise di complemento(- ) imposta a 0 rutti i bit del risultato co rrispot1-

denri a quelli che valgono 1 nel suo operando, roenrre imposta a 1 tutti i bit del rjsultato
corrispondenti a quelli che valgono 0 nel suo operando (operazione detta anche "prendere
il complemento a uno del valore"). Nella Figu ra 10.9 alla variabile number1 sar assegnato
il valore 21845 ( 01010101 01010101) . Nel momento i11 cui l'espressione - number1 sar
valutata il risultato sar ( 10101010 10101010) .
1

o..t coml!>ining th e
1

= 0010000
= 00000000

10001011
11000111

the bitwise exclusive


76

= 00000000

The one s
21845

~1901100

co~plement

= 01010101

'

of

01010101

is
43690 ~ 10101010 10101010

Figura I O. I O L:output del programma della Figura I O. 9


Nella Figura 10.9, alla va riabile intera mask sar assegnato il valore
1 (00000000 00000001) e alla variabile number1 sar assegnato il valore
65535 ( 11111111 11111111 ) . Nel 1nomer1to in cu i mask e number1 _s aranno co mbina.te
usando l'operatore bicwise AND (&)~ il risultato dell'espr ession e n~mber1 & niask sar
00000000 00000001 . Tutti i bit nella variabile number1 , eccettuato quello meno significativo, saranno mascherati" (nascosti) "mettendoli in AND'' con la variabile mask.
Loperatore bitwise OR incl usivo usato per impostare a 1 determinat i bit di un
operando. Nella Figura 10.9 , alla variabi le number1 sar assegnaro 15 ( 00000000 00001111)
e alla variabile setBits sar assegnato 241 ( 00000000 11110001 ) . Nl momento in cui

Figura I 0.12 Risultati della combinazione di due bit con l'operatore bitwise OR esclusivo "' .

11 programma della Figura 10.13 di mosrrer l' uso degli oi1eraro ri di scorrimento a
sinistra (<<) e a destra(>>). La funzio ne displa,y Bits sar usata per visualizzare dei valori
interi unsigned.
l!operatore di scorrimento a sinistra ( <<) f scorrere in quella direzjo11e i bit del suo
operando di sinistra, per un numero di volte specificato da quello di destra. I bit svuotaci
a destra saranno soscituici con degli 0; gli 1 scivolaci via da sinistra andranno p ersi. Nel
programma della F igura 10.13, aJla variab ile number1 sar assegnato il valore

CAPITOLO 10

366

LESTRUTIURE, LE UNIONI,

960 ( 00000011 11000000). Il risultato dello sco rrimento a sinistra di 8 bit della variab ile number1 nell'espressione number1 << 8 sar 49152 ( 11000000 00000000).

The result of le~ shifting


960 = 00000011 11000000
8 bit positions using the left
49152 = 11000000 00000000

Loperatore di scorrimento a des~ (>>) fa s:orrere in quella ~~ione i bit ~el suo
operando di sinistra, per un numero di volte specificato da quello. di ~esrra. ~e~Jr~ un~
scorrimento a destra su on intero unsigned provocher la sosaruz1one de1 btt amasti
vuoti a sinistra con degli 0 ; gli 1 scivolati via da destra andranno persi. Nel progr~a
della. Figura 10.13, il risultato dello scorrimento a destra della. variabile number1 nell espressione
number1 >> 8 sar 3 (00000000 00000011).

367

LA GESTlONE DEI BIT E LE ENUMERAZIONI

~hift

operator << is

The result of right shifting


960 = 00000011 11000000

bit positions using the right shift operator >> is


3 : 00000000 00000011

/ * Usare gli operatori bitwise di scorrimento *I

#include <stdio .h>

Figura I 0.13 Usare gli operatori bitwise di scorrimento.

Errore tipico 10.14

void displayBits{unsign ed);

IL risultato dello scorrimento di un valore sar indefinito, qualora /'operando di destra

main()

sia negativo o sia maggiore del numero di bit in cui immagazzinato /'operando di

sinistra.

unsigned number1

= 960;

printf( "\ nT he result of left shifting\n");


displayBits(number 1);
printf ( "8 bit positions using the ") ;
printf("left shift operator<< is\n");
displayBits(number1 << 8);
printf( "\ nThe result of right shifting \ n'') ;
displayBits( Aumber1) ;
printf ( "8 bit positi0ns using t he ~ );
printf( '' right shift operator >> is\n");
displayBits(number1 >> 8);
return 0;
1

ILrisultato di tJ.no scorrimento 11 destra dipende dalla macchina. Lo scorrimento a destra di un intero con segno riempir i bit svuotati con 0, su alcune macchine, e con 1
su altre.
'l'uni gli operatori bicwise (eccettuato quello di complemenco bicwise) han.no un corrispondenEe operatore di assegnam ento. Nella Figura 10.14, sono mostrati gli operatori di
assfgpttfflmto bitwise; questi operatori sono usaci in modo simile a quelli di assegnam.e11to
acinerici inttodocti nel Capitolo 3.

Operatori di assegnamento bitwise


Operatore di assegnamento bitwise AND.

&=

void displayBits(unsigne d value)


{

unsigned c, displayMask
printf( "%7u

1 << 15;

val ue);

= ",

for (e= 1; e<= 16; e++ ) {


putcha r(value & displayMask ? ' 1 ' : ' 0 ') ;
value <<= 1;
if (c % 8 =
putchar{

putchar( ' \ n

0)

,_
,"'-

Operatore di assegnamento bitwise OR esclusivo.

<<=-

Operatore di assegnamento scorrimento a sinistra.

>>=

Operatore di assegnamento scorrimento a destra.

Operatore di assegna mento bitwise OR inclusivo.

Figura I 0.14 Gli operatori di assegnamento bitwise.


La Figura 10.15 mostra la priorit e l'associativit dei vari operatori introdotti fino a
quesr~ punto nel testo. I suddetti so no mostraci, dall'alto in basso, in ordine decrescente di
precedenza.
Operator:e

1ipo

da sinistra a destra

massima

) ;

AssociatMt

() [ 1 .

Obiettivo portabilit 1O.7

->

++ -- I

(tipo )

&

* -

sizeof da destra a sinistra

unario

);

* I

da si nistra a desrra

moltiplicativo

da sinisrra a desrra

additivo

CAPtTOLO

368

10

LESTRU lTUR E, LE UNIO NI,

LA GES1 'l()N E DEl DITE LE E.NU1vfERAZJONl

369

dri, 1 = Cuo ri, 2 = Fior i, 3 = Picc he), e 2 bit so no in grad o di mem oriz zate val ori co111 _
presi tra 0 e 3. Il mem b ro col or infllle immagazziner 0 (Rosso) o 1 (Ner o), e J bi r
appu nto in g.rado di n1emori~e 0 o 1.

Ope rato re

tivit
A
c1a
.45so

liapo

<< >>

da sinis tra a dest ra

scor rime nto

da sinis tra a dest ra

relaz.ionale

da sinis tra a dest ra

ugua glian za

&

da oSinistra a dest ra

AN D bitw ise

,..

da sinis tra a dest ra

OR bitw ise esclusivo

da sinis rra a destra

OR birw ise inclu sivo

cam po di b1c dell e srru nure s1 acce de esat tam e nte com e a ogn i loro alrro n:iembro. Il
m embro col or stato incl uso con l' inte nzio ne di nc:Ll care il colo re della carta , p er un
siste ma Ghe consenca la visualizzazio ne dei colo ri.

&&

da sinis tra a destra

AN D logi co

/ * Esempio di util izz o di un campo di bit * /

I I

da sinis tra a dest ra

OR logico

da desrra a sinis tra

cond izion ale

da desa a a sinistra

asse gnam ento

da sinis rra a desr ra

virg ola

<

--

<= >

>=

1=

I
I

I I

?:
=

+= = *= I=

%= &=

: = "= <<= >>=

'

Figu ra I 0.15 Prio rit e associativit degli ope rato ri.

U prog ram ma della Eigw:a 10.16 (il cui oucp ut m oscrato nella Figu ra 10.17) cree r il
vetto re dec k cont enen te 52 srru c:cure dj cipo stru ct bitC ard . La funz ione fill Dec k
inse rir l~ 5~ carte nel vercore d_e ck e dea ! le visua lizze r. Osse rvat e che ai mem bri di cjpo

#in clude <std io.h >


stru ct bitC ard {
unsi~ned face : 4;
unsigned sui t : 2;
unsigned colo r : 1;
};

IO. IO

I cam pi di bit

Il C offre la poss ibili t di specificare in quan ti bit dovr essere immagazzi nato un n1em bro
uns igne d o int di una scru ttura o di un' unio ne: ques ta cara tteristica derr a campo di bit.
I campi dj bit cons ento no un mig liore utilizzo della m emoria, imm agaz zina ndo i dari nel
min or numero di bir necessario. I mem bri di un cam po di bit dvor10 essere dich iara ti
com e int o uns igne d.

Obiettivo efficier1za 10.3

typ ede f stru ct bitC ard Card;


void fil l Deck (Ca rd *);
veid dea l (Car d *);
mai n()
{

Card deck [ 52 J;

I campi di bit aiutano a risparmia re la memoria.

fill De ck( deck) ;


dea l (deck) ;

Con siderari! la segu en te de.fuiizione di stru ttura:

stru ct bitC ard {


uns igne d face : 4;
uns igne d sui t : 2;
uns igne d colo r : 1;
};
La defi nizio ne cont ie ne 'tre can1pi di bit uns igne d (fac e , sui t e col or) 'usaci per rapp resent are una delle 52 carte di un mazzo. Un cam po di bit dich iarat o face ndo segu ile al
nom e di un m emb ro uns igne d o int il car~ttere due pun ti ( : ) e una cost ante inter a, che
rapp rese nta la dimensione del cam po, vale a dire il num ero di bit in cui sar immagazzina to
il m em,b ro. La cost ante che rapp rese nta la dim ensi one dovr esse re un intero compreso tra
O e il l'.lwnero tota le di bit usato pe.r immagazzina re un int sul vost ro siste ma. I nost ri
esem pi sono stati prov ati su un comp uter con inceri di 2 byre (16 bit).
La definizi11e di stru ttura prec eden te indi ca che il membro f ace sar imm agazzina to
in 4 bit, sui t in 2, e col or io 1. Il nt1rn ero dej bit basa to sull' intervall o di valo ri
desi dera to per ogn uno dei mem bri inclusi neUa stru ttura. Il metn bro f ace immagazzine r
valo ri com pres i tra 0 (Asso) e 12 (Re) , e 4 bit sono in grad o ru 1nem oriz zare valo ri
com pres i tra 0 e 15. Il mem bro sui t imm agaz zine r valo ri compres i tra 0 e 3 (0 = Qua -

retu rn 0;
}

void fill De ck(C ard *wDeck)


{

int i,

for {i = 0; i<= 51; i++) {


woe ck[i ] . face = i % 13 ;
wDeck[i] .s uit = i I 13;
wD eck [i].c olor = i I 26;
}

I * La fun zion e dea l vis uali zza le car te in un form ato a due colo nne */
I* La colo nna 1 con tien e le car te da 0 a 25 ind iciz zate da k1 */
/ * La colo nna 2 contien e le car te da 26 a 51 i ndi cizz ate da k2 * /

(continiuz)

CAPnoto 10

370

LESTRUTIVRE, LE UNIONl, LA GESTIONE DEI 131T E LE ENUMERAZfONI

371

uns igned b : 4;

void deal(Card *wDeGk)


};

i ntk1, _k2;

usa come riempitivo un campo non denominato cli 3 bit (in questi non si porr iinmagazzinare niente). Il membro b (sul n.osrro computer con una word di 2 byte) sar imma1
gazzinatp in un al tra unit di memoria.

fo r (k1 = 0, k2 = k1 + 26; k1 <= 25; k1++, k2++) {


",
printf( "Card :%3d Suit: %2d Color :%2d
woeck[k1J .face, woeck[k1).suit, wDeck[k1] .color);
printf( "Card:%3d Suit:%2d Color:%2d \ n'',
wOeck[k2] . face, wDeck[k2).suit, wDeck[k2) . co!Qr);

Un car:zpo di bit non denominato con dimensione zero usato per allineare il campo di
bit sUcc;ss1vo su un nuovo confine di unrt di memoria. Per esempio, la definizione di
struttura

st r.u.ct example {
unsi{!;lned a : 13.,
: 0j
unsi gned
uns i gn ed b : 4 ;
};

Figura I 0.16 Usar e i campi di bit per immagazzinare un mazzo di carte.

Card:
Card:
Card:
Card:
Card :
Card:
Card :
Card:
card :
Card:

0 sui t: 0 Color:
1 Sut: 0 Color:
2 Su.t t: 0 Color:
3 Su.\t~ 0 Color:
4 Suit: 0 Color:
5 Suit: '0 Color:
6 Suit: 0 Color :
~

7
8
9

suit: e
su it: 0
Suit: 0
Suit: t
$:ui t ~ 0

0
0
0

0
0

0
Color: 0
color: 0
Color: 0

Color:
Color:
,
card: 1$ S,;Yit: 0 Col or:
Card; 0 ~it: 1 Col or:
Card: 1 Suit,: 1 co1or~
Card: 2 Sui t: 1 Cplor:
Card: 3 S'!ict : 1 dolor:
Card: 4 Suit: 1 Color:
Card: 5 Suit: 1 Color:
Card: 6 Suit: 1 Color:
Card: 7 S,ui t: 1 Col.o r:
Card: 8 SUi t: 1 Color:
Color:
1
t:
card: 9 Sui
.
Card: 10 Suit: 1 Color :
Card: t1 Suit: 1 Color:
Card: 12 Suit: 1 Color:

Card: 10
Card: 11

0
0

0
0
0
0
0
0
0
0
0
0

Suit: 2
1 Suit: 2

Card:
Card :

Card:
Card:
Card:
Card:
Card:
Card :
Card:
Card:
Card:
card:
card:

2
3

Cal"d:

Card:
Card:
Card:

Sui-t : 2

Suit:
8 Suit:
9 Suit :
10 Sui t:
'11- Sui t:
7

12
0
1
2

3
4

1
1
1
1
1
1

Obiettivo portabilit 1O.8


I risultati delle marzipolazioni dei campi di bit dipendono dalla macchina. Alcuni computer, per esempio, permettono che i campi di bit attraversino i co1ifni di una parola,
mentre altri non lo consentono.

1
1
1
1

2
2 ectlor: 1

Errore tipico 10.15

t
Color:
.
1
sutit : 2 Co.lo~:
'
Suit: 3 Co1o r: 1 ;,;:,,,;;..
Suit : 3 coio.r: 1
Sui t: 3 Color: 1
Suit; 3 Color: 1
Suit: 3 Color: 1

Tentare di accedere ai singoli bit-di un campo di bit come se fossero ele1ne1'Jti di itn vettore. I campi di bit non sono "vettori di bit".

';i

Card :

Card: 12

Suit :- 3
Suit: 3

Errore tipico 1O. 16


Tentare di rilevare L'indirizzo di un campo di bit (!operatore & non pu essere usato con
i campi di bit, perch questi non hanno un indirizzo).

11

Obiettivo efficienza 1O. 4

Color: 1
Color : 1

Per qi-tanto consentano di risparmiare dello spazio, i campi di bit potrebbero costringere il compilatore a gerzerare un codice in linguaggio m(J.Cchina pi lento. Ci accade
perch, per accedere alle porzioni di un'unit di memoria indiriZZAbi!e, sono necessarie df/e ope~azioni aggiu~tive in li~guaggio macchina. Questo uno dei tanti esempi
del genere dt compromessi tra spazio e tempo c/Je si presentano ir1 informatica.

Sut: 3 Ce>lor : 1
Suit:
Suit:

'3 Color:
~

Su'i 't.: 3

,Color:

t
1

Cctlpr: 1

Figura I 0.17 L:output del programma r:tella Figura I 0.16.


possibile specificare un campo di bit non denominato. ln tal caso, il campo sar usato
nella struttura come un riempitivo. Per esempio, la defuzione di struttura

struct example {
unsigned a : 13;
: 3;
unsigned

user un cam po non denominato di 0 bir, per saltare i bit rimanenti (runi quelli che ci
so.no) dell'unit di memoria in cui sar stata immagazzinata a , allineando b con il confine
suecessivo dell'unir di memoria.

Card :
Card: 5 Sui t: 3 Color ~ 1
Card: 6 Suit: 3 Color : 1
Card: 7
Card: 8
Ca rd: 9
Card: 10

Suit : 2

Su i t: 2
Suit: 2
Suit: 2

Color:
Color:
Col or:
Cb lor:
Color:
COlor:
Col.or:
Color:
Color:
C6 lor:

I 0.111
ne

Le costanti di enumerazione

fernisce un ulri m'O tipo di dato defnibile dall' uren.ce: I' enun1erazione. Introdotta
dalla ~arol~ chiav~ enum, un' enumerazi.one un i11sieme di costanti intere ,(appresenra~
te da 1den t1fcato r1 . Queste costanti di enumrazione sono, in effetti, delle costanti simboliche i cui valori possono essere impostati automaticamente. I valori di una enum

372

CAPITOLO

10

LE si RUTJlJRE, .LE UN ION l, LA GES"ll ON.E DEI ~IT E LE ENUMERAZIONI

inco mi11ciano da 0, sempre che non sia stato diversam e11te speificato, e so no inc rementati di 1 . Per ese mpio, !,enumerazio ne

printf (M%2d%11s \ n", month , monthName[monthJ);


r eturn 0;

enum months {JAN, FEB, MAR, APR, MAY, J UN, JUL, AUG, SEP,
OCT, NOV, OEC};

creer un nuovo tip o, enum months, i11 cui gli identificatori saranno impostaci automaricamente con gli interi compresi tra 0 e 11 . Per nun1erare i m esi con i valori compresi rra
1 e 12, usare la seguente en11merazione:

enum months {JAN

373

1
2

3
4
5

= 1 , FEB, MAR, APR, MAY, JUN, JUL , AUG,


SEP, OCT, NOV, OEC};

Dato che il primo valo re della precede nte enun1e.raz io11e sar impostato es plic iram e11re
a 1, i valori rini.anenti saranno in cre n1e1i.tati inco1ninciando da 1 ~ producendo vaJori
co mpresi rra 1 e 12. Gli identificarori incl usi in un,enun1 erazion e devono esse re univoci. I l valore di ogni cosrant-e dj enumerazion e pu esse-re impostato esplicitan1ente
all' interno della definizion, assegnar1do un va lo re all' identifi catore. Uno stesso valore
in tero po rr essere assegnato a va ri ni embri di un'enu m erazione. Nel p rogramma dell a
enumerazione month sa r usata in una struttura for p er
F igu ra I 0.18, la variabile
visualizzare j mes i dell 'anno in clusj nel verrore monthName. Notate che abbiamo assegnato a monthName[0] una stringa vuo ra .Altri prog rammatori p referirebbero invece assegnare a monthName[0] un valo re com e ***ERROR***, per indicare l,occorrenza
di uo errore logico.

'

6
1

8
9
10
11
12

January

February
March
Apri l

May
June
July
Augu st
S:ept elflbe r
Oc t obe r
November
Oe cembe r

ru

Figura I 0.18 U sar e un'enumerazione.

Esercizi di autovalutazione
10. l

Errore tipico 10.17


Assegnare un va/ore a una costante di enumera~ione, dopo che si{l. stata definita, 1,(,12
errore di sin.tassi.
Buona abitudine l O.6

Usate soltanto le lettere mai11scole nei nomi delle costanti di enumern.z,o1'te. Ci evidenzier
tali costanti all'intmo di un programma e ricorder al programmatore che le costanti
di enumerazione non sono delle variabili.
/ * Usare i l tipo enumerazione * /

#include <stdi o.h>


enum months {J AN = 1, FEB, MAR, APR, MAY, JUN,
JUL, AUG, SEP, OCT, NOV, OEC};
main()
{

enum months mont h;


e ha r * mo nt hName [ ] = { u 11 , 11 J a nua r y '1 , 11 Fe b r ua r y , '' Ma re h 11 ,
11
Ap r il " , "Ma y " , 11 J un e 11 , "J u1 y '1 ,
'' Aug ust tl "September '' " Octobe r ~
"November '1 , 11 December "};
l

for (month = JAN; month

Riempite gli spazi in ognuna delle seguenti righe:


una collezione di variabili correlare socco LLn unico nome.
a) Ona
una collezione di variab ili sotto un unico nome in cui esse condivib) Una
aono lo Stesso spazjo di memo.ria.
saranno impostari
e) I bit del .risulraco di wespressione che urilizzi l'operatore
a l , qualora quelli corrispondenti in ognuno degli operru1di sian.o irnposrati a 1. Alcrimen
sara.nno 1mposrar1 a zero.
r1,
.
d) Le variabili dichiarare in un.a defnizione di strurrura sono i suoi
saranno imposrati
e) I bic nel risulraco di un'espressioJ1e che urilizzi l'operatore
a l , qualora aln1eno uno di quelli corrispondenti in uno o l'alrro degUoperandi sia impostato a 1. Alrrirnenri, saranno im poscaria zero.
inrroduce una dichiarazio ne di srruccura.
f) La parola chiave
usata per creare un sinonimo per un tipo di dato definire
g) La parola chiave
in precedenza.
saranno imposraci
h) I bit nel risultato di un'espressione che utilizzi l' operarore
a 1, qualora solo uno di quelli corrispondenri nej suoi due operandi sia imposraro a 1.
Altrin1enti, saranno impostati a zero.
i bit, vale a dire per selezionarj) ~operatore birwise AN O & usato spesso pcr
ne alcuni all 'interno di una sequen7..a, memre si azzerano gli altri.
usaEa per introdLLire una defin izione di unione.
j) La parola chiave
.
J<) Il nome della struttura detto anche suucrwe
o con l'operatore
I) Sj accede a un membro di una scru.rcura con l'operacore

<=

DEC; month++)

- - - - - -

sono usati per far sco rrere rispettivam.enre a


e
m) Gli operatori
sinistra e a destra i bir di un cerco vaJore.
un insieme di inceri rappresenraco da idencifcacori.
n) Un'

LE STRUl"I V.RE, LE UNIONl,

CAPITOLO 10

374

P = e;

Risposte agli esercizi di au tov alu taz ion e


10.1 a) struc:rura; b) unio ne; c) AND birwise (&); d) membri; e) OR inclusivo birwise ( : ); f) stru ct;
g) type def; h) OR esclusivo bicwise ("); i) mascherare; j) unio n; k) rag; I) membro di srrurrura,
puntatore a srrurrura; m ) operatore di scorrimenro a si nisu a (<<), operatore di scorrimento a destra
(>>)'; n) enumerazione.

10.3 Scrivere una singola isrruzione o un insieme di istruzioni che svolgano ognu no dei se..
.
guenr1 comp1u:
a) Defirite una scrucrura chia mata part contenenre la variabile int partNumber e il vercore
di char partName , i cui valori possono essere lClnghi 25 caratteri.
b) Definire Part come sinonimo del ci po stru ct part .
c) Usando Part dichiarare la variabile a eiJ verrore b[ 10] di tipo stru ct part , e la variabile
ptr come puntatore a stru ct part .
d) Leggere dalla tastiera un numero e un nome di parte e imm agazzinaceli nei singoli _membri
della variabile a.
e) Assegnare all'el.emento 3 del vettore b i valori contenuri nei membri della variabile a.
f) Assegnace al la variabile puncarore ptr l'indirizzo del venore b.
g) Usando la variabile ptr e l'operarore puntatore a srruccura per puntare ai membri, visu.alizzace
i valori contenuti in quello dell'elemento 3 del vettore b.

10.2

a) Falso. Una strucrura pu contenere molti tipi di dato .


b) Fal$o. Le unioni non posso no essere confroncate, a causa degli stessi problemi di aJlincamento associati alle scru tture.
c) Vero.
d) Falso. I membri di scrurrure distinte posso no avere lo stesso name. men rre queUi della
medesima srrurrura devo no avere nom i univoci.
e) Falso . La parola chiave type def usata per definire nuovi non.li (sino nimi) per cip i di daco
definiti in precedenza.
f) Falso. Le srru tture sono sempre passare per valore nelle chiamare- di funzione.
g) Vero, a causa dei problemi di allineainenro.

10.3

a) st ruct part {

int partNumber;
char partName[25J;
};

Tiovate l'errore in ognu no dei seguenti esercizi:


a) Supponete che stru ct card sia srata definita e che contenga due puntatori a1 cipo char ,
chiama face e suit . Supponete inoltre che siano stal:e dichiarare le variabili e di tipo
stru ct card e cPtr come puntatore~ stru ct card e che alla var.iabile cPtr sia srato
assegnaro l'indirizzo di c.

b~

e)
d)

e)
f)
g)

prin tf( "%s \ n", *cP tr >fa c );


e che con.tenga due puntatori al cipo
ica
defn
stara
gi
sia
b) Supponece che stru ct card
,,
char, chiamaci face e suit . Supponeceinolcre che sia staro dicbiaraco il verrore hea rts[ 13)
di cipo stru ct card. tisrr uzie ne segu~11ce dovrebbe visualizzarei1 membro face dell'elemento 1O del vecrore.
p.r intf ( '%s\ n''
~

V=-

type def stru ct part Part ;


Par ta, b[10 ], ptr ;
scanf("%d%s " 1 &a.partNumber, &a.partName);
b(3) = a ;
ptr = b;
pri ntf( "%d %s\ n" , (ptr + 3) ->partNumber,
(ptr + 3) ->partName);

10.4 a) Errore: le parenresi che dovrebbero racchiudere *cP tr sono stare omesse, causando un
ordine soori etto di valutazione dell'espression e.
b) Errore: l'indice del vetto re scaco omess. L'esp ressio ne dovrebbe essere hea rts [ 10]. face .
e) Errore: un' unione pu essere inizi alina ca soltanto con un valore deUo Stesso cipo del suo
primo membro.
d) Erro re: richiesco un punt o e virgola per terminare trna definizione di struttura.
e} En:ore: la paro la chiave stru ct stara omessa dalla dichiarazione della variabile.
f) Errore: le variabili di tipi di scrurrura differenri non possono essere assegnate l' una all'alrra.

hea rts.f ace) ;

union valu es {
char w;
floa t x;
doub le Yi
}

375

f) Assumere eh.e siano srare dichiarare le variabili p di tipo stru ct person e c di ripo stru ct card.

10 .2 Decerminare se ognu na dell e seguenti affermazioni sia vera o falsa. Qualora sia fa lsa,
spiegacene il n1otivo:
a) Le strutture possono contenere solcanto un cipo di dato.
b) Due wlioni possono essere confrontare per determinare se sono uguali.
c) 11 tag name di una scrurcura opzionale.
d) I membri di strutture differnri devono avere nomi univoci.
e) La parola chiave type def usata per d.finire nuovi cipi di dato.
f) Le srrurcure son.o sempre passaLe per riferimento nelle cbia:mace di funzione.
g) Le strut ture n.on possono essere confrontate.

10.4

LA GESTlONE O.El BIT E .LE ENU MERAZIO Nl

{1.2 7}j

Esercizi

d) stru ct pers on {

char lastN ame [15J ;


char f irstName [ 15];
int age;

10.S

e) Assumere che stru ct pers on sia stata dichiarata come nella parre (d), ma con l'appropria
ta correzione.
pers on d;
'

Fornire I.a definizione per ognu na delle seguenci strurrure e unioni:


a) Una struttura inve ntor y che contenga il vettore di cararreri part Nam e[30 ] , l'intef\o
partNumber, il numero in virgola mobile pric e e gli interi stoc k e reor der.
b) Un' unio11e data che contenga char c, sho rt s, long l , floa t f e dou ble d.
c) Una strurrura chiamata add ress che contenga i vectori di caratteri stre etA ddre ss [ 25 J,
city [20] , stat e[3J e zi.pCode[6] .

376

CAPITOLO

10

d) Una scrurrura student che concenga i verroci di caratteri f i rstName [ 15] e las tName [ 15 ) ,
e la variabile homeAddress dcl cipo s truct add r ess defi nito nella parce (c) .
e) La struccura test che contenga 16 campi di bir di lun ghezz..1. l . l nomi dei can1pi di bir
sono le lecrere COIJ'.lprese era a e p.
1O. 5

Date le seguenti defullzjoni di scrurrure e dichiarazioni di variabili,


struct customer {
cha r lastName[15 1;
char f irstName [ 15] ;
i nt customerNumber;
struct {
char phoneNLlmber [ 11 ] i
cha r add ress[50];
char city [ 15);
char state[3];
char zipCode[6J;
} personal;
} customerRec ord, *customerP tr;
customerPtr

= &c ustomerRecord;

scrivere un'espressione separata cl1e possa essere usara per accedere <ti n1embri dclla strurtura in ognuna
delle seguenci parei.
a) Membro lastName della scrurrura customerRe cord.
b) Membro lastName della srruttura pun raca da customerPt r.
c) Membro f i rstName della srrurrura customerRe cord.
d) Membro firstName della struttura punrara da customerPt r.
e) Me111bro customerNumber della strucrura customerRe cord.
f) Membro customerNumber della scrutrura puncaca da customerPt r.
g) Membro phoneNumber del membro persona! della struttura customerRe cord.
11) Membro phoneNumber del membro persona! della scruttura puntata da customerPt r.
i) Membro address del membro personal della strurrura customerRe cord.
j) Membro address del merrtbro personal della struttura puntata da customerPt r.
k) Membro city del membro persona! della struttura customerRe cord.
l) Membro city del membro persona! della srrurrura punrar:a da customerPt r.
m) M e1nbro state del m.enibro persona! della srrurrura customerRe cord.
n) Membro state del men1bro persona! della struttura puncar:a da customerPt r.
o) Membro zipCode del membro persona! della struttura customerRe cord.
p) Membro zipCode del membro persona! dellasrrurrura puntatada customerPt r.

LESfRU'l'I URE, LE UNIONI , l.J\ GESTIONE DFJ BIT E LE tNUMERAZIONI

377

variabili di un'unione di ti po un i on f loati ngPoint . Ogni variabile dell' unio11e dovr essere visual izza.ra come un f loat, un double e un long double. Tvalori saranno sem pre srampari correccamenre?

10.J o Scrivete un programma eh.e faccia scorrere a destra di 4 bic un a variab ile inrera. li programma
dovr visualizzare l' in cero in bit, prima e dopo l'opetazione di sco rrin1ento. Il vosrro sistema m.ercer
degli O o degli l nei bic svuoraci?
10.11 Modifcace il programma della Figura 10.7, in modo che possa funzionare con inceri di 4 byte,
qualora il vosrro computer usi inceri di 4 byre.
10.12 Far scorrere a sinistra di 1 bic un intero unsigned equivalen te a niol ciplicare il valore per 2.
Sc::civere la. fun1j.one power2, che accerti i due argon1enci interi number e pow e calcoli
num
ber * 2Pll'
'
Usare l'operatore di scorrimento per calcolare il risulrato. ll programma dovr visualizzare i va lori come
interi e come bit.
10.13 l.!operarore di scorrimento a sinisrra pu essere usato per comprimere i valori di due: caratteri,
in una variabile intera senza segno di due byte. Scrivete un programma che accetci io input dalla

casriera due caracceri e li passi alla fu nzione packCharac te r s . Per coruprimere due cararceri in una
-variabile incera unsigned, assegnacele il primo carattere, fatela scorrere a sinistra per 8 posizioni e
rombinacela con il secondo carattere, usando l opetatore bitwise OR inclusivo. Cl program n1.a dovr
vis~al izzare i caratteri nel loro fo rmato a b.ic, prima e dopo essere srati compressi nell' in tero unsigne.d,
per dimosrrare che saranno stati compressi corrertamente nella variabile unsigned.
1

10.14 Usando gli operatori discorrimento a destra, AND bi rwise e una maschera, scrivere la funzione
unpackChara cters , che prenda l'intero unsi gned dell'Esercizio I0. 13 e lo decomprima in due caratteri. Per decomprimere una coppia di ca rarceri da un intero uns i gned di due byce, combinacelo con la
maschera 65280 ( 11111111 00000000) e face scorrere a destra per orto bi[ il cisulcaco. Assegnare il
valore rjsulcanre a una variabile ohar. In segui to combinate l'in tero unsigned con la maschera
255 (00000000 11111111) . Assegnate il risuJrato a wialtra V..i riabile char. Il progran1111a dovr visuali:mire
in oir l' incero unsigned, prima deUa decompressione, e quindi dovr visua lizzare in bit anche i caracceri, per confermare che la loro deco1n pressione sia stata eseguita co rrercamen.te.
10.15 Riscrivere il programma deJJ'Esercizio 10.13 in modo che comprima 4 caracceri, qualora il
vostro sistema usi inceri di 4 byte.

10.16 Riscrivete la funz:ione unpackCha racters dell'Esercizio l 0. 14 in modo che decomprima 4


eairacrerl, qualo.ra il vostro siscen1a usi interi di 4 byte. Create le n1aschere necessarie per decomprimere
i 4 cararteri, tcendo scorrere a siniscra per 8 bit il valoxe 255 concenuco nella variabile n1aschera, per
O, l , 2 o 3 volce (secondo il byte cbe scace decomprimendo).
10. 17 Scrivete un programma che inverca l'ordine dei bit di un valore incero senza segno. l i program-

10.7 Modifcace il programma della Figura 10.16, in modo che mescoli le Ca.ree mediante l' uso di
un mescolacore ad alra efficienza (come mostrato nella Eigura 10.3). VisuaJinate il mazzo risulrance
nel formato a due colonne moscraco nella Figura l0.4. Fare precedere ogni e.arra dal suo colore.

ma dovr prendere in input dall'utence il valore e richiamare la funzione rev~r~eBi ts p.e~ visu~i.mre
i bic in ordine inverso. Visualizzare il valore i.t1 bit, prima e dopo che queso siano srao 1nverr1r1, per
confermare che siano stati invertici correccamente.

10.8 Creare l' unione inte-ger con i n1embri char e_, short s , int i e long 1. Scrivere un programma che accerti in inpur vaiati di cipo char., short, int e long e li immagazzini nelle variabili di
un' unione di tipo union integer. Ogni variabile dell' unione c.tovr essere visualizza.ca come un char,
uno short, un int e un long. I valori saranno sem pre srampari corrertamenr?

10.18 Modificare la fu nzione di splayBits della Figura 10.7 in 1nodo che sia portabile rra sstemi
clie usano interi di due o quanro byte. Suggecim.enco: usate l'operatore sizeof pe r determinare la
dimensione di un incero su una macchlna particolare.

1O.9 Creace l'unionef loatingPoin t con i membri f loat f , double d e long double 1. Scrivete
un programma che accerti in in put valori di ci po f loat, double e long double, e li immagazzini nelle

10.19 11seguente programma usa la funzione multiple, per dererminare se l' ~rer? immess~ dal!~
tastiera un mulriplo di q ualche incero X. Esam inate la funzione multiple e, qwndi, decermmare il
valore di X.

378

C APITOLO

10

-programma determi na se un valore un multiplo di X */


Questo
/*

#includ e <stdio .h>

CAPI TOLO

11

int multipl e(int);

!!elaborazione dei file

main ()
{

int y;
printf( "Enter an integer between 1 and 32000: " );
scanf("%d " , &y);

Obie ttivi

if (multip le(y))
printf ( "%d is a multipl e of X\n" 1 y);
else
printf( "%d is nota multipl e of X\ n" , y);

Essere in grado di creare, leggere, scrivere e modificare i file.


con lelaborazione di file ad accesso seque.nziale.
F

Familiarizzare con l'elaborazione di file ad accesso casuale.

return 0;
}

int multipl e(int num)

11. I Intro duzio ne

La memorizzazione dei dari nelle variabili e nei vettori remporanea; tutti quei dati andranno persi, quando un program ma termine r la propria esecuzio ne. I file sono usati
proprio per la conservazione pe-rman.ence di grandi quant di dati . 1 computer imn1agazzinano i file su disposit ivi di memori a seconda ria, specialm en te su quelli a dischi. ln
questo capitolo , spiegheremo in che modo i file di dari siano creaci, modifc ari ed elaborat i
aa1 program mi C. Prender emo in considerazione i file ad accesso sequenziale e casuale.

int i, mask = 1, mult = 1;


for (i= 1; i<= 10; i~+, mask <<= 1)
if ((num & mask) J= 0) {
mult = 0I
break;
}

return mult;
}

11.2

10.20 Che cosa far il programma seguence?


#includ e <stdio.h >

tn ultima analisi, rutte le unit di informa zione elaborare da un computer sono ridotte a
cQmhinazioni di zeri e di uno. Questo perch semplice ed econom ico costruire dispositivi
dettron ici che possano assumere due stati stabili, dei quali L'uno rappresenti uno 0 e l'altro
un 1. srraorrdinario che le impressi onan.ti fl1nz.ioni eseguire dai comput er compor tino
soltanto le pi dement ari manipol azioni dj 0 e di 1 .

,..

int mystery (unsign ed);


main ()
{

unsigned x;

printf (" Enter an integer : ~ );


scanf ( "%u" , &-x );
printf ( "The result is %d \ n", mystery (x));
return 0;
}

int mystery (unsigne d bits)


{
uhsigned i, mask = 1 << 15, total = 0;
for (i = 1; i <= 16; i++, bits <<= 1)
if ((bits & mask) == mask)
++total ;
returh total % 2 == 0 ? 1 : 0 . .
}

La gerarchia dei dati

''

La pi piccola uni t di informa zione in un comput er pu assumere il valore 0 o 1. Tale


unit di informa zione detta bit {abbrevi azione per "binary digi.t'' o "cifra binaria'': un
numero che pu assumer e uno tra due possibili valori). I circuiti dei comput er eseguon o
diverse sempli i manipol azioni del bit, come d.eterminar11e o imposta r11e il valore e invertire un bit (da 1 a 0 o da 0 a 1 ).
Per i program matoci, scomod o lavorare con i dati nella loro forma di basso livello
f:ana di bit. I program matoci preferisco no invce lavorare con dati in cifre decimali (ovverosia
O, 1, 2, 3, 4, 5, 6, 7, 8 e 9), lettere (ovverosia quelle dalla A alla Z e chilla a alla z) e
simboli speciali (come$ , @, 0/o> &, *, (, ), -, +, ", :, ?, / ,e molti altri). I nwneri, le lettere e
i simboli speciali sono detti genecicamenre aratteri. Linsiem di tutti i caratteri che possono essere usati _per scrivere i program mi e rappresentare le unit di informa zione su un
particolare comput er detto L'insieme di caratteri di quel comput er. Dato che i comput er
passano elaborare soltanto i valori 1 e 0, nell'insieme di caratteri del comput er, ognuno di

81
:380

sand9 i ~atteri e uccessivamente questi saranno -ges iri ed e1~tb r;a i dai computei

come mod~ili di bit

I I
Green
I I
j oran~e I

I Sally I

ra~presenrru:o ~ri un mo.dell di ~ . e 0 {d.~tto kJrte) . Oggig~mo 1 i hyi;~ sqn(l 9mp,sti


.per lo p1u da @tt0 bit. f programm atori Cfeeralll10 l pr, grammi e k tJ-fiit di ]nfo 1Tfr~fzione

~si

I ca.rnpi .sono campo ti da cattteri, cosl ~om,e qli~ti ultimi stino compo ti da bit. Un
oom~o un grup~o di a.r tt~ri che tras1:1.ette .un'ill.fo-.rriiazione. Per e empi ., u.n
<=c-o~si~re-nte -~lusrvame?---ye d1 le.etere maiusco le e 1ninuscole porreobe es ere .usa p. r

rappresent are 1l n:eme di ima per.so na.

qu:npn

T9m

J uny

Iris

'

Le Ltnita-_ di informazie ne elaborare dai coropu er f-ormano una rt,trchi1t di dirti in cui
Je ~T~ dj irr(9rmaz.ione div@ntan0 pitt gran.di e Strtrrturahiteat:~ p complesse, man m~O
che si procede dai bit a.i mran:ri (,i byre)) ai campi -e cos vi:L
1

~iack

Blue

R.andy

Rad

I
I
I

'I
t

File

Un record (evvfilosia una st r uct .in C) si compone di d.i~ersi cunpL In oo s.istcrn . dj


gestioue. degli stipendi. ~er esempio il re -o.td di rni patri- oJare impi"~tb p crebb.:. coilsi-

tere d~ seguena

1. N u.m ero
2.. N- ine

g n1pi.:

\ _ _ __.) Record
[i -J_u.d_y_ --.1l._e_.r_e_en__.._I_ _ __._..

ai previdenza ociale

3. Indi rizi,

4. m1pti>rt9 Qrarip del salario


5 . N umer0 cli es~nzioni riVeHdicat~
6.. Progressivo dcl.lo rp-entlio nell'.rum.a
7. An1 nto:ru:ar~ c;le.lle tasse ederill rra_ttenute.)

u 1d y

01'001010

Campo
Byte (Carattere ASCII J)

f;"{r.
1

In -altr~ parole. un .record un gtupp.o di ~pi eorrelati .. N.ell esempib prcedente ;


. gnun det can.1pj appartiene allosress0 impiegare. Naruralme nte> una particolar . az:encL'l
pQtr~bbe aver~ _molti impieg~~ e a_vrehb~ un recird di scipei1d.io per ognuno .di loro. U'o file
o1L gruppo cli rcl:)rd caru;~lau. 11 file ~gli stipen di di w1 azienda contiene normalm-e nre
p.er-o.gni impjgato. Di eense~penza il fiie degli .tipend1 di una pi~.o,la ~iendn
~~~b~d _
potrebb.e c@1'Itenere .solranto 22 r~cat'd) ddovelo stesso file iJJ una. gra.nd.e xzJ.en:da potrebbe contenern e 100.000. Pe r l.Ul~organizzazone; nu ~ insolito f1V.re en i.naia Q. h e
migliaia di fi1e conr~nenti molti milioni o anche milia:rru di cal;atter.i di info:rmazione~ .C 0 n
la. cte~cente popolarit . d.ei di chi ottici al laser. e d~lla 1ecnologi-a mul.mediale1 molto
dJ miglia;ia di miliardi di byte. La Figura 1.1 moJ?~~tQ , .ru:ann . C.O ~~Uli :in.che .file gran_
tra l<t gei:atch,a da dan.

_ .Per faciHmr~ il recupero .d i .record speci.fci da un fle a-lmen . un d~ suoi amp i


scelto CQm~ t{()~av dcl recor~. Qu:e$'qt_ 19 idenrillca c0me a_pparre.n en te . a una par-tic::olate
per na en~m. Per ~};mp10., nel recorp degl.i ~ripe:Jl;cJi descrirro in questa sezione, n0rmalmJJ.te s-ar ccl~1 wrne eh iave dei i:t;:-cotd 11 n~UJ..1.eLJl di pTe ideoza saci~J@ .
Ci spn~ m -lti m~dl di organizzar@ i record in un file. Il tipo d.i organiizazid-0.e pi
czorrme cLl file seq ter~iale in: . ui i recq:rd $ no cipica 1n~nte imm.agazznati iu ordine in
.b~:t!: al a m_pn chiave del record. Il primo r~cotd i i mp:i~ga.19 nel file conti.me il umer0
~ ~~~d~-~a_s~~_al~ _ p.iu. ~b~lSO,:- n.1eutre quelli S"!e: ivi coht_ep_gono l'n~ meri di pividenza
socral.e pragress1v3.Illen:rt! pJ u alt.L

Bit

f igura I 1. 1 La gerati:hia <;lei lati.


ia. .maggior p_ar~t:e dell& irnpn~se utitizza wm ~mltirud.ine cli file .cl.iftere.nci pe r archiviare
~ dati. Per - e.ri1pio Ie azienc!e p aebbero avere d.l file per gU scip~ncli, per i conti di
~Fedi.De. (Felenco e1 den_arp_dovuto dai dien i),. per i _n di d_eb"t.o (J'denco cl clenar0
El~v.uto ai 'fornitori~, per le ~~rti::: di rn:agaz:zino (eelenco dei fatti reU tiV:i agli articq!i trattati
i;i;~U'.impresa) e moLti alcri tipJ di file. A volte un gruppo di file t:orrelaci derro tf4tfl:~tJJe.
Utt "gpl1~z_io: ne d:i pr()gr.Din p-roge t_aci, pe.r cr.eare e ges[ire i _da ab~e .e;: de ra
[i:s;~e'(!1gper la gestiqnc del databtJSe {Dl3MS .atah~Managemenr Sy.srern) .
1

11 "l. I file e gli stream

H C vede i fl empl r<;:emenrt _oro:<': un flusso (srream} se u~nziale di byi:e ( . gura l l .2) .
.gpl file terrnina con un rnarca-tdre di -end:-offi:le (fine del file), oppure a Lino specillc
nu:nier-0 di byr.\': registrato in una srruttur~ di da-ti amministt:tivi gesri a dal si rema. NeJ
$.'omeilc-0 in cui w.1 file sar srato 11pertn vi ,a:r as:so~ia~~ uno stream. Tre file ~ i' l,aro
:ri ~p.~ s:rn;an1_, L :standard inptJit. lo staiu.lartf. ou/tp1!;te 10 st11ndard erro>'~ saranno perd
1
al. tmati'Olfu.enre, quando c>nun:cer l esecn:ti n di un programm a. GJi srream fe:rnisc'"
.no un canale di co.munica:z.i ne rra i 'fle e j ptogtamni i. P~ eseinpiQ~. l s~r;.a1n dell o
-~tn'<la.rd i'npur. con.s ente un prognunm a di leggere i dri .&dli asti'(a. m~ntn? queJl d.ello
~iincla.rd outpt1t fa i &e wi pl1 ,grarnma pos~a visualiZza:re i datl..s_Wlo s:hermq . .Lapl~L-tura
di un hl re cituis~e un pttntatore. a una strurntra FILE (definita in <st aio . h>) che e mie-

CAP JTO L)

11

ne le irtlQID1a71onl uriliv.k[ per elal-iorare il file. Tale sttu m-, ra include un_ rli;_tcritto
re di file.
.(file dt!scriptor)., . ovv eros ia 1 inclice di UJl Vtrt o re ~:el sisteril;i Gp !ativ o cliia mat a
tab'ella del file ape1ti (otJen file-ttable). gn i elem nto del l!rto,re con rien e un
blocco di C<>ntr{)llo. del fili} (jilcctinpot block 0 FGB). be il :Si tema operaiivo utilizza: per
am~
ministrare un ptticohu~- fil~. L st;lldard mpu , lo nan dard outp ut e lo
~tandard err: r
sonQ gs i?i ufillizz_anclo rispett ~a.mente i p.u ant .ri di frl~ stdn. -std out e stde rr.

383

,-F1 ( I)'
'

'

int acc oun t;


ch~r

f:l<lat alan e ;
fI L,t;. cf Ptr :i
.f"' c-f Ptr = pun tato re al file clie nts . p:at * I

0.

,.

I!

nam e[a0 ] ;

n-1 marcatre :U end- of-f le

if ( { (}f Ptr = fop~n { '1 cli.nts . dat 1' , W..'1 }} ~~ NULL)


p rin tf (~File cou~d not be 0rYe n,ed \ n" ) j
~1'~$ {
111

Figura I I. 2 In che mod o it C vede

un file di n byt~.

La li.brer.ia stan dard fotilisce inolre funzion i per legger:~ e crivere i d4tl dei
file. a
~o.ne fget o, c;;;ome getc har . legge un carattere da un file. La
fu.m..ione fge tc riceve
come :a.rgomearo Wl puntarore ad una ~u_urtra FILE p~r .il flJe d;il quale il cara
ttere ar
letto. L~ chia-n1ata f ~etc ( s.td in) legge un carattere dallo st'd io, ovverosia
daJlo srandard
input. Tale chj3.mar.a quind1 eq uivalen~e _a geto h ar () . .Lli: fu azione f putc comto puto har
scrive un c.araner~ in un fil~. La funz.on-e fpu tc rice w .come argomenco
il -.u:~ttere cb
scrivete ~ un_ p IJ-fl tat re aJ -file. in ctLi ~l cafattre sara ,scritto ~ La eh i a n1~ta'" dJ
unzioae_
fpu tc( a' stdo ut} scrivilcar:atrcre a' nel.lo stdo ut, ovve_rosia. ndlo
tandard orttptli.
4
1
Tal c_hiam~a; e quindi equiVclle nte a putc har ( a )

pf-i ntf ( "En te,r"' t~. e accoun~j na.me 1 and. ba-1~.r.10. e , , \li Jr);
prin t-f .( 11 En.t e.r ~OF to end in pl1t . \ n11 } ;
p r int t ( "1 '1 ) i
s_
.a nf'.( ''96d~_s%. f"

&ac~o1,.1nb narn-eJ &ba lanc e)

Whi_
l e .( I feo f ( std1 n) ). {
fprin'tf(1 ~fPtr -

Tra le fi1n7:lo~ usa:t~ pc;:t l~gete 1 cfa:ti clall -. standard inpu t e scriverli nel1.
o sta.qd.a.rd
O'U~~ C il~ b~o mol t We ro.~ han.no delle funzi0n i corFispondenrj
Ghfa mate in tn do
imile, tta ~u.e ll~ p~r l'el borazinne de.i file. e fwu ..in l fge ts e fputs. ~
per ~S.mpio,
potr :ehb ete .~- ere usare ri~pettivan1eR te per legger~ o per. criver~ un~ rig
di lll1.. fi]e. Le
k.ire controparti p@r leggere dallo sranda.r,d lnpu r e pe scrivere a.elio stan dard
urpur, get s
puts., no .si:ate dl cusse neJ Capitola 8 . Neije p.r.ossi.me- sezio
ni, ifltro durr emo le Funz i0ni pe.r l elab0razi0ne :di fil.e .equiv~en a sca nf e p_ rintf~ fsoa nf e f prin
tf. In egitQ
sempre in qnesto cipit-010: dis.urerefuo dllc fwui.ill frea d e fwr ite.

%s %.2 f\n 1'


nam.e, bala iTce }

"%fj

a,oce.unt,.

prir1jtf ( "? ,, } ;
s:ca nf ( 11 %dc%s~.f '1 1 &.act;;oun t 1 na.me, &~bilan e}

f.cl-0s (cf Ptr) ;


}

ret urn

0 :

I 1.4 Creare un file ad acc~sso seqq.e nzi ale


11 C nn Jmp_one una srrun:ura ai file. DL on_sgue;nza n:9zioni tom e H t.ecrcl.
di un file
pon a-ppai.tengon0 .aJ llng_uaggiQ' C. l i p.rpg tan1 mato r{! dvi q_uindj furn h tutte
le stru tture
di file, . per sod& fare le: nee_es~tr dJ ogni articolare app licazion. Neil~ese
mpio succeg;ivo
vedrenl.0 in che .t11odo il _progratnrha:tm potr imp rre ana s~ di record ~ un file.

li prQg;ra.nirila detUa Figw:a 11.

o:e~r Un ~mplice

file ad ~ceesso eque11zne-- che


potr~hbe sse.re usat o in un sisGma tli ontal?ilir del tred ito, per
aiata re a tenere il com pnto delle soIDJn-e rl:9V\l-te dai clienti debi ori di un aezicnda. Pr ogni cliente
. i! pr gramma
0'rte rr il UQ n:ume.rp_ dj <;QntQ, il d-offi.e e il al.do ('7'te r0S, . l''atn
mon rare d9vUtO all 'az,i(llda,
~r i ben.i e .i se~i cic:;:evu;tl. .in pns,sa.t:O- dal clinte). I dati otrenu-ci pq ogni
c.l.ie.nte rn~rjcui
_fan~n il cireord ~ dedi .. t a'- ognuno di lor0. .r Q questa appLlcaz
iqn~, u Illim~fQ dj e n.to
~~Ji-: 1..i'Sat come chiav.e del reco rd: il .fle -s~ dunq~~ cTeatp e manrenu
ro in Q,rG.ineTi pett o
a_qt;ll dal{}. Q.u dto p.rogra.mm.a _ presum~ che l'utent~ i.mmeuer i .reco_rd seguend
r.ordfrjg di riume~i d.1 certto. ln un i$tema compl~to .d_i_ c.Qn
tabilira del ci.edito-, dovr ebbe
essere f0rnira la possiJ~1ili~ di eseguir~ -le;:gli :z;-din;lmen ti, in mod che i urente
possa jromet"'
t@rl.': i record in ql}aJ~jasj otcli-ne. In segcir:, j reca.rd d Vthbero.essere oidinaci
e se.ritti n~Ule,

fig'.ra l I .3 Creare lJri file seq.uenziale,


E.samini~p 9.ra quf$t0 p_rqgtatnma.

-Ci rrui~op

ftl:E cf.P t r
s~~e che c-f Ptr gn puoI.ator~ a una trutcun1 F!LE. Il gro~:.ttntrra: .C gesriSce
ognj file on
tUra_ :srruttura FILE di,scinl!4. Pei: QS;ire t_ nle LI programn1~tote non ha bisogno cli co.noscere i
de~~l dcl.la srr_u tmra FILE. Vedr:ern presto; In mod preciso~ .ionie la stru
ttura FIL E conduca 'rnditrrameni al blocc di controJlo del file :(FCB) gesti-ro dal siste ma operativo
.
1

,
384

CAPITOLO 11

385

Obiettivo portabilit 11.1

di tasti. Larg ome nto della funz ione feo f un pun tato re al file del qual e si desi dera e$aminare l'ind icato re di end-of-file (std in in ques to caso). La funz ione resti tuisc e un valo re

La struttura FILE dipende dal sistema operativo (in altri termini i membri della strnttura varia.no tra i sistemi. secondo iL rnodo ir1. citi ognitno di essi gestisce i prop1i file) .

di:~erso da zero (vero) quan do l'inclicator~ di end:..0f-fle stato imp osta to; altri men ci, restj
-

tuisce uno zero. La stru ttura whi le, che in ques to prog ram ma incl ude la chia mat a a feo f ,
Cptinuer la prop ria eseclJ.,Zone fin quan do non sar stato imp osta to l' indi cato re di endorifile.

Ogn i file aper to deve avere un punta1:ore di tipo FILE clichiarato sepa rata men te cl1e
sar usat o per pun tare allo stess. La rig~
if ((cf Ptr

fope n( "cli ent s.d at" , "w11

))

==

NULL)

Lisu uzio ne

assegner un nom e, "cl ien ts. dat 11 , al file che dovr Ssere usat o dal prog ram ma e stabilir una "lin ea di com unic azio ne,, con esso. A cf Ptr sar asse gnat o un pun tato re alla
s.t ruttu ra FILE del file a,perto con fo,pe n. La funz ione fop en riceve due arg9 men ti: un
nom e e un modo di apertt-era del file. Il mod o di aper tura 11 w" indica che. _il file dov r ~ssere
aper to in scrittura. Nel caso in cui il file non esista e veng a ap erto in scrirtur(l., f ope n lo
cree r. Nel caso in cui un file gi esist ente fosse aper to in scri ttura , i suoi contenLLti
saran no elim inat i senza alcu n avviso. All,i nter no del prog ram ma, la stru ttura i f sar usat a
per d eter min are se il pun tato re cf Ptr S<il NULL (ovveros.ia, se il file non sia stato ap~~to).
Nel caso in cui sia NULL, sar visualizzato un messaggi di erro re e il prog ram ma term iner la prop ria esecuzio ne. Altr imen ti, l'inp ut sar elab orat o e srit to nel file.

fp r i ntf (cf Ptr,

11

%d %s %. 2f\n ", acc oun t, nam e, bala nce );

scriver i dati nel file clie nts . dat . Que sti potr aont j esser e recu pera ti in segLuto da un
prog ram ma prog ettat o per legger~ iLfle (consLtlrare la Sezi one 11.5). La ft1nzione fpr intf
e:quivalenre a pri ntf , ecce tto che fpr int f ric::eve com e a rgom ento anch e un pun tato re
al fde in ui i dati sara nno scrit ti.

Errore tipico 11.3


Usare il puntatore sbagliato per fare riferimento a un file.
Buona abitudine 11.1

Errore tipico 11.1

Assicurarsi che, all'interna di un programma, le chiamate a funzioni per l'elaborazione


dei file contengano i puntatori corretti.

Aprire un file gi esistente in scrittztra ( 11 w11 ) qua1ido, di fatto, l'rtterzte desideri p1eservare iL file; i contenuti dello stesso saranno eliminati senza alcun avviso.

Una volta che l'ute nte avr immesso l'end- of-fle, il prog ram ma chiu der il file clie nts . dat
e~Q fclo se e term iner la prop ria esec uzio ne. Ancl1e la funz ione ftlo se ricev e com
e
argo men to un pun tato re a un file, inve ce del suo nom e. Nor mal mente, nel caso in cui la
funz ione fclo se non si stara rich iarn:ta espli citam~nte, il ~$tema oper ativ o bade r a
chiu dere il file quan do 1'esecuzi9ne del prog ram ma sar term inata . Que sto un esem pio
d<;lle attiv it cli "ordinar~ amm.inistrazi0ne" del siste ma oper ativo .

Errore .tipico 11.2


Dimenticare di aprire itn file, prima di tentare di farvi riferimento all'interno di un
programma.
Il p rogr amm a richiede r all'u tent e di imm etter e pr ogni reco rd i vari campl, o un

end. -of-f tle qual ora l'im miss ione dei dati sia stata complet ata. La Figui-a 11.4 elen ea le
combina zion i di tasti utilizzate per}:imm etter e un end-of-file su dive rsi sistemi cli com pute r.

Buona abitudir1.e 11.2

Sist ema di com pute r

Com biha zion e di tast i

Chiudete esplicitamente agnifile, non appena siete sicitr.i he il programma non vi far
pi riferimento.

Sistemi UNIX
PC IBM e com pat ibili
Mac into sh

<retitrn> <ctrl> d1
<ctrL-::> z
<ctrl> d
<Ctrl> Z

VA:/.. (VMS)
F~gura

biettivo efficienza 11.1


La chiusura di un file pqtrebbe Liberare risorse per le qu4li potrebbero es.sere in attesa
altri utenti o programmi.

11.4 Le com bina zion i di tasti per l'end -of-f ile SL! alcuni dei sistemi di com pute r pi
diffusi.

La riga
whi le (! feo f (std in))

user. la funz ione feo f p~r dete rmi.nare ~~ sia stato imp osta to l'i1'tdicatore di etid-offile per
il.file al qual e pun ta stdi n. rind icat ore di end- of-fu e info rme r il prog ram ma che non ci
sar~o p.i dati da elab orare. Nel prog rarn n1a della Figu ra 11.3 , L'indi cato re di endof-fi le
sar~ impost~to per lo stan dard inpu t, quan do l' uren te imm ette r l'app osita com bina zion e

Nell'esem pio di esecuzione per il prog ram ma della Figu ra 11.3, l' uten te ha cligi tato
in form azio ni per cinq u con ti e, alla fine, ha imm esso l,e11d-of-fle per segn alare che il
caric ame nto dei dati stato com plet ato. ~esempio cli esec uzio ne non mostra per com e i
reo rd di dari appa iono real men te alLintern<.> del file. Per verifica.re che ques to sia stato
crea to co rrett ame nte, nella pros sima sezi one pr.esent erem o un prog ram ma che legger il
fil~ e ne visualizzer il cont enut o.
La F igur a 11.5 illus tra le relazioni tra i pun tato ri FILE , le stru tture FILE e i FCB in
mem oria . Nel mom ento in cui il file clie nts . dat sar staro aper to, il suo FCB sar
Fieepiato in mem oria. La fig~ mos tra la conn essi one t ra il pltn tato re resti tuito dalla
fope n e il FCB usat o dal siste ma oper ativo per gestire _il file.

CAP1Tot:o 11

386

'

L;utente puo accedere a. questo

(D

cf Ptr

~o~en ( cliente ~ da t",

11

11

11

fope n restituisce un pu ntatore 1n una struttura FILE


(def.nita n <st dio. h>)

1
I

II
I

I
I

Errore tipico 11. 4

"

2
3
4
5

Aprire Un file iriesistentein lettura.

., '" 115
_- ..
.E rtote ttptco

6
7

FCBper

t4lf

Aprire un file in Lettura.o in-sc~ittitri:t.., senza avtre_gli .appropriati diritti di accesso alfile
(qilesto dipeitt/.ft dai sistema oprativo) .

Enr.ar t~pico. 11.6

Aprire uv. file irt scritt/r4J quartdo non >pi pr:izio disponibile sul disco. La Pgu.ra 1-1. 6

.eletica i modi di apertura.

Il pr ogramma richiama. un servizio


forn itp dal sistema oper ativo che
utili zza i dati presenti nell' FCB
per controllare tutti gli input e gli
out put sul file attualmente in u_so
sul disco. NOTA: fiutente non
- '
puo
acedere d irett~ente

Errore. tipico 11 ..7

A.prlre u1z file t"On il 11z.tJdo di apertl>ra-scorretto pot1ebbe'pro_vo:ear.e- etrori devastanti.


Ber esempio. aprir~ unfile:in scrittura ( "w quando fnvece dovre~ke_essere aperto in
aggi.ornamento f "r+ "), provocperl elimina~ione del .con.tenuto del fil.
11

:allFC B.
Questo ingresso
.
. - dall FCB_al d1s<::o
-- .
c;:op1ato
quando Ufile v.!ene
-

Quando il progra.m ma emette una chiamata 110 com:e:

Aprite un filesoltanto in lettura {e non.in aggiornamento), qua/o.ra .i l suo contenuto -nf)n


debba (!jsiir~ modificatiJ, Ci preuefr I.a modifica non i..ntenzionaledel eontenztti del file.
QuestQ un altro esempio di .applicazione del principio dtl .minimo privil~o.

que_sta
fprint(efP =tr~

11

%d '-%s %.. .2f ri, .accou nt,

n:ame1. ba.lance);
,,

il programma localizza Hdescrinore ~ i file (7) nella


struttura e :us;a il d~~~ri"t;tore di fi l ~ per ~rovar~: !l' FCS nella

I
,,
I
I

I
I

tabella del file aperti.


en(ry

),

Buona abitu.dine 11.3

ap~rtcp

G)

387
1

F
n EI PTI
~ ~

La funzione f open restituir un NU LL, qualora si vrifichi un errore durant.e 1.a p,ertura
-d'l un file in un<:J qu.alsiasi d.e i modi. Al11ni d~gli error che porrebhet vrificarsi sono:

Solo H sist:ema oper,a tivo pu


accedete a questo
T ahE;!ll_a- dei file aberti

) ;

La struttura FILE per


~cl ients. da t "
cpntien1e un desc:rittore
di file; per es;. un piccolo
intero h~ un incJice.
nella tabell de file aperti

'
n.o

_ ~
7TQ_NE
mT ....
T~ , .EaLf"i.r!
>'\.,/_A-iLLJ:
-- ':o

1.5 Leggere 'i dati da un file ad accesso sequenz iale

I: dati sono immag~-zin_ati n~i file, in m<;>clo he poss_a no e$sere recuperaci per l,elabrazio . ,.
- s.n,aro come si r~a un file -ad
Re, quando sar necessario, La seziene precedente ha w.-'o
,a'tc~sso -.s-equenziai. n questa sezi0ne, discuteremo di offle si potranno leggere .in modo
.ql!~nzi~ale i dari di un file.

I
I
I

F'igura 11 .5 La rerazione tra puntatori a FI LE,. le strutture .F I LE e FCB.


Ap~~

lln progr~ma pu elaborare uno., .nessup_o o molti file .. Ognqno cli quelli usa~i in lJ-I!l

program1na dov1l avere un n.Qme univoco e avr u n puntato.re di file di>"ti.nto ,c he ~ar
re~tic~to da fopen . Tutte le S-l!tCces-sive funzioni per l~ elabot.azione di un file,. una volta che
sar-stato a.peno, dovranno farvi riferimento con il punttote ,appropriato. I .file-potranno
essete aperti in uno dei tanti modi disponibili. Pr creare un fiie, o per eliminarn~ il
contenuto prma cli scrivere i d,a.ri, apxtelo in scrittura ( tw 0 ) . Per leggere un fil~ gi
esistente; :apritelo in lettura ( 1 .r 11 ). PG:r a,ggiung,ere dei record alla fine di un ftle .gi esistente, apritelo. in accodamen.to ('Il aM) Per scriveie e leggere in un file, apritelo in- aggiornamento in uno dei tre modi disponibili: "r+" , "W+ l!I o 11 a+ . Il modo 11 r+ .apre un fil gi
0 .+ 11 tea uu file in lettura e scrittura. Nel caso in
w
mo:do
Il
esistente in lettura .e serittura.
. .
cui il file esi~t;! g.i~ qq~st9 sar_ apeno e il sqo contenuto corr~nte sar. e,liminato. Il modo
a+ ap.re un fil~ ,gi ~s_istent~ in _lettura ~ in aodame nto: tutte le operazioni di sBritmra
sar{:rn no ~segui~e alla fine d~l file. Nel caso in cui il file non. esista, sar creato_.
1

11

11

un file in lettura.

Crea un fil per la scrittura. Nel cas.o ini c11i il file esista gi., ne elimin.er il
contenuto correnre.
Ace-oda; apre o crea un file p~r S'crivere alla fine dell ste~so.

r+

Apre un file in aggiom_aJ11ento (l~t~a e scrittura).

rea un file per i'aggiomamenco. Nel. caso in ie:ui il file esist gi,, n elimine
r il cor1tenuto crr~nt.

a+

Accoda; apre o cr.ea

tJ,n

fine del :file.


Fgur~ 11 .6 Modi di apertura dei file.

file per l'.accodamento; la scrittura sar eseguita alla

3..-89

CAPITOLO

11
f sc:anf (-cfPt r 1

Il pEogtamrna della Figura 11.7 legger i record ,daJ file clien ts. dat creato dal
prograrnma della. Figura 11.3 e ne st_amper il c onten uto. l;l,struzi0n~
FILE *ef Ptr;
11

11

= fopen ( . clien ts.da tu),


11

11

11

==

)')

NULL)

fclos ,e ,( cf Pt r) .;

thter. di ~prire in le~a ( 11 r 11 ') il file 11 cl ients . dat 11 e dete.rtninei: se lo stc_:_ss-o ey~ stato
apeno con ~uc.ce.sso (ovverosia, controller che fopen no.n restituisca un NULL). :C:istruziqne

fsc&n f (cfP tr,

retur n 0 ;

11

%d%s%-f

11

&acco unt ,J name , &ba.l ance),;:

while ( ! f e.of ( cf Pt r) ) {
pr -i ntf( 11 %--10d96-13s%7 .2f\n '1 , ac:co unt, name -, baJ.an ce);
f:scan f(cfP tr, 11 %d%~%f 11 , &acco unt, name1 &balan ce);

indic che cf Ptr sa.t un punta tore a FILE. La_riga


.i f ((cfP tr

%,d%s%f ii

11

&a.cco unt, name, &!b alane e);

l~-ggeJa un <r~cord),

dal file. La funzione f~s. canf eqwvafente a s:anf , ecetro cilie fs.oan f
n,_~ev. ~ome argomento un punr.atore al file dal quale i d<:tti saraon.q le-r. Una volta cl1e
J 1sttuz1one precedente s~ stata. ese_guita per la pci111a volta, account conterr il vlore
~ 00, !n name tr9ver emo 'Jon es-" e balan ce varr 24 J.9 8. Ogni volt-a che Ja ~econda
1~truz1Qne fsc ,a nf sar stata eseguita, sar .letto dal file un altro recbrd e: acc:o1
untJ name e

ba~ance . assumer.anno cli n,uov:i valori. Il file s:It chiuso e l'esecu zipne del progra mma
sara termin ata un volta che sar stata raggu nra l~ fine del file.

N~rm- almente , per retuperar~ in mod_


o seq_uenziaJe

i dati di

file., un progra mma


inc~rfirncer dill inizip di quello e legge~r tutti i dati in modo consecuri.v finch non sia.ri
s~r ~~fiovati qulli d.~ider.a:ti. Duran te l esec1izion di un pro-gt-amroa, potreb be e~ser
y_t1le r1~l_ab~rar-e .pi volte in modo sequeniiale i dati di un file,, r~partendo dall'inizio dello
wi

ste-sso.. Un~scr a:z1one e.o me


rewin d;( cf Ptr ') ;

f~ ap~pu:1t~ _ i~- ? 1odo che il file posit#,{Jn point er di un pr<Jgr~mroa ovver osia il
pit~tatore dt'f osztone .a~! file he indica il n 11 n1ero. dcl prossi mo byte da leggere o scrivere
ill 1ne~o.~ d.I un file, poss.a :ss~re riposizionato all'inizio {ovverosia al :byte O) del fil punt~to da. ef Pt ,r. Il pu.n tatore di p,91sizio.ne del file DOil propri ament e un puntatore.
p1utto~ro un valore inre~ro che specifica .all,interno .del file la pqszione del byte in corrispond enza ~ella quale sar eseg~ita la pro~&i ma lettura o scritn ua. A -volte chiamato
anch.t;: file offiet:. Il puntat:re di _posizioi;ie -del file un m~m.bro .della struttu ra Fl LE associata a ogni file.

I* L.egge re e stamp are un file sequ,e nz.ial e


#incl ude <stdi o.h>

f igura I I .7 Leggere e stampare Un file sequenziale.


1

Presenteremo qra (Figtira 11.8) un ,prio:gra m ma eh~ cqnsencir a uri re.d it managf!r
(amm inlstr tore del c12edito} di 91;tenere gli elenchi dei clienti con un ~aldo a z~ro (owerosi;
quelll h~ non devono akun denaro), ~i lienti con un saldo a c~eciita (v\!.le ~dire, ~udii
-ai ql.t~i l 1 azie~d.a dev~- del dea.aro), e dei clienti con un salde .a debito (ov:-eros1a, quelli .che
devon0 cl.et denaro alrazienda per beni e servizi ricevutj}. lJn saldo a crediro u11 ammo.n
~are negativo; .m entre qu~llo a debit un impoxto posLtlvo.
IL programma visualizzer. -in menu e censent:ir '.al c:re:dit 111anag~r di imme ttte una
lt}le tre scelte dispo.nibili per otten~r le informazioni s.ul erecl.it0. La ~celta l prod)lrr'
l''eleri.eo dei conti ton un saldo a zero-. La scelta 2 produr.r l>elenca dei e-011ti con un saldo
~ ~redi~o. La scelta 3 pr@durr l,elene.Q dci conti con un ~:raldt) a debit0. La scelta 4 tet:mifif l'esecuzione del l?rogramma.. Un output di ~-empio e mostr ato nella. Fgura-1 -.9.

-/-* Program'rn,a per l' in te rro,gazione del e redi to * l


#incl
ude <stdi o.h>
'

w;

main ()
{

ma in ()

int r.e que st, account ;


f lo-a t balan ce;
eh a.r n ame [ 3 0] ;

in:t ac_count ;
char :n .a.rne[3 0];

rlo.a t bal,a nce.;


FILE *cf Ptr '
I* cf Ptr
.

if ((cfP tr:

FILE *cf Ptr;

= punt.a tore

fopen{~clients . d~t~~

print f("Fi le could

a.l file clien ts. dat *I

11

"r

11

== NULL)

))

el se {

not 5e opene d\n") ;

~rintf( ~ Enter

e.lse {
print:f ( '%.-10s.%- 13s%s \ n
11

11

,,

if ((cfP tr = fopen ( ii c.l ients .dat 11 ., ''r ir) ) =="" NULL)


print f ( File could not be opene a \n"');

"Acco unt ~
11

'.Il

Nam

11

usa. lan ,c

11
11

reque st\n"

1 - List accou
nts wi t h zero ba'lanc._~$ \ n a
~

_;

"

"

(conti.nutt)

C APlTQLO

11

391
'

2 - Li-St accou nts with credi t

11

a-

brea.k ;

List accGUnts with de bit balan ces \ n ;,

4 - End of run\n?
soanf(~d, &req uest);
~

wnile (requ est


f

balances\n~

Il )

'
r ewind ( cfPtr );
p r n t f ( 11 \ n ?. u ) ;,
se anf ( %d
& re ques t ) ;

!= 4) {

11

s c.a.nf ( cf Pt r, ... ~d9"'s9.::f


O,

ti

&account, name, &bala nc);

'

switch (requ est) {

printf (uEnd of run . \n

case 1:
print f("\nA ccou nts with zer">o bal:anc.s: \nu);
wh~le

f c .l 9$e ( cf Pt r)

Ftg~ra I I .Q Programma per l'inter rogaz ione del credit o.

account , name, balane}i


f scanf( cf Pt r ,.

11

p r i ntf :( 11 %- 1 0d%-~ 1 3.s%7 2f \ n li


-

};

return 0;

0')

==-

11

('lfeo f(cfP tr)), {

i f ( balan c.e

11

%d%s%f

11

&accownt, name, &balance);


}

br eak;
case 2 :

print f( 11 \nAccounts With credi t balan ces.;\ n 11 )

while (!feo f(cfP tr)) {


if

( b.a lan.oe < 0)


pr-int f (. 11%-10d %. -13s% 7 . 2f \n 11 .,

. a.ccou nt , na.me, balan e) _;

lJ.

fscan f (cffltr~

11

%d%s.%,f '11

&account,

'

&bala ne),

na~e,

brea.k ;
case 3 :

p rintf (

11

.
nAcu nt s with d.e bi t bala,hce s: \ n" ) ;

while (!feo f(cfP tr)) {


.i f (ba.l ance > 0)
print f ( 11-%-10d% 13s%7 .2f\n ",

account, nime, balan ce);


f
}

sanf ( cf Pt r, %d%s%f
&account, name, &balance);
11

11

fjg1.1ra .11 .9' L'9utp ut di. esempio del pr9gra mma pe r I ihterro gazion e del ,c redito mostr ato

nella Figura 'I 1.8

Osservate clie in questo tipo di file sequenziale -i dati non flotvi-n i10 esse.re moclifi.Ga'.ti,
$en~~a correre il riS'hiQ _di dist.ru.ggere gli altri dati del fil~. Per es.empio} se fosse neessario

amhiar.e ~WJ'lit e 1 in :iiworthington 11 , il vecchio hom.e non porr .essere se~plitemenre 'soSti~.uito. 11 record per White stato se:i:itto o:el file come
300 White 0.00

.3 93-~.

-usando il a.uovo nom-e e parte11d: dalla stessa posizi,one all'i_qterno del file, se il t'e_(;oriel fosse
stato sostiruico sarebbe diventat o
300 ,w orthin.g ton 0. 00

Il nuovo record pi lungo di quello original e e, di conseguenza, i caratteri successivi alla.


seconda no 11 ili "Wor-th.i ngton iJ avrebbero c:apcellato la parte io:iz.iale del rcord sequenziale
~uccessivo. fl probl~ma,. ID questo caso; che n,e l modello forlnatt t di nput/u tp'U t US_
atO
-c on fprintf e fsc,a nf, i campi, e quindi i recotd,. posson cambiar e l. lgr9 dimensione. Per
esem,pio, 7., 14, - 117 2074 e-27383, sono rutci int immaga zzinacii ntern:a m.eJ1te nello,ste:ssa
numero di byte mentre co.n. La,_f11 azione fp,rintf sar_a11o ,o visualizzati sullo sebermo , o salvaci
su disco, me campi d; dini..en~ioni differ~nti.

Ne conseg~.e 1Che, di norm~, per aggiornar: in modo appropr jatb i record 11ofl si usera LID
-accesso sequenzale con fprintf e fscanf, rna_si preferir ristvere t'mtero file. In un E.le,ad
aecesso se:quenziale come quello del nostro esempio . per ciiril)_iare il suddett o non1e i r_ecord
che ptcedo no 300 Whi te 0. 00 dovra o no_~s$ere ricopiati in n nuovo :6.1~- al quale, a questo
punto,.si dovr aggir1n_geJ;e il record modif ato e in 6_ne quelli suceessivi a 300 Wh i te 0. 0'0.
Ttrtt9 ci s.igliife:a che, Qer aggip.rnare UI;l sol@ t(;!otcl d.ovr.ann essere elaborati anche tutt1 g4
altri.
>

" -

11.6 I file :ad acces so casuale


G0-1Ile' abbirtio affermato, in preced_enzoa~_ i r~cqrd di un file reaci on_l~ outy>ur formattato
,della funzione fprint f non avr~n.no necessariamepte la stessa ltmghezza. Ogni _record di un
fil&ad access' casual~, invece, avr nQ_r-malmente un:a_lunghezza fissa e vi si potr accedre lo
.Qlodo d.ll;ett0 (e q1li n,d_i velocemente).~.: senza passare attravers gli altri rectord. C fa :S che j
file ad aceess0 cas-ua.le siano appropri'at :per i sistemi di prenqt~in ,delle-ljn:ee ger_ee per
quel~i bttcari, per quelli destinati alla .ge:~tine di up punto vendit~ e p~r ~tri tipi cli sis_temi
p-ei llab.ortl:Zio.ne ,ai tra'f!._sazioni eh~ nChiedano un acesso r:_apid~ a- d.aci specifici. Esi'stono
altri _m9di di _mpl~mef:ltate i.fil~ ad aec;es_S0 ca~uale~ ma -noi limite-temola t1ost.ra_discussione
a illl. approcio litreare~. usando i r~c:ord .a lunghezza fusa.
-

IJaro cl1e in trn file ad accesso casl!l.3.1'.e o,gni r.c:.rd ha normalm nt:e la st~s:i lunghezza~ _la
sua esatta posizio~1e, relativamente all,injzio del fil&) porr .essere calcolata c9n Qll;;t firnzione
della cl1iave .ctel record. Ved:rmc) pres_to oqme qlJ;es,~o faciliti l'ac.ce_sse imrnecliato a record
specifici,, an~h+ in file dj_ g-fandl dimensioni.
La Figura 11 . l O illl).stra. un moclo di implementare un file ad accesso casule. Un til di
qu-sto_gen:ere come un treno merci con mo1ti vagGni, alcuni vuoti e altri c.n un caric:o.
Ogni vagone .del tteno ha la stessa lunghezza.
0

100

t
I

.....

o./

100

-- v
100

bytes

bytes

Y'

300

400

500

I I

I I

I I

r
'-.,

2.00

\..

'V

100

bytes

.I

'--v-- -''

100

~
100

bytes

bytes

bytes

100

In 110 file ad acc~sso casule1 i nuovi dari potrann o e$sere inseriti seaia aistrugg ere
qi1:lili gi.~ in1piagw.zina:tl. dati imrnagaz.zinaci in preedenza_ pofran-n 0 anche esser~ aggior.,~atl -0 --eliminau? senza che si debba., risrivere l'intero file. Ndle p(.qssime ,sezioni spieghererlrt>.cofl.1 creare un fle ad accesso casuale, in1.mettervi dei atiJ l<?.ggerli in modo sequen1.ial:i::
~ .a_,suale, a.ggiotnarli ed eliminatli quando nn saranno pi necessari.

I 1.1 Crea re, un file ad acces so casuale


J_;a ~.!-1nz_ione fwri te- tr~sftcisc~ in

un file un numero specificato di byte partendo da u na

,cfa;:t.:a p.os.izion~ di memo ria. I dati son9 sc_r1tti nel file, partendo d_al byt;e indc;ato dal
ptultat0 re di posizione ciel file. La funzion e fread trasferise un nt.;11nero ,spe~cifl.cato di
15yte,. dalla posizione indicata dal file offset a un' at'Ca di memoria che incom, i1c1a a u:a
'iniirizz sp:ecifcaro. A q11esto punto. per scrivere un intero invece di 11.Sare
fpr'nt f (f Ptr,

%.d ", numbier );

eh~ ,ptr~bb sta.mp.are da u n minitn di un a un massimo di 11 cifre (10 1Twneri ptt il


. s-.e.~0 J ognuno dei quali ..richiede un byte di mem9 ri.a), per un int~ro di quattro byte,
gotteromo u.sa:re
1

f w.r i te f&numb.e r i siieof (.int)

1, f Ptr.),

tthscriverebbe in ogni as-O quattro thyre (o due, su un sistema ot1 inteci di du. byt:) d~a
variabile n1urnbe.r al file rappreseruaro da f Ptr (1 argomen to 1 sar spiegato tra breve). I:n
sftg9-ito 'f -read potr ess-~re usata _per le.ggere quattro d'i quei byte nella variabile intera
l')\,lmber. S~ da ufiJat9 fread e fWri~e leggono e scrivono dei dati com .gli interi in un
fo:rmato on dimen..$ione :fssa, invece ,c he variabile, clall, altro i da# che es~ ge_
stisono.
S0no elaborati nel fo.rmato "r<l'.w data,, (dato gl'ezzo) del. co111pu_ter (ovverosia) in byte dl
-dati), piuttosr o che nel forrnato 11111-anamente intelligib.ile cli printf e scanf.

Le fu11zioni fWr'i te e f re ad sono in grado di le:ggere e scrivere BIJ disco inteci vettori
,~ Q:tj. Il terzo argortinto di fwrite e f read appunt il numero degli elernenr~ del
vtt<;>re che dovi:a nno essere_ lttj dal diso, ,o dle vi dovranno ssere sctirti. La precede nte
~m'm_ara della fi1nnone fwrte scriv~ra un singolo, intero su dis:o, perci, il terzo a.rgomen::to . 1 (c.om~ se stessimo scrive.odo un solo clernent-0 di un vettor~).
rato -d 1e i program-mi ~per l'. elaboraii.one dei fJJg scrivano un solo campo all'interno di
tlll file. Normalmente, vi scrive-r anno una struct per volta, com.e mostrato negli esempi
1

.e.guet;I tl.

C"o~~id.erate il .segti.ente enu11ciato cli problema:

Crea.te u.n ~is.tema per l 1e/4bor4~ion-e del credito che sia in grarf,o di me1no.rizzare
fino a IOO recot-d di li~ngl1ezza fissa. (_)gni record d8vr consist~e di u.n rt.um.eto di
conto. ch sar usato c.ome cl1iav.e del rece1d, un cogno.-me.} un nrJme e un saldo. Il
prpgramma 1~isuitan:te dov~' essere in grado di dggio1;nare ttn conto., inserirne_uno
nitOV(), elimina:rne ,111:no gi esiste_nte' .rf4 eleri-cari Ti:tt;ti .i .1eeord di cor,zto in. un file di
te;f;to fat1nattato per la ~i.s114fiZZftzi_on_e. Usate i1:n file ad accesso ca$itale.
L.e prossime se"zion presente ra _n ne le tecniche ne:cessari~ p~t create il sddett0 prog:rahlma. per l'elabor arion d el l::tedito. n programma della _figura 11 . 11 .n1ostra. come
aprlre un tle ad ac-css cast1ale, definire un: formato di record t1sand.o una s t ru et, seri-

f 'i gura 11 ~I O 'Rap,presentaz1one d~ un file ad' acces's o casuale con record a lunghezza fissa.

___

CAPITOLO

11

L'ELABO:RAZIONE DET Fl1

-vere i dati sul discq e hiu"der il file. QtJe$t) program m~ inizializz~r tu,~ti i 100 record del
_fi] 11 credt . dat 11 con la struct vu ota, ~aado la:fi~.nzione_ fwrite. Ogni structvuo:ta
conti~ne 0 per il numero di co11to~ NULL .(r.appresep.ta:co dalle virgolette vuot;) per il cogno ..
me; NULL per il nome) e 0, 0 per il saldo. U file sar irz.i'alizzato in qu.es_to modo per creare
:sul elisco lo spazio nel qilllle sar immagazzinato e per far s che si possa determinare se un
licord contenga dei .dati.,
/* Creare in modo sequenziale un file ad accesso casuale */
#in~lude

~stdio.h>

39)

Obie.ttivo efficiBnza;11.2

li;f.plti programmalri pensan e:rloneamente che sizeof si-a :tena fi.tng.ione~ e ch:e ttsarlo c.mporti il tipico costo .relrltivo al tetnpo di esecuzion richiest da una (fhimnat4 di
fi~nzione. In realt,. il J11:4dtto costo non ~, perch sizeof - un operatore che agis.ce

infine:di ompiltJ.zion:e.
La hinzion fw ri t e p davvero essere usata per scrivere vari elem~ti di un -vettore
di oggetti. Pt;r farlo, il programmatore dovr fornire com,e primo a:rgoment9 della chiqrna..

fwri te

un puntatbr~ a un vettore e come teEZo atg,o mento della ste.s~S.a chiamata,


elevr specificare il nun1ero di elementi che saranno scritti. Nell'istruzione preGedente,
fwr i t e stata usata per scrivere un ogg~ttQ singol6 ch non era un membro di un vettore .
._Srivere u.n ggetto singolo e-qulva.le alla scrittui:a d.i un $olo elen1~to di un vettore, d.a cuj
J n11mer 1 n~lla- hiamata a fwrite.

ta a

struct olientD.a ta {
int acotNum;
oh~r lastName[15];
char firstName[i0];

f loat balanc e;
};

-~

1:1.8 Scrivere i dati in modo casuale in un file


'

ad accesso casuale

m:ain ()
{

Il programtn della Figura 11.12 scriver i pi:_opri dati n<;!l file credi t .:Oa t Esso.c'm:hjib.~r l~ntllizzo di f sek ,e fwr-i te> pet immaga~2.i nare i dari in pqsizioni spectflch~ del
frle.. L_~ f\Jnz:ipne fseek imposter il file offset.in una pos'i:z:ion:e spe~inca e, in seguitQ,
11

11

int i;
st ruct lientDa t a blan kC.li!;3 nt - { 0,

11

11 ,

11 Il

0.0};

FILE '* cf Ptr


'
.

if ( ('cfPtr

fw:r it,e vi _scriver i dati. Nella fignr~ 11.l~, illustrato


fop .en :( Hcr,edit .dat 11 ; iwi)) e:::= NUL.L )

printf ( 1' 'F ile co:uld not be opened. \.n 11


1

V*

uh

esempio di esecuzione.

Scrivere in un file ad accesso caeuale */

#'i nc lu,de <st.d io. h>

);

else {
Struct clientData {
for (i= 1; i<; 100; i++)
fwrite{&blankGlien t,
size of ( struct cli_entDat a), ~,

f,c lose (cfPtr);

int acctNum ;.
10.har la-stName [ 15] ;
ti'.f far f i r s,t Name [ 10]

cf Ptr,);

float balance;

'

nt'a in ()

returra 0;

~'

F I .L.E * f Ptr ;

struct

Fig.ura 11.11

Creare in modo,sequenziale wn file ad accesso casu.ale.

La funtione fwrit scrive un blocco (un numero specificato di byte) di dati mun fil~.
In queste;> pr>gramm~,. lLsti;uzin~

i .f

cl~entData

client;
jr+ 11

((c.f Ptr = fopen( 11 credit.dat 111 ,

))

printf ( 14 File oot1ld not be open ed. \n 11


e'l se {
printf'( 11 Enter ac.co.unt number 11

=== NULL),
);

'

fwri t ,: e (. &blar'l k Cl . ent, sizeof ( st:ruct c.l ientData), 1 , cf Pt r )1 ;

scri_vera sul fle puntato da cf Ptr la st,r uttur blankClient di lunghe-z.za


sizeof ( Struct c1-ientDat~). ropert(lte sizeof restituisce l~ dime.nsione in byte dell'ogg~tto GQJ;rrenuto nelle parentesi (in qus.to caso struct c.l i_
enrt Data) . t opera-rore unariQ
sueof agisGe in fa,se -di compilazione e restituisc~ un inteio sef:lz:a se,g no. I:'11etatore
sizeo f pu, essere usato per detertf:l!nare le dimensioni in byte tli .u.n. qualsiasi tip,o di dat0
o d espte.5sone. Pet i,gstn,po., s -i ze.o f (i.nt) usato per d,efermiiiare s u n intero immagazzinato in due o quattro. byte, su un paticq~~ compqter.

11 (1 to 100, 0 to end input)\n? il );


scarif{"%d~,

&client.acctNum);

while (client.acctNum != 0) {

printf( 11 Enter lastnarne-, f i rs.t.name, ba_iance\n? 11 } ;


soanf (. %s%s%f 11 , &.c lient. lastName J
&,clint. f irstN.ame, &client. balance) ;

11

(continu4)

t'Et AB'ORAZJONE DEI FILE

fseK(cfPt rJ (clierrf.~c.tNum ~ 1)

sizeof ( st ruct l.ientDat.a),

s:E-EK_SET:);

fw.rite("&clint, s i z.eof ,( s-truct cl.i e ntData) ~ 1, cfPtr) ,.;


p rin t f ( 1' Ente r a ee ou nt n umb e r \ n? 11 J j
se anf ( ii"~d ii _, &e li e-rii t . a,c ct Num).' ;
}

SEEK SET indie:-t t:he il p'.-u ntatore di posizior1e deJ file dvt- essere si.stmat, -relativ,a1nente al
su inizio,. in base a1 valore deU'oFfst. Come indicato. dall precedent.e istruz.io:nt, la ricerca
dt'.l <:9nt9 n1)Ii1_ro uq. imp$t~r all~inizio del,file il relativo punt;:tt{lre dJ p9~izione p~rch~ ij
~s:uo vilor: calp la~o i11 byte sar~l z~ro. La Fi,gura 11.14 mos.tra il pw1tator.v del file mentr~ fu
:clrerirrient0 alla. struttura Fl.LE in rnernoti~. ll puntator di pe-sizione del file iridica che il

_p1'.0ssn0 byte da leggere o :scrivere s rtova.,. a,cin,q11e byte dall)nizio del (ile.

f.lose ( cfPt r) i
cf Ptr

Figura I I 12

.Scrivere
i dati. in modo casuale i11 U'n fif.e ad acc
esso casuale.
-~

'

'

. I,

Numero lr
di byte
..

5,

'

(Puntatore
delta posizione
del file)
I
I

'

0.,
..!.

Figura 11.13

Esempio di esecuzione.de.I 1programrria;in 1


Fgura I 1.12

I: istri.izione
fse:ek(cfPtr 1

e
-

, , 'I!!

'

Il puntatore di posizjone del file mentre indita un offse.t di cinque .byte


dal.1".irlizo def fi.le.

Figura 11. 14

Lo standa.r:d ANrSI riporta il seguente p:rototlpo di Eun.zione per la fseek


{ac .countNum -1}

* sizeof{:,s truot olentData..), S ,EEK~S . ET) ;,

~j9t~roer- iJ .P UntatOr d1 posizione dJ:~l fl.l puhtat) d~ cf Pt 1r ~.t byte alco1ato da


('a.ccountNum - 1) * s.ize.of (struC ! GJ.ientData); il valore :di ques'rn espressione
d~rc;o ~offie1: o JCStmQ.'h_to. Dar che nwneri di o.nto .s.uno COEqp res.i tra Litio .e 1O menrt~
le p0sizioni in byte .:aJ+lo.remo. dt;l file inGomiociana d-a..0, si davr sottr'aJ:r 1 dal nJmero
di nto <J:u~ qdo ~fi q9vr -caleolar.e la posizion .in h}'t:e del rec<)r_d.. :Per il primo re{)_rd1.
quin~ il .Punta~pxe cli po.sliione del file sara impostat9 $ul byte zerQ. 1~ co~ante sirnb.olc'a
1

int fseek(Fl LE

*stream~

long int offsetJ int Whence);

cl:o.ve offset .il n.um.ero di byte .dalla posizoJie whence nel_file puatato .da stre.am.

U'argornenr.o whence potr ont~nere uno dei tre valtrri

{SEEK:....SET'J S1 E:EK:-CU~ o SEEK....;-EN'D)


che indi,an,o l~ po.sh.Jone ~Gl fil~ d~ :cui lni~ia la rice r~a: SE~K_SE~ lh~ta Che ciu.e~ra.
incomir1cer dall inizio del file; SE'EK_CUR :ndica .he la ricerca Lo._cpm 1 nc~ra d;:i lla posrno3

.ne ~Qri:ente .dei file; mentre 81:.EK_EN'D indica che la ;i;icerca i. nizi~r dalla fine del file.

Qu.esi:e tre costanti '-Sim..Oeliche-sn.no definite nel file di .intes.tazi1en.e stdio ~ h.

3. 9.9
CAJ>rrot 0 11
.

.I I_.9 Legg~re i dati in modo casua.le


da un file
..

ad accesso
casuale
.

La funzian_e f re ad legge uno speci:ficato -nu1nero di byte: d~t un file e~ li.. immag<lZziha nella
1

memoria. Pe-r :esempio, l istr.uzione


1

fre9.cj. (&c:lent, sii eof ( st.ruct alientData)

1 , ef Ptr);

l1eg~.er~ il numero ,i li t>yce determinato da si:z eof (struct Clie ntDa t.a ) dal file puntato
da c:f !P t r ~ iro magazzine.r i d3=t nella srrutttu:_a. C;lient. I byte sai-anno. letti dlla posizidne
specificata. dal puntatore 'di po_sizion d~l file. L.a funzione fr:ea.d potra essere usata p.er
leggere degli elementi a Iungp:ezza fissa in un vettore, fornendo un l?w.t:tat o.te'. a q~st- ultim.C>
e inaica.rtO .q uanti fi dovrann es.se re letti. L.istruzjon_e prec:ede.nte speifi~a che dovr-
e~-s-~_re letro n s_olo elemento . Per legger~ pili, di un elemento, dcrvret~ in:diearne il ni.1 mer:r>
.rrel ttZQ atgQ._m,entq dell'jstr11zi_
!l f re ad.
1

11 priogra mma dell~ FigtJt~ 11.15 Le.gger in piQdQ seq1;1:enziale tutti reco-rd del file
!.credi t -. dat 11 ', determiner S.e COilTeUgallQ Qe dati -e, in 14J eaSJJ,, Ji vlsa"h]izz.r n m6d:o
formattato ._La funzion.e fe.o:f determiner se sia s.rara: raggiunta l~ fine del tle, menue
f rtltac;t trm;ferir i dati cl.al disto alla struttura clie-nt di tipo cl. ie11-t Data.
l* L-eggre in modo
#include <stdio.h>
.
-

-.

sequenzi~l.e un

file ad aociesso ca.swaie- * /

struct clentData {
int a.octNu.m;
char la-st-Name [ 1{51;
char firstName[10]i

f l :aat b&l:anoe;
} ;.

:Eig~~a

.11.1 .5

11 1~1'0

leggere in modo sequenz:ale un file -ad aetesse c_


asuale.

Studio ,di un .caso: u.n. prog.ra.rnma

per l.'elaborazi'one de:U_


e transazioni
F~ese.nta:fh ora un corposo prograrnnia, ,per l' elabQrazine dell transazioni., che .utilizzer
ir f.d.:t- i ;t_d ~cces.s casuale~ Il _prt>gr:amma gesur le it1fo.rmazioni relative ai Cnfi di lilla
~an&a. Esso a,ggi9ti1er i co~ti -siste11ti_, aggiltn_ger q.uelli nuqvi) li eliwin~.r e ar.chivier
un elen.cu di rutti i _ont.i o.qeq.t! in un ttle di te~to -idoneo alla vlsual:iz_z;:;i.7.i01le. P.resumi?re:. .
~o. ;ne il pi::o,g1amma della Eigura 11.11 si~ gi .stato ese,gu.it e eh.e abbia .g,ia E:;tea:to il fil,~
or.ed t. dat.
U prp.gramma ha cinque scelte~ La sc"elta u,ne richia1_net la funzi;one textFile per
i ,ti'lm:agaz.~io9-.fe lJLl elfill,co tormattato di tlltti i oonti in. un Ele di test9, cbi:-lmaro accoun1
t s .'t xt,,.
tcfu:e p~otr essere vi~. ualizzat:() in un secondo momento. La fr1 nzione ser frea.d e l t_ec11i"h@ di :acGesso sequenziale ~ filei utilizzare nel pr0.gramtna della Figura. 11 .1.5. DQpO a.ve.r
,~filerl.l)ni:e la prima scelta dcl 01.enu, i.I f~ a.coeunt s ~ tx.t c'onter..r-~.
1

main ( ):
{

FILE 1rofPtr;
s:t ruct .clientDa:t . .a client
'
.
-

if ((cfPtr == fope-n .( 11 cre:d:it.(tat

not

.Prin:tf ( 1 '.Fi.le cou .li

ur 11 }) ==.= N.ULL)'

11
1

b~ op~ned.

\ n 11 )

else {
11
"s%- -1.e,s
n. s.-. \ n 11
... 6
- . -,~o - 11 s-~o1 !U
Prin t. f (. 9;,;._
1
Name ii ,. 1~ Ba.1 anee 11
' Fi r st
<

11

'

Aoot.
' --

11

11
, .,

Last N.ame u ,

) ;

wni .1 e ( ! f ;e of

( o,f Pt r )-' :.) {


f rea d( -& cl-i .ent, sizeof (struot iq).j_ent.Da,ta), 1 .i cfPtr);

if (client.aoctNum !: 0)
fl-r-li. n~t: f ( 11 %~ 6.d%~- 1 6 s% t 1s %10 . 2f \ n 11 ,
client..,accctNurn ,, elien-.t . las tName,
el-ie nt:. f irst_Nam:e , c-lien-t ..bla-i~n~) ;.
1

a sclta (lge richiamer la funzione

upd.ateRecord per a.ggi9xnare un cdhto. Questa


~~i~rn~r_ ~:oltanto un C(?nro gi esistent:e e: p,erci dOV{ CQ11trollar~e, in priitnQ luogo, che
1 -re.eor-O. .spet:ifi.e.ato dall')-utente nqn sia vuoto. Il record sar~ lette c(Jn frea.d, immagazz.1na~
t11" 1i'lla s.ttUt:t.ura client e, sl.Jccess.iv~men.te1 il suo mn1bte: acctNum sar. confro:~t~t>
Gol! tin zero . Qualo.ra i.n quel m.eI:l'lbto fos~c; ritrovro unc> zero, .sapreme e.be ilrec;or_d non
c~n~p: lo.formazioni .e, di CoHseguenza, visual i:zze:refuo un rhessil-ggio pet .indicar.e eh.e il
J!~~oxd vqoto . In sgpito, sarannn vis11alitzate nu<Jvainente le scelte c!el. menu. Irtvee,
.~ual'QEa 11 r.eeord coilterie~se dll~ informazioni, la fun_zion~ ypdat.RecorCI acettf:I~ in

.1t:iput l5'anunontare della tran.~_az_i9n,e-; calc6ler il nuo.v.o saldo e risqriver ,.l rec(),l:d nel file.
1

.lQn_

ntput tip_ico. della seconcla seelt.:i).. di m,enu sar:

CA:PTO tO

11

401

l.~QRAZIQNE DEI IHLE

F'I LE * c-f Pt r ;
int choice ;
i .f

( (fPtr = fopen(, uG.redi t.dat 11


pr~ntf( 1 1 Fi le

r-+ 11

=== NULL)

))

00uld not be opened "\ n 1' ) ;

.lse {

La ~_elta tre rihiame1'l:la funzione newRecord ffer aggiungre un nuovo c.topto al file.
Qualora 1,utente abbia. immess0 un num.etc;, di canto c:orrispt1ndente ~ un .record gi ~i""
.s:tente;, n~e,wRecord visuliz.zera n messaggio di erro.r~, indicand o che il .recprd cppti~ne
-gi delle informazioni, e le sefte ae_l menu Satanl1J) vi~:;ilizzate ntJP:Vfl mente. Per aggiungere 11n nu9V. .IE;cord, que.sta fu11zion.e utlizzera lo stesso p ocess.o usato dal progtamm-a deila
Fgt1r.a 11.12. Un tipjco ourp.ut della terza scelta di menu sara:

whil.e ('(chic e = enterC hoi.c e()}

!= 5) {

c.h ( choioe) {
case 1 ~
textFi l e(cfPt r);

:S\rV'i t

breC:fk;
cas.e 2.:

update Record (ofPtr) ;


br,e ak;
case. 3:

newRecord(cfPtr) ;

La scelta quattro richiam er la funzione deieteR eo.orl per eJimrrare un record dal
file. I::eliminazione sar esgita chiedendo all,ut~nte il numero di conto e inizializzand-0
nuovam ente il record corrispondente. Qualora il conto indie11to non c-ontenesse delle infunn.~irri1 deleteR ecord vis1,1ali2;zer_ un m~saggio di errare indicand o che ll c'n t fin
esiste. La q11inta .~celta di menu termine r 1 esecuzione ciel program ma. Nell Figura 11.16
m:o.stratG il program ma sinora dftscritto. Ossrvate che il :f'tle 11 e redit. dat 11 s_~ apert>
in aggiorn amento (lettura e scrittura), usando il m-do 11 r+ 11
;

break;
,case 4:
d e_let eRe,co ra ( c f Pt r) ;

break;

f* Q:u sto prqgramma legge in mod~ sequen ziale u_n file ad accesso
casu-a.le; 'k
* aggiorn a i dati gi scritt i nel file, crea nuovi dati da inserir e
nel
*
* -fi.1 E, ed eliinina i dati gi presen ti ne l file,
*I
# include <stdo .

int acctNum;
char lastNar ne[15];

char
f.loat

firstNa me[10 ];

oalance;

};

tnt

* re-adPt r)

FILE *wrteP tr;


struct olientD at -a c.l ielit;
((w.1 itePtr = fopen accoun t s. t x t , w Il )
. P r i ntf ( 11 Fi _l e could not 5e opened .\n n);
l~ .e {
i t

( H .

Il

Il

-- NULL)

rewind (readP tr);


11

enterChoic~(vQid);

void update R-e:cord (FILE *);


void newAec ord(FlL E *);
1

void deleteR e0ord(FILE *);

voiCI
textF~e (FILE
' -

fprintf (.write Ptr,. :1 1 %"6s% ~ 16s% - 11s%1C?Js\ n ~r ,

void textFil e(FILE *);

m~in

fcclose(c fPt r);


return 0;

~{

h~

stru~t clientD~ta

()

A.ct

11

11

Last Name. 11

,,

.
11
First Nameu, 11 Ba-l .ance") ;

wh il_e ( l f eo f ( re ad Pt r) ) {
fread( :& client, sizeof( ..struct cliento ata}, 1 , re"adPtr) ;

if

(c lient .~cct~um

I= 0)

fpr .i ntf(wr iteft .r,

n,% 6d%-16s% ~ 11s% 10 . 2f\n

client .acct Num 1 client. lastNa me,

11

CAPITOLO

403

11
if (client.acctNum
0)
printf( Account %d does n()t exist.\n i' ; accountNum);

c.lient, f irs,tNarne, cl.ient. b :al anc~) ;

11

}.

lS;e {
fseek(fPt~,

(accountNum -

1)

* sizeof(struct clientoata),

SEEK_SET) ;.

fclose(writePtr);

fWrite(&blankClien t, Sizeof(struot clientData), 1, fPtr);

void updateRecard(FILE *fPtr}


{

v0id newRecord.(FILE *f Ptr)

in t aecount;
float transaction;
struct elientData olient;

nt a.ccountNum;
:pr'int=f{ ,11 Enter n~w ae:count number {1 - 10.0'): li);
.s c.anf ( 11 '%d 11 , &.~countNum);
-fseek ( f Ptr, ( acauntNum .. 1 ). * size ef ( struct clientData) _,

printf ( 11 Ent:er acc-ount to. update ( 1 - 100): 0 ) ;


sc-a nf ( 1%d 11 , &account);
fsek(fPtr, (accc>"unt 1) * sizeof( .s truct clientOata.) J
SEEK.~SET)

f re ad (:&c_lie n.t

SEK_SET)~

fr .e:ad(&clien:t, sizeof (struct clientDa ta), l, fPtr);

size0f ( st ruct c.l ient Da t ,a ) J 1 , f Pt r) ;

if ('<~,lient. acctNlum I= 0)
printf ( 11 .Account.. #%d already contains info r m.a tion '\ n 11. , ,

if (client.acbtNum == 0)
printf ( Account #%d h-a s no inf ormation. \ n , account);
else {
pr i nt f ( 11 %- 6 d% - 16 s%' ~ 11 s% 10 . 2 f \ .n \ n
clint. aoctNum ~ . cLi .ent~ . IastName,
client. firstName, cli.e nt. balance);
prntf( Enter chrg,e (+) or p.ayment (-): )j
s e anf ( %f
&t r a n s a t i o n ) ;
client; bal,ance += transacton;
printf(%-6d%-16!%- 11s%10 . 2f\nJ
H

c.iient. aoctNum) .;
e.l se {
p"r .i n.tf ( 11 Er:it e r la~ t nam e, f i rstname J balan ce\ n? 0 ) . ;
scan1f ( %:5%~%-f 11 ' , &clier:rt . lstName , &client. f irstName-,,

11

11

11

1j

&client.balance);
cliemt.acctNum = accountNum;
1

11

11

fseek(fPtr, (client.acctNum - 1) *

sizeof(struct clientDat), SEEK_SET);


fwri.t -e ( &client 1 s.iz.eof ( struct clien:t:D.a ta) , 1; f Pt r) ;

Client.aoctNum, client.LastNam~,
client.firstName, clientibalance);
t s. e e k ( f Pt r , ( a ee ount 1 ) * s i ze of ( s t r uet e Li.e nt oa t a ) .
SEEK_SET);
fwrite(~cli.etit,

strtJc. t c:i ientD1;1ta client;

.s izeof(struct c1ientDa.ta), 1, fPtr);

tn t :fnterC-h oia.e ( void)


{e

int menuch oice;

void deleteRecord(FILE *f Ptr)

ptrintf ( 11 \n Enter you r cnoice \ n 11


~1

struct clientoa.ta client 1 b,lankClnt - {0, ",.,,


int accou nt .Num;

11 11

printf( nEnter ac0ount number t o cjalete (i

11

i1

0};

2 - up.d ate an acc_o unt\n 11


11
3
- a.d.d a new account \ n 11
0

4 - delete an account\n
11
5 - end program\n? Il ') "

11

100) : ");

&ae eou n t Num) ;


fseek .( fPtr 1 (account:Num - 1) * S i.zeof(struo,t c.l ientDa ta) ,.
SE:EK_SET);
f re-i,d (&'c li ent, siz.eof ( s t ru c t .ciie,n.t0 ata). J 1 , f Pt r) ;,

se a nf ( u_:%d 11

- store a formatted text file of accounts called\n


11
\
ac counts.. txt\ 11 far printihg\n

11

s;canf ( 11 %.d 11

&menuChoice) ;
r et.i:J r n me n u ti o.i e e ;
'

/'
I

Figum I 1.16

Il pro,grantma per- la gestione del conto bancario.

11

I
CAPITOLO
.11
.

4-04

Ji~BOMZlOW: El FU

],1.4

Esercizi di autovaluta.zi:one

Trovatel'err 9re io. og11uno dei segu.enci rammenti di prg_ gr~rrJ.lH. Spiegare ome possa ~se:i;e
1

-@nre.vo:

g.
li ..sp. az:i il ognunse-g. uenci rJcrh.
11 ..1 Rim1:1ite
r
a cd.elle
o e
a) In rtltima':analisii tutte le unita di ittformnione_elab:Qtate da un computer s9n0. ridorr~ a
com:b i.Nazioni di
e di
-.
b.) La pi pit:c:o.fa unit di infu.rinazioJJ.~ h~ un computer _pu' ~la.Jbot4f~ : .it ___ _ _.
e) Un

Il file punrar6 da f'Ptr .{ payabl,es Ld:at ") non :e'Stato aperto.


11

.;;Le)

f prfltf (f F>t.r .1
11

e un gr1~pp.o di record cortelri.

dall'inz:i o d~l file, qu~t9 d9:v;ra es~ert: chili-so e riapert pr leggere iluovari1e.1.1te da quel

punt.
.e). La ~ione fprintf pu s-Crivete sullo standard outpnt.
f), Sj p9tr sempre ~ggi:ornar:@ un dato in un fil d accesso sequenziale- senz-a rischiare di

cancellaregli -altri dat!. i _


_
.g) Per trovar un tc.r:d speclfico 1n dn :file ad accesso

casuale~

noli necessario .sor.rr1e tut:[i

_gli altri ~eC.ord.


li) I Fetord d~i file .d cc-sso casuale non l1anno una. lunghezza 11nifo.tn1e.
i) La furizio-n e fseek pu r:ice.rcar.e solranro ck.Irinizio dj un fl.

11.3 S.cr:ive-u, una singoJa istru2ine-1 per sv6l~re o~gnuno dei sguenti cbnTp1:t:t. Supp'O<;!:Ee che
ognuna di queste istruzioni debba essere implementa:t.a nello stesso progtmun!
.
a) Scr:ivete u d iS!ru:z;ione.che,pra-in lettura il :6.le aldmast. d.a t li e assegn.i a o f Pt r '.il plliltratte
11

ottenuc:o.
b): Scrivet~ un1 isrruzia neche apra in lettuti file 11 'trans. d.a t" e assego.i a tf Ptr .il puntatore
ott!n uto.
e) Scri~ete un-.istrttzine eh.e ap,E-a in strittrtra (e reazione} L fi] " newma.st dat 0 e assegni a
nf Pt r il puntar-o te ocrenuto.
d) Sct.i:itcie un;ist:rtrzione che l~gga un tecotd .dal file 11 oldmast . dat. 11 Il re:prd sar fe_rmato:
dall~in.ter0 ac.oountNt1:m, d:all.stringa. na:me e~ dal v,alor in virgolamnbik cur1rent-BalancQ.

-u

e) Scrivete tIB~ist.rutine che legga 1m re-Cord dal file 11 tr:ans . dat u. record sar. for111ato
dall'.a:r<i:ro ao,countNum e dal valore in virgolamcbil dol,l arAmount.
fj' Scri'Vete,uniistruzione che registri un Fecordnel file 11 newm11st. dat Il record sar foJ,:m:ato
clati'.irttero ,acc:ountNUm) .dalla stringa name,e_:.clal valdre in,vi:rgt>Ia mobile cur rentBa.lanoe.
11

aGt}Qunt, comp~ny) am iunt} i

) ;_

%d%s,%d \n", :&actownt, .conrpany.J &amount.) ;.

11

q1) rtl file ut.o ols dt Il 1d.O.vrebbe essere .aperto per ,:aggiu.nge.rvi dei dati, senza eljm 'in~e quelli
.

..

"'

. oorr~ntl .

h} La. filnzione -~~~~- legge un. cararere ,da. un flle speclfica.t9 .


1) L.fl! funtion{'.
l~ge una riga da un t=le specj fieato.
j) La fun7JiQne
apr un Eile .
"k) La .fi~1nziop.
~ n:onn:almen:t~ usata. ne.J)e appli.,az.ioni a:d ItcC.~sso C3:$Uale p~r
l~ggcre; i dari cla un file.
'l) L.(l funzione_ _ ___ ripqY;.izio11a il ftle 9ffset su up~ posiii0n~ spfiQ.fia.

false1 spiegatene il motivo):


a) La;funz.;ione fsoanf non pu essere usac.~ we:r lc:;gg~r.e i dil,ti dall_o standard input.
b) Il progJammator.e deve ~sare espliitamente la foptin. per aprire gli srream dello .standard
inpt1t, standard ,011_p:.t e st~ard euoi~
} Per chuqe.re npJ<;~ n, pr9gramrn~ d:eve ri ch-am-are e~plicitanig_t la fnmiorie folose.
d.) Qwdprail ptint?->r~ ,ii_ pqsitione di un file sequenziale faccia riferirriIlto a un byte dmrso

11

f-a.nf ( recPtr,

.d_~l<) stdin.

Dete,rmina~e q.u~ cl.elle seguenti affet_maz..iop_i sian_o vere, ~ q u~ fil~e (per quelle cl1e ricenere

11 %d%s%d\.n 11

:b) op.e_n (, rec.eive .lat" ,,.''r+


) I::is-tr,uz.jon.e s.egucp;[e 4ov!'.ebbe legge~e l}.ll .reG:ord da u pay abl1S. dat 1' . Il p.u ntarte ,p aiyPtr
fu ~iferioie,n[Q ~ 1quest9 file,_mentr; il puntar.or~ r e cPtr fa. rifurim{;nt<f .a 11 re.c ei v:e . dat 11

d) .N cuner.i., Jertere e sbnb~ sp,~cali .sono coraples_sivamept~ :biam:ac:i _____ .


e) Un gruppo, di file eoirela:ti a~
.
.) Li fimz.i,o ne
chud~ un file.
g) l'istruziOQ.e ,_____ legge i dq_,U.eia llll prje mlllOQ sirn)le a quello ID Ell SCa.nf leg~

11.2

4s.

if ((tfPtr e)'

fopen("'too ~_s ..c


:fat 11

11
,

w11 ' )

):

l= NULL)

-li 111~ "oourses ..dati' dovrebb esser apert in attodamento, sen:t a modificare il concenttto co.rtente ~ lle.
ff ((cfPtr ~ fop,en. ( 1 'cours. e s , dat 11 ~

Risposte~
U. 1

a l O;

11

w+"))

I = NULl):.

agli esercizi d_i autovalutazion.e


9) ~ir_; ) File; d) Catattri; ~) Database.; f) fclose ; g) fsca$nf; 11)

get.c o fgetGi

5 fg:13ts,~ j):f. open; k) f read l) f seek.


rl~!

a) palso. La fnii6n fscanf pu e;ssere usata pr leg~ere dalleStand~d. inpur in~li~den.do il


punl~tQie allo stre111. corrispondent, stdin; nella chiamata a f'sca.1nf.
p) Fals!'J. Questi tr srream SaianHO a:peE:ci.uuromatilllle'nte dal e, q_uando c9mi-o~et, I'es,ecllzi9~. del

prgrnriima.
c;j Fal.s~ I 'file sranno chiusi qu.ando sar re.rmi nata f esec:uzjpne d~l pro;gr~ma) r:_u_rtavi~1
~tti i file dovrebbe'ro.. ess.ere clillisi' esplicitam.en_
te cu;n folos~.
l) F~~o. P'u essere usata la h1n.z~ane rewind per riposiziona;re all'inizio d(l fle il rel.ativp
punmrt di _posizione.
- ~').

f).

Ver.
Fill .. Nella ma-ggior j:iarte del casi i record dei file sequenz.i~ n-11 hanno ti~ lu.aghezza
uni.fanne. Di ctonseguetiz"a~, _probabUe .cf:ie l' aggio:m:a,merrr:a di' un rli:GQrd po.s-~a casare la
tftcella~iori.e di altri dari.
"Wro.
Falso. I record dei fiJ.e ad atcesso CSu~e b.anno normalmente una ltmghezza 11nif9rme.
Falso. E possibile .c:ercare d.all'i1iiuo, dalla Wle e dii :byte corre11t~ d<:l file indif!;tO, dal
i~ela.tiv<;J punrtdJ~e di posiz.ion-e.
1

:g),:'
~1

1,

11.3 j),) tfP"t r

= f p n ( 11 O.l.dmast. d_
a tli ,

1},;j) =t1TP,t fi' :::::

fopen {"tr,ans, dat

11

11

11

11

r ~) ~

1c:J1 f'lfP=~tr --: fo. p~en '(' 1 newma'St.dat 11 1 '~wil);


,. cl): f$.CN3.1rif ( of Ptr , . li%d~~%f 11 , &acco:untNum., 11ame,

t;:). f -s.oanf.( tf Ptr ,. 11 '%d%f"

fr)

&ourrentBa lance) ;,_

&aocountNu1m, &Clol+,arAmount ).;


f printf ( nf Pt r ., 119.d%s% . ~f" , accountNum ., n am_e i... cu r re.ntB.a lan ce ). ;
1

ca) Euo:re~ np.ayables. dat 11 -n on SJatq apertQ prim1! di g~are suo ..puntatore di file.
!rio:e:zione~ usate fop~ en It~r aprire in scri_rural accodamento o aggiornamento il file
11
n payabl.e s. dat .
HJ) fu.rote: la fi1n;zii0ne open .1ioo appar:ri~ne alr:ANSI C.

CJ('.1rr.en0ne: usare la funzione . f= open ..

406

CAPlTOL O

e) Errore:. fis.t ru.z ione f scanf usa il puntator di file sbagliato per .fare r.iferimento a_
'payat)le s ..dat
Cor.rezi'Qne: U$.re il p,untatete cl.i file pa.yPtr per fu.re riferimento a 11 payab.l es. d:at " ..
d) Errore: il O)ntenut o d~l file-sar elimi1:fato perch Stato apert in scrittura ( wu).
Cort~one: per aggiun geye dei dati al fil,ej apritelo in aggio._ma menm (" r+ 1 J o in actdamento
.(111 a n).
~) Eri::or~: il flie: "aourse.s .,.d'a t 11 stato pt;:rto per l~~ggiornamento ~on il mdo w+~ ch
~limine~ il e.nten u~o ~orrent~ del file.
on il modo 11 a u.
Gprr~zione: aprll:e il_file c_
0

11

Esercizi

e 1>i plLClf<! sempre ai f~,e CQn illoo nJme.

volta clie un program ma crea un fije,


j) Ggni
.
--

q1.1et9 sar: conserva_ro autmt:i. camen-re dal

ct:unpute.r p.er i riferimenti fururi.

tEsercizio 11 ..3 ha r:hi~oo ~ lec,ore di seriv~e una $erie di istruzioni distinte. In realr- 1quell
.isrn.1!Ztii>ni fort:n;n:o il n.uclc:; di un im2orta11te tipo di pr:ogramma per 1' elaboraz ione d'ei file ovverosia
uru Frogr~tm ma d.i :file-matching (coimon tp ,di file) . Nelle elaorazioni dei dati commerciali uso
eJ~tjp}iill~ vere dWer~i 61~ i-n Qgni s.istern'3. In un ~i~tema di gstj.one dei cr:diti) per esemp:io. ~,, .
genralmnte w:i file princi__pale c:he contiene informazioni dettagliate si.l ogni cliente, com.e il suo
1f0ro~ I~ind.i:cinP~. il nme~Q d ~ele:fo.no, ,gli insoluti, il li.mite di. credito, le ndizio ni di sconto, le
disptlsiZl'abl 'G()ntraq.ali. e po~sib~en:e tlll. ~uccint riepilog,o dei suo.i tnti acquisti pagamenti.

t,l. 7

Man m~no :he le tra11saziopi verranno conluse (ovverosia] verranno effettuare delle yen.dite e

Riempite gli spazi vuoti in ogn.una delle segLrertti righe:


a) I eom_pttter rit1t1agazznan0 grandi quantit di dati su dispsitivi di memoria secondarja
-. om .i
..
si compone di molti ~ampi.
b) tJn

..
e} Un ~pb che p.ossa o:rit~n.ere numeri, lett~re e spazi un camp
d) Per f-:Gilitare il recupero da un file di record specifici, in gnuno di lro un cam:pQ sa:.r
scelto come - - - - - _
e) ~a gran. maggiora.za. delle in.furmaz16ni immagazzin.ate nei sistemi di toniput r memq-

file.
r.tzzata 1n
,.
f) Un gruppo .di caratteri correlati che trasmtt 6no un'informazione un
g) I puntator i dei tre file aperti automatlicamente d.al C quando inizia 11:esecuzone di n.n
.

____ _

.
e
.
program ma si hiamano
. serive ah ararcre in un file s:petificato.
h) La: funzione
sctlve wia riga in un fil~ speciftat.
i) . La fi1nz.ione
usata. ge.neralmenre per scrivere dei dati in un file ad a:cesso
j) La funzione
c~.uale.

k) La funzi0ne

. riposizio na all'inizio del file il sul) puntator e di posizion~.

11 . 6 Dete;f'tn i nate quali delle seguenti affermazioni filan0 vere o filse (net q. uelle d:ie .ritrtete false '
r
. ):
il motrVo
.
i
sple~mne
a) Le .impre~sio~an~ fimzioni eseguite dai compur t compertano essenzialmente la manipolauone d1 zeri e d1 uno.

b) le:: p~ts.o~e preferiscono .m.anipolare i bit,.i.uvece dei caratteri o tlei campi; perth sono pi
comparo .

) L! persone .i:mm~ttono i .P:~Qmmi e le 11nit~ di .informati"one Gome_.a.r:ttt.eri; in seguito, i


E:{)mpu.i:er li ge~u.ranne e 11 eJaboreran no come gruppi di zro e di unQ.
d) Il CAP di nna persona un ese.rnpio di camp.o numerico .
e) Nelle; ~ppli~ioni p~r oomp uterJ 1 indirizzo di' una persona gener.a.lmentensiderafo un
1

-f) Le unit di ipfqrmazic;>ne elaborate da un compute r fu:r;rnano . una gerarchi-ad.i d.ati, nella
quale Je unir di inf-0rmazione diventan o pi, grodi e pi compl~se, ma.n mano che si
pr9c~de dai qqpitpi ai ar;;t~eri, .,ai bir, ecc.
g) Ona hiave del r~cord identifica que;srult jmo.com e un;eR.tit cipp~rtenrrn:te a un particolacampo

Nei progr~mmi in

i)

I 1 ;.5

4.07

11

alfab~rico.

re oap:ipo.

~) fer fueilitilte le elaqorazioni del ompoter, la m~ggior parre deJle aziende immagazzin
.
.
rurr~ le prop;a e infoumazio,ni in UD unico fil~..

~ftl1fv.etan.ri,c:;,. d~L:pagaiuenti nell.a c::orrisp9o denza), quste saranno mrne5se in un file. Alla fne di ogni
v~r-1o.ii19 ~J!>mmerciale (un mese pe;,r altine aziell4e, una set:timan per altre, un glgrnb in certi tasi) il.file
de!!llt~ irant~.z!.o)li (cbiaiuato 0 trans.,dat 0 nell'Esercizio.11.3') sar cntnt at c on il file principale
e1111Inato ~ ol_dmast'. dat ui P:~ll'E~ercizio 11 ;9), aggiornando ccrsl tutti i-record di .conto c0n gli ultimi
ai\tll_$.~ ~ p:aga:I:leati. Dop9 che i sud,detti aggiomamnci sar1u10 stari :eseguici, il file principale sar
rlse~'ttiJtm !J.n.p_u9vo archivio (Ji newmast. dat 1'}che, alla fine del succssivo _periodo cdmmet.~lale; sar
.6$a.JtQ p~1=' ri9minGi~~jj processo di aggiorna mento.
J: pr.qgra_mqii c:ij. file-matthing devono affrofitte a1tuni p.roblemi d1e no.n h.anno risconrr0 in
'liaell:i: ~b.~ g-~~ti_scono .degli archivi singoli. Per es~rnpio, no:n sen1pre s.ar possibile riscontra re' delle
c@y;rjsg,c~deqze tra i record dei due file. Un liente presenre sul file principal e potte~bbe non aver
~' ei'et~a:tp .a:Jcun acquist 6 pagam.ento nel prodo tommet-ciale cor:reote e, di consegue nza, per questo
td;ieJrl~ Hi_n e$$1;~rebb nssuo reoord nel file dlle transazioni. AJlo stesso modo un cliente che abbia
F(~:r;.~u.aJO' :qUil;he acquisto o pagam~nto pueb.be es.sere app~na giunto o.dla ce:munit, e l'3ie11d~
~liJ~i-ebb~ npn aver avuto f'opporta nit di ci'are per lui un rcord princ~pa1e.

i:[~g1~ isfruiioru scritte n~ll 'Esercizio 11. 3.- c@me base per scrivereu;n progr~ma: di file~mat~hing

12 -r. hl, (q.~~al>ilit del eredit. In og.nuno dei ftle, usate il numro di cont0 . come hiave del recerd per
~JE~ntr}lll2e l t6rrisp0n dnze'. Suppo.nete che siano tutti file seq!J.enz.i~ cop:~ rei:;ird immagaz;zin_at1 in
~~ 0I'e5.Iit di .riurnero di GOnto.
Q,gili 'V' lta che aTiete riscontra to una corrispon clenza (evverosia, quandp avrete ETQV~o due
rll!cexd 0n lo tsso n1.tmer0 di cnto sul file prinip,.:ale e,su quello delle transazio.11i), dovrete aggiun~ al! sl~ eorrente del file principal e l'ammontare in dollari rileva to dall' a.rchivio d~lle tr_ans~ioni e
~~ete S?rivert: il reco.rd,di 'i newmast dat';. Conside-rate che glJa,cquisri saranno li1di,caci s11Lfile delle
"tt~fis~ionico,n.-importi positivi, menrrej pagamentl saranno indicatl con un am1nont are negativo. N~l
cas in Cmi per un. certo oonto ttov:iate un r~c0.i:d principale, ma ne~suna co~spondenza nelle transa~oD, dtSvr:fit setnpJjce ment scriver~ il record pnncipale in_' newmast ~ dat,~ . Nel ca,so in cui tr>v.iate
un r'tc-0.r d d transazione, ma nessillla corri$pondenza tra, quelli prin;_cipali, dov.tet;e visualizzare il
mw s~~o <'unmatched t r ansacti on recorll far a.c:count number ...." (~9mp1et_ate i!-m~ssaggiq,
Rl~anct()il.:nume:ro di conto dal record d i ti:al),s'm one).
1

11..8. tlopo aver scritto il progr.amma dell'E.sergrio 11 ..'7, scrivetene uno sempl che cr alcuni
d ati ~ prova per controllare il prqgtan:rma clel_l'E.se,rcizio l~l_.7. Usa~e i seguenti .da-ti di c:l,lto;
"

file principale:

Numer di:conto

Nome

Saldo

100
30.0

Al~n

348. 17
.27 .1 '9

500
-

s~m

=-

700

~-

Jnes

Mary Smith

Sharp

suzy ,Green

0.00
-14. 22

CAPITO LO

409

11

File delle transazioni:

.N'-'mero di conto

e d.e ll'attrezzoNom.
'

. t~'i t'"
Quan

Costo

Smerigli atri ce elettr.i ca

57. 98

1f/,''

Martello

11 . 9.9

2~

SQJ da tr.-a foro

~!a

-
:56

Falciatrice
Sega elettr~c,a

76
21
:3
18

"018
11

Giravite
Marte.ilo

lmporto in dol.lari

100

300

27 . 14
62.. 11

400
9.0 0

100.56

82.17

11.~ Eseg-uite il prgr.amma dell'E ercizio. 11.7 usando j fiJe di prora creati neJJtEsercizio 1 I .8.
Usateil progtainn:J.a della Sezidne u .7 per visu~liiizare un nuovo file priiTcipale. Veri-f.at atten-

'

da

79.~0

99 . 99
6 . 99

106
11
34

ti.bbro

C:h iav.e 1ngles;e

11 . 00

~ti

. 50

7.50

tamente i risultati.

].f .13 (jerz_{fratore di parole cor~ i 1214trz.eri telefonif?i. Le tasti re t.elefoniche standr;d _dej, cellulari.
~p'teng 9~~ ]e cifri= da zero a nove. A ognuno dei numefi da due a nove sotto assot1ate rte o
~~'ttt~ ~!~ere com indicato dalla seguente tabella:

lJ.:10 . probabile Eanzi molto oon1un~) che ci ~_iani diversi t~eo:r:d di ttansazion~ con 1a stessa
b-iave. Ci _pot rebbe ,accader perch, dwante un periodo <::QJlllnercia1e , un particolare client~
pgrre-bbe effettuare di-ve:c:si aquisci e pf!,ga.rnenti. Riscriv~te iJ voS'..trO pro.g ramtna di f1e-matchin g
p ?r la c_o ntabilit del_;c;;:redito :strirto nell~Es~.r~i o lJ.7, in modo che sia p.ossibile gestire svariati
re:orcl di transazio.oe con la stessa thj.ave. M9ilfieate i dati cl.i prova.dell''li'sercizio 11.8, in m.odo
da incJuder.e questi ulteriori record di transazione:

.2

A
D
G
J
M
p

Q A

uV

300
700
700

Let:ter-e

'3
4

l.mpor to in dollari

Numero.di conto

MllM.ero

83 .89
80.78
1. 53

7
8

per~on

ohar lastN.ame [ 15 J ;
firstName [ ~S]l
char .age[ 2] ;

char

,,'

(/

};

b)

s
z.

~a ~egiplite P'arla in-Vece di un numero telefonito , allora que11 aziend riceveJ:ebbe i, ndubb.ia~

sia g( srata-definita e che~ .il fk sia gi staro apt!rt-0 in "s.c rittura:.


a) Inizializzat e il file namage.d -a t in modo che ci siano 100 record con
0

IDl@r ~Qlte p_erson~ (a me.II19cizzazione dei num~rl telefonici un op~razioiie diffi~ile _~ pet
qt!~~'~"'9-'LQ.tivo ~ utjlizza.D:o l-a corrispo,nden za.rt le Gi~r~ e le lettr~.~r svilu~pare ~ar~l~ li s~
~art~~ ,h,e orri~gondano ai propri numeri telefon1c1. Per esempio una p.ersona 11 cu1 numer-0
,~!_eJe:nicp, s~ 4.~8-6374, potrebbe usare le c orrispondenz e indicat nlla tabella prl:cederire per
.. .
.
.
:sv.iluppae L~ p~pla di sel:t letter INUMERI.
L~, a;t:kil_d"C tentano 'sp-esso di atte.nere dei numeri telefoniGi eh.e po~san-0 essere facilni"ente
~~cl'alti eia.i loro clinri. Se, p.er le telfon-are d~i propr ciinti ~l azcienda potesse pilbblicizt:are

s_trLittu.ra

struct

E F
H I
K L
N

wX

s
11.11 Scrivete delle isttuzioni he esguano o gnun9 dei seg:ue)l~ com.p"iti. Suppen.et_e .b.e la

mefrt~ qualche rlfonata in pi.


gp1 pare l ili sette lrt~re corrisponde . es:ittamente a un llLlmer0

11

lastName = 11 Unassigned " ., frst.N1"'e = M u' e age = "'0 11


J rnmettete 10 cognomi ri.mi ed er e ~crive:reli nel file.

telefomco d1

a.l:rrettant~

cifre. liJ.n rStoi.a.nte che dsiderass.e incrementar e gli introiti dci propri affarJ, p_.otrebb~ siaurame~t~ tanto eo~ il numero 872A266 (o\fVernsia 1"USCIAM()' '').
A egni ni.ufiero telefonico, di serte cifre corri:spon dono m 0 lte dls,t inte parole di ~lttettanre
giusrappos:to:n.i di lett:~re senza signif11,lt~r~.. $fcJ.rtunaramente, mblte di <queste tappresentano _
aoo. Tuttavia, : probab'ile cheil ptopci.etati:o :di una bott~ga di barh1\~r~' po:ssa e$Sere conrentQ di
s3;p.e.fe "fle il num@r(J t~lefonico del pro.prio -salone,..227: 3554; C()_rr.sponda a (CCAPE.L,LI,,. li
1?'e.pi iita.ti: -di LUi ntgozio di alcoljE:.i sarebbe senza dubbio felice _ di sc?prire Che il l1umer~
:&le.o.nico 'dl!l prup.rio nego.zio, 547-.8~74, ~oinl~ida con "LIQUORI,, . U~ veg~t~iano qn il
a,M;m:ei:~ ifelbfb>'ru.co g,.37~3872 sarebbe compiaciuto di sap:e~e che quelle cifre eqt1Jvalgan0 alla
. la , .mnnY m " .,,
~ar~ : - v. .c .l'\.;W u !V\. .
1

e). Aggio.rnate un record e; qualora non v'i rr9viate delle infowazio.rt.i. informare l)uteitt_e3'rt il il1'essaggi o ''No i nf o '.
d) Elitninate un record che cont:e.nga delle informazioni, iniziilizzand:o nu6:vam..e nte quel
p-.rticola.re: record.

11.12 S'iete il _pxopi~itatio di una ftrram e.nta ~ ~vete bi~pgno dl man tn~re un inventario .J'ie
poss.a dirvi quali e quanti arttzzJ cavere e il sto di Qgouno di es.si. Scri-v~te ru1 programma ch
inizializzi il file (hardware ..datn con 10.0 reord vuoti1 vl -~Qns.ent~ di i.tnmette.re i dati relativi a
oga.i aurez:z.~o ., v.i dia la .fYossibilir di elencarIi tu~i vi lasi eli mj nare il recu.rd di un attrez.z0 che
ii.on. ave:re pi e vi permetta di aggiornare q ualsiasj i a formazione alJ interno del file.11 -nuniero.di
identifeaziome defr.attrezz:o dovr essere anche _quello del reorq. U~ate te $egu~n-ti inform-cfZni
come dati. iniziali per il vostro file.

di sette ifre, scriva in ~ file <lgni.pos~i_bi!.:~


~~aJia 0;] ~tt~ tet:te:re t:otr.is,p ontlente a. quel nt1rneto .. Esjsro,n e ~.L m.a~sim() 16~84 pnroie p_o~sibJl1
(4 eleya;tf:I alla settima poJ:n~). Evitate i nume;ti di elefonp con Le c:ifre ze.t;o e q.n q .
.

'

$1~.iiv ete an program.ma C eh~, dato un

hU.rfi,e ro

CAPETOLO

1~1.14 Ne! caso in

lJ.!: ~bbiate a cli~po_sizio.ne un dizionario corn-put:rizzato

11

modificar~ il pro:gramma,

Il

che avete sci:it:tQ uell~Esercizio 11. l in mo_do che rie:;erc;hi le parle nel dizionario .. Alcuiie
dell~
com bina zion i di sene lett~re create d.a, ques,to prog ram ma cons istan o di .d ue pi pa:ro
le (il nw:ner9
telefonico 646-2276 corrispo_nde a (fMIOCA.Pbn).

CA PIT OL O

11.15 Modificate-1) esempio della .Fjgur-a 8. t4, irl mido che ucilizzi le funzioni fge tc e fpu ts, inve
ce
di ge,tc .h.a r e puts . I1 pr.ogi:~mm.a dov r offrire all~utente la p'Qssibilit: di scegl~re se leggere dall_
o
standatd input e scr.i:v.eresullo st911dard ou1 put1 o $t! l~ggece e scrivere in file_speG1ficati. Nel caso in
cui
rute nte stelga la seonda pos.~ibilit~, cp_~entitegli i. immetter i nom i dei file cl.i in.p ut
di ou~ur, .

Le st ru tt u re di dati
I

,O bi et t.ivi

11.1 6 Scrivte un programpia che usi l'op~ra.tore si-z eof per determinar le dimensioni
in byte l~i
-vari tipi di dato sul vostro sistema. Scrivete i risultati nel file da tas.i i:.e . dat" , cosl ch:e
possiat:
visualizzarli in un seo-nd mom ento . Il form ato ,dei risu ltati nel file d.ovr-essefe:

'Essere in grado di all_ocare e lihe!'.are l~ mmo~ia per ,gli oggetti di dati in mod.o clinamico.

J!,sser,e in grad,o di form are stru ttar e di dati cn tate nate usando i pun tato ri . lest mtt nre

"

ricorsive e la rico(sione.
Essere in grado di _creare e gestir~ le lists: ooncat~~te, le 09de, le pile e gli alberi bina ri.

Cap ite--varie imp.on:anti applicazioni delle stru ttur e di dati concatenate.

12.1 Introduzione

~lJ iam stt1.diato sttuttur.e .di dati: e.o n dim~nsion fi.s~a c ome i vett ori 11 n a q a due
dhiio~ioni, le st ru et. Questo capito.lo introdUir le stn*tture di dati dint;.miche "9n
Not a: sul VQSt:J;'9 c9mputet, l dim.ensioni de_
i tipi di dato pt:rebbero non corripondere a. quelle
elencate qui ~opra_.
-

11. 17 Nell,E'serciiio 7, t9, avete sc_ritro un~a simulazi0ne soft war e di un computer che usa
1Jl10 speciale liaguaggj macchiria, chiamar{) Linguaggio Machina 'Sim:pletron (LMS). Ogni volra_che volete
es~guire un ptgrriunaLM:S, dqvere digir.are d~ E-S:stler_a _il G:odite per immette rlo i;iel srni
rlatorc. Se vi
capirass~ di cnimenere un erro,re dura nte la digi tazi one deJ pro-gramma
LMS, dovrste far ripaxtir~ il
simulat_ote e digitare nu,ovarn ~nte il ~dice LMS. N<ln sarebbe bello potei' leggere il progr-ammal
MS
da un file, piut tost o th.e cligjtarlo ~ni vilr:~ Ci rid.urreh.be il tempo e ~i erro ri dura nte
la fase di
prepatat.iort~ _per 1~esecuzione di un piogi:amma LMS.
a) Mo-d1fi~ate il sim u4r~or~ che avete sc::rirro nell}:Ese,rcizio 7.19, in m&io eh~ legga i pr9gra-m
mi !:MS d tifi file sp~ifi ca.to tram ite tasti.era dall'utente:
.b.) Al termine della sua ~ecurion;) il Simp.l~rron lIY'Ii vi~uallzzato sulLa schermo il crite,n uto
dei prop ri registr:i d~lla__memoria. Sareh>be sic11ramente bello potet catt urar e 1~output in
un fll, per:ci m.dificat!; il simu lato re in modo-eh.e scriva il_ suo outpti.t in un file, oltre che
sullo scherm.

cdi 1 ~1~i;ibn.i c_h crescono e dec~escono -durante 1'es~uzicn~ de~ pr~gr~roa. Le_lis-te. conca~en~te
.

00~ ~Q11~.:z:,i()ni di unit di inforfn:azione "messe in fila indiana ; nelle quali. le mserz1?n1 e

possono ~s$ere eseguite in una qgals1~si p,osizione della lista . Le p~~ (o


s.t~k!j, nelle quali le inserzioni e le elimin~ioni ~ono ~seg~te s?l~. da ~a l~ro :s:rerruta la
te-st4 tlella pila, s:tJ-no mt>lto imp orra nti per i co::i:nip~a-tou. e i s1s7em1 ope~
aov1. Le code
~gps~enrano__ linee di attesa: le insetzioni .so~o ~~tte ali' es_rrem~ta. _p_o:~e:1~re delle C:O-d~
ca~t-ta art_he fine de//(l tod4) men tre le elt.tnrilaZIOill SOilO ffettuate all .1 n lZ_l~ delle S~ess:
(iit:tt.~ an~he testi/. d~l,la oda). Gli al~er~ binari facilir~o l.e. ri?~rth~. e gl1 ord1~_at1let1t1 de1
clati -ad alta velocit, l'eli min azio ne effic1~nte delle 1=J-rut di informazione d11plicate la. ra~
}l?IlSentazione di :directory del file system e la pm pila zion e delle e~pressioni .in lin~g~gg
1?
m~cnina. Per ogpuna d queste suutture di dati ci so110 molte altre tnteressano applic~1oru.
l)il(l.ter~mo 0gnuno dei tipi principali delle suclde~e stru ttur;e di ~ati e .impleme~te1 ~e.mo d~j pJ"9 gra mm i che le cre~r~nn l ~estir~no. -~es ~ -~ ,c.ap1tal~ llllpe~aovo:
UR>'to,grammi ,.sono .prposi e incotpqrano la ma.gg1q_ patte d1 qu1ell~ _ch_e av.ete appres? nei
eafitoli precedenti. I progrrunmi fanno u.n .us~-, p~~te de~a ges tion e de~ pun. tat? rt, W:
:rgomnto ch molti considerano essere tra i pJu ~c;o!r.os.1 del
Il :3"P.i~olo e p1~no di

ilJ'. "limi:n"a:zioni

WQgr~mm!

'?

4i el~vata utilit che voi sarete ii!J. grade di utilizzare ne1 c~rs1. pl~ ava~zat1;

e~o

l:nlude a,p.che un.a cica cllrione di esercizi che evidenziano le' -appl1caz1on1 pr~nche delle

st.rtltrur e cli dati .


<

Nel speth:irno sincerament~ ,ehe vogli~te provare a realiz~~e il pr~getto pi im~or_tan


t&, 1d:esGr,t te nlla sezin.e speciale "CoStruire il vu_
stro c:ompUatore S1nora av-et~ usa to
<'.:Om:E.latofe per t_ad_utte in linguaggio"tnaGchina i V-OStti ~r:ogrn1nrui L, mo da da_po_t~tli
e~~'ri-re, _sul vqstro ~omp~er. In questo progetto, costruirete. re,alm~nte il v:es:ro com:pila~
fQ%<.. Q_n:~to l~gge.t;;l- u,n _file di istruzioni scritte in un sem.pl1c-e rrta pot ente
l1ngu;agg10 di
1

u:

rn:

--

__..

.4 12

CAPITOLO

12

alto liv'ello; simile alle prime versioni gel popqlt:e linguaggio BA_SIC. U vostro comp.ilatere
tradur r le sudde tte i~t~uzioni in lJQ. file di codiee scritto in Linguaggio Macchina Simpletr0n.
1M$ il lingu(l.:ggio eh.e Cl.Vete appres0 nella sezione specale del Capitolo 7 "1.ia costruzione
del vostto compute_r'). Il vostro progta mma di sim.ulaziorie del Sinpl etron, inTine eseguir
il codice LMS pro0 tto dal vostro comp.atore! Quest q p.rogeno vi dar Ullgt. mer.aviglio:sa
OI),:portunit di tgsercirarvi sulla ma.ggio,r parte delle cose che ~vef:e aplpre.sp in. qu~st,o ~o.rso.
La sz:ione specile vi accqmpagner attent~ n1ente ~rtraverso la. pr.ogetrazione del. linguagg~o di alto livello, d escrivef1do gli algo.riani di cui avrete bisogno, per convet tire ogni tipo
di is_trm.io.ne cli alto livello. nelle corrisp onden ti in linguagg~o machina. Nel cqSQ vi piacciano le sfide, potr~te tentat e di apport~e j tnti migliott! menti , per il compiia,tore e per il
sim111atore Simpletron, suggeriti nella Sezion~ Esercizi.

413

fi-$~1JT11JRE DI DAil
r.

12.2 Le stru ttur e ricorsive


strittfUra riaorsiva onti~ne un memb ro di tip!> punta to.re,, ,che
stmt_t4ra dello :str;sso tipo di quella -in c ui con:ten uto. Per esempio -,

Una

f i-iferimento , a una

la definzion~

struc t node {
int data;

struc t node *nex tPtr;


};
definisce il ti,po struc t node. Una stru.:.t tura ,d_i tipo st:r u,c"t n,o,de L1a due i11embri, lli.n t,e r data e il pu:nta;~or:e: nextP tr. Il mem1J'rt> nextP tr punta a st:ruc t np,de. Q_$:sia ~una.
$ITQ.nutq, d~lle stesso tipo di quella che stiamo dichiarando in qiJ~to mome nto, la ci il
term.i,ne '{s,t ritttut!Q tlt:otsi1ia,~. Il memb ro nextP tr e detto lirtk (leg~).: in altre parole,
.n ext.Pt r pu: esser.e usato per cleg~e o cq,ncatepar'*! u.na s_trurt11i:a struc t nod e ~, un'-altta dello stesso tipo,. Le s"qu_tttlr~ ricorsiv.e possQno essere legate lisi~tne per forma re utili
organi~iion.i di d~ri come le lis.te, le code:, le pile e .gli .alberi .. La Figura 12. 1 illu~rra_du.e
s_tw:ttur~, rio1'sive che sono state conca tenate pet fomnare u.n a lista.. N ott cli.e~ nel membro, cli le;g.ame della second.a struttu ra tico.rsiva, stata pos~ u.na lin~ obliqua.) che rappre""
se.n ta un punta tore NULLJ per i.q.dlcare d'!e illega me non fa riferime11t.o a. un'_alua s truttu r.a.
.La lin.a obliqu a ha $ol un,o sco.pq illus.t:.r;gcive; non corrispond~ al caratt:ere baekslash
11
11
(
\
). .del C. Un punt~tore NUL.L norm.almenre indica -la fine della Struttu
ra di dat~ . propri o
cqme il caratt~r- NULL "indie.a la. fin.e di una stringa.

Obiettivoportabilit 12.1
II:a dime.nslone di un4 strt4tpf,/,ra non necessariamente la somma di quelle dei suoi membri.
Ci' tt ~aw~ de.lte esigenz-e di :alli.neamento dipendenti dalle div~r-se mitccl'Ji1ie (consultate il Capitolo 10)~ -

Errote tip,ico 12.2


Presurnere che la dimensine di una sttuttU.ttt sia semplicemente La somma di~ qit.eile di i
~uoi membri.

E rr:ore-tipico J.J .1

'

.... -J

---

.Buona
abit'u...din.e 12:1
.

Dirrtenticare di i'.mp,ostare NUL.L il ii1:zk dll ultimo nodo di u121. listtt.

.....

....

'

&:sate t''opera'tore siz.eofper determinare la dimensione. di una st1"UftUra.


Figura 12.1 bue strwtture rlcorsive.con catena te.

~Eu.ona
.

abitudin:t1 1.2.2
.

Qytando iftiiizzate nutlloc, ticDtdatevi di eo1itrol!are se.il v4lore resritztito .unpuntato,reNULL


Visualizztite ttn messafjjo di er:rore qualora la memoria 17.chiesta nO'n possa essere alb1c4ta.

12.3 AllQcazione d~i_n~mica della mem oria


Creare e gestlre s:trunuEe di daci dinam iche ci.ch!iede !'.allocazione dinamica delta memoria:
in .altre parQle, la rn.pacit d1 un progra mma di ottne re duranre la sua $ecuzione, un
maggior spazio di memo ria per lmmaga-tzinare i nuovi nodi e di _pot~clo rila~ciare qU:ando

Non rilasciare la memoria ailoeatd dinainitdmente, qua11tlo non ep!it ncessaria; potrebbe
t;,4U$a1:e un esay.rimrito prcmaturo della nimoria efl si$tema. Questo tipo di errore a
'tl.Olt.e chiamato "memory leak" (petditq.. o dispersione di memqr.ia).
.

414'

CAPITOLO

415

LE ~~ Dl p.A11

12

Obiettivo efficienza 12'.3


Ne l l'fJ.Qmmto :in cui la memor~a che aYtt:vate' aiio.cato .dinami
camente n..an pi necs-

so.ri:aJ usate fre e


EJ~ote !ipico

p~r

Gli elementi di un vettore sono i.m..magazzinat nel/4 memoria ihn

m
,odd
--mentir un accesso immediato a ognuno dei jttoi ciernenti, petc 1 P ~n~Q. Ci~
. t in_ irizzo i questi

rilasciarla imm.ediat"a'mente. al sistema.

;:tr

12.4

Rilasciare co nfr e /,g.1'n.emor.ia che non stata allocar4 dinam.c


arnente con

co12

loropos~zion f~sp~tt~ aJt'ini~iiJ de/~, tr~ore.

Le ti-st.e co.ncat:ena:te' rion pennettor1,o un acesso cosi zmme4tatq


az propri -?lememt.
1 uodi d.elle lis te conca~enate no rm alm.e nte non so11:o ..im
m-a9azzinat n memoria in
..:e'cil~ ontigu,o; 'Dal pu nt o di vista logi~cn, tuttavia, i nodi d1 un
a l1s;ra -~~nca:~nat~ se-rnbra~
~0"~~~~~ c_>ntigui. La Figura 12 .2 mstta un a lista co nc ate n ta
co n cl1verst nodi.

m al l.Dc.

Err{J:r-e t:ipicq 12.5


Puntare, a un'area di r12'fniJ.r ia -he stata rilasciata

t!SJ&re afcofat_o direttamente .i n /ftt!ffeaf/,a

fr ee .

st ar tP tr

12.4 Le liste c.o nc at en at e


1

Un a lirta eonca,tenatauna ollezion.e linearedl's.trutture ri<


;>rtive (nod~) connesse da purtrar~i
de tti lin~ (nelli o cq lle ga me nti ), da cu i il termifie
lista "conc.a ten at '. Vi si actle pe r
:tne,zzo d1 un pu nta tor e al su o pt im no do . fl. quell
i. succe.ssivi, si ac ce de per m .ezzo del
p11htarore di c_p nc ate na me nto irnrna:gaz7jnato ir1 e.gni no
do . Pe r convenzionel..il puntatore

1'7

di ()ncatecna uie nt0 dell'ultimo nodo ins.eriro in .Lln3. .lista e


im p9 sta to a NULL, in -mod0 da
m ar @ e la fine della stss~.. In u~ lista c-0ncaten.ata i
da.ti .s.o no .i m.magazzinati in rnodo
din_amlco: ossia~ of5!1i po do s~ creato so lo quando $r_ ne_
es_s,ario. Un nodo pu co.n~ene
re da.ti di ogni tipo, inclse altre st ru ct . An ch le pile e le
code so.n o delle strurru_re lineari
di da ti e~ o me vedren10; so nd ve rsi on i lint~te delle li;Ste
co nc ate na te. Gl i alberi .inve,ce
sono stn itt ur e di da tl no n lin.eari.

29

..

,, ,

--~193N

Figqra J2. 2 Una rap,presehtaziohe grafica di un a lista conc


ate ,nata..

Obiettivo efficinza i 2~ 4

Le Uste di dati _potrebbero esser immagazzinate in vett{>


.ri, ma le liste co nc ate na te
offrono diversi vantaggi. Una lis~a c:oncatenata sa t app_ropr
i~t4 qqando no n sar posib~ile
determinare, a priori. il ntu ne ro delle un it di inf r tna i:io
ne che dovranno essere rappr~
sentate c:ont~rnporaneam ente nella struttura. li dati. Le List
.~ co n at ha te ~on.o din a mie:h.e
petti la loro lunghezza"fret'! crescer~ o ciecr,escere secondo
net:esst. La dimeQ:Sione -di
un vettorG, inve,ce~ no,n pu essere alter-ara~ perch 1-a stia mmo-ria
: : stata .allocata. du ran te
la mpllazine. I ve tto ri pos$<lito_riempirsi. Le li~te
co n ate na te: in.veJc_e, si rie n1 pio no
so lo qu an do il si$ tem a no n ha pi me mo ria suff!.c
ieute p.e.r soddisfare i ric hi_ste di
,allocazione .

[i

Usare l'allocazione di1za:rrt.ica deil.a memoria_(inveee dei vettori) per 'le


stru.ttrJ.te .di ~ti
;he crescono e decrescf)nQ durante lesecuzione dei programr.rt.
potrebbe fa~c ~-isparma
re /p. mf;moritt. Tenete.a mentel per, che i puntatf)ri sQtt:rggo~o
spazio :,~be ./~!locazione
dinamica de/14 rrle:morip _in,_arrenell 1on~re causato .dalle chiamate
dz. fa n_1-ione.
n _prt>gr-amma dlla Figura_12.3 (eo.urpu.r m~stra~o nella ~igura _12:4). g~s~-~ uu
~ li~ta
Garatt.eri. Il pr og ram ma offrir du e scelte: 1) mserire un
carat:t~re nella ~-1sta l~ or din e

a1t!~h~i!ao

(_funzion e in se rt) 1 e 2) eliminare t1n

~ar~ttere .d~la

lis-ra .(funzione .d.ele~e) :,

Qu~ . un _progrirruAa lung~ e complesso che s~a disc~sso :n d~~t-agl_


io_.
-~E
s.erctno .12 .~o
~hi~d,ei: allo stu de nte di imple;:mentare una fu nrztone r1~or~l~a che
vi:
s
u~

z
~
un.a _list~ _in
~.
:
J!_
,.

.
-.
- .T,E
se rciz , 0 12 .2-1 c-hieder allo studenL d1 1IT1,pln1en
or-w..u:e .inverso..
tare u11 a funz10.n e
L

. .

. ..

- ..

ritofsiv:a che cerchi in un a 1ista concatenata un a partic0lar


e unit dl infiJun.azio.ne.
/* Ma:r:aip ol a-zie>ne e ma nu ten zio ne di una li st .a
*/

Obiettivo e.fficienza 12.1

,.#~nelu de

Un vettorepo:tte.b.be essere dithiarat(J in mqdo d.a ctJnterire pi u e/e


fm~nti di q,uf,(nti fossro
stati P'~ev.isti, ma tjitesto potr~bbe costituire uno spreco di memorim
. In .queste situttzioni, Le liste concatnate possano .offrire .ztn miglior ittili~ del/,a
memoria.
L~ liste contat~n~te .poss,o n.o Ssere ma nte nu te
in modo .o rd ina to, inserendo 9gni nuovo elementQ n~lla- posizione .a pp ro pr iat a ali' i nr~'IJ,o d~lla lis
ta.

<s td io,. h>


;#J.:M1Gl Ud e <s:t: dl ib .. h>

st~uct 1i stN od e {
eh.ar .~tata;
~truct
I

Obie.tt.ivo e;_tfit'ieriza 12; 2

/* st ru ttu ra ric or si va *f

l ist No de *n e xt Pt r;

};
t1~'.fffd '. ef st ru ct lis tN ode. LISTNODE ;
t 'YJ
.. l>def LIST'NODE *LISTNODE .PTR;

In un vettore ordl:nato, l'inse~imento e lelimin.azione po~ebber


t/ richiedere del tempo:
.s.i dovr far seorrer-e, in modq (Jcpproptiato~ tutti gii elementi ~1fccessi
'Qi a quello ittseiito

-o rzmosso:

Yo iel t ins er t ('LISTNODEPTR *, cha r) ;


0.tlar d,a le te (LISTNODEPTR *, ch ar ) j

i.At is Empty(LISTNODEPTR);

ve.id 13 rin tL lst ( LISTNODEPTR) ;

'

(continua)

416
v0~d

C.AJ>ITdLO

417

12

inst ruc tion s(v oid ) ;

m.ailil (. )

,f

vw,id im$ t r uct ion s ( vo:t.d)

V!L.s.t:ra:1 .izza le istr uzi oni

*l

LISTNODEPTB sta ttP tr - NUL L;


int cho ice;

ohar item;

in srt r uet i o n.s (..) , I * v r s ual


. 1 z.z a 1 1. men

u .
* /
prin tf (: ~ ~l rl ): ;
se a nf ( '~ %1 ~ &e h oi c e ) ;
1

.p~riAtf

( '11 Ent er you r cho ice : \. n 11


H
1 to ins ert an elem ent into the l ist. \n B
11
2 to de l ete an element from the list.\n~
"
j to end.\ n ~);

Y*
While (Ch oice

1~

ln~erisce .0rd iAa tam ente un nuovo valo re nel la list a ~1

. bid insert(LISTNODEPTR *s Ptr , chaP val ue)

3) {

swi tch (cho ice) {


case--- 1:
p rin t f ( 1' Ent g r a harao ter:
can f("\ n%c ", &item);
ins e rt (&s tart Pt r i t em):i

11

Ll,_STNODEPTR new Ptr, prev ious r>tr , cur r-ent-Ptr;


hWPtr

);

.i f .(newPtr != N.U.L L) {

printL~st(startPtrJ;

case 2:
if (!is Em pty (sta rtPt r)) {
prin tf ( Enter cha ract er ta be d&l ete d:
11

/* la memoria dicSponibile? *-/

new Ptr- >da ta = value;


new Ptr- >ne xtP tr = NULL;

bre ak;

so an f ( 11 \ n%e 11

malloc(sizeof(LISTNODE))i

pre.v.i ,0USP tr = NU LL;


cur r.e ntf' tr = *sP tr;
1

11
.);

&item ) ;

whi Ie (c.ur ren tPtr 1.:... NULL && valu e > cur ren t:Ptr ->d ata) {

pre vio usP tr = our ren tPtr t


cur ren tPtr =' cur ren tP't r-> nex tPtr ;

if ('de let.e (&s tart Pt 'r, item }) {


prin tf( j1 %-c deleted~\n 11' , item );

pri ntL ist( sta rtP tr);

I* pass a al. ..
*/
I* ... prossimo nod o*/

e_lse

r'

if (pre vious Ptr

==

new Ptr- >ne xtP tr


*s Pt r = ne,wF> t r ;

prin tf(u %c not f0un d.\n \nl! ., item);,


}

els.e

NU'LL ) {
1

*sPtr~

prin tf ( 11 Lis t is emp ty. \ n \ n 11 ) ;

.e ls.e {

pr evio usP tr-> nex tPtr - newPtr;


ne.wF>t r >ne xtPt r = cur rn tPt r;

bre-ak ,,

def alll t:
p rc in t f { 11 I nva l id e hoi e.e . \ n \ n ti )
ins tru ctio ns ();
.brea k i

'

.;

}.

}.
'

else

prn tf( .1~ %c

not .i nse rted . No memory ava lab le,\ n 11

valu e);

.Pri ntf ( 11 ?

11
) ;

scanf("%d"j &choice) ;
}

prin tf( 11 .End .o f run . "\n l1);


retu rn 0;

if ("vi lue =

(*sP tr) N>data.) {

(continua)

418

CAPITOLO

t .empPt r

-= * sPt r;

/* 11 'Sf ila 11 il nodo */


lib era l .a mem or a usa ta. da l nodo sfi l'at o

/*

fre e (t.empPt.r );

re't urn val ue

11

'

~~ien~ pr-~.ritList visualizzer. la li.sta.

el$ e {

pre vio usP tr


cur r-e ntP t r

= *sP tr;

= (* sPt r) - >-nxtPt r;

wh il (curr~ntPtr != NULL && cu rre ntP tr- >d"" at a .1 = val ue ) {


Pre vio usP tr = cu rre ntP tr;
/* pas sa a1 . . .
*/
cu rre ntP tr = cu rre ntP tr- >n ex tPt r; /* ... prossimo nodo */

if (tu rre ntP tr != NULL) {


tem pP tr = cur~entPt
r ,
pr~v_ousPtr ~ ::..n ext Ptr - cu rre ntP tr- >n ex tPt r
.

'

f r e e ( te mppt r ) .i
ret urn v.al ue ~

ret urn

\.0' ;

/* Se la lis ta vuo ta res ti t~is .c:e 1 al tr ..i.me:nt i 0 * /


in-t isE mp ty ( LISTNODEPTR' sP tr)
{

--

l-* Visua..iiz za la lis ,t a * / .


Vo id pri ntL .i st ( LIS TNODE PT~ cu rre ntP tr)
{
if

(cu,rre nt.P t r =-=- NUL.L)

pri ntf ( 0 Lis t is

empty.\'ri\n"')~

els e {
pri ntf ( 0 The 1is t is: \ n 11

wn ile

(e u rre ntP 't,r ! ; NULL} {


P.rin tf-1, u.%c --> Il , cu rre ntP tr- >d ata );

cur ren tf? tr

L due, fqn iio tti pri nci pal i del le _list e co-11eatena te ~ono ins er"f e d. e
~lete. La fun -
JUQ.1$' isE aip ty dett~ fanZiiJne prdicato p.i:rch non altera la 1i:st
;a in 4lcun m do ma
~att pi11tto~o s sia vuo ta (vverosia, se il pun tat we al pri mo flo do del la lista
Jtia \in NULL} In que sto caso la fum;iune r$tiruirebbe il valore 1 inv eee. di 0. La
1

*sP tr = (*s Ptr )-> ne xtP tr;


}

41 9

12

cur ren tFt r'-> nex tPt r;

pr i nt f ( 11 NULL \ n \ n 11

) ;:

}
}

figura 12.. 3 Inserire ed eliminare i nodi in ul'.'la lista.


1

420

421

CAPTTOLo 12

a)

*- sPtr

pr e.vi o u!';, P-1; r

currie ntPt r

Figura 12.4

~G>utput

di esempio per:r il programma della .Figu.ra 12.3

I I

1 ta.ratteri s:ara-nn:o inseriti n-ella lista in ~ordine alfabetico. La funzion:e insert


ricevet~~ I' indir:i~zo della lisJ:a. e il ~aratter.e ch~e dovr. essete ins~rito. L'indirizzo dlla
lista e necess.ario qualora il Vlllote debba essere mse'r it all,:inizlo: della stessa . Fornire
l'indirizzo d-ella lista _p ermett alla ste-ssa (ovvetctsia~ al puntatore al SU:O prin=r ngq) li
essere mo difcata artrav:erso una hi~rna~a p(lr cife_cimen~q. Dito che Jq. list_a stess~ llil
pt1nta~o_r~ (al s1tr pri m.o elem.-c;nto )., p~ssare l ~ inirizz_
o d~ella lista crea ll_n
puntatore . pu71tato1".e (in .al t_re parrole, una doppia, indirezione). Questa u.na nozione
comple~sa che rjchlede una programma zione. attenta. I passi per lns.erire un t -a tattere
all)i11terno della lista s:en:o i se:guenci (consultate la Figura 12.5):'.
;:.

currerttP r

i;i rev 01:.1sPt r

1)

Creare t1n
t~

--

'

I
I

n,e wPtr

[;)

I
I

I
1

C'

nodo rich.iarpando ma.llac e .a.$egnare 1,indiriz_zp del4 memori.a alloca-

ne~Ptr,

il ca_rt:tere d,a inserire a: :n ewPtr->da ta. e NULL a newPtr->R e)(:tPtr.


"2) Iaiz,ializz.ar~ previousf 'tr a NULL e ourre.ntPt r a. sPtr (il pun:tatore all,inizio clella
1ls.ta) .. I puntatori p,revi.o usPtr e currentPt r saranno u-sati pet imma:g:a:zzinare, ri~;petrivamente, le Locazioni del no.d o prece dente e di quell'o .su'ccessivo al punto di

'1Rseru:tJ.en'to.

w gra 125 l_
,,r:'lser1re orrdiratamente un nodo in una lista.
F1

La f11n,zioJ1e delets riever 1 indirizzo d~l punttore all,inizi0 della lista e il carart0r.@
;che dovr es.s.e re eliminato . I pas_si per 1 ~limina.:z!n e di un carattere tlall list.a
..
1

s~~fi:Q

3) Fintnto cl1 urre.ntPt r ~a_r diverso $ ,NULL ,e il valo.r~ ,da iq~eri.re . $.~ m_aggiore di CU rrentPt r - >dCJ.t~a, ass.eg11~r~ U rre,n tPtr a prev i .ousPt r e fare avanzare
curren.t Ptr al n~do successivo-El.ella lista. Questo individuer il pulilt.o di inserimento
ciel valore nella lista.
4) Nel aso in cui previousP t.f sa N, ~ LL, il nuov nod~o dovr essere in$erit.:-9 me
primo. elemnto della lista. As~egnar;e *sPtr a newPtr->n extPtr (i,lonu_
ovo li;n.k ,pl.!nter
Cosl ali',~ pri mo !fd9) e new.Ptr -~ *sPtr ('*~Ptr punt~r cosl al nu.ovo nodo) . N'el
c:~so in cui prviousP tr non sia NULL,. il.nu,cJyo nodo do.vr esscre. inserito al pastd
givst0. Assegnare new.Pt r a. previou .sPtr~>r1extPtr (il nodo preced.e nte puhter
~si a quello nuovo), e currentPtr a newPt r->nextPt r (il~delnuovo nod pqnte~
to.s1 quello otrnte).
1

Buonil abitudine 12.4-

As,segnate NULL al membro fin.kdi ~n nu.:.110 nodo.; Prima di essere-uti.liZ?"Ati~ i p.ttntatori


d~vono se11'lj>re essere inizi4/iZ$11,ti.

J. Sguent1;

1) Net Gaso in c'ui il carttre da eliminare couispo nda a que_llp contenut() nel primo
..n'0_dqi .de:::lla lista" assgnare * sPt r a tempPt r (te.mpPt r sar usato per rilasciare c.e n
free a memoria non pi1 n.eceS_!iaria) ( *sPt.r) -->next :p tr a *sPtr (*sP tr pun:re~
raeCiisl il secondo noclo della lista)> rilasciare cop free la memoria puntat da ternpPt.r
restituire il car:a'ttere eliminato.
~ Altrimenril inizializzare previousP tr con *sPt re cu rre'n tPtr tfi (*sPt r) ->nextPtr.
~~ _Jfim:tanto h ,c urr-e ntPtr il.on sia NULL e il valore aa elimin~e no11 ~ia guale a cur per rtPtr->dat a a$segnar currentPt r -a prev:i o.us :Ptr e currentPtr->nextP~r a.
currentPt r. Questo determiner .se il carattere da liminare'Sia contenuto nella lista.
4) .Nel ca.so in cui currentPt r 11on sia N~u L L assegnare current:Pt r a tempPtr, currentPtr ->ne:x tPtr a previousP tr-.> nextPtr:, rilsci:are la memoria del nodo. puntato
da tempPtr e restituire il i.;arattere eli1n,in ato dalla lista~ Ne.l tA~o in cui current -Pt r sia NU.L .L, re-Stit uire il oarrt~re NULL ( \0 per jndic::\,te che q ueUp da el im im..are- non- stato ritt:vat6
nella lista.
.
la- Figt1r,a 12.6 mostra 11 elimiuazio11, di un .nodo da una li$ta con~,at~.n~:~ L;:i
f)ai.rte a): cl.ella figu.ra mo~tr~ la lista qncatenat~ dopo la precedent~ ope~az1on~ d1 inserimento. La p~e b).mostra la nuova as_segnazione dell~elernnr 11nl<. di previ.o : us~tr
~ 1ir:asse'gnazio11e di currentP tr .a tempPtr. Il puntato.re tem_j:>Ptr sar usato per rilasciar~ la J'.iieffi.Qfia allocata per immagazzinar.e e
1

......

LJl Figura 12.5 ino.str-::i l'inserimen to in una lista ordi11ata di un. nod0 ch contiene
il Ca:Ea-tter 1 e 1 La. parte a) ~ll-a fig_ura mostra la lista e il n11ov,o nodq, prima dlJ'in,..
serime n,t o. La patte 't1} della figura mostr:;t il ri$1llt51to dell'in_erimento d~l nuovQ 11cJdo.
l p.Ut1tatri agg~pmati so_n9 tapp:reseatJlti dalle linee tt~tteggiate.

422

CAPITOL_O

423

u
Errore:#picQ 12. 6

~)

*sPtr

previo usPt r

cu.r rentP- tr

Non t)npost4.re ~ NULL il m~mbro link nell!uttimo nodo di iina. pift'f,.


prin cipali funzioni us.ate per gestire un_a pa .sn push e po.p. La funzione pus,h c::rea uri
..tiO:eYQ o;odo .e l posiziona in cima ~a .Pila. La funziop_e pop rimuove un nodo dalla testa. della
pila, iiilas.ia J~a memoria allocata dil nodo est.ratto ~ restituisce ~ valbEe che conteneva.
:TI _prr>~ran1ma d_ella Figura 12.8 (l ot1tpu t n10srrato nella Figura 12.~) mplrnnter~ 1na
~e(iiplice pila di valo~ri interi. Il programma 0ffrir ne sc_elre: 1) inserire un v~9t nella pila
C~:11Jt7'ibp push), 2) estrarre LUl valore-llalla pila (funzione pop)! e 3) terminare ee$ecUZone q_d
1

previo usPt r

cur re ntPtr

f.JLOg~~.

e-

,'

B 'I

_
,,,

,,,_
-----,,.-~---------------~

~~r
tempP

tr

Fig,u ra 12.6 1Eliminare uni nodo da un1a Hst.


prin~Lis~ ricever c{>me arg9m~nto un puntatore l!JJ>in iriio della lista, chiamandDlg. cur~ent~tr. ~ f!n.zi.one d~illet in primo iuogl'l se la lista vuota. In questo
11
qaso; print
l1S't visl1a
~g10
.
- l1zzera
_ _ il mess::l
' 1-a propn
.. _ -u-_ j' The ii
-a
- :st .-i' s- _emnty
- ,.:. _ e ce.......
u:... ,; nera
esec~1one~ In caso contrarlo, visualizzer i dari conteilliti nella lista. Fntan to che cur'r entPt r
non sia NULL c:ur rentPtr~>data sar visualizzato dalla funzione e surre ntPtr- >ne:x tPt:r
sar a~~at? ~ c. urren~Ptr . 0 'sservte che qual9ta il~ ~ell'ultmo nod della lista non sia
NlfLL I ~ l~c)ntfil. cieli~ .fumiio.a~ t-enter di visr1a1 izza t~ d~i ~tj_ inesist~nt, cercandoli oltre la
fine.ddla lista c? ._ prov.:o~her un errQ-re. Ualgorinno di visualizzazione pei" le .liste ceintatenate,

La .funzione

le pile e -le code 1denrico.

la ~gne pus.h inserir. un nuovo nodo in cima allo ~rade; i passi n:ete.ssari per compiere
-tal~ ~perazione sonQ i seguenti:
1) Cteare 1,1.Il nuovo npdo richia mand o la funzio ne mal loc ~ .assegnare 1 indirizzo della
memoria allqc:;tta a newP tr, il valore da inserire ne-tla pila a newP tr->d ata N~LL. a
n e,Ptr ->nex tPtr.
,2), 1\:ssegrtare *topP tr (il _pLmtatore ajla t~ta della pila) .a newP tr ->Aex t:Pt r: il mer;nbro
link in newP t r p. unter: cos al nodo he n precedenza occupava la cima della pila.
~D. A..s_sgnar newPtr a *t opPt r: *topP tr punte r cosl alla nuoV'a te-sta dell.a pila.

ti* pr.0gramma per una pila dinam ica */


. inelu de <stdi.o ~ h>
""
-ffnG ! 1:.1d <'Std lib .. h>
1

~f~u~t

stackNode { /* strut tura ricor siva */


int data;
strut t stackNode *nex tPtr;

~rpedef

strUGt stackNode STACKNODE;

';t:~ged ~ef STAC.KNOOE *-STACK:NODEPTR;

12.5 Le pile
Un:~ pi~_ (? st~Ck~ ~ una ;el'Sion lirhita:t di un~lis$ concatenata .. I nuovi n9di p~no esser~
aggiun ti alla pila e .r1mo.ssi d~a st~a soltanto dalla sua ~esta. Per questo morivo, una pila cletta
~~e ~.t.t'uq:uta di ~tl .tas:-in~first~out. (LIF(J,. iultim o a entrare ~ il prim, a uscire). Si fa
r1f~l~~oro, a una pila mediante -un p;irntator all'elemento in cima alla-sressa. Il metnb ro link
nell ulnm nedo della pila- impostato a NULL, per indiau:e la fine della stessa.

. _ _La_Figut;;i 12.7 :nostra una pila con div~si nodi. Nota!~ che 1 pile e le fute concat enate
sono ~ppre~entate- in fuod iqent!eo. La differenza tra le pile e le liste oi1~tenate che in
q~? il pl!nto di insePme!l.w e di diminoi;ione potrebbe essere ov:unque, mentre in~ pib
cpmsp.e nde sempr e alla :sua testa.
stackP tr-

II

. , e I I

,.. I 2
-

,
.
I I -

Figur a 12.7 Rappresentaz.ione grafica di un~ pila~

*.,

v id p us h ('STAOl<NODEP'TB
int) ;
~n~t p.o p ( SliACK:NOOE'PTR "*);
t ,pt ~s.E.mpty (STACKNODEPTR) ;
void print St-ack ( STACKNODEPTR') ;
voip ii1str uctio ns (void ) j
1

rn_9=i.~ '(

).

STA:CKNOD:EPTR stack Ptr

NULL;

I* punt.a a lla testa del-l a pila *I

int choi , value ;


:J,nst.r uct on s ( ) ;
print f ( ? ~) ;
11

s0anf ( 11' %d I!,, '& choi,c e);

1wn,i le ( choic

l = 3) {

(cdrtdnua):

..

CAPlTQLO

sw i.tc h (ch oic.e) {


cas e 1;
l

* a_g giu ng e un va lor e in

pr in tf ( (l l:nter an in-teg er:

11

cim~

all a pi la *-/

sc an f( 11 %d 11 , &va lue ) i

push(&stackP t r 1 va lue );
pr int sta tk( sta ck Pt r) ;
bre k ;
ca se- 2:
/ '* es tra e un va lor e da lla pil a .,. /
i f (!is~mpty(stackPtr))
pr int.f ( Th popped va lue is %d . \ n 11

425

12

.
}

I' ~iMUQY un noclo clal la cima de lla pi la ~;

::L:rtt p0,p (S'TACKNOOEPTR *to pP tr)

StACKNO.Dl:'PTR t emp Pt r ;
in t p.op\ta1ue ;
~

11

fe~ nptr

'

pop (&~tackP t r:) ) ;

tr ,~e

(te mp Ptr );
,f''e;t ,:t rn pop Val 1:J e ;

bre ak

'

d fa ul t:

pr int f(u inv ali d eh oi ee . \ n\ n


in str uc tio ns ();
bre ak ;
"

"

= *topP tr;

.p0pV @lue = ('*t o.p Pt r) - >d ata ,


tbg'Pt r = (*t opPt r)- > ne.xt Pt r ;

printSt~ck(stackPtr);
"

t::'

"

'

11

'

) .

/ tt. 'V'.i-~wizza l a pi la * /'


~ldd p~intstaOk(STACKNODEPTR cu rre ntP tr)

1{

if

p r .i n t f ( '' ?
sca nf( w%d", &choice) ;
11

( cu~r~ntPt~

==

NULL)

pr1 nt f(" The st .at; '< i s empty ,\ n\n 1' );:

els .e {

~r in tf { ~Th~

st.atk is :\ n'r);

p r intf( " E~d

of run. \ n );

Wh ~~ e

ret ur n 0 ;

(e u rre ni; Pf r ! = NUL L: ) {


1

pri n't f( 11 %d ~->

cu rr ntP t r

/* Vi su ali zz a le

ist~uzioni

vo id ins tru cti on s(v oid )

= c~rr~ntPtr->nextPtr;

*/

p r i ntf ( 11 En ter cho ice : \ m11


11
1 t o p u s h a v a1 u.e o r:i t he sta ek \ n 11
Il 2
to pop a Value Qf f t he stack \ n"
rl 3
t end pr10gr am\ n 11 ) ;
}

pri ntf ("N UL L\n \.n ");

/~ ~La pi la vuo t a? */
In t is~mpty(6TACKNODEPTR

f* In se ris ce un nodo i n cima al la pi la */


va.i d .PYSh ( STACKNOQEPTR ~to_pPtr] in t in f o)
{

STACKNODEPTA newP t r ;
n~w Ptr = malloc(~izeof(STACKNOOE ));

if ( newPt r ! = .NUL L ) {

newPt r -> da ta = i nfo;


newPt r -> ne xtP tr = *to pP tr;
*topPt r = newP-t .r;
ls e

cu rr ntP tr -:> da ta) ;

n,

r~ tu rn

to pP"t r

::i=

top Pt r)

NU LL ;.

~I

.Figura 12.8 Un sernpli.e pro.gramma per lagestione di una pila.

"

426

CAPJTQLO

427

12
]) ~seg_!;lMe *tapPtt a temp Ptr " (t~mp Ptr

-2.J

sara usato pet rilasciare la memoria no,n pi

n~G.e ~~af1a) .
~.scgpafe (*topPtr) p>data a popValue (s:ilvBr il valore immagZzinato nel nodd di
:t~).

~}. ~s@gnare (*topPtr) ->ne;Xt'.Ptr a *topPtr (~s~e.gner a. *t.opPtr l'indirizzo del nuo-

ve t1Qd9, di testa)
~) E.4bs:tareJ~ !Jlemoria puntata da tempPt r .
JJ ~-rin,.iire popValue alla fun:Ziiooe chiatn:a nte (main neJ progra,mn1a della Fi~ura 12. &).

a) 1rtopPtr

I
'

~l

II

.- 1~ -2 N

~ 1 11

[I

new.Ptr

b) *topPtr

@ ..
newPtr

11

..... ....

...........

- ---- -1
.

12

F1gu,a Il, I O L.'.operazione.di push.


La E4gl!lt~~i. l2 ..1 l mostra. la fun7<ione pop. L~ parte a) mstra la pila, dopo la precedente
(}lpeN&10'ne di push. La par.te b) mo:;~a tempPtr me_n tte pun~a al primo nodo della pila,.
mncre t .o pPtr punta al secondo. La fun.zione free s~ usata per rilasci~e l, memori~

}'11mat~ $ tempPtr.

*t opP.t r

~11 21

.. 1

I 11

Figura 12.9 L.output di esempio per il progra,mma della Figur"a 12.8

Le manip.olazioni che intereS$etanno topPtr c:unbie.ranne il valore cli st.a ckPtr all 'intern.o dlla funzione ma,in. La Figura 12 ..10' mo;s tra la funzi0ne p-ush1. La parre a) della
figuxa ~osq~ la pila jl fiJiov9 nqdq . prim_a del.l,inte~entb .di push. Le linee tratteggiate
n:Jla 1 part;~ b) illl,lSttano i passi 2 e 3 dell1 operaz~9ne l1 push, eh. consentif?-nno al n9do
cQntenenre 12 di ili.1rentare la nuqva testa dUa .pi4t.

La funzio.ne po:p tilttuov.ef un nodo dalla ci.ma della pila. Osservate eh.e p_ima di
riehia,ft1aie pop, la. funzion-e main decerminer se la pila vuota. .toperazione di pop
consi~~

di

b)

- . ,__ _

.G :

*to pPtr

r---~- ~ - - -- - ---i

- - --'

12.

tempPtr

cinque passi;

Rg1:1_ra 12.11 ~'o,perazione di pop.

. 11

LSJ

42.9
CAP ITOL O 12

Le pile hanno molte int~J;.essanti applicazini. Per esernp10, ogni v@lta; he si ri_hj~a
una fun:Zri<;>ne questa deve sapere ,o me pote.r restituire i1 controllo alJa .funzio-ne cl1iamant~,
pe.rci l;indiri~o. cl.i r.itorno. dovr essere depo.$itatQ in una pila . Qua lora sl verilichino
mol te chia mat e .d i funz one 1 i diversi valori d'.i rito.rn.p sJ1.ra nno q~pos.itaci in urta pila.i.
secondo !~ordine last-in :firsr-out in mod o che ogni funzione poss<ii re5ctir~e il c9n.trollo ~
proprio chiamante. Le pile su_ppqrtb.Q 112! chiamate di funzion!e ricorsive, .allo stessq mod o
di quelle oonvenzionali no~n .rl.co:rsive.
Le pile cont en.gono anch~ lo s-pazio ere.aro. per l varia~lli auto mat iche di ogni invoeaziori-e di fu,nzion .. Que sto spazio sar rimosso dalla pila e l~ sudd~tte vriabili nori sarao.no
pi visibili all'interno del prog tam ma1 nel .momento in-c ui la.funzione restit:a.ir il controllo
al suo chi;rmant~.
Le pile :sono m>ate anc:he dai cmpilattJ ri durante il- processo di valutazione delle
'
espressioni e quello di ge.ne_razio.n e del codice in linguggio machina. Nella Sezione Esercizi
si esploreranno molte applicazioni dell~ pile.

tail 'Ptr

heitd Ptr

I
'

"I

'I

f!B.1,1ra t'.2. 12 Una ra ppresentazione grafica di l!lna coda.


illLJ,i:og,ramrna della Figu ra 12.13 (l)~lltpuj nella. Figuta 12.14) eseguir alctrne 111-ani.dl~ienii di unp.. t oda. Il pre:gra mm a offrir. diverse scel t: inse rire un nod o 11ella coda
~iiwione en.q ueue}, rimuoverlo dalla. stessa (dequeu.e ) e terminare l eseuzio-n e del pro1

manu,ten z.ion e di una cod a

:/* M'an,:ip.o lazi one e

*I

li"inel u'de <st do . h>

12.6 Le code

~i,r1lU 'de <st dlib . h>

Un'altra ~ttuttura di dati comune la coda (qu.eue). Una coda simil a una :fJ~ alla t~sa di
ti vi
11n:a dro.g hem.: la. prima p~rsopa 4e_ll~ fila s~:r setvira per .prima, mentre gli altri clien
i delle code
ideranlio di essef.e serviti. I nod
..
finale e attr
sua estremit
--.
entte ran no srilo dalla
-

s'ttu t filueueNod.e {
eh a r da t a, ;

. -

possono essre rimossi sol~anto dalle lo,,ro teste e PQ~sono es$er'e inseriti soJt~to alla-fi.rie
ille s.t~~~e. Per questd motivo? una coda det:t~ anhe stru ttura di d.ti FIFO (;first-in, first..
e dei
o~ il prim o a eru:r;ar~ il prim o uscir.e). L.e opet)lzioni ,di in~eriment9 e di rimozi911
nod i sono anc$~ note orp e m#tere in cod e togliere dalla .cod:tt.
Le code hanno molte ~p,eliazioni in inforl11--atica. La maggior parte d~i ce.rnput::r ha
un unico prcessG11e ~; di conseguenza po.tr essc:;r ervito un s0lo. urente per volt a . Le
-riGhi~'-te degli altri uten ti ,s:u:a11n~ qu ndi i.m.,me~e " in u.na coda,. Ogni richiesta avanzer
gradualnl.ente vefsQ la testa .d..el!a 0Ga, man man o t;:he _gli uten ti saran qo ~tatj serviti. La
ricbiecS:l!a in testa ,alla- cq_da $;aJ: la pr<?ssi:fna a essere servit-a.
Le (!;1@dt: sono urilizz.a,t and}e per snpp-ortr lo spooling di :S.tampa (la lista d~i documen ti da sta.Rl:fare). Un ambiente m~tiutent~ ptre.9be :anth av~1~e una s.ola stam pant e.
Molti u-rentl potrebber0 star genera11d~ cl.egli o utpu t da stampare Potrebbero ess.ere generati_degli altri QUtpu.~_j persin@ men tre la stampa-nte occupata .. Questi documenti dovran1
su :disco cl.ove a:tteflderanno in una cpd,a che la stampante
i~
_s.i,tt
o
.
c'dep
e
esser
no qlrind i
tirorni disponibile.
1

Atte ndo no in coda anche i_ pJ.chetti cli d:;rri che viaggiano n.elle teti di com p,uter. Ogn i
volt. che artiva a un nod o della rete:; u n pacche_ttQ dovr essere instr adat o verse quello
succ~s-snro, lung p un perc orso che. p.tta alla. destin:1zio~l'.e finale del Racchetta. Il n0do di
insttadamen..t9 {U _rpter) in grad o di smistare lif:l pacc he tto per volt a per-ci gli altri
blocchi di .dati dovr antJO essere Jhessf in coda, fino al m.o.menro ifl cui il rOtlter potr
in.stradarl. La Figu ra 12. 12 rnostr~ una coda con diversi nodi. Osserva.te i pun tat o.i i alla
testa e alla fine deIla: e.oda.

Errore tipico 12..7


Non impostare a NULL il tnerrtbra link nell~u./timQ .nQdo. di u.na teda.

s~ruat

queueNode *nextPtr~

stru ct queue:Node OUE-U.ENODE;

t~y.p.e 'def

ty.pe<lfef au:l:UENODE
~ tJ

/* s t rut tura rioo,rsv a *I

*' QUEUENOO~PTR

plf@t ot 1p i de 11 e f un z_i o n i * I
pr:t.ntaueu.e ( QUEUENOIJEPTR) ;

~eiel.

~Vo't l s:Empt y ( QUEUE'NODEPT.R) ;

c't.lia r deq.ueue (.QUEUl:NODEPTR *' QlJEUE'NODEPTR 1$);


\l'!f>JlA1 en.que.ue ( QUE.lJENODEPTR * j QUEUENOOEPTR *' .cha r )' ;
VGia in,s t:ru ctio ns(v o i d);
I

m-ali n ()
'

-O

I'

QUEllENO~DEPTR

head Ptr ;::: NUU ' tai.l Pt r - NUL.L;

tnt choi ce ;
ch,a r item ;
ins-tru ctio ns (') ;
p r n t f ( ? .ii ) ;
11

~e,anf( 1 1 %d

11

&choice J;

swi t ch (eh oice) {

.(continua)

CAPITOLO

12
.if (isEm pty(*h e.adP t r ))

ca.se 1 .:
p r n t f { 11 .Ente r a eh a r .a et e r :
sc~nf

( 11 \n%c 11

11

else

), ;

( *t-ail Pt r ). ->ne xt Pt r - neWPt r;

&item );

enque ue(&h eadPt t,

&tailPt~,

= newPtr;

~headftr

item) ;

printQueue{hadP~r);

*t.ai-l Ptr

break;

= newPt r;

}~

case. 2:
if (!isEi npty( he-aaPtr. )) {
item = a.eque ue(&h ead P'tr,. &ta_ilPt r);
p r i .ntf ( 11%e has bee n deque-ued. \.n 11 , i te.m) ;
}

.e ls:e

wr.i ntf ( us.sc not i.ng~r-ted . No memair y av ailab le. \.n u -~ v alue) ;
-

dequ~i;(QUEUENOD' EPT 1R

ctflia'.r

*head Ptr ,. QU.EUENODEPTR *tail Ptr)

printO ueue( headP tr);

,ehali' v alu e;

br~ak;

.O'.,UEUB_NODi:;PTR t empPt r;
%l'a1l_w.e = { *h ea.d Pt r) > d a.t a;

detau j.t:

tempP tr = *head Ptr;


* heae'Pt r == C* h e&$)1Pt r) - >next Pt r;

print f ( 11 Inval id choic e. \n\n ~} _;

instru ction s.();

break;
i-fr '1 (*h:eaJPtr == NULL)

- ~ta .i:lPtr =

print f (.il'.?

11

NULL ;

);

scanf ( 11 %d" ~ &choi ce);

free('temp Ptr);

r.e'tu rn va_l ue ;

print f("En d of run.\ n 11 ) ;


retur n 0;

in-t :iiSEmpt-y ( QUEUEN.ODEPTA headP t r)

void instr uctio ns(vo id)


t

print f .( 11 Ente_. r yaur choic e .:, \n 11


u
1 t o add an. item t .o t he q ueue \ n
"
2 to remov e an item from the queue\n"
~
3 to end\.n 11 } ;
11

v.0J lif1 p;r .tntQu eu e ( QU E_UENOQE PTFt eu r ren tPt r)


~

&f @current Ptr == NULL)


printf(MQueue is empt y.\n\n " );
&ls.e {

print f(
void

11' The

queue

is:\n 'k);

enqueue(QUEUENODEPTR *head Ptr, QUEUENOOEPTR *til Ptr,


Ghar value )

whil..e (curre -ntPtr 1= NULL) {

print f ( '"%:c ->


1

curren~Ptr "' >data),

ic::~urr entPtr = cu rre:nt Pt r >next Pt r;

newPtr

= malloc(sizeof(QUEUENODE)};
p.r n-t f ( 11 NULL \ n\ n 11 l

if (newPtr != NULL) {
newP tr->da ta = value ;
newP tr->n extPt r = NULL;

Pigora 12.13 Manipolare una coda.

La Figur 12.16 mostEa la funzione dequeue .. La parte a) mo.stra la .coda . do.po il pr-ecedet1te irrtenren1:o di.enqueue. L::t parte b) mostra tempPtr mentre pun~a al nd rimosO dlla
c_oda, ,mentre he,a dPtr punta al sue nuov.-o primo nodo~ La,_,funzione fr.ee sar usata per
ricuperare la merno,ria puntata d~ tempPtr ..
a)

435

CAPlTOLO 12

434

*sPt r

pr.e viousPt

cur rent-Ptr

lnqu~.~eyi.~~~i:o:i,, sar _creat~ u~:alber .bin~rio s_pe,caJe, chla.tn~t~. albei~ di ri~ere~ h3naria:
la c;ai;~tt-efi~tic~. di un albero, di- r1terc:a bmar1a, oltre: ali assenz,.a di n.od1 dup11cat1, e che
~al d G:ont~41Uci n,ei nodi di ogni s:c;)ttoalbero sinistro sono inferiori al va.lor~ con_~nu.to neJ
rkpl~,rtJ~ n~de padr~, men~ .quelli ~ ~ni _so~toalb~o ,~estro_ sono m4ggiori. La F~gu
!'3 i,;a.18 mdstl!a un albe(o di r1erqi hl.J.1.aria con 12 valori. Osservate che la forma di 1J.n
;alikse.r dii ticta binaria che corrisponde a un in.sienie di dati pu vanarei secQ.ttdo l' ordi~ im. (;"tii i valori s-no inseriti nell)albero.
47

.
I

77

25

b)

*sPtr

cr rentPt r

p1reviat,tsPt r

/~
A. ., .....+----

/~

17' 31

98

25

11

44

68

'
;- -----,..,----

.,;

/.

..

--~--- ~-- I

"

~i,gura 12.18: Un al'bero di ricerca binaria.


'

,flrlt-pr~

tipic& 12.. 8

-tempPtr

figur.a 12, 16 Una rap,presentazio11e grafica dell'attiv:it di dequeue.

12.7 Gli ,a lberi


Le liste c9ntatnate l pile e le Godl:e sono sm1,ttuft: di dati lineari.. Un albero mvce una
struttllf:a ili. d;at_i noh lneare,, bi~nsi9nale _ cbn lelJe propriet speciali. I nodi di un
albe;r;p, ~nte'n~Qno lue c1 p~u JILmbri link. Questa ~e_zo1ne discuter d~gli a(b(!ri binari
(Figur.a 12.17): o"vverosia, dqs~i alberi i cui nodi on,te1~gano olo. due link (che potrebb~o
essere entr~bi NULL) . n nad6 radice il primo di ogni albero_. Ogni link del nodo racl.ict;
punta a un figlio. Il figlio sinistro il ptim. rtdd del sttoalbero sinistr.o~ m::ntre il figlio dtstro
il pl'irno nodo del sottog,/be.ro diS_tr. figli di uno sresso nudo sono eletti ftatelli." Un nod0
~enza 6,gli d.~tQ, no4o faglia. No~rm~ente, gli lntonnatici dise;gnanQ gli alberi co!Uinciand(D da:l nodo radice e 'procedendo ver.s0 il b.asso: ~S;a.tt~me~~e in tnq.d 9 nversQ agli
alberi <:;he si trovano in natur:a.

Nan impostar a NULL i link dei n:odi foglia di un-albero.

il ptogr.aarma della Figura 12.19 (!,output mostrato in Figura 12.20) !?-teer un albe-

~ d n.'te:rca bina-ri'a e lo visiter in rre modi: in ordine, 6vverosia, con una 1;isit4 simmptric4,
ti~patit e differita. Il p:rogfamftla generer 1O numeri casuali li inserir nell,albe:ro,
~s<tliiaencl,o j.

valori duplica.cl.

Le funiiq~i usate nella Figura 12.19 per ereare e :visitare un alber di ricerca binaria
1'tl:A:i> nigor:sive~ La h1nzi,one insertNode ricever come argome.n:t J'ind.irzzo dl 9-lliro e
l~imt~r cb:e vi dovr essere imrnag~zinato. Un nodo pu essere inserit<1 in y,n albero di
rlc~rta f!ma'1fi witanto com.e no foglia. I passi per inserire un nodo in un albe.ro ,di ricerca

binar.i_sarnn i seguenti~
I) N,@
l a.aQ jii cui *t re.ePtr sia NUL.L, teate un nuovQ nodp. Rihiamare ma.lloc, asse'gl}ate~1~ :Q.1~rn.Pcia allqC:~ta a *t'r e:e Ptr, l intero cl.a irnl)J.agazzin~e a i( *treePtr) ~ >data,
NULL.a (""treePtr) .. >leftPtr e (*treePtr ) - >rightPtr e restituire il controllo al
ci:hla1mante (la funzione maitl o una _p.ret~dente. hiamata a insertNode) .
'20 Ni. cas:o in cui avalore di t reePt.r nn sia NULL e q uello da inserire sia infer' ore ~
f"trreeP-tr). .. >data la f1n'l~ione insertNode sar chimata con l indirirz.zo di (*treePtr)
>lef t Pt r. Altrimerrti la fu.nzio,ne in se rt. Nod~ sara .hi;;i ma~a n lindirimo di ( *t reeP tp.') ->r,-i,ghtP-tr. I passi ricorsivi contin.ueranno, :fino almom..~nJ:o in ctri sr~ st:to ritrovto
ai:p gun1:atpre NULL e,. quindi~ $ar eseguito il passo 1) per inserire ll nuovo ndo .
.

/*' C,r~~f.~ un al.bero binario ed effettu-a re


un_a V'iS,ita anticip?ta, s.imm.e trica .e differit-a (lello stesso

f#.i;J,n'eluCle <st ._qio, h>


IO.ne 1,ue '~ -<stdlib. h>

Figura 12.17 Una rappresentazione grafi,ca di u,n albero binario.

tr /'

.(con;tjn.t/ll)

CAPITO.LO 12

#in clu de <ti me .h>

~ tr :e.\ P't r = mal loc (':s.zeof'(TREENODE) :) '

str uc t tre eN od e {
str uc t tre eN ed e *l ef tP tr;

! = NULL) {

i l i(* tre eP t r

(* tre eP tr} -> da ta = v~lue;


.1 (*t-re'eP tr) -> lef tP tr == NULL;

in t da t.a;

str uo t treeNode *r igh tP tr;

('*t re eP tr) -> rig htP t r

};

=::

NULL;

.J\
els.e
pri ot f( 11 ~d n t ins ert l. No memory av ail ab l. . \n 11 ,

typed~f

str uc t tre eN od e TREENODE;


typ ed ef TREENODE "*TREE NOD 'EPTR;

v.,~lu e) ;

Void insertNode(TRE~NODEPTA *~ int .) ;


vo id inOrdt{TREENODEPTA);
vo id pre Dr de r ( TRENODEPTR)
vo id postOrder(TREENODEPTR);

i}

e--lse
if (Vlue < {~trePtr)->data)
ins ert No de (& ((* tre eP tr .) -> lef tP tr) , va lue );

else

ma in( )
{

-~

if (v.a.-l ue > (* tre eP tr) ->d ata )

ins ert No de (& ((* tre eP tr) -> rig htP tr) , value);
els e
pr int f ( 'dup

in t .i , i.tem;
TRE .E_
NODEPTR rQotf>tr - NUL.L ;

11

11

);

srand(time(NULL)};
I* n se rs ce rie lli alb ero 10 va lo ri ca su ali co.m pre si tra
0
e 14 *- /
0

p~intf( The

numbers be ing pla ce d in the tre e

V"!Ld

are:\n~):

:n'Order.: (TREENODEPTR

tre e .Ptr.)

i ><1 (~ p~ePtr I= NULL) :{


~nora er ( t ree Pt r - >lef tP tr) ;
p r ~. nt-f ( u%3J 11 , trPt r ~ >data);

fo r (i = 1~ i <= 1~; i++ ) {


ite m= ran d() ~ 15;
p rin tf (. %3 d '' i t em) ;
lns rt No de (& ro tPt r , ite m} ;

inO rd er( tr P tt- >r igh tP tr) ;

11

..

/* vi si ta

,,

anticipata ~ dll 1 albero

*/
printf(~\n\hThe pre Or de r tra ve r$ al is:\n~);

vid p~eOrder(TREENODEPTR tre eP tr)


i'fr (tr e~ertr !== NULL') {
:pr!lr:it f( %3d 11 , . tre eP tr- >d ata ),
"pr e rde r {t re eP tr- >l eft Pt r);
pr-e:.Orde r (tr ee Pt r - > rig htP t r} ~

pr eO rd er( rb otP tr) ;

11

/ '* vi sit a s. mm etr ica fe.l l 1 a.ib ero '*./


pr. int f( 11 \n\ nThe inO rde r t.rf 1v ers al is: \n 11 ). ;
in Orde r ( ro otP tr) ;

./* yi sit a di ffe rit a de ll' alb er o */'


printf(~\n\nThe

pOs tO rde r tra ve rsa ! is : \n' ');


po stO rd er( ro otP tr) ;

voicl po stO rde r ( TREE;NODEPTR t ree Ft r)


{

if (tr ee Pt r 1: NU U) {

po stO rd er( tre eP tr- >l ft Pt rJ;

ret ur n 0;

.~ostOrder(treePtt->rightPtr);

pr in ti( 1'%3d 11

vo id in sertNode(TREENOOEPTR *t re eP tr, in t va lue )

if ( *tr e.e Pt r =

NULL.) {

~treePtr

NULL */

tre eP tr- >d ata );

}
}

~igy~

1).19 E:reare e visitare un aJbero bin:ario.

438
Mj sm ' e "I" io:di qQdli del sottoalheto destro. La vis
ita aqtiipaxa,

. 1- ~B-1rat0 .P.- prm

CQ n- p

12
.21 sar~
-

re o rd er, de)!' ,Jb-

'i.1 ~ 3 6 17 42 33 4~
I -fa;ssi per u.na visita. differita, c>n po stD rd er sar an no :
t) ~is~arG iLsttoalbero ._sinistr_o oop postOrd~r;
i) ~ t.at il s.o tto alb ero destro con po st o,r ae r.
J)' Elabl1'are il val(\) r,e del ndo.
'Il:~ i:li i'lgfii nodt> no n sar visuafu.ZJl.to, fin qu an & 09 n Saranno sta
ti visualizzaci i
va!lil!i $; ! ll!ipri figli. Lii visita differita. con po s tO rd e r, dell albero in Figura
12.21 sar:
Fi gu ra 12.20 !.:output di esempio pe r il pr og ra mm a in Fig
ura 12. l 9..
Le _fu-nzioni in Or d r> pr eO rd er e_po stO rd-er rr'ce-Vie'"
... an
" Qo
. . - ~ un alb.ero. (ov:verosi il
pu nta tor e al suo nodo radie) .e lo vis ite ran no ,
-

p~si

per un a vis ita simmetrica co n in Or de r

sa.~anno:

1) Vi.Sitar.e il so tto alb ero sinistro con in Or.d er .


2) Elabor.ar~ il valore ne l no do .
:?) Vi sitare il sottoalbt~ro destro con inOrder.

6 1i 1~ 3. ~ 48 42 27

~;:c$bet_oQ, di ricerca binaria facilit lielim.inat.ione clei. duplicati.

dll illlh~, s.af

ogni tetttacivo cli illserimento di un valore duplicato perch@


qll.~0 rs~lt, a ogni confront; le ~t~e decisini "vai a sinistra" o "vai
a c\eliua" del
v;ale@ ori ginario. Di conseg\.lenza, -alla fine il valore dupli
cato sar co nf ro nta to co n l:lr t
~ C,!J_ntlint nte lo stesso daro. }\. quel punr9, il valore d11plicat9 po
tr semplicemente

esser

Il valore di un _n~d~ no n sar elaborato) fm quand.o non


s. uo, sot;roalber(l srn1stro. Ll visira .si mme trica c on inOr saranno stati elaborati . . .11 d -1
de- r , uQ
d .;. . J.
na Ib-ero
,
. .
.. 1n
,
.- F..1g
ur
qu.ae12
1 2e1
sara.:

6 13 17 27 33 42 48

. ~sstva:. e che la visita sim me tri ca , co n in1Qr de r di un alb


vrsua.J..izz~ .~
d." . . , b ''. - ..
1. , d . di . . ._.
1
_
_
.. . ero
l ric erc a 1.nar1a
. ..
r~ r v~ on . et no m ordine cresc~.Ot . Il proc~ss
o di creazione di u alh . , d'
r1c.J~rca b1na.r1a ' .tn re
a
l
t
r di
n;:i: 1. d. .
. r qu.e sto
- n - hl

' .
. ._ c;ro 1
'
.at1
e,
pe
.m
o
t
ivo
. .
orutnt:tmento dell'alber binari.'1

.'
G am at o

27

13

42

ricono~o

Qy .ra nte la creazio.f1

~lYn.i.n:ato .

h cs.he la ricerca di un valore in un :albero blnario un'


operazione rapida. Qualo.ra
r~beeto sia . ~ato riem.pitQ per bne, allora ogni livello conterr circa il dop_p
io de:gli elem,en,tt 4i queflii pre:Gedente, Di c9nsi:guenz;t, l,II l albero di ricerca binari
a oon n eliimenti avr~
.un m!ISSimo di livelli e, q\)ndi, dovranno essere eseguiti un ma
ssimo di confronti per
,_l!IVii.Ie 11na Ortispondenza o per dterminare che no q ne
esiStano. w significa per
l!IDPio, che p r un'indagine in un alberi:> di rkerca binari
a (rieJnpito per bene) _on L0.00
e~menti., dovtaiv+P e$Sere ~seguiti no n pi di 10 eonfron.ri, perGb 2 lO > 1 ;00
0. Per un'in~aaJB un. albero di ricerca binaria (riempito per brne) co n 1.000.00
0 elementi, d.ovranr;i0 essete :es.eguiti non pi di 20 c9
nf ro,n ti perh 22 0 > 1.0 00 .0,0 0.
Nena Sez:ione Esercizi, saranno preserrt~ti degli algol'itmi per m.olte altre op
erazioni

~bfui binari, tome l'eliminazione di un elemento la visualiiz"2a in i;tn furma


ro- ad
al~~t'. b.idim.e,nsionale e l'~secut.ione di una vis ita per livelli. La vis ita pe
r liv ell i d un
a~ll1er.~. "hi n.q.rio i~pez;i.Q,ner i .s_ i nodi una riga per volta, in.cominciando dal
liv
eUo del
aci do rarlice. Per ogni livello delrialbero_, i .n.odi saranno visita
ti da sinistra a -destra. Al ui
e ~ cnizi ,stJ:gli alberi binari ,c om pre nd era n1 1Q : l'accett~orle
di valori duplicati, l'insecimen...
to ili quelli di tipo stringa la determinazi.l'ine dd nu
mero dei livlli co nc n ati nell'alb<lrn
tlin~J).,

Fi gu ra

12 ~2 I

17

33

48

Eserciz.i d i au to va lu t_a zi on e

Un alb ero di ricerca. binaria.

ll. 1

I passi- pet una visita anticipata, con preOrde,.., saranno:


1) Elahorre il valo,r del nodo .
2) Visitare il sd tto al ero snistro con pr e rd er .
3) Visitate il sbrto~ero destro 'o n pr eO rd er .
11 valore di og ni nodo sar elaborato n l
... ,nto
.,. ste
. --.
il val'o . . . . - . - - . - . ' . . . e mo me
..sara, . .
.lia. vo
s~o
~
w
vis
ita
to.
U
lta hi:
re dr un dato no do sara ,stato ela bo tat o,. sarannir:) ~laborati
prim.a i valori del so tt alb
-

Riempire .gli spazi vu oti in og nu na del1e segue~ righe:


a). Un a st tut tut a
Ltsata pe r formare stt_u ttu re di dati dinarrii:che.
b) 'La fun iio ne
. utilizzata per allo.c;i:re dina rnicaro~nte la memoria.
e) Un a
un a ver&ione specializ ~ata. di un a lis ta concarenaira
, in

passono es-sere inseriti ed eliminaci s.oltJU1tq dall'inizio della list


a.
<i) Le fun zio ni eh.e no.n alrerano un a lista conc;-~ten
ata, iri le da
"isgutdoi' sono del;te

cu i i nodi

nn semplicmente uno

- ero
.

441

.Af>tfOLO 12
e) Una coda una.s trutt ura di dati--~-_,, perc h i n:od inseriri per primi' saranno i
.
.
.
"'

prrmJ'a essere :r:1moss1.


li puntatore :al no.d o succssv.C) in una lista co.n~tenata detto aqJ)e _ __ _ _
La fnAz_i'one
usata per recuprare la men1oria allQcata din~miamehte .
Una
un:a vetsi oh spedalizzata di una lista concat~ara_, in cui i nodi
p9_s_sono ~sete ii:isetid soltanto -alla fine d~lla lista.e rimossi s:altant9 dall'inizio. della stessa.
tln
una strut tura di dati non linea-re, g}dimensional~ che c:onciene nc:>cli
con due; o piw colleg~rtienti.
TI na pila. un?: .struttura di dati ~---~ per.ch l>ulri mo no.do ln.serito sat.il etim o
t'

a esser
e .runo
-.
.
- sso.
J.ngdi di un alber:o
contengono due riiem~ri 1ink
li prim o 119do di.u n albero il nodo
.
Ne( node di un albero> og:ni link punt a a. un
o _ __ __ di quel n,odo.
Un, nod9 di un alb.~ro Ghe non ha figli detto nodo _ _ _ _ _.
I rr~ algoritmi di vi.$it a p~r u.n alb:e.ro binario sono la vis.ira --~------- e
-

f)
g)
h)
i)

. .
:112.:5

., . - .: '- 1 . h' l
turri i nodi deDa lista e rilasci la memoria..a:sl)ociata a
t;;) S-tr1v.e
te un .ClLlO W l ..e Ghe eLira-ini
..
.
- .
.
c~gpunb di essi. Usate: j punt atori curr entp tr e temp Ptr per m.uovervt-lung. o ~'a. l'LS,ta e p~r
rilasciare la mc.{moria.
- ....nte la v1stt
a sunm
emca
~ . an

r1cipat
a e diffe
:o: " ~ . anu"Lm
o di ricer
~ .-
. rita dell
alber
,
ca binaria:
wpo

rtate m . ,,_ '.'"


mpstt.a~q nella Iigtt ra 12..Z,2.

..

,,

49

J')

,_

k)
1)
:qi)
n)

,o)

_.,-

12.2

Qua li sonp J differenz~ rra una lista conc aten ata un.a pila?

12'. 3

Quali sono l~ diffe=renze cra I).Il.a pila e una eda?

Srivete nn'~truziooe o un insie_m.e di istruzioni che e'5eguano ognuno dei s.oeguenti cQmpiti.
Supponte che mrre le rnsn ip.ola.zioni debbano esseJe eseguite n:ella funzione ma;i n cli con~eguenz~
non sar. ncessari alcu n indir~zp di variabile p1m tator e, e che sian a st~te effettuat~ le s~-guenti

83

28

40

1~

/~

19

1.1

igu~j

12~22

/~44

32

97

71

/~
69

72

/~
92

Un alb ro di ricerca bi, nari~ con I 5 nodi.

-12.4

Risposte agli ese rc.izi di aut ov alu taz ion e

definiziooi:

W. ..l al cicoc;,iya. b) malloc. e) pila. d) p~ri . ~) FIF~. f) ~ g) fr:e: h) co;~~etr;>.j) UFO


~)' birrrJJfu,. l) radice . m) figlio o sott9al\Jero .. n) foglia. o) s1 mme tr1ca , an-i;.10.p_ata,
.

~.truct

char

gradeNode {

ru

lastName[20]~

floa t grade j

h . - - n t : ra e alla fine della:sres.sa . cos he i nodi possan9 essere ins~riti alla.


1J- n:a co d.
. :a. ~ :punt~ror!
lu1a es .
.
. ' . .
.
_.. . , . l .
.. . .
f1'i\t ~nm~~i d~a te:~ta. Un~ .pila ha solo ua puntatore ~lla . sua. t~sra, dove sono eseg
uire e operaz1oru
cli inS&nimern.tq e di rimo tlon.e.

stru ct gradeNbde *nextPtr.;

l 2. 3

};

typedef struc t

gradeNod~GRADENOOE;

type def GRAE>ENO.DE *GR!>.IJENODEPTR j


'
a) Creareun_puntatore all,fh
izio ,della lista cbi'amaro. star tPtr . la lisca vuot a.
b.) Crea.te un nuov.o nodo di tipo GRAPENODE, cJ:i,e sia o.ggettb di .riferilna;to da parre del
puntatore new Ptr di tipo GRADENODEPTR ..Assegn:~e la srr.in.ga "J enes al-metnbro.lastName
e .il valore 91 , 5 al mem bro g~ade (usate st.r py). Fomit~ o~ni, dichiarazione e istruzione
.
-

ne.~essarra ;

e)

Su:ppone~e

cl1e lalisra puntata da star tPtr cons.is.t:a al mom ent0 di due nodi? unoc nre uente J on es .e l,;alfrtl Sm th e eh~ questi siano in ordine alf'abetic0. Fornite l istruzioni necessarie per inSerir~.ord.ina.tmiented~i nodi che c_9nr.en&~no Lsegueati datji per lastN ame
egra de:
11

11

Adam.s11

~niom
. pson

In l:rna lisra CQnatc;_n ata, pq.ssibile jrts~rire ed eliminare u n nodo. in q.ualsasi poslz ione . I nodi
Ilii'.f. pJla., i.nvec::~ 1 p,Q~:SOilO esser~ inseriti e rimssi soltarrt dalla sua t~sra.

U.'2

11

11

a)
bl)

~R.ADENODEPTR st~rtPtr
GRMJENOOE~TR

73 -5
~

"Pritchard 4 66,5
Pet.eseguireg inserimenti.i usac;ei punf atori prev i,u sPtr , curr ent.P tr e newP1:-r. Si:abilite 11 c9sa
punretanoo prev ious Ptr e cu.rr .e.nt Ptr prim a di ogni inser imen t. Supp onet e che new Ptr pun:ri
sempt-e .al nuov: nod che @.. q ues1;o siano gi. st:<tti assegnati i dci.
d} Scrivete Ufi .ciclo Wlii l e c::_
he visu:11iiz-i.i i dati oJit llUt i in ogni rrodo d11a lj~1;a . Usate _il
punt atore cu rren t Pt rper :s cqrrere la lista.
1

newPtr i

n~wPtr ..: mallc { sizeof (GRADENOPE) ) ;


st-i:cpy (.rreWPtr ,>lastNanie, iJones" ) i
new?tr->rade = 91 .5;
neW?tr->next'P tr = NULL ;

G) Per inserire 11 Adams 11 :


ious

Ptr e" NULL


prev
. - , curr
entP tr punt:a- al
- prrtl el~ntento della -lista.
neY!IPtr -j;,nextPtr = current'Ptr;
start Ptr = newPtr;

Per ins~rire

85 , ~

= NULLj

11

Tho~pS0'1. 11 :

prev ous Ptr pnnra all ultimo.elem ento della Usta (conten.ente '" .S mith 11 )
GurrentPtr NULI-.
newPtr '>nextPtr = curr entp tr;
~rev1ousPtr->nextPtr == newPtr;
11
Per
Prite hard 11 :
- . inser ire
.
~

.prev:.iol:JSPtr punt a al nodo eont~nentfi ' J~n~! 11


o.ur'r entP tr punt a al J;l_odo c9;n1eneRt~ Sm1tn .
newPtr-~>n extPtr ::::: cu rren tPtr;

prviousptr->-nex-tP tr

neWPtr;

..

442

CAP LTOl~

443

12

qoi;a;!ibne pclac inver~a, le due prece denti es[JreSSioni infuse apparirebbol'rQ rispettivamenre come

i). curr~ntPtr = start Ptr;


while ( curre ntPtr t= NULL) {
print f ( "Lastriame = %s \nGra~e
qu_rrentPtr-~ l~~_tName,

curre ntPtr -=

a4

GurrentPtr ->grad e);

currelitPtr~>nextP-tr;

Tu 'ueyt eSercizi<i scdverere una versiene C dU alg<iriwm cli wnversiQne danq tazi ne inlisS.a
pula~ i;p,verSa. Nd pmssii;ae esercizio, scriverete una veiSione C dell';goriun di valutazione di

e) urrntPtr = startP tr;


While, fcurr entPt r ! ;: NULL) {
tempP
tr ;;;; currentPtr~
,
I
currentPtl"' => currentPtr->ne-xtPtr.
1

un1 tsJ>t~s~.oii in no,tazione polacca 1~ersa.


- ~ortve[e un J?l'Ggr~mma che converi:a un1 ordin aria esp,ressione ~i~e:!ic~ in notaz ione infiss.a
(s . ~po,l)lG(~ he ne sia stara immessa un.a valid;a) formata da inteFi -di una sola ifra cme

free(temp~r);

:startP tr

12 ..5

lf-~7 9 ./'.

I?er-v~U!ar u1lesptes~ione in no_~azione infissa e-0mpless, il rornpilato.r~ la convertir pr.riia nella


no~J&l-.Rq)aec> inVetsa e quind i la~uter~ in questa sua nli"Ya :<ersione. O.gnuno di questi :tlgotirrni
~cd!lm"'d:g:.s~ltapto i.In singolo p:;tssaggiq da sini:stra a destra suli~esp.ressione. Oga.i alg0rii10 utilizza una
#Jmt ~\lPJ?'?rtire la sua attivit. aneli se in ognuno di essi la pilo, \Jl'llta per uno so<>po diversa.

= ~ ..2f \ n11 ,

= NUU .

,I.

'(li ,. 2} '*

La-_ VJS1ta
. . -s1mr
. netrica ,:

in un'eS'pte$.,sJqae i~otzione po-lacca inversa. La vevsion~ Rolaca inversa della preetlen:c.e espre.$.sione

11 18 1'9 2~ 32 40 44 49. 69 71 72 83 92 97 99

in m.t:>t~~n~ inf,$sa

La visita anticipat.a e:

6~

49 28 18 11 19 40 32 44 83 71

11 1'9 18' 22 44 40 28 69

liltJJ1z:L~C la V'tsione mpdlficata delle funzioni p~r la g~ti,ont; di 11 na pila implementate in que&tO
~ln., p..raiurare asrea re I e,spression in ll'1tazifme polaca inve~ nel vettore d caratteri poi;;tf ix.
l:~~Ji'fIlO per q-e;ate un~presi;j on n rfotizione po1a1~C9 inversa ii. ~eguente:

72 71 92 99 97 8:J' 4-9.

1), lns:e:tit~ nella pila l).n.a parentesi a.pena i ( 1


~) ~todace~a fine di inf ix iina _parentesi chiusa ' )
3) F,.intanto che la piJa non vu<Jta, leggte inf ix da sini~tra a descra ed. eseguitele seguenti

Esercizi

Scrivete un p.roDi
-11egru d ue li
~i"amrrra .e-he co.
- ste concatenate di - . . Il
- inctudei:-e l:a fuazi oue conc atena te the . - . d - . . - . . . . . caracten. . prog
ramm~ d.ovr
concat~ai la seconda alla p . . , prn -a co.qie ar~omentt 1 punra tri a. enuan be le l!ste e

- -.

'

Sr:J:v~te

.rima:.

sivodi post f.i x.-

N el ~~o in cui il tac.attere: corrente di inf ix sia i1na parentesi aprta, inseritela nell::_i. p.ila.
'.tNdl e~o in ui il Garattre tor:i;ente di infix si~ un pr tore,
f,srraete _gli operatori (s~ ce ne sqno) dalla t~~(a della pila, Bo.tanto che abbiap.o ull!3..
priorir maggiore o u_guile-a.quell;;i. deIT_.oper.rtore corrente; e inseriteli in post.f -iX.
In.seri te nell pila il carattere .corrente in. inf ix.
N~l ca~o in cui il carattre corrente di infix sia na parentsithiusa>
E#traete gli operatori dalla tes:ta della pila e inserireli in post fix,. finch no.n ci sar

un progt mm a che

nodo della l1sra unita .

12.8 ~crivere un pxo~amrtfa clf insrisca ordin atame t .. .


. . . . - .
.
. . aompr'."1
u;m e I 00. JI pmgr amm dovr calcol;,_,ela
in
25 mro." tasualj
val9re m \<Ugola mobile.
-filll'l'l !'!~gli demen!I e la Ioni. media con un

~a

~e

una lis.t~ con~t<;llata

12.?

Scrivete J.lTI ptogr;un111a che crei Ufia lista conca tena - d. l 0


. -. . . . . copia della lsta con gli~ elementi' o-. d. i. n . .
.
. - .
ca. i
carar.ter1 e, in s~gu1to, create una
-

r e 1nver"SO.

una parencesl .a.pe_rt-a sull~ cim~ della pila.


E~traete (ed eliminat~) l:;i. par~nte$i apert a dalla pila.

1
0

12 . 1o Scrivete un _pro:gramma che prenda-in in at


r
.. . . .
la linea. in qrdi.h
e inverso.
p una inea di resto, e utilizz
i una pila per visualizzare
e

I(Q lllt'~ressjQ,Il.e dovta.nn o essere conse ntite le seguen.ti oprazioni ari$e :tiche :

ad.dizione

12
11~- Scrive
nrogr
. pil a per
deret.1
- Il.ll1are se un - strir1 " al. dr . (
- .. ~.
, - t un e- am ma
, , ht
. usi una
. -.
se possa essere lc;:rta allo stesso modo in ent ru . 1:... _ .) _ Il _ -_ ~-.
ga-e
P. -1.-n 'Oma ovverosia
. .
.
.
.
r
nut
l
sensi

prour
a
mma
d

ovt'
u . J
p untegg1an1ra..
- - o
--
,a ~gnotaJ:e g - S:pazl e a
e

~ottEazion

m.oltiplicazione
clivisi
. one
elevamento a potenza

1;
1~ Le-pil~ sono usat~ dai cemp ilaror i come supn1 e di gene.razione dfleodi . lin . _., , .

orto .er il . . . -_ di" r


.. .
.
.
. .
1
eh"
P
.
P
proce-5
S()
'
_
alutaz
1one
delle
espres
s
o: -.
. - - ce in . . guagg10 mac ina. In quesr e nel
.
.
.
.
.
con rura i.I mdo in cui i comi;)ilacori _._,; l t
d 11- .
. . . p~qss1mo eser.;~10~ ~atniner;eroo
. . _.

:r
- - ~ ya u ano e e espre-ss1oru arrt - che h
-. .
.
di c-ostanl:1, oprat@ri p_arentesi.
rneu
e e ons_IStMQ soJarri.enre
lm
' Ue...
_ s1on1
_. . come
_ 3_ + 4._ 7 I 9 . . l' . . _
.Gli
_ _ esseri uman
. i scrivo
no.g
_.enera
.
, "'"""'
~... d-e
espres
o I, .1 0. quest o case) scricto tra i suei o p . ,;. ... cl
- osia
. 1n
. - notaz
. . tone
. t.n.f;ssa
- e - r . ' in cru,, opera
tore (+
. . -_
-- . er',Cl.l. l~ ovver
.
_e
0

mvece la notazione polacca inversa . - , i'


..... . . . . - . - ':/~~ . _mpu.ter p~qe_r;1scano'~
-__ , on. - operaror.f:~ sizn-rto a destra: dt suoi
.~ \,..;.O
P
- - due- op
- ~randi
n- - 1a
r

Nel ~~Q in cui il arane r: cor.rente di inf ix sia u11 numer, copiatel oeli' elemettto succes-

._

'

@pl et;\i,l( Jlll:

a
.
li .
d'

.
..
G!. li valqri inceri. La funzione mergeunisc
d a, ~e se~ ~r_ J)late ci.val0~ .m. tet1J.
n
un singola list ordin.a.
d -. ' . . .
- ovra rrceveJ;"e i pu.n:rato.r al pnmo n-0do di ~ .. -. . d 11 " 1-.
i1 n tre:, e . ov,ra res;tttlUie un . . - at
al -.
.
_
.
.
... ognu na e e iste da
punt ore prrmo
U.7

2 - ~ 5. ?r. a 4 I -

!Jj! ~a <lfl'-'rl leru;!'\1' respr~ine e immagm:inatla nel vettore di caratteri inf ix e, in segui>,

69 72 97 9.2 99

La vi~ita. d!ff~ri-ta :

U.6

ti a. / 4

medu lo
1;'.3

mil_a.cll)~EJi. sser gestita COil le se_guenci dichiarazioni:


sitn~t

s,t ackNOCle {
ehiar ,data;

,struc t

$tac~N9de

*nextPtr;

}j

444

CA.PI'! 'OL O

12

typedef struct staGk.~ode STACKNDE;

aa

typedef, STACKNODI: *STACKNODEPTA;


Il _programmadqv:E-9n~iSter-diuna:61nzionemaine
dialtreottt:
~ ~~=. con
-_ . -.e
l segt1ctnt1
-- , - mTestazr.oru:


. .
.
- 1wLCJ.oru,

void c.onYertToPoStfiX'( har infix(], char p0stfix[))

N,@_a: nel p.i;:eG.e qente pw1to 2), qan,do i'opt!!atore sar i1', La testa della pila concerr 2 il suo
BW,rP'ent0su~:es$ivo sar. 8, allo1:a -dov:re: ~e estrarre il 2 i_h :x il valore 8 in y, ealc.lare 8 l 2 eriris~ri.re nella
il risnltat() 4. Questa nota .si applich,er anch all' operittoi'e -'. Ecee Utl elencQ delle op&.!zioni
11
a.(itmetiohe c:he -Sarani:1 consentite in up. espression:

addizione
sottrazione
:mo1i:Jp,licazio.ne
livis-ione

- in :qu.ell-a poJ.aec a ilive.rsa.


~.nven1ra .la no~io.ne .i:ofiss-a
i'nt isOperator(char )
D~e;rr,1-1. i n;e:r :se e

~levame11ro

e un peratore.

n.10.dulo.

int p_recedene{char oprator1 , char oper.at.or.2)

Dererrn.ine
\ se_
l a ~r~oi:ica
- ~ d'
-. e~- m1n
o re, uguale o maggiore di quella d.i o:per,ator 2
Lafu_-~?~ _ .ra
-1.operator1
- flZlone resotu1r~ r1.-spertrvamente -.1, O o I.
.

Vbid push (STACKNODEPTR ~"topPtr,

i !1 tilac d0wt~ress"te gestica co.rl. le seguepti dicl1iar:lilioni:

s'firtrct

stackNod~

char value)

s~_rut stack.Nde

).;

chal"' pOp(STACKNODEf>TR *tQpPtr)

type-Oef struct

W1

int d'a ta;

lnserir-. un vcii<)re in e-ima alla pila.

&cra:ri

a po-enza

*nextptr;

stackNode STACKNOOE;
ty;padaf $TACKNODE "'STACKNODEPTR i

valored.alla (:ima delJ a pila.

Il pm:~a,. dovr essere foi:mato dal m_ain e 'da alrte sei funzioni con. le segu~nti inre~tazioni:
1

char stackTop(STACKNODEPTR topPtr)

int evaluatePostf ixExpression (char *expr)

R.estituh: il valore tontenuto m cima alla pil, senza estrarlo dalla stssa.

Valutr Jjesp.res~lone ih notazione po:laGcaci111.ve.rsa.

int isEmpty(STACKNOOEPTR topPtr)

:.tr;i:t c:a;t.culate ( int op1 1 int op2, _har operator)

Oeterm i-ner se la pila. vuo.ta.

--e~e-Cller: il valore' deli 1 e~pi:es~ion~ op1 ope rator op2.

Void printStack'(.STACKNODEPIB tQpPtr)

~~id pushfSTAOKNObEPl'R *topPtr, int value)

Visualizzer la pila.
12
~ - , -- _ .
- polacca
.. - . -- - mvers-a
. .. 13
ai 'd-.Scrivete
\
- ,UQ program:maclievaluci
.-.
.
espress1one in notazione
(sunpon 'e te h Sla v 1: a.J come
.

- .

~,r

e .e

6 2 + 5 * 8 A/ .

"'
dovr
. . . 1' na. re in
. un vetro ce un,esp_re~si('.)ne in n.ota:z;ione polacca inversa
:6nprogramma
. d
- . . legger
. __ _e .im m
agazz
.0~_a_ta _a~. ~ert ~ oper~c~~r. Usando la versione modifiata delle fi1nzioni per la.gescion'e di ., . il
rmp-ementare: m precedenza m q' uest
.
d .
..
- . .
una p a
. 5 ~ t .- . . . ' . l ..
- Q c~p.1.t~9lo > .il- pro_gramrpa
ovra anal1~Ee 1~ esp ressione e valuta.rla
[ aig~..rJt:rho e r se;guente:
-

I.) Aod:ate il ca.r.attere NU.l L ( 1 \0 1 ) all e fin d 11 1 .

.
.

N 1 momenro in .. . . '. -.. . .1 . _a. ~ . e . e. esp1Less1qne


I.Il no:raz1one polaca inversa~.
. . .
cm il carattere .NUILL s~a.stato mco.ntra:to, non saraono..n-ecessar.ie ___ r:- -
,

operazioni.

. - .. - , uu:er1orJ

2) .F.in~to .che '_ \_0' nn_si~ stati in.c_o.nJ:(ato, leggete l~espress~op.e da sinistra a destra.
Nel 0 ~ cwdil \!a.ratt:r<' Orrnre sia \ffi-Dnmero, ig;;erite il sup valore inrer~ tesra alla
P~ -a. _. co~- ~te .eh~ il ~~re incero di un cai:a_ere nu_m~rico1 quello :.issunro nell''insie
. ~e de~ cara.tcer1 d~l .computer 1.n.en il v$1ore1di i 0 i
Alttt~e~t1, q_~~ra_il C:U~ttere corr:n~e s~a un 9p0ratoxe, estraete dalla cima ella pila_j
pnm1 due-el~menu e 1mmagazzmacel1 nell~ variabili x e y.

c:;"

u;

Calcolate y op eratore x.
_ lfiserit il risultato del e.al.col in res~r:a alla pila.
3) __E~.s_.trate
all: P.ila~. ,qn al Q.ta,
. Ilf?u~ ~pr_
. ess10
1n_e abbnte
inconrrarr>
.
. ._.il valor contenuto
_.
_. in_cima
,
il
car<ttter.e
-. - .
no
o ne p. ol"'"'r.a

. __ a.. NULL. Qud -valore sara piopr10 il r1sul:tat,.o_ .dell'
_ _t;sr_:iress10ne
1n
...taz1mve.rs
t'
. -.
.- . .
. ' ~:u;..-"'

.hrse:r4ra un valore' in cima alla p-ila.,


iril pop(.STACKNODEPTR *top,Pt-r)
Estr.rrr. un valote _dalla ima della pila.
i,nt i$Empty(STACKNOOEPTR topPtr)

J2eterminer se la pila vuot_a.

:v:oia printStack(STACKNObEPTR topPtr)


Visua.lita."r l~ pil~.
J::2 ..l4 Mod'ific--axe il p.rogr;amma p~r la valutazione delle {!~pressioni in notazione pol;icGa in.ver!?a
Hlll-Es~rc:i?:i-0 12.U, .in modo che possa dabota:re degli operandi intri maggiori di nove.

:l~Z.11 '(SJ1_11Jll~ione dj un supermercaro) Scci:vect~ un pt9grani .m a tht simuli una fila alla cassa di nn
s. @'~rw~r<::;atQ. La.. fila una coda. I ~lierrr.i arri--veranno c~alm.ehre in intetvalll inc~tl e9mp.re$~ tra 1 e
4 Jt):i)1Nti. -Arr-~_he i clienti s'aranno s.e:tviti in modo asuale .a d irtfrv.alli-i.nteri cornpr~si tra l e 4 minuti .
-Cl~en11e i ritmi dovrall.rio ess.te bilanci~ti. 'L2- ro,da crster all i n,finita qualora il ritm.p dgli arrivi

s~ s~_li):~rj.qi:~ a q_udlo_del servizio. Nono~tante i .citn bilancia[i, il caso parrebbe eausare delle lunghe
'Gf!ld~. Esegnite,la simulazi.Qne del supea:ne.rc~ro per na giorr:iafa lav-o,rativa di l.2 ore (720 minuti),
1~~, ~0 il seg\leAte algoritmO:

l ~ ~oogijre Wl imer casuale Gompreso tra 1 e 4.J per dete-mn in~u:e il rn.ir,i:i~t~o in cvi .-arrivra il.
p,timo ,c;(iente.

446

CAPlTLO

447

12

un ,.e:id: f<Qgl..ia (ovversia, 11on ha figli), opprne in ru1 nodo che ha un figlio o in w1-no.do cl1e ha dLte

2) Nel :rn.omeht in ,ui arriva il primo clienre:


Dete:mi.nate il tmpo di s<I:rvizi:o dd clienre (un intero casuale com_preso tra 1 e 4J;

S::0m1rrctafe a servire il clinte;


Sta~ilite il_cempo di arrivo iel pr6-ssim clinte (un inrer a.Suale compreso tra I ~ 4
agg1Ltnto al tempo con:ente).

- {;lual~ral etemerttci da eliminare sia cont11uco in un_a _foglia. q usto sar rimosso e il _P-untatore del
nQ'cl!() _jia~e sata iinposrato a NULL.
Q!Jalora F~lemento da eliminare sia conrt;11_l1t0 in_ un n.odo che abbia un figlio, il punt<,itore d~l
- ~e.:S~~ ili)postato in mo.do da fare rifrirp,ento al nod9 fgo >.men t[e quello che contiene i daci sar.a
~~:at9.- Qi~ significa th-e~ all':int:~mo dell'albero, il n9d!o figli.o assumer il pCDsto di que.llo rlmo~so.
5
t~iffiQ, cas_o il pi difficile. Qual~.ra_ ~-i elmini lJ..110 che 'abbia due figlis U.O. altro nodo dcll albftrO
e;]:~~ ~~mnere il su po.~to . Ttiuavia il plu1tatore del nod0 padre non pott semplicemen te e$Sere
J $]l@S~t in.mode,da.fare riferimen to a unod.el figli di quello da lirilii.hre. Ci:J. petch, nella maggior
ilam~ .aei C::asi l1 alb-~ro di ric,era bjnaria risulc~te ncin sj mimrer:Febbe fedele alla sua catatterisrica
p~cj1_ale: J valorii:di Pgtii sotto-albero -si1'lis.tro della/vero so1zo inft_riori a qu:elio del 1wda padre, mentre
4ue.Jit 'f/,i lig.tl/i sottc?1-albeto d.r:stro .4e/t,a:lb-ero son,o magf:iori di quei/o dei rtodo padre.
Q~ruf nod0 dovr. e;s:stfre 4sa.1:0 cpme nodo so:stiNttivo "per manter1ere qu~sta cara:tteyistica? Pn:r
es~ere ik.n.odo ~ontene:at~ il v~o1~ pi'L1 grande dell albero che aia inferi-ore.a 'luellq del n,odo eliminato;
ep.pu.r.e p:0tr e:s~_ere q!-1-~llo 9nre11enre il valore pi piccolo tlell al.bero cl1e siaJ;naggio.r;e di ~ruello de~
nel!i eii111i.nato. Consideriam o il nodo con il ~ralore. inferio.re. fn un albeto di rirerca bin~ja, il valore
'J! i:gr:mfei'e inferiore a q\lello di un pij_dre sar sl.sretnaro nl sottoalbero sinistro del nocl,o padre, e sar
sicluafffente co:nte.nut~ .n~l nodo all'esr.re:mit dstta del sottoalbero. Tr;vieremr) il $u.d detto nodo
~enilende nel sotroalbero sinistro lel padre e a.i1dand0 sn"lpr a destra, fiQtantq ch il puntator~ _al
~lta tstto cl~I nqdo c.orrente n>n su NU LL. A questo punto, stare:mo puntando .?-111odQ di so~titu1'~.nt _the ;fl-atr .Ssere w1a foglia. o un nodo on un solo :6.gli., alla sua sirrisna,. Qualora il n_o:do di

3) Fet og_ni minuto del giorno:


Qualo-ra arrivi il cliente st1ccessivo:
Mettete il 6liertte ndla odai
S~abilite il tempo di arrivo del prossinl:o cliente;

Nel caso in cui sia. stato completato il servizio per l~ulrimo clint~:
Comunicatl o
To_gliete dalla c;rdail p:rossim. o tlient da ser:vire
Determinate il tempo di complet-3.mehto del serv-izio per il cliente (vveros1a
un filtero casuale da 1 a 4 aggiunto al cetnf'o cotrente).

Eseguite ora la vostra.":simulazione e ponetevi le seguenti questioni;


a). Qual &stato il nnme:ro massimo -di clie1tci in coda durante tutta l simlila.Zione?
.
b) Qual stata l'attes-a pi lunga tra q11ell;e sperimentate dai clienti?
e) ~h:e cosa Sl1~ederebbe se_J,inrervallo di arrivo,. compi;so tta 1 e 4 minuti,. fosse cambiato
m uno- c;:omprese tra. I ~ 3 m.inuti?
1

12.16- Modifcate il f.i:ogra--mma della Flgu.ra 12.19 in mo-do d CQns:entire l'-in:setimento di valori
-duplicati nell,al'bei:a bin~tio.

i pas~i per eseguite l'eliminazione_Sa.ranno ~egunti:


soS:~i_ru,zlo.n _S~ URa foglia,
-.

i .2.17 Sc~vet~ un ~r~gr~mma basato su qaello della Fi~ura, 12.19 eh~ pryn:da ln,.irJ.pu.t una linect cli

1/) Salvare il punacot al nodo; da eliminare in una vatiaqile t:~m.poranea di tipo puntatre::
q_t,lesto puntRtpre sar usato per liberare la memoria al.locata ainamican1enre.
2) !mpgstate il puntatore del padre del nono da eliminare in modo che faeia....riferimento al
nodo di sos.tuzine.
.3 )' IJmpostR~e a NULL il puntatore .al .sotroalbero destro nel pa_dre del noqo di ~osttuzione.
~). Imposta1e il puntatore al sdttoalbero desrro (sinistro) del nodo di sqsti.ruzone in modo che
f:acc,_a rfermetrtO al sottoalhero destrro-(sinistro) .ciel nodp da eliminare..
5~?: E] ipiinate il nod puntaro dalla variabile . rem.pqr~nea. di tipo pu ntatore.

testo>.separ_i fil fras-e lil parole,, le inserisca in un c;lbero d.i ric~tca binatia e v.isualizzi la.-v:isira. s:immettica.1
an.ticipara ~- cliff~ri~a d~ll' alb~i;o.
te s,t rt o,k pe,e: dividere
S._ugg~riTQen(o: l~ggett;! lJ!c_lin~a di ~es~Q e m.IlJ,~gazzLriatela in. un vettore.
.
ovo rtodo nell~al
1n parole il (esto. N~l momento tn cui avrete i,<;olar~ nna p.arola dov.rete creare un nu_
bero) as.segn"re ilpuntarore re~tiruit-0 das-t rtok al membro st r ing,del nueve nod0 e inserirlo nell' al-

usa

-.-

bero.
U.18 _ln que$tO ca~i~.olo ab~j4 ~.6 visto ~h.e r~Umi.n'.azi.orre dei d_uplica_ti ~mplie, qualtJra si scia:
Q:~~o un albero di trcerc~, bn~ri~. Des~r1vete m .che. nJo_dQ es~gir~ste l~liminazjone dei d.uplic:~r.i
u:~arido ~ol_i;an,~o ~ vett>re- a una. dtmensJ,one. C.o nft0ntate le: prestazioni dell'-opera.zion~ di ~imina:.
zio.ne de1 d.up_lica:n basata sul vetto~e con quella basata sull'albe.ro dLric_erca bin:i:ria.

12_:19 S~riv-ete una funzio11e dErpt h ~h~ riceva ,u n alb~ro binaci<:l e determini di qu~ti livelli sia
composto.

12:.20 (Visuali~zazione' ricorsiva di una li~ta i.n. ordine inver_~o) S:r.iv~t~ un~ funzione
pr:1.n~L.is. t~ao 1kWa~a_s ~he visualizzi in modo ricOrs-YO e il! 9rdip_e invers9 gli elemeriti una. lista.
Usa'[e la :vostra funz10.ne 1n un programma di prova che crei una lista ordinata di interi e la Visualizzi in
"
Ordine inv(}f.SO .

di

12.21 (llierta ricorsiva in una l.isra) Scriver~ una funzione searchlist c;he ceth.i in m0d rirsivo
- - ~' - "1
--t. ori~
-- punta
un
' re
res~~+r

dowa
c11cntenaca. La funzione
lisca
una
di
interno
a1l
datG- valore
urt
11
al vaiore,
.
.
.
.
l.Jc~....
'
.

'
.
.
.
.
1
.'
qualo~l abb~.~ r1tr?:a-ro,.o NULL i-n caso contrari. Usat la.vosn:a funzione in un programma di prova
che crei una-lista d1_1n.rer1. Il programma dovr rithie"d ere-all>urenre il v.alore da individuare nella lista.

12 ~-~2: {~m_o~~~-e ~~ nn ~lbe;.o b~ar]o) ~ ~ues:t? esertzio,.affronteremo.la.rimozione degli elementi

d~lialb~ ~ r~cer~ b~na~ta; L ruger1 rmo ~1 ~Lrhoziontt noli COS' semplice ome qt1ello.di ins:rimenro.
Durante l eli:rn i nazione; di un elemento, Cl SI potrebbe imbattere in rre casi: l'elemento contenu'to in

P~i: :es<guire_1elimina.Zione nel caso di lH.i noci.o cl.i sostituzione ~ ~l;>:~ia un figlio. sinistr, si
d'.f:enutira'nIE:> delle operazioni simili a quelle effettuate qel mso di un nod.o di ssti'tuzione senza.-hgi
~l'Mg~dtn).o ,dovr sposrar -anche il figlio nella po~izione atrualn1en,re oceupata dal nod,o d ssci:tum ~. ID~ternb cieli aloero. Qualora quello dl so.stituziqnesia un._nod9 con un figlio a sinistra; i passi
m~r 1 es~gulr l':ellmina'.lJione Sa!bpo i seguenti:
-

;1) S.filvate il pun-t-aro_te al no:do da elimi n.a;re in una variabile tmporanl~ di tipo puntatore.
o da eliminare in md-0 che faccia rferimnto al
. ,., J1l1postate il p.u ntatore del padre d~l .qod_
nodo di sstirtizi.nt.
B:~ I~mpo.stat' il puntatore al sonoilbi;;:to dl"jS.t ro CQilJ:~nuto nel padr~ del n0d@ di sos,cimzioa,el
~in modo h.e faceia riferi1nento a,l figlio sinistrQ :del nodo di sostitutlGne ..
4~ Trnpos'tate il puntatore al s_o ttoaleero rdes~ro ($i~tr) del nodo d:i sostifl1-zione in mtlO .che
fa.ctia-riferimentoal sot:t0albero d~~tro (~ini~tr) del nodo d elminate.
') limi.riate ilBdo punt_a'Co cdaJla vaci<tb'.il,e empranea di rip p utifatore.
1

-. a}iv.ete ta funzione del et e Norde che aecettl ~me s--i10 i argomenti un puntatore-al .09-d.Q xadice
fLtn:zion~- dv-t individ1iare alrlnterno ;dell'albero il nod.o
d._:el~aimter:o :e il valore da elimioa_re. L<r
~~~enent ll valoteda eliminar~., eusare glialgc;>titml discussi in questo eserci:Zio per rimuo:vere il nodo.

Il .

CAPTTLO

Qualora iJ valore ncHi sia sta.t rirrova.to nell\tl!Jro? la fiu1zione, dovr: vistralizzare 11il mf!issaggi che
ii1dichi se il valore sia stato elhr1inato , no . Mdificat il prgni..rllrna della Fignt; 12. i9, in nio-d che
usi questa funzione. Dopo aver eliminato un elerrl:errco; rithiamate le funzioni di -vi-Sit inOrderpreO.rd1r e postOrd'e r_per .confermare .che l'operazi:one di -rimozion.e sia.stata eseguita correttrri-ffhre.
12 ..2-3 {Ricerea in un alb~ro binario) Scrivete J-a funzione b.naryTreSe-a rh che reric:i d1 indivduare
un dat.6 va1.ore all~intern.o . di un alb.rb di ric~rca binaria. la fun_zione dovr accettare come argomenti
Un punrarof!e ~ .nodo radie del],alber 0 e una chiave di rcrta da individ uare. Qttalbra il nodo
t:o,~t:eR~n:re la diiav: di' ricerc sia stato n.dividuato la funzione d.ovra restituir@ Ll.n p~tntator a qLLel
ndo; in caso cootrario,, la. funzione dovri testtblire un punti.tor:e NULL.
1

12.24 (Visita pe-r llirelli diun albro binari0) li pre:gt~mma della.E-igura 12.19 ha-mosttato tre.metodi
flCTSVi per visitar~ Un albero binario:. ht.visita sirtune.rcica:, quella anticipata ~ queill-diff.rita, Que-St
es.erlzio _presenter la Vis.ira per livelli di itn alh,er0 binarjo_,.nella quale i valori dei nodi s:atattno visualizzaci
livello depo ~vcllo, incomi. n. cian<~to da q.ue][o del nodo radire. I nedi di o:gpjlivel[o,s'arfih, vls.tra.li#zat:i
d'.asinisrr-aa._dSrra. la.-visita p.~r livdli.nn IJ1i alg;e rittno ricox-Sivo. E-ssa usa la s-tru'ttu-r.a .cii dari G@.d a pr
:contrllate l't>11tput cl6_ n.odi~ Lalgorirmo .sar il segurntti.
l) Inseri:t il no:do :radice nella coda.
2 ).' .pih:tauto Ghe sian,o rimasti clei nodi nella c~daJ
Pren.dett Unodo s.us~essivo della coda
Visualizzate
il valore dei- i1'od.o..
Qual o:t'1 il purrar0:re ~ nglio sinl$ttO del n~do non ~ht NULL
In;:;~rlte il_figlio in'i~tr9 nella coda
Qualer.a -il punt~to_:te al figlio destt' del no.dr; .non sia NULL
In~.eri~e il figlie destre .nella:cod~
'

S.crivere lafun:z;ione leve!Orcler che esegua. una. vi;sita per_livelli di un _alb~ro bin,arjo, La. funiione
d9vr acctta:te-c;ome 'ai:gp;mn,co 1,.tn punrator~ ~. nodo r-adic~ delralbeto. Modificar~ il p.r0gra.mma
9:c;:I1a Flgura 12.1 ~'- in .mo:d.o ck~ uli7;!zi ques,C'a fi1.p:;;:,~one. C_onfron:rate .rQ,u:cpt :di q11~~ f11n.zione
c.n q_uell de_gJi alrr al~Qli-ni di vis.ira pef verifiGPJ che fm,ioni cprr~l:-t;a,m:ente. (Ne-ra.: in que~to
programma, avre:t~ anche bisogno di me_dificare e inoorpl;lr~re 1.e funzioni p~r .l' ~ab.~J:~Jne delle c:ode
mos_txate _n ella EJ~a 1~2. 13 .}

rl

12.25 .(Vis_ualizza,re gli alberi) S,ccivet~ un~ fun~qne ricQ!'siva out-pu.t Tree Ghe visualizzj sullo se-h,er~
mo un___albera b'inar.io. La funziotted0vr v:is_uali'~are li~ero una rig~ per volta, con la cima-(la r~di_e)
posta .::la ~ihlstta gello s_;hetmo e la b~se (~e fo:gli~) sistetnata a destra dello stes.s o. Qgni riga ,sar
vis11;iliz~a,verti~ltn_ent!i!- Pet ~empio,, l'albero hinaro mQ~trato n~~a Eigura 12.22 sa.t visL1acli.zz~to
co~e segu~:

449

12

o_~sa:vat, itchelafoglia pLu a d~si:ra co.cnpru:e in. cim;a all'o.u.tpur; nella cqlonna pi at\estr~ ..mentre
;J,,., ~cilo'.!adic: !Zompare a sinisn:-a-:d.elf ow.tpp,t. Ogni colonna dt:;ll ()UTJJ'Ut mco~inci,a ia-qu@' spari.pi~
Q.,,~@ cl.i q;uella' prcedente. La fuozione ou:t :r;Ju t.Tree dovr ciG~vere cQnle -argome,nci un pun_r~t9re al
1

lllQ;d.~ Jtaillc~ deil-'albero e l'.lntero total Spa.ces Questa variab;Jil mdicl-:ier il num~o d sp~i che
tlitl~:ES_@Q precedete il valore da v_is.uallzz_are e dovr G0m inElare OQll zero, c,o~ che il n9dQ r~. dice sia
~u_al~~tfu a'sinistraddlo.s:onerm:q. Per-vi:SaJizzare ratbere la 61nz.iene us~r una versine mQdificata
tlrJ.lQ ~ta suntrretirica: ess'a inr;minc~J; CO-(fl il ~0tt0 pi a. d,e~tJ:~. dell'aJ.heyq e proseguir:. roi::nando
i@dietio ,a sfills:cra. L' alg01it.mo sar dunque il segu.~nte:
1

-Flnt-nto ch:e il puntatore al nodo orrente QOtl sia NULL


Chiamare in modo rGQr~ivo output:Tree . coo il ~ottoitlbero, destro del nod-o orrerire e
totalSpaces -t "5
-u sate -u na stru,trur~ forper contare d.a la totalS :p~.,ces -visuiizzaregli spazi
Vi~;ali:zz.a:te- il va!Qre del
. nodo .correo,te
-.Imp.osi-at~ il pQ.nt':~o~c;: ~-no-do corrent~ j n modo ch,e faci rifrirnen1Ji'.'l al suo sortoruhr
$lll1Str0

Increm-~nJ;;i.te

tota!Sp,a oes di 5.

sezia,ne spec,i,al,e: costruite il vo.stro compilatore


N 9g E~er:~W 7. I 8 7, 19~ abbiamo intr6dorto -il Linguaggi9 Maccbiaa .S.im,pletro11 (LMSJ e ~ea19 il
1

sloiill~rtcf~4i cmputerSimpJetron per eseg,uire ipro,gr-ammiscritti in.LMS. Jn qu~ms-ezi'.~ne? ~o~crai~

_ &JJ.~0 110

;mpil?.-to.te che- con:v~rtit in LM5 dci pl'.ogt.a-mmi scritti in un linguaggio di p.co,grammazio,__


Re dr filt(,l,? livello. 'Questa sez~ohe "legher?' ins:ieme J>in,teto pr<iCts.s.:o 4i progr'a . mm_azion~.- ScrivereJJlo
~ j'~giranimi riel nuov lingu~gio di alto .Iivllo; il compileremJ1 q.q il c,O~filatore t(; avr~mp
eyJ. (ruit ~~ li eseguiremo con il simulatorecheabbi.arn C@struite. nell 1
'E.s.e.riz.io 7-.1_9.
l~.,~6 :

!I! Lingu:aggio Semplice~ Prima di com inciare a CQstra.ire il comp,il~t.,ore.; discuteremo m1 ~:e.l"!lplie

m:pdt"".f!! linguaggio di.alto _livello sim le alle prime:ver~<)ni _del p~p_oJa.r.1:4lgqaggio BASIC: Qhiamere1110
!1)_Utsto lingaggio:Se;m,plie. ;gni cos.t rut;tn es~tiulbile: di ${;.mP,lice.sar fqnnat da un r1_
llfl.1er9 di rig~ e; 4~
nnfi~(;)n~ iii Sen1plioe. I ntm1erl di i;iga clQVtcmnO C_E?lr!p~I'~ in Qrdirre cre~cente. Qg,Q.i is~pn~ iq__9-

inp.,utj J.et p. rint,.,goto, i f Jgoto o end (c()n~ul~


~f~ la~igra 12.23). EctettuatQ :end; ,filtri ic~pmndi :FJi>'tfanfi(') S$e:re usati rip etut,am~nte . Semplice valutet mltanto tielle e3pre:ssioniintre usantlo .gli operatorj +) ~ o. * I . Questi op_@ratoci m_ante~t:ra n n_ la stessa
fiJoli~t!t ,clJ:e hanno in C. Potranno ~ettmunque essere urilizz~te delle pare.q.tesi per cambiar~ :rordlne di
vJlm~ne di wiespressione.
1Ln0strcom_
piilateredi Semplice rlw.nosceM.$0ltante 1~ lettere minuscole. Turri Lcfl'ra:tteri inclwi in un
medl$_emplice dovlnno essete i.a minuscolo (qu~lli ma:iuscoJi p.r,9voc~fnno un. eqQre di sinra&s. sempre
die:nA:riieempaiano in mi$truzi:pae rem, nel<q_~ caso sa:r:::pJ no.i,gnamci)'. l nmi.di variabil:saranrio formati

'[l1Fl(ter. bn uno cleisegueau com:rndi di .Semp.11ce: rePli

~un.11.;sifilgola lettera. Il S,em_plice non ct::1nsenrir. nqnii cli varia:bile descrit_tiv:i, perci,qusce dovranno esser.e
"., '~Wnei com rneRt in modo da indicare il lofo us_o aJJ,jure:mC) del prQgrilmrna. Il Smpli use~ soltanto
dlle V:luiablli. mteie e .non sar n~e. . dichiaraile: b_aste:r m_enzi9nw-e all'intrno d_el progtamma un
~=divariabile, perch:questasia autQm:atiqunente diohiarat:a e inizializzata aicro'. La sint~si4i .Semplice
n.~oonsenrir-la manipolazione dell sn:ioghe (lettura, scritwrai c9nfrnto1 ecc.): . Il cbmpilato.re genret un
-~f!'9&;dl-slntas_si, qualor;alrit:!o~a,i ~~inteII!o cJi un_progr:amma iq liqgi 1agg~0 Semplicie un.:srri.nga preceduta
~ . -a.QQmand.o diverso da r.em. Il nosrro ~om,pilatofe p.ce,snrru~m' che i p-rogrammi in li:n_guagg Semplice
~iago '. matiJmmessi .cortettamep_t. L~(!rcizio i2.29.chiedeE-al lettore di m_
odifrGare il compi1ato1reaosl che
_:_e
della
.

~~ esegt:lu-e: a.verica . . Stn:ta8$i.

S~mplice user l"i-srruzi.o:ne ondizio_nale if I got o e gudla fu,cnQitiona'ta goto p~r .altera.te il flus"Bo
e:ouuollo dl:lI~:nte l',esecuzioJ:!1e-del pi::gr_.n.ma. Qualra l>is~~one co ndirionati. i f I gotio sia veta,
~!l,n~ollo ..sat tt;i.sferite a un~ rig-a. specila d~l prggramma. In t;Ua istruzione i f I goto sa.ranno validl
1

Il

12
CAPITOLO
.
-

ope tato ii sai


ti
ques
di
orit
_pri
L;;i.
=.
!
o
=
>-:)=
<=:,
>)
:<,
anza
agli
ugu
dl
e
li
iona
relaz
i
at0.i
oper
j s~gu.e-nci
la S[essa he h"1 nno in C.

Com and o lst~uzione di ese mp io

50 rem que sto un commento Qualsiasi resro success[v0 al coma.nd-o rem sar insetira
s_oltanto a scopo do~wnecntativo . e .sar ignorarn dal

rem

.i npu t

30 "J'p Ut X

let

80 lt u

=4

* (j -

56)

10 pri nt w

pri nt
goto'

70 got o 4.5

if /goto

35 i f .i .

=.:;;

a5ren
t - maggire di s, perc i ViSU;:llizZa t .

70 cg~to 99
75r~

s maggftir o ugua le a ti perc i vi!;ualizza s


prin t ~
e11d

~'0 rn~111
-~

99

Visu
. . er il valo re di w.
-- alizz

Fi1ura 1.2.15 Trovare il maggiore di due interi.

'Tra.sferrll crrrroll del progra .n:rrl' alla riga 45.


Con fron tei e z per veFificarne l' uguaglianza errasfe1iril c9ntrollo del pr.ogramm-a :alla riga 801 qualora.
la con dizi one risulti vera; in c-aso cont ra rio1 co.n~inue.:...
r 1~ese-cuzi.on n 1istruzine<;.u,zcessiva.-

nQil forllisce una sttu ttur a di irerazLone (co_rn~ fo r wh ie odo /wh ile dl C). Turl'.:avia>
i.26
I
ra.
Figu
La
.
o
ot
g

o
got
I
f

i
z.ion
i~tru
l~
o
d.
usan
C,
del
e
zion
itera
di
a
ttu.r
.~tru
9gni
a~e
E!li+s-i_nil
i .. Ogn i inte ro sar
int~r
vari
di
rati
d
~
qu,
i
e
celru;
c<:al
r
e
p_
la
inel
sent
re
valo
un
da
to
rolla
9nt
icl
us~r. -un~c
isp:a nd.a
corr
esso
imm
re
-valo
il
lora
Qua
J..
e
abil
vari
a
n~ll
to
Zina
agZ
imm
e
era
tasti
dalla
t
inpu
ln
f (eJ9
ma
ram
prog
del
ne
uzio
esec
I'
dove
99
r!ga
alla
erito
trasf
sar
o
troll
con
il
9
999
~
;
rdia
gua
di
;a . ~ile;?,
:mo e
chei
s
_
o
s1tll
at
alizz
visu
sar
~ta
ciue
k,
a
9
gnar
asse
sur
j
di
o
drat
qua
il
o,
trati
dn
raso
c
ln
~m~1.
11 oom:rQJlo ~~ passato alla rig:a 20, dve sar preso input l'intero succ~sivo.
1(,JSa:do come vost ra gida i prog ram mi di ~~eJ.lPio ddle Fi,gure 12.24 12 ..25 e 12.26,. scrivete
un. g.rq_grati:llpa in linguaggio Se:rnplice che. eseg ua o,gn una delle seguenti attivit:
-a) Prend~te in .inp ut trei n(er i deteoniaa,rene lam~a e visualizzate il risu ltato .
by Usa re un ci cl.o conrrolla:to da un v:alo;re SeIJ;tine-lla per prend,ere in .inp ut 1Ointe ri e clcolare
e visualizzare l loto som.Lna.
ni p0:s.itivi e
e) Usate un ciclo cont rBa co d,a up, ~ontator:e per pren dere in inpu t 7 in teti, alcu
-i lrr negativi,. e caloolare .e visualizzare Ja lorq,media.
Il primo
,d_) P re'ri.dete.in inp ut una seri<:; di interi e dece nni nate ti e' e visualizZatene il rnaggio-i:e
intero in mpur indieher~ quanti numeri dovranno essere elabotati.
ej. Prendte in nput 1O interi e visu:zji~za.tene il min ore.
f)' Ca.lcolace e visualizza.te la somma degli inte ri pari con1presi rra 2 e 30.
~) calc01ate e visualiZ:za_te il prodQtto d~gli interi dispari cofupresi tra 1 e 9.
-, 7.19, 12.12, 12.13 .e
1~.2o/ (os a:ui te Un om.p-1atore.; P:rerequisiti: completate gli Esercizi 7.18
.di ome
12!'2lV ra che il linguaggio S'e mp liq; stato .Presentato (Esercizio 12.26), ,d_iscureremo
_O il
ver~
aura
~sso
pro
il
mo
r~re
side
cbri
o;
luog
tf10
pri
In
e.
plic
Sem
di
tore
pila
com
o.
QStr
n
cwtfrillt<f il c
aggio Semplice sara convertir in LMS ed eseguito daLsimularot~ Simpletr0p.
gt:ta:l~anpr<Jgtamma in iLng_
ensult-re la Figura 12.Z7) . Uq file cs,qnteqente un prog ram ma in linguaggio S~mplie_ s~ letto dal
zi9fi
~scru
le
e
qual
Jiel
~ro~
s
d
su
file
un
in
ato
salv
~ara
r
Qu~
S.
LM
ie
CQll
in
to
erti
co~v
e
~mgilaf0e
ron e_i risultati
W"S compa-riranno u:na pea: ~. ll file LM_S ~ar ql.!ndi cariGat0 nel sim ulat ore Sim plet
si.ratu10 inviati a un ille su disco e ~lo ~-4~rtti . Osservate che il pregr:amma Sinrpletron svilupp~to
pe_t legg~re
t:9
difica
t11t;>
re
esse
i
uind
q
,
r
dov
Esso
era.
tst1
a
dall
t
inpu
l
l
SU}'
il
a
.dev
pten
19
7,
,,.
.cJz
iBAlJ'lset
l!' -p, ~ Mi fin file_,cosl eh~ poS:Sa esegu4e i programmi prod0tti da! nostro co~pil~rore.
Sem
ggio
a
,
ngu
.inli
~
ram~
:rog
p
sul
'fgi
pttss
due

i:ufli
ffec
Qre
pilat
com
il
S,
LM
in
lo
'rtir
~1" tn.v
uss.a pi gird i in
disc
sar
oli_
b
tm.
dei;s
lla
tbe
(la
oli
simb
dei
lla
tabe
la

~U(
cost
o
aggi
s
p~
o
prim
Jl
.~
plitr-e
all~inrern
i
izlo
po&
e
:iv
~
ispr
,
le
e
ro
a
d
tli
tipi
o
r
lo.
i
on
ati,
zzjn
,aga
i1n.m
ann0
sa.r;1ale
a,q1,
nell
)
io'
~~
io
uagg
ling
in
a,
111m
r-a
prog
del
ante
e.ost
e
e
abil
vari
di
e
nom
,
.
riga
di
ro
ume
n
.
i
ogJ1
le,
fina
LMS
i'e
clJ ~ ),l

--

resecuzione dl progr~,mma,

10 rem detrininare e vist:,. Jaliz-z.a.re la somma dd.- due inte ri


15 ram
prende in inpu t i aue inta,ri
~0 rein
30 input a
40 input b
45 rern
50 rem soinm gli inte ri e irnmagaz_~_ ina l risu ltat a n e
~

e = a +b

lt;.3em:_pli~,e

io

rem
70 Pem visalizza il risu ltat o

65

t~rnti.na.

:rem
32
-
3:5 rem veri fica se s >= t
40 .if s >= f .gato 90

prin t t

60

dim ostr eche

plice
Sem
io
uagg
.ling
in
tti
scri
i
m1n
6gra
r
p,
1ni
alc1_
e
9n
erazl
&icl
ct;)q
in
ora.
o
diam
Pren
dalla
ri
inte
due
er
legg
4)
12.2
ura
(Fig
ma
ram
prog
o
prim
Il
o.
ultim
t
ques
di
ch~
isti
tter
rann o l~ cara
som ma (imm ao
r
Jo,
la
;e(
alizi
visu
e
.

olt
alt
e
b
e
a
i
abil
vari
e
nell
1i
valo
lori
i
r
zine
agaz
imm
era,
tasti
gazzinata nella. v~rlahile e).

80 , prin t
'90, r~m
99 end

2.0 irnput s

Visualizzex un pun:r_o interrogativo per -chiedete al-l,ureqe di immettere un iiite ro, Legger 1'intero dalla
t_a,sciera e lo .il11m,_agaZzine_r in x.
'Assegner a u il va.I() re 4 '* ( j - .55) . N otat c che; a
cles:rra del seg,np di uguale, pt teb:be com parl re
u.p.~e~pres~i.pne arbitrariamente complessa.

Figura 12.23 I comandi di Semplice~

e0 let

1'0 rm determinare il maggio.re pi due inte ri

rem

Termin-r~

99 en.d

-~~

end

~;..

compil~i;Qre.

'

z got_o. 80

...

30 input

Descrizione.

451

l i Si'RtJ.TTIJRE Dl DAT

1 1 esecuzione del prograrmia

Figura ~ 2.24 Det erm inar e .la somma di due in.teri.


Il programma della Figura 12.25 dte M 'iNer'evis:u=alizzet il i;:rulggiorc; tra due riurrieri ini:~rL Gli
one
inte.ti sar~ 009 letti dalla -tas.tit i.m.magazzinacl in s et. Lls-rru~ione i"f /go to verifmer la condizl
s sar visualizzato;
.s >= t. Qualora. Ja con dizi one sia vera, il controllo sar tra&fe.:rit9 alla rig~ 90 t
99, dove ,.jJ
riga
della
end
:iQne
~tru2
all'i
erito
trasf
s~
o
troll
con
-il
e
t
ato
alizz
visu

verr
~rrimenti,

prqgrarilma rr:mirier la propria esecuzione:.

CA P!T OL Q

452

12

espres~ione di
i
ogn
a
ri
den
{)n
p
ris.
cot
S
LM
oni
u:zi
is:tr
le
he
anc
r
dur
pro
ssg
a
p.
mo
Sernpl~<;;e. Il pri
alc une istrqzioni
a
rerr
con
che
S
LM
ice
ieod
un
~.
dur
pro
gio
S'ag
pas
mo
pri
il
9~
rem
ved
Sem.pl1ce. C:ome
trasferiscano il
che
oru
uzi
istr
le
del
ga
lten
eQl
liee
p

Sem
gie
uag
ling
in
a
mm
gra
pro
il
a
r
lo.
rnGompleteJ qua
jndi:vidu~t e ompletore
pila
com
del
iQ
g
i~_
p~1
o
ond
S:ec
Il
ice.
cod
del
a
siv
~s
su
riga
corrtcollo a una
ter le istruzioni inc:.omplete e salv~ra il progtamm,q. LMS in un file.

10 re_m cal col are i quadrati dl var i .int eri


20 inp ut j
23 rem
25 r~m con tro lla il valore $,.enti n-el.l a
30 if j = 9999 got o 99
33 rem
35 rem

ca lco la
40 1~t k : J * j
50 pri nt k

53
55
60
99

il qua dra to di

j e

453

assegna il ris:ul tatQ a K

rem

ram i ter a per prend re il prdssimo j


gotp 20

La cl.efnizione d~lla struttura tab leE nt ry la.seguente:


strt:Jt tablE:ntry {

int symbol;
eha r typ e;
int

qn inte ro che con trr : la.

.
bol
sym
ro
m.b
me.
11
'ri.
mb
me
tre
nt:
.ti~
cq.o
ry
t
n,
leE
ab
t
xa
0.gQii. srrutnu
!cri sJrrgoli), un
cara
o
son
ile
iab
var
di
i
nom
i
cne
date
e>r
(ric
e
abil
va;Q
u.na
i
CI.I
AS
JJ.e
ia@lif.esefilta.zi
car;:ttt1Zre che irulich:er il tipo del
un
a
er-
ond
risp
to.r
e
typ
ro
mb
me
Il
e.
tan1
c.0B
una
o
ig
ilil~met0 di.-r
1
Uilt! va ri~abile. Il me mb ro .l oc ati on
per
V'
o
riga
di
o
n~r
nui
un
per
'
L
i
e;
r,~
9s_
e

.
una
per
'
'6
~ mbolo.:
un

a
esc
Qu
.
tton
)ple
Si.n
dei
~a
llor
me;t
la
nel
lo
bc:>
sim
dal
ta
nta
u
;p_
99)
~e~.,~.iia la .p.osizio11e (da 00 a
num ro
un
Pe-r
S.
LM
oni
uzi
istr
le
e
i
dat
i.i
nat
t.zi
gar
ma
.im
o
ann
sar
cui
in
v.e.:. o.te-di 100 dem ent i inteci
inc om incui
in
n
tro
ple
Sim
de1
,a
o.P
mem
la
del
e
tor
vet
nel
nro
me
ele
l'
r~
nte
dtirjg~ la posi:zl0:ne rap_prese
npa
o
.
ile
iab
var
una
:P~r
.
ie
_pl
S~m
gio
ug
Jing
in
lla
que
a
i
enr
ond
t4p
~-iru1ci le 1struzjani LMS cor
in tw sar
tton
.ple
SJm
del
a
ori
m
.
m~
4
det
~
tor
Yet
nel
rtto
erne
l~el
ra
nte
r~&
p
.
ei:~iuanEe, la posizione rap
fin~ della memoria
la
dal
o
iand
i11c
o:m

~
ocat
:ill
o
mrt
.sar
este
Qu
te.
ran"
cos
la
o
irprha;-g?iz~inata la var~~ile,
nella
iV:a
t~ss
stit
la
>
-99
~ne
izi
pos
la
nel
a
na~
zzi
aga
imm
sar
te
tan
cus
o
ile
ia.b
var
del Simpletl'.0i1. L~ prima
48 ~

end

Fig ura 12 .26 Calcolare Hquadt?tto di vari inte ri.

n.:
19c~ tio_

/* ' C' ' I LI I o 1y1 */.


/'* eta 00 a 99 *I

cfOC.

mi se-ritti
ram
g

pro
dei
S
LM
in
e
siqn
:ver
con
lfl
neJ
nte
gra
inte
e
pan
una
a
g,i0
i
bol
La. tabella de_i sim
ro di quattro
nre
uni

S
LM
one
uzi
istr
un'
c;ne
o
.res
app
o
iam
abb
7
lo
pito
Ca
l
Ne
..
.iJI}ln~~g_-gio Si;mpli<!:;e
~ operazione 6: deter.minat'o
dell
ice
cod
Il
do.
r4n
ope
J,
e
e
io.n
rtt$
ope
l
de./
ice
cod
il
+i:
pa.:r
due
Gifi:-e, '.fe.tJn;~tQ da
risponde al
cor
ut
inp
e
plie
Sem
di
Jdo
na1
co1
il
io
lnip
ese
Per
e.
plic
Sem
io
agg

g:
dai ';jjm :utd i del Jjn
e al cocllce
ond
risp
cor
nt
pri
ce
ipli
Sm
di
o
and
com
il
e
ntr
me
d)
(ra
10
S
eLM
r~>'~~&e ,ddl'op:eraziQn
tnt!:nte 'd ari s.u cui U
con
oria
em
_m
di
orre
sizi
o
p_
una

o
and
per
L.o
).
_ite
(wr
11
S
:LM
d<!llj 0per~iop.e
ne 10 per esempio~
zi.o
era
l'op
del
ice
cod
(il

pl-t
com
ptie
p.r
il
e
guir
es"
r
dov
ee
zio
lfa. cli~ d~,Q~~ra
tata dall' op.et~
cifl
spe
ria
mo
me
di
ne
irig
pos
la
nel
t:r
zzin
:ag4
mm
i
lo
e
iera
tast
la
dal
t~~~r: .,~:kvalQre
pe:r dt:te_;rminarn~ la
e,
abl
olT
b
;
sym
la
ncl
rca
rice
un~
r
ttue
effe
tore
pila
com
il
o,
b9l
~~. P~t: oP.i sim
uriliz~ta p~rPmp1e
et
es's
sa
pos
sa
stes
ela
.c,h
cos
n,
r:ro
ple
Sim
del
ria
mo
me
la
del
rn
,~t~
pa.l:hj:~a;:all
tJ.tt-e;le istruzioni LMS .
vqlt~.
un~
io,
mp
ese
Per
i.
d
com
i
suo
sui
l
sact
a
b

ic:e
1.p1
S<m
di
e
ion
L,a p~ptlaziop: di ogni isrru'Z
man 'ent~ dell'isnu.{i
te
par
la
il
bol
sim
dei
lla
t~be
a
ne.U
o
erit
ins
te
sta
sar
dh.it jl,r1:1pmru;:o di riga di un rem
rivi. Le istruzioni
nra
me
u
doc
pi
sco
solo
ha
9
m~n
com
un
ch
~oi
re~
ato
pil
com
dal
ta
Qra
!g
mftH:e: ~r.
ne
izio
pos
una
(a
h
n
.
fira
itel
w1
d;
rea
S
LM
lle
qut?
a
o
ann
d~r
pon
rjs
tor
~p .lfif; pri nt, g.ot o ed end
meni:ra
dire
e
t_
:vey
con
o
ann
sar
e
pli
S~m
J
d
,
i
and
com
sti
que
n-ci
tepe
con
~:e~ijca.~) e halt, Le ist.ru:Zioni
ualar~ il num~ro di riga
q
to"
sol
irri
o
ent
rim
rife
Uh
ete
ten
con
b~
reb
p_ot
:o
o
'
gi
un
che
e
ta:
1~~ :fti !S. ~o
cosidd~tto
il
ia
ro.s
we
o
ite;
l
op.
Ser
gio
uag
ling
in
a
mm
g'ra
prQ
d~l
ue
r

nei
~nnij ~\in 1strUZlne successiva
1

Si'riiul,a tor di

File s:empli.c

compilatore

.
1

Fle SML

Simpletron

"

r.'

"

out put sul


dis co

out put sullo

sc_hermo

"--"-'

:.<-

lice
mp
Se
gio
uag
ling
in
a.
mm
gra
pro
un
re
gui
ese
ecl
re
pila
com
.
re,
ive
Scr
fig ura 12.27
.
1

Pr im o passaggio

,S~plice ..
o
i
g:
uag
ling
in
a
amm
.g.i:
pro
dl
e

n
o.
uzi
istr
ri'
u

ria
o
m
me
la
nel
o
ei;td
Il compilatore iniz~er~. legg
nei
ia_,
eros
(ovv
ri
toke
i
gol
sn
i
so
nei
ca
-a.
sep:
re
sse
r.,
d0v
riga
la
ne,
zl9
pila
Per 1 elahorattone ~ l~ com
la
del
to.k
str
ne
zio
n
fu.
la
ta
usa
re
~se
ta
pot
o,
pit:
c:om
sto
que
re
lita
faii
per
e~
'(pezzi" di u-istrJJ,Zion~)
1

un
da
uito
seg
riga
di
ero
num
1
un
~q_n
.ca
pijn
~
inc
:t1
Zi:o
istrU
i
gn
che
t:
liliteria stw.dard. Ric_p:rda
sti sa.ranno
que
en,
tol{
i
suo
n~i
n~
o
_
uzi
isu
lJD'
a
oit
mp
sce
ore
lar
::rp
cop
il
eh.e
tornando.. M~ mano
tanti, o n
cos
le
del
o
ili'
iab
vr
le
del
i
ci.ga
cii
eri
num
i
e
d
o
sian
lora
q_~a
i,
bol
sim
sistemri nella t.ab,~lla dei.
ouiai
str
un'
dl
en
tk
o
prim
il
sia
~
lor
i
qu.
ro
tan
~oJ
li.
mbo
i
s.
dei
ella
tab
la
nel
o
t_
a
n11mer d..i rig~~s.ar ~istem_
o del pro/"'
bol
sim
i
ogn
era
rrt
:res
iapp
e~
ry
nt.
leE
t~b
re
ttu
stru
di
e
tor
vet
n. La symbolTable e wi
, create la
at:a
Per
.
i
mm
gra
pro
ti
cer
per
a
pos
cor
.te
p
_
-me
la.r
tio
par
rti
esse
r
pot
z~,
g_-ramma: e, di ~nse.~ten
iensJoni, una
din
e
su.
le

.
urr
rid
o
e
rar
men
.r~
inc
rete
r
Po
nti.
me
ele

100
di
tpre
ve
syrnbolTa.b le o om e un
volt.a he il _p:1:Qgramma ~ara funZio.nah te.

Iiftff+iJtt~nft? in ~vanti).

c1'i~ dov r essere


S
LM
ne
zioc
s.rru
un'i
in
to
pila
com

s,a.r
o
~qlt
irri
tro
-en
rim
~n go to con un rife
i
ii~n
aia.
segn
Le
.
r~a
ple
com
r
dov
e
tor
pila
om
c
.
dl
gi.9
sag
pas
nclo
o
,
sec
.il
che
aotitrass(gnatf.t~ pr indic:a:re
f1i;:: sar ann o_inizializzati
,
int
tipo
di
s
lag
f
t6r
vt
del
ntL
n1e
ele_
100
nei
ate
zin
gp,
~T:> lla;g} sar~no 1mma
gramma
pro
del
riga
di
ero
num
un
da
tata
pun
ria
mo
me
di
ne
izio
pos
la
cui
in
o
~on N~tor.e - 1 . Ne l cas
tabeU~ dei simbli)
la
nel
ta
ova
ritr
a
stat
sia
n
11o
6sia
ver
(Qy
ota
n
.
a
:;or
ans
sia
non
rr.i liID:~:aggie S<fmplice
gs ~ve11t~ lo stess.o
fla
e
tor
v~t
del
.r0
n
elem
ll'e
e
n.
t
Zina
ag?Z
lnPl
re.l
ss.~
r.e
dov
iga
di~r
:111ei:rrquel !iutnro
im_po~tato rem pr aiie asar
t
p.le
om
inc
e
ioii
rtlz
~ist
dell
do
ran
ope
I:
ta.
ple
m
o
illc
e
n
io.
.Jlldc:re: rd,~ll~istr:uiz
o in avanti) S'ara
enr
erim
f
Fi:
un
ia
abb
e
(ch
ro
ona
-izi
ond
inc
o
$alt
<il
one
uzi
istr
un'
o~
mpi
ese
mm fe;; a,00'. Per
p tra hrev:e).
em
ver
c:ri
des
e
(ch
eto.r
piia
com
del
gi
s?g
pas
o
pnd
s-ec
al
o
fin
0.
0

+4.0
J;a; iflta oome
lla delle altre; infarti _queste
~
u
q
.
di
ra
lita
p
m,
o
c.
pi

t
le:
e
to
go
I
f
i
oni
uzi
isrr
le
del
ne
. La U~pilarz;io
i f /go to; il tompilate:r-e
qne
i
uz.
istr
un'
Per
S.
LM
ne
izio
istn
un'
di
i
p

o
eyn
.duc
pro
che
SQQ.e 1 u1nt.he
;;i.kFa ri,g. J.} risitltat
U1!
a
rer
.saJ.
oJ
sari
ces
ne
Sar
S
e
e
ion
dlz
gn
la
r
ch~
if}
ver
ce
odi
~0~ ::ho
ian
agl
ugu
d
e
i
nal
zjo
rela
ri
ratp
op.e
li
de.g
o
nun
Og
o.
t).lt
irris

o~nt
r.im
a p~O,tranche essere un rife
1

me

cd salt

454

CAPITOLO

45.5

12

z,a potr ~ss~re sin1.u 4to usando !e istruzioni LMS branch zefY} e bra1zch negative, o-vennmlJ:nenr una
combinazione 4i entra robe.
Per l.}J.l ist:_uzione lett il compilatore prody.rr un codice che valutf un?espressione aritrntica.
argittariam~n.r:e cqmplss~f9rrnaJa d~ v~riapili intere e/o costanri. Le spressionl <;lovranno. separare
ognio.pcrando e operatQr~ condegli spazi. Gli Esercizi 12..12 e i~.13 hanno presentafo 1 algoritmo di
1

conver.sjon~ dalla notazio_ne infissa a quella polacca invrs~ e llalgoritrilo di valutazii:i-ne usato cl.ai
compilatori per valutaJJe le espressioni in ntaztone polacca inversa. Prima di procedere con il vostro
compilat9re dovrete cmplttare ognun d'ei suddetti esercizi. Qu-rndo un compilarore ntntrer un' ~sprssione la onvrtira dalla f.10tazn infissa a quella polacca inv~rsa e quindi Ja~valuter.
Ma in th modo il compilato.re produrr iJ codice per valutare L1n espressione the contenga

delle variaQiJi? Lalgorioho di vlut'a2ione delle espressioni in nota.zioiie polacca inversa prevede
1

una vaJLianre; che eonse.n tir a.I nostro compilatore di generar le istruzioni LMS., nveQe di valutare effettivamente le es,pressieni. Per attivare la sudd~tta v:a.rian'-fe nl compilaror.e1l'algoritmo di
v.alutazion.e delle esp:ressioni in norazione f)olaca inversa dovt ts:ser modifi.ato in modo che
possa ricrcare (ed eventu-alm~ntt: inserir) nella symb.o l r able o-gni simbolo- c;he incontrer. Per
ognuno di quei simboli, l'algoritmo dovr quindi d~teaninare e:: inserire ncll pila la corrisporideitte psizion.e di mtrloria, .in.vece del si'mbolif. N~l indmefito. in cui verr incontrato un operatore
all' interno dell 'espression in nota.zio.ne pblac-ca m\ ersa, sar.nfi.o estratte le due posizio ni di memoria in tima all- ptl e sua prodotto il c.dice in linguaggio m.accllln:r nedessai:i pt eseguire
l'operaz.ion e} usando c0_rn .o perandi le J?Osiziru di memoria:. Il risulta-to di ogni cotnp:boente
dell' es_p.ressi0ne st i mm agazz.ina'to in ,una p:osizione di memoria tempor:a:-Il~'a. e inserjto. nuo-vamenre nella pila, .f>etch possa proseguire la v.-lucazjone de11 1espressione in notazione p_o_Jacca
e di memocia contela posizioo
invers, Nel moment in c_ui I~ valutazione sar st.ara cempl.etata)
.
nenre il Fsultato sar ]'unl:Ga posizione rima.sta sulla pila. Que5ta! sar d.unqu~ estrarta e saranno
generare le is.tr.:tzioni LMS: per "assegnate il.risultato alla -va_tiabile a si aistra dell'istru:zlone lert .
1

La m~aggior prte

Il seco-r.i.do passaggio del co_tnpilatore eseguir due attivit: risolvere ogni riferimento irrisolto e
sal~are il cdice LMS. in u.n file. La risoluzione: dei _riferimenti avve_r_r nel .modo seg~.ente:
1) _Ric.ertate _nel vettcire f lags un riferimento iriisolto (O-V'Yerosia) un elemento con L1n
valor diverso da -1).
2) lrrdividuate nel verto 'e symbol Tllble la struttura c-(Jntene nte il -s-imb~lillO imm::tgazzinar in f lags (assicurtevi che il tipo del simh-010 sia L 1 p~t i numeri di riga) .
3) nserjte la posizione di memltll inditata dal rttetnbro della struttura looatioin nel~
!'istruzione con il riferimento_ir:i::isolto. Ricordatevi che t:tn''istEUZione oonten_e hte- tJn
ciferirnenro irrisolto -haJ,opetando 00.
-4) Ripe-rete i passi -1,. 2.e 3 finch non sat stata ~ggj.un-tala fine del vettore fl.ag$ ..
Una volta clte il processo di tisolw.-zione sar staro e_o mpletato, i;intro vetto-re d~I codice LMS' sar~
salvato in un file S disco, sistemattliio un' isu:w;ione LMS per riga. Que~Jo file porr e~sere lerro
dal Simpletton per l'es~ecuzio.ne, u.n-a volta che av":t;ete medifi~ato il simulatore in.mQdQ che possa
lgg<{re il suo lnpu.t da un file.

~Wt-ion._e.

Posizione e
istruzione LMS Descrizione

PtQgramma
~fil Sep;plice

s rem

'

aggiunge

L'esempio s_egu_ente ill.u strera una conversione completa in LMS di un pr-ogramma scritto in
linguggi Semplice) cos conre sar eseguita .daJ c0nipil_arore ,di Semp.lice. Consider:ate un progra:1nma seritt in linguaggio Sempliti!-, ~he pr:enda in in;put un in-tero e 'Soni n1i i va.loti c(lmpJ:esi
~cll'intenr.allo da t alJiurtet o. spcifica:t:o. Nella Figu~ra 12.28 sono mostrad il prograrri.n\a e le
is.ttuziuni LMS generate dal primo passaggio. Nella Fig1~ra _12,29 mosttat.a la ta;__b~lla dei sim'boli

cQS;ttuita dal pri-mo p-assaggio,

ne:ss1tna

a x

00

1.1 .i oput x

5 tem
,._

Verifica Se "J

==

'20 :lff y == x goto 60

25 re.hl .i n1cre,menta y

la,:t y = y +

+1 099

nesS:rla
. . ' ..

01

+2098

02

+3199

03

+4200

n esst~na

..

rem ignorar-a
carica_ y ( 96) nell 1atcuillulatore
sottrae x .( 99) dlJ'acc11mularor~
brart.ch zero a-uria p0sizione irrisolt~

rem

tgn9~~ta

+2098

05

+3097

carica y nell'accumulatore
-agginnge 1 (97) all'accumulatore

06
07
08

+2196

lo inunagazzina nella posizione temporanea 96

+2096

Gari_ca dall~ pqsi-zione tempo1~anea 96


y
" _l) ac_cumtl 'l:;ir:ore m
a4zlna
1mmag,

+21 '.98

ness11-nq:

4.1 let t : t + y

09

10
11

A5 rem iclo y

<

rem ignorata
le~e x 11ella _posizinne 9 9

04

S5 ram agg'i unge y a,l totale

Un esempio compl'e to

in_ singole

;iS;tiJ:ttzio.n i LMS : -In quesr_o,p Lo$raJnma, le; e--cez.i9ni saranno rappr<;$~ntate dai aomm.e nti; dal1,ls;uuziane if /goto della _rjga 20 e call'istrl.J2ione let. I co.mm~~ci nQn ~i l:radtitcrti in linguaggi~ ma.c::bi,na. Tuttavia, i nl.1m:eri di rig:a 9-1 un conune:nro s:;iran~o ugualmrrre sisremarl_ nella
f3.1Jd,la dei sin1boli 1 nell'eventualir <Sb-siano sati punr.ari la un go-to o da uri i f I goto. La r1ga 20
~.ciltKGa che:il co_ntro11o del p.rogfgmma.pa~ser alJa r,iga 60 qualor-~ la condizio?e Y_== ~si~ ver~.
J;M'.to' he.!a riga s0 comparir solo pi tardi oel progra m ma il prJJfq_o passagg10 del compilatore
_nonl@ba.an-c ora sistemato nella tab_ella dei simboli (i numeri di rig-a sinn0 sistemati nella tabella
d~i simb.oli, solo <t.u.:;lo'"a eo;m-pai~o come, pciri19 tok:e1;1 di un'istruzione). Di conse-gueliza1
Q_nsfo. pirnto 1 no_n p_Qssibile determinare l ' 9perando dll 1istruzione LMS briJ.nc-h ze10 nella
p&sJzione 03 d~l vetc:ore he contieue le itruzioni LMS . Il cornpilac~re s-istem.er dunq_ue il' 60
.nmJ.a.p,os-iziont:,: 03 del vettore f lags per indicare cl:te il secondo passaggio dovr_c.mpletare questa

30

Secondo passaggio

d.elle ls.t ruzioni di Semplice potr e,~iSere conve,rllta direua.mente

+2095
+3098
+2-194

12

+2094

13

+219.5

nessuna

rem ignorata

caria t ( 95) nell, accumulatore


~iunge y all,actumulatol'e
immagazzina :t;leila po~izine- ~emporanea

carica dalla pos-izione tempQianea 94


immagazzina l accwnolatore in t

rem ignorata

58 got o .20
55 ~em visu~.lizz:a il risul tato1 nessuna
15 +1195
se gl!int t

salc:a ~a posi_zioqe 01.

e9 e:nct.

terniina
-- - .- - l'esecuzione

~ig~i;\

1s

+4300

rem ighorata

visualizza 1! sullo scherm


-

11.28 le istruzioni LMS generate dQpg il primo pssaggio del comp.;i latore.

Dayr~o m;tntenere ua-c:c;;ia d~ll_ a posizi.one della prossima istruzidn6: nel vettore LMS, perche a~Jl .e, u'na. corrispondenza -u:~o_ a. no -.ra Le .i_$itruzioni di SmplG:fi e qu:~e di LMS . Pr
~cl)3Jp,ir9, i~istruzj one i f / goto della riga 20 sar_~ cqmpilara in tre istruzioni LMS. Di consegL1enza,

:ogni

Viel (,he

s-ar_ gen~ra.ra un'istru~i.o.ne dovremo inrementa:re i_l contatore di .istruzioni; in

456

CAPITOLO

11

~odo che pu.nt alla po~izione ~uccessiva .del vttore LMS . Ossrirv~tt h

la ,dimenslone dclia
me~o,~~~ ~~el _S_i1:1~le~on ~?treb~_e ~appr~se~:are un pro~l1*a p.er i pro,gramml in ling.uaggiq
s~~~~c~" forma u_~a molte JStruz1001. variabili {~- COstanr.i. Infatti : pro bab.il che il C::ompilatore
esaunsca la memt1'ria. PC'r controllare qu~sra evrrrualii, il vostro p~ogran1ma dovra co:ntffnere nn
c?rztittore di dati in .modo, eia onse~re la pbszione del vettote LMS n~ll. qua.l~ s'ar~ immaa~
z,1nata la prossima-Variabile i{ ) tostnte. Il vetture LMS sar pieno quando. il valotti:' del Ct)ntaro~ di
i~rrti,zi0ni sar: superiore a qtJ:ello d~l contatore di dati. In questtY caso il prceS'S di ompilazione
dcivra esset interrtto il compilatore dovr. visualizzIBr~ un inessaggi0 di rrore. per indicate che
avr esaurito .la m~ino11ia lurant la cntpilazione~
1

il 1Jifll'l~.erf'.:. di riga 1 0 sar sistemato n~lla. tabella dei simbli com:e tipo l , _e.sar .asseg:Q.at,o alla prima
RbSW!Yil'l~~ -4~1 vetr'oreLMS- (0~.) poich il prpgrrunm~ dO,Ill_i~ia ~on un .co:tn~nt e quin.di il c;;on.tat~re
...ai .~~onl va:rt anc{>.J:'~, 00) . Il e.e-mando i .n put indica tne 1l p:rosst mtJ .simbolo sar ~ vana.bile~
1

. pai.b~~ ~?!Sttu~i~ne in~U't pu cimpatre ~Ql1~ una va:riabile ~l cgmpila~ore dovr semplien:ien}~
~ti~.flll)-l~eJ pos1zt0ne dix nel vettore LMS p{ch .i np,ut corr1spo.nde:direrrameo1 a q.u codic.e cli
.mp: ;r.a~teJ1~ bM'S. 11 simbelo x no n ,sar anc9ra presente nella tablla dci siroholi e q_uindi vi dovr~ ~$SC:J-e
ti1s~tJt-a I~~_aa-ta:gpres~ntazione .ASCI I -con il iip V) e. gli sarassegna[a.la po. s~ion~ 99 de~ vcttpre IMS1

i:

i~ ,6 ~'l~flmag<tz-Zirt;~ento dei dati ~,~~n~ia ~alla p:o~iii~ne.~99 e f ro'segi.te d.~ ' al~~ ve)."~o b?.$9;
;&, l\l._,. t 0 ,p u.fit potr essere. g~nerato il odu:e LMS per questa 1st:r11.Z1Qne, il odrce ru operoaztQne 10
0~~:~ta -q_11cll LM:S per ia. lettura) ~ar moltiplitaro pet 100 : la posizione dix. de.terminai,~a dall
~i?.~Jt~ dii si.mb0li., vi s:i.r aggivnta p(!r co.np ietare 1' istruzione. I.: istrnzionJ~ sa.r: q 1i .nd[ imme,g~zina-r
.a~U@momq;iilne 00 ci'31 veno:re LMS.11 cnralore di .iStruzioru .s,at incremenr~t0 di 1 po!ch.~ ~ar stata
1

Simbolo

Tipe.;> P-osizi one.

5,

00

10

00
Q9

XJ

l5

20
I I
y

25

30,

35

40

04
04
97
09
09

95

JCil~.PJLt!~ ufiG . sola: lstruzio:n e,L.MS.


'!./
]p. s~uito sa.cl; analizz.a!'.a l'isrruzine1- 5 r.em
-

1,4

50
55
60

.L
'J.,.

14
15

15

99

1s

s-a:Jt asst'l:gnato alla p-0si:z;iq~ sccess.iva del vettre; 01 . Ricordate ahe l_iisttuz:lon.e r.em nqn genera
C~~~~ pttib 'i l trntaro:r~ di istrtJ.ZiQn:i Jin 5ta iilc.rem,eh.tatb.,
Jri~:.segu.ir:0 s-a.r qn~iz:zata l'istrilliiort

20 if y = x goto 60
mmim.to di .riga 20 sar inserironella tabella dei simb.oli e glj sat'. assegnaEp il tipo L e la posizione
>Si;ic111:ssiv.a d.'el ~ettO.t'~ LM_S: 01 . Il comando i f indita.eh dovr-: e.sse:re v:alutata una CQndizio:ne. La
~QFiabilt~y n1.'Jn sar, ~J19ra pr~~r;nte nella fnb:ella dei simbolt .perci vi sar.inserJ:ra ,~ gli sar' assegnato
il mp-P V elap.osizi~ne gs di. LMS. 1h seguto1 saranno g~nerare le_isrruzi.oni -LMS che valurera:h:no la
. E:oi'1!15,zfan:. batoehe in LMSn on c nssuna diretta corrlspo:ndema perJl c9.s rruttQ f I goto.,.qti.esto
bl1-vt'~tes:se'.F'e :si;mul~.tQ esegue-t:]:dQ un calcilo ,cJ2'l1 x e y e trasferendoil onuQllo d~l progrill.rn:a in base
tP.tisl!\ltato. ll r{iul.:taEo dellasottrazione di x day sarzer.o, qu;alora. y s~a uguale a x @ peri porr ssee
i.ma'Nl ~1-sti;!J.Zion~e .br:r/:neh z,~1:q n il tisulrta del caleQO pei; .simc.are l)is:guzi:.one i f I goto . Il pru10
jla'.5-8@ ttcbjedJ!rii clie y sia caricata n:~ll 1 acc..unulatore d:alla po~~z.io.ne 99, di LMS~ gener-ando (tu.indi
1

Figura 12.29 Ta~ella dei simboli ,p er il programma della Fig~r~ 12.2.8


1

Un esame passo per passo del processo di co.m pilazione


~~~e-rvia_mo ora il p:r:ees~o di c;.ompilaziop_e 11er il pre_gr:ffmm~ in li11ggaggio Sem_p]ie mostrato, n.ella
Fignr~ l 2L28. _Il eomp.ila:t1qre l;g~ in.m.emP'.ria la.Fti m~~ riga cl.el pr9g~in.a

a:ggiuhge 1 a x

11 p.cimo ~imbolo d.el1 s-trUZione il numero di riga, sar determi'naro 11sando strtok (co.ns.ultat il
Cpir0-1o 8 per Una distussi.n sulle fi.1nzioni e di ~a oip.lazione delle str.in:ghe)'. simbolo restituito
~a, s. trt. d~ sar. ':0nverri.r! in Wl intet@ UsfilldO at:o i, p.erci nella tabJ]a dei slm,b:o'li J?Otr- esser.e
.ricercat<:' ll E6keh. 5 the sar inserir@ .nella sudd~t'fa. tabella, qualora non sia stato rirt.ovatd. Dato 1t:he_
- s~o aJ.l' inizio dl pro:gttmma eh.e ques.ta la.p.ri.m'1.~:riga) nella r.abella non e ancora nessun simb_lo.
D .1 consegue:n:ta, il 5 vi s~ata. ins:cito come tipo L (nnme-ro:-cdi riga) e:.Sar .ass:e gn.ato alla. prim~ pdsiziene
~00) del ve~~f LM~. NnosJanre si. tratti dl Un c;:t)mtnenro, allo:cner~rno ugua.lmen:te une sp:azl pet
.il n.11m~re di t~a all'interno deIJa tabclla dci simho1ij nell'~ve_rrmalita eh~ :Sia Sta~tc puntatoda UJigoto
o un. i f I q.a_t.o. Per la-retn non sara genera.ra n~su:na i.struzine LMS e q_uln.di il relativ.o cont~tore npn

sar 1tu~re:tnemto:.,
ln seguir), sar analizz.ta L'istr_u ii,gue
"10 nput

<i:

'

5 rem

==:

n~r di r1g 15 sar.ricer0.'at0 e n9n trovato nlla tablla de" &imboli aove sa:r: insetit(> n il tipo.

01
01
98

ve rif i ca s y

....

l~u;tFuzi_Ot,i:e, eJ1 1 +~098. ln_~eguiEO X.sar sottratta dail'act~u.m.ulacQl'e, gen,erando riSrrunone 02 +31 :99.
'- -~~.~ p.un.t<;?) il valore contnut n.eITaccumularoxe p_o.a'~ es~~ne ~~r~, p-o~itiv o rregariv:o.
~l!.t~ ,qbe t\;>_p.era:tg:re ::;;=; dovremo usare l7is.truzo11e LMS .b.r_af"lch 2l_ero. In primo lugo~ cercthtitemo.la
~~~{)n~di d: t{~t:inazipne per il salto (60, in questo caso) nella :~ibella dci $imboli, man.on la trovetemo.
~ ~~guc::.~~ il 60 dv'r essere itnmes-sci n~lia posizione 03 dfil vet_r9re f lag.s e dovr Ssere generata
J'fstr11zii_o~ 03 +4200. Inftti, non potr.ri"L agg1u ogere la d~E;in:u.i:one.ckJ alt:6., perch non avremo ahcora
aiss~ttt(J un.apo~i.zi9n~ nl--vettore LMS alla.rig~ 60 . Jl 0Q11rat-0re di is~zj;on sat i.ncrimentto a04.
Jl -om_p:ilatore prceaera on -l'istruzione
.

rem

25

ini;rem~nta

~l !)Im.:<;> di riga 25 sara it1Serito nll tab.ella deJ. sii;nb_oli co.n il tipo l e t.p. l psizione 04 di LMS. Il
1 ~.i,~~9r :diistrurini nn

sat int:rementrato .

Nel... i;na1nenro
in eu 1 ~istrutio ne
. -....,_

'

"30 let y = y +1

$30C.4~~afuZ'a,ta, il I1:tilCJ.TO di riga 30 sat-inse'rite.uella wb~lla dei ~imboJ.i c:li il tipo L.e GbJ:l la positione
04 ,ji L}lfS. Il comand let iri:dicch la riga up.~isrruzione di as-egnamento e~ di conse:guenza., turci
L.s;i.mb,o,li .d~a _cig:a dovra:n-no essere inse-riu ne;ll?l tabella dei simb.olL ,qualora n,ii vi siat10 .gi sta.ci
:i.mlys}. I:i.ntel'o 1- &a.r ~ggiunt6 alJ.a tabella.dei simboli con il tipo C e on la posizione 97 di LMS. la
m~r,te d~tra dell'_;1.$~egn:a.ment10 sar quindi 1:onvertit~ dalla no_t;._ign~ infssa a qnell.a.p0laccil i.nv~rsa. ln
1

458

CAP1T010

-n

s.egiro, sar valutata r espressione in noxazi0ne polaca inversa ( y 1 + ) . :to~n y sar mdivid.uar:o
nella ta.bellad.ei simboli e la s.ua posizione_di Jnem.or.ia-sar s_i$temata 10 cima alla pila. Anche il tok~ 1
$lf:_individua1:0 ne.ila-ra.bella. d.ei ~imholi -Ja su:a posizione di memorla s-at sis:temata in cima .alla pila.
Un~ volta che avr incontrato l,o,peratote +, I-a funzio,ne di valutazione cl.elle espressio,n i in notazione
polact inversa estrarr due valori eonsecuvi dalla pila, asseg'nandolLris.pettivamente agli operandi di
destra e di sinistra dell' OJletatore e generand.~ le isrr.uzionl-LMS

e la pQ~iz one temporanea sar sj$ternara sulla pjla. Una volta c}!e l 1 ~spress1ne sar stata valutata1
il risultato dovr essere immagazzina to in y (ovverosia, nella.-varabil~ a sinist ra di =). Di conse-guenza, la posizione te111pran:a sar cricat nell1 acclllilulatore e que St'O sar_a immagazzinato in y
o.n le istruzioni
0

07 -+2096

(l(J4ti t-empt1ra}i-eoj

02 +21'98

(ttore y)

aggiunge y al totale

~analizzata, il Dl.lllCTf'l di riga as. sar inserit-0 nella t-bella dei simboli on. il tipo L f;G:~JB la posi.zion e 09.

r is.tr.uzione

40 let t =- t + y
smlle alla.riga 30. La variabil~ t sar dunque inserit~ nella tabella dei..simboli cqn il r:ipo V e- con la
, pasizi~ne 95 di LMS. Le istruzionl seguon.o la, stessa logie.a e forn1ate. della riga 30, p~rci ~ann9
g(netar le i.struzioni 09 +2095, 10 +3098, 11 +e194) 12 -+2094, e 13 +219-5. Oss~rvate che il risultao
di t + y :sar:h assegnato alla posizioy:e te_niporaBea 94, p rima di c;!ss.ere assegn-a to a t ( 95). Ancora-una
volta, avrete notato ~e le ~eruzioni i.nserjre nllll.le p0~izioni di memoria 11 e 12 semb_rano ess:er-e
ticl.:ondainti. Di nuovo, di&utere1no di ei tra b.reye.
Cstruzione
.
-- . .

cicJ. y

un comme:nto, .peri.la rig~ 45 sar aggiunta alla tah.d la dei s_imboli eon
14 di LMS.
L ist_ruzione

LI

tipo Le eon la pos_izipne


-

s0 .gota 20

tras'ferisce il contt~llo -alla. riga 20. J.n LMS l' eti11.ivalent di got.a l'isu~jQne di sficlto ln.cond.izi,onttto
(40) che trasferisce il controilq a 11 na SP,e.iTIQa posizion~ cll LMS. Il ompilatQre ce!'ch~r dunque nella
tab{j!lla dei simboli la .rig:a 20 e .cilev-er ck corriSJ>_o nder alla po.sizi9ne 01 diLMS~ Il codice 4ell opera-zion~- '(40) sar m.oltipliato pe! 1OD e aggi:unro a;lla posiziQn.e 01 cosi da generare r i strqzione 14 +4001 .
:C istru_z.i~ne:
.

Un eommeatQ

po,s!zi~~ 15.

i!L'istruzion_
- _ --
-

l la 1:-i:ga futale d~l p.rogramma. Il n1_1n1ero d! ri~~ 99 sar immagazzina t nella rabella dej simboli con il
ti,Pi L1eton la p.os,izione 16 di LM.S. Il eom@ndo end generer l?is_rruzion~ +4300 (43 /1att.f fi LMS)1 che
sir:scri-m::a c_o me istruzione fn~e nel V(:d;ore della memoria LMS.
Questo o mpleta il _primo passaggiq del compilatore. Considereremo ota il- setndo passaggio.
Grerth~tern()..Q.el vercote f'lags i valq.r_idiversi da -1. La posizione 03 to.n tiene 60 ~ perci ii co:mpila.tqr.e
s:ap..t whe_f'isrruz.iqne 03 non co~pl~ra.. Esso irttegreia qllindi l'istr1:1Ztonce ricercando il 60 nella tabella
n~i,- simboll~ determinfl-Ildpn.e la__ sU ~ p>sizin e aggiungendo la a quella incompleta. In questo 4so, la
rcle~-i;iGa_dete~m iner che la riga 60 c9rrispndealta posizione 1,5 di LMS e, di conseguenza._, $ai: generata
Jls~m, iziq_ae cp:mple;ta. 03 '4-4215 in sostr(u2ofie di 08 +4200. A questo punto il pro~ra.mrrut scritto in
Stf~. mU~e. ~-r~
cornpilarp c9n ~uctsso.
Per -qsuuire il compila.t9re, dovrete ;eseguire. og.fi.una-(iell.e seguenti attvir!
a) Mpdifcat il simulatr' di Simpletron che avete s(;ritto nell'Eserciz:o 7 .19, in modo eh~
prenda_il Sl,l.O input da un file specifiEatO dall'utente '.(consultate il Capitolo 11}. Il cerrwi~
lator~ dovr -anche salvar i suoi risulratl in un file su d.isc:o; seguendo lo. st~s.0 f0rniato
d~ll outptJ.t ullo Shermo.
b) Modificate ralgoritm:O di COIIversione dalla notazione infIS~a qclla polaGCa inversa dell'Ese:ri:zio 12. 12,. in modo he clab.ori ope1.andt interi co.n [J' cifr:e e; operandi cgrrispon
cl.,Ilti a nomi di variat>ile fortnat i da una. sola lttera. Consiglio: p.er rndividuarce tutte le
co.stanti le-variabili di u;n espressi-one, [>!Jtt essere usata: la fi 1. n r-ion~ $trtok d.ella libre,ria
sndard, menti le cstanci di stti.tt:~ potra rano e:ssere Qn:verEe: in interi, u~and() la
fun.z ine ate i dlla libreria standRi:d.. Nota: la rappresentazioBe t_lei p,ari dell e.sp.ressipn~ in
ntazine p0La1:'a inversa.dovr.essere alterata ir:1modo da supJ:J>rtar-cr i n.orp.i di variabile e
le cos1an1:i inrere.
e), Mod'f.cafe l'algrirmf> dJ valutazione cl.elle es.pressioni in notaz.iQne polacc~ inversa in
modo che elab.ori operandi int.i con pi cifre e operanli corrisponden ti _an9m.i di variabile . r;algoritruo dlvr anche irrtple.rnentare l.a variante disus_sa in preedeynza) in modo
che sian prod-Otte l i-struzioni LMS, inv:ece di valutare .d,irett~men.te l'~pres.sione. Cnsiglio: per inividare tutte le, Co};tanci e )e V_ariabili di UD~ espressiOnf, potr ess~e usata la
funzi"n~ strtok della libreria Stand.a,rd, mentre le costanti di sttinga potr_ann.C> ssre
convertite in interi usando la funzion.e a to dcll~ libr~ria standard. N ~ta: la rappresentazione dei daci d.ll'espres'sione nnotazio.n epJila,ceainv ersa dovre_~s_;irealrerata in nid:0 da
snpportre i nomi di varia.bile e le cosr.anri intere:;.
d;) Costruite il compila_tote. lnc_orpornre le p~ci (b) e (e) cli~ valutino le espi;essini delle
strut.ioru let. Il voSI:to programma do.vi~ coftt~nere due, f_1nziooi che -seguano il pr.imo e
il secondo pa.sso del G.OID.pilat_ore. Entrambe le fi1nz.ioni ptranno richiamirne altre. per
svolgre i loro comp_iti..

srato

Vi sar.ete acco_rci in1med.iatam.e nte che_lei,auzioni LM.S semb.r_ano essere rid9ndaati. DscutereID:U di
questo era breve.
Nel mome_nto in cui J"istruz.io.ne

55 rem

.~ UH,:tstl'W:_one ili q~cput. Il numero di riga 60 sar inserito nclla tabella <lei simboli con il tipo L. e co..o
lai"_"Qs1zi~ne 15 diLMS. ln I.MS Fequivalenredi pri nt il co_dlce di 0peTazion.e 11 (r.1;.ritc). L~ posizi.oe
di t sa.:r.a r.ijeva.t~ dalla rabella dei .simboli e sar.ggillnta ,al p.rocletto tra 1Q_Oe il odice dell Qperazio11e.
gg end

(sto-te tempori_tneo)

06 +2196

45 r em

'.60 pri nt t

(t/d 1)

Il risultato dell espres_>ne. sar~ mmagazzina to in una posmon tetrtporan.ea della memoria (9.6}, con
l'iscruzione

38 r em

.LlStruzine

......

(load y)

04 ot2.0'9B
0.5 +3097

459

12

visualizza il r-isultato

e, di -0n~egu~nza. la rig~ 55 sm inserita nella t~~~lla gei ~imbqli CQ.1::1 il tip.o Le con la

_t2:..-28 ~Ottimizzare il compilaro;re di S'emplice) Qt,.1ando

Pf'-o.g ramma .sar c:ompilato e coriv~rtit


in.LMS., sar generato tm .insieme dj istruzigni. Certe-combinazioni di isrru:zioni si ripeteranno spesso,
cli sefit(l) 'in tripJer.te de~e p_r(Jciuzio.ni. Qu.es,te-sarai:u10 no~ trll!llnente- formi:e da trt': istruzioni c:;:o.me
l01tC, add. stare. Per esempio, ' 1'<1 Figur::J 12.30 n1ostta cinq4e delle istru.zioni LMS che 'Sono sta:te
~erate durante la rompll:;tziq11te ,d~l progra n1n1a nella Figura 1_2.28. Le ,prime rr istruzioni corri.U

4 .60

CAPIT.LO 12

Sj>QRdono .alla pi:o duz ione che aggiunge 1 a y , Osservare che le istruzict>.ru
0s e 07 ir:iimagzzinaq i[
1
val(l!.'~ de:ll acc-11mulato:re nella posizion.e temp.oranea 96 e poi lq ricaric{lno rruo vam
'nt:e n~Il'acwnu . .
latore; in-mode_che l'istruzione 08 'possa imm.~ziharl9 nella pqsizione 9Bi Spe_
so una produzione

s-~guita

<;iallil'i;s.truzione di t arit ain nt o .dalla sress_a posizione che ': stata ap-pen-a usata per l'im
magazzm;nent(). Qu_t,::sto C<1ldit pot r dun que essere ot rimJz_z_
ato elim inan do l~istro.zione tli immagazzin-a~
men t9 e ~udlasuss.eguent .dicaricamento che ope ran9 ~ullastessa _pJJsizione

di memoria. Lotti.nri~iazione
consent~a al Simpleu:on di esegui.t pi velomene il prgra
mrna,. poich in questa versione ci
s~an no men o i.srruzjoni. La Fgura 1-2 .31 mo stra il cocLce LMS
ou;im ina to pe r il prO;gtatnma della
Figura 12. 28, Osservat~ che nel eodie ottimizzato i sQn O qa ttto isrruz;iqni
i.O n1 no: un risparmio'

di mem.:qr.ia del 25o/o.

~4

(/O,ad)

+2098
~3097

(aqd)

06 +2.196

{store)

07 +2096

(l.oad)
(stare)

05

08 f2198

Fig ura 12.3.0 Co dic e non ottimizzato tra tto dal pt,ogramma in Fig ura 12.28.
.
Modificate l c~pilatore in modo da .offrire un' opzion~ di ottimizzaz.i0ne del codi
~-e gerre,ratQ in
Linguaggio Ma cch ina Simpl~rron. Cunfrontate ' manualmente il odice non
otti mii z;u: o e q1:i:.ello
otrimizzato e talcoh1.t la perc~~tuale di Iiduzione.
Programm~

in Sem pli ce

Posizione e
istruzione in LM S ,Descrizione

5 rem

nessun-a

10

input x

15 rem

20

.ag.g iun ge 1 a .x

~f

00 +10 99

ver ifiQ.a se y
y ;;;;: X goto e~

==

,,

il

25 rem

30 let y

incrementa y

=y

03 +42 11
-. .
nessu
rta.-

rem ign ora ta

"

04 +20 98
05 +a:0 9.7

06 +21 98
agg~iunge

40 let t

=t

45 rem.

etc.l o

y al. tota J.e,

07 +2'0 96
08 +:30 98
09 +21 96

vs

ness
una.
.
.,

60 .g oto 20

55 rem

'lii: sua lizz a il


60 pri nt t
ss nd

1 0
ri~ultato

.40.~1

n,asuna
1' 1 +119S12 +43 00.

. S.imple-tr(}n do-vr e~$ere modill.cato per incl_ugere eist.:!:uzio11e modulo.


I!)) ConS'ncite l'elva:m~J1to a p<1?tenz:a nelle isu wo ni let usai19:.o il sj.mbo1o ome
opera:tor_e
di .eJev.amento a potenza. Il Lingu.;i.&_g~o M.a:cchi.t1a Si1upletron dovr ess~re n19 difi
cato per
Includere 1,istt-U:~ione di ~lt;vamento a _potenza.
e) Coustntite al comp.ilator~ di riqnoscer~ le lettere ma\.l$C:Olee minusc-ol~ ti-elle
istruzioni di
$rnp.lice (per esempio~ I A I e~ivalerrte ad I a I ). .. N Q[l_ $ara nno n~tes'Sarie modifi
cb.e al
Simularore S-implet~.on..
.
dl) Consentite all'istru~ione inp ut di legg:re valo ri pcr va1iabili mu ltip le oril.e np
ut x, "I
No n sai;apno n:(!~$ari0e lJ'.lQdif.che al Sim ulai ore Simplerron.
e) Cons.entit: ~ eopipila-i:ore di vist1aliz.z~ v~9ci rnulc~pli in (uia .singola ~str
uzione pri nt
o.m e pri nt a, b~ c. No u saranno ne~eya.rie mo dif the l Simularore Simplet
ron .
f) Aggiungere al comp.ilacore la. capai1?-di verificare la sintassi, in modo che s.iano visu
ali.mari
dcl m~saggi,. qu~ora fossero f i,sntrati degli errr di sintassi a~'interno di ~n prgrarnrh
inli ngu agg io Semplice. Non..~~anno necessari~ modifiche al Sini:ulatore .S.imp
letron.
g) Implemen~rei vettori di int~ri. Non saranno necessarie modifiche alSimularreS
impletron..
i)' Imp lem ent ate le s.ubroyxin~ specificate dai com:n.di di s~rnplice _gosub e re~urn
. Il coma ndo gos ub passer il concrllo del programma una _s-ub rut.Iile, men
tre. il comando
ret urn lo restiruira alliisrruzione succssiva alla QOSUb . Questo meccanismo
si-m ile alla
chiamata -dif nnz ione del C. Un i stessa subrourine potr ss~re--richia.tila.ta , da mo
lte gos ub
dis.t.ribuite in c:cr.~ ilp_rqgr~ma . No n saranno richieste mod.ifiche al Simulatore Sirn
_pletron.
j) lnipl~n1e_nr:~te le strutture di itera.zio.n e secondo il f-Ormato
I"

.Cisw~uniorie for ,'rer:i d-a 2 a 10 :c on nn iucrep:im.ro di 2. La riga- n-ex t indica la frne del crpo

f or. No n sarnno richieste- modi.Pche al Simulatore Simpl~tton.

carica y ne.Il accumulatore


aggil,l.Ilge 1 .(9,7 ) ill> accumulato.re
i111m8gazzina 1'aQlmu.lator in y (96}
rem igp_orata
cu:iea t dalla locazio:ne (96)
aggunge y (99 ) all'a.ccu1n_ulat:0r:e
im.rnagaz:z:ina raccumQ.f~tore in t (96.)
rem ignorata
salta alla ppsiz,jo, n~ 0 1
1

rem1gn
.opra

v.isuallzza t (9.6-) sllo ~~.ermo .


.rer;mina l e~ecuzinne
1

Figt1ra 12.31 Il codice otti miz zat o per Il pro gra mm a della Figura 12.28.

dl

l{): Imp!emencate le strurru.re cli it~r,a+iqne sec9ndo__il form~tQ


far x = 2 tQ 10
.i tmi zion i in li:f1gu.a.ggj.o
Sem.piire
next

-'

+ 1

35 rem

legge X nella posizio_ne 99


aric:a y ( 98) nelf a.ccurnula,tore
sottra<i x (99 ) dall )atc11m11latore
se .zero, salta all posizio.ne11

next

01

r~m1 1gn9r~i

rem ignera.ta

02 +91 99

lJ..l9 (Mrodifi~ke. .al t.01rlpilatore di Se,rzpL!ceJ. Ap.po~.ate le s~.gi,i~m~ mo~che al co~11pilatore di


S~
pl)!i~. %.1'.ttm cli esse potrebbero anhe nch ied ete de.Il~ vnnaz1on1 .al S1mular0re Snn
~leuon sc:rJ.tro
nsll 'Es'Fcizio 7.19.
- -. :a). C0nsetitite l'uso dell 'opera:i:ore. modulq (9';) 11elle istnloni let . Il Lin
guaggio Machi11.a

tor x = 2 to 10,. step 2


istr1~0-ni in linguaggig Semplice

nessuna
+20'9 8

4Gi 1

hE s~ur .I QRE Pl DA TI

I~~struzion-e for itera da 2 a 10 tn


m<!rliflclie al Sim.ulatore Simplerron.
1)

utJ.

nc.rcrnento predefinito di 1. No n sa_rannp richiest~

_ .

Conser1ric al tom. ~'ilarore di elaborare l' inp ut e l'output: delle stringhe. Ci~ :ich
le~e;r l~
modifica del Simulatore smpe.tron per cn:senrirgli di elaborare e immagazzmare
i val. n
d.i tipo stringa. C@nSigl.io: og?-i parola del SitnpletrQn pot r.a es~t;re divisa in due ~ru_
ppi cb.e
ont~ngan.o un intero d. due cifre. Ogni inte ro di ,du~ ci:&e .r&jlp.r:e:~enter il valore d~cimale
ASCIT eq_uiv-alente a un arattere. Aggiung.ete un'~uuzio11e in . lin~ggio ma,ch
ina che
possa visualizzare una strin-ga cominciando da una; cert a .po~izione della memoria
de~
.Simpletron. La prit:ri:1. met della parola in queJia po~zio-o:e corrisponder al
numer.9 di
caratteri ptesent nella strtnga.(ovver,-osia? aU:i sua lunghe:a). Og ni successiva
inezz-a parola
contr_r un carattere ASCI e,spresso c()n du.e ,ifr e d.;.cimali. I:ist.ruzio:ne ilt ling
uaggj9
matGh11ia c;:anrrollera la lunghezza e visu_aliiz~r~ l"a su~ga. traduce11do ogrii nun
1.er_o di due
cii:. nel carttere cormi~pon:dente~

4.62

CAPITOL
.. O
_.

12

.tn) ,Cqnsentitt; al ,~pllii:tore di elaborar i-valori in virgola rnobile olrre aqael Ii inceri, Ai1ch~
il SifI!ukcore Simpltron dovr essere modificato per c6nsntirgli di eLabotare i valori irr
vil!gola mo.ble.
1

12.30 (\Jn interprete di Se~plic~) Uo illterpr.ete un .prograrnrna che legge un'istrzjone di un


codice scritto in UA lingoaggio di alto Uvello de1:erri1na lJpra:t.ione da eseguire per qu~ll)istrZone e
la e$e.gue immedia tfuhnt. Dunque il program ma non sar conveFriro prim Lr1 Iln.guaggio macchina.
Gli ntrpreti lavoraj)_ ]ebtainerite1 p'e rth ogni istrdzion e uiconrrara. nel pcogJ;.: rm ma, dovr prim~L

s-sre decifrata. Nel caso in cui leistruzio.ni .sian.o.tontehu.te in un ciclo, queste sa.ranno deeifra:te ogni
vlra che vetranno inconcrar ali interno del ciclo..Le prime versioni del linguaggio di progrrorn.3.Zlo~
ne B.l"i.SIC furno implementate propriel come intrptet i..
- Scrivere un inr:tprere per il Lirtguaggici S-empllt discusso nell;Es-erci:zio 12. 26. Il. pr.~gramma
dovra usare il convertit ore .da. notazione irtfssa a polacca inv~rsa) che avete sviluppJ1to nelf,Esereizio 12.12, elafunzione di valutazio ne di espressioru in Iiotazionepolaccainv~17S4, che.avetes:v.il1.1:pp,ato
nell'Esertizi 12.13, pt vallltare le esJltes<sionj di un istruz:ione .l .et. lrt que~to prpgramrnp dovranno
essete a:dottate le stesse Festrizio-n i imposte dail~Esercizio 12.26 al linguaggio Semp:Uce. V~illcate il
funzionamento dell'interprete c-O:n il :fJXOgra.mm.a in linguagg io S~mplice scritto neIJ'Es~rcizio. I2.2$.
Confron tate i -risultati ottenuti da.lP,esecuziorte IDJ'.rpretata di qLtestq. prograrnm~ e.o n ql!elli ouenuti
mediante lasua compilazione ~d esett.i2io.neton il s[mulatoi:e S.m.pletron ceso:uito .neJl'~r~izio 7.19-..
1

C APITO LO

13

Il preprocessor e
Obiet tivi

Essere in grado di nsa.t,e #incl ude per sviluppar dei programmi orposi.
Esser _in grado di usare #def ine per creare,delle macro con o senza argom-enti.
Coinptendere la oompilazione cendizionale.
Essete in ~ado di vi.sualjzz;;are i messaggi di ~rr-or~ d11r~nte la tompilaz ione
condizionale.
Fa.sere in grado di usare le asserzioni per verifitare s_e i valQri di mi esp.res~ione sono arretti.

113," 1 I n~t roduz ione

~lllesto, eapitol9 presenter~ .il preproce5sore del e che interviene prima. cl.ella comp,il@ziQne di
t{n ,program.ma. Ate.une d~lle sue pssjhili .azioni sono: l)inclusione d altri file in quello da
t:O!Ilpil-are~ la defmzi.one delle costanti simbolich~ ~ delle macro la tompi/,azione condi:zio~ale
&] c>dice del progra.mrna ~ l>t?secuzi one condizi{Jnale tf,elle direttive del pteptocesso-r. Tutte
~ ~i~f.iettiv del preprocessre in,com.inciano c:::on # e, prima cl.elle sucidtte, in una riga
w~ss-enQ 'S.serci solta,rrto dei cara.ttri di spazio bianco.
'

~I

I l.2 _La

diret tiva del prepr:ocessore # i"nclude

t. ~ 0.irettiva del prepro_


cessore #inclu de stata usata dappen utto in questo libto . Essa c;ons~te di includere in sua vece la copia di un file .specific
a.t:o. Esistono due ft>tme della
.
diittiva #i nclude.:
#in~?ude

<nome file>

~#. . i r:i 01 ud e

11

nO"me f i .l Il

~9i diff.:r~nza ua quest due -forme sta nella posizione in cui il pr~process:o:re ricercher il
~le da includere, Esso e~eguir la ricerca del file da includete nella sr~ssa directo.r y di
, qp.~llo da c.ompilare, qualora il 11ome del fle sia racchiuso tr~ vrgolette . Questo metodo
us:to normalm ente per includere i file di intest~L9ne definiti dal p:rograinmatote. La
~naf:l~a_ ~icerca sar invece eseguita in. un modo dipep..diente dalfimp lmenta zine (nor~
.rt:utlnienre i directory predefinite), qualora il nome del file si~ r:ahiuso tra le paren~esi ad
aagQ1 0 "(< e >) che spno usar~ per l fil.e di i'ntes.'tazione dl/4 libr~ria standard~
Notro:almente 1.a d.irttiva #inclu de usata p:r includere i file di intestazior1e della
libreria standatd come stdio, h e stdlib . h (n$ultat la Figura 5.6).. La direttva #io eltld.e usata anche con quei ptogramrni formati da vari file s9rge11te che dovrann o ssere:
1

~464

CAPITOLO

13

compilati insieme. 'Spes&o sar c1~e-ato e inclus.o nel ~org<;;11te un file di intestazin.e .(o heacder
file) che c::ontiene le dicl1iarazio.ni com un ai singoli -file di un programma . Esempi di simili
dicbiarazonl sono quelle delle strutnLre e delle unio:ni le enu1neta.zioru e i p1'otocipl di
funZii one.

In UNJX,j file eh~ c9mpngono un pr9gramrha s9no compilati utilizzando il comando e c.


Per t!.St-tnpio, per compilare e linkare (colle.gare) m.a in. e e square. e immettJ!t il c;p~
mando

main.c
square.c
a:I. prqmpt di ONIX. Questo oman,d o ITIOd11i il fil.e es~guibile_ aro out. Consultate i_ ma,-

~e

nuali di rifeci mento del vostro compilarore, per ottenere maggiori informazioni sulla compila:_
z:ion, il collegament (linking) e i secut.ione dei progran1mi.

e . ]n ;laa JDJtcro qn argomnti questi s:a tannQ prima rim.p iazza all'inJerno del testo di
s~s:tiff1J.Z-ine e sol9 in seguito $ar espal:isa la m..:acto: in .a ltri termini, il te$tO di sostlruziqne
~ilirl}\?.j:~zzet la lista. degli identificato ri d-egli argomen.ti all interno del programcn.a.

E:cins!detat.e la segu.en.te def11iz;i0ne di macro con un argomento per l'area. di


ftd 1e,f ine CIRC'LE_AREA(x) ( PI* (x)

7t

ttn

cerchio:

(x) )

Ja Q.\l~sisi posto del file appaia CIACLE_AREA(x) ~ il valore dix sat~ usato al posoo di
alf1nt,e,rno d-el testo di sostituzione l<l' costan:t simb,olica PI sara rimpiazzata dal su.o
1

:j(

v;llo '.e (efJriito in precedenza), e la macro sara espaasa ali iL1terno del. programma . fr
esm-p.ro., l'istrl 1zi o.11e
ar'e,;a :.. Cl R.CLE _A.REA ( 4)

i1

sm ~~~p~ n sa ill
13.3 L.a direttiv a d'el preproc essore #define :
le costanti sim boliche

~<B

La ,direttiva #def ine crea le

* ( 4 l * ( 4.) ) ;
:Qato th l'espr.essiope - foT1nat:a ~~9ltanto da cos tanti, il suo valore s.a r c~co1la,to e
~segp.at_ . alla variabile area durante la cornpilazione. Le parentesi int:erno a ogni x -?-el
trMto ;di so~titiwione, forz.eran.n o il corr,e tto ord"ne di val:utazion~ qualora l~argnmento della
.ffij~~~ drrve;se e..ser~ urt' e:s pressione. Per esempio, l'isrruzLo:ne
=

1 (

3. 1 41 59

t-1 fstanti s-inibt;,lieJJ.~ (costanti

rappresenta te da. sirn:boli) e le


1naero (operazioni definite come sim'boli) . Il fermato della d irettiva #'d ef.i ne

#def ine idcntificilto1e testtJ..di-:sostituzlo1ie

Dal momento 41 ui questa riga compare .i n u n file, tlttte le sucessive <:rctorrenze


dell~iden'tificq.tore sarannq sostituite at,ttomacicament~ dal te~to-di-:Sostituzione, prima che il
pr0gi;:arn.roa ~ia compilato. _Per es~mpio,

#define PI 3.14159
. .. ~ ~rutte Le occorrenze d:eli.a. co'Stante:Slm
. l.:louca
L . I: .
. 3.. 14159. Le
sosorw~~
PI r on queila
_ numer1.ca
co:stan-ti simboliche consentono al programma tore d at-ttibuire un n0me a una costante e
di usarlo nel resto dl programma. Qualora si avesse l~ necessit di modificare quella
>$tao.-te ln tatto il programma, si potr farlo modificand ola solwente all interno della
direttiva #aef ine. 1't\tte le qco_enze della cpstante sarann_o modjfiqte a.u_pm~atiamente,
quando il. progra1;nma .sar compilato di nuovo. Nota: /4 etJs-tarztr: si.mbalica .sar ~ostitit.it4: da
t-trtto ei che si. trovi a des_f;fa del suo notne.. Per es-empio, #def i !n e PI = 3 .1415,9 f3 r in
modo che il preptcessore sostituisca. ogn octotr:nza di p1 con = 3 . 14159. Ques-ta la
.cau_sa di molti subd0li rrori l~gici e sintattici. Un altro errore di dernire una cstanre
1

simbolica con

-ai

rea =

I RC . LE~A 1REA (a + 2.) ;

ar e.a -= ( 3 . 14 1 59 ~ ( e + .2 ) * ( e + 2 ) ) l
Qie '$M._ valutata correttamen te, poich le parhtesi teitzera.0 110 il corretto ordll1e di val1Jla~
rioJle.. Q_ualera le parent~i fossero state omes~e I espansio.n e della macro sarebbe sta~
1

area

~ s .1 41 .59

e + 2. *

e +

2~

ke .sitehbe
stata valutata storretr,ament<; come
- =
"" ~

area

=(

3.14159 * G ) + (2 * e) + 2;

a ~a.usa ~ll~ regole di prio-rita degli ope.ratori.


.B:r:ro-re fip i cp

13-. 1

Di11ie-ntica1e di rq,cchiudere tra parentsi gli argomenti delle macro nl testi{ di sostitu-

un nuovo valore.

z..t.fi:ne '
.

Bttorzq 4bitudine13.1

Usare nomi significativi p.er.Le cos/41.'tti si1nb(Jlicbe (l,'U:ter t.J. ren_


4ere rntigf}ormente autpeplir:ati1td ii'p rqKfarnma.

13.4 La direttiv a del preproc essore #define :. le macro


Una macro un'operazione gefinit~ all'intrno di una lirettlva #def i .ne dl preprocesso re.
Al pari delle- costanti simboliche~ l'i4entificatore de_lla mttcra s.ar rj_mpiazzato cl.al testo~4i
s()sldtuZ.iQ"1')11:, prima che il prQ_,g.tmrna sia com.pilato. L~ m,.aro p<D>ssQno essere d~ftnit~ o11
o senza tt/tgomenti. Una macro senza argomenti sar ~laboi:a:ta come una c ostante simboli-

ba.m'aero CIRCLE_AflEA potrebbe anbe essete definita to!Ile una. fi.inzione. Per ese.m:J?iDl e-.i rc1eArea
'fl!.l'lm:Jl eircleArea { doubl.e x)
{

retcU,rn 3 14159 * x * x;
,

ese~o~bo~ lci ste.sso calcolo della mac1~0 CIR.CLE_AREA) _(Ila .a oircleAre a srebbe a:SSo~g il. agt9. di una . ~amata di funzione. I van.ta:.ggi dBlla .m arq CI RCL"E_AREA sono che
,u~ :a iasecir il p :r oprio cadici:;' direttame11te nel programma, evitando qlJ_indi il costo di

466.

CAPI TOLO

una funzipne, e che il pirogt'amm a rester~ leggibile; pt1ch il calcolo di C.IRCLE_AR.EA sara

definito sep. ~atam.ente e avr un nom e significativo. Lo svantaggio che il suo argomento
sar~ valut ato du.e volte.

Obiettivo efficienza lq. l


A .volte, le mai:ropotrannf! essere Utilit;ztJ.teper sesti:tu~ire una chiamara di fonzio1ie ro1i un
codice in linea, prima della fifse di esecuzione. Ci eliminer il costo di unttchianza:ta difo,iziont~
Quella li s~e un~ definizione cli macro con due argom enti, pr l'area di QJl.rettangolo:
#o. fne RECTANG.L.E_AREA(x, y) ( (x)

(Y)

rec tAre a ;;;: R.ECTANGLE_ARE.A( a + 4 J b + 7');

(b+ 7) };

Il valore dell spressio~ sar valu~~o <; sar. assegjnato

alla variabile rect Area .

N orma lmen te il testo


di sostituzio
ne di una macro o di Una tosta nre simbolica- @mtto
- . --.
quello che -s~gu~ ~'identificatore nella .riga. della direttiva #def in e~ I)ovr ete imm etter e un
ba~)g,lash (\) alla.fine della riga per indi. c:ar~ cl1e il t~$to di s_
qstitu.ziq,.q.e continuer su quella
successi"\Ta, qualol'a il testo di una macr o o di una cost~te simb elica sia pj lungo della
parte restante della riga.
,

":;

L.e costa nti simbolich~ e I~ macr o poti-a n ng anche essei-e elim inate usi:l.do la
dire~iva del preprocessore #und ef. Questa "dimentica,, il nOme di una c$t_anre simbolia o
di. u.n.a. mac:;ro. La_visi.bilit/J. di u,na costante simbolica o di- una- macr
o si
- estender, dalla sua
definizione fino al punt e in cui sara stat~ dim~ticata CQn Hundef, o frno. alla -fine del file.
Una v olta dimenticato, un nom potr ess~r~ ride.finito con #def ine.
~

A volte , le fun~i9ru della libreria standard ~ono definite prop rio come macro basat su
altre funzioni
dell. librer-ia.- Una
ma.
ita comu neme nte nel file di intestazion
- ero. defia
e stdi e. h.
-

]l ,~qstr1.1ttb condizionale del preproce~s9re _piuttosto s}mile alla strut tura di selez ione
if . e.;0 npidrate il codic e di prepr.ocessore se;g uente :

Hi'f 1de"fin~d CNULL)


~#d ' ef rae

NULL 0

#errd.:i.T.

n.
.
:
.
d:.tet
tive
determineranno se NULL siast-ato clef.n i.to. :r~sp._re.ss.i.o n.e d:ef i ned ( NU~L J
~ues.te . . . .
l

il
" '-t ta 1 qualo ra NUll sia. stato deflilltb; 0, .jn caso contrario. N
caso 1n cu1
~~1~a;t"otls1a
-~ - 0 , ' ! d.e
. f 1. ned ( NU'LL. ) 5-ara valut ata 1 e NULL dovr esse.r e defin it.Q. ln caso
{eJSwt
.

. _. _ _.
.
_ . . ..
. ~ ~~ ; 0 la di,rettiva #def in.e dovr es~ere ignor ata. Ogni costr urto #.1 f term.m a con
ewuar.11 ~
. d f '" d ( . . )
.
Le
dir:ett
iv.e #.ifd ef e #i.f ndef _s~110 abbre viazi on! p,~r #i.f _ e , 1ne .- ~~r:ze -~
1
#lif 1def in ed (nom ) . Un. costr utto c:c)nd1zio..Qal7 d~ prep.rc~ssqre fo:m~~9 da p1u parti
- : .......>. '"'s.;or~ costr uito usan do l dirett ive #el.i f (l equivalente di ~lse if m un~ -strq.ttura
p@~~ . . );) ~
-.,
.
~. f) e #~else (l'equ-ival~nte di el:s e in una. strut tura i f).

:dif.
p.

.
.
sar.a' espan
sa 1n

'li:

_,. - . 1 ,,1 1 caAt. (conv ersio ne e.splicita del tipo dl dato) , s.iz.e Qf e le e.o stant i .di
.,espres
s1or;i. u . . . ~ , .
- .
.
.
.
.
_ _
' ;.;. ; 1'j\e n
- . 1 rnossono es.se;re valutate nelle direttive del preprocessore.
enUJWi~.1.3Z11.0_1 . .. 0 1 .r .
. .

~~

In qualsiasi pqsto del pregEamma appaia R.EC'TANGLE_.AREA( x, y), j valori di x e di y


sara.n.110 sostituiti nel testo di sostituzione e la macro ~ar espan sa per rimpiazzare il ptoptle n.om_
e. Per esempio, 1istruzione

rect Are a= ( (a+ 4.)

-467

13

..

#def ne getc bar( ') g.etc (sitd.in)

La de:6.nizione della macr o getc har usa la fr1nzione g.e tc per p.relevare un carat tere
dallo stream dello standard input. An.clte la funzi one putc ha.r del .file di intestazione stdi o. h

e quelle di manipolazi one q~i caratteri inclu se in ctyp e. h son.0 spesso impl emen tate come
macro. O.servate che le esptes.sioni con effetti collaterali (ovve:r.osia ~ quelle in tui i valgrj
d.ll variabili siano m.o.dific;at) n-0n dovrebbero. essere passate a 11na macr o perch i suoi
atgQ ment i potre bbero essere valut ati pi di un.a volta.
1

13.5 La cornpi.lazione con d'izionale


1

La .compilazione condizionale cQsente al progr arnm atore di c;nntt0llare t, esecu zione delle
dir:ttive del ptp rOG:e-ssore -e 1~ compilazione del ,cod.ke del prog ramm a. Ogn una delle
direttive con. diz:ion~- del preprocessore . sara valutata come wi''espres-sioe costante intera.

. Di.'.lf
- 'ante
- - .amm
-- ator'1 rrovano snes
di gran;de aiuto
lo svi1uppo ,d e,1 :PrO. gJ;ammI ~ i progr
. ..
: r ..so
_ : .. .. . . . la p<ilssJhilt di ''commentar~n larg~e pori.ioni d~ codic~) pe~ ev1ta_re che _siano ~omp~late .
da5.0 mcui il codice conte nga dei com ment t1 I * e * I non. potra nno _ess~re us~t1 per
- .te sop-o; m"a" - prog ramm atore potr eom unqu e usare il .se,gu ente costru~to del
.11;\t:es
.
JPl'(!p:t.Qeesso re:

Nel

#!!lif- 0

co.diae eh~ non deve essere comp


ilato
.#:end.i f.

'
. . .. . d. ente d ovra,. essere,
--.J.~er tonse:n.tmre
la e:ompilaz1o
. ne. del
. c9dic
-- e~.
. lo
0 del costr utto prece
.
ri~mpiazzat da un 1 .

qmpilazione .condizionale usata com-0:nem~nU:: co~e un ~.to d~nte la rn8sa: a


' .. _$ 0 del software' (.deb ugg~ng). Molte implernen.tazl?nt .d_
el. e fo:nlS COflO dei deb~~erJ m~
~
i da
li

usati raramente ~ ... ..J~ srudent1


ql(esti son.J spe$SO difficil
~ uri zzare e: capir~, p~rc1 . son0
.~~
tit1i 00 corso di prog:i::~mai.ione ~lementar . Per v1su~1zzare_ 1 ~aloo. delle vanab1l1 e conv a
~dg.re, il fltfsso di conrrol]Q> si usa,n_o piuqosto delle 1struz1oru pr1n tf Q~este potra .nno
~;ste racchiuse in direttive condizionali d~l preproces~ore, 41 m,9do ~he siano cmp1late
~ltanto fncb. nn sat stata comp letata la messa a punt o. P{,:r sempLQ1
1

.....

_#_.

t1i 'ftlef

:o'EBUG

printf( 11 Vari abil e X = %d\n ", X);

,fe:riai f
{~ ~ che l'istruzione p.rn tf sia compilata con 11 programma.,. g_~,pta ~a ~ostante sinioo-
licGa DEBUG sia. stata :definita (#de fine DEBUG) prima della dlrett1v~ #1fd ef DEBUG. La
ffire.ttiva #de.f .i ne pon ~ser~ rimo~sa dal file sor~cnt~ un~. volta~~~ .la -~essa ~ pWl~o
~r. stat~ compltata, eosl che le istruzioni ~r~ntf 1nse:it: per q~~~~ scop.o ~1an? 1gno_ra:te.
aur~ot~ l_a. ompil;iZibn. Nei p.rogrammi. pt co.rpOS!, e_?refeiiliil~ defin ire In .sez~on1
Q.U.~t~ del frle sor,gente le varie costanti simboliche che controlle(a.nno la cornpilaziop.e
~nfi ;i r~ionale.

CAPITeJLO

Etrdre

u
p
.

'

13

ii:o 13 2
--

lns~1~re ~~lle i~~uzil].ni .pr int f compilate condiz~q .nat-am~ntcper k:t'rnessaa punto. in
poszzt~n1 in. Ctf/l il 1'lc_hieda generatmente '.UJl.t(:t singola istruzione. In questi. casi, l 'istruzi,o ne
co."tp_zlattf. ~n mo.dQ con..dizt'onale dovr. essere inctusa in-itna; t{)mpostd, cos eh.e il fiussp
con~ro~lo del progra:rnmanon risitlti alterato, quand il todiee-sar compilato tt/n lt:
itttuzzon't per La messa a p1mto.

1t

13.~ ~ dir ett ive del pr ep ro ce sso re

#e rro r e #p ra gm a

La direttiva #er rar


.#e rro r toke1i

visu~~zza.. ~~essagg:id9 . Jf-pendeme dalrimp1men:tazio.tte_, che in.cltrdet i tok-en (simboli)


s_p~c~. ea_t1 . _m tem o ,ea direttiva. I to.ken son 6 sequenze di cara tter i separati da
spazi.
Per esem pio

#er rar 1 - Out of ran g.e err ar


c~nci~n sei rok en. Per esm pio qu and-o nel l3nan.d C++ p~ i p sar elaborat
a una
d.1rettiva #er ror i suo i qkn ~aranno vis~u_alizr.p.:ti cotn e un me~saggio di errore, llelabo.
raztof ie del prep roce ss.Qre s.~ inte rrot ra e il pro,grarrtla non sar c:tnpllato.

La direttiv_a #pr agm a


#pr agma

469
#ata;,f ine tOKENCO ,NCAT ( x., y) x #-# y
Nel pu-nto d.e.l programma. in ct apparir TOKE'NCONCAT i su oi arg ome nti satanr10

~W1tc:af~nat:i e usati per sosrimi~e la mac ro. Per esem pio . TOKENCONCAT (O,
mila: B.-~1 pro gra mm a da OK. l:operarore ## dovr avere dtie operandi.

13.8 I numeri .di riga


Tua :J/ilre'tti.1/4 delpreprtJcessore #1.i n e. consente di assegnare una nuov_a n11merazione alle
mgb suece:s:sve d,i l od ice sorgente:, pr teti d ,d a un valo re Gos tant e inte~ro spe cifi
cato .

ia ,lire -t.iva
#"l:in
e 1 0'0
=
{aJ;a patt lre da 100 la num eraz ione dell a riga ~ucess\va del coie sorg ente . Nel la dire
ttiv a
#l;it,ne p,uQ anche ssere incl uso un nome .di ftlt~. La dire ttiv a

W
(l.tn' e 1-.0 0 "fi le1 . e
j;u.d!i:a ,clie lenghe ,sucessive del cod ice sotg entc sara 1i) no numera.r~ cq1 ninc iand o d=a 100
e
k-e tl _.m:Qme del frle utiliz_ta,to da rutt i i messaggi del compilatore dovra essere u f~ile1 e it.
La dilii:~triva e usata1 notm- alrn~nte, p~ aiutare .a rendere pi s'gniflc.ativi i messaggi pre dp -. - clag~i . et.rari cli sintas.si e dai warning (avverriro~ti) del compilatore. I nun teri -dl rga
i,gn o.a jpar iran no nel file sorge-1.1te.
11

l~.-9 Le costanti sim bo lic he predefinite

tokcn

pr~y~ca un,azione de.finita dall;implemetJJ~azi0ne. Una drettiv:a #pr a.gma non


ricbnsciuta
dall 'tm-plementazione sar igno rata . Per esmpi, il Bo,rland C++ riconosc~ mol te dire
ttiv e
#p ~agili a che C~nsentno al prtrgrarillil:uirn cii Otte nere il mas sim o van tagg io diiil
a sud detta Jmp lem enta zi:o e. P~r ottener~ mag_giori inform:azjoni su #e rra r e #pragma, e;:ons1ilta:te
.la dcumerrtaziQne dell~ v-ostra ir.npl~_mentazione dd

e.

~.&is,FOI).0 cmque costanti siin-boliche:ptedefinite (Bg ura f3.1). Gli iden tific atp di ognuna
c1Gl1 e:astant-i oSi tn bol ih e pre def i n i:t;e com inc ian o e term ina no eon .due car atte ri di
tiltoc6llneatut.a. Que sti iden tifi.catoL.i, insi eme a qull9 Clef in ed (usa to nella Sez ione 13.5),

~o:n p0aanrro essete usati nelle dire ttiv e #de fin e e #un def .

Cestarite sim bol ica


~

13 .7 Gli operatori # e

##

#d fin e HE LLO (x) pri ntf ( !' He llo,

" #x

11

J 0-hn Il

11

--

\nu );

N~l pun t9 9.el programn1(:1 in cui app arir a HELLO ,(Joh n )", q_uesto sar
I!

-J

lilNE

91i ~p~rator.i # e# # dl preptocssot sono di~ponibili soltanto iJi AN SI C. 11op~ratoxe #


f~ sl che un_tol~n del test o dl ~Qtituzin-e sia cqn ver tit0 ir1 un~ str:i11gp. rac hi_usa
tra
vugoletce. Cons;id~ate la seguente defniz.ion: di m~cro:

p.r i tltf ( 11 :H ello ,

K) sar sost i-

espansa in

n!! l ;

_L~ :str~gq, i! J 0 tl n IL rim piaz zer #x n~l .tes_to di sostitu:ziane. Le stringhe separate
da spazi
~ian_c~ sai:anno. con cate nate dur ante l'elaborazione del preptoceS'S:ore; per-ci l~ st1d
d~tta
rs-tr.uzione e eqwvale11te a

!Tll E-

- sro.c-:-

Spi.e ,g azio ne

11 n.11roe:ro di linea d~Ll<:t, riga corrent: n~1 codice srg ente (una
cns tante intera).
Il nom e preslliltO d~l file s_grgente- .(una stringa).
La da~ fil cui il file sorg<;nte st! toropilato (una stringa ne.lformatQ jMmm gg aaaa nie in 11 Gen 1'9 199 1 11 ) .
[;or a in cui i( file S.brg~nte stato compilato (una Stri nga _letterale
nel fom1at6 11 hh : mm: ss 11 ) .
-

La costante intera 1. definita pe:r indiGtre che l~implepi~ntlqn~


~ompatibile cn l'ANSI .

pri ntf (."'H -ll o, Joh n\n .. );

'?~se~~~e che ~ 1 ~-~-~rat6r_ # .dovr e$se:r.e us.a~o in una macro con argom.enti,. poich l~ope:=
ran do di # pun ta ~ un ar~om en.tQ della..stes,s~.

I.:operat:o.re li'# co11cat~-n:a due toke:p_. Considerate la seguente definizione di macro:

figQ ra 13. I Le cost anti simboliche predefinite.

13.10

Le asserzioni

La ma-_11q as-s e rt~ de.finita nel file di intest-azione a.s se rt ~ h, con trl la il valore di u.n, espressione
.
Qti!lg:ra_l va.19re di qull~ sia 0 (fal~io}, ass ert visualizzer un mc;:ssaggio di- e.rrore
e
'b1~e.r la funzione abo rt (d,eilalibreria di utilit _gen eric he std l ib. h), per term inar e

470

CAPITOLO

471

1.3

l'esec::uzione del pro:gramm-a. Questo t.in utile stru men ta di meScsa a pun to del software,
che cons ente dl conttoliar se una Va.ria.bile cqnt iene un valo re cotr etto . Per esemp~o )
s.u ppo nete cl1e in un pr9 g~.nlma la variabile x non de.bba mai ess.ere maggiore di 1 0.
easserzione pqt;r esSe!"e U$3,ta peJ COilUoilare il valo re di X e visualizzare un messaggio di
errore .qualora il valore di x non sia eorretto. L istruzione dovrebbe essere:
ass ert( x <= 10) ;

ne common h h .
lla. stj;.""a
di.re
-:l'ud
"te
il
file
di
intes
tazio
e
.
e
si
rrov.a
ne
~
.crery
- . di quell
- -o da
) ln~

ccompil.ate.

.
fiL
- dr
il
~-A_
seg~
n
ate
una
nup:v
a
uum
er_
a
zon
;:
alle
rinia
.nenr
i
r1
,
g
he
del
e, mcc;)IIllnGian. o con
d_\
n:,
.
. :
num eo 3000 .
.
-. .
. . d f ie\ Nel caso -in cfil's_ia gi stata defin itala cOstflte sin:bolica T~UE
. runuo~~J:e la sua _ e 1.ruzione
1

-1=b"1.a. i'l Va.Lv


,.l,....re 1 Non
11cate #1f def.
e de&aitela .n..uovam.:er.11;.e m
mo d._o <::: he a1J
.
~
.
_ . _ _
:iii.. N ..} . . Ln cui sia O".i.stata defi n ira l 0stan te sinrbollt'a.TRU E, r1.m uoye re la su.?- 9.efniz1~ne
U.J
e caso . . - tr
.
- 'al
tiva del
rocessore
e defin
itela n~vameQ.te in.
mod o che.abl:..
.ola v ore.1 . 1J- sa.t e la diret
. - . t:nrep
_- .
1

Nl a,~o in cui x sia maggiore di 10 quando l'istrllZ:q.ne greceq~nte ve1:r iaE:ontrata: in


nn p:rogramro.a, sar visualizzato un messaggio li errore ontenente il- numero di riga e il
nom e del file, e l>secuzione del programma sar inte.rrocca. A questo pun to, per cercar~
l~errore, il pr0g ram mat re potr concentrar.si su ques ta zona del c,a dice. -Nel ca.so in ti sia

.
.- b -u~ TRUE non sia ug uale a 0 aefinite la cq~tant simbolica
-J Nel -c.as:o in cw. la costa
nte ~lID o ""~
g FALS d .- .L. bbi". il- v- 0- re 0 In caso cont rario , defin ite .FALSE m mod~ o he abb.aa
E in mo o u.1e a
a.i
-

,
', #!iif.def. .

il valore 1.

13.2
13.3

~rintf ("_L lNE_ = %d\n~, -~lNE~) . ;

prir: itf("_ FlLE _ = %(1\n"' _F.I LE_ );


prin tf ( 11_pA TE_ =%:1\n ~ 1 _DATE_ );
prin t'f( 1_ TlME _ = %d\nl' ' _TIM E_);
.-. n''L.I
.kf' .(t i __;_'3C"'"""'
.
= %d \ n"2 - STDC
);
pr:L
I L.l\.J~
.
}

--

Scrivete .un prgtamma che v:.isualizz_i i valori de.ile qs:rant1 simboliche pr:edefinite elencate
Scrivete una diretriv.a del prt!pricesspre che svqlga ognu np dei sgue~ f:mpiEi~

a) Def.init-e la c:osrante simbolica YE.S in roodo che abbia il valore 1 .


b) !>.efmitela cosrante .sim~lica NO in m9dg he abbia il valore 0.

..

valo ri d.e lle macro pred efini te .,./

,main()

poss ono comparire in -una riga, prima di ua direr-

nella Figu ra 13. l

,#inclu.d_e <$td io. h,.

cre_a clelle macr e delle tsta nti simboliche.

,r.

~) # b)#eli f

* v_isua lizz.a re
1-3. 2 './r
. -

elimip:a i nomi delle oostana Simboliche e delle macro.


f)_ Le diret;~ive
e
sono foi:nit com e nta iion e ahb~eviaca per
#if defi ned( nom e) e#if ldef'i .nedC-nome).
g) La
eonsente al progr:an1matote di controllare l'esecuzione delle direttive del
pteproce_ss_ore ~la cp.mpilazio1l.e el codice dd_progtaro:ma.
h) L macr9
-visualizza un me$saggio e terminer 1' esecuzio-ne del programmf!:,
qual ora l valo,re-deU) e~pres~ione valu tata dalla macro sia zet.
) La direttiva
ins~P.s_ce un. file in un altro.
j) ~ oprarore
coqcat!na i suoi .due argomen.ri .
k) :rop.erator
_co.n.vne il suo operando in una stringa.
1) Il carattere
indica ehe 1 testo di sostituziO-fte di una ostance simbolica o di
uria macr o cont inue r sulla riga ~uccessiva,
m} La clirettv
c()nente di as~egnare una nuQva num,er.az.ione alle righe,successive dl codic sorgente_, p~tendo da.l -valo.i:e sp.eci.ncat-0.

#els e. -e) #def ine. d.) spazi l?ianchi. e).. #undef . f) #if1d ef , #ifn def. g) CoIDI?ilione
=J.'.J - . _1
.

eaa;cliziqn~e_, h) asse rt:. i) #hc lude . j) ##. k) #. 1) \ m ) #1ime


.

Riernplte ,.gli.spazi vuoti i.o. ognuna delle seguenti rigl1e:


a) Ogn i diretti-va del preprocessore d&e com incia te con
.
b) Il_costr utto d~lia comp.ilaz.i<Jn.e mn.dizionale pu essere,estes. per o.ntrollar:e casi .m ultip li,
u_sando .le di;rerrive
e
.
e) La direttiva
d) So!_~n:r;o dei cara,1;Eeci d,i
civa lel pteprqC;esSQrt:Z.
e) La direttiv~

; isp ost agli esercizi di aut1>valutaziooe


lJ. 1

1.3 .1

'

. J!
.
j .
l
'Cro dovr-
h) Definite la macrq SQU.AR.E_VOLUME che calcoli il vol
ume~ un q_.:i:ur'1to . a ma
aG:cettare un a:r::gomenro.

#d.e f ine NDE.B:UG

Eser.cizi di au tov alu taz ion e

u:i.

stata dfnifa la e.ostante simboli~ NDEBUG, le asserzioni successive saranno igntate. Per
l)i dovrete inserire nel prog.1:a m ma la riga
quan do le m:;s,erzioni non saranno pi necessare, pjt~osto che qancellare man uahn ente

ogru assen.1one.

113-:3

a). #def ine YES 1

b) #d.e fine NO 0
t~

#include 11c:orrmon . hn
d) #Une 3000
e) #f defineq {TRUI;)
#undef lRUE

#def ine TB1JE 1


#end if

f) #ifd f (TRUE)
#und~f

TRUE

#define TRUE 1

#endif

g) ,f#if TRUE
#def ine F.ALSE 0

CAPI TOLO

13

#el~

#def . ne FALSE

CA
PIT
OLO

#endif
h) #de:fine SOL!ARE_VQLUME(x) (x} * {x)

* (.)()

13.4 . ~~~vete tm?rogra:n~~a dr defi~isca una macro cn a]l argmntb per ,aJcolareil volum~ di
~~ sfer~. _Il programma dovra calcolare il volum.e per sfere dj ragg.io comp.i;eso tra 1 e 1Oe :vis.illzzar@
t nsult an m fo:rmaro taaulate. La form ula per ii volum e di una sfera .;
.

( 4 r~) ~

dove
13."5

'lt

~SJimiam.o

O bie ttiv i

* rs

Et,r 1t un valo.re di 3.141'59 .

Scrivete.e un programm~ che p.r9du.ca l'output- sc:guente::

Il prc{gramrn a dovr de6nire la macro .sUM e0 n d ne a.rgo.


m,enu, x e y,
e u tili
. Z#are SUM
per p rodur1e

Olit.p Ut .

--

Scri:v~t~ ttn ~rogramma ~1.e ~tilizi la- ,P1<l~ro MINIMUM2, per determinar{!; .il gi pic:ol0: ra oue
valori numer1c1 c}ie saranno presi rn mpi;rt d_alla t.asri~a.
- 1!3 .6.

Ess~re in grado di rdirezio.Iia:r.e l' outp.u t dello scher mo in ID:o-clo che sia salvato in un
Essere in grado <U scrivere ft1nzioni he utilizzino :elenchi variabili di argm enti .

&sere m grado di elaborare gli argomenti della riga di oman:clo .


Essere in grado cli assegnare specifici tipi d dato alle costa nti numeriche .
.E.'ssere in grad9 di ~~ i file temp orane i.
Essere in grad9 di elaborare ~nti inartsi in un ptogr anun a11~

. cacnente ]a memor1aue
. ,J 1ve.

~ser
emgt
ado di
all
. ocate din
:am.1
t ton.E.sser mgnidodi mQdi:ficarela dimensione della.memoria all0cata prece dente ment e in

13 7 ~ ~crivete un pr~gr~ c~e usi la macro MIN:IMUM3 per d.eterm i n.ar il pi piccolo fra a.e valoci
~um~r1c1. P;r de~~~are il nume ro pili piccolo, la .suddc;tta dovr upli;z.ria:te la maro MINIMUM2
defin rta nell Eserc1z10 l~.6. Prendete i valori in inp\lt dall;i. tatie ra..
.

13.8

E~sere in grado_di redirezioriare l'inp ut della tastiera in mp<9 che provenga da unfl,e.

file.

A rgoment1 avanzati

Eserciz:i

..

14

mado dinam ico,

Striv:ete LLn pro.bo-ran1rha che usi


la m "'a.cro
. 1N

. . . ,.<l'"e un v-aLore di
PR
T pe,.
~ Vl
.,.s.ual;
..~ apo
sa:ing
'"""""-'
a.

13.9_ Srive: un progr amm a che usi la macro PRI'NTARRAV per vis-ualizzare un_ vetore di intri. La
macro dovr rlcvei:e come:: argom enti il vettor e il num ro di sui elemen.
.
~3 .1 O Scriv'te un.,pr0gramma clie usi la matro SUMARRAV per somm ar i-valori di un vetto re nume nco. La macro dovr ricevete c0melargf]ni.enti il vettore' e il numero dei suoi ~elementi. --- , . .

14. I lntr odu.zione


Q,uesfo

ta:ri

ft~i

a~itolo

prese nter diversi ar{goi,nenci avanz.;ari che non sono. gene ralm ente affroncorsi introduttivi. Molt e delle ca.p.ae::it discu sse qi sono specifiche di un parti co-

~are 'sistema. opetativo, specialm~nte di UNIX e/o del DCJ.s..

14,:2 Redirezionare l'input/ou~put su sistemi, UN IX e DO S

N' Of~t~te l,inp ut di un. prog ramm a pr9vip.e .dalla rastieta o(lo stand ar inp.u t), n1ep.tte
il s:aY> o:ut:p-t vi$ualiizat sullo scher.roo (lo stand ard ~tput). St1lla n1ggt<)t p.arte dei
s:is:temi di com putr , in p9-rricolare su UNI X e DQS, possib.ile redirezionate l'inp ut .in

,mod he pr11enga d,a un file, mrce che dalla tastiera, e redirezioJJ.<!C l'out put in modo

che si riversato in un file, ipvec e che sull.o:schetroo . Entra mbe le form e di r~direzionamento

R9~sQnO :sscere eseguite senza .usare le capacit Cii elaborazione dei file fomite dall4 lib~r.eria.
,st-ate1df;l.'f:d.

Esst,:l'no molt i modi di rediteziona.re l'input e l'o_utpu t d.lla riga di coma ndo di UNI X.

L;g:nsid.erate il file esegy.ibile sum che, finch non sar stat9 ir:npostarQ l'indica.tote di fine
':file, . Ptgndet~ in i.npuc uno ,per vola degli inter i, conse rver il totale o)Iente dci valori e
irqfrne v:is11alizzet. .il risultaro. N.onnalrnent~ l'utente 1~s.erirebbe gli interi dalla t~tir e
~remer.ebbe ..la co.rribjn.azione 4i tasti per l'indic~tore di fine flJ pet comu nicar e he rron
s~anno digit~ci ult-riori valJri. Con il redire_z.io.na.ntento dell'input questo p0rr. essere

CAPJT()LQ

474

~~~zinat:o in un file. Per 'esempio, qualora i dati siano D)JJJJ)gazzin.ati Qel


la. riga di comando
,

475

14
Q.rlmer0. variabile di argomenti. Il priJ10 ar.gc1me]Ito di .ave r:a ge sar sempre_ il

file input.~

$. sum < in P.Ut

v~ri di cui cilcolru:e, la melia.

ldentifiatore

determiner llesecuzione cl& programm:a s um. Il simhalo .di redireziotramento ,dell'iriput (<)
indiea ~e- il pro.~am:nado1v_r utiljz,za~e ~ Clatj -~l fil~ ,input:. Ilredir~6tiani 1nt0 aell'mput
S.U un. slstema DOS e esezuito allo s.tes.s.p modo.
_ _ Osserv.ate' the il simbolo $ il ptompt della riga d~ coman.dq in_ UNIX (alct.Jn sis_(emi
~.usano per ii prompt il simb~lo: '\ )., Gli studenti trovano 5p,esso dlffiil~ capire che il
regu:e:zxo.nam~JJtO una funzione dl siste'ma 0perativ0 _non un'altra oaratteriscia del C.

ru

11 se.,ond.o nieiod(j) redirtlon_aroenro dell~input ilpiping(cottvogliare in - tubaziorri);


Un .Pife. {/) fa in modo c_he rou.tpu.t di un programma s;f!: reditezionato n.elrinput di un
altro . Supp_onete ehe il programma randO!D vs1Jalizzi una serie cli val:ri inte-ri c.asuali
l'~tput di random potr essere "conwgliato" direrrameptc al pro~~; sum usando la

Via _s ta.r t

v.a=-

a.rg,

- -

$ ra.ndom : s um

Qu(:St dete:rrM:cr~ il tal-9lo de]~a soi.Iil:q a degli interi prodotti da. rand'am. Il piping pu
essere eseguito s1a ID UNIX che m oos~
.

va end

:L~ Utp.11t .cli. Lll1 p, r:ogr:am@a pu' e_.ssere redireziQrui.to


un file_, ti.san.d o il
simbolo dt' redirzionamcnto dell.b-u-pput (>) (in UNIX e in DOS : utilizzato 10 stsso simb,o~
L9).. Per ~mpjo, _per tedirezion.are l;o.utpt1t del programma r .andOIJ'I al file !out , --us~;;ete .
1

$ random ; :. out

di un,?rogrannna?. ih_fi_i:, pu. esse,re attoda'.to .alla fine di u,o file gi .esiste_n te
usand() il simholr; di acodamentq dell'iJu'tp:u t (>>) (in UNIX e in Dos. utUizzato lo stesso
s'imb:o.lo) . Pe:r esempio, per accodare ],outp11t del progrm.n1a ra.ndom al file out creato 0011
la riga di comando p. reeedente~, use11et:eLO~tp~

!'

il'

14.3 Gli elenchi. var'iabil~i di arg,omenti

pQ$.sibil c.reare c:).elle funtjoni che ricevono uin numero .n,on specificato di argomenti. 1n
questQ tes~o , , la .maggio_r- part di. p"rq_gramm ha utilizzato la funzione dellalibreria standard.
printf h.e, c_ome sapet~, accetta un nu;J,tlero ~ri_::ibil di argmepti. L fun:zione printf
deve almen0 ricevere c:ome su.o primo argomento una srrin.ga., 1xta .Pou:ebbe anch: ricevre
un qualsiai numero di argomenti .aggiuntivi. Il pr~totipo ,ddl~ fun.zione printf

i .nt

pr . ~nt-f(const

Spiegazione

Un tipoadatto a conten.~i;e le informazioni necess~arie alle macro


va_s-t art, v.a _arg e va.~e11d. Per ac:.edre agli elementi di
un ele_n_o varibile di a:rg0menti, dovr e_$sei:e di&.iarato un
oggettCJ di tip va_list.
Una macr:o: che sar invoata prima che si pes.s-a ac.edere agli
lementi di- Ull elenc_o variabile di argomenti. La macro
nraializ_ier.lo_ggen:o dichiaratp on, va......;,l i'.S t in mo.do c:he pQss.a
~~sere usa.t dalle macro va_arg e va_en.d.
Utt .QJ.a.G:fQ che Si espander ID un' eS'flI~.SlOt"Ie dcl -valoi:tt :del
tipo corrispoade.nte all' el~mento .sLtccessivo, di un elenc() v~ria:
~il d1 argomenti. Ogni invocazion@ id i va_.a.rg1modillh~r
1~ gggtto d:ihiara:to c;on va_li st in mod.o he p-ossa puntare al
pros.sir1Jo ~:g-omento dell''elenof>.
Una macro
.
- che
- fciliter: un normaLe ritorno da una funt.ione il
cui elenco variabile cli argomenti stato pu:nta.tp d~lla_ macro1
va- start.

riga&: cqmando UNIX

num~rQ d.ei

.oliar *form:a t,

.. );

'

Bllissi ( , ,~ . ) n~ p rtbcipo della funzio.ne indie.a a.ppunto che questa riceve un numero
vari~bil~ di ~go_qienti 4jj ogpi tipo . 0Sseniat@ .che l'' ellis~i dve esS'ere: posta sempre alla fine
1

dell'elencQ ~gli argq:ienri.


. . Len:iacro :e le deii nizion in,clu-se nel file di intes:fil.zione per gli arjo'menti .variabili:s tdarg . h
(figura 14. I) fornisco.no i mezzi necessari per e.o struire delle funzioni con elnchi variabili
di ar~,mnti'. Il programma della Fig.uta 14.2 mostra la funzione averagf,t che ri~vei ~n

,_

_.

fii,gura 14.1 I tipi di dato e le macro definiti nel fUe di intestazion~e st-da rg . 'h

1..afunzie,ne ave.rage usl~~ rutteledefinizioni e;le 111aro del file di intestazione.s;td.a.r g . h.


_p,,gg:etto ap di tip,o va.:..l.i st sar usato dalle maci;Q va_start, va~arg e va_end p~r
~Q.0Jar~ elenco variabile degli ac:gomenci della funzione avera.ge. Qus-ta inco.roinei;
.Jn:v<r><?W4 la rpacro v-a_.s tart pe-.r inizialitzare l,o:ggetto ap cos_he pos$a essere usato da
v..a_a.rg e \i'a.,...:end. La macro ricever-,due d.ati: I)ggeno ap e-l'id.enrif.cat_Q;r dell'argornehtto p1i.a-dStra che prece.da. l'ellissi nell'elenc;o degli argc;imenti, in questo'. caS-O i (v~_strt.
1~~r i. per determinare lgve incomincer .relenc9 variabile degli -atgomenti}. In s:egul,t~,
Jii~ione averag,e aggiunger~ ripetutamente a total gJi elm~riti dell'elenco vari~tbile
dc!g~ ~go!Ilefiti. 11 valore che d.ovr' ~:sser~ aggiunto a tot.al . $ar r~cnperato dall'elenco
<d:(gfu-argpm~nti i~vocand.o la macro va_arg . Questa ricever due a,i:gor.nent; l'qggetco ap
~&: tipn-di dato pe_r: il valore atteso nell'eleno_degli argomenti dou.b le in quest ca_s_o. L-a
mabn@_EeStituir il va!Qre .q~tl,;afgomentO. La.fi.Jnzion:e aver age inv_oGher la macro va_end,
.s:fido come arg.o.mento_ l'o,ggtto ap, per fa~ilitare un norfil~e ritrno da average a
rtlai:h,. 1tifme,, la media sar ciiicol~ta e rstirl1ta a m:a in.

Errre t~p_ico 14.1


Pofii;,io1za_reun"eilissi i:n !meMo all~elenco degli' argome-nti di ut'la funzione. L'eltissipu
sser ir1$eri.f:a $.(Jltanto alla_fine delleiene() .degli q.rgomrmti.

1li l:t2ttme potrebhE:: chiedersi in che m0do J-e funzjoni pr.i ntf e saanf: possano conoseete. il tipo di '.dato da usare,. in QgiV- invocazione clella macro va_arg. La risposta <:be
) r-lotf S',a_'n f - per deterrnin,ate il tipo dl prossimo ar.g<lmento da daborar,e, esaminano
~ !4lwc.at9~i .di conversione inseriti nella s_tringa pr il conttollo del Eormat .

CA PI TO L( )
1~

usar:e: gl i el en ch i. v,ar1 ab1


i -1 di ' a.r g0 m e1 tti

*/

I4

IA .4 U .s a re gli argomenti del,1.a ri g a di


i com a n d o

Su inlti

11in cl ud e <s tc tio . h>

$istmi D O S

e U N IX in

pa rd t la re PosAfbile passare degli argornen


ci dalhi
riga di comando alla funziqne main, includendo in t
ar gc e ch ar rg v [] nell'elenco

#inclt,.1fe <s td,a rg .. n~

clouble av er ag e( in t,

il!

d~i ~menti di main. Il parametro ar gc rici:v il numer de

,,

m ai n( )
{

gli argomenti presenti sulla


riga <li eomando. Il par;urrerro ar gv e un vettore di
stringhe ne! qule saranno inrniigaZ'Zitl'ii gli argomenti della riga di ca m an do corre
nte. Tra gli- usi co m un i degli ~omenti sulla
iig- .l di comando, ricordiamo la visualizzazione degli ste$
e il pa
s<aggie di opzioni e no m i
.
'
di file al programma.
li prognnma della Figura HL~ copier un file in un
altro , un .:11rattere per vi:1lta. Il file
eseguibile dd progWl'IJB-a sar chiamati'> copy. U
na tipica ri!!f!. di comando per il programMa co,py stl un sistema U N IX sa ra
.

doubie w = 37 .5 ,

~ =

2 2. s, y

= 1 . 7 , z = 10 . 2.;

P ri n t f ( (( %s-%'. 1"f \ ,n%- s% 1 f ..\ n-'9~s


=' . g.,.
.o 1f \- n9o.. s'* 1 f \ n \ n ))
"W = ' w, n X .
. X ' ny = " y
'
.
.
uz -- "
,
.
,
J'
O

Il

p ri n tf

11

(<~ %s%.3f\n%s%.3f\n'%s'k. 3f \- n
The v er ag e of w a.nd x is u
ave~~g{2, w x),
'
.

Go

'

,)),,

11

'Th e .av- e ra ge of w, x, and y is ,


av et ag e( 3, w, x, y) ,
11

re tu rn
}

a
~ nd
-

z l s

$ copy in pu t ou tp ut

Questa riga di ooman:do indica che il file in pu t


dav: essere riopl'!to acl file ou tp ut .
/'* U sa re gl i ar go m en ti de ll a ri ga di
omando *I
#: in cl ud e. <s tdie . h>

The average. of
IA _ x
y
~ '
J
'
av er ag e( 4, w, x, y, z) )i

z) ;.

<i: J

m ai n( in t ar gc , ch ar *a rg v[ l)
{

'

FILE *i nF il eP tr i

~outfilePtr;

in t e;

d. . '.O Ub- }_- e a wve r a.ge ( in- t ,

doLlble to ta ! - 0
'
in t J. '
va _l is t ap ;,
'

va._ s.t ar t ( ap, i) ;

if

( a rg.e l= 3 )
pr in tf (i lJ sa ge : co py. iA f il e ou tf il e'\n 11
)

. ls ,e

if

( ( in Fi le Pt r = fo pe.n (a rg v [ 11

if ( (o ut-F il eP tr

w hi le { (e

f O.'r ( j = 1 ; j <= :l; j ++)i

fputc(e~

t.o ta .l += va _a rg (.ap, do ub le );
va_en,d ( ~P) ;.

1,

il

r 11 ')) ! = NULL)

= fo pe n{ ar gv l2 ], , w
1

11
)}

1= NU Ll )

fg et c { in Fi le Pt r) } l-= EQF)

ou tF il eP tr );

el se

pr in tf ( 11 Fi le \"%-s\ u co ul d no t b: ~ op
en ed \n 11 , a.rgcv [2 ]) ';

re tu rn tIDtal f i;
}

el se

p. ri nt f( 11 F'i le \ 11 % s\ 11 co Ul- 'd no t be op e


n ed \.n ", a,r g'V [1 ]) ,;

re tu ,rn 0;

Figura. 14.3

Figu,ra 14.2 Usare g,fi el'nch,i var1abUi d.i argom


enti.

Usare gli argom ,enti della riga di comando.

Con llesecuzione d~l programma, se argc no n 3 {c


opy to nt a ct>m primo argomentd),. il programma visualimi;r un messaggio di errore
e t~n:iner la propria eseCl;IZione. in
:So d nt ta rio , il ve tto re ar gv co nt er r l~ srri
ngh~ '<opy' ) ,.~input,, e ''output'',, Il sebn.do, e
il irz.~ ar go m en t della riga di comando saralloo us at
i dal progr~mma crune ao m i di fil~.
Questi s:rranno ::ipi}rti milizmndo fu funzione fopen. N
el caso in .cui ennambi i file ~iaiw

47'8

CAPITOLO

479

14

stati aperti con sucesso, i caratteri sa:ranno letti, da input e 'Scritti nel file o.u tput, finch nd
prin10 nqn verr incon trato 1i11diGatore di fine fil~ . A questo p.unto terminer I esecuzione
del programma. Il ris.ulra.ro sar una copia -esatta del fil~ input. Os.i;;ervate h non tutti i
sistemi di cmpHter supportan9 gli argomenti d~lla riga di cpman do ~s facilm ente come
UNIX e DOS. ! sistemi Macintosb e VM.S,, per ese~pio, richied<:>no delle impos tazion i
~peciali per ela'bo.rare gli argomenti della riga di oma.ndo. Per Ottenete maggiori in.forma,..
zlo.i sugli argom enti della riga di comand~, onsu ltate i rriuali d~l vostro si$te.ma.

1a funzio ne sp
.. 1p.t
. tn1
- d'
.

al
co

mp
i
'la

r.or."!
eh
..
e
-ecifeata sar de.finita pi. tardi nello
p"F:otot
1cano
. . .. .
.st~_s_Q fl 0 , in un alno. Anco.r a una vo.lta~. il compilatore 11on tenta d1, risolvere 1 rtfer~entl
a un.a tale funzione: questo compi te 1astia~o al linker'. Sar ~~ne.rato un :rrore del l1nker,
.\,!

e1.

.11.

. .

,.

_ '.

;_

lngegn_eria del sofavre 14.2


Crear programmi suddivisi in .molti file s(J~gen.te fac.ilita .il riutili~o .del .softwa~e e ~~
buona progettazione dello stes!~ Le funzioni potrebbero esse~e comuni ~ molte a~plicaz~onz.
Jrt .questa .eveninz,p,j quel~. funz.iq12i dovrebber es~er ~trrz1!'~g_azzi~~ te nei J:ropri .filf
sorgenl:e e ognutiiJ di tJ'Uesti d~vr~bb~ 4vere un .c?rr~spond~nte fi!e d~ i~t~st~zione~ conte.nente i prototipi delle funz.iont . .C~ consen~ira ~i program~ato_rz eh~ sviluppe':~.n~o
altre applicazioni di riutilizza~e lo st~~so ~~~dz~~e, tn~l~de~do l appropriatofile dz intestazione e t:Qmpilando le proprie applicazioni con il corrt?p.ndente fil~ sorgente.

-Obietriv.o portttbilit4 14.1

flag. ~

N~lla dichia razion e p.re~e.dente, l'.i ndicat ore

di classe di ntemoria exter n indiq i al cornpi lato.i:.e -eh.e la variabile f .l ag definita pili a.vanti nello stesso l Q in un 1,litro. Il compilat_ocre
informa il linket che nel file corilp.are il rif~rime;nto irtisolto alla variabile flag: il com pilatore non sa dove' ques~a . ~ia stat~ definita) pe.rci lascer che sia il linker a tentar e di
trovar e la defini zione di quella variabile. Nel caso in cui il linker oon dovesse figscire a
trovare una d~fin iz.ione- di flag> s.a t generato un errore del Jinker e noh sar. p.>dott.o
n~ssun file eseguibile. Nel caso in cui sia stata individuata un gfni:z.ione globale appropriata, il linker risolve r i rifrm enti indicahi.o d ov si trovi flag .
.

Alcuni :sistem'i non.sippQrtano nomi 4i 1(ariabiliglobali o di fanzitmi con piit di 6caratte~..


Dovrete tener conto di ci~ quandoseri.t;e1~e.te dei JJrogrammi che Jo,vtanno essere -esegu~.ti
su molte piattaforme.

Obie.t:ffivo efficienza 14, 1

.=.

p.ossibil<? re$tiin_g~e la visibilit .di un~ variab~e O di u~a funzi~_ne glo~~e al. fi.t: in
G\i ques.te sono stat~ defmite. B~dicatore. d1 c~~s~e d~ memona stati c,,. quaud9.~pplicat~
a iina vtiabile 0 a un.a funzione glabal~, unp:dtsc _ ~he queste possano es:ere ut1l1zzate da
ficrnziohi che no.n siano .state defini te all'inter:no delL9 s:tess file. Quest o ~ ~etto appun t9
c;L~g~mento intern o. Le variabili e le flinzioni globali che nella l?ro def~z1on: --~o? .s?n.o
pr-ee~cb.tte da stati c determinan0 invece un :o.lle~~rrz~to e~ter:io: s$e s~~o .a~ess1b~I. ~d
altri file, qualora questi contengano le .appr0priate dich.1araz1oru e/Q p.rot.ottpl dr funzio ne.

Le va.tiabiii gff)bali migliorano le prest_azion.i: poich tutte le fonziarti posson:o .aecede-tvi direttamente ed f-e1i1nin4to il peso:del p4ss4ggio dei dati alle funzioni.
lng~gn .eria

rn int

. _

'1.

Come -affermato precedea~1nent~ in questo testo, possihJle costru ite dei programmi che
consistono di molti file sorgente. Ci sono molti fattori da tenere in onsiderazione quaQdo
si ere.a oo dei p~og:r,ammi suddivisi in molti file. Per esempio la defn.iiione di una funzio ne
deve essere interamente co.nt~nuta in un Ple: non pu estende-r$i per due o pi file.

~xte

...

qualera quesco non. poss~ l9talizzare una defr.iizione di flinzion~ appropnat~.


r .. d- te tutti i progr ammi che conte ngo.n. Q la dirett iva. d.el ptepro(;esso:r~
\.....ons1 e;r;a
.
. cl l b1
~include _<stdi o h>, come un ese~pio di u~z61 dei pr?tocipi -~e~ esten . ere. a_:1s1. 11-0
"& di una funzione. Quest a dlr.ettiva. mcluder. in un file 1 protot:1p1 p~r ft 1 nz.ion1 _co~e.
p:rin:t f e sca.nf . Le altr fu.Rzioni all'interno del file potran no U$~e ~rintf e ~ ~anf ,~~~
.svolgere i lo.ca compi ti. Le funzioni prn tf ,e sic a.n f s:o'1:io st~~e defini te per no1 s_eparata
mnte. Non avremo bisogno cli sp.ere dove. sno state defin.i:e ..,Nel nost~o p:ogramma~
~t~emo semplieemente riuti)iz;zando @el codice. Il ~inker ns.o~ve~ .a;i.tom an_arrien.te ~
i: -. ent;
a. a..uelle IUilL
r:..-:~,.,,10ru." .""'<::'.uesto
Aioces
so. o conse.
nt1r d1 utilizz are le fum1o m
JJQStfl .flleftm

.
J;

delli:t liQier1a standard.

1,4.5 Not e su[la compilazi'one dl programmi formati


d,a vari fil:e so.rgent e

N.ei Capitolo 5, abl;>a mo in.tro.dotto i concc;tti di clas:se di memoria e visibilit. Abbiamo imparao. he le va"tiab.il .di.hiar:ate' all)e~temo di o:gni definizione di funzione apparten..,,
gono.1 per default) alla clas_se di memo.ria statici ,e sono chiam ate variabili globali. Queste,,
dopo la lero dichiarazione, sono accessibili a ogni funzione definita .Q-cll9 stsso f e. Le
variabili globali sono .accessibili anch lle funzi6 n d,efihite i:q altri file, ma. per far questo
dovra nno esse:re dichiarare in og.n un di quelli in cui saranao utilizzate. Per esempio, se
definiamo 1n un file la nriabi le glqbal intera f la.g e vi taccia mo riferimento in un second9 file, quesco dovr ontenere p:rima dell'us o della. variabile la dichiatazio.ne

La dichiarazione di variabile glo'bale


s iEatic float pi= 3.141 59;

del spftu~are 14:1

-- - _,. i-a variabiL


,p' f loat
la i nimizzer; ton 3 ~. 14159 e indiche~ che pi '.S~r
,:creera
. e pi" d;;
.+
u
. . . ,
~t~ . s.oLtari
r -all f inziani dichiru:ate rr~l file in cui quest, ul'tilna definita.
- ~

Le variabili glabali d1Jcv.rebhet essf vitate~ sempre che l pr-estaiioni dellappticag,ir;ne non siano t>itichec; ,preh esse vl"biano il princip.io r/,el minim.Qpriv.i/e.gio. Prt>,prio .cotne le dichiar~i9ni e,xter n p,qss.q no ess.ere usate per re-ndere note le variabili .gl&bal! agli altri file dl prQgratl).ma, i protot ipi p.esS,(lflO esr~ndere la v;isibilit' di una
funzio g 6)tre il. fil~ J1 ui stata definita (in Un prototipo di funzio ne, non ne~e~~ario
l'lndieatQ.e ext~rn). Tu:c:to ci si ottiene, inctudendo il pr6totip o della firozio~ in ognqno
cl~i fil~ in csui quella inv0cata e <;:otnpi'an,do insieme i file ,(c9nsultate .l~ Sezione J3.12). I
1

,,...__

I.:in.dicatore stati c utilizzato comunemente con le fl!-IlZio?i ausiliari~ . ri_chiam_ a~e


sQlt~~o da qu~lle di un partico l.at file. Nel caso in cui ~na :~?~e no~ .s_i~ nece~s~r1a
._., us . :.
di
ato 11 p.r1nc1p10 del m1n1mo prrvilean esterno . . un par u~colar
. . - e file ' dovrebbe essre. osserv
.
.. . . .
d l
. ~:1 :;;. .
g.
~t"o. Uu_tzz
~; 1 ~. a. nd,.o sta tic Nel caso ch una funzione -sta :stara definita prtma e suo QJ.J.1.L:LZO

. . -.

a1 l
cl fi .. . a~ in"terno di t1n file, llora stati c potr essete applicato diretta mente .a sua e iBiz1on~ ..
lii caso co~trario) .stati c. dovr essere applicato al p.tot9tipo della funzione.

480

UPITOLO

481_

14

'Q uando si cosrruistono dei p rogr.ammi di din1ensioni ragguardev0li s11ddivisi in molti


diventa. tetlio.sa se sono stati effettuati d_ei
ftle sorgnte,. Ja otnpilcione' dc} program,ma
pic:qli carn..biam.e;nti a 'llll file e ]'int~t()' p:rogramma dovr esser.e compilato nu9va_m.ente.
MQlti sist~rn.i for11is.cono dei _ptogtarrtmi di uitilir spec1aij che oo.mpilano np..ovamerrte
soltanto i file del programma che sono stati mo-dificati. Sw sistemi UNIX, tale programma
chiamato make.. Ques _o le-gge uri ftle) chiamato mak efile, che contiene le istr11zion.i per
la compilazione e il linki~g del prog.ramma. Anehe i sistemi come il Borland C++ ~ il
M-icr9sofi; C/C.+~ per i .PC fornisono dei programmi di utilit simili. Per tq~gior;i informazio1ni ~ui programm i d1 utilit make~ consulta.te il manu~lc; del v>srro par"!=icolare siste-

int answer;

"

ate.xi t ( pri.nt.) ;
/* regist r a la fnZiO~e print */
pri .ntf ( !inter 1 t trminat program with function exit\n"
Enter 2 to termin~te progr~m nbrmally\n");
11

11

if

( an swer == 1 ) {

printf(.n\nTerminat ing program with fun.ction exit\n ).;


ex.i t ( EXIT_SUCC'ESS) ,;_

ma.

,14 .6 Chiusura dei programmi con Exit e Atexit


La libreria dell~ utilit gen.e.riche (stdlib .. h) fe,rnisc~ .alcllil.i tn.etodi _per trrninate l 'C$tuzione de) progr~mma, div~rsi da quello c_onvenzionale del ritorno dalla. funzion:e main. La
funzione exi t forza la chiusura di 1m prog ramma cm .se quest0 fosse stato es.eguiro
normalm~nte. La funzione usata spesso per trminare l~esecuzione di un pro,gtmrn.
quando si rileva un erjore nell input; q q11a.nd0 non pu essere aperto un :file che dovre'bbe
essere ehiborato dal prQgramm~. La fu11:zio:oe atexi t registra una fi 1nzicnt:: del progra.m.ili?pex:Gh sia invocata stibitQ dqpo la cbiwura con .succes.so dello stesso: oV-V~os.ia, quando
questo avr term 1nato la propria ese.c.uzione per aver raggiunto la fine della funzi one main
o pe rch e stata nvocata exit.

p~intf

( 0 \nTerminating program by reaoling the en.:d of m,a in.\n 11

).;

r.t urn 0;
]f

v,o.i d print ( void)


{

function print at
11
PrQg ram te.rminat ed\ n li ) ;

printf(~~xeuting

p~og~am

termination\n

11

La funzione. atexi t riceve come argomento un pu.n tatore a una funzio_n (ovverosia il
no.me della stessa) .. La funzione richiamata alla c.h.iusu:ra del prograrn.m'.".- non. pu avere
;a rgomenti n pub restituire un vdo:re. Possono essere .r.egist.rate fino a 92 funziru da
eseguir~ .~ C~tJsura del pr:ogrca.mma.

La fun~iqne ext ciceve un argamnto. Questo normalninte la Co$tante simbo1ica


XIT:_.SUCCESSo EXIT_FAILURE. Nel caso in crii X.it sia stat~in:vocata con EXIT SU'CCESS,
la 1cl1iL1suf)~r
sar r~stit:uito a!larnbient thiamante il valo.r d~finito da.ll'impiementa:zi0n!?
:EXIT- FAILURE sar restituito
ra co.n sl:1.t:cs'so. Nd caso iA cqi
- exj:f si;i stata in vocata con
il valore detnitq <:{~l'im.plementaii_orre per la chiusuracon fallirnenro. Nel mQmento in cw
vert~ ~ichia.rn_ata Ia fun7iione ex-i t, tune quelle registrate n preced~~ con atexi t sa:ranalle pro,prie re.gstrazio.ni~ saran_n o svuotati. e ,'hlusi tutti .gli
n1l invQcate io. ordin.e inverso =
strea.m .asso,ciati al programma e il controllo ritorner alla mb.iente espite. li programma,
della P:igtua 1-4,.4 mette: alla p.tva le funzioni exi t .e at,ex,i .t . Il programma richieder
all,L1tent di indicare s dQ.vr t~rn1inare la propria esecuzione cfi exi t o raggiungeQdo la
fi11e di main. 0.SServa~e c,he la fi1nzione pr.nt sar eseguita in gni c~o,; alla chi~wa cf.~l
f?Iogra.rnma.
-

t Usare

Vbid print(void);
()

'

le funziqni exit e atexit */

#include <stdio.h>
.# includ' <::"stdlib. h>

m~in

figura 14..4 Usar.e le funzioni exit e atexit.

14.,7 Il qualificat ,o re di t ,ipo Volatile


Mi Capitoll .6 e 7, ab.b iamo introdat(o ii quallicatore di tip con,~t~. ~ANSI C frnis~e
ehe il quali:featt)re di tip"'o volati7e" Lo standard ~'SI (An90) rndi~ c.he-l ~ualora_s1a
-usato volatile per qualificare un tipo) la natura dell ac.~esso 'a un. ogg@tto di quel ttpo
i!_p~nder dal1 1rrtplemenrazone. Kernighan e Ritchie (Ke88) indicar10 che il qualific:atore
v. o.l~atil. e .~ usato per clu.dere vari tipi di ott:iJ:niizazioni..

4 82.

UPlTOLO
-:..

14

ARGOMENTI AVANZATI

14 .8 I suff1Ssi per le co stanfi int~re ~ in virga.l a mo.bi'l'e


n e forn.isc~ aleuni .suffissi pr specific:are I tipi d~lle CQS_tant] in-tere ti virgola

Obiettivo .ejfi~ie nza 14.2

m0bi1e. I su.ffissi per le r O Stanti int~te ~ono: u o u pe'l n intero unsigned, 1 o L pe r


u:n intero long, e ul o Ul pet u.n intero uns:igne.d lohg. Le seg:a~nti cost~ti so.n o
rjspet:tivatnente di t_ipo unsigned, .I .on.a e unsigt1 ed long:

Prendet in consid~raziori~ /'Ji1,;ro .dei file binari) invece .di quelli di t-e.sio~ nelle appiica~.itJni che rzC.hie.dano urt~'elevata ef.ficlcnza.

Obie.ttivo portabilitll 14.2

~74u

Usate i file di testo quandiJ scrivete p:togtammi portabili.

8358L.
28.37 3ul

In aggiunta all(? fur12i~ n per l' elabbrazione dei file d.i~~~se nel Capi.r9l9 111 1~ ~b.~er~a

Nel cso fi C[f, u.n a Ca.stante in.tera .nn ambia un suffisso, :Sar scelEo .c ome suo tipo di
dato il _primo in gtado di immagazzinare ~ v~lore di quella .dimensio-ne (prima i .nt,;.

poilong int,polunsigned long int).

l s.u.ffssi per l.e co.sfanti n virgola mobile SJ:>nGJ: f o F pet un f loa.t, I o L per u.o
l .on.g. double. Le seguenti costanti s.o n-0 r_ispettivamente di tipQ 1.ong doubl e flo.at:
3 . 14 '1 59L

1 . 2.Bf

s:~dard fqc:nisce ancbe la. funzione t .m pf:ile che apre U:n~ile t.ei;npor~ri:~n nel~mqdo wb+ :

Jfe:r qua.n to ques:to m_odo di apertura sia destinato ai file. bmar1,. alc~1 s.1~~ei;i1 el~bor:n0 g~
ar;b,ivi tempo.ranei oome . file di testo. Un file t~mp.o,raneo esiste.ca, finche aon sara s tato
cliiuso con f clos e o fino al termine dell1esecuz1one del programma.

Il programma della Figura 14.6 .sostituit ton .d.egl~ ~pazj i car~rteri d~ tabula~io~e
pres~nti io- un file._Il pr9gra111111~ ~ichle~~r allJ.utel}re d1 n~ett~re 11 npme .del fil~ . che
aov.ri essere modifcatQ. Nel caso 1Il CUJ il file 1mm~sso daU uten~; e q~ello1 te~po~ane~
~iano s-rari aperti con successo,, il programma legger i car:,arter~ dal file .da ~odifiare e li
scriver .in quello temporaneo. Nel caso in cw il ta:rattere letto sia 1.ma rabulaz1~ne ( . \ t 1 ) ~
sar. 80 stitait da uno sp'azio e scritto nel file temporan.eo~ -~~l momenro i~ c~1 . verr~
~ --- nta.la
r:. _ - d
=- '"11.,.GJll
~L ~-v-1 0
.J:.. mo Ulll
..J~c.:1c--ar:e- ~ --i ns
- 'pe
nrrntatn
di file- sat;3_
n noJJ1p
. os.1z1onat1
1:a.gg.1,.t]
.. - nne
-$lli
-- u.a
- -ttr'vi
- - F'
.-- . -_ - . .
".-_~~ .la r e wind all'inl~io di 0:g11.u no di essi. -In se,guito, il ~le te~.por.a.n:e~ ~-a;r r1cop.rato un
1
1=-:
ll

Il

.
~
o_rrgmale
man mano
~ranere per volta su q ue , 'O o.r~1gmai.e . progra mm~ vas.~~ze~a' il file
. _.....
, :~
he ricopier i caratteri in .quello temporaneo, e -v1sual1:z~r il nuoV'o fil~, -~an mano,. che
sopi~: r i caratteri d quello. temp.o taneo a quello or1;g1nale, per confermare che s1ano
1

Una costante in virgola m.obile ~enza suffisso sar. con~iderat-a autom::atieament 0 di tipo
doub.l e.
1

11

.e

(U..

14.9' Ancora sui file


_Il Capitele l ,l ha. tr:a-ttato del! ba.r.atteristihe d.is.pc'l'nihilJ. per 1 el'abo.tanqp.e dej file di
testo CO.il l'accesso sequenii~le e quello caa:uale. _
fl C forn is.,ce: @.D.GAC la pos.siblli_t d1
elaborate i -file- bin.aii.; mJl alcuni si.stem-i di computer no.n li .su.p poi:tano. Qu-ail_-ora non
siari 'up:porta.ti -~ un file sia ape.r t i:n modo bin;u~o (Fi:giira 1.4.)., . qtlsto~ s:ar elabo~
~to G9i;ne JlP. &l'e di teseo. I fl' ~inari lovrel:>b~rQ essere us,ati, inv:eci'i. di qu~lU di
te:st'.o, soL~anto "11elle sltuazini in ci sono cie!hiest_i da G.t:Jn:dizioni rigorose di velocit.,
me'meftia, e/o compatbili,(,. Altrimenti, per la loro . in.trins.eea pc:;>r~~ilit e per la..Possibilit di us~e altri $tru_meAti ~randMd pet es:rhiQ.a.r~- e manjjlolar i d~.ti contenuti~
dvtanno ,'~r1}pre e~sere preferiti i file di. resto.
1

Modo
-

~
~
~ -'
stati
scr1tt1.
-

f~

Usare i

f~l

tmparan~i

*/

W:lnclud.e <stdi 0. h>


1

IJl a.iofl { )r
{

FILE *filePtr,
i 'i t e;,

... n e
.D_escnzro.

*tem~FiiePtr;

eflar f .i l.eNa me[30] i


rb
w~

ab

rb+
Wbr+

a.b+

.Apre un file bi:na.Iie per: la let~ura.,


file bin~i-ri10

per la srlttura,. Nel caso in cui il fe sia gi esistente, ne


elimitter. il contennto c1orrent~.
Crea un

Accod'!: .apre crea UA file binarie per la scf"itnma alla. fine dello ~_tesso
Ap.r~ l1.Q.. file bin=
a.rio per J'a:ggiornamsnto (lttuta ~ sritu.ra) ..
Crea un fle binari-o per l)aggiotnameni;-q. Nel c;iSo in eui i] file sia gi
$tente, ne-eliminer il cntenuo coi;rent.

pr~ntf("Thi~
0

Sc .~nf

'f

esi-

Ac~oda: apre o crea uri ftle binario pe~I' l,aggjo.rnamento; tutte J~ s.ri~rure
saranno eseguit~ alla fin.e dello stesso.

_..

tabs to $pces.\n"

progr~~ chang~s

Enter .a file to be modified:

). ;

( 11 %~", f 'ileName) i

( ( f :i l.ePt r = fopen ( f l.eName '

if

11

11

r+ 11

!=

N~LL)

( (. t empFile 'P t:r


tmpf i;l e () ) l = N_
ULL l {
.
prin tf( 11 .\nThe f il_e oefore mcidific.a t". ion i _s: \n 11 ) j

while ( ( e

~ getc(filePt~}

putchar(c);

figura 14~5 Modi di apertura di un.fif~ bmario.

put e e

= ::=;

I '\

"'

. e_. ,_ tempFileP~r);
1_

_.

..

43.4

CAPITO'LO

14

r-ewind ( t emp.File:Pt r) ;
1

rewi nd {f i .1 ePt r) ;
"Print f (" \ n \ nThe f il e af't er modi t icat ion is: \ n

11 )

pute (cJ fileP t r);


}
}

lse
0

sfessa). Nl mom ento in cui verr generato un s~gnale di rip9 SIG-I NT, il controllo sar
lassa--o alla.fUnzion,e sign al_h andl e,r sar v.isu.alizzato un messaggio e alltutenre sara d~ta
la pqssibilt. ~ s<;:gliere se co11tinuare la 11or1 nale ~seeuz.ione de] pro?r~1:1a; Nel caso 111
ara r.n 17,1aliz zato nu(:)v.aGGi i,ui:enr~ scelga ~ conti nt1ar e 1 ~suziorie il gestore d-el. segnale .s_
mente1. -ricliiamand" ancora sign al (alcuni sistemi ricl1iedono .che il ge.store G:el .segnale
sia inizializzato di nuoyo), e il conrrollo rit;orner ,af punt o ,d~l prog ramma in cu_i era stato
rilc;Vato il segnale. In questo p.rogr_amma, sar~ tlSata la fu11Zio.ne rais e ptir sim.ulare u_n
.;egnale inr~rattivo. Sar scelto l!lh 111im ero cas_uale tta 1 e 50. Nel G~so i? ctu il .n~ero ~1~
.25, allora sa.t:a invoc ata rais e per gentar 11 egnale. Norm alme nte, 1 segnali m ,tc;:ratt1Vi
,sono inizi:alizz;.ati all~es:tet110 del prg; ramn 1a. Pr eS"en1pio,. p-rmendo <et r l .> .e dur~te
1'-~s-ecUifiQne del progra1nma i11 un ~istema QNI X,o DOS , sar gene rat6 1111 segnale mtera ttt'lfo
che termineE i'ese6w::ziene d~J prog ramm a. L<\l gestiQne dei segn~li pu esset e usata per
~l:tercerr~ i se:gp_ali in trattivi ed eY-i~'are clre il programma ,sia chiuso.
1

Whil e ( ( e = g.e tc ( t em pFil ePt r) ) ! = EOF) {


pute ha r (e} .;

pri .n tf ( 11 .Unab le t

open t~mpora ry file \ n 11 ) ;

el.se
p r intf ( 11 Un-ab le t0 open %s \ n" , f ileNanJe.) ;

Segn.are

Spiegazione

SIGAB'RT

di una chiamata
Chiu sura anbrmle rlel ptegr amm a (per esempio a- ca.usa
alla fi1nzion -abor t).

retu rn 0

'

Thi$ program changes tabs to spac es.


Ente r a file to be moqi f .i ed i data

SI.G.INT

'Un oper:azi_on~ aritm ,tica sbagliata o1n,e una divisi-on~ pe~ zero 0 ~ o~era
zione che prov oca un 9v~r'flow (ectdenza della capacit cli rnemorizzaz1one
dei da).
Swp erta di urus ttmio ne illegale.
Ricezione di un segnale di :attenzion.~ inter attivo .

S.IGSEGV

so. non valido alla memoria.


Un acces
.-.

SiGTERM

Una richi~ta di chiusura inviata al programm.

SIGF PE

SIGILL

Figura

La ges tion e dei seg nali

Un eve11to inatteso, o segnale, pu casarc;: la chiusura prem atura di un .Ptogtam.rrta. Alcuru


dtgli eventi inatt~i sono: le i,stnJ/4/ni iliegaJi, Je vio/,azioni." dei s.fjnenti di memoridi .gli interrupt
(p~em~re <et r 1 > e in un sisre ma. UNIX o DOS) 1'ortiine di cl1iusura 44 parte
del sisten:ta operativ.rJ. e le eccezioni de-i calcoli .in virgola ml)bile (divisione per .~ero: Q moltiplicazione di gt:<tll.di valori in virgola mobile) . .La libreria p~r la gstipn.e dei. s~gnali :fornisce,
ccJ:n la funzione sign al, 1~ possibilit. d ifltercettq,~ gli eve;n ti inatt~s-i. La funzione sign al
riceve due ~gmenti: un int(![o, che rappr e.s enta -il num ero. del segnai~,. e un p.unra:tore alla
funzion e ~h~ lo ge.$tir. I segpali po,sso:no es:sere: generati dalla funzione rais9 , che accet ta
come su_o argomento un intrero che rap.presenta il nume_t del segnale. L~ Fi.gu.ra 14.'7
.riassume .i . segnati standard defmiti nel file di .in_t~~tazi9n sign al. h. n progranima della
Figura 14..8 moS!ra l''uso deUe funzioni s .i gnal e ra.i se.
1

Il programm della Figura I.4 .$ user la lirnz ione sign al per intercettare ufi segnale
i11ter~ttiv6 (SIGI-NT) . Il programma esordir ,riohiaman.d'.o s.ign al ton SJ:GINT ,e un puntct.tore
a sign al_ti.andJ.e r (ricoEdate che il nom.e di una funzione un punt atore all'inizio della

_.,,.

14..7 I segnali. definiti n~I file di intestazione sign,al. h.

ria:
mo
me
a
deO
ica
am
14.11 _Allo(;azione din
le fun zio ni calloc e realloc

FigJJ~a 14.6 U,sare i file temporaJ}leL

14.10

485

AAG'.OMENTI AVANZATI

Il C.~-pitolo 12,, 'Le $trntture di dati )': ha introci"otto la nozione- di al~caz.ion~ dina_mia
della funzione mall oc. Co,m e abb1am0 affermato_nel
tt~lla mem eria mediance L'utilizz_
Capitolo 12> i vettori $Ono migliori delle li.sre conea.tnate per rap~dit- di o.rdin~men,ro,
Iieex{t e a:tcesso ai dati. Tuttavia,, i vetto ri sonp n:c)rmalmeiIIe delle strutture dtdati stattci.1e.
=]da breria di utilit gen.eriche ( std-1.i b. h) lomis_ce altre d.u e fi1nz1oni per lrall~azione
d:inamica della mmoria: call oc e real loc. Queste possc::i_n o -es$e.re i.isC:Ite pe-r creare e
~od.illc:are dei vett()r.i dinamic.i. Come most rato nel Capitolo 7, t<I puntatori~' , UQ puntato.re
1
untat~.re
p
un
rra)
egue
cons
Di
.
o
~ltim
est
u
q
Gom~
ri
prop.
to
izza
eindi
eser
puo
re
v~tto
~un
.a una porzi one conti gua di n1em or.ia creat~ c?n 1~.fi1nzio~e call _o c .~u~ e~s:~te g.e-st1to
come un vettore. La funzione call oc alloca dinanucament~' -hi mem or1a d1 un vettore .. 11
1

S\J.O

proto 0-po e

V'b_id *cal loc( sit _t

ntnen1'b~

s. ze_t

size )~

:ijs@, aetta due arg(lil1enti ll nume ro d~gli elementi ( nmemb') ed..?-loi;o di-01 ensiq ne { size )
ce w1 pup_-tatore alla memoelementi deil-vettore. La fi.1nzione restituis_
e 1nizializza a ze.ro
ria alltJcata, o un NULL qualor~ questa n911 $ia stata allocata.

gli

CAJ?'l'TOLO

487

14

La 6:1mione rea lloc cambia la dimensione di un b_


ggetto alloeat<) da una. pr(:edeqre

chiamata a ma lloc , cal loc o re.a ll.oc. I contenuti originali dIT9ggetto 11on saranno modificati, pur-ch la quan_tit di memoria alloata ~ia m~ggiore di quella allocata in precedenza. In
case contrario, solo i contenuti c_omp~~~i n~llit dimensi0ne del nne>vo ~ggetto non Sa.rann_o
crmbiati. Il prototipo pr l_a fi1nzione rea llo c

voi d *re allo d(v 9id *pt r, siz e_t siz e);

La funzione re-a lic e deve du~ .argomenti: un_ puntator'e :all' oggetto originale ( pt r;-) e la nuova
dimensione dello _s_~es~o ( siz.e ). Nel casein cu.~ ptr sia NULL rea llo c fijnzio:m:~~ allo $te.ss0
modo di malloc. Nel ctso in tui sz e sia 0 e ptr si4NULL,1-a. memoxia allo'Clta per l'oggetto
sar rilasciata. Altrimenti,. qualora pt r non sia N.UL.L e la d.me_nsione sia maggiore di zerol
re:a llo c tenter di allo-care p,er Joggetto lJ.11 nuovo blocco di memoria. Nel caso -in cui il i1uov
spazio non possa Sse~e alloca~o, l'ogg~tto pun tato da pt r non sr moditcaro. L fumione

if
}

ret urn 0 ;:
'}

voi d si.g nal_ han dle r .( int sign alV p.lu e-)
{

in.t res pon se;

Pr in t f { 11 %s%cf%~\-n%s ",
"\n lnt err upt sig nal
, si gna l.Va
. lue _, 11 ) r-ec eive d . .
e (.1. = yes o r 2 = no ) ?.- 11 ) ,
00 YOIJ wis h ta con tinu
(

Il &'a lto incondiziona to: go to

11

' .

11

&response);

wfl ile ( res pon se 1= 1 &.& re-s poil s I= .2 ) {


p rin tf (. 11 ( 1 = ye s or :2 -= no) ? 1" ) ;

Nel ersG di questo testo, abbimo pos to !'.accento ~ull 'irnportanza di usare le tecniche di
progi;arrrmazione strutturata per cosnuire un. s_ofrware affidabile, per il quale le attivit di messa
a pttf ito, mari.utenrione e molifica sia.fle facili, In lcune occasioni,, le pre5tazoni potrann
o
ss~re pili importanti della stretta ade rem .alle tecnicl1e di programmazione
strutturata. Nelle
suddette ocqisipn_i, potranno essere .utilizt.ate a1cun tecnihe di p.rogramn1az.io1Je non struttura:
ta._.Per escmpie,.p,otremo Lttilizza re bre ak per term i11:are l esecuzione di un~ struttut_a di iter-azione,
prima che la condizione di continuazione diventi falsa. Ci eviter elle inutili ripetizioni del
ciclo, nd cSO in cui I'.atiivir sia gi stata complemr_a prima dd termine del ciclo .
I* U_sar e la ges tio ne dei segna li * /

11

11

scanf("%d

0)

pri ntf (" \n' 1 ) ;

rea lloc 11-esrinll$ce un pl.Jll_ta,tQre .alla memoliia riallo~ta o un NULL.

14.12

==

( i % 10

scanf(~%dd,

&response);

if (res pon se

==

1)

f?ig nal (SI G.IN T, sig nal _ha ndl er) _


;

el.s e

exit(EXIT_SUCCESS);
}

#.in clu de <;St d o . h>

#in clu de <si gna l.h>


#.ir.i cl ud-e <st dl ib. n>

#in clu de <tim e , h>


vpi d sig nal _ha ndl er( int ) ;

ma in( )
{

int i ., x;

s ign al (SIG INT , sig nal _h lnd ler.) .;

sra nd( clo ck( ));


far (i x

1 ~

i<~

100 ; i++ ) {
1 + ran d() % 50;

if (X

==

rai~e

25)

( SI(_INT) ;

~~intf( 11 %4d~,

i);

Pigu"r:a i4 ..8 Usare la .gestione dei segnali.

Un altro esem pio di programmazione non sttu ttt1 rata l' uiruzione goto: un salto in.<i>n.dlzionato. Il risultar di un i~truzione goto sar la .deviazione del flusso di controllo del
Jr~ gra,mma alla p.ri ~a istruzio.n e successiv~ alla _la bel (etichetta) spe.cifi,Cta nell ' istrazio~e
gt>t.. Uri eticherta un identifi~:rore seguito dal car"~tt~e due ~~tl. _Essa. deve c9mp3:1'rre
111ell~- stessa funzione dellJisuuzione got a che vi fa rifer1mento. Il programm_a della F1.gu1

CAPITOLO

4.ss

14

489

ARGOMENTI AVANZATI

ra 14.9 vser llistr uzio ne goto per jterare diet i volte e, in o;gnuna, visualizzru;e il valqr del
a.ro .a 1 il p.rogr;.SUD1Tla controlier~ courrt per deter11lin~e
cont ator e. Dopo aver lo iniz:alizz_
s qu.esro sia maggio.re di 10 (!'etichetta sta rt s.ar ~altata, perch' le etich ette non eseguo ...
.no alcu.n a azio.n.e) . In quest caso, il pntrollo S,ar~ rrasferit9 dalla go1;o alla prim a istruzio_ne .sucessiva all etich tta end. In CMo conuari0, cou nt. sar_ v.isualiizata e incre1nefltata e
il cqntr.oJlo sira trasferito dalla goto alla prim a istru zion e successiva ali,eric~tta sta rt .

Eserciti di au tov alu t'a zio ne


14 .1

Riefnpite gli spazi vu_oci in og:nll.11a delle seguen !-i righe:


usato pe~ redirZionare I ihput dei dati dalla tastier:a in moqo
a) Il sirhbolo
1

che .Prdv~iga

b) Il simbolo

da LlJ1 file.

Ltsa.to per redirezionare in Wi fl l ourpu-r dello sc.h mo.


usato per . acc~daTe alla fine di un tile l'out put di tim pr_ogram-

e) Il simb,old
ma .
d) Un~---- us.~to per redirezionare l'output dl un programma sulJ'inpu 'E di un

I* U9.a re 9.oto *l
.#inc lude <std io.h >

altro.

. nell'-elenco deglJ atgcrntenti di u.na funzlo-0-e, indica che questa pu


.rie~vere ~n J'lLIIlJ,~ro variR-bile di argomenti.
dev. essere .invo cara, pr]ma di accedere agli clementi di l,1-fi ele_qci
f) La macro
yariabile di a.rgo .m~nti.
usata per aGcedere ai singoli elmien-ti di lJJl eleoo vai;iahil~ cli
g) L.a. macro
~}

ma in ( )
{

int cou nt ,. ., 1;

I* etic t;\e tta */

sta rt :

argflrn e.p_ tl.

f (cou nt :> 10.)

facilita nn norir tale rito,r r,10 da una fi1nz.ione il cl!i elenco vari~ile
h) La rnac(Q
cli. argem enri ~tato punt to dal1 .macro va_star t.
d~lLa funzine ma.i n rieeve il num ero di quel li pfese nti sulla
i) I::a:rg~nien~o
riga .di comandQ.
dl1a flliizione main im.tnag-azzina quelli della.riga di c oma ndo
j)' rarg ome nto
in stringlie di caratteri.

goto endj
pr ntf ( '11%d

11

cou nt);

++count;

goto sta rt;


/*

end:
putc har ( 1 \n

Un'

1 ch
legge Llll file hia1-i.1aro
k) Il programma di utilit UNIX
eo.ntief'!: le i~tru'Lini per la t9mp jJazi o,oe e llJinking~ d.L l:ln (?I"Pg1:amm a uddiviso in molti
file sprgenr. Il prograrnrrt.a.d i uii.lit compil~ n. uov~Jnt;:nte un file s9lo qual ora quest sia
stato rnod fic-ar dopo la s11: ltlrl ma t;t)mpilazion.e..
forza un ~rogramma ;t cerminare la propri-a eseafzio11e.
1). 1-a fun~ione
registra una funzione che sar i,n-vocata dopo la norm ale chiusura del
n1) La.

etic het t a * l

) ;:

retu rn 0;
}

prGgra:mm..

india cb.~ 1ID oggeu.9 uon pu ssere modftat0:,


o) Il qualiflcator@ di tipo _
dopo crhe srato inizializzato:.
pi.r essere accodatQ a un~ costa nte in.te_!"a o i11 virgola moh> il _p et spe.t.io) Vn
ficare il tipo sat:to della sce.ss-a.
apre un 81(; ~Gmp_o:rane9 chs: esistr fino .alla. sua chiusi.ira o
p) La fgnz ione
fi.P. al tei:.ritin'e 'dll'esecurio.ue d:el pre.gramma:
p:u essere' u_saca per in:~re1tar utL evenco inattesa.
.q) L~ fun'Zionege_nera un S;egna!e all: in~crno di un programma.
r) La funzione
alloqi, dina mica mei te Ja qiemoria di un vettore e iniziilizza a
~) La funzion-e
ze~o gli elementi.
.modifica la cUI,Ilensione di un blocco di mcin oria precedente~
) La fu.11zione
m~nte all ato in mo-d dina mico .

Figura 14. 9 Usa re g1o:t o.

Net Capitolo. 3, abbiamt'>' affermar.o che pe,r scrive-r e ~sia.si progr.ainrha S.nd. neces,closi
s~ie sgl(~~Q tre strutture :di contrJllo: la. sequ enza , la sel~ione e l .it~rrr . .Attene11
alle r~gol.e d_ella p~ogratnmaziorie S'ti'ruttur~ta.J sai possibile CJ'.:ea1e_ $trU tt1Jr e di ontrollo
p.xofondamente nil ifat~, d~le quali per sa:ra difficile us~ire in mfi;,.<f.o e.ffic\~nte. In ~. ~tu~~
zioni di- qtJ:esto -genet~-, al~tln i p.rqgtam n1arori u~o. l~i~ttuzio a.<2 goto coroe un'u scita rapj--=
da da utra stru ttura profondamente nidifi~ta. Ci elirnn,er la M..ecessit ;di verificare le
m9lt~plici eondiiioni d uscita da 11na St:.rUttl!lill di ontfoilo,

Ri_s.p.oste agli ese rci zi di' au to valutazione

L,z.$trtf,-Zi1!Jtie goto pu essere usata p-er uscire in m_odo efficie_n.te ri'f!. $tr14ttu,re:di confriJllo
profondanz ~11~~

nidifica-te..

Ingegtreria del s.oftwn,rq1:4.3


Ltstruzionegoto dovrebbe .efsere. us4ta soltantb in ppl-icazi.onz orittnta.t alle pre.stazioni.. L'is'truzioni! got o n/;_n stt"ut/JUrata epi;i cor;4~frre a prQgr&mtni in cui la messa
a pun.ti), la mdnutaizion e le modificl1e .siano p:ii't difficili.

14.l ) redirezionrun.e1Tt;o d~ inpu t(<) . b) redirei-iaruimen.t:o dell,output (>). e) ~ccodarnento


j) argv . k)
, deu~ 0,u.tp.ur (>'>). d.) pipe (: ). ~) eUi'ssi (. , . ). f) va_star t. g} v.a_arg , h) va_ end. i). argo .
1 ma~e , makefil~. l) exit . .ro) at~xit. n) cons t. o.) sttff:l,Qio. p) tmpf .i .l e ..q}si gn.a l. r) rais e. s) cill oc.
t) r~ailoc.

490

CAPITOLO

14

E.sercizi
14.2 Scrjvete~ un pr;9:gramm;i che calGQJi il prodotto di una s:erie :di interi pa5sa1:i. alla :funzione
prod uct, usan_do ~n elenco variabile di arg~;rtnenci. Verificate la voscta funzione con diverse chiamate~
qgnuna con un numc;:ro cillfe:rente di argomenti.
14.~ _Scrivete un programma eh.e visuali2zi gli argo men ti imrriessj s:ulla
prog i;am rna.

riga di com ando di un

14.4 S ,czrivet~ un prggnumna ch ordin i . un vettore di inter1 in modo ascen.d..ente o cfucendnte. Il


programma dQvr usate gli argpmenti della. rig_a di com ando per passar ~a, pr un ordinarne.mo
ascendente, o -d p~r uno disceP'dente~ (Not a: in UNI X questo il foan ato standard per il pa'ssaggio
dell op.r ioni a un programm~).

14.5 Scrivete un progFamma che ins.erise~ uno spazio tra ogni ca.,.t a_ttere di un ftle. Il p~rogramma
dovr p~rim~l Scrivte il cont~nu1;p del ftle da modifGa'.r:e in un archivio temporaneo, inser endo gli spazi
tra i carafterl1 quindi ,dovr ricopiare il fe temporano s quello eriginale. Q'1:e~ta o_perazioa dovra
S'ostitu.ir i .corit~uri del file ginale.

14. 6 Cons ultat e il manuale del vosrr9 s_istema per determinare quali segnali siane supportaci dalla.
rlariva libreria di gestitine (sg nal. h). Scivete un progra.lllffia he p:nten;ga alcune ge.stioni dei
segnali standard SIGABRT e SIGINT . Il progfamma d.ovr controllare l'intercc:;:~ione di ques_ri segnali
richiaroand la funziot.le abo rt per g~nerame uno di tipo SIGABRT. e premen.do <ctrl> e_, per
generarne un di tipo SIGINT.
.1 4. 7 S.crivete un ~programma che allochi' di.namicam~nte un vttote di .interi. La dime.nsi()1) del
verto.re db"vr esser immessa dalla 'fasrita. Gli lemenri del vettore gQvta11110 esser~ impo!?t~ri con
valori immessi dalla tasti era. Visu alizz ate i valori del veo;or. e quindi all9cat~ n:uovamen te la sua
I:nemo.ria a met del num ero ccrrrenle di elementi. Visualizz?-te i valo)i pma sti .nel ve ttore per co.n-f~rma
re:che corri'Spondano alla prim a met dei :valori contenuti nel vetto re Qrigi.i'!ale.

APPENDlCE

La sintassi de l C
Nella nota zion e ,Q.clla .$jnrass1 uciliizacar l cat gori e sinta ttich e: (no~ t~aJl). son~. st~te
inc:l.icate da uno stile tipografico in orsivo met1rre l paro le lette rali 1 membri d.ell .lllsi.e~
me dei cara tteri (terml.nali) ~ono - stati indicati da uno stile tipografico in gras setto . I due
p.un ti (:) succ:essivi a un non term,i oale in.troducQnQ la s~ definizio~e. Le-definizioni alter~
narive Srt elen cte su righe sepa rate) ecc.e tto quan do siano state intro dott e d~e pa~ol~
C(~a/o dr. Un ~imbolo opzionale in dica:to dal pedice cdpt"' <;:osl che
1

{ espre-ssianeopz }
.indica che nelle patentesj gr~ racchiu_sa: un'espressione opz.inale.

.Sommario della $intass:i del linguaggio


A. I

.a.1 ..1

Gr am ma tic a lessiccale
Simboli

simb olo:
paro/.a-chitt:.Ve'
identificatore

14.s Scrivete un programnia eh: ticcsw come ru;go nienri due' nomi di fil dalla tjga di c0mru1d.o ,
legga uno pe:r volta i caratteri dal primo e li .scriva in. ordine irtv::rs nel secondo.

costilrtte

stringa-letterale
operato.re

Scrivete un p~ogramma. che vusi Listruzione goto p-r simular: una struttura. di iteraz.i~ne
nidificata ehe visualizzi un quadrat di astrischi tom e il se;guente :

14.9

pu_nteggicat:/,l.ra

jimbolo--del-p-repr:octssore::
nome.-di-intestazione
idntificatore

numero-pp
GOJt4nte-di--carattere

s'tringa-lftterq,le

Il progf.'aiilma dovr usare selta nto l,seguenti tre istruzioni prin tf:
-

operatote

printf("* )i

punteggiamra

prin tf { " " ) ;


prin tf ('11 \n '' );

ogni caratter non di spazio. bianco eh.e no n coin cida con ui;:t_o dei '5udcl.e.t ti

11

.A.1.2 Parole chiave

parola-chi4ve: una di
auto
bre-ak
e.a se

dou ble
else

enum

int
long
reg iste r

stru ct
swi tch
type def

AP1'ENDIC:E A

492

return
short

unio-n
uns .i g'h'e.d

si.gn ed

v-oid

.goto.

s i .z e ef

volatile

if

static

while

c:har
.

extern

c.onst

c.ont hue

f
f

d,efaul t .

do

loat
or

SINTASSJ .Dfil

cqstante'-decin2ale siiffis.~a-irvtero opz


costante'-titt-ali :uffi:sso-tnterQ opz
costante-esctdecirrtal siiffisso-tntero 0p$
numero.~non-zero

..

ostante-- de.citnalt
0
costante-otJti,f~

idetttjfieatore nQn-numero
id~n"tifica-tvr nuttzero

0x numero-esadec:irn;;tie
0 X nttmero-esadecimafe

.-

a b e d' e f g h
n o p q r s t u

1"

G H

I
V

I
X y
K L
X y

m
z
M

.costa1ite-etad-ec.imale nurriero-esarlecimale

nurn.ero-non-zetiJ: uno d'l

di

2 3

n'f4,mero,.ottale

tl1&tante-esadecimale:

non-numero; uno di

1iu.mero: uno

n:itme10

costantf;-ottale~

~dentifiea.to re:
no.n:-.n:1-!-mero

A B
N o p

.eostante-decimale:
.

.A.. l. 3 I denti 6c.atori

493

'lftumero-ottale: ano di
4

7' 8

1
b
B

'5

A.1.4 Costanti
cos_t4:nte:
cos:tttnte-,in.-:virgola~mobile

costante-intera

qQ.~tante-di-.enumerazione
costan te-di-caratte-r~

eosta,nte..-.in-virgola-mobi!e:
costante-frazionar-io,. parte-espont:nteopz st:(,jfis,so-ln-vtrgl)la.,.mobile(fpz
sequenza--di~numeri parter:esponente suffisso-i}'l-virgolt;,"'"mobileopz
costiJ:;ite.-frazio nar.ia:
sequenza-d~-iiumer~upz . sequ,enzr.kai-numeri
seq.~. e-nz4-di-numer:'/. .
ptte~esponente;

e segno

seqitenza~di-nu..meri

E s~ono sequenza-di=numeri

s.wjfisso-intero:
. -sujfisso-unsif;"t-Zed Stf-jfi.sso--Lon$.opz
siiffi.s.so..,lon_g suffi~s.f)-Utzsig;ned0pz
su;lisso-u:nsigned: uno d

sujfisso-long;: uno di
l

i0Jti1:nte--di-erl'umerazione:
identificatore
...

'

r:,Q$-tan t~-di-caratter:e:

segn,o: no di

' sequ-e:nza'-c'"""char 1

L 'sequet1;za-c:-c.har 1

sr:qzten~flr"""di-riumeri:

~equenzd-c..,.char:

numero

c-char
sequenza:-c--.char r;-par

~~eq.umza::-di-"numeri nym,e-rQ

suffisso""invirgola-rn.obilr:: uno di
f

costa1zte-intera:

'f::~thar:

qualsiasi membro1 dell irnieme di cararte_ri di orig,ine eccetto, l'apice singolo ' il
.mcltsash \ a il carattere di newline
1

APPENDICE A

sequen:ta:-;di~scape

LA aINTASS DEL e
A.1:8 No mi di intestazione

sequenza-di-esr:ap'e~

rnvme~di-intesta~ie;ie:

<s'q_uenza-l1~char>
11
sq1:te1tza. -=q- cha1~ "

$e.quen.za df. . estape~semplice


sequenza-di-escape-ottale
sequehza-di-:escape-esadecimale
sequenm-di-escape-semplice: uri a di
0

\a

\,''

\ ?.

\b

\f

\\
\n

;'eqit:enz-a"h-chat:

\t

\r

h.-char
sequeriza-h-har h-chtf.1"

h.::c:ha:r:

\V

s:equenza-di-escape~o'ttale:

q-cha.r
sequ.er1ztt-q:-ch.ar q-char

\ numer9-ttale num.ero-qttqle
\ nume.ro-ottale numero-ottale n.umero-o'ttale

q:-har:

!equenm-di-escape:...es(l.decim4{e.'.

\ x nt:tmero-e_sadecimal~
sequnza.-di-escape-esatkcimale numero"'esadecimale

: .1.:9

stri.nga-letterale:
sequenza-s-tharopz 0
L "sequtnza-s-char0pzu

sequenza--s':"char:
sr:q'f!.~nZJa-s-char

A:2-..l

'
q_u~sias membro d~ll'insi
eme di caratterj di orig,ine eccetto -le virgolette 11 >il.backslas:h
\ o il ca rat ter e d'i 1lewline

_fPrrt~~ one..,p 1~~m4rzt;1.:

i'dc-ntifteato1e

1Jspt.~5sione-can-1su_ffiss o

~ >

&

'li

<<

>>

<

>

<=

> --

O -

+=

"'=

j;

##

si_ze of
-- .I. -

:::e;=

<< = > >.;;; &.=

A-

A.1. 7 Punteggiatur'!

() {}*

,-

1-

&&

I I
I I

.
esp 1essio1ie-prt1'l1.tt.rt.a
'(f,sptession/:-con-s1J.jfi$$-O [ espressio.ne- ]
espr.e_s$io-rie-C(ln~stif.ftssa ( lista-di-::espres.sioni-di~arg.omilnto op
z ).
espressz'on-e~eon-suffeso . ide1itiftcatore
$pressione-con-su:ffisso - > identificatore

r2.spressiq.1ze-con-suffisso ++
:Spre;s.iotie~con-sii/fisso -iiS,ta"'di-~?jJre$sion,i..-.di-argrrrr1e1ito:

puntggiatura: un o di
[]

( ~sp r(f$itn 4 ')

uno di

E~pressioni

st'ting-letterale

A. I .6 Op era tor i

Grammatica della struttura della frase

costnte;

s~q'lf.enm-di-escap.e

++

N1JmerJ de l preproce~so.re

A..2

s-cbar

s;;,;.char:

( )

q~siasi membro delPinsiesfne dei caratt~ri cli origm certo il cara~e


re di newlme e

n:umero-pp .

s-char

:wzu..mero-pp:
numero
. num:ero
numro-,pp numero
'K!.rimrrrrj>P non-:nttrnero
numer9-pp e segno
n~ttm_ero-pp E sr::g;20

~ 1..5 Stringhe letterali

qual~i m~m.bro dell~il1S.i~me .de-i caratteri cli origine ec;:etto 11 car


attere di new lin e e >

s:rJ.qitenut-q~char;

\ numero-ottale

operatore:

4-95

.e,spresslon;e--di-as~eg-aamento

'

litpa:-.d'i-esp ressiorii-di-argor1te.1ito , espression-:di-ass.egnammto

496

497

APPENDJCEA

espressz. one-unarza
:
_
espressione'-.COn-s_.uffi$sQ
.
++ spreS$.t-Qn e- U. ria

.esp1.essio11t!-f?R-~stlusi~o

eiprefsione-OR-trzclustv : sp1ess.ione'-OR:...esclitsivo

rcs~i:(lt'l.t'""N_J)-logico.~ . _.
-espress,to1ie-O:R-znclitszvo .

- - fl.spress ioni;;-unarta

operatqre-u.nario esprssione:-di-conversion:e
si ze of espressione-unaria
si ze of ( nom-di.-tipo )
oper.tttore,-utrario.'. uno di
&

'

'1 f P~rio.ne~OR,'""l~gi,t~ ~ _ .. ._ .

;sprescsione-AJ'!D-logico
. .
.. . .
e_~prS5,ione-QR-Logico 1 I esp:te-ssto.n.e~AND-logzco

'

,ep'J[essi'o.rt~"'co.ndiziq1if!,ie: .

esprssio.ne,.,unaria

( rtr;J'me-di-tipo ) .espressiijne-di-c0.riversio1te
ffspressione.-m.ottip licativa-:
espres5io ne~df-cqn:versio ne
espressione--:moltiplicati.va
espressione~moltip!icativa

.f!spressione-1noltiplicativa

w ~spressione-.di-conversigne

/ espressiQ:ne-di_,onvers_ion_e

% espres.si.orie.~di-conversione

espressione:...additiva:
espre.ssitiile-rnoltipiic4tiva
tspressione""adr)itiv4 + esprcss:,io:rze-moltipliC'_ativa.
~

espre-ssio-ne-moltiplicativa

espressione. .,f,i-scr;rrirnento:
espressiorte-addi:t.iv
espressione-:di~s:ci:J rrimen.ta. < < espression
.e-additiua
:espressi&n-di-sc(Jtrimerzto >> espressione-additiva

esJ1r.essio:ne-telazio11ale:
es1r 1r11sj~
- i
ne-di -s co
- rrimentoV

epressione-relazionale < espre$sione-di;_scorrlmento


e$p r(fss.io12e~re~zonale > epressione-di~seor1~i112etzta
epressione-relazionale <=; fspres.sio ne-di-=-si:rrimento

eptessione-1ela~iq :nal~ >= e.rpressione~d


i-scorrimento

esptesswne-di;..uguaglir:t'f!.2J4:
espre~si9 ne ---r~lazio nale
e.sj>re$sion.e-di-uguagliii/nZ = ~sp1fs.sione'-rt.lazionale

r:spre.ssione-di,., ugua.glianza l = ~spressiotf-re.lazionale.


espression_e-AND:
:espressione:-lt'-tt~q,gli.t)nza

espressione;;.ANJ)

_ . . . .. _
'e-sp:ressionr:: ANI)-logico && ~spr(fssiqne"" .OR-inclusivo

esp.ressione'""di c~nversione.:

espressione-addi#va

& esp.ressi"one.-di-ugitagli4nz4

eSjfressione-OR-e!clu,!ivo:
.espr~s.sione,_ANIJ

espressiotziF-OR-esclu;ive "' t:sprQssiane;..A_N"J:)


epressia;ne"-ORLifzlttsiviJ;

(f_sp.ress_i()n.e-OR-iogico
espressione-OR-logico

? spres$i( 1ne

: espressiane"-condizi0n'f1,_Le

e;/j,i!'siane'7di-~ssegnarrl:~n,~o.: ...

rpresszone:..con.dizioriale
. . . . .. .
esp?ttssine--tJ.naria gperatre-di-assgnamento espres .
szone-di-dJ.segnan:iento

u:p.-q;n(ltr;:r.e"'"di"'tf.SSegnarnrfnto:

*:::;

I=

un o di
o

Va--

+=

<<=

>>=

&--

Ept'CSS!t"'One:

.esp1ttssion~- con.dizionale

sptes5iane , trrptessiftrre--di-assgnan:tent-o
1..tJ!r.ssi.ne-costante: ~ . . _
tiprtsiione-ondtzionale
;A..!.2 Dichiarazioni

dte.'&ia:razione:

..
.. .
sp:e:cifiche~di-dich'iarazicne elenco-dz.. .di. hta
ratQrt-1n,zz9pz,

isper1i.ftthe-di-di ch~ataziatz.e.:
.
.
.
,
. . . . .. . . _. .
pecifita ,-:di~classe-di,,.m.~morz~ SJ!e.aij.!c. .h~. -~
i-dzehiar4zioneopz
spee.ifica.-di-tipo specifiche-!f.z-dzc~ia:az.ion.eapz
qtfal~fcatore--:di-tipo .sp,ecificl1i1-dz-dichiarazione:opz
;

"'BlC1:1JiO-di;;,;die hiarttto ri..;iniz:


di'chiaratore-iniz
elenco-di-ditl1iaratori-iniz , diehi;aratore-itliz

ditchiarat'Ote-irtiz:
di-r:hiaratore
di"Chi4 r-ttQ_rF:

= i-n:izializ:z:p,tore

sp_eci:fiea-:di-clas-sr:-di-111.enzaria:
ty pe de f
ex te rn
st.a.t ic
a.uto
1

re gi st er

"'

11

LA S1NTAss1 DEL e

APPENDICE A
ijJ~ifia..di-tipo.:

quaiifiatore-di-:-tip.o.;:

voi.d
ctia r

con st
Vl ati le

sho rt
int

.d~chi41ato i;e~

puntat(Jreopz .dichia.rdtore-direttb

long
f loa t
double

ai'Chi{J,ratore~direito:

.ide1itificatqre
( .dichia-rato1 e )
dithiaratore -.diretto [ spressione~{)stante 0pz ]
rji~'thiaratore-dirfffto ( -eleJt.co-di-.tipi-di -pa'f.amtro )
dichitt;rato.re-dirtto ( -el'fnco-di-.idKitifi'cattiri0pz )

s .i . g n e,!;:[
uns ign ed
specift4--$t:rttct-o~tiniort

speeifica-enu:tti
nome:_typ-edef.
speci;.~./.:,.ca,strul"t-o,__unz.l)n:
strU:_ct-o.~union ideritificq.tore { eienco;-.di-dithiarazioni-strttct}
.rt;ruct...a~'IJ.ni:on i.dentlficatore

7.i"n.:tatore:

* elerl.C'Q-di-qualifir:4to-ri~i-tipo 0pz
* elenco-di-qitali.fi"catori-di-tipoopz p"ntator~

,ef}~nci) --di-qualifitori~di.-. tipo:

strz~c;t-o-u.rzion.:

qua_lifi'catore-di-tipo

union

(len-co-d?.-tip i,di--para1netto:

elenca-di-dichJarazitt1-struct:
diehiarazione-struct

eltnca~di-paramtri

-elnco.-di-parametri , ...

elenco-di~di
zioni~st
ia'razio
- chi(l.ra
.
- ru.ct dich
. . ne-s-tf"Uot
-.

. .

'

~t~.~-q~(ii-partt.mtri:
tf,ich iaraf.-ione~di-parametro

'

dtthi'arazio ne-struct:
(lenco-di-speciftche-q.ttalificatori elencb-di-dichiaratori-1truct ;

.elenco-di~parametri

elrtnca-di_,speeifith.e-qual~fitaterl:

qitalifiatore:-di'""tif,o
-

,J,-

spel:ifiche-di--di-ch ia1'a:gione di:~ia:n4to re

spe.cificl1~di-dit:hia.razione dich.iatatore-1Jstratto 0pg,

ele_nc_o-d:,..fP-ec~fi:che-qualiftcatori pz
0
V

elenco-di.-dithiaratori..,stru. ct:
dichiara
truct
.... tore--selencoqji-:tiiehia1atari:-s.truct , dit:hiatatl1re,-strt1..ct

i;J~t)fQ-di.,_identificatori.

dich iarcttore-stritct:
dichiarato re

nomt.-di~tipo;

'

identificatore
.elt:nco-di-id.entifica-tori , identificatore

dich.iardtoreqpz :i

.elenco-di-sp.ecifiche-quatificato,ri diobiaratore-"tJStratto op~

espre~sione-costari.-te

rl,-ichiartre-astratto:
p.un-tat(}re
_
punt4tare0pz dicharatortJ:--artratto-dirtt
.

~pecifiaa-e1:Zum:

enum f.dentij.catore 0pz { elento-di-rl'lttm1~atori}


enum, idefl,tificato1~e

( dichiaratore~astratt.o l
dichilt.rtore-astratt-dfretto op.z I ttsp ressio~e~c~st~nteopz 1
dichiardtot-astratto-diretto opz { elenco-di-tzp~~dz-p4ran1,r1trQ 0p74

.enumriratore
, enumerato1'

of/ 1'l u nier~to re:

costq:nt_e:...di-ert-u'ftterazione
co-sta.nte-di-:enu/meraziotie

'

di~iarata:rr:-as.Pratto :...diretto

,f/le1ico' di-enitmerttto ri:


l~nco--.di-enumertttr;ri

, dichiaraziotJ,t-di-parametto

utt'JI rt41"
4$tO
.ne-d
. i.~parametrJJ:

specif!-ca-di-tiJl,o elenco-di-spetifiche-qu4lificatoriqpz
'

~lertco-di-q1utlificatori-di,,.tipo quatifi, catore-.di-tipo

str uct

499

rn.gm_e, .typedef
1.den-tifica-to re

= esp ressione~e,ostq.n-te

seo

APPENDICE A

.inizializzato re:

dichiarazione-ette.tna
unitrdi-traditzion .die.hiara:zione-e_sterntt

,.Ji-c.hi4razone-tsterna:
definir;iqne -di-fanziotli?

iniziaJ.izzato:re
, ini-Zia/izgatore

t/;cfinitione:-:di.fnzione.:

-
.istruzione:

istruzione-et.iehett.ata
is-nuzion ~-composta
isttuzion.e_,di-:.espressione.
istruzione:-di-sele2;i.n

A.3

, _ .

. .

tsf:rt:J?:zon---co1nposta

Direttive del preprocessore


gruppqopz

:-gruppo:

'

-.

istrtJziQne-~tich.ettat-a;

par.'te-di-gntpp~

gruppo pdtte-di-gtuppo

ide1itifi.cato.re : istru:zione
.
.ca se espressione-costante : istr.u.z~i)ne.

parte""di-gri_tppo:

d:ef aul t : i.rtruzione


. .

Scirnboli-pp 0p~ n~lin:e


soziott~-if

ts.truz
ione-c
o1npqsta:

{ e/e,r.zr;o-di-dichiarazioni

-eler1;;0.~di-i.ttruzioni0pz

riga-di-conrrollo

se:zi~ 1~e-if:

elen~o'-di-dichiarazioni:

gruppo-ifgruppi-elifopz grupp:o-elsrt'opz riga-enaif

dichiarazione
elenco-di-dicJ1iarazioni diclJ.iarazione

grppo-if
-

elenco-:di-iS.truzioni:
is.tr:u
. - - ~ionr:

1'

ele-nco-di-istro$io ni istnJ,zo"ne

# if espressione-costdnte newline gruppo opz


# i f def ide-ntiftc(l.tore newline gruppo'opz
# ifnd ef iden.tificatr?re newline gruppo.opz

.grupp i-tlif.

i$trttzio ne-di-espresti;one:
espressione~pz ;

istruzione-di-selezione,
i 'f ( espre_srion-e )

fftl~de!rpreprqcessor-e;

iJtruzione:-di-.ite-razione
istruz
- . iane-. :di-salto
. -.
-.

specifiche_,di-.dithiarazione0p~ dichitfratgre eler.lco-di-:dich.iarttzwnt0p!?i

,._

"

gruppo-elif
g,rUppi~elifgruP)'iJ-eiif

grttppo-elif:

istruzio.n~

( ~spre-$sione ) istruzi:otze

# el ,i f

else istrUzione

swi te h ( .espre-s1-ione ) istruzione


.
,.
d:i'-z'terazt.one:
istruzz
o-.new hile (
do istruz_
ione Wh le ( espressio1ie ) ;
f or ( spressiortl:qpz ; e_spre,ssione.op~ ; espteJsiorze0FZ
1~s-pruzi.one-di-salto:

goto identificatore ;
cont i nue ;
~

retu rn espressjone0pz ;

espr~ssione""costante nivline gruppo opz

K!JUJ)po-else;
_, - # e.lse newline gruppe opz

.
.
espres~ione ) tS1:nlZtQ1'J,:e

brea k

dichiarazirle

A.2.3 lst-rnzioni

if

unita-di~ttaduzione:

. ele,ncQ-'.d~iniz.ializza.,tori:

el~nco-di-inzzializza-tori

-:..

A.2.4 DefiniziQni ester ne

espressione-di...,,ass~gnamento

{ f/enc.o-di-irJ.izirJli~atori }
{ r!/EJnco-di-i1J.izia.ti~tori .J

LA
. . srNTASSI DEL

rig'IJ,""'en4if
---

) istrttzione

# endi f .newline

tig-tt-di. .ctJntto llo:


simboli-pp newline
# d.efi ne iden-ificatore elencq-d_i-so-stituzini newline
_
# def ine idetttificatv.r.e lparen elenco-di.~identifit~,tori 0pz ) elenco-di-sastituzioni newline

# incl ude

# unde f ide11tificatore newline


# line $.imboii-pp 1iezvline

APP ENDICE A
# err o r s.ir~b()li=--?P opz. ri.ewti~e
# prag.n1a s-imbolt-PPopz neiJ.Jltne

lpttren:

il caratt~re di p~entesi tonda -aperta se:nz~ spazi bianch precedenti

~itn:b(Jfi-pp.:

sz'm bolo-del~ptr!procssore
s.im b()Li-pp sirnbo!()~del~preprqte~sor~
fiezuiine .:
_e

il c~attere di newline

(Diritti d'~rutore: q~res.to materiale stato condensato e da ttatio a partir~ d~ d.oc1ime nto
~ercan N atQnal S~~dard far Informat9n Systems-P~ogr~ m.n1ing Langag~-C~ AN
Sl/
ISO 9&99: 1990. Copie li questo ~randard possone essere ac(Squistate dallaAmerican National
-St-andards -Institute~ We-st 42nd Stre_et, New York, NY 1003"6.)
1

newlzne

elenco ..di:-sQstituzioni:
simboli-ppop$

AP PE-N DI CE

La libreria standard
B. I

Errori <e rrn o. h>

~~D. OM

ERANGE
Questi simboli si espandono in espressioni co~tanti inte re con valori discinti diversi da
;z~Jo_,. adatt :aU~utilizzo nelle direttive #i f del prepr.os.sore.
ffrr no

Un valo;Ce di tipo in.t che e imp osta to con UP p.Wl le:'[Q di errore p-$itiv.o da diverse
,:ln,1112ioni della libreria. Il valore di errno -zero -ill.'ini$o dell'esecuzione del prog[annia
J
ma non ma.i impos:rato a z~ro da nessuna funz1o.ne della Librei:ia .. Un progra:nl-n1a che
iUJil izz:i errno per il con trol lo dell':errore dovrebbe impost:arlt> a zero prima della chia
mat a
a un.a funzione della libreria_ conrrollare il suo valore primfLdi effettl:larne unaltra. All,inizi0.della pr,~pria .esecuzione una funzione della libreri~ pouebbe salvc;-e il valore di errn,
o
0 -irnpe>starlo a ~ei::9_ , .r1pristlnando quello originle. qua
lora er r 'nO valga anc ora z_ro poco
prima del ritorno. Che e.i sia o no un_errore errno porrebbe essere iJnposraro a un valqre
tli-~-rso da zeto da: una. chiamata a l_tna funziq_n:e dell libreria, qualora l,utilizz.o di errno
~0ri
sia, dcumentatCI nella descrizione deJla fun7-ione ripqrC~ita dallo standar-d .
.
1

-- ..

-~-

B. l

Definizioni co mu_ni <s td de f.h >

NttLL

Una r:e_stant e-di _punratore null definita dall'implementazione.


0ff.setOf (tipo , desif?1atore-di-m,tfm.bro')

Si esp:ande in 1uiespres~ione cos_rante

inte ra di tipo siz e_t ) il cui -valore roffse:r in


Uyte pr il membro della stru ttur a lspecif1a!:t, d! designattir-di-membro) dall'inizio del
Jl9 tU>o d ,strutti:u:a (s-peciflcato d.a rype),. IJ de$ignat:re-di-merilbro ddv r e-ssere tale
_cl1e)
(iatG

st at i tipq t;

f-~pressie:ne &

c:cmpo_rtarnenro

..

( t.

d~igpatore-di-merobro)

~ara ind~fnito,

sar valu tata in una cos_t'1nt di indiriz.to, (ti


qa:aloY il mm bro .sp,eifcato sia_un :ampo di bit) .

P"t P''d i f f _t
Il tipo intr:o con segno restui~ o cl.alla sottrazi-n e tra du't~ puntatori.
s~i:z -e

.t

504

505

ArPENDICEB

Verifica qual~iasi car~tfer:e che sia una letter.a min~s.ola.

Il tipo intere> s-e;a:za segn.o restituito dalll operatore s i z.e of .

in-t isp rin.t .( int e) ;:.

wchar - t .

Un tipo intero, il cui intervallo di valori pu rappresentare codiei distinti per rutti i
membri deil insieme di caratteri pili gran.de sp~cificat tta cru1li dlle localizza;zioni supponate,
] caratter~ ~ullo li.rive aver il v~ore di qdice zer,q~ m~tre Ogni inem~ro dell'insieme cli

Verilca qualsiasi cara.ttcre stampabile, incluso lo .spazio (

1
i

cara,tteri di base 1deve 2.vern~ uno L1guale a. qu~Jlo dle si otter_rebbe utmJiz7;flndolq da sglo in
una e~s-t;;inte cl.i ai rartere' intera.

B._3

Diag;nostica

iht tspunct(int e);

/il

Vecifia gni carattere stampabile hc nQn .sia net uno spazio ( ., ) n un ar~ttere pr
q_uale ~a vera is-alnum.

i 1n t isspaoe ( int ) ~

<assert~h>

Verifica qu.alsiasi aratter h.e corrisponda .a uno sp~ia .biaJi,co .-.st~ard; I car.att~ri ~
.spa7iib bianco -standard so:no: lo ~.pazJo ( ' -. i ) il s~ te pa:g,ina ( ' \ ~
il ~,~w11ne ( ' \ n ) ,. 11
1
1
dtpn carr~llo ( ' \ r , ), la ta.bul~iQ.Jl:~ oriz,zop_le ( ' \ t ) e qudla -v.:e.n1ale ( \ v ' ) .
1

voiJj assert ("int espress_!lone);


T ~

cl il..
d'
h .
. ('), l
La macro as sert inset1s:c::-e _-e e 1struz10-r11 . iagnst1c e ne1 _ptggr:amrn1. ~ua or.a espre-s s.ion sa fal~a quando $ar e~egita la. mac~ asse rt s.criver: riel ti.te dello standard
error dell~ informazip.ni r~tive alla chiam,ata fallita (fnclt!SO il testo ddl argomentQ, il
f:l'Offi: del file sorgente e il SUO numero di riga; gli Qltim.i SQOO rispettivam~nte i -~alori d~lle
macro del preproce,ssote F1 LE_ e _LIN.E~ , in u n fomiato defioito dall'iro,plem.entazione..
Il messa.g_gio s,critto pttbbe avete la forma

) , .

~~t

Ass.e rt 1on fai led :

espressione~

f .i le

Verifla q_1Jalsi_asi tart tere che sia una lettera mai11sc9l..


.irn; t isxd ig .i.t (' . nt e)' i

Veci.fica qualsiasi caratter~ cl1e sia un

n'Ulficrd

esa<l-e~imale.

iht t ,o,1ower ( int e);

'-)1.z, li ne nn.n

Ia. macro assert richiamet~ quindi la funzione abort. Qualora la dir: ~ttiva ,del
p.r~p.roces~ or

#df ine NDEBUG

Converte una lettera maiuscola ne_lla sua crtis.poti:clenc.e ntlnusco:la. Se la funzi~ne


:Jrs~pp-~r, :applicata all'argomefJ;tO) vera e.d eyiste un caratte~e- ~o~ttispen~~n.te _.pr, CW la
j( 111 zi~ne islower sia veta,," allora ,la _funz~ione to.l .ower rest1tu1ra quest ultimo, m caso
G"Gl=I.tt-at:i.O verm resrituito l'argoment0 inalterato.
1

appaia in un file s9rgen.te in cui s~ stato incll1S~l asse.r t. h_, rutte le asserzioni del file

sa.ra n;n O ignorare.

B.4

isup,per (.i nt e)_;

t;oup'pe r ( int e) ;

itl"l,t

tlint.i~ne
is;l(!)~er, applicata alliargoroent9, (; vera. ed_ esiste un caratrei:e :o:ns1,011~ei:te pe~ u1 .la
~i.o.ne ist:1pper sia veta, allora la funzione t .oupper restituua quest ultimo, u1 caso
.;~~tt~;io verr _rescial ro 1argpmen to inalterato-

Converte

Gestione dei: C'a_


r atteri <ctype.h.>

L funzini di questa sezi.o:ri reStituistono i1n valore diverso .cl.a zero '(ve-ro) se _e solo se il
valo,re: qeil ~rg<;J;mentQ, c c9nf9rme a quello d~crittq nel commento della funzi on

una lettera rn inus:col~ nella

su

cctris_pondente mait;Lsco1a. S~ la

Localizza_z'ione ,< 1ocale.h >

int isa1num(int e);


Verifica qualsiasi carattere _per il quale siano ve:r.e isalpha o i-Sd.i git.

--

int isalptra ( int c. ) ;

-Verifica qualsiasi carattere p:er il :qu.ale srano v:e-re i ,s upp er o islowe~r.


1

int iscntrl(int e);


Vrifici qualsiasi carattere di ~ont.bijo.

v~tJrl<::a

=--

N'tl'' LL

iot isgraph(int e);

int is lowe,r ('int e) ;

@~l~re- utilizzati come pri_m.o argQ111~nt.o ddla. fu.rrz1one s: etiocale~

. . carattere numer1o
. ,.d ec1ma.1e
. ~I .
qu.aJ s1as1

Vetinca. qualsiasi carattere stam,pabile, eccetto lo spa-zi0 ( 1

..... -

(~JI"sti .s imhuli si espandono i.a, ~piiessio~i ca.stanti i~teJ,:e con vaigri d.~tinti) aatti a

nt isdigit(:int e) ,;
""\,r ' .l".

1-0 _AlLL
l :C een.!. LATE
te e.J'YPE
LS MO.NE:TARY
lLQ- NUMER.l C
~ e Ff'!ME

U.na os~ante .di punttote nullo definita dall'impt~mentaxiont.


I )

"

-st:Fu ct::. l .co n v

506

APPBNDICEB

o,n.tiene d.ei membri cgrr~Iati co1:i -la foI'mattazioae de.i va.lori num.~r.ic;i.

La

struttura

deve c9ntenere in qualsiasi ordine almeno segueori membri. Nella localizz.aZ.ione ' e
men1bri devono avere i valori s.pecifca:ti nei commenti.
1

char *cl.e oimal point


c:har *thous.an.ds - sep ;:
char .,. g ro up i ng ;
char :1r i.nt_cu rr _.,s ,y:mbol;
char *curr1'ency_
. simbo-1
char *mon_decimal_point;
char *mon~thous , a:nds_s ep;
char *mo.n_g rou,p,ing i
c.h ar *posi tive._s ign ~
.

c,h ar *negative_:sigh ;
char i nt - frac - cLigi t s '
c,h ar frac dig ts
-

'

cnar p_cs_precedes;-

/*
/ 1r

!*
/*
/*
/*

/*
l*
/*
/*
/*
l*

Il

Il

it

11

Il li

Il

11

*I

ULIBREIUA STANDARD

l)n puntatore nullo per lo~alizzazi:o1 ne far sl cliela funz~one .s tiooale restiru_isca
un puntatore alla srrmga associata alla categ.ori:a per la. .locilizzaztqne corren,te d.el pro-

:gramma;. questa o.on sar rnodif-c.ata.


11 puntatore a stringa rest~ito dall~ fumio~e set~oca~e . ..tale ,che una ~1iccessiva
hi?futa con quel valore di _sttin.ga e la <.,"ategori.a ass~ciata :-iprts~era quell~ p~tc della
.l@calizzazi_pne del p.rogram.r;na. La ~tri11ga pLtntata sara m~d1fcabil~ dal prograrnma, ma
~Q.tr essere sostituita da una 5ucct::ssiva chia.rhata alla funzione setlocale.

*/
*/

*/

Il Il

*/
li Il
*/
(~ >~
*/
11 ,fl
'ff 1
n 'li f
*I
(< ~
CHAR _MAX *I
CHAR MAX *I
~e

I '/<; CHAR- MAX. *I

I* CHAR MAX */
/ -lr' CHAR MAX */
char n_sep_by_spac,e j
I '* GHAR- MAX */
char p"-sign_posn)
/'* CHAR - MAX *l
char n_sign _posn;
/ * CHAR MAX * l
char *setlo.ale(int cat~goria, const char x1oc.a ii-z Lazione);
o-har p_sp_by_spaoe ~
ehar n- es _ p~, recedes ',.

507

La .fjmzione- setloca.le seleziona la porzione appropriat~ della localiz-z.azi"one del prog.rarnma, cpme sp.eei.6.catQ dagli argomenti catego,r ia e locali2_z azione. La funzione
set locale pu essere tLtilizzara per modificare o interrogare l'intera localizzazione corrente del programma o porzioni di quella. Il valore LC_;ALL per categoria nomina l intera
localizza2.irn:e del progFamma.j gli altri val_ori R.J; c:ategoria nmina.no solt(J.Ilto una porzjon~ d:lla 19~~azion del J'r9&"ramoT~. LC_C0 LLATE influi~ce sul comportamento delle
fu.nz1oru strooJ.l e s.t rxfrm. "Lc_c;-rVPE influenY.a quello delle fuo.zioni per la gestione dei
c,aratteri e d quelle multi-byte~ LC_MO'.NETAAY agisc(j! sulle inforrnaziGni relative .al_laformanazione
dei valori Ill:onetari res.tituite dalla.funzione -l o.c aleconv. LC_NUMERIC agsce sul carattere
separator dei decimali per le funzioni di totmattazi_()ne dell'hput/output, pe_
r quelle di
conv,ersione delle string,h ~ e' P''J; l'infor;mazione 'di_fc)rmar:razione dei va.loti n0n monetari
restituita. da lacal,e conv . LC_ TIME influis.ce s.ul co,mporr.arne.n-t0 di $t rft.i .,me. .
.
1

Un valore uc 11 pe_r .l ocalizzazione specifica l'ambiente minimo p.e r la t.taclu.zione e"


mentre il v:alore 11 " s.p_ecifica l'ambiente nacivn defrnito dall'implementazi(J>ne. Possno
ess~re passate a setlocal:e anche altre stringhe defnite dalljimplementazione. All'inizio
dll' esec.uzione del prog~amipa sara eseguita .Lequlvalnt di

setlocale(LC_ALL, "C");
Qualra per .l ocalizzazione sia stato fornito un puniato.re a una stringa e la selezione p~~sa essere soddisftta, la_funzione set1ooale restituir un puntatore alla stringa
~soqa;t~ alla catego,ria _
specificata per la nuova loGaliz.zazion@. Q.ualo.ra la selezion no,n
possa essere soddisfatta, la funzione setl.o cale restiruir tin puntatore nullo ela localizzazione del prog.t amma non sa:t. ta:tnbiata.

s:t ruct lconv

* I.o aleconv ( v.oid) ;

La funzion:e. localeconv imp.()st i componen di un oggetto di tipo str.uct lco~v


~g;n i valri appropriati per l;;t formattazione di qu~:i.tita ~u1ne.riche (monetane e no11-) LD
~~co;d9 coil le regole della localizzazione corrente.
I membri di tipo char * dqlla. suuuu.ra son0. p.u ntatqri q ~tringh~) g~i.urto. de~ ~u~i
(e~G.ettP decim~l._point) p:u punta.re a 11 11 per indicare ~h~ .~ valote i1on di_s.p~n1bil~
nlla localizzazione corrnte o di lungh@zza ~ero. I membri~ tt~o cnar s?no de_tnumer:
- -.- n ega uv.
_ 'l-nuno dej nuali p:,u essere CHAR.....MAX p~r 1nd1:care che il v.alore non '
AOll
. 1J 0. o
- - -. "i
dl$ponibile nella localizz~ione corrente. "I .rt1embri inclusi sono:

cha r *decimal_point
Il carattere sep~atqr.:e dei detirnili) util.4zato p~r fotinattare le quancit non m.one

tane.
. .
":

char thousands_s.ep
Il cratteie utilizz,a.to per separre i gruppi. di cifre_, prJ_rna del carattere separatore
.dei decioi~i nell quantit nQn monf;tari:e formattate.
char *grouping

Una stringa i cui ~lemenri indicano la dimensione di qgni gruppo di cifre nelle.
qu,.ntit non monetarie formarrwe~

ohar ~int - curr - symbol


Il simbolo internazionale della valuta applicabile alla locallzzazione c?rtente. 1 prin
a:_e .c,aratteri ceriterigbno il simbolo aJfabetico intern,azionale ~ella v-alra in ~ccordo con
. if
-. catl neu. ~rso
. 4217' 19-.s:7 Il nuart:ocartt@re(inl
. med.ia.t.amente pre_
cedenr.e que.l.lo
q11e-~w
. spec
'1-- .
iitlo) quello utilizzato per separare il simbolo internazionale della valuui dalla q!1nt1ta
.
mqnetar1a.
-

"f" .

. J ...

. . .

..o--

..

bhar *Currency._ symb0l

n simoolo della valu.t~ della localizzazione applicabile a quella cou:er1te.


G:har '*mon_decirnal_p ont
Il carattere separatore dei decimali utilizzato pr formattare le ,q uantit mqn~_trie.
char -*man_thousands_ sep

Il s,eparatore per i .gruppi d cifre ,prim:a del carattere separatore dei decimali nelle
: quantit m,neta.ri,e fom1arta~e~
dhar *mon_group i ng

- .. . . "?na __striil~a i cui elementi indic~-0


la di m en si or t di o . . . . . . . . : . quantica monetape format:tat .
gm gi;uppo d1 af te nell. e
c ha r *p os i ti ve _s ig h
_ .ganv
. La
tri
ng.n""' uti;llb....za
ta pe r- 111
dicare
ne
o. s::
.

Ul 1

.
~
.
qu an-tr... ta' m
onetar.ia
fo. rmc
tati\. di val(lre nn

La string
- -.-a ut
. di"ca
.. ilizz
. re-. una qu an tit
. -.at.a p. er- in
. . . m-one
. taria
. fior.mattata. ..d"! val re nega-

nvo .

eha r

I. _.n t.:_f

it s
rac_1:1..r.ig

. - . " Il nu. .mero


. ' .1'fire ft azJ_
onar1e uelle do . 1'1 . .' '. ' '. . . .
v1s _al1zzare Jn un adi'qucan
..
.
ci
'
.
_ . . . ~. .
PQ
ca
ra
tte
re
-. t,a m. 0n
se
ra to re dei decunali)
etar1a ro rm at ta ta se-concl0 le .. -pa

r.
. -.ternazi0
-
. nal1;. .
' r~go e 1n
ch ar f. ra c_ di.g it s

e.

da
.

v is u ru !: ': e: ad iq '_ cifr~ ~azo. narJe. (que


lle. dopo il taxattere se_para~ore clei decim
ali) d
, ua nn ta m on et ar ia formattata.
' a

ch ar p_ cs _p re ce de s

. - . . Impostar~ a 1 o a O fa r.ispe:tcivam
segua il valore d1 un a qu an tit monetari ente in mod.o eh . .. .. ~
. .
.
.
.
.
r. _ ~e cur. rency_symbol preceda
-. .
. a no n .ngativa ro
o
rm at ta ta.
ch ar

p'.....:sep_by_sp~. oe

. . !~postata a 1 ~ a o.fa rlspettiv~rqen


te in m od o eh .
se pa ra to co n un o spazio dal va l re di un
. ..
- .
a
.
.
_
.
'
.
.
~
cu
rr
en
cy
...
bo l sia o no
.
. qu an fi ta m on et ar ia no n ngat.t,svym
f
' ch ar n_ cs _p re ce de s
.
.
... .
rmattata.
Im po st at a a -1 0 a o fa r: .. p tt ' .
. m od. , h . ,
e 1vameate lll
segu~ il valore di una nuantit m on

,
.
,.
et

"

.
.
.
.
~
o
e
~
cu
rr
en
cy
_symbol preceda. e>
- ..
~ a negan.va ro rn ia tta ta .
ch ar n_sep_by_..:space
i
Intpostata a 1 o a O fa rispettivam t
separatd con uvo ~pazio dal valor di una~n .. . -d -h
e
~
,mo :o ~ e. c11rre11cy_symbol sia O' no
.- - quann.ta monera
.

. ..

. J~postata a un valore
m on ec ap a n0X!

negativa

ch ar

n_,_Si gn_p~sn

r1~. :pegat1va fo rm t ta ta .

in~icante

fol'l}1!lttata.

la -osizione- di - . -. . .
. - .
p
. po si ti ve ._s ig
n per una, qu an ti t

l~postata a un valore .indica


mon
nte la- po

.
.,,.,
.. a- ne , . s.m
. ', .on' ,e . di'
e
. - e~.1
ganva ICilrmattata.
. n eg.at.i. Ve si g'n . .
, pe uaa qu an nt.
.. ~l
guen
n ite~l
goemleep: .ti di groUping e m
. pi_.ng sono
. m
- terp1etan..m
. -on _g- r ou
a:cc6rd9 col'! le seo,-

C~R MAX

1~gl:

Par.e.P.tesi intorno alla quantit e a currenc,y~s


ymbol.
1 L-a suinga dl segno precede la quantit eil cu
rrency_symbol.
2 4 t ~rringa del.sgno segue la quanrita e il cu
rre.ncy~symbo~.
3 J,..ast(irtga del segno prcede direttamente il
currenc~_symbol.
r4 Lp.. str in ga del s~o segue direttamen
te il eurrency_symbol .
La fu nz io ne lo ca le co nv resti.tuisce un
plll;lta<Qre all'ogge~rQ completato. La st ru tt ur
a
1'ffi1itltta dal valore restituitQ no n dovrebbe essete m
odifkata dal programma, ma pu essene sostituita d:r un a chiamata suss~gpente al
la funzi@.ne lo ca ie co nv . ln<:>ltre, l~ chiam
a,i:e
-all fu n, ,io ne se tl o ca le con le eategorie LC_ALL
, LC_MONETARY o LC_NUMERIC ppssono
sos~"" .~t1 'ir i co nt en ut i della srrurrura.
_...

B~6

M a te m a ti E a

U na costance

< rnath.h >

&.imbo.lic~ rappres'nt anc un'spressio,n e

do ub le posiriva.

deuble ac os (d ou bi e X};
Calcola il valere pcindpale dell'a.rc9cqse11i;> di
x. un t f re di dominio si verifa C(/O
-:.rgomentl no n cotnpesi ne lf intervallo [- 1,
+ 1). _La fn nz.i9ne ac os resti~uisce l'arrocos
en'il
~ndl~intervallo [:O p1 radianti.

LW ,

ch ar p_s .i gn _p os n
-

pJiroa di que;'Uo cirrene.


l ..alori d'i p_ si gn _p os n e n_ si gn _p os n s0rt0
interpretati io. accordo co A le seguenti

ch ar *nega.t iv e_ si gn
,

U valire intero il Jitllllero di cifre che compren


de il gruppo corroot. Lelemen<'i
J;.Uc;ssivo $llrti~ato per derenninare 1a di
m.ensione del prosSiln grupp di cifre

'tilllrO

N
.l-Il. ULre. r1 9r. .
f! .
-1n .,de.ve. essf!
. re, es~ eg. uito alCl.
. ppamen
~ rag.g:ru
t
.
.
e
e.
m
on
to
pr
ecedente deve essere lt ti li ii t 0 . . -..
cifre.
. re
a np et ur am e--n te pe, r il
sto de
. lle
''

double as in td ou bl e x) ;
Calcola il va lo re principale dBll' arcs'en di
x. Un errore di dominio Si vecifio:a con
ai:gomertti nM compresi n.ell'intervall [1. +1]. L a funri.one a si n restituisce 1' a.rcose
n
1
~t~ll intervallo [-p/2) +,p/2] radian.ti.
do ub 1 e a ta n ( do ub le X) ;
C al co la il valjlre pr in ci pa le de ll 'a rc ot an
ge nt e di x.
l'5arCatangente nell'interv-allo [-p/2 +pl2

Lit

fu nz io ne at an re st itu is ce

1 radianti.

ao.u bl e at an 2 {doubl~ y, do ub l x) ;
l funzine at an 2 ea ko la il val(}re principle
de
ll
'a
di enmnhi gli argomenti pe r determinare l quadrante rcotangen~e di y /x, usando i segni
del va lo re restltuiw. U n errore di
dornihi() pu:Q verificarsi se en ua rn bi gli Mi'J
me.nri s()n9 uguali a ze ro. La funzi:one at an
2
re-$tltuisce i~ ~otangente di y Ix n:ell'inten
r:allo [-p1 +p) ,:adian.ti.
d.o:uble ca s ('dou bl e x) ;

Calcola il coseno di x (misurato in radiano) .

A~PENDICEB

do uble s in( d o ~ b1 e x ) ;

Calcola x elevato. alla. potenza y. Un t;rrore di domini9 .si v~r~ea s~ ~ ~ ne~a~vo e_Y
'
.: 'ore L,1 cero Un etrore di .d omi nio .si verifia anch,e se il risultato no11 puo. es :ere
JiOn e un v ai
. .
.
.
, .
~:.c. . . . _
.
..
.
.
.
d
x
"
e
u&u
ale
a
zero
e
y_ n11nore o LL2:ttale a zero. Pu veil lla rs1 uo
rRppresentato~ qna11 o
_0
...,
errore di oyedlow o di LJddlow.

Calcola il seno, di x (mismat0 in radianti).


do~ble

t .a n(d oub le X) ;

Restit.uice la tang ente ,di x (mi~ur~~o in rttdianti).

d 0 ub le ~sq. rt ( doubl~ ~ ') ;


1

dou b1e cos .h (do ubl e x) ;,

C_alcola il tose'no ipe_rbQlico di x. .Si verifica tin errore di overflow s.e iJ


di x troppo grande.

LJ~ LIBRElllA STANDARD

Calcola la raclice, qu.ad:rata no ii 11cgatva di x. Un erro re ,di drn.inio si veri.fica se


targamento negativo.
-.

v~ore ass_
oluto

il

aou ble cei l(d oub le

dou ble sin h(d ub le x};

~1;

Calola il valore intro pi' piccolo no n minor.e ,tlj x.

Calcola il s eno iperbt>lico cU x. Si verifca un errQi-e di over-flow se il 'tala re assbluro di


x e troppo grande.

double tan h{d oub le x);

dou ble fab s(d 9ub le x);


Calc-0la 11 valore assol:o del n,1unerc) in virgola mobile x.

doub le flo or( dou ble x);


Caltla il -valore intero pi grande non maggi.ore di .x .,
1

La funzione tan .h calcola l::i tange;nte iperboliea di x.

dou ble exp (do ubl e x);


a.Iola la funzione esponenziale di x. Si verifica un errore di everflow o di underflow
s~ x ' ttop p.o grande o troppo picolo .
do \J b1e f r ex p ( d oub1 e

v a1o r e , in t * e x_p ) ;

Suddivide il numero in virgola mobile in una, frazione normalizzata e in una. pot~nza


inter.a di 2. Immagz:z..n(l l'mt ero nell'oggetto int pun tato da exp . La funzione
fre xp
restituisce il valq re x:~ tale ehe x un dou ble-co n grand~zz~ comp.re_sa nell'intervallo [1/2
I] zeri)', met ltre val ore ugttale a X volte .2 elevato ~a pote.nza *ex p; Qu:alota val
ore
sia zero entrambe le patt i del risultato sar:anno z.ero.

doubie lde xp( dou ble x, int e:x-p)L

elevatp !).ila pot enz a ex:p..

dou bl.e log {do ubl e x);


Calcola il log:aritIDo naturale di x. lJn errore dl d0m inio si vrilca se I' arg ome nto
negativo. Un errore di ov:etflow pu9 veri.6..carsi se 1Jarg0mento ugale a zerq.
dou ble 1og10{double x);
Calcola il lggarifpi].() i11 base 10 di X. Un erro~e di d,orinl si v~rifla se l)argo:rnento
n~gativQ. Un errore di- overflow pu verificarsi se r9-fgo meo.to uguale a.
zero.

*i~tr) ;

Sddivide l'argomento val,o re ib una p,arte inte..ra e in un_a frazionaria, ogn gna delle
qu_a.li ha lo stesso se:gno dell arg()Jllento~ Immagazzina la _parte ,intera eome dou ble nell .og~
gett e pun tato da ipt r . La funzio.n e mod f: re.s tiru isce la par t tra7iionari~ _o n segn
o d.i
7

Calla il r~sto in virgola mobile di X I Y.

Salti non locali <setj.mp.h>

B.7
j m.p_b uf

n tipo vettoriale ada tto a m~tenere le informazioni n.ecessarie


ambiente chiamante.

per ripristinar"<~: un

int se-tj mp (jm p_E luf arri b);


,

Moltiplica _un nttmer in vl.rgo}a.mobile per una pot enz a inte ra di 2. Pu verific.:arsi un
errore di overflow. o di underfl~w. La -funzione lde xp re~ti_ruise il vaJ,o..re di .x "v~olte 2

dou ble modf(double val ere, dou bl

dou ble fmorj(dOuble X1 dou ble y};

salva. il ~uo ambiellt chia man te nell ~ar.gomento di tipo j mp _bu f, per w1 suc~$s1vo ,
trtili-zzo da p.arte dell4 fuJ1z;ion~ lon gj,mp ..
Nel ttaso iii i il ritorno fo~.se da u.Uinvazione dire tta la macro s~tjmp res~tui
rebbe il valore . zero~ Nel caso in cui il ritorno fosse da uil>i,q.vqazione alla funzione lon g Jmp
la mil_ro ~-1 t j mp rstiruirebbe un valore diverso da z~o.

lJn,
invocazione della macro set j mp dovr apparire solamente
.
.

i11

un0 dei seguenti

con test l:

l,i.nter.a espressione di controll in un istr uii9 ne di selezion e-o d iterazione;


.
- ~
-d . di ., operatore .relazionale o di ugL1aglianza il clii seco ndo o~er,ando S14:
~1
opeess1
r~ on~
_o - . n1.t1 ~ira co-s-t an
- t e e que lla risultante sia l ince ra es-pressiu11e di con trol lo di
un espr
i ....., .. - . .
. _.
- . .,
- , .. - uni stru zio n di selezione o di icera.z.10.ne;
.
i~operando di un nperat~re un:iro .! l~ cui esr,r~ss_ip~e ris.ultarrte ~ia l intera espressrone
di cnrrollo di uil :lStl'uz10.n e di selez1one o di iter azio ne, o
1,intera e;spressione di tLn?istruzio.ne C osti tuit a da una_ ,sola ,espres$_ione.
1

val ore .

dou ble pow(double x, duble y);

,vod lon g j mp ( j mp_buf mb, int val ) ;


Ripristina I ~.rn,bien,te S.<!lv,ato qall~ _pi r~~en.t~ invoc~ione della..m~ro. set j mp nell~
ste'i!isa chiamata del. progra 111ma,, con il om $po nde nte argo men to di npo J mp _bu f.
Nel

512

APPENDlcE B

asq in ctJ. ~on i _fosse sta.ta 11na, tal~ inV:ocazi:one, o se la funzione cont en.e nte qu lla della
m_a:to s~t l ~p .;ivesse nel fratt emp o term i nato la prop ria esecuziohe il com port am rtto
sarebbe mdeiruto.

gli oggetti avran~() i valo ri che avev ano o.cl m<;1rneJit9 in cui long j mp stata
1rfvocata, eccetto quclli degli ogge tti on perm anen za_automati~a loali alla fL1nzio~e conte~
nenc : l'in'.vot:~o:p.e _de~a macr~ set j m~ cQrris_p.onde~re, che non siano di tipo ~olatile e
che s1~0. ~taa carr~ b1a,~ tra. la chia mata d1 setj m.p e quell-a di .lon gj mp ques ti ultimi infa tti
.

Tutt i

sar~tn no mcleterml!nati.

Poich .aggra il meccanismo usuale di chiamata e ritorno d f-1niione, lon gj mp dovra


c?mponars1 cor.retta.rfiente rispettQ agli inte rrup t, ai sgn ali e ad ogni lo.r0 r~unzione as_sot!~ta._U comp~rtrilenro sarebbe tuttav~ indefinito, ne! caso in. cui la funzion lon gj mp
d9vesse ,~ssere mvo cata da un gest ore d1 segn ali nidificato (cio,. da una funzio.ne in-votata
corne risultato di un: segna.le sollevato durante l ,gestion di un altro sfjnale)..
Dopo_ che_l o ngj mp .sar stata complerata, 1'esec uzi ne del progrrurim.a cQn tinu er c.o me
se l~ .c orns po-naen te invo eazi one della .macro set j 1mp avesse appe na resti tuito il valo re
s-p:~~~~o ..da ~al. La frJ nzione lang j mp :qon pou fa.re il1 mQdO cl1e la mac ro set j mp
re~t1tl).J.Sa il valer~ Q, se val dovesse essere O~ la mac ro se.t j mp resti tuire bb e il val re 1.
1

B.8

Gestione dei .segnali < signal.h >

s:Lg - atomic- t

n tipo inte ro

di un oggetto a:. cui si pu acede~e cortte un en.t it atom ica anch e in


presenza di inte rrup t asincrQ.ni.
' . - -

Q_uecSt:i simb oli si espa ndon o i-tJ espre.ssioni costanti con valori ,tlisrint_i) che hann o un
'.1f'O _compaci~i11: _con il s~n~o. ruio?1elit.~ e U~alore di ritorno della funzione sign al, e
il cut. valo re e d1v~~s9 dall .gi.d1r1z?ro di ogni funz ione ,di:chiarabile e dall~ segu enti ,c osta nti,
che s1 espa ndo no ..1~ espressoni costanti positive inter e coui spon dent i al num ero d el seg~ale per la co,nizlone specific-ata.:
S'IGFPE

S'IG-ILL

Sceglie uno dei

tr~ mqdi

nei ]_tlali sar gestitO il

term inaz ione anot:n:lale c0me quel la che avviata dalla funzion abo rt .
~n operaz1~ne ar1tmetrc errata, c.tne una divisionep.er zero 9 un~ogq~iooe
li

..

..

risultante m un overflow.
individuazion di unimmagi n di funzione non validaj come un-istru iinn e
~~
.

SIGINT
SIGSEGV

rirezione di un segnale di attenz.iqne inte.rattivQ.

SIGTE,RM

una-richiesta di

11IL<Ic~6 non valid..o alla memoria.


hiusur~ inviata al

pro&lamrn.a.

, Unlim~lementaz~one. o,on ha la necessit _cli generare ness.nno di questi segnali ec.c etto
cll:e com risul tato di chiamate esplicite alla funzione rais e.
voie t (*.si .g ,n al' .( .i nt seg i void

(~funz)(int):))(n t) ;

del num ero di segnale

:"-

All~i.niiio

clell

esecuzion~

del progran.lflla_, potrebb~ essere

~$:eguit9

l'eq.u ival tnte di

per aleun. segnai.i selezionaci in un modo definito dall'implementazione; Ihenrre l' equivalent
e di
-signal(seg~ SIG_DFL);
sar es;gniJ:o per nitri gli -altri segnali d_efinti dall'implmentazione.
Qufilora ~a rich iesta possa essere soddj~f4tta) la fi1nzione s~i ,gnal resti:ro.ir il valore di
f 1Jn.z per la C:hi~mata a sig nal pi rece nte per il segnale seg specificato. Altr imen ti, sar
resti tuit il -valo.re SI G ERR e in errn o s,ar immagazzinato un valrre positivo.
1

'

i nt rais e(in t

seg)~

La funzione rais e invi a il segn ale ~eg al prog ram ma in esecll!Lione. La funzio~ ne
rai.s ,e resti tuisce iero in caso di suc~sso ~un v~ore dive rso da zero in caso. di fallimento.
.,

B.9

Argomenti variabili <stdarg.h>

va lis- t
Un tipo .adatto a. manenere le infomazioni neess~i~ per le macro va~sta rt va_ arg
e va end. Qualora :si desideri un aCcss-o a-d. argoro~nti variabili, la. funz ione chia mat a
.-oovr~ dichiarare un o.ggetto (chiamato ap in que~~ se-zione). di tip-o va_ list . ~ogg~tto .ap
potN essre passat rome argomento a un'altra fumiene; qualora questa inv,c hi la macro

'

rice~irnento

seg. Nel caso u1 cui il v-.tlore di f unz rosse SIG _oE-F) per quel sc{gnale sare bbe utilizzata la
gestrne di defaalt. Nel caso in cui a valpre di fun_z foo;e SIG~IGN il S~!5nale sare.bbe
ignorato. Altrimenci, tun z dovrebbe p\llltare a una fumini'. da ciclllamare qualorn il se~
gna1e sj doves~ pre:senrar-e. Utla tale funzione -detta gestore del segp.ale.
Qua lora fu nz ptm ti una funzione, quan de si rese.p._ter il segnale sar eseguito per
prim o l'equivalente di sign a.l ( seg , Sl~_DFL) ; o un'interc-ttazime dcl segruile definita
p_eJ1>irnplementazio,ne . .(Qu alor a il valqr di seg sia SIG'ILL e l~impleme;ntazi,one lo preveda} SIG _DF L sa.r ripristinato). In segult sar seg uito l'equivalent<:: di (*fu.nz) (se g); ~
L~ funzione f unt _porrebbe cern1ir.l.are esegtI:endo un,j~truzione re-t urn. o richiamando le
funzj.oni ~bart eYi t O longjmp. Qualora fun z e,segu_a uni$rr1,1.2ione retu rn e il valore di
s&g sia SIGFPE o quafaiasi altro valore corrispondente a un(;Ccezion li akolo, se~ondo
quanro definito rlall' implemen~oru;, il tom port ame nto sai li;idefinito. Afu;i 11\rui, il pro,
.w amm a ~ipre11det i~e-s~cuzione dal pun to in cui era stato in"'te:rrotto..
Qualqra si presenrasse un seg_n ale divers.o da quelli risu ltan ti da chia mate alle funzic;ini
abo rt- o rais e> ~ com port ame nto s-areb:be ind~fnito_~ riel a.so che il gesttJte del se.gnale
riehiamasse un~ fr1nzioae della libreria stan dard che no:rl sia. s ign al., passando . com e primo argJm~rrto .il n\1 mero del sgn ale corr ispo nden te a quel lo c:he ha ca1,1s~to l>invo"C;.zione.
dd ~store, o facesse UJ1 .dfcrimep_to a un oggetto srarico dte non $\ l'assegn:azlqne di un
valore a ~lia varia:bil.e sta.tica del tip"o vol .at le sig_ atom ic_t . Inol tte, s~ un.~ tale chiamat a alla :fi1n iione sig nal d.ovesse risulw in un ritor no SIG_ERR, il valo re di errn o
'sareb.be indetermia.t..
s ig na-1 ( se g , ~I G_I GN) ;

S.IG DFL
S! G ERR
s,IG.. __ IGN
-

SIGABRT

513

L\ LIBRERIA STANDARD

515

APPENDICE B

514

Un' espre?sine costante irrrera negatiw restituita da d1verse 61 nzioni per indlcare la
fine ciel file, ovverq$ia che no11 .' pi ate.un input 11ello .stream.

v,a~arg con il
nella funzion chamant sar de.trmi11aco
e dovr es.sre pa~sa;to alla macrq va_end,. pr!m.l di ogni altro riferime~r ~d a.p.
p~a01etro ap.~ il val,r~ ili 1qu~to

FILE

va id va_start ('va_list api parn1N);

n.tip di oggetto in gradQ di registrare tutte le inform~ioni nece~sarie pe1:._ coi'ltrollaJZ~ lJ110 streain -incluso il suo indicatore <;li pos_izibne del file un puntq.to_re ~ buffer associa1iP (qualora ce f.le sia u..no) ) un indic::i,t<Jre d e~ore che tegistr1 se si verifihino ~~rrori in
Jecru-ra/s:criitura e un L11dicato.re dl fine del file c;:he regisi;ri se sia stata raggiunta la fme del
medesimo.

Dovr. essere invocata prito.a di qualsiasi a-Gcesso ag~-i argomenti senza nome. La mac:ro.
v-a:.-start inizi~:Lza _ap perch va_arg e va_end possano successivamente utilizzarlo. Il.
paraJI!r parrnN !,identificatore di quello pi a destra nell'eli1co varia-bile di p'arametri
tr~q. quelli inl11si nella definizione di ft1nziope (quello subito prima di , . -). QLtalra il
parametro pai-mN sia diehia.rato cQn la classe_di_memoria regi-s ter, con un tipp f1 .nzio.._
rJ.ale ~ \r~tto:riale,. cY con uno eh~ no_n sia cmpatibile con quello che cisulterebb~ dop.o
l~appl1caz1one dell promozioni .di default all'argomento,. il compo.rta-mtnto sar indefinito.

1 ~I

LENAME - MAX

tJn'esp.ressiGne ce.stante inte;ra corrspondente alla di.m ensione di un vettre di tipo


c'l1ar che sia suffcientemente graa<;l..e per conten:ere la stri11ga del no.me di file piu lufl:g
~he ['im.plementazione garanris.ca di poter aprire.

tipo va_.arg ('va._ list ap., tip). ;


Si es,p~e in p.'e-spre~sione t_he ha il tipo ~ il valore dell' argo mento successivo nella
chiamata. Il p:ar~met;ro ap dovr ~s.Gre 19. stessp va_list ap inizializzat9 d va start.
O.gni in-voca:z.io11e di va~arg .r;:nodificheE ap in mo_d o che siano resti~iti a urroo-i valori
degli argom.enr .successivi. Il parametrO tip~ l i i nome .di tip~ spr~cific-ato ~ ~odo Tal~
che quello, di un puntror~ a un ~.ggetto del tipo specifeato possa essere O ttenuto semplice-

FOPEN MAX
Un, esp.res,$ione costante intera co.rrispo.nd.n re al 1Jl-=1ffi:ero minimo di file he
l 1 irnpl:ernlltazio.ne g'!J;~nr4sca di poter aprire centemporan~arnente.

il snffiso * a. tipo. Qualora nori ci sia nessun argomento suctc::ssivo~ o


qualora il tipo non s_ia cotp.patibile co'.n quello dell'arg1ne_q_p $Ilcce~~iv.Q (una v.olta promosso io ease alle promr>zioni di default)' il comportam~ntp S<" indefnito. La prima.
invocazione d~la ma-ero va._ a.r g, dopo quella di va_start1 re_st.ituir il valore deil1argomento st1ces.sfvo a q.uello specifcat0 da pmiN. Le iti:vo,cazioni susseguenti restit:uirani10
in .succe-s_~i>ne i valori d:egli argorilnti rirnan.enti.
me.o.t~ agg~ungendO

fpos_t
Un tipo di o-ggerro in grado di r~gisuare tutt le informaziopi nec~_ssarie per specifta'JJ~ in modo.univoco ogni ,po.sizione all'interno di un file ..
L_'.trnpn , ~m

Uni espressione c;_$ tante intera ct(isponclente 'alla dimensione di un vettore d,i_ tip.o
char che sia suffi.i~ntement_~ grrrde per 't:onrenere la stringa de1 nome di tLfl file tempo:-

void 'Va_ end ( va _lst ap') i

~eo generata -d illa fu.n.z.ion tinpnam.

Facilita w1 norm~le ritr>rnQ d,a una ftmz_


i9ne il cui elenco variabile di r.gomnci si
stato oggetto d.i riferimento .dp. p4Tte cle11,cs.panf>io.ne c9n ~ui va_sta.rt ha inizializ,zatQ
va_lis~ a.p. La macro va_end pu. modifrare ap in modo che non ~ia .pi. uiilizzabik
(S"enia l'intervento di una thiama;a a va_start). Qualora non ci sia an'nvoca.zione c-0rris_pond,Il.~,e dfill niacrq va_st,a rtJ ? qualora V'a~end non sia stata irtv.ocat prima del
ntrno, 11 campo .tament:o sa.p~ indefmito.

~ 'Ut~L

UIUL costante di tipo puntatorenullo d.efi.oita dall'i.rtiplementazione.


$'1:EK- CUR
-

SEEK- ENO

SET
Espressioni eostanti int~re con valori distinti, adatte all utilizzo co:me trzo argomento
cl:ella
ft1nzion fseek.
-

S~EK

B I O Input/Output, <stdio .h>

IOFBF

size t
Il tipo intero senza segno restituito dall~9peratore sizeof.

IOLBF

IONBF
Espressioni, costanti intere con v:alori distinti, a~tt~ all'utilizzo come terzo :argome:liro
della funzio:ne setv.b uf.

BUFSIZ
U.d espressione costante intera, c;:he rapp'rese-nra la d,imension.e del 'buffer utilizzato
1a funzione setbuf.
~. OF

'

d.al-

std.err
Espressione di tipo '~punt:tAtore a FILE->' clre fa rife[i.mento ~>oggetto FILE associato
llo
-- - streain dello sta.ndard ertor.
.stdin

Epres~ione di ripo (Cpunctcore a FILEJ' the f rifetimento ,all'oggett;o F'I LE assciato


allo s:rrea m d;ello standard input.
stdout

511

fup.res:si.9ne di tipo '(pl.llltatQre a Fl LE."' h fa r.iferIJ.).fito -.ll oggetto FILE associato

La fi1nzi,one. f e loSe fa J:! modo the lo. st:rea.m puntato da st:ream sia SViUOtato ~ che i.1
f1le associato sia chlus:o. 0 gni d,at p,tese-nte nel buffer e n011 anc9ra scrirtQ. per quelllD
stream sar ir1viat ail'.ambi.e.nte di ~ectiziqn per.cl1 sia scritto n~l file; ogni dato pfnte
.~cl. buff~r
-~- non
-anco ra letto sar di1nenticato. Lo streani sar dissociato dal fi:le. Qualora
.
.
.
il ,b:uffer assoE:iat9 sia St:t'.Q allocato in m.od() automatico, sar rl-lasciato. La funzion e folose
rStituir zero qualora lo stre':lll sia srat 'c.hi-uso con sqccess, Q EOF nel casb che'. ,s-ia sta.to
1

allo srream dello s:tan dard output.

TMIP MAX

Un'sp:r58ne rostante intera ~o.rrispond~nte al numeJ:o minimo di nomi di file univoci che possano essere generati dalla fu.n.zione tmpnam~ Il valote della macro TM'P MAX
deve ~sere al,meno 2.5.
.int

r~move (

co.n st char *nomef-1e);

F~ 1?- m0do

ch.ejJ fil~ il c:ui nome dato dalla. stt:mga puntata: da nomef i ,l e I!Qn sia pi
aocess1b1l: con quel no:m e_. Uh tentativo ,s11s$eguente di apiir. quel flG uriJizzando q~l
JibJire fll11r~ a meno ci1e taon sta stato creato nuovamente. Il cGmp~namenIQ d_ella ~z.i~-
ne remave, nel caso eh~ il file sia cotrrttemehte aprto~ dipende dall>implem.entazi-0.ne; La
funz_oae remove .restituir z~o .qlJ'.alora L':perazione- abbia successb~ t1n valo.re diverso da
1

z.ero qualora failisc;a.

int rename(const char vecchip, const ohar

*nuovo)~

":'

r~levato un m .o te

j:.

CJ,'~ un

file 'binario t~porane clie s.ar riID.oss_p tft rromaricamen"D alla- sua chiusu:r.a
,~ all_a t1ne del p!ro.g-r:amma._Leventuale .rimozione cli un tue temporaneo aperto.>p:el isg_
Che il programma t'rrnini tl moo ai'lOrmale, d.ipen.de~ dall.'implementazion. 11 .flc:?' s1ar
aperto pr l'-aggiornfi1n:to con il modo ~b+ ii . La funzione tmpf ile resriru.ir un pun..rato.re
allo st_rea n dl .file che sara stato creatt>. Qualora il file non possa essere creat1, la funzione
tm,p f ile restituir un puntatore ~ullo.

tnt fflush(FILE *stream) ;


Nel cas_o che s,t ream punti a un9 $tream di output o di aggiornamentq in cui 1,opetaz.ione piu recent_e non sia .s tata u na di input la funziione ff lush far ip mod.o che i dati
n,n -ancora scritti pe:r: quello stteam sia.no inviati al.1~~_111bi~nt di esecuzione perch slan.,o
.$critti nel E.le; aluilnenti, il C9!Ilp:ortamento sar iiidef1Dito.
Nel caso che stre,am si~ r1r1 pun_t.atore nt1llo, la. funzione f-fll~s-h. ~$eguit la sui:l.detta
azion~ di ~'Vtltarti"e.nto su,tutti . gli stream c;he abhiano le su.ddette afatteristicne; La funzione fflu -s h, re~ti-ruir EOF nel caso h_e si verif.chi urt errore '.di scrittura, ,'Zier9 in caso
c.rttrarofo.

FILE *fop,en(cons-t char *nomefi.l e, c_on_s 't har *modo);

La funzione fopen apre il file il cui nome c.orrispqn,d~ alta.strin_ga punrata da nomefil_e
~vi C1Ss9cia uno strearn. L:~g9mento modo punta a una stringa che lncomiticia :o n una
d:elle

seg:ue~fi $eqtten~:

r
w

rb
wb
ab
r+
w+
a+

eh. ar . t mp n~a m.( eh a r *s ) ;


111:

_ La funz_io.n e t _mp.nam genera un,a stringa che sai~ i,111 nome di file validQ e che sara
diverso d~ qu_elli di 'qualsiasi fle .esistente. La funzione tmpna.mgeaere( 110-:;r stlinga diffe~
rente ogm volta he S'ar richiamata~ fi110 a Ufl massimo di TM P'_MAX volte., Il suo compor~ament, qtiaJora sia ric~mata pi di TMP _MAX volte, dipendet. dall,in1ple.tnentaziane .
1

Qualqra. l'ar:gqme11~0 sia un puntatore ~ullo, Ja _fu_n#_one t _mpnam lascer il suo risttlta:to
~
~O un egg~tto 'S12a;aco interno e ne r~~tl,tllll n puntatore. L~ su_:~~sive ch:_i:;:i mate ila
funzione tm,pnam potr:an.110. modificare lo~ stesso oggetto. Qualo:ra. l 1-argpmentQ i1on ~ia un
pMnt~tore nullo., si assumer che pun:ri a. un vett.re di 13Jmerno L._ t.mpna111 c aratteii; la
fl;i_nZlif)n tlQ.pnam scrivera il proprio risultto in quel vettore e restituir. l;r:gomento.
.

..

..

,.

qumiasi.

Ea in mc:ido eh.e il file il cui n~ome c~Qrrispo.nde alla stringa; p9.ntata da_veccl':l,i o sia
rinominato~ d~ q net.sto momento in poi-, can il nome co_n :ceniito . nella stringa puntat~ da
nuova. 11 file ~~maro V'echi o non sat pi accessibile e-on quel nome. 1l coroportamento qella funzior:te. rena.me; nel c;asQ he un._ file cfiimaro con la .str.in,ga puntata d.a nuovo
esista gi~ pcima della suainvoc:~o ne, dipender, d~)implementazione. L.afunzi(Jne re.name
testi:wr zero qualQra i,Qperazione :abbia su~~esso, un -valore diverso da zer.o qualora f~
sa;. 1h q.u esto caso e qualora il file esistesse Pi,
co,nst~rvetelibe ancora il suo no.m
t:i
- e- ,origm
- : -a-l e.
FILE '*tmpf il~ ( void)

r -+b o rb+
w+b . o Wb+
a+b o ab+

apre un file di testo pe,r la !~ttlil~


trc)na la lunghezza zero o crea un fite di resto per la sc;rittuJ'a
a:c_odamertto;, apre crea un file di te~to per scrivere alla fine dello stS.$Q
apre un file bit1ari-0 per la l~ttura.
t.ron~ la lungh.ezza a-zer;o O' cr~a un_fik l;>ina.rio per la sc:rittura
a,ccodamento; apre o ere-a t1R file biQ.~io p~r La s.crittu.ta alla fine de:no

~pre in fl.e :di testo per l'aggiQrnamento (lettura e scrittw_a,)


tronca la..lunghezza a zeta o re.a un f~e di testo p~r l;.aggiornamento_
a.cgdainento

~pre o trea un file di tf!Stt per l'agg~ornarnen.to, scriyerrcio alla

fJ.e dello st1es~


ap'!'.e un file binario per liaggiomainento (lett11r e scri~tuta}
troneala l:11p,gbei;za a zerd i:;,- cr.ea un file b.ip.ario per l~ ag:gjor11amento
.aceodq.m entp; ~pr.e o crea 'llfi fi:l:e bina.rio per 1' aggi9rnaniento, serivendQ alla

fine dello ste"S$o

I!~pertUfa di un file fll1- n;i9do di lttli.fa (I r :i C:Qme p:rimo Ca:t~tfrft: n_ll'r,g@mefit()


ri1odo) f~~ qua.lata il fil~ non, esisra o no_n ;possa essere le't to. :C:4p.~rtura, dfil file con il
-m~do di acodamento ( 1 a 1 come rirn.o ar~ttte nell'atJ~~dmtnto mode) f~ in modo ch
ti!ltte le successive _
scrirture nel file siano forte ~a sua fine totrenre,. ign0.rand() event:u.a.li
chiamate alla funzio:p.e -f :S eek. ln alcune irnplem~11tazioni> a.pr4 urt -ftle -binario con il
Il!!i:ldO di accod~.lmento ( b. I come ~ec1ondo @ terzo ca.rattere nell~ $Uccitata lista di valori
p~-r ilargom:eirto modo) potr iniziilme~t;e po,sizionare l~indi-atore per lo streatn olrre l'ultimo dat'o ~_crittp, a. causa del riempime11to qllo spazi<:> rimanente con c~anetl ntilli.
1

.i nt f clo se ( FI L_E *st r:ea.m} ,

stesso

5.18

Quan do un file s.ar apert o con il modo di aggi0 rrtam enc0 ( + 1 c:em:e secondo a terzo
t _Matte-re .nella s~ccitata lista di -valor pet l'rgo n1eh to mo.do) s'ullo . strea m assoc:iato potra nn~ essere ~.segtl~te delle ope-raiioni di inpu t di outp~t. Tott:ivia~ l'otput pdtre bbe non
es~ere segui to diret tame nte da un inpuc snz~ la frapposizipne di una cbian1~ta alla ,funzione ff lush o ,a quelle~. po~i.zionam~11to ne~ file, (fse ek., fset pos o rewi nd), e l input:
.pQ.tr~be n~~ ~~re s~~1to direttamen:te dall outp ut senza la frapposizione di una chian1a-:
ta ali~ nim;1 001 d1 posiz1~0natnento nel file, semp re che l'opt-zone di i.npu t non inoo~tri la
fin~ del ftle. In altun e rmpl emen tazio ni, aprir e .(o creare) un file cli t~s:tb _o n il mod o di
.a ggi0r name nt porrebbe invece aprire (o cr~are} u.p.o screa m binar io.
.
1

Q uan.d1 sar apr;rt,o, uno ~tream $-ar gestito '.ompl~ra:tnente eon upa mem oria tamp.o ~~ (pt~er) S~ e. s?lP .se po~ ~ssere detern1~ato che. non facci a rifer: mento a un dispositivo
rnt.er.attrvo. Gli tilcUcator1 di ttor e e di fine del file per lo st1:ea tn saran no azze.fati. La
r=.zio~e '.ope n testitui_r~ l1fl punt;itor~ ~ owr to che controllri. l stream. Qualora J'operazio ne d1 apert ura falli{isel f open resr_
1trnrebbe ttn punt atore nullo .
FILE *f reop en ( cons t e ha r *hom efi_le J cons t cha r *modo, FILE. *st ream};
. La fu~zione f re open apre il file il c;uin ome corri spon de.alla srri nga pu111 ata da nomef ile
ev1 ~sso;1alo strea m punt ato da stre.am. t a rgo.r nento modo utiliZzato prop rio come nella
funz:1one f open.
~a furtziofi.e fr e open tente r prim a di chiqd ere qualsia~i al associato all suea m
speaf icat? . _{Jn evenuale fallin1ento della chisura d~l file sar ignor ato. Gli indic atori _di_
erro.re e d1 fme del file per lQ s tream saran n.o azzerati. La funzione freo pen restit uir un
pu,ntato~e nullo q:ual.ora 1,operazione di apertura fal'lisea. Alr_1j m .e nti, freo pen restituir il
~alore

51.9.

APPENDlC
EB
'

di stream.

l?er

il f.rrrtato, il. co-mportam.~nto sara

indef inito . Qual 9ra il form ato sia $taro e:$:;i:urto


[.l1ent.re rimangono ano ra degli argon teiiri , quelli in eco.esso saran no come se111pr~ valuta-

ci,, ma per .il ~e.sto sarann igno,rai. La h1nzio.ne fpri ntf rest:itUir;i il controllo q.u ando avr
irt-c:o.n trato la fi=ne della srrin ga d~l form at0. Cons.u ltate il Capitolo 9', ' L'iriput/output
fortn attat ", peE una descr::izi:one d.ett.agliata dell s,pecif,c:l1e P':er la conversione .dcll'output .
La fumio11e fpr- intf restit uir il nume ro di arap:er .i nviat i i.ii Qutp ut, o u11 valore negative> qualo1a s verifi.clii un erro.re.
1

i.,n~ fsca nf(F ILE *str m, cons t ehar *for mato i ... )j

J~g~ 1 i11put dllo sttea m puntato da stre ,am, in mod o controllat~P


dalla stringa puntq,ra d~ form ato c.li $pecifcher l sequenze di inpu t ainmissib ili e il
modo in cui quest e cl..o vrann o esser co_nvert lte per !1 ~s~~gnamnt tLcilizzando gli argomnr i successivi come punt atori agli ogge tti che rieveranno I inpu t convertito. Qual ot
n.Qn ci sian<? argomenti sufficie11ti per il formato, il 0.nipo-rta.rne11to sar inde.f inito . Qtia...,
La fun.2.ionefsca nf

lo.ca il form ato sia st~t. esllriro mentre rirt1angoho anco ra degli argomenti, quelli in cces..
s.o Saianno c:o.me se~pre valutati) Jlia per il resto saraI1no ignorati. Co.flsult~te il Capi tolo 9, '''1:-i nput loutp u.t form attat o'' , peJ;" una d~scrizione detta gliata delle speci fiche p-er la
Qhversio ne dell'i nput.

La. funi.ione f scan f resrit uir il valor e della n:i,a:c;ro EOF qualott! si v;:;ifichi un .errore
di inpu t prim a di qualsiasi conversione. AltrinJenti, la funzione f soan f i:estituir il n11m~.
.to degli elen;i,:nti assegnati, che potra nno anclie essere inferiori a quelli f0rniti, o a.nl1.e
zero; in casn di un prmatvro fallimento di cotri spon dhza.
1

int prin tf {co nst .har *for mato J

i) j

La fun2iione pri-n t:f equrivalenre a f prj_n tf con targo..m~ot stdo Ut inserito prima
,d~i riman_e~ti. La funzione .p rint f restituir~, :il nLtmero di ~~atter ip_yiati in ou~put) o ttn
v:alore negativo qu;:i)ora _s"j sia verifiato un er-rore.
1

void setbu f (FILE * stream,

char

*buf ) i.

Lafu nzio ne _s,et buf equiv alent e a setv bf invoGata con i valori _fOFBF per modo ~
BUFSIZ per d~mensione, o (qu_alpra buf ,fila tm pm1.ratorenullo) con il valpre _IONBF Pi?t
modo : La funz ione setb uf n ory restitus"c~: ~.un val~re.
1

int setv buf( Fll.E :.irstreaml chQ.r *buf ., _nt modo, s-ze _t dime rrsio ne) ;_

L~ ftJnzio,o.: setv bu"f _


pu, e~ere utilizzata s-olra.o.(O dope che lo stream puntar.o da
s. tream .sar stato ;associato a un file a1lerto) :e prim a che sia eseguita qt1alsiasi altra dpeta none sullo stream . I..:argomertto modo deter mine ra il mod o in cui sar gestito il buffe r di
~t ream: ..... IOFBF far in mod o ch e l iripu t/out pnt passi totalmente dal lSr1ffr; IOLBF far
1

1~. modo

che

l'inp,ur/o~put sia p~sato nd buffer per righe;

i;

_IONBF far
mocki eh.e
11~pLJt.f?utp.u.t non p~s1 ~ un b_
vffer. Qual ora buf non .sia un puntat~~~ nullo, il vettore
Gu.t fa r1fer1nento pon; essere utilizz,a to in sostiru:zione del buffer :tllot:ata d~11a funzi one
setv buf. L:argom:ento dime nsio ne specifica quella. del vettore. Il conteni.1to del vett~.re
sara semp re' indeter1ni11ato. La funzi one s. etvb uf fesritui~ zero in taso di successo 0 un
v~6~ diverso d zero quj\lezj ~modo~ st!it assegnaw un valore nn va),idq, o <ualpra l;i
richiesta no:n possa esser.e ~oddjsfatta.

int fp,ri ntf (Fj:LE *stre am, conEt c har *forme.to, ... ');
La. funzio ne fpri ntf inva il proprio ou'1' Ut nello sttea m puntato Eta strea m, in rn(ldo
contr ollat e dalla str.ing~ puntata da form ato , che specifch:er- in che mod'o debbano essere
c;onvertiti per ll'o utpu t gli ,a rg0m enri successivi. Qualora non ci . sia-n9 arg0me11ti .su:ffi~ienti

int sca:r rf(co nst har *forrn ,~to, . ., .. ) ;


La fun:ziorte_s.can f eqi:valen_re a fsc-a nf con l'arg men to s td;i n inserito prim a dei
rjmatienti. La funz ione scan f res:titui.E il valore cl.ella ni_a:r() 'E0F qualora si sia vcrificato
Wl- e_.r:ror di inpu t prim a di qualsiasi conversiene~ Altri ment i, s.can f restjt uir il numero
d,:gli elemeni asseg nati, che potranno ,anc:he essere inferiori a: quelli fotni ti, o ancl1~ +_er>
i11 -c.aso di un p.rem-a turo fallime11to di corri spon denz a.
i nt spri nt-t( char *s

c onst char *form ato., ... ) ;


La fi 1nziont spri.n tf equiv~e~~e a fpri ntf eccer to che l'argo ment o s specifica un
:vettore nl q,urue Jiotttput geneitato aov-ra ~ssre inviato - invee~ di speclfica.fe Un sttea m.
Un ~arrre nullo sar ~ccoda.to alla E.ne di q_u<?lli inviaci in o~rtput; ma non sar conta to
ne14 s~o:tnma restit uiti. Il comp ortam ento della c0pia fra oggetti che si sovra p:p ouga no s~
in..d~finit;~ . La f11 nzi9.ne s p r intf restit uir il nuni~ro cLl carat teri se.ritti 1i.el verc:ore, esl l~S('.)
quello nullo di term ioazio11e.
1

int ssca nf ( cons t char *s; cons t char *for mato , .. ) ;

La. funzione ssca nf equ'valente a fsca nf, ecci;;tto G.}ie l\trgomntQ s specifica una.
"stringa dalla ql,lle dovr'. essere ottett ttto, l'jnp ut, i.nv;eG:e di sp~cihcare uno s.rream. U r~g.,. .

~utt.gime,nto lella, tme dell~ s,~ri !lga sat equivalence alla fine dd fileinco.r urata dalla. fun~io-

521

520

n f sc: an~. Q11al_a,fa la copia aweng,a tr-a oggetti ch si sovrppongano, il C-omprtamento


sara indefinito .
L~ fiJ.nzioqe

sscanf re:stituit: il valqre d~lla n1a,.GrQ eoF~ qu,alo,ra si. sia v~rifcato un
r.rQre dl input pri.ma di qu.aJ.siasi ~onvetsione. Aftiline.nti~ SSCanf [eStituir. il llUIJl~tO
de,gli e1e1nnti asse,gnati, ch _potranno anche ess.ere 1nferiori a quelli forniti., :b anche zert:l)
in taso di un p rematliro fallimento dl corrispondenza.
1

int v.f pr:tntf(FIL.E. *strarn, const cha r *formato , va_l.i .s t ar.g );

indetermi.Ilati
e s'a r restituito
.. . .
.
.
rrore di lettura i contenuti del vettore saranno
un puntatqre null.

verifichi
"

"I

ufi

,...

int f .p utc (in't e,_ FI LE *streain};


La funzione fputc scrive il Q\fatt~re specificato da e (c;:anvercito in un uns.ign.ed ch.a r)
nllo stream di output pUP-tato .d a Btream, $ser~ndolo nel postoindi'v.iduato da.IriridiGatol'e dii posizione del file associat.o allo srrea n1 _(qllJ-alor..a sl~ stato definibc:;>). e fac~ndo avanzare
in modo apprQpriato. il suddetto -ind.ic::a:tore. Qualora. il file non pQssa s_u ppi$e- le ri~hie
ste di posi~ioriarq.ent, o nel caso che lo meam sia st:to aperto in accodamento~ il caratteit~ sar acidato allo stte4.Ill di o-tput. La fun-zione f putc restituir il :carattere scritto.
Q ttalora si v.:erificl1i up ,e rrore di sptltturf!, s!lf, iri1postato. il rela:tbio ind.:ic-atore rl~l1o .s:tre~1~_
f pt1.tc restituir un EOF.
0

L~ fi1nticin~ Vf p:r .i ntf e eguiv,afuJ?-te a una f printf in ci l'elen9 variabil.e di ar:gome,nri .sia stare) ~o,stitui~Q d~ o a, rg inizializzato d,a.ll:<t macro v.a _ sta_rt (f! drll.e probabili
ehiamJtie su:cpe.ssive 4 va_a.rg) . La funzione v fp.rintf non .invocher la m.acro va end.
E:ss~ _testiruir il n.umeto ~lei caratteri. inviati in ourput, . u n valore negativo qualora si sia
vertfiGato .un errore.
1

int vprintf(eont

cti~~

~formate,

v1_11st arg1;

. . La.funzio~e ~p :rintf eqi.valente a. una p.rintf, in cui tdenc variabile d;i argom~n
t1 sia ~.tato

ar:g che dovrebbe e~'se-re'star<'> aizializzato dallamacro v;a st art


(e. dalle probabili chiamate s.uccessive a. va_ar g). La f1nt.ione vprintf n-00 inv~;her la
ma:.cr-o va_end. Essa. restituir il numero dei caratteri inviati in .ou. ~put, o un valo.re negati.va qualG ra si ~ia verifiato
un errore.
.
.
int v~pr .intf ('ahar *s, const char *formato, va_Ust ar.g) ;
sqstltwt9 da un

int fputs ( const c.har *s ; FILE *str.eam);

La funzion t puts scriv-e la stringa puntata da s nello ~tream puntatQ da stream1. il


Ga.ratre.re n1J.1lo di ter_minazione noirt sr se.r itto. La. 'funcione. ,f puts r~stitir: \l:A EOF
qtralora si veri.fichi un error,e di scrittura altrimenti restituir. un valQre non negativo.

La funzion~ vsprintf i.;:quiv:ale11t~ a una sp1rin:tf, in cui J'elerie: variibil~ di argo..


meriti sia stata so stiruito da u:.n arg che d'Jv:re.bbe essere s1ato1 io iz:ializzato dalla macro
V'a~start (e, dalle prc:ibabili chia:m,ate ,mteess:iv:e a 'v a_arg) .. La. furttio.ne vs.printf nn
init0cher la ma:ro' va~~nd. Qalora la co:pia avv.e~nga tra. 6ggerti c:he si sovrppngano) i]
comporr.a1r1ehto sar indefinito . La ft1n_zi()n~ vsprt:n tf restituir il a11msr.b dci caratteri
scri~ti nel vettpre, ~~clu~o qu;dlo nullo di .terrnin~ione.
.
.. . -.

int getc(FILE *1tream) ;

1a funzlo.ne getc eq11ivalen.t e a fgetc ecet~o che],_ qualor:a sia stata implementata
c;:qp una macro potrebb1
e valutare st.rea.m pi\l di una volt?. D~ eonseguenza, l rgomento
1

p:assal:Q dovr

e$sre

un'espressione . che

flO fl

produ.ca effetti c,pllater'1.li .

La .f.o,nz;ione g.e tc r~stitir il carattere .successiv() dello strea.m_di in:p ut pirnt~t i.a
st ream. Qualora qui;Fs:~o sia alla fue del file, sx- i rrip(;),s ta:t0 il relativo in dicatore dell9
stream .e getc restituir un EOF. Qualora si verifichi un errore di lettura,. sar. imp.ostato .il
rl.ativo indieatore dello s.tream get c r.estltu.ir un EO'F.
1

int getchar(Void);
la funzi,o ne getcha,r equivalente a Un get 0 c::on l ai',gc:tment-o stdin . J>:,a. funzione
.g!etCh1ar i~tituir ii CaI;:tttre SUGssivo delle Sttaffi d_i input puntato da: Stdi:11. QUalOI~
questo sia alla fine el file, sar. impost4tto il rela.civo indicator dello srream e ge-tchar
resttuir un E0F. Qualora. si verifichi u.n ~rrore di lttUt~ sar imposrato il relativo indic.ato.J:e d~llo stteam e: .Qe te ha r restituir r.Ln EOf.
1

ir:it t g~t ( Fr !-E * st r-eam)

L_a ft1nzi0ne ~g1 e te ottiene dallo. st;ream di -ffip.u t puntato da stream il ;carattere success~vo (se pres'e nte), come un unsigned char Cor.tvertito in in't, e fa .avnzare (.se-.definito)
l'indicatore di posizione del fe assbc;;iato allo str'-a m. La furn.ion f g.e t e rtstitnit il atat'""
tep sut~~iv9 dello st.ratn di input puntat;rda -st.re.am . Qalralo srream. sia a.llalne qeJ
file, sa:r imp9~t_a,to il :relati".o indic:ato_r,:e e f .g et rescittP.r"u.n EOF. Qy~ou. {ii ve.ijfihi un
,err.ore cli lettura,. sar impoBt:ato "l relativo indica::to.re dello srream e t g et.c r.esrituir un
EOf.
cha~

*fgets(bhar *s , int n, FILE *stream};

La funzione fgets legg d~Uo $m~m p;lJ.IlJ'.t.6 da st :r -e,am un ~umero rnassimo di


CaJ:atteri inf,er.Qre di u:Q unit -a quant9 S(!>~Cifi._a:tO d:a ii, mQJ.agav.zinandoli neJ Vetto.re
pun~'(.o da s . Non. sa.ra.nno le.tti ui:terioci Caratteri dop<:J un newline (eh-e sar-. ce1lservato),
o dopo la fine -del 'file. Jm,m1ediaairrr1.ente dopo l'ultimo c:a-rattere Jetto, nel vetto_re sar
inserito 'quello nullo di terminazion e.
1

.La funiioq:e fg,e ts ~estri.!ir s i~ cas di success. Qualora s~a s:tam incontrata la fine
dt_l-6Je e nes.~ull, c:u;.i\(tere ~~ stato le-tt9 e irp.Ip.agazzinato el v:ett9re,, i sih~i corit~nui
r~ster~ru10 invariati e .sar restitwto un punt4to.r~ n u.Uo. qualora: durant~ 1).op.~raz.ionce sj

"Cll.har *,get.s _(char *s) ;

La funziQ,ne ge,t -s legge dei tarattri dallo S'treatn di .inp11r pii:ntato: da std.i n e li 'imma.,.
g:Zzna nel vettore puntato da s, fincli nb'n intort:tta la fine del file Q n~r.i legge .ll.I). ca,rattere

newlirte. Questi sa:raon'(:> ignorat;i ~ nel vettore, immedia.tamen.t dopo l,ultimo 12arattere
!etto, $<ir inserito quello nullo ,di terroin_4Zlone. La fi1fizione gets restituir s in. cas.o .di
,. s1,1ccesso.. Qul,ora sia stata. incontrata la fine del fU ~ ne~sun C:araer sia stato letto e:
immagazzin.at0 nel vetrore, i.suoi cbntenutites.teran.n o invariati e sai restituito, 110 puntatore
nullo. Qualer;a. si vecificpj. un ettre di letn:lfa durante I' e pc-razione., i c:o~t~nuti drel vettore
srann10 indeteoni.nati e s~ar, .re~tituiro un puntatore nullo.
1

i nt putc(int e, FILE *stream);


L.a. funzio .iie pllt.c equivalente a f:pJ.rto e eett9 che, qualora sia stat implementata:
c.oE, IJl~ macro_.) p, otrebbe -val.ti tare st re am. pi~ di i.,r1ut vo.lta .. _Oi cqn~eguenza l' at~om:ehto
1

52 2-

no n dovr m ai 'es~ere un'espressione che pi:odu


ca eff~tci. collaterali. La f11nz,ione pu tc restittJ.-ira il carattere sc rit to . Q ua l ra si veri-fichi un
errore di s.crittLu.a, sar imp.ostat il relativo indicatore d@llo str ea m e pu tc restituir
un EOF.

in t pu tc ha r( in t 6) ;
_ La funzio.ne pu tc'h ar ~quivalen.te a un pu tc
co n il setoncl.o argo::tnento st do ut . La
funzjne pu t.ch.a r res.tiruir il ca ra tte re sc rit to'. Q
ualora si -verifichi un ~rror~ di scrirtu1'a
~ar im_p.qstato il relativ0 indiea.tore dello str
earil pu tc ha r re.stituir lli l EOF.
in t pu ts (c ns t ch ar *s );

Lafi-.1nzio11e putsscriv la , tri-nga. p_u nt at a.d a snello srr


eam punratod-a st do ut, aGcdando
all o.u tp ut un ca ia tte te nwline. 11-c,arattere nullo di t~r
rni.nat0ne nort sar stritt9~ La fun~
zione pu ts restitlilr. un EOF qu al or a si verifichi
un er ro re di
fu i v~- ore

523

APPENDICE B

sc~itttira; al tri n1enti .restituir

no n ne-.o"'acivo...

in t un_ge t.c '(i n t c 1 FI L 'E *.s tre ar n) ;


.La fun-zione un ge te rinvia il carattr~ speciica
to da e (c on ve rti to in un un,s ig ne_d ch ar )
nello Stteam di input pw1tto da. st re am . I ca ra
tte ri ritil.viati sa ra nn o restituiti in or di ne
invets dalle succe$-Sive le~ture SlJ. quello stream.
La frapposizione di una ~hiamara . co n
succes.~o (sullq streart1 punta,ro da st re am ) di
un a fu nz io ne di posizion_a-fl1e nt o nel file
(f se e ik fs et pos o re w in d) e1.imin.er' tu tti
i car~rter:i rinviati ailo $tream. La memoria
esterna. cor:risponde11te_all str a tn rester immU
ctata.

Il rio:v:o di urt singolo carattr sempre gcu-ant.ito


. Nel eas0 in c.u i la funz-rone un ge te
sia inV-bCata tiippe vo1t :sullo steS:SO $tieam~ senza.frapp
orre delle oprazioru di le~'jlra Q di
ripsinionartinxo nel file, e::.i potreb b:e essere
un fallimento. Se il valore cli e dovesse essere
ug ua le a EOF la fu n,z io ne f-allire-bbe e .lo st te
m d inpw; rsten~pbe .invacl~to: .
,
.
Una c,hamata co n successo alla funzine ung-e t.C
az:zer:er l ir1:dicatQfe di fine ru~ dello
stteam. Dopo la lettUta e l''elimiI1azidn~ di tll:rci i
caratteri r.inviati, il valore dell'indicato,re
di posizione per il :ffie .dello st re tm dov;rebbe corri
s_p:ondere a quello pt et d en te il rjnviQ
dei ct ta tte ri. Pei un.O ~tt~am di ~~st0, il valore
del stlo indic-ator di posiziJ>ne del file,_dqp_o_
tma clU.arnat~ co11 uce.sso alla fi1nzione unge-t e,
no n sara der:erminat .finch tu tti i ear~t~
te ri rinviati npn sara ,nn o letti o el im in-a ti.
Per un str~ bin~rip, il suo indicatere di
po.sizione del file .s-ar determina-r.o d ogni c;hi,arri
ata suc;c,e.ssiva all::i fu nz io ne un ge te
galora p-rim~ cli un.ili-vocazione il ~uo valore sia
zero, qu es to sar in de te rm in at o dQpo la
chiamata. La funzioJl-e un ge te res.;tituiJ il caratte
-re rin vi at o do_po la ton:versqti~,_ o t1n E.OF
qualora l'operwone fallisca.
1

size~t fr e t{ i(v oi d *p tr , si ze _t dim


en si ,o ne ,_ si ze _t nmemb 1 FI LE ~~tre a
m);

La funzione f re ad'. le~gg~ d.Ilo streail pu nt at


o da, st r& ar tt n massimo di nme,mb el em en ti d_i , dlrue.nsione specificata da di m en si
on e, i1n1nagazzi11andoli nel ve tto re pu nt at o da
ptr, ~ .L-indicatore di posiiione de l file p~r lo s tre am
(se defmi-to) -sa:r~ fatto avanzare d~l
nu m er o di caratte ri letti co n su.~cesso. Q u_a lo
ra si verifihi un er ro re , il -valore ris ul ta nt e
d~Jl in ,di@tore di p:osizione del file pr la stream
sar in de te rm in at o: Ql1alor~ sia stato letto
un eleme1no parz;iale, il suo valore sar indeterm
in~to.

L_a fn '.n-zione f re ad tstitu4' il nr 1i ne io di -~lem


enti let:ci. co n successo che po tt anche
essere inferiore a nmemb, qual.oca s~ sta te iu eo,n rra
to un error~ di letmra l l-a frne del file.

,N~l easo

ch e di m en si o ne

O nmemb

sia zero, f re ad re$tituira,. i-rO e i Co nr en ut l de


l ve tto re
e ln>" stato dello su ea m estel:"aru10 immuraci .
s.i z_ t f wr it e( co ns t vo id *p tr ,
si .z e_ t dim e i;\ si on e,
1

si ze _t_ nmewb,. FI LE

~ ,~tream): ;

L~ funzione fw r it e ser-V t1ello strearrt pu nt af 0 da st re


.am un massimo di nmemb
-~ft)Il~ti di din-iensipne speq_ifica.t~ d~ di.m~nsion, leggnd
oli da.I. v tto re pu nt at o da pt r.
;c:i.~dlcatore di posizio_ne del file p~r lo &tream (se definif)
$~~ f~ttO avanzare del nw ne ro

s.ucce~so.

Q ua lo ra si v~rifichi un erro r~? il va lo re ris1


tante de ll il1di ""
taitrote di po siz io ne del file per lo ~treatn sar inc
lerer:min,ato. La fum;io,q_e fw r i t E!' re~tituir.
ii tit lrt ltb di el m en ti sc rit ti con su c.csso che po
tr essere infe_r.iote -a nmemb so lt nt_O
.
'
cqu;;ilora si sia verifc~.10 un er ro re di str "n ur a.

,(ilii. caratteri sGtitti co n

iITTt

fg ,$ tp os ( FILC: * s t ream I f P9 9_ t *p os ) ,;

La fnzione : fg et po s i1nmagaz.zina nell oggetto pu


nt at o da po s 1 valore co,rrente dell~'fhdicatore di posiziol!l.e relativo ai file associat:o _allo strcam pui
i.~
a.t
9 da stream. Il valqre
i$mgazzi11ato Gboterr delle informazioni no n
specificate, he peua.n1l0 .ess_.ere util~zate
dall~ fui1zibne fs et po s _pet riposizionate lo stream sulla
posizione che aveva .al m o m en te
d.:ella ch la m at a di fg et po s .. In caso di esto posic
lvo, la funzione fg e- tp os testinll1~ zero
uxenue . in caso di falli111ento restit11ir_ un valo
r~ di-ve1~p da zero e immagazziner in
1
e.r r'A O w1 -valore positivo de fin ito da
l1 'implen1e11tazio_ne.
in t fs ee .k (F-I LE *s tr ea m. lo ng in t of
fs et i in t pa rt ,e nz,a) ;
1
La funzior1e f se ek .impo.st a 1'-intlidltO.re -di .P:osizio
n~ del file per lo stre--am pu nt at o da
-st re am . 1?r uno stream binario la ntrov:a posizio
ne, n su ra ta in ,caratteri dall~'lnitio del
"file, sa.r ortep_uca aggill11-gendo of fs et alla posizio
ne specificata da pa rt en z-a . La posizione spedfiata rorri,<;ponde; ali'ini:z.io dd file. qual
ora pa rt e ri z a sia SEEK_SET o .al val0.re
:e.torrente dell'indicatore di p0sizion_~ del file~ q
ualora. si;i SE 'EK.....:CUR~ oppure alla fme dello
~a. qualora sia SCEK_END. Uno scream binario non ha hisp
gno dl. supportare in i;n0do
si,gnifca:tivo Le chiamate di f se ek con un valore di
pa rt en za ugti:ale a SEEK_E-ND. Pe-~ un,o
~ttea m di testo > of fs et d.ovr~ es.sere- zero,. oppure un valete
te:Sticuito da. un-a pteedente
inv0cazion~ deilafunzio11e ft el l sullo. ~es~o str ea m ~
g.a rt en za dqvr esser SEEK_s:ET.
Una el1ianata con esito po-$itivo alla f~n~ione f se
ek az_zer.~r l'ndicatq.e di fine d~l
file per 10 scream, e annuller ogni df ett ! cli ur ig
et c ullo st$$O. Dopo un'invpcazione cli
fs ee k, l crperazione st1ctessiva su un o str ea m dJ .ag
giornamento ,potr essere un in pu t o un
QJJtput. La f10.z,ione fs ee k restituir un valore di.
verso da zero soltanto per 1J11-a richiesta
(:he no n possa e~sere so dd sf at ta .
int fs et po s( FI LE *s tr ea m , oo ns t fp os _t ~pos);
1

La. funz ione f s,e tp os imposta iin di a tp re di po


sizior1e del file pe,_r lo str~ pu nt at o
d:a st re am , usando il valore dell,oggettQ indicato da
po s; tale va lo re d9 vr essere stato
Q:tt~nuto: da una precden-te invotazi611e della fi-1nzione f .g et
po s sullo stesso strearr1. Un:a
chiamata con -esito psltivo ~~ funzione f se tpOS
ai't:zertra l'i nd ic at or e di .fme del file per
~o streanl , e an n:ullera ogni effet:to di un ge te sullo sre _so. D
opo uri'invocazione di f se tp os ,.
t' eperazione successiva in no stte,a:m di !:lggior11.~ment
o po tr essere un in pu t q un ou tp ut.
.Q ua lo ra abbi a S:tttcesso, la fi1otl.one fs et po
s re sti tu ir zero ni en tre , in caso di f-.:illm .ento~
1

524

525

APPENDICEB

-r~~ mi valo~e divers_


o

da zeri e immagazziner

i11

errno, n v~ore positivo .definito

dal I tm plen1entaz19,n~ ..

U't ilit generiche <stdlib.h>

B. I I

EXIT - FAlLURE

long int ftell(FILE *stream);

EXT - SUCCESS
.
-

La funzione ~tell ottie~e il valore conente dell)indicat ore di posi:zion1~: del file per lo
stream pun~at da st.re.am. Per nno streatir bi.Q.ario il val_re corrisponder al nr1tn,ro di
c~atteri dall>inizio del file . P~r ~d Str~ d te:Stq il sLL0 indiatore di po~iii:qne d~l file,
coJ:len iqfornJ..azi9n..i non specifcat~) che potrgmnq essere utiliz.zat-e c4lla-funzion.e fs.ee.k
_pe_r far citqmar~ l'indicarore di _posizione del file p:er lo stream nel punuo in cui si trvava.
al Il)_O.tnento della chiamata .a ft _e .11; la differenza tra i du.e valori restituiti n.on netessar-i:a mente una mistl.fa in.clicativ..a de:J numero di aratteri. scritti 6. letti. In caso di successola. fun:io~e. ft;e.il resttuir il valore dell indic~tr d p$mn_~ ckl file per 19 stre-am.
caso di fall1titento, la funzione fte.11 restituir -1 L e irnmagaziinera ci errno llil valore
positivo d~tnitQ Q.all 'impl~menta;zione.
1
,

In

. La ~o~: rewind ~po~a 1.indicatsre di pos~ione del file per lo st ream puntato da
st ream all 1ruz10 del fle . E eqtu;V;alentie a
(.voi.d) fseek(stream 1 0L, SEEK SET)

eccetto che sar anche az,zerato l'ndica.tote di errore per J_o

stream.

..

'Ma CUR 'MAX


~

Un~espression~ i..nter_a po-sitival il cui valore corrisponde al numero mass.imo di byte


eontenut in un c_aratte.re mltibyt~ dell' ~insieme eseo spel~ficaf(? dilla loalizzazione
CQ:rrente (Gategori,a, L..C~CTYPE) e il lti valort;; non sar;a ma1 maggiore di ' M~_L.ENl ....:.MAX.

NULL

La funzio.ne clearerr aziera


pJ.llltato da st ream.

gll it1.d icatori di

fine del file e di errore per lo stream

Un'espression cb$tanee di ntetvallol il cui valore tor-rispende a quellg m~assimo restituito dalla f1_~n1.ia11e rand. Il valore della pi_aro AAND_MAX dovr essre lmeh ';J2767 .

div t
~

ldv

Un tipo di struttura corrispondente a quello del valore resciruito dalla funzione ld iv.

int fe-0f(FILE *stream);


La~ione feof controlla l,indicatore .di fine

del file per lo steam puntato da str~am_.~


valore divr da z~r se' e sol6 $ si? statQ impostat9

L~ ~nz1one ~ ,~of rest~tuira w1


l 11ndicatore di fn_e deL ftle per stre~~
'

RAND MAX

Un tipo di struttura corrispo~:idente _a quello d~l val~r; r~stituito dalla funziqne div.

vod cl e a rerr (FILE_ * st ream) i

il"

*'~tr~am);

..L~. ~zione f 'error controlla l~indicator~ di e:uore per lo strearo puntato da stre-am.
~~ ~one ~ er r-o r .restituir. un valore diverso da zero se e sol se sia stato impost~to
l tnd..11catore d1 error per st reami.

voia prrot(const char

Espressioni intere che pos:sono e:ss:ere utilizzate come arg:omenci dlla fu.nzion exit
p.er r:estiruire all'ambiente di esee-uzione uno stato cii chi.silla con esito rispettivamente
negrt1v o postttvo.

Una cosrant di tipo puntatore nullo definita clall'irnpl~-uient-a:z.ione .

void rewind(FILE *stream);

int ferror('FILE

*s)~

. L~ funzione perror rileva il me$S~ggiQ di errore_corrispondente. al numerq pre~e.Bte


nqll'espression_e intera errno.. Essa" scrive la seguente se:qU:nza ,d i car.at;teri nello stream
dello standard _error: in p.tim0 luogo (qualora il puntate,re s e il carattere cui fa rifei:imento
no:-siana nulli) , la ~trin.gac puntata da s seguita clai due pbnti (;) e d: uno spazio;, quindi ~a
stringa del messaggio di errore app~priata, seguita da un .qi.ra.g.eye newline. I C:ontenL1ti
dell ,strin~he del mes_saggio di errqre saranno i_d~ntici ~ .quelli re~~tituiti dalla funzione
Strrror C011 l'argomento errJ:lO :e dipencler;anr;io dall'implementazione.

sioz:e- t

Il tip,o inte:ro, sep

~~gno

restituito

.dall ~ operatore

s-iz eof.

wc-ha r t

Un tipo inter.o, il cui intervallo di valori p_uo rappre:s~ntare cod.ici distinti per tutti i
mem.bri dell'insieme .di caratteri pi grande sp-ecificato tra quelli delle localiiza:zioni sU..pportate .
Il cra-nere nullo deve avere .il valore di codice zero, mentre ogni membro dell'insiem_e di
caratteri di .oa-se deve ~ver~n QD:9 uguale a quello cli-e si orterrebb,e nt:ilizundolo da_ sol.o in
una c:os.-tante di carattere i11tera.

double atof(const char *nptr);

Converte la porzione iniziale della stringa puntata da nptr in una rappresentazio;ne


double. La funziane atof restituir il valore convertito.
~~~ atoi(c6~st

char *nptr);

onverr~ la

porzione iniziale .della stringa puntata da nptr in una rappresentazione


int. La fumione atoi restituir il valo.re
convertit
o.
.
-

lan~

int atol(const char *nptr)

-::

:--

Cnverte: la p. o-rzion~ in i.ziale della stringa puntata da n ptr in tJ.na rappte{;ent~io'.qe


Iong. La funzione atol restituir il valore convertito.

527

LA/ LI.B.RER.tA STANDARD

double strto d(co nst char *npt r, thar

**endpt~);

Conv erte la porzio.rre i. 11i. zial~ della strihg~ pl).Ilt:~i:a da nptr in una r-appl.""esentazi.one
doub le. In prim o luogo, essa .scom porr li stringa_ di inpu t in tre parti: u1ia sque nza
ifii2iiale even tualm enre vuota , form ata da carat teri di spazio bianc o (co_ine $pecifc~Tto dalla
funzione ssp ace) tLna sequenza so.g getto sorn,i:gliante a una c.G-sta.nte in virgol~ mobile~
UH.a string a finale for;mata. &i anq o pi' catatreri hon ricon osciu ti, inclu s.o quello nullo di
term inazi one ddl~ stringa di jnput . Q!1indi, essa {ente r di cortve:nre la se-q_uenza sogger.to
in un nume r.o in vi~gola mobil~ e re$.titui.r~ il risul~to.

un segno postivo o negativo _9 p.z nl e; un.a sequen.za non vumta- di cilie, conte nen.t :e facoltativamente il air~tlere
s.ep_ar~tore dei ,d ecim ali una parte- espo nente op.zionale, ma senza suffissQ per valori in
virgo la mobi le. La sequenz.a sogg etto defn ira come la sotto s.e quen za pi lung a della
strmga di inpu t, che incopilnci ~on il prm o c::ara_tter~ diverso1.da quelli di spazio bianco e
cJie sia della form a attesa. La sequ enza sogg etto non cont err dei carat teri '. qualo ra la
stringa ,di inpu t sia vuot a . o sia formata intera1nenre da spazi bianhl_; o qua1914 il prim'o
~attere diver.so ,da uno spazio bianc6 no11 tottis pond a a un seg!;lo, una cifr;;i. o al (4r~ttei-e
s~ep>a.rato:re d~i ci~i1nali, La form a spansa :della sequ.enz~ sogg\:ttO

sara forn1ata da:

Qual ora la ~equenza soggetto abbia la frn a a~ttesa, la se:c:1uen'Za ili c aratte ri che i.nc~
mincia con l _prima cifra O con il carat tere separ atore dei_ decimali (ci clie appa re prim a)
~ara i11terpretat. tine Ut1a tosta nte in virgola mobi lt;; eccoetro che jJ arm ere spararor,e
dei d.eimali sar~ utiliz zato in $,srit11zione cli un punt o e che, qualorr,t i1on: compaia n 1lfi
esp onen te n un ~attere. separ~tqre dei decitnali, si presumer~ che que-sro segua 1 ultitn a
e ifta della stringa:.. Qual ora la seque nza soggett cmi ni con un s~gu nega.rivo, il vaiorertsalt ante dalla con_v;ersione sar inver tito di segno. Un pnn-rator alla strit1ga finale sar
imm~gazzinatc) nell'oggettG punt ato da endp tr, a patto che qu~$t non sia un puntatre
1

~-

soggetto sja vuota o non abbia la forma ;trresa.> non $ar esegl1ta
alcuna c0rrversione il va,lore di nptr sar imma gazzi nato nell'o ggett o- punt at0 d.a endpt-r)
a patto che qu.est0 no.n sia un , ptlll_t~t9.re n.ullo. Qual.ora la sequenz:~

La fun iio,n e .s trto d res:titui1~ il valore co'Il:t.'ertto qualo.ra: ce ne sia uno: Qual ora non
pos~ e~sere esegu it hess una c.0hve:rsione,. sar res:ciruit.o un.o ~ero. Qualora il valor e cori:~tto $ia ester n ~ll'ntervalJo di quell i rap:pre,sentabili, sar re;;srimito HUG:E_VAL po.sitlv: o.
negativo (in acco td9 con il segn del valore)., e sar!l itnmagaz.zinat<l in errn o il valore della
macr o ERANGE. Qualor~ il valore cprre tto si~ troppo pidolb per essete rappr esent at0, scir
testit uito zero e il valore della macr o ,ERANGE $at: imraga'zzinato in errn o.

lori"g int s t rtol (con st char *npt r, cha1

~*enc:fptr,

int

ba~ . );

porzione inizia le della stringa puntara da npt r i11 una r;app.t~entazione


lor.ig int_. In ,p rimo log9 essa scom patta la string a di inpu t in rre, parti : una seqLtc;nza
in rzjafe, eventtrf]l ment e-Vl.lCJta~ for.rn_ar~ da cara:ttri di spazio bianc o (cos CQ!Jle sp-ecific(ltO
Conv~rte la

dalla f'unzi.t1ne i .sspa.ce), una sequ.,~n~a s9gg,ettQ so,~gJarrte a un i11tero rapp.res,entato in


una qualche 'base deter tnina ta dal. valore di ba:se ~una string~ finle form ata .da 'Uno o pl.
q11elJo null0 di te1m i r;iazjon~ d~lla stringa di inp,ut. Quin di
e.ar~tt~ri non ricon osiu ti, incluso _
e~.:S ten~e-r cli corL.v~mre la sequenza sogg etto in un inter o e res-rituir. -il ri$ult at9.

__ Qual o.r-a ~l valore di.bas_e! sia .zero, la form a att~a d~Ua ~q.ue11Za sogg~tto s~ qliella .dj
un~costance mtera, facolw..nva.rnente p1eceduta. da 1m 'sctgno positivo o nega tiv0 ma senz-a
saffisso pet gli interi. Qual ota il valor e di ba,s e sla i:omp reso tra 2 e 36, la forma attesa
sar 11na ~eqo.~nz di lettr e e cifre cl1e rappresent~r u n inter o nella ba-se specif.ca ta d
~.ase_;, faolrauvam_ente p_r;~ced.uta da nn segno positivo 9 Aegaciv:o, masenz suffisso per gli
mter~. Le letter e da ,~ (o A) a ,z {o Z) saran no asso:i~e ai valori da 1 O a 35; saran JlO
ammes.s~e soltanto le lette te i cui valori a.se.ritti sian-o inter iori a quello di base ~ Qual ora il
~~ore di ba~~ sia 16, i. ca~atteti 0x o 0X potra nno prece-der~ f-acoltati.v amen te la s:e quen za
di letter e e cifre e s~gu1re il segno . nel caso sia prese nte.

. L:a seq~nz.a s?~~tr9 1e~~ cqirt la s:otr}iequnia iniziale pi 1~ga dell strin ga cli
mpti.t, chB mc_q,n11na on il pPi.mo caratt~re diverso da quelli di spa.~io b,ianc9 e che. sia
~ella :f~rma attesa. ~a s:quen:z~ s:oggetto non c o.nter r ,d ei ,caratteri, qu:tlo.ra. la string~ di
111put Sia vuota , o sia formata u1teca ment e da spazi bianchi o qualo ra il _p~im.o carattere
dive;rso da uno spazi o bi anto no11 cotti. sponda a un segn o una letter o a u.n cifra
1

-am.misSi bile.
Qqal ora la $equ enza s9gg_~tto .abbit1- la forrha attesa e il v:al.ore di base sia zero, la
se:~ueu.za cl.i qiratteri c;h"e inc.9min,.i_~ con la p()+n~ c:ifr:a sar int'.r preta ra cime 1.1n~ c ostan ~e tatera. Qua.Jox:f' la sequenza sogg~o. abbia la fornia att~_sa :e b.a se sia com.presa tra 2 e
3~' . quest~ sar lltilizza~ come base per la conv~rsione, attribuendo a ogni lette-ra il suo
v:aJ9re cosi co.Llle dett 1n prece denz a. Qual ora la sequenza . sogg etto incom inci con un
-~~gno n~gativo~ _il valore risulr~te dalla. conversione sar inverrit~' di segno. Un punt atore
allit ~inga fnale .sarii- immagazzi.nato nell?qgg~tto punt ato da endp tr, ~ patt:l eh~ q11es:ro
non sia un p11ntatore nullo.

Qual oia la sequ.en-Za soggetto sla_vuota o nnn abbia la .forma attesa, p_o_n sar eseguit<;t
.alGU.Ila conversione;. il valor e di hptr sar lmtriaga.zzinato nell' oggetto p.untaro da en.dp tr
a p_att he qi;restd non sia un punt at9te nullo.

La fitnzio.ne S'~rtol restituir il val.ore cG>.nvertitQ ~ qualora e ne sia uno,. Qualora i:ion
pes~~ ~~ere esegw ra .ne_ss:un a onvers911e, ~at: restit uito uno z_ero. Qual ora il valor e co,rtett-0 s~a esterno all intervallo, di qt1elli.rap.p reseu ra.bili, sar restitJJ,ito LONG_MAX. o LONG MIN
{in accordo con il segno del valore) e sar immagazzlna.r:o in errn o il valore della ~acro
1

ERAN'GE.,
ynsigne~. lon.g

int

strtq ul( onst

C.o nvert e la por~ione inizil: della

cha.r *npt r,

char -N*e ndptr , int base );

stringa punt;ata da

npt r in uria ra.ppresntazione

unsi gned l.onp int. L.a fuJizione S'trt oul fu.riziona in ffi.Q_do identi9 a strt ol. La
fumlfine strt o,u l restit uir il v.alore conv enito, qualora.ce ne sia uno. Qu.alora ,n on p.ossa
essere eseguita nes~Ltna conv-ersio.ne, sar restituito uno zero. Qualora il valor e ,corretto sia
_ MAX e il v:alo~re della
:e~~f1mp ill,int~tvallo d qut:lli rappresentabili, sar resrit uito ULON.G1
r rno.
~aro ERANGE sar~ imma gazzi.nato i.ti e1
.int rafld ( v,o id) ;

-~ fun,zione rand a_lola llll;.a sequenz::i. di inceri _Bseudoc~uali cqmp resi nell~intervallo
-d.a O'. a RAN:D_MAX. La funzione rand restitui.C- un intero pseudoc;asuale.

vtt> id srand ( u nsi g ne d in t seme ) ;

Af.PENDIC:E
. . B

Dci.lizza l'argo ment o

Come seme per una itilova

se~uenza

di nume ri pseudpasua.li da

con le chiamate sqcce$sive di rand_. Qual ora s rand sia invoc ata successivamente
con lo stesso valor~ d.i seme, la. se:ql1enz~ di n.11m_eri _pseudocasuali sar ripetuta.. Qu.alera
rand sia tiGhi amat a prim:a che sia- stata effet tuata tilla qualsiasi invcaz.ione di sran d
iamata p~r la
dovr~ e.ssre generata la stessa sequ enza p-rodotta quano sran d viene ch_
prima volta con un vfil9re di seme u.g1.1ale a l. Le segu~n,ri fun:z ioni defmi~cono
un'impleme~.tazione p:ertabile di ,r and sran d.

r~_stimi.re

stat ic unsi gned long int next = 1 ;


int r aAd ( .v a.i d)

3276 7 *I
I'! si assum
. e oh.e RAND - MAX sia
.

LA LIBRERIA. STANDARD

529

non si~nullo, l'ogget~o ~un~ato sar ril~cia~o. 1=ia funzicne real_loc ~estituir un punt atore;
n _ullo o uno che faccia rifer1m~nto allo spazio all9_cat ed eventu.alme:p,_re spost ato.
v.o id abo rt ( voi.d ) ;

F~ ili mod:9 ~he si verifihi la chiusura at1'00I'fale del programma, sempre che il segnale.
Sl:GABRT n-o.n s1a mt~rc;ettato e cheil relaciv.G gestore non testituisca il controllo. Lo s vuota ment o
iegl~ s~~m di outp ut aperti, la chiusura d.eg1i stream aperti e 4i. rihiozione dei ftl~ t:mpo i:~ei dipenderanno dall'in:iplementa.rione. All'a mbie nte di esecuzione . sara .r~stituita una
{orni_a defl n ita dall implm.Pt_;izione dello stato term inazi one senza successo, arttavetsc lahi_ar;p-~_ta d?lla 610?.ione rais e ( SIGABRT). La funzione abor t non potr-reStttuite il con-

.
:al- .chiam ante
t-rollo
.
-~

int atex it(v oid (*fu nz)( void )) ;

next = next * 1103515~45 +12345;


ret.u rn (un sign ed in t} ( ne>_rt / 6553 6) % 3276 8;

.Reg istra la funzi one puntata da funz perch sia richiamata s,en:z_a argom enti aUa term i-

.rrirne R?r.i:n:al del prog~.a~a. Limple-m .~ntazic)ne dovr s:upport~re -la registrazione di
~-.Lm_eii;o 32 funzioni. La f.:izione atex it restituir zero qualora la r~gsttazi.one ab.bia
_sI,JC(:~so . u11 valore dlversQ da ze,.:o qu-alora fallisca.

voi d sran d (uns igne d j_nt $eed )


{

next = seed;

void exit (int stat o);

}
~oid

*cal loc( size _t nmembJ size _t dime nsio ne);

Alloca uno spazio per un vetto re di. nmemb oggei-4) di dime nsion i pari a dimens.io ne.
Lo spazi, allocato sar inizializzato con tutti i: bi t zero. La funzi one call oc r~srituir un
punt atqre nullp .o un ch faccia riferimento allo spazio allocato.

void

f~~e(void

*ptr );

Fa..in, .modo che lo spazi.o p.unta~o da. pt r sia rilasciato, ovverosia che sia reso disp.on ibil~ per ulter iori allocazioni. Qual ora pt r sia un punta~rore n11llo) non sar seguita nessu na
punt~tore

rStiruto in
a:fil9,ne. In caso contt ario qualora l>a.rgo ment o non co rrisp9nda a un
precedenza dalle funzioni ca l-IOC, rnal.l oc o real.loc,, e qualora lo sp.azio sia sr-at9 r,:ilasciato da una,, hiam ata a free q a real l.oc) il comp ortam ento sar indef inito .
1

v.oid *ma llo e ( size _ t <;Jimensione);

Aildca uno spazio per un ,oggetto la cu_i dimen:sin, sar specificata da d i.men Si :O:n e
il cui valore s.at indet ermi n.ato. La- funzione m. ~lloc .restituir un pnn"t9-tore nullo o uno
che f~ccja riferi ment o allo spazio allocato.

void *rea lloc (voi d *p.tr , size _t dime nsi.o ne);


Cam bia la dime~ione dll,o ggett o ptlllt to a ptr -con qulla spe~ficata da dimen
s ione . I c_Q1n tenut i dellJo ggett q rion. saran n pi(rdillcati eptrd la dimensione pi piecola tra
la nuova 'e la vecchia. Qualora la nuov a dimensiotie ~ia pi grande, il valote della.. nuova
porzione allocata per l'ogg etto sar indet ermi nato. Qual0Ta ptr s:iq. un p11nt;ttore nullo, la
funzione rea l.loc si cmp orter come mall oc per la dim-ensione specificata.. Altrimenti~
qt:ialPr~ ptr .n on 9rri spon da a un punt atore resrit uito in precedenza dalle funzioui ca.ll oc,
mal~loc o re,a lloc, o qualora lo spazi ~ia ~rato rila,sci-ato cla una chiamata alle funzioni
fre.e o real loc, il comp ortam ento s.ar indef inito . Qual ora la spazio no n possa essere
alloccato, l,ogg etto punt ato da ptr reste r imm utato . Qualora d.i men sion e sia zero e ptr

Fa in m. ~do ~e si verifc.11i la chiu sura nonn-ale del prg tmm a. Qualora un prog ramma esegua pi di una chiam ata alla funzi one exi t , il coruprtam~nto sar indefinito . In
prlm0 luogo saranno richiamate in ord.i.ne inverso alla loro registrazio ne tq.tte le _funzio_ni
a ate~i. t . Ogn una di e;sse sar ric11ia :mat~ una volta per ogni registraziotie
regffi~~:tte d_
effe,ttuata. In segut~o, sar~rn no svuo tari tutri .gJi str:eam apert i che abbiano n,e1 b.uffer dei
r{~t:J no.Il a,n~ora scritti, saran no chius i tutti gli strea m .aperti e saran n rirnossi tatti i fl
Eeatl con la .fim-z:i.one tmp t ile.
Infin e, i! contr ollo: sar restt uito an~ain'bie11t~ di s~c1rz;ine. Qual 9ta il valo,r e

di st;a ..

a una forma. _d~finita dall'irupleme11tazione dello


to,si~ ~ero o EXI.T_SUFCCESS ~ ~arh restituit_
~~~ tttini naiio,n e con su,c"~s.s_o . Qualrrra il valore dJ stat o sia EXIT_FAILURE , sa:i: restituita y._n a ferro .a d~nnita dall,i mp1ementaz~one d-ello. ,stato tei;min-az.ione senza successo.
Al:t1dmenti Io St ato restit uito s:ar d:futlro dall'implementazione. La funzione e.x it n:0~
peti: res_cltuire il controllo al suo chiam ante.

thar *getenV{const

c~a ~

*nome);

... ~'3erca all>intr.Qo di un elenco di amqi ente forn it: da quello di esecuz:ione una stringa
GQn~~spondenre a qu:dJa puntata da; nome. Linsieme dei nomi delf'ambiente e dei meto di

per ~t~ra_re il relati~o elenco saran no de~ri dalJ' imp1_ementazione. Rerti tuir un pun.tJre
a runa sttmga asso.~ia~a al mmbrc) c0rir1spondnte dell elenco. La stting~ puntata IIQ,n dc"'-11.ebe ,e~ssre _modi fict a da] p r~grarnqia ma p_orr~ esser~ $Ostituita da, una. s.uccessiva
e;l~i~m~t~ alla ftrnzio ne :gete hv. Qualora il n10R1e .sp,emca,to i1on poss~ ess~re ritrovat., sar
ref1ttut un punt at9re nullp.
1

1_1i11t

syst ,em '( on$,t char * s t rin_ga) ;

~~4S.s_a la 5.tci.n,ga punt7ta da stri_n ga ~ambiente d_esecu.zione perch ' _$a eseguita da
ua,r t_nterr~ete di coma ndi in un modo defin ito dall'implementazione. Per strin ga potr
~sser~ ut1l1zzat 11n puntaro.re nUco per v~rifar~. se esista. I,ln interp.rexe di comandi. Qualora l'argqmnf sia un punt atot nullo, la fQ.nzione system restitllir un valo.r e diverso da

I.__ __ __

AfPENDtC..E B

5.30

L.&LIBRE&IA: T ANDAR D

531

zer s.oltanto qualora sia dlsp onibil e un interpi;et~ di coroandi. Qu~qra J,argomento non
sia un punta rote null0, lafunzione sy.s tem .restituit- un valo~e defn ito. dall~im.plemen.tazioue.

Simile alla.funzio ne ,d iv, eccetto ch gLl argom enti e i membri della stru.ttur.a resti tait.a
teh.e sa.ra .di tipo ldi v_ t) sarann o tutti dei .l on1g in"t.

void ~bsear.cti ( const void *chia ve J cons t void ~tJase, siz: ~_t nm.emti,
siz.e_1; dim1en sione , int (*campar) (co nst void *, cons.t void *))

l .nt niblen (cons t har *s, s_i4e_t n);


j

Qu?Jora s non si~ un pu1a tore .n1,:1llo, la fi11nzi0):1e .m blen determ iner: iJ 11umero dei
byte c:gJJt~uti nel cara:ttere multib yte punta to da s . Qualora s sia un punta tor nullo; 1~

Ricerc a in un vet:tGre d.i nmemb o.ggetti~ il ui primo elementb sar punra ro da b=ase., un
o_ggetto che: corris ponda a quello puntato da chiav e. ia dimensione di ogni elem nta del
'Vttor:e sar specificata da dimen sione. La fi1nz.ione di c~m:e;;trazione .PlJil-ta.tg\ .P-: compar
sar richiam:ata Gon due argo.rn,enti che p11nterann rispettivamente .all,oggetto chia.ve e a
un el~mento del vettor e. La funzione dovr re:stituir.e un intero -minore, uguale 0 maggiore
a icro .quaJorf!. l'ogg~tto- chiave sia considerato rispettivamenie minor e aguale o maggiore
di quello del veno.re. QueS:to dovr~ essete form~tqi nell''o rdine, da tutti ,gli elementi consi-

ftu~io~e

mblen restin1ir un valo.re div.etso da zero o zero a seond che la codificq._ del
~attere multi.byte sia o no dipend ente dallo stato. Q94lra s non si~ 1JP pwita tore n.fillo,
l funz.tlne mblen resti~ira. O ('.t1el caso cli~ s pU.n ti al carattere n.v.llo), ~.ppure il nume-r0 di.
by,te del f:atattere rnultibyee (Ai;::l caso che i successivi n Q meno caratter:-i fbrmi no un

.m!!lbyte-v;Ilido) , oppur e -1 (nel :caso che i sudde tti non formi no un carattere multi.byte
v~1d0).

d.r ati rollrd.Ii, uguali e -maggiori dell)o.ggettO, Ctliav e .

.i nt mbtow,e(w.c har_t *pwc, eonst ohat *s, size_ t n);.

La funzione bsear ch restituir un pillltanore :all'elemei:tt:!o corri~po.nde:p.te del vetqre, Q


1100 nullo qualor a non sia stata ritrova ta alcuna torrisp .onden za. Qualor.a siano ~onsideratl
ugu.ali due el~menti n9n sar ~peci.6.oato quale dei due sara quello orris ponde nte.

Qualo ra s non sia un puntatore nullo, l funzione mbtowc determ iner il rru.mero dei
tlyte:.ctontenuti ne.f carattere mulcibyt pun~aro da s . ~sa g:u.1di de1erminer il codice per
l valore di tipo woha r_t he Gorrisponda a qlJ.,el caratte1:e multibyte. (Il valore del codice
(>.ui.Spg.ogente al ca.ratte.re nullo zero). Qu"alora il carattere tnultibyre sia valido e pwc
rrQn s.i~ -u n I?-untaJore nullo ~ la funzio -n e mbt owc imm-agazzinet il codice nell'oggetto punt~'J;O' da pw.c. Saranno. esaminati al ma~imo n byt del vettQre pun(#.to da s.
~

vcrid qsort (void *ba,e , size_ t n~e~b , ~iz.e_t dimen sione ] int
(*com par)(c onst void *, e.o nst void *));
rdin a un vettore di nmernb oggetti. Le1ementQ iniziale sar p_ntllro d~ 'base. La
dime~sioIie di ogni a ggett sar spe.cifcata da dirn& nsione . I pnten uci del vecroore saran.no ordina ti in _mod SC(!ndente secondo la funzione di comparazione puntata da. c,mpar;
q~~~a s~ ri~ham~ta con due argom~nti che punterapno a,gli oggetti che dovra nno essere
confrontaci. La 1U.Mio1:ie restituir. u.n interq minore,~ ugual.e b maggiore a zero qualo.r a il
primo ai:gome.nto sia consid eratO ri;Spettivamente m -QO(e> u.gua~~ o ,m,aggiore del seco~do.
Qualor due eleme nti siano cbnsiderati uguali> il le-ro ordine a:Ll)intern.o d~I vettore ordin_at nn sata .definito.

'Qualora S sia Uil- punta tore nuJfo) la fw1ziqne mbtowG _restituir 1)Il VruGre diverso da
zern o_' zero a seconda che la codifc'.a del carat\ete multi.byte s_ia o no di-pendhte dallo
sfillfb. QL~alora s rt9n s),~ nn punta to.re nullo, la funzio ne mbtow c restituir O (nel caso che
s _puti al caratte re nullo), ~ppure ll nume ro di byte tontei1uri nel earattere multibyte
c0nve:~tito (o.e] caso he i successivi n o men.o byte formin o up. m:ltibyre valido), op,p ure1 (neJ c;aso, che .i . St1tldetti non formin o utr caratte re mulril?yte v~do). In ness_un caso il
val@re .:restituito sar maggiofe di n q li qu~llo dlla n1acro ~M :B~CUR_MAX.

in t abs ( n t j ) ;

i .n t. ,W ctomb { char

CaJ.1:ola
se.ntatO;

a valor: 4$Solut.o di un intero j . Qa~o~a il ri:sultat6 non possa ess.ere rappre-:

il compo rta1ne nto s.a.I indefrnito. La fq~nzipne

div_t div(i nt

n~mer,

abs restitu ir

il valore .assoluto.

int denom};

Calco la il quoziente ,e il resto della divisione del numc;ratore nume r p~r il denom inatore deno111 . Qualora.la diviS.ione 11-o'n s~a tiatra il quozie nte risultante sar l"intere_pi. vicin?
p~r difetto al qtiozi&p.,te algepricp. Qu~9ra il risultato non possa essere r.apprese,ntato, il
c.omp0r1amento sai:. indefi nito.; altrimenti- quoz * denom + res dovt. s5ere uguale a
nume:r. La funzione div restituir una struttu.r.a di tipo div_t,..:oIQ.pr~endente il qn:ri:e nte
-e il rst. ka. struttu ra dovr conten ere j segu:enti memb~ri, in qlJ.~sia.si ordine:

int qlJoz.;

I;; quozinte *f

int re-s ;
1* resto *'I
long int labS( lng int j) ;
SJmil~ alla fun:l.one a.b.s, ecerto che l,ar:gomento e il valore restitu ito saranno di. tipo
loog int.

idiv t ld iv(long int numer, long int denom);


o-

*s, wchar _ t wc ha r) ;

La f1Iiii_n:e wctomb de.termina il nu1nero di byte necessario per rappresntare ~l cr@.tte-t:e multi~yte corris ponde nte al codice il cui valore sar con[enllto in wcha r (nclIJs~a ogni
modEfiea .allo stato relativo al tasto delle maus tle) . Essa imrhagazziner la rappresei1tazi.0a. del ~.arattere mulcibyte nell 1'oggetto di tipo vttr e pun.t<:i,~o da s (qualo .ra s non sia u.n
puncatc::ire nullo). Saranno imtn?-gazziriati uri, massim o d MB_CUR_MAx caratte ri. Qualora il
:vru'1r di WCh:a r sia 'Zero, la funzione WCtomlJ rim:arr .nello Stato iniziale rela-rvo al tasto
d.me- maius
cole.-
~ --

Qv(lloat s sia un punta tore nullo, la funzio ne wt omb r~stituir un valore diverso: da
-~ero o. zero> a second ch,e la codifita del cartte re multi_byte $ia o nQ dip.~ndente dallo
.S,~ai::o. Qualo ra s non sia un punta tor nullo, la fi1nzione wctomb restituir - 1 qualor a il
v~ore di wchar notl oQ.rrisponda ~un carattere multjb,yt,e valido , oppute restitu ir il numerodi ~r.;e dl 1:4.r:a:ttere mliltibyte couisp onden re al v alore di wchar. In ns&un caso il valre'
1

r~cituit9 sar ll!&f!giore cli q_tiello della macro


si:ze_ t mb. stowc s

~wchar.~t

'*pW G~ s,

MB_CUR_MAX.

. -

const cha.r *s 1 size__,t n);

La ft1n.zi0ne mbstowcs legge una sequenza di c~?1tter_i m11lribyte, he incQmi1Jc::;ia110


"n~etlo statb iniziale relativo al Qist9 delle n1a i uscole d.al ve;:tt9re punta re da s e la converte
aetla sequen za di Codic;i c9rrisp9n.denti~ i 111 magarzioandone un m.assimo di n ne] vettor e
1

APPEN'DlCE B

533

pun.ta:tg da pwc s . N 0 11 ~ar esam.inato o c~nver.tito ness.trn ar~tte:c m ultibyte su~cessiv? -~


ella nullo (Che ~ar coqvercito in un cod1c d1 valore zer 0). Ogni carattere mulnbyte $ara
~nvettito come 10 farebbe un'invoc~ion della funzione rn bt owc, eccetto che lo stato
relativo al tasto delle mail1scole nella funzione mbtowc npn sar influenzato.

La fr1nzi:Qne strcpy copia la stting puntat:a da s2 (inclus0 il carattere .nUllo di terniinazione) nel v-ettCJre puntato da s 1. Qualora la copia avvenga tra oggetti he si sowappongano,
11 comportamento s:ar indefinito. La funzione st rcpy restituir il valore; di s 1 .

532

N l vetto,re puntato da pwc s saranne modific4ti al massi_mo. n elem,enri. I~ c?mporta- tra oggett
1 a- h-e s1~ so
,_
.defin1to n,
-"' 'ora sta 1ncontrame:nto d: t. una op1a
.vrt'ap pongano sara' rn
~uau__
__ to nn earatts:re multibyte non valido . la fi1nzione mb- stowc~ r~tLtllli (.sz~_t) - 1.
Altrimenti, la fu.nzione mbstowcs xe_stltuir il numero cl.egli. elementi m.odificatl n.el vettore, senza includere il od ice zero cii terminazion~, qualora ce ne sia uno.
.L

_ .

_ _ _..,_ -

- :

size_t wcstombs('c.har *s, c.mns-t whar_t *pwcs, size_t n) ;


wcstombs legge ,dal vett-ore puntatp da pwcs rina sequenza di .codi~ che
corrispondono a dei caratteri multi byte, converte_n<lola in una sequ~nza di c:il~rt-r1 ~-~~b-yt~
eh.e incoroincimQ .n,.eUo ~tarQ if!izlale relativ _al tasto delle ro..aiu.sco.l~, ,e lillmapa:zi;~a i
atatteri multibyte nel vettore puntato d3; s, fermandosi qualor~ un carattere n1ulobyte
faccia superare il limite di n byte,. o qualora si~ stat'.o ~~m~azz:ina~o. un caratte~e ~ullo.
Ogni codie sat co.nver.cito come l.0 fur~b.be un'1nvo~1on1e cl.ella funz1o~ _wctom.b, -ecetto ,che in qu_e_~t-6 c.aso l stato rlanv() al tasto d~lle ma1u~cqie nella. fi1nz1one wctomb non

La funzione

sar influenzato.

Nel vettore puntato da s s_a ranno m<:dificati- al massuno n .byte. Qual~ra_ la. copia
.awenga tra ogg~tti che si sovrappongano, il _ns-ulrato s~r~ indef1.ci~. Qu~~~a s1a incontrai..
to un codice che D.on corrisponda a un, carattere mulJtbyte v:alido:i la fi-_rnz1one wcst.ombs
reyrituk ( ~ize._t) - 1. Altrimenti) la f11n1~i~ne wc.sto.m~s r~titq.ir 11 nu~.ero _de byte
modificati
senza includere
il tatattre null di terminazione> qualora ce ne sia. uno
.
-

__ _,

'

--

char *s.trncpy(char *s1, oonst ch.ar *s2 1 size_t n);


La finzione strncpy copia U1l n1a.ssirno di r:l .arattG_ri, esludendo quelli ~uccessivi a
qiiello nullo, dal vettore puntate da s.2 in quello f?Ulltato da s 1. QuaJor.a la copia-a:vv.et1ga tra
oggetti che si sovrappongano, il comporta.m nto sar-indefinite. Qualora il vettore pwitat
s2 sla una stringa pi corta di n cararteri, rtlla topia del vtrt:te puntato da s 1 saranno
accodati dei ctaratter nulii, frtch non sar stato raggiant9 il n11m_e.rp mdicatQ d-a n. La
fiinz.ion strnpy rescituira il val9re di s1.

da

char *strcat ( char

*s1~

cQn~t

ehar

*s~);

La funzione s,t rcat accoda una copia ddl~ strin-ga puntata d.a s2 (incluso, il tara:ttete
nullo cli terminazione) alla fme d.i qu_ella punt.ata da s 1. Il arattere-iniziale di s2 si sstituir a:.quello di terminazione di s 1. Qualora la copia av\rn.g-a tra oggetti che si s-Ovrappn:gan.o
il comptYrtamen t sata indefu1ito La funzio'I1e st~rcat restituir jJ valore li s.1.

cnar

*strnc at ( char '*s1, const h .a r * s2 , size._t n);

La funziqne st rncat acod1:l un massimo di n ca:Fatteri (qell<::> nullo e quelli ch,e lo


s~guono non saranno ace:oclatl) dal vettore pu ntato d.a s 2 alla fine della stringa in.dicata da
s 1 . Il carattere in i'ziale di .s 2 _si sostituir a. quell.G nullo di rerminazione di s 1. Al ris"ultato
sar Smpre atcod ato_ u-n carattere nLillo di terminazione. Qualora la _c9pia .avv:ep,ga tra

oggetti che si sovrappon.-gano, il co.mportmfitQ


.restituir
il valo_re di s-1.
.-

inden,ni'to'. La. funzione s t rn e-a t

-...

....

~ar

int memcmp(cqnst yoid *s1l const void 's2, size_t

Gestione delle stringhe <string.h>

B.12
NULL

,,,
Una- costante di tipo punratpre n111.llo definita dlriinplemertfaQ:ion.e.

s. -ze - t
void *memapy ( voi.d *s1, const vi d *s2, size_t n) ;.

La funzione memcpy opi_a n c~atteri dall~gge-rto puntato da s.2 in qu~llo puntato d~


s 1. Qualora la copia avvenga tra 9gg~tti che si sovrappongano, .il componamento s~a
indtnito. La funzione memcpy re~tituit il v~QJ~e- di s1 .
v oid

\I('

memmove ( vo id * s 1 J co,n-st va 1d

* s2

s iz-e_t n) ;

La funzi,o~e memmove ce>pia n caratteri dall' o~gpcttQ_ pntato ~a s2 in qu~o P~~t~to. ~


s1. La copia avverr_. om~ ~e i cartteri dell'oggett0 puntato da s~ fo:sser~ pr1m.a ~.op1at1 m
un ve_ttoi-e tep:ip.0rnneo di n cararreri, che non si sovt:appohga a-gli oggetti puntati qp. s ~ e
s2 . e q11irrdi fossero ricopiati .WJ_ veti;ore temporaneo nell'oggetto pliRtato da s1 La funzio,ne mem:move restir11ir il valore di $1.

cbar

La funzione memcmp confronta i _primi n ca:ratte:ri dell' o.ggetto pL1ntato da s 1 con i


pri-m i n caratteri di quello p,untato cl.a .s2. La funziorie memcmp rstituir un intero niaggioI uguale 0 minore di zero qualora l oggert pllritato da s1 sia m~ggire, uguale o iinore
di qu~llo puntato da s2.
1

in t s t re mp ( con s t: e ha.r

Il t'po irrrerQ senza segno rstltuito d:all' op.eratore sizeof.

~s tfCpy(char

*S1, const ehar *s2);

n~;

*s 1 , eon s t eh a r * s 2 ),

La funzlo11f; .s t rcmp cQnfronta la .$tringa p,UEtata da si con quella p._U:ITtata d-a s2. La
fi1nzione strcmp r estituirlt un intero maggiol'.e, ugt1ale o m -n0re di zero qualora !),oggetto
puntato da s1 sia maggiore, uguale o minore di quello puntato da s2.
1

int strcoll(const char *s1,

const char *s2);

La funziqne strcoll. c.n fronta la str~~ pg_ntata ~a s1 con q~tell?t puntata da s.2.,
inte:rp.rerando entrambe in \p1odo ,onforn1e a-quanto indicato dalla.categoria LC_COLLATE.
della lo.cal.izzazione corrente. LafJn_ziene strcoll restituir u.n intero maggiore uguale o
mino.r e di zero- ~ualora la stringa puntata da s1 sia maggiore, uguale 0 minore di quella
punrata da -s 2, quando entrambe siano interprette in modo conforme lla loaliazione
1

corr~nre.

.i nt st :rn cmp (con s t cha r *5:1 , co nst e h9:_r *s2, s ize _ t n.) ;

La funzione strncmp CQnttonta l,111 massimo di_n aratteri d'el vettore p:u.ntato da s 1
escluclendo quelli -succ.essivi a qello nullo) con i caratteri Gorr~pondenti del. vettore punr.a-

APPENDICE B

535

D
LA LIBRERlA STANDAR
.

to da s2 . 1=.a fi1nzi9ne strncmp reS'tituir un valore maggiore; u-gume o minore di zero


qualora il vettoi;-e _puntato da s 1, eve_-nt11almente termina to d-il carattere nullo sia maggiore
uguale o minore di quello puntato d:::t s2, eve.n tualmen te terrhi rr~to dal carattet null~.

size-_t. strxf rm(char *s1, const chair *s2J

size~t

n);

La funzione st rxf rm tr:asferma la stringa puo.rata:da s2, i_mserend.o quella risul~.a.,te p~l
vtt;Qre indicat da s 1 ~ La trasformazione sara tale che, qualora la funzio1Te stremp fo_s~
a,pplicata a dt1e sttingh~ nMfo.rmate, essa r~timirebbe un valore maggior e, u.guale e mino-

.re di :zero c9crisp011d-e_nt!3 ,al risultato del4 t11 nzjne st rsoll appllcata alle stesse :due stringhe originali. Nel vetro.re cisulrant_e puntato da s 1 sarannQ ius~r_jti al massimo -n caratteri,
incluso _quello nullo di termina zio.n e. Qual,ora n $a zer9 $1 potr essere un pun~t;ore
nLtllo. Qualora la opia awenga tra oggetti che si sovra_P-pongano, il compor tainento sar~
indefmito. La _fu_nzio.ne strxfrm restituil' la lunghezza della stringa .trasformata (esciu_so il
caratte;r;e nullo di t~rminazione). Qualora il valre restituito sia :pati o maggiore di n:, i
contenu ti del verto.re IJU:n tato da s1 sal'.ar10p in.d ete-r minari.

void *m&mchr(const void *s, int .e,

$i~e_t

n);

La f11nzione ~t rspn calcola la 1nnghezz~ del segri1en to iniziale- massim che nella
strir1ga puntata da s 1 . ~ia format9 interam ente dl caratt:ri cout~nu,ci nella st-ilitg~ puntata
-

du s2. La nrnzion e .s trspn restituir la.lunghezza .d d segment o.

cha.r *s_trstr{c onst char *s1,

G0nst

char *-62);

La f1-1n.ziorl'e st rs t r individua nella stringa puntata da s 1, la p.,rim.a occo.r:rema della


s:equ_enza di caratteri .(escluso qu.ell nullo di terminaZione) 111tlusa nella stringa puntat d
S2. La. funzion~ strstr restituii IJ D pun~tOI~ ali~ $tritigfl. individuata, o uno nullo Cniil~
d a una stringa di lunra nqn sia stata citrovata nes~_una ~o.,rrisp.ond~nza. Qu~Qra s'.2 p1tn_
ghezza zero, l_a funzio.ne restiruira .s 1.

ehar *strtok (char *s1, const oh-a r *s2);


Una seri di nvocaziot1i della funzione strtok suddivi der l stringa-punt:ata da s1 in
sequenz a di to.k en_ ognuno dei quali sa~r delirttato da un ear.attere tra qu.elli inclusi
nella $Trii,.ga F1:111tata da s2. ~prima Jnvbc~iii d~lla srie 2Yi s 1 c.gm~ suo argo 01e:n.to
e sar seguita da invocaz.i.1ni ch:c abbian~, un puntato re nullo com e lgro primo argom~r1to ..
L stringa. dei separato i pu.ntara da s2 potr_Gambiare da una, crua.mat a all'altra. -

un:a

L funzione memchr individua-la p.cirna occ_or.renza clic (conve.rtiro in nn unsigne d char)


u~t P-timi .n .c aratteri (ognuno interpre tato carne unsigned char) dell'ogg et to p1Jntat_o_d.a
s. La funzione memchr re.stituir un pttntato re a1 carattere i.ridividuato; o uno nullo qualora
i1 carattere .n on sia pres~.nte n1ell, oggetto.
-

-~

char *strh r(cons t cnar

*~,

int o);

La ft1n.zione strchr -nd.ividua la prJila occorre~ di (convert ito in ur1 char) nella
stringa puntata da s. Il carattere nullo di terrnin:azio11e sar. c::onsiderato pMt~ della srr'inga.
La ~z~9n~ strchr resritui~ un puntato re al carattere individuato~ o uno nullo qqalora il
car<!tt~e non sia pt~~ente nella stringa.

size_t strc.spn ( 0on.~t .h ar *s1, const oha.r *52 ) ;

,La fun:z,io11e strcap n e.al.cola li lu11ghezza d~L segmento iniziale massimo eh,, nella
stringa puntata da s 1, sia -formato interm. ente da. arattGr i n.on c9ntenu ti neJla s~in-ga
puntata da s2. La funzion e st r.c spn restirnir la lunghezza deL segme11to.

char

~strpbrk(const

char *s1, const .char s2);

_La fu:azio.t;re .s trpbrk mcliYi@a la prima ocOrrenza nella stringa puntata d.a s 1 di
qualsiasi carattere i,ticLu:~o in que.lla puntata da s2. L funzion e st rpbrk restituir Hn_
o nno n ullo qu:alor~ ness@o di quelli in.cJus.i in s2 sia presente in
p11ntatore al carattere , _

dt!lla serie ricercher, nclla stringa puntata da s1, il prin10 carattere c:he non sia contenu to in quella dei s.epar:atori _p untata d.a s2. Qualora il suddett a
q.ratt~ non sia P-trvaro allora 11on ci saranno to.ken nella sninga punta.t a da s 1 e Ia
:f-i1nzlo11e str-tok restituir un. puntat9 re nttllo. Qualoea il suldrro tarattre $ia stato- ritto~
..
varo., que,sto corrisponcl.cr all'inizio del p.rimo token.
La prima invcaz ione

caL'attcre che sia tra quelli


ntent1 ti nella string:a dei. separato ri. Qualora il sud.detto carattere no11 sia stato ritrovato ,
il ~oken corrente si esten.d er fno alla fine della stringa prrrttata da s 1 e le 'successive
ri_c erche di un token restituira nno un puntat-.ore nullo. Qual.ora il sudtletto, caratter e sia

La fu,nz.ione S't rtok ricercher quinci.i da quel punto

Llll

sr_at:-o ritrovato qusto ~ar~ sostitu.ito da uno nullo che termine r il tQken corrente-. La
frrnzione strtok salve1: un puntat0 re. al carattere successivo,. dal quale partir .la pro.s_sima
ricetc-a fil un token.

Ogni chiamata successiva, rzhe abbia lin ptm.tatoxe nullo come valore del pximo argoIll~nto~ in iz.ier la ricerca d'al .Pu1:J.to salvat e si comporter come descritt o prima;
unpleme ota:Uon e dovr compr tarsi cqme ~~ n~s-nn~ f11nzionc; della libreria ri]iiactri
:strtok . La funzione strt.Qk restituir UD puntato re al primo carane~e di un tQl{en, -o uno
aull-0 qualora -n on ce n.e siano.

r:

void *mems et ('Voi.ci * s, int e, sze _ t

~n

') ;

. L; f~zione me~set cofJ.ia il valore-di e, convertito -i n un un.sign ed

s 1.
char *trrch.r(cons t c.har *s, int e);
~~ funziqn e strrcflrr ndividua l'ultim-a occortenz.a di e (coovertito in lift char) nella

s.uinga puntata da s . Il c-araqere nullo di ~&rmin~ione sar cansiderato parte della stringa ..
1.a. nJn:zione strrch .r re_sriruir un puntatore ,al q_arattere, un9 nu1lo qutlora e non sia

pre.sente nella stringa.

&iz

strspn( const char

*s1~

const char *s2);

char, in ognuno

dei prmu n caratt<?n dell'g.ggetto puntato da s. La fu.n zione memset restitL1iril il valr di s.
~har

~$trerror(int

errnu~);

La fi1.n7.iof!.e strerr or individua la $ttinga del me~aggio di errore c9rnsp dente -~1
valere di erraum. I;imple:mentazione dow. comp()~tarsi co.me $e nessu,p:a firflzione della
libreria richian'i .st .r error. La funzione strer.r or restituir un punt_ato.re alla stringa, i
i ori~e11uri saranno definiti dall irnple.me-ntaziotre. Il vett0t puntato -non ddvrebb.e e-sse-re modi&cato dii pro.gi:am.01a,
-fun.zione str~error.. -

ma

pQtra essere sostirui~o da un_;a chiamat a sucessiva alla

APNENDTtEB
.- .
.

..;.

La fu~ione st rlen cfil_c.o:La la l~U;ghezza della stringa pun.ta;ca d_~ s . l~ firnz:ibne st.r len
re:s:titui:r: il ,numer.o di car.a t.teri b,. precedqnQ iu~Jl.o -null-0 di termi11azione.
1

B.13

Data e ora <time.h>

NULL
Una :o~.tfillte di -cipo puntatore nullo _definita dair_impJetnerrtazine.
co .ck---t
.

-un tlpo aritmetico in. gcad-o di rappresentare l'ora ..

time t
Un tipo aritmetico in g~do di rappresentare l r:a.
1

siz e t

Ll tipg inter.o se:!lza segp_o

r~tituitQ1 dell~operatore

s:i zeof.

struct tm
Mantie,n'.e i colnpon,ent~i ,cl.elle ,dare, chiamarl tempe fra_n;imentato'. L? struttura clevr
contenete almeno i seguenti membri iru qualsiasi_ ordine. Le seman-t khe :dei membri e dei
lorb nor.mali intervalli sotto esp:resse nei cotnmenri ..

int tm_riion;
int t!ll_year;
int tm_wd ay;

int

t 1m_y"d ay;

int

t-m~isdst

.;:

I* secoiidl dqpo il.rn,inuto: [O, )!)} *I


/* ininuti dopo l'ora: /O 5;1J */
l * erre dajla m&tAno#e: [6, 23,) * I
l* gi,omo_del mese:.'. [1~ 31] * {
/ * mese. da gnnaio: {O, 111 *I
I* anno dal 1900 *'/
I* giorni dalla domenica: [O, 6] *'/
I* gjtJ.rni dal 1 genna:io: {O~ 365) * l
I* fogper: l'ora leg/tle *I

. Il val.ore di tm_.is dst ~ar P' 9~~tivo qualora 1~6,r 1~gaJe $kih corso, zero qrralora non 19
.s1a e

H~ativo

,c;t:ifftime re~ti.~ir la "fiffer~nz.a ~pr~sa in secondi in u.n double.

La fi11izi:o ne mktime converte. il 1emp.o fr,a m mentat) ipresso corn ora locale cl.ella.
strf!Ui1i purttta Ga t .i meptr ID un -valore di tipo cWtt;a, CQn la stessa C Qdifica di quelli
rfqkJtituiti dalla funzione time. I valo-ri origin~li dei me11ibri tJU_wday e tm~yday della
.strurtu:r;J . sara n no ignora~ me.nfre quelli degli altri rnemb-ti .non .sara11no .limitati a,gli .inter-6
valli indicati prima... In un cox.pleram',nr-o su.ccessv i valor dei membri tm~w,da. y e
tm_.yday .cldla struttura sa.i;-,anno im.p.Q.~~ati in mpdo a:pprqprato, me:ntre gli altri .m:embri
$'.anno impostati in modo da rap:presentare a data sp~cifi~ta:~ ma con i lro valori forzaci
Jt!'e:g,,l:i int~rvalli indcati prima: ilval0te fmale di tm_mday n.cyn ~ar. 'in1pqst:at9 finch tm._mon
e 'tin~ye-r non sara_nnt;, ~ari determinati. La funzione mktime restirui.ra la d:;ita specificar~
<:lodifca.ta '4ome un valore di tip tme_t. Qualor. la data non _pessa. essere rappresentata,
la funzione .resri-oilr il valore (time_:t) .. 1.
1

Il nt.rqtero pet secondo -del -vlore restiwiro dalla funzione cloc.k.

tw_liour ;,
tm_maay ;:

- tim e0. La funzione

trn_.s.:ec ;.
t. 111-_ m1.n ;,

L(! flrozion~ difft_ime calcola ladiffere"frla tra due date: ti.me1


tl:me_ t mktime ( struct tm *time pt r);

CLOCKS PER SEC

int
int.
int
iht

.537

X'rl'A'R D

'JBOL:'Dl & &r


A 'il,I . .
. . ""' . .. - ~
- . - ..;I L.111
-

d o,. ~ole dif f time{t.me_t tme1,. t -i -me_t: tm.e 0};

strl n.(const otiar *s),

si. z. e~t

L'~

q,ualora I'info,rmazio11e

llQtl

sia dispo.nibile.

clok t cl.o.ck (.v:oid).;

ti.m:_ t tim.e (t .ime_t *t ir:ner) ;

La funzione time deter;mina la dar.a e !)ora c 0rrente. Essa r~ituis_ce l~ miglior approssimaz.io~e d~ll 1 impl.eriien:tazic).n per qua-nto. riguarda la data e; l_>ota correnti. fl valo1)~
.(time_t) - 1 liaJ r~~.titJiitQ qual_c)ra la data e l''ora nD sia:Iilo disponibili. Qua.lor~ t .imer
no.Jf.sia un puntato(e nl!llol il valore re~titoito sar assegnato anche all~ ogget.to punt:a.t-0 dalle,
sit'.essa.

tnar wasctime(const struot tm

*tim~ptr)l

L~funzione asc~im&ct1nverte il tempo ftaro-m,e.nta:to dellasrr.utn1r.:~ punrat~ ,da timeptr


in u,na stringa Wtl segurite forrrratc:J:

Sun sep

1~

01 :03:52 1973\n\0

La. f1:1nzione asctime restituir un pllfitarore alla stringa,.


char *ctimr (:CQnst time_t . *timer);
La funzione ct:ime cz:,o.r1vertce la data e l'ora pntate da timer in una stringa che rappresef!~ 1~om lo,cale. equiiralente a

asc;t ime (lo e alt ime ( t im.e r)}


La funzione et ime restituitil pu.ntato,re ricevuto dall~ chiam3=ta della fonzi()'ne asctime

._Qn quelf~rg'.im_t1to di temp frammentato.

struot tm *gmtime(const time_t *timer);

La fitn:zione c.l ock deter:tn.iha il tempc1 di processote utilizzato. La funzione e.look


res-titliir la .miglior approssirti:azione d~ell impletrienta:tion.e per (jillinto t_igtra.tda il tmpo
del p~0cssorewato dal ptgranuha, dall>~nizi di n momento definito dall'impl'e.mentazion
correli,to ' s.olt~nto cot). 1,invocaiione del pr9gfa,mm~ . .Per d.e,rerm i na re il t~mpt) in sqn:di,
il valo.re restituito 'cl.alla funzione e.lo e k dovr.- e~sere diviso per qu~llo de1l.a n1acxo

La funz.ione 1g.mtime converte la lata e l~ora p.uni::ate da_timer irt un tempo frammentato, e~prsso com e Coordinat.ed Universal Time (UTC ,ora montl'iale coordinata). La
1
f11nzione g11.t ime restit11it: u.n puntatere a qudl) oggetto, o uno ngll9 qualora i UTc n.o n si:t
.
b1
.d.:1.~pon1
1 e.

CLOCKS_PER_SEC. Qualora il tempo. usato del processore non sla disponibile o il suo

s:t ruot tm *loc.a l_time(.nst time t *timer);

valote non p0ss esser,e rapp.re-semato, la ..fu.nz0ne restituir il valor (e loc k_ t ) - 1.

538

APPENDICE B

La firp zio ne loc alt im e con ver te la

LA
L$R
ERIA STANDA,RQ
.
-

data. e l ora"p u;nt ate da tim er in n reni,po fra. m~


me nta t0 espresso com e or~ locale. La funzjone lo ca l tim e r-5tltuira
un pu nta tor e a quell
i

Nel caso

cl1e un specifica di onversj9ne non sia Lrna . .di quell: ~l~ncate.


s~pr~ il
e>_mpr"tam~nc s~ ind efi nit o. Qu al9 ra il nu me ro IQ,t ale di ca: atter1 rlst
tlr:anu~ i11~lu.s~
qu~llo nullo ,di t~rn1 inazione, 11011 sia roaggi()te di maxQim, ~~ fq11 .z
10~1e_ strftime r~snt~~a
il nu me ro di quelli inseriti nel vettCJte puntato da. s > sen za m~ludere quello nul
lo d.1 teJ_ ~
nazione. Altrimehtii sar restituito il valore zero e .i Gontenuti de-l vet
te.re sar ann o ind ete rI_idnati.

oggetto.

siz e_ t str fti me ( ch ar *s , siz e_ t maxdim J co ns t cn ar


str uc t tm ~timeptr);

~forn1ato,

co ns t

La f1nzi0Jle str fti me inserisce <;lei c ara tter i n .el ve:ttore pu nta to da~ nel
mo do indie:ato dalla sttinga puntata da form:a to. Qlf.esla sar foi-mata da zero
o pii,i speifcl1e ili
eonv.ersl0n e da caratteri m ltib yte ordinari. Tu tti i c:ftatteri ordin~
l (incluso qudlo nu llo
di terminazione) sa nn o copiati seni.a .modifiche ne l vett0re. Qu_alora 1a
copia avvet1ga tra
oggetti che si sov rap pon gan ol il comportame;nto s,ar .indefmit0. Ne i vet
tor e saranno ins eriti al n1.assimo ma,xdim car atte ri. Ogni specifica di cQnversione sar
sastiruit~ da. cara;tteri
app1='op.nari com e descritto"nella lis,t.a s~guent~. I car att eri app rop ria ti $ar
-ann9 det erm ina ti
dilla categ?:tla LO_...TIME d.eU~ locali_zzazione cor.rente e dai v:~(lri contt:;
rruti nella struttura
pu nta ta da tim ep tr.
%a
%A

%b
'%8

%e
%d
%li
SII

%j
9csm
%M

%p
'6S

'sU

%W
'&x
~X

\y

%V
%Z

B..14

s:at sostituitjl dal .g ior no dell'.anno esprsso com.e numero dem.ale (00
1 36 6).
sar so;stituita dal tile$~ espresso come numer-0 decimale (01 12) .
sar .$Osti.mira dal mi n:u to esp.r~sso a me 111ner.q dec im ale (00 ~59
).
s:ar sosrituita dal!, eq:.uivalent. Jacale della de$ignazione AIVI/PM ass oci
ata ad un
form. a.to
di 12 ore.
.

Limiti dell'implementazione

< .lim its.h >


Le seguenti tosranci simboliche dovranno essere definite con gtandzza (va
lore a5solu~o); uguale 6 maggior. ~i val otl ind ia ri dJ segui~o .
Il nu1nero, di bit per l oggett9 pi pic c0l o che n_on s~a un cam_RQ di
bit (b)rte).

sar sqs ttu ita dal no me locale abbreviatq del gio.u10_della settimana
.
:s-.rr sos titu ita dal n0m~ locale com ple to del gio rno d~ll~ settim!fl.a.
sar, sos titu ita dal non1e lo:cale abbrt:via.to del tnese.
sar sostituit~_ dal no me looal com.pJet del mese.
saci. sstitUita 4all, app tqp ria ta rap presntazihe lqcile' della d.ata e d.ell'
ora.
sar. sostituita dal gio rno del me.se e;spres~o com e nu me ro decimal (01
. -3 1).
~ar sos titu ita. dallJ ora (ne l tor ma ro di 24 ore) esp.ressa com
e nu me ro decin;t_al,e

(00 -23).
sar sst~tuta dal1' ora (ne l foa fia t,o .d i 12 ,or~) es.pres~ com
e n1rme.to decimale
(01 -12 ).

539

#d efi ne SCHAR_MIN

nvalore :rrrinimo per un 0g_ge:tto di cipo sig ne d

-i 2.1
ch ar.

#d ef ine .SCMAR_ MAX

+1 27

Il valore ma ssi mo per un oggett0 di tip o sig ne d ch ar.


#d ef ine UCHAR_MAX

25 5

U:valor massim"o p t un o.ggeuo cli tipo un sig ne d ch ar.


#d ef-i ne CHAR_MIN

0 o SCHAR MIN

Il valore mi nim o per un ogg tto di tipo. c.h ar.

#'d f ine CHAR MAX

1'

sar. sostituita

gaJ. sec ond o espresso

cGm:e nu m.ero decin.lale (00 -59 ).


sar- sostiruita dal numero dlla settimanq. de.U' anno (la pri ma domeni
ca sar il pri m~o giorno dlla set tim ana 1) e$presso com e numero d~c
imale (00 -53 ).
sar s:0srituita dal giorno della set tim ana espresso come numero decima
i~ :(0 -6) ,
dmve la do me nit a sar 0.
sar sos titu ita dal nu me ro dlla. set tim ana d~llianno (il primo lun
ed sar il pri mo
gioi::no della set tim ana 1) e$p,r$so com~ nu me ro dcimale (00 .. 53),
sar SO~ttuit:a dall,appropLia.ta rapprese.ntaziQn:e lo;J.e della data.
sar s0stimita lall appro_priata rap pre sen taz ion e locale dell]ora.
$ilra sos titu ita itiall .an no $~n ,za il secolo. e~.r:esso com e nu me ro
dciri:iple (00 ~ 99).
ar ~ostittJ.ira aall an,no (cornpres ~ $eolo) espress0 ceroe nu me
ro decimale.
sar sos titu ita dal noJne o dall~abbteviazione della zo!l del fuso ora
rio; o da nes sun
1

tr atte + qualor~

la zona del .fuso

sar sstltuita da o/o.

ora rio no n ~i_a det erm in.abile.

Il valre ma ssi mo p.r un ogg etto di tip o eh a r.


#d fi ne MB L.EN MAX
- - -

Il n 11 mer.o P1~s$im di pyte in. un ~attre mu ltib yte, per ogp.i loc.alizzazi
one ~uvponara.
# de f ine SHRT_M'IN
-32 76 7

Il v~Qr~ minimo per un 9ggetto di tipo sh or t in t.


#d efi ne SHRT_MAX
Il val ore massimo per un ogg~tto dj tip o sf ort in t.
#d ef .i ne USHRT_MAX.

li-valore massimo per un oggetto di tip o un sig ne d sh or t in t.

#def ine INT - MIN

- 32 76 7

IL valore mi nim o per un oggetto di tipo i nt.


#d fi n INT._MAX

11 valore massirnb per un oggetto di tip o in t.

+ 3"2.76 7

540

AP-PENDJCEE

i#'def ine UINT MAX

Il valore massimo per


#~ef ine

Lifi

5:5535

#define FLT- MIN - 10- EXP


#d~fine DBL MIN 10 EXP
- #define LDBL MIN - 10- EXP

-2147483647

Lintero n~gativo minimo tale eh~ 10 el~v-atc)


vallo d~j n11.me;ri in virgoJa mobil~ n_ orm_aliz~ari.

oggetto di tipo unsig.ned int.

LONG MIN

Il valore minimo per un oggetto cli tipo l .on_g int .

#define LONG- MAX

4.2 94967295

I.:intero massimo raie che FL T_RADIX. elevate a quella potcQZa meno, 1 sia un numero
finito rappresentabile in virgola mobile.

al pi\t Vlin

.2

pross:i1r1a
pro$sim~

positJvo

allJinfinito negativo

FLT RADIX

.La b:ase della rappresentazione deIJ'espo.nenreJ 'b.


1(

#define FLT MANT DIG


"
#define LDBL MANT DIG
#def ine DBL - MANT - DIG
Il numero di ~ifre Ul base FL T_,RADI .X n,el s.ignificando :i11 virgola mo'bile, p.
#de-f ine FL.T- DIG

#def ine DBL DIG


#def ine LDBL DtG
-

+37.'
+37

n11meri fint~i r~p, presentabili in virgola mobile.

.# def ine FLT MAX


#def ine D,Bl__. MAX

1E+37
1E+37

#def ine LDBL_MAX

1E+37

Le seguenti cost_anci simboliche dovranno ess~re definite con grandezza (v-alor~ assoluto) ugu.ale o rnaggiore dei valot i indica ci di :seguito.
~define

+37

L-e seguenti costanti simbolihe dovrnQ ~~ere definite uguali o maggiori dei valori
mosu.q.ti di seguir.o.

allo zero

all iij.fnito

.Lintero rnssimo rale che 10 elevato a quella potenza sia compreso nell'intervallo de-i

la modalit di arro.c9ndam1:1:11to per l'aP.diii<)iie' in virgola m9qil~.


ptossm~

.......,

'#def ine FLT- MAX - 10- EXP


#define DBL - MAX - 10- EXP
#de.fine LDBL - MAX- 10- EXP

#def ine FLT ROUNDS

quella potnza sia comp.reso nell inter-

#define FLT- MAX EXP


#d~f ine DBL_MAX_EXP
#def ine LDBL MAX EXP

<float.h>

indeterniinabile

a_

+214-748364 7

Il valore massimo per un oggetto di tip9 u.nsi gned lang int .

-1

- .3.7
-37
-37

'.:

Il valor massimo per un oggetto di tipo long int.


#def ine ULONG-- MAX

54-1

LA U.BRERIA STANDARD

10
10

Il numero. di cifre decimali, q, tale che ogni numro fil virgola. mobile con q cifre
decimali possa essere arrotondato in ufi nlllli~to1 in virgola. mobile ton ba1Se .P1 b cifre
riportai:o al suo valore origiruirio senza modlfi.d te alle q cifre decnali.

#defin FLT MIN - EXP


#def ine DBL- M!N - EXP
#define. LPBL - MIN - EXP
~

Il nume_ro n1as_simo finito in-virgola mobile rappresentabil~


Le seguenti costa.nti simboliEh~ dovrru1no essere definite uguali o minori dei va.l:Qri
mostrati

d1 seguito.

#def in FLT EPSI LON


#def ine DBL EPSILON
fdefine LDBL- EPSILON

1E: 5
1E - 9
1E ~ 9

La differnza rra il valr 1 . e quello minimo maggiore di 1 ,O che sia rappresentabile


n~l tipo in virgla mobile spec_
ificar.
#def ine F.L T MIN
#_define D'BL MIN
#tlef ne LDBL MIN

tE- .3 7
1.E-37
1E-37

Il numero positivo minimo norm~liz?:ato in virgQla mo.bile_.


(Diritti d,autore: questo materale s.tatQ_cond~nsatQ e adattaro a partir~ dal doc11m_ento
America.o Natio_nal Standard for Informarion Sysrems-Program.m ing.Language-C , ANSI/
ISO 989Q:. 1990. Copie di qL.esto_standard pos;sono essere acquistat~ dallaAinerican-Natiomi l
St~ndards ln~titw~, West 42nd Street, New Yorl~, NY 10036.)

Linteto negativo minimo tale che FLT_RADIX elevato a ;quella potenza meno 1 sia urt
numePo in virgola mobile trotmalizza-to.

-AP PE ND IC E

Pri,o r it e associativit
degli o p e r a to r i

(Jpt.a.tore
I

( ) [ ] -- >
++ -- + - J

Asse cia tiv it

da sinistra

11

(tip o) *

&.

siz eo f

+ << >>
< <'= >

>=

-,-- J--

'&
A

I
I

&&
I I
I. I

?"

= +::::::

-=

*= /=

%= &=

""=

:=

'

<<= >> =

Gli oper:atori son o. mostraci dall'alto .i n basso

a destra.
da destra a sinst.i:_a
,da sinistr~ a: des tta
eia. sinistra. a d~tra
da sinistra a des tra
da. sin.istr,, a. a. des tra
da sini,stra a des tra
da sinistra a destra
da sinistra a des tra
da. sinistr
a- a des. .tra.
da. sinistr a a destra
da sinistra a destra
da
des tra a. sin
isrr.a
.-.
d de.stra a siniSu
a
-..,
da sinistra a des tra

in ordine decre~ente di priorita.

AP PEND IC E

L'insieme dei c a ra tt e ri A S C II
o

sh

stx
-

l
2
3:

nul
n1
dc4
rs

vt

ff

4
5
6

7
8

_5

et#

4
eot

enq

ack

cr

SO

S:l

dle

7
bl
de.1-

em

sub

esc

'

bs
dc2

ht
dc3

fs

gs
e

nak

syn

etb

c;,a n

us

.s:p

if '

&

'.ii

;.

<

--

>

;:i

F
p

I{

J
T

l\

u
-.

9
10

\
f

11

P-

12

'i.

L
V
l

.e

o
y

X
b.

M
-

del

I n_umeri a sin istr a d~ll.a tabell. rap pre.s ent ano le ifre pi significative
del cod te del
carattere, espresso in not azi one decinlale (0-1_27), me11tte quelli in lm a alla
tabella rappresentano le cifre me nq significative del cod ice del carattere. Per esempio, il
codice del
carartere 'F' 70, mentre quello cli e& ' 38.
1

APPEN DICE

. .
.
.
I s1ste-m1 numer1c1
Obiettiv i

Ap,prend~re i c~~1ce_tti fundam~n~ riguar~ti i sisten1 i numerici, come la ba,.se, il

valore posizionale e quellosnbolico.

Capire come oprae con innmeri rappresentat i ne.i sistemi numerici binari9, ottale ecll

esadetimal.
Imparare ad abbr:evare i numeri bi.nari .in quelli ottali o.esadecimali .

Imparare a convertire i n1uneti ottali ed esadecimali in quelli bin.ari.

Imparare-a convertire i-numeri dcim.ali nei 10.ro equivalenti binari> ottali ed

e.sadecm ali ,e Vicevetsa.

E. 1

Appr~ndere J'aritmetica binaria e il modo in cui i nt1 meri binari sono rappresentati
utilli.zandq la notazio.n e con compl~mento a du:e.

Introduzione

Questa. appendice prencl.er in esame i principali sistemi numerici utilizzati dai program-'
ogetti Software the richiedono U,P:a
matri C, $pecialmente da chi si trova. a laV.otare -SU pr_
stretta int~razione con i componenti hardware a c'livello macchina" . Progetti di questo tipo
comprendon 9: i sistemi operativi, il sofuv~e di rete i compilatori . i sistemi di database e
le applicazi.oni ,che richiedano, pre~tazioni elevate ..
Q11ando, all'interno di un p.rogi:amn1a. C, sctivete un ntn:fo intero coro~

22,7 o -63

.q uttst i11terpretato come apparte"nente_aI sistetna numerico det!imate (base 10). Le ifr.e del
SWtema numerico decimale Sb'n O , 1, 2~ 3 4, 5, 6, 7,, 8 e 9> dove 'Q Ja C ifra pi bassa
wentre 9 quella pi al~ (na in meno <lei.la base 10). Internamenr> per i compu.ter
.u,tilzzaaQ il .sist~m<t. nurrz.,erico binario (ht;lse 2) che possiede solt.a ntp due cifr,e, ovversia O
e 1; in questo caso, O la cifra pi bas;la, mentr(;:: 1 e quella pi4 alta (una in meno della bas~ 2).
0

Come ve:dr.ete, i numeri 'binari t~ndono a esse-re pi luug~ dei loro equivalenti deci"'."
inti,li. I programma tori che lavora:n0 on i linguaggi assembly e con quelli di alto live-llo
(cq:Pie i.I_C), che permt'.tpn lor9 di arrivare fino al '~livello inacch inan trovano normalmente molto somodi i n,un1eri bmari; qtiest'o il motiv per ui sono diventati popolari
d-ue altri sistemi n1J merici , ovverosi~ il sistema num.erico ottale (bas-e 8) e il
s-is.tema numerico sadcimale (btts. 16), che semplificano l~abbreviazi,one dei n1_1me.r i binari.
1

Nel sistema numerico ottale, le cifre vanno dallo O al 7; giacch sia il sistema numer:ieo
binario sia queliq op:ale utilizzano n:ieno cifre di qltello _decimale, queste so.no uguali alle
loi:o eo.rrispo,ndenti de,cimali.

APPENDICE E

1 S{SIEMI NUMERICI

549

Il sistema num.e rico esadecitnale presenta iin problero:a, .giaecb richiede sedici cifre
(O quella piu bassa, e urta pi alta con -un valore equivalente af 15 decimale, ovverosia uno
in mend de.ila b~~ .L6). La convenzin,e vuole che .siano utilizz-a te le lenere dlla A alla F per
ra:ppresentare l~ cifre esadecimali c;orris_pndepri ai valori decimali dal 1O al 15.; nel sistema esadeciniale1 qi1rndi, potr:a nno es.servi dei nuni.eri come ,g76 consiste nti sl~m ente di
cifre simili a quelle-decimali, oppure dei nmneri come 8A55'F conslst@ci di cifre e Letter~,
oppure ancora numeri oome FFE consisre~nti soltanto di lettt}re-A volt; un numero esa,deeiniale
potr as$6inigllare a. una parola c:ome PACE (yolto) o FEED (cibo); tutto ci potr sembra'"'
re strano ai p~ogrammatoci ~abitua.ci a lavqi;te con l numeri.
Ognun-o di quest _sistemi nttmer i utilizza la ngtazione'posizitjndie, ovverosia ng:ni
pos_izion.e in .cui stata scritta una cifra p:essiede un ,diver_sQ v~.lare posizionale. Nd caso d~l
numero decimale 937 (il 9 il 3 e il 7 ,go110 defnirl valori ~imb(Jto), per- es,empio,
7
~crito nella postzio11e delle un.it il 3 in ,qu&lla delle decine e il 9 in quella delle centinaia.
Osserva te che ognuna di quest~ posiiioni una potenza della base (10) e che queste p.otenze parto-110 da O e cr~sono di 1 rnaa mano che ci si ~p9sta a s:itiistr<It ali in.terno del n11mero

I vaJori posizion ali ne.I sistema numeri


co decima
le
.

Cifta decimale
Nome .della posizione
Valo.re posizionale
Valore posizion'ale es-presso
come potenza della bas- (10)
Figura E.3

centin aia

Decine

Unit.

100

10

I valori posizonali nel sistema numeric o d'ecimale.

. Nel ca~o dei numeri decimali pi iungru, le posizioni suoces$ive a sinistra torrispo nd,erebbero alle miglia!.a (IO alla terza potenza) alle detine .di mlgliaia (l .alla qnarta) 1 alle
ce:ntinaia di migliaia (IO alla quinta) ai miliorii (.10 aria sesta), alle d~ine 4i .milioni (10 alla
setri ma) e cosl via .

Cifra binaria

C ifra ottale

Cifra decima le Cifra esadeci male

_ Nel numero binario -lQl, $ dic~ eh.~ l'uno all,e_strem~ destra si trova nella pos:izion
degli itno~. 16 O in qellp._ dtJi.due e t;u.no ali,estrema sinis-u a in quella dei quattro. Nntate cl1
og~na di queste posizion i .u na. potenza d,ella b,ase (2), e che qL1est potenz.e partono da O
e anmen~a,no di 1 ma11 m.a no c-he ci si SpQSta -a sinistra all)interno dl numero (Eigura E ..4).

0'

I valo.ri posizio nali nel sistema numerico binario

;2'

3
4

4
5

4
5

Cifra binaria
Nom.e della pos_lzi-0ne
Valore; posizionai~
Valore posizionale es_presso
ome pot~nza. della b;~e. (.2)

1
Figur,a E.4

(Figura E.3).

--

5
6
7

A
B

(valore decima le di10}


(valore decima le di 11)
(valorB decima le di 12)

D (valore decimal e-- di 13)

E (valore decima le di 14)


F (valore decima le di 16)
.Figura.E. I.

Le cifre dei sistemi numeric.i binario, ottale, decimal e ed esadecim ale.

Attri_b~o

Binario

,,

Cifr~ pi
-

bassa
,.

Cifra pili alta


-

Figura E.2

Decima le

Quattr o

Due

un,o

.2.

I valori posizian ali nel sistema numeric:to binario .

Nel caso dei n11m~rt boari pi lunshl~ Je posizion i successive a sinistra corr:isponde-:rebbero a quella degli o.tto (2 alla te-raa potenza) , a que-lla dei sditi (2 :alla quarta), a quella
dei trntadite (2 alla quinta), a qull~ dei sessantquattro (2_alla sesta); ~ cosl via.

Nel numero ott-ale 425;1si dic che il 5 si trova n.eila.pos.kione degli U:no, due in quella.
degli otto e il 4 -in quella dei sssa1itaquattro. Notate che ognilna di queste posizioni -e ~-1 na
potenza d'ella base (8), ,e che qu~~te p:t~nze partono da O e aumenta no di l man mano che
c;:i. si sposta. a sin i.stra all~interno del

n1'1

mero (F igi:a E.5).

I valori posizionali nel sistema numeri co ottale

Esadedmale

Cifra decimale

Nome della posi2io:ne


Valore po~izion-ale

Sess antaq.u att ro Otto

Uno

64

8 1

g0

10

16

B
0

Base
- - -

Ottale

Raffronto tra i sistemi numer.ici binario, ottale, deciimale ed esadecim ale.

Valp.re p9siz1iqnale es_presso


come pot~nia d:Ua hMe (8)
Figura.E.S

1valori posizionali nel si'stema numeric o ottal!e .

5.50

Nel caso dei numeri ottali piu lnn,ghi, le posizioni suctes~ive a sinistra corris,ponderbbero a quella. di cinq1.teentodo.dici (8 alla terza potenza), a quella clei qitattro.milanova:11tasei
(.8 alla quarta) . a q ue1l~ dei trntaduemilsetteCr1ritosesJantotto' (8 alla q L1irtta)) e cos via.

Nel ti.amer ~sadcimale 3PA, si l'ice che 1~ A si trov~ nell~ posiziorze degli un_o la P
in quella dei sedici e il 3 in quella d~i due.centocinqitantasei. Notate che .ogni.ina di queste
posizoni una pOte:nza .della base (16) e che: queste potenze partono la 0 ed aumntano
di 1 man mano he ci si spost4 ~ sinistra all~intemo del .numero (Figura E.6)'.
1

I valori posizionali nel sistema numerico esadecimale

Cifra decimale
N qme della posizi9ne
Valore posiziinale
Valore posizion.ile espr~S:so

b~

ottale-

10

11

100

101

110

111

Uno

2:5 6

16

1000

10

1001

11

10
11
12

1010

12

.A

1' 011~

13

1100

14

13

1101

15

14
1'5

1110

16

1111

17

16

1010QJ'0

20

1.0

con basi pi aire rispetto a quello binario


:I

Il sistma numerico ottale e quello esadecimale h.anno una relaz.ion.e patticlarn1ente


impanante con quello binaro: le basi deg'i ottali e degli esadecimali (rispettivam~nr.e 8
16)_sono potenz cli quella del ~lste~ np mtci6 binario (base 2). .Per esempio, prnde~e in
cqnsiderazione i] s,egi.1ente num~ro bin~ario a 12. cifre con. i suoi eqivaleJ1ti 9tt~e ed
esad.ecimale~ e ~rea-re di detctrminare il modo in cui questa relazione facilita t>abbreviaz.ione de.i .numeri bin:ar.i in ottali o esadecimali (la risposta si .trova dopo i nu.meti).

Numero binario

Equivalente ot:rale

Equivalente esadet:imale

100011010001

4321'

eo:1

Per vedere in ch m..d un nr1mero bm:ario possa ~Ssere fa91.mente convertito in un


ottale sar s_uffciente suddividere le 12 cifre d~l numero_ bina.Fio in grupp_i di tre- 'bit
consecuci-vi, .srivendG poi que.~ci gruppi al po$tO delle corrispondenti cifre del nu.rneto
ot:tale,. cos~

.
.. 1nar1a

S;e dic.i

zion dll _rappre$entaz;ini l?ina.tle pi lunghe. La F'igUFa E.7 evid~nzia Che i n11me_ri
binari lUQghi poss_ono sser~ ~~,pressi in modo p_i co.ncis;o all, ipteyno dei .sistemi n um~_cic.i

esadecimale

d~imale

Duece~tocinquantasei

I.valori posizionali nel sistema numerico, esadecimale.

010
2

Rapp.r esenrazione

6
7

l!abbreviazione de.i numeri binari in ottali


ed esadec'i mali

011

Rappresentazione

n principale impieg~ dei numeri ottali ed esadecimali in ambir informatico. l'abbrevia-

100

Rappresentazione

Nel taso d-ei numeri es.adecimali pi lungpi, le posizioni .st1ccessive a sinistra orrispo11drebbero a .q uella dei qudmomiianovantasei (16 alla terza potenza), a qulla d~j
S~sant11:cirtquemilacinqie(!centotrenta.s.f:-i (16 alla quarr~) - e cos via.

E..2

N.u mero

cqme potenza della Qase (16,)


Figu~a E.6

SISTENU NUMERlCI

001
1

Figura E. 7
'

Gli equivalenti decimali, binari, ottali ed esadecimali.

Lo stesso tipp di relazine si potr osservare nella conversio11e dei numeri d.a binari a
esadecimali. In partico1are, p_qt~te prpvare a. suddividere le 12 cift:e del nJtmero binario in

grQ.ppi di quattr_o bit c;en,secucivj, scriven.do f>bi qu,esti . grup.pi .al posto delle trri&p,o~denti
cifre del numero esadeimale,. cos:
1000 1101 0001
B
D
1

N.gtate che la cifra esadecimale scritta sotto ogni gruppo d quttr _bit cOIT:J$p.onde
precisamente all'equivalente e~.a,decirfrrue di qtiei ni.nnero oinario di 4 cifr~, come .m,ostr.at,O
n~lk Figura E. 7.

E.3

La con versione dej n umeri ottali


ed esadecimali in binar1i.

Nella sezione precedente ;Vete

vi$~9 om~

si;a pssib..ile c_onvertire i nun1eri blnari nei loro


~qu.iv~nci Qttal ed esadecimali~ attraverso la creuioi;ie li gruppi di cifre binarie e la loro
sucessiVR scrittura nei va:leri ottali o esadecimali equivalenii. Quest process.o potr e.Ssere utilizzato ancJ1e in sttnso inver:s.o, al fine di produrre l1eq_uvlente binario di un dato
numero mttale o esadecimale.

Il numero a:ttale (j53,. per esempio, sar c<1nvercitQ in blo..a;ri0 s~mp.licem~nte scrivendo il 6 nel $no csqaivalnte binario di tre ci&e 11:0.t il 5 nel suo equivale11te binario ll ~il
3 nel suo equiv?lente binario O11 otrenendo os1 il numero binari cli nove cifre 1101O1O11.
1

N:otate ch la cifra ottale scritta .sotto ogni gruppo di tre bit corrispond pr.e6isatnerite
all'equivalente .ottale di quel numer binari9 di 3 ci&e, come inostratq nll. FJguraE.7.

552

APPENDlCEE

Il numero esacJ_e.imale FAD.5 , invece, sar cnvettito in b.inario .sempliceniente: serivendo la F .pd $1J6 equval~pte binario di 4 cifre l 1l l, la A net suo equivalente binario
1010, la D nel sq equivalente bn~io 1_10.1 e il 5 nel suo ~quival?O-te binario 0101
ottenendo c.os l numero 11111010110.1 0101, forrnLit0 da i _6 cifre.

La conversione dia b.i nario,

.4
E_

ottale o esadecimale in decimale


Dato che siam"o rutti normalmep.te _abituati ~ ut_ilizzare i .QUmeci decimali,. sp~s~9 pi
comodo convertire tln numero binario, ottale o esadecimale in dec,imale, a! fine di capi1~e
meglip il c'valore'~ reale del nun1er9 in questi.On.e . l diagrammi della sezione E.1 es.primono
i valori pos,izionali in notazione decimale; per convertire 1,lD n.u mero in decimale sar
necessario m.oltiplicare l'equivalente decimale di ogni cifra per il suo val'ore posizionale e
somm,are questi prodotti. Il Illlmero bin~rio 110101, per -Sem~p_i,a) sar convertirq nel
decimale 53nel modo mostrato dalla_Figura E.S .

Convertire un n1:JJ11er o binario i.n decimale


Valori p oszi c).nali;
Valori simblo:
Prod0tti!

Somma:

Figura

E~S

16

32
1

0
0*8=0
1*16;::16
1*32=32
- 32 + 16 + 0 + 4 + 0 + 1
1

1*4=4
53

0*2=0

1
1*1;...1

Convertire un numero binario in decimale..

C9n ,qI!~Sta tes~(! tep.ca, pr convertire !~ottale 7614 nel d~cimale 3980 sar necessa:rio utilizzare i valo.r:i posi_z4onali ottali appropriati, cme mostrato nella Figura E.9.

Convertire un numero ettale in dec:imale


1

V<Ilri po_sizionali
Valori s.imbolo:
Prodori;i:
Somma:

64
6

7*512=3584

664=:!84

1*8=8

4*1=4

51'2

3684 + 384 + 8

Convertire un numero esadecimale in decimale

Valori posizionali
Valori simbolo::

4096

256

16

Prodotti.:

A* 4096=40960

D,*256;::.:332.8

3*16=48

8*1=11

Somma:
. .
.

= 40960 +

''

332 8

La conversione da de cimale a bin ari o,


1

ottale o esadecimale
Le conversio:n.i viste ne-11 sezioni prece.d ebti seguono J.e convenzioJi della notazione posizionale e le stesso varr anche per la "cortversione da decimale a binario ottale b esadeimale~

S.upporrendo di voler cbf!:Vertire il vaLore de;im_ale 57 in binario s~ p..~essa1;io _partir~


., da:ll_a ~critrora di valo~ posjzion.ali delle coJonne da destra a sinistra, fino a che n~n. sar stata.
na c:;olonna il ui v~o-re posizionale .sia maggiore del num,ero decimale; questa
.ra,.~iunta u_
colonna not1 sar necessaria ,e quindi dovr es.sere ig.norra. In conformit a quanto appena
affe:rmato ecco cos-a biso.gner scrivere:
Valori p.osizionali:

64

32

16

.2

{gnorando Ia colonna con il valore pofuional 64 si otterr:


Valori pgsizinali:

32

16

A questo puntQ, .sar nec~sario operare.sulle c_o lon n'e da sinistra-verso destr-a. Dividendo
57 per 32l si otterr un risultato di 1 con un resto dl 25., quindi sar: nec::ssatio scriver,e l n.clla
coloJllla del 3-2. Div.iclendo 25 per 16~ si otrert un risultato di l con ti.n resto di 9 e bisogner
quindi scrivere 1 nella colonna del 16. Dividend ~ per 8 s otterr un risultto di 1 con n
re_sto di l., Le due c9lonn srrcc@~iVe pr.od11rranno ognuna quoziep.ti uguali a ze.ro qando i
l9ro valori posizionali sa.r:;innQ divisi per 1-, quindi sar~ necessariQ scrivere .Onellecsolonne del
4 e del 2;. Per fin.ire, 1 .diviso 1fa.ca1 e quin.di sar~ necessario scrivere 1 nella colonna dell'uno.
CEc(:) .il risulta.110 che sl otter:r~;

Valori posizioi1ali:
Valori simbolo,.

32

16

eJ:1nfndiil -vclqre

decimai~

- f

4
0

2
0

1
1.

57 equiva!ente al valore binario 111001.

Per c0nvertire il valo.r~ deirnale 1.0 3' in ottale,. b]sq:gner per prim.a cosa se.rivere i
=valori p:os.izjonali cleJle colonn.e fino a che non sar stata rag_giu.n:ra una colo-nna il cui valore
posizionale sia maggiore del numero decimale; <il!festa colonna n.on .sar necessaria "e q.uindi sar ignorata. In conformit quanto appena afferm:ato eccb cosa bisogne):~ $C.~!vre:
Valori posizionali:

512.

V~ori pqsizio11ali~

Per 6n ire, per convertire il valore es,ade.i.rnalc;-AD3B nel decim,ale 44347 sar ne,ce~
sario utiliiZar,e i valori posizionali esadecimali a_Epropri.aci, come mof)ttato neJLa Eigura E. l O.

E.5

64

lgrio,rand.o la coloon.a con il valo.Fe posizionale .5u s otterr.:

= 3980

convertire un numeroottale in dec,imal.e.

Figura E.9

_I SISTE1vIT.NUMRICl

+ 48 + 11' - 44347

Figwa E. I O Convertire un n.umero esade.c,imale in decirn(l!e.

64

A questo punto, sar n:ecessario operare sulle_colon.ne da sinistra verso d,estta. Dividendo I 03 per 64) si otterr un risultato di 1 ton un resto di 35> e quindi sa t neessario
.s crivere 1 nella colonna d.el 64. Dividendo 39 pe;r 8 si otterra un risultato di 4 coti. un r~t
di 7 e bsogneri quindl :;crivere 4- nella tolonn;i ql,ott:(>. Dividendo 7 per 1- si otterr un
risultato di 7 cqn un re~~o di O e qui.odi bisogner scriv~re 7 nella oloruia dell)uno. Eeco il

riultato che si otterr:


ali
.
.
8
1
\Zaloci p0$1Z10ll _, 64
Valori simbolo:

e qqindi il -valore decimale 103 e equivalenre :al valore ottale 147 .

554

PDENDICEE

l SISTEMI .NUMERfC[

555
j

Per convertire il v~qre d_


!m1ale ~75 in e~adecimale bisogner pet prima osa scrivere i valori posiz;iooa.li delle col:o nne fmo a che non sar stata. raggiunt~ una c0lonn a il .tui
valo:re posizionale sia maggie.re d.eln111n .ero decimale; qL1esta o.lonna non.sar nece~s~a ~
quind i sar ignorata.. In co:n.forrrtit a quanr;o appena:afferma:to, ecc cosa b1s~ogne.ril ~cr1vere:

Valori pszionali:

4096 256

1,6

256

16

~0000000

00000 000 00000 000 00000 000 0~000000

risultato che si o.tt~rr::


16
7

Ora, se que.sto fosse effetti vamen te equivalente a -13, dovremmo :essere ln gra.d o di aggiungerlo al binario 13 ottene ndo un ri~ult:ato pari a O:
00000 000 00001 101
+ 1111 1111 111 1 1 1 11 1 1 11 111 , 1111' 0 01 1
-- - - ------ - -- ----- - - ---.-- ---___,,. ,., ,.__ -- - -

.A questo punto , sar ne.cessaro op~rare sulle colonne' da &in}$tra ve~so cl.estra. Djvidendo 375 pe:r 256, s.i otterr un risultato di 1 ron un resto di 119 e qtJ.indi sar necessario
sc:rivere 1 nella colonna d~l 256. Divid endo 119 per 16, si otre.rra un risultato di 7 con lJ.Il
restq di 7 ~ bisagna quin.di sctivere 7 nella colonna del 16. Dividendo 7 per 1, si ouerr; ~
risultato di 7 con un resto dj Q quind i blsbgner scrver 7 nella colonna dell'un o. Ecco 11

Valo,ri posiziona.li: 2:56


Valori simbolo:
1

a due d value :

11111 111 11111 111 i 11 11111 11110 011

00000 000

gnp,rao.d<) la .ol{>ooa con il valore posiziionale 4096 si ottrr:


Valori posizionali:

c.omplem~nto

1,
7

Il riprto ristd.tant~ dalla coJono~ all,'estiema sinistr~ s~r ign0rato e quind i si otterr ffettivamente z~ro come ri.sultatq. Aggiungendo il eomplemento a uno di un numero a quello
stesso n1~1Tie_rQ. il .cisulc~.to sarebbe co.rnposto intera mente d.a ranti 1. Il morivo per c;ui $1
ot:rerr un risultato compo sto sola mente da zeri invce che il ,complem_e.qt_Q a due , 1 in
p.i.del compl eme:n to a uno; 1 a.ddizione di que.stl 1 fu:m modo che ogni cu.loana somm i
lo O ton un riport di 1, e questo .ripong c9ntinut" a ess~re ttaspo rtato -a. sinisttc .fino a
quaf!dO non sara ignot~tO nell'ul timo bit, pr'Oducendo CC:JSl un risultato di .soli zeri.
1

I ,comp uier ese'.g11ono in realta unq. soruazione. di questo

tipo:

e quindi il valore decimale 3,75, equiva lente al valore-esadeciro-ale 177.

.x = a - valu.e;

E.6

aggillflgendo ad a il f,:omplemento a due di va1ue nel segu.ente modo .:


x =a+ (-valu e t 1);

I nu,meri bi.nari 1negativi: la notazione


con complemento a due

Finora questa appe-rtdice ha preso in esame_soltanto i numer i _po~itivi; i computer., per,


sono in grad di rapp tesenr -are anche i nurne .ri r1egarivi1 acaav e-rso la
notazio1rzf} .con c()mpl~rnen'to. a due. Per prima os:- spie:gheremo come si ftlrrna il complemento a dl,le di un n11m~ro binari9J dopdich ff~$eremo ad illustrare in che modo esso
rapp-resenti il v_alo.re 1,J.egativo di un n111ne.ro bi11ar_io.

Supponete ora che a sia 27 e che va lue sia 13;, .se il compl ement o a due di value fosse
re.a lment e il negativo di val u e ~ agg~urigendo ad. a il C<)mplernento a due di va:l u1e si
dovrebbe ottene re 14:

a (ovve rosia 27)


+ (-val ue + 1)

i 3;

00000 000 00000 000 00000 000 00001., 10

J,'

La rappre sentaz ion a 32 bit di val.ue sar

+1111 1111 11111 11 1 11111 111 1 11100 11

----=----- __.,__ --- -- ---- ---- - - --- ----- _,__

Pensate a una .macchina con n11.meri in.reti a 32 'bit, ,sup1~-onendQ he:

int valu,e

00000 000 00000 000 00000 000 00011011

che eq Qiv~e e,f{ttivaroen.te a 14.

00 0000.0 0 00000 000 00000 000 00001 101

Esercizi di auto valu tazio ne

Per trrila re il ~g~tivo di va 1 u e sara .ne cessa.r io p'r pr.i ma CQS.a forma re il suo
complemento q; tino, applicando l''qperatore di omplementa' bitwise (.;.. ):

E.1

ones_complement_of_va,J.ue """ -vlu e ;.

E~.2

Jntern~men~e, -valu e co:o:isponde oi:a a value con tutti i suoi bit invert iti (gli uno
saran.no divent.ati zeri e gli z'.IJri sarQ.nno diventa.ci uno):
value :
00000000 00000000 000~0000 00001 101

'Le ba&i

dei sistemi numr iti decimale, binario. ottale ed

esad~cj..rnale so110 risp~rtlv.amente

- - - - - - - - - " - - - - - - ~----~~ e ---~--

Tu generale le rappresentazioni

d~cimali,

ottali ed esadecimali di un dato


coniengo110 {pi/m eno) cifre ris}2tt a quelle contenute nel nnfnro ~inario?

(Ver_o/Falso) Uno dei motivi pe t tui utilizzato il sistema numerico d'cimale che pe.i;m~tre di
;;i:bbreviate i n.umeri bina.ri semplicemente soscituendo una cifra decimale per gn ,.gruppo li quattro

E.3

bit b.inari.
La rappresentazione (ottale l esdeGimale I decimalt) di u'ri grande valre- binario ' la pi
co..1~cisa (tr.a le alterna.civ~ p.toposte).

E.4

-valu e (ovvero i l compl:emento a uno di. v.alue~ ):


11111 111 11111 1 11 11111 111 1 11100 10

J?et fbrm:are i,l complemento a due di value , ba,st:r~ sempli ,e.m rate aggiLI:ngere 1).no ~
tmple metrc: o uno di va 1ue:

n11m~rQ binario

~E, 5

{Vero I Fals) La cfra.p alta in qu.alsiasi ba.Se una in pi a.ella base.


(Vero I Falso) La ~ifra pi. bas.sa in qualsiasi base una in mn() cl.ella.base.

556

APP END ICE"E

E. 7
Il valre posizionale"della cifra all,esu::ma. desna di qualsiasi 11umero binario, ottale, decim.ale o
esadecimale e sempr.e
.

E.

E.9

Completate questa tabella co.n i valori posizionali relativi alle quat tro pq~iziqn.! (ili e.tterna
destra di ognu no dei sisuemi. numerici indicati:
1000

100

10

. ' .

55.7

E.l,O Otta le65 30; Esad ecimaleD58.

E. 8
Il valore posizionale della: ifra che si trova alla ~inisua della cif~a all,~strema di;stra di un
qua:lsia.si n11mero binario ottale decimale o esadecimale semprf'.l pari a
.

decimale

S1ITEMI NUMERICI

Binario 1111

1010 11 00 1110 .

E.12

Binario 111 011 001 110.

E.13

Binario 0 100 111 111 101 100 Otta le 4775 4.

E.14 Decimale 2+4+8+32+64=110.


E.15

Deci
. male 7+1 *8+3 *64= 7+8+ 1
. -92=207.

E.16

Decin1.ale 4+1 3"''16 +15*-256+ 14*4 096 6139.6 .

E.17

E.1 o conv ertit e il valore b.inario .1101 0101 1000 in ottal e e in. ~sadecimale.

DecimaJe 17 .7
in bu1aci9:

E.11

C',onvenire i'l vcJ,ore esad.eci'male FACE in binario.

256

E.12

Conv
ertir
-- e il valo
- re ottale 7316 in bina no.
-

esadecimale
.b'n1arr.a

0ttal e

.256

.... .

512

li

.a

E.15

Convru:tit
- e il valo re ot'.tale- 317 ffi .d.ei.male.

E.16
E.17

, o+

,...

.-

..

261

in .esadecimale:

25'6
1
16
1
(11*"16) + (1*1 )
.(B*16) "'" (1*1 )
81

.E.18 Mc>stfate la rappr.e$e,Iitazione binaria del decim~e 41 7, quin di t:l;'lstrate il o;mplernento a uno
di 417 e il comple.ment0 a due di 417.
1

E.19 Quale risnltato si otterr ~g)1rnge.ndo

+ (1'*1 )

C.o.vertite
il valo-re- decimale 177 in binar
.
- iQ, ottal.e ed e,sadecirn(lle.
~.

B
4
2
1
1'6
4
2
1
+ (1*;32-) +- (1'*16) + (0*8 ) + (.0*4} + (0*2 )

512
64
8
648
(2*6 4). + (6*8 ) + .(1*~)

il valore esalecimale EFD4 in decimale.


-

16
a

in ottal::

Cgnv~rtite

32

1011 000 1

E.13 Cqnv.e.;rtite il valor~ esadecimale 4f.C in ottale. (Suggerimento: convertite prim a 4FEC
in
binario e lJoi convertite q~es~ro valore binario in ottale).

Convertite il valore binario 11 10 1110 in d.ecimale.

128
64
12.8
64
32
{1*1 28) + (0*64}

E.14

il c:ompleqi.epxo a uno cl.i un_nl.JIDero a quel numero?

Risposte agli e.sercizi di au tov alu taz ion e

E.1"8. Binarle:
128
64
32
16
s
4
2
1
256
128
64
32
16
8
2
4
1
( 1 *.2 56) ,l, (1*"126) + (0 * 64) + (1~~2) + (0*1 S} + (0'* 8) + (0,.,,4) + (0*2 ) +.
512

256

E .. 1

10 2 8; 16.

E.2

Men ..

E.3

Floo.

E.4

Esadeiinale.

E.5

Falso. La cifra pi alra in qualunque base tmQ men.9 CW:la b-ase.

Complem.et:rt a uno~ 00 101 111 0


Complem.ento a due: 0010 1111 1
Controllo: il nu.mro binario originale +.il suo c;o1n.plemer1~0 a d..u;e

E.6

Falso. La cifra .Pi b-assa di qualunque bas: zr.

1101 0000 1

E.7

1 (la 'base elevata alla p,otenza zero).

001011111
.... - ___ __,,.

E.s

La base del sistema numeritQ.

0000 0000 0

(1.*1 )
110. ~ 00001

__:

~-9

Ce:tnpletate qL1esta tabella con i valer-i pos.iionali relativi alle quattro po$izini all'esrrema
destrad1 ognuno dei sistmi num erici indicati;

decimale

1000

esadei r:nale
binacio
ottale

4.096

a.
5,12

100
2-56

10

,4

2
8

E4

16

1
1
1

E. 19

_ __

Zero.

'Esercizi
Alcune persohe soscengno the malti dei nost ri calcoli sarebb~ro pi semplici con_ il sistem
n11merlco in base 121 poich il 12 divlsibile per molci pi numeri ri~po al 10 (delsistcma in bas 1.0) .
Qual la cifr~ .pi bassa della base 12? Quale po. rrebb~ ecSser il simbol9 peJ la cifra pi ~ta in ba-s:e 12?'

.E.20

55$

AP PE ND IEE E

Qu_ali sno i valp1-J posiz.ion:ali delle qua ttro posizioni alf esEie.ma d~stra d.
i qualsiasi nurQ:eto del sistenla
ri11mec
- ic:o in- bas e 12?

E.21 Nei sist~tni num eric i presi in ~:e in questo capitoloi qual
il rapporto tra il valoxe ciel
siaib-olo pi alto e quell9 posizionale della printa c;;;fra che si trova alla sin
istra di quella all1 estr~3: de:str:a
di ogi n merc;>?

.
1

..
I nd-ice a n a 11t1co

E.2 2

Co mp leta re questa rabella eon i valori po-siziortali relativi .:alle qua


ro posizioni -alli ~sn;en1a
ds tra di gnun() dej $.istemi. l,'.lUfQ~J:ki iodiqi_t:

decimale
oase 6
bas e 13
base 3

-e

100 0
Il

if1

27

100

10

169

l= 0pe rato re
-# 0p~rai;ore

. ...

.,

14i

o.p:eracore 7'l

di disL~guagliailli 33
del pr~r.ro_E,~s9re 23, 468

E.2 3

C.o nv rtit e iJ val re binario 100101.111 01 r() in <'1'ttale e in esadecima


le.

E.2 4

'Convertite il valore esadecmale 3A7D in bLnanio.

.E. 25

C_nirer-t ite il valo.te esa:decimale .76 5F in_ ottal~. {St_tggerimento:


con vr tit prima 765 F in
binario e poi ton vet tite il valore binario in otral~).

E.2 6

Convertite il v-alore bin ario 101 111 0 in dec-.imale.

E.27

Convertite il valore ottal~ 426 in dtimale.

E.2 8
E.2 9

E .32

#0ndf ciireuiva .dl prep.rocizssore 466

<>la QP~rarotl'.! 1119du)0 3(


o/o:o/o 329. 530, 3.o~

O/o.C.

C.qnvertite il valore e~radecimale F'FFF in decimal~.

Co:nve:.rcite il valore dec-imale 299 in binario,- otta


- le ed esadecima
. le.
E.30 1vfosttate la rappresentazione binaria del decimale n 9.t quinP.i .m_o$trate
il complem.ento a uno
di 779 e il complemento a due-di 779 .
E.3 1

#ihelucle direttiv.a del p reprocessore 18'0 463


.#fine di-rerri-v ~ de'.l pr~p.roc~ssor~ 46V
#pi;~ diret~iva del prepr c!!Ss'.Oi:e 468

Cosa si ott err agg iun gen do a un numero il suo cm ple me n: 0 a due?
M. .scra~e il co-rnpl~meut a due del v.alore interio ....;} su up.a ma cch
ina c0n interi a 32 bit.

o;ad
o/.ilE
'%e
'/of
0/oG

13'5 188, ,:;>2:8! 337

03'9

25,. 2/, 13:?, 32-s, 3'.37

:o/og

326 , 3.27, -337, 338


326,, :J27 337 , 3~:8
64,, 135, -326, 337 , 338
326, 32,7, 337, 1338
-326, '327, 331 ?38

JJ/o_hd

1~5

%j

o/old
o/oLf

1~5, 154

328 ~ 3:37 3-3,9

%u

135, 324, 3.25, 337


%X -325, 3, l
o/~ 3.2-5) 337
& AND hirwise 360 361, 362, 364
& pe raia !e di 'o diri zz_o 26
{!:.=" pe nito re di as$gllatnen to bi.mr:ise. :A ND 367
(float) 6:2
\sequeJ129. dl ,e.~ape del . ue;;vlin) 2l

dd1'assegn
ament0 342
..

* operarar:e di m.oltiplicazion:e 29
'fa:rgv

<floa(,b.>

136- 540
<limits,h>
136, 539.
<la.le.h> 136, 505
136, su
<~~1jm,p .h:>
<signa.L:h>
136; 4.84 . 4.85 , 512.
<srd~rg.h>
136, 474 , ,)1:3

<s~dtkE'h>

,)

):os

<ti:qi:e.h:>

137 ; 53-6.
= op{lrator:e di assegrran1enro 109.
""'== opt;fat9re a:guaJe a 3.3 I 09
> simbolo .ru r:direziotiame.nto dell'utpur 474
>=maggiore o uguale a 33
>> sco rrim entq .a- de.sua 360, 36 1, 365, 366
>> ,s;i:rnbolo di accodamnc d.ell''ourpur 474
>-:> : operat0re di as~~guamenta .se9trimento
a <;le~rra

JQ'7
? 15.7, 158
"\O' 186
~n.'

2.8'4

\r' Z:ff4
'\e 2a4
1
.\~l 284

1~,5

* cu'.ci.trre di sopp
. n:.ss:ione

minor.e ~~al.e a 33

l361 504
~rn-l> 484 ~ 48$
erm o.h>_ 136 503

32'5, 337.. 33s :

OAJJf 135

o/os

<=

'\f' 284

%lu 1~5
/on 329, 33.0 ~.3.:8
o/o_lJ 3.25, 337 , 367
o/op
229, 32'9. ?-PO 338

!/

mi not e o \!l.guale a ~3

<assen;.h>

._## opera,rbre dd pr~pro esso.re 468

#d~fine diretti:va del preproc~ssar 180 464


#c:ie
- ..ne
- NDEBVG 504
.
#.rr:r dire.t tiva del preprciessore 468-#ifdef dlietci~a del p1'~pI9~ss9re 467
4iti.fudeF-di.rettiva cl,el prej::iro~~.re 467

,;:;:=

o 477

*fgers 520

" per,uqEe bitwise QR eslu:si~9 360. 361, 365


A-. operatb:.(::. di :fSsgn.afuen.ro birwise .OR ,sclu.siv0

367
_ soq1,1ernr~ d es(.1lJP d~ {!:atatte_te api:ce si.11-golo 21
~DA.TE_ costante shi:iboUca predef.ira 469

_ FIL E_ cost ante simbolica predefinim. 49


-~I!'!E- costante;: .simholiC'a fl-redefinita 469
_ STD C_ CSUl,II(~ .simbolica pred efin ita 469
_T IM E_ cost.11te simb_o:Uca p!"~deinita 49~
~ OR U;iclusivo b(twise 3601 361, 365
I pipe 474
I= Ojl>etatoi;e di assegnamento bitwise OR inl.usi.vo

'567
is7 , 15'8

11
- com plei nen to

ox.

:ox

birwise a une ~6 , 3'61, 3.(55 .

335
335

++ op rato re 70 71

+;;;;;; ~~_gntJml;.ntQ CJ1n a,ddiz.ipne 6.9


-> p.era~ru.re puofucore a, stru ttur a 352

. operato re men1bro di strutrur~ 35_2


;:; smb-o1o dl recfirezion~me:nto dll 'inp ut -474
;;:;< scorrimenf.o a siiiiscra 360, 36 L, 365

a modo di apcr:nw: deI file 387


at merlo di aggiorna.mento del file !}86
a+ :pJ.(>do dJ eaprtw;a del file 336, 387

550

INE)lGEANALITICO

a.o.u~

10, 11

~b m9do

a_per~ di un. file binario

a:b+ morto. di perrp.('.a di urr file

4:az

~in.aria

~82

aobrev.ii:ini sim ili aU'ingle'Se 6


aborr
4~9,; 512; 5113,
- - 5:2'9
,abs ..530
acat:aStament delle s-rru:tture .di controllo 49
accesso
noF1 va:l.id
485
-. - .
. o alla mem0ria
..
a~tuniUl;atore 27l
1

.,

-..

acos

509

Ada

asccilne 537
asi.n 509
:JSsegriare un nome 86

a.sse,r t 469
a'ss.Oc;-iano da destra. a sinistra 36, 64
associaciv.it
3t , 36 ~ 72, 108, 177. 367
aste.riscb i in iziali 3.;iJ)
~Ster.se

. .,.

add 274
aggregati 34'9
~bero 227, 349
_qJ bere bin a:ri 4.l l ; 43.4
albero di ricerca binaria 4~5; 438. -439, 447 1~ 448

aJge})ra 29
algocitmo 45, 55
algoriUJ10 abci e brilla 45
alga.ciano compJero 48
all~:mie -acustico (t'iicalino): -336
allarme(0 ' ) 21
~li ineamntc:i

S24

:ili inea:riifiro a d~.s.ua 324


-<l
11 ineam
tmt@
a sinlstr.a
324

o'

alllne~e a destra .gli int~i :35'l


~

allneare a sinistra le stdn.g he in. un campo 33.4


aillnearo- a destra
3.30~
all9~a ti: !1-~ ddla memoria 137
-.-

allocazione dinamica deUa mem0ria 412, 4'85


altri argoPlt;nrl ~24, 337
ainbien[e lQ
ambiente e 1o
amper.~and (&) 26, 28
a:rralisi -dci dRci cli un ind~grn~ 200., 201
ma.lisi del testo 318

AND 3~2
AND b.itwise (&)
anno bsscile
..

360, 361, 362, 3G.4{ 377

124

ANSI_ .e 2, 8, 1,2, 206, 2B


Appndice .D 9-S

assembler 6

(*)i 2~
astraz.i0ne 12B
astt.mone dei dati- nel
a.mn 509
aran2 509

::n:exrr
48.Q,

.--

48L. 29

-ar.of

28:9, 290, 525

at:Ol

239 290, 525

e 17
-

1-6.0, 278

14Si L46

;rt0-esplieatlvo 25, 350


azione
20 21, 33, 45; 55

B
B 7

(\) 336
baGkslash (\\) 21

Beli LiboratQries 7, 13
bina io
122, 123, .284
bit 37~)
blcco 20, 54, 131
hl(i)<:o di on:q<'llk> dei llle (PCB). ~82, 383
blQCc di dci 308
blocco pi .esterno 149
blocc_o pi interno 149
Bohm, C. 47
b0mbing 60
11. 194 23$

Appen.d~oe Ej I sisreni nn.mer1is1 2~4,. 292.

branch 453
branch negative 454

.A:ppJe Comp11;ter .S

bli.nch

Appie Macinrosh 11

bre:ak
991 100; l 03, 104. 105., 124
bsearch ??O

;!ppfu:azign ~_mm~riali 9
appli~:zloni d.isu-il;iuit:( i:p. ambi~11te cllht/s_~i:r S

apf:'lrocci bi:utali per il ,giro del cavall8 223


app.r_qcreio di G~cruzion a blchi &
ap,rlre: un file 3S 1
area B3

477

argc

7
C++

246, 247 1 248

arrotondam,e.nto ~24

atrotondate., 64
ASCII (Co-dice. Stanclacd AmeriGano per 10 ~~ambio
delle l:t#0rQ.1azioni) 237, ~fOl
.,_

."

;-

$Qtt

by.te 33 0

argpm~to

arianaica. cl.ci puntaroci

457

bucket sert 11S


Byrof)-, lpr<;i 9

464

455~,

454-,

:(o.rdi;amen.rq a bPlte)
195, 196; 197, 216, 261

buh_bli;

argom<:;ri'.ti deQa. ga di comando 477


atgomenfi .variabilt _?13
20~ 12~,

i.~ro

2, _5 9, 11, 13, _17, l~?


4,. 26, 3.7

485.

~:f;

486~

528'

dechnali 37-9

cJranferenza 83
c~se di memoria i 4-

i::laterr 52 4
dock 53,6
CO.B OL .(COmi:tton Busiries;'I Oriented -t~guagi!)
c;ada
227, 349, 411, 42&, 429
Codee Ameriq~no St~nclard per lo Scambio de.li~
lnf0r n1azioni 97

186, 28.2
earattere ,punto lrrcerrogafivo (?) 336
qrane:re virgole_t.re O 21
Caiattfil".i di <Zontr.ollo 284

c9di ogg~tt9 lQ, 11

Garatt~ri

o.di-e ottim i;z.7..atO 4.60.


codice portabile s:

di deHmirazicme 306

camtteri
d.i scansiflne
338=
car~ri di spaio bianco" 49
~

coei:ci.zi.o~ d_~gli arg9m~nti

ca.i:atted leneral -324

ollegamento 145

cara:a:eri sp:eeiali 2~2


arati:~ti suunpabili 284

coHegamfill ro estern 479

comaado
- ec 1 l, -464
aombiLJ.azi~ne di tasti pT l 'end;..Qf-fil~ 47~
'

d gio.co 138
ql.Se sensicive 24. 55

comitato dell'ANSI C 133'


Cgmb:a:~o N'az.Iorue Ameri('.1!Jl9 pe_r gli Sta11dard dei
Compu_cer e l'Elaborazi~ne della Inforrnazron~ 7
c;:omment:o 19
compilare 11

asi di ba!;ie 152


Gasln -138, 142
caso di default 95, 99 lUO
Cla:S [. 4()7
e.lsius 346
cb.ar 35, 282
har . 32$

:a; l O. l3., 19; 21, 2-4, 478

c.mp1Iator.e
09mpilato.re

19

complktoci o.ttittu:zzanui 147

e:am-pllaziane

lJ
mpilazi0ne condi~nale
c~mp l em:ent,o 364. 3.65

e:h.iamanre 126
ehia~a. di .fllm.one _ 12G~ 132, 13-3
<i:hiarnata
136
. . .
.. - e- .Iitorn0- d~ _ funziCuie
.

c.rtiplmerita a uno 554

ehiam.ata per rJferjtiJ.enEo 1371 190, 19 l , 19'2; 23 l ,

compone:n ti l ~

232,. 234i 236! 354


c-hiamata pet riferimento simulq_-ra
13 7 l 9ID , 191, 213 i
l~iatnata fJ'e't valore
~?7 2.?l , 2~2 ~ 253 354122-. 153

chiarezza I 2
chiareZZ'f.1, dcl ptogr.ilQ11na . 1, 12
Ghiav,e del retord 38Q
chiave di ricerca 201
chiu~r?t an.rm:ale del prqgramm-.~ 4:85
cicalin.o 21
c;;iclo
~ontrqll~ro.
.
., - . da un ronrarore 6q
ti~lo di .esecuzion.e delfstm.z.idh 274
.

cdclo. infiniti)
cifra 43
~cifre 547
'":'""

'";.

_:.e__

~~

1,11nar1.e

55, 63,
-

379

134

colJeg-arne-nto int~r}O 47,9


colon_ci.a 2.06
oom.aru:lo 449

.tasa

hi:arrj_~_ta cica.r~iv:a

9d:ice dell'op~raZi.one 271, 453


codie d i cnatete 301

Codice di Sc;ambio (EBGDIC) 301


c::odce u1 linguaggio macchina 1 t
c0_diee: Mots~ 320. 321
codite Mors~ internazi.onale 32.l

c::ielo
'5l~. 8$--

ealoli
calcoli finanziari
calendare 124

cilloc

oarattere a,piGe- singolo C) 329'


qitattere di e-Sape 21,, 2~:, ~36
caianere di sa!ro pagioa .() 284
ar<;l~ere di soppt~ssione ddl assegnamento (*) 342.
caratrere di s;q~olia_eattll'.i (j 24
.carattere NULL di termina:llone 186, 187, 2.&3 .. 284,
297, 29a~ 32s, 329

carica.re un programma i.n mem.ci 271


cacica.1:or l O, l 'L

'BCPL 7

c:lli-~

}oc'k_c 536

379

-~.

base 291

~odan~d Ct-+

ca:ra.tte_r~

ca:ret (" 34Cl


cari.c- a.meQ-tO 1-1.
aricare l 1\ 45.9

ba~laSh

371

car_an;tre- nullo

atol
289. 29.0., 29 1. 525
tlicta.versronenro dJ un libirinta
~Qr()

campo' 3.80.
earopo .d i bit -3~8, ~70
G!mpo dJ bit noft den:eminac-p 370
c::runpo di bjc non denomiraa:to con dimensione iero

~JO

102

oompl:~~it~ ~sponenziale

463,. 466
158

compromesso rempo1.spazco 239


co_mpllrer. 3
C-0municazi0-n dell'ACM 47
concarenazione di sr1:i n,glie 318
ConcurreD~[
1,3, 16
condividere le irrfotmciooj 5
oondzione 33 102
co~dit.lc;>ne di concin.11arzi0ne dl ciclo

. s5) s6. s7 sa.., .9o) 1o1

c:ondizione sernplicr 105


co-ncilzioni di enore j 36
-tottfitie .dellt u.nit (ij rilmori\ 371
.confrontare: le st[unure 351
confrontare
le unioni
3
.
.5 8
consc
1 ~4, 195~ 23; 236, 240.
conw~ le lette.re: iii.e-i voti 97
contatote 56, 57
e1dntat:ote a d iclQ 86

562

INolCE ANALlTI.CO

cont atore di dati 456


onrarore di iscrz.ioni 45_5
cont
i di rfl:idito. 120
- .
oont.lllue
l _0.3 , 104, 10'5, l 24
c(;lnnassem~ta 453.
en,rrpllo d~i lirn .i.ti 183
cn trllo dei Jimjtl cii u.n vettore 183
c:nrrQl_lo ~el progran1ttra 4G
Ctittollo di clpo. 134
conversi@ne da binari@ ~ decin1ale 552
conve~sfr,n1e da dt:cimale ~ bi.ncio 55..3
c;;oi:lv(J.'s.ione da decimale a .esadecffnale 55il
.conversione da deaimale a otae _55_3.
conv
.cim_ale a binario 55 l
. ersione- da esade
.
c:rrver..sjone da esadeci:mle a d.etimale 52
con-versione da noraziin e, i nfss{l[. a_ polacc.a inversa
co~"}V("rs~Q.L da ottal e ~ dec.m ;j_[e 5 52
cq.uye:rsione da ottale in binario 551
'

conveT.sio ne espl. Wta


"o _nvwion imp l j ~ta,

63
G.5

63

c_orp_e 20
corpo ddl_a fun.zion 131
corpo di un wh1le 55
~~ rpo di un-a fllilzipne 2..0
coo:~ggere 12
cosen0 128

cg:sen0 ttigp~nom.errico 1~S_

<::aso: s1-0
aosr:rnce :451, 492
costa
-- nte di carat
- .,_,terf!

iS I

:EBCOIC (Codice d.i 'Scan1bio Deciinale Codi'ficar(') in


Bjnario Esrt~o) 301
eccczien@ di .c<tl.colo mvirgola .mobile 484
e-<liLo
r to, ll, 281
--

definizione di un a ma.ero 465


de6-nizi'one ltet_;itiva 152
-defi:n.iiion~- detirsiva l ~2
d6r.izi'ont e.<irerne 501

E001ii: 50-3

effetti collaterali 1J7, 141


efficienza 8

da,b<):ra~ione batch 4

DeLt--el, H. M. 16
de-riferimento 2:27'. 231
d:escria::ore di ftle :'.;82
diag-nqsti~a.

50_4

diagnosriche
diag~amm:a

diagramma

136
di El usso 47
cli 1'usst> di uoa $ttut :tura (or 92
di fl,Ss elemnt:re 11 o, 112

diagrammca
diainerro 83
dicbla.raz. ione
24, 25. 131, 497
dichiariizo.ne di una Ltnione 358
diffe drne nro. jndd
155, 269
.. nii:o
.

-32;9
costante.- di enumerazione 371. 467
costa.c).te- di gtrjnga 282
costante
esadecini;e 49 3
,,
costa nte oci:al.e 493
"'
cestante' simbe:>lica
9~j 1'80, ~1:63 4~41 470
1

difftim:e 53.7
dimensione di camp o
95 ~ ~24~ . 3jO, 3._31, -~~3. 341
d~rien$ine dJ un campo di bit 368
Diparr.imen ro della Difesa (DO D ) :9
dip.eqdenz~1 dalla macchi1;1a 6., j7l
dire:ccive dl p-repvnessotil 1 l , 463 501
rul'irri dj accesso 28
tlisc9
;3, 4, 5, i O_, ] 1 12
dse.guarP. i diagmmm.i 120

3,. 4l 11 12

mem qilli, ~econ.dari;l

41 11

stan.d rd per Yerrcire (stderr)

costa,Ilci .si:inb.oli~he pred~fln'ite 46-9

12
di~positiv9 sraatlar-d per l'inp_u-t (s.tdin) L2
.dispositlvo standard p:er l'outpuc (~tdout:). 12
disfa nta tia due p.unti l 72

COsnuir@ nn !f.'.6-mpilatore 45 1
cosrru
44f)
- - 1-i:o
- .
csctuziene del ''ostro C:b:tttputer 2-70
CPU l'O, 11
c:raps
l~S ; 142 145? 144~ 145, 21~

.div 530
- - dividi e c;;P:nqtiis~ 125, 128
dbiina prop orzio ne 155.
rfuris
ione 4, 30..
d.ivisiofie _per ~ro 60, 4a4, 485

---.

,_.,_

GPISh.ing 60
creare frasi 316

crivell.o di Erats(ene 424

ctime
i:;urs ore

Sf~7

diV:fs ione tra inceri 30. 63


d:izionario 41 O
doument a:re I progra:rn.ti 19

doeumeirto dello standard ANSI C 7, 8 12


c;loppia ihdirezione 420
do'pp.io backsla"Sh (\\) 21

33:6

"dara 1:5'71
536.ekrabast 381

doppio ugual: 34
QQS
-47.3, 477, 478, 4B5
doub le 1351 1:54, 48'2
dun1p :z75

daii 't

dn rrq:_i del ompte_r 274

D
.:

PBM
-- S- ssi

dt<bugger
467
--
B:EC PJDJ>_:.J1 7

e,spanclere una ro_a:cte :f6"'5


esp_~ns1one di lllia__muc.rf> 46"5
~spressiane
90 1 132; 495.
espr~sion~ c!.)n i pll.ntarod 246
e.spressione .oonl.i.ziooale 52
e~ptessione di cc:n1tr-01Lo in u.n.0 switc h 98
f$pressiqnc U;ire.ra- .costa nte 101
espr~ssia:o.i dj ti-po- misto 135
etichetta J 4Hi 487
eti:c:becca dcl.la stru~iura 34:9
icich~tra di case 148
~~iChette di case 9.5, 99

Eulero 2.20
eucistic~.

ddL',aceessi:bilitc 22:2

480 1 519
-EXI l. - FAILURE

ai:t

,._

480' . . , ,9..
-

EXI'I_SUCCES:S_ 480, 5.29


excern 147 478

elJ!Y.an;ienE() di un i11t~o ~ u11a poteRza intera lG

al cubo . un_a vaciabile 232


eHm ina:re un nodo d.a. una lisra 422
elimirtaz:ion,e da llir;J;J futa '['Qil~te;nata ] 6Q
eli~inkzi6ne dei duplicati 21.7, 224, 4391 446
14imin_ffl,in e d~ gptQ 47
t!l&t i (...) in un proto ti po di Gfn7,krne 4:74
.
-

falso ~3
fare cifetimeute a. un valre h modo diretro. 227
fare riferimento a un valore in modo indixretro 227
fute: rif~rimento a llll'a. v:ari:abile in in.o de indirecrg 227
fiffii:: di chius:uta SEI; 61
fase dl compilazione 24 .
fase dl elahotazione .58, 61
fas di esecuzione 2.4, 13.5
fase di inizializzazione 58 61
faqort:. di scala 138, \ 42.
faaoriale .84, 120, 15:2
facroriale di n (n!) 15'2

.ema cs 11

- -

9B.

end-o
f~.Bl
~
.

:enuo;iermone

2831 2931 294'


371) 373.. 493

Ee:>fl" ;98 283


~Q -ct\S(x) i2s

ER.ANGE. 503

di inpu r 3
0'u.cpU-C

?2

;e.Q loS'\S\do4{2).n con.fr.o.nri

4
di
di

elemento della tas'='alir 13'8


eleJn.errto di ~u1 Vfi(t:o re 175
de:rnrnlQ z~ro 175
elenchi va;riahili di a.:rggmci:hti 474, 476
"levar~

d.isp0sitiv i
dispo_~itivt>
disp:osic.iv
dispositivo
rusp,osicivo
dispo-sitiYo

elaborazione del t-esro 281


el.a:beir~iE>nce di SEringhe l B, 186
elaboiazione distcibwt4 5
elaber,aaiione interattiva 26
d;:i.b-01.~Jone persqnalie 5

~~va1nento a pore nza

'

tnverti:re. le le:-ere min uscole in maiuscole 136


copia- 137
c:o_pia dl si;ringn~ z;3, 318
coopi~ temp oran ea

DEC POP~? 7
decini_a}e
l 22, 284, 292
decsin
3. 4, 21 .JS, 37 55
decre
menro 86
d-efi
350
. . nizio
. ne di srrurcura
.

JND 1CE. ANA IL'l'lCO

ett-n'c.'
.- . >~

"

FC:S

5- 65..

:erro_re- di imprecisione di uno 89, 177


e:rrc:1re di S~g{tientazione 28
errore di s.in~assi -25. 54; 7'2, 108., 109, 110,, l30,
1~2

582, 38:5, 385

f~of
3S~, ~'85 3.98
ferr>L 5_2:4
ffiush 517
fg~tc
38.ZJ .-4J O, 520
fgrpos )23

.errore draa nte- l.'eycuzione l[7


eaor e ftale 43~ 60i 6lJ 275
rr-0re logico, ;34 4, 57, 100 . 108, 1Q9 110 13.3,

figlio 434

J8l, 358
eB:ore-loglcb fatile 54

figlio sinistro 434

~.

428

fLgli: deruo 434

file 379., 380

54
4.Q. 133

errori

a tempo di cmpilazine 25
:errqci ~ compilazi~~ 25

3U
esad6cimale
122, 123; 284, 292~ 324, 329
.esec
uzione co.ndhlonale- delle
direttive dd
-...: -

;errotn:i;IIIl

FIFO (first-in.-,frst~ ouc}

524

FII E. 515

~r9~ ~<;>_gi~p q0n fu.mle


-eh'O,l"~ noti: f~cale

- .

fclose 517

:~'Q~-e del link~r 479

1,1,

p)pro, ee:s~Q

e 463
:<.::Secuiione sequenzia!~ 47
~eglre l O, lJ

eserrlp.iq _del Ub-r.eno di risp~rn,1 93


esercizio del P.ig Latin 3J.6
eserc
della
limei;ick- 316
-..i1.io
-

~r.cio7iio ddl'i n.dovm a il nnmi;ra

t 69

file -ad aCesso casuale 39~, 393 :3'98


tll.e aq acxeS?Q sequentiaJe 38;!
Eile aperr-0 in mo.d.u bi..oatlo 482
.file binario 482,
- 483file delle
407
. . tJi<UiS<\Zio
- ni
file dello sauiciard inpur .3.81
file del.le sranda.rd outp ut 3-8'1
6J.~ di inte~raz:ione 24, 1~6, 4'(5-4
file di inr~triione <ci:ypeJu 136, 283-, 466, 504
6.le di intese-azione <.ru.aJ:h.h~ 94, 117, 1361 509
fil~ di inti~~~zio~e- <~tdi~J..h> 24, 9$, l37, 147, 293 .
323~ 381, 39,7,, 466 514
file- cli i.nEes
t;iZ.w. ne <srcl
lib.h:>-.

11

564

INDIC E ANAUT ICO

13.7 . l.~8, 28.9, 48 ); 5.25


file di in r~taztine <stri.ng.k> 137, 2'iJ.7 ~ 532
:fil di intestazione della libreria standard 1_37. 46:3
fl 4i in_EesJazi.en:e matema:cico 127
sie di in:t~la;tQhe pt l'jnpu[/ou_tput sr-and4:rd
'(srdio.h)

inr~taz.io,nc

ill cii
'file
file
fil~

file

24

persqnaliziaco 13:7
di i:esro 482, 483
offse t .3S8
prinl_pale 407
squnziale 380, 3.89

Bm-in~fu~.':'O:ut <fIFO)

flag

58
428

flag .O (1'rQ) 333., 33~

fo.nnar() ' esponeM..i~e 324


frmarci. tabula;re 178
FORTR AN FORrnula TRANs1n:et 8

tprintf 5.18
4lt), 521

&acellip

521

:f\inz!~

lWrite

434

fr~op~u:'f

G.ehani, N.

frexp 51'0'
f-Sca.nf ?19
fseek 3.95,, 523
&p:pos s.23,
ftell 524
funz.ion~

12:8 ~

5'l l

".

~zii,m~ qefinir?-

'

&al progratni:iia~ore 126

funziprie dl Fibanaa:i 160


funione di Libreria. 8
f.i 1n:z i>.ne espo11enziale- 1i8
.funiiqn~ txit. 481
funzien e ex;p 128, 510
ll.in1-i<:>~e faQS ~ 28 511
futizion funocial l(i)O
funzione fatto11iale rie.siva 155
f..:.u nzi'"en:e
fl00.t
12'.S'> 511
.
...
funiione fmod 0U8 511
funzion:e gcd l'c>r~iv~ 17t
:

~:z.l.0n~ it~r~~iv:a

i o3

il gj.ito deJ cavallo 210


verifiGa del gi=ro c.iclict 224

iporeJiusa
isalnLun
i .alpha
iscn.ttl

ll

148. 2.41
inelusione dei file .d.1 .l:ruest,azion~ 137
iiti: tiem~otare 86
incrementare una variabjle di cont.r;ollo 86
.indicato rt dj erfd~of~file 2~3. ~S4,, 3&$
rudiearore di .EOF 98.
indica~ori d conversione .3 24
iodit::atdrj .i jj convcrsig11e per c:a.ratt:.eci e scringbe _3 ~B

i:dicatori di .ton:versione per -gU it1ceri 325,. 338

indicatori di ~0nv.ets!one p.e r i ' vfllori i.n virgola tnbil

3?7

tel.fbnici

40~

din_:tmiCl della, rue:rnncia 227

ge.sroft d-cl sgnak 513


gerc 466 ):il
gecchar
294, 29). 382. 410J 46~; 5:21

getenv. 529
293, 2f,l4',. 295, 296 521
giahi cii cart 2~8.
.
gio.o 13 8:
giaco d~f da.di 142
.gtuscl6at_Q .a d.estta 95
giusficato a sini&:rra '95
gers

: giusclfi ccione tlf!qgr:aica ~J9

gurtime )37

goto 486,

4BB

indipenente &illa. macchina 7


indipnd~e dall'hardware 7
mdtriZ>Z_b 42
indirizzo d u.n canpa , di bit 371
indlrizzo di 1111a variabile 28
i'ngegner~a dei sof~a.re 105, J 4.8,, 235
iniziallziare i 'Y'.etrrj mu.liid.imeasionali ZCl8
in:.izi.ilazaie le stI:Qrt:ll.fC ~.5_2
__
ini:Z.iali.z..zate UP vet(lre 17 8:~ 17 9
imizializzare una unic.n e 359
iJ1iv. i :;i Ji zza co.Ee
17-3' - -.input/o utput (1/0) 514
i..nsc-m.inare I.a f.1aziC!lne rand 141
in.serim~1tto d~.i ca::ratter.i. lenera!i' il4
inserime nto dl.lQ spazio 43
inseriroen.to in un albe.ro binari0 160
inserfn1 ent _ in un'a lista. con:cate nata 160
inserire ed el i m. inar~- i .no,cU in. un~ lism 41$
.

'

'

'dei car~tter.i ASCTI 545


ins'ie.nfe
di .,carattere
30 l
' . -. :
insieme di carir~. eii 379
insieme di caratte:ri ASCII 97
.insigned lo ng int 135
installa.z.i.n csenrrale di rompufer 5
in.sien1e
"

_-'

isdi.git
is~giti

di un tri~n!$olo r~tca:a$9lo _166


284 286. 504
~84, 286; 5Q4
284,; 287,. i.as. ~D4
284, 2.86 5.04

284

is-grph
i'slower
ispclp_t
is,pun.ct
lsspa~e

-.

28:4, 287, 28-8, 504


284 286, 287, SOA
2~4. 287, '.288,. _
5:05
284, 2S7, 2881 )()5
284 287 288 505

Jstirut(): N?Zianale Am{'.ricano per .gli Standard (ANSI)


2, 16; 502; 5-41
istograni.rq..3.
isttuzioi)e

Pidice 176

ge:ratthia di promozione 135


g~o.n~ d!;i caJatteLi 5P4
ge,sco11_e dci segnali ,4fl7, 5.t.2
gestine, delle srcinghe 532
g~cip ne

invent~re ntioy~en.l~ l~ :ru>_f.:!.. 8, 126


in~en.rrl 408
invotru:e
una fun.zion@
- 126
.
.,.

irn rnagine ~sguib i le 11


incapsUlaroenco delle infonnazio.ni

fw1.7.L9fie chiaman te li6


tl I nzio.he chiamata 126
fu1rt.ione: c::os 12-8 1 509

generato r:e di crui:verb~- 322


~aerato ..(; di p;arel eqn i n.wn.e d

di fw1iio11e 132

24, 464, 492


identificatore deUa mac:ro 4.64
if scruttura di' sdezio.ne 33, 48
.imtnagia~

13, 16

inte:ro g~1;;iinali; c0n .sguo 325

int~p.zione

38~

iden~ca,to'.fe

genel:ai.
ion easua.le di Jabrinti .2 79.
,
ge:ner_ari<;>.ne cli numeri ca.su-ali 2_54, .316
g_rnrch.ia. di .ati ~80, 381

8, 11, 12:, 20; l 15 125

furi1;iene c:eil

-mM 5,

.indJ:-caEari di COnVeWO_\[le per valp.ci i:n Virgola fllbile


326. , 3:f9

24

ini:ei::o ot[ale se.n.ta, seg119 3-25inrerei .s.ema se:gno 362,. 482.


in:fer9 u11si.gned long 3'02; 482
i,ru:&ptete 46Z
in1rri.1p t 48.4

274

srrill;ghe 317

intcr0

incero esadeci.rnale senza-segno 3,25

hardwre 21 3

per l'elabonizi.ne delle ~tcinghe 137


39~. 394, 395:. 523

fread 393 . 398, 522


free 413~ 528:

.518

-34]

incercettare 484
inrerecta,.re un ~~gnale in.ter~ivo 4-85
inreresse comp~sto 93, 94, 120,, 1.21

iritero ckcini~e senza s~o 3-2-5

halr

la:g spa.Zio 3'33 334


float
~i, 63; 13.5, 48:2;
flus.so di q>11rrollo 37, 55
fpcil. 3:84, 517

fputs

dell~

340,

49 )

funzioni di o11fronco fucluse nella libreria per la


g~tiene delle ~rcinghe 29:9, ~00 .
funzi..on i di cicerrn ~clu_se :ndl~ libreria p'e( la gescione
tleUe stringhe 302. 303
funzioni di urilr-r
137
---funzioni pet ~r~tteri e sulngh della libreria
perl'.inpnr/outp ut stan.d -a.rd 294
fwuion i per. la co_nvetsione dclii: sttin,gbe 28~
.firn'f'iorri p'et la cctnv~fsion d~lle. stringhe inclW: nella
lbrecia di utllir g.enerjclie 289
funzl9m. per l:;i. manipolazione de)la memoria, inclrrs'e
nella lib(er.ia per La gll!st:ione delle: stringhe
2'97' 308 , 3.09 , 312

333

382~,

gruppo di scansion e 34D


gruppo di scansrge lnv~i:~o

135, 482

(IlC

gramma:tic.a de'Ua st.ruttu.ta deUa fras~


gra.mmadca le.;s,[tale 491

fun"Zione n'O.n ricorsi'la 170


fLI.nzione pow. (por~aza) 32, 94, 128, 511
funzi9n (! prc::Picato 4l9
funzi,one riorsiva 151, 152
fwizione :ri<Bors.iva di elevamento a p.9t~nza l 70
funi,i9ne- cicors!va m~Tr:av~~e 278

.funzioni di confronto

flag # 3.33, .3.3,S


flag + :f33, 394, 535

fputc

grafico a barre. 120 184

128, 511
fu~one tan 128., 51 O
funzioni .della libret~ ma:cema.a 127, 13,.6 172
funzioni della libr~ia p.er 1'inpu'tlaurpuc: s<in4trd
(stdio) 293
funz(iln dello standa1d ANSI
8-- -

~24, ~3-3

fJag -

funzione log 128, 5 10


funz.i'.on@
J9_gl O l 28, 510

funzion e $qrt

file ~Qtgen:c-e multipli 478, 479, 46.D


file tm,Pl'l.raheo 483, 484
fine di una coda 4 l1 428
B.n:ede.U.Ummissron:ed~idaci

funzione cicot:slva quiclcin: Z78


fu:niione .sin 510

"file server 5

565

lNDlC E -ANAI,m co

120; 184

io . 2t>.

131, 449

istruiione a.dcl (aggrrngere) 272s 45.9


isrruzio11e assistita dal coi;npucer. (CAI) 168
istruziQn.e c;o.tn.pQsta 53,. ., .54
istruzione di assegnami:n,(.ci 26
i~cruzi:one di aziene 46
i.sauz'io.n gero ~7, 148, 487. 4.8$
istruzion. halr 272, 453,
isrruzio.Qe ill. ~gal~ 484) 485
.istruzone l0ad (q,r icar~) 2;72
istruzi0ne ~etucri 132
istruzicme s~ (1-mmagazzina) 272
istruzio.ne vun~ 54
istruzione write (sfarilpa) 272
isttUZioni di ireraz.ia~ SO

:isrru.zloni dl salro- SOO


isrruzi0 ni di selezi0.ne : 500

284,

2~6,.

287; )0 ..
U.'digit 2841 2861 505
iterazione 158', 159
ireJazion
e ,:cont:rollata da un contato
.
- re
56 . 57, 85 . 8-6', .8:7, 88
ice.razione con.troilara da un valere: senrinelia
38, (il , 62~ 85

isupper

i.r.erazion: dd:r1 ita 56. 85


ire.raz.ione ia:defutlta 581, 8)
it~rai.io
n.are 87
. ni deterrni
- .
.

I r'IDICE ANAI.IT_CO

li

lin k

ro,

me'mb ro

Jiic-Qpin'i, G. 47
Jaeschke, R. 16

_ijnker

job 4

227 , 3_49., 411, 414., 415


JJsfil d.i parametri 1'1

7, 12 I 6, 17
12

JJMS

memori.a au:r0macica 147. 175


memora pciillaria
nt~rnset

load 274

mes$;!g~~

506, 507

l~pre 2!$9
di q,ualsi::is~ di.Biem-i:ooe

loa!itzazipn~

labi rinti
labs 530

279

lancio d~i dadi

13.B, 14 0
l<ll'lcie. di d1!e d~dl 218

lancio d una monet:ina 16'8


last-in-Fust-eur- (LIFO) 422
ldexp 51Q
5~0

le orro Regirr~ 16Q, Z24, 426


ap pro eci o bru cal e 22 4
le t6-rri di HanGi 160_,. 170
leggi di l)e M-organ 12 "
leggibHir
34, 66, , 67 , 88-~ J 30
leci:era maiuscola 24, 45

le:n~t-al~

20, 27

len ef .cl.i 'Sollecito 32 1

leru:re maiu'Scqf~ 43, 1_36


le.nere minusole A3
letr~r~ n n dlsu utr iva 29
liberare la ..IIlern:oria 413

del

16

lib reria. d.i utilita generiche (~~dlib) 289, 525


libreria per la gctstinn~ dei segnali 484
llbrecia st_and<;ird del e 8; 19, 21 , 125, 138
libieria smnda:rd. dell :ANSI C l25i 12_6
1
libre.rie $_Eandard. _1-l
libro delle risposte dl e 17
UF O (last-ia-frst"ot) c42-z
limiti 539
limiti delllrnp_lementaztone 53~
Hm i di credito 129
lim iti .pe:t la dimens iohe degli-i nre ti 13 6

linea cli flu:Sso 47

linee relefbQich~

1inguaggi di :;tlro liveUo 61 8


linguag'gio assembly 6
Lingaaggia e 7
lingu~iu di progtammazione 5" 6
lingu~gio L0go 220
ling~0 machina 6., l l
Lingu~p M_;rcchlna del Simplecr~n {LMS).

27 1, 27 2
279
li~ggio< o.;i.rur.ale di un computer 6

liaguagg~~ noQ.

ri:pi22ai:o 7

-UngUa.~o- portabile
- .....

lZ

505

J.otalcrrie 538
locazione 28:
log.itmo nac uTale l 28
long
10 1> 15:}1 1,54, 482
l:on g ~u_ble

l<i"g i:J;i,t
Lovelac.~.

mda 200, 217


modello di a+i one/d,e~isione

l3'5, 48 2

tad,y Ad_~ 9
1 o~

176

.M
1nchiha cli Tu rin g 47
ma.zch in-e d~skcop S
M~cinrosh 38'4, 478

rnaltipllc;ttonc: 4, 29, 30
mol.6.plicazione di du, inte:r.i '1 60

136, 46$ 464


macro de:fnite in sttia.tg.h 475
maggiore di du ~ JiUJ'rier:i 77
mam ricorsivo 160, 171
111aig:() 2b
iti,~e 480
makefile 4g0
malloc
4t,3, 485 , 486,. 51:8
~nipol~ione dei b1r }71
ma nip olazione del te{>fO' 1$1
m:anip~~ioni binvise 'dei. dati 36-0
m;l!rcacre di end -of~ftle 38 J
maschera 361 ., 377
ffil lefO

m:as~eru_e

5.09
206. 207

marEice
mlltdce i-rnma:gazzin<l'-ta 41 5
mauici! I1 pe r J 20 9
ma:tto.ncin i 3:C,rat~u: 11 4
m;at~o.ncz:ini nidificati 11 4
_rriaxim urn 13'2 '13- 3
~

di

m4lrip;i;o<;essore 13'
multil?rogrammazione

cm~

2'5

mbhm 531
:r;nb.Siowcs 531
mbt:.owc )-31

media 42, .:z:oo


media .ari tm eti ca 3 l
mediana 2o_o, 217

5.

roulcitasking 9

.o!

NDEBTJG' 504
n~gazj9ne: lqgic~

_105, 107~ 108

2.1, 2.2 , 36~ 49, 283, 284 , 293 ?94l 295


323, 341
nidific
6(),.
- . -ato 30.
nid ifi tri0 ne 65
nidi.6.Gazione dd le strutt ure di
conrro1k:i 49
nodi 414
n0 do foglia 434
no dn i;ad
. . i.i;; 4'34
nodo: i:a.dic dl un alb ero binari() -448, 44~
nodo sostitutivo -447
nQrne 28, 8_
6, 176
noJn~ d_
el fi:l e l 1
nome della 'funz1onJ: 130, 147', 479
nome cli erichacra di s.UU-Eru:ra 35 0
nome d:i uri ve([ore 176
m.o
- me di UD.'a var
-- iabile 2,8
no
.... me di varia.bile 4-49, 451
n,Qttle di v-a.riabile f0r m.a:,r_Q -~ f)l p<!,rqle 25
no mi di_ paramea:i ne,i pro to pi. di furizfa _ne 13
4
n'1!mi cli vad iibili gl-obali 47 9
newlint:

168, l7 1

naora.ri~ ne

posizionale 548

rilot<1Zi()ne -s-c iencifLca 32 6


N'ULL 14-1, 249 , 28 2 29~_, 294> 29 5, 384, 413,
42(l, 50~ 51 ), , )_32
nilrneri bi nari negativ i 55 4
nm n.eri pseudocasual i 140
numeri romani 1_23
n ~1111~.ro ~ c1Jale l B7
;nu rne r0. di posizi9a:e

175

r;ll cig~. _449., 45 1


esadecltnale 49-$
in vugpl'a :roobilt .jS, 61 , 64
nume:ro ottale 493
numero pcrfetri::> l 68

nu me ro
J1utt1ero
nu me ro

nun1e.r0 primQ 1.6_~


nu me ro rlle 7

o
offset 25.0, 39 6
oggetto 13J 15
26, 272; 45 3
opcracore l 108
ope rat ore & &
106 l07 , 157, 158
9P~~rdre jI 107
opel-atore binario 2G . 30 _

152

N T logico 105
notazione 9n <::9Ilif'l~mc;ato: a. due '.554 llOtai.iqnc; G'-C):n .gli, indi~i di vet tor e 186,
.249. 252
no:ta:z..ione n i puntatori 2-49, 253
no taz ion e cen i vettQci 2-53
n9cazione Cl?!n puncacor:e e indice 2501 :{;52
notaz.ione con. punraro:te e ,~ffset 25 -0. ZSZ
rroi:az.io_a_~ esponernJ:tle 32_
(:i, 327
no (an
44,2.
. on e 1fusa
notazione pol~ca inve.rs<J. 442

qpe_rando

3(52

m..at~tica

maz?.Q

multipli di un intero. 83

JII:scltel!ato 364 '


massimo cornun divisore (MCD~
masl~ 1iveU0 di pri ori t :30

21, 50 '

modello softrWa:T- 2.Y3


modf 51 0
mo di di aper~ura 517
modili.d1e al tompiiacore dt Semplic~ -461
. modifiche al simu.Iaror S_implerron 27
9
modo .di :apertur~ d~l ru~ 384-;. $17
ctu;i:d;o di ?-perrura del file (W-) 3'84
modo cii aperrura di un file binario 48-2
mgdW~ 3,0, 1?~

5 11 , 512

lvaolue fvaJrelism istra)

311,. 53.5
di e...rrore 12

mkcin1 5-.?9'

13.5, I 53". 154, 482:

lo3i~iq,p

4.. 1o

me ssa w 20
me tod o e~Lrlsi:ic0 22 2
._merce re-a_ :p>unto 47
rnertei;e iri cqd-a 428. 4_
36l 434

lom lit 136

la t-atraruga e la

309. ~ 11, 534


309, 31 0, 533

memcfnp
mi:;mcpy
308., 30.9, 53 2
me mr n0 ve
30 8. ?9 , 310, 53. ~
nceru:ocia
3, 4,. 1, ~.l 2-8

279

27 2,

34 9

mm(:h.r.

lis_ca di. inizializzatoci di un vet tor e 179


lista separate. da vir.gole 90
lotalon~

libre~ra

'

lista di inzi:aliz1atori 186

Kern igh;t. B. W;
Ki$ (k~ epirsim ple)

lav

11 , 22. 47a

liiikin~ 11
lis_ta con cat ena ta

..

11 , 412,, ~ 14.

56 7

operatore birwis~ Q'R (I) 36 )


op,e_raco:re c:o ncliiion,ale .(?) 52, 72
op~t:e .di assegnamento ( ) 26
oper-O.tore dj a:..<:,s:g.n.:amenrb addiione (-+;;:::)' 69

Qperarqr cl.i corop.lemeriro '(.,,) 96 0


@p_etacor:e di com ple rn.en'tq birwis.e (..-)

36 2 , 364,, 36 5_
9P.ettat~ d1 c.:0nve.i:sione 63,. J3-?
op eratoce di c;:o.nve.rsion<:; (flpar) GJ
opera-i:9:re di decrem::ru:o (~-) 70
op-erar<;:rre .di deciferimenro '("') 157, 22.8, 22
9., 2B l

0p eta tr e d i elevamen:t~ a po_ren ~a 94


opera~<J!'~ di h:ic_re_m:ento (++) 70
op~rator~ di indir:ezin.e ('") 229
op cia tr e di illdirizzp (&).
i ,6, J37, 186, 18 7, 22 8
ope rat 6r di negaiione log1ca (!) 105, I 08
opracore ,d[ PP?J4-ecr~enco 70
op~ato~ dJ pest:irlcreme.n.t0 70
op_c ial'or<i: d:i pr:e.decr~mento ' 70
ope rat ore di prein;:enreiito 70
9peratqre d1 cisolt1zi.one del
rUcir,n,efiEO () 229, 352

Il

568

IND_IC:E ANA.LlTICO

i;ipeiafore cli scc:iriimn[o s destra: (>) 36( 377


opera-i:0rt:: di scordmento a sini stra (<~) 37/7
p~(atni:e d~ u_gua.glianu 34
o'pe rator freccia (->) 3~i
operatclre .logico AND '(~&) 105, l06 , 362
op~r.a.rore logio OR (j !) 105., ~ O'G . J 7., 365
operatte memb[o di O:U~ {.) J5Z. 353, 358
opera.to~e rn0dulo (Q/o) 29, ~O; 42; 43
o,pelicjtre. purira.t~re a stru[{ut a (~>) 35~ 3~3. 3,58
011eJ"at:ore puDt-atore ft~cia (->) . 3:$2ope_ra~ere _punri (.') 352
ope_r~i;or~ si~of _2.44, 2:4'8, 246,. 35~ 1 3941 3'95 ., 4.1'0

41.::> 467

opepttQI'.I; Tetn ruj0

52.. 157

opera_rore nnario 64, 72, 2-44


operar.ore u~io ~t 63
Qperaiore- uha ria ~iz<;>f z44
Gipertoie :virgol. () 90, 157,. 158
opera.tari 69, 494
operator.i ;uinnecici 29
Offe ra.torJ -arirriietici binarj 64
operatori bi[Wise $G. 361
OFera_rQci bjrwise di sc-Oa:imnto 367
op:er'~rcor'i l.i assegnamento. +-, -~. *-=-, I-= o/o:- 69
operato-ri di ~egn_amj:It~ bitwis '167
OJ>etarod di ugu_agllimza 33, 35
peraror'i logici 105
operarqci mcoltlplicati0 64
Q(-1et:ittori rdazio1;11lii 3'3, 35
operatori ru--t:metli::i di as~gament9 6~
ope-raziQni acian~th 271
op_etau9n,i di :tariarrfnro/im.magazzinam~to 271
Offetazioni di inp utlo_l:ltput 27 I
operaxJoni di Etas-ferimenr del oontrollc:i 271
OI-l ~l-uSivo bi-rwise (")

.360 36 1, ?62, 3G4, 36)


R in:clusivo bitWi~e (i)
360.~ 361 , 362 . ,64, 365
O[a
137' 536
- .

J!

GJrdiearneato 195
!rd: iname11to a bolle utilizza'Q.9,9 u.a cliiamata. per
riferiml1IQ , i4l ,, 243
0r~1amento dell 'albero binario 4-38
btdnament pe[ selezione 16b, 2_2 5
0rd lne 45
ordine degli operandi dgU ope rato ri 157, I._)8
oi:dine di d-iiusuta da pan_e del sistern:i,op~6 -484 .
Org;;ullzz~ion't: _lpteruazi0n~e p,er gli S.faiidMd i.6
qrolc;Jgi~J

14l

rtale
122, 123, 28_4~ 4:9J, 324
(jcc.imiz:Lare il otnpilac~r di Semplice 460
arrimizt;lto.- 46U
O:YAf

48

ove dlew 48-5

paga ba.'i:e .6
p:;iga: lor.d a 6

pagina

l~c;a

336

palind,ro1110 229
_par;lll.elismo 13

pai:alklo

9, 13

para met ro 127~ l30


p;l4lntetro di tipo- pun tato re 232

parem-es'i () 30; 36, 177


par-e ntes i graffa a;pe,i:Ja ({) 20

par~uteyi

p.a.tenresi graffe '('.{}) 5.), 54


pa:r~nt~i nidi ficate :32
pare-11resi qu;idre <n) 175, 176,. 177:
pari 42

pa.rol'e chi_a,e- 491


parti frazj9,o.ar 63
p. ~.s 1;;.~~.u
-1
2 ' n7 .
P.~~; B.laise 9

IDP-11 7

t 4$i 147 , l 49

in memoria

14iS~

permaaen7.a. auiomatica nella me.moria. 147

188

perm ane nza in rnc:rn:gria 145, 1&8:


perm_a:11enz:~ - stacica in rriemoria 146

pe:rro..r 5:24

pers0na1 computer
PersQn~

Ji>GR 423
"

f'l.rrabjl~

7 8, 12
p~{~aqilira
7, a, 12, t 6
pos(in.C::i:ementare 71
pocenza 128
pr~i.S.io:ne
,6'4, 324. 33 i 33:2, 3-33
precisione, di default 64 327

71

pl'elevare 2,74
prend~

si

34

prende.re in rnput orr.ar~eri _sttingh'e 3B9


prptaa::ssore
l O, l 1, 136
pi:qrrocessot dd
2?- 4p3
prini,o raffinam.enro .59, ~~,
ptin cipi 0 9,el min:im~ pri:vil~o
i46 , 1-9 4; 235? 21-to) 243, 24:4
princf 5:Z3, ) l 9

pr.ofon.dlti di

42

459

albero bin,ario 446


progecc:az.ione qriemata a.gli. :oggel]:i (OOD~ 3
p[()g!'."amtr,L'P. o_py _su un sistema UNIX 477
progr.:Unma di edit ing 11
programn1a di f.le-mtr;;bing 4Q7
p-tqgta:m.rna di niclolameni;o e clisi1:ibuzi0ne di carte
2-58
u11

di or,~ i n\l_ m~nto i6l


progf<iIDrna d;i ordi:n:unen-c-o p6lrfaienu: 261
pr0gramtna di visu~.1 izzazione cli un ist:_0granuna .185

.32;

preinctementar~

3
p.co-grammi formaci da 4ivend Sie so.rgen,.re 145:, 148
pr9grarntni orient?ri agli oggetti 2
.
prg~nim

n[u tcoci.ti 12

promosse

6~

proino.qne ~3
pr0Qipt 25
_
prompr delk riga 4i c;:omand.o ili UNIX 47 4
proteziqpe d~li assegn.i 319, 3.20
pror6cip6 di -furiii6ne 941 l30, 132, 1}3 , 147
prototipo di funz.iene pa pr,i ntf" 474,

pr;ovvig~oni

pr<;>gramrna e_s~bile 22
p.Fo~gratrnna oggi::tto 21
pfo gra mm a per oi:pputer 3
preg ramn1a pei: JI fue;-macc.hir:ig 407
progtamuia p.ei iJ gioco dei dad 173
pr-Ogramma per il lanciq dei dadi J _86
p.rag~a per il _sgnd5!ggio degl i studen cl 18:3
progract:11na pm- .la bcisra paga 6
pro,gr-amma per la oq.qver.s rone n1e-;:ria _ 321

progtamro_a per la ge.scio.1).~ del tom o bantaci6 4G3


p"rogramr:r:ta p-er la gstion~ di una cod a 43l
programma per l~ ,gesri<?ne ~ Urla pila ,425
pro~ram ma p<;;r J' elaborzio:ne delle cra:nsazioni 399
prog~:rilmarore 11
programmaco:tf!' di -c.omputeJ 3
ptgt~i(>ne con con tn.t e 1.6
prbgra:m.mazione in. li11guaggio m~r:hln.a 270
p.rog~'a:m 1n:az i<j)ne mczi:duJare 3
prQgramrn;iuQne orie:n-rata agli oggrti (OOP)
13 J 12'8
p:i:ogram n1':l.Z:one ~nza. goto 47
pr:.ogr~m.i;n_zione s:rru [trata
1, 3, 91 12-, 19, 37 4) ~ 4.7 , 4SG
progiammazl~De sru.ttnr~t:a per raffh~ariiend s,uccl'lsSfvi

i.l 6

pseudoodiC::e- dG . 68
puh tato re 22 /
puntaror~ a FILE 386
ptirrt;rucre a file 38'1) B82
pun tato re a pun t_
atoxe

42J)

puntatore_a utm funzione 259; .26 J


punta.core a void (void *) 24-$ 1 249~ 413
punrac~re di po_sizio~e del fle 3$81 397 , 398
punrarore .gene rito . 24_8
pun tato re NULL 48~ , 4$_
6
punceggi~a

494

pun to e vn:g0la (~)

push

20, 34

423, 426; 427

pur e 521
p_.t~ha_r 293 . 29.4, 295, 2.96

ptogra.Jnrra

Computer IB,M S; 11
pi-attaf6.rma hardware 7
pila
227, $4~ 4-11 , 422,, 423
pi'p (j) 4.74
pipio.g 4'74
Plauger P. ]. 8
poJter 268
poket a: cinque carre 268
pg'linomi~

4li

.pr~durlone

pex;manenza avl.mcica

r.op .down per raffiname-nci suc~si:vi


58 . 5:9 61 . <?G, 254-, 25.6
programrni:tZi~ne top-down pei;- tclEf.nmenri successivi

7a

pro d0r to

65

pro~a .rn tnzj.o ne

problerna .della pr0~igion{!


prQ~~a ddY else aEp~o 8 I
p.r_oblema de:U'i:nreresse semplice 79
problema d:ell'interpfi;te cii Sefilplice 462.
p.r-0cc:tdLITa 45
proce-sso di cori1pil.azione 456

gascSare:-j :YerrorI alle funzion1 190


passat .un elemenro cli un veu:pre 192 , 1-93.
p<JJ1sare un vettOi:e 192'., 191
Has~o di ciparciZone 277
passe ricorsivo 15h 277

PDP-7 7
pern1anenza

vl

numero

graffa hiusa (}) 201 21

p 122
p#b et;c i di una rete di C::QI~p~utet 4-2'8

priorit
30, '.l6i lQ&, 177 ,_ 2~0
pno ffii degb O(?eran).rl 36 1 230.
pfiotit~ degli ep raro d arinn'e{iei 3 J
probabilit 138
p.r:0 ble1n.a dei risu.\.1:ad dell''_es:ire 61
pFoblmia dd ealcolo della media 57, 61. 62
,probleI1ia del h.ilo1netraggio 77
problema del lin1lre di cr.ediro 78
pi.oblema .del lingu-aggio Semplie 449
proble1na deJ
'm:;i,ggiore 42
prol?l~rn.a d_
el tiu-mct m:iioie 42
problema del numero telef-o.nic- 316
problem3: d~I paliQdromQ B2
pr!'-blema ,della. cbdifca/d~co'd-ifca 84
ptghlem della onversion~ da binrig -a d.ecim~e
problma della ma:trie 2-1-9
probl,em:a d.ella pag st:taOr<.inara 6, 79

p_u:cs

304,

30:;.

4~6.

522

2~)'4,

-3,o@.

297 . 299 , 301

$0~

3os , ~~o._ 3_11, 312 . 3s2 ,

295, 4.101 522

Q
qsor 53Q
qNalifiC<J.t<?!'.= onsr 2:3:5
qualift.ato.re di tipo volatile 481
quancir sealare 191
quicks9rr 16:0, 2:.77

R
r mo_do cli ~.p:rtur~ de-( file 387
f';f- modQ di a_
ggiocnamenro del file 38(i, ~S7
r+ modo di apernrra d.~l file 3.e7
racUan.ri 128
tadlce .quadrata: 12.7. 128
ragg~o '&3
r:ri:se
484 485, 5 2, 513
tancl I3l), 527

R:AND_MA:x

l38 , ] 42
tando.miz1azio1:1.e .J41, 142
rap_porii:i a:ureQ 155
.tb n1qd0 di apertura di un .f.He binario 482
rb+ .modo dl ap.ertnra- di un file
binario 48.2'

57 0

fu DICE ANALITICO

-,

read 174 4:5 .3


reallo'.C 528
1

'

reord

238 , 380', 382

redirezi0namenro
323
.
redireti'on' fe l'in pr da un file 473
tegilier
145. 14-6 ~ 14-7
r~gis_n:i h~r~:ware J46, l 4.7
regoJa di a:ccat;isc.amnro 110
:-:

regaia di nidificazione 112


J:gole ~i promozion~ 134
relaziene ger~G:hlca ria la fi.1Di.ione capo e quella 0peraia
i Z7
req ujsiri 147
requisiti di efficienza 147
restimiFe il :ontrc:::illct! del g.ragr_-amm:a 126
resto l 2"8
rete di c>mputer 5
r.ete !0ele
reti 5

rct:tang:ol 48

17
r~wind 483, 5:24
riassu:nto della progra:ill.mnione stru ttur ata 1 LO

ftu rn O

ricerca 201
rice- rca
binaria
-
' .
.

r-icera
ricei
- :Ga
:

~icer<:a

ricerca

160 , J69 201, 20-3,. 206, 226


in un albcr0 birrario 4~9.
in ana
lista concate
nt. 160
-..
Lineane 160 , 201. 202, 226 .
ricorsiva in una lista 446

Riehard_s Ma rtin 7
ridJJ,esta d chi usu ra 485
rico rsi0 ne
l52 15'8, 15 ,
ricsrsio
ne e ic-erazione 158
-,

ricorS:lorie -in fi n.-ita: 154


ridu zio ne in scala 138tieii!plrivQ 370
cie:llLLa[e :sg
rientr0
22, -49, ' 5 1, _5..31. ~
ciferirnerrti risolci 478
ciga dl corhndb di UN IX 473

rlghe 26.
rimozione da

SEEK END 397


, 515
--
SEE
K- SET .397,' :515,
si:!gnal e 484
..._

:-

'

~egna:le

di an~n2lone

tntei:~tivo
segno di pefc~r~ale (0/o) 30

se.m

141

seno

12'8

i85

se.ne a;igpho:tnec:cico 128


seq uen ia di escape
:ll., 26., 2~7. 33:6 , 346 ,; ~4.7, 4'94
s~quebza di ,escape del baclesp:i- 336
s~queD:z.a di esca.pe del caran~te a,pit: ~iAgolo 336
seq~enz:a di escape ikJ C':rarc:e_
re ba~_l~h Zl, 336
sequenzi! cli estap del carattere punto int:errogati -336
seq utn z.a di escape del izaraqere virge.lett~ 336
sequenza di ~c;:,lp del ,new.line 356
.sEq:uenza di escape dl rlrCJmo Gartdio 21, 3~6
sequenza di e~cape ad w.lto pgg~a ~-56
~-e_q_ue:$a

di e~.c~pe dclla tabulazio_ne orizzontale

21, .336
~equenZfi di si-ape d~lla tab11l::iz-~one verri:ik 336
;sequenza di l!S'ap~ delf alJ:irrne 21; 336
seq_u~riza di. escape esadec;:im.ale ~t94
sequ_enza di escape otta:Je 49'4

ser.ie di l-ib.onacci 15_5;. 170


s&tb.uf 51.8
setJmp 51_1,

lL!l.

cispacmiar:e la memoria 368


li(cliie, .D . 7. 12, l6J 17
r:i.ro:rn0 carrello ( il
rito rno Crrello (' 2&4
rius:bilic~ dd s~fiware
81 2'2 128 132 ;. 244 . 4 7-9
rvalue (valore cli di;:_11a) 109

5q

'

eosrruiie il vostro com pila ror e 44~

e0struzi(}ne_dc:I 'Vostro com.pu,t~r 270


'esercizi di ma nip ola zio n avama:ta:4clle s-ninghe
318_
shrt 1o1, 13.S
SIGAB.RT 485 512
SIGFl1~E

:I

485; 512

$TGILL 485 .

~12

S!GlNT -~4, 485,. 51'.2


signal
484, 485 , 512 , 513:
si:g.nal_handler

484~ 485

SlG'SEGV 4'85 512


s,_alrL non L0cali l 1
'salr0 iilconcl.:izionaro -4-)8, 486
1scic chj 220

SIG TE RM 48:5, -512


sim bol i di c:o.nnession
e.-.
_si:rnholl s-peci~ 379
-

si-rnbolo 43.

simbolo crch. iett o- 48


sim.bol di -: accodamen~u dell"output >> 4?4
slm
= hol
-. o
,_ di
- m.ione 48
sb-trbol o di cl~cisjone' 48. 50
simbolo di ted irez ion am ent o dd f inp ut < 474
s,lm.bol9 di redir-ezio:.r;ia,.inenco Q.ell' l'.'H.1JIPL1f ~ 47. 4
'

s.pe:cifi.che di tipo 498

simb~Jo

:~imbale ret~aogolo

simholo torob_o
Sinpiet:r0n 4.10

s:r:ancl

sram.pan..t~

-p_uroeric
o dee i mal e :547,
.

'

s.tand.ard .ourput 473


smric
147, 14$, 149, 18'Es:
stda ef.h 137
srderr (H dispositivo deJlo sran dard eq:or)
12', 382
- , 5,15
stfiln {il dispositivo dello stalidatd inpu.c)
12; ?'82 515
StdUb_ 289
stdour (il dis.j=lositiio :dll standard :0u[put
~82,

''

sistema per la gestione del dara:base (Q'JPMS) 361


~iste.tni giJidati da IhiP-U 26.2_

sistem:i n un:ierici 284


s.stemi per la composizic;ine; tipo~~a -481
s:i_stmi per J'elabor azione d.i u:::a:n_saiibni 392
sistemi software di com-and .e di c'n crollo 9

302 503 ~15, 53?

size_c

sgE:ware i, 3

48

SOl'Jlm~

Lj;, -41,

53-?
297, 298, 533
302, 304 534

sttits}Dn
srn.:arn (flusso)

42

som ma rio c:iell'<l. sintassi .491


sQndaggio 18'1

sorgente. 15
sotcoalbero de.stro 4-34'

soc
isq o 4,34
. roa.
- lber
- o
. sin
.

sourarre du.e punraroci 24.8


sott raz ion e 4'.

spazi:arura verticale -49


spa iio
36~ 49, 284, 341
spaziQ bi<l!ICQ 39. 2~8~. 341

s11c::tiflche cli clas-se d.i memoria_ 145 . 4~7


,spciftcli.e di cnvrsio ne 25, 27. 324

3-2-~

srrF;a m dcllo standard inpur (stdin) 323


str.eam dello s1:an&rd o-u tpu t (stdout) 323
srrerror 312, 535
.strftime 5313, 539
sr:rin.ga -20
stri nga di carat~ed :Z,. t17
stri-nga di ~ontrollo del foirai;
25 ~

27 324 ,
j

~3 .3 ,

.strii'.l-ga lercetal~ 187, 282

33 7

312.i 3.13, 536


297, 29:~, 533

snlt!in

s0m1ua eo11 fo r 92. 93


som ma d~li ~lerneni:i di on vettore 160' 182
somma di d.ue mteri 160
so.rn.ma d numer:j '77.

'

299:1 300; 533

St;rcpy

sistema numerico :itt bas e 8 292

l.Z

3.02, 303, 534

strchr:
strmnp
~CTG9 ll

'

515

s~doat il dispo.s.itivo: dello stap.datd eut put


stor e (lln.riiagazn1nace~ 4'59
strc at
297, 2_981 5$3

19

'

si:steJila: nt1meric esae'c;in'lale 547. 550


ssc~ma nume:rioo in base . 10 292, 54:7
'
siste
:Jll-a
nltf
ileri
c:o
in
ba,s

16
29.2
.
sistema numetjco in bas~ 2 547
'

l2

sran.da.rd errar 3-81


standard .e_r[OJ (stder.r.) 323
s~:ui~rd inp ut
25, 293, 294, 295 , 473.

549

s1stenia
n:rrmerico
orta
le
547
-
,. 549.
.
siste.oia ope tari vg 5' 7, 13., 16, 27

12

s~amp_a.re

48, 55, 100


4S1 )_0, 55, l_QO

_:;;or:~ (i;,>rtjin~menro con sptofondam:en10)


d pre,not,;JZio~~ per line aetee. 219
numrli:o binario. 547, 549

14 tf 528 ,.
294, 296 , 519-

ssc anf

simu1a:tore di <C:omputer 2,73


s{muJaiione 138, 270
sirn 1il azion~ di un mesclatore e dis mb ut r d car te
2541 j .)}
_sim ulazione di un meS.oolatore e dist:ribui:o:te di arte
~d alra efficidJ:iia 355, 357
sim ulazione di ua supeo.~~ro -445
simulaz\(}t1 sqft'Ware ?73
sink-iag
sisrema
si:Stma
.Sisce.ma-

294, 296 519

spr intf

vale 48,

fc:>frware per U:mpagin~iqne 281


su:ftw~re riu::iahil 13
sollecit 321

Sez ion e ~pe ci<J;J.e

571

strn~at

saltware or tun eici le 9

servhuf 518

' -

INDICE ANAI.tncb

:s.ah s-10 -

setl.crcale 506.. 507

albre binario 446


ripeiiii.tfe GntrollaEa da un con tato re 8$
ris<?lve;r~ il tlferimefito di _lln punr~ere 2i9, 23-1
dsolv'ete il rifuciniertto di un pun tato re vei d *
2'4'8, 249

'

stacchi et~ 43. 8-3


scalabile 180
sealare 191
st,anf 3.23, 519
s42hern10 ~~ 4, 12
seerrciJJ'l.nQ a siru$tta 360
scb.sfamenco 396
scrittura di rru ajv a 28, 2-9
servete del ca.dice 11
scr:iV:.ere in lerrere l.'._impFto dr un assegno -320
seriv.ere in l,111 file 384
se:c,c;i o.do i:aff:in.ani~-'1to 591 67
SEEK_GUR 397, 515

Z:29 ~00 , .'5.3.3

StrJ lCib p

stm cpy

2<J.7J 298, 533


.Stroustrup 1 B. l~ 17
sr:rpb~
.301, 3-D4. 534
srrr thr
302 , 305 534
su~pn

str~c:i;

striod
-~m_ok
scn:ol

3(i2, -30$~ 53.5


3Q2 306 535

_289. 2-91, 526


?0~> 306-, 307, 535
28-9. 291 ; 29'.4, 526 .

.s:u:c6u1
sttu
- -. ~E

,...

2'89. 292. 2-93

t75

squt~triJ.
srrurtura.

53:6
23:8, 349

47

su:utru:ra d1 con ttqi lo


srru rtur a & contiiJllO c6A un jngrt:sso e una usc ita
singoli 50 111

.s:uurt~ cli con tro)JQ fltr<;h (whlle) 67


stt;Lfttu.,r di ont.rollo_se/hlrcimn:ti 66
strut:t~u:a di dati linear~ 434

57.2
~rruJ:tp.ra

di lte:razio ne 4 7, 55, 56
strutrut. a di irer:~i0ne do/wh.il.e 49 1 101, .103
rrurrura di terazionc;: finch. 67
~tru~a di icerazioo~ f~n: '49
$ttui:ntr a di itetazi.o.ne while 55. '56
struttura. d.i rpecizione do/w~e I.02
sruttlll!J cli selezlQTie 47, 4:8
suutturca di selezio,ne doppia 48~ 51 66
srrunura di ,selezione if 5 l
"
s.cmttura d se l~io.ne if/eke 48., -51, 52

d1 se(,ezi.on.e IlWtipfa 49 1 99
struttur a di selezione se/alulr nenti 66
s~ru:tcura di seley,,ione sif,1.;ol.a: .4\8~. 50

SHilTIIJ.1 '4

st'ruttur-a di. selezione switcb 48>


struttur a <;Ili sequ.e,iiz_a.. 41, 48

49

st:r~irnr~

FTI,E 386
stru.crurn. fmEli 60, 67
~rrurrrrr~ ti~o~.jva

J;), 4U
struc t'a w.hile 49. 55
srruttut di c.o ntrello ni.d mcate 65
srruti:.ure cli dati 411

strunure (tl dri djnaJniGhe ] 75~ 227, 411


stn1ccure if1else nidifica te 52
srructu..re statiche 485
su:xftr:n 534
su una riga 3tl
suff!..'~9 lqng 493
s~SS0 uru;i~cd 493
supetce mpute.r :j

sv Uupp'o d.el

sof~!lfe

cime 537
c:ime_t SB~

-val.0re: i rtunond.izi:i\, 57

3 9.
1

95, 991 LOO


Syman.t e C++ 1 I

529

T
tabella 20G
rabella dei fiJe. aperti. 38 2

tabella dei. si.tn.boli 451


. ... 452
tabdl11. di pciorir. 543
tabella di verit 106
tabulwione
21, 22, 3.6, 44,. 49, 336, 34l
tab.u]azion.e ~ertical11 ('') 284
,._-

ripizzazion~ dci dati 7

ti.po 2~
tipo del valore d rito:rH.ir 130
ti.po dd valore di cit11>n19 ~oic:l 13Q.
dp0 di d~t.o c.leriv9-te 349
dpo di struttura 349
cogliere dalla cod;l 4i_8 1, 433. 434~

token (simbol.o)

"

v:uiabile :iLL!::oma
l 48
- -. tica
.- . v:ariioiie di onfroUo 85
vari.abile di strurrura 3) 1
.

v.~bi11e

d.i

cpe

punta.to te 246, 247'

varihile esi::e.ma. 147


varia_l:>jle giobale 147 J48, 149 478
v.ariab:ile J9c:l(le 1-27 147, 1:4.8, 188
variabili arnma1ihe 146
varia~ili ll'.Je_ali J.48
Ve;L'il 3;3
verificare se una scringa . palindro ma 160
versiQ.11e standard deJ e 7

totale 56, 57
toupper284, 286 287 505
1;.rasfe:ffinenm del c;;anqollo 47
tiaslare 13 8
trovare iJ valore minimo in. un vettore 226
umle gr.aphi~ ::Z2_0

cypede t 354. 355

vettare. 175 176


vettore b.idimensionale

altro problema dell'else appeso g 1


11ua !irring<i. un puntato re 28.2
~gtc ,5~. 2
union 358
UlllOOe
357, 360: 376
rntim ~io:netica e logi.a (ALlJ) 4
unit cli d:ab0Iazione 3
unit ,di q~.ornzio.ne ~ntrale .(CPU ) 4
iinit di input 3.

vettore
<li caratteri
185. 186 187
-verrore d Interi 18), 186
vettore di punraror.i 253
venc11;e di mingh.e 2,5-3
vi::tore dUja.rriicJl 485.
vetcore rou1tidi mensi0n alt 206, 207 208
,veci:ori & ptU1tatod a f.tt'z.i_9:i 279
. ~

'

-~

vettori starici 190

vfprintf
vi 11

unit di m.emo r:ia 4


un.it di memori a stona ria 4
u.nit d ou,1:pu 4
e '

106

~20

~c

47.3. 477,

47B 485

virgolette

27 329
I 45- 1-4$-1
;

visibilit
vis~bili t nel blo-co 148
visibilit nl file 14'8
vis.lhlli c nc;:l p_rQ-~ocip,~ cl.i
~

.visibilit~ nella fbnzj0ne

f1rnziop.~

148

'

44.6
veid

(punraro re a v9id)

24$, 249 30.8',

413

vprinrf 52Q

w
w ~llUQ'. di abertura del fil~ -387
w+ m0do di :tggior.namen.to del file 386
w+ modo di ~errata del file 387

wb modo dJ apertura cli un file binario 482


wb+ modo di apertura di un file- binari:o 482 483
wc:scpcnbs 5-3i
wttpmb 531
Wlrth, Nicklaus 9
wt:i ce 274. 453

violazione cli accesso 2.8, 283 1 318


violazo1u~ cl.i segrnenco 484
virgola mobile 32_6,

visita an Eicipar,a 160, 43 ~


visita ci;>n_irrDr:de-r 433:
visra con posrOtdr 439
visita con preOrde1 438 439
vis.i r:a di li[L albe.Lo bLn <iT0 437
visita cli una albero 15inari.o per HveHi 439
visira differita i60 4,3)
vi_sr<'I.. in.. 0i;:"d:inf; (sirtu.ttrri:ca) 160
visita per livelli 448
vis.i i:~ _per: livelli dl tm al.~e.ro binario 448
v4rra simmettica 435
visualirt:r 12
visualizzare. ai. co.ntrarjo 1input dtlla: tastiera l60,
visua.fu.z;u':e a.L pnrrai:lo un vettore l 60
visualizzare al .co:nr:rarie una lsia concate nata 160
visualiu-ar,e al contrario urui.: sc::r:in:g:r 16.0
vis-U:a lifrar a.l cd.rrrliario una stringa immessa dal.J.a
[a_stiera. 160
vis_ualina:re del <lis~gni 20
vis.u,alizt.are gli aJberi 4.48
visualjzzare la ricors.i.one 160, 111
visualit-za.re
le date in vari
319
. fo1'tnaci
..
visualizza.re 1:U:1 albero. blilat 4.4S
visuaJiZ7.are un quad..raro .82
visuali?t?:a_te un. quadtat 9 -Vl:lota 82
v.im 1a lizme un .ve.ccore_ l 60; 226
visuali1.zaFe n.oa stringa al conrrario 226
visual.i~1iione ricorsiva ru uria Uste~ i ordine inverse

148~
~

149
.

V
va___..:arg

475, 514
47.,.5'=' '. <;14
-va_~d
v:a,,_lisr 475~ 513
va start 475, 514
valore _26, 28, 1.76

ras&o enter 26

rasro
.invia
1 t, 100 274
.c~sta rerum 26
rempera ture .Fahrenheit 346
crn_p0ra.ne0 94
term ina.le 5
termina l0cc di istruz:i~ne (:;)
c~ne pitagori che 122
.
testa di un'a :da -0.1 ~ 428

clmn.;:iva 153-

variabik 24

59

uc:ilizio della ' memori a 368

294

simb.olo 54B

va1~1tazio11C.

roken in r.dine: rnvl_!rso 317


tolower
.284, . 286, 2$7, 595
Tnd6s C. L. 17

.angnte TI:i~nomettt<;a. ll8


2.~3:_

v.al~re

valura21i one-. di un)tspression~ in notazio ne p,ol:ac~a


inversa 414

468 491

tan.gente 128

...

tpkea 306 452

logiche 3
UNIX .7, u. lG, 17, 9,81 384,
tu::w.i gned 141
uruigne d int 135, 14l, 302
110.s'igned. long i:nr 482

ra'flh 51-0 [ru;tiera


3 23, 25
tas[o= di .in.,..io 26
. -

valore in iziai.~ dj una varinbil.e di controll 86


valore n1a:ssimo BO
'1'alore n1i1.1i1J10 dJ un vett0Te 160
valo re posiiionale 54S,, ?49
valore sen.-ci:n~ .58. 63, 77

ttm6Sh9ring 5

Wl

S\Vltcli

systm

valore f1lal. d.i una vadabile d. c0nrro.Jlo 86 89


-\a1oi;e flag 58

Thompson., Ken 7

.top

573

1"NDJCE ANA.L mco

INDICE ANALITICO

.,,I

'

20

testa. di uria pila 411


r~~ di s9sciruzlpn:e l80,. 464

322 0 I

valere assoluto 128


valore chiave 201
-valo'-r.e di segpala;i:~cin 58
va.l.re di traslazione 142
valore di tilla :va:rWJiie
v.;ilor~

2a'

tjurntny )8

,r'

1.

Finito dista11'Lpa'1'1e tie:z 1,11ese-d j NOrle,111bre 2000


pre~so Art{ GraficlieNew Litho ~ Milano

Vous aimerez peut-être aussi