Trovate nel seguito gli esempi di codice illustrati a lezione insieme alle relative slide.
Ritorna alla pagina del corso.
| Introduzione al C | |
|---|---|
| 0010-primo | scheletro programma C |
| 0020-primo | |
| 0030-primo | equivalente assembly dello scheletro di programma |
| 0040-primo | scheletro programma, indentazione nulla |
| 0050-primo | altro esempio di indentazione in versione molto lazy (e da evitare come la precedente) |
| 0060-obfusc | esempio di codice offuscato |
| 0070-preprocessed | codice preprocessato |
| 0080-commenti | introduzione ai commenti |
| 0090-vardef | definizioni variabili |
| 0100-vardef | uso variabile non inizializzata |
| 0110-vardef | breve introduzione ai tipi delle variabili |
| 0120-identificativi | identificativi possibili per il C |
| 0130-printf | printf(): banale stampa di una stringa |
| 0140-printf | sequenza di escape -> a capo |
| 0150-printf | sequenza di escape "tabulazione" |
| 0160-printf | sequenza di escape "carriage return" |
| 0170-printf | specificatori di formato |
| 0180-printf | cosa puo' stampare printf()? |
| 0190-uninit | uso variabile non inizializzata (adesso usiamo printf) |
| 0200-scanf | scanf |
| 0210-scanf | valore restituito da scanf |
| 0220-scanf | scanf e letture multiple |
| 0230-scanf | scanf e testo in stringa di formato, valore restituito da scanf() |
| 0240-math | esempi funzioni matematiche |
| 0250-rand | esempi funzioni predefinite -> numeri casuali |
| 0260-rand | numeri casuali, intervallo valori, operatore % |
| 0270-myfunc | esempio definizione di propria funzione |
| Le espressioni | |
| 0310-aritmetiche | principali operatori aritmetici |
| 0320-incr | operatori di incremento/decremento prefissi e postfissi |
| 0330-and | operatore logico AND, operatore relazionale < e espressione semanticamente non corretta |
| 0340-and | operatore logico AND, > e cortocircuito valutazioni espressioni logiche |
| 0350-or | OR logico e anticipo costrutto if-else |
| 0360-precedence | precedenza e associativita' operatori |
| 0370-equal | uso incorretto di == con numeri a virgola mobile |
| 0380-ternario | operatore ternario ? e %s |
| 0390-bitwise | esempi di operazioni bit a bit, stampa di un numero in formato binario |
| 0400-bitwise | esempi di operazioni bit a bit |
| 0410-powerbitwise | quick check for power of 2 using bitwise operators |
| 0420-bitwiseconfig | example of bitwise status flag |
| Controllo di Flusso | |
| 0510-if | valutazione condizioni: if() semplice |
| 0520-wrongif | valutazione condizioni: if() errore comune! |
| 0530-if | valutazione condizioni: if() semplice |
| 0540-ifelse | if()-else e cortocircuito espressione |
| 0550-nestedif | if() nidificati |
| 0560-danglingelse | dangling else |
| 0570-danglingelse | dangling else |
| 0580-danglingelse | dangling else |
| 0590-switchcase | valutazione condizioni: confronto multiplo mediante if()-else a cascata |
| 0600-switchcase | valutazione condizioni: switch()-case |
| 0610-switchcase | valutazione condizioni: switch()-case con case multipli |
| 0620-switchcase | esempio switch()-case |
| 0630-while | Iterazioni, il ciclo while() |
| 0640-while | Iterazioni, il ciclo while() pericolo ciclo infinito |
| 0650-dowhile | do-while, controllo input utente |
| 0660-dowhile | Iterazioni, ciclo do-while() calcolo MCD |
| 0670-dowhile | Iterazioni, ciclo do-while() cifre binarie |
| 0680-dowhile | Iterazioni, ciclo do-while() cifre binarie, operatore sizeof() |
| 0690-dowhile | Iterazioni, ciclo do-while() esempio menu' |
| 0700-for | Iterazione, ciclo for |
| 0710-for | ciclo for(;;) uso dell'operatore "," |
| 0720-for | ciclo for(;;) operatore "," in aggiornamento |
| 0730-for | for(;;) omissione espressioni |
| 0740-nestedfor | nested for(;;) |
| 0750-for | ciclo for(;;) definizione variabili all'interno del for(;;) stesso, accenno a visibilità variabili |
| 0760-continue | continue, specificatore di formato %c |
| 0770-break | comando break per interrompere ciclo |
| I tipi di dato in C | |
| 0810-sizeof | sizeof() |
| 0820-float | specificatori di formato per il tipo base float |
| 0830-float | suffissi per double e long double |
| 0840-float | numeri a virgola mobile e approssimazioni |
| 0850-floatlimits | intervallo numeri a virgola mobile, macro sizeof() |
| 0860-floatinf | numeri float e inf |
| 0870-limits | nuovi concetti limit.h e intervallo valori dei tipi interi |
| 0880-integers | specificatori di formato per numeri interi |
| 0890-overflow | overflow (traboccamento) di variabile intera |
| 0900-char | il tipo char, tabella ASCII, introduzione a ctype.h |
| 0910-charformat | il tipo char, specificatore di formato |
| 0920-chario | lettura del tipo char da tastiera |
| 0930-chario | buffer di tastiera |
| 0940-chario | lettura da tastiera di simboli, accortezze... |
| 0950-chariocorr | lettura da tastiera di simboli, versione corretta per evitare contenuto buffer tastiera |
| 0960-char | apici singoli, il tipo char e' comunque un tipo di dato numerico intero |
| 0970-char2digit | conversione cifre come simboli in cifre come valore |
| 0980-bool | il tipo di dato _Bool |
| 0990-assign | conversioni di assegnamento |
| 1000-implicit | conversioni implicite o automatiche |
| 1010-explicit | conversioni esplicite |
| 1020-global | variabili locali e globali |
| 1030-const | costanti, uso di const |
| 1040-define | costanti, uso di #define |
| Gli Array | |
| 1110-singlevarlimits | limiti delle variabili "singole" |
| 1120-array | array monodimensionali |
| 1130-array | inizializzazione array, differenti casi |
| 1140-sizeofarray | array e sizeof |
| 1150-bufferoverrun | esempio buffer overrun |
| 1160-matrix | array bidimensionale |
| Funzioni predefinite | |
| 1210-nopredefined | esempio di NON utilizzo delle funzioni predefinite |
| 1220-predefined | esempio funzioni predefinite: ctype.h |
| 1230-abs | predefined function abs() |
| 1240-fabs | predefined function fabs() |
| 1250-secondorder | 2nd order polynomial equation, math predefined functions pow(), sqrt() |
| Allocazione Dinamica della Memoria | |
| 1310-vla | Variable Length Array |
| 1320-ampersend | operatore & |
| 1330-punt | puntatore a variabile scalare, definizione e uso |
| 1340-arrayaddr | equivalenza array e puntatori |
| 1350-mallocfree | allocazione dinamica memoria con malloc() e free(), controllo errore allocazione |
| 1360-calloc | calloc() vs malloc() |
| 1370-vlaerror | Variable Length Array: problema durata automatica |
| 1380-malloc | rivisitazione problema durata automatica VLA con malloc() |
| 1390-free | uso reale di free() per evitare memory leak, simulazione del lancio di dadi, esempio complesso |
| 1400-realloc | funzione realloc() |
| 1410-heapstack | heap, stack, code & data... |
| 1420-puntaritm | aritmetica dei puntatori |
| 1430-puntaritm | uso operatori [] ed equivalenza aritmetica dei puntatori |
| 1440-puntaritm | scorrimento array usando puntatore e aritmetica puntatori |
| 1450-overrun | buffer overrun nei puntatori |
| 1460-memoryleak | esempio memory leak |
| 1470-lingering | esempio lingering pointer |
| 1480-lingeringcorretto | esempio lingering pointer corretto |
| 1490-lingering | esempio lingering pointer |
| Le Stringhe | |
| 1510-consstring | stringa definizione |
| 1520-string | confronto tra 2 array di char, uno contenente una stringa e uno che non contiene una stringa |
| 1530-iostring | I/O stringa |
| 1540-strlen | nuovi elementi string.h -> strlen() |
| 1550-strcmp | nuovi elementi string.h -> strcmp() |
| 1560-strpunt | stringa come puntatore a char |
| 1570-strcpy | copia e concatenazione di stringhe |
| 1580-strchr | ricerca caratteri e sottostringhe |
| 1590-strchr | ricerca caratteri esaustiva |
| 1600-strtok | uso di strtok() |
| Le Funzioni | |
| 1710-func | nuovi concetti: definizione di funzione |
| 1720-funcproto | prototipi di funzione |
| 1730-valore | passaggio argomenti per valore |
| 1740-indirizzo | passaggio argomenti per indirizzo |
| 1750-passaggistringhe | passaggio array ad una funzione |
| 1760-passaggistringhe | passaggio array ad una funzione equivalenza uso puntatore |
| 1770-passaggioarray | passaggio array monodimensionale a funzione, gestire le dimensioni |
| 1780-passaggioarray2 | passaggio array monodimensionale a funzione, intercambiabilita' delle modalita' di passaggio |
| 1790-complex | funzione che restituisce piu' di 1 singolo valore sfruttando il passaggio argomenti per indirizzo |
| 1800-ricorsione | la ricorsione: esempio fattoriale |
| 1810-mcd | la ricorsione, esempio MCD |
| 1820-hanoi | la ricorsione, esempio Torre Hanoi |
| 1830-recursionwrong | errore, la condizione d'uscita non e' detto si verifichi |
| 1840-fibo1 | ricorsione inefficiente (numeri di Fibonacci) |
| 1850-fibo2 | ricorsione + dynamic programming, prefisso static |
| 1860-mystery | ricorsione, cosa fa questo programma? |
| Puntatori a Puntatori | |
| 1910-matrixmanag | allocazione dinamica array bidimensionali usando un array monodimensionale |
| 1920-matrixalloc | allocazione dinamica array bidimensionali usando puntatori a puntatori |
| 1930-strarraymon | array di stringhe mediante array bidimensionale |
| 1940-strarrayarrpunt | array di stringhe mediante array di puntatori |
| 1950-strarray | array di stringhe mediante array di puntatori ottenuto con puntatori a puntatori |
| 1960-cli | esempio di uso di array di stringhe, gli argomenti sulla linea di comando |
| 1970-bidim | passaggio array bidimensionali a funzione |
| Input, Output e gestione file | |
| 2010-fopen | uso di fopen() per file in lettura e perror() |
| 2020-fopenw | uso di fopen() in scrittura |
| 2030-fopena | uso di fopen() in "append" |
| 2040-fgetputc | fgetc() e fputc() |
| 2050-fgetputs | fgets() e fputs() |
| 2060-formattedoutput | scrittura formattata |
| 2070-formattedinput | uso fscanf() per leggere parola per parola e valore di ritorno per determinare se sono a fine file |
| 2080-formattedinput | uso fscanf() per interpretare conenuto riga |
| 2090-ungetc | ungetc() usage |
| 2100-csv | lettura file di tipo CSV |
| 2110-filebinario | lettura di parte di un file binario in array |
| 2120-binfilevars | scrittura in file binario di singole variabili |
| 2130-binfilevarsw | lettura fino a fine file da file binario |
| 2140-feofwrong | uso sbagliato di feof() in lettura file parola a parola |
| 2150-feof | uso corretto di feof() |
| 2160-fileend | uso di valore restituito da fscanf() per individuare che si e' arrivati a fine file |
| 2170-fseek | fseek() ftell() e rewind() |
| 2180-stdout | stdout e stderr come stream di output |
| 2190-getchar | getchar() |
| 2200-buffer | come risolvere problema buffer di tastiera |
| 2210-fgets | uso di fgets() per evitare buffer overrun |
| struct | |
| 2310-struct | struct |
| 2320-typedef | typedef struct |
| 2330-csv | lettura file di tipo CSV in array di struct |
| 2340-csvgen | generazione file CSV e binario a partire da struct |
| 2350-structinit | inizializzazione struct |
| 2360-bitfield1 | bitfield: syntax & memory size |
| 2370-bitfields | structs and bitfield, the GIF image format example |
| Puntatori a funzione | |
| 2410-funcaddr | indirizzo di una funzione in memoria |
| 2420-funcpointer | puntatore ad una funzione: definizione, inizializzazione e uso |
| 2430-mathnofuncp | example of selection of a function without func pointers: a switch-case or multiple if() are required |
| 2440-mathfuncp | example of selection of a function using an array of func pointers |
| 2450-qsort | qsort() |
| 2460-bsearch | bsearch() |
| Debugging | |
| 2510-bugged | bugged code |
| 2520-buggedprintf | bugged code with added printf() |
| 2530-ifdedprintf | bugged code with added fprintf() and conditional compilation with #ifdef |
| 2540-assert | assert() macro |
| 2550-noassert | assert() macro |