Witam,
Mam niemały problem z aplikacją, która powinna być pomocnikiem krzyżówkowym i wyświetlać wyrazy zgodne ze wzorcem. Wzorzec zawiera * - oznacza ciąg dowolnych znaków i dowolnej ilości, ? - oznacza jeden dowolny znak, litery - muszą być zgodne, i [] - między którymi są ciągi liter np.: [a,c,v,e], co oznacza, że w tym miejscu powinien stać dowolny z tych znaków.
wymodziłem już trochę kodu - funkcja, który sprawdza czy słowo pasuje do wzorca i zwraca true or false.
Zamieszczam kod funkcji (stara wersja wykomentowana) i proszę pokażcie mi jak to zgrabnie rozwiązać.
Funkcje, które się pojawiają w kodzie, np: litery_dozwolone sprawdza czy litera zawiera się w ciągu liter dozwolonych - pobranych spomiędzy nawiasów [].
/neon
//funkcja sprawdzajaca czy wyraz pasuje do wzorca - troche dziala, troche nie
int sprawdz_wzorzec(char *slowo,char *wzorzec,int ix,int ygrek)
{ int x=ix,y=ygrek,ok=1;
for (x;x<strlen(slowo);x++)
{ //printf("%d %d %d\n",x,y,ok);
if (wzorzec[y]=='?')
{
y++;
}
else if (wzorzec[y]=='[')
{
//printf("%d %d %d\n",x,y,ok);
//printf ("\n %s \n",lit_dozwolone(wzorzec,&y));
if (!litery_dozwolone(slowo[x],lit_dozwolone(wzorzec+y,&y))) {ok=0; return ok;}
//printf("%d %d %d\n",x,y,ok);
}
else if (czy_lit(wzorzec[y]))
{
//if (wzorzec[y]!=slowo[x]) {ok=0;return ok;}
y++;
}
else if (wzorzec[y]='*')
{ y++;
if (czy_lit(wzorzec[y])) do x++; while (wzorzec[y]!=slowo[x]);
else if (wzorzec[y]=='[') if (!litery_dozwolone(slowo[x],lit_dozwolone(wzorzec+y,&y))) {ok=0; return ok;}
else if (wzorzec[y]=='*') {y++; do x++;while (wzorzec[y]!=slowo[x]);}
else if (wzorzec[y]=='?') {y++; do x++;while (wzorzec[y]!=slowo[x]);}
}
//printf("%d %d %d\n",x,y,ok);
}
return ok;
/*int x=ix,y=ygrek,ok=1,dl=strlen(wzorzec);
char litdoz[60];
for (y;y<dl;y++)
{
printf("%d %d %d\n",x,y,ok);
if (wzorzec[y]=='?') {y++;}
else if (wzorzec[y]=='*') {
x++;
if (czy_lit(wzorzec[y])) while (slowo[x]!=wzorzec[y]) x++;
else if (wzorzec[y]=='[') {
strcpy(litdoz,lit_dozwolone(wzorzec+y,&y));
while (!litery_dozwolone(slowo[x],litdoz))
{ x++;
if (x>strlen(slowo)) {ok=0;break;}
}
} else if ((wzorzec[y]=='*') || (wzorzec[y]=='?')) {wzorzec[y]='*'; x++;}
//ok=sprawdz_wzorzec(slowo,wzorzec,x,y+1);
}
else if (wzorzec[y]=='[')
{
strcpy(litdoz,lit_dozwolone(wzorzec+y,&y));
if (!litery_dozwolone(slowo[x],litdoz)) ok=0;
}
else if (czy_lit(wzorzec[y]))
{
if (wzorzec[y]!=slowo[x]) ok=0;
x++;
}
}
//if (!(y-1>=strlen(wzorzec))) ok=0;
//if (czy_lit(wzorzec[strlen(wzorzec)-1]) && (wzorzec[strlen(wzorzec)-1]!=slowo[strlen(slowo)-1]))
printf("%d %d %d %d\n",x,y,ok,dl);
return ok;*/
}