Académique Documents
Professionnel Documents
Culture Documents
P REFAZIONE .. ......... ............ .... .......... ..... .. ... ........... . ............ ..... .. Xl
e
Corso completo di programmazione
Titolo originale:
~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
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
c ...................................................................................................
c ..................................................................................
CAPITOLO
2:
I9
2. 1
2.2
Sommario
P REFAZIONE ........ ... ........ ... .... ... ... .. ............. ..... .. Xl
e
Corso completo di programmazione
Titolo originale:
.
.
. .
..
Ftgur~ : 11nmag~ 1 : ............................... ...................................... ............... ~ '.'.
1.1
1.2
1.3
l.4
e ...................................................................................................
e ...............................................................................................
C APITOLO
2.1
2 .2
2.3
2 .4
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
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.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
--~-
-=-- -_
SOMMARIO
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
6.3
6.4
6.5
CAPITOLO
7.1
SOMMARIO
Vl
8.1
CAPITOLO
SOMMl\RJO
11. I
11.2
11.3
C APITOLO
12.1
I 0: LE STRUTTURE,
349
ln rrod~one
10.1
10.2
10.3
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 :
9.2
Vll
I 2:
41 I
U.2
12.3
12.4
12.5
12.6
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:
463
Typedef.......................................................................................................... 354
Esempio: simulazione di un. mescolatore e distributore di carre
13.5
13.6
L0.8
Le un.ioni .. ..................................................................................................... 3 57
L0.9
Gli operatori bicwise ...................................................................................... 360
10.10 l campi dj bit: ................................................................................................ 368
13.7
1 3.8
13.9
10.4
10.5
1.0.6
L0 .7
13.1
13.2
13.3
13.4
./ . , ......).,. .
~'f~1, :~
~~-
Vili
SOMMARJO
14.1
1!2
\;.
A. l
A.2
A.3
APPENDICE
B. l
~.2
B~
.~
8B ~
B:7
818
B.9
B.10
B.l l
B.12
B.13
B.14
:~:[~:.::::::::::::::::::::::::~::::::::::::::::::::::'.::::::::::::::::::::::::::::::::::::::::'.::'.:'.:::::::: ;!~
543
SOMMARIO
. ~ }iH
.\;'.:~~'
. . . . .~~ID,
,~ .... ,
"i'. .
'.Cj l;~,\>'
A PPENDICE
A PPENDICE
E. I
E.2
E.3
E.4
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.
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-
.110 il mondo del lavoro. Turro quesro aumenta notevolmente il I.oro entusiasmo nei confronci del
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.
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
PREFAZIONE
Xlii
Consigli e suggerimenti
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
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
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.
~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:'
C .. ,
sia tn gra
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~
XJV
PREFAZIONE
Esercizi di autovalutazione
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.
Esercizi
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.
::-:::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.
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
eu
' 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
1.1
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:
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
!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,
l.2
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
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
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
1.5
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
dl
CAPITOLO
1.6
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
..
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
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-
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
~=-\:] \: .'] ~
lf>;,911't+t. ~
..~,; ,t.
r>..}1
1.8
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.
1.9
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'
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
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.
Jl
Il linker carica in
memoria il
programma
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.
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
1.12
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).
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
e+ +
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
Esercizi di autovalutazione
Esercizi
1.1
J .3
staro il _____
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
-
15
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
1.,7
e-
17
CAPITO LO
Obietti vi
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
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
/*
ma i n()
{
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
Welcome to Cl
\t
\r
\a
\\
Figura 2. 1
\'
, ~
La riga
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
l(2J
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 .
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
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
printf('Welcome\nto\nCl\n');
}
Welcome
to
e1
Figura 2.4
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.
/* 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()
{
/ * dichiaraiJ.oni */
/"
/*
I*
/*
return 0;
EntFer f irst
inte~er
45
ma in()
Figura 2 .5
Wel oome to Cl
Figura 2.3
~1
prompt */
l egge un intero */
prmpt */
legge un intero */
1~ a~seBnamento della somma 'I
t visualiz.z.a la somma t
'
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
abiNtdine 2.8
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
mimtsc~la
(per
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
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
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.
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.
sum
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.
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
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
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.
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
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
&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;
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
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
..
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 .
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
( )
*, I o
Molciplicari_ooe
Divisione
Modulo
9s
o.
Addizione
Sottrazione
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:
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
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.
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)
~ 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.
2.6
33
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).
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.'
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.
$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 <=.
Figura ;2.11
Va!ut~ione 'd
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
~ 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);
return 0;
\d\n~,
a fs
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()
{
22 is greater than 12
yo~
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.
37
fl1tsso di controllo.
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
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)
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.
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
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
2.4
a)
b)
e)
d)
e)
f)
2.5
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
i f (C < 7);
39
thisisasuperduperlongname1234567
thisisasuperduperlongname1234568
I)
a)
b)
c)
d)
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
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.
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)
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)
b)
e)
d)
e)
j)
2.8
2.9
(X:
y);
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 .
Esercizi
~)
41
2. 13
Quale delle seguenri istrniioni C, se ce n' una, contiene delle variabili coinvolte in Ltna lemmi
d.isrrutciv:'I?
2. 14 Oarn l'equazione y =
per quesca equazione?
a.~
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
A p
p
p
JJ
J
J
J
JJJJJJJ
tdJUhi)
D
O
D
D
D
I>
mllO
A'Vrage iw i.e
Product .i8 4914
Slllallest :ts 13
'Laf&est fs:Zl
,,*
*
,.*
*
,. .,
il'
llfllt
2.22
il'i-
..
...
!/t
......,..
...
"'
** *
.. .. ,.,., .
1*
"*
"* *
...
...
* *
lil"* it
*"'
:jl
.....
*"'*
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
~;~ Il*
2.28
Discinguerc era i termini errore fatale ed errore non farale. Perch pouesce
preferire di incorrere
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:
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
100;0
ESsere io grado di ufiHzzare le stmmue d.i selezione ife i f I else, per selerioun.re le
azioni.
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
Considerate l'algoritmo "al7.ari e briUa" adorrato da un giovane dirigeme per alzarsi dal
lerco e andare a lavorare:
46
C APITOLO
3.3
Lo pseudocodice
47
3.4
Le strutture di controllo
~1
48
CAPITOLO 3
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
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
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.
nel
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
/!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
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.
51
progra~". i?.. d1fh~ile leggere un programma che non obbedisca in modo uniforme alle
convenzioni di spaz1arura.
falso
Figura 3.2
vero
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''
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.
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
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.
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
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
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)
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
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).
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
Erro.rf! tipico 3. i
~ 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
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.
55
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;
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
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.
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
57
#include <stdio.h>
mai11()
{
I* fase di i nizializ.zaziohe */
total = 0;
counter = 1;
/* fase di chiusura * /
average = total / 10;
prirrtf( "Class average is %d\n, average);
(Cb11tinu11)
CAPITOLO
return 0;
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.
3.9
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,
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:
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
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
'
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
61
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.
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
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) ;
Enter.
EnteP
Entr
Enter
Enter
Enrter
Enter
Enter
En~er
Class
FiguraJ.8
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
75
94
97
88
70
64
83
89
-1
lk2J
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
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);
65
solamente una quanril: prefissata cii spazio; quindi evidente che il valore in virgola
mobile immagazzinato porr essere solranro una approssimazione:.
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
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.
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:
1.
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
67
GAPJ.l'OLO 3
p
t
69
~in,~Tude
<st'di. h>
main()
:Jlt&
passes = pas-ses
else
failures
s'~de nt
faill:ll"~!J);
1111.d~bi/e
k rdarive espre"SS.i0ni.
Per
dove opt1,atore. sia un.o degli ope',ra:tori binar.i +, - , *, / o % ( a.Itri cli cui discuteremo nel
fili~e t'
~1
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
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
1i
t ;:G'l;i 0 r:i
Ra .1:5"eJ
+ 1;
= failures + 1;
= student +
P,-SS.eCl 9
P&fle,d 1'
irit passs
r'..sUlt (1<="~8:SS,~"ll;l;;f:ail) :
-=
6, g
= g
'
10 a e
ae
2 a 'f
3
a g
70
CAPITOLO
JJ. programma visualizzer il valore di e prima e dopo l'utilizzo deJl'pperatore ++. I.;pperatore di decremento ( - ) funziona in modo simile.
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",
Spiegazione
++
++a
++
a++
-b
b-
t +c);
return 0;
5
5
6
fi
Figura 3. 13 Mostrare la differenza tra il preincremento e l postincremenco.
~
1, 1
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
73
Esercizi di autovalutazione
passes++;
failures++;
student++;
3.1
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
3.2
-=. :::,
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
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?
Turri i programmi possono essere seri rei in termini di rre srrmrure cli conrrollo: ----~
-----e-----
+t
a)
3.4
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
3,5
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
a) while (e
<= 5) {
product
++e;
= e;
3.6
3.10
3.7
while (z >= 0)
sum += z;
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
main()
int x,y,i,power;
i
=, ;
power " 1;
scanf("%d 11 , &x) ;
sc.anf( '%ci ", &y);
while (i<=
e) total -= -x;
f) total += i;<- ;
g) q 9s= divisor;
q = q % divisor;
power
++i;
y) {
x;
printf(''od', power);
return 0;
=, i
pOl'1er
g)
3.4
l.
power = x;
y++;
i.f (y < x)
z = x++ + 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
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.
"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;
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
b) int x = 1, total;
While (X <= 10) {
total += x;
;+x;
++x;
d) while ( y
> 0) {
pr.iiltf( ''t!d\n, y);
-Hy;
}
3.11
3.13
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
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
days I 365
10000...00
= principal
precedente.
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
100
Account:
Credit limlt: 5500. 00
5894.78
Balance:
Ctedi.t Limi-t:E seeJJed.
to ene >:
i nter.est
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
salcy is S390. 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
CAPITOLO
80
int oount = 1;
3. 2~
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:
.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
'++++++++");
++count;
return
3.30
~;
<sttjio.h>
ma.in()
{
111t row = 10, column;
-=;
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
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)
e1Se
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
[
b) Assumendo x
e) Assumendo x
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
16, 32, 64, eec. Il vostro ciclo non dovr J.lll!:i terminare (dovrcce insomma cre-.t.re un ciclo infnico).
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,
.. . . . "
..
"* " "" * "' .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
l1
CAPITOLO
come segue:
n!
=11 ...(11- 1
11!
1)
~11-
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!
O).
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
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* inizializzazione *I
1~
condizione di iterazione */
/* increment o * /
= 1;
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
return 0;
,_
2.
a
4
5
6
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
istruzione eseguibile.
= 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 ).
Normalmente, i prograrnmamri C renderebbero pi c0nciso il programma della Figuwhil (++counter <= 10)
printt c%d\n", counter);
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
Fate' ~:ientrare con degli spr1.zi e.delle tabul.azioni le istruzioni nel corpodi ogn.111111 delle
stnttture. di controllo.
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.
for
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++)
Figura 4.2
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
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
parola chiave
Figura 4.3
1;
counter
Valore iniziale
dell .variabile
di controllo
<=
counter++)
10;
Incremento
della variabile
di controllo
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:
espressione] ;
while (espressione2)
istruzione
esprmmd;
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.
91
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
* Yi
+= y I X)
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.
92
CAPITOLO 4
93
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
>--
Figura 4.4
printf(.%d,
-.i count er);
counter++
Increment a la
variabile di
ma in ()
{
int sum
controllo
number;
<= 100 ;
number
+= 2)
a)
= 0,
r et urn 0;
}
sum is 2 550
for
c)
1; i -)
_Far variare
tor (i = 7; i
<= 77; i
+= 7)
e)
= 20;
i >= 2; i = 2)
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
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)
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
,.
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
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
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;
for
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
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
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
~Tade
= get<::har ()
) J; EOF)
96
CAllJT()LO
97
main ()
{
retur-n 0;
int grade;
int acount
dCount
0, cCount ;: 0,
0;
0, bCount
0 , fCount
A
B
switch (grade)
!:
aI
I b I:
EOF) {
.,
e
E
D maiuscola
o una d minuscola */
..
.,
case
I*
Figura 4.7
D
F
gnor~.
br~ak;
default:
/* intercetta tutti gli altri caratteri */
pri ntf ( 1 rncorrect letter grade ent ered. ");
printf( " Enter a new grade. \n")~
break;
}
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
(\e)
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.
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;
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
Le combinazioni di tasti per immettere EOF (fine del file) dipendono dal sistema.
<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
. 100
CAPITOL04
Il diagramma cli flusso rende eviderue che ogni istruzione break, alla fine cli un case,
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.
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.
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.
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
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,
103
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
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
vero
o
Figura 4. 1O La struttura di iterazione do / while.
4. 9
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
105
o DEL JIROGltAMMA
con~inue
x;
i f (x -
5)
continue;
printf("%d
x);
struttu~a
for */
main ()
{
int
1 2 3 4 6 7 B 9 10
Used continue to skip printing the value 5
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
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.
, 2 3 4
io~
at x
=:
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
~siturarci <::he
==
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
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
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.
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}:
$.
.
/
cl.iversq da zero
diverso da z.ero
>"' 90
Cwrro1.04
108
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
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)
!espressione
ma
= 4)
printf('You get a bonus!");
it (payCode
diverso da z:ero
Operatori
Associativit
Tipo
( )
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
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~
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!
<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
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.
11 2
CAP1T01.0
113
L-~--' ',
''
ti
''
''
Regola 3
',,
''
''
''
\~
r-------------- --------------,
I
I
I
I
I
I
,,
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
-------- ---,'
'----------- -- ---~---
;:.
I
I
I
I
___________ _
.___
I
'
...
:I
II
I
I
I,
,---- ------ ----- ----- -- --- , I
-------------II'
elementare.
'
,''
'
------------------------,------I
I
I
iI
'
I
I
'
'
,,
I
I
Regola 3
,I
''
'
Regola 3
I
I
'
I
I
'I
I
I
I
I
I
- - - - -----~ ---
-------------'
I
I
I
114
WPITOL04
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
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.
sequenza
srrurcura if (selez.ione)
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:.
Esercizi di autovalutazione
4. 1
____
11 6
CAPITOLO
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);
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;
<=
333.546372);
333. 546372);
333.546372);
333.546372);
333.546372);
i f (X % 5
0)
printf ( \ n ) ;
else
pnntf("\t");
x++;
}
o
X = 1;
printf("'isd\n', x++l;
else
pr.intf("l\sd\t", x++);
o
X
= 0;
n++) i
99; count
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
1 17
for (x
1; x
<=
20; x++)
+~ 2)
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
= 3; x <= 15; x += 3)
printf("%d\n", x);
~= 2; x = 3)
printf( "%d\n ", x);
4 .7
b) 3, 6, 13, 18, 23
Esercizi
4.5
11 9
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);
}
= .000001;
X <=
printf(~%.7f\n " ,
.0001 j
counter += 2;
While (counter < 100);
<stdio.h>
main()
{
int i, j ,
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
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
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.)
......
*"**
........
ff~~ -.
~~
""1 1
..................
"'*"..
~--
'llw
*......,,. .........
_,.__.. ....... . . . . .
:Jt"**-'fH!r
.,..
(C)
'.lt.t**-"'"'
"'li" *'.fF**c..;"'-***~#A
*'if'if{ii~*
*''*'
.......
~.
-'*
..,. ~
(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
4.20
{A)
Condizione I
Condizionel
o
o
o
diverso da 7.ero
d.ivcso da zero
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
di versQ da zero
diver~ da 1.eco
Condizione I
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
3em
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;
7t=4-.!;1-!_i+i_.!+...
5 7
9 !1
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
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
qu~sta
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.
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.
126
CAPrrorn 5
LEFUN210NI
127
worker 2
worker 3
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
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.
worker 5
+d
t) )i
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
l og(x)
l,og10(X)
log:10(.1 . 0 ) 0 , 0
log10 ( 10. 0.) 1 , 0
lo_g1~ ( 100 . 0) 2,0
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-
ceil(9 .2)
floo r (x )
f .loor (9 . 2 ) 9 , 0
floor (-9 . 8 ) -10,0
p9w(x,
pow( 2 , 7) 128 , 0
pow(9 , . 5) 3.0
fmol(x, y)
#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
.65 ( 0. 0) 1 , 0
ra.ug~tevi.go.norn~tdca di x
t an(0 . 0 ) 0, 0
r1iCl
P.
funzione square
per c1k:'olare j
quadraci
i nt square(int);
main ()
{
i nt X;
u.ri
for (x
r,
10 ; l!<++)
sci uare(x));
= 1j x -=
pri.ntf("%d
int
squ a r~(irit
Y)
,.
returh y .. y;
}
['
16
~li
36
49
64
81
1100
CAPITOLO
130
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 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.
! 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
Inserite una riga vu()ta tra le definizioni di funzione, per separarle e aumentare lo leggibilit
det programma:
printf(''%d
LEFVN7.IONJ
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.
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
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:.
.
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
retu r n 0;
int
srara i.tw0cm~
espressione;
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;;
I"' (1rito'tipQ
= z.;
return max;
}
2~
85 H
Mtttdrllu(ll is: 00
.22.
17 8&
Figura 5.4
*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.
135
L BFVNi.'.IONt
Tipi di dato
Specifiche di conversione
per scanf
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 .
sqrt (4));
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
tipico 5.11
136
CMrro.LO 5
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>
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>
<assert .h>
<ctype.h>
<errno.h>
<float.h>
<limits.h>
<locale.h>
<math.h>
<setjmp.h>
<signal.h>
<stdarg.h>
Spiegazione
Spiegazione
Figura S.6
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-
138
CAJ'ITOLO
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.
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
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.
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.
#include <stdio.h>
#include <stdlib.h>
ma in ()
139
[
Figura 5.7
3
2
2
5
5
14'
randO o/o 6.
ma in ()
{
0,
{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>.
aat
9.6~
10~.
9;74.
11004
11/l~
Figura 5.8
Fre<111ie.n ifl~
1
:2
srand(tme(NULL));
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.
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>
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:
int
i j
unsi~ned
s'eed ;
==
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
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;
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.
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
c0nsec.utivi.
sum
switcf1 (-sum) {
case 1 :. case, 11:
gamest-.;itus = i ;
/~ v~nce
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 */
/* memorfzza
lanc io * /
i l punteggi
1'
i
(continua)
144
CAJ>ITOLO
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
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)
{
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,
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.
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-
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.
7{011 sd:no
neces.silrie?
La parola chiave regster pu essere ucili1.z.ata solo con le variabili con permanenza.
automarica nella memoria.
~ _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
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
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
,.,.
I* prototipo di funzione */
prototipo di funzion e *I
prototipo di funzione *I
void c(void)
{
main ()
printf("global x is %d on exiting
int
= 5;
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~
++x;
printf("local x in a is %d before exiting a\n " , x);
void b(void)
X
X
loC'ai
r;in entering e
10 on exi ting e
X l.S 1
)( l.S
X
)(.
lQbal x in
m~i~
1s
local
Loca!
X);
x);
c\n ~,
++x;
I* variabile globale */
1;
= 50;
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
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
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.
* 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
4! = 4
3!
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
l) (n -2)" ... . 1
*6
= 120
I: valore restituito
154
CAPITOLO
1!
=1
2!
2
6
~!
4!
24
-5 ! = 120
6!
720
7 1 : 5040
40320
8!
9! = 3628l!0
~01 = 3628800
~
Erro1'e tipico 5. I 5
La s.ccie di Fibonacci
o,
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, ...
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()
i nt i;
fibonacci(O) = O
fihona"i(l) = I
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));
5.15.
ogni
156
Ci\l'ITOl.O
L I! ,~UNZI ONI
157
Enter an i nteger: 10
Fibonacci(10) = 55
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
I restitu isc e
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
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.
ru
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?
160
CAPITOLO
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
e _ _ _ __
da randomizwre un programma.
k) Le specifiche di classe di memotht sono
Quickson:
Ricerca lineare
Ricerca binaria
Le orco Regine
Capitolo 7
Gapitolo 8
Cnpitofo 12
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
- - --- 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+
surn(n - 1) ;
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
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');
}
0)
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
164
LlrlTOIO
LEFUNZ.LONr
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.
fabs(13.5)
Esercizi
5.8
2., =- \G;,e~
:0-:g.,.:0
5.5
= fabs(0.0)
x
x
= ceil(0.0l
= fabs(-6.4)
= ceil(-6 .4)
g)
1<
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
d) float ntToFloat(int);
5.6
a)
= 0;
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);
un
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
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
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
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
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
,.
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
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.
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
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
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.
172
CAPITOLO
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 /
5.45
S.46
tra
f * definizione d funzione .. f
d) float y = 123.45678 ;
int
main()
{
Xj
X = y;
printf("%f\n", (float)
ilit :;
if ((e = getchar()) l= EOF) {
~);
maiin o;
double number;
return 0;
}
5 .47
f)
1nt
sum(urt n)
main()
if (n = 0)
returfl 0;
else
return n + sum(n) ;
i nt x, y;
printf (<.Enter
two i ntegers: .. ) ;
return 0;
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
Introduzione
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
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
177
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
?:
= +=
/= %=
unari
addidvi
ANO logico
da desu a a sinisrra
condiz.ionale
da destra a sinisrra
di ~ssegnarnento
da sinisua a destra
virgola
+=
2;
c[6 ) I 2;
6.3
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
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 ;
I* iniZia:lizza i l vettdre
11
f9r( 1
= 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
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
Dimenticare di inizializ:a.rre gli elememi di tJn vettore qiu1wm debbano essere inizialiZZdri.
= {32 ,
sarebbero aucomacicamente azzeraci. Per esempio, gli clementi del vettore n nella Figura 6.3 potrebbero essere azzeraci con la dichiarazione
int n [ 10] : { 0} ;
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.
s[j]
=2
/* imposta i valori */
+ 2 j;
1
return 0;
}
~Jemenci in[eri. I.:istruziooc nd corpo dcl ciclo for m ;guir iJ calcolo del rotale-
printf('%7d%13d\n ,
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.
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 ()
183
0 ; i <= SIZE - 1; i H)
total += a[il;
f0 r (i
Figura 6.6
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 ;
}
1:
Rating
1
2
3
4
5
6
7
8
9
10
Fr equency
~
2
2
2
5
11
5
~
Obiettivo efficienza 6 1
~1
Figura 6.7
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
i~tog rammi
185
VETTORI
Figura 6.8
11
9
13
5
17
1
Histogram
..,.~
***
"'***-**lt.***'*****
.........*'..
,,. **.'I*~~-
**-** ..****
**'******":*:***
"'****
"
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()
srand(~ime(NULL));
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
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',
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
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()
~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;
creer un vecrore cli caratterj io grado di immagazzinare una stringa di 19 caratteri olrre a
quello nullo di terminazione. I.:isrruzione
~canf ( "%s",
(etmtimUJ)
188
CAPITOLO 6
189
str~ngt
He l 1 o
I vrnoru
char~cters
s:
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.
st'at i c int a [ 3] ;
int i;
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));
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};
0[i]) j
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++)
= %d
i, ali) += 5);
(continua)
190
WffbL06
'PraY,ll!l.fl.J = 1 arl?a,y;2[1 l
V~I11~s
=~
arr.ay2t~l ~ r4
al"r-ay2r0r=
Valffes S:R
~PPQ.V<1 !0]
.on
= -~.
,e!5!,~~ng
'2J
Liil
'aPra$2~tJ
"'!:
2 ~pr~~~1'2l : ~
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.
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-:
Va1ueis
] VEJITORL
='
char array[5J;
pd.ntf ( lo
array, &array[0]);
Figura 6.1 I I v~ttari. statici saranno azzerati _automatic;llTieme; qualora non siano.stati
return 0;
6.5
~rra,y =-
&arr~~(0J
FFF0
=- Fi:F..0
~ Ingegnm,ia.del software 62
modi'fyMray(hourlyTemperatures, 24-) i
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
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
int
!?iz~)
192
CAPITOLO
J vrri-roru
f ar
int j;
1~ s~ mbra
main()
{
int a[SIZE]
int i;
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 */
void modifyElement(int e)
{
0
The
ar.:
4. 6
Effects of
pas~ing
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.
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
6.6
ma i n ()
{
i nt a [ ] = {10 , 20,
~0} ;
b[ 0) /= 2
r= 2'
b[2] != 2'
b( 11
}
'
.,.,
I* e r ro re */
I* e rro re
/* erro r e
b [])
/*
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()
{
6~ ,
45, 37};
(a>ntinua)
196
CAPITOLO
1;
a[i]~a (i+1J;
/* passaggi I
1; pass++-)
/ * 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
a[i + 11
ite~s
in original order
4
1e
12
89
68
45"
~1
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-
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;
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
l vrrrol\I
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 ()
{
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
mean(response);
median(response);
mode(frequency, response);
return 0;
j t+)
2' ' 5
v~id
bubbleSort(int a[))
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
for ( j
0;
<:=
SIZE
2j
j++)
if (a [ j J
}
}
1t1t* *"".
5 ');
far ( j
int j , total = 0;
0 J
int j;
for
(j
0;
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. $ ~
tB88~~88881&BaBB~J$
::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 ~
~ .~ ~,
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
:'"*'*"'*'***
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
6~8
202
CAPITOL 6
= 0; x
=2 *
x;
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)
{
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.
for (x
1; n++)
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
! VETIORl
205
int i;
int binarySearch(int [], int, int, int);
void printHeader(void);
void printRow(int [], int, int, int);
printf("\nSubscripts : \n");
main()
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;
}
printf ( "\n");
while (low <= hgh) {
middle = (low + high) I 2;
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
16
return 1;
118
22 24
24
28
26 28
26" 28
24~
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
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
Enter
Indice riga
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.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.
PtJ,te rifiiripw,zto afl'elernento a [x) (y] dittna matrice usane/a la forma scnnma af x, y) .
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
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
int array1[2][3J
array2{2)[3)
array3[2) [3)
a r~ : \ n ");
r etu r n 0;
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.
<= 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
~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
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;
/* Esempio di matrice */
return highGrade;
main()
int i, tota! = 0;
int studen t,
studentGrades[STUDE~TS]( E XAMS]
,.
int i
j;
(0]
( 1]
[2]
[ 3] ")i
return 0;
}
(continua)
,.
11
212
2 13
CAPITOLO 6
Th~
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
63
6A
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]
_ _ _ __
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 )
6}, {5}};
= {{1 ,
'I
b[i] = l i
d) llwcl.Ude <stdio.h >;
e) Assume teint a[21[2]
a( 1, 1J .. 5;
l'ourpur.
214
CAPITOLO
f VETl'ORl
6.5
6.1
6.2
6.3
a)
b)
e)
d)
e)
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
tor
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
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
~~~~~--
216
CAJ 1TOLO 6
1
I VEJTQIU
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
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
nt wllatisThis(int I J, int) i
main()
{
218
CArrrm.o 6
printf( "Tota.i ot array elemeht values is %d\ n" , total);
ret urn 0;
}
it (size
1)
return bl0J;
else
ret urn b [ size 1 ] + whatlSThis:(b 1 size . 1 ) ;
6.18
sm 10
int a[SfZE} = {32, 27, 64, 18, 95 , 14, 90 , 70, 60, 37};
someFunction(a, SIZf) ;
printt ( ' \n" ) ;
return 0 ;
voia SOl!leFunotion ( int b rI ' int size)
{
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
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:
lldefine
J VETIORl
' .
Figura 6.23 I 36 possib1h
n sultatr del lancio d1 due dadi.
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
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
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.
.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];
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.
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
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
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
228
CAPITOL O
I puntarori, come ogni altra variabile) devono essere dichiarati prima di poter essere utilizzati. La dichiarazione
I PUNTATO RJ
229
'
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
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.
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.
7 .3
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
CAPI TOLO
230
Ii
7.4
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
In
of a is FFF4
and
&
Ope rato ri
( ) [
o1:t\e~.
'
Figu ra 7 .4
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
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
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
++
--
* & (tipo )
--
1=
&&
I I
I I
?:
+=
---
*= /= %=
Figu ra 7 .S
unar i
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
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;
int numbe r = s;
number
ri~eve la chiamata:
r;:-=-~-:---=----~~~~~~~
number
main()
c ub eByValue
int cubeByValue(int n)
{
return n * n " n .
= cubeByValue(n umber);
'
Dopo
main()
{
int number
ntimber
main()
= 5;
number
125
return
= cube6yValue(number);
0 * n Ji
n
int number
n)
= 5;
Dopo
1
'
number);
return 0;
main()
number
int number
*nPtr
= 5
I
ma i n:
125
return n n n.J
cubeByValue
restituisce l valore al
indefinita
Dopo
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
r et urn n
indefinita
234
CAPITOLO
number
i nt number = s;
235
main()
J-pNTATORl
n Pt r
cu beByReference e
indefinita
*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;
*nPtr
cubeByReference(&number);
}
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.
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.
number
ma in ()
{
int number : 5;
125
nPtr = *nPtr
~nPtr
*nPtr;
cubeByRefarence(&number);
nPtr
~
Figura 7.9
..;..
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.
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 ()
{
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;
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.
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
...
.. . ,,
,
*/
237
I PUNTA'"IORJ
'1,
wh ile (*s
1~
'\ 0 ') {
<=
' z')
}
}
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.
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.
*/
main()
{
cha r string [ ]
main ()
{
int Yi
f(&y);
return 0;
);
~oid f
for ( ; *s != \ 0
putchar ( *s) i
1
;
s++~
/* nessuna inizializzazione */
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
= 100;
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
*/
m~in()
int X = 5, Yi
cons t int *co nst ptr = &x,
*ptr = 7;
ptr = &y ;
retu rn 0;
}
ru
241
I P9NT ATORI
'
7 .6
main ()
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
'
24 2
CA PITOLO
int temp;
lo stesso pre ciso effe tto sar o tten uto inse rei1do le istr uzi oni
..
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
int i, a[SIZE]
int pas s, j;
vo id swap (in t * , int *) ;
for (pa ss
for
(j -
2
I
l:
10
12
68
89
45
37
I'
Fgura 7. I S
.8
10
12
45
3.7
68
89
_.
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
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
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 ++ )
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.
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:
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 ;
11
1
ret urn 0 ;
Le variabili globali vio/,ano ilprincipio del minimo privilegio e sono un esempio di una
scadente progettazione del software.
..
_ ......:..::.;
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 .
247
I Pl'lITATORJ
locazione
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
'
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) =
~
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.
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]
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)
"
vPtr = v;
vPtr = &v [ 0] ;
248
CAPITOLO
I .PUNT ATORJ
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++;
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
7.8
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.
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.
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]
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.
*(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.
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.
,
+- 3
non sar vaJida., perch tenter di modificare il valore del nome del vettore con l'aritn1etica
dei puntatori.
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.
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 */
offs~t});
r eturn 0;
}
{continua)
CAPITOLO
b[0] = 10
b(1]
20
b[2)
30
b(3]
40
=
=
main()
{
= 19
= 20;
*'(b + 1)
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
"
'
Pointer/offset. notation
253
PUNTAT ORI
(bPtr + I) \t
*(bPtr + 11 =ai
* (bPtr +. 2) = 4r
...
int i;
*( bPtr + , 3) = 4@ ,
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.
'
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]
254
CArrl'OLo 7
..
I I
I I .
suit[0]
suit[1J
H'
'e'
'a'
' m'
~+-/---1~1 , e , ,1 ,
,u,
,b ,
..
I I
suit[3]
'r '
;=::::::;
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
'
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
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.
"b .,~
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.
Procediamo ora con il processo top-down per raffinamen ti successivi. U top sar sern p licem en ce
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).
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
1 1 pass++)
1)))
1
void swap(int *element1Ptr 1 int *element2Ptr)
int}} ;
int temp;
temp = *element1Ptr;
*element1Ptr = *element2Ptr;
*e1ement2Ptr = temp;
main(}
{
51. ze
26 1
J PUNTATORI
return
< a;
if (.arder== 1) {
Figura 7 .26 Programma di ordinamento polivalente che utilizza dei puntatori a funzioni.
return b
a;
,
}
else {
bubble(a, SIZE, descending);
printf( "\ nOata items in descending order \ nM};
>
I
I
88
45
37
68
45
37
12
10
262
CAr>Jl' OLO
263
I PUN1"A"f01?.l
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
(*)
(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 ) ;
main ( )
if fcompare(work[coun t] ,
wor~[count
+ 1]))
{
p ri ntf( ~ You
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:
(cor1tini1a}
264
C APffOLO
265
}PUNTATORI
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?
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
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
a) ++-z:Pt r;
b) / "' usa un puntatore per ottenere i l primo valore del vett ore * I
number =zPtrj
266
CA PIT OL O
J PUNTATORI
26 7
b)
7.3
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;
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.
e)
f)
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 ?
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
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
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
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.
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
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.
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.
-.
Operazioni arit1l1etiche:
#def i ne ADD 30
#defi ne SUBTRACT 31
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).
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
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
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
+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)
***
02 ? +2009
03? +311 0
04 ? +4107
05? +1109
06 ? ~43 00
07 ? +11 10
08 ? +4300
09 ? +0000
10 ? +0000
11 ? -99999
'
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
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
+
.............. .................... ....
~
V. . .
. ....
.. .
se ~ +ea eeee
0180
= operand;
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;
#include <stdio.h>
b ) float *realPtr;
long integerPtr;
integerptr = realptr;
o) int * x, Yi
X =y;
main()
{
f) float x = 19.34;
f loat xptr = &x;
g) char *s;
for ( ; s1 =*s2; s1 ++, s2++)
/*istruzione vuota ~1
}
7.22
'
qu~o
programma?
#include <stdio.h>
int mystery2(const char
~}i
I
main()
{
char string[80);
int X = 0j
far ( ; s I= '\0
++x;
return x;
st+)
(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
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
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
.
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 :
'
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
main ()
{
8.1
return 0I
1n ques to capi tolo pres ente rem le funz ioni incluse nella libreria Stan dard del C che sem -
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 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
(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 .
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
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
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.
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.
8.3
\
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.
Dovrete includere ilfile di intestazione <ctyp e. h> qualora utilizziate Le funzioni cor1.tenute rzella libreria per La gestione dei caratteri.
CAPITOLO
Prototipo
contrario.
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).
contrario.
contrario.
int iscntrl(int e)
e una
),
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
:
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 .
),
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
Il
.
se
1S " ,
upp erca
. ..
se
1S
upperca
J
J
upp erca se l.S
low erca se 1S
Il
u converted to upperci!se
7 con vert ed t9 upper'Case
$
L
i~
11
1
'
11
11
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
} ;
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
),
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 .
ret urn 0 ;
28 7
CAAATTERl E LE STRTNGHE
main ()
{
11
11
11
11
11
288
C APITO:LO 8
11
11
8.4
Pr ot"tipo di funzione
iscntrl:
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
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;
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
~ 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, '' );
(contint111)
290
CAPITOLO
29 1
CARTIERI E LE ST'R1NGl-IE
Th~
str 1rtg,
~ 99
l.onw
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>
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
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
'
11
,.
Y* Usare strtod
TJle stP'l:.ng
.
" ~,5/
~l\:Vertea
*/
#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
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 */
.do.utl
~irte 5'1
'2''
., a nd th
1-s
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
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;
/* Usare strtol */
11
#include <stdio.h>
#include <stdl i b.h>
main()
long X.
'
char *string
11
8.5
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
else {
reverse(&s[ 1]);
putchar(s[0J);
294
CAPll.OLO
int getchar(void)
Legge il prossimo carattere dallo Standard input e lo restituisce come valo re incero.
Figura 8.12 Le funzioni per i caratteri e le string~e incluse nella librerta per l'input/output
standard.
un carattere di newline.
Prototipo di funzione
int putchar(int e)
ma in ()
main ()
{
char e, sentence[80J;
int i = 0;
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 .
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 .
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
297
~r r a y
s are
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
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
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 */
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);
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.
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
6) ) ;
s1
s2
= Happy
=New
Y~ar
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 .
N~w Ye~r
= Happy
= Happy
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.
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
Figur a 8.20 Le funzioni di confro nto delle string he incluse nella libreri a
per la gestio ne delle stringh e.
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) = -~
I codici nt-tmerici interni usati. per rappresentare i caratteri potrebbero essere diversi st1.i
vari computer.
,.
30 1
CARATIERl E LE STRING HE
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()
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.
ll tipo size_t . u1i sinonimo, dipender1te dalla macchina, per unsigned long o
unsigned int.
Prototipo di funzione
Prototipo di funzione
Figura 8.22 Le funzioni di r icerca contenute nella libreria per la gestione delle stringhe.
This is a test .
/ * Usare strchr /
main ()
char *string = "Th is is a test '
cha r characte r1 = 'a ' 1 character2
1
= ' z';
303
CARA'l'l'ERJ E LE STRJNGHE
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
tne
Of
/ * Usare strcspn */
main()
{
gramJI13. della Figura 8.26 ricercher l'ultima occorrenza dd carattere 'z' nella stringa "A
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
= ~A
/* Usare strpbrk * /
#include <stdio.h>
#include <string .h>
/* Usare strspn */
#includ <stdio . h>
#include <string . h>
main()
{
ohar *string1
cha r *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 lengt h of
~ne
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
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.
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 ()
{
'1 This
retur n 0I
}
string 1 = ab~databcdef
strin g2 = def
token Ptr
11
11
);
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
: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 .
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
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
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
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.
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.
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
: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 (]
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
return 0;
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 */
#include <stdio.h>
#include <string.h>
main ()
{
/ * Usare memchr */
11
#include <stdio.h>
jinclude <string. h>
main()
{
char *s
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
.
'
'
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.
/ * 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.
__.
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[]
main()
{
{conti.nua)
312
CAPJTOLO
%s \ nu, string1 ) ;
printf (" string1 after memset = %s \ n'' ,
memset{string1, ' b' , 7));
ret urn 0;
313
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
..
s-tring1 = 88BB81m8BBBBB8
string1 after memset = bbbbbbbBBBBBBB
#include <stdio.h>
#include <string.h>
ma in ( )
{
11
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.
11
Prototipo di funzione
char *strerror(int errornum)
size_t strlen ( const char *s)
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.
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 * /
Errdr 2
Obiettivo portabilit 8. 4
I messaggi generati da strerror dipendono dal sistema.
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
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
p)
q)
rj
s)
~
u)
v)
w)
8.2
8.4
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 );
1
,
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
Home~);
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) 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.
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
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.
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.
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.
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
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
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
- -
--
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
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.
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.
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
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
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 .
La stringa di controllo del formato descrive il formato dell,outp uc, mentre gli altri argomenti
Indicat ore
di convers ione
Descriz ione
xe X
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
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.
11
11
9 .4
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
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.
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
f
g
oG
1,504582
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 * /
mih ()
{
102
Q uesta notazion e indica che 1 , 504582 mol tiplicato per 10 elevat!o alla seco nda po,,
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
328
CAPl1'0L()
9.6
un errore di si12tassi 11sare degli apici singoliper delimitare le stririghe di caratteri. QJJ,este,
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.
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
n~ della stringa.
Indicatore
di conversion e
J
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.
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
Thi s is a st~ing
Thi s i s "11 stri ng
1ttis i s also ' atring
Descrizion e
p
main ( )
I
329
'
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
*/
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
ptr = &x;
printf( "The value of ptr is %p\ n'' , ptr);
printf( ' The address of x is %p\ n\ n'' , &x);
ma,in ()
{
11
Printing a %- in a
Figura 9.7
9.8
fQ~~at
contro! string
-1);
-12 ) ;
123 ) ;
-1234 ) ;
-12345);
-
return 0;
}
11
28
33 1
12.
123
1234
12345
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
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
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)
+ (segno pi)
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.
..
123.9451.239e+02
124
Happy BirtlY
quelli negativi.
presision f or strings
e a
Using
0 {zero)
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.
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
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.
CAPT"fOLO 9
334
335
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 * /
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
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
'
11
-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 >
+.
main( )
{
...
11
}
"'f-00 080 452
547
-54 7
000000452
Fig ura 9.1 5 Util izza re li flag 0 (zer o).
336
CAPITOLO
Sequenza
di escape
\
Descrizione
VJS11alizza il carattere apice singolo ( ' ).
\ n
\?
\\
\a
\b
\f
\n
\r
\t
\V
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.
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:
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.
dati a fronte di
t1r1a
singola richiesta.
Descrizione
Interi
d
Legge un incero decimale con o senza segno. Cargomento corrispondente un puntatore a un intero.
senza segno.
a un intero
Legge un u1cero decimale senza segno. I..:argomenro corrispondente w1 puntatore a un u1tero senza segno.
xoX
Caratteri e stringhe
e
337
(continua)
338
CAPTTOLO
Indicatori
di conversione
339
L\ FORMATfAZJONE DELL'INPUT/OUTPUT
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.
vari
);
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
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 .
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
'
char x, y[9 ) ;
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.
}
,
in9ut .was :
th character s ano
"' unelay.
stri'ng
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.
#include <stdio.h>
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
#include <stdio.h>
main()
{
main ()
char z[9];
ii
11
irtt x, y;
) ;
11
%s \
11
n" , z ) ;
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
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.
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.
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') ;
Esercizi di autovalutazione
9.1
conversio
ne
o _ _ _ _ _.
343
9.3
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.
Esercizi
9.4
9.1
9.2
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
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 ) ;
~
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
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
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.
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
Obiettivi
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").
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
:
(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.
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 uc t car d {
cha r *fa ce;
cha r *s uit ;
} a, dec k[5 2], *c Ptr ;
351
I'
e
ttur
stru
le
tare
Confron
lineamento sui vari sistemi.
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
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
352
LE STRU1"1 URE
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.
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~
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.
353
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
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,
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.
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
>
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
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
CAPITOLO 10
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 ' );
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
.
i nt i
'
357
>
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
'
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.
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
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
un errore logico usare un tipo di dato inadeguato, perfar riferimento a un membro definito
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
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 */
main ()
{
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:
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:
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
(continua)
CAPITOLO
36 0
10
LE STRU'l' l'URE,
Op era tor e
,
100
int :
flo at: 0.000000
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
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
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
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
un signe d c, displayMask
=1
363
10
<< 15;
#incl ude <st dio.h >
printf ("%7 u
= ",
value );
void displ ayBi ts (unsi g ned );
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);
= i11 .l 1101
: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);
Bit2
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& .
retur n 0;
}
1 << 15;
(continua)
364
CAPil"O LO
1o
: '0' };
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 )
');
putchar( '
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
= 00000000
The one s
21845
~1901100
co~plement
= 01010101
'
of
01010101
is
43690 ~ 10101010 10101010
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).
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
~hift
operator << is
main()
sia negativo o sia maggiore del numero di bit in cui immagazzinato /'operando di
sinistra.
unsigned number1
= 960;
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.
&=
unsigned c, displayMask
printf( "%7u
1 << 15;
val ue);
= ",
putchar( ' \ n
0)
,_
,"'-
<<=-
>>=
1ipo
da sinistra a destra
massima
) ;
AssociatMt
() [ 1 .
->
++ -- I
(tipo )
&
* -
unario
);
* I
da si nistra a desrra
moltiplicativo
da sinisrra a desrra
additivo
CAPtTOLO
368
10
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
<< >>
relaz.ionale
ugua glian za
&
da oSinistra a dest ra
AN D bitw ise
,..
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.
&&
AN D logi co
I I
OR logico
da desa a a sinistra
virg ola
<
--
<= >
>=
1=
I
I
I I
?:
=
+= = *= I=
%= &=
'
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
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.
Card deck [ 52 J;
retu rn 0;
}
int i,
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
371
uns igned b : 4;
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.
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 ;
};
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
1
1
1
1
2
2 ectlor: 1
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
11
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
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
inco mi11ciano da 0, sempre che non sia stato diversam e11te speificato, e so no inc rementati di 1 . Per ese mpio, !,enumerazio ne
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:
373
1
2
3
4
5
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
Esercizi di autovalutazione
10. l
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 * /
<=
DEC; month++)
- - - - - -
CAPITOLO 10
374
P = e;
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
10.3
a) st ruct part {
int partNumber;
char partName[25J;
};
b~
e)
d)
e)
f)
g)
V=-
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.
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
{1.2 7}j
Esercizi
d) stru ct pers on {
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;
'
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
= &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.
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.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
CAPI TOLO
11
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);
return 0;
}
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.
return mult;
}
11.2
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 .
,..
unsigned x;
''
81
:380
sand9 i ~atteri e uccessivamente questi saranno -ges iri ed e1~tb r;a i dai computei
I I
Green
I I
j oran~e I
I Sally I
~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
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
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,
u 1d y
01'001010
Campo
Byte (Carattere ASCII J)
f;"{r.
1
Bit
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)'
'
'
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 ] ;
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"
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.
"%fj
a,oce.unt,.
prir1jtf ( "? ,, } ;
s:ca nf ( 11 %dc%s~.f '1 1 &.act;;oun t 1 na.me, &~bilan e}
ret urn
0 :
o:e~r Un ~mplice
-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
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
))
==
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.
11
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.
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 .
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.
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
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
'
(D
cf Ptr
11
11
11
1
I
II
I
I
I
"
2
3
4
5
., '" 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) .
Aprire uv. file irt scritt/r4J quartdo non >pi pr:izio disponibile sul disco. La Pgu.ra 1-1. 6
:allFC B.
Questo ingresso
.
. - dall FCB_al d1s<::o
-- .
c;:op1ato
quando Ufile v.!ene
-
que_sta
fprint(efP =tr~
11
n:ame1. ba.lance);
,,
I
,,
I
I
I
I
),
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:
) ;
'
n.o
_ ~
7TQ_NE
mT ....
T~ , .EaLf"i.r!
>'\.,/_A-iLLJ:
-- ':o
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
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+
rea un file per i'aggiomamenco. Nel. caso in ie:ui il file esist gi,, n elimine
r il cor1tenuto crr~nt.
a+
tJ,n
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
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
retur n 0 ;
11
%d%s%-f
11
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);
%,d%s%f ii
11
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.
i dati di
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.
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.
w;
main ()
{
ma in ()
in:t ac_count ;
char :n .a.rne[3 0];
if ((cfP tr:
= punt.a tore
fopen{~clients . d~t~~
11
"r
11
== NULL)
))
el se {
~rintf( ~ Enter
e.lse {
print:f ( '%.-10s.%- 13s%s \ n
11
11
,,
"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
'
11
a-
brea.k ;
4 - End of run\n?
soanf(~d, &req uest);
~
balances\n~
Il )
'
r ewind ( cfPtr );
p r n t f ( 11 \ n ?. u ) ;,
se anf ( %d
& re ques t ) ;
!= 4) {
11
ti
'
case 1:
print f("\nA ccou nts with zer">o bal:anc.s: \nu);
wh~le
f c .l 9$e ( cf Pt r)
11
};
return 0;
0')
==-
11
i f ( balan c.e
11
%d%s%f
11
br eak;
case 2 :
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" ) ;
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
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
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.
>
" -
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.
,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,
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.
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
-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
ta a
struct olientD.a ta {
int acotNum;
oh~r lastName[15];
char firstName[i0];
f loat balanc e;
};
-~
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};
if ( ('cfPtr
V*
uh
esempio di esecuzione.
);
else {
Struct clientData {
for (i= 1; i<; 100; i++)
fwrite{&blankGlien t,
size of ( struct cli_entDat a), ~,
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
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
))
=== NULL),
);
'
&client.acctNum);
while (client.acctNum != 0) {
11
(continu4)
fseK(cfPt rJ (clierrf.~c.tNum ~ 1)
s:E-EK_SET:);
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
I: istri.izione
fse:ek(cfPtr 1
e
-
, , 'I!!
'
Figura 11. 14
int fseek(Fl LE
*stream~
cl:o.ve offset .il n.um.ero di byte .dalla posizoJie whence nel_file puatato .da stre.am.
.ne ~Qri:ente .dei file; mentre 81:.EK_EN'D indica che la ;i;icerca i. nizi~r dalla fine del file.
3. 9.9
CAJ>rrot 0 11
.
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
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
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
main ( ):
{
FILE 1rofPtr;
s:t ruct .clientDa:t . .a client
'
.
-
not
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
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
.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_
CA:PTO tO
11
401
F'I LE * c-f Pt r ;
int choice ;
i .f
r-+ 11
=== NULL)
))
.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:
!= 5) {
c.h ( choioe) {
case 1 ~
textFi l e(cfPt r);
:S\rV'i t
breC:fk;
cas.e 2.:
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)
( H .
Il
Il
-- NULL)
enterChoic~(vQid);
voiCI
textF~e (FILE
' -
m~in
~{
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)
11
CAPITOLO
403
11
if (client.acctNum
0)
printf( Account %d does n()t exist.\n i' ; accountNum);
11
}.
lS;e {
fseek(fPt~,
(accountNum -
1)
* sizeof(struct clientoata),
SEEK_SET) ;.
fclose(writePtr);
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) _,
f re ad (:&c_lie n.t
SEK_SET)~
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) *
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,
11 11
11
i1
0};
4 - delete an account\n
11
5 - end program\n? Il ') "
11
100) : ");
se a nf ( u_:%d 11
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
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
.;;Le)
f prfltf (f F>t.r .1
11
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
casuale~
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
) ;_
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 .
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
11.2
4s.
if ((tfPtr e)'
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):.
get.c o fgetGi
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,
= f p n ( 11 O.l.dmast. d_
a tli ,
11
11
11
11
r ~) ~
fr)
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.
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
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
..
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
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 .
-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
.N'-'mero di conto
e d.e ll'attrezzoNom.
'
. t~'i t'"
Quan
Costo
57. 98
1f/,''
Martello
11 . 9.9
2~
~!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
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~
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
11
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.
'
hU.rfi,e ro
CAPETOLO
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.
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
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
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.
Una
f i-iferimento , a una
la definzion~
struc t node {
int data;
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)~ -
E rr:ore-tipico J.J .1
'
.... -J
---
.Buona
abit'u...din.e 12:1
.
.....
....
'
~Eu.ona
.
abitudin:t1 1.2.2
.
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
p~r
m
,odd
--mentir un accesso immediato a ognuno dei jttoi ciernenti, petc 1 P ~n~Q. Ci~
. t in_ irizzo i questi
;:tr
12.4
co12
m al l.Dc.
fr ee .
st ar tP tr
1'7
29
..
,, ,
--~193N
Obiettivo efficinza i 2~ 4
[i
a1t!~h~i!ao
~ar~ttere .d~la
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
. .
. ..
- ..
,.#~nelu de
st~uct 1i stN od e {
eh.ar .~tata;
~truct
I
/* 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;
-o rzmosso:
i.At is Empty(LISTNODEPTR);
'
(continua)
416
v0~d
C.AJ>ITdLO
417
12
m.ailil (. )
,f
*l
ohar item;
u .
* /
prin tf (: ~ ~l rl ): ;
se a nf ( '~ %1 ~ &e h oi c e ) ;
1
.p~riAtf
Y*
While (Ch oice
1~
3) {
11
);
.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
bre ak;
so an f ( 11 \ n%e 11
malloc(sizeof(LISTNODE))i
11
.);
&item ) ;
whi Ie (c.ur ren tPtr 1.:... NULL && valu e > cur ren t:Ptr ->d ata) {
I* pass a al. ..
*/
I* ... prossimo nod o*/
e_lse
r'
==
els.e
NU'LL ) {
1
*sPtr~
.e ls.e {
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
valu e);
.Pri ntf ( 11 ?
11
) ;
scanf("%d"j &choice) ;
}
if ("vi lue =
(continua)
418
CAPITOLO
t .empPt r
-= * sPt r;
/*
fre e (t.empPt.r );
11
'
el$ e {
= *sP tr;
= (* sPt r) - >-nxtPt r;
'
f r e e ( te mppt r ) .i
ret urn v.al ue ~
ret urn
\.0' ;
--
empty.\'ri\n"')~
els e {
pri ntf ( 0 The 1is t is: \ n 11
wn ile
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
41 9
12
pr i nt f ( 11 NULL \ n \ n 11
) ;:
}
}
420
421
CAPTTOLo 12
a)
*- sPtr
currie ntPt r
Figura 12.4
~G>utput
I I
currerttP r
1)
Creare t1n
t~
--
'
I
I
n,e wPtr
[;)
I
I
I
1
C'
ne~Ptr,
'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
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
previo usPt r
cur re ntPtr
f.JLOg~~.
e-
,'
B 'I
_
,,,
,,,_
-----,,.-~---------------~
~~r
tempP
tr
La .funzione
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.
~f~u~t
~rpedef
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 -
*.,
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.~ '(
).
NULL;
1wn,i le ( choic
l = 3) {
(cdrtdnua):
..
CAPlTQLO
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
.
}
StACKNO.Dl:'PTR t emp Pt r ;
in t p.op\ta1ue ;
~
11
fe~ nptr
'
tr ,~e
(te mp Ptr );
,f''e;t ,:t rn pop Val 1:J e ;
bre ak
'
d fa ul t:
"
= *topP tr;
printSt~ck(stackPtr);
"
t::'
"
'
11
'
) .
1{
if
p r .i n t f ( '' ?
sca nf( w%d", &choice) ;
11
( cu~r~ntPt~
==
NULL)
els .e {
~r in tf { ~Th~
st.atk is :\ n'r);
of run. \ n );
Wh ~~ e
ret ur n 0 ;
cu rr ntP t r
/* Vi su ali zz a le
ist~uzioni
= c~rr~ntPtr->nextPtr;
*/
/~ ~La pi la vuo t a? */
In t is~mpty(6TACKNODEPTR
STACKNODEPTA newP t r ;
n~w Ptr = malloc(~izeof(STACKNOOE ));
if ( newPt r ! = .NUL L ) {
n,
r~ tu rn
to pP"t r
::i=
top Pt r)
NU LL ;.
~I
"
426
CAPJTQLO
427
12
]) ~seg_!;lMe *tapPtt a temp Ptr " (t~mp Ptr
-2.J
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
}'11mat~ $ tempPtr.
*t opP.t r
~11 21
.. 1
I 11
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;
. 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
*I
12.6 Le code
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.
s~ruat
queueNode *nextPtr~
t~y.p.e 'def
ty.pe<lfef au:l:UENODE
~ tJ
*' QUEUENOO~PTR
plf@t ot 1p i de 11 e f un z_i o n i * I
pr:t.ntaueu.e ( QUEUENOIJEPTR) ;
~eiel.
m-ali n ()
'
-O
I'
QUEllENO~DEPTR
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;
.(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
), ;
&item );
&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
,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:
break;
i-fr '1 (*h:eaJPtr == NULL)
- ~ta .i:lPtr =
print f (.il'.?
11
NULL ;
);
free('temp Ptr);
r.e'tu rn va_l ue ;
print f(
void
11' The
queue
is:\n 'k);
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;
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
"
,flrlt-pr~
tipic& 12.. 8
-tempPtr
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 .
.
tr /'
.(con;tjn.t/ll)
CAPITO.LO 12
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
in t da t.a;
};
=::
NULL;
.J\
els.e
pri ot f( 11 ~d n t ins ert l. No memory av ail ab l. . \n 11 ,
typed~f
v.,~lu e) ;
i}
e--lse
if (Vlue < {~trePtr)->data)
ins ert No de (& ((* tre eP tr .) -> lef tP tr) , va lue );
else
ma in( )
{
-~
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
V"!Ld
are:\n~):
:n'Order.: (TREENODEPTR
tre e .Ptr.)
11
..
/* vi si ta
,,
*/
printf(~\n\hThe pre Or de r tra ve r$ al is:\n~);
11
if (tr ee Pt r 1: NU U) {
ret ur n 0;
.~ostOrder(treePtt->rightPtr);
pr in ti( 1'%3d 11
if ( *tr e.e Pt r =
NULL.) {
~treePtr
NULL */
}
}
~igy~
438
Mj sm ' e "I" io:di qQdli del sottoalheto destro. La vis
ita aqtiipaxa,
CQ n- p
12
.21 sar~
-
'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
sa.~anno:
6 1i 1~ 3. ~ 48 42 27
esser
6 13 17 27 33 42 48
' .
. ._ 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
~lYn.i.n:ato .
Fi gu ra
12 ~2 I
17
33
48
Eserciz.i d i au to va lu t_a zi on e
ll. 1
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
.
.
.
"'
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
..
,,
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
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
-12.4
definiziooi:
~.truct
char
gradeNode {
ru
lastName[20]~
floa t grade j
l 2. 3
};
typedef struc t
gradeNod~GRADENOOE;
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
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
.
~
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
curre ntPtr -=
a4
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
free(temp~r);
:startP tr
12 ..5
lf-~7 9 ./'.
= ~ ..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.
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:.
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
~a
~e
12.?
1
0
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 . _., , .
: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
Nel ~~Q in cui il arane r: cor.rente di inf ix sia u11 numer, copiatel oeli' elemettto succes-
._
'
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
s,t ackNOCle {
ehiar ,data;
,struc t
$tac~N9de
*nextPtr;
}j
444
CA.PI'! 'OL O
12
aa
. .
.
- 1wLCJ.oru,
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
~levame11ro
e un peratore.
n.10.dulo.
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.
.
s'firtrct
stackNod~
char value)
s~_rut stack.Nde
).;
type-Oef struct
W1
&cra:ri
a po-enza
*nextptr;
stackNode STACKNOOE;
ty;padaf $TACKNODE "'STACKNODEPTR i
Il pm:~a,. dovr essere foi:mato dal m_ain e 'da alrte sei funzioni con. le segu~nti inre~tazioni:
1
R.estituh: il valore tontenuto m cima alla pil, senza estrarlo dalla stssa.
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:
-
.
.
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;..-"'
: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
- {;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
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).
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 .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.
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
Increm-~nJ;;i.te
tota!Sp,a oes di 5.
_ &JJ.~0 110
!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-
~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
.
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
.
-
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~
~'0 rn~111
-~
99
Visu
. . er il valo re di w.
-- alizz
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,
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
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.
e0 let
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
verr
~rrimenti,
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.
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
rem
int symbol;
eha r typ e;
int
.
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
n.:
19c~ tio_
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.'
"
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).
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
ne:ss1tna
a x
00
1.1 .i oput x
5 tem
,._
Verifica Se "J
==
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
+2096
+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
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
+2095
+3098
+2-194
12
+2094
13
+219.5
nessuna
rem ignorata
rem ignorata
58 got o .20
55 ~em visu~.lizz:a il risul tato1 nessuna
15 +1195
se gl!int t
e9 e:nct.
terniina
-- - .- - l'esecuzione
~ig~i;\
1s
+4300
rem ighorata
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
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
5,
00
10
00
Q9
XJ
l5
20
I I
y
25
30,
35
40
04
04
97
09
09
95
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
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
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
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'
~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.-
"
04 +20 98
05 +a:0 9.7
06 +21 98
agg~iunge
40 let t
=t
45 rem.
etc.l o
07 +2'0 96
08 +:30 98
09 +21 96
vs
ness
una.
.
.,
60 .g oto 20
55 rem
1 0
ri~ultato
.40.~1
n,asuna
1' 1 +119S12 +43 00.
.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
rem1gn
.opra
Figt1ra 12.31 Il codice otti miz zat o per Il pro gra mm a della Figura 12.28.
dl
-'
+ 1
35 rem
next
01
r~m1 1gn9r~i
rem ignera.ta
02 +91 99
nessuna
+20'9 8
4Gi 1
hE s~ur .I QRE Pl DA TI
utJ.
_ .
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
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.
~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
<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.
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.
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
* ( 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
#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 =
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;
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
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.
(Y)
(b+ 7) };
":;
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 :
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 .
. .
~~
-467
13
..
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
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
'
. . .. . 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 .
.....
_#_.
t1i 'ftlef
:o'EBUG
,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
#e rro r e #p ra gm a
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.
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
tokcn
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 .
13 .7 Gli operatori # e
##
" #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
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 ) .
-
'?~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~.
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
.
.- 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
--
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~
..
,main()
,r.
~) # b)#eli f
* v_isua lizz.a re
1-3. 2 './r
. -
#els e. -e) #def ine. d.) spazi l?ianchi. e).. #undef . f) #if1d ef , #ifn def. g) CoIDI?ilione
=J.'.J - . _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.
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
b) #d.e fine NO 0
t~
#include 11c:orrmon . hn
d) #Une 3000
e) #f defineq {TRUI;)
#undef lRUE
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
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 .
. 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
. . . ,.<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. --- , . .
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-
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
475
14
Q.rlmer0. variabile di argomenti. Il priJ10 ar.gc1me]Ito di .ave r:a ge sar sempre_ il
file input.~
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
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
$ 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'
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
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
,_
_.
fii,gura 14.1 I tipi di dato e le macro definiti nel fUe di intestazion~e st-da rg . 'h
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~
*/
I4
Su inlti
$istmi D O S
e U N IX in
clouble av er ag e( in t,
il!
,,
m ai n( )
{
doubie w = 37 .5 ,
~ =
2 2. s, y
= 1 . 7 , z = 10 . 2.;
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
re tu rn
}
a
~ nd
-
z l s
$ copy in pu t ou tp ut
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;
doLlble to ta ! - 0
'
in t J. '
va _l is t ap ;,
'
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
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
re tu ,rn 0;
Figura. 14.3
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.
. .
,.
_ '.
;_
flag. ~
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 .
.
.=.
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
...
.
J;
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
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
,,...__
. . -.
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
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 ) {
ma.
p~intf
).;
r.t urn 0;
]f
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.
t Usare
Vbid print(void);
()
'
#include <stdio.h>
.# includ' <::"stdlib. h>
m~in
4 82.
UPlTOLO
-:..
14
ARGOMENTI AVANZATI
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.
~74u
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,;.
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..
Modo
-
~
~
~ -'
stati
scr1tt1.
-
f~
Usare i
f~l
tmparan~i
*/
IJl a.iofl { )r
{
FILE *filePtr,
i 'i t e;,
... n e
.D_escnzro.
*tem~FiiePtr;
ab
rb+
Wbr+
a.b+
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
). ;
( 11 %~", f 'ileName) i
if
11
11
r+ 11
!=
N~LL)
while ( ( e
~ getc(filePt~}
putchar(c);
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 )
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
pri .n tf ( 11 .Unab le t
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
'
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
SiGTERM
SIGF PE
SIGILL
Figura
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
_.,,.
ria:
mo
me
a
deO
ica
am
14.11 _Allo(;azione din
le fun zio ni calloc e realloc
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
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
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-)
{
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
(
11
' .
11
&response);
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)
14.12
==
( i % 10
scanf(~%dd,
&response);
if (res pon se
==
1)
el.s e
exit(EXIT_SUCCESS);
}
ma in( )
{
int i ., x;
1 ~
i<~
100 ; i++ ) {
1 + ran d() % 50;
if (X
==
rai~e
25)
( SI(_INT) ;
~~intf( 11 %4d~,
i);
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 .
che .Prdv~iga
b) Il simbolo
da LlJ1 file.
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.
ma in ( )
{
int cou nt ,. ., 1;
sta rt :
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;
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..
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,
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..
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.
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.
.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
ogni caratter non di spazio. bianco eh.e no n coin cida con ui;:t_o dei '5udcl.e.t ti
11
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
..
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
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:
.
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~ "
\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
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
[]
uno di
E~pressioni
st'ting-letterale
A. I .6 Op era tor i
costnte;
s~q'lf.enm-di-escap.e
++
N1JmerJ de l preproce~so.re
A..2
s-cbar
s;;,;.char:
( )
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
s:rJ.qitenut-q~char;
\ numero-ottale
operatore:
4-95
.e,spresslon;e--di-as~eg-aamento
'
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
esptesswne-di;..uguaglir:t'f!.2J4:
espre~si9 ne ---r~lazio nale
e.sj>re$sion.e-di-uguagliii/nZ = ~sp1fs.sione'-rt.lazionale
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
(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
;
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~
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,-
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
espre~sione-costari.-te
rl,-ichiartre-astratto:
p.un-tat(}re
_
punt4tare0pz dicharatortJ:--artratto-dirtt
.
~pecifiaa-e1:Zum:
( 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'
costq:nt_e:...di-ert-u'ftterazione
co-sta.nte-di-:enu/meraziotie
'
di~iarata:rr:-as.Pratto :...diretto
, dichiaraziotJ,t-di-parametto
utt'JI rt41"
4$tO
.ne-d
. i.~parametrJJ:
specif!-ca-di-tiJl,o elenco-di-spetifiche-qu4lificatoriqpz
'
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
:-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:
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:
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
.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
. -.
-.
,._
"
gruppo-elif
g,rUppi~elifgruP)'iJ-eiif
grttppo-elif:
istruzio.n~
( ~spre-$sione ) istruzi:otze
# el ,i f
else istrUzione
goto identificatore ;
cont i nue ;
~
retu rn espressjone0pz ;
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
-:..
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
# incl ude
APP ENDICE A
# err o r s.ir~b()li=--?P opz. ri.ewti~e
# prag.n1a s-imbolt-PPopz neiJ.Jltne
lpttren:
~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
~~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
NttLL
st at i tipq t;
f-~pressie:ne &
c:cmpo_rtarnenro
..
( t.
d~igpatore-di-merobro)
~ara ind~fnito,
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
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
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
/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
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
espressione~
f .i le
n'Ulficrd
esa<l-e~imale.
'-)1.z, li ne nn.n
Ia. macro assert richiamet~ quindi la funzione abort. Qualora la dir: ~ttiva ,del
p.r~p.roces~ or
appaia in un file s9rgen.te in cui s~ stato incll1S~l asse.r t. h_, rutte le asserzioni del file
B.4
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
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
su
cctris_pondente mait;Lsco1a. S~ la
--
v~tJrl<::a
=--
N'tl'' LL
. . carattere numer1o
. ,.d ec1ma.1e
. ~I .
qu.aJ s1as1
..... -
(~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
"
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
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-
*/
*/
*/
Il Il
*/
li Il
*/
(~ >~
*/
11 ,fl
'ff 1
n 'li f
*I
(< ~
CHAR _MAX *I
CHAR MAX *I
~e
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
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.
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~
"f" .
. J ...
. . .
..o--
..
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
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
r.
. -.ternazi0
-
. nal1;. .
' r~go e 1n
ch ar f. ra c_ di.g it s
e.
da
.
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
,
.
,.
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
.
.,,.,
.. 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:
B~6
M a te m a ti E a
U na costance
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
-
ch ar *nega.t iv e_ si gn
,
'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) ;
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.
t .a n(d oub le X) ;
v~ore ass_
oluto
il
~1;
v a1o r e , in t * e x_p ) ;
*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
B.7
j m.p_b uf
per ripristinar"<~: un
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
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
con test l:
val ore .
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.
B.8
s:Lg - atomic- t
n tipo inte ro
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
tr~ mqdi
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
SIGTE,RM
una-richiesta di
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) ;
:"-
All~i.niiio
clell
esecuzion~
~$:eguit9
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
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
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
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.
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:-
~ 'Ut~L
SEEK- ENO
SET
Espressioni eostanti int~re con valori distinti, adatte all utilizzo co:me trzo argomento
cl:ella
ft1nzion fseek.
-
S~EK
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
511
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
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 (
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
*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.
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+
_ 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+
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
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
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
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
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) ;_
1~. modo
che
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
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
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
indetermi.Ilati
e s'a r restituito
.. . .
.
.
rrore di lettura i contenuti del vettore saranno
un puntatqre null.
verifichi
"
"I
ufi
,...
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
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
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
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~
.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
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
52 2-
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 );
523
APPENDICE B
no n ne-.o"'acivo...
,N~l easo
ch e di m en si o ne
O nmemb
si ze _t_ nmewb,. FI LE
~ ,~tream): ;
s.ucce~so.
iITTt
fg ,$ tp os ( FILC: * s t ream I f P9 9_ t *p os ) ,;
524
525
APPENDICEB
da zeri e immagazziner
i11
dal I tm plen1entaz19,n~ ..
B. I I
EXIT - FAlLURE
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)
stream.
..
NULL
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.
RAND MAX
Un tipo di struttura corrispo~:idente _a quello d~l val~r; r~stituito dalla funziqne div.
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.
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.
int ferror('FILE
*s)~
sioz:e- t
~~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.
char *nptr);
onverr~ la
lan~
-::
:--
527
**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
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.
~*enc:fptr,
int
ba~ . );
__ 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
cha.r *npt r,
stringa punt;ata da
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.
Af.PENDIC:E
. . B
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
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
.
-~
.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.
next = seed;
}
~oid
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
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.
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 ..
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
~~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 *))
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).
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;
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.
*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
~wchar.~t
'*pW G~ s,
MB_CUR_MAX.
. -
APPEN'DlCE B
533
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
_ .
_ _ _..,_ -
- :
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
.
-
__ _,
'
--
da
*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
-...
....
~ar
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) ;.
\I('
memmove ( vo id * s 1 J co,n-st va 1d
* s2
s iz-e_t n) ;
cbar
in t s t re mp ( con s t: e ha.r
~s tfCpy(char
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
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
.
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.
$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
-
G0nst
char *-62);
un:a
-~
*~,
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.
,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
_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
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:
~n
') ;
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
&iz
*s1~
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
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
NULL
Una :o~.tfillte di -cipo puntatore nullo _definita dair_impJetnerrtazine.
co .ck---t
.
time t
Un tipo aritmetico in g~do di rappresentare l r:a.
1
siz e t
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
.;:
. 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
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
tw_liour ;,
tm_maay ;:
trn_.s.:ec ;.
t. 111-_ m1.n ;,
int
int.
int
iht
.537
X'rl'A'R D
si. z. e~t
L'~
q,ualora I'info,rmazio11e
llQtl
sia dispo.nibile.
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.
*tim~ptr)l
Sun sep
1~
01 :03:52 1973\n\0
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
538
APPENDICE B
LA
L$R
ERIA STANDA,RQ
.
-
Nel caso
oggetto.
~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
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
-i 2.1
ch ar.
+1 27
25 5
0 o SCHAR MIN
1'
sar. sostituita
tr atte + qualor~
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
- 32 76 7
+ 3"2.76 7
540
AP-PENDJCEE
Lifi
5:5535
-2147483647
LONG MIN
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
+37.'
+37
1E+37
1E+37
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
.......,
<float.h>
indeterniinabile
a_
+214-748364 7
-1
- .3.7
-37
-37
'.:
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.
d1 seguito.
1E: 5
1E - 9
1E ~ 9
tE- .3 7
1.E-37
1E-37
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
da sinistra
11
(tip o) *
&.
siz eo f
+ << >>
< <'= >
>=
-,-- J--
'&
A
I
I
&&
I I
I. I
?"
= +::::::
-=
*= /=
%= &=
""=
:=
'
<<= >> =
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
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
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 .
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
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
. 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
_ 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'
;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
Attri_b~o
Binario
,,
Cifr~ pi
-
bassa
,.
Figura E.2
Decima le
Quattr o
Due
un,o
.2.
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
Esadedmale
Cifra decimale
Uno
64
8 1
g0
10
16
B
0
Base
- - -
Ottale
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
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
Numero binario
Equivalente ot:rale
Equivalente esadet:imale
100011010001
4321'
eo:1
.
.. 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
010
2
Rapp.r esenrazione
6
7
011
Rappresentazione
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
SISTENU NUMERlCI
001
1
Figura E. 7
'
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
vi$~9 om~
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.
.4
E_
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
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.
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
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
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~
64
32
16
.2
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.
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
= 3980
Figura E.9
_I SISTE1vIT.NUMRICl
+ 48 + 11' - 44347
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
554
PDENDICEE
l SISTEMI .NUMERfC[
555
j
Valori pszionali:
4096 256
1,6
256
16
~0000000
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
a due d value :
00000 000
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
tipo:
.x = a - valu.e;
E.6
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:
i 3;
J,'
int valu,e
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
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
Tu generale le rappresentazioni
d~cimali,
(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
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
556
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. 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
E.13
Deci
. male 7+1 *8+3 *64= 7+8+ 1
. -92=207.
E.16
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
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
+ (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*~)
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).
128
64
12.8
64
32
{1*1 28) + (0*64}
E.14
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
E.6
1101 0000 1
E.7
001011111
.... - ___ __,,.
E.s
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
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
E.2 4
.E. 25
E.2 6
E.27
E.2 8
E.2 9
E .32
O/o.C.
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
03'9
:o/og
JJ/o_hd
1~5
%j
o/old
o/oLf
1~5, 154
%u
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
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>
,;:;:=
o 477
*fgers 520
367
_ soq1,1ernr~ d es(.1lJP d~ {!:atatte_te api:ce si.11-golo 21
~DA.TE_ costante shi:iboUca predef.ira 469
'567
is7 , 15'8
11
- com plei nen to
ox.
:ox
335
335
++ op rato re 70 71
550
INE)lGEANALITICO
a.o.u~
10, 11
~b m9do
4:az
~in.aria
~82
.,
-..
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
o'
AND 3~2
AND b.itwise (&)
anno bsscile
..
124
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
at:Ol
e 17
-
1-6.0, 278
14Si L46
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$
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
477
argc
7
C++
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
457
464
455~,
454-,
:(o.rdi;amen.rq a bPlte)
195, 196; 197, 216, 261
buh_bli;
i.~ro
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
Garatt~ri
di deHmirazicme 306
camtteri
d.i scansiflne
338=
car~ri di spaio bianco" 49
~
ollegamento 145
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
c.mp1Iator.e
09mpilato.re
19
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
.
compone:n ti l ~
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
.tasa
hi:arrj_~_ta cica.r~iv:a
c::ielo
'5l~. 8$--
ealoli
calcoli finanziari
calendare 124
cilloc
'BCPL 7
c:lli-~
}oc'k_c 536
379
-~.
base 291
~odan~d Ct-+
ca:ra.tte_r~
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
562
INolCE ANALlTI.CO
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
<::aso: s1-0
aosr:rnce :451, 492
costa
-- nte di carat
- .,_,terf!
iS I
E001ii: 50-3
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
41 11
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
ctime
i:;urs ore
Sf~7
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
D
.:
PBM
-- S- ssi
dt<bugger
467
--
B:EC PJDJ>_:.J1 7
Eulero 2.20
eucistic~.
ddL',aceessi:bilitc 22:2
480 1 519
-EXI l. - FAILURE
ai:t
,._
480' . . , ,9..
-
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
ER.ANGE. 503
di inpu r 3
0'u.cpU-C
?2
4
di
di
d.isp0sitiv i
dispo_~itivt>
disp:osic.iv
dispositivo
rusp,osicivo
dispo-sitiYo
'
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
.
ett-n'c.'
.- . >~
"
FC:S
5- 65..
f~of
3S~, ~'85 3.98
ferr>L 5_2:4
ffiush 517
fg~tc
38.ZJ .-4J O, 520
fgrpos )23
figlio 434
J8l, 358
eB:ore-loglcb fatile 54
~.
428
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
524
FII E. 515
- .
fclose 517
1,1,
p)pro, ee:s~Q
e 463
:<.::Secuiione sequenzia!~ 47
~eglre l O, lJ
t 69
11
564
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
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?-
'
~:z.l.0n~ it~r~~iv:a
i o3
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
3?7
tel.fbnici
40~
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
gurtime )37
goto 486,
4BB
'
'
_-'
isdi.git
is~giti
284
is-grph
i'slower
ispclp_t
is,pun.ct
lsspa~e
-.
Pidice 176
di fw1iio11e 132
13, 16
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
furi1;iene c:eil
-mM 5,
24
274
srrill;ghe 317
intcr0
hardwre 21 3
.518
-34]
incercettare 484
inrerecta,.re un ~~gnale in.ter~ivo 4-85
inreresse comp~sto 93, 94, 120,, 1.21
halr
fputs
dell~
340,
49 )
333
382~,
135, 482
(IlC
.funzioni di confronto
fputc
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 -
funzion e $qrt
"file server 5
565
lNDlC E -ANAI,m co
120; 184
io . 2t>.
131, 449
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'IDICE ANAI.IT_CO
li
lin k
ro,
me'mb ro
Jiic-Qpin'i, G. 47
Jaeschke, R. 16
_ijnker
job 4
7, 12 I 6, 17
12
JJMS
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
13.B, 14 0
l<ll'lcie. di d1!e d~dl 218
le:n~t-al~
20, 27
del
16
linee relefbQich~
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.~.
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
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
5.
roulcitasking 9
.o!
NDEBTJG' 504
n~gazj9ne: lqgic~
168, l7 1
naora.ri~ ne
posizionale 548
175
nu me ro
J1utt1ero
nu me ro
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
21, 50 '
5 11 , 512
311,. 53.5
di e...rrore 12
mkcin1 5-.?9'
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
la t-atraruga e la
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.
libre~ra
'
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
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
Il
568
IND_IC:E ANA.LlTICO
41.::> 467
52.. 157
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
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
par~uteyi
IDP-11 7
t 4$i 147 , l 49
in memoria
14iS~
188
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
pr.ofon.dlti di
42
459
.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
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)
494
push
20, 34
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
7a
pro d0r to
65
PDP-7 7
pern1anenza
vl
numero
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@.
$0~
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
-,
'
reord
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
:-:
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
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
-,
rlghe 26.
rimozione da
:-
'
~egna:le
di an~n2lone
tntei:~tivo
segno di pefc~r~ale (0/o) 30
se.m
141
seno
12'8
i85
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
lL!l.
5q
'
:I
485; 512
$TGILL 485 .
~12
484~ 485
si-rnbolo 43.
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,
.
'
''
size_c
sgE:ware i, 3
48
SOl'Jlm~
Lj;, -41,
53-?
297, 298, 533
302, 304 534
sttits}Dn
srn.:arn (flusso)
42
sorgente. 15
sotcoalbero de.stro 4-34'
soc
isq o 4,34
. roa.
- lber
- o
. sin
.
3-2-~
27 324 ,
j
~3 .3 ,
33 7
snlt!in
'
St;rcpy
l.Z
strchr:
strmnp
~CTG9 ll
'
515
19
'
16
29.2
.
sistema numetjco in bas~ 2 547
'
l2
549
s1stenia
n:rrmerico
orta
le
547
-
,. 549.
.
siste.oia ope tari vg 5' 7, 13., 16, 27
12
s~amp_a.re
14 tf 528 ,.
294, 296 , 519-
ssc anf
spr intf
vale 48,
571
strn~at
servhuf 518
' -
INDICE ANAI.tncb
:s.ah s-10 -
'
StrJ lCib p
stm cpy
str~c:i;
striod
-~m_ok
scn:ol
.s:u:c6u1
sttu
- -. ~E
,...
t75
squt~triJ.
srrurtura.
53:6
23:8, 349
47
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
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
sv Uupp'o d.el
sof~!lfe
cime 537
c:ime_t SB~
-val.0re: i rtunond.izi:i\, 57
3 9.
1
529
T
tabella 20G
rabella dei fiJe. aperti. 38 2
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
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
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
. ~
'
-~
vfprintf
vi 11
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
~
f1rnziop.~
148
'
44.6
veid
(punraro re a v9id)
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
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
294
simb.olo 54B
va1~1tazio11C.
v.al~re
468 491
tan.gente 128
...
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
ttm6Sh9ring 5
Wl
S\Vltcli
systm
Thompson., Ken 7
.top
573
INDICE ANALITICO
.,,I
'
20
322 0 I
2a'
tjurntny )8
,r'
1.