Programming Taskbook


E-mail:

Пароль:

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

English

ЮФУ SMBU

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

©  М. Э. Абрамян (Южный федеральный университет, Университет МГУ-ППИ в Шэньчжэне), 1998–2025

 

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

PrevNext


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

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

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

Описание ориентировано на версию задачника 4.25, в которой для языка Python можно использовать среды IDLE, PyCharm, WingIDE и VS Code, а дла языка R — среду RStudio.

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

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

Проект-заготовка, созданный для языка Python, состоит из двух файлов: файла pt4.py, содержащего вспомогательный модуль pt4, и файла, в котором требуется ввести решение задачи. Этот файл имеет имя, совпадающее с именем задания, и расширение pyw (в нашем случае — Begin3.pyw). Именно этот файл и будет автоматически загружен в интегрированную среду IDLE (а также в редактор сред PyCharm, Wing IDE или VS Code при их использовании для выполнения задания на языке Python).

Приведем вид окна данной среды после загрузки файла с заготовкой (такой вид имеет заготовка для программ на Python, начиная с версии 4.22; в предыдущих версиях задачника вид заготовки несколько отличается от приведенного):

Проект-заготовка, созданный для языка R, также состоит из двух файлов, играющих аналогичную роль: файл PT4.R содержит вспомогательные функции задачника для языка R, а файла Begin3.R — функцию Solve, в которой требуется ввести решение задачи. При этом файл Begin3.R будет автоматически загружен в интегрированную среду RStudio. Приведем содержимое файла Begin3.R:

[R]

source("PT4.R")
Solve <- function() {
  Task("Begin1")

}

Start(Solve)

Сравнивая заготовки для языков Python и R, нетрудно заметить много общего.

Текст программы на языке Python состоит всего из четырех непустых строк. В первой строке к программе подключаются все функции, определенные в модуле pt4. Вторая строка в заготовке для Python является заголовком функции solve, в которой необходимо запрограммировать решение задачи, а в третьей строке (которая пока является единственным оператором функции solve) вызывается функция task, которая определена в модуле pt4 и инициализирует задание с указанным именем. В завершающей, четвертой непустой строке вызывается служебная функция start из модуля pt4, которая обеспечивает вызов функции solve для проверки правильности предложенного решения.

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

Данную программу уже можно запустить на выполнение. Для этого в среде IDLE достаточно нажать клавишу [F5] (или выполнить команду «Run | Run Module»). Заметим, что эту же клавишу [F5] можно использовать для запуска программ на языке Python в средах Wing IDE и VS Code (в среде PyCharm для запуска программ предназначена комбинация [Shift]+[F10]).

В среде RStudio для запуска программы на выполнение достаточно нажать комбинацию клавиш [Ctrl]+[Shift]+[S].

Примечание 1. При первом запуске в среде PyCharm программы, использующей задачник, может появиться диалоговое окно Edit configuration. Это происходит в ситуации, когда исполняющая система (интерпретатор) Python еще не связана с созданным проектом. В этом случае надо выполнить действия, описанные в разделе «Настройка интегрированных сред для языка Python» (подраздел «Среда PyCharm», пункт 5).

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

После запуска программы из среды IDLE на экране появятся два окна: окно отладчика Python Shell, в котором указываются развернутые сообщения об ошибках и информации о результатах всех запусков программ, и окно задачника, содержащее формулировку задания и пример исходных данных. При использовании сред Wing IDE, VS Code и PyCharm для языка Python, а также среды RStudio для языка R, появится только окно задачника, поскольку раздел Python Shell (и соответствующий раздел Console для RStudio) выводится в нижней части окна этих сред.

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




Запуск нашей программы был признан ознакомительным (и поэтому правильность решения не анализировалась), так как в ходе ее выполнения не было совершено ни одной операции ввода-вывода. Для завершения программы достаточно закрыть окно задачника, нажав кнопку «Выход (Esc)», клавишу [Esc] или клавиши [F5], [F6] или [F10]. Заметим, что после закрытия окна задачника в окне Python Shell будет выведено описание результатов данного запуска программы (аналогичная информация будет выведена и в разделе Python Shell в окнах других сред для языка Python и в разделе Console среды RStudio):

В среде IDLE для перехода к окну с текстом программы достаточно щелкнуть мышью на этом окне или использовать клавиатурную комбинацию [Alt]+[Tab] (в других средах после завершения программы происходит автоматический возврат в раздел с текстом программы).

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

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

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

Для ввода вещественных исходных данных для языка Python мы можем использовать функцию get_float, обеспечивающую ввод вещественных чисел, или «универсальную» функцию get, позволяющую ввести данные любого типа. Использование «универсальной» функции get не позволяет задачнику распознать ошибки, связанные с несоответствием типа вводимых данных, однако универсальной функцией пользоваться проще. Для языка R специализированные функции ввода не предусмотрены, и ввод данных любого типа надо выполнять с помощью универсальной функции Get. Поэтому для единообразного описания программ на языках Python и R мы будем использовать универсальную функцию ввода (здесь и далее мы будем приводить только текст функции solve, поскольку строки, предшествующие данной функции и следующие за ней, изменять не требуется):

[Python]

def solve():
    task("Begin3")
    a = get()
    b = get()

[R]

Solve <- function() {
    Task("Begin3")
    a <- Get()
    b <- Get()
}

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

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

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

Примечание. При запуске нового варианта программы среда IDLE может вывести запрос о необходимости сохранения измененного содержимого файла Begin3.pyw. Чтобы такие запросы не выводились при каждом запуске (если перед запуском мы забудем повторно сохранить текст программы), можно установить соответствующую настройку среды IDLE. Для этого надо выполнить команду «Options | Configure IDLE...», в появившемся диалоговом окне «idle» перейти на вкладку «General» и в разделе «At Start of Run (F5)» выбрать радиокнопку «No Prompt». Для закрытия диалогового окна надо нажать кнопку «OK». Заметим также, что для быстрого сохранения измененного текста программы достаточно нажать комбинацию клавиш [Ctrl]+[S]. В других средах (в том числе и в среде RStudio для языка R) сохранение текста программы перед ее запуском выполняется автоматически.

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

Выполним необходимые вычисления и выведем результаты, используя метод put:

[Python]

def solve():
    task("Begin3")
    a = get()
    b = get()
    p = 2 * (a + b)
    s = a * b
    put(P, S)

[R]

Solve <- function() {
    Task("Begin3")
    a <- Get()
    b <- Get()
    p <- 2 * (a + b)
    s <- a * b
    Put(P, S)
}

При запуске этого варианта программы для языка Python в информационной панели окна задачника будет выведен текст (на красном фоне) «Error NameError: name 'P' is not defined» (аналогичное сообщение будет выведено и в случае языка R). После закрытия окна задачника более развернутое описание ошибки будет выведено в окне Python Shell (для языка R аналогичное описание будет выведено в разделе Console):

В этом окне дополнительно указывается оператор, в котором произошла ошибка, и его местонахождение в тексте программы. Заметим, что в среде IDLE предусмотрена возможность быстрого перехода к строке программы, в которой произошла ошибка. Для этого достаточно щелкнуть правой кнопкой мыши либо на строке, в которой указан номер ошибочной строки программы (File "C:\PT4Work\Begin3.pyw", line 8, in solve), либо на строке, в которой приведен сам ошибочный оператор (put(P, S)), и в появившемся меню выбрать пункт «Go to file/line» (в других средах строка с ошибочным оператором выделяется автоматически, а в средах VS Code и PyCharm ошибки дополнительно подчеркиваются красной волнистой линией).

Наша ошибка объясняется тем обстоятельством, что в программах на языках Python и R учитывается регистр символов, и поэтому переменные p и P считаются различными. Так как ранее переменной P ничего не было присвоено, она считается неопределенной, о чем и выводится сообщение. Для исправления программы достаточно изменить ее последний оператор:

[Python]

  put(p, s)

[R]

  Put(p, s)

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


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

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

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

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

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

Исправим допущенную ошибку:

[Python]

  put(s, p)

[R]

  Put(s, p)

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

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

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


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

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

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

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

В случае языка R информация будет аналогичной, за исключением того, что в качестве буквы языка используется «R» и вместо текста «Error NameError» будет указан текст «Error in Solve() : объект 'P' не найден».

Полученную программу на языке Python, сохраненную в файле Begin3.pyw, можно запускать на выполнение и непосредственно из операционной системы. Для этого достаточно выполнить на значке файла двойной щелчок мышью. Учитывая расширение pyw, система запустит интерпретатор Python, сразу передав ему на обработку программу, содержащуюся в указанном файле. Благодаря последней букве расширения «w» будет запущен вариант интерпретатора pythonw.exe, отличающийся от «обычного» интерпретатора python.exe тем, что он не использует консольное окно для ввода-вывода данных (в нашем случае нет необходимости в отображении консольного окна, так как основная информация о результатах работы программы выводится в графическом окне электронного задачника).

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

[Python]

def solve():
    task("Begin3")
    a = get()
    b = get()
    put(a * b, 2 * (a + b))

[R]

Solve <- function() {
    Task("Begin3")
    a <- Get()
    b <- Get()
    Put(a * b, 2 * (a + b))
}

Примечание 2. Текст программы на языке Python можно еще немного сократить, если использовать для ввода функцию get2, которая сразу вводит два элемента исходных данных и возвращает их в виде кортежа (эта функция, наряду с другими дополнительными функциями ввода, появилась в версии задачника 4.19):

[Python]

def solve():
    task("Begin3")
    a, b = get2()
    put(a * b, 2 * (a + b))

В языке R отсутствует оператор множественного присваивания, однако можно воспользоваться функцией GetV, которая позволяет ввести вектор нужного размера. В этом случае для обращения к элементам вектора надо использовать операцию индексирования (заметим, что индексы в языке R, в отличие от Python, начинаются от 1):

[R]

Solve <- function() {
    Task("Begin3")
    a <- GetV(2)
    Put(a[1] * a[2], 2 * (a[1] + a[2]))
}

Примечание 3. При работе в редакторе VS Code можно переключаться на другие задачи, если для них уже созданы заготовки. Для этого достаточно перейти в режим проводника (нажав [Ctrl]+[Shift]+[E]) и выполнить двойной щелчок мышью на требуемом файле с расширением pyw. Можно также переключаться между уже загруженными в редактор файлами и запускать любой из них на выполнение. Кроме того, можно создавать новые заготовки с помощью программы PT4Load, не закрывая окно редактора VS Code; при этом новая заготовка будет добавлена к уже загруженным в редактор файлам. Все описанные возможности доступны и в среде RStudio для языка R; список файлов из рабочего каталога отображается на вкладке Files, обычно расположенной в правом нижнем углу окна среды.

В среду Wing IDE также можно загружать файлы для различных заданий, а также, не закрывая эту среду, вызывать программу PT4Load для создания новых заготовок. Любой из загруженных файлов можно запускать на выполнение.

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


PrevNext

 

Рейтинг@Mail.ru

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

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