Trovate nel seguito gli esempi di codice illustrati a lezione insieme alle relative slide.
È anche disponibile l'archivio che li contiene tutti oppure la relativa pagina GitHub.

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?
Complessità computazionale
1910-bubblesort bubblesort
1920-quicksort Quicksort
1930-mergesort Bottom up Mergesort
Puntatori a Puntatori
2010-matrixmanag allocazione dinamica array bidimensionali usando un array monodimensionale
2020-matrixalloc allocazione dinamica array bidimensionali usando puntatori a puntatori
2030-strarraymon array di stringhe mediante array bidimensionale
2040-strarrayarrpunt array di stringhe mediante array di puntatori
2050-strarray array di stringhe mediante array di puntatori ottenuto con puntatori a puntatori
2060-cli esempio di uso di array di stringhe, gli argomenti sulla linea di comando
2070-bidim passaggio array bidimensionali a funzione
Input, Output e gestione file
2110-fopen uso di fopen() per file in lettura e perror()
2120-fopenw uso di fopen() in scrittura
2130-fopena uso di fopen() in "append"
2140-fgetputc fgetc() e fputc()
2150-fgetputs fgets() e fputs()
2160-formattedoutput scrittura formattata
2170-formattedinput uso fscanf() per leggere parola per parola e valore di ritorno per determinare se sono a fine file
2180-formattedinput uso fscanf() per interpretare conenuto riga
2190-ungetc ungetc() usage
2200-csv lettura file di tipo CSV
2210-filebinario lettura di parte di un file binario in array
2220-binfilevars scrittura in file binario di singole variabili
2230-binfilevarsw lettura fino a fine file da file binario
2240-feofwrong uso sbagliato di feof() in lettura file parola a parola
2250-feof uso corretto di feof()
2260-fileend uso di valore restituito da fscanf() per individuare che si e' arrivati a fine file
2270-fseek fseek() ftell() e rewind()
2280-stdout stdout e stderr come stream di output
2290-getchar getchar()
2300-buffer come risolvere problema buffer di tastiera
2310-fgets uso di fgets() per evitare buffer overrun
struct
2410-struct struct
2420-typedef typedef struct
2430-csv lettura file di tipo CSV in array di struct
2440-csvgen generazione file CSV e binario a partire da struct
2450-structinit inizializzazione struct
2460-bitfield1 bitfield: syntax & memory size
2470-bitfields structs and bitfield, the GIF image format example
2480-enum enum: definizione e uso base
2490-enumswitch enum: uso naturale con switch
2500-union union: definizione e uso base
2510-unionstruct union in struct: uso tipico per rappresentare tipi variabili
2520-unionfloats analisi della rappresentazione interna di un float mediante union e operazioni bit a bit
Puntatori a funzione
2610-funcaddr indirizzo di una funzione in memoria
2620-funcpointer puntatore ad una funzione: definizione, inizializzazione e uso
2630-mathnofuncp example of selection of a function without func pointers: a switch-case or multiple if() are required
2640-mathfuncp example of selection of a function using an array of func pointers
2650-qsort qsort()
2660-bsearch bsearch()
Debugging
2710-bugged bugged code
2720-buggedprintf bugged code with added printf()
2730-ifdedprintf bugged code with added fprintf() and conditional compilation with #ifdef
2740-assert assert() macro
2750-noassert assert() macro
Se avete commenti o osservazioni su questa pagina
mandate un messaggio di posta elettronica a bertoƶƶi@ce.unipr.it