Scusate il messaggio esageratamente lungo ma la cosa è diventata divertente.
ixamit ha scritto:
e perché non usarla?!?....
Hai ragione se la funzione supera i test non c' è motivo di non usarla! Questo esercizio è diventato un bellissimo esempio sull' importanza di avere una corretta suite di test, tutte (ripeto tutte, pure la mia ) soluzioni proposte sono sbagliate!
Ho scritto i sequenti test:
1 ) a = ""; b = "a"; // 0
2 ) a = "a"; b = ""; // 0
3 ) a = "a"; b = "ab"; // 0
4 ) a = "ab"; b = "a"; // 0
5 ) a = "ab"; b = "abc" // 0
6 ) a = ""; b = ""; // 1
7 ) a = "a"; b = "a"; // 1
8 ) a = "ab"; b = "ab"; // 1
9 ) a = "ab"; b = "abab"; // 1
la prima funzione
int len(char *a)
{
int i=0;
while( a[i]!='\0' )
i++;
return i;
}
int multipla(char *a, char* b)
{
int i,j,p,l;
if (len(b)%len(a) != 0)
return 0;
for( i=0;i<len(b);i++ )
{
if (a[i%len(a)]!=b[i]) //genialata
return 0;
}
return 1;
}
si impianta per una 'division by zero sul primo test' (len(b)%len(a), non si può fare modulo 0).
la seconda:
int multipla (char *a, char *b){
char *p , *q;
if(*a ==0){
if(*b)return 0;
else return 1;
}
p=a;
q=b;
while (*q){
if (*p++ != *q++)break;
else if (*p == 0)p=a;
}
if (p==a) return 1;
else return 0;
}
Sbaglia il secondo test e restituisce 1.
la terza:
int multipla(char *a, char *b)
{
char* p = a;
while (*b && *p == *b)
p = *++p ? p: a, b++;
return !*b && p==a ? 1: 0;
}
Pure lei sbaglia il secondo test e restituisce 1.
la quarta
int multipla(char *a, char *b)
{
char* p = a;
while (*b && *p == *b)
{
p++;
if(*p)
p = p;
else
{
p = a;
b++;
}
}
return !*b && p==a ? 1: 0;
}
Questa in effetti non era stata scritta cosi (c' era solo il while) magari era intesa diversamente, comunque sbaglia i tes 2, 8, 9.
la quinta
int multipla(char *a, char *b)
{
char* p = a;
while (*b && *p++ == *b++)
if (!*p) p=a;
return (p==a) ?1:0;
}
Sbaglia il secondo test.
A questo punto è con profonda umiltà che propongo una (forse) giusta versione (è ancora una cripto-funzione )
int multipla(char *a, char *b)
{
char* p = a;
while (*b && *p == *b)
if (++b, (*++p == 0) && *b) p = a;
return (!*p && !*b) ? 1 : 0;
}
In attesa di un test che la invalidi.