Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
recipes.pdf
Скачиваний:
34
Добавлен:
22.05.2015
Размер:
322.44 Кб
Скачать

10

 

 

Симоненко Евгений А. Олимпиадная подготовка по программированию

 

 

 

 

 

 

 

Название

Назначение

 

 

Сигнатура

 

Возвращаемое значение

 

 

 

 

 

 

 

 

 

 

 

 

 

символов из delimiters.

 

 

 

 

 

 

Включив заголовок cctype мы получаем доступ к функциям библиотеки C для символов:

 

 

 

 

 

Название

Назначение

 

Сигнатура

Возвращаемое значение

 

 

 

 

tolower()

Понижение регистра

int tolower(int c);

Символ, преобразованный в нижний регистр, если

 

символа.

 

 

это возможно, или неизменённое значение c, в

 

 

 

 

 

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

toupper()

Повышение регистра

int toupper(int c);

Символ, преобразованный в верхний регистр, если

 

символа.

 

 

это возможно, или неизменённое значение c, в

 

 

 

 

 

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

islower()

Проверка на нижний

int islower(int c);

Число большее 0, если символ c является символом

 

регистр символа.

 

 

в нижнем регистре, и 0 в противном случае.

isupper()

Проверка на верхний

int isupper(int c);

Число большее 0, если символ c является символом

 

регистр символа.

 

 

в верхнем регистре, и 0 в противном случае.

isalpha()

Проверка, является

int isalpha(int c);

Число большее 0, если символ c является буквой, и 0

 

ли символ буквой.

 

 

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

STRING

Создатели C++ в дополнение к встроенным типам языка C добавили специальный тип string для строк. Это объектно-ориентированный тип (класс), и его использование влечёт за собой дополнительные расходы на память и процессорное время. Но он очень удобен. Например, он позволяет вводить строки произвольной длины, что в некоторых задачах бывает очень важно.

Так как тип является встроенным, то не требуется для его использования включать какие-либо заголовки, но для некоторых функций (например, для ввода-вывода) всё же требуется включить заголовок <string>.

Ниже в таблице перечислены самые востребованные методы класса string:

Название

Назначение

 

Сигнатура

 

Возвращаемое значение

 

 

 

 

 

 

append()

Конкатенация.

 

string& append(const string& str);

 

Саму строку, к которой была

 

 

 

string& append(const string& str, size_t pos,

добавлена другая строка

 

 

 

size_t n);

 

 

или символы.

 

 

 

string& append(const char* str, size_t n);

 

 

 

 

string& append(const char* str);

 

 

 

 

 

string& append(size_t n, char c);

 

 

 

 

 

template<class

InputIterator>

string&

 

 

 

 

append(InputIterator first, InputIterator last);

 

begin()

Итератор

начала

iterator begin();

 

 

Итератор начала строки.

 

строки.

 

 

 

 

 

clear()

Очистка строки.

void clear();

 

 

 

 

 

 

 

 

 

 

Симоненко Евгений А. Олимпиадная подготовка по программированию

 

 

 

 

 

 

 

11

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Название

Назначение

 

Сигнатура

 

 

Возвращаемое значение

 

 

 

 

 

 

 

compare()

Сравнение

двух

int compare(const string& str) const;

 

 

Число 0, если строки

 

строк.

 

int compare(const char* str) const;

 

 

посимвольно

 

совпадают;

 

 

 

int compare(size_t pos1, size_t n1, const

 

число большее 0, если в

 

 

 

string& str) const;

 

 

 

первой строке обнаружен

 

 

 

int compare(size_t pos1, size_t n1, const

 

символ

 

 

больший

 

 

 

char* str) const;

 

 

 

 

соответствующего

символа

 

 

 

int compare(size_t pos1, size_t n1, const

 

второй; и меньшее 0 в

 

 

 

string& str, size_t pos2, size_t n2) const;

 

 

противном

 

 

 

случае.

 

 

 

int compare(size_t pos1, size_t n1, const

 

(Лексикографический

 

 

 

 

char* str, size_t n2) const;

 

 

порядок.)

 

 

 

 

 

empty()

Проверка на пустоту.

bool empty() const;

 

 

 

true,

 

если

строка

пуста

 

 

 

 

 

 

 

 

(количество

символов

0),

 

 

 

 

 

 

 

 

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

end()

Итератор

конца

iterator end();

 

 

 

 

Итератор конца строки.

 

 

строки.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

erase()

Удаление

символов

string& erase(size_t pos = 0, size_t n =

 

Саму строку,

 

или

итератор

 

из строки.

 

npos);

 

 

 

 

на

первый

 

очищенный

 

 

 

iterator erase(iterator position);

 

 

символ или итератор конца,

 

 

 

iterator erase(iterator first, iterator last);

 

если

 

ничего

не

было

 

 

 

 

 

 

 

 

очищено.

 

 

 

 

 

find()

Поиск подстроки в

size_t find(const string& str, size_t pos = 0)

 

Номер

символа

 

первого

 

строке.

 

const;

 

 

 

 

вхождения подстроки. Если

 

 

 

size_t find(const char* str, size_t pos, size_t

 

подстрока

не

 

найдена

 

 

 

n) const;

 

 

 

 

возвращается string::npos.

 

 

 

size_t find(const char* str, size_t pos = 0)

 

 

 

 

 

 

 

 

 

 

 

 

const;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

size_t find(char c, size_t pos = 0) const;

 

 

 

 

 

 

 

 

 

 

insert()

Вставка подстроки в

string& insert(size_t pos1, const string& str);

 

Саму

 

строку,

 

или

