• 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

Object Storage Arubacloud
0 głosów
265 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 (155,460 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 235 wizyt
pytanie zadane 13 stycznia 2019 w Java przez ShockOfficial Początkujący (390 p.)
+1 głos
1 odpowiedź 149 wizyt
0 głosów
1 odpowiedź 231 wizyt
pytanie zadane 15 lutego 2020 w Python przez Sp4rq Użytkownik (790 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...