Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lek12.doc
Скачиваний:
3
Добавлен:
15.11.2018
Размер:
124.42 Кб
Скачать

Void swap(char& vl, char& v2);

// Меняет местами значения переменных vl и v2.

string reverse(const string& s);

// Возвращает копию s с символами, расположенными в обратном порядке.

string remove_punct(const string& s, const string& punct);

// Возвращает копию s, из которой удалены все вхождения символов

// строки punct.

string make_lower(const string& s);

// Возвращает копию s, в которой все буквы верхнего регистра

// переведены в нижний, а остальные символы остались без изменений.

bool is_pal(const string& s);

// Возвращает true, если строка является палиндромом.

// и false в противном случае.

Int main()

{

string str;

cout <<"Enter a candidate for palindrome test\n"

<<"followed by pressing Enter An";

getline(cin,str);

if (is_pal(str))

cout << "\"" « str + "\" is a palindrome.";

else

cout <<"\"" « str + "\" is not a palindrome.";

cout <<endl;

return 0; }

Void swap(char& v1, char& v2)

{

char temp = v1;

v1 = v2;

v2 = temp;

}

string reverse(const string& s)

{

int start = 0;

int end = s.length();

string temp(s);

while (start < end)

{

end--;

swap(temp[start], temp[end]);

start++; }

return temp;

}

// Используем библиотеки классов cctype и string.

string make_lower(const string& s)

{

string temp(s);

for (int i =0; i < s.length(); i++)

temp[i] = tolower(s[i]);

return temp; }

string remove_punct(const string& s, const string& punct)

{

string no_punct; // Инициализируется пустой строкой.

int s_length = s.length();

int punct_length = punct.lengthO;

for (int i = 0; i < s_length; i++)

{

// Извлечение очередного символа из строки s.

string a_char = s.substr(i,1);

// Поиск вхождения очередного символа строки s в строке punct.

int location = punct.find(a_char, 0);

if (location < 0 || location >= punct_length)

no_punct = no_punct + a_char; // a_char отсутствует

// в punct. сохраняем его. }

return no_punct; }

// Используем функции make_lower, remove_punct.

Bool is_pal(const string& s)

{

string punct(",;:.?!'\" "); // Включает пробел.

string str(s);

str = make_lower(str);

string lower_str = remove_punct(str, punct);

return (lower_str == reverse(lower_str)); }

Примеры диалога

Enter a candidate for palindrome test

followed by pressing Enter.

Madam, I'm Adam.

"Madam. I'm Adam." is a palindrome.

Enter a candidate for palindrome test

followed by pressing Enter.

Radar

"Radar" is a palindrome.

Enter a candidate for palindrome test

followed by pressing Enter.

Am I a palindrome?

"Am I a palindrome?" is not a palindrome.

Взаимное преобразование объектов типа string и строк С

Как вы знаете, C++ выполняет автоматическое преобразование типов, позволяю­щее присваивать строки С переменным типа string. Например, приведенный ниже код является абсолютно правильным.

char a_c_string[] = "This is my С string.";

string string_variable;

string_variable = a_c_string;

А вот такой оператор:

a_c_string = string_variable; // НЕДОПУСТИМО

вызовет вывод компилятором сообщения об ошибке.

Недопустим и следующий оператор:

strcpy(a_c_string. string_variable); // НЕДОПУСТИМО

Функция strcpy не может принимать в качестве второго аргумента объект типа string, и C++ не выполняет автоматического преобразования объектов string в стро­ки С, что является реальной проблемой.

Для получения строки С, соответствующей объекту string, нужно выполнить яв­ное преобразование типов. Это можно сделать с использованием функции-члена c_str(). Вот как правильно произвести копирование объекта string в строку С:

strcpy(a_c_string, string_variable.c_str()); // ДОПУСТИМО

Обратите внимание, что копирование нельзя выполнить без помощи функции strcpy. Функция-член c_str() возвращает строку С, соответствующую вызываю­щему объекту string. Как уже говорилось ранее, оператор присваива­ния не работает со строками С. Поэтому если вы полагаете, что следующий опе­ратор:

a_c_string = string_variable.c_str(); // НЕДОПУСТИМО

может выполнить копирование строки из переменной типа string в строку С, то это не так. И мы подчеркиваем, что такой оператор недопустим.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]