итератор

 

строку.

 

string& insert(size_t pos1, const string& str,

 

на

 

место

 

 

первого

 

 

 

size_t pos2, size_t n);

 

 

вставленного

 

символа

или

 

 

 

string& insert(size_t pos1, const char* str,

 

ничего.

 

 

 

 

 

 

 

 

size_t n);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

string& insert(size_t pos1, const char* str);

 

 

 

 

 

 

 

 

 

 

 

 

string& insert(size_t pos1, size_t n, char c);

 

 

 

 

 

 

 

 

 

 

 

 

iterator insert(iterator p, char c);

 

 

 

 

 

 

 

 

 

 

 

 

 

void insert(iterator p, size_t n, char c);

 

 

 

 

 

 

 

 

 

 

 

 

 

template<class

 

InputIterator>

void

 

 

 

 

 

 

 

 

 

 

 

 

insert(iterator

p,

InputIterator

first,

 

 

 

 

 

 

 

 

 

 

 

 

InputIterator last);

 

 

 

 

 

 

 

 

 

 

 

length()

Длина строки (коли-

size_t length() const;

 

 

 

Длина

строки

(количество

 

чество символов).

 

 

 

 

 

символов).

 

 

 

 

 

Для сравнения строк можно использовать не только метод compare(), но и операции сравнения ==, !=, <, >, <= и >=. См. задачу «A. Петя и Java» (http://codeforces.ru/contest/66/problem/A).

ПЕРЕВОД СТРОКИ В ЦЕЛОЕ ЧИСЛО

Для перевода строки в целое число можно использовать как «ручной» метод, так и функции библиотеки C.

«Ручной» метод основан на посимвольном сканировании строки с конца, представляющей целое число, с последующем получением из кода символа-цифры его значения, умножения его на 10 в

12

Симоненко Евгений А. Олимпиадная подготовка по программированию

соответствующей степени и добавлении к формируемому числу.

#include <iostream> #include <string>

using namespace std;

int main(int argc, char* argv[]) { string s;

cin >> s;

int x = 0;

for (string::reverse_iterator it = s.rbegin(); it < s.rend(); it++) { static int d = 1;

x += (*it - '0') * d; d *= 10;

}

cout << x << endl;

return 0;

}

В стандартной библиотеке C есть семейство функций atoi(), atol() и atoll(), переводящих из C-стро- ки, представляющей целое число, в собственно целое число:

Название

Назначение

Сигнатура

Возвращаемое значение

 

 

 

 

atoi()

В целое типа int.

int atoi(const char* str);

Целое число типа int.

atol()

В целое типа long.

long atol(const char* str);

Целое число типа long.

 

 

 

 

atoll()

В целое типа long long.

long long atoll(const char* str);

Целое число типа long long.

 

 

 

 

Эти функции объявлены в заголовке <cstdlib>.

Иногда встречающейся ошибкой является использование atol() для перевода в целое типа long long. Попутно следует заметить, что функция atoll() (с двумя l) является свежим добавлением в стандарт C++ и в Visual Studio 2008 нереализована, в то время как в библиотеке, идущей с MinGW GCC 4.4, имеется.

ПЕРЕВОД ЦЕЛОГО ЧИСЛА В СТРОКУ

Так же как и перевод из строки в целое число, так и из целого числа в строку, можно осуществить разными способами: «ручным», с использованием класса stringstream, функции itoa() или функции sprintf().

«Ручной» способ основан на выделении отдельных десятичных цифр с последующим преобразованием их в символы (см. пункт «Разложение целого числа на его цифры»):

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

using namespace std;

int main(int argc, char* argv[]) { int x;

cin >> x;

string str; str.reserve(10); while (x != 0) {

str.push_back(x % 10 + '0'); x /= 10;

}

reverse(str.begin(), str.end());

cout << str << endl;

Симоненко Евгений А. Олимпиадная подготовка по программированию

13

return 0;

}

Для использования класса stringstream нужно подключить заголовок <sstream>:

#include <iostream> #include <string> #include <sstream>

using namespace std;

int main(int argc, char* argv[]) { int x;

cin >> x;

stringstream ss; ss << x;

string s = ss.str();

cout << s << endl;

return 0;

}

Наконец, можно воспользоваться нестандартной функцией itoa(), получающей на вход целое число типа int, указатель на C-строку, куда будет помещён результат, и основание системы исчисления:

#include <iostream>

using namespace std;

int main(int argc, char* argv[]) { int x;

cin >> x;

char s[10]; itoa(x, s, 10);

cout << s << endl;

return 0;

}

Вместо нестандартной функции itoa() рекомендуется использовать стандартную функцию sprintf(). Эта функция получает на вход указатель на C-строку, куда будет помещён результат, строку формата как у функции printf() (см. пункт «Ввод-вывод») и список значений, которые должны быть преобразованы в строку:

#include <cstdio>

int main(int argc, char* argv[]) { int x;

scanf("%d", &x);

char s[10]; sprintf(s, "%d", x);

puts(s);

return 0;

}

СЛУЧАЙНЫЕ ЧИСЛА

При написании тестов к решениям задач часто бывает полезным генерировать входные данные случайным образом. Для этого можно пользоваться стандартной функцией rand(). Эта функция не имеет входных параметров и возвращает целое число в диапазоне от 0 до RAND_MAX. Так как в подавляющем большинстве случаев нам нужен другой диапазон целых чисел, то простейшим способом его получить будет получение остатка от деления значения возвращаемого rand() на верхнюю границу диапазона: пусть a – нижняя граница, а b – верхняя, тогда можно написать та-

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