реферат, рефераты скачать Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
реферат, рефераты скачать
реферат, рефераты скачать
МЕНЮ|
реферат, рефераты скачать
поиск
Из опыта создания универсальных тестовых редакторов

Из опыта создания универсальных тестовых редакторов

Предисловие.

Как известно, в настоящее время наиболее распространенными

алгоритмическими языками являются Паскаль и Си. Именно эти языки

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

супер-ЭВМ до персональных компьютеров. Что касается ПЭВМ, то лидером

семейства языков Паскаль для них, без сомнения, является Турбо Паскаль 7.0,

разработанный фирмой Borland. Эта последняя версия позволила объединить в

рамках единой системы мощный алгоритмический потенциал языка, методы

объектно-ориентированного программирования, современную графику, удобные

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

интерфейс с пользователями.[1] Поэтому я выбрал этот язык программирования

как основу для создания тестового редактора.

Я решил создать тестовый редактор, потому что именно тесты в последнее

время завоевывают все большую популярность. Они позволяют быстро и довольно

точно проверить уровень знаний по тому или иному предмету, узнать ту или

иную информацию о тестирующемся. Конечно, тест без труда можно составить

вручную, но потребуется много времени, чтобы его размножить. Кроме того,

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

Разрабатывая программу шаг за шагом, я выделил основные функции,

присутствующие в любом редакторе и, конечно, в моем, а именно:

1. создание нового файла теста

2. открытие теста и тестирование

3. редактирование теста

4. просмотр результатов

5. печать файла

6. выход из программы.

В процессе создания редактора я выделил основные этапы моей работы,

возникающие в связи с этим задачи и их решение. Надеюсь, прочитав мою

работу, вы учтете мой опыт и продолжите начатые исследования в области

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

качестве пособия для создания тестов.

Начнем исследование со статьи о конструировании программ.

Конструирование программ.

Конструирование программ - один из важнейших разделов современной

информатики. Бурное развитие программно-аппаратных средств, появление новых

стилей и технологий программирования, как ни парадоксально, не снижают, а

повышают уровень требований к массовой алгоритмической культуре.

Практически все диалоговые системы являются программируемыми. Методика

конструирования программ легко переносится на другие процедурные языки

программирования, в том числе и объектно-ориентированные.[2]

В соответствии с технологией конструирования программ построена

программа тестового редактора. Я разделил ее на этапы:

1. Создание структурной программы, во многом неудобной в использовании из-

за отсутствия диалога, упорядоченного ввода и вывода информации и многого

другого. Исходная программа имела лишь основные функции. Она была

«ядром», осуществлявшим все процессы и функции редактора. В следующей

главе в точности приведен текст структурной программы.

2. Разбиение сплошного текста программы на процедуры. Таким образом, текст

стал занимать не так много места, исчез оператор варианта, многие метки,

ссылки и т. п. Надо сказать, многие программисты предпочитают вводить

процедуры в программу. Это значительно упрощает ее.

3. Введение оконной системы с помощью доступных возможностей языка

(оператор Window). Это позволило значительно упростить работу, создать

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

поступающей к пользователю и количество ее «потоков».

4. Введение объекта- панели управления. Вы можете видеть ее внизу экрана.

Она взяла на себя управление функциями редактора. Причем введение объекта

значительно упростило программу. Методы работы с объектами вы можете

прочитать в главе «Объектное программирование».

5. Оформление работы

Структурное программирование.

Структурное программирование- это программирование, технология которого

предполагает использование суперпозиции трех базовых алгоритмических

структур: линейной, разветвленной и циклической. Но для создания сложных

программ используются более сложные принципы. Принцип Суперпозиции-

сочетание структур со взаимным вложением (сложением). Предусматривает

взаимное включение структур.

Турбо Паскаль способствует внедрению современной технологии

программирования, основанной на принципах структурного программирования и

пошаговом методе проектирования программ. Основные операторы языка являются

хорошей иллюстрацией базовых управляющих конструкций структурного

программирования. Их использование позволяет записывать сложные алгоритмы

