Program Palindrom - zawsze ta sama odpowiedź

Program Palindrom - zawsze ta sama odpowiedź

Wątek przeniesiony 2015-02-17 12:16 z C/C++ przez ŁF.

0

Siema, napisalem programik palindrom czyli sprawdzajacy cyz wyraz od tylu brzmi tak samo jak od przodzu np KAJAK, niestety program za kazdym razem daje informacje ze wyraz jest palindromem prosze o pomoc

Kopiuj
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;



bool czy_palindrom(char tab[])

{
  //ustawiam liczniki "i" i "j" na pierwszy i ostatni znak wyrazu tab 
  int i=0;
  int j=tab[i-1];
   //pamiętajmy, że indeksujemy tablicę od 0
 
  while(i<j) //pętla wykonuje się do momentu spotkania liczników
  {
    if(tab[i]!=tab[j]) //gdy znaki nie będą się zgadzać, to wyraz nie jest palindromem
      return false;
      else
 
    i++; //przejscie do następnej litery idąc w prawą stronę
    j--; //przejscie do poprzedniej litry idąc w lewą stronę
  }
 
  return true; //wyraz jest palindromem
}
 
int main()
{
  char tab[100];
  cout<<"Podaj wyraz: ";
  cin>>tab;
 
  if(czy_palindrom(tab)) //lub if(czy_palindrom(tab)==true) lub if(czy_palindrom(tab)==1)
    cout<<"Wyraz "<<tab<<" jest palindromem"<<endl;
  else
    cout<<"Wyraz "<<tab<<" nie jest palindromem"<<endl;
 
  system("pause");
  return 0;
}
GA
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 5 lat
0
Kopiuj
int j=tab[i-1];

to nie jest indeks ostatniego elementu
2. w pętli w bloku else powinny być dwie linijki a nie jedna

KW
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 7 lat
  • Postów:99
0

Wczytujesz jeden znak.

edytowany 1x, ostatnio: KazikWielki
0

jak to nie jest ostatni znak to jai bedzie ? zawsze bylem przekonany ze w tablicy t[i] ostatatnim elementem jest t[i-1]

KW
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 7 lat
  • Postów:99
0

A czym jest u ciebie to i?

spartanPAGE
  • Rejestracja:około 12 lat
  • Ostatnio:około 3 godziny
1

koleś wtf

