Шаблон vector

advertisement
Операции со строками в STL
В этом листке мы снова будем работать со строками, активно используя стандартную
библиотеку языка C++ STL (Standard template library).
Для прочтения рекомендуется следующий раздел сайта www.cppreference.com.
Считывание строк
Напомним, что строки можно считывать двумя способами: до пробельного символа
(пробела, конца строки, символа табуляции) при помощи конструкции cin >> S, и до
конца строки при помощи функции getline(cin, S).
Арифметические операторы
Со строками можно выполнять следующие арифметические операции:
= - присваивание значения.
+= - добавление в конец строки другой строки или символа.
+ - конкатенация двух строк, конкатенация строки и символа.
==, != - посимвольное сравнение.
<, >, <=, >= - лексикографическое сравнение.
Подробней об операторах для строк читайте здесь.
Конструкторы
Строки можно создавать с использованием следующих конструкторов:
string() - конструктор по умолчанию (без параметров) создает пустую строку.
string(string & S) - копия строки S
string(int n, char c) - повторение символа c заданное число n раз.
string(char c) - строка из одного символа c.
string(string & S, int start, int len) - строка, содержащая не более, чем len
символов данной строки S, начиная с символа номер start.
Конструкторы можно вызывать явно, например, так:
S += string(10, 'z');
В этом примере явно вызывается конструктор string для создания строки, состоящей из
10 символов 'z'.
Неявно конструктор вызывается при объявлении строки с указанием дополнительных
параметров. Например, так:
string S(10, 'z');
Подробней о конструкторах для строк читайте здесь.
Методы для строк
Методом называется функция, которая применяется к объекту, например, строке. При
вызове метода его имя пишется после идентификатора объекта через точку, например, у
объекта типа string есть метод size, возвращающий длину строки. Если S — это строка,
то метод вызывается так: S.size(). Другой пример: метод substr возвращает подстроку
заданной строки:
string S = "Hello, world!";
cout << S.substr(6, 5) << endl;
В данном случае будет выведен текст world.
Вот список полезных методов, применяемых к строкам:
append
добавляет строку или символы к строке
assign
присваивает строке значение строк символов или других строк C++
clear
удаляет все символы из строки
compare
сравнивает две строки
empty
возвращает true если в строке нет символов
erase
удаляет символы из строки
find
ищет символы в строке
find_first_not_of находит первый символ, отличный от
find_first_of
находит первый символ схожий с
find_last_not_of находит последний символ, отличный от
find_last_of
находит последний символ, схожий с
insert
вставляет символы в строку
length
возвращает длину строки
npos
специальное значение, означающее «не найдено» или «все оставшиеся
символы»
push_back
добавляет символ в конец строки
replace
заменяет символы в строке
resize
меняет размер строки
rfind
находит последнее вхождение подстроки
size
возвращает количество символов в строке
substr
возвращает определённую подстроку
swap
меняет две строки содержимым
Для обозначения того, что запрашиваемая последовательность символов не найдена,
многие методы (например, find) возвращают специальную константу string::npos.
Упражнения
A: Есть ли символ @
Дана строка (считывается при помощи getline). Если в этой строке есть символ @, то
выведите YES, иначе выведите NO.
Используйте метод find, для поиска символа в строке.
Ввод
Вывод
email@school.ru YES
B: Есть ли гласная
Дана строка (считывается при помощи getline). Если в этой строке есть заглавная или
строчная гласная буква (A, O, I, U, E, Y) то выведите YES, иначе выведите NO.
Используйте метод find_first_of, для поиска гласной в данной строке.
Ввод
Вывод
Hmmm... NO
C: Подсчитайте количество символов @
Подсчитайте, сколько раз в данной строке встречается символ @.
Указание: используйте метод find, запоминая последнюю позицию найденного символа
@ и продолжая поиск только с этой позиции. Подсчитывайте количество успешно
завершенных поисков.
Примечание: решения, в которых на каждом шаге метод find вызывается дважды,
приниматься не будут.
Ввод
Вывод
email@school.ru 1
D: Подсчитайте количество гласных
Подсчитайте количество заглавных и строчных гласных букв в данной строке.
Воспользуйтесь предыдущей задачей, заменив метод find на find_first_of.
Ввод
Вывод
We All Live In The Yellow Submarine! 13
E: Поиск подстроки
Даны две строки (с пробелами). Выведите YES, если вторая строка встречается внутри
первой, иначе выведите NO.
Ввод
Вывод
We All Live In The Yellow Submarine
YES
low
F: Сколько раз одна подстрока находится внутри другой?
Даны две строки. Подсчитайте, сколько раз вторая строка встречается в первой, как ее
подстрока. “Пересекающиеся” вхождения считаются несколько раз.
Ввод Вывод
ABABA
2
ABA
G: Вычеркнуть буквы
Даны две строки. Определите, можно ли из первой строки удалить несколько символов
так, чтобы получилась вторая строка. Выведите YES или NO.
Ввод
Вывод
Program
YES
ram
Program
NO
prog
H: Пробелы после запятой
После запятой в тексте должен строять пробел. Дана строка, вставкой пробелов в неё
добейтесь выполнения этого правила. Не надо вставлять пробел, если он там уже есть.
Ввод
Question of Life,The Universe, and
Everything
Вывод
Question of Life, The Universe, and
Everything
I: Удалите все символы @
Дана строка (считывается при помощи getline). Удалите из нее все символы @, находя их
при помощи метода find и удаляя их при помощи метода erase.
Не забывайте, что поиск нужно продолжать с места последнего нахождения данного
символа, а не с начала строки!
Ввод
Вывод
Bilbo.Baggins@bagend.hobbiton.shire.me Bilbo.Bagginsbagend.hobbiton.shire.me
J: Удалите все гласные буквы
Удалите из заданной строки все гласные буквы.
Ввод
Вывод
We All Live In The Yellow Submarine! W ll Lv n Th llw Sbmrn!
K: Удалить все вхождения слова
Даны две строки. Удалите из первой строки все вхождения данного слова. После удаления
слова поиск следующего вхождения начинается со следующего символа за удаленным
словом (то есть если в результате удаления слова образуется еще одно такое же слово, то
его удалять не надо).
Ввод Вывод
AABCBC
ABC
ABC
L: Удалить все внутри скобок
Дана строка. Удалите в ней все пары круглых скобок, вместе со всем их содержимым.
После нахождения открывающейся скобки программа должна найти ближайшую
закрывающуюся скобку и удалить эти две скобки вместе со всем, что находится внутри.
Отдельные закрывающиеся скобки игнорируются. Незакрытые открывающиеся скобки
также игнорируются.
Ввод
Вывод
(1+(2*3))+( )+(
M: Замените 1 на one везде
В некоторой строке замените все символы 1 на слово one. Используйте методы find и
replace.
Ввод
Вывод
1+1=2
one+one=
2
N: Удалите лишние пробелы
Дана строка. Удалите все лишние пробелы: из начала строки, из конца строки и
повторяющиеся пробелы внутри строки.
Обязательно выводите конец строки после вывода самой строки!
Ввод
Hello,
Вывод
world! Hello, world!
O: Поменять два слова местами
Программа получает на вход строку, состоящую из двух слов, разделенных пробелом
(слово любая последовательность непробельных символов). Создайте строку,
полученную из данной перестановкой слов и выведите ее.
Код, подобный такому, приниматься не будет:
string S1, S2;
cin >> S1 >> S2;
cout << S1 << " "<< S2 << endl;
Не забывайте выводить символ конца строки!
Ввод
Вывод
Hello, world! world! Hello,
P: Пословное обращение строки
Строка состоит из слов, разделенных пробелами. Создайте строку, полученную из данной
перестановкой всех слов в обратном порядке и выведите результат.
Ввод
Вывод
One two three three two One
Q*: Смайлики
Напишите программу, которая посчитает количество смайликов в заданном тексте.
Смайликом будем считать последовательность символов, удовлетворяющую условиям:




первым символом является либо ; (точка с запятой) либо : (двоеточие) ровно один
раз
далее может идти символ – (минус) сколько угодно раз (в том числе символ минус
может идти ноль раз)
в конце обязательно идет некоторое количество (не меньше одной) одинаковых
скобок из следующего набора: (, ), [, ].
внутри смайлика не может встречаться никаких других символов.
Например, нижеприведенные последовательности являются смайликами:
:)
;---------[[[[[[[[
в то время как эти последовательности смайликами не являются (хотя некоторые из них
содержат смайлики):
:-)]
;--)
::-(
:-()
В этой задаче надо будет посчитать количество смайликов, содержащихся в данном
тексте.
Вводится одна строка текста, которая может содержать маленькие латинские буквы,
пробелы, символы, которые могут встречаться в смайликах. Длина строки не превышает
100000 символов.
Выведите одно число — количество смайликов, которые встречаются в тексте.
Ввод
Вывод
:);------[[[[[] 2
:-)];----;
1
-)(---:---
0
hello :-)
1
R*: Выравнивание по левому краю
Первая строка входного файла содержит целое число N. Далее (начиная со следующей
строки) идет текст, который может содержать много строк. Необходимо данный текст
разбить на строки, длина которых не превосходит N и вывести его в файл. В каждой
выведенной строке не должно быть пробелов в начале строки, пробелов в конце строки,
слова в строке должны разделяться одним пробелом. При этом каждая строка должна
быть максимально длинной, то есть строки формируются по “жадному” принципу:
добавляем слова из входного файла до тех пор, пока длина полученной строки не
превышает N, после этого ставим разрыв строки. Гарантируется, что во входном файле
нет слов длиннее N символов.
Ввод
Вывод
15
We all live in
We all live in the the yellow
yellow submarine
submarine
S**: Химические реакции
Билл преподаёт химию в школе, он подготовил несколько тестов для учеников. Каждый
тест состоит из химической формулы и нескольких возможных результатов реакции.
Среди этих результатов ученики должны выбрать правильный. Билл хочет убедиться в
том, что, вводя свои тесты в компьютер, он не допустил опечаток, благодаря которым
ученики могли бы отбросить неверные ответы, просто подсчитав число химических
элементов в левой и правой частях уравнения (в правильном уравнении химической
реакции должно соблюдаться равенство).
Напишите программу, которая поможет Биллу. Программа должна прочитать описание
теста, состоящее из заданной левой части уравнения и нескольких возможных правых
частей, и определить, равно ли количество химических элементов в каждой предложенной
правой части уравнения количеству химических элементов в заданной левой части.
Билл формализовал задачу. И левая, и правая части уравнения представлены строкой
символов без пробелов, состоящей из одной или более химических последовательностей,
разделённых знаком плюс. Каждая последовательность имеет необязательный
предшествующий целый множитель, относящийся ко всей последовательности, и
несколько элементов. Каждый элемент может сопровождаться необязательным целым
множителем, относящимся к нему. Элемент в этом уравнении может быть или отдельным
химическим элементом, или целой последовательностью в круглых скобках. Каждый
отдельный химический элемент представлен или одной прописной буквой, или прописной
буквой, сопровождаемой строчной.
Ещё более формально, используя нотацию, аналогичную форме Бэкуса-Наура, можно
написать:







<формула> ::= [<число>] <последовательность> {"+" [<число>]
<последовательность>}
<последовательность> ::= <элемент> [<число>] {<элемент> [<число>]}
<элемент> ::= <химический элемент> | "(" <последовательность> ")"
<химический элемент> ::= <прописная буква> [<строчная буква>]
<прописная буква> ::= "A".."Z"
<строчная буква> ::= "a".."z"
<число> ::= "1".."9" {"0".."9"}
Будем говорить, что каждый отдельный химический элемент встречается в формуле всего
X раз, если X — сумма всех различных вхождений этого химического элемента,
умноженных на все числа, относящиеся к ним. Например, в формуле C2H5OH+3O2+3(SiO2)




C встречается всего 2 раза;
H встречается всего 6 раз (5 + 1);
O встречается всего 13 раз; (1 + 3
Si встречается всего 3 раза.
* 2 + 3 * 2);
Все множители в формулах - целые числа не меньше 2, если заданы явно, или равны 1 - по
умолчанию.
В первой строке входных данных находится формула - левая часть уравнения, во второй одно число N - количество рассматриваемых правых частей, в каждой из следующих N
строк - одна формула - предлагаемая правая часть уравнения.
Ограничения: 1 <= N <= 10, длина формулы не превосходит 100 символов, каждый
отдельный химический элемент встречается всего не более 10000 раз в каждой формуле.
Для каждой из N заданных правых частей выведите одну строку вида
<формула левой части>==<формула правой части>
если общее количество вхождений каждого отдельного химического элемента в левую
часть равно общему числу вхождений этого химического элемента в правую часть. В
противном случае выведите:
<формула левой части>!=<формула правой части>
Здесь <формула левой части> должна быть замещена посимвольной копией формулы
левой части, как она дана в первой строке входного файла, а <формула правой части> замещена точной копией формулы правой части, как она дана во входном файле. В
строках не должно быть пробелов.
Ввод
C2H5OH+3O2+3(SiO2)
7
2CO2+3H2O+3SiO2
2C+6H+13O+3Si
99C2H5OH+3SiO2
3SiO4+C2H5OH
Вывод
C2H5OH+3O2+3(SiO2)==2CO2+3H2O+3SiO2
C2H5OH+3O2+3(SiO2)==2C+6H+13O+3Si
C2H5OH+3O2+3(SiO2)!=99C2H5OH+3SiO2
C2H5OH+3O2+3(SiO2)==3SiO4+C2H5OH
C2H5OH+3O2+3(SiO2)!=C2H5OH+3O2+3(SiO2)+Ge
C2H5OH+3O2+3(SiO2)==3(Si(O)2)+2CO+3H2O+O2
C2H5OH+3O2+3(SiO2)+Ge C2H5OH+3O2+3(SiO2)!=2CO+3H2O+3O2+3Si
3(Si(O)2)+2CO+3H2O+O2
2CO+3H2O+3O2+3Si
Примечание.Пример не содержит цифры ноль, потому что она выглядит практически так
же, как символ химического элемента кислорода. Настоящие тесты могут содержать
любые допустимые символы.
Download