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}}