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

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

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

Если Вам нужна помощь с академической работой (курсовая, контрольная, диплом, реферат и т.д.), обратитесь к нашим специалистам. Более 90000 специалистов готовы Вам помочь.
Бесплатные корректировки и доработки. Бесплатная оценка стоимости работы.

Поможем написать работу на аналогичную тему

Получить выполненную работу или консультацию специалиста по вашему учебному проекту
Нужна помощь в написании работы?
Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Пишем статьи РИНЦ, ВАК, Scopus. Помогаем в публикации. Правки вносим бесплатно.

Похожие рефераты: