matematykaszkolna.pl
palindromy karo: Palindromy. Napisałam program, w którym sprawdzam, czy dany ciąg znaków jest palindromem. Uwzględniłam sprawdzenie spacji po to, by np. przy wpisaniu "elf ukladal kufle" także otrzymać odpowiedź: TAK. Niestety za każdym razem, bez względu na to, co wpisuję − otrzymuję odpowiedź: NIE. Mógłby ktoś zajrzeć i pomóc ustalić, w którym miejscu popełniłam błąd? Mój program: #include <iostream> #include <string> #include <cstdlib> using namespace std; string palindrom (string zdanie) { int i=1; int j=zdanie.length(); while(i<j) { while (zdanie[i] == ' ') i++; while (zdanie[j] == ' ') j−−; if (zdanie[i] != zdanie[j]) return "NIE"; i++; j−−; } return "TAK"; } int main() { string zdanie; getline(cin,zdanie); cout <<palindrom(zdanie); }
19 lip 17:02
Adamm: zamień i=0
19 lip 17:09
Adamm: zamień j=zdanie.length()−1;
19 lip 17:11
Adamm: usuwać spacje chyba lepiej przed sprawdzaniem czy i<j
19 lip 17:13
karo: Działa! Dziękuję bardzo! A co do tych spacji to uważasz, że jest jakaś różnica?
19 lip 17:19
Adamm: tak może się tak zdarzyć, że program usuwa ci spacje i nagle i≥j, mimo że przed chwilą było na odwrót spróbuj z paroma przykładami, szczególnie z takimi co mają dużo spacji w środku
19 lip 17:22
Adamm: chociaż w sumie to nie powinno sprawdzi jeden przypadek dwa razy, ale nic się nie stanie
19 lip 17:27
karo: Hmm, ale skoro j przechowuje długość zdania to automatycznie uwzględnia także wszystkie spacje. Więc po ich usunięciu nie może zdarzyć się taka sytuacja, że warunek nie będzie spełniony. Chyba, że już coś bredzę...
19 lip 17:29
Pytający: #include <cstdlib> jest zbędne. Ponadto Twoja funkcja nie uwzględnia zdań złożonych z samych spacji (czy to zamierzone − nie wiem).
19 lip 18:02
karo: Do Pytający: To prawda, do tego momentu biblioteka nie jest konieczna, ale chciałam jeszcze nieco rozbudować to zadanie. Co do spacji, szczerze mówiąc nie zastanawiałam się nad tym − myślę, że skoro spacje nie są liczone w przypadku sprawdzania zdań (słów oddzielonych spacją), to w takim przypadku także liczone być nie powinny. Wydaje mi się, że palindrom ma to do siebie, że jest czytany z lewej do prawej tak samo jak z prawej do lewej − a jak przeczytać niby ciąg spacji? Wydaje mi się, że w takim przypadku chyba najsensowniejszym rozwiązaniem jest dodanie odpowiedzi, że nie zostały wprowadzone żadne dane (dane niepoprawne).
19 lip 19:05
Pytający: To przy rozbudowie możesz zaimportować, nie ma co importować "na przyszłość" (przynajmniej według mnie tak jest sensowniej). Jak obsłużyć same spacje? Twój wybór − tak samo, jak Twoim wyborem było samo pomijanie spacji. Byle byś jasno określiła, jak ta funkcja działa i czego wymaga. Przykładowo wywołanie w Twoim kodzie: zdanie[−1]; prawie zawsze będzie miało niezdefiniowane działanie. Wynika to stąd, że funkcja: http://www.cplusplus.com/reference/string/string/operator[]/ nie sprawdza indeksu, bo zwyczajnie zakłada jego poprawność. Podobnie Ty pisząc swoją funkcję określasz, jakich danych ona oczekuje i jak (nie) reaguje na niepoprawne dane. Oczywiście należy uwzględnić to przy wywołaniu. Osobiście: • zwracałbym bool'a, w końcu funkcja sprawdza czy argument jest palindromem, • dla samych spacji zwróciłbym true, bo po pominięciu spacji mamy pusty string, a ten oczywiście wygląda tak samo czytany wspak. Coś w tym stylu: https://ideone.com/h9aAe6
19 lip 20:53
karo: Do Pytający Chodziło mi o to, że kolejna funkcja jest już gotowa i funkcjonuje w programie, tylko nie przekopiowałam jej tutaj, bo stwierdziłam, że nie w tym problem − najpierw wolałam rozwiązać to zagadnienie. A biblioteka jak to biblioteka, po prostu uszła mojej uwadze i najzwyczajniej w świecie zapomniałam jej usunąć przy kopiowaniu kodu tutaj. Co to palindromu to myślę, że to rzeczywiście kwestia umowna. Dziękuję za sugestie!
20 lip 07:46