Тему курсовой работы выбирает студент, но в каждой группе вариант должен выбираться не более одного раза.
1. Генератор арифметических примеров
Разработать программу для генерации примеров для контрольных работ по
арифметике. На экране настройки вводятся следующие опции:
Количество примеров: [ 1]
Количество действий: [ 5]
Диапазон чисел, минимум: [-1000]
Диапазон чисел, максимум: [1000]
Допустимые арифметические действия:
2+2? [X]
2-2? [X]
2*2? [X]
2:2? [X]
-(-2)? [X] // смена знака
Имя файла для вывода: [kontr1.txt]
Здесь [X] - флажки (checkbox); [...] - поля ввода.
Сгенерированные примеры вместе с ответами вывести в указанный файл,
разделяя пустой строкой, в следующем виде:
4 : (1 + 1) =
Ответ: 2
2 + 3 =
Ответ: 5
Перед и после знака арифметического действия выводить один пробел.
Генерацию можно производить следующим образом:
Задать случайным образом результат в указанном диапазоне.
1. Выбрать арифметическое действие
2. Выбрать число в указанном диапазоне - это 1-й операнд
3. Рассчитать 2-й операнд
4. Если 2-й операнд вне диапазона, перейти к шагу 1
5. Выбрать случайно N от 0 до общЧислоДействий-1
// N - число действий для разложения 1-го операнда
6. M=общЧислоДействий-N-1
// M - число действий для разложения 2-го операнда
7. Если N>0, то разложить 1-й операнд с помощью рекурсивного применения
этого алгоритма, иначе использовать число в качестве левого операнда
8. Если M>0, то разложить 2-й операнд с помощью рекурсивного применения
этого алгоритма, иначе использовать число в качестве правого операнда
Для представления примера использовать следующий класс:
конструктор(целое число)
конструктор(пример* левая часть, char действие, пример* правая часть) // для смены знака левая часть = nullptr
действие() // char
приоритет действия() // int, для уменьшения количества выводимых скобок
вывод(ostream &)
2. Текстовый редактор
Написать класс-редактор текста с возможностями Nano (Linux)/редактора в Far manager (Windows)
(без использования меню, все управление с клавиатуры).
Возможности класса-редактора: перемещение по тексту; режим вставки и
замены; удаление и вставка символов и строк; выделение строк;
добавление обработчика дополнительных клавиш (функциональные клавиши,
Ctrl-, Alt- и т.д.)
Для вывода на экран использовать функции из coniow.h. Рисование
рамок, работа с окнами в этот класс не должны входить (и в данной
работе не нужны).
В качестве примера сделать программу-редактор для вызова из
командной строки:
edit text.txt
Добавить подсказку по функциональным клавишам (не в классе) как
в редакторе Far Manager: F1 - помощь F2-сохранить F5 - копировать блок
F6 - переместить блок F10-выход и т.п. Помощь загружать из файла,
используя новый созданный объект-редактор в режиме просмотра.
Обработку клавиш F1-F10 реализовать через обработчик дополнительных клавиш.
Рекомендуется использовать следующий класс:
конструктор(x1,y1,x2,y2,цвет текста=0x7,цвет выделения=0x70)
выполнять редактирование()
разрешить/запретить изменения(bool) // режим просмотра/редактирования
количество строк()
номер текущей строки() // нумерация с 0
номер текущего символа в строке()
перейти на строку, символ(r, c=0)
получить строку(r=-1) // string, r - номер строки, если -1, то текущую
заменить строку(string, r=-1)
удалить строку(r=-1)
добавить строку(string, r=-1)
добавить символы(string) в текущее местоположение курсора
удалить символы(int=1) начиная с текущего
выделить строки(n1,n2) c n1-й по n2-ю,
если оба аргумента = -1, убрать выделение
установить обработчик нераспознанных клавиш(void (*f)(int))
3. Редактор для разработки программы методом "сверху-вниз"
Написать редактор для разработки программы методом "сверху-
вниз". Этот метод заключается в следующем:
Пишется программа на языке сверхвысокого уровня (естественном
языке). Затем каждый оператор такой программы постепенно
расшифровывается, заменяется алгоритмом на более простом языке,
пока программа не окажется записанной на каком-либо языке
программирования.
Возможности редактора:
Перемещение по тексту (в т.ч. вглубь)
Изменение строки, удаление строки, вставка новой строки
Размеры строки можно ограничить 75-80 символов
(скролирование текста влево-вправо не нужно)
Например, программу решения квадратного уравнения можно
написать так:
* ОБЬЯВИТЬ ПЕРЕМЕННЫЕ
* ВВЕСТИ КОЭФФИЦИЕНТЫ УРАВНЕНИЯ
* ВЫЧИСЛИТЬ
* ВЫВЕСТИ КОРНИ УРАВНЕНИЯ
Затем провалиться в оператор 2 и ввести его определение:
ВВЕСТИ КОЭФФИЦИЕНТЫ УРАВНЕНИЯ
printf("Введите коэф. уравнения a, b и c:");
scanf(&a,&b,&c);
Также можно определить оператор 3:
ВЫЧИСЛИТЬ
* ВЫЧИСЛИТЬ d
if(d>=0)
* ВЫЧИСЛИТЬ КОРНИ УРАВНЕНИЯ
else
* КОРНЕЙ НЕТ
Таким образом, должна существовать возможность вставить как
обычный оператор языка программирования, так и оператор, который в
дальнейшем будет расшифровываться (в который можно провалиться для
расшифровки). Вложенность может быть достаточно большой.
Первым символом в строке с оператором суперязыка стоит признак
расшифрован оператор или нет (* или !).
Рекомендуется следующий формат файла для хранения программы:
*РАСШИФРОВАННЫЙ ОПЕРАТОР
!НЕРАСШИФРОВАННЫЙ ОПЕРАТОР
[пробел]оператор на языке программирования
# (конец расшифровки оператора)
4. Аудио-редактор
Разработать аудио-редактор для редактирование файлов в формате wav (моно, без сжатия, PCM)
Функции:
- визуальный показ
- загрузка звука
- разрезание звука на кусочки (инструмент ножницы)
- удаление куска
- добавление звука из файла как новый кусок
- добавление музыкальных звуков как новых кусков (7 нот, одной октавы)
- перестановка куска в другое место
- наложение (микширование)
- реверсирование
- проигрывание результата (начиная с выбранного куска)
- сохранение
5. Векторный графический редактор
Разработать упрощенный векторный графический редактор Draw v0.0 cо
следующими возможностями:
- рисование линий
- рисование прямоугольников (заполненных и нет)
- выбор цветов рисования и заполнения из 16 или более
- чтение и запись рисунка в собственном формате
- удаление объектов
При движении мыши высвечивать координаты и размеры вставляемого объекта.
Примерный формат экрана:
Развитие темы: добавить выделение, перемещение и копирование
объектов, изменение размеров и др. свойств.
6. Редактор электрических схем
Написать программу для редактирования электрических схем. Схема
составляется из набора конфигурируемых элементов.
Редактор позволяет вставить в схему любой из определенных в файле конфигурации
элементов, соединить элементы проводами (соединение идет по прямой,
при соединении достаточно попасть в небольшую окрестность
точки подключения, к одной точке можно подключить только один провод),
убирать (разрывать) провода, поворачивать и перемещать элементы
(провода при этом двигаются в соответствии с точками подключения),
удалять элементы (подключенные провода при этом убираются)
сохранять схему в файл и восстанавливать из файла.
В файле конфигурации содержится список имен файлов с элементами
(от 8 до 20), что позволяет настраиваться на конкретную предметную
область. Файл с элементом содержит следующую информацию:
LAMP.ELM:
LAMP.ICO // имя картинки с элементом для кнопки
21 21 // размеры элемента
С 10 10 10 0 15 // составляющие элемента -
окружность с центром (10,10) радиусом 10,
незаполненная, цвет белый
L 3 3 17 17 15 // линии крест-накрест, цвет белый
L 17 3 3 17 15
I 0 10 // точки подключения проводов
I 20 10
Допустимы след. команды для рисования элемента:
B - прямоугольник
A - дуга
Для сгиба и соединения проводов в определенных координатах
рекомендуется задать два-три вспомогательных элемента:
| | |
---+ ---+ ---+---
| |
Элементы схемы можно представить классом-прототипом:
наименование файла с элементом
размеры элемента
количество точек подключения
координаты i точки подключения
нарисовать элемент в точке (x,y) и поворотом
и классом-конкретным элементом:
указатель на класс-прототип
координаты элемента
угол поворота
координаты i точки подключения с учетом размещения и поворота
элемент* , поключенный к i точке
подключить элемент* к i точке
разорвать i-ю связь
нарисовать
7. Библиотека для работы с матрицами
Библиотека должна включать класс Matrix
Из матрицы можно выделить прямоугольную часть - подматрицу .sub(i,j,n,m),
строку .row(i) и столбец .col(i). С частью матрицы должны быть допустимы
те же операции, что и с матрицей; модификация подматрицы изменяет
соответствующие элементы в базовой матрице.
Основные операции +, -, *, =, +=, -=, *=, ==, !=. В качестве
второго операнда может выступать матрица или число.
Операции /, /= определить только для операнда-числа справа.
Дополнительные полезные функции: транспонирование, максимум, минимум,
поиск элемента, ввод-вывод, единичная и нулевая матрица размером n и др.
Некоторые функции и операции должны создавать новую матрицу.
Для доступа к элементам матрицы переопределить операцию () : a(i,j).
Эта операция возвращает ссылку на элемент, т.е. может использоваться и
в левой части оператора присваивания.
Для создания подматрицы (строки, столбца) рекомендуется определить приватный
конструктор, который не выделяет память, а получает указатель на матрицу и как
расположена подматрица в ней. Только обычный конструктор матрицы выполняет
реальное выделение памяти. В классе должен быть флажок, определяющий
выделена ли была память в конструкторе или используется память другого объекта.
Рекомендуется определить метод, который создает копию матрицы с выделением
собственной памяти. Его можно использовать для перегрузки тех операций,
в которых необходимо разорвать связь между подматрицей и матрицей, например:
Matrix operator+(const Matrix &a, const Matrix &b)
{ return a.copy()+=b;
}
Проверить работу программы на методе Гаусса:
cin>>n;
Matrix a(n,n+1);
cin>>a;
// Метод Гаусса решения системы линейных уранений
for(i=0;i<a.rows();i++)
{ double u,v;
Matrix c(a.sub(i,i,a.rows()-i,1));
u=c.max(); // найти номер максимального
v=c.min(); // элемента по модулю в столбце
if(fabs(v)>fabs(u)) u=v;
k=c.find(u)+i;
if(k!=i) // поменять местами строки
{
Matrix t(1,a.cols());
t=a.row(k);
a.row(k)=a.row(i);
a.row(i)=t;
}
a.row(i)/=a(i,i); // ведущий элемент привести к 1
for(j=0;j<a.rows();j++) // вычесть i-строку из всех других
if(j!=i) // строк
{
a.row(j)-=a.row(i)*a(j,i);
}
}
// в последней колонке получаем решение уравнения
cout<<a.col(n);
8. Библиотека классов для работы с полиномами
Реализовать класс для работы с полиномами. В качестве элементов
используются латинские буквы и числа. Пример полинома:
0.1*a*b^3+x*y^4
Реализовать операции +, -, *, = для полиномов-операндов
и операции +, -, *, /, где 1 или 2 операнд является числом double
(для деления только 2-ой операнд)
Прочие методы/операции: вычисление полинома при указанных значениях для всех неизвестных,
подстановка вместо буквы другого полинома, дифференцирование по
указанной букве, ввод (>>), вывод (<<) в виде одной строки,
получить набор неизвестных, конструкторы-преобразователи double->полином,
string->полином
9. Библиотека классов для работы с базами данных объектов (ООБД)
Определить классы для хранения объектов в файле.
Класс для хранимого объекта необходимо произвести от некоторого
базового абстрактного класса и переопределить виртуальные методы
void ReadData(fstream &f); // чтение полей из файла
void WriteData(fstream &f); // запись полей в файл
int Size(); // размер записи (все записи для простоты одинак. размера)
void Recalc(); // вычислить незаписываемые в файл поля после чтения записи из файла
Можно от созданного класса произвести новый класс,
с дополнительными полями, тогда в методах нового класса
в первую очередь нужно вызвать методы базового класса,
а затем произвести действия с новыми полями производного класса
Для доступа к полям в производном классе рекомендуется определить
методы setИмя(значение) и getИмя()
В базовом классе должны быть определены методы
конструктор(имяфайла)
void Open()
void Close()
long Id() // идентификатор записи (смещение в файле)
void Goto(long id) // перейти на запись с идентификатором id
void First() // перейти на первую запись в файле
void Next() // перейти на следующую запись в файле
void Prev() // перейти на предыдущую запись в файле
void Last() // перейти на последнюю запись в файле
void Post() // записать изменения
void Cancel() // отменить изменения, перечитать запись
void Insert() // добавить новую запись, войти в режим изменения
void Edit() // войти в режим изменений
void Delete() // удалить запись
bool Eof() // файл пуст или обнаружен конец файла при выполнении Next()
bool Bof() // файл пуст или обнаружено начало файла при выполнении Prev()
long Count() // количество записей
10. Текстовая оконная библиотека
Написать библиотеку для оконного интерфейса в текстовом режиме.
Библиотека должна работать в режиме 80x25 и 80x50. Должны определяться
следующие классы:
-- окно
координаты
размеры
видимость
цвет фона
текст заголовка
процедура, вызываемая для нераспознанных клавиш окна
верхнее окно // свойство класса
добавить(элемент) // метод
-- метка (надпись)
координаты
видимость
цвет
текст метки
-- кнопка
координаты
размеры
видимость
цвет кнопки
текст кнопки
цвет текста
процедура, вызываемая при нажатии кнопки
-- ввод строки
координаты
ширина
видимость
цвет поля
цвет текста
текст
Рекомендуется использовать активные свойства,
или определить пару методов setСвойство/getСвойство. Работа от
клавиатуры. Для примера рассмотреть интерфейс Far Manager (windows)/Midnight Commander (Linux).
11. Графическая оконная библиотека
Написать библиотеку для оконного интерфейса в графическом
режиме. Библиотека должна работать для произвольного графического
режима, обеспечиваемого выбранной графической библиотекой.
Должны определяться следующие классы:
-- окно
координаты
размеры
видимость
цвет фона
текст заголовка
процедура, вызываемая для нераспознанных клавиш окна
верхнее окно // свойство класса
добавить(элемент) // метод
-- метка (надпись)
координаты
видимость
цвет
текст метки
-- кнопка
координаты
размеры
видимость
цвет кнопки
текст кнопки
цвет текста
процедура, вызываемая при нажатии кнопки
-- ввод строки
координаты
ширина
видимость
цвет поля
цвет текста
текст
Максимальные размеры окон ограничены размером экрана, поэтому
запрещается использовать getimage для сохранения части экрана.
Рекомендуется использовать активные свойства,
или определить пару методов setСвойство/getСвойство. Работа от
клавиатуры. Для примера рассмотреть интерфейс Windows.
12. Анимационная библиотека
Написать библиотеку для создания игр и различных мультипликаций.
Объекты характеризуются свойствами:
координаты на экране x,y и уровень z
(z=0 уровень фона, объект с максимальным z
находится над всеми другими объектами)
видимость
имя файла с картинкой
размеры объекта (по умолчанию размеры картинки)
игнорируемый (фоновый) цвет
(по умолчанию цвет пиксела в верхнем левом углу)
получить цвет пиксела (i,j)
свойства можно читать (getимя) и изменять (setимя), изменения
выводятся после команды "показать изменения", применяющейся к экрану.
Определить очередь событий:
typedef int Event;
class TQueue
{
public:
TQueue();
void add(Event event, int dt); // добавить событие в момент (сейчас+dt)
void take(Event &event, int &dt); // получить событие (dt- превышение интервала)
bool isReady(); // подошло время обработать к-л события
bool isEmpty(); // очередь пуста
};
Для получения текущего времени в миллисекундах использовать timeGetTime()
Работу библиотеки продемонстрировать на простой игре типа тира:
прицел, управляемый мышью;
выбегающие время от времени слева или справа враги;
несколько предметов, за которые враги могут прятаться.
Если щелкнул центром прицела на пиксел врага, отличный от
фонового, значит враг убит.
13. Библиотека классов для работы с многоразрядными целыми числами
Реализовать класс для работы с целыми числами с заданным
в аргументе конструктора числом цифр.
Реализовать операции +, -, *, +=, -=, *=, =, сравнения (6 шт.),
ввода-вывода (<<, >>) для чисел указанного класса,
а также операции +, -, *, /, +=, -=, *=, /=, =, сравнения (6 шт.),
где вторым операндом является число long (все) или double (кроме /).
double используется для записи чисел c большим числом нулей типа 2e100
Уэзерел Ч. Этюды для программистов
Кнут Д. Искусство программирования для ЭВМ Т.2
14. Программа для обучения основам программирования
Разработать программу, с помощью которой учащиеся смогут познакомиться
с основными понятиями программирования.
На поле размером NxM расположены несколько роботов разного цвета, у
каждого свой номер. На поле расположены объекты - препятствия,
предметы для собирания.
При выходе из клетки цветные роботы перекрашивают клетку в свой цвет
(роботы белого цвета - не изменяют цвета клеток).
Для управления роботами на поле размещаются команды для изменения
направления движения (стрелки) или цвета роботов (банка с краской),
команды останова или уничтожения робота.
Можно задать несколько программ - для роботов конкретного цвета
или универсальная. Если не задана программа для роботов какого-то
цвета, то они используют универсальную программу. Какие программы
можно создавать и возможность их редактирования определяется заданием.
Также в задании ограничивается количество команд для каждой программы
путем размещения ограниченного набора команд в заготовке программы,
их можно перемещать или удалять. Программа для редактирования выбирается
с помощью кнопки.
Если разрешено заданием, можно изменить начальное направление и/или позицию робота.
Задача состоит в приведении поля в некоторое конечное состояние
после выполнения программы, написанной учащимся.
Рекомендуются следующие варианты классов:
--Объект
применить(робот) // при попадании на клетку с объектом
// 1 - допустимо, 0 - ошибка
нарисовать(x,y)
--Поле
размеры поля
цвет клетки(i,j)
установить цвет клетки(i,j)
какой объект на клетке(i,j) // на клетке может быть только один объект
установить объект на клетку(i,j)
нарисовать(x,y)
--Робот
текущие координаты // i,j
текущее направление
текущий цвет
установить координаты
установить направление
установить цвет
изменить поле(поле) // перед выходом из клетки, покраска, удаление или замена объекта
разрешено изменять направление?
разрешено изменять координаты?
столкнулся(набор роботов)?
нарисовать(x,y)
--Набор роботов
количество
добавить(робот)
убрать(робот)
--Команда
разрешено перемещать?
разрешено убирать?
применить(робот)
нарисовать(x,y)
--Программа
цвет программы (белый - для всех)
установить команду в клетке(i,j)
команда на клетке(i,j)
нарисовать(x,y)
--Набор программ
количество
добавить(программа)
убрать(программа)
--Задание
инициализировать(поле, набор роботов, набор программ)
инициализация перед выполнением программы(поле) // случайное размещение предметов
задание выполнено(поле, набор роботов)?
текст задания
нарисовать конечное состояние поля(x,y) // для объяснения задания
Столкновение роботов:
..
>> - нет
..
..
>< - да
..
.v
>. - да
..
..
>v - да
..
Варианты заданий/роботов (для каждого варианта составляется
своя модификация программы, для реализации выбрать
один вариант из перечисленных)
- черепашка-художник (раскрасить пол в определенный узор)
- урожай (скушать яблоки, появляющиеся случайно до написания программы)
- управление движением (передвинуть роботов на точки выхода или останова)
15. Программа для размещения мебели
Мебель, стены, двери и др. элементы представляются в виде
набора прямоугольных блоков, которые можно перемещать на виде
сверху. Можно указать высоту размещения над полом. Объекты
не должны накладываться друг на друга. Объекты делятся на
несколько типов:
1. стены, которым можно задать длину и высоту
2. двери, окна и др. объекты, которые обычно накладываются на стену
толщина определяет место, где не могут быть размещены другие объекты
3. мебель, столы, стулья, люстры, горшки с цветами
Основные возможности программы: вставка объекта, который нужно
выбирать из нескольких списков (определяется файлами конфигурации),
поворот объекта на угол кратный 90 градусов, передвижение объекта в
координатах XY и изменение высоты Z.
Т.е. курсовая работа сводится к передвижению параллелепипедов,
у которых задано направление (угол поворота 0,90,180,270)
Управление можно сделать только клавиатурой:
просто стрелка - перемещение по 10 см
Shift-стрелка по 1 см
По умолчанию объект вставляется рядом с предыдущим размещенным
объектом (сдвинутым на ширину предыдущего объекта и
повернутым на тот же угол).
В файлах конфигурации может содержаться следующая информация:
GROUPS.CFG:
walls.cfg Стены, двери, окна
tables.cfg Столы
...
WALLS.CFG:
стена, обои в горошек: 1
дверь 90 см, белая, со стеклом: 2 90 200 90
^ ^
наименование (до :) тип объекта
^
ширина
^
высота
^
толщина
холодильник 2-х дверный, зеленый: 3 120 160 60
Можно всю конфигурацию хранить в одном файле.
Развитие темы:
Построение вида для любого угла и добавление перспективы.
16. Редактор блок-схем программ
В соответствии с принципами структурного программирования
для написания программ достаточно 3 типов операторов:
последовательность, условный оператор и оператор цикла
Некоторые блоки (ввод-вывод, завершение программы) имеют
специальную рамку.
Написать редактор для блок-схем (структурного проектирования
программы), который позволял бы редактировать блок-схемы.
Первоначально в схеме есть блоки "начало" и "конец".
Команды редактора: вставить блок после текущего/в левую/в правую ветвь, удалить текущий блок, изменить
текст в блоке, сохранить и считать блок-схему в файле.
Для упрощения программы рекомендуется управление с помощью
клавиатуры (движение стрелками по блокам: вниз/вверх -
следующий/предыдущий блок, влево/вправо - левая/правая ветвь, если
есть или следующий блок). Рекомендуется хранить указатель на текущий блок.
Для представления блок-схемы рекомендуется класс со свойствами
тип блока
текст, выводимый в блоке
левая ветка // отсутствует у простых блоков
правая ветка // -//-
следующий блок
предыдущий блок
блок, в котором находится ветка с этим блоком
выч. высоту изображения блока с ветками
выч. ширину -//-
нарисовать блок и его ветки в (x,y)
Для упрощения рисования рекомендуется левую ветвь рисовать
всегда вниз и принять стандартный размер блока.
17. Библиотека для моделирования систем массового обслуживания
Написать библиотеку классов для моделирования включающую следующие
классы:
-- Генератор объектов
тип генерируемого объекта
(объекты в системе представляются номером типа)
среднее время появления и тип случайного распределения
(можно реализовать сначала только равномерное)
включить/выключить
кол-во сгенерированных объектов
указатель на функцию, вызываемую при генерации объекта
-- Очередь объектов к устройству обслуживания
добавить объект
взять объект (возвращает номер типа и удаляет из очереди)
текущее число объектов в очереди
максимальное, минимальное, среднее
времени ожидания в очереди (расчет при моделировании)
максимальная длина очереди (расчет при моделировании)
-- Устройство обслуживания
поставить объект на обработку
среднее время обработки и тип случайного распределения
(можно реализовать сначала только равномерное)
работает/простаивает
коэффициент загрузки (расчет при моделировании)
кол-во обработанных объектов
указатель на функцию, вызываемую при завершении обработки объекта
-- Система в целом
текущее количество объектов в системе
добавить объект в систему
удалить объект из системы
интервал моделирования
текущее время
Очередь событий в системе
(составная часть, может быть определена в закрытой части класса,
если генератор и устройство будут друзьями этого класса)
Написать модель следующей системы:
На карьере работает 2 экскаватора и M машин. В начальный момент
машины поровну делятся между очередями экскаватора. Экскаватор
наполняет кузов машины за 6-10 минут (распределение времени
равномерное). Машина отвозит песок потребителю за 45 минут
(распределение нормальное со стандартным отклонением 15 минут или 30-60 минут).
После возвращения становится под загрузку простаивающего
экскаватора или в самую маленькую очередь. Промоделировать систему
в течении 8 часов при различных M и выбрать M минимизирующее
простой экскаваторов и машин.
Для моделирования поездки машины к потребителю можно
использовать генератор, который необходимо включать, а после
генерации объекта выключать. А можно сделать M устройств обслуживания .
Развитие темы:
Добавить новые типы случайного распределения.
18. Графический редактор для детей
Написать редактор, позволяющий составлять рисунок из набора
готовых картинок. Для простоты общение с помощью надписей должно
быть минимизировано.
Редактор должен позволять:
- выбирать группу картинок;
- выбирать картинку из группы;
- вставлять выбранную картинку в рисунок
(при этом видно как она будет расположена на рисунке;
при вставке фоновый цвет картинки игнорируется)
- сохранять и загружать рисунок в стандартном
формате .BMP, предпочтительно при общении с
пользователем вместо имени использовать маленькое изображение
рисунка, а имя генерировать автоматически.
Примерный формат экрана:
набор кнопок +-++-------------------+
с группами +-+| |
картинок +-+| |
и действиями +-+| |
+-+| рисунок |
| |
| |
| |
+-------------------+
Редактор должен конфигурироваться, в каком-то файле можно
указать имена файлов с картинками, разбиение на группы и имена
файлов для кнопок с группами.
19. Генератор тестов
Написать набор классов для генерации тестовых данных.
Структура представляется в виде совокупности объектов различного класса.
Должны быть классы для выбора, циклов и других элементов.
У всех классов должен быть метод generate, выводящий в файл результат генерации.
Класс последовательность Seq(), в которую можно добавлять с помощью
метода add следующие элементы:
1. Простые значения:
целое число
ссылку на переменную
строку
указанное значение выводится при генерации
2. Объекты классов:
Any(строка)
при генерации выводится случайный символ из строки
Per(строка)
при генерации выводится случайная перестановка символов строки
Format(число или переменная, строка)
при генерации выводится значение по указанному формату
Rep(целое число или переменная, элемент)
действие повторяется заданное число раз
While(переменная, элемент)
действие повторяется пока значение переменной не нулевое
другие последовательность или
Select().add(элемент [,целое число=1]).add(...
группа выбора, элемент из группы выбирается с вероятностью
прямо пропорциональной числу
Assign(переменная, выражение)
при генерации переменной присваивается выражение
выражение строится из объектов
Random(целое число или переменная,целое число или переменная)
случайное значение в указанном диапазоне
целых чисел и переменных,
соединяемых знаками операций +, -, *, /, %
Var N;
Seq s1;
s1.add(Assign(N,Random(1,100))).add(N).add("\n");
// присвоить N случайное число от 1 до 100, вывести N, вывести "\n"
s1.add(Rep(N,Seq().add(Rep(10,Any("ABC"))).add("\n"));
// выполнить N раз вывод строки из 10 случайных символов A,B или C
s1.generate();
// сгенерировать тест, результат выводится в cout
Пример сгенерированного теста:
3
ABBACCAAAB
ACBBBACAAC
BBACCCCAAA
20. Обработка XML
Написать класс для создания и сохранения XML-документа.
Каждый XML-документ содержит 1 или более элементов в форме:
<ИМЯ_ЭЛЕМЕНТА АТРИБУТЫ>
СОДЕРЖАНИЕ
</ИМЯ_ЭЛЕМЕНТА>
или
<ИМЯ_ЭЛЕМЕНТА АТРИБУТЫ />
АТРИБУТЫ разделяются символами пробела, табуляции, перехода на новую строку
и выглядят так
ИМЯ_АТРИБУТА="ЗНАЧЕНИЕ" -- ЗНАЧЕНИЕ не содержит символов " и <
или
ИМЯ_АТРИБУТА='ЗНАЧЕНИЕ' -- ЗНАЧЕНИЕ не содержит символа ' и <
ИМЯ_ЭЛЕМЕНТА или ИМЯ_АТРИБУТА начинается с латинской буквы или ':' или '_'
затем следует 0 или более букв, цифр, символов '-', '.', '_', ':'
СОДЕРЖАНИЕ это 0 или более элементов,
а также произвольный текст, не содержащий символа <
Для некоторых символов в тексте и значениях атрибутов используются
специальные обозначения:
& &
< <
" "
> >
число; символ с указанным кодом, например, ' это '
Основные методы класса XML:
сохранить_в_файл(string file_name)
int количество_элементов_содержания()
XML *элемент_содержания(int i)
string имя_элемента()
string получить_текст()
установить_текст(string text)
int количество_атрибутов()
string имя_атрибута(int i)
string значение_атрибута(int i)
XML *найти_элемент_содержания(string name, string attr, string value)
// по имени и значению одного из атрибутов
string найти_значение_атрибута(string name)
int номер_атрибута(string name)
добавить_атрибут(string attr, string value)
// или заменить, если существует
удалить_атрибут(i)
XML *добавить_элемент_содержания(string name)
удалить_элемент_содержания(i)
Развитие темы:
Добавить загрузку XML из файла
21. Библиотека классов для аналитической геометрии на плоскости
Написать библиотеку классов для аналитической геометрии на плоскости.
Должна поддерживаться работа со следующими понятиями:
точка, прямая, отрезок, луч,
набор объектов (точек, отрезков и т.д.) для ломаных линий и результатов пересечений.
Можно выполнять следующие действия:
перемещение, поворот относительно центра координат,
вычисление пересечения (возвращается набор объектов),
расстояния между объектами.
Необходимо реализовать только создание объектов и вычисления, без рисования (визуализации).
Пересечение прямых, отрезков и лучей лучше находить, используя параметрическое уравнение прямой, проходящей через 2 точки:
`x=x_1+(x_2-x_1)*t`
`y=y_1+(y_2-y_1)*t`
Для отрезка `t` от 0 до 1, для прямой - от `-oo` до `+oo`, для луча - от 0 до `+oo`.
Для пересечения двух объектов, заданных парами точек `(x_1,y_1),(x_2,y_2)` и `(x'_1,y'_1),(x'_2,y'_2)` нужно найти такие `t` и `t'`. чтобы координаты совпали.
Для этого решаем систему
`x_1+(x_2-x_1)*t=x'_1+(x'_2-x'_1)*t'`
`y_1+(y_2-y_1)*t=y'_1+(y'_2-y'_1)*t'`
Если `t` и `t'` находится в допустимом диапазоне для типа объекта, то пересечение есть (и расстояние равно 0),
иначе пересечения нет, для расстояния находим минимум из расстояний до 2 точек объекта.
Если определитель системы равен 0, то линии параллельны или частично совпадают.
22. Редактор схемы компьютерной сети
Разработать программу для рисования схемы компьютерной сети.
Элементы схемы: компьютеры, принтеры, серверы, маршрутизаторы,
соединения проводные или беспроводные.
Для каждого элемента можно указать имя, IP-адрес (кроме соединений).
23. Библиотека классов для работы с архивом TAR
Написать библиотеку классов для работы с архивом TAR
В библиотеке должны быть следующие классы:
архив, папка в архиве, файл в архиве,
потоки для чтения из архива и записи в архив.
Для работы с tar использовать библиотеку https://github.com/rxi/microtar
Потоки ввода-вывода произвести от istringstream/ostringstream.
Чтение из архива производить в конструкторе, а запись в файл - в деструкторе.
Развитие темы: иcпользование zlib для чтения из файлов .tar.gz
24. Моделирование замкнутой биологической системы
Написать библиотеку классов для моделирования и визуализации
замкнутой биологической системы.
Объекты системы: 1 или более видов корма, травоядных, хищников.
Разные виды должны отличаться скоростью и поведением.
Моделирование происходит на плоскости, ограниченной прямоугольником.
При визуализации для разных видов объектов используются
разные формы (круг, квадрат, треугольник) и цвета.
25. Среда для визуального программирования
Разработать IDE для визуального программирования на основе DFD (диаграмма потоков данных).
Программа составляется как набор блоков, между которыми устанавливаются связи для передачи данных.
Пока предыдущее число, отправленное по связи, не будет обработано, новое число не отправляется.
Блок ждет, когда данные поступят на все входы, освобождает их, выполняет операцию,
и отправляет результаты вычислений на все выходные связи, если они свободны,
иначе ждет их освобождения.
К одному выходу блока можно подключить несколько связей или ни одной.
Для простоты все числа вещественные.
Блоки:
- ввод чисел, перед запуском необходимо заполнить числами
- вывод чисел, первоначально блок пустой, затем заполняется числами
- константа (без входов, всегда отправлять на выход некоторое число)
- селектор (1 вход, несколько выходов): вход сначала на 1-й выход,
затем на 2-й, ..., на n-й, затем снова на 1-й и т.д.
- операции сравнения (2 входа, 2 выхода): >, <, =
если условие истинно на 1-й выход отправляется 1, на 2-й - 0, иначе - наоборот
- арифметические действия (2 входа, 1 выход): +, -, *, /, div, mod
- математические функции (1-2 входа, 1 выход): sin, cos, sqrt, pow, ...
- условие (3 входа, 2 выхода): если 3-й вход не 0,
то на 1-й выход 1-й вход, на 2-й выход - 2-й вход, иначе - наоборот
- min-max (2 входа, 2 выхода): на 1-й выход max, на 2-й - min
- копирование (1 вход, 1 выход)
См. примеры применения: сортирующие сети обзор систем визуального программирования: примеры Microsoft Visual Programming Language, ADL, Andescotia, Analog Box, Blender: Sverchok, BloodHound, DrawFBP, FlowLab, FlowStone, Knime, NodeBox, Pipes, Quartz Composer, SynthEdit, VUO
игры Silicon Zeroes, Prime Mover, while True: learn()
26. Редактор презентаций
Презентация состоит из слайдов, на слайде могут быть размещены несколько объектов из списка:
текст, картинка, прямоугольник, овал, стрелка.
Редактор должен сохранять презентацию в своем формате (картинки хранятся отдельно в папке с презентацией)
и загружать из него. Также должен быть режим показа презентации.
Развитие темы: экспорт в формат html-страницы.
27. Генератор отчетов
Генератор отчетов позволяет задавать формат вывода для данных.
Данные хранятся в формате CSV, первая строка содержит имена столбцов.
Отчет состоит из нескольких частей (Page Header/Footer, Report Header/Footer, Group Header/Footer, Detail).
Группа определяется при изменении значения в столбце.
С помощью визуального редактора в соответствующей части отчета размещаются надписи,
значения из столбцов или суммы значений в столбце.
Редактор должен сохранять настройки отчета в своем формате и загружать из него. Также реализовать режим просмотра отчета.
Развитие темы: загрузка данных из SQLite
28. Библиотека для работы с HTML
Библиотека должна позволять загружать HTML-страницу в дерево элементов DOM.
Далее с помощью методов, аналогичных JavaScript, можно получать элементы или коллекции элементов.
Упрощение темы: без CSS-селекторов.
29. Моделирование НКА
Визуальный редактор для создания и моделирования недетерминированных конечных автоматов (НКА).
30. Библиотека для работы с графами
Базовые классы для вершины, ребра, ориентированного ребра с возможностью добавления информации в производном классе.
Граф содержит коллекцию вершин и коллекцию ребер. Методы графа - обход в глубину и обход в ширину,
получить коллекцию соседей указанной вершины.
В коллекции реализовать итератор, получение элемента по номеру.