int diffvals(int A[], int B[], int n) che presi in
input due array A e B, ognuno di n interi,
ritorna il numero di valori distinti che o sono presenti in A
ma non in B oppure sono presenti in B ma non in A.
Ecco alcuni esempi
A = {1,2,1,3,3} B = {5,2,2,5,2} diffvals(A, B, 5) ritorna 3
A = {1,2,3,3} B = {2,3,1,1} diffvals(A, B, 4) ritorna 0
A = {1,3,3,1} B = {2,3,1,2} diffvals(A, B, 4) ritorna 1
int mostfreqstr(char *sA[], int n) che preso in
input un array sA di n stringhe, ritorna l'indice della
prima occorrenza della stringa con il maggior numero di ripetizioni nell'array.
Ecco alcuni esempi
sA = {"s7","s7","g","8b","g","8b","8b","g"} mostfreqstr(sA, 8) ritorna 2
sA = {"ab","cd","dd"} mostfreqstr(sA, 3) ritorna 0
char *maxpre(char *s1, char *s2) che ritorna
in una stringa, allocata dinamicamente, il più lungo prefisso della stringa s1
che appare come sottostringa della stringa s2. La dimensione del blocco della stringa
ritornata non deve essere più grande del necessario. Ecco alcuni esempi
s1 = "la stringa" s2 = "nella strada" maxpre(s1, s2) ritorna "la str" s1 = "stringa" s2 = "parola" maxpre(s1, s2) ritorna "" s1 = "prefisso" s2 = "il pref" maxpre(s1, s2) ritorna "pref"
typedef struct Elem {
char * str; //stringa allocata dinamicamente
struct Elem *next;
} Elem, *List;
Scrivere una funzione List copytail(List L, int k) che inserisce
una copia dell'ultimo elemento della lista L immediatamente prima
del k-esimo elemento della lista e ritorna la lista modificata. Gli
elementi sono numerati a partire da 0, se k è
maggiore o uguale al numero di elementi della lista, il nuovo elemento è
aggiunto in coda. Il nuovo elemento deve avere
una copia della stringa del campo str. Se la lista L
è "zero" → "one" → "two" → "three" allora
copytail(L, 2) ritorna "zero" → "one" → "three" → "two" → "three" copytail(L, 0) ritorna "three" → "zero" → "one" → "two" → "three" copytail(L, 5) ritorna "zero" → "one" → "two" → "three" → "three"
typedef struct {
long value;
char descr[30];
} Record;
Scrivere una funzione void insrec(char *fname1, char *fname2, Record rec)
che presi in input i nomi di due file binari (nelle stringhe fname1 e
fname2), tali che il primo file contiene una sequenza di record di tipo
Record ordinata in senso crescente rispetto al campo value,
scrive nel secondo file i record del primo file aggiungendovi il record rec
inserito in modo da rispettare l'ordinamento. Ad esempio, se il primo file contiene
{3, "vite"} {5, "dado"} {5, "dado2"} {8, "punta"}
e se rec = {2, "martello"} allora la funzione scrive nel secondo file
{2, "martello"} {3, "vite"} {5, "dado"} {5, "dado2"} {8, "punta"}
se invece rec = {6, "martello"}, la funzione scrive nel secondo file
{3, "vite"} {5, "dado"} {5, "dado2"} {6, "martello"} {8, "punta"}
typedef struct Item {
long code;
struct {
int d, m, y;
} date;
struct Item * next;
} Item, *List;
Scrivere una funzione List transfer(List src, int (*tf)(Item *, Item *), List dst)
che elimina dalla lista src ogni elemento y per cui esiste un
elemento x che precede y e tale che tf(x, y) ritorna
vero (cioè, un intero diverso da zero), inoltre inserisce tutti gli elementi eliminati
nella lista dst mantenendola ordinata in senso crescente rispetto
al campo code e infine ritorna la lista dst. Si assume che la
lista di input dst è ordinata. Ad esempio se la funzione tf(x, y)
ritorna vero se i due elementi x e y
hanno lo stesso valore del campo code e la data di x è
posteriore a quella di y e le liste di input sono:
src = {57, {22,2,2011}} → {45, {13,2,2011}} → {57, {18,2,2011}} →
→ {45, {15,2,2011}} → {45, {8,2,2011}}
dst = {50, {10,1,2011}} → {52, {23,12,2011}} → {80, {27,12,2011}}
allora la funzione transfer(src, tf, dst) le modifica così
src = {57, {22,2,2011}} → {45, {13,2,2011}} → {45, {15,2,2011}}
dst = {45, {8,2,2011}} → {50, {10,1,2011}} → {52, {23,12,2011}} →
→ {57, {18,2,2011}} → {80, {27,12,2011}}