Чтение RSS
Рефераты:
 
Рефераты бесплатно
 

 

 

 

 

 

     
 
Тест программных программ

Тест программных программ

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

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

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

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

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: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 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 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);

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

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

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

 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<=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 not EOLN(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 do Begin     {ввод ответов на вопрос}

                         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 not EOLN(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:pascalregistr.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 not EOF(b1) do Begin    {поиск фамилии}

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

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

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

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

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

                                              End;

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

                                 End;

            If c1=false Then 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

 
     
Бесплатные рефераты
 
Банк рефератов
 
Бесплатные рефераты скачать
| Интенсификация изучения иностранного языка с использованием компьютерных технологий | Лыжный спорт | САИД Ахмад | экономическая дипломатия | Влияние экономической войны на глобальную экономику | экономическая война | экономическая война и дипломатия | Экономический шпионаж | АК Моор рефераты | АК Моор реферат | ноосфера ба забони точики | чесменское сражение | Закон всемирного тяготения | рефераты темы | иохан себастиян бах маълумот | Тарых | шерхо дар борат биология | скачать еротик китоб | Семетей | Караш | Influence of English in mass culture дипломная | Количественные отношения в английском языках | 6466 | чистонхои химия | Гунны | Чистон | Кус | кмс купить диплом о language:RU | купить диплом ргсу цена language:RU | куплю копии дипломов для сро language:RU
 
Рефераты Онлайн
 
Скачать реферат
 
 
 
 
  Все права защищены. Бесплатные рефераты и сочинения. Коллекция бесплатных рефератов! Коллекция рефератов!