В этом листке мы снова будем работать со строками, активно используя стандартную библиотеку языка 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.
Дана строка (считывается при помощи getline). Если в этой строке есть символ @,
то выведите YES, иначе выведите NO.
Используйте метод find, для поиска символа в строке.
| Ввод | Вывод |
|---|---|
email@179.ru |
YES |
Дана строка (считывается при помощи getline). Если в этой строке есть заглавная или строчная гласная буква
(A, O, I, U, E, Y) то выведите YES, иначе выведите NO.
Используйте метод find_first_of, для поиска гласной в данной строке.
| Ввод | Вывод |
|---|---|
Hmmm... |
NO |
Подсчитайте, сколько раз в данной строке встречается символ @.
Указание: используйте метод find, запоминая последнюю позицию найденного символа @
и продолжая поиск только с этой позиции. Подсчитывайте количество успешно завершенных
поисков.
Примечание: решения, в которых на каждом шаге метод find вызывается дважды, приниматься не будут.
| Ввод | Вывод |
|---|---|
email@179.ru |
1 |
Подсчитайте количество заглавных и строчных гласных букв в данной строке.
Воспользуйтесь предыдущей задачей, заменив метод find на find_first_of.
| Ввод | Вывод |
|---|---|
We All Live In The Yellow Submarine! |
13 |
Даны две строки (с пробелами). Выведите YES, если вторая
строка встречается внутри первой, иначе выведите NO.
| Ввод | Вывод |
|---|---|
We All Live In The Yellow Submarine |
YES |
Даны две строки. Подсчитайте, сколько раз вторая строка встречается в первой, как ее подстрока. “Пересекающиеся” вхождения считаются несколько раз.
| Ввод | Вывод |
|---|---|
ABABA |
2 |
Даны две строки. Определите, можно ли из первой строки удалить несколько символов так, чтобы получилась вторая строка. Выведите YES или NO.
| Ввод | Вывод |
|---|---|
Program |
YES |
Program |
NO |
После запятой в тексте должен строять пробел. Дана строка, вставкой пробелов в неё добейтесь выполнения этого правила. Не надо вставлять пробел, если он там уже есть.
| Ввод | Вывод |
|---|---|
Question of Life,The Universe, and Everything |
Question of Life, The Universe, and Everything |
Дана строка. Продублируйте в ней все гласные буквы.
| Ввод | Вывод |
|---|---|
Question of Life, The Universe, and Everything |
Quueestiioon oof Liifee, Thee UUniiveersee, aand EEveeryythiing |
Дана строка (считывается при помощи getline). Удалите из нее все символы @,
находя их при помощи метода find и удаляя их при помощи метода erase.
Не забывайте, что поиск нужно продолжать с места последнего нахождения данного символа, а не с начала строки!
| Ввод | Вывод |
|---|---|
Bilbo.Baggins@bagend.hobbiton.shire.me |
Bilbo.Bagginsbagend.hobbiton.shire.me |
Удалите из заданной строки все гласные буквы.
| Ввод | Вывод |
|---|---|
We All Live In The Yellow Submarine! |
W ll Lv n Th llw Sbmrn! |
Даны две строки. Удалите из первой строки все вхождения данного слова. После удаления слова поиск следующего вхождения начинается со следующего символа за удаленным словом (то есть если в результате удаления слова образуется еще одно такое же слово, то его удалять не надо).
| Ввод | Вывод |
|---|---|
AABCBC |
ABC |
Дана строка. Удалите в ней все пары круглых скобок, вместе со всем их содержимым.
После нахождения открывающейся скобки программа должна найти ближайшую закрывающуюся скобку и удалить эти две скобки вместе со всем, что находится внутри. Отдельные закрывающиеся скобки игнорируются. Незакрытые открывающиеся скобки также игнорируются.
| Ввод | Вывод |
|---|---|
(1+(2*3))+( |
)+( |
В некоторой строке замените все символы 1 на слово one.
Используйте методы find и replace.
| Ввод | Вывод |
|---|---|
1+1=2 |
one+one=2 |
Даны три строки. Найдите в первой строке все вхождения второй строки и замените их на третью строку. Поиск продолжается начиная с символа, следующего за замененным (то есть если в результате замены образуется новое вхождения искомой строки, то ее менять не надо).
| Ввод | Вывод |
|---|---|
Hello, world! |
Hi, world! |
MooMoo Mo Mooo |
MooooMoooo |
Дана строка. Удалите все лишние пробелы: из начала строки, из конца строки и повторяющиеся пробелы внутри строки.
Обязательно выводите конец строки после вывода самой строки!
| Ввод | Вывод |
|---|---|
Hello, world! |
Hello, world! |
Программа получает на вход строку, состоящую из двух слов, разделенных пробелом (слово любая последовательность непробельных символов). Создайте строку, полученную из данной перестановкой слов и выведите ее.
Код, подобный такому, приниматься не будет:
string S1, S2; cin >> S1 >> S2; cout << S1 << " "<< S2 << endl;
Не забывайте выводить символ конца строки!
| Ввод | Вывод |
|---|---|
Hello, world! |
world! Hello, |
Строка состоит из слов, разделенных пробелами. Создайте строку, полученную из данной перестановкой всех слов в обратном порядке и выведите результат.
| Ввод | Вывод |
|---|---|
One two three |
three two One |
Напишите программу, которая посчитает количество смайликов в заданном тексте.
Смайликом будем считать последовательность символов, удовлетворяющую условиям:
; (точка с запятой) либо : (двоеточие)
ровно один раз
– (минус) сколько угодно раз
(в том числе символ минус может идти ноль раз)
(, ), [, ].
Например, нижеприведенные последовательности являются смайликами:
:) ;---------[[[[[[[[
в то время как эти последовательности смайликами не являются (хотя некоторые из них содержат смайлики):
:-)] ;-- -) ::-( :-()
В этой задаче надо будет посчитать количество смайликов, содержащихся в данном тексте.
Вводится одна строка текста, которая может содержать маленькие латинские буквы, пробелы, символы, которые могут встречаться в смайликах. Длина строки не превышает 100000 символов.
Выведите одно число — количество смайликов, которые встречаются в тексте.
| Ввод | Вывод |
|---|---|
:);------[[[[[] |
2 |
:-)];----; |
1 |
-)(---:--- |
0 |
hello :-) |
1 |
Первая строка входного файла содержит целое число N. Далее (начиная со следующей строки) идет текст, который может содержать много строк. Необходимо данный текст разбить на строки, длина которых не превосходит N и вывести его в файл. В каждой выведенной строке не должно быть пробелов в начале строки, пробелов в конце строки, слова в строке должны разделяться одним пробелом. При этом каждая строка должна быть максимально длинной, то есть строки формируются по “жадному” принципу: добавляем слова из входного файла до тех пор, пока длина полученной строки не превышает N, после этого ставим разрыв строки. Гарантируется, что во входном файле нет слов длиннее N символов.
| Ввод | Вывод |
|---|---|
15 |
We all live in |
Решите предыдущую задачу при условии, что текст в выводе программы должен быть выровнен по ширине: первый и последний символ строки должны быть непробельными, при необходимости между словами должны быть добавлены дополнительные пробелы, при этом количество пробелов между любыми двумя словами в одной строке не должно отличаться более, чем на 1.
Последняя строка в выводе должна быть выровнена по левому краю.
| Ввод | Вывод |
|---|---|
15 |
We all live in |
Дана строка, содержащее арифметическое выражение на языке C.
Строка может содержать только следующие символы: пробелы, цифры, латинские
буквы, знаки +, -, *, /,
%, =, (, ), ,
(запятая).
Гарантируется, что записанное арифметическое выражение синтаксически корректно и может содержать следующие лексемы:
+, -, *, /,
%, =.+, -.Расставьте в этом выражении пробелы в соответствии с правилами оформления программ:
После вывода выражения не забудьте вывести символ конца строки.
| Ввод | Вывод |
|---|---|
a=2+2 |
a = 2 + 2 |
Var1*( Var2+( 12-3 )/x+f( x,2*(a+b),-1))/(-4- - x) |
Var1 * (Var2 + (12 - 3) / x + f(x, 2 * (a + b), -1)) / (-4 - -x) |
Вещественное число задается следующим образом (форма Бэкуса-Наура):
<Number> ::= [<Sign>] <digit> {<digit>}[<Separator> <digit> {<digit>}]
[<Exponent> [<Sign>] <digit> {<digit>}]
<digit> ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
<Sign> ::= '+' | '-'
<Separator> ::= '.'
<Exponent> ::= 'E' | 'e'
В форме Бэкуса-Наура знак ::= означает определение, например,
<Sign> ::= '+' | '-' означает, что понятие Sign —
это один из двух символов + или +.
Значение в квадратных скобках означает, что это значение может встречаться, а может
и не встречаться, а значение в фигурных скобках означает, что это выражение может быть
записано 0, 1 или большее количество раз подряд. Например, записать
[<Sign>] <digit> {<digit>} означает Sign,
который может присутсвовать или отсутствовать, за которым идет digit,
повторенная 1 или более раз.
Программа получает на вход одну строку, содержащащей не более 200 символов.
Выведите YES, если эта строка является корректной записью
действительного числа в соответствии с данным определением, или NO, в противном случае.
| Ввод | Вывод |
|---|---|
-8.1e+1 |
YES |
e+1 |
NO |
Задано числовое выражение. Необходимо вычислить его значение или установить,
что оно содержит ошибку. В правильном выражении могут встречаться знаки сложения,
вычитания, умножения, скобки и пробелы (пробелов внутри чисел быть не должно).
Приоритет операций стандартный. Все числа в выражении целые и принадлежат диапазону int.
Также гарантируется, что все промежуточные вычисления умещаются в этот тип.
WRONG, если значение не определено.
| Ввод | Вывод |
|---|---|
1+(2*2 - 3) |
2 |
1+a+1 |
WRONG |
1 1 + 2 |
WRONG |
Однажды, разбирая старые книги на чердаке, школьник Вася нашёл англо-латинский словарь. Английский он к тому времени знал в совершенстве, и его мечтой было изучить латынь. Поэтому попавшийся словарь был как раз кстати.
К сожалению, для полноценного изучения языка недостаточно только одного словаря: кроме англо-латинского необходим латинско-английский. За неимением лучшего он решил сделать второй словарь из первого.
Как известно, словарь состоит из переводимых слов, к каждому из которых приводится несколько слов-переводов. Для каждого латинского слова, встречающегося где-либо в словаре, Вася предлагает найти все его переводы (то есть все ангийские слова, для которых наше латинское встречалось в его списке переводов), и считать их и только их переводами этого латинского слова.
Помогите Васе выполнить работу по созданию латинско-английского словаря из англо-латинского.
Все слова состоят только из маленьких латинских букв. Общее количество слов на входе не превышает 100. Длина каждого слова не превосходит 15 символов.
Выведите соответствующий данному латинско-английский словарь в следующем формате. В первую строку запишите единственное целое число N — количество латинских слов в словаре. Далее выведите N описаний, каждое описание в отдельной строке: сначала латинское слово, затем отделённый пробелами дефис (символ номер 45), затем разделённые запятыми с пробелами переводы этого латинского слова на английский.
При этом порядок английских слов внутри перевода одного латинского может быть каким угодно. Кроме того, порядок следования латинских слов для перевода в словаре также не важен.
| Ввод | Вывод |
|---|---|
3 |
7 |
Европейская комиссия планирует принять решение о том, что официальным языком Евросоюза станет английский. Был также разработан план упрощения английской письменности, который планируется реализовать за четыре года.
Первоочередной задачей будет избавление от буквы c, которая в сочетаниях
сi и сe
будет изменяться на s, в сочетании ck —
опускаться, а в остальных случаях заменяться на k.
При этом все замены будут производиться в строгом порядке слева направо. То есть, например, в слове
success сначала первая из двух букв c заменится на k, а затем вторая — на s, то есть получится suksess. А слово cck превратится в kk.
На второй год из английских слов изымут все удвоенные буквы:
ee изменят на i, oo -
на u, a в остальных комбинациях будут просто
писать одну букву вместо двух одинаковых. Такие замены также будут делать строго в порядке слева направо.
Так, слово ooo превратится в uo, а oou — просто в u
(в нем сначала oo заменится на u, а затем uu — на u),
слово iee превратится в i (в нем сначала ee заменится на i, а затем ii
— на i).
На третий год на конце слова станут опускать букву е, если эта буква
не является единственной буквой в слове.
Наконец, завершением реформы станет отмена артиклей (в английском языке три артикля:
а, an и the).
При этом удаляться эти артикли будут только тогда,
когда они в исходном тексте были словами a, an, the. То есть, например, текст
the table после реформ первых трех лет превратиться в th tabl, а после реформы
четвертого года — просто в tabl. А слово aaaaa после реформы первых лет станет словом
a, но поскольку изначально оно не было словом a (артиклем), то оно в итоге так
и останется словом a.
Напишите программу, которая будет переводить классический английский текст на Eвроинглиш.
Во входном файле записана одна строка текста, состоящая не более чем из 200 символов: латинских строчных и заглавных букв, пробелов и знаков препинания (в тексте могут встречаться: точка, запятая, вопросительный и восклицательный знаки, двоеточие, тире, точка с запятой, открывающаяся и закрывающаяся скобки, апострофы, кавычки). Заглавные буквы могут встречаться только в начале слова. Нигде подряд не могут стоять два пробела. В начале и в конце строки не может стоять пробел. Слова отделяются друг от друга пробелами и/или знаками препинания.
В выходной файл нужно выдать преобразованную строку с учетом следующих требований:
| Ввод | Вывод |
|---|---|
cacao and coffee |
kakao and kofi |
Cinderella! Where Is The Dress??? |
Sinderela! Wher Is Dres??? |
'A' is a letter |
'' is leter |
!!!Hello!!!A-the-"word" |
!!!Helo!!!--"word" |
Aaaa then the ckckck |
A then k |
"A"-the an |
""- |
A the an |
|
success |
sukses |