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;*/
}