Andrea Marin's Homepage
Corso di Programmazione 2009/2010 (page available only in Italian)

Slides del corso

Se si individuano errori/imprecisioni o parti non chiaramente illustrate nelle slides, sono apprezzati commenti che possono essere inviati per mail a marin _AT_ dsi.unive.it.

Esercizi

  • Esercizi assegnati il 15/05/10
    1. Scrivere una funzione che dato un albero di ricerca ed un valore x scriva su file tutti i valori nell'albero maggiori di x in modo ordinato.
    2. Scrivere una funzione che date due liste ordinate resistiuisca una lista ordinata formata dagli elementi delle liste in ingresso. Attenzione: non replicare gli elementi delle liste! lavorare solo con i puntatori
    3. Scrivere una funzione che carichi in una lista tutte le parole contenute in un file di testo (ogni parola in una cella). La lista deve occupare il minimo spazio necessario.
  • Esercizi assegnati il 24/04/10
    1. Scrivere una funzione che data una lista ed un intero positivo i cancelli la cella nell'i-ma posizione. Proporre sia la versione iterativa che ricorsiva
    2. Scrivere una funzione che dato un albero binario crei una lista con gli elementi dell'albero in pre-order
    3. Scrivere una funzione che decida se una lista è palindroma
    4. Scrivere una funzione ricorsiva che ribalti una lista (cioè inverta l'ordine degli elementi).
  • Esercizi assegnati il 15/04/10
    1. Scrivere una funzione che data una stringa crei una lista di caratteri in cui ogni nodo della lista corrisponde ad un carattere della stringa. Proporre una soluzione iterativa ed una ricorsiva.
    2. Scrivere una funzione che conti il numero di occorrenze di un intero in una lista di interi. Proporre una soluzione iterativa ed una ricorsiva.
  • Esercizi assegnati il 26/03/10
    1. Scrivere una funzione che, data una stringa, rimuova i caratteri ' ' (spazio) iniziali, finali, e che ove ve ne siano due o più consecutivi ne lasci uno solo
    2. Scrivere una funzione che, data una stringa contenente un'espressione matematica con parentesi (solo tonde), controlli la corretta disposizione delle parentesi. Ad esempio la seguente stringa deve essere identificata come scorretta: (a + b + 5 * ( 2 ))) + 5
    3. Scrivere una procedura che data una stringa ne stampi tutti gli anagrammi (anche duplicati in caso di caratteri ripetuti
    4. Scrivere un programma che acquisito un valore intero n in ingresso crei un array di n elementi (allocazione dinamica) e lo riempia con i primi n numeri primi.
  • Esercizi assegnati il 06/03/10
    1. Implementare una funzione che ordini un array di stringhe in modo lessicografico
    2. Riscrivere il sottoprogramma bubble_sort visto a lezione facendo uso dell'aritmetica dei puntatori
    3. Riscrivere il sottoprogramma bubble_sort visto a lezione modificandolo facendo in modo che al primo passaggio del ciclo più in cui non vengono effettuati scambi, si interrompa l'esecuzione del sottoprogramma. Attenzione, non fare uso del break.
  • Esercizi assegnati il 20/02/10
    1. Implementare la funzione char* strstr(char *str1, char* str2) che restituisce un puntatore alla prima occorrenza di str2 in str1 se questa esiste, altrimenti restituisce il puntatore NULL.
    2. Implementare la seguente funzione: int cerca_matrice(char matr[][], char stringa[], int dimensione);
      che cerca stringa all'interno di matr orizzontalmente (da sinistra a destra) o verticalmente (dall'alto in basso) a partire da una posizione qualsisi. La funzione deve ritornare 1 se l'occorrenza è trovata, 0 altrimenti.
  • Esercizi assegnati il 06/02/10
    Implementare le seguenti funzioni su stringhe:
    1. void elimina_duplicati(char *str); Data la stringa str la modifica in modo che siano presenti tutti i caratteri che erano presenti nell'originale ripetuti una sola volta.
    2. void unisci(char* insieme1, char* insieme2, char* unione); assumendo che le stringhe insieme1 ed insieme2 non contengano caratteri duplicati, calcolare in unione la stringa corrispondente all'unione dei caratteri presenti in insieme1 ed insieme2. Attenzione: l'insieme unione non deve contenere duplicati.
    3. void inserseca(char* insieme1, char* insieme2, char* intersezione); come sopra ma calcola l'intersezione.
  • Esercizi assegnati il 23/01/10
    Un negoziante di giocattoli costruisce delle piramidi usando mattoncini di tre colori: gialli, verdi e blue. Ogni piano della piramide è composto da mattoncini dello stesso colore. Ad un piano giallo ne segue uno verde e quindi uno blue. Poi la sequenza si ripete. Ogni piano della piramide ha un mattoncino in meno del precedente. Si scriva una funzione che dato il numero di mattoncini della base e il colore di partenza calcoli il numero di mattoncini gialli necessari a completare la piramide. Attenzione: proporre sia la versione ricorsiva che la versione iterativa.
  • Esercizi assegnati il 09/01/10
    Si supponga di avere un cilindro trasparente in cui si possono inserire delle biglie rosse o delle biglie blue. Quando si inseriscono le biglie nel tubo esse si dispongono una sopra l'altra. Si scrivano le funzioni ricorsive per risolvere i seguenti problemi:
    1. calcolare il numero di modi in cui si possono inserire R biglie rosse e B blue in modo che non vi siano mai due bliglie blue consecutive
    2. calcolare il numero di modi in cui si possono inserire R biglie rosse e B blue in modo che non vi siano mai tre biglie consecutive dello stesso colore
  • Esercizi assegnati il 12/12/09
    1. Implementare la funzione int nextPrime(int n) che restituisca il più piccolo numero primo più grande di n
    2. Scrivere il programma fattorizza che acquisisca un numero naturale in input e stampi la sua fattorizzazione in primi nel seguente formato: primo**esponente. Ogni primo deve comparire una sola volta, e uno per riga. Nel caso esponente sia uguale a 1 deve comparire solo il numero primo.
    3. Scrivere una funzione int trova_somma_primi(int n); che dato un numero pari maggiore di 2 restituisca un numero primo tale che n diminuito di tale valore sia anch'esso primo
    4. Scrivere un programma che stampi una X di asterischi di 10 caratteri per 10 caratteri usando come istruzioni di output soltanto printf(" "); oppure printf("*"); oppure printf("\n");
  • Esercizi assegnati il 5/12/09
    1. Scrivere una funzione int resto(int n, int m); che calcoli il resto della divisione di n per m usando le operazioni aritmetiche di + e -
    2. Scivere una funzione int potenza(int n, int m); che calcoli la potenza n^m usando solo le operazione aritmetiche + - * /
    3. Scrivere la funzione float area_poligono_regolare(int lati, float lunghezza); che calcoli l'area del poligono regolare di lati lati ciascuno lungo lunghezza
    4. Scrivere la funzione is_prime(int n) che decida se n è numero primo (risultato = 1) oppure no (risultato = 0).

Materiali di approfondimento

I materiali di approfondimento proposti hanno lo scopo di integrare parti trattate a lezione ma non adeguatamente affrontate nel libro di testo.

Sorgenti per il progetto di laboratorio

Libri di testo

  • B. W. Kernichan, D. M. Ritchie. Il linguaggio C: principi di programmazione e manuale di riferimento. Pearson. II ed.

Orario delle lezioni

Le lezioni si svolgono il sabato dalle 11:00 alle 13:00 in Aula 1 c/o il Dipartimento di Informatica, via Torino, 155, Mestre

Avvisi

  • Risultati appello del 13/01/2011 per la parte di programmazione C
    NomeParte teoricaParte praticaVoto parte C
    Pellizzato7.5Insuff.Insuff.
    Bet9.5918.5
    De LuciaInsuff.Insuff.Insuff.
    SaviRRR
    Testo dell'esame

  • Risultati appello del 17/09/2010 per la parte di programmazione C
    NomeParte teoricaParte praticaVoto parte C
    Pellizzato49Insuff.
    Bet410Insuff.
    Testo dell'esame

  • Risultati appello del 06/07/2010 per la parte di programmazione C
    NomeParte teoricaParte praticaVoto parte C
    De LuciaInsuff.Insuff.Insuff.
    Costantin8.51625
    Lleshi81321
    BetRRR
  • Testo dell'esame

  • Risultati appello del 18/06/2010 per la parte di programmazione C
    NomeParte teoricaParte praticaVoto parte C
    De LuciaInsuff.Insuff.Insuff.
    Costantin6.4Insuff.Insuff.
    Milan4.61419
    Pavan8.61927
    TonioloInsuff.Insuff.Insuff.
    Pellizzato6.4Insuff.Insuff.
    Caroti8.81120
    Testo dell'esame
    Soluzione Esercizio1
    Soluzione Esercizio2
  • Attenzione: La lezione del 27/05 sarà di programmazione imperativa mentre quella del 28/05 sarà di programmazione funzionale.
  • Giovedì 20/05/2010 e Venerdì 28/05/2010 Dalle 18:00 alle 20:00 si terranno le lezioni di recupero del corso di programmazione C
  • Sabato 15/04/2010 la lezione del corso si terrà regolarmente.
  • Sabato 17/04/2010 la lezione del corso si terrà regolarmente.
  • Sabato 27/03/2010 il corso prevederà 4 ore di programmazione funzionale.
  • Sabato 20/03/2010 il corso prevederà 4 ore di programmazione funzionale.
  • Sabato 13/02/2010 il corso prevederà 4 ore di programmazione funzionale.
  • Sabato 06/02/2010 il corso prevederà 4 ore di programmazione imperativa.
  • Sabato 09/01/2010 si terrà il corso di programmazione part-time REGOLARMENTE.
  • Sabato 19/12/2009 saranno svolte 4 ore di programmazione funzionale (Rota Bulò)
  • Sabato 12/12/2009 saranno svolte 4 ore di programmazione imperativa (Marin)

Registro delle lezioni

  • 22/05/2010 Laboratorio: programmazione di liste e parsing di stringhe
  • 20/05/2010 Esercizi su liste e puntatori
  • 15/05/2010 Lettura e scrittura su file.
  • 24/04/2010 (4 ore) Alberi binari. Visite. Introduzione al progetto. Laboratorio: esercizi di ririnforzo sulle liste
  • 17/04/2010 Liste doppiamente concatenate e liste circolari. Esercizi
  • 10/04/2010 Liste. Inserimento in testa e in coda. Distruzione. Altre operazione elementari
  • 13/03/2010 Allocazione dinamica della memoria: malloc e free.
  • 06/03/2010 Ordinamento di un array mediante Bubble Sort. Struct, Typedef, Uninon.
  • 20/02/2010 (4 ore) Esercizi con le stringhe e vettori. Ricerca dicotomica. Array multidimensionali, matrici, vettori di puntatori.
  • 06/02/2010 (4 ore) Algoritmi ricorsivi ed iterativi sugli array. Stringhe in C. Laboratorio: esercizi sulla manipolazione di stringhe.
  • 30/01/2010 Puntatori e vettori monodimensionali. Scorre un vettore con indici e con puntatori. Passaggio di un vettore come parametro. Esercizi
  • 23/01/2010 Laboratorio: passaggio dei parametri mediante i puntatori (implementazione del passaggio per indirizzo)
  • 16/01/2010 Esercizi sulla ricorsione: la torre di Hanoi. Introduzione ai puntatori.
  • 09/01/2010 La ricorsione. Uso dello stack. Calolo del fattoria, coefficienti binomiali, successioni di Fibonacci. Esercizi.
  • 12/12/2009 (4 ore) Sottoprogrammi. Parametri e formali e parametri attuali. Passaggio per copia in C. Scopo degli identificatori. Allocazione delle variabili nello stack. Esempi.
  • 05/12/2009 Laboratorio: Esercizi con i cicli. Introduzione ai sottoprogrammi
  • 28/11/2009 Strutture di controllo: do..while, for. Test di primalità
  • 14/11/2009 Strutture di controllo: ciclo while. MCD, mcm.
  • 07/11/2009 Laboratorio: nidificazione dei condizionali, connettori logici, costrutto switch.
  • 31/10/2009 Variabili ed assegnamento. Espressioni aritmetiche. Sequenza. Introduzione al condizionale.
  • 24/10/2009 Laboratorio: ambiente di lavoro Linux. La compilazione. Primo programma C.
  • 17/10/2009 Introduzione al corso. Macchina di Von Neumann. Linguaggi imperativi. Macchina astratta C.