Implementacja funkcji bool isPalindrom (char*).

0

Witam wszystkich.
Potrzebuje pomocy z programem nad którym już trochę siedzę. Generalnie mam zaimplementować funkcję bool isPalindrom(char*) która zwraca 1 jeżeli przekazany wyraz jest palindromem, a 0 jeżeli nie. Problem mój polega na tym, że nie do końca wiem jak odwołać się do ostatniego znaku wyrazu. Oto co napisałem do tej pory, ale program wywala błąd:

 
#include <iostream>

using namespace std;

bool isPalindrom(char *x)
{
    int n=4;
    char *tab = new char[n];
    int i = 0;

    while(*x){
        tab[i]=*x;
        i++;
    }
    for(int a = 0; a <= 1; a++){
        for(int b = 3;b >= 2; b-- ){
        if(tab[a]==tab[b]){
            return 1;
        }else return 0;
        }
    }
}

int main()
{
    cout << isPalindrom("RAAR") << endl;
}

Z góry dzięki za pomoc.

Dodam, że pętle ustawiłem "na sztywno" tak jakbym znał ilość liter w wyrazie. To jest tylko na przetestowanie funkcji.

0

Długość przekazanego łańcucha zwróci funkcja strlen(). Ostatni znak to, w Twoim przypadku, x[strlen(x)-1].

0

Problem w tym, że nie mogę używać funkcji wbudowanych jak strlen() lub at().

1

nie wiem czy dobrze, spróbuj tak :

bool isPalindrom(char *wyraz)
{
	int zakres = 0;
	while(wyraz[zakres])
		zakres++;
	for(int i = 0; i < zakres / 2; i++)
	{
		if(wyraz[i] != wyraz[(zakres-1)-i])
			return false;
	}

	return true;
}
 
1

W jakim celu próbujesz przepisać jedną tablicę do drugiej? Zasadniczo ta pętla jest nieskończona: *x to znak R. Nigdzie nie przesuwasz wskaźnika aby doszedł do znaku \0 i zakończył tę pętlę - w końcu przekraczasz zakres tablicy tab i dostajesz błąd.

Reszta kodu nie jest lepsza - sposób sprawdzania czy wyraz jest palindromem jest co najmniej dziwny. Przecież wystarczy jedna pętla i porównywanie znaków od początku i od końca.

BTW: skoro ma być is to palindrome.

0
qwe napisał(a)

nie wiem czy dobrze, spróbuj tak :

bool isPalindrom(char *wyraz)
{
	int zakres = 0;
	while(wyraz[zakres])
		zakres++;
	for(int i = 0; i < zakres / 2; i++)
	{
		if(wyraz[i] != wyraz[(zakres-1)-i])
			return false;
	}

	return true;
}
 

Tak, to jest to czego potrzeowałem. Dzięki za pomoc.

W jakim celu próbujesz przepisać jedną tablicę do drugiej?

Właśnie dlatego potrzebowałem pomocy, bo nie wiedziałem, że to jest już tablica.

Pozdrawiam.

2

Znowu maltretują młodzież c-stringami? Przecież powinno się ich uczyć rozwiązywania problemów, tym C++ różni się od C, że udostępnia wysokopoziomowe kontenery i podstawowe operacje na nich:

#include <algorithm>
#include <iostream>
#include <string>
using namespace std;

bool isPalindrome(const string &str) {
  return equal(str.begin(), str.begin() + str.size() / 2, str.rbegin());
}

int main() {
  cout << isPalindrome("kobylamamalybok")  << endl;
  cout << isPalindrome("dupadupadupadupa") << endl;
}

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