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

Предисловие<span Stylus Helv CE",«sans-serif»">.

<span Stylus Helv CE",«sans-serif»">  

Как известно, в настоящеевремя наиболее распространенными алгоритмическими языками являются Паскаль иСи. Именно эти языки используются практически на всех действующихвычислительных системах- от супер-ЭВМ до персональных компьютеров. Что касаетсяПЭВМ, то лидером семейства языков Паскаль для них, без сомнения, является ТурбоПаскаль 7.0, разработанный фирмой Borland. Эта последняя версияпозволила объединить в рамках единой системы мощный алгоритмический потенциалязыка, методы объектно-ориентированного программирования, современную графику,удобные средства тестирования и отладки программ, а также обеспечитьдружественный интерфейс с пользователями.<span Times New Roman",«serif»; mso-fareast-font-family:«Times New Roman»;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">[1] Поэтому я выбрал этот языкпрограммирования как основу для создания тестового редактора.

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

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

1.<span Times New Roman"">    

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

2.<span Times New Roman"">    

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

3.<span Times New Roman"">    

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

4.<span Times New Roman"">    

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

5.<span Times New Roman"">    

печать файла

6.<span Times New Roman"">    

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

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

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

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

   Конструирование программ — один из важнейшихразделов современной информатики. Бурное развитие программно-аппаратныхсредств, появление новых стилей и технологий программирования, как нипарадоксально, не снижают, а повышают уровень требований к массовойалгоритмической культуре. Практически все диалоговые системы являютсяпрограммируемыми. Методика конструирования программ легко переносится на другиепроцедурные языки программирования, в том числе и объектно-ориентированные.<span Times New Roman",«serif»; mso-fareast-font-family:«Times New Roman»;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">[2]

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

1.<span Times New Roman"">    

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

2.<span Times New Roman"">    

Разбиение сплошного текстапрограммы на процедуры. Таким образом, текст стал занимать не так много места,исчез оператор варианта, многие метки, ссылки и т. п. Надо сказать, многиепрограммисты предпочитают вводить процедуры в программу. Это значительноупрощает ее.

3.<span Times New Roman"">    

Введение оконной системы спомощью доступных возможностей языка (оператор Window). Это позволило значительно упростить работу,создать диалог пользователя с программой, уменьшить количество информации,поступающей к пользователю и количество ее «потоков».

4.<span Times New Roman"">    

Введение объекта- панелиуправления. Вы можете видеть ее внизу экрана. Она взяла на себя управлениефункциями редактора. Причем введение объекта значительно упростило программу.Методы работы с объектами вы можете прочитать в главе «Объектноепрограммирование».

5.<span Times New Roman"">    

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

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

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

   Турбо Паскаль способствует внедрениюсовременной технологии программирования, основанной на принципах структурногопрограммирования и пошаговом методе проектирования программ. Основные операторыязыка являются хорошей иллюстрацией базовых управляющих конструкцийструктурного программирования. Их использование позволяет записывать сложныеалгоритмы обработки данных в компактной форме.<span Times New Roman",«serif»; mso-fareast-font-family:«Times New Roman»;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">[3]

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

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

   Бейсик — диалоговый язык высокого уровня, ориентированный на пользователей ПЭВМ,непрофессионалов в области вычислительной техники. Бейсик — преимущественноинтерпретирующая программа, позволяющая производить построчную отладку текстовпрограмм. Данный способ гораздо удобнее для начинающих программистов, нежеликомпилирование (компилятор производит отладку только целой программы, а не почастям), и широко используется в Паскале. Отличительной чертой структурныхязыков являются краткие однозначные операторы (в отличие от длиннейших командобъектного программирования)*.

   В некоторыхверсиях Бейсика имеется встроенный редактор программ, позволяющий работать стекстом программы из командного окна. Работа с программой осуществляется в трехразличных режимах:

·<span Times New Roman"">       

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

·<span Times New Roman"">       

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

·<span Times New Roman"">       

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

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

  

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

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

   Нижеприведена схема структурной программы тестового редактора, объясняющаясоответствующий подход к программированию. Основной список операторов вырезан изаменен на <набор операторов>.<span Stylus Helv CE",«sans-serif»; mso-ansi-language:EN-US">

Конечный вид программы<span Stylus Helv CE",«sans-serif»;mso-ansi-language:EN-US"> будет приведен в главе “Объектное программирование” объектов.

Programredactor;

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

labell1,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<span Stylus Helv CE",«sans-serif»">.

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

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

<img src="/cache/referats/9284/image002.jpg" v:shapes="_x0000_s1029">


                                                  Интерфейс структурной программы

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

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

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

        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 z2<0 Then Begin       {обнуление счетчика}

                      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и нашел символ двойной рамки! Далее все просто:открывается окно, закрашивается, по краям с помощью циклов рисуется рамка ивыводится название окна. Но это еще не все. Внутри окна открывается другое окнотого же цвета, чтобы былонезаметно. Теперь при вводе или выводе данных рамка не будет двигаться вместе стекстом, разрываться и т. д. Мы получаем полноценное окно.

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

Procedure windows(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:=1to 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:=1to (y1-y-1) do Begin   {рисование линий по бокам}

                     Write(' ');

                     Write(chr(186));

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

                     Writeln(chr(186));

                     End;

    Write('');

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

    For a:=1to (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.Для удобства обращения к ним и для установления более эффективных связей междуними я решил вынести функции в отдельные процедуры. Это создало дополнительныетрудности: потребовалось изменить структуру переменных, ввести локальныепеременные. В результате общий вид программы изменился, увеличилось еебыстродействие.

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

ProcedureNewF;

    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;

                     For j:=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+.Я использовал эту функцию компиллятора там, где необходимо осуществить поиск файла.Такая функция обхода компилятора называется обработкой сообщений и являетсясоставляющей объектного програмимирования.

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

ProcedureOpenF;

  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:pascalregistr.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)>2 Then Begin{проверка наличия в файлепароля}

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

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

                            If a<>f ThenBegin

                            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 Then Begin

                     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 not Eoln(c)or(b<>'&')do Begin

                                      Read(c,b);

                                       Ifb<>'&' 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 Then Begin

                     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 Then p:=p+1;{сравнение ответов,начисление баллов}

        Window(60,20,70,21);

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

        clrscr;

        TextColor(black);

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

        If z2<0 Then Begin

                     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!!!

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

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

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