ESERCIZIO 1 Si considerino le seguenti definizioni: #define N 4 struct Casella{ unsigned int r, c; ; typedef Casella TappetoElastico[N][N]; Pare che tra le discipline degli ottocenteschi circhi delle pulci non ci fosse il tappeto elastico. Ma avrebbe potuto funzionare così: la pulce salta su una casella Casella (in posizione i,j) del tappeto elastico (che è quadrato), atterrandovi, vi trova le coordinate (cioé i valori degli attributi r e c, rispettivamente riga e colonna,) della prossima cella su cui dovrà saltare, e da lì continuerà a saltare, ogni volta leggendo nella nuova casella le coordinate della casella successiva verso cui saltare. Se/quando le coordinate trovate indicano un punto esterno al tappeto (r o c negative o maggiori di N), la pulce scende dal tappeto (applausi). Si implementino le seguenti funzioni: int contasalti( Casella t[][n], int i, int j ) che riceve come parametri un tappeto elastico e le coordinate di una casella del tappeto, e misura e restituisce il numero di salti che una pulce che parta dalla Casella di coordinate i,j compie prima di scendere, oppure restituisce -1 se il tappeto è di "tipo ciclico" e la pulce resta intrappolata nel tappeto saltando indefinitamente. int dicoppia( TappetoElastico t ) che verifica se un tappeto è adatto all esibizione di coppia: una prima pulce salta sulla casella (0,0) e una seconda pulce inizia a saltare dalla casella (N-1,N-1) contemporaneamente alla prima pulce, ed esse continuano a saltare e atterrare in sincronia, senza mai scontrarsi e fino a uscire insieme dal tappeto cioè le pulci escono dal tappeto dopo aver compiuto lo stesso numero di salti e senza mai trovarsi ad atterrare contemporaneamente sulla stessa casella. Per testare il programma completo, si considerino ad esempio i tre tappeti definiti di seguito. (Immaginando che la pulce inizi a saltare dalla casella 0,0): noc non è ciclico, cic è ciclico, dic è adatto all'esibizione di coppia. Pagina 1 di 7
// qui l inclusione delle librerie, // la definizione dei tipi di dato e // i prototipi dei sottoprogrammi richiesti int main() { TappetoElastico noc = { {{1,1, {0,2, {0,6, {1,0, {{0,1, {0,2, {7,7, {2,3, {{2,2, {4,7, {3,3, {1,3, {{2,0, {2,0, {6,1, {1,2 ; TappetoElastico cic = { {{2,2, {4,1, {0,0, {5,5, {{3,0, {3,0, {8,8, {0,0, {{1,1, {0,2, {1,1, {3,2, {{0,2, {3,0, {2,3, {1,0 ; TappetoElastico dic = { {{0,1, {0,2, {0,3, {1,0, {{1,1, {1,2, {1,3, {9,9, {{2,1, {2,2, {2,3, {3,0, {{3,1, {3,2, {8,8, {2,0 ; // qui il codice del programma principale... return 0; Pagina 2 di 7
ESERCIZIO 2 Si scriva una funzione che, ricevendo come parametri una stringa str ed un carattere car, restituisca UNA NUOVA stringa di lunghezza minima (allocata dinamicamente) uguale a str ma priva di tutte le occorrenze del carattere car. Esempio: dati "esercizio semplice" e s la funzione dovrà allocare e restituire la stringa "eercizio emplice" Attenzione: La funzione non conosce a priori la lunghezza della stringa str. Si richiede esplicitamente di restituire una nuova stringa di lunghezza minima, cioè che occupi la minima quantità di memoria: occorre calcolare tale quantità prima della new Pagina 3 di 7
ESERCIZIO 3 Scrivere una funzione conc_pars( ) che riceva come parametri due stringhe, e restituisca come risultato una nuova stringa, ottenuta dalla concatenazione delle stringhe ricevute, facendo in modo che la nuova stringa occupi la quantità minima di memoria. La funzione non deve modificare le stringhe ricevute, ma restituisce un puntatore alla nuova stringa, che deve essere allocata dinamicamente (o non potrebbe essere utilmente restituita dalla funzione). Esempio: s1 = Prima s2 = "Seconda" -> restituisce = PrimaSeconda Si scriva poi una funzione strmul( ) che, dati una stringa str (che dev essere stata allocata dinamicamente) e un numero intero n, modifichi la stringa str, riallocandola e assegnandole il risultato della concatenazione di str con se stessa per n volte. Si noti che str deve essere stata allocata dinamicamente (o la funzione non potrebbe deallocarla e sostituirla con una più lunga!) str deve essere opportunamente riallocata in modo da contenere esattamente il risultato della moltiplicazione (dimensione minima) per essere modificata dalla funzione, la stringa str (che nell'ambiente del programma chiamante è un puntatore a carattere) deve essere passata per reference oppure per indirizzo. Esempio: s = abc -> moltiplicazione per 3 -> s = abcabcabc Suggerimento: si possono usare le funzioni strcat() e/o conc_pars()? Pagina 4 di 7
ESERCIZIO 4 Si consideri un vettore che rappresenta un elenco di N stringhe definito come segue. #define N 4 typedef char parola[20+1]; typedef parola elenco[n]; Data una variabile: elenco x; acquisire dallo standard input N stringhe e riportarle poi a video in ordine alfabetico. Memento: la funzione int strcmp(char s1[], char s2[]) confronta alfabeticamente s1 e s2. Pagina 5 di 7
ESERCIZIO 5 Ci ispiriamo alla funzione strcmp(... ). Si codifichi una funzione datecmp(... ) che stabilisce se due date, passate come parametri, sono uguali (nel qual caso restituisce 0), oppure in ordine cronologico (e allora restituisce un numero negativo), oppure in ordine cronologico inverso (restituendo un numero positivo). Si codifichi inoltre una funzione che stampa una data nel formato aaaa/mm/gg Si scriva anche un piccolo programma (main) per verificare che le funzioni siano state realizzate correttamente. Si utilizzino le seguenti definizioni: struct Data { int giorno; int mese; int anno; ; int datecmp( Data d1, Data d2 ) { /*... */ void stampa( Data d ) { /*... */ void stampaconlettere( Data d ) { /* stampa le date in formato 15 Mar 44 a.c. 13 Ott 2013 d.c. */ Pagina 6 di 7
ESERCIZIO 6 Si definisce il tipo di dato NumeroCodificato come segue: struct NumeroCodificato { int base; char cifre[20]; ; nel quale la base è un intero compreso tra 2 e 10 e cifre è una stringa (terminata da '\0') contenente i caratteri corrispondenti alle cifre ('0', '1', ) della codifica del numero in base base. Si definiscano, codifichino e testino le funzioni: int convertiint(numerocodificato n) che calcola il valore del numero n e lo restituisce espresso come intero void stampadec(numerocodificato n) che stampa a video il numero n in notazione decimale NumeroCodificato codifica(int n, int b) che codifica l'intero n in un NumeroCodificato di base b e lo restituisce al chiamante NumeroCodificato converti(numerocodificato n,int b2) che converte il numero n in un altro, codificato in base b2, e lo restituisce al chiamante Pagina 7 di 7