Programmazione I   a.a. 2004/2005 (Canale P-Z)    R. Silvestri e I. Salvo

Esempio di Prova Scritta

Per superare la prova è necessario (ma non sufficiente) ottenere almeno 7 punti per la soluzione dell'esercizio
obbligatorio. Gli altri tre esercizi sono a scelta. Il voto è la somma dei punti ottenuti.
Avvertenze: non usare variabili globali; definire tutte le eventuali funzioni ausiliarie usate; è consentito usare le

funzioni della libreria standard; se una soluzione non è scritta in modo chiaro ed ordinato non sarà presa
in considerazione.
 

Esercizio Obbligatorio    (max 10 punti)

Si consideri il seguente tipo:
typedef struct Estr {
    char *       s;         //puntatore ad una stringa allocata dinamicamente
    struct Estr *next;
}Estr, *Lstr;

Scrivere una funzione, con prototipo Lstr MoveStr(Lstr L, const char *str), che sposta ogni elemento della lista L che ha
la stringa del campo s uguale alla stringa str in coda alla lista e ritorna il puntatore alla lista così modificata. L'ordine degli altri elementi non
deve essere cambiato. Se str = "last"  e  L = "last" -> "first" -> "just" -> "first" -> "last" -> "mah"  
allora la funzione modifica la lista così   "first" -> "just" -> "first" -> "mah" -> "last" -> "last".

Esercizio 1    (max 8 punti)

Scrivere una funzione, con prototipo void SMove(char *str, int k), che modifica la stringa str spostando i
primi k caratteri in coda alla stringa. Ovviamente se k è maggiore od uguale alla lunghezza di str o k ≤ 0 allora SMove
non fa nulla. Ad esempio se str è "abcdefg" e k = 3 allora SMove modifica str così "defgabc".

Esercizio 2    (max 12 punti)

Si consideri il seguente tipo:
typedef struct Elem {
    long         count;
    char *       str;        //Stringa allocata dinamicamente
    struct Elem *next;
} Elem, *List;

Scrivere una funzione, con prototipo List Clean(List L, const char *test), che presa in input una lista L, ordinata
in senso non decrescente rispetto al campo count, la modifica eliminando tutti gli elementi che hanno la stringa del campo str
uguale alla stringa test (ve ne possono essere più d'uno) e inserisce un nuovo elemento con campo count pari al numero di
elementi eliminati e il campo str contenente una stringa uguale alla stringa test, mantenendo l'ordinamento della lista. La funzione
ritorna il puntatore al primo elemento della lista così modificata. La memoria degli elementi eliminati deve essere interamente rilasciata.
Ad esempio se la lista L è {0, "blu"}->{1, "rosso"}->{3, "viola"}->{3, "verde"}->{4, "rosso"}
e la stringa test è "rosso" allora Clean modifica la lista così
{0, "blu"}->{2, "rosso"}->{3, "viola"}->{3, "verde"}.


Esercizio 3    (max 10 punti)

Scrivere una funzione, con prototipo char Matrix(char *fName, int row, int col, char newC), che scrive il
carattere newC nell'elemento posto nella riga row e colonna col della matrice memorizzata nel file di tipo testo il cui nome è nella
stringa fName e ritorna il carattere precedente di tale elemento. La matrice è una matrice di caratteri ed è memorizzata per righe, i primi
due interi del file rappresentano rispettivamente il numero di righe e il numero di colonne della matrice. Tali interi sono separati da un
carattere spazio e il primo carattere dopo il secondo intero è il primo carattere della matrice. La matrice può essere molto grande per cui la
funzione non deve copiare la matrice in memoria. Ad esempio se il file fName contiene:
4 3ABCFFFMNLVVV
(si tratta quindi di una matrice con 4 righe e 3 colonne) e se row = 3, col = 1 e newC = 'A' allora Matrix modifica il file così:
4 3ABCFFFANLVVV
e ritorna il carattere 'M'.



 Ritorna alla pagina del corso