Научная статья на тему 'АВТОМАТИЧЕСКОЕ ТЕСТИРОВАНИЕ СЛОЖНЫХ ПРОГРАММ НА ЯЗЫКЕ ПАСКАЛЬ'

АВТОМАТИЧЕСКОЕ ТЕСТИРОВАНИЕ СЛОЖНЫХ ПРОГРАММ НА ЯЗЫКЕ ПАСКАЛЬ Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
49
15
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ПРОГРАММИРОВАНИЕ / ЯЗЫК ПАСКАЛЬ / ТЕСТИРОВАНИЕ ПРОГРАММ / СТРУКТУРЫ ДАННЫХ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Новиков М.Д.

Статья посвящена автоматическому тестированию программ на языке Паскаль, выполняемых студентами первого курса факультета вычислительной математики и кибернетики МГУ им. М. В. Ломоносова. Описывается представление сложных структур данных на экране компьютера и тестирование программ, допускающих различные варианты правильных ответов.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

AUTOMATIC TESTING OF COMPLEX PASCAL PROGRAMS

The article is devoted to automatic testing of Pascal programs created by first year students of the faculty of computational mathematics and cybernetics of Moscow state university. Output of complex data to the computer screen is described. Testing of programs with multiple correct answers is discussed.

Текст научной работы на тему «АВТОМАТИЧЕСКОЕ ТЕСТИРОВАНИЕ СЛОЖНЫХ ПРОГРАММ НА ЯЗЫКЕ ПАСКАЛЬ»

Волновое число 1/м

Фиг. 2. Зависимость относительной амплитуды взрывного давления от времени действия взрыва. Здесь Pm - давление взрыва, Pg =P0 - атмосферное давление, 1) Одиночное взрывное воздействие длительностью 0,01 с, 2) Периодическое взрывное воздействие с периодом 0,02 с.

519.683.8, 519.688

АВТОМАТИЧЕСКОЕ ТЕСТИРОВАНИЕ СЛОЖНЫХ ПРОГРАММ НА ЯЗЫКЕ ПАСКАЛЬ

Новиков М.Д.

Московский государственный университет им. М. В. Ломоносова, факультет вычислительной математики и кибернетики, 119991, Москва, ГСП-1, Ленинские горы, д. 1, стр. 52, факультет ВМК.

AUTOMATIC TESTING OF COMPLEX PASCAL PROGRAMS

M.D. Novikov

Moscow State university, Faculty of Computational Mathematics and Cybernetics, Russia, 119991, Moscow, GSP-1, 1-52, Leninskiye Gory.

DOI: 10.31618/nas.2413-5291.2023.1.88.729

АННОТАЦИЯ

Статья посвящена автоматическому тестированию программ на языке Паскаль, выполняемых студентами первого курса факультета вычислительной математики и кибернетики МГУ им. М. В. Ломоносова. Описывается представление сложных структур данных на экране компьютера и тестирование программ, допускающих различные варианты правильных ответов.

ABSTRACT

The article is devoted to automatic testing of Pascal programs created by first year students of the faculty of computational mathematics and cybernetics of Moscow state university. Output of complex data to the computer screen is described. Testing of programs with multiple correct answers is discussed.

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

Key words: programming, Pascal language, program testing, data structures.

Введение.

На факультете ВМК МГУ с 2017 года используется система автоматического тестирования программ (САТП), предназначенная для проверки правильности программ на языке Паскаль, выполняемых студентами первого курса в рамках практикума на ЭВМ. Задачи для тестирования взяты, в основном, из книг [1], [2] и [3]. Эти книги содержат как задачи на составление программ, тестирование которых не вызывает затруднений, так и задачи, требующие нетривиальных алгоритмов для их программной реализации и специальных методов проверки

правильности этих алгоритмов. Возможности САТП следующие: 1) можно тестировать как полную программу, так и фрагмент программы -процедуру или функцию; 2) проверяется выполнение формальных требований к программе, указанных в [1], [2] и [3] - это обычно запрет или, наоборот, обязательное использование каких-либо конструкций языка Паскаль; 3) проверяется корректность использования динамической памяти ЭВМ; 4) производится анализ выдаваемых тестируемой программой результатов на предмет их правильности. Основная информация по САТП изложена в работах [4], [5] и [6]. Данная статья

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

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

