Witam,
Na wstępie chciałbym podziękować za pomoc w poprzedniej kwestii. Szansa na zaliczenie tego przedmiotu się dzięki wam zwiększyła. Niestety znów jestem zmuszony prosić was o pomoc.
Do napisania następująca rzecz. Użytkownik wprowadza teks, a program ma sprawdzić czy jest on palindromem. Etapy rozwiązania problemu:
- Usunięcie znaków interpunkcyjnych z wprowadzonego tekstu
- Zamiana wielkich na male litery (już z tekstu pozbawionego znaków interpunkcyjnych)
- Odwrócenie tekstu składającego się tylko z małych liter.
- Porównanie tekstów z punktu 2 i 3.
Uwaga jedna: nie wolno mi używać klasy string:/
Nawet nie wiem jak określić co działa a co nie działa w tym programie. Na pewno nie działa usuwanie znaków interpunkcyjnych. Wydaje się działać zamiana wielkich na małe litery. Pisanie tekstu od tyłu raz działa a raz nie:/
Oto kod:
#include <iostream>
#include <string>
#include <vector>
using namespace::std;
class Napis {
private:
char* Tablica;
int Dlugosc;
char* od_tylu;
char* male;
char* bez_inter;
int Dlugosc_Bez_Inter;
public:
Napis(char* Tekst);
~Napis();
void Zamien(int i, char c);
void wyswietl();
void przestaw(int i, int j);
void napis_od_tylu();
void napis_male();
void napis_bez_inter();
bool napis_jest_palindromem();
bool char_in_set(char, string);
};
bool Napis::napis_jest_palindromem(){
return (male == od_tylu);
}
/* string od_tylu(const string& s) {
int poczatek = 0;
int koniec = s.length( );
string pom(s);
while (poczatek < koniec)
{
koniec--;
przestaw(pom[poczatek], pom[koniec]);
poczatek++;
}
return pom;
}
*/
void Napis::napis_bez_inter(){
delete [] bez_inter;
int Tablica_size = sizeof(Tablica)/sizeof(char);
bez_inter = new char[Tablica_size + 1];
string znaki(",;:.?!'\" ");
int i = 0;
int j = 0;
while (i < Tablica_size) {
if (!char_in_set(Tablica[i], znaki)) {
bez_inter[j] = Tablica[i];
j++;
}
i++;
}
}
bool Napis::char_in_set(char c, string set) {
int size = set.length();
for (int i = 0; i < size; i++) {
if (c == set[i]) {
return true;
}
}
return false;
}
void Napis::napis_male(){
delete [] male;
male = new char[Dlugosc_Bez_Inter + 1];
for (int i = 0; i < Dlugosc_Bez_Inter; i++)
male[i] = tolower(bez_inter[i]);
}
/*
string na_male_litery(const string& s) {
string pom(s);
for (int i = 0; i < s.length( ); i++)
pom[i] = tolower(s[i]);
return pom;
}
*/
void Napis::napis_od_tylu(){
delete [] od_tylu;
od_tylu = new char[Dlugosc_Bez_Inter + 1];
char temp;
for (int i = 0; i < Dlugosc_Bez_Inter; i++)
{
od_tylu[i] = male[i];
}
for (int i = 0; i < Dlugosc_Bez_Inter/2; i++)
{
temp = od_tylu[i];
od_tylu[i] = od_tylu[Dlugosc_Bez_Inter - i - 1];
od_tylu[Dlugosc_Bez_Inter - i - 1] = temp;
}
}
void Napis::przestaw(int i, int j) {
char * temp = new char[2];
temp[0] = Tablica[i];
temp[1] = Tablica[j];
Tablica[i] = temp[1];
Tablica[j] = temp[0];
delete [] temp;
}
Napis::Napis(char* Tekst) {
Dlugosc = std::strlen(Tekst);
Tablica = new char[Dlugosc + 1];
if (Tablica)
memcpy (Tablica, Tekst, Dlugosc+1);
else
Dlugosc = 0;
od_tylu = new char[Dlugosc+1];
male = new char[Dlugosc+1];
bez_inter = new char[Dlugosc+1];
napis_bez_inter();
napis_male();
napis_od_tylu();
}
Napis::~Napis() {
if(Dlugosc) delete[] Tablica;
delete[] od_tylu;
delete[] bez_inter;
delete[] male;
}
void Napis::wyswietl(){
cout << Tablica << endl;
cout << "Bez interpunkcji: " << bez_inter << endl;
cout << "Zamieniony na male litery: " << male << endl;
cout << "Na koniec napis od tylu: " << od_tylu << endl;
}
int main() {
char * tekst = new char;
string znaki(",;:.?!'\" ");
cout << "Wpisz jakis napis" << endl;
cin >> tekst;
Napis Napis(tekst);
if (Napis.napis_jest_palindromem())
cout << "Wprowadzony napis jest palindromem" << endl;
else
cout << "Wprowadzony napis nie jest palindromem" << endl;
delete [] tekst;
Napis.wyswietl();
cin.get();
return 0;
}
Z góry dziękuję za pomoc.
Pozdrawiam,