Пример выполнения простого задания: Begin3
На данной странице приводится пошаговое описание процесса решения на языке
C++ следующего простого задания из группы Begin.
Begin3°. Даны стороны прямоугольника a и b.
Найти его площадь S = ab и
периметр P = 2(a + b).
В качестве среды программирования используется среда Visual Studio 2003,
однако аналогичные результаты будут получены и при выполнении приведенных
программ в средах C++Builder версии 4.0 и 5.0, Visual C++ 6.0 и Visual Studio 2005, 2008, 2010.
Создание программы-заготовки и знакомство с заданием
Для создания проекта, содержащего заготовку для требуемого задания, следует
воспользоваться программным модулем PT4Load. Для этого достаточно
перейти в рабочий каталог задачника и с помощью ярлыка Load.lnk запустить
программу-утилиту PT4Load.exe. На экране появится окно модуля PT4Load,
в котором
следует указать имя нужного задания. Отметим, что в заголовке этого окна указывается имя той
программной среды, для которой будет создана заготовка. Приведем имена сред,
связанных с языком C++: [CB4] и [CB5] среда Borland C++Builder версии 4.0 и
5.0, [VC6] среда Microsoft Visual C++ 6.0, [VCNET1], [VCNET2], [VCNET3] и [VCNET4]
среда Microsoft Visual Studio 2003, 2005, 2008 и 2010.
Проект-заготовка, созданный для системы Visual Studio 2003 (как и для других
систем программирования на C++), состоит из нескольких файлов, однако для
решения задания нам потребуется только файл Begin3.cpp. Именно этот файл будет
загружен в редактор среды Visual Studio. Приведем начальную часть содержимого
данного файла:
#include <windows.h>
#pragma hdrstop
#include "pt4.h"
void Solve()
{
Task("Begin3");
}
Эта часть содержит описание функции Solve, в которой необходимо
запрограммировать решение задания Begin3 (хотя, разумеется, в этом решении могут
использоваться вспомогательные функции, описанные в том же файле Begin3.cpp или
в других файлах, подключенных к проекту). Функция Solve уже содержит вызов
функции Task, инициализирующей задание Begin3.
#include <vcl.h>
#pragma hdrstop
#include "pt4.h"
USEUNIT("pt4.cpp");
Файл Begin3.cpp содержит также описание стартовой функции WinMain, в
которой производится вызов функции Solve. Данный фрагмент текста программы не
требует редактирования при выполнении задания, поэтому приводить его здесь мы не
будем.
Следует обратить внимание на то, что к файлу Begin3.cpp подключается
заголовочный файл pt4.h, содержащий описания вспомогательных типов и функций, в
частности, функции ввода-вывода GetPut). Реализация данных функций
содержится в файле pt4.cpp. Поскольку содержимое файла pt4.cpp не требует
редактирования, данный файл не загружается в редактор среды Visual Studio. Однако
он входит в проект, в чем можно убедиться, посмотрев на окно Solution Explorer
(данное окно обычно располагается в правой части окна среды Visual Studio).
Имя созданного проекта ptprj не зависит от имени выбранного
задания. Это сделано для того, чтобы при выполнении любого задания
вспомогательные файлы, создаваемые системой Visual Studio и размещаемые в
подкаталоге Debug, не дублировались, а просто заменяли ранее созданные. Тем
самым обеспечивается существенная экономия дискового пространства, поскольку
суммарный размер этих вспомогательных файлов может достигать нескольких
мегабайтов.
Запустим программу, нажав клавишу [F5] или комбинацию клавиш [Ctrl]+[F5],
запускающую программу в более быстром режиме с отключенным отладчиком (в
среде Borland C++Builder для запуска программ предназначена клавиша [F9]).
Перед компиляцией программы среда Visual
Studio может вывести диалоговое окно следующего вида.
В этом случае надо выбрать вариант «Да» (достаточно нажать
клавишу [Enter]). После компиляции и запуска программы мы сможем увидеть на
экране окно задачника с формулировкой задания и примером исходных данных.
Запуск нашей программы был признан ознакомительным (и поэтому
правильность решения не анализировалась), так как в ходе ее выполнения не было
совершено ни одной операции ввода-вывода.
Ввод исходных данных
Приступая к решению задания, надо прежде всего организовать ввод в
программу исходных данных. В нашем случае исходными данными являются
вещественные числа a и b, определяющие стороны прямоугольника (в области
исходных данных эти числа выделены желтым цветом и снабжены комментариями).
При вводе исходных данных важно правильно указывать их тип, в противном
случае задачник зафиксирует ошибку. Продемонстрируем это на примере нашей
программы, организовав считывание исходных данные в переменные целого типа,
используя функцию GetN. Для этого закроем окно задачника (нажав кнопку
«Выход», клавишу Esc или клавишу [F5]) и дополним текст функции
Solve следующим образом:
void Solve()
{
Task("Begin3");
int a, b;
GetN(a);
GetN(b);
}
Повторно запустив программу, мы увидим, что исходные данные изменились.
При каждом запуске генерируется новый набор исходных данных, поэтому для
успешного решения задания необходимо запрограммировать алгоритм, правильно
обрабатывающий любой допустимый набор исходных данных.
Поскольку мы попытались ввести исходные данные (т. е.
продемонстрировали намерение выполнить задание), данный запуск программы уже
не считается ознакомительным. Однако тип исходных данных был выбран нами
неправильно, поэтому на информационной панели будет выведена следующая
информация об ошибке (на красном фоне): «Неверно указан тип при вводе
исходных данных. Для ввода 1-го элемента (вещественного типа) использована
переменная целого типа».
Для правильного ввода исходных данных в нашем случае надо использовать
функцию GetD, обеспечивающую ввод данных типа double. Исправим
соответствующим образом функцию Solve:
void Solve()
{
Task("Begin3");
double a, b;
GetD(a);
GetD(b);
}
Теперь ввод данных выполнен правильно. Однако наша программа не выводит
результатов, поэтому ее работа опять признана ошибочной с диагностикой
«Выведены не все результирующие данные. Количество выведенных данных: 0
(из 2)».
Вычисления и вывод полученных данных
Выполним необходимые вычисления и выведем результаты, используя
функцию PutD:
void Solve()
{
Task("Begin3");
double a, b;
GetD(a);
GetD(b);
double S = a * b, P = 2 * (a + b);
PutD(P);
PutD(S);
}
После запуска программы мы можем убедиться, что найденные значения
выведены в разделе результирующих данных. Но из-за того, что вначале мы вывели
значение периметра P, а затем значение площади S, решение по-прежнему
признано неверным, а сообщение об ошибке имеет вид «Ошибочное
решение». Подобное сообщение означает, что все исходные данные были
введены, все результирующие данные выведены, но значения полученных
результатов не совпадают с контрольными. Перейдя на вкладку «Пример
верного решения», мы можем убедиться в том, что площадь и периметр
найдены верно и нарушен только порядок их вывода.
Таким образом, важно не только найти правильные значения результирующих
данных, но и вывести их в нужном порядке. Для того чтобы указать этот порядок, в
разделе результатов используется поясняющий текст (см. приведенный выше рисунок
окна задачника). Заметим, что исходные данные тоже важно вводить именно в том
порядке, в котором они указаны в окне задачника. Общее правило здесь следующее:
ввод и вывод данных производится по строкам (слева направо), а строки
просматриваются сверху вниз. Иными словами, данные, отображаемые в окне
задачника, вводятся и выводятся в том порядке, в котором читается обычный текст на
русском языке.
Правильное решение и его тестирование
Исправим допущенную ошибку, поменяв местами два последних оператора в
функции Solve:
PutD(S);
PutD(P);
После запуска исправленной программы на информационной панели окна
задачника будет выведено сообщение на зеленом фоне: «Верное решение. Тест
номер 1 (из 3)».
Таким образом, мы провели первое успешное испытание нашей программы.
Однако однократное успешное испытание алгоритма еще не означает, что он является
правильным. Для того чтобы получить уверенность в правильности алгоритма, его
надо протестировать несколько раз на различных наборах данных. Количество
тестовых испытаний, требующихся для каждого учебного задания, различно и может
меняться в пределах от 3 до 9 (для простого задания Begin3 число испытаний равно
3). Если нужное количество испытаний, проведенных подряд, прошло успешно, то на
информационной панели появится сообщение «Задание выполнено!».
Если же в ходе очередного испытания будет получено неверное решение, то счетчик
количества успешных испытаний для данного задания будет сброшен в 0, и после
исправления алгоритма программу придется тестировать заново.
В нашем случае алгоритм является правильным, поэтому после трех запусков на
информационной панели окна задачника появится текст «Задание
выполнено!». Выполнение задания Begin3 завершено.
С помощью модуля PT4Results можно просмотреть информацию о ходе
выполнения задания. Проще всего это сделать, используя команду «Tools | PT4
Results» меню Visual Studio. Напомним, что команда «Tools | PT4
Load» из этого же меню позволяет создать заготовку для выполнения нового
задания.
void Solve()
{
Task("Begin3");
double a, b;
pt >> a >> b;
pt << a * b << 2 * (a + b);
}
|