Problem z palindromami C++

Problem z palindromami C++

Wątek przeniesiony 2021-04-16 15:55 z PHP przez Patryk27.

JW
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 2 lata
  • Postów:34
0

Mam problem z kodem, ponieważ każdy wpisany tekst, który nie jest palindromem zaliczany jest jako palindrom. Proszę o pomoc. Dopiero zaczynam a wydaje mi się, że wkradł mi się gdzieś mały błąd, który wszystko psuje,

Kopiuj
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;

void wypisz(string s)
{
    cout << "podaj zdanie : ";
    getline(cin,s);
}
bool sprawdz(string s)
{
    int j=s.size()-1;
    for(int i=0; i<j; i++)
    {
        if(s[i]==' ') i++;
        if(s[j]==' ') j--;
        if(s[i]=s[j]) return false;
       j--;
    }
    return true;
}


int main()
{
    string s;
    wypisz(s);
    if(sprawdz(s)) cout << "tekst jest palindromem "<< endl;
    else cout << "tekst nie jest palindromem "<< endl;
    return 0;
}
edytowany 1x, ostatnio: somekind
Tasmanian Devil
Hej! Twój post prawdopodobnie zawiera niesformatowany kod. Użyj znaczników ``` aby oznaczyć, co jest kodem, będzie łatwiej czytać. (jestem botem, ta akcja została wykonana automatycznie, prawdopodobieństwo 0.99880594)
axelbest
Dobra kategoria do posta o C++ ;) btw - stosuj wciecia w kodzie i umieszczaj go w znacznikach, tak jak radzi tutejszy bot tasmański. Będzie Ci łatwiej sie ogarnąć w kodzie
DR
  • Rejestracja:około 12 lat
  • Ostatnio:około godziny
  • Postów:1131
2

if(s[i]=s[j]) to jest przypisanie. Powinno raczej być ==

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:5 dni
4
Dregorio napisał(a):

if(s[i]=s[j]) to jest przypisanie. Powinno raczej być ==

Powinno raczej być !=
Z tym że błędów jest o wiele więcej.

Kopiuj
bool isPalindrom(const string &s)
{
    for(int b=0,e=s.size()-1;b<e;++b,--e)
    {
        while((b<e)&&isspace(s[b])) ++b;
        while((b<e)&&isspace(s[e])) --e;
        if((b<e)&&s[b]!=s[e]) return false;
    }
    return true;
}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
JW
Jak mi nie działało to coś jeszcze próbowałem edytować i musiałem usunąć "!" bo wczesniej go miałem ale z tą zmianą jest tak jak było.
DR
Tak, nie patrzyłem się na logikę kodu. Skupiłem się na tym co może być nie tak w ogole
JW
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 2 lata
  • Postów:34
0

@_13th_Dragon: Dobra. Po przekazaniu przez referencje działa. Pewnie by można było jeszcze coś ulepszyć ale na razie bardziej zaawansowanych rzeczy nie ogarniam. Dzieki :)

_13th_Dragon
Przekazanie przez referencję tylko przyśpiesza, nic nie zmienia.
JW
No to szczerze nie wiem o co chodzi. Po przekazaniu przez referencje jeżeli palindromy nie występują to rzeczywiscie wyskakuje mi taki komunikat. Wczesniej niezaleznie czy palindrom występował czy nie to ciągle wynikiem było, że palindrom występuje.
_13th_Dragon
Może testowałeś na danych bez spacji, twój kod wyskakuje poza przydzieloną pamięć! sprawdź dla "k...ajak" spacje zamiast kropek oczywiście.
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:7 minut
2

EEEE:

Kopiuj
void wypisz(string s)
{
    cout << "podaj zdanie : ";
    getline(cin,s);
}

Ta funkcja kłamie. Nazwa mówi, że wypisze argument, a wypisuje jakąś prośbę i czyta dane.
Na dodatek ta funkcja nic nie robi, wczytana zawartość przepada.

Z drugiej strony chwali się, że próbujesz dzielić kod na mniejsze funkcje!

Powinno być:

Kopiuj
string wczytajZadnie()
{
    string zdanie;
    cout << "podaj zdanie : ";
    getline(cin, zdanie); 
    return zdanie;
}

Albo:

Kopiuj
void wczytajZadnie(string& zdanie) // uwaga referencja!
{
    cout << "podaj zdanie : ";
    getline(cin, zdanie); 
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22
koszalek-opalek
WczytajZADnie -- podoba mi się! :)
JW
Ok dzięki za informacje. Zawsze używałem funkcji cin.getline(tekst,256) ale w przypadku palindromu bedzie problem ze spacjami (takie info dostalem od nauczyciela). Nie wiem tylko dlaczego w przypadku tego kodu po przekazaniu przez referencje nagle zadziałało. Kolega wyżej napisał, że referencja nie wpływa na działanie tylko szybkość.
_13th_Dragon
W twoim przypadku to był jeden z błędów, nie wpływa na działanie funkcji, zaś wpływa na przekazanie czegokolwiek do tej funkcji. Zwyczajnie algorytm jest błędny.
JW
Ok. Dzięki za pomoc !

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.