Городская гимназия РЕФЕРАТ ПО ИНФОРМАТИКЕ НА ТЕМУ «ISO - Графический редактор на Delphi 5» Исполнитель: Федоровских Николай Павлович ученик 11 «Б» класса Руководитель: Чунтонова Ирина Юрьевна преподаватель информатики Новоуральск 2002 г. Оглавление. Введение… 3 Пользовательский интерфейс… 4
Возможности программы Инструменты…. 6 Эффекты…. 7 Другие возможности….…. 9 Аналоги… 9 Среда программирования…. 10 Структура программы… 10 Принципы графических алгоритмов … 13 Системные требования …. 15 Заключение…. 16 Список используемой литературы … 17 Введение. На сегодняшний день компьютерная графика неотъемлемая часть жизни современного общества.
Рекламные щиты, цветные журналы, спецэффекты в фильмах – всё это в той или иной мере имеет отношение к компьютерной графике. Либо это обработанные фотографии, либо от начала до конца созданные на компьютере изображения. Графический редактор – это компьютерная программа, предназначенная для обработки графики (фотографий, рисунков) или создания таковой, то есть для рисования. Существуют растровые и векторные графические редакторы.
Растровые редакторы предназначены для работы с растровыми (точечными) изображениями. Растры – это некая таблица, каждая клетка которой имеет свой цвет. Векторные редакторы предназначены для работы с векторными изображениями. Векторный рисунок – это рисунок, состоящий из отдельных объектов с заданными свойствами (позиция, вид и т. п.). Iso относится к растровым редакторам. Программа предоставляет пользователю различные инструменты
для создания и редактирования растровых изображений. Изначально, программа задумывалась как детский графический редактор, то есть для использования исключительно детьми. Отсюда и название 'ИЗО': Изобразительное искусство. Целью было создать интересную детям программу. По мере написания программы появлялось всё больше и больше разных эффектов (вращение, отражение, контрастность и т. д.), которые вряд ли будут интересны
детям, но полезны при работе с фотографиями. В результате цель создания программы стала звучать так: 'Создать небольшой графический редактор, который заменит стандартный Paintbrush Windows: будет превосходить его в возможностях, не уступая в простоте и эффективности Приложение рассчитано как на опытных пользователей, так и на новичков, как на детей, так и на взрослых: каждый найдёт здесь что-то для себя интересное в соответствии со своими потребностями.
Пользовательский интерфейс. Внешний вид программы предельно прост и понятен на интуитивном уровне. Все кнопки главного окна обладают так называемым домашним стилем (Flat style). То есть, при наведении курсора на кнопку она изменяет свой вид, что делает такую кнопку гораздо удобнее обычной. Вдобавок к этому, при наведении курсора на кнопку (или некоторый пункт меню) в первой панели строки состояния отображается название данного элемента управления.
Строка состояния расположена в нижней части окна. Она предназначена для отображения различной информации, которая может помочь пользователю. Например, при рисовании линии в ней показывается угол наклона, а при определении цвета с помощью пипетки в строке состояния показываются составляющие цвета под курсором: “RGB(255 255 255) – clWhite” (цвет раскладывается на RGB составляющие, то есть на красный(Red) зелёный(Green) и синий(Blue)).
Под главным меню расположена панель параметров рисования: При наведении курсора на любую из кнопок этой панели справа от кнопки появляется треугольник. После нажатия на него появляется панель с кнопками для выбора разных свойств. Если же просто нажать на саму кнопку, то свойство будет установлено в значение по умолчанию. В правой стороне окна находится панель инструментов.
Всего имеется 17 инструментов для рисования или работы с рисунком. В левой части окна расположена панель симметрии, на которой находятся кнопки задания разного стиля рисования для карандаша и кисти. В центре главного окна находится рабочая область. В левом верхнем углу рабочей области – сам рисунок или чистый лист. По краям рисунка (или выделенной области) расположено восемь маркеров для быстрого управления рисунком
при помощи мыши. Левый верхний маркер предназначен для вращения рисунка; центральный верхний – для горизонтального наклона; центральный левый – для вертикального наклона; остальные для изменения размеров рисунка. Вид окна можно настроить: скрыть или показать любую из панелей главного окна (пункт меню ‘Вид à …’), изменить цвет рабочей области или рисунка при запуске, отображать значок программы в виде кнопки или пиктограммы в панели задач Windows и др. (пункт меню ‘Вид à
Параметры…’). Все диалоговые окна, где требуется изменение числовых параметров (кроме окна задания пользовательской матрицы), снабжены бегунком (track bar) для изменения этих параметров, так что при работе с программой клавиатура почти не нужна. Так же в диалоговых окнах работы с рисунком имеется кнопка 'Применить то есть можно посмотреть результат действия эффекта, не закрывая окна. После закрытия главного окна программы создаётся файл (если это был первый запуск приложения на данном
компьютере или этот файл был удалён) 'Fe_Iso.ini' в папке Windows. Это файл инициализации, в который записывается различная информация о программе: размеры окна, цвет рабочей области и т. д. При очередном запуске окно программы предстаёт перед пользователем таким, каким оно было закрыто в последний раз. Возможности программы. Инструменты. Основное предназначение программы – это создание рисунков.
Для этого предназначены тринадцать инструментов, с помощью которых непосредственно можно рисовать фигуры: 1 Карандаш' (pencil) рисует ломаные толщиной в один пиксель (точку). 2 Кисть' (brush) предназначена для рисования линий разного стиля. 3 Прямая линия' (line) (название говорит само за себя). Тип и толщину линии можно менять с помощью соответствующих кнопок в панели параметров рисования (также
эти параметры действуют при построении других фигур). 4 Кривая линия' (curve line) строит кривые Безье по четырём точкам. Сначала нужно расставить четыре опорные точки, а затем, передвигая их в области рисунка, можно добиться желаемого результата. 5 Прямоугольник' (rectangle). 6 Многоугольник' (polygon) строится по нескольким точкам, соединённым прямыми линиями.
Для завершения рисования этой фигуры можно кликнуть (щёлкнуть мышью) в исходную точку, выполнить двойной щелчок по рисунку или просто выбрать другой инструмент. 7 Эллипс' (ellipse) вписывается в прямоугольную область. 8 Скругленный прямоугольник' (round rectangle) – прямоугольник с сопряженными углами. 9 Распылитель' (sprayer) использует четыре стиля, которые можно менять с помощью специальной кнопки
на панели параметров рисования. 10 Заливка цветом' (flood fill) заливает один цвет до встречи с другим цветом. 11 Текст' (text). После щелчка мышью по рисунку появляется окно для ввода теста. Левый верхний угол текста находится в месте щелчка. 12 Спираль' (spiral) рисуется по радиусу заданному линией (это единственная фигура, которая прорисовывается только после отпускания кнопки мыши). При выборе данного инструмента появляется панель для изменения
числа витков спирали. 13 Звезда' (star) образована делением двух окружностей (внутренней и внешней) на части. При выборе этого инструмента показывается панель для изменения свойств: можно изменить процентное отношение внутреннего и внешнего радиуса, изменять количество концов или вписать звезду в круг. Остальные инструменты являются вспомогательными: 14 Прямоугольное выделение' – выделение прямоугольной области рисунка для последующей работы с ней (создание
эффектов, перемещение, копирование, удаление и так далее). 15 Эллиптическое выделение' – выделение эллиптической области рисунка. 16 Произвольное выделение' области рисунка. 17 Пипетка' (color picker) – инструмент для определения цвета какого-либо пикселя рисунка для использования этого цвета. Всеми инструментами можно пользоваться, используя левую или правую кнопку мыши (обе одновременно использовать
нельзя). При рисовании с помощью левой кнопки мыши основной цвет используется как цвет границы фигуры или как цвет рисования (кисть, карандаш, линия и т. п.), а дополнительный как цвет заливки (прямоугольник, звезда и т. п.). При использовании правой кнопки – цвета используются наоборот (основной как дополнительный, а дополнительный как основной). Средняя кнопка мыши, если она есть, не используется. Тип заливки используется при рисовании замкнутых фигур и при заливке цветом.
Тип и толщина линий учитывается при рисовании, как замкнутых геометрических фигур, так и линий. При увеличенном масштабе можно использовать все инструменты и эффекты, но иногда возникают проблемы из-за скрытых ошибок. Тип симметрии используется при рисовании с помощью кисти или карандаша. При использовании какого-либо типа 'невидимым' карандашом или кистью рисуется тем же цветом и стилем симметричная линия (одна или три в зависимости от типа симметрии).
Хотелось бы отдельно отметить инструмент 'звезда так как, умело изменяя его свойства, можно превратить его в мощного помощника. Если внутренний радиус сделать 100% от внешнего, то можно рисовать различные правильные многоугольники, в зависимости от установленного числа концов звезды. А если внутренний радиус будет менее 100%, то рисуются невыпуклые многоугольники с равными сторонами, и чем больше концов у звезды, тем больше фигура походит на солнышко.
При внутреннем радиусе равным 0% рисуется окружность (если стоит опция 'вписать звезду в круг') поделённая на сектора. Эффекты. Графический эффект (graphic effect) – это определённое преобразование изображения. Либо это цветовое преобразование, либо деформация (перемещение пикселей), либо то и другое одновременно. В программе эффекты применяются для всего рисунка или для выделенной области (если таковая имеется). Работу эффекта трудно передать словами, поэтому ниже приводится список эффектов без их описания.
Названия говорят сами за себя. 1.Зеркальное отражение по горизонтали и по вертикали. 2.Поворот на 90°, 180°, 270° или на другой произвольный угол. 3.Растяжение. 4.Наклон по горизонтали и вертикали. 5.Блоки. 6.Линза. 7.Сжатие. 8.Разброс (иней). 9.Завихрение. 10.Пикселизация (мозаика). 11.Волны синусоидальные или трёхмерные (вид сверху).
12.Рыбий глаз. 13.Плазма. 14.Подсвеченный рельеф (источник света). 15.Тень (в разные стороны). 16.Morph фильтр (минимум, максимум, открытый, закрытый). 17.Негатив (инверсия). 18.Порог (черно-белый). 19.Шум. 20.Край (между основным и дополнительным цветом). 21.Рельеф. 22.Смягчение. 23.Авто-смягчение. 24.Смягчение. 25.Смазывание.
26.Резкость (чёткость). 27.Фильтр пользователя (матрица 5x5). 28.Замена на оттенки серого или другого цвета. 29.Замена составляющих цвета. 30.Замена основного на дополнительный цвет. 31.Фильтр HSL (оттенок, насыщенность, яркость). 32.Гамма. 33.Баланс составляющих цвета (RGB). 34.Яркость. 35.Соляризация. 36.Пастеризация. 37.Усилить или ослабить контрастность.
38.Общий и местный контраст. Фильтр пользователя – это изменение каждого цвета по определённой матрице. Пользователь может сам задать свою матрицу, а может выбрать из предложенного списка: 1.Край. 2.Рельеф. 3.Смягчение. 4.Резкость. 5.Наклонное смазывание. 6.Радужный край. 7.Подтёкшие грани. 8.Скошенные грани. 9.Ветер. 10.Старый телевизор. 11.Сломанный телевизор.
12.Духи. 13.Полосы (русский сломанный телевизор). Другие возможности. Помимо всего прочего, в программе существует возможность подсчета всех цветов, просмотра, очистки и изменения размеров рисунка. Можно: отменять последние действия или повторять отменённые; копировать, вырезать, удалять или сохранять в файле выделенную область рисунка; вставлять рисунок из файла или буфера обмена. Открывать изображения можно из файлов следующих форматов: точечный рисунок
(*.bmp); Windows Metafile (*.wmf; *.emf); JPEG (*.jpg; *.jpeg). Сохранять рисунок можно в форматах BMP (24 bit) и JPEG. Аналоги. Аналогичные программы естественно существуют: CorelDraw (Photo-Paint), Photoshop, Corel Painter, Gimp, Jasc Paint Shop Pro и т. д. Все они имеют неплохие средства создания рисунков и множество эффектов.
Но, наряду с этим, они имеют большой размер (CorelDraw занимает около 300 МБ; Photoshop более 100 МБ), требуют установки и, в конце концов, стоят немалых денег (за некоторым исключением, вроде Gimp). Так же для работы с этими приложениями необходимы определённые знания и умения, что делает их почти бесполезными в руках неопытных пользователей. XnView – бесплатная небольшая программа (в дистрибутиве 1,23
МБ) для просмотра (и редактирования) файлов различных форматов. Для редактирования изображений она предоставляет пользователю множество эффектов, многие из которых идентичны эффектам программы Iso. Но, в отличие от Iso, XnView не располагает инструментами для создания рисунков. Iso не требует установки и находится в одном файле
Iso.exe. Paintbrush – стандартный графический редактор, входящий в пакеты операционных систем семейства Windows. Paintbrush один из самых простых и надежных редакторов. Эту программу изучают в школе. Но в то же время Paintbrush популярен в основном у пользователей дошкольного и школьного возраста из-за своей простоты и ограниченности в возможностях. Iso является 'потомком' Paint, т. к. очень похож на него и внешним видом, и некоторыми возможностями,
и названиями пунктов меню. Редактор Iso обладает множеством полезных возможностей, которых нет в Paint, сохраняя малый размер (около 630 КБ), быстроту и простоту в использовании. Но, вместе с тем, Iso кое в чём уступает Paint: нет возможности печати, нет файла справки, меньшая надёжность (могут возникнуть ошибки), отсутствие сетки при масштабировании и т. п. Среда программирования. Программа Iso написана в среде программирования
Delphi 5 Enterprise компании Borland, на языке Object Pascal. Object Pascal – это объективно-ориентированный язык программирования, который и является основой Delphi. Он относится к языкам высокого уровня. Его родоначальник – язык Pascal. Delphi – это визуальная среда программирования (Rapid Application Development – RAD), которая включает в себя помимо компилятора ещё и редактор, и средства
отладки, и большие наборы готовых программ (так называемые библиотеки), например наборы математических функций. RAD-системы позволяют также быстро строить прототипы будущих программ: проектировать форму окон, размещать в них всевозможные элементы управления (кнопки, списки, переключатели). С помощью Delphi 5 можно разработать приложение для Windows практически неограниченной сложности. Такая разработка несколько напоминает складывания программ
из кубиков: в Delphi 5 имеется около двух сотен готовых компонентов, которые размещаются в будущем окне одним щелчком мыши. Это значительно облегчает жизнь программистам: не нужно тратить много времени на создания интерфейса программы, а уделить внимание главному – функционированию. Но за такое удобство приходится платить: минимальные размер программы созданной с помощью RAD составляет около 286 КБ, а без использования визуального программирования – »17
КБ. На сегодняшний день работа в Delphi является самым продуктивным методом создания приложений для Windows. Структура программы. Весь исходный текст программы очень большой (»10000 строк), поэтому он размещён в разных файлах, каждый из которых играет определённую роль в построении приложения. Основой всей программы является главное окно программы (класс TMainForm; файл MainFrm.pas). На нем расположены все панели инструментов, строка состояния, меню и сама
область рисования, расположенная в рабочей области прокрутки. Некоторые элементы управления – это стандартные компоненты Delphi (TMainMenu, TScrollBox, TScrollBar и т. д.), другие же – это переделанные компоненты (TFeSpeedButton, TFePanel, TFeStatusBar) с целью уменьшить размер исполняемого файла, третьи – это специальные компоненты (TFePaint, TFePropsButton, TColorPickerButton), созданные на основе базовых классов
Delphi. Ядром программы, отвечающим за создание и преобразование рисунков, является класс (компонент) TFePaint. Именно этот класс обрабатывает все действия мыши в области рисования, именно он организует взаимодействие пользователя и программы, связанные с рисованием и созданием эффектов. TFePaint является дочерним классом от TCustomControl, так как является владельцем для других классов (TFeImage, TSelectImage, TPut). Он имеет свойство DrawMethod типа
TDrawMethod, которое указывает на инструмент, выбранный пользователем (dmPen, dmLine, dmEllipse, dmRectSelect). Изменение значения этого свойства происходит следующим образом: при запуске программы свойству Tag(этикетка) каждой кнопке на панели инструментов присваивается определённое значение: PenBtn.Tag := Integer (dmPen); LineBtn.Tag := Integer (dmLine); При нажатии на кнопку вызывается обработчик события общий для всех кнопок на данной панели: procedure
TMainForm.SpeedBtnClick(Sender: TObject); begin MainRis.DrawMethod := TDrawMethod(TFeSpeedButton(Sender).Tag); end; Таким образом, нет необходимости создавать для каждой кнопки собственный обработчик щелчка мыши. Всё делается с помощью преобразования типов. Тот же способ применён и по отношению к пунктам меню, так как в противном случае код оказался бы очень большим и однообразным, потому что пунктов меню очень
много. Но в данном случае не присваивается значений какому-либо свойству, а вызывается специальная процедура: procedure TMainForm.MenuClick(Sender: TObject); begin MainRis.Doing(TDrawAction(TMenuItem(Send er).Tag)); end; … procedure TFePaint.Doing(const Action: TDrawAction); var Fon, AGrid: Boolean; UCount: Byte; Size: TPoint; Bmp: TBitmap; begin if not
GetCan(Action) then Exit; Ended; case Action of daClear: begin CanChangeImage; ClearImage; ChangedImage; end; daCopyToFile: Save(True, False); … end; end; Нестандартный способ решения задачи применён и к алгоритму отмены и повтора действий пользователя. Создан специальный класс TBmpMemory, который хранит изображения в памяти. После каждого действия, будь то рисование прямоугольника
или увеличение контрастности, изображение сохраняется в отдельной ячейке (Cell) динамического массива, длина которого равна числу возможных отмен + 1. Данный массив представляет собой двусвязный список. Тип каждой ячейки определён следующим образом: PBitmapCell = ^TBitmapCell; TBitmapCell = record NextCell: PBitmapCell; // указатель на следующую ячейку PrevCell: PBitmapCell; // указатель на предыдущую ячейку
Bitmap: TBitmap; end; Таким образом, каждый элемент списка имеет указатель на предыдущий и на следующий элемент. Указатель PrevCell первой ячейки указывает на последнюю, а указатель NextCell последней ячейки указывает на первую ячейку. Получается замкнутое кольцо без входа и выхода. Это сделано по той причине, что после отмены действия, для восстановления требуется то изображение, которое было отменено.
Например: пользователь нарисовал круг, а затем линию. В первой ячейке записано изображение, которое было до рисования круга, во второй – после рисования круга, а в третьей – после рисования линии. После отмены последнего действия указатель перемещается на предыдущую ячейку (ячейка с кругом, но без линии): procedure TBmpMemory.Undo(Bitmap: TBitmap); begin if CanUndo then begin
Dec(FNumUndo); //уменьшаем число возможных отмен Bitmap.Assign(FActiveCell^.Bitmap); //передаём изображение с активной ячейки FActiveCell := FActiveCell^.PrevCell;//переносим указатель на предыдущую ячейку end; end; Если же пользователь передумал и решил вернуть нарисованное, то он может вызвать повтор последнего отменённого действия (если после отмены ничего не было сделано): procedure
TBmpMemory.Redo(Bitmap: TBitmap); begin if CanRedo then begin Inc(FNumUndo); //увеличиваем число возможных отмен FActiveCell := FActiveCell^.NextCell; //переносим указатель на следующую ячейку Bitmap.Assign(FActiveCell^.NextCell^.Bit map); //передаём изображение //со следующей после активной ячейки, т. к. активная ячейка та, //которая должна быть отменена end; end;
Вся программа построена на основе большого количества классов, каждый из которых отвечает за отдельную функцию. Это помогает локализовать, разбить по частям всю программу, а не создавать огромные процедуры, обработчики событий, что, конечно же, идет на пользу и является подтверждением преимуществ объективно-ориентированного метода программирования. Принципы графических алгоритмов. Поскольку программа является растровым (точечным) редактором, то изображение находится в виде объекта
графического класса TBitmap и работа всех эффектов основана на работе с этим классом. TBitmap содержит двумерный массив, в каждой ячейке которого записан определённый цвет. То есть мы имеем дело с двумерной (плоскостной) системой координат: каждая точка рисунка описывается двумя координатами, например (45, 87). Доступ к определённой точке можно получить двумя способами: через свойство Canvas.Pixels[x, y] (x и y – координаты точки), которое имеет тип
TColor, или с помощью свойства ScanLine[y], которое возвращает указатель на начало строки под номером 'y Первый способ работает гораздо медленнее второго, поэтому он почти не используется, хотя и более удобен. Каждый цвет (в компьютерном представлении) состоит из трёх оттенков: красного (red), зелёного (green) и синего (blue) – RGB. При этом каждый из оттенков может принимать значения от 0 до 255, то есть, всего компьютер (монитор) может отображать 256*256*256=16777216 разных цветов.
Все функции и процедуры, имеющие отношение к созданию эффектов, находятся в файле FeProcs.pas, который занимает »69 КБ, так как этих функций очень много. Рассмотрим пример реализации эффекта 'Негатив': type TRGB = record B, G, R: Byte; end; pRGB = ^TRGB; procedure InvertBitmap(Bitmap: TBitmap); var x, y: Integer; Dest: pRGB; begin for y := 0 to
Bitmap.Height - 1 do begin Dest := Bitmap.ScanLine[y]; //помещаем указатель в начало строки y for x := 0 to Bitmap.Width - 1 do begin with Dest^ do begin R := 255 - R; //чтобы обратить цвет, G := 255 - G; //нужно обратить на противоположные B := 255 - B; //его составляющие end; Inc(Dest); //перемещаем указатель вправо end; end; end; Цикл начинается с 0 и заканчивается на Bitmap.Height – 1 (Bitmap.
Width – 1), так как в системе координат Windows отсчёт начинается с точки (0, 0), а точки (Width – ширина, Height – высота) не существует. Внешний цикл проходит по порядку все строки (координата Y), потомучто свойство Bitmap ScanLine передаёт указатель на строку, а не на столбец. Интересной (с точки зрения программирования) является функция подсчёта цветов рисунка: function HowManyColors(Bitmap: TBitmap): Integer; var i: Byte; x, y:
Integer; Dest: pRGB; RGBArray: array [Byte, Byte] of array of Byte; begin Result := 0; for y := 0 to Bitmap.Height - 1 do begin Dest := Bitmap.ScanLine[y]; for x := 0 to Bitmap.Width - 1 do begin with Dest^ do if RGBArray[r, g] <> nil then for i := 0 to High(RGBArray[r, g]) do begin if RGBArray[r, g] [i] = b then
Break; //такой цвет уже есть – выход из цикла if i = High(RGBArray[r, g]) then begin //если это последний 'круг' цикла, то //такого цвета нет и его нужно записать Inc(Result); //прибавляем еще один цвет SetLength(RGBArray[r, g], Length(RGBArray[r, g]) + 1); RGBArray[r, g] [High(RGBArray[r, g])] := b; end; end else begin Inc(Result); //прибавляем еще один цвет SetLength(RGBArray[r, g],
1); RGBArray[r, g] [0] := b; end; Inc(Dest); end; end; end; Изначально, для решения задачи подсчёта цветов применялся следующий алгоритм: использовалась глобальная переменная, которая являлась трёхмерным массивом - «ColorsArray: array [0 255, 0 255, 0 255] of Boolean», то есть имел для каждого существующего цвета отдельную ячейку типа Boolean – всего 16777216 ячеек; в начале функции значения всех ячеек устанавливались в
False (ложный), это означало, что нет ни одного цвета; затем цвет каждой точки разлагался на составляющие R, G и B, и проверялось значение соответствующей ячейки - «ColorsArray[R, G, B]», если оно было ложным, то изменялось на True (истинный), а количество цветов рисунка увеличивалось на один. Но, естественно, такой подход крайне иррационален, так как компилятор не позволяет выделять так много памяти внутри процедуры, а выделение 16 Мбайт памяти при загрузке тормозит не только саму
программу, но и другие процессы системы. По этой причине пришлось отказаться от такого решения и разработать новый алгоритм, что и было сделано. Функция, реализующая новый подход изложена выше, а сам он заключается в динамическом выделении памяти. Переменная RGBArray – это двумерный массив, каждая ячейка которого, в свою очередь, является динамическим массивом типа Byte (0 255). Фактически изначально вообще не выделяется памяти, она выделяется по мере увеличения числа
цветов. Системные требования. Микропроцессор – Pentium 100 и выше. Оперативная память – 16 Mb RAM. Операционная система – Windows 9x/Me. Свободное место на диске – 1 Mb. Аппаратное обеспечение – мышь.
! |
Как писать рефераты Практические рекомендации по написанию студенческих рефератов. |
! | План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом. |
! | Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач. |
! | Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты. |
! | Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ. |
→ | Виды рефератов Какими бывают рефераты по своему назначению и структуре. |