обработки данных в компактной форме.[3]

Хотя Бейсик не является полностью структурным языком, в нем отражены

основные концепции структурного программирования. рассмотрим их подробнее.

Бейсик- язык программирования ПЭВМ.

Бейсик - диалоговый язык высокого уровня, ориентированный на

пользователей ПЭВМ, непрофессионалов в области вычислительной техники.

Бейсик - преимущественно интерпретирующая программа, позволяющая

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

удобнее для начинающих программистов, нежели компилирование (компилятор

производит отладку только целой программы, а не по частям), и широко

используется в Паскале. Отличительной чертой структурных языков являются

краткие однозначные операторы (в отличие от длиннейших команд объектного

программирования)*.

В некоторых версиях Бейсика имеется встроенный редактор программ,

позволяющий работать с текстом программы из командного окна. Работа с

программой осуществляется в трех различных режимах:

. Непосредственное общение

. Ввод программ

. Вычисление по введенной в ОЗУ программе

В основном, Паскаль выполняет те же функции что и Бейсик. Однако Паскаль

имеет больший потенциал в областях програмимирования, работы с

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

Структурная программа.

Первым этапом разработки программы стало написание текста структурной

программы. Структурная программа- последовательность простых команд,

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

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

отдельными частями программы, реализующими функции редактора, я использовал

оператор безусловного перехода GoTo.

Ниже приведена схема структурной программы тестового редактора,

объясняющая соответствующий подход к программированию. Основной список

операторов вырезан и заменен на . Конечный вид программы

будет приведен в главе “Объектное программирование” объектов.

Program redactor;

uses crt,printer; {подключение модулей}

label l1,l2,l3,l4; {метки}

Var a,f,f1,a2:string; {раздел описаний}

b,k:char;

c,u,y,a1,b1:text;

d,e,i,j,p,z:integer;

c1:boolean;

Procedure oform; {процедура оформления начала программы}

Begin

End;

Begin

oform; {оформление начала программы}

Writeln('Новый файл(New),Открыть файл(Open),Редактирование(Redact),');

{вывод

альтернативных функций}

Writeln('Просмотр результатов(Search),Выход(Any key)');

b:=readkey; {выбор нужной функции}

case b of {оператор варианта}

По нажатию соответствующей клавиши происходит выбор функции.

'n','в':Begin

l1: {выполнение функции}

End;

'o','й':Begin

l2: {выполнение функции}

End;

'r','Є':Begin

l3: {выполнение функции}

End;

's','ы':Begin

l4: {выполнение функции}

End;

End;

Writeln('Новый файл(New),)Открыть файл(Open),Редактировать(Redact)');

{запрос о выборе перед

выходом}

Writeln('Просмотр результатов(Search),Выход(Any key)');

b:=readkey; {выбор варианта}

case b of {оператор варианта}

'n','т':GoTo l1; {ссылка на метку}

'o','щ':GoTo l2;

'r','к':GoTo l3;

's','ы':GoTo l4;

End;

Набор операторов безусловного перехода для возвращения к той или иной

функции.

End.

На экран выводится список возможных функций программы. Для выбора

определенной функции необходимо нажать соответствующую клавишу (указана в

скобках заглавной буквой). Затем оператор варианта запускает нужную

функцию. Как видно, учтен случай непереключенного алфавита (буквы вводятся

как латинские, так и русские).

Перед выходом вновь выводится данный запрос (так как цикл неуместен) и в

случае выбора определенной функции происходит ссылка на функцию.

Интерфейс структурной

программы

Доработка программы.

После отладки начальной программы потребовалось ввести дополнительные

функции. Помимо стандартной функции создания и открытия готового теста,

появились такие как редактирование тестов, подсчет результатов и

выставление оценки, таймер, составление отчета, защита тестов от просмотра.

Но самое главное- это усовершенствование интерфейса, введение оконной

диалоговой системы.

Рассмотрим перечисленные функции. Функция подсчета результата записана

так:

z:=p*100 div z; {расчет количества правильных ответов}

