e-olymp 2162. Палиндром

Задача. Палиндром

Условие задачи

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

Входные данные

Дана строка [latex]S[/latex], [latex]|S| \leq 255[/latex], состоящая из строчных латинских букв и пробелов. Под [latex]|S|[/latex] подразумевается длина строки.

Выходные данные

Требуется вывести «YES«, если текст является палиндромом, «NO» если не является.

Также условие задачи можно посмотреть здесь.

Тестирование

Входные данные Выходные данные
1. palindrom NO
2. a roza upala na lapu azora YES
3. my gym YES
4. character NO

Реализация (с использованием c-string)

Алгоритм решения (c-string)

С помощью функции [latex]strcmp()[/latex] сравниваем символы строк [latex] s_1[/latex] и [latex]s_2[/latex], предварительно учтя тот факт, что пробел при чтении никак не произносится. Если они идентичны,  введенный текст одинаково читается слева направо и справа налево, то есть является палиндромом. В противном случае, текст палиндромом не является. Важно отметить, что функция [latex]strcmp()[/latex] учитывает регистр введенных символов, согласно условию мы должны использовать строчные латинские буквы.

Для запроса на выполнение следует перейти по ссылке.

Ссылка на засчитанное решение на e-olymp.com.

Реализация (с использованием string)

Алгоритм решения (string)

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

Для запроса на выполнение следует перейти по ссылке.

Ссылка на засчитанное решение на e-olymp.com.

Related Images:

e-olymp 2803 МаркЕрованные кубики

Задача

У Витека есть набор кубиков, на котором изображены английские буквы, причём как маленькие, так и большие. Недавно мама подарила ему ещё и набор кубиков с цифрами, в результате чего Витек научился быстро считать в пределах 10-ти. А вот папа имел неосторожность подарить ему набор разноцветных маркеров, после чего Витек начал экспериментировать с кубиками с цифрами: он зарисовывал очередную цифру и на её месте рисовал цифру на единицу большую. Так как он прекрасно понимал, что цифры 10 не существует, он вместо числа 10 всегда писал цифру 0.

Учтите, что иногда мама звала Витека покушать и он не успевал завершить начатую работу и написать новую цифру – в этом случае кубик навсегда оставался пустым, такие кубики обозначены символом пробела.

Вам необходимо помочь Витеку и написать программу, которая выполнит очередную маркЕровку кубиков по указанным правилам. Так как Вы находитесь не дома, а на олимпиаде, то мама Вас кушать не позовёт и работу Вам обязательно нужно закончить.

Входные данные

Единственная строка, состоящая из описанных выше символов. Длина строки не превышает 255 символов.

Выходные данные

Единственная строка – результат работы Вашей программы.

Тесты

Входные данные Выходные данные
abc1234567890ABC abc2345678901ABC
00000000 11111111
546476756 657587867

 

Алгоритм решения

Проверяем, является ли элемент строки числом. Если это 9, заменяем ее на 1, иначе увеличиваем значение символа на 1.

 

Ссылка на задачу на е-олимпе

Ссылка на засчитанное решение

Ссылка на среду с кодом

Решение через c-like string

Принцип работы тот же, что и со string решением, но в цикле перед проверкой, является ли символ числом также от символа отнимается код нуля, чтобы дальше с этим символом можно было работать как с целым числом. В конце цикла с заменой цифр нужно снова прибавить символ нуля, чтобы массив правильно выводился.

Cсылка на засчитанное решение с помощью c-like string

Ссылка на код в среде ideone

Related Images:

e-olymp 2164. Шифр Юлия

Задача. Юлий Цезарь использовал свой способ шифрования текста. Каждая буква заменялась на следующую по алфавиту через [latex]k[/latex] позиций по кругу. Необходимо по заданной шифровке определить исходный текст.

Входные данные: В первой строке дана шифровка, состоящая из не более чем 255 заглавных латинских букв. Во второй строке число [latex]k (1[/latex] [latex]\leq[/latex] [latex]k[/latex] [latex]\leq[/latex] [latex]10)[/latex].

