• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program Palindromy nie działa dokładnie tak jak trzeba

0 głosów
460 wizyt
pytanie zadane 20 listopada 2019 w C i C++ przez Zydu Początkujący (340 p.)

Witam mam problem z poniższym kodem:

Teoretycznie program działa,jednak oprócz poprawnej odpowiedzi,z drugiej tablicy wypisują się jakieś krzaki. Nie za bardzo wiem jak sobie z tym poradzić w C gdzie nie ma stringów.

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

#define MAX 30

int Palindrom(char *tab)
{
    int l=strlen(tab);
    for (int i=0;i<ceil(l/2);i++)
    {
        if (tab[i]!=tab[l-1-i]) return 0;  // Jesli slowo nie jest palindromem zwroc 0
    }
    return 1;
}



int main()
{
    int n,k=0;
    char slowo[MAX],slowo2[MAX];
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
    scanf("%s",slowo);
    for (int j=strlen(slowo)-1;j>=0;j--)
    {
        slowo2[k]=slowo[j];  // w tym momencie prawdopodobnie cos sie psuje
        k++;
    }
    k=0;
    if (Palindrom(slowo)==1)
        printf("%s==%s\n",slowo,slowo2);
        else
            printf("%s!=%s\n",slowo,slowo2);
    }



    return 0;
}

2 odpowiedzi

+1 głos
odpowiedź 20 listopada 2019 przez mokrowski Mędrzec (159,000 p.)
wybrane 20 listopada 2019 przez Zydu
 
Najlepsza

Trochę niepotrzebne angażowanie matematyki do tak prostego zagadnienia:

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

#define MAX 30

bool Palindrom(const char *tab)
{
    const char * last = tab + strlen(tab) - 1;
    while(tab < last)
    {
        if(*(tab++) != *(last--)) {
            return false; // Jeśli nie palindrom, zwróć false
        }
    }
    return true;
}

int main(void)
{
    unsigned n;
    char slowo[MAX];
    scanf(" %d", &n);
    for (unsigned i = 0; i < n; ++i) {
        scanf("%s", slowo);
        if (Palindrom(slowo)) {
            printf("%s==%s\n", slowo, slowo);
        } else {
            printf("%s!=%s\n", slowo, slowo);
        }
    }

    return 0;
}

Wystarczy iterować do momentu gdy początek (czyli tab), jest mniejszy niż element ostatni i w każdym obiegu zmniejszać wskaźnik. Można jeszcze urwać kilka bajtów (bo raczej większej szybkości już nie uzyskasz):

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

#define MAX 30

bool Palindrom(const char *tab)
{
    const char * last = tab + strlen(tab) - 1;
    while(tab < last)
    {
        if(*(tab++) != *(last--)) {
            return false; // Jeśli nie palindrom, zwróć false
        }
    }
    return true;
}

int main(void)
{
    unsigned n;
    char slowo[MAX];
    scanf(" %d", &n);
    for (unsigned i = 0; i < n; ++i) {
        scanf("%s", slowo);
        printf("%s%c=%s\n", slowo, (Palindrom(slowo) ? '=': '!'), slowo);
    }

    return 0;
}

Tu wystarczy zauważyć że w obydwu wynikach zmienia się wyłącznie jeden znak wyświetlany.

Już "hiperporawne" będzie zwracanie z funkcji w 1 miejscu returnem wartości. Niektóre standardy kodowania tego wymagają.

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

#define MAX 30

bool Palindrom(const char *tab)
{
    const char * last = tab + strlen(tab) - 1;
    bool answer = true;
    while(tab < last)
    {
        if(*(tab++) != *(last--)) {
            answer = false;
            break;
        }
    }
    return answer;
}

int main(void)
{
    unsigned n;
    char slowo[MAX];
    scanf(" %d", &n);
    for (unsigned i = 0; i < n; ++i) {
        scanf("%s", slowo);
        printf("%s%c=%s\n", slowo, (Palindrom(slowo) ? '=': '!'), slowo);
    }

    return 0;
}

Niestety, dla C aby osiągnąć bardziej zaawansowane efekty, wskaźniki są niezbędne... 

PS. A na koniec bonus do własnej analizy (choć tak bym w projektach nie pisał):

bool Palindrom(const char *tab)
{
    const char * last = tab + strlen(tab) - 1;
    bool answer = true;
    while(((tab < last) && ((*(tab++) == *(last--)) || (answer = false)))) {}
    return answer;
}

 

komentarz 20 listopada 2019 przez Zydu Początkujący (340 p.)

Wow,wielkie dzięki za taką rozbudowaną odpowiedź i pomoc w zrozumieniu zagadnienia laugh

Ogólnie poradziłem sobie już przed sprawdzeniem,a jedyne co zrobiłem to w pętli for dodałem przypisanie '\0' do każdej z tablic i to pomogło :) 

+1 głos
odpowiedź 20 listopada 2019 przez kukulim Mądrala (6,440 p.)
Nie za bardzo znam się na C, ale chyba tak się odwraca słowa:

            int len = strlen(slowo);
            int half = len / 2;
            int j;    
            for (j = 0; j < half; j++)
            {
                char c = slowo[j];
                slowo[j] = slowo[len - j - 1];
                slowo[len - j - 1] = c;
            }

możesz po prostu skopiować słowo do słowo 2 potem je odwrócić. Bo jak chcesz odwrócić tabele to jeszcze jest znak zakończenia napisu.

Podobne pytania

–1 głos
4 odpowiedzi 510 wizyt
pytanie zadane 13 stycznia 2019 w Java przez ShockOfficial Początkujący (390 p.)
+1 głos
1 odpowiedź 306 wizyt
0 głosów
1 odpowiedź 380 wizyt
pytanie zadane 15 lutego 2020 w Python przez Sp4rq Użytkownik (790 p.)

93,753 zapytań

142,713 odpowiedzi

323,356 komentarzy

63,347 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...