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'.