Упражнения

A: Есть ли символ @

Дана строка (считывается при помощи getline). Если в этой строке есть символ @, то выведите YES, иначе выведите NO.

Используйте метод find, для поиска символа в строке.

Ввод Вывод
email@179.ru
YES

B: Есть ли гласная

Дана строка (считывается при помощи getline). Если в этой строке есть заглавная или строчная гласная буква (A, O, I, U, E, Y) то выведите YES, иначе выведите NO.

Используйте метод find_first_of, для поиска гласной в данной строке.

Ввод Вывод
Hmmm...
NO

C: Подсчитайте количество символов @

Подсчитайте, сколько раз в данной строке встречается символ @.

Указание: используйте метод find, запоминая последнюю позицию найденного символа @ и продолжая поиск только с этой позиции. Подсчитывайте количество успешно завершенных поисков.

Примечание: решения, в которых на каждом шаге метод find вызывается дважды, приниматься не будут.

Ввод Вывод
email@179.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
low
YES

F: Сколько раз одна подстрока находится внутри другой?

Даны две строки. Подсчитайте, сколько раз вторая строка встречается в первой, как ее подстрока. “Пересекающиеся” вхождения считаются несколько раз.

Ввод Вывод
ABABA
ABA
2

G: Вычеркнуть буквы

Даны две строки. Определите, можно ли из первой строки удалить несколько символов так, чтобы получилась вторая строка. Выведите YES или NO.

Ввод Вывод
Program
ram
YES
Program
prog
NO

H: Пробелы после запятой

После запятой в тексте должен строять пробел. Дана строка, вставкой пробелов в неё добейтесь выполнения этого правила. Не надо вставлять пробел, если он там уже есть.

Ввод Вывод
Question of Life,The Universe, and Everything
Question of Life, The Universe, and Everything

I: Продублировать гласные буквы

Дана строка. Продублируйте в ней все гласные буквы.

Ввод Вывод
Question of Life, The Universe, and Everything
Quueestiioon oof Liifee, Thee UUniiveersee, aand EEveeryythiing

J: Удалите все символы @

Дана строка (считывается при помощи getline). Удалите из нее все символы @, находя их при помощи метода find и удаляя их при помощи метода erase.

Не забывайте, что поиск нужно продолжать с места последнего нахождения данного символа, а не с начала строки!

Ввод Вывод
Bilbo.Baggins@bagend.hobbiton.shire.me
Bilbo.Bagginsbagend.hobbiton.shire.me

K: Удалите все гласные буквы

Удалите из заданной строки все гласные буквы.

Ввод Вывод
We All Live In The Yellow Submarine!
W ll Lv n Th llw Sbmrn!

L: Удалить все вхождения слова

Даны две строки. Удалите из первой строки все вхождения данного слова. После удаления слова поиск следующего вхождения начинается со следующего символа за удаленным словом (то есть если в результате удаления слова образуется еще одно такое же слово, то его удалять не надо).

Ввод Вывод
AABCBC
ABC
ABC

M: Удалить все внутри скобок

Дана строка. Удалите в ней все пары круглых скобок, вместе со всем их содержимым.

После нахождения открывающейся скобки программа должна найти ближайшую закрывающуюся скобку и удалить эти две скобки вместе со всем, что находится внутри. Отдельные закрывающиеся скобки игнорируются. Незакрытые открывающиеся скобки также игнорируются.