Kopiuj
if(word == string(rbegin(word), rend(word))

A jeśli wydajność jest problemem

Kopiuj
if(equal(begin(word), begin(word) + word.size()/2, rbegin(word)))
edytowany 3x, ostatnio: spartanPAGE
twonek
+ wordsize()/2?
0

i jest pierwszym indeksem tablicy w sumie powinno byc chyba t[0], ale nawet jak ustawialem na zerowym indeksie to to samo bylo

GA
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 5 lat
0
Kopiuj
int i=0;
int j=tab[i-1];

j jest wartością elementu tab[-1] a nie indeksem ostatniego elementu

KW
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 7 lat
  • Postów:99
0

No właśnie, t[i] jest pierwszym elementem tablicy, więc t[i-1] bynajmniej nie jest ostatnim. :P

0

to jaki bedzie ostatni ? co mam napisac zeby działało?

Kopiuj
bool czy_palindrom(char tab[])
{
  //ustawiam liczniki "i" i "j" na pierwszy i ostatni znak wyrazu tab 
  int i=0, j = strlen(tab)-1; //pamiętajmy, że indeksujemy tablicę od 0

na necie znalazlem taki poczatek kodu i z tym działa tylko ze jest taki problem ze nie rozumiem tej funckji streln nie mialem tego nigdy na lekcjach i nie wiem co oznacza ten zapis, moglibyscie mi to napisac jakos zrozumialem nie chce zeby ktos mi to tlumaczyl tylko napisal prosciej jelsi mozna

KW
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 7 lat
  • Postów:99
0

super stronka po angielsku na pewno duzo mi wytlumaczy, prosilem zeby to zapisac w inny sposob a nie tlumaczyc funkcje ktorej nie mialem nigdy wprowadzonej ok ?

KW
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 7 lat
  • Postów:99
0

Nie miałeś jej wprowadzonej -> chcesz ją zrozumieć -> na tej stronie jest wytłumaczone (protip: strlen to skrócone string length).

edytowany 1x, ostatnio: KazikWielki
0

storna jest po angielsku, nie mialem jej wprowadzonej czyl prosze o prostszy zapis ktory zrozumiem z dotychczasową wiedzą, jakbym potrafil to poprawilbym sam ale jesli prosze was o poprawienie jednego bledu to ciezko napisac co tam powinno byc tylko odsylac mine gdzie indziej?

KW
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 7 lat
  • Postów:99
0

No prostszego chyba nie ma. strlen zwróci ci długość stringa (przykładowo jeśli masz string "test" zwróci ci 4), indeksujemy od 0, więc musimy od tego odjąć 1.

Kopiuj
char tab[5] = "test"; // 5 bo doliczamy null-character ('\0')
size_t length = 0;
for(; tab[length] != '\0'; ++length);
cout << length; // 4

To rozumiesz?

edytowany 1x, ostatnio: KazikWielki
0

dobra rozumiem, ale chce napisac to bez uzywania tej funkcji nie da sie tak?

KW
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 7 lat
  • Postów:99
0

Masz wyżej.

gośćabc
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Szczecin
  • Postów:500
1

w c++ używamy std::string

Kopiuj
#include <iostream>
#include <string>
#include <algorithm>

bool isPalindrome(std::string const& s);

int main()
{
	std::cout << isPalindrome("kajak");
	std::cout << isPalindrome("niekajak");

	return 0;
}

bool isPalindrome(std::string const& s)
{
	std::string temp = s;
	std::reverse(std::begin(temp), std::end(temp));

	return s == temp;
}

http://melpon.org/wandbox/permlink/azVITsZg8Yk6qDRO

spartanPAGE
Kopiowanie nie jest potrzebne
bogdans
W pierwszym poście jest taka definicja palindromu wyraz od tylu brzmi tak samo jak od przodzu. Wg mnie wyraz "KajAk" brzmi od tyłu i od przodu tak samo, więc powinien być palindromem.
gośćabc
@bogdans czepiasz się szczegółów :D
bogdans
@gośćabc, napisać program, który rozpoznając palindromy bierze pod uwagę wielkośc liter oraz nie ignoruje znaków interpunkcyjnych, to małe piwo. Wg polonistów, językoznawców, mnie i tzw. zwykłych ludzi, poniższe zdania są palindromami: Albo nałowi ci Wałęsa masę ławic i woła: "Nobla!..." Iwono, ty rabuj okop spokoju barytonowi! I lali masoni wydrom w mordy wino, sami lali! Elf układał kufle. I zduna zaraz cna japa janczara zanudzi.
Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:prawie 2 lata
2

Wtf.
Nie trzeba niczego kopiować i wystarczy jedna linijka:

Kopiuj
std::equal(str.cbegin(), str.cbegin() + (str.size() / 2), str.crbegin());

http://ideone.com/Gg1M17

Oczywiście to wersja podstawowa i nie spełnia tego o czym pisze @bogdans. Żeby to spełnić wystarczy inna wersja std::equal:

Kopiuj
std::equal(str.cbegin(),
           str.cbegin() + (str.size() / 2),
           str.crbegin(),
           [](char c1, char c2) {
             return (std::tolower(c1) == std::tolower(c2));	
           });

http://ideone.com/ABoM4k


"(...) otherwise, the behavior is undefined".
edytowany 6x, ostatnio: Endrju
gośćabc
@spartanPAGE już o tym wspomniał, std::reverse nic nie zwraca, to użyłem kopii; fajnie, że masz ciekawszy pomysł; tylko nie podniecaj się tym tak bardzo, to tylko forum, a na mojego pm'a jeszcze nie odpisałeś
KW
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 7 lat
  • Postów:99
0

Kolega ma problem ze strlen, a Wy mu tu lambdami rzucacie. :P

gośćabc
poprzednik ma chyba jakiś uraz, mi chodziło jedynie o to aby użył std::string, jeżeli chciałby wypisać odwrócony string to samo std::equal nie wystarczy, jak zwykle ludzie robią kupę jak znajdą chociaż jedną kopię, której "możnaby" uniknąć, ale czasem mogłaby się przydać, taka specyfika tego forum
ujemny
  • Rejestracja:prawie 15 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Lublin
0
rikrosfit napisał(a):

super stronka po angielsku na pewno duzo mi wytlumaczy, prosilem zeby to zapisac w inny sposob a nie tlumaczyc funkcje ktorej nie mialem nigdy wprowadzonej ok ?

To musisz koniecznie poszukać pl a najlepiej audio-booka, żeby Cię oczka nie rozbolały :)


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.