c Didattica e programmazione © 2(K)4 Pearsnn Paravia Hruno Mondadori S.p.A. Authoriud tnmsbllion from thr J::nglùh /,mguage t•dition, emitkd· A Book 011 C: proRrammillR in C- Fourth Edition hy kelley, Al; Pohl, Ira, puhlished hy Pear.\'011 Educatimi, /ne, puhlishing as Addi.wm We.\·/ey Prt~/i~ssional, Copyright~) l 99X. Ali rights rt·)·erved. No p11rf of this book 11/tlJ br reproducrd or tmmmillt'd in ,u~y fòrm or ~Y ,u~y meaw, rlt·ctronic or mechtmic,d, including photocopying, remrding or f,y tlllJ injòrnltltion slmìlY,t' rrtrirval ~)'.ffl'm, without pamission from Pe~~rson T:ductlfÙm, /ne. /t,tfitm languagr ulition published ~y Pt'ar.wm Parada Bmno Mondculori S.p.A., Copyright © 2004 Le inf{>rmazioni coruenute in quesro libro sono state vcritìcarc c docunH.'IH<Hl' con la massima cura possibile. Nessuna responsabilità derivanre dal loro urilizzo pord vcnirt· impurara agli Au rori, a Pearson Paravia Bruno Mondadori S.p.A. o a ogni persona c socierà coinvolra nella creazione. produzione e distribuzione di questo testo. I dirirri di riproduzione e di memorizzazione elettronica totale e parziale con qualsiasi mezzo, compresi i microfilm c le copie fotostmichc, sono riservati per tutti i paesi. l A f-OTOCOPIATURA DEl LIBRI t:. lJI\: RFATO Le fotocopie per uso personale del lettore possono essere effettuate nei limiti del lYYr di ciascun volume dietro pagamento alla SIAE del compenso previsto dall'an. 68. commi 4 e 5, della legge .22 aprile 1941 n. 633. Le ripro<.luzioni effettuale per fìnalitil di carattere professionale. el.'Onomico o commerciale o comunque per uso diverso da quello personale possono essere effettuate a seguito di specifica autorizzazione rilasciata da A IDRO. corso di Porta Romana n. 108, 20122 Milano. e-mail segn:tcria((i·aidro.org c sito web www.aidro.org. Traduzione: Giovanni Pighizzini Aggiornamento alla quarta edizione: Roberto Radicioni Revisione tecnica: Paolo Massazza Realizzazione editoriale: Shortcut. a cura di Giulia Maselli e Donatella Pepe Grafica di copertina: Gianni Gilardoni Stampa: Lalitotipo- Settimo Milanese (MI) Tutti i marchi cit<Hi nel testo sono di proprietà dci loro detentori. 978-88-7192-219-5 Primcd in lraly 4a edizione italiana: settembre 2004 Ristampa Anno 02 03 04 12 Ai nostri genitori Sommario Prefazione xv Capitolo O Partire da zero l 0.1 Perché il C? 2 0.2 Standard ANSI C 3 0.3 Dal C al C++ 3 0.4 Dal C e C++ ajava 4 Capitolo l Panoramica sul C 5 1.1 Programmazione e preparazione 5 1.2 Output dei programmi 6 1.3 Variabili, espressioni e assegnamenti 9 1.4 Utilizzo di #define e #include 12 1.5 Utilizzo di printf() e scanf() 16 1.6 Flusso del controllo 19 1.7 Funzioni 26 1.8 Array, stringhe e puntatori 32 1.9 File 41 1.10 Considerazioni sui sistemi operativi 47 1.11 Riepilogo 51 1.12 Esercizi 53 Capitolo 2 Elementi lessicali, operatori e sistema C 61 2.1 Caratteri ed elementi lessicali 62 2.2 Regole sintattiche 64 2.3 Commenti 66 2.4 Parole chiave 67 2.5 Identificatori 68 2.6 Costanti 69 2.7 Costanti stringa 71 2.8 Operatori e simboli di interpunzione 72 2.9 Priorità e associatività degli operatori 73 VII/ Sommario 2.10 Operatori di incremento e decremento 74 2.11 Operatori di assegnamento 76 2.12 Un esempio: il calcolo delle potenze di 2 78 2.13 Il sistema C 79 2.14 Riepilogo 84 2.15 Esercizi 85 Capitolo 3 Tipi di dati fondamentali 95 3.1 Dichiarazioni, espressioni e assegnamento 95 3.2 Tipi di dati fondamentali 97 3.3 Caratteri e tipo di dati char 99 3.4 Tipo di dati int 102 3.5 Tipi interi short, long e unsigned 104 3.6 Tipi reali 105 3.7 Utilizzo di typedef 108 3.8 Operatore sizeof 108 3.9 Utilizzo di getchar() e putchar() 109 3.10 Funzioni matematiche 112 3.11 Conversioni e cast 115 3.12 Costanti esadecimali e ottali 118 3.13 Riepilogo 121 3.14 Esercizi 122 Capitolo 4 Flusso del controllo 131 4.1 Operatori relazionali, di uguaglianza e logici 131 4.2 Espressioni e operatori relazionali 132 4.3 Espressioni e operatori di uguaglianza 135 4.4 Espressioni e operatori logici 137 4.5 Istruzioni composte 140 4.6 Istruzione espressione e istruzione vuota 141 4.7 Istruzioni ife if-else 141 4.8 Istruzione while 144 4.9 Istruzione for 148 4.10 Un esempio: variabili booleane 149 4.11 Operatore virgola 151 4.12 Istruzione do 152 4.13 Un esempio: i numeri di Fibonacci 154 4.14 Istruzione goto 157 4.15 Istruzioni break e continue 158 4.16 Istruzione switch 160 4.17 Operatore condizionale 161 4.18 Riepilogo 162 4.19 Esercizi 163 Capitolo 5 Funzioni 175 5.1 Definizione di funzione 175 5.2 Istruzione return 178 Sommario IX 5.3 Prototipi di funzione 179 5.4 Un esempio: costruzione di una tabella di potenze 181 5.5 Dichiarazioni di funzione dal punto di vista del compilatore 182 5.6 Uno stile alternativo per l'ordine di definizione di funzioni 183 5.7 Chiamata di funzione e chiamata per valore 184 5.8 Costruzione di programmi di grandi dimensioni 186 5.9 Utilizzo di asserzioni 189 5.10 Regole di visibilità 190 5.11 Classi di memorizzazione 193 5.12 Variabili statiche esterne 197 5.13 Inizializzazione di default 199 5.14 Ricorsione 199 5.15 Un esempio: le torri di Hanoi 204 5.16 Riepilogo 208 5.17 Esercizi 210 Capitolo 6 Array, puntatori e stringhe 219 6.1 Array monodimensionali 219 6.2 Puntatori 222 6.3 Chiamata per indirizzo 225 6.4 Relazione tra array e puntatori 227 6.5 Aritmetica dei puntatori e dimensione degli elementi 229 6.6 Array come parametri di funzioni 229 6.7 Un esempio: bubblesort 230 6.8 Allocazione dinamica della memoria con calloc() e malloc() 232 6.9 Un esempio: merge e mergesort 235 6.10 Stringhe 241 6.11 Funzioni della libreria standard per la gestione di stringhe 243 6.12 Array multidimensionali 247 6.13 Array di puntatori 253 6.14 Parametri di main () 259 6.15 Array frastagliati 260 6.16 Funzioni come parametri 261 6.17 Un esempio: utilizzo del metodo di bisezione per determinare le radici di una funzione 264 6.18 Array di puntatori a funzioni 269 6.19 Qualificatori di tipo const e volatile 274 6.20 Riepilogo 275 6.21 Esercizi 277 Capitolo 7 Operatori orientati ai bit e tipi enumerativi 295 7.1 Operatori ed espressioni orientati ai bit 295 7.2 Maschere 300 7.3 Strumenti software: stampa bit a bit di un int 301 7.4 Compattamento e scompattamento 303 7.5 Tipi enumerativi 306 7.6 Un esempio: il gioco della morra cinese 309 X Sommario 7.7 Riepilogo 315 7.8 Esercizi 316 Capitolo 8 Il preprocessore 323 8.1 Utilizzo di #include 323 8.2 • Utilizzo di #define 324 8.3 Macro con parametri 326 8.4 Definizioni di tipo e macro in stddef.h 329 8.5 Un esempio: ordinamento con qsort() 330 8.6 Un esempio: macro con parametri 334 8.7 Macro in stdio.h e ctype.h 338 8.8 Compilazione condizionale 339 8.9 Macro predefinite 342 8.10 Operatori # e ## 342 8.11 Macro assertO 343 8.12 Utilizzo di #errore #pragma 344 8.13 Numeri di riga 345 8.14 Funzioni corrispondenti 345 8.15 Un esempio: quicksort 345 8.16 Riepilogo 348 8.17 Esercizi 350 Capitolo 9 Strutture e unioni 361 9.1 Strutture 361 9.2 Accesso ai membri di una struttura 364 9.3 Priorità e associatività degli operatori: una panoramica finale 368 9.4 Utilizzo di strutture con funzioni 369 9.5 Inizializzazione di strutture 371 9.6 Un esempio: il gioco del poker 371 9.7 Unioni 376 9.8 Campi di bit 379 9.9 Un esempio: accesso ai bit e ai byte 381 9.10 Tipo di dati astratto stack (ADn 382 9.11 Riepilogo 386 9.12 Esercizi 388 ~Capitolo 10 Strutture e trattamento di liste 397 10.1 Strutture autoreferenzianti 397 10.2 liste lineari concatenate 399 10.3 Operazioni sulle liste 401 10.4 Alcune funzioni per l'elaborazione di liste 405 10.5 Stack 410 10.6 Un esempio: notazione polacca e valutazione di uno stack 413 10.7 Code 420 10.8 Alberi binari 424 10.9 liste concatenate generali 428 Sommario Xl 10.10 Riepilogo 432 10.11 Esercizi 433 Capitolo 11 Input/o utput e sistema operativo 441 11.1 Funzione di output printf() 441 11.2 Funzione di input scanf() 446 11.3 Funzioni fprintf(), fscanf(), sprintf() e sscanf() 450 11.4 Funzioni fopen () e fclose () 451 11.5 Un esempio: doppia spaziatura in un file 453 11.6 Utilizzo di file temporanei e funzioni personalizzate 456 11.7 Accesso diretto ai file 459 11.8 lnput l output con descrittori di file 460 11.9 Permessi di accesso ai file 462 11.10 Esecuzione di comandi dall'interno di un programma C 463 11.11 Utilizzo di "pipe" da un programma C 464 11.12 Variabili di ambiente 465 11.13 Il compilatore C 466 11.14 Utilizzo del profiler 468 11.15 Librerie 469 11.16 Cronometrare il codice C 471 11.17 Utilizzo di make 474 11.18 Utilizzo di touch 480 11.19 Altri strumenti utili 480 11.20 Riepilogo 482 11.21 Esercizi 483 Capitolo 12 Applicazioni avanzate 493 12.1 Creazione di un processo concorrente mediante fork () 493 12.2 Sovrapposizione di un processo: la famiglia exec ... () 495 12.3 Comunicazione tra processi mediante pipe() 498 12.4 Segnali 501 12.5 Un esempio: i cinque filosofi 503 12.6 Allocazione dinamica di matrici 507 12.7 Restituzione dello stato 515 12.8 Riepilogo 520 12.9 Esercizi 521 Capitolo 13 Dal C al C++ 527 13.1 Output 527 13.2 lnput 529 13.3 Funzioni 531 13.4 Classi e tipi di dati astratti 533 13.5 Overloading 535 13.6 Costruttori e distruttori 537 13.7 Programmazione orientata agli oggetti ed ereditarietà 539 13.8 Polimorfismo 540 13.9 Template 543