Ввод Вывод
(1+(2*3))+(
)+(

N: Замените 1 на one везде

В некоторой строке замените все символы 1 на слово one. Используйте методы find и replace.

Ввод Вывод
1+1=2
one+one=2

O: Заменить все вхождения слова

Даны три строки. Найдите в первой строке все вхождения второй строки и замените их на третью строку. Поиск продолжается начиная с символа, следующего за замененным (то есть если в результате замены образуется новое вхождения искомой строки, то ее менять не надо).

Ввод Вывод
Hello, world!
Hello
Hi
Hi, world!

MooMoo
Mo
Mooo
MooooMoooo

P: Удалите лишние пробелы

Дана строка. Удалите все лишние пробелы: из начала строки, из конца строки и повторяющиеся пробелы внутри строки.

Обязательно выводите конец строки после вывода самой строки!

Ввод Вывод
       Hello,    world!
Hello, world!

Q: Поменять два слова местами

Программа получает на вход строку, состоящую из двух слов, разделенных пробелом (слово  любая последовательность непробельных символов). Создайте строку, полученную из данной перестановкой слов и выведите ее.

Код, подобный такому, приниматься не будет:

string S1, S2;
cin >> S1 >> S2;
cout << S1 << " "<< S2 << endl;

Не забывайте выводить символ конца строки!

Ввод Вывод
Hello, world!
world! Hello,

R: Пословное обращение строки

Строка состоит из слов, разделенных пробелами. Создайте строку, полученную из данной перестановкой всех слов в обратном порядке и выведите результат.

Ввод Вывод
One two three
three two One

S: Смайлики

Напишите программу, которая посчитает количество смайликов в заданном тексте.

Смайликом будем считать последовательность символов, удовлетворяющую условиям:

Например, нижеприведенные последовательности являются смайликами:

:)
;---------[[[[[[[[

в то время как эти последовательности смайликами не являются (хотя некоторые из них содержат смайлики):

:-)]
;--
-)
::-(
:-()

В этой задаче надо будет посчитать количество смайликов, содержащихся в данном тексте.

Вводится одна строка текста, которая может содержать маленькие латинские буквы, пробелы, символы, которые могут встречаться в смайликах. Длина строки не превышает 100000 символов.

Выведите одно число — количество смайликов, которые встречаются в тексте.

Ввод Вывод
:);------[[[[[]
2
:-)];----;
1
-)(---:---
0
hello :-)
1

T: Выравнивание по левому краю

Первая строка входного файла содержит целое число N. Далее (начиная со следующей строки) идет текст, который может содержать много строк. Необходимо данный текст разбить на строки, длина которых не превосходит N и вывести его в файл. В каждой выведенной строке не должно быть пробелов в начале строки, пробелов в конце строки, слова в строке должны разделяться одним пробелом. При этом каждая строка должна быть максимально длинной, то есть строки формируются по “жадному” принципу: добавляем слова из входного файла до тех пор, пока длина полученной строки не превышает N, после этого ставим разрыв строки. Гарантируется, что во входном файле нет слов длиннее N символов.

Ввод Вывод
15
We all live in the
yellow submarine
We all live in
the yellow
submarine

U: Выравнивание по ширине

Решите предыдущую задачу при условии, что текст в выводе программы должен быть выровнен по ширине: первый и последний символ строки должны быть непробельными, при необходимости между словами должны быть добавлены дополнительные пробелы, при этом количество пробелов между любыми двумя словами в одной строке не должно отличаться более, чем на 1.

Последняя строка в выводе должна быть выровнена по левому краю.

Ввод Вывод
15
We
all
live in the
yellow submarine
We all  live in
the      yellow
submarine

V: Правила оформления программ

Дана строка, содержащее арифметическое выражение на языке 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)

W: Действительное число

Вещественное число задается следующим образом (форма Бэкуса-Наура):

<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

X: Значение выражения

Задано числовое выражение. Необходимо вычислить его значение или установить, что оно содержит ошибку. В правильном выражении могут встречаться знаки сложения, вычитания, умножения, скобки и пробелы (пробелов внутри чисел быть не должно). Приоритет операций стандартный. Все числа в выражении целые и принадлежат диапазону int. Также гарантируется, что все промежуточные вычисления умещаются в этот тип.

В первой строке вводится выражение. Его длина не превосходит 100 знаков. После выражения идет переход на новую строчку.

Выведите значение этого выражения или слово WRONG, если значение не определено.

Ввод Вывод
1+(2*2 - 3)
2
1+a+1
WRONG
1 1 + 2
WRONG

Y: EuroEnglish

Европейская комиссия планирует принять решение о том, что официальным языком Евросоюза станет английский. Был также разработан план упрощения английской письменности, который планируется реализовать за четыре года.

Первоочередной задачей будет избавление от буквы 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

Z: Химические реакции

Билл преподаёт химию в школе, он подготовил несколько тестов для учеников. Каждый тест состоит из химической формулы и нескольких возможных результатов реакции. Среди этих результатов ученики должны выбрать правильный. Билл хочет убедиться в том, что, вводя свои тесты в компьютер, он не допустил опечаток, благодаря которым ученики могли бы отбросить неверные ответы, просто подсчитав число химических элементов в левой и правой частях уравнения (в правильном уравнении химической реакции должно соблюдаться равенство).

Напишите программу, которая поможет Биллу. Программа должна прочитать описание теста, состоящее из заданной левой части уравнения и нескольких возможных правых частей, и определить, равно ли количество химических элементов в каждой предложенной правой части уравнения количеству химических элементов в заданной левой части.

Билл формализовал задачу. И левая, и правая части уравнения представлены строкой символов без пробелов, состоящей из одной или более химических последовательностей, разделённых знаком плюс. Каждая последовательность имеет необязательный предшествующий целый множитель, относящийся ко всей последовательности, и несколько элементов. Каждый элемент может сопровождаться необязательным целым множителем, относящимся к нему. Элемент в этом уравнении может быть или отдельным химическим элементом, или целой последовательностью в круглых скобках. Каждый отдельный химический элемент представлен или одной прописной буквой, или прописной буквой, сопровождаемой строчной.

Ещё более формально, используя нотацию, аналогичную форме Бэкуса-Наура, можно написать:

Будем говорить, что каждый отдельный химический элемент встречается в формуле всего X раз, если X — сумма всех различных вхождений этого химического элемента, умноженных на все числа, относящиеся к ним. Например, в формуле C2H5OH+3O2+3(SiO2)

Все множители в формулах - целые числа не меньше 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)+Ge
3(Si(O)2)+2CO+3H2O+O2
2CO+3H2O+3O2+3Si
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)!=2CO+3H2O+3O2+3Si

Примечание.Пример не содержит цифры ноль, потому что она выглядит практически так же, как символ химического элемента кислорода. Настоящие тесты могут содержать любые допустимые символы.