Programming Taskbook


E-mail:

Пароль:

Регистрация пользователя   Восстановление пароля

English

ЮФУ

Электронный задачник по программированию

©  М. Э. Абрамян (Южный федеральный университет), 1998–2023

 

Решения | Java | Простое задание

PrevNext


Пример выполнения простого задания: Begin3

На данной странице приводится пошаговое описание процесса решения на языке Java следующего простого учебного задания из группы Begin.

Begin3°. Даны стороны прямоугольника a и b. Найти его площадь S = ab и периметр P = 2(a + b).

В качестве среды программирования используется среда VS Code, доступная для совместного использования с задачником, начиная с его версии 4.22. Аналогичные результаты будут получены и при выполнении приведенных программ в среде Eclipse (в версиях задачника, предшествующих версии 4.22, для выполнения заданий на языке Java можно было также использовать среды NetBeans IDE версий 6 и 7).

Создание программы-заготовки и знакомство с заданием

Для создания проекта, содержащего заготовку для требуемого задания, следует воспользоваться программным модулем PT4Load. Для этого достаточно перейти в рабочий каталог задачника и с помощью ярлыка Load.lnk запустить программу PT4Load.exe (начиная с версии 4.22, для быстрого запуска любых модулей задачника можно использовать программу PT4Panel, ярлык которой располагается на рабочем столе и в любом рабочем каталоге). В результате на экране появится окно модуля PT4Load, в котором следует указать имя нужного задания. Отметим, что в заголовке этого окна указывается краткое имя той программной среды, для которой будет создана заготовка (в нашем случае [Visual Studio Code (Java)]).

При создании первого проекта-заготовки для среды NetBeans на экран выводится информационное окно:

Созданный проект-заготовка размещается в подкаталоге PT_Java рабочего каталога учащегося и состоит из нескольких подкаталогов и файлов, однако для решения задания нам потребуется только один файл с именем MyTask.java, находящийся в подкаталоге src. Именно этот файл будет загружен в редактор среды VS Code. Приведем его начальную часть (первая строка-комментарий указывает имя файла с расширением .java, в котором хранится копия файла MyTask.java в рабочем каталоге учащегося):

// File: "Begin3"
public class MyTask extends PT
{
    public static void solve() throws Exception
    {
        task("Begin3");
    }
}

В конце файла содержится описание стартовой функции main, изменять которую при выполнении заданий не следует.

Файл MyTask.java содержит описание класса MyTask (этот класс является потомком класса PT, описанного в файле PT.java, также входящего в проект). Функция solve — метод класса MyTask — содержит вызов функции task, инициализирующей задание Begin3. Решение задачи необходимо запрограммировать в функции solve (хотя, разумеется, в решении могут использоваться другие функции, описанные в данном проекте).

Заметим, что функция task (наряду с функциями группы get и функцией put) является классовым методом класса PT (она описана с атрибутом static). Однако перед ее именем можно не указывать имя класса PT, поскольку task вызывается из метода solve класса MyTask — потомка класса PT.

Заметим также, что функция main, описанная в конце файла MyTask.java и являющаяся стартовой при выполнении программы на языке java, реализована в виде классового метода класса MyTask и вызывает единственный метод start класса PT (в методе start происходит вызов функции solve, решающей задачу; этот метод описан в файле PT.java). Поскольку содержимое файла PT.java не требует редактирования, данный файл не загружается в редактор среды NetBeans. Однако он входит в проект, в чем можно убедиться, установив для редактора VS Code режим проводника ([Ctrl]+[Shift]+[E]) и развернув в списке файлов и каталогов (который появится в левой части окна) каталог src.

Запустим программу, нажав клавишу [F5] (или [F11] в случае использования среды Eclipse), чтобы увидеть на экране окно задачника с формулировкой задания и примером исходных данных. Начиная с версии 4.11, окно задачника может отображаться в двух режимах: с динамической компоновкой, при которой каждый раздел «подстраивается» под свое содержимое, и с фиксированной компоновкой, при которой каждый раздел имеет фиксированные размеры. В предыдущих версиях задачника был доступен только режим с фиксированной компоновкой. Режим с динамической компоновкой особенно удобен для заданий с большими формулировками и большими наборами данных. Ниже приведены оба режима окна для данного задания; вначале указан режим с динамической компоновкой (для переключения режимов предназначена клавиша [F4]).




Запуск нашей программы был признан ознакомительным (и поэтому правильность решения не анализировалась), так как в ходе ее выполнения не было выполнено ни одной операции ввода-вывода.

Примечание 1. При первом запуске программы, использующей электронный задачник версии 4.20 или более ранней, может быть выведено диалоговое окно с сообщением о невозможности загрузить библиотеку PT4.dll. Причина этого обычно заключается в том, что с используемой средой (NetBeans или Eclipse) связана 64-разрядная среда выполнения Java (JRE). В этом случае надо связать со средой 32-разрядную JRE; необходимые для этого действия описываются в том же диалоговом окне. Начиная с версии 4.21, задачник может использоваться совместно с любым вариантом JRE — как с 32-разрядным, так и с 64-разрядным.

Примечание 2. В версии 4.21 поддержка режима с фиксированной компоновкой была прекращена. Начиная с этой версии, команда Режим (F4), ранее применявшаяся для переключения между режимами с фиксированной и динамической компоновкой, обеспечивает отображение текста текущего задания в режиме html-документа. В дальнейшем в качестве иллюстраций будут использоваться только окна с динамической компоновкой.

Ввод исходных данных

Приступая к решению задачи, надо прежде всего организовать ввод в программу исходных данных. В нашем случае исходными данными являются вещественные числа a и b, определяющие стороны прямоугольника (в области исходных данных эти числа выделены желтым цветом и снабжены комментариями).

При вводе исходных данных важно правильно указывать их тип, в противном случае задачник зафиксирует ошибку. Продемонстрируем это на примере нашей программы, организовав считывание исходных данные в переменные целого типа, используя функцию getInt. Для этого закроем окно задачника (нажав кнопку «Выход», клавишу [Esc] или клавиши [F5] или [F11] в случае сред VS Code или Eclipse соответственно) и дополним текст функции solve следующим образом:

public static void solve() throws Exception
{
    task("Begin3");
    int a = getInt(), b = getInt();
}

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

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


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

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

Полосы и маркеры различных оттенков красного цвета определяют характер обнаруженной ошибки, а также указывают, к какой группе данных (исходных или результирующих) эта ошибка относится. В нашем случае ошибка несоответствия типа была выявлена для исходных данных, поэтому заголовок раздела с исходными данными был выделен фиолетовым цветом и, кроме того, на панели индикаторов в области «Ввод», появился фиолетовый маркер.

Для правильного ввода исходных данных в нашем случае надо использовать функцию getDouble, обеспечивающую ввод данных вещественного типа. Исправим соответствующим образом функцию solve:

public static void solve() throws Exception
{
    task("Begin3");
    double a = getDouble(), b = getDouble();
}

Теперь ввод данных выполнен правильно. Однако наша программа не выводит результатов. Начиная с версии 4.15, в данной ситуации выводится сообщение на светло-синем фоне: «Запуск с правильным вводом данных: все требуемые исходные данные введены, результаты не выведены». Светло-синяя индикация означает, что успешно пройден первый этап решения: ввод исходных данных. Заметим, что в предыдущих версиях задачника в аналогичной ситуации выводилось сообщение об ошибке на оранжевом фоне «Выведены не все результирующие данные. Количество выведенных данных: 0 (из 2)».

Вычисления и вывод полученных данных

Выполним необходимые вычисления и выведем результаты, используя функцию put (напомним, что в функции put можно указывать произвольное количество параметров):

public static void solve() throws Exception
{
    task("Begin3");
    double a = getDouble(), b = getDouble(), S, P;
    S = a * b;
    P = 2 * (a + b);
    put(P, S);
}

В данном фрагменте программы демонстрируются два варианта описания переменных: с инициализацией и без нее. Переменные a и b, предназначенные для хранения исходных данных, инициализируются в момент описания; при этом используется функция getDouble. Переменные S и P, предназначенные для хранения результатов, не инициализируются при описании; они получают требуемые значения при последующем выполнении двух операторов присваивания. Заметим, что вполне возможно было бы инициализировать при описании все переменные (поскольку в момент описания переменных S и P значения a и b уже известны) или, наоборот, описать все четыре переменные без инициализации, а затем задать их значения, используя операторы присваивания. Следует иметь в виду, что в языке Java неинициализированные локальные переменные не получают значения по умолчанию, а попытка обратиться к содержимому неинициализированных переменных приводит к ошибке компиляции.

После запуска программы мы можем убедиться, что найденные значения выведены в разделе результирующих данных. Но из-за того, что вначале мы вывели значение периметра P, а затем — значение площади S, решение по-прежнему признано неверным, а сообщение об ошибке имеет вид «Ошибочное решение» и выводится на красном фоне. Подобное сообщение означает, что все исходные данные были введены, все результирующие данные выведены, но значения полученных результатов не совпадают с контрольными:


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

Таким образом, важно не только найти правильные значения результирующих данных, но и вывести их в нужном порядке. Для того чтобы указать этот порядок, в разделе результатов используется поясняющий текст (см. приведенные выше рисунки окна задачника). Заметим, что исходные данные тоже важно вводить именно в том порядке, в котором они указаны в окне задачника. Общее правило здесь следующее: ввод и вывод данных производится по строкам (слева направо), а строки просматриваются сверху вниз. Иными словами, данные, отображаемые в окне задачника, вводятся и выводятся в том порядке, в котором читается обычный текст на русском языке.

Правильное решение и его тестирование

Исправим допущенную ошибку, изменив порядок вывода результирующих данных в функции put:

    put(S, P);

После запуска исправленной программы на экране появится окно прогресса тестирования:

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

В нашем случае решение не содержит ошибок, поэтому после прохождения трех успешных тестов на экране появится окно задачника с сообщением «Задание выполнено!». Выполнение задания Begin3 завершено:


Возможность автоматического тестирования программы на нескольких наборах исходных данных была реализована в версии 4.13 задачника. В предыдущих версиях для тестирования на различных наборах данных программу требовалось запускать несколько раз; при этом на информационной панели выводилась информация о количестве успешно пройденных тестов. Возможность подобного «пошагового» тестирования сохранена и в последующих версиях; для этого надо дополнить имя задания в функции task символом «!» (восклицательный знак).

С помощью модуля PT4Results можно просмотреть информацию о ходе выполнения задания (для вызова этого модуля непосредственно из окна задачника достаточно нажать клавишу [F2] или щелкнуть мышью на метке с описанием этой клавиши, размещенной в правом верхнем углу окна задачника):

Begin3      j04/02 14:57 Ознакомительный запуск.
Begin3      j04/02 15:07 Неверно указан тип при вводе исходных данных.
Begin3      j04/02 15:09 Запуск с правильным вводом данных.
Begin3      j04/02 15:12 Ошибочное решение.
Begin3      j04/02 15:15 Задание выполнено!

Буква «j», указанная перед датой, означает, что задание выполнялось на языке Java.

Примечание. В использовании вспомогательных переменных S и P при выполнения задания Begin3 нет необходимости, поскольку при выводе данных можно указывать не только переменные, но и выражения. Учитывая это, можно получить более короткий вариант решения задания Begin3:

public static void solve() throws Exception
{
    task("Begin3");
    double a = getDouble(), b = getDouble();
    put(a * b, 2 * (a + b));
}

PrevNext

 

Рейтинг@Mail.ru

Разработка сайта:
М. Э. Абрамян, В. Н. Брагилевский

Последнее обновление:
01.01.2023