program z tablic znaków

0

Wiem, że był już tutaj wątek o podobny program, ale mój kod jest inny i mam mały błąd. Program ma sprawdzać czy podane wyrazy są anagramami, wszystko ładnie działa, dopóki nie pojawia się wyrazy typu: "kot" i "koy". Różnią się tylko literką na końcu, a mimo to program pokazuję mi, że to są też anagramy. Wiecie może jak tu coś zmienić?

#include <stdio.h>
#include <string.h>

void czyanagram(char tab1[], char tab2[])
{
    if(strlen(tab1)==strlen(tab2))
    {
        int i, n, flaga ;
        int znak_tab2 ;
        int znak_tab1 ;
        for(i=0 ; i<(strlen(tab1)-1) ; i++ )
            flaga= 0 ;
        znak_tab1 = tab1[i] ;
        for(n=0 ; n<(strlen(tab2)-1)&& flaga ==0 ; n++ )
            znak_tab2 = tab2[n] ;
        if (znak_tab1 == znak_tab2)
            flaga = 1 ;

        if(flaga==0)
        {


            printf("to sa anagramy") ;
        }
        else printf("to nie sa anagramy") ;

    }


    else printf("to nie sa anagramy");
}

int main()
{

    char s1[100];
    char s2[100];
    scanf("%99s",s1);
    scanf("%99s",s2);
    czyanagram(s1,s2);
    return 0 ;
}

1

Według tego kodu wszystkie wyrazy o identycznej długości są anagramami (np. abcd i efgh: http://melpon.org/wandbox/permlink/n1uCKh8XJaFvRweQ )

Nawet IDE Ci podpowiedziało, co jest źle - spójrz na indentację pętel for (brakuje nawiasów klamrowych - w pętli wykonywana jest tylko jedna instrukcja)

0
#include <stdio.h>
#include <string.h>

void czyanagram(char tab1[], char tab2[])
{
    if(strlen(tab1)==strlen(tab2))
    {
        int i, n, flaga ;
        int znak_tab2 ;
        int znak_tab1 ;
        for(i=0 ; i<(strlen(tab1)-1) ; i++ )
            flaga= 0 ;
        znak_tab1 = tab1[i] ;
        for(n=0 ; n<(strlen(tab2)-1)&& flaga ==0 ; n++ )
            znak_tab2 = tab2[n] ;
        if (znak_tab1 == znak_tab2)
            flaga = 1 ;

        if(flaga==0)
            printf("to sa anagramy") ;
        else printf("to nie sa anagramy") ;
    }


    else printf("to nie sa anagramy");
}

int main()
{

    char s1[100];
    char s2[100];
    scanf("%99s",s1);
    scanf("%99s",s2);
    czyanagram(s1,s2);
    return 0 ;
}

okej, przypadkiem zgubiłem ten nawias, ten kod spełnia to co napisałem w pierwszym poście.

1

Przypadkiem zgubiłeś, ale w "poprawionym" kodzie wciąż bez zmian...

0

W której pętli for ?

1

A w której chcesz, żeby wykonywała się więcej niż jedna instrukcja?

Na razie w pierwszej przypisujesz n razy 0 do flaga, a w drugiej przypisujesz kolejne znaki drugiego stringa do znak_tab2

Ogółem, porzuć ten kod i zabierz się za zadanie od nowa. Zastanów się w jaki sposób stwierdzisz, że bajka i kabaj to anagramy, a bajka i kabej już nie?

0
for(i=0 ; i<(strlen(tab1)-1) ; i++ )
        znak_tab1 = tab1[i] ;
        flaga= 0 ;

tak to chyba zmienię

1

Zdajesz sobie sprawę, że teraz flaga=0; zostanie bezwarunkowo wykonane po pętli?

0

Pomieszałem, teraz to już nic się nie stanie.

1

Rozumiem, że w drugim forze zasada "jeśli nie ma klamer to pythonowa indentacja nie pomoże i w pętli zostanie wykonana jedna instrukcja" nie działa?

Zamiast nieudolnie próbować porównać kolejne literki zastanów się nad przykładami które dałem wyżej i jak doprowadzić do tego, aby tam zostały zwrócone dobre wyniki.

0

Problem polega na tym, że sam algorytm jest bezsensu.
Możesz wyjaśnić na czym polega twój pomysł na stwierdzenie czy coś jest anagramem? Zgodnie z moją wiedzą sama zmienna flaga (i zmienne do iterowania) nie pozwala na takie stwierdzenie, że dwa ciągi są anagramami.
Potrzebne są bardziej skomplikowane zmienne (no dobra da się to zrobić z tą jedną zmienna, ale dużym kosztem złożoności obliczeniowej algorytmu).

0

Okej! Kod pozmieniany, najpierw sortuje, a potem porównuje te same indeksy. Możecie sprawdzić, czy da sie to jakoś zagiąć, lub kod jest napisany możliwie najlepiej?

#include <stdio.h>
#include <string.h>

void sortuj( char *str, int len)
{
    int f = 1;
    int i;

    while (f)
    {
        f = 0;
        for ( i = 0; i < (len - 1); ++i )
        {
            if ( str[i] > str[i+1] )
            {
                char t = str[i];
                str[i] = str[i+1];
                str[i+1] = t;
                f = 1;
            }
        }
    }
}

void czy_anagram(char t1[], char t2[] )
{
    int w = strlen( t1);
    int a = strlen( t2);

    if ( a == w )
    {
        sortuj( t1, w );
        sortuj( t2, a );
        if ( strcmp( t1, t2 ) == 0 )
        {
            puts("to sa anagramy") ;

        }
        else
            puts("to nie sa anagramy") ;
    }
    else
        puts("to nie sa anagramy") ;
}
int main()

{

    char s1[100];
    char s2[100];
    scanf("%99s",s1);
    scanf("%99s",s2);
    czy_anagram(s1,s2);
}
1

Zamiast używać prawie najgorszego możliwego sortowania użyj qsort. Tak poza tym - wygląda ok, pod warunkiem, że wołający funkcję wie, że mu pozmienia dane.

0

Nie rozumiem, o co chodzi, że pozmienia mu dane?
Też chciałbym się spytać, czy nie wychodze poza tablicę w działaniu funkcji? Na zajęciach o tablicach liczbowych zdarzało się, że ludzie wychodzili w programach poza tablicę i ucinało im punkty na kolokwium.

0

Po sprawdzeniu wypisz "zebra jest anagramem barze"

0

No rozumiem, ale chyba da się to zrobić w moim kodzie?

0

To zrób.

1 użytkowników online, w tym zalogowanych: 0, gości: 1