Sei sulla pagina 1di 667
Cc Corso completo di programmazione, terza edizione Titolo originale: C How to Program, Fifth Edition Autori: Harvey M. Deitel, Paul J. Deitel Published by arrangement with the original publisher, PRENTICE HALL, INC., a Pearson Education Company Copyright © 2007 - PRENTICE HALL, INC. Copyright per l’edizione italiana © 2007 - APOGEO s.r. Socio Unico Giangiacomo Feltrinelli Editore s.r. Via Natale Battaglia, 12 - 20127 Milano (Italy) Telefono: 02-289981 — Telefax: 02-26116334 Email education@apogeonline.com URL. __hetp://www.apogeonline.com ISBN-13 978-88-503-2633-4 Traduzione e revisione: Ivan Scagnetto Impaginazione elettronica: Grafica editoriale - Vimercate Editor: Alberto Kratter Thaler Copertina e progetto grafico: Enrico Marcandalli Responsabile di produzione: Vitiano Zaini Tutti i diritti sono riservati a norma di legge ¢ a norma delle convenzioni internazionali. Nessuna parte di questo libro pud essere riprodotta con sistemi elettronici, meccanici o altri, senza l'autorizzazione scritta dell’Editore. Nomi e marchi citati nel testo sono generalmente depositati o registrati dalle rispettive case produttrici. Fotocopie per uso personale del lettore possono essere effettuate nei limiti del 15% di ciascun volume dietro pagamento alla SIAE del compenso previsto dallart. 68, comma 4, della legge 22 aprile 1941 n. 633 ovvero dell’accordo stipulato tra SIAE, ATE, SNS e CNA, CONFARTIGIANATO, CASA, CLAAI, CONFCOMMERCIO, CONFESERCENTI il 18 dicembre 2000. Le riproduzioni a uso differente da quello personale potranno avvenire, per un numero di pagine non superiore al 15% del presente volume, solo a seguito di specifica autorizzazione rilasciata da AIDRO, Cso di Porta Romana, n. 108,~20122 Milano, telefono 02 89280804, telefax 02 892864, e-mail aidro@iol. Finito di stampare nel mese di giugno 2007 da Legoprint - Lavis, Trento Sommario PREFAZIONE ..... Lo scopo di questo libro La metodologia di insegnamento Panoramica sul libro Ringraziamenti ... Gli autori... CapitoLo |: INTRODUZIONE Al COMPUTER, A INTERNET E AL WeB 11 Introduzione..... 1.2 Che cosa @ un computer? 1.3. Lorganizzazione del computer 1.4 Levoluzione dei sistemi operativi 15 I personal computer, i sistemi distribuiti ¢ i sistemi client/server 1.6 I linguaggi machina, assembly e di alto livello 1.7 FORTRAN, COBOL, Pascal e Ada 18 Lastoria del C...... 1.9 Lalibreria standard del C 110 C+. lavas 1.12 BASIC, Visual Basic, Visual C++, C# e NET. 1.13 La chiave dell’evoluzione del software; la tecnologia a oggett 1.14 Le basi di un tipico ambiente di sviluppo di un programma C 1.15 L'evoluzione dell’hardware 1.16 La storia di Internet... 1.17 Lastoria del World Wide Web 1.18 — Note generali sul C e su questo libr Esercizi di autovalutazione.... Risposte agli esercizi di autovalutazione Eserci CapiTOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C ... 21 Introduzione...... 2.2 Unsemplice programma C: visualizzare una riga di testo .. 2.3 Unaltro semplice programma C: sommare due interi 2.4 Nozioni sulla memoria 2.5 L’aritmetica del C 2.6 Prendere delle decisioni: gli operatori di uguaglianza e relazionali Esercizi di autovalutazione ... Risposte agli esercizi di autovalutazione Esercizi Vv SOMMARIO 49 49 49 50 CaPITOLo 3: Lo svILUPPO DI PROGRAMM! STRUTTURATI IN C 3.1 Introduzione 3.2 Gli algoritmi. 3.3 Lo pseudocodic 34 Le strutture di controllo 51 3.5 Il comando di selezione it 53 3.6 Il comando di selezione if...else .. 54 3.7 Il comando di iterazione while.. 58 3.8 Formulazione degli algoritmi: studio di un caso 1 (iterazione controllata da un contatore) .... 3.9 Formulazione degli algoritmi con processo top-down per raffinamenti successivi: studio di un caso 2 (iterazione controllata da un valore sentinella) . 3.10 Formulazione degli algoritmi con processo top-down per raffinamenti successivi: studio di un caso 3 (strutture di controllo nidificate) 3.11 Gli operatori di assegnamento .... 3.12 Gli operatori di incremento e di decremento Esercizi di autovalutazione.... Risposte agli esercizi di autovalutazione Esercizi .. CaPiTOLo 4: IL CONTROLLO DEL PROGRAMMA IN C 41 Introduzione 42 Gli elementi dell’iterazione 4.3 Iterazione controllata da un contatore 44 Il comando di iterazione for ..... 45 Il comando for: note e osservazioni 4.6 Esempi di utilizzo del comando for 47 Il comando di selezione multipla switch 48 Il comando di iterazione do...while ... 49 Le istruzioni break e continu: 4.10 Gli operatori logici 4.11 Confondere gli operatori di uguaglianza 4.12 — Riassunto della programmazione strutturata Esercizi di autovalutazione Risposte agli esercizi di autovalutazione Esercizi . ) e di assegnamento CapiTOLo 5: LE FUNZIONI IN C w.sessessssssesseeseeeeee 5.1 Introduzione.... 5.2 I moduli di programma in C 5.3 Le funzioni della libreria matematica . 5.4 Le funzioni 5.5 Le definizioni di funzione . 5.6 I prototipi di funzione 5.7 I file di intestazione ... SoMMaRIO v 5.8 [file di intestazione . 5.9 Invocare le funzioni: chiamata per valore e per riferimento 5.10 Generazione di numeri casuali 5.11 Esempio: un gioco d’azzardo 5.12 Le classi di memoria 5.13 Le regole di visibilita 5.14 La ricorsion 5.15 Esempio di utilizzo della ricorsion 5.16 Ricorsione e iterazione..... Esercizi di autovalutazione ... Risposte agli esercizi di autovalutazione .. Esercizi .. la serie di Fibonacci .. I vettori 6.3 Ladichiarazione dei vettori 6.4 Esempi sui vertori.... 6.5 Passare i vettori alle funzioni 6.6 Liordinamento dei vettori.. 08 6.7 Studio di un caso: calcolare la media, la mediana e la moda usando i vettoti....210 6.8 Laricerca nei vettori.... 6.9 Lvettori multidimensional Esercizi di autovalutazione..... Risposte agli esercizi di autovalutazione .. Esercizi Esercizi sulla ricorsione CapitoLo 7: | PUNTATORI INC 7.1 Introduzione. 7.2. Dichiarazione e inizializzazione dei puntatori 7.3 Gli operatori sui puntatori. 7.4 Lachiamata per riferimento delle funzioni .... 7.5 Utilizzare il qualificatore const con i puntatori 7.6 Vordinamento a bolle utilizzando una chiamata per riferimento 7.7 Loperatore sizeof. 7.8 Le espressioni con i puntatori e laritmetica dei puntato: 7.9 Larelazione tra i puntatori e i vettori 7.10 — I vertori di puntatori 7.11 Studio di un caso: simulazione di un mescolatore ¢ distributore di carte 7.12 IT puntatori a funzioni .. Esercizi di autovalutazione..... Risposte agli esercizi di autovalutazione Esercizi .. Sezione speciale: costruite il vostro computer .. vi SomMaRIO CapIToLo 8: | CARATTER! E LE STRINGHE IN C 8.1 Introduzione.... 8.2 concetti fondamentali delle stringhe e dei caratteri 8.3 La libreria per la gestione dei caratteri .. 8.4 Le funzioni per la conversione delle stringhe 8.5 Le funzioni della libreria per l’input/output standard 8.6 Le funzioni per la manipolazione delle stringhe incluse nella libreria per la gestione delle stringhe ... 8.7 Le funzioni di confronto incluse nella libreria per la gestione delle stringhe 8.8 Le funzioni di ricerca incluse nella libreria per la gestione delle stringhe 8.9 Le funzioni per la manipolazione della memoria incluse nella libreria per la gestione delle stringhi 8.10 Lealtre funzioni della libreria per la gestione delle stringhe .. Esercizi di autovalutazione.... Risposte agli esercizi di autovalutazione Eserci Sezione speciale: esercizi di manipolazione avanzata delle stringhe Un progetto impegnativo per la manipolazione delle stringhe ... CapiToLo 9: La FORMATTAZIONE DELL’INPUT/OUTPUT IN C ....ssee oF Introduzione.... 9.2 Gli stream... 9.3. Formattare output con printf 9.4 Visualizzare gli interi .. 9.5 Visualizzare i numeri in virgola mobil 9.6 Visualizzare le stringhe ¢ i caratteri . 9.7 Gli altri indicatori di conversione 9.8 Visualizzare con le dimensioni di campo e le precisio: 9.9 Utilizzare i flag nella stringa di controllo del formato della printf 9.10 Visualizzare i letterali e le sequenze di escape 9.11 Formattare l’input con scanf.. Esercizi di autovalutazione ... Risposte agli esercizi di autovalutazione Esercizi .. CaptToLo 10: Le STRUTTURE, LE UNIONI, LA GESTIONE DE! BIT E LE ENUMERAZIONI IN C ot soeeeneeneeee 10.1 Introduzione..... 10.2 La definizione delle strutture 10.3 Inizializzare le strutture.. 10.4 Accedere ai membri delle strutture .. 10.5 Usare le strutture con le funzioni 10.6 typedef. 10.7 Esempio: simulazione di un mescolatore e distributore di carte ad alta efficienza .. SOMMARIO vil 10.8 Le unioni 10.9 Gli operatori bitwise 10.10 I campi di bit... 10.11 Le costanti di enumerazione Esercizi di autovalutazione.... Risposte agli esercizi di autovalutazione . Esercizi CaprToLo | 1: LELABORAZIONE DEI FILE INC 7 413 11.1 Introduzione.. 11.2 La gerarchia dei dati 11.3 [file e gli stream .. 11.4 — Creare un file ad accesso sequenziale 11.5 Leggere i dati da un file ad accesso sequenziale 11.6 I file ad accesso casuale ... 11.7 Creare un file ad accesso casuale 11.8 — Scrivere i dati in modo casuale in un file ad accesso casual: 11.9 Leggere i dati in modo casuale da un file ad accesso casuale .. 11.10 Studio di un caso: un programma per l’elaborazione delle transazioni Esercizi di autovalutazione Risposte agli esercizi di autovalutazione .. Esercizi CapiroLo 12: Le STRUTTURE DI DATI IN C 12.1 12.2 12.3 12.4 12.5 12.6 12.7 utovalutazione . Risposte agli esercizi di autovalutazione . Esercizi CAPITOLO 13: IL PREPROCESSORE DEL C ......44. 13.1 Introduzion 13.2 La direttiva del preprocessore #include ... 13.3. La direttiva del preprocessore #define: le costanti simboliche 13.4 La direttiva del preprocessore #define: le macro 13.5 La compilazione condizionale.... 13.6 Le direttive del preprocessore #error e #pragma 13.7 Gli operatori # e ## .. 13.8 I numeri di riga 13.9 Le costanti simboliche predefinite 13.10 Le asserzioni . vil SOMMARIO Esercizi di autovalutazione 512 Risposte agli esercizi di autovalutazione Esercizi . CariToLo 14: ARGOMENT! AVANZATI 14.1 Introduzione.. 14.2 Redirezionare input/output su sistemi UNIX e Windows 14.3 Glielenchi variabili di argomenti . 14.4 Usare gli argomenti della riga di comando 14.5 Note sulla compilazione di programmi formati da vari file sorgente 14.6 Chiusura dei programmi con exit ¢ atexit 14.7 I qualificatore di tipo volatile... 14.8 I suffissi per le costanti intere e in virgola mobile 14.9 Ancora sui file... 14.10 La gestione dei segnal 14.11 Allocazione dinamica della memori: 14.12 Il salto incondizionato con goto Esercizi di autovalutazione..... Risposte agli esercizi di autovalutazione Esercizi ..... : le funzioni calloc e realloc . CapitoLo 15: INTRODUZIONE AL C99 535 15.1 Introduzione..... 15.2 Supporto del C99 15.3 I nuovi file header del C99 15.4. Commenti introdotti da // 15.5 Intercalare dichiarazioni e codice eseguibile .. 15.6 Dichiarare una variabile nell’intestazione di un comando for 15.7 Inizializzatori designati e letterali composti 15.8 Il tipo di dati bool 15.9 Tipo int implicito nelle dichiarazioni di funzioni 15.10 Numeri complessi.... 15.11 Vettori di lunghezza variabile 15.12 Altre caratteristiche del C99 .. 15.13. Risorse disponibili su Internet e sul Web.. Esercizi di autovalutazione. Risposte agli esercizi di autovalutazione Esercizi ... ApPENDICE A: RisorsE SU INTERNET E NEL Worto Wipe Ws... ApPENDICE B: Risorse SUL C99 DISPONIBIL! SU INTERNET E NEL WorLp Wine Wes .. 559 APPENDICE C: TABELLA DI PRIORITA DEGLI OPERATOR ...... AppENDICE D: LINSIEME DEI CARATTER! ASCII... Sommario APPENDICE E: | SISTEM! NUMERIC! ..... APPENDICE F: RISORSE SULLA LIBRERIA STANDARD DEL C ..... ApPENDICE G: LA LIBRERIA STANDARD .. ApPENDice H: PROGRAMMARE GIOCHI: RISOLVERE IL SUDOKU .......+++ INDICE ANALITICO .... Prefazione Benvenuti nel mondo dello Standard ANSI/ISO C. Alla Deitel & Associates scriviamo libri di testo di livello universitario sui linguaggi di programmazione e libri per i professionisti e lavoriamo duramente per mantenerli aggiornati con un flusso costante di nuove edizioni. Scrivere la quarta edizione di questo libro é stato un piacere: esso contiene tutto cid di cui sia gli insegnanti che gli studenti possano aver bisogno per sperimentare un’esperienza educativa ricca di contenuti, interessante, stimolante ¢ anche divertente. Abbiamo affinato lo stile della scrittura, gli aspetti pedagogici e il modo di scrivere il codice. Inoltre, abbiamo incluso una panoramica sul libro in questa prefazione, in modo da aiutare gli insegnanti, gli studenti ¢ i professionisti a rendersi conto della ricchezza dei contenuti sul linguaggio C proposti da questo libro. In questa prefazione presentiamo le convenzioni che utilizzeremo nel corso del testo. Lo scopo di questo libro Il Professor Harvey M. Deitel ha tenuto corsi universitari introduttivi sulla programmazione per 20 anni, puntando soprattutto a insegnare come sia possibile sviluppare programmi ben scritti e ben strutturati. Molti dei suoi insegnamenti riguardano i concetti fondamentali della programmazione, con particolare enfasi sull’utilizzo efficace dei comandi di controllo e sulla funzionalita. Questi argomenti vengono presentati all’interno di questo libro esattamente nel modo in cui il Professor Deitel li ha sempre proposti ai propri studenti universitari. Il nostro obiettivo era chiaro: offrire un testo sul C destinato ai corsi universitari a livello introduttivo, per quegli studenti che non hanno alcuna esperienza nell’ambito della pro- grammazione, pur fornendo, allo stesso tempo, la completezza teorica e pratica richiesta ai tradizionali corsi avanzati di C. Il testo segue lo standard ANSI C; tenete presente che molte funzionalita dell’ANSI C non sono implementate nelle versioni pre-ANSI del C. Per avere informazioni pid dettagliate sul linguaggio vi conviene consultare il manuale di riferimento del vostro sistema o procurar- vi una copia del documento ANSI/ISO 9899: 1990, “American National Standard for Infor- mation Systems-Programming Language C”, dell’ American National Standards Institute, 11 West 42nd Street, New York, New York 10036. La metodologia di insegnamento Questo libro contiene un'ampia varieta di esempi, esercizi e progetti che prendono spunto da molte situazioni e che offrono agli studenti la possibilita di risolvere problemi reali. Il libro prende in esame i principi della progettazione del software, insistendo sull’importanza della chiarezza dei programmi ed evitando l'uso di terminologia complessa a favore di esempi chiari e diretti, il cui codice sia stato collaudato sulle piattaforme C pitt diffuse. xu PREFAZIONE, Lapprendimento attraverso il codice Il libro presenta una grande quantita di esempi basati sul codice. Ogni argomento viene presentato nell’ambito di un programma C completo e funzionante, seguito sempre da una 0 pit finestre che mostrano l’output del programma in questione. Viene quindi usato il lin- guaggio per insegnare il linguaggio, e la lettura di questi programmi offre un’esperienza mol- to simile alla loro esecuzione reale su di un computer. Laccesso al World Wide Web Tutto il codice presente nel libro si trova anche in Internet, nel booksite abbinato a questo libro, all’indirizzo http: / /www. apogeonl ine. com/1ibri/88-503-2633-5/scheda. II no- stro consiglio 2 quello di scaricare tutto il codice, eseguendo poi ogni singolo programma via via che appare nel testo. Potete anche modificare il codice degli esempi e vedere cosa succede, imparando cosi a programmare programmando. Tutto questo materiale ¢ protetto da diritti dautore, quindi utilizzatelo liberamente per studiare il C, ma non pubblicatene alcuna parte senza Pesplicito permesso da parte degli autori e della casa editrice. Obiettivi Ogni capitolo inizia con la presentazione degli Obiettivi. Gli studenti possono cosi sapere in anticipo cid che andranno ad apprendere e, alla fine della lettura del capitolo, potranno verificare se hanno raggiunto 0 meno questi obiettivi. Il codice e gli esempi Le funzionalita del C vengono presentate nell’ambito di programmi completi e funzionanti. Ogni programma é seguito dalle immagini degli output che vengono prodotti, cosi che gli studenti possano assicurarsi della correttezza dei risultati. I programmi presentati vanno da poche linee di codice a esempi composti da varie centinaia di righe. Gli studenti dovrebbero scaricare tutto il codice dal sito Web http: / /ww. apogeonline.com/1ibri/88-503-2633- 5/scheda, eseguendo poi ogni programma via via che questo viene presentato all’interno del testo. Figure e immagini Il libro offre un’ampia variet& di grafici, immagini e output di programmi. Nelle sezioni dedicate alle strutture di controllo, per esempio, appaiono vari diagrammi di flusso molto utili, [Nota: i diagrammi di flusso non vengono presentati come uno strumento di sviluppo, ma ricorriamo a una breve presentazione basata su questi diagrammi per specificare le singole operazioni di ogni struttura di controllo C.] Consigli e suggerimenti Il libro offre molti suggerimenti riguardanti la programmazione, per aiutare gli studenti a concentrarsi sugli aspetti pitt importanti dello sviluppo di programmi. Questi consigli vengo- no forniti attraverso le sezioni chiamate Buona abitudine, Errore tipico, Collaudo e messa a punto, Obiettivo efficienza, Obiettivo portabilita, Ingegneria del software. PREFAZIONE, XU x a ® 2 Buona abitudine Il concetto pitt importante per chi inizia a programmare @ la chiarezza, e all’interno delle sezioni Buona abitudine vengono presentate delle tecniche per la scrittura di pro- grammi chiari, comprensibili e pits facilmente gestibili Errore tipico Tutti gli studenti che affrontano per la prima volta un nuovo linguaggio tendono a commettere frequentemente gli stessi errori. Le sezioni Errore ripico aiutano gli stu- denti a evitare di commettere i pitt comuni. Collaudo e messa a punto Queste sezioni forniscono consigli circa le attivira di test e debugging dei program- mi C, anche a livello preventivo. Obiettivo efficienza In base alla nostra esperienza, insegnare agli studenti come scrivere programmi chiari e comprensibili deve costituire l’obiettivo pitt importante di qualsiasi corso di pro- grammazione. Gli studenti, perd, vogliono normalmente imparare a scrivere program- mi che vengano eseguiti in modo veloce, che utilizzino poca memoria, che richiedano una minima quantita di comandi e che offrano prestazioni eccellenti. Le sezioni Obiettivo efficienza offrono suggerimenti su come migliorare le prestazioni dei pro- pri programmi. Obiettivo portabilita Alcuni programmatori pensano che, implementando un’applicazione C, questa sia immediatamente portabile su tutte le piattaforme; sfortunatamente, non & sempre cos). Le sezioni Obiettivo portabilita aiucano gli studenti a scrivere codice realmente portabile, fornendo inoltre informazioni su come il C sia in grado di raggiungere questo elevato livello di poreabilica. Ingegneria del software IC é un linguaggio molto efficace nell’ambito della progettazione del software, e le sezioni Ingegneria del software prendono in esame gli aspetti architetturali e progettuali che influiscono sulla realizzazione di sistemi software, specialmente nel caso di sistemi su vasta scala. Molte di queste informazioni saranno utili agli studenti nei corsi pitt avanzati, oltre che nel mondo del lavoro. Esercizi di autovalutazione Il libro propone molti esercizi corredati di risposte, cosi che gli studenti possano prepararsi alle esercitazioni vere ¢ proprie. Gli studenti dovrebbero essere incoraggiati a svolgere tutti questi esercizi di autovalutazione. xIv PREFAZIONE Esercizi Ogni capitolo si conclude con un insieme di esercizi di vario tipo, che permettono agli inse- gnanti di adattare le proprie lezioni alle esigenze particolari di ogni classe. Gli esercizi verifi- cano Papprendimento dei concetti ¢ dei termini pid: importanti, chiedono agli studenti di scrivere singole istruzioni, piccole porzioni di funzioni, funzioni e programmi completi fino ad arrivare alla costruzione di interi progetti. Panoramica sul libro Capitolo 1 - Introduzione al mondo dei computer, di Internet e del World Wide Web: spiega cosa sono i computer, come funzionano ¢ in che modo possono essere programmati. Questo capitolo introduce la programmazione strutturata e spiega perché questo insieme di tecniche abbia favorito una rivoluzione nel modo di scrivere i programmi. Il capitolo offre una breve storia dello sviluppo dei linguaggi di programmazione, dai linguaggi machina, ai linguaggi assembly, ai linguaggi di alto livello. E discussa anche lorigine del linguaggio di programmazione C. Il capitolo include un’introduzione a un tipico ambiente di programma- zione del C. Viene discusso l’enorme aumento di interesse nei confronti di Internet in seguito all'avvento del World Wide Web e del linguaggio di programmazione Java. Capitolo 2 - Introduzione alla programmazione in C: fornisce untintroduzione sintetica ai programmi di scrittura C e offre un trattamento dettagliato delle operazioni decisionali ¢ aritmetiche del C. Dopo aver studiato questo capitolo, lo studente avra imparato a scrivere programmi semplici ma completi. Capitolo 3 - Lo sviluppo di programmi strutturati in C: & probabilmente il capitolo pit importante del testo, specialmente per un diligente studente di informatica. Esso introduce la nozione di algoritmi (procedure) per la risoluzione dei problemi; spiega limportanza della programmazione strutturata per la produzione di programmi comprensibili, che siano col- laudabili e modificati e che abbiano pitt probabilita di funzionare correttamente sin dal pri- mo tentativo. Introduce anche i comandi di controllo fondamentali della programmazione strutturata, cio? i comandi di sequenza, selezione (if e if..e1se) e di iterazione (while). II capitolo spiega la programmazione top-down a raffinamenti successivi, una tecnica impor- tante per produrre in modo corretto programmi strutturati. Esso presenta un popolare stru- mento di aiuto alla progettazione dei programmi, ovverosia lo pseudocodice structurato. I metodi ¢ gli approcci usati nel Capitolo 3 sono applicabili alla programmazione strutturata in ogni linguaggio di programmazione, non solo a quella in C. Questo capitolo aiuta lo studen- te a sviluppare delle buone abitudini di programmazione che lo prepareranno ad affrontare gli esercizi di programmazione pitt consistenti del resto del libro. Capitolo 4 - II controllo del programma in C: raffina le nozioni di programmazione struttu- rata ¢ introduce altri comandi di controllo; esamina in dettaglio 'iterazione e paragona i cicli controllati da un contatore con quelli controllati da un valore sentinella. Il comando for & presentato come uno strumento adatto a implementare i cicli controllati da un contatore. Sono introdotti anche il comando di selezione switch ¢ quello di iterazione do..while. II capitolo termina con una discussione sugli operatori logici. Capitolo 5 - Le funzioni in C: tratta della progettazione e costruzione dei moduli del pro- gramma. Le risorse del C relative alle funzioni includono funzioni di libreria standard, fun- zioni definite dal programmatore, la ricorsione ¢ la possibilita di effettuare delle chiamate per PREFAZIONE xv valore. Le tecniche presentate sono essenziali per la produzione la comprensione di pro- grammi struccurati, specialmente di quelli pitt grandi, ¢ del software che i programmatori di sistemi e di applicazioni svilupperanno pitt probabilmente nelle applicazioni del mondo rea- le, La strategia “dividi e conquista” é presentata come un mezzo efficace per risolvere i proble- mi pitt complessi, suddividendoli in componenti pitt semplici che interagiscono tra di loro. Agli studenti piace avere a che fare con i numeri casuali ¢ le simulazioni e apprezzano la trattazione del gioco di dadi craps che fa un uso elegante dei comandi di controllo. In questo capitolo vengono presentate le enumerazioni, che verranno poi riprese in maggior dettaglio nel Capitolo 10. Il Capitolo 5 offre una solida introduzione alla ricorsione e include una tabella che riassume i numerosi esempi ed esercizi sulla ricorsione distribuiti nel resto del libro. Alcuni libri affrontano la ricorsione solo verso la loro fine, ma noi pensiamo che sia meglio trattare 'argomento in modo graduale nel corso di tutto il libro. Gli esaurienti esercizi includono vari problemi classici sulla ricorsione come le Torri di Hanoi. Capitolo 6 - I vettori in C: discute la strutturazione dei dati in vettori, cio gruppi di dati correlati e dello stesso tipo. II capitolo presenta numerosi esempi sia sui vettori con un solo indice che su quelli con indice doppio. Limportanza della strutturazione dei dati @ ampia- mente riconosciuta al pari dell’utilizzo dei comandi di controllo nello sviluppo di programmi strutturati, Alcuni esempi approfondiscono varie tipiche elaborazioni dei vettori, la stampa degli iscogrammi, la classificazione dei dati, il passaggio dei vettori alle funzioni e un’introdu- zione all’analisi dei sondaggi di opinione (con delle semplici statistiche). Un punto caratteri- stico di questo capitolo é un’accurata presentazione della ricerca binaria, un enorme migliora- mento di quella lineare. Gli esercizi alla fine del capitolo includono una vasta selezione di problemi interessanti e stimolanti come, ad esempio, tecniche di ordinamento migliorate, la progettazione di un sistema di prenotazioni per line aeree, un‘introduzione al concetto della Turtle Graphic (resa famosa dal linguaggio LOGO) e i problemi del giro del cavallo e delle otto regine che introducono la nozione di programmazione euristica, molto utilizzata nel campo dellintelligenza artificiale. Capitolo 7 - I puntatori in C: presenta una delle caratteristiche pit: potenti del linguaggio C, ovvero, i puntatori. Il capitolo fornisce spiegazioni dettagliate sugli operatori dei puntatori, sulla chiamata per riferimento, sulle espressioni con puntatori, sull’aritmetica dei puntatori, sulla relazione tra puntatori e vertori, sui vettori di puntatori e sui puntatori a funzioni. Gli esercizi del capitolo includono una piacevole simulazione della classica gara tra la tartaruga e la lepre, vari algoritmi per il mescolamento e la distribuzione delle carte e un algoritmo ricorsivo per l'attraversamento di un labirinto. E inclusa anche una speciale sezione intitolata “Costruite il vostro computer”, che spiega la programmazione in linguaggio macchina e pro- segue con un progetto che comprende la progettazione e l'implementazione di un simulatore che permetta al lettore di scrivere e far funzionare i programmi sviluppati in linguaggio mac- china. Questa caratteristica unica del libro sara utile soprattutto al lettore che vorra capire il reale funzionamento dei computer. Ai nostri studenti piace questo progetto e spesso imple- mentano sostanziali miglioramenti; molti di questi sono proposti all’interno degli esercizi. Nel Capitolo 12, un’altra sezione speciale guidera il lettore attraverso la costruzione di un compilatore; il linguaggio macchina prodotto dal compilatore sari poi eseguito con il simu- latore di linguaggio macchina prodotto nel Capitolo 7. Capitolo 8 - I caratteri e le stringhe in C: tratta dei principi fondamentali dell’elaborazione dei dati non numerici. Il capitolo include una panoramica completa delle funzioni per Pela- borazione dei caratteri ¢ delle stringhe disponibili nella libreria del C. Le tecniche discusse in XVI PREFAZIONE questo contesto sono ampiamente utilizzate nello sviluppo di word processor, software di impaginazione e applicazioni per l’elaborazione del testo. Allo studente piaceranno gli eserci- 2i sui limerick, sulla generazione casuale di poesie, sulla conversione dall’inglese al pig Latino, sulla generazione di parole di sette lettere che equivalgono a un numero telefonico dato, sulPallineamento del testo, sulla protezione degli assegni, sulla scritrura della cifra di un asse- gno in lettere, sulla generazione del Codice Morse, sulle conversioni metriche e sulle lettere di sollecito. Lultimo esercizio invita lo studente a utilizzare un dizionario computerizzato per creare un generatore di cruciverba. Capitolo 9 - La formattazione dell’ Input/Output in C: presenta tutte le potenti capacita di formattazione di printf e scanf. Discuteremo delle capacita di formattazione dell’output di printf, come Parrotondamento dei valori in virgola mobile a un dato numero di cifre decima- Ii, Pincolonnamento dei numeri, Pallineamento a destra ¢ a sinistra, Pinserimento di infor- mazioni letterali, la forzatura del segno positivo, la stampa degli zeri iniziali, 'uso della nume- razione esponenziale, l'uso dei numeri ottali ed esadecimali e il controllo delle dimensioni di campo e della precisione. Discuteremo tutte le sequenze di escape di printf per il movimento del cursore, per la stampa dei caratteri speciali ¢ per la produzione di un allarme acustico. Esamineremo tutte le possibilita di formattazione dell’input di scanf incluso l'input di speci- fici tipi di dati e come ignorare dei caratteri specifici presenti sullo stream di input. Discute- remo tutte le specifiche di conversione di scanf per leggere i numeri decimali, ottali, esadeci- mali, in virgola mobile, i caratteri e i valori di una stringa. Discuteremo della scansione dell input in modo che corrisponda (o meno) ai caratteri inclusi in un gruppo di scansione. Gli esercizi del capitolo verificano virtualmente tutte le capacita di input/output formattato. Capitolo 10 - Le structure, le unioni, la gestione dei bit e le enumerazioni in C: presenta diverse caratteristiche importanti. Le strutture sono come i record del Pascal ¢ di altri lin- guaggi: esse raggruppano dati di tipi diversi. Le strutture sono usate nel Capitolo 11 per formare file composti da record di informazioni. Nel Capitolo 12 le strutture sono usate insieme ai puntatori e all’allocazione dinamica della memoria, per formare strutture dinami- che di dati come le liste concatenate, le code, le pile ¢ gli alberi. Le unioni consentono di utilizzare un'area di memoria per diversi tipi di dato in tempi differenti; questa condivisione pud ridurre la quantita di memoria principale o secondaria richiesta da un programma. Le enumerazioni forniscono un modo conveniente per definire delle costanti simboliche utili; cid aiuta a rendere i programmi pitt autoesplicativi. Le potenti capacita di manipolazione del bit del C consentono ai programmatori di scrivere programmi che usano le capacit’ a basso livello dell’hardware. Cid aiuta i programmi a elaborare stringhe di bit, a impostare a on 0 a off i singoli bit e a immagazzinare le informazioni in modo pitt compatto. Tali capacita, spesso disponibili solo nei linguaggi assembly di basso livello, sono particolarmente apprezza- te dai programmatori nella scrittura di software per i sistemi operativi e per la gestione delle reti. Una caratteristica di questo capitolo 2 la nuova versione ad alta efficienza della simula- zione del mescolatore ¢ distributore di carte. Questa @ una eccellente opportunita per l’inse- gnante per porre l’accento sulla qualita degli algoritmi. Capitolo 11 - Lelaborazione dei file in C: discute delle tecniche usate per elaborare i file di testo ad accesso sequenziale e casuale. II capitolo inizia con un’introduzione alla gerarchia dei dati: dai bit ai byte, ai campi, ai record, ai file. Successivamente & presentata una semplice panoramica sui file e sugli stream del C. I file ad accesso sequenziale sono discussi usando dei programmi che mostrano come aprire e chiudere i file, come immagazzinare i dati in modo sequenziale in un file e come leggere in modo sequenziale i dati da un file. Si discute dei file PREFAZIONE XVII ad accesso casuale usando dei programmi che mostrano come creare un file ad accesso castua- le, come leggere e scrivere i dati con accesso casuale, e come leggere i dati in modo sequenziale da un file ad accesso casuale. II quarto programma combina molte tecniche di accesso ai file, sia sequenziali che casuali, in un programma completo per ’elaborazione di transazioni. Capitolo 12 - Le strutture di dati in C: discute le tecniche usate per creare e manipolare delle strutture dinamiche di dati. Il capitolo inizia discutendo delle structure ricorsive e dell’alloca- zione dinamica della memoria e prosegue con una discussione su come create e conservare varie strutture dinamiche di dati come le liste concatenate, le code (0 liste di attesa), le pile e gli alberi. Per ogni tipo di struttura di dati presentiamo dei programmi funzionanti e comple- tie mostriamo degli esempi di output. Il capitolo consente allo studente di padroneggiare i puntatori, includendo molti esempi di utilizzo dell’indirezione e della doppia indirezione (un concetto particolarmente difficile). Uno dei problemi legati all’utilizzo dei puntatori é che gli studenti hanno difficolta a visualizzare le structure di dati e il modo in cui i loro nodi sono collegati, cosi abbiamo incluso delle illustrazioni che mostrano i collegamenti e la sequenza in cui essi sono creati. esempio dell’albero binario @ una bella pietra miliare per lo studio dei puntatori e delle strutture dinamiche di dati. Questo esempio crea un albero binario, si pre- occupa dell’eliminazione dei duplicati e introduce l’attraversamento ricorsivo dell’albero in ordine anticipato, in ordine e in ordine posticipato. Gli studenti ritengono realmente esausti- vo lo studio e l'implementazione di questo esempio e apprezzano in modo particolare il vedere che l’attraversamento in ordine dell’albero stampa i valori dei nodi nell’ordine stabili- to. II capitolo include un gruppo consistente di esercizi. Rilevante & la sezione speciale “Co- struite il vostro compilatore”. Gli esercizi accompagnano lo studente nello sviluppo di un programma di conversione dalla notazione infissa a quella polacca inversa e di un programma di valutazione di espressioni in notazione polacca inversa. Abbiamo quindi modificato l’algo- ritmo di valutazione di espressioni in notazione polacca inversa in modo da poter generare un codice in linguaggio macchina. II compilatore immagazzina il suddetto codice in un file (usando le tecniche del Capitolo 11). Gli studenti eseguono quindi il codice in linguaggio macchina prodotto dai loro compilatori sul simulatore di software costruito negli esercizi del Capitolo 7! Capitolo 13 - Il preprocessore del C: offre una discussione dettagliata delle direttive del preprocessore. II capitolo include informazioni dettagliate sulla direttiva #include che indu- ce P’inclusione di una copia di un file specificato in sostituzione della direttiva, prima che il file sia compilato, e sulla direttiva #define che definisce delle costanti simboliche ¢ delle macro. II capitolo spiega la compilazione condizionata per consentire al programmatore di controllare ’esecuzione delle direttive del preprocessore e la compilazione del codice del pro- gramma. Si parla dell’operatore # che converte il suo operando in una stringa e dell’operatore ## che concatena due token. Sono presentate le costanti simboliche __LINE_, __FILE_, __DATE__e_TIME_. Alla fine é trattata la macro assert del file di intestazione assert -h. Assert 2 preziosa nel collaudo, la messa a punto, la verifica e la convalida del programma. Capitol 14 - Argomenti avanzati: presenta vari argomenti avanzati che di solito non sono affrontati nei corsi introduttivi. Viene mostrato come redirezionare input di un programma in modo che provenga da un file, come redirezionare l’output in modo che sia immagazzina- to in un file, come redirezionare l’output di un programma in modo che vada a costituire Pinput di un altro programma (operazione chiamata piping) e come accodare output di un programma a un file gia esistente. Viene inoltre discusso come sviluppare funzioni che usano elenchi variabili di argomenti, in che modo gli argomenti della riga di comando possano XVUT PREFAZIONE essere passati alla funzione main e come possano essere utilizzati all’interno di un program- ma. Viene trattata la compilazione di programmi i cui componenti possono essere distribuiti in vari file, la registrazione delle funzioni con atexit in modo che possano essere eseguite al termine dell’esecuzione di un programma e la terminazione dell’esecuzione di un programma con la funzione exit. Poi si discute dei qualificatori di tipo const e volatile e viene mo- strato come specificare il tipo di una costante numerica, usando dei suffissi per gli inter ¢ i numeri in virgola mobile. Infine, si dimostra come usare la libreria per la gestione dei segnali per intercettare degli eventi inattesi, si discute della creazione ¢ dell’uso dei vettori dinamici con le funzioni calloc e realloc e si illustra Putilizzo delle strutture union come una tecnica per evitare lo spreco di spazio di memoria. Capitol 15 - Introduzione al C99: il C99 2 uno standard emendato per il linguaggio di programmazione C che raffina ed espande le potenzialita del C89 (a cui faremo riferimento con Pespressione Standard C nei Capitoli 1-14). Tutcavia il C99 non é stato ancora largamente adotta- to e molti compilatori C non lo supportano completamente. Utilizzeremo ambiente integrato (IDE) Dev-C++ 4.9.9.2 della Bloodshed Software per illustrare le varie caratteristiche del C99. Alcune delle nuove peculiarita del C99 includono: * i commenti su singola linea introdotti da //; + — la possibilita di dichiarare una variabile in un punto qualunque prima del suo utilizzo alPinterno di un blocco (compresa la clausola di inizializzazione di un comando for); * gli inizializzatori designati, che permettono di inizializzare gli elementi dei vettori espli- citamente tramite i rispettivi indici e gli elementi delle struct e delle union tramite i ri- spettivi nomi; * il tipo di dati _B001 che pud rappresentare soltanto i valori 0 e 1; * Pobbligatorieta di specificare esplicitamente un tipo di ritorno nelle funzioni (invece di assumere implicitamente il tipo di ritorno int); * il supporto dei numeri complessi ¢ dell’aritmetica complessa; * ivettori di lunghezza variabile la cui dimensione viene stabilita a tempo di esecuzione (ma una volta fissata, non pud pid subire cainbiamenti); * il supporto di nomi pit lunghi per gli identificatori (identificatori estesi); * i puntatori ristretti per accesso riservato a regioni di memoria; * — la divisione intera affidabile; © ivettori flessibili come membri delle structure; * iltipo di dati long long int; * il supporto della matematica indipendente dal tipo * le funzioni inline; * Pobbligatorietd di specificare un’espressione nel comando return di una funzione con un tipo di ritorno diverso da voids * il divieto di utilizzare un'espressione nel comando return di una funzione con tipo di ritorno void; + la funzione snprintf per prevenire errori di buffer overflow durante la composizione di stringhe in memoria. II nostro approccio fornisce un’introduzione al C99 ¢ un elenco di risorse web per il lettore che voglia indagare pit a fondo gli argomenti trattati. PREFAZIONE XIX Numerose appendici forniscono un valido materiale di riferimento. Nell’Appendice A presentiamo alcune risorse sul C disponibili su Internet nel World Wide Web; nell’ Appen- dice B un elenco delle risorse relative al C99 disponibili su Internet e nel World Wide Webs nell’Appendice C una tabella completa della priorita e dell’associativita degli operatoris nel- PAppendice D V'insieme dei codici dei caratteri ASCII. LAppendice E costituisce un’introdu- zione completa sui sistemi numerici con molti esercizi di auto-valutazione ¢ le relative rispo- ste. LAppendice F fornisce una panoramica sulle Librerie Standard del C sulle relative risorse disponibili nel Web. LAppendice G presenta un elenco commentato di tutte le fun- zioni della libreria C. Infine, l'Appendice H fornisce indicazioni su come risolvere e program- mare il famoso gioco del Sudoku. Ringraziamenti Eun grande piacere ringraziare le molte persone il cui forte impegno, la cooperazione, 'amicizia ¢ la comprensione sono stati fondamentali per la realizzazione di questo libro. In molti alla Deitel & Associates hanno dedicato molte ore a questo progetto — grazie in special modo a Abbey Deitel, Christi Kelsey ¢ Barbara Deitel. Desideriamo anche ringraziare due partecipanti al nostro Honors Internship program che hanno contribuito a questa pubblicazione — Alex Tuteur e Kenny Leftin, studenti di computer science rispettivamente alla Brown University e presso Universita del Maryland. Ci riteniamo fortunati per aver lavorato a questo progetto con lottimo team di professio- nisti dell'editore Prentice Hall. Apprezziamo gli straordinari sforzi di Marcia Horton, diretto- re editoriale della sezione di ingegneria ¢ informatica della Prentice Hall. Jennifer Cappello e Dolores Mars hanno fatto un lavoro strordinario componendo il gruppo dei revisori e gesten- do il proceso di revisione. Francesco Santalucia (un artista indipendente) e Kristine Carney hanno realizzato una bellissima copertina. Vince O’Brien, Bob Engelhardt, Donna Crilly Marta Samsel hanno ottimamente gestito il processo di produzione del libro. Desideriamo ringraziare gli sforzi dei nostri revisori scientifici. In tempi molto stretti, hanno verificato il testo e i programmi, fornendo numerosi suggerimenti per migliorare Taccuratezza e la completezza della presentazione. C Corso completo di programmazione, revisori della 4 edizione originale John Benito (ISO/IEC JTC1 $C22 WG14 Convener) Fred Tydeman (Tydeman Consulting, Vice-Chair of J11 (ANSI “C”)) Richard Albright (Goldey-Beacom College) Mikhail Brikman (Salem State College) Carol Luckhardt Redfield (St. Mary's University) Randy Scovil (Cuesta College) Bin Wang (Wright State University) C Corso completo di programmazione, revisori della 5 edizione originale Alireza Fazelpour (Palm Beach Community College) Don Kostuch (Independent Consultant) XX PREFAZIONE Ed James Beckham (Altera) Gary Sibbitts (St. Louis Community College at Meramec) Tan Barland (Radford University) Kevin Mark Jones (Hewlett Packard) Mahesh Hariharan (Microsoft) William Mike Miller (Edison Design Group, Inc.) Benjamin Seyfarth (Univeristy of Southern Mississippi) William Albrecht (University of South Florida) William Smith (Tulsa Community College) Revisori del C99 Lawrence Jones, (UGS Corp.) Douglas Walls (Senior Staff Engineer, C compiler, Sun Microsystems) Desideriamo ringraziare nuovamente i revisori delle precedenti edizioni (le affiliazioni risal- gono al tempo della revisione); Rex Jaeschke (Independent Consultant; ex presidente dell’ANSI C Committee) John Benito (Presidente del gruppo di lavoro ISO, responsabile per il linguaggio di programmazione C) Randy Meyers (NetCom; presidente dell’ANSI C Committee; ex membro dellANSI C++ Committee) Jim Brzowski (University of Massachusetts — Lowell) Simon North (Synopsis, autore XML) Fred Tydeman (Consulente) Kevin Wayne (Princeton University) Eugene Katzin (Montgomery College) Sam Harbison (Texas Instruments, PH Author) Chuck Allison (Tydeman Consulting) Catherine Dwyer (Pace University) Glen Lancaster (DePaul University) Deena Engel (New York University) David Falconer (California State University at Fullerton) David Finkel (Worcester Polytechnic) H. E. Dunsmore (Purdue University) Jim Schmolze (Tufts University) Geb Thomas (University of Iowa) PREFAZIONE XXI Gene Spafford (Purdue University) Clovis Tondo (IBM Corporation e visiting professor alla Nova University) Jeffrey Esakov (University of Pennsylvania) Tom Slezak (University of California, Lawrence Livermore National Laboratory) Gary A. Wilson (Gary A. Wilson & Assoc; Univ. of California Berkeley Extension) Mike Kogan (IBM Corp.; chief architect of 32-bit OS/2 2.0) Don Kostuch (IBM Corp. instructor in C, C++ € OOP) Ed Lieblein (Nova University) John Carroll (San Diego State University) Alan Filipski (Arizona State University) Greg Hidley (University of California, San Diego) Daniel Hirschberg (University of California, Irvine) Jack Tan (University of Houston) Richard Alpert (Boston University) Eric Bloom (Bentley College) Vi preghiamo di inviarci i vostri commenti, suggerimenti, critiche e correzioni, al fine di migliorare ulteriormente questo libro. Lindirizzo a cui scriverci @ il seguente: deitel@deitel.com Bene, per ofa @ tutto. Vi rinnoviamo il benvenuto nel mondo del C ¢ dello sviluppo delle applicazioni del futuro. Buona fortuna ¢ buon lavoro! Harvey M. Deitel Paul J. Deitel XXII PREFAZIONE Gli autori Paul J. Deitel — amministratore delegato e chief technical officer della Deitel & Associates, Inc. ~ si é laureato presso la Sloan School of Management del MIT dove ha studiato tecnolo- gia dell’informazione. Con la Deitel & Associates ha realizzato dei corsi di formazione su Java, C, C++, Java e C# per clienti di primaria importanza, quali IBM, Sun Microsystems, Dell, Lucent Technologies, Fidelity, NASA (Kennedy Space Center), National Severe Storm Laboratory, White Sands Missile Range, Rogue Wave Software, Boeing, Stratus, Cambridge Technology Partners, Open Environment Corporation, One Wave, Adra Systems, Entergy, CableData Systems, Nortel Networks, Puma, Invensys e molte altre organizzazioni. Ha tenu- to conferenze sui linguaggi C++ e Java per il Boston Chapter dell’ Association for Computing, Machinery. Paul e suo padre Harvey M. Deitel sono autori di libri di informatica che hanno riscosso grande successo in tutto il mondo. Harvey M. Deitel — presidente e chief strategy officer della Deitel & Associates, Inc. — si occupa di informatica da oltre 40 anni ¢ ha maturato una significativa esperienza accademica eaziendale. E uno dei pitt affermati istruttori di informatica a livello mondiale. Ha consegui- to la laurea in scienze presso il Massachusetts Institute of Technology (MIT) e il dottorato presso Universita di Boston. Ha insegnato per 20 anni nelle universita ed & stato rettore della facolta di informatica del Boston College, prima di fondare la Deitel & Associates, Inc. con il figlio Paul J. Deitel. Ha partecipato a progetti d’avanguardia dei sistemi operativi con memoria virtuale presso IBM e il MIT, sviluppando quelle tecniche che oggi sono ampia- mente implementate nei sistemi UNIX, Linux e Windows NT. E autore e coautore con il figlio Paul J. di numerosi volumi e di package multimediali e ne sta scrivendo altri. I testi di Harvey M. Deitel hanno ottenuto un riconoscimento internazionale ¢ sono stati tradotti € pubblicati in giapponese, tedesco, cinese, russo, italiano, francese, spagnolo, coreano, polacco, portoghese, greco, urdu e turco. Harvey M. Deitel ha tenuto numerosi seminari professionali per grandi aziende, istituzioni universitarie e organizzazioni governative e militari. PREFAZIONE XXIII Deitel & Associates, Inc. Deitel & Associates, Inc. ¢ una societa di fama internazionale specializzata nella formazione aziendale ¢ nella realizzazione di testi sui linguaggi di programmazione, sulle tecnologie In- ternet ¢ del World Wide Web, sulle tecnologie orientate agli oggetti e sullo sviluppo di appli- cazioni e-business ed e-commerce. Deitel & Associates membro del World Wide Web Con- sortium (W3C). La societ& ha realizzato corsi introduttivi e avanzati sui pricipali linguaggi ¢ piattaforme di programmazione: Java, C, C++, C#, Visual C++, Visual Basic, XML, Perl, Python e sulle tecnologie orientate agli oggetti, sulla programmazione di Internet e del World Wide Web. I fondatori della Deitel & Associates, Inc. sono Harvey M. Deitel e Paul J. Deitel. Fra i clienti della societa figurano molte delle pitt importanti imprese mondiali, enti governativi e delle forze armate USA e altre organizzazioni. Grazie alla trentennale collaborazione con la societa editrice Prentice Hall, la Deitel & Associates pubblica testi d’avanguardia sulla pro- grammazione, libri per informatica professionale, realizza corsi multimediali interattivi e corsi di addestramento via Web; inoltre crea contenuti per famose piattaforme di e-learning come WebCT, Blackboard e Pearson’s CourseCompass. La Deitel & Associates e gli autori possono essere contattati via e-mail al seguente indirizzo: deitel@deitel.com Per avere maggiori informazioni sulla Deitel & Associates e per consultare l’elenco aggiornato delle sue pubblicazioni e dei corsi di addestramento aziendale, visitate il sito Web: ww.deitel.com Capito.o | Introduzione ai computer, a Internet e al Web Obiettivi + Comprendere le nozioni elementari relative ai computer. + Familiarizzare con i diversi tipi di linguaggi di programmazione. * — Conoscere la storia del linguaggio di programmazione C. + Venire a conoscenza della libreria standard del C. * Comprendere gli elementi dell’ambiente di sviluppo tipico dei programmi C. * Apprezzare le ragioni per le quali appropriato apprendere il C in un primo corso di programmazione. * Apprezzare le ragioni per le quali il C fornisce le basi fondamentali per i successivi studi sulla programmazione, in generale, e sul C++, Java e C# in particolare. * — Conoscere la storia di Internet e del World Wide Web. 1.1 Introduzione Benvenuti nel mondo del C! Abbiamo lavorato duramente per creare quella che, speriamo sinceramente, sara per voi una esperienza informativa e divertente. Questo libro & unico tra quelli sul C per i seguenti motivi: + Badatto a chi ha una conoscenza tecnica, ma ha poca o nessuna esperienza di program- mazione, +E adatto ai programmatori esperti che desiderano una trattazione rigorosa ¢ approfondi- ta del linguaggio. Come puéd un libro piacere a entrambi i gruppi? La risposta & che il libro enfatizza il raggiungimento della chiarezza del programma, attraverso le provate tecniche di “program- mazione strutturata”. Quelli che non sono ancora dei programmatori impareranno sin dal- Vinizio il modo “giusto”. Abbiamo tentato di scrivere in un modo chiaro ¢ diretto. Il libro & abbondantemente illustrato. Cosa probabilmente anche pit: importante, il libro presenta un enorme numero di programmi C funzionanti e mostra gli output (risultati) prodotti, quando questi programmi sono eseguiti su un computer. Ci riferiamo a questa caratteristica chiaman- dola approccio “live-code”. E possibile scaricare tutti i programmi di esempio direttamente dal sito Web ww.deitel.com o dal sito ww. apogeonline.com/libri/88 -503-2254-2/ scheda. 2 CaprroLo 1 I primi quattro capitoli introducono i principi della elaborazione elettronica, la program- mazione dei computer e il linguaggio C. I principianti che hanno seguito i nostri corsi ci hanno assicurato che il materiale di questi capitoli fornisce una solida base per l’approfondi- mento del C sviluppato nei Capitoli dal 5 al 14. Di solito, i programmatori esperti leggeran- no velocemente i primi quattro capitoli e scopriranno in seguito che il C & trattato nei Capi- toli dal 5 al 14 in modo rigoroso ¢, allo stesso tempo, interessante. Essi apprezzeranno in modo particolare i capitoli avanzati, con la loro trattazione dettagliata dei puntatori, delle stringhe, dei file e delle strutcure di dati. Molti programmatori esperti ci hanno riferito il loro apprezzamento per la nostra discus- sione sulla programmazione strutturata. Per quanto avessero programmato spesso in un lin- guaggio strutturato come il Pascal, non erano in grado di scrivere il miglior codice possibile perché non avevano mai conosciuto in modo formale la programmazione strutturata. Ora, dopo avere imparato il C da questo libro, hanno la po: ta di migliorare il proprio stile di programmazione. Per cui, che siate dei principianti o dei programmatori esperti, in questo libro ci sono molte cose che potranno informarvi, divertirvi e stimolarvi. Molti hanno familiarit& con le cose interessanti che i computer sono in grado di fare. In questo corso, imparerete a comandare i computer perché facciano quelle cose. E il software (owverosia, le istruzioni che voi scrivete per ordinare al computer di eseguire delle azioni e prendere delle decisioni) che controlla i computer (detti spesso hardware). Questo testo for- nisce una introduzione alla programmazione dell’ANSI C, la versione standardizzata nel 1989 negli Stati Uniti dall’Istituto Nazionale Americano per gli Standard (ANSI) ¢, nel resto del mondo, dall’Organizzazione Internazionale per gli Standard (ISO). Chiameremo tale lin- guaggio Standard C. Tratteremo anche il C99, ovvero, I'ultima versione dello standard C. Il C99 non é stato ancora largamente adottato; quindi abbiamo scelto di trattarlo nel Capitolo 15, mentre nei Capitoli 1-14 parleremo dello Standard (ANSI/ISO) C. Lutilizzo dei computer sta crescendo in quasi tutti i campi delle attivita umane. In un’era di costi costantemente in crescita, quelli della elaborazione elettronica sono diminuiti vertigi- nosamente, a causa dei rapidissimi sviluppi della tecnologia hardware e software. Quei com- puter che, solo una ventina di anni fa, potevano riempire grandi stanze ¢ costavano milioni di dollari, oggi possono essere prodotti su lamine di silicio (chip) pitt piccole di un’unghia, che costano forse pochi dollari. Ironicamente, il silicio 2 uno dei materiali pitt abbondanti sulla terra: ¢ un ingrediente della sabbia comune. La tecnologia del chip di silicio ha reso l’elabora- zione elettronica cosi economica che, in tutto il mondo, sono in uso centinaia di milioni di computer general-purpose (per scopi generici), aiutando la gente negli affari, nell’industria, nel governo e nelle loro vite personali, che potrebbero facilmente raddoppiarsi in una man- ciata di anni. Al giorno d’oggi il C++ ¢ Java, due linguaggi orientati agli oggetti che si basano sul C, stanno attirando molto interesse e nel mercato dei linguaggi di programmazione molti dei fornitori principali, piuttosto che offrire dei prodotti separati, ora vendono semplicemente un C/C++ combinato. Cid da all’utente, se lo desidera, la possibilita di continuare a pro- grammare in C e di migrare gradualmente al C++, quando lo riterra opportuno. State dunque per intraprendere un percorso interessante e, speriamo, remunerativo. Man mano che procederete, se vorrete comunicare con noi, inviateci una email su Internet all'indirizzo deitel@deitel.com o esplorando il nostro sito Web allindirizzo ww.deitel.com. Faremo tutto il possibile per rispondervi velocemente. Speriamo che vi divertirete imparando il C con questo libro.