Writeln('количество правильных ответов: ',p);

Write('оценка '); {выставление оценки}

If z>=90 Then Begin

Writeln('5')

Writeln(b1,’5’);

End;

else If z>=70 Then Begin

Writeln('4')

Writeln(b1,’4’);

End;

else If z>=40 Then Begin

Writeln('3')

Writeln(b1,’3’);

End;

else Begin

Writeln('2')

Writeln(b1,’2’);

End;

Readln;

Write('Фамилия: '); {вписывание фамилии}

Readln(a);

d:=length(a); {выставление пробелов}

Write(b1,a); {запись в файл}

For i:=1 to 14-d do Write(b1,' ');

Write('Имя: '); {вписывание имени, процедура повторяется}

Readln(a);

Write(b1,a);

d:=length(a);

For i:=1 to 11-d do Write(b1,' ');

Write('Отчесчтво: '); {вписывание отчества, процедура повторяется }

Readln(a);

Write(b1,a);

d:=length(a);

For i:=1 to 17-d do Write(b1,' ');

Write(b1,f);

d:=length(f);

For i:=1 to 8 do Write(b1,' ');

GetDate(g1,g2,g3,g4); {проставление даты}

Writeln(b1,g3,'.',g2,'.',g1);

close(b1);

Window(15,10,50,19);

TextBackGround(black);

clrscr;

Программа рассчитывает количество правильных ответов по формуле, в

соответствии с этим выставляет оценку, спрашивает ваши ФИО, записывает их в

файл, проставляет название теста и дату его прохождения. При этом

используется метод работы со строками: конкатенация(слияние) строк.

Проблемой стало корректное вписывание в файл строки, так как количество

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

данными, используя данные о длине строк фамилии, имени, отчества и вычитая

их из постоянного числа

Таймер, системное время.

Таймер был разработан для отсчета времени на тест, время вводится

предварительно составителем теста. Кроме того, параллельно с выводом

времени на тест выводится текущее системное время. Действие таймера

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

времени уменьшает свое значение на 1(секунду). Системное время выводится

благодаря процедуре GetTime.

Repeat {цикл счетчика времени}

Window(60,20,70,21); {окно вывода времени}

TextBackGround(black);

clrscr;

z2:=z2-1; {обратный отсчет секунд}

If z22 Then Begin{проверка наличия в файле пароля}

Write('введите пароль ');

Readln(f); {ввод пароля}

If a<>f Then Begin

Write('пароль неверный');

GoTo l1; {выход из процедуры}

End;

End

else Begin

close(u);

Reset(u);

End;

Readln(c,f);

Writeln('тест по теме "',f,'"'); {вывод темы теста}

z2:=60;

repeat

Window(60,20,70,21); {закрытие окна пароля}

TextBackGround(black);

clrscr;

TextColor(yellow);

z2:=z2-1; {включение таймера}

If z2'&') do Begin

Read(c,b);

If b<>'&' Then Write(b);

End;

Writeln;

Window(55,10,80,15); {вывод сообщения о вводе ответа}

TextBackGround(blue);

clrscr;

Write('ваш ответ ');

TextColor(yellow);

repeat{таймер}

Window(60,20,70,21);

TextBackGround(black);

clrscr;

z2:=z2-1;

If z2

End;

Единственной проблемой здесь явилось неправильное чтение программой

исходных данных. Естественно, разрабатывая сложные системы, с первого раза

компилляция не удается никогда, но после корректировки программы она стала

работать как надо.

!!! Не забывайте закрывать файлы после использования и перезагружать их

после прочтения до конца по необходимости, иначе возникнет ошибка Disk Read

Error!!!

Эта ошибка может стоить вам всего файла. Очень часто после сбоя при чтении

файла этот файл заново прочитать вам не удастся.

Функция редактирования теста. Является вспомогательной функцией. Она

редактирует вопросы указанного теста. Сначала вводится путь к файлу теста,

затем он просматривается, выбирается вопрос для редактирования, вводится

номер редактируемого вопроса. Затем указанный вопрос стирается, а на его