Выходные данные: Требуется вывести результат расшифровки.

Тесты:

Входные данные Выходные данные
1 XPSE

1

WORD
2 ZABC

3

WXYZ

Код программы:

Алгоритм решения:

Каждая буква строки является элементом массива [latex]cipher[/latex]. Чтобы расшифровать строку нужно от значения [latex]i[/latex]-го элемента массива отнять [latex]k[/latex], тем самым сдвинуть символ на [latex]k[/latex] единиц по алфавиту, и заменить первоначальный символ на полученный результат. В случае если разница символа [latex]i[/latex]-го элемента и числа [latex]k[/latex] не входит в множество заглавных латинских букв, требуется от символа «Z» отнять оставшееся кол-во шагов [latex]k[/latex] (то есть не считая те которые уже были пройдены от изначального символа символа до крайнего символа «A»), и заменить первоначальный символ на полученный результат. Можно не беспокоиться о том, что символ вернется к «Z» более чем один раз так как условие исключает этот вариант ([latex]k<=10[/latex] при 26-ти символах латинского алфавита).

Используя цикл, повторяющийся столько же, сколько символов в строке [latex]cipher[/latex], требуется применить описанный алгоритм к каждому элементу массива. По окончанию работы цикл, вывести строку cipher, содержащую уже расшифрованные символы.

Код программы с типом данных  string:

Алгоритм решения:

Чтобы расшифровать слово, находящееся в строке [latex]cipher[/latex], необходимо заменить каждую букву данной строки на букву, находящуюся на [latex](find — k)[/latex] позиции строки [latex]alp[/latex], где [latex]alp[/latex] — строка, содержащая латинский алфавит, а [latex]find[/latex] — позиция заменяемой буквы в алфавите. В случае если разница [latex]find[/latex] и [latex]k[/latex] меньше нуля, заменяем букву строки [latex]cipher[/latex] на букву, находящуюся на [latex](26 — (k — find))[/latex] позиции строки [latex]alp[/latex], то-есть не считая то количество позиций которые уже были пройдены от изначального символа символа до первого символа строки [latex]alp[/latex]. Можно не беспокоиться о том, что символ вернется к к концу алфавита более чем один раз так как условие исключает этот вариант ([latex]k<=10[/latex] при 26-ти символах латинского алфавита).

Related Images:

e-olymp 901.Количество операций

Задача.

Определить общее количество операций сложения (+), вычитания () и умножения (*) в заданном арифметическом выражении.

Входные данные

В единственной строке задано арифметическое выражение, не содержащее скобок и пробелов. Количество символов в выражении не превышает 250.

Выходные данные

Единственное число — количество указанных операций.

Тесты:

входящая строка результат первой программы результат второй программы результат третей программы
-5+20-a+2*c 4 4 4
20+40-a 2 2 2
-2+2+2+2-a*4*6-2*5- 8 8 8
2+6*6 2 2 2

Код программы:

Первый способ. Потоковая обработка символов.

Второй способ. c-string.

Третий способ. Класс string.

 

Решение.

Чтобы подсчитать количество операций, указанных в условии, необходимо подсчитать символы которые соответствуют этим операциям и находятся между переменными или числами. проверять только предыдущий и следующий символ на то, является ли он буквой (значит, он является частью переменной или переменная) или цифрой (значит, он является частью числа или числом). В первой программе это осуществляется потоковой обработкой символов с запоминанием последующего и предыдущего, во второй — созданием массива символов c-string и использованием функции strpbrk, в третей — созданием объекта класса string и использованием функций find_first_of, find_last_of.

Задача взята с сайта e-olymp.com

Ссылка на условие задачи

Ссылки на зачитанные решения:

Первый способ

Второй способ

третий способ

Ссылки на код на ideone:

Первый способ

Второй способ

третий способ

Related Images:

e-olymp 329. Количество слов

Условие

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

Тестирование

Входные данные Выходные данные
1 Hello, world! 2
2 War is Peace. Freedom is Slavery. Ignorance is Strength. 9
3 — «4», «8», <15>; (16), {23}, [42]!? 6
4  A flock of sparrows – some of them juveniles – alighted and sang.  11
5 A mean Earth solar day is approximately 24 hours, whereas a mean Martian ‘sol’ is 24 hours, 39 minutes, and 35.244 seconds. 22
6 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 19

Код

Реализация с помощью посимвольного считывания

Реализация с помощью строк c-string

Решение

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

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

Теперь перейдем к практическому решению задачи.

Реализация с помощью посимвольного считывания

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

Для решения задачи этим методом воспользуемся функцией bool AllowedSign(char x), возвращающей значение true, если переданный ей символ принадлежит алфавиту неизвестного языка, и объявим логическую переменную wordBegin, определяющую, будет ли следующий считанный символ алфавита началом нового слова, и присвоим ей до начала выполнения цикла посимвольного считывания значение true. Сам цикл будет выполняться до тех пор, пока не будет прочитан весь входной поток:

При этом на каждой его итерации будут возможны, в зависимости от текущего символа и значения переменной wordBegin, следующие два варианта действий. Если считанный символ принадлежит алфавиту и при этом ожидается новое слово ( wordBegin = true), инкрементируем счетчик слов count и присваиваем wordBegin значение false. С этого момента и до тех пор, пока не будет достигнут конец слова, все последующие считываемые символы алфавита не будут влиять на счетчик:

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

Как видно, неалфавитные символы (знаки препинания) игнорируются и на подсчет слов никак не влияют. Наконец, после того, как будет прочитан весь входной поток, выводится значение счетчика слов count, что и есть ответом на поставленный вопрос задачи:

Реализация с помощью строк c-string

Как и в предыдущем варианте решения, воспользуемся функцией AllowedSign, определяющей принадлежность символа алфавиту, а также объявим переменную bool isWord, отвечающую за то, является ли проверяемая последовательность символов словом неизвестного языка. Тогда суть метода будет заключаться в считывании из входного потока последовательностей символов и проверке того, являются ли они словами. В основе метода лежит цикл, считывающий из входного потока «потенциальные слова» до тех пор, пока это возможно:

После считывания последовательности символов присваиваем переменной isWord значение false, изначально считая, что эта последовательность словом не является:

Затем поочередно проверяем символы последовательности до тех пор, пока isWord сохраняет значение false, или пока не дойдем до конца этой последовательности. Если в процессе проверки окажется, что очередной проверяемый символ принадлежит алфавиту, инкрементируем счетчик слов count и указываем, что последовательность является словом, переходя таким образом к проверке следующего «потенциального слова» в предложении, если таковые имеются:

Наконец, как и в первом случае, выводим количество найденных слов:

Ссылки

Условие задачи на E-Olymp;

Коды программ на Ideone.com: посимвольное считывание, строки c-string;

Подтверждение решения на E-Olymp.

Related Images:

e-olymp 7. Римские числа

Постановка задачи

e-olymp 7. Римские числа

Посчитать сумму двух натуральных чисел A и B, записанных в римской системе счисления. Ответ также записать в римской системе счисления.
M = 1000, D = 500, C = 100, L = 50, X = 10, V = 5, I = 1. Все числа – не превышают 2000.

Входные данные

В строке записано два числа в римской системе счисления, между которыми стоит знак + .

Выходные данные

Единственное число – сумма чисел, записанное также в римской системе счисления. Числа в римской системе счисления записаны большими латинскими буквами.

Алгоритм решения

Считываем два числа и представляем каждое из них в десятичной системе счисления. Чтобы перевести число из римской системы в десятичную, нужно изначально считать, что в десятичной системе оно равно нулю. Это число будет нашим результатом. Далее, нужно перебрать все цифры римского числа, следуя таким правилам:

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

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

Вспомогательные числа
В римской системе счисления В десятичной системе счисления
1 I
4 IV
5 V
9 IX
10 X
40 XL
50 L
90 XC
100 C
400 CD
500 D
900 CM
1000 M

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

Тесты

Входные данные Выходные данные
I+I II
IV+VIII XII
MM+CXC MMCXC
CXCIX+I CC

