<h1>Programmazione 1 <small> (canale P-Z) a.a. 2007-08</small></h1> <big>Docente: R. Silvestri<br> Esercitatore: A. Carosi<br> Tutor: J. Stefa</big><br> <br> <br> <h2>Diario delle lezioni ed esercitazioni</h2> <b>Lunedì 24/9/07</b> <div align="justify"><blockquote> Informazioni sul corso: programma, testi, modalità d'esame. Cenni sull'architettura di un calcolatore: CPU, memoria primaria e secondaria, input/output. Struttura logica della memoria. Linguaggio macchina, linguaggio assembly. Linguaggi ad alto livello e compilatori. Cenni storici sul linguaggio C. Primo programma in C: stampa di una stringa di testo. Programma che stampa la somma di due numeri: operatori aritmetici + e *, specifica di conversione della <tt>printf</tt> per gli interi. </blockquote> </div> <br> <b>Martedì 25/9/07</b> [[eser250907][Esercitazioni]] <br> <br> <b>Giovedì 27/9/07</b> <div align="justify"> <blockquote> Il tipo <tt>int</tt>. Variabili e memoria. Assegnamenti. Programma che calcola la 100-esima potenza di un numero. Istruzione di selezione: <tt>if () else</tt>. Operatori relazionali: <tt><, <=, >, >=, ==, !=</tt>. Programmi che stampano il massimo di due e di tre numeri: diverse versioni. Operatori logici: <tt>&, ||, !</tt>. Istruzioni per iterare: <tt>for ( ; ; )</tt>. Programma che stampa il massimo di 10 numeri. <br> <b>Esercizio 1</b> Scrivere un programma che prende in input 3 numeri e li stampa in ordine crescente. <br> <b>Esercizio 2</b> Scrivere un programma che prende in input 20 numeri e ne stampa la somma. </blockquote> </div> <br> <b>Lunedì 1/10/07</b> <div align="justify"> <blockquote> Discussione esercizi 1 e 2. Il tipo <tt>float</tt>. Programma che stampa la media di 10 numeri (in virgola mobile). Specifiche di conversione <tt>%f</tt> e <tt>%.2f</tt>. Operatore di divisione <tt>/</tt> e conversione automatica degli operandi. I tipi primitivi (<tt>int, short, long, unsigned, long long, char, unsigned char, float, double, long double</tt>) e loro proprietà (<tt>limits.h</tt>). Operatore <tt>sizeof()</tt>. Annidamento di cicli for: programma che stampa una matrice di nxn caratteri e alcune variazioni. Operatore di postincremento <tt>++</tt>. <br> <b>Esercizio 3</b> Scrivere un programma che prende in input un intero n e stampa una matrice nxn con una cornice di zeri e l'interno di uni. </blockquote> </div> <br> <b>Martedì 2/10/07</b> [[eser021007][Esercitazioni]] <br> <br> <b>Giovedì 4/10/07</b> <div align="justify"> <blockquote> Discussione esercizio 3. Istruzioni per iterare: <tt>while ()</tt> e <tt>do while ()</tt>. Equivalenza con il <tt>for</tt>. Programma che determina se un numero è primo (diverse versioni). Operatori <tt>%, +=, *=, /=, -=</tt>. Programma che prende in input interi positivi (termina non appena viene letto un intero non positivo) e stampa quanti di questi sono minori di 100, quanti compresi tra 100 e 1000 e quanti sono maggiori di 1000. Vettori (o array): dichiarazione ed inizializzazione. Programma che stampa le frequenze di 20 numeri. <br> <b>Esercizio 4</b> Scrivere un programma che prende in input un intero <tt>n</tt> e lo stampa in base 2. Ad esempio, se <tt>n = 23</tt> deve stampare <tt>10111</tt> (oppure <tt>11101</tt>). </blockquote> </div> <br> <b>Lunedì 8/10/07</b> <div align="justify"> <blockquote> Discussione esercizio 4. Stringhe e carattere terminatore <tt>'\0'</tt>. Programma che prende in input una stringa e la stampa invertita. Specifica di conversione <tt>%s</tt> per <tt>scanf</tt> e per <tt>printf</tt>. Preprocessore C e la direttiva <tt>#define</tt>. Costanti simboliche. Programma che stampa le frequenze relative al lancio di un dado (simulato). Funzioni <tt>rand</tt> e <tt>srand</tt> in <tt>stdlib.h</tt>. Funzione <tt>time</tt> in <tt>time.h</tt>. <br> <b>Esercizio 5</b> Scrivere un programma che prende in input 20 interi e determina se sono stati inseriti valori ripetuti. In caso affermativo stampa uno qualsiasi dei valori ripetuti, altrimenti stampa <tt>"non ci sono doppioni"</tt>. </blockquote> </div> <br> <b>Martedì 9/10/07</b> [[eser091007][Esercitazioni]] <br> <br> <b>Giovedì 11/10/07</b> <div align="justify"> <blockquote> Discussione esercizio 5. Funzioni: definizione, prototipo, parametri, chiamate. Vari esempi di funzioni che prendono in input interi, vettori e stringhe. Files header, programmi su più files, la direttiva <tt>#include</tt>. <br> <b>Esercizio 6</b> Scrivere una funzione che prende in input una stringa e un carattere e ritorna il numero di occorrenze del carattere nella stringa. </blockquote> </div> <br> <b>Lunedì 15/19/07</b> <div align="justify"> <blockquote> Discussione esercizio 6. Esempi di funzioni: ricerca lineare in un vettore, funzione che scambia i valori di due variabili. Passaggio di parametri per valore e per indirizzo. Operatore di indirizzo <tt>&</tt> e operatore di indirezione <tt>*</tt>. Tipi puntatore. Macro. Funzione che legge in input una stringa tramite <tt>getchar</tt>. <br> <b>Esercizio 7</b> Scrivere una funzione che prende in input due stringhe <tt>s1</tt> e <tt>s2</tt> e ritorna 1 se <tt>s1</tt> è un anagramma di <tt>s2</tt> e ritorna 0 altrimenti. Ad esempio, "torre" è un anagramma di "retro". </blockquote> </div> <br> <b>Martedì 16/10/07</b> [[eser161007][Esercitazioni]] <br> <br> <b>Giovedì 18/10/07</b> <div align="justify"> <blockquote> Discussione esercizio 7. Funzione che ritorna il numero di parole in una stringa: funzione <tt>isalpha</tt> in <tt>ctype.h</tt> e uso di una variabile flag. Programma che legge in input una stringa e stampa il numero di parole della stringa: uso di funzioni in un programma e leggibilità del codice. Istruzione <tt>break</tt>. Operatore condizionale <tt>( ? ; )</tt>. Cenni sulla conversione forzata dei tipi, cast. <br> <b>Esercizio 8</b> Scrivere una funzione che prende in input una stringa e ritorna la lunghezza della più lunga parola nella stringa (se non ci sono parole ritorna 0). Ad esempio se la stringa è <tt>"C'e' un errore nel programma"</tt>, la funzione ritorna 9. </blockquote> </div> <br> <b>Lunedì 22/10/07</b> <div align="justify"> <blockquote> Discussione esercizio 8. Ordinamento: selection-sort e bubble-sort. Funzioni ricorsive: fattoriale, potenza, fibonacci, selection-sort. <br> <b>Esercizio 9</b> Scrivere un programma che prende in input una stringa, ne ordina i caratteri e stampa il risultato. Ad esempio, se la stringa è <tt>"trova errore"</tt> allora il programma stampa <tt>" aeeoorrrrtv"</tt>. </blockquote> </div> <br> <b>Martedì 23/10/07</b> [[eser231007][Esercitazioni]] <br> <br> <b>Giovedì 25/10/07</b> <div align="justify"> <blockquote> Discussione esercizio 9. Insertion-sort: versione iterativa e ricorsiva. Ricerca binaria: versione iterativa e ricorsiva. Vettori multidimensionali ovvero vettori di vettori: dichiarazione, inizializzazione, rappresentazione in memoria. Passaggio di vettori multidimensionali a funzioni.<br> <b>Esercizio 10</b> Scrivere una versione modificata della ricerca binaria che, nel caso il valore cercato non appaia nel vettore di input, ritorna la posizione in cui tale valore andrebbe inserito per mantenere ordinato il vettore. </blockquote> </div> <br> <b>Lunedì 29/10/07</b> <div align="justify"> <blockquote> Discussione esercizio 10. Esempi di uso di vettori multidimensionali: funzione che costruisce quadrati magici di ordine dispari. Vettori di stringhe. Allocazione dinamica della memoria: il tipo <tt>void *</tt>, le funzioni <tt>malloc()</tt> e <tt>free()</tt> la costante <tt>NULL</tt>. Esempio: programma che prende in input un testo e lo memorizza tramite un vettore di stringhe, una stringa per ogni linea del testo. Uso della costante <tt>EOF</tt> e il comando di redirezione di Linux < per fornire un file come input al programma.<br> <b>Esercizio 11</b> Scrivere una funzione che prende in input una matrice nxn di interi e ritorna 1 se è un quadrato magico e 0 altrimenti.<br> <b>Esercizio 12</b> Scrivere un programma che prende in input un testo e stampa le linee del testo ordinate alfabeticamente (si usi la funzione <tt>strcmp()</tt> per confrontare due stringhe). </blockquote> </div> <br> <b>Martedì 30/10/07</b> [[eser301007][Esercitazioni]] <br> <br> <b>Lunedì 5/11/07</b> <div align="justify"> <blockquote> Discussione esercizi 11 e 12. Esempi di allocazione dinamica. Funzione che duplica una stringa. Funzione che legge in input una stringa di lunghezza arbitraria: la funzione <tt>realloc()</tt>. Aritmetica dei puntatori: addizione e sottrazione di un puntatore e un intero, differenza tra due puntatori. La sintassi delle parentesi quadre per i vettori espressa tramite l'aritmetica dei puntatori. </blockquote> </div> <br> <b>Martedì 06/11/07</b> [[eser061107][Esercitazioni]] <br> <br> <b>Giovedì 8/11/07</b> <div align="justify"> <blockquote> Aritmetica dei puntatori: confronto di puntatori. Esempio: implementazioni della funzione <tt>memmove()</tt>. Il tipo "vettore di T" e il tipo "puntatore a T": conversione automatica e comportamento degli operatori <tt>sizeof</tt> e <tt>&</tt>. L'aritmetica dei puntatori per i vettori multidimensionali. Allocazione dinamica di matrici. Rinominare tipi tramite <tt>typedef</tt>. </blockquote> </div> <br> <b>Lunedì 19/11/07</b> <div align="justify"> <blockquote> Discussione soluzioni esercizi della prova intermedia. Tipi aggregati: <tt>struct</tt>. Dichiarazione e inizializzazione di <tt>struct</tt>. Uso di <tt>typedef</tt>. Esempio: mazzo di carte. <br> <b>Esercizio 13</b> Scrivere una funzione, <tt>int !ControllaMazzo(Mazzo M)</tt>, che controlla che le carte del mazzo <tt>M</tt> siano giuste (cioè, ci siano tutte e senza ripetizioni). </blockquote> </div> <br> <b>Martedì 20/11/07</b> [[eser201107][Esercitazioni]] <br> <b>Giovedì 22/11/07</b> <div align="justify"><blockquote>Discussione esercizio 13. Tipi aggregati: <tt>union</tt>. Dichiarazione ed inizializzazione di unioni. Il tipo enumerativo <tt>enum</tt>. Il costrutto <tt>switch - case</tt>. Esempio che illustra l'uso di <tt>struct</tt>, <tt>union</tt>, <tt>enum</tt>, <tt>switch - case</tt> e variabili globali: programma che gestisce un archivio dei dati relativi a dipendenti tramite le operazioni di inserimento, stampa, ricerca, eliminazione e modifica. <br> <b>Esercizio 14</b> Completare l'implementazione della funzione <tt>void Inserisci(void)</tt>. </blockquote> </div> <br> <b>Lunedì 26/11/07</b> <div align="justify"> <blockquote>Discussione esercizio 14. Completata l'implementazione del programma archivio. Strutture dati dinamiche: liste. Possibili applicazioni delle liste e vantaggi rispetto ai vettori. Esempi relativamente a liste di interi: inserimento in testa, ricerca ed eliminazione di un elemento.<br> <b>Esercizio 15</b> Scrivere una funzione che inserisce un nuovo elemento in una lista di interi ordinata. </blockquote> </div> <br> <b>Martedì 27/11/07</b> [[eser271107][Esercitazioni]] <br> <b>Giovedì 29/11/07</b> <div align="justify"> <blockquote>Discussione esercizio 15. Implementazione della funzione dell'esercizio tramite la tecnica del "doppio puntatore". Cenni sulla progettazione e realizzazione di librerie: interfaccia, e indipendenza dell'interfaccia dall'implementazione. Esempio: piccola libreria per gestire insiemi di stringhe: interfaccia (funzioni <tt>SetCreate</tt>, <tt>SetAdd</tt>, <tt>SetFind</tt>, <tt>SetDel</tt>, <tt>SetDestroy</tt>. Implementazione tramite liste: <tt>SetCreate</tt> e <tt>SetAdd</tt>).<br> <b>Esercizio 16</b> Implementare <tt>SetFind</tt>. </blockquote> </div> <br> <b>Lunedì 3/12/07</b> <div align="justify"> <blockquote>Discussione esercizio 16. Implementazione di <tt>SetFind</tt>, <tt>SetDel</tt>, <tt>SetDestroy</tt>. Funzione che permette di scandire un insieme di stringhe: uso di variabili locali <tt>static</tt>. Esempio di utilizzo della libreria: funzione che stampa le stringhe in comune tra due insiemi di stringhe. Inversione di una lista: versione ricorsiva e iterativa.<br> <b>Esercizio 17</b> Utilizzare la libreria per scrivere una funzione che prende in input due insiemi di stringhe e ritorna 1 se i due insiemi sono uguali e 0 altrimenti. </blockquote> </div> <br> <b>Martedì 4/12/07</b> [[eser041207][Esercitazioni]] <br> <b>Giovedì 6/12/07</b> <div align="justify"> <blockquote>Discussione esercizio 17. I file: file di testo (sequenziali) e file binari (ad accesso casuale). Posizione del cursore e operazioni di lettura e scrittura. Apertura di un file: funzioni <tt>fopen</tt> e <tt>fclose</tt>. Funzioni per leggere e scrivere in file di testo: <tt>fgetc</tt>, <tt>fgets</tt>, <tt>fscanf</tt>, <tt>fputs</tt>, <tt>fprintf</tt>. Standard input <tt>stdin</tt> e standard output <tt>stdout</tt>. Funzioni per il riposizionamento e la lettura del cursore: <tt>rewind</tt>, <tt>fseek</tt>, <tt>ftell</tt>. Esempio: programma che prende in input il nome di un file di testo, lo apre (se non esiste lo crea), stampa a video il contenuto del file e poi prende in input una stringa e la aggiunge come ultima linea nel file. <br> <b>Esercizio 18</b> Scrivere un programma che prende in input il nome di un file e una stringa, e poi cerca la stringa nel file, se la trova stampa "trovata" altrimenti stampa "non trovata". </blockquote> </div> <br> <b>Lunedì 10/12/07</b> <div align="justify"> <blockquote>Discussione esercizio 18. Varie versioni di una funzione che cerca una stringa in un file di testo e se la trova ne ritorna la posizione. File binari: uso di <tt>fseek</tt>, le funzioni di lettura e scrittura <tt>fread</tt> e <tt>fwrite</tt>.<br> <b>Esercizio 19</b> Scrivere una funzione che prende in input il puntatore ad un file e una stringa e ritorna il numero di occorrenze della stringa nel file. </blockquote> </div> <br> <b>Martedì 11/12/07</b> [[eser111207][Esercitazioni]] <br> <b>Giovedì 13/12/07</b> <div align="justify"> <blockquote>Discussione esercizio 19. File binari (o ad accesso casuale): usi tipici e portabilità. Esempio: programma che gestisce un archivio mantenuto in un file binario con operazioni: STAMPA, INSERISCI, RICERCA, MODIFICA e ELIMINA. Iniziata implementazione: <tt>main</tt>, dichiarazioni dei tipi, funzione che conta i records nel file-archivio e funzione che apre il file-archivio.<br> <b>Esercizio 20</b> Scrivere la funzione che implementa la stampa dei records dell'archivio in forma tabellare. </blockquote> </div> <br> <b>Lunedì 17/12/07</b> <div align="justify"> <blockquote>Discussione esercizio 20. Implementazione delle operazioni INSERISCI, RICERCA e MODIFICA. <br> <b>Esercizio 21</b> Scrivere la funzione che implementa l'operazione ELIMINA. </blockquote> </div> <br> <b>Martedì 18/12/07</b> [[eser181207][Esercitazioni]] <br> <b>Giovedì 20/12/07</b> <div align="justify"> <blockquote>Discussione esercizio 21. Ricapitolazione delle regole di visibilità delle variabili e delle funzioni. Programmi su più files: qualificatore <tt>static</tt> usato in riferimento a funzioni, qualificatore <tt>extern</tt>. Rispiegazione di alcuni concetti: allocazione dinamica (<tt>malloc</tt>, <tt>realloc</tt> e <tt>free</tt>), liste e la tecnica del "doppio puntatore". </blockquote> </div> <br> <br> <br> <br> <br> <br> <br>
This topic: Programmazione1
>
WebHome
>
Prog1PZ
>
DiarioPZ0708
Topic revision: r31 - 2007-12-28 - RiccardoSilvestri
Copyright © 2008-2025 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki?
Send feedback