Programmazione in C
di Kim N. King
Aggiornamenti e Contenuti Digitali
Il linguaggio C può essere definito la lingua franca della programmazione e, nonostante altri linguaggi (molti basati su C) abbiano guadagnato popolarità negli ultimi anni, resta tra i più utilizzati per la realizzazione di prodotti software e tra i più diffusi nei corsi di base di programmazione.
Il volume di King è uno dei testi di maggior successo in campo accademico e professionale poiché tratta in maniera completa ed esaustiva le caratteristiche e le librerie del C, facendo riferimento a entrambi gli standard C89 e C99.
Gli argomenti sono presentati in maniera graduale e accompagnati da numerosi esempi, i concetti difficili sono introdotti dapprima in modo sintetico e ripresi successivamente in maggiore dettaglio, rendendo il volume accessibile ai principianti e utile per i programmatori esperti. Completano il testo numerosi esercizi e progetti di programmazione. Principali caratteristiche
- Copertura degli standard C89 e C99, in evidenza le novità di C99
- Guida alle funzioni delle librerie C89 e C99
- Numerosi esercizi e progetti di programmazione
- Programmi indipendenti dalla piattaforma
- Copertura di GCC
- GNU Compiler Collection
Kim N. King
Docente di informatica presso la Georgia State University. L'edizione italiana è curata dal professor Andrea Schaerf dell'Università degli Studi di Udine.
Pagine | 816 |
Data pubblicazione | Settembre 2009 |
Data ristampa | |
ISBN | 8838785825 |
ean | 9788838785825 |
Tipologia prodotto | Cartaceo |
Collana | Apogeo Education |
Editore | Maggioli Editore |
Dimensione | 16x22 |
Prefazione Capitolo 1 – Introduzione al C 1.1 Storia del C Origini Standardizzazione Linguaggi basati sul C 1.2 Pregi e debolezze del C Pregi Debolezze Utilizzo efficace del C Domande & Risposte Capitolo 2 – Fondamenti di C 2.1 Scrivere un semplice programma Visualizzare il bad pun Compilazione e linking Sistemi di sviluppo integrati 2.2 La struttura generale di un programma Direttive Funzioni Istruzioni Stampare le stringhe 2.3 Commenti 2.4 Variabili e assegnamenti Tipi Dichiarazioni Assegnamenti Stampare il valore di una variabile Calcolare il peso volumetrico di un pacco Inizializzazione Stampare espressioni 2.5 Leggere l’input Calcolare il peso dimensionale di un pacco (rivisitato) 2.6 Definire nomi e costanti Convertire da Fahrenheit a Celsius 2.7 Identificatori Keyword 2.8 La stesura di un programma C Domande & Risposte Esercizi Progetti di programmazione Capitolo 3 – Input/Output formattato 3.1 La funzione printf Specifiche di conversione Utilizzare la printf per formattare i numeri Sequenze di escape 3.2 La funzione scanf Come funziona la scanf Caratteri ordinari nelle stringhe di formato Confondere printf con scanf Sommare frazioni Domande & Risposte Esercizi Progetti di programmazione Capitolo 4 – Espressioni 4.1 Operatori aritmetici Precedenza degli operatori e associatività Calcolare il carattere di controllo dei codici a barre 4.2 Operatori di assegnamento Assegnamento semplice Lvalue Assegnamento composto 4.3 Operatori di incremento e decremento 4.4 Calcolo delle espressioni Ordine nel calcolo delle sottoespressioni 4.5 Expression statement Domande e risposte Esercizi Progetti di programmazione Capitolo 5 – Istruzioni di selezione 5.1 Espressioni logiche Operatori relazionali Operatori di uguaglianza Operatori logici 5.2 L’istruzione if Le istruzioni composte La clausola else Istruzioni if in cascata Calcolare le commissioni dei broker Il problema dell’else pendente Espressioni condizionali Valori booleani nel C89 Valori booleani in C99 5.3 L’istruzione switch Il ruolo dell’istruzione break Stampare la data nel formato legale Domande & Risposte Esercizi Progetti di programmazione Capitolo 6 – Cicli 6.1 L’istruzione while Cicli infiniti Stampare la tavola dei quadrati Sommare una serie di numeri 6.2 L’istruzione do Calcolare il numero di cifre in un intero 6.3 L’istruzione for Idiomi per l’istruzione for Omettere le espressioni nelle istruzioni for I cicli for nel C99 L’operatore virgola Stampare la tavola dei quadrati (rivisitato) 6.4 Uscire da un ciclo L’istruzione break L’istruzione continue L’istruzione goto Bilancio di un conto 6.5 L’istruzione vuota Domande & Risposte Esercizi Progetti di programmazione Capitolo 7 – I tipi base 7.1 Tipi interi Tipi interi nel C99 Costanti intere Costanti intere nel C99 Integer overflow Leggere e scrivere interi Sommare una serie di numeri (rivisitato) 7.2 Tipi floating point Costanti floating point Leggere e scrivere numeri a virgola mobile 7.3 Tipi per i caratteri Operazioni sui caratteri Caratteri signed e unsigned Tipi aritmetici Sequenze di escape Funzioni per la manipolazione dei caratteri Leggere e scrivere caratteri usando le funzioni scanf e printf Leggere e scrivere caratteri usando le funzioni getchar e putchar Determinare la lunghezza di un messaggio 7.4 Conversione di tipo Le normali conversioni aritmetiche Conversioni negli assegnamenti Conversioni implicite nel C99 Casting 7.5 Definizione di tipi Vantaggi della definizione di tipi Definizione di tipi e portabilità 7.6 L’operatore sizeof Domande & Risposte Esercizi Progetti di programmazione Capitolo 8 – Vettori 8.1 Vettori unidimensionali Indicizzazione di un vettore Invertire una serie di numeri Inizializzazione dei vettori Designatori inizializzati Controllare il numero di cifre ripetute Usare l’operatore sizeof con i vettori Calcolare gli interessi 8.2 Vettori multidimensionali Inizializzare un vettore multidimensionale Vettori costanti Distribuire una mano di carte 8.3 Vettori a lunghezza variabile (C99) Domande & Risposte Esercizi Progetti di programmazione Capitolo 9 – Funzioni 9.1 Definire e invocare le funzioni Calcolo delle medie Stampare un conto alla rovescia Stampare un motto (rivisitato) Definizione di funzioni Chiamate a funzione Controllare se un numero è primo 9.2 Dichiarazioni di funzioni 9.3 Argomenti Conversione degli argomenti Vettori usati come argomenti Vettori a lunghezza variabile usati come argomenti Usare static nella dichiarazione di un parametro vettore Letterali composti 9.4 L’istruzione return 9.5 Interrompere l’esecuzione di un programma La funzione exit 9.6 Ricorsione Algoritmo Quicksort Quicksort Domande & Risposte Esercizi Progetti di programmazione Capitolo 10 – Organizzazione del programma 10.1 Variabili locali Variabili locali statiche Parametri 10.2 Variabili esterne Esempio: usare una variabile esterna per implementare uno stack Pregi e difetti delle variabili esterne Indovinare un numero 10.3 Blocchi 10.4 Scope 10.5 Organizzare un programma C Classificare una mano di poker Domande & Risposte Esercizi Progetti di programmazione Capitolo 11 – Puntatori 11.1 Variabili puntatore Dichiarare una variabile puntatore 11.2 L’operatore indirizzo e l’operatore asterisco L’operatore indirizzo L’operatore asterisco 11.3 Assegnamento dei puntatori 11.4 Puntatori usati come argomenti Trovare il massimo e il minimo in un vettore Usare const per proteggere gli argomenti 11.5 Puntatori usati come valori restituiti Domande & Risposte Esercizi Progetti di programmazione Capitolo 12 – Puntatori e vettori 12.1 Aritmetica dei puntatori Sommare un intero a un puntatore Sottrarre un intero da un puntatore Sottrarre da un puntatore un altro puntatore Confrontare i puntatori Puntatori a letterali composti 12.2 Usare i puntatori per l’elaborazione dei vettori Abbinare gli operatori * e ++ 12.3 Usare il nome di un vettore come puntatore Invertire una sequenza di numeri (rivisitato) Argomenti costituiti da vettori (rivisitato) Utilizzare un puntatore come il nome di un vettore 12.4 Puntatori e vettori multidimensionali Elaborare gli elementi di un vettore multidimensionale Elaborare le righe di un vettore multidimensionale Elaborare le colonne di un vettore multidimensionale Utilizzare il nome di un vettore multidimensionale come puntatore 12.5 Puntatori e vettori a lunghezza variabile Domande & Risposte Esercizi Progetti di programmazione Capitolo 13 – Stringhe 13.1 Stringhe letterali Sequenze di escape nelle stringhe letterali Proseguire una stringa letterale Come vengono memorizzare le stringhe letterali Operazioni sulle stringhe letterali Stringhe letterali e costanti carattere a confronto 13.2 Variabili stringa Inizializzare una variabile stringa Vettori di caratteri e puntatori a caratteri a confronto 13.3 Leggere e scrivere le stringhe Scrivere una stringa con le funzioni printf e puts Leggere le stringhe con le funzioni scanf e gets Leggere le stringhe carattere per carattere 13.4 Accedere ai caratteri di una stringa 13.5 Usare la libreria C per le stringhe La funzione strcpy (string copy) La funzione strlen (string length) La funzione strcat (string concatenation) La funzione strcmp (string comparison) Stampare i promemoria di un mese 13.6 Idiomi per le stringhe Cercare la fine di una stringa Copiare una stringa 13.7 Vettori di stringhe Argomenti della riga di comando Controllare i nomi dei pianeti Domande & Risposte Esercizi Progetti di programmazione Capitolo 14 – Il preprocessore 14.1 Come opera il preprocessore 14.2 Direttive del preprocessore 14.3 Definizione di macro Macro semplici Macro parametriche L’operatore # L’operatore ## Proprietà generali delle macro Parentesi nelle definizioni delle macro Creare macro più complesse Macro predefinite Macro predefinite aggiunte dal C99 Argomenti delle macro vuoti Macro con un numero variabile di argomenti L’identificatore __func__ 14.4 Compilazione condizionale Le direttive #if e #endif L’operatore defined Le direttive #ifdef e #ifndef Le direttive #elif e #else Usi della compilazione condizionale 14.5 Direttive varie La direttiva #error La direttiva #line La direttiva #pragma L’operatore _Pragma Domande & Risposte Esercizi Capitolo 15 – Scrivere programmi di grandi dimensioni 15.1 File sorgente 15.2 File header La direttiva #include Condividere le definizioni delle macro e le definizioni dei tipi Condividere i prototipi delle funzioni Condividere la dichiarazione delle variabili include annidati Proteggere i file header Direttive #error nei file header 15.3 Suddividere un programma su più file Formattare del testo 15.4 Build di un programma costituito da più file Makefile Errori durante il linking Rieseguire il build di un programma Definire la macro al di fuori di un programma Domande & Risposte Esercizi Progetti di programmazione Capitolo 16 – Strutture, unioni ed enumerazioni 16.1 Variabili struttura Dichiarare variabili struttura Inizializzare variabili struttura Inizializzatori designati Operazioni sulle strutture 16.2 Tipi struttura Dichiarare il tag di struttura Definire un tipo struttura Strutture come argomenti e valori restituiti Letterali composti 16.3 Annidamento di strutture e vettori Strutture annidate Vettori di strutture Inizializzare un vettore di strutture Mantenere un database di componenti 16.4 Unioni Usare le unioni per risparmiare spazio Usare le unioni per creare strutture dati composite Aggiungere un “campo etichetta” a un’unione 16.5 Enumerazioni Tag e nomi di tipo di enumerazione Enumerazioni come gli interi Utilizzare le enumerazioni per dichiarare dei campi etichetta Domande & Risposte Esercizi Progetti di programmazione Capitolo 17 – Uso avanzato dei puntatori 17.1 Allocazione dinamica sulla memoria Funzioni di allocazione della memoria Puntatori nulli 17.2 Stringhe allocate dinamicamente Utilizzare malloc per allocare memoria per una stringa Utilizzare l’allocazione dinamica della memoria nelle funzioni per le stringhe Vettori di stringhe allocate dinamicamente Stampare i promemoria di un mese (rivisitato) 17.3 Vettori allocati dinamicamente Utilizzare malloc per allocare lo spazio per un vettore La funzione calloc La funzione realloc 17.4 Deallocare la memoria La funzione free Il problema del “puntatore pendente” 17.5 Liste concatenate Dichiarare un tipo nodo Creare un nodo L’operatore -> Inserire un nodo all’inizio di una lista concatenata Ricerca in una lista concatenata Eliminare un nodo da una lista concatenata Liste ordinate Mantenere un database di componenti (rivisitato) 17.6 Puntatori a puntatori 17.7 Puntatori a funzioni Puntatori a funzioni usati come argomenti La funzione qsort Altri utilizzi dei puntatori a funzione Tavole delle funzioni trigonometriche 17.8 Puntatori restricted (C99) 17.9 Membri vettore flessibili (C99) Domande & Risposte Esercizi Progetti di programmazione Capitolo 18 – Dichiarazioni 18.1 Sintassi delle dichiarazioni 18.2 Classi di memorizzazione Proprietà delle variabili Classe di memorizzazione auto Classe di memorizzazione static Classe di memorizzazione extern Classe di memorizzazione register Classe di memorizzazione di una funzione Riepilogo 18.3 Qualificatori di tipo 18.4 Dichiaratori Decifrare dichiarazioni complesse Usare le definizioni di tipo per semplificare le dichiarazioni 18.5 Inizializzatori Variabili non inizializzate 18.6 Funzioni inline (C99) Definizioni inline Restrizioni per le funzioni inline Usare le funzioni inline con GCC Domande & Risposte Esercizi Capitolo 19 – Progettazione di un programma 19.1 Moduli Coesione e accoppiamento Tipi di moduli 19.2 Information hiding Un modulo stack 19.3 Tipi di dato astratti Incapsulamento Tipi incompleti 19.4 Un tipo di dato astratto per lo stack Definire l’interfaccia per lo stack ADT Implementare lo stack ADT usando un vettore di lunghezza fissa Modificare il tipo degli elementi dello stack ADT Implementare lo stack ADT usando un vettore dinamico Implementare lo stack ADT usando una lista concatenata 19.5 Elementi di progettazione per i tipi di dato astratti Convenzioni sui nomi Gestione degli errori ADT generici ADT nei linguaggi più recenti Domande & Risposte Esercizi Progetti di programmazione Capitolo 20 – Programmazione a basso livello 20.1 Operatori bitwise Operatori di scorrimento bitwise Altri operatori bitwise Utilizzare gli operatori bitwise per accedere ai bit Usare gli operatori bitwise per accedere a campi di bit Cifratura XOR 20.2 Campi di bit nelle strutture Come vengono memorizzati i campi di bit 20.3 Altre tecniche a basso livello Definire dei tipi indipendenti dalla macchina Usare le unioni per fornire diverse viste per i dati Usare i puntatori come indirizzi Visualizzare le locazioni di memoria Il qualificatore di tipo volatile Domande & Risposte Esercizi Progetti di programmazione Capitolo 21 – La libreria standard 21.1 Usare la libreria Restrizioni sui nomi utilizzati nella libreria Funzioni nascoste da macro 21.2 Panoramica della libreria C89 Diagnostica Gestione dei caratteri Errori Caratteristiche dei tipi a virgola mobile Dimensione dei tipi interi Localizzazione Matematica Salti non locali Gestione dei segnali Argomenti variabili Definizioni comuni Input/Output Utilità generale Gestione delle stringhe Data e ora 21.3 Modifiche della libreria C99 Aritmetica complessa Ambiente in virgola mobile Conversione di formato per i tipi interi Ortografie alternative Valori e tipo booleani Tipi interi Matematica per tipi generici Utilità per i caratteri estesi multibyte e per i wide-characters Classificazione dei wide-character e utilità di mapping 21.4 L’header : definizioni comuni 21.5 L’header (C99): valori e tipo booleani Domande & Risposte Esercizi Progetti di programmazione Capitolo 22 – Input/Output 22.1 Stream Puntatori a file Stream standard e reindirizzamento File testuali e file binari 22.2 Operazioni sui file Aprire un file Modalità di apertura Chiudere un file Collegare un file con uno stream aperto Ottenere i nomi dei file dalla riga di comando Controllare se un file può essere aperto File temporanei File buffering Operazioni varie sui file 22.3 I/O formattato Le funzioni ...printf Specifiche di conversione per le funzioni ...printf Modifiche del C99 alle specifiche di conversione ...printf Esempi per le specifiche di conversione delle funzioni ...printf Le funzioni ...scanf Stringhe di formato per le funzioni ...scanf Specifiche di conversione per la ...scanf Esempi delle specifiche di conversione per le funzioni ...scanf Rilevare la fine del file e le condizioni di errore 22.4 I/O di caratteri Funzioni di output Funzioni di input Copiare un file 22.5 I/O di righe Funzioni di output Funzioni di input 22.6 I/O di blocchi 22.7 Posizionamento nei file Modificare un file contenente registrazioni di componenti 22.8 I/O di stringhe Funzioni di output Funzioni di input Domande & Risposte Esercizi Progetti di programmazione Capitolo 23 – Supporto per numeri e caratteri 23.1 L’header : caratteristiche dei tipi a virgola mobile 23.2 L’header : dimensioni dei tipi interi 23.3 L’header (C89): matematica Errori Funzioni trigonometriche Funzioni iperboliche Funzioni esponenziali e logaritmiche Funzioni di elevamento a potenza Funzioni di intero più vicino, valore assoluto e resto 23.4 L’header (C99): matematica Lo standard floating point dell’IEEE Tipi Macro Errori Funzioni Macro di classificazione Funzioni trigonometriche Funzioni iperboliche Funzioni esponenziali e logaritmiche Funzioni di elevamento a potenza e valore assoluto Funzioni di errore e gamma Funzioni per l’intero più vicino Funzioni per il resto Funzioni di manipolazione Funzioni di massimo, minimo e differenza positiva Moltiplicazione e somma in virgola mobile Macro per i confronti 23.5 L’header (C99): gestione dei caratteri Funzioni per la classificazione dei caratteri Testare le funzioni di classificazione dei caratteri Funzioni per il case-mapping Testare le funzioni di case-mapping 23.6 L’header (C99): manipolazione delle stringhe Funzioni per la copia Funzioni per il concatenamento Funzioni di confronto Funzioni di ricerca Funzioni varie Domande & Risposte Esercizi Progetti di programmazione Capitolo 24 – Gestione degli errori 24.1 L’header : diagnostica 24.2 L’header : errori Le funzioni perror e strerror 24.3 L’header : gestione dei segnali Macro per i segnali La funzione signal Handler predefiniti per i segnali La funzione raise Testare i segnali 24.4 L’header : salti non locali Testare setjmp/longjmp Domande & Risposte Esercizi Capitolo 25 – Internazionalizzazione 25.1 L’header : localizzazione Categorie La funzione setlocale La funzione localeconv 25.2 Caratteri multibyte e wide character Caratteri multibyte Wide character Unicode e l’Universal Character Set Codifiche per Unicode Funzioni di conversione tra caratteri multibyte e wide character Funzioni di conversione tra stringhe multibyte e stringhe wide character 25.3 Digrafi e trigrafi Trigrafi Digrafi L’header : grafie alternative 25.4 Universal Character Name (C99) 25.5 L’header (C99): utilità per i multibyte estesi e i wide character Orientamento dello stream Funzioni di input/output formattato per i wide character Funzioni di input/output per i wide character Utilità generali per le stringhe wide Funzioni varie Funzioni wide character per la conversione degli orari Utilità per la conversione multibyte esteso/wide character Funzioni riavviabili di conversione tra stringhe multibyte e stringhe wide 25.6 L’header (C99): utilità per la classificazione e la mappatura dei wide character Funzioni di classificazione dei wide character Funzioni estendibili di classificazione dei wide character Funzioni di mappatura dei wide character Funzioni estendibili per la mappatura dei wide character Domande & Risposte Esercizi Progetti di programmazione Capitolo 26 – Funzioni di libreria 26.1 L’header : argomenti variabili Chiamare una funzione con un elenco variabile di argomenti Le funzioni v...printf Le funzioni v...scanf 26.2 L’header : utilità generali Le funzioni per le conversioni numeriche Testare le funzioni di conversione numerica Funzioni per la generazione di sequenze pseudo casuali Testare le funzioni per la generazione di sequenze pseudo casuali Comunicazione con l’ambiente Utilità per la ricerca e l’ordinamento Determinare le miglia aeree Funzioni per l’aritmetica intera 26.3 L’header : data e ora Funzioni per la manipolazione delle ore Funzioni per la conversione delle ore Visualizzare la data e l’ora Domande & Risposte Esercizi Progetti di programmazione Capitolo 27 – Supporto aggiuntivo del C99 per la matematica 27.1 L’header (C99): tipi interi Tipi Limiti dei tipi interi con dimensione specificata Limiti per gli altri tipi interi Macro per le costanti intere 27.2 L’header (C99): conversione di formato dei tipi interi Macro per specificatori di formato Funzioni per i tipi interi con la dimensione più grande 27.3 Numeri complessi (C99) Definizione dei numeri complessi Aritmetica complessa Tipi complessi nel C99 Operazioni sui numeri complessi Regole di conversione per i tipi complessi 27.4 L’header (C99): aritmetica complessa Macro La direttiva pragma CX_LIMITED_RANGE Funzioni Funzioni trigonometriche Funzioni iperboliche Funzioni esponenziali e logaritmiche Funzioni per le potenze e il valore assoluto Funzioni di manipolazione Trovare le radici di un’equazione quadratica 27.5 L’header (C99): matematica per tipi generici Macro per tipi generici Invocare una macro per tipi generici 27.6 L’header (C99): ambiente in virgola mobile Flag di stato floating point e modi di controllo Macro Direttiva pragma FENV_ACCESS Funzioni per le eccezioni floating point Funzioni per gli arrotondamenti Funzioni relative all’ambiente Domande & Risposte Esercizi Progetti di programmazione Appendice A – Operatori C Appendice B – C99 e C89 a confronto Appendice C – C89 e K&R C a confronto Appendice D – Set di caratteri ASCII Appendice E – Funzioni della libreria standard Bibliografia Indice analitico