Реализация

ideone: ссылка
Засчитаное решение на e-olymp: ссылка

 

Related Images:

e-olymp 378. Таинственная записка

Задача e-olymp 378.

Условие

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

Закодированное сообщение: HPC PJVYMIY

Декодированное сообщение: ACM CONTEST

В этом примере выполнены следующие замены: H=A, P=C, C=M, J=O, V=N, Y=T, M=E и I=S.

Чтобы не заниматься кодированием и декодированием вручную, подруги просят Вас написать программу. Помогите девочкам!

Входные данные

В первой строке входного файла записано закодированное сообщение. Вторая строка — 26 латинских букв верхнего регистра, представляющих собой код для соответствующего символа алфавита: первый символ дает код для A, второй для B и так далее. Используются только буквы верхнего регистра. В закодированном сообщении могут появиться пробелы, которые должны быть сохранены в выходной строке.

Выходные данные

В выходной файл вывести одну строку, в которой содержится расшифрованное сообщение.

Тесты

Входные данные Выходные данные
HPC PJVYMIY

BLMRGJIASOPZEFDCKWYHUNXQTV

ACM CONTEST
FDY GAI BG UKMY
KIMHOTSQYRLCUZPAGWJNBVDXEF
THE SKY IS BLUE
LJBSLJL IJWWDEJ
KCFAGWRZMEXDNUYHVBOIJLSTPQ
DECODED MESSAGE

Код программы

Для запроса на выполнение нажать здесь.

Ссылка на засчитанное решение.

Код программы с использованнием класса «string»

Для запроса на выполнение нажать здесь.

Ссылка на засчитанное решение.

Решение

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

Related Images:

e-olymp 494. Гласные

Условие

К гласным буквам в латинском алфавите относятся буквы A, E, I, O, U и Y. Остальные буквы считаются согласными. Напишите программу, считающую количество гласных букв в тексте.

Входные данные

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

Выходные данные

В выходной файл вывести одно целое число – количество гласных во входном тексте.

Код

Код с функцией strpbrk()

Решение

Объявляется инициализированная строка, в которой может поместиться шесть символов, а последнее, седьмое место отводится под нуль-терминатор. Далее считываются все веденные символы, включая пробелы. Сравнивается  первый элемент строки с каждым элементом считываемых символов. Если считываемый символ соответствует символу строки, то увеличиваем количество гласных на единицу и так далее для всех гласных букв. Когда первый элемент строки сравнили со всеми считываемыми символами, начинаем так же сравнивать каждый последующий элемент.

Реализация с использованием string

Алгоритм решения (string)

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

Тестирование

Входные данные Выходные данные
1 COBBRA 2
2 REE BA 3
3 U GFD 1

Ссылки

 

Related Images:

e-olymp 330. Слово-чемпион

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

Задача взята с сайта e-olymp.

Входные данные

Предложение на неизвестном языке.

Выходные данные

Номер слова-чемпиона.

Тесты

Предложение Номер слова-чемпиона
Oo, it aaa is not bb. 3
Tummut, suuruu 18! 1
Qrtew asd x, pol 123 xcv. 3
Antaa, qor — aapapaa for Saippuakivikauppias kappak! 6
A b C d E f G h 1
NoPalindrome 0
123321 oro 1234554321? 3

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

Алгоритм

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

  1. Слово-палиндром может содержать в себе буквы различного регистра, что может помешать при проверке на палиндромность. Во избежание ошибки переведем все слово, например, в нижний регистр с помощью соответствующей функции.
  2. В предложении встречаются знаки препинания, поэтому если последний символ в слове не является буквой латинского алфавита или цифрой (проверку для удобства чтения вынесем в отдельную функцию), заменим его на нуль-символ, чтобы в дальнейшем его не учитывать.

