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

Program Palindrom - zawsze ta sama odpowiedź

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

#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;
}
0
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

0

Wczytujesz jeden znak.

0

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

0

A czym jest u ciebie to i?

1

koleś wtf

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

A jeśli wydajność jest problemem

if(equal(begin(word), begin(word) + word.size()/2, rbegin(word)))
0

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

0
int i=0;
int j=tab[i-1];

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

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?

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

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 ?

0

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

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?

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.

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

To rozumiesz?

0

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

0

Masz wyżej.

1

w c++ używamy std::string

#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

2

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

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:

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

0

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

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 :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1