AA12

Задача. В заданной строке заменить каждую точку или точку с запятой тремя точками подряд.

Ввод Вывод
asgahra.agargarhah;rehaehraeh.arhreh    agerge..sgsgg.g asgahra…agargarhah…rehaehraeh…arhreh    agerge……sgsgg…g
;;.grg .    .    ;   ; ………grg …    …    …   …

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

Java:

 

Алгоритм решения: пройдём по всем символам строки от её начала и до конца, в случае, если встреченный символ — ‘.’ или ‘;’, мы добавим в строку вывода ‘…’, иначе — текущий символ.

Related Images:

AA6

Задача

В заданной строке  дописать после каждого символа «!» символ «?».

Решение. 

Проверяем каждый символ строки до тех пор пока не встретится «!», после чего добавляем после него «?».

 

Input Output
Hello, world! Hello, world!?
 Why are we here?? Why are we here??
 !!!It’s ! a ! problem ! ! !?!?!?It’s !? a !? problem !? !?

Код на Java

 

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:

A808г

Задача

Дан текст. Группы символов, разделенные пробелами (одним или несколькими) и не содержащие пробелы внутри себя, будем называть их словами.В тех словах, которые оканчиваются сочитанием букв  [latex]-ing[/latex] заменить это окончание на [latex]-ed[/latex].

Тест

Для проверки я введу первый абзац и второй, так как могут возникнуть вопросы, связанные с считыванием [latex]getline()[/latex] до первого переноса строки.

Вводимый текст Выводимый текст
Alice was beginning to get very tired of sitting

by her sister on the bank, and of having nothing

to do: once or twice she had peened into the book

her sister was reading, but it had no pictures or con-

versations in it, and what is the use of a book,’ througt

Alice ‘without pictures or conversation?’

So she was considering in her own ..

Alice was begined to get very tired of sitted

by her sister on the bank, and of haved nothed

to do: once or twice she had peened into the book

her sister was readed

, but it had no pictures or con-

versations in it, and what is the use of a book,’ througt

Alice ‘without pictures or conversation?’

So she was considered in her own …

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

Решение

Вводим строку в переменную [latex]s[/latex].В цикле пишем условие, что пока будут встречаться буквосочетания  [latex]-ing[/latex] заменить их на [latex]-ed[/latex] и выводим уже обработанный текст.

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:

А808 б

Задача :

Дан текст. Группы символов, разделенные пробелами (одним или несколькими) и не содержащие пробелов внутри себя, будем называть, как и прежде, словами. Найти все слова, содержащие наибольшее количество гласных латинских букв ( a, e, i, o, u ).

Тесты :

Исходный текст Обработанный текст
Two households, both alike in dignity,
In fair Verona, where we lay our scene,
From ancient grudge break to new mutiny,
Where civil blood makes civil hands unclean.
households,
unclean.
alike
Verona,
ancient
makes
mutiny,
Where
break
grudge
civil
scene,
our
blood
where
fair
civil
dignity,
From
hands
new
to
Two
lay
we
in
both
In
For never was a story of more  woe . Than this of Juliet and her Romeo. Juliet  Romeo  never  more  woe for was a story of Than this of and her 

 

 

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

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

Решение :

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

  1. Объявляем  переменные – флаги и счетчики для всех видов слов.
  2. Функция для завершения чтения слова и увеличение счетчика слова на единицу
  3. Стандартный строковый объект класса string.
  4. Ввод текста из стандартного потока ввода
  5. Проход по символам текста
  6. Считаем
  7. Сортируем

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.2

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

Текст
There are many big and small libraries everywhere in our country.
They have millions of books in different languages.
Every school has a library.
Pupils come to the library to take books on different subjects.
Результат

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

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

Алгоритм:

Описываем и считываем строки. Затем описываем количество пробелов в строке и длину самой длинной строки (относительно которой и будет производится выравнивание по правому краю).

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

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

Затем второй проход строк.

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

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

Для проверки работы программы можно воспользоваться объектом.

 

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:

Ю12.31

Задача: строка содержит арифметическое выражение, состоящее из целых чисел и знаков операции: [latex]+,-,*,/[/latex]  (без скобок). Проверить корректность выражения (в смысле последовательности чисел и знаков операции)

Тесты: 