После проведенных операций найдем длину текущего слова и, если она превышает максимальную длину ранее найденного слова-чемпиона, проверим, является ли текущее слово палиндромом. Осуществим это с помощью рекурсивной функции, сравнивающей соответствующие символы в данной строке по индексам. Функция работает до тех пор, пока начальный и конечный индекс не сравняются или поменяются местами (изначально первый индекс (start) равен нулю, а конечный (end) меньше длины строки на единицу), или же соответствующие символы окажутся разными. Если данное слово оказалось палиндромом, храним его порядковый номер в предложении.
Как только предложение завершено, выводим индекс найденного слова-чемпиона, или индекс первого из них, если таковых было несколько.

Код программы:

Код программы

Засчитанное решение

Related Images:

А1043

Задача

Построить все правильные скобочные выражения длины 10, то есть, которые содержат по 5 левых и по 5 правых скобок.

Код на языке С++:

Посмотреть программу можно здесь

Код на языке Java:

Ссылка на программу: http://ideone.com/9MjHSA

Решение:

В переменной [latex]x[/latex] мы будем хранить количество открытых ([latex]»(«[/latex]) скобок. Далее  проверяем условие, что если [latex]x>0[/latex], то можем поставить закрывающую ([latex]»)»[/latex]) скобку. Идем дальше, смотрим сколько свободных мест осталось и если мест осталось столько же, сколько открывающих, то все остальные закрывающие.

Related Images:

AA19

Постановка задачи: В заданной строке заменить три точки, идущие подряд, тремя первыми символами строки.

Алгоритм решения: Если строка не начинается с троеточия, последовательно заменять все его вхождения.

Тесты

Input Output
the more I code … better my coding becomes the more I code the better my coding becomes
…what am I supposed to do? …what am I supposed to do?
abc……… abcabcabc

Код программы


1. C, c-string,


2. C++, string


Related Images:

А816

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

Тесты*:

 Инфиксная форма Постфиксная форма Инфиксная форма Постфиксная форма
3+4 3 4 +   3+4*2/(1-5)^2  3 4 2 * 1 5 — 2 ^ / +
(5-4)+2 5 4 — 2 +  (1+2)*4+3  1 2 + 4 * 3 +
2*(3+4)*5 2 3 4 + * 5 *  78^6-3+9^(2-1)  78 6 ^ 3 — 9 2 1 — ^ +

*тесты взяты из примеров Абрамова, примеры из Википедии и немного собственных тестов.

Несколько оговорок по поводу программы:

1. Я расширил множество допустимых операторов добавив туда возведение в  степень

2. Программа предполагает, что в выражении согласованы все скобки, иначе она будет работать не правильно.

3. В реализации программы через массив символов я предположил что  вводимое выражение не будет превышать 50 символов. ( то есть, если учитывать пробелы, то финальная строка не будет превышать 100 символов)

4. Простите мне некоторое отклонение  от привычного порядка отчета. Я считаю более удобным выложить сначала  алгоритм, ибо он в обеих реализациях одинаков, а затем уже, показав код программы, комментировать детали каждой из реализаций.

Вообще постфиксная запись еще называется Обратной Польской Нотацией ( ОПН). За алгоритмом преобразования выражений из инфиксной ( привычной нам формы записи) в ОНП можно обратится к Википедии.

Алгоритм

  • Пока есть ещё символы для чтения:
  • Читаем очередной символ.
  • Если символ является числом, добавляем его к выходной строке..
  • Если символ является открывающей скобкой, помещаем его в стек.
  • Если символ является закрывающей скобкой:
До тех пор, пока верхним элементом стека не станет открывающая скобка, выталкиваем элементы из стека в выходную строку. При этом открывающая скобка удаляется из стека, но в выходную строку не добавляется. Если стек закончился раньше, чем мы встретили открывающую скобку, это означает, что в выражении либо неверно поставлен разделитель, либо не согласованы скобки.
  • Если символ является оператором о1, тогда:
1) пока приоритет o1 меньше либо равен приоритету оператора, находящегося на вершине стека выталкиваем верхние элементы стека в выходную строку;
2) помещаем оператор o1 в стек.
  • Когда входная строка закончилась, выталкиваем все символы из стека в выходную строку. В стеке должны были остаться только символы операторов; если это не так, значит в выражении не согласованы скобки.

 

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

Реализация через <string>

