-
Написать программу, считающую значение формулы
x^4 + x^3 + x^2 + x + 1
за два умножения. Solution -
Написать программу нахождения неполного частного от деления
a
наb
(целые числа), используя только операции сложения, вычитания и умножения. Solution -
Дан массив целых чисел
x[1] ... x[m + n]
, рассматриваемый как соединение двух его отрезков: началаx[1] ... x[m]
длиныm
и концаx[m + 1] ... x[m + n]
длиныn
. Не используя дополнительных массивов, переставить начало и конец (обращением двух частей массива, а потом его самого). Solution -
Посчитать число "счастливых билетов" (билет считается "счастливым", если сумма первых трёх цифр его номера равна сумме трёх последних), подсчётом числа билетов с заданной суммой трёх цифр. Solution
-
Написать программу проверки баланса скобок в исходной строке (т.е. число открывающих скобок равно числу закрывающих и выполняется правило вложенности скобок). Solution
-
Заданы две строки:
S
иS1
. Найти количество вхожденийS1
вS
как подстроки. Solution -
Написать программу, печатающую все простые числа, не превосходящие заданного числа. Solution
-
Написать программу, считающую количество нулевых элементов в массиве. Solution
-
Реализовать вычисление чисел Фибоначчи рекурсивно (и убедиться, что при
n ~ 37
уже заметно медленно), реализовать итеративно, почувствовать разницу. Solution -
Реализовать возведение в степень — в лоб (за линейное время) и за
О(log n)
. Solution -
Написать сортировки пузырьком и подсчётом. Solution
-
Написать программу, которая заполняет массив случайными значениями, потом преобразует его без использования дополнительных массивов так, что в начале массива будут элементы, меньшие первого, а в конце — большие либо равные первому. Программа должна работать за линейное время. Solution
-
Реализовать qsort, который для сортировки кусков массива размером меньше 10 использует сортировку вставкой. Solution
-
Получить с клавиатуры 2 числа,
n
иk
, сгенерировать случайно массив изn
чисел, сгенерироватьk
случайных целых чисел, для каждого из них проверить, содержится ли оно в массиве. Надо придумать алгоритм с временной сложностьюO(n log n + k log n)
, или лучший. Solution -
Найти наиболее часто встречающийся элемент в массиве быстрее, чем за
O(n^2)
. Если таких элементов несколько, надо вывести любой из них. Solution
-
Ввести два числа, перевести в двоичное представление в дополнительном коде и напечатать, сложить в столбик в двоичном представлении, вывести сумму, перевести в десятичное, вывести сумму в десятичном виде. Все сообщения писать по-русски (рекомендуется использовать функцию
setlocale
, чтобы сообщения выводились по-русски и под Windows тоже). Solution -
Переделать задачу 3 из прошлого задания так, чтобы сортировка была в отдельном модуле и читала входные данные из файла. Solution
-
Написать программу - телефонный справочник. Она должна уметь хранить имена и номера телефонов, в интерактивном режиме осуществлять следующие операции:
0 - выйти
1 - добавить запись (имя и телефон)
2 - распечатать все имеющиеся записи
3 - найти телефон по имени
4 - найти имя по телефону
5 - сохранить текущие данные в файл
При запуске программа должна читать данные из файла (того самого, в который сохраняет данные), если файла нет - начинать с пустой базы номеров. Размер базы ограничен сотней записей. Solution
-
Написать программу для вычисления арифметического выражения в постфиксной форме. С клавиатуры вводится последовательность цифр (для простоты) и операций
+, -, *, /
, представляющая выражение в постфиксной форме, должен выводиться результат вычисления. Например, на тесте9 6 - 1 2 + *
должно получиться9
. Solution -
Написать программу проверки баланса скобок в строке, скобки могут быть трёх видов:
(), [], {}
. Скобочная последовательность вида({)}
считается некорректной,({})
- корректной. Solution -
Написать программу, преобразующую выражение из инфиксной формы в постфиксную. В выражении могут быть знаки
+, -, *, /
, скобки и цифры. Пример:(1 + 1) * 2
должно преобразовываться в1 1 + 2 *
. Алгоритм перевода предлагается найти самостоятельно (алгоритм "сортировочной станции" Э. Дейкстры). SolutionЗадачи 1, 2 и 3 решаются с помощью стека - его надо реализовать единожды в отдельном модуле, и использовать во всех этих задачах. Комментарии ко всем функциям из заголовочного файла обязательны.
-
Написать программу, которая в диалоговом режиме позволяет осуществлять следующие операции:
0 – выйти
1 – добавить значение в сортированный список
2 – удалить значение из списка
3 – распечатать список
Все операции должны сохранять сортированность. Начинаем с пустого списка. Solution -
"Считалочка" – отряд из 41-го сикария, защищавший галилейскую крепость Массада, не пожелал сдаваться в плен блокировавшим его превосходящим силам римлян. Сикарии стали в круг и договорились, что каждые два воина будут убивать третьего, пока не погибнут все. Самоубийство – тяжкий грех, но тот, кто в конце концов останется последним, должен будет его совершить. Иосиф Флавий, командовавший этим отрядом, якобы быстро рассчитал, где нужно стать ему и его другу, чтобы остаться последними, но не для того, чтобы убить друг друга, а чтобы сдать крепость римлянам. В нашем случае участвует n воинов и убивают каждого
m-го
. Требуется определить номерk
начальной позиции воина, который должен будет остаться последним. Считать с помощью циклического списка. Solution -
Реализовать сортировку слиянием. Во входном файле последовательность записей "имя - номер телефона". Программа должна отсортировать эти записи либо по имени, либо по номеру телефона, в зависимости от выбора пользователя, и вывести результат на экран. Количество записей заранее неизвестно, так что надо реализовывать списками на указателях. Solution
-
Реализовать АТД "словарь" на основе двоичного дерева поиска, хранящий ключи типа
int
и связанные с ними значения типаchar *
. Должны поддерживаться следующие операции:- Добавить значение по заданному ключу в словарь. Если такой ключ уже есть, значение заменяется на новое.
- Получить значение по заданному ключу из словаря. Если такого ключа нет, возвращается
nullptr
. - Проверить наличие заданного ключа в словаре.
- Удалить заданный ключ и связанное с ним значение из словаря. Если такого ключа нет, функция ничего не делает.
Программа должна работать в интерактивном режиме, то есть пользователю должно предоставляться меню, позволяющее выполнить эти операции Solution
-
По дереву разбора арифметического выражения вычислить его значение. Дерево разбора хранится в файле в виде (<операция> <операнд1> <операнд2>), где <операнд1> и <операнд2> сами могут быть деревьями, либо числами. Например, выражение
(1 + 1) * 2
представляется в виде(* (+ 1 1) 2)
. Должны поддерживаться операции+, -, *, /
и целые числа в качестве аргументов. Требуется построить дерево в явном виде, распечатать его (не обязательно так же, как в файле), и посчитать значение выражения обходом дерева. Может быть полезна функцияungetc
(если не '(', возвращаем символ в поток и читаем числоfscanf
-ом). Можно считать, что входной файл корректен. Пример - по входному файлу(* (+ 1 1) 2)
может печататься( * ( + 1 1 ) 2 )
и выводиться4
. Solution
-
Реализовать словарь с ключами и значениями типа
char *
на основе АВЛ-дерева. Должны поддерживаться следующие операции.- Добавить значение по заданному ключу в словарь. Если такой ключ уже есть, значение заменяется на новое.
- Получить значение по заданному ключу из словаря. Если такого ключа нет, возвращается
nullptr
. - Проверить наличие заданного ключа.
- Удалить заданный ключ и связанное с ним значение из словаря. Если такого ключа нет, функция ничего не делает.
Программа должна работать в интерактивном режиме, то есть пользователю должно предоставляться меню, позволяющее выполнить эти операции. Solution
- Посчитать частоты встречаемости слов в тексте с помощью хеш-таблицы. На входе файл с текстом, вывести на консоль все слова, встречающиеся в этом тексте с количеством раз, которое встречается каждое слово. Словом считается последовательность символов, разделённая пробелами, разные словоформы считаются разными словами. Хеш-таблицу реализовать в отдельном модуле, использующем модуль "Список". Подсчитать и вывести также коэффициент заполнения хеш-таблицы, максимальную и среднюю длину списка в сегменте таблицы. Solution
- Есть множество городов и дороги, связывающие эти города. Для каждой дороги задана её длина. Задача – распределить города между государствами по такому алгоритму: задаются
k
столиц каждого государства, далее по очереди каждому государству добавляется ближайший незанятый город, непосредственно связанный дорогой с каким-либо городом, уже принадлежащим государству (столицей или каким-либо городом, добавленным на одном из предыдущих шагов). Процесс продолжается до тех пор, пока все города не будут распределены. Граф дорог связный. Во входном файле:n
– число городов иm
– число дорог. Далее следуют сами дороги в формате:i j len
,i
иj
– номера городов,len
– длина дороги. Далее задано числоk
– число столиц, далее –k
чисел – номера столиц. Надо вывести на консоль номера государств и списки городов, принадлежащих государствам. Solution
-
Реализовать поиск подстроки любым из рассмотренных алгоритмов. Из файла читается текст, с консоли - строка, программа должна выводить на консоль позицию первого вхождения введённой строки в файле. Solution
-
По данному неориентированному графу построить минимальное остовное дерево одним из рассмотренных алгоритмов. В файле задаётся матрица смежности, программа должна вывести на консоль минимальное остовное дерево в каком-либо представлении. Solution
-
Реализовать с помощью
switch
по состоянию лексический анализатор, проверяющий, является ли введённая последовательность символов вещественным числом (вещественное число задаётся регулярным выражениемdigit+ (. digit+)? (E(+ | -)? digit+)?
, гдеdigit - [0..9]
). Solution -
С помощью ДКА с явной таблицей состояний, заданной в файле, вывести на консоль все комментарии С++ вида
/* комментарий */
из входного файла (вместе с символами/*
*/
). Solution
-
Посчитать факториал Solution
-
Посчитать числа Фибоначчи Solution
-
Отсортировать массив какой-либо из сортировок Solution
-
Дан массив размерностью
N x N
,N
- нечетное число. Вывести элементы массива при обходе его по спирали, начиная с центра Solution -
Отсортировать столбцы матрицы по первым элементам Solution
-
Написать связный список в виде класса. От списка хочется:
- Добавлять/удалять элемент по произвольной позиции, задаваемой целым числом
- Узнавать размер, проверять на пустоту
- Получать или устанавливать значение элемента по позиции, задаваемой целым числом/
-
Написать хеш-таблицу в виде класса с использованием класса-списка из первой задачи. Должно быть можно добавлять значение в хеш-таблицу, удалять и проверять на принадлежность Solution
-
Реализовать стековый калькулятор (класс, реализующий выполнение операций
+, -, *, /
над арифметическим выражением в виде строки в постфиксной записи). Строка уже дана в обратной польской записи (например,1 2 3 + *
). Стек реализовать двумя способами (например, массивом или списком) в двух разных классах на основе одного интерфейса. Стековый калькулятор должен знать только про интерфейс стека. ВMain
надо спросить у пользователя, какой из вариантов стека он хочет, в зависимости от выбора создаётся объект одной из двух реализаций и передаётся калькулятору. Solution
-
Написать юнит-тесты к задаче 3 из предыдущего задания Solution
-
Модифицировать хеш-таблицу из задачи 2 предыдущей работы так, чтобы хеш-функцию можно было менять в зависимости от выбора пользователя, причём хеш-функцию должно быть можно передавать из использующего хеш-таблицу кода в виде объекта некоторого класса, реализующего некоторый интерфейс. Хеш-функцию должно быть можно менять во время работы. Юнит-тесты и коментарии в формате XML Documentation обязательны. Solution
-
Решить задачу о вычислении выражения по дереву разбора из прошлого семестра. Реализовать иерархию классов, описывающих дерево разбора, используя их, реализовать класс, вычисляющий значение выражения по дереву. Классы, представляющие операнды и операторы, должны сами уметь себя вычислять и печатать.
Исходное условие:
По дереву разбора арифметического выражения вычислить его значение. Дерево разбора хранится в файле в виде (<операция> <операнд1> <операнд2>), где <операнд1> и <операнд2> сами могут быть деревьями, либо числами. Например, выражение
(1 + 1) * 2
представляется в виде(* (+ 1 1) 2)
. Должны поддерживаться операции+, -, *, /
и целые числа в качестве аргументов. Требуется построить дерево в явном виде, распечатать его (не обязательно так же, как в файле), и посчитать значение выражения обходом дерева. Может быть полезна функция ungetc (если не '(', возвращаем символ в поток и читаем число fscanf-ом). Можно считать, что входной файл корректен. Пример - по входному файлу(* (+ 1 1) 2)
может печататься( * ( + 1 1 ) 2 )
и выводиться 4. -
Унаследовавшись от класса список, реализовать класс
UniqueList
, который не содержит повторяющихся значений. Реализовать классы исключений, которые генерируются при попытке добавления в такой список уже существующего или при попытке удаления несуществующего элемента. Solution
-
Реализовать функции
Map
,Filter
иFold
:Map
принимает список и функцию, преобразующую элемент списка. Возвращаться должен список, полученный применением переданной функции к каждому элементу переданного списка. Например,Map(new List<int>() {1, 2, 3}, x => x * 2)
должен возвращать список[2; 4; 6]
.Filter
принимает список и функцию, возвращающую булевое значение по элементу списка. Возвращаться должен список, составленный из тех элементов переданного списка, для которых переданная функция вернулаtrue
.Fold
принимает список, начальное значение и функцию, которая берёт текущее накопленное значение и текущий элемент списка, и возвращает следующее накопленное значение. СамаFold
возвращает накопленное значение, получившееся после всего прохода списка. Например,Fold(new List<int>() {1, 2, 3}, 1, (acc, elem) => acc * elem)
работала бы так: сначала вacc
клался бы 1, потом умножался бы на 1, потом результат (1) умножался бы на 2, потом результат (2) умножался бы на 3, потом результат (6) возвращался бы в качестве ответа. Если умеете генерики, подумайте, как сделать тип функций наиболее общим. Solution
-
На базе класса, генерирующего события по нажатию на клавиши управления курсором (EventLoop с пары), реализовать консольное приложение, позволяющее управлять персонажем, перемещающимся по карте. Карта состоит из свободного пространства и стен, и должна грузиться из файла. Приложение должно отображать карту и персонажа (символом
@
) в окне консоли, и позволять персонажу перемещаться по карте, реагируя на клавиши управления курсором. Будут полезны свойстваConsole.CursorLeft
иConsole.CursorTop
. Solution
-
Написать калькулятор с пользовательским интерфейсом (по примеру стандартного виндового калькулятора) Solution
-
Сделать часы (приложение, показывающее текущее системное время) со стрелками (часовой, минутной и секундной). Здесь юнит-тесты можно не писать. Solution
- Создать генерик-класс, реализующий АТД "Множество". Множество должно реализовывать интерфейс
System.Collections.Generic.ISet
. Ожидается асимптотическая трудоёмкость основных операций не хуже в среднем логарифмической (то есть несбалансированное двоичное дерево тоже пойдёт). Проверить в тестах, что по множеству можно ходитьforeach
. Solution
- Нарисовать на UML диаграмму классов для игры "реверси", с несколькими видами "ботов", которые могли бы играть вместо человека. Диаграмма должна быть довольно подробным проектом системы. Реализовывать этот проект не нужно. Желательно пользоваться средствами визуального моделирования наподобие Visual Paradigm (https://www.visual-paradigm.com/download/community.jsp), присылать скриншоты с диаграммой и исходники (файлы .vpp в случае Visual Paradigm) Solution