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

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

   Как известно, в настоящее время наиболее распространеннымиалгоритмическими языками являются Паскаль и Си. Именно эти языки используютсяпрактически на всех действующих вычислительных системах- от супер-ЭВМ доперсональных компьютеров. Что касается ПЭВМ, то лидером семейства языковПаскаль для них, без сомнения, является Турбо Паскаль 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 divz;      {расчет количестваправильных ответов}

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

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

        If z>=90 Then Begin

                               Writeln('5')

                               Writeln(b1,’5’);

                               End;

        else If z>=70Then Begin

                                       Writeln('4')

                                       Writeln(b1,’4’);

                                       End;

        else If z>=40Then 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-ddo Write(b1,' ');

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

        Readln(a);

        Write(b1,a);

        d:=length(a);

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

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

        Readln(a);

        Write(b1,a);

        d:=length(a);

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

        Write(b1,f);

        d:=length(f);

        For i:=1 to 8 doWrite(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 z2<0 ThenBegin       {обнулениесчетчика}

                     z1:=z1-1;

                    z2:=60;

                     End;

        If (z1=0)and(z2=0)Then GoTo l1; {проверкаисхода времени}

        GetTime(g1,g2,g3,g4);{вывод таймера и текущего времени}

       Writeln(z1,':',z2); {выводвремени на экран}

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

        Delay(1000);

        until keypressed;

Объявляется переменная, изкоторой каждую секунду вычитается 1. Так осуществляется обратный отсчет. Сисходом времени программа автоматически переходит к выставлению оценки.

Оконная система диалога.

  Поскольку прошлая моя работа была посвящена диалоговым системам, я учел тотопыт, но в этой программе сделал нововведение, приблизившее программу ксовременному «оконному» виду.

  Над оформлением окна пришлось посидеть не один час, так как обычное окно в видеквадрата на экране совсем не привлекательно. Я изучил строение окон в среде MS-DOS и попытался воссоздать дизайн окна в своей программе. Если выкогда-либо видели схему окна в MS-DOS, то заметили, что окнообрамляется двойной рамкой, наверху которой находится название окна. Здесь мнепомогло хитрое решение. Я заглянул в таблицу символов ASCIIи нашелсимвол двойной рамки! Далее все просто: открывается окно, закрашивается, покраям с помощью циклов рисуется рамка и выводится название окна. Но это еще невсе. Внутри окна открывается другое окно того же цвета, чтобыбыло незаметно. Теперь при вводе или выводе данных рамка не будет двигатьсявместе с текстом, разрываться и т. д. Мы получаем полноценное окно.

Ясделал оформление окна в виде процедуры, необходимо лишь ввести координаты окнаи его название. Ниже приведен код оформления окна:

Procedurewindows(x,y,x1,y1:integer; b:string);

   Var a,t:integer;

   Begin

   Window (x+1,y+1,x1+1,y1+1);   {рисованиетени от окна}

   TextBackGround(black);

   clrscr;

   Window(x,y,x1,y1);{рисованиеокна}

   TextBackGround(blue);

   clrscr;

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

   Write(' ');

   Write(chr(201));{рисованиеуголка}

   For a:=1 to 4 do Write(chr(205));{рисование полосы}

   Write(' ');

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

   Write(b);{выводназвания окна}

   Write(' ');

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

   For a:=1 to (x1-x-9-length(b)) do Write(chr(205));{рисование линии}

   Writeln(chr(187));{рисованиеуголка}

   For a:=1 to (y1-y-1) do Begin   {рисование линий по бокам}

                     Write(' ');

                     Write(chr(186));

                     For t:=1 to (x1-x-3) do Write(' ');

                     Writeln(chr(186));

                     End;

   Write(' ');

   Write(chr(200));{рисованиеуголка}

   For a:=1 to (x1-x-3) do Write(chr(205));{рисование линии}

   Write(chr(188));{рисованиеуголка}

   Window(x+2,y+1,x1-2,y1-1);{открытие окна ввода внутри окна}

   TextColor(black);

   End;

Здесьвсе довольно просто: окно открывается оператором Window суказанием координат. По завершении текущего сеанса окно закрывается(закрашивается) той же командой. В данной программе окна закрываются иоткрываются много раз, запрашивая каждое свои данные, что выглядит намногопроще, чем множество строк на экране, не так ли?

Воткак это выглядит в программе:

 Window(10,22,69,22);   {указывается окно с координатами}

  TextBackGround(green);{задается цвет фона}

  clrscr; {окно закрашивается}

Введение процедур. Основные функции редактора.

Каквидно в структурной программе, функции обозначены в операторе варианта case.Для удобства обращения к ним и для установления более эффективных связей междуними я решил вынести функции в отдельные процедуры. Это создало дополнительныетрудности: потребовалось изменить структуру переменных, ввести локальныепеременные. В результате общий вид программы изменился, увеличилось еебыстродействие.

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

Procedure NewF;

    Var h1:string;          {объявлениелокальных переменных}

    Begin

    Window(10,10,53,15);

    TextBackGround(black);

    clrscr;

    Window(20,10,66,15); {начальное окно}

    TextBackGround(blue);

    clrscr;

    TextColor(black);

    Write('сохранить файлкак ');

    Readln(a); {ввод пути создаваемого файла безрасширения}

    a:=a+'.ts';{дописывание расширения}

    h1:=a;

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

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

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

    Rewrite(c);

    Rewrite(u);

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

    TextBackGround(black);

    clrscr;

    Window(30,5,50,10);{открытие окнахарактеристик}

   TextBackGround(yellow);

    clrscr;

    GoToXY(30,6);

    Write('кол-во вопросов');

    Readln(d);{ввод количества вопросов}

    Writeln(c,' ',d);

    GoToXY(30,8);

    Writeln('названиетеста ');{вводназвания теста}

    Readln(f);

    Writeln(c,f);

    Writeln('пароль назащиту');

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

    Writeln(u,f);

    Window(30,5,50,10);

    TextBackGround(black);

    clrscr;

    For i:=1 to d do Begin

                    Writeln(c);

                    Window(10,10,53,20);{окновопроса}

                    TextBackGround(lightgray);

                    clrscr;

                    Writeln(i,'-й вопрос: ');

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

                    Str(i,f);

                    f:=f+')';{записьвопроса в файл}

                    Writeln(c,f);

                     Writeln(c,a);

                    Window(55,10,80,15); {окноколичества ответов}

                    TextBackGround(cyan);

                    clrscr;

                    Write('количество ответов на ',i,'-й вопрос ');

                     Readln(e);{ввод количестваответов}

                    Window(10,10,53,20);{окноответов}

                    TextBackGround(lightgray);

                    clrscr;

                     Forj:=1 to e do Begin

                                     Write(' ',j,')');

                                     Readln(a);{вводответов}

                                     Str(j,f);

                                     a:=' '+f+')'+a;

                                     Write(c,a);

                                      End;

                    Write(c,'&');{записьв файл конца ввода}

                    Window(55,10,80,15);

                    TextBackGround(cyan);{окноправильного ответа}

                    clrscr;

                    Write('Правильный ответ: ');

                    Readln(b);{вводправильного ответа}

                    Writeln(u,b);

                     End;

        close(u); {закрытие файлов и окон}

        Reset(u);

        Readln(u);

        close(c);

        Window(55,10,80,15);

       TextBackGround(black);

        clrscr;

    End;

Вэтой, как и в других функциях, работающих с файлами, я столкнулся с проблемойзаписи тестов в файлах. Во-первых, я решил разделить сам тест и ответы к нему.Тест находится в файле с расширением qs, а ответык нему- в файле с расширением qso. Второй проблемой стала остановка чтения вопроса,ведь вопросы должны выводиться не подряд, а по очереди. В связи с этим яиспользовал символ «&» в конце каждого вопроса и указал программе читать доэтого символа, но сам символ не выводить. Можно было использовать счетчикстрок, который останавливает программу после прочтения двух строк (вопрос иварианты ответов), но в случае сбоя тест приходит в негодность. Далеетребовалось разместить данные о названии теста, количестве вопросов, пароле ит. п. Я разместил их по этим двум файлам. Опытные программисты заметят: зачембыло использовать текстовые файлы, ведь можно было применить работу с типом«запись» и сохранять данные в нетипизированных файлах, и шифровщик бы непотребовался. Действительно, но использование типа «запись» не позволяетсоздавать тесты с динамическим числом ответов на вопрос. Это возможно лишьпутем использования в записи динамического массива. Но это сделает работу сфайлом очень сложной а сам файл будет занимать много места на диске посравнению с обычным текстовым.

Естественно,что при поиске файла программа может его не найти, в этом случае выдаетсяошибка поиска. Требовалось ее обойти, выдавая собственное сообщение программы.Это осуществляется следующим образом: задается директива компиллятора на егоотключение $I-, проверяется нулевой результат IORESULT=0, выдается сообщение и компиллятор включается снова $I+.Я использовал эту функцию компиллятора там, где необходимо осуществить поиск файла.Такая функция обхода компилятора называется обработкой сообщений и являетсясоставляющей объектного програмимирования.

Функция открытия теста выглядитсложнее. Она открывает указанный файл, считывает сначала пароль входа изапрашивает его, затем приступает к выполнению теста. На экран выводится вопроси ожидается ввод цифры правильного ответа. Причем включается таймер и позавершении работы с тестом или по истечении времени программа выходит из даннойфункции и передает управление подпрограмме подсчета результатов и регистрации:

Procedure OpenF;

  label l1;

   Var f1:string;   {объявление локальных переменных}

    Begin

    p:=0;

    Window(10,10,53,15);

       TextBackGround(black);

        TextColor(black);

        clrscr;

        Window(20,10,66,15); {начальное окно}

       TextBackGround(blue);

        clrscr;

        Writeln('какойфайл открыть ');

        Readln(a);{ввод пути к файлу без расширения}

        a:=a+'.ts';{прибавление расширения}

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

        f1:=a;

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

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

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

       Assign(b1,'c:\pascal\registr.dat');{связь переменной с файлом отчета}

        Append(b1);{открытие файла отчета для дозаписи}

        Reset(c);{открытие файла вопросов для чтения}

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

       TextBackGround(black);

        clrscr;

        Reset(u);

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

        Readln(c,b);

       z:=ord(b)-ord('0');{установка времени}

        z1:=z;

       Window(10,10,40,12);{окнопароля}

       TextBackGround(magenta);

        clrscr;

        Readln(u,a);

        If length(a)>2Then 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<0 ThenBegin

                    z1:=z1-1;

                     z2:=60;

                     End;

        If (z1=0)and(z2=0)Then GoTo l1;

       Writeln(z1,':',z2);

       GetTime(g1,g2,g3,g4);{вывод текущего времени}

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

        Delay(1000);

        TextColor(black);

        Window(10,10,53,15);{вывод вопроса, ожидание ввода ответа}

       TextBackGround(cyan);

        clrscr;

        while notEoln(c)or(b<>'&') 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<0 ThenBegin

                    z1:=z1-1;

                    z2:=60;

                     End;

        If (z1=0)and(z2=0)Then GoTo l1;

        GetTime(g1,g2,g3,g4);

       Writeln(z1,':',z2);

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

        Delay(1000);

        until keypressed;

       Window(55,10,80,15);

       TextBackGround(blue);

        clrscr;

        TextColor(yellow);

        b:=readkey;{считывание цифры ответа}

        Write(b);{считывание правильного ответа из файла}

        Readln(u,k);

        Readln(c);

        If k=b Thenp:=p+1;{сравнение ответов,начисление баллов}

       Window(60,20,70,21);

       TextBackGround(black);{закрытие окна отверов}

        clrscr;

        TextColor(black);

        z2:=z2-1;{таймер}

        If z2<0 ThenBegin

                    z1:=z1-1;

                    z2:=60;

                     End;

        If (z1=0)and(z2=0)Then GoTo l1;

        GoToXY(70,15);

       GetTime(g1,g2,g3,g4);{вывод текущего времени}

       Writeln(z1,':',z2);

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

        Delay(1000);

        until Eof(c);

     l1:f1:=f1+'o';

        close(c);{закрытие всех файлов}

        close(u);

        Window(55,10,80,15);{закрытие окон}

       TextBackGround(black);

        clrscr;

       Window(10,10,53,15);

       TextBackGround(black);

        clrscr;

       Window(15,10,50,19);

       TextBackGround(blue);

        clrscr;

        <подсчет результата>

    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 notEoln(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 ThenWriteln('номер превышает число вопросов');{проверка существования номера}

        until z<=d;

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

       TextBackGround(black);

        clrscr;

       Window(10,10,53,20); {окновопросов}

       TextBackGround(lightgray);

        clrscr;

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

        Reset(c);

        p:=0;

        repeat

          while notEOLN(c) do Begin        {копирование значений в другой файл}

                              Read(c,b);

                              Write(y,b);

                              End;

          Readln(c);

          Writeln(y);

          p:=p+1;

        until p=z*3; {установка количества копируемыхстрок}

        p:=0;

        while not (p=z-1)do Begin     {стирание ненужного вопроса}

                            p:=p+1;

                             Readln(u,b);

                            Writeln(a1,b);

                            End;

        while not EOLN(c)do Begin       {можно было применить и цикл с параметром от 0 до 2}

                            Read(c,b);

                             Write(b);

                            End;

        Readln(c);

        Writeln;

        while not EOLN(c)do Begin       {вывод редактируемого вопроса на экран}

                            Read(c,b);

                            Write(b);

                             End;

        Readln(c);

        Writeln;

        while not EOLN(c)do Begin    

                            Read(c,b);

                            Write(b);

                            End;

        Readln(c);

        Writeln;

        Writeln('Заменитьна:');

        Writeln(z,')'); {ввод нового вопроса}

        Writeln(y,z,')');

        Readln(f);

        Writeln(y,f);

       Window(55,10,80,15); {окноответов}

       TextBackGround(cyan);

        clrscr;

        Write('количествоответов на ',z,'-й вопрос ');

        Readln(e); {ввод количества ответов}

       Window(10,10,53,20); {окновопросов}

       TextBackGround(lightgray);

        clrscr;

        For j:=1 to e doBegin     {ввод ответов навопрос}

                         Write('',j,')');

                        Readln(a);

                        Str(j,f);

                        a:=' '+f+')'+a;

                        Write(y,a);

                        End;

       Writeln(y,'&');

       Window(55,10,80,15); {окноответов}

       TextBackGround(cyan);

        clrscr;

        Write('Правильныйответ: ');

        Readln(b); {ввод правильного ответа}

       Window(55,10,80,15); {закрытиеокна ответов}

       TextBackGround(black);

        clrscr;

        Writeln(a1,b);

        repeat

          while notEOLN(c) do Begin     {дозаписьзначений}

                              Read(c,b);

                              Write(y,b);

                              End;

          Readln(c);

          Writeln(y);

        until EOF(c);

        Readln(u);

        while not EOF(u)do Begin        {дозапись значений в копируемый файл}

                           Readln(u,b);

                           Writeln(a1,b);

                           End;

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

       TextBackGround(black);

        clrscr;

        close(c);      {закрытиефайлов}

        Erase(c); {стирание старого файла вопросов}

        close(u);

        Erase(u); {стирание старого файла ответов}

        close(y);

        Rename(y,a2); {переименование файла вопросов}

        a2:=a2+'o';

        close(a1);

        Rename(a1,a2); {переименование файла ответов}

    End;

Длякорректной работы процедуры требовалось реализовать чтение требуемого вопроса,здесь и пригодилось построчное чтение, о котором рассказывалось в предыдущейглаве. Кроме того, требовалось скопировать данные из одного файла, исключаятребуемый вопрос с последующим добавлением нового вопроса. Я реализовал это вциклах, что вы можете видеть в программном коде.

Функция просмотра результатов.Организует просмотр результатов тестирования. Просит ввести вашу фамилию. Еслиона есть в списке, выводит полную информацию о тесте, об оценке, о дате и т. д.Программа использует файл registr.dat длявнесения туда ваших результатов. При желании файл также может быть распечатан.

Procedure SearchF;

    Begin

   Assign(b1,'c:\pascal\registr.dat');     {связь переменной с файлом отчета}

            Reset(b1); {открытие файла для чтения}

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

           TextBackGround(black);

           TextColor(black);

            clrscr;

           Window(5,10,70,13); {окнопоиска}

           TextBackGround(green);

            clrscr;

            Write('ВашаФамилия');

            Readln(a); {ввод фамилии}

            while notEOF(b1) do Begin    {поискфамилии}

                                Readln(b1,f); {считываниестроки}

                                For i:=1 to length(a) do f1:=f1+f[i]; {выделение фамилии}

                                 Ifa=f1 Then Begin    {проверкасовпадения}

                                             Writeln(f); {вывод наэкран}

                                             c1:=true; {подтверждение запроса}

                                             End;

                                f1:=''; {обнулениестроки}

                                End;

            If c1=falseThen Write('Запрос не найден. Пройдите тест.');

                                                                                                 {в случае отсутствия фамилии в списке}

            Readln;

            close(b1); {закрытие файла}

           Window(5,10,70,13); {закрытиеокна}

           TextBackGround(Black);

            clrscr;

    End;

Задачи: выделение фамилии из строкипутем поиска пробела, поиск соответствия фамилий и вывод результатов поиска наэкран.

Проблемы: никаких

Функция печати данных. В Turbo Pascal имеются средства для работы с принтером. Это ключевое слово Lst,указывающиеся в операторе вывода Writeln. Следуя этойинструкции, компилятор посылает сообщения не на экран, а на принтер. Этотспособ имеет существенный недостаток: данные передаются очень медленно. Также вязыке нет определенной команды для окочания работы принтера, поэтому бумагаостается внутри и приходится использовать внешние управляющие кнопки принтера.Программа просит указать путь к файлу, а затем распечатывает его.

  Я нашел другой алгоритм работы с принтером, более быстрый, но он требует знанийязыка Assembler, встроенного в Turbo Pascal:

Procedure PrintF;

    Begin

    TextColor(black);

    Window(10,10,53,15);       {начальноеокно}

    TextBackGround(cyan);

    clrscr;

    Writeln('Какой файлраспечатать?');{выводзапроса}

    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;

    Window(10,10,53,15);{открытие окна ввода}

    TextBackGround(cyan);

    clrscr;

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

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

    Reset(b1);{открытие файла для чтения}

    Writeln('убедитесь чтоваш принтер настроен для работы в MS-DOS');{предупреждение}

    repeat      {цикл работы с файлом}

    Window(60,24,70,24);{закрытие окна}

    TextBackGround(black);

    clrscr;

    h:=g3;

    GoToXY(50,22);

    GetTime(g1,g2,g3,g4);{вывод времени}

    TextColor(yellow);

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

     clrscr;

    Readln(b1,f);{считывание символа}

    Writeln(Lst,f);{распечатывание символа}

    until EOF(b1);

    Window(10,10,53,15);{закрытие окон}

    TextBackGround(black);

    clrscr;

    End;

Проблемы: отсутствие командыдля окончания работы принтера, малая скорость печати. Решение- в языкеассемблер.

 

Новые объектные концепции.

  Современные технологии разработки программного обеспечения опираются в основномна идеи структурного программирования. К ним, в первую очередь, относятся:функциональная модульность, структурированность программ и данных, насыщенностьтекстов программ комментариями, открытость, надежность и т. д. Широкоиспользуемым примером такой технологии является технология «сверху-вниз». Еесуть заключается в постепенной пошаговой детализации функций, выполняемыхпрограммной системой. Серьезными недостатками технологии «сверху-вниз» являютсянедостаточное внимание к проектированию структур данных и слабая их связь спроцедурами обработки.

 Гармоничноевключение в структуру языка средств объектно-ориентированного программированияделает переход от традиционных технологий программирования кобъектно-ориентированному для тех, кто программирует на Турбо Паскале,достсаточно безболезненным. А то, что такой переход назрел, сомнений невызывает. Мощные пакеты инструментальных средств, такие как Turbo Vision и Object Toolkit, способствует внедрению объектно-ориентированныхметодов в процессе разработки программ.Кроме того, опрос американскихпрограммистов, проведенный осенью 1991 года, показал, что в 1992 году болееполовины из них планирует включить средства объектно-ориентированногопрограммироваиня в свой арсенал, поскольку считают, что это будетспособствовать ускорению разработки.[4]

  Понять основы объектного программирования вам поможет учебник по Delphi 5.Важнейшими понятиями объекта являются принцип наследования, полиморфизм,поля, методы, свойства и события объекта. В языке Turbo Pascal не полностью реализован данный подход к программированию.

   Наиболее важным понятиемобъектно-ориентированного программирования является понятие объекта. Объектпредставляет собой совокупность данных и подпрограмм, предназначенных дляработы с этими данными. Главным достоинством объекта является то, что онпозволяет моделировать абстрактные ситуации. Это делает объектный подход кпрограммированию довольно удобным для большинства программистов, хотя оченьтрудно понять объектный подход тем, кто ранее программировал на структурныхязыках. Тем более, что найти какой-либо справочный материал по объектам оченьсложно. Поэтому я приведу основы понятия объекта.

  Объект в Turbo Pascal состоит из имени, полей данных и методов. Поля данныхэто ете же переменные в программе, на которые опирается объект. Заголовкиметодов- названия процедур объекта, позволяющих работать с полями, посколькупрямой доступ к полям нежелателен. Объект объявляется следующим образом:

  Объект.

  Type <имяобъекта>=object

    <поля данных>

    <заголовки методов>

   End;

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

<Имяобъекта>.<Имя процедуры>

 

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

  Объектная программа- это последняя важнаястадия разработки программы: в нее внедряется панель управления, чтозначительно облегчает диалог с системой и делает функции программы болеедоступными. Как видно из предыдущей главы, функции программы в структурном виденаходятся в операторе варианта case, а выборфункции происходит нажатием клавиши.

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

   Новый объект-панель управления под именем panel имеетодно поле- координату синего прямоугольника, который перемещается по панелиуправления. На самом деле это окно синего цвета, а изменение цвета букв приперемещении создается засчет точного соответствия текста в окне и текста напанели управления. Панель имеет процедуры перемещения прямоугольника выбора,которые уменьшают и увеличивают его координату в соответствии с нажатымиклавишами. А также есть процедура выбора, при нажатии клавиши Enter управлениепередается ей. Она в свою очередь определяет по координате окна какую функциюнеобходимо запустить в данный момент.

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

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

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

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

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

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

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

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

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

Program redactor;

uses crt,printer,dos;

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

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

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

     Procedureright(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 Thenx:=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<=50 Thenx:=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 pannel;{процедура рисования панели управления}

    Begin

    Window(10,22,69,22);

    TextBackGround(green);

    clrscr;

    TextColor(brown);

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

    End;

<ProcedureNewF;>{функции тестового редактора}

<Procedure OpenF;>

<Procedure RedactF;>

<Procedure SearchF;>

<Procedure PrintF;>

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.  Журнал «Земля и Вселенная» №21998г. статья В. П. Дьяконова «Бейсик- язык программирования ПЭВМ»

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

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

еще рефераты
Еще работы по информатике, программированию