Ricorsione semplice 23) Scrivere una funzione ricorsiva che presa una stringa, sostituisca tutte le occorrenze del carattere A con il carattere B. void replace(char *s, char A, char B); 24) Scrivere una funzione che ricevuto un array di interi, calcoli e stampi ricorsivamente tutte le permutazioni dell'array. 25) Scrivere una funzione che chieda un valore N all'utente e quindi calcoli ricorsivamente l'N-esimo termine della successione di Fibonacci. F(n) = F(n-1) + F(n-2) 26) Riuscite a scrivere la stessa funzione dell'esercizio 25 ottimizzando (riducendo al minimo) il numero di chiamate ricorsive? Suggerimento: Per verificare quante chiamate vengono eseguite, usate una variabile globale che viene incrementata ad ogni chiamata. Suggerimento 2: potete sfruttare il fatto che per calcolate F(n-1) dovete sapere F(n-2)? Suggerimento 3: una funzione in C non puo' ritornare piu' di un valore ma se riceve dei puntatori puo' modificare i valori delle variabili originali. Struct 27) Definire un nuovo tipo di dato capace di rappresentare i dipendenti di una ditta: di tali dipendenti interessa il cognome, il numero degli anni di anzianita' maturati e lo stipendio. Si supponga che la dimensione massima del cognome sia di 40 caratteri. Scrivere le seguenti funzioni/procedure: - aggiornaStipendio che, dato un dipendente, aumenti del 1% il suo stipendio per ogni anno di anzianita' accumulato (attenzione l'interesse da calcolare e' un interesse composto). - "precede" che dati due impiegati a e b verifichino che il cognome del dipendente a preceda il cognome del dipendente b in ordine alfabetico. Suggerimento: per confrontare le stringhe utilizzare la funzione strcmp dichiarata in string.h Scrivere quindi un programma che richieda all'utente di inserire i dati di due impiegati, utilizzi le due procedure di cui sopra e ne stampi l'esito. 28) Definire un nuovo tipo di dato capace di rappresentare una data. Scrivere delle opportune funzioni/procedure che: - ricevuta una data la aggiorni al giorno successivo (ignorando gli anni bisestili); - ricevute due date verifichino che la prima preceda la seconda. 29) Definire un nuovo tipo di dato capace di rappresentare un vettore nel piano cartesiano. Definire opportune funzioni di somma, modulo e prodotto scalare fra vettori. Scrivere una funzione che, ricevuti due vettori, ritorni -1, 0 o 1 se il primo e' rispettivamente piu' piccolo, uguale o piu' grande del secondo in modulo. Scrivere una funzione che ricevuto un array di vettori lo ordini usando la precedente funzione come confronto. Allocazione dinamica della memoria 30) Scrivere un programma che chieda all'utente un numero n e quindi - allochi n stringhe di lunghezza rispettivamente da 2 a n+1; - riempia le stringhe con caratteri casuali (e il carattere '\0' finale); e quindi stampi le stringhe a video. 31) La funzione strcpy riceve due stringhe e copia la prima nella seconda, provvisto che la seconda abbia abbastanza spazio. Scrivere una funzione strcpy_dynamic che riceva una singola stringa, allochi una nuova stringa della lunghezza necessaria, ci copi sopra la prima e ritorni il puntatore alla nuova stringa. Attenzione ai caratteri terminatori.