Выражение Ответ Комментарий
-1+2-3/4*5 Верно Работает
-1 Верно Работает
-1/-4 Верно Работает
5—4 Верно Работает
1 Верно Работает
54-*3//6 Ошибка Работает. Неправильная последовательность
5/0+42 Ошибка Работает. Деление на ноль
5/ Ошибка Работает. После символа должно следовать число

Объяснение переменных:

string a  — строка для ввода.

bool rightness  — булева переменная для фиксирования ошибочного выражения.

Код:  Проверить на ideone.

Алгоритм выполнения описан в комментариях в коде.

 

Особенности:

  1. Удобно предположить, что изначально выражение верно. И в случае отсутствия ошибок, переменной rightness присваивать ничего не нужно будет.

Итог работы:

Код проверяет правильность выражения (последовательность чисел и знаков) с учётом унарного минуса (но не плюса)*, так-же за ошибку считается деление на ноль. Примеры применения есть в тестах.

* — легко реализовать посредством удаления a[0] == '+' из соответствующих if’ах, но не стал, так как считаю унарный плюс бессмысленным.

Related Images:

Ю12.20

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

Ввод Вывод
qwerty
ytrewq
av
ab
va
tg
qwerty — ytrewq
av — va
12345
45
67
54
123567
543
54321
12345 — 54321
45 — 54

 

 

Записываем каждое слово словаря в вектор. А цикле переворачиваем каждое слово вектора и потом в цикле сравниваем его с каждым словом в словаре, если найдено обратное слово, то закидываем пару слов в новый вектор. Выводим вектор из пар слов на экран.

Ideone.

Related Images:

М4. НАМ

Написать исполнитель нормальных алгоритмов Маркова для заданного алфавита.

Ввод Вывод Комментарий
abbbcaa
aa->a
bb->b
cc->c
abca Пройдено
x
*x->xx*
*=>
->*
xx Пройдено
cbabca
ba->ab
cb->bc
ca->ac
aabbcc Пройдено

Прочитав строку и команды нам нужно разделить каждую команду на три элемента: ключ, значение, boolean-переменная (отвечает на вопрос: «Конечная ли команда?»). Последняя переменная нужна для того чтобы определить производится ли окончание операций после данной команды.
После этого я использовал небольшой аналог рекурсии. Дело в том, что я использовал бесконечный вызов функции до того момента, когда сама функция не передаст циклу команду остановиться.
В самой же функции идет поиск каждой команды в заданной строке, вначале по первому символу, а потом, если символ совпал, проверяется идентична ли найденная часть строки одной из наших команд.
Если никакая команда не нашла соответствие, функция возвращает 0 и программа выходит из цикла.
Если же совпадение было найдено, то мы заменяем найденный в строке ключ на соответствующее ему значение и возвращаем boolean-переменную (опять же соответствующую заданному ключу), таким образом если это конечная операция, то будет произведен выход из функции, иначе — будет произведен повторный вызов функции.
Так же следует учитывать и то что пустой ключ указывает на то что значение должно добавиться к началу строки, учтем это при написании кода.

Опробовать код можно здесь: http://ideone.com/QobpUI

Related Images:

Ю12.43

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

Строка а Строка b  Результат Комментарий
Q_+wer ty q!w ert) q qwert Тест пройден
`Curiouser and curiouser!’ cried Alice (she was so much surprised, that for the moment she quite forgot how to speak good English); `now I’m opening out like the largest telescope that ever was! Good-bye, feet!’ (for when she looked down at her feet, they seemed to be almost out of sight, they were getting so far off). `Oh, my poor little feet, I wonder who will put on your shoes and stockings for you now, dears?

 

tfor good Тест пройден
Qwe^r ty qwE r!ty qwerty  Тест пройден

C++:

Java:

Даны строки [latex]a[/latex] и [latex]b[/latex]. Сначала переписываем их в строки [latex]a2[/latex] и [latex]b2[/latex], при этом избавляясь от всех символов, кроме букв, и понижая их регистр.

Чтобы выделить все совпадающие комбинации букв, сравниваем каждый символ из [latex]a2[/latex] подряд со всеми символами из  [latex]b2[/latex]. Когда находим одинаковые буквы, проверяем уже следующий символ в [latex]a2[/latex] и в  [latex]b2[/latex]. Все общие подстроки записываем в строку  [latex]c[/latex] через пробел.

Так как в строках может быть несколько общих подстрок наибольшей длины, сначала в строке [latex]c[/latex] считаем, сколько букв в самой длинной подстроке. А после этого ищем слова такой длины и записываем их в строку для вывода через пробел.

Задача на Ideone:
C++
Java

Related Images:

Ю12.36

Задача: Разнобуквица. Из имеющегося словаря выбрать наиболее длинное слово, в котором  все буквы разные, например:  ЛЕЙКОПЛАСТЫРЬ, НЕРЯШЛИВОСТЬ, ЧЕТЫРЁХДЮЙМОВКА.

Тесты:

Словарь Результат Комментарий
There, here, the, then then Пройден
Список 2500 наиболее употребительных английских слов background Пройден

Код:

Для того что бы найти искомое слово создаем две строки, одна для ввода словаря, другая для результата. Создаем цикл [latex]while[/latex] . С помощью функции [latex]isalpha()[/latex] отсеиваем знаки препинания в словаре. Далее создаем булеву переменную [latex]x[/latex]  и два цикла [latex]for[/latex]  что бы проверить  встречается ли буква в слове больше одного раза, если хоть одна буква повторяется, то   присваиваем [latex]x[/latex] значение «false» и прерываем цикл [latex]for[/latex]. Если значение булевой переменной «true», значит в слове нет повторяющихся букв, из таких слов теперь можно искать самое длинное, для этого счетчику [latex]n[/latex] присваиваем размерность самого длинного слово, и присваиваем его значение  в строку [latex]max[/latex]. Выводим результат.

Ссылка Ideone.

 

Related Images:

M2. Brainfuck

Задача

Написать интерпретатор языка Brainfuck для памяти на n ячеек. Ячейки хранят значения типа char.

Тесты

Название программы Ввод (программа на Brainfuck) Вывод
Hello World!  
Числа Фибоначчи
Факториалы


Код на С++

Код на Ideone. Код программы нужно вводить сплошным блоком текста — без переносов строки. Зато можно осуществлять «ввод данных для программы на Brainfuck» — то, для чего нужен оператор «,». Для этого нужно символы, которые «хотим ввести в программу на Brainfuck», нужно ввести в окно ввода Ideone на новой строке после кода программы.

Ещё один вариант кода. В нём можно вводить код программы на разных строках. Различие минимальное:

Пройдя по второй ссылке можно посмотреть на один из вариантов вычисления чисел Фибоначчи на Brainfuck. Вычисляются числа, не превосходящие 100.  Программа работает 🙂

 

Код на С

Ideone (C)

 

Код на Java

Ideone (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:

Ю12.19

Задача:  В имеющемся словаре найти группы слов, записанных одними и теми же буквами и отличающиеся только их порядком, то есть перестановкой, например, (КОРМА, КОМАР).

Код:

 

Тесты:

Исходный словарь Обработанный словарь
the and a to I is of have you he it in not was that his do on with she at say her for as are we but can him they up what out me go get this from be look my there know all one no see will back into like if were then an come think so down your them would about man take just by am now over make been or time when hand who want here tell off right their turn two through eye head other how some more around door room face day where way night well thing open away give only something ask move stand good find again little try too still hear walk before leave sit let long call feel close very why which car any hold work run never start even light than after put yes stop old watch first may talk another cut mean pull behind smile our toward towards much its house keep place begin nothing year woman side because three seem wait need moment himself stare arm use voice last late across sure front sound big really name should new anything against guy kill point small happen wall black step window life maybe fall own far under boy

no
on
three
there
own
now
how
who
thing
night
its
sit
name
mean

Все слова Безымянный

Алгоритм:

Для решения данной задачи я воспользовался возможностью, которую мне предоставляет библиотека <algorithm> . Поскольку мне надо было проверить, являются ли строки перестановками строки s_tmp, которую я ставлю в роли исходной с каждой итерацией, я воспользовался функцией is_permutation .  Если некая строка является перестановкой, то она выводится на экран и стирается. С последующими итерациями будет проводится проверка на наличие на том или ином месте строки. Если строки обнаружено не будет, программа перейдёт к следующей итерации.

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

UPD: Поскольку я понял, что вводить вначале количество слов неудобно, я решил написать функцию, которая сама создаст массив из введённой мной строкой.

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: