Esercizi di Laboratorio

Da consegnare elettronicamente entro il 18-06-2003


Ogni esercizio deve essere realizzato come un programma a sé stante, ossia in un file separato, con un proprio main.

 

 

Esercizio 5: Cerca e sostituisci

Usando esclusivamente puntatori e l'aritmetica dei puntatori realizzare le seguenti funzioni:

char* sottostringa (char* p, char* s)

cerca da sinistra la prima occorrenza della stringa puntata da p nella stringa puntata da s; nel caso in cui la trovi restituisce il puntatore all'inzio della sua prima occorrenza in s; restituisce NULL se p non occorre in s.

bool SostPrimaOcc (char* vecchia, char* nuova, char* sorg, char* dest)

effettua una copia di sorg (la sorgente) in dest (destinazione) rimpiazzando l'eventuale prima occorrenza di vecchia con un'occorrenza di nuova; in caso non vi siano occorrenze di vecchia in sorg, dest deve essere una copia di sorg. Es. se vecchia == "rossa", nuova == "gialla", sorg == "la casa rossa" allora, dopo l'esecuzione, dest == "la casa gialla". Restituisce VERO o FALSO a seconda che abbia effettuato la sostituzione o no.

Il programma deve contenere un main che consenta di provare le funzioni con stringhe inserite da tastiera. Le stringhe su cui opererano le funzioni devono essere lette in vettori statici dichiarati nel main.

 

Esercizio 6: Ordinamento di stringhe

Dato un array a[0..n-1] di stringhe delle quali non sia nota a priori la lunghezza, procedere al suo ordinamento lessicografico utilizzando un opportuno adattamento dell'algoritmo SelectionSort (vedi esercizio 1). Nell'adattare SelectionSort si usi la funzione di libreria:

int strcmp(char s[], char t[])

se s < t restituisce un valore < 0;

se s == t restituisce 0

se s > t restituisce un valore > 0

L'array di stringhe deve essere allocato dinamicamente e la sua lunghezza n deve essere chiesta all'utente. Gli elementi del vettore sono puntatori a char; le stringhe cui questi puntatori si riferiscono devono essere lette da tastiera ed allocate dinamicamente in modo che contengano ciascuna il minimo numero di.

Si realizzino quindi le funzioni:

void leggi_vettore_stringhe(char *a[], int n)

Utilizza un array statico di caratteri buffer per leggere ciascuna stringa dall’input. Per ogni locazione dell’array di stringhe a(da 0 a n-1): legge dall’input la stringa corrente in buffer ne calcola la lunghezza, alloca dinamicamente un puntatore ad un’area della dimensione esatta per contenere la stringa in buffer, copia in questa area la stringa letta in buffer e assegna tale puntatore come valore della locazione corrente dell’array a.

void ordina(char* a[], int limite)

ordina in modo lessicografico l'array stringhe a tra le posizioni 0 e limite -1, mediante SelectionSort