САТП тестирует программы, проверяя их правильность на различных наборах исходных данных. Она выводит исходные данные, полученный тестируемой программой результат и правильный результат для каждого теста. Вывод информации для скалярных числовых или символьных данных не представляет затруднений. Например, в задаче подсчета количества цифр неотрицательного целого числа ([1], задача 5.6 е), на экран компьютера выводятся исходные данные и результаты тестирования следующим образом: Тест 1.

Исходные данные: 0 Полученный результат: 1 Правильный результат: 1 Верно. Тест 2.

Исходные данные: 10 Полученный результат: 2 Правильный результат: 2 Верно. и. т. д.

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

Сложнее обстоит дело при тестировании программ, содержащих в качестве исходных данных одномерные массивы, матрицы, а также списки и двоичные деревья (см. [1], главы 16 и 17).

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

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

Обычное графическое представление деревьев в виде последовательности соединенных ребрами вершин занимает много места на экране компьютера, сложно в реализации (особенно в случае дерева большой глубины и/или большого количества вершин) и обычно не требуется для установления причин, по которым тестируемая программа выдает неверный результат для какого-либо двоичного дерева. К тому же задачи на анализ и преобразование двоичных деревьев сложны в реализации и соответствующие программы требуют большого количества тестов, которые должны быть компактно размещены на экране компьютера. Поэтому в САТП было выбрано представление двоичного дерева в виде последовательности путей от вершины к листьям. Оно оказалось простым для реализации и удобным для анализа результатов тестирования.

Например, дерево

Рис.

записывается как T 20 TL 30 TLL 1 TR 10 TRL 40 TRR 1. Такая форма экономит место на экране, позволяет увидеть результаты многих тестов одновременно и легко воссоздать исходное дерево для анализа в случае неверной работы программы на нём.

В качестве примера рассмотрим рекурсивную функцию, вычисляющую величину наибольшего элемента непустого дерева T ([1], задача 17.8 г):

Type Tree=Anode; node=record data:real; left, right:tree end;

Function Max(T:tree): real;

Var M1,M2:real;

Begin

If T=Nil Then Max:=0

Else Begin

1.

Ml:=Max(TA.left); M2:=Max(TA.right);

If M1<M2 Then M1:=M2; If M1<TA.data Then M1:=TA.data;

Max:=T1 End;

End;

Эта функция содержит часто встречающуюся в студенческих программах ошибку. Она заключается в том, что в случае пустого дерева функция принимает значение 0. Соответственно, если в дереве все элементы отрицательны, то результат будет неверным.

Пример тестирования этой функции:

Тест 1.

Исходные данные: T 50

Полученный результат: 50

Правильный результат: 50

Верно. Тест 2.

Исходные данные: T 80 TL -1 TLL 0.5 TLR -10 TR 100 TRL 60 TRR 60

Полученный результат: 100 Правильный результат: 100 Верно. Тест 3.

Исходные данные: T -10 TL -1 TR -2 TRL -80

Полученный результат: 0

Правильный результат: -1

Ошибка.

и. т. д.

Из приведенных результатов тестирования сразу видно, что функция выдает неверный ответ в случае отрицательности всех элементов дерева. Правильный вариант функции: Function Max(T:tree): real; Var M1,M2:real; Begin

If (TA.left=Nil)and(TA.Right=Nil) Then Max:=T.AData Else Begin

If TA.left<>Nil Then M1:=Max(TA.left) else M1:=TA.data;

If TA.right<>Nil Then M1:=Max(TA.right) else M1:=TA.data;

If M1<M2 Then M1:=M2; If M1<TA.data Then M1:=TA.data;

Max:=T1 End; End;

2. Тестирование программ, допускающих различные варианты правильных ответов.

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

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

а) Задачи 17.17 з, и, м, н, о, п из [1]. Это задачи на построение или преобразование двоичных деревьев поиска: з) построение дерева поиска из заданных чисел, и) построение дерева поиска наименьшей высоты из заданных упорядоченных по возрастанию чисел, м) удаление из дерева поиска заданного элемента, н) объединение двух деревьев поиска в одно, о) и п) выделение из дерева поиска некоторого поддерева. Все эти задачи допускают более одного правильного ответа. Например, можно построить два различных дерева поиска наименьшей высоты, равной двум, из двух чисел A и B (для определенности можно считать, что A<B): T A TR B и

T B TL A.

Оба ответа - правильные. Поэтому во всех указанных выше задачах производится анализ выдаваемого в качестве результата двоичного дерева: оно должно быть деревом поиска, состоять из требуемых вершин и иметь высоту, равную 1+[Log2N], где N - число его вершин (для задачи 17.17 и). Конкретное расположение ребер между вершинами не имеет значения.

б) Алгебраические задачи на нахождение корней уравнений, геометрические задачи на нахождение точек пересечения прямых, элементов треугольников и проч. ([1], 4.12 г) и д), 5.52, 11.22, 18.3). Результат (совокупность чисел) может быть выведен в любом порядке.

в) Задачи 18.34, 18.35, 18.36, 18.38 и 18.40 из книги [1]. Это задачи, каждая из которых требует специального подхода к анализу решения. В САТП проверка правильности производится по специальным алгоритмам, индивидуальным для каждой из задач.

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

2) 18.35. Задано N предметов. О каждом из них известен его вес и стоимость. Требуется найти такую выборку из этих предметов, чтобы их совокупный вес не превышал заданной величины, а стоимость была максимальной. Верным считается любая выборка с максимально возможной стоимостью и, если таких выборок больше одной, то правильной считается выборка с минимальным совокупным весом.

3) 18.36. Заданы N натуральных чисел Х1, Х2,...,Хп и число 8. Требуется так расставить знаки арифметических операций между числами х1, х2,...,хп, чтобы получившееся выражение имело значение 8. Любая расстановка со значением выражения, равным 8, считается верной. Пример: N=3, числа равны 1, 2 и 3, 8=6. Допустимые ответы: 1*2*3 и 1+2+3.

4) 18.38. Даны координаты концов N отрезков на прямой. Найти любую точку, принадлежащую максимальному количеству отрезков. Пример: N=2, отрезки [0,4] и [2,6]. Любая точка на отрезке [2,4] считается верным ответом.

5) 18.40. Даны координаты центров и радиусы N кругов на плоскости. Определить, существует ли хотя бы одна точка, принадлежащая всем этим кругам, и, если существует, вывести ее координаты. Верным ответом считается любая точка, принадлежащая всем кругам.

г) Задание 2 из книги [3] на обработку формул специального вида (см. также [1], задачи 17.15 и 17.16). Формула определяется следующим образом.

<формула>::=<число> | <переменная> | (<фор мула><знак><формула>)

<знак>::=+|-|*

<число>::=0|1|2|3|4|5|6|7|8|9

<переменная>::=Х

Примеры формул: (Х+5), ((5-6)*Х) и т.д.

Формула, получившаяся в результате указанного в задании преобразования, проверяется на правильность следующим образом: эквивалентными считаются все формулы, отличающиеся операциями, не меняющими их значений: это прибавление нуля и умножение на единицу. Например, эквивалентны формулы (Х+5) и ((Х+5)+0), 5 и (5*1) и т.д.

3. Заключение. Использование САТП существенно облегчило преподавателям проверку правильности программ, выполняемых студентами. Особенно это касается нетривиальных задач, ручное тестирование которых произвести сложно из-за большого количества необходимых тестов и входных данных для каждого теста. В настоящее время студенты приносят на проверку программы, уже проверенные и отлаженные с помощью САТП. Преподавателю остается лишь просмотреть текст каждой программы и задать студенту необходимые вопросы.

Список литературы.

1. Пильщиков В.Н. Язык Паскаль. Упражнения и задачи. М.: Научный мир, 2003, 224 с.

2. Бордаченкова Е.А., Панферов А.А. Задания практикума. 1 курс. М.: МАКС Пресс, 2016, 48 с.

3. Трифонов Н.П., Пильщиков В.Н. Задания практикума на ЭВМ (1 курс). М.:МГУ, 2001, 34 с.

4. Новиков М.Д. Система автоматического тестирования программ, написанных на языке Паскаль. // Альманах современной науки и образования. Изд-во Грамота (Тамбов), .№6, 2017, с. 68-71.

5. Новиков М.Д. Тестирование программ на языке Паскаль, использующих динамическую память. // Eastern-European Scientific Journal, т.1, №3 (67), 2021, с. 45-47.

6. Новиков М.Д. Автоматическое тестирование студенческих программ. // В сб. Математические основы информатики и информационно-коммуникационных систем. Всероссийская научная конференция. Тверь, 2021, с. 235-239.

i Надоели баннеры? Вы всегда можете отключить рекламу.