Materiali Didattici Esercitazioni


Seduta
Data Durata Materiali base
Materiali aula
Argomenti coperti - Note
1
22 marzo 2 ore Algoritmi_Eserc.pdf
Dall'algoritmo al programma: esempi di passaggio dall'algoritmo formulato in linguaggio naturale allo pseudocodice al codice vero e proprio. Discussione dell'uso di dichiarazioni, variabili, espressioni, costrutti condizionali (if) e iterativi (while)
2HWorld
3HWorld
4HWorld
5HWorld
prova
Primi semplici programmi. Direttiva #include, la funzione main, valori di ritorno e parametri argc e argv. Istruzione return.
Utilizzo dei parametri passati su riga di comando. Significato di argc e contenuto del vettore argv. Controllo della presenza e del numero di parametri su riga di comando.
Emissione di messaggi su console. funzione printf. Il carattere newline (\n).
Parametri richiesti in modo interattivo. funzione gets.
Effetti sul programma della mancanza di parametri attesi su riga di comando.
prog2

Conversioni di formato fra decimale, ottale, esadecimale e binario.
Funzione scanf. Uso e significato (sia in printf, sia in scanf) dei qualificatori %d, %x, %o. Estrazione e stampa delle cifre binarie di un numero intero mediante shift sinistri e destri (<<, >>) e AND bitwise (&) con maschere opportune.
2
19 aprile
3 ore
HTML tags
Compendio, organizzato per categorie, dei principali tag HTML oggetto di approfondimento nel secondo laboratorio.

prove.cpp
prove2.cpp
prove4.cpp
  • Determinazione e visualizzazione della lista dei quadrati minori di un numero assegnato. Impostazione del programma dall'algoritmo al codice, inizializzazione variabili, messaggio di prompt per richiedere immissione dati, uso di scanf per lettura numeri, impostazione di ciclo for, generazione di un output correttamente spaziato, utilizzo di un ciclo while equivalente al ciclo for. Operatori postincremento e preincremento: considerazioni su effetti e differenze.
  • Elenco dei membri di un vettore maggiori di un certo valore dato. Lettura da tastiera di elementi di un vettore di interi e di singole variabili intere, scansione di un vettore con confronto sui valori contenuti, conteggio ricorrenze trovate, stampa finale risultati.
  • Lettura ed elaborazione di una stringa. Dichiarazione di un array destinato a contenere una stringa, lettura da tastiera di una stringa mediante funzione gets, determinazione della lunghezza di una stringa mediante scansione per ricerca terminatore "\0", conteggio vocali mediante scansione di ricerca e confronti con utilizzo di costrutto switch, conversione in maiuscolo mediante scansione e conversione carattere per carattere, stampa della stringa invertita mediante scansione con ciclo for in senso inverso. Decomposizione del programma in varie funzioni. Passaggio dei parametri (stringa di lunghezza imprecisata - open array) e ritorno e uso dei risultati. Operatore di postincremento. Significato e ruolo del terminatore "\0" nelle stringhe.
Strutture e union

Descrizione del criterio per usare l'uno o l'altro costrutto in situazioni reali di modellizzazione.
Bitmask
Visualizzazione del funzionamento degli operatori di shift sinistro e destro (e corrispondente significato aritmetico: prodotto o divisione per potenze di due), degli operatori OR, AND e XOR bitwise. Ruolo delle "maschere", loro impiego, modo di definirle come necessario. Tecnica per "l'estrazione" dei bit che interessano. Tecnica per impostare i bit che interessano. Tecnica per azzerare i bit desiderati.
3
31 maggio
4 ore
Bitmask (ripasso)

Come sopra
Tecniche di manipolazione di stringhe

REVERSE.C

CONTPAR.C
inverti.c
Vari modi di implementare un ciclo di scansione stringa (l'esempio riguarda una reimplementazione della funzione di libreria strlen). Vari esempi di notazioni compatte e ultracompatte per la condizione di controllo di fine ciclo (localizzazione del carattere '\0' di fine stringa).
Inversione del contenuto di una stringa. Come verificare se una stringa e' una palindrome (per es.: "RADAR")
prova.c

cerca.c
Analisi di una stringa: ricerca di un carattere all'interno della stringa; conteggio delle ricorrenze dei caratteri (invocando ripetutamente la funzione cerca(...) oppure sfruttando direttamente un array per immagazzinare i contatori); conteggio delle vocali (indifferentemente minuscole e maiuscole) nella stringa; criterio ed algoritmo per il conteggio delle parole in una stringa. Condizioni booleane articolate con or logico (||) e and logico (&&) impiegate in un costrutto if.
Utilizzo di funzioni separate per strutturare il programma in modo chiaro.
Conversione da numeri decimali a numeri romani
romani.c

Criterio ed algoritmo per generare la rappresentazione in cifre romane di un numero decimale fra 1 e 4000.
Uso di if e operatori di decremento in forma breve. putchar e printf.
4
7 giugno
3 ore

crypt.c
strings.c
copy.c
Files. Apertura-chiusura-lettura-scrittura a linee di testo. Programma Crypt per cifrare (con il semplicissimo "algoritmo di Cesare", basato sulla sostituzione carattere per carattere) un file di testo. Il programma Decrypt è facilmente derivabile dal programma Crypt.
Programma Strings per generare in output un file di testo composto da righe ciascuna delle quali contenente un numero di ripetizioni del carattere "X" pari al valore letto sulla corrispondente riga di un file di testo fornito in input.
Programma Copy per creare una copia di un file di testo con righe di lunghezza limitata.
Liste singole e doppie. Ripasso teoria.
5
14 giugno
4 ore

lista.c
lista-2.c
mystrlen.c
Liste. Un esempio (da non imitare!) di gestione di una lista a lunghezza fissa con nodi dichiarati come altrettante variabili volatili di funzione, senza utilizzo di funzioni malloc/free e con impiego esplicito di puntatori ottenuti da queste variabili attraverso l'operatore '&'. (lista.c)
Esempio di programma (lista-2.c) che tratta liste singole di lunghezza arbitraria con la tecnica corretta (malloc/free). Funzioni supportate: visualizzazione contenuto lista, inserimento in lista (in testa, in coda, in posizione ordinata) con impiego di variabile temporanea.
Discussione delle operazioni elementari da effettuare per la rimozione di un nodo dalla lista (in testa, in coda, in posizione ordinata).
Discussione del vantaggio che si avrebbe, per il trattamento delle stesse situazioni, se fosse stata usata una lista doppia.
Ricorsione. Discussione di vantaggi e svantaggi degli algoritmi ricorsivi rispetto alla variante iterativa (per il trattamento di uno stesso problema). Esempi tipici  di algoritmi ricorsivi. Un caso pratico: calcolo della lunghezza di una stringa in modo iterativo e in modo ricorsivo (mystrlen.c)