место вписывается новый. Весь процесс сопровождается работой с файлами,

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

Старые варианты файлов удаляются, а новые записываются под их именем:

Procedure RedactF;

Begin

Window(10,10,53,15);

TextBackGround(black);

TextColor(black);

clrscr;

Window(20,10,66,15); {открытие начального окна}

TextBackGround(blue);

clrscr;

Writeln('Какой файл редактировать ');

Readln(a); {ввод пути к редактируемому файлу }

a2:=a;

Window(20,10,66,15); {закрытие начального окна}

TextBackGround(black);

clrscr;

Assign(c,a); {связь переменной с файлом вопросов}

a:=a+'o'; {изменение расширения}

Assign(u,a); {связь переменной с файлом ответов}

delete(a,length(a),1);

a:=a+'1'; {изменение расширения}

Assign(y,a); {создание нового файла вопросов}

delete(a,length(a),1);

a:=a+'2'; {изменение расширения}

Assign(a1,a); {создание нового файла ответов}

Reset(c); {установка и загрузка файлов}

Reset(u);

Rewrite(y);

Rewrite(a1);

Window(5,5,50,20); {окно просмотра файла}

TextBackGround(lightgray);

clrscr;

Writeln('Вывод вопросов через Enter:');

repeat

while not Eoln(c)or(b<>'&') do Begin {просмотр вопросов через

Enter}

Read(c,b);

If b<>'&' Then Write(b);

End;

Readln(c);

Readln;

until EOF(c);

close(c); {перезапуск файла вопросов}

Reset(c);

Window(5,5,50,20); {закрытие окна просмотра файла}

TextBackGround(black);

clrscr;

Window(30,5,58,10); {окно номера редактируемого вопроса}

TextBackGround(yellow);

clrscr;

Read(c,b); {считывание количества вопросов}

Readln(c,b);

d:=ord(b)-ord('0');

Write('№ редактируемого вопроса: ');

repeat

Readln(z); {ввод № вопроса}

If z>d Then Writeln('номер превышает число вопросов'); {проверка

существования номера}

until z=object

End;

После объявления объекта к нему пишутся процедуры (методы). Название

процедуры состоит из двух частей: имени объекта и имени процедуры:

.

Объектная программа.

Объектная программа- это последняя важная стадия разработки программы: в

нее внедряется панель управления, что значительно облегчает диалог с

системой и делает функции программы более доступными. Как видно из

предыдущей главы, функции программы в структурном виде находятся в

операторе варианта case, а выбор функции происходит нажатием клавиши.

Создавая объектную программу, я лишь перенес функции из оператора

варианта в процедуры объекта и связал их между собой.

Новый объект- панель управления под именем panel имеет одно поле-

координату синего прямоугольника, который перемещается по панели

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

перемещении создается засчет точного соответствия текста в окне и текста на

панели управления. Панель имеет процедуры перемещения прямоугольника

выбора, которые уменьшают и увеличивают его координату в соответствии с

нажатыми клавишами. А также есть процедура выбора, при нажатии клавиши

Enter управление передается ей. Она в свою очередь определяет по координате

окна какую функцию необходимо запустить в данный момент.

Этапы разработки объекта Панель Управления:

1. Определение ключевого поля перемещения окна

2. Определение процедур работы с окном

3. Определение пропорций окна панели управления

4. Рисование панели управления

5. Написание процедур работы с окном выбора

6. Установка связей между функциями и объектом

7. Отладка объекта

Программный код.

Program redactor;

uses crt,printer,dos;

type panel=object {объявление объекта}

x:integer; {поле объекта}

Procedure left(b:char); {описание процедуры сдвига влево окна выбора}

Procedure right(b:char); { описание процедуры сдвига вправо окна

выбора }

Procedure choose; { описание процедуры выбора функции }

End;

Var a,f,f1,a2:string; {описание всех программных переменных}

b,k:char;

c,u,y,a1,b1:text;

d,e,i,j,p,z,z1,z2:integer;

c1:boolean;

g:panel;

g1,g2,g3,g4,h:word;

Procedure panel.left; {процедура сдвига влево окна выбора}

Begin

Window(x,22,x+9,22); {закрашивание следующего окна}

TextBackGround(green);

clrscr;

Закрашивание следующего окна- важная функция. Она закрашивает то синее

окно, которое было выбрано перед обращением к процедуре.

Window(10,22,69,22); {основное окно панели управления}

TextBackGround(green);

clrscr;

TextColor(brown); {установка цвета текста}

Write('Новый Открыть Править Результат Печать Выход');

{нанесение надписи на панель

управления}

If x>=20 Then x:=x-10; {проверка соответствия окна выбора границам

панели управления}

Этот оператор производит сравнение координат окна выбора с координатами

начала панели управления. Если окно выбора “выехало” за границы панели

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

своем месте.

Window(x,22,x+9,22); {рисование окна выбора}

TextBackGround(blue);

clrscr;

case x of {выбор надписи на окне выбора}

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

него вписать.

10:Begin

TextColor(green);

Write('Новый');

End;

20:Begin

TextColor(green);

Write('Открыть');

End;

30:Begin

TextColor(green);

Write('Править');

End;

40:Begin

TextColor(green);

Write('Результат');

End;

50:Begin

TextColor(green);

Write('Печать');

End;

60:Begin

TextColor(green);

Write('Выход');

End;

End;

End;

Procedure panel.right; {процедура сдвига окна выбора вправо}

Begin

Window(x,22,x+9,22); {закрашивание предыдущего окна}

TextBackGround(green);

clrscr;

Window(10,22,69,22); {рисование окна панели управления}

TextBackGround(green);

clrscr;

TextColor(brown); {изменение цвета текста}

Write('Новый Открыть Править Результат Печать Выход');

{нанесение текста на панель управления}

Вы, конечно, заметили, что операторы предыдущей и этой процедуры

повторяются, поэтому их можно вынести в отдельную процедуру и запускать ее

для обновления окна панели управления.

If x {функции тестового редактора}

Procedure panel.choose; {процедура выбора функции}

Begin

case x of {по координате окна выбора определяет нужную функцию}

10:NewF;

20:OpenF;

30:RedactF;

40:SearchF;

50:PrintF;

60:b:='e';

End;

End;

Вывод: Как видно, основную функцию управления взял на себя объект.

Благодаря этому действие программы значительно упростилось, программа стала

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

Оформление программы.

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

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

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

используют элементы работы с цветом фона и текста.

Procedure oform;

Begin

TextBackGround(green); {установка цвета фона}

clrscr;

TextColor(red); {цвет текста}

GoToXY(20,10); {перевод курсора в нужную позицию}

Write('Редактор Тестов'); {вывод текста}

TextColor(darkgray); {цвет текста}

GoToXY(20,12);

Writeln('автор: Цыбин Антон'); {вывод текста}

GoToXY(20,14);

Writeln('составлено 09.05.2000'); {вывод текста}

TextColor(white); {цвет текста}

GoToXY(20,16);

Writeln('нажмите клавишу'); {вывод текста}

Readln;

TextBackGround(black);

clrscr;

End;

Begin

Программа рисует титульный лист разноцветными буквами.

Основная программа.

Реализует действие всей программы, здесь сходятся все процедуры, объекты,

функции, но ее действие крайне просто: сначала запускается оформление,

затем системное время, а затем управление передается объекту или его

методам. По завершении работы программа закрывает все окна и «сворачивает»

работу программы.

g.x:=10;

oform; {оформление}

TextColor(green);

GoToXY(30,1);

Writeln('ТЕСТОВЫЙ РЕДАКТОР. V 1.01.'); {вывод информации}

GoToXY(23,2);

Writeln('составитель: Цыбин Антон (09.05.2000)');

pannel;

repeat

Window(60,24,70,24);

TextBackGround(black);

clrscr;

repeat {время}

h:=g3;

GoToXY(50,22);

GetTime(g1,g2,g3,g4);

TextColor(yellow);

Write(g1,':',g2,' ',g3);

Delay(1000);

clrscr;

until keypressed;

b:=readkey; {считывание клавиши}

По нажатию клавиши программа определяет дальнейшие действия (передача

управления объекту)

case b of

'1':g.left(b);

'3':g.right(b);

'0':Begin

Window(10,10,53,15);

TextBackGround(blue);

clrscr;

g.choose;

End;

End;

until b='e';

Window(10,10,53,20); {закрытие всех окон}

TextBackGround(black);

clrscr;

Window(10,10,80,15);

TextBackGround(black);

clrscr;

Window(30,10,35,12);

TextBackGround(red);

clrscr;

TextColor(blue);

Writeln('конец!');

Readln;

End.

Программа запускает методы панели управления в соответствии с нажатой

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

Заключение: Тенденции развития программных технологий.

Вы прочитали реферат и ознакомились с принципами действия отдельных

процедур, функций и всей программы в целом. Кроме того, вы поняли разницу

между структурным и объектным подходами к программированию. Что касается

структурных языков, о них сказано и написано почти все, но немногие знакомы

с объектами. Поэтому я посвящаю заключение этой теме.

В последние несколько лет начал создаваться новый подход к

программированию, названный объектным. Объекты стали вводиться и в язык

Pascal, который позже был назван Object Pascal. Сам объект построен по

принципу, объясняющемуся в главе «Объекты». Их преимущество заключается в

принципе наследования, когда один созданный объект способен породить

родственный ему объект-потомок. Многие объекты могут использовать друг

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

были созданы свойства, использующие методы. В частности, в Delphi свойства

выносятся в Инспектор объектов, что делает работу с ними похожей на детскую

игру. Теперь, чтобы написать программу, не надо возиться с кучей переменных

и операторов. Программист может даже и не видеть текста самой программы,

конструируя сразу ее внешний вид на форме. Таким образом, если на создание

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

В связи с переходом на объектные концепции, новые программы возникают на

основе уже имеющихся объектов. Некоторые языки программирования написаны на

основе объектов. Расширяется и пространство применения объектов, если они

возникли в среде MS-DOS, то теперь, используя объекты, можно с легкостью

создать текстовый редактор типа WORD или СУБД типа ACCESS. И, естественно,

в такой среде можно создать мощный и удобный редактор тестов.

Но я только приступаю к изучению Delphi и не могу написать подобный

редактор в той среде. Но и описанная здесь программа не останется в таком

виде. В перспективе внедрение мышки и управление программой с ее помощью. Я

уже знаю, как это осуществить, и использую мышь в ряде своих программ.

К программе недавно мной был написан кодировщик информации. Он

универсален в применении к файлам, т. е. можно зашифровать любой файл и ни

одна программа не сможет его прочитать. Расшифровать файл вы сможете

используя тот же редактор, совершая те же действия. Вам требуется лишь

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

программа сделает все за вас, включая расчет времени, необходимого для

шифрования. Используйте его по вашему усмотрению для шифрования текстов

тестов.

Список использованной литературы:

1. Учебник по Turbo Pascal 7.0 1998г.

2. Учебник по Delphi 5 (Дарахвелидзе, Котенок, Марков) 2000г.

3. Журнал «Информатика и Образование» №1 1998г. статья Г. Н. Гутмана

«Неисчерпаемый Фортран»

4. Журнал «Земля и Вселенная» №2 1998г. статья В. П. Дьяконова «Бейсик-

язык программирования ПЭВМ»

5. Журнал «Информатика и Образование» №8 1999г. статья В. И. Курганского

«Конструирование программ»

6. Интерактивный учебник по Delphi, аннотированные ссылки в Интернет

-----------------------

[1] Примечание: данные из учебника по Turbo Pascal

[2] Примечание: данные из статьи «Конструирование программ»

[3] Примечание: данные из учебника по Turbo Pascal

*Примечание автора

[4] Примечание: данные из учебника по Delphi 5



© 2003-2013
Рефераты бесплатно, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.