ССЫЛКА

Моменты которые следовало бы объяснить:

1) Зачем мы проверяем, является ли предыдущий символ числом, если данный тоже число?

Эта проверка помогает нам определить, сколько цифр имело наше число. Без данной проверки, например, выражение: [latex]34*2-1[/latex]  будет иметь вид не  [latex]34 2 * 1 — [/latex] , а  [latex]3 4 2 * 1 — [/latex]. В этом случае возникает двоякость при чтении выражения. Преобразовывая обратно можно предположить, что исходное выражение было  [latex]3*42-1[/latex].

2) Зачем мы делаем замену символам умножения и вычитания, в случае когда читаемый символ это оператор?

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

А по своему приоритету, операции сортируются так:

Операция умножения по своему числу находится ниже плюса и минуса, хотя по приоритету она выше. И поэтому, гораздо проще заменить ее на точку, которая точно не встретится в математическом выражении, а закончив обработку, поменять обратно.
Менять минус на запятую мы вынуждены через то, что некоторые операции имеют попарно одинаковый приоритет. Мне показалось это выгодным вариантом, заменить минус запятой, и тем самым получить для каждой пары операций  ( аддитивной и мультипликативной) своеобразный «радиус приоритета», который не пересекается с другим, таким же «радиусом». В финале, мы заменяем запятую на минус, так же, как и в случае с умножением и точкой.
Поскольку операция возведения в степень находится гораздо выше остальных, и не имеет пару в  списке приоритетов ее изменения совсем не коснулись.

В общем, детали реализации состоят  в том, что к строке stack  мы обращаемся через функции, как к стеку символов. В общем — программа просто реализует описанный выше алгоритм.

Реализация через массив char

ССЫЛКА

В общем, реализация не особо отличается от предыдущей. Алгоритм тот же, детали и идеи те же. Разница лишь в используемых инструментах. Теперь, вместо строки типа string мы используем массив символов. И как следствие, нам требуется ввести переменную ( в нашей программе — n) которая будет контролировать номер ячейки в которую будет присваиваться символ. Так же, после все обработки, требуется вставить дополнительно символ окончания строки ».  После этого можно обращаться и форматировать строку, по нашей надобности.

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

Related Images:

Ю12.29

Задача: Скобки. Текст ( например, арифметическое выражение) содержит многократно вложенные круглые скобки. Исправить его, оставив скобки первого уровня круглыми, второго — заменить на квадратные, третьего и последующих  — на фигурные. Убедиться в корректности использования скобок.

Тесты:

Введенная строка Выведенная строка
ln(sin((a+b)c-d)) ln{sin[(a+b)c-d]}
ln(sin((a+b)c-d))+ln(sin((a+b)c-d)) ln{sin[(a+b)c-d]}+ln{sin[(a+b)c-d]}
cos((a-b)c) cos[(a-b)c]

Код string

Код c-string

Ссылки на коды:

string

c-string

Ход решения:

Вводим строку. Задаем две переменные: l — уровень вложенности скобок и maxl — максимальный уровень вложенности скобок. Делаем цикл в котором заменяем все ‘(‘ , ‘)’ скобки на ‘{‘ , ‘}’. Делаем второй цикл в котором меняем скобки, которые являются последними по уровню вложенности на ‘(‘, ‘)’ и скобки, стоящие на уровень ниже меняем на ‘[‘, ‘]’, все остальные скобки оставляем без изменений.

 

Related Images:

А812ж

Задача.

Дан текст, каждый символ которого может быть малой буквой, цифрой или одним из знаков +, -, *. Группой букв будем называть такую совокупность последовательно расположенных букв, которой непосредственно не предшествует и за которой непосредственно не следует буква. Аналогично определим группу цифр и группу знаков.

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

Тесты.

Ввод Вывод
1aa2bb+-c2cc—**22 22
11aa2bb+-c2cc—**22 11
1aa2bb+-c23cc—**22 23
111aa2bb+-c2cc—**22 111
1aa2bb+-c234cc—**22 234
1aa221bb+-c234cc—**22 221

Код программы (string):

Код программы (cstring):

Решение.

Вводим строку в переменную s. В первом цикле ищем наибольшую группу записывая значение в переменную n. В следующем цикле ищем номер первого символа в группе записывая значение в переменную a. В третьем цикле выводим символы с номерами с a-го по a+n.

Related Images:

Ю12.34

Задача.

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

Тесты.

Ввод Вывод Комментарий
programming a in on go no an man am or arm air ring ago pain grin rain mom main among roar grip pair rip map nor aim iron program pin ma moan groan gang gain rag pig piano ramp gin ram rig Пройден
polymorphism is his him my so or room sir ship lip slip mom shop simply pop rip poor pool sip oil holy hip limp hop prop spy loom Пройден

В качестве словаря используется список 2500 наиболее употребительных английских слов (составлен Александром Васильевым).

Код(string).

Используем ввод как условие цикла while. Вводим вспомогательную строку temp, в которую записываем исходное слово. Символы строки temp, которые совпадают с символами данного слова из словаря, заменяем на точки (подходят любые символы, кроме английских букв), учитывая, таким образом, кратность вхождения. Также для проверки вводим логические переменные b1(содержатся ли все символы из строки dict в temp?) и b2(содержится ли j-ый символ из dict в temp?).

Данный код на ideone.

Код(c-string).

Решение аналогично.

Данный код на ideone.

Related Images:

Ю12.13

Задача

Морзянка. Вводимый с клавиатуры или из файла текст перевести в последовательность точек и тире с помощью азбуки Морзе. Результат можно иллюстрировать звуком.

Тесты:

Текст Результат Комментарий
SOS  …—…  пройден
 A true SOS !!!  .- -…- — .-. ..- . -…- … — … -…- —..— —..— —..— -…-  пройден

 

Код:

Я создала ассоциативный  массив  через map, и связала буквы («ключ«) и соответствующие им значения в азбуке Морзе («значение«). Чтобы не заполнять его еще и большими буквами, во вводимом тексте уменьшаю буквы с помощью функции tolower .  

Решение через c-string :

Ссылки:

string

c-string.

Решение на Java:

 

Related Images:

М3

Big Summa. Заданы две текстовые строки, состоящие исключительно из цифр и не более чем одной точки.
Предполагается, что строки задают представление чисел в q-ричной системе счисления. Построить строку, являющуюся их суммой.

q A B A+B Комментарий.
10 126740 546.967 127286.967 Тест пройден.
8 2360 7521 12101 Тест пройден.
2 1011001 1101 100110 Тест пройден.
3 1210.012 1112.1 10022.112 Тест пройден.
10 4356.98 67.975 4424.955 Тест пройден.

Код программы (string):

Программа выполнена с помощью методов класса <string>. Для работы мне понадобилось написать несколько вспомогательных функций, задачей которых является дополнить числа нулями таким образом, чтобы точки чисел оказались на одинаковых позициях.

Функция dot_position. Эта функция находит места точек в обеих строках, а если таковых нет, то им присваивается значение длины строки. Возвращает функция наибольшую по значению позицию точки.

Функции length_before_dot и length_after_dot возвращают количество цифр до и после точки соответственно.

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

После этого  программа готова вычислить сумму двух чисел. Сложность реализации алгоритма сложения состояла лишь в том, что записать в строку элемент типа int — невозможно, а следовательно, его нужно было преобразовать в  строку. Для этого потребовалась функция to_string() из класса <string>. Но при этом элементы a[i] и b[i] воспринимались как коды символов, поэтому каждый из них нужно было уменьшить на ‘0’.

Ещё одна сложность — это десятки, которые мы держим «в уме», а в моём случае — во вспомогательной переменной p.

Код можно посмотреть здесь.

Код программы (cstring):

Из-за отсутствия функции insert() в классе <cstring> я была вынуждена написать её самостоятельно. В остальном работа заключалась лишь в «переводе» кода из одного класса в другой.

Код можно посмотреть здесь.

Related Images:

А812б

Задача: Дан текст, каждый символ которого может быть малой буквой, цифрой или одним из знаков «+», «-«, «*». Группой букв будем называть такую совокупность последовательно расположенных букв, которой непосредственно не предшествует и за которой непосредственно не следует буква. Аналогично определим группу цифр и группу знаков.

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

Задача решена в двух вариантах — с использованием класса string и и с использованием массива символов, завершающихся нулём ( char[], null terminated string ).

Тесты ( для двух вариантов ):

тестовые данные количество посчитанных слов результат по условию задачи
1.  afsf1213**++  letterWordCount = 1
digitWordCount  = 1
symbolWordCount = 1
 в данном тексте одинаковое количество групп букв и групп знаков
2.  afsf1213**++asfs2434gfh21+++—dhf**++vg  letterWordCount = 5
digitWordCount  = 3
symbolWordCount = 3
 в данном тексте больше групп букв, чем групп знаков
3.  abcd+++—123efgh**++—123367++**-sdf—+754*+-bmwazs++834hello++—****  letterWordCount = 5
digitWordCount  = 4
symbolWordCount = 7
 в данном тексте групп букв меньше, чем групп знаков

Вариант 1: решение с использованием класса string

Код программы :

Код программы на Java:

Ссылка на ideone.com: http://ideone.com/MS3BKc

План программы:

  1. Объявление переменных — флаги и счетчики для всех видов слов
  2. Функция завершения чтения слова и увеличение счетчика слова на единицу
  3. Стандартный строковый объект класса string
  4. Ввод текст из стандартного потока ввода
  5. Проход по символам текста
  6. Анализ символов: к какой группе они относятся и проверка состояний
  7. Проверка принадлежности к данному типу символов ( +, — , * / цифра / буква )
  8. Финальное завершение текущего слова
  9. Вывод количества посчитанных слов
  10. Вычисление конечного результата

В программе используется переменная text типа string, которая позволяет хранить текст переменной длины. Переменная text заполняется символами из стандартного потока ввода. Подразумевается, что символ с значением «ноль» введён быть не может, по этому нулевой символ в конце текста является завершающим.

Цикл выполняется по всем символам string, вплоть до нулевого символа и анализирует принадлежность каждого символа к группе символов. Согласно условию задачи это — мал. буквы, цифры и символы + , — , * . В программе использованы 3 переменных-флага, описывающих текущие состояние чтение одного слова данной группы. Также есть переменные-счётчики для каждой группы слов. Каждый счётчик наращивается при сбрасывании флага, то есть, по завершении чтения группы.

Для проверки типа символа используются стандартные макросы isdigit и islower из библиотеки ctype .

Ссылка на ideone.com: http://ideone.com/fork/RiwQTO

Вариант 2: решене с использованием строки символов с завершающим нулём char[]

Код программы :

Код программы на Java:

Ссылка на ideone.com: http://ideone.com/uaQucV

План программы:

  1. Объявление символьного массива для загрузки текста
  2. Объявление переменных — флаги и счетчики для всех видов слов
  3. Функция завершения чтения слова и увеличение счетчика слова на единицу
  4. Загрузка текста в массив — цикл считывания одного символа текста
  5. Завершение нулевым символом
  6. Проход по символам текста загруженного в массив
  7. Анализ символов: к какой группе они относятся и проверка состояний
  8. Проверка принадлежности к данному типу символов ( +, — , * / цифра / буква )
  9. Финальное завершение текущего слова
  10. Вывод количества посчитанных слов
  11. Вычисление конечного результата

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

Цикл выполняется по символьному массиву, вплоть до нулевого символа и анализирует принадлежность каждого символа к группе символов. Согласно условию задачи это — мал. буквы, цифры и символы + , — , * . В программе использованы 3 переменных-флага, описывающих текущие состояние чтение одного слова данной группы. Также есть переменные- счётчики для каждой группы слов. Каждый счётчик наращивается при сбрасывании флага, то есть, по завершении чтения группы.

Для проверки типа символа используются стандартные макросы isdigit и islower из библиотеки ctype .

Ссылка на ideone.com: http://ideone.com/LXiyTn

Related Images: