Пример выполнения простого задания: Begin3
На данной странице приводится пошаговое описание процесса решения в системе PascalABC.NET
следующего простого учебного задания из группы Begin.
Begin3°. Даны стороны прямоугольника a и b.
Найти его площадь S = ab и
периметр P = 2(a + b).
Создание программы-заготовки и знакомство с заданием
Для создания программы, содержащей заготовку для требуемого задания, следует
воспользоваться программным модулем PT4Load. Для этого достаточно
запустить программу PT4Load.exe, выполнив команду меню «Модули|Создать шаблон программы»
(можно также воспользоваться кнопкой на панели инструментов окна PascalABC.NET или комбинацией Ctrl+Alt+L).
В результате на экране появится окно модуля PT4Load, в котором следует указать
имя нужного задания.
Программа-заготовка, созданная для системы PascalABC.NET и
предназначенная для выполнения задания Begin3, будет сохранена в файле
Begin3.pas, содержащем следующий текст:
uses PT4;
begin
Task('Begin3');
end.
Данная программа содержит оператор uses подключения вспомогательных модулей, а также
вызов процедуры Task, инициализирующей задание Begin3.
Отметим, что при выполнении заданий в среде PascalABC.NET следует
обеспечивать автоматическое сохранение успешно откомпилированного файла.
Для этого следует выполнить команду меню «Сервис | Настройки...»
и в появившемся окне в разделе «Общие» установить флажок «Сохранять файлы, если компиляция прошла успешно».
Кроме того, желательно не использовать режим автоматического удаления exe-файла после завершения
выполнения программы. Для этого в том же окне настроек в разделе «Опции компиляции»
надо снять флажок «Удалять EXE-файл после выполнения».
После установки требуемых настроек следует закрыть диалоговое
окно «Настройки», нажав кнопку «OK».
Запустим программу, нажав клавишу [F9], чтобы увидеть на экране окно
задачника с формулировкой задания и примером исходных данных.
Начиная с версии 4.11, окно задачника может отображаться в двух режимах:
с динамической компоновкой, при которой каждый раздел «подстраивается» под свое содержимое,
и с фиксированной компоновкой, при которой каждый раздел имеет фиксированные размеры.
В предыдущих версиях задачника был доступен только режим с фиксированной компоновкой. Режим
с динамической компоновкой особенно удобен для заданий с большими формулировками и большими наборами данных
(для переключения режимов предназначена клавиша [F4]).
Запуск нашей программы был признан ознакомительным (и поэтому
правильность решения не анализировалась), так как в ходе ее выполнения не было
совершено ни одной операции ввода-вывода.
Ввод исходных данных
Приступая к решению задачи, надо прежде всего организовать ввод в
программу исходных данных. В нашем случае исходными данными являются
вещественные числа a и b, определяющие стороны прямоугольника (в области
исходных данных эти числа выделены желтым цветом и снабжены комментариями).
При вводе исходных данных важно правильно указывать их тип, в противном
случае задачник зафиксирует ошибку. Продемонстрируем это на примере нашей
программы, организовав считывание исходных данные в переменные целого типа,
используя функцию ReadInteger2.
Для этого закроем окно задачника (нажав кнопку
«Выход», клавишу [Esc] или клавишу [F9]) и дополним нашу программу
следующим образом (для краткости мы здесь и в дальнейшем не будем указывать
директиву uses):
begin
Task('Begin3');
var (a, b) := ReadInteger2;
end.
Повторно запустив программу, мы увидим, что исходные данные изменились.
При каждом запуске генерируется новый набор исходных данных, поэтому для
успешного решения задания необходимо запрограммировать алгоритм, правильно
обрабатывающий любой допустимый набор исходных данных.
Поскольку мы попытались ввести исходные данные (т. е.
продемонстрировали намерение выполнить задание), данный запуск программы уже
не считается ознакомительным. Однако функция для ввода исходных данных была выбрана нами
неправильно, поэтому на информационной панели будет выведена следующая
информация об ошибке (на фиолетовом фоне): «Неверно указан тип при вводе
исходных данных. Для ввода 1-го элемента (вещественного типа) использована
переменная целого типа»:
Следует обратить внимание на индикаторы, появившиеся в окне задачника
(индикаторы были добавлены в окно задачника в версии 4.11).
В окне с динамической компоновкой для индикаторов отводится
специальная панель, которая располагается под информационной панелью; в качестве индикаторов
используются цветные горизонтальные полосы, а также цветные квадратные маркеры.
Полосы серого цвета показывают, какая часть исходных данных была введена
в ходе выполнения задания и какая часть результатов была выведена.
В нашем случае задачник зафиксировал ввод только одного элемента исходных данных (из двух
имеющихся).
Это объясняется тем, что уже при вводе первого элемента было обнаружено несоответствие типов,
и поэтому оставшаяся часть решения не анализировалась.
Полосы и маркеры различных оттенков красного цвета определяют характер обнаруженной ошибки,
а также указывают, к какой группе данных (исходных или результирующих) эта ошибка относится.
В нашем случае ошибка несоответствия типа была выявлена для исходных данных, поэтому
заголовок раздела с исходными данными был выделен фиолетовым цветом и, кроме того, на панели индикаторов
в области «Ввод», появился фиолетовый маркер.
Для правильного ввода исходных данных в нашем случае надо использовать
функцию ReadRead2, обеспечивающую ввод двух элементов данных типа real.
Исправим
соответствующим образом нашу программу:
begin
Task('Begin3');
var (a, b) := ReadReal2;
end.
Теперь ввод данных выполнен правильно. Однако наша программа не выводит
результатов. Начиная с версии 4.15, в данной ситуации выводится сообщение
на светло-синем фоне: «Запуск с правильным вводом данных: все требуемые
исходные данные введены, результаты не выведены»:
Светло-синяя индикация означает, что успешно пройден первый этап решения:
ввод исходных данных. Заметим, что в предыдущих версиях задачника в аналогичной ситуации
выводилось сообщение об ошибке на оранжевом фоне
«Выведены не все результирующие данные. Количество выведенных данных: 0
(из 2)».
Вычисления и вывод полученных данных
Выполним необходимые вычисления и выведем результаты, используя
стандартную процедуру Print:
begin
Task('Begin3');
var (a, b) := ReadReal2;
var (P, S) := (2 * (a + b), a * b);
Print(P, S);
end.
После запуска программы мы можем убедиться, что найденные значения
выведены в разделе результирующих данных. Но из-за того, что вначале мы вывели
значение периметра P, а затем значение площади S, решение по-прежнему
признано неверным, а сообщение об ошибке имеет вид «Ошибочное
решение». Подобное сообщение означает, что все исходные данные были
введены, все результирующие данные выведены, но значения полученных
результатов не совпадают с контрольными:
Индикаторы показывают, что были введены и выведены все требуемые данные.
Обратившись к примеру верного решения,
приведенному в окне задачника ниже раздела результатов, мы видим, что площадь и периметр
найдены верно и нарушен только порядок их вывода.
Таким образом, важно не только найти правильные значения результирующих
данных, но и вывести их в нужном порядке. Для того чтобы указать этот порядок, в
разделе результатов используется поясняющий текст (см. приведенный выше рисунок
окна задачника). Заметим, что исходные данные тоже важно вводить именно в том
порядке, в котором они указаны в окне задачника. Общее правило здесь следующее:
ввод и вывод данных производится по строкам (слева направо), а строки
просматриваются сверху вниз. Иными словами, данные, отображаемые в окне
задачника, вводятся и выводятся в том порядке, в котором читается обычный текст на
русском языке.
Правильное решение и его тестирование
Исправим допущенную ошибку, поменяв местами параметры в процедуре Print:
Print(S, P);
После запуска исправленной программы на экране появится окно прогресса тестирования:
Данное окно отображается на экране, если программа успешно обработала хотя бы один
набор исходных данных. Полоса прогресса показывает, сколько тестов было успешно пройдено
к текущему моменту, а текст над полосой дублирует эту информацию и позволяет определить количество тестов,
которое должна успешно пройти программа, чтобы задание считалось выполненным.
Тестирование программы завершается в двух случаях: когда будет успешно пройдено требуемое число
тестов или когда при прохождении очередного теста будет выявлена ошибка.
Если при очередном тестовом испытании произойдет «зависание» программы
(например, из-за зацикливания алгоритма), то для завершения работы программы
достаточно прервать выполнение программы, выполнив команду меню «Программа | Завершить»
(можно также нажать кнопку с синим квадратом на панели инструментов или клавишу Ctrl+F2).
В нашем случае решение не содержит ошибок, поэтому после прохождения трех успешных тестов
на экране появится окно задачника с сообщением «Задание выполнено!».
Выполнение задания Begin3 завершено:
Возможность автоматического тестирования программы на нескольких
наборах исходных данных была реализована в версии 4.13 задачника. В предыдущих версиях
для тестирования на различных наборах данных программу требовалось запускать несколько раз;
при этом на информационной панели выводилась информация о количестве успешно пройденных тестов.
Возможность подобного «пошагового» тестирования сохранена и в версии 4.13; для этого
надо дополнить имя задания в процедуре Task символом «!» (восклицательный знак).
С помощью модуля PT4Results можно просмотреть информацию о ходе
выполнения задания (начиная с версии 4.11, этот модуль можно вызывать непосредственно из окна задачника;
для этого достаточно нажать клавишу [F2] или щелкнуть мышью на метке с описанием этой клавиши,
размещенной в правом верхнем углу окна задачника):
Begin3 A04/02 14:57 Ознакомительный запуск.
Begin3 A04/02 15:07 Неверно указан тип при вводе исходных данных.
Begin3 A04/02 15:09 Запуск с правильным вводом данных.
Begin3 A04/02 15:12 Ошибочное решение.
Begin3 A04/02 15:15 Задание выполнено!
Буква «A», указанная перед датой, означает, что задание выполнялось на языке PascalABC.NET.
begin
Task('Begin3');
var (a, b) := ReadReal2;
Print(a * b, 2 * (a + b));
end.
|