Programming Taskbook


E-mail:

Пароль:

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

 

ЮФУ SMBU

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

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

 

PT for Exam | Выполнение заданий на языке Python | Базовые алгоритмы

PrevNext


Базовые алгоритмы: ExamBase2, ExamBase28

Группы заданий ExamBase и ExamFBase посвящены базовым алгоритмическим задачам, включенным в кодификатор ЕГЭ по информатике. Процесс выполнения подобных заданий мы рассмотрим на примере одной из простых задач, связанных с нахождением максимумов и минимумов из двух, трех или четырех чисел без использования массивов; при этом особое внимание будем уделять особенностям ввода-вывода.

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

ExamBase2°. На вход подаются три вещественных числа; числа расположены в одной строке. Вывести вначале минимальное, а затем максимальное из них. Каждое число должно выводиться на новой строке и снабжаться комментарием: «MIN=» для минимального, «MAX=» для максимального.

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

Для создания программы-заготовки для данного задания надо, как обычно, воспользоваться модулем PT4Load, введя в его окне имя задания: ExamBase2.

При выполнении задания на языке Python созданная программа-заготовка будет иметь следующий вид:

from pt4exam import *
# Для ввода используйте функцию input()
# Для вывода результатов используйте функцию print()
# с атрибутами форматирования %0.2f
# Пример (для числа а): print("%0.2f" % a)
def solve():
    task("ExamBase2")

start(solve)

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

Обсудим особенности программы-заготовки и окна задачника.

В программе-заготовке вместо модуля pt4 подключается модуль pt4exam, специально предназначенный для использования при выполнении заданий групп Exam. Данный модуль содержит реализацию функции task, инициализирующей задание, а также функций, связанных с выводом данных в раздел отладки. Подчеркнем, что функции, связанные с вводом исходных данных и выводом результатов, в него не включены. Это обусловлено тем, что ввод-вывод при выполнении заданий групп Exam надо выполнять, используя стандартные функции языка Python. Завершающий программу вызов функции start обеспечивает многократный запуск функции solve для проверки полученного решения на различных наборах исходных данных.

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

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

Чтобы обратить внимание на необходимость использования стандартных функций языка Python для ввода и вывода данных, соответствующая информация выводится в разделе отладки, расположенном в нижней части окна задачника. Кроме того, эта же информация указывается в виде комментария в начале текста программы-заготовки.

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

Ввод исходных данных и их обработка

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

def solve():
    task("ExamBase2")
    a, b, c = input().split()
    a, b, c = float(a), float(b), float(c)

Мы воспользовались стандартной функцией ввода input, которая возвращает строку исходных данных. Поскольку эта строка содержит три числа, необходимо разбить эту строку на три подстроки (с помощью функции split), записав полученные подстроки в отдельные переменные: a, b и c. После этого надо преобразовать строковые представления чисел в сами числа, используя функцию float.

Примечание. Описанные выше действия можно оформить в виде одного оператора, если использовать итератор:

    a, b, c = [float(e) for e in input().split()]

Заметим, что если бы каждое число располагалось на отдельной строке, то ввод трех чисел можно было бы оформить проще, поскольку в этом случае функция split не требуется:

    a, b, c = float(input()), float(input()), float(input())

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

Реализуем алгоритм нахождения минимального и максимального элемента. Для этого воспользуемся еще двумя переменными (min и max) и добавим в конец функции solve следующие операторы:

    if a < b:
        min, max = a, b
    else:
        min, max = b, a
    if c < min:
        min = c
    elif c > max:
        max = c;

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

Вывод результатов и их форматирование

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

Вначале, в качестве примера, организуем вывод, не соответствующий условиям задачи. Для этого добавим в конец программы следующий оператор:

    print(min, max)

Приведем вид окна задачника при запуске полученной программы:

Мы видим, что минимум и максимум найдены правильно, однако выведены не в том формате, который требовался (требуемый формат приводится в разделе с примером верного решения). Мы допустили при выводе три ошибки: во-первых, вывели оба числа в одной строке, во-вторых, не снабдили числа комментариями и, в-третьих, не настроили их отображение в формате с двумя фиксированными дробными знаками.

Примечание. Следует обратить внимание на панель индикаторов, которая отображается между информационной панелью и разделом с формулировкой задания в случае, если запуск программы не является ни демонстрационным, ни ознакомительным. Обычно на этой панели выводятся три индикатора: первый указывает количество введенных исходных данных, второй — количество выведенных результатов, а третий — количество успешно пройденных тестовых испытаний. При выполнении заданий, связанных с ЕГЭ, первые два индикатора являются неактивными, поскольку, как было отмечено выше, для получения исходных данных и записи результатов не используются средства задачника, и поэтому он не в состоянии проконтролировать каждую операцию ввода-вывода.

Для исправления первых двух ошибок достаточно изменить вывод следующим образом:

    print("MIN=", min, sep = "")
    print("MAX=", max, sep = "")

Именованный параметр sep задает разделитель между выводимыми данными (при его отсутствии в качестве разделителя используется пробел).

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

    print("MIN=%0.2f" % min)
    print("MAX=%0.2f" % max)

При форматированном выводе вначале указывается форматная строка, затем символ %, а затем — выводимые данные (отдельный элемент или список). Форматная строка может содержать обычный текст и форматирующие атрибуты для каждого выводимого элемента. Форматирующий атрибут начинается с символа % и оканчивается буквой, определяющей формат вывода (в нашем случае буква f означает формат с фиксированной точкой для вещественного числа; при выводе целых чисел обычно используется буква d, соответсвующая десятичному представлению целых чисел). Между знаком % и буквой указываются дополнительные форматные настройки: первое число определяет ширину поля вывода, а второе (для вещественных чисел) — количество дробных знаков. Мы указали нулевую ширину поля вывода; в этом случае используется ширина, минимально необходимая для отображения числа. Поскольку мы использовали форматный вывод, отпала необходимость в указании параметра sep.

Обратите внимание на то, что в разделе отладки и в начальных комментариях к программе-заготовке содержится информация о том, какие атрибуты форматирования надо использовать при выводе полученных результатов.

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

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

Вариант задания с файловым вводом

Поскольку при компьютерном проведении ЕГЭ по информатике в задачах на разработку программ обычно требуется читать исходные данные из текстовых файлов, в задачник PT for Exam версии 3.0 были добавлены группы заданий, в которых ввод исходных данных требуется выполнять аналогичным способом. Имена этих групп начинаются с префикса ExamF (символ F указывает на то, что исходные данные надо вводить из файла). Соответствующая группа заданий для изучения базовых алгоритмов имеет имя ExamFBase. Опишем особенности решения задач из этой группы на примере задачи ExamFBase2.

Созданная программа-заготовка для ExamFBase2 будет иметь следующий вид:

from pt4exam import *
# Исходные данные следует вводить с помощью функций файлового ввода.
# Для вывода результатов используйте функцию print()
# с атрибутами форматирования %0.2f
# Пример (для числа а): print("%0.2f" % a)
def solve():
    task("ExamFBase2")
    filename = get_str() # имя исходного файла

start(solve) 

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

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

Решение задачи с использованием файлового ввода

Сразу приведем пример правильного решения задачи ExamFBase2. Оно отличается от решения задачи ExamBase2 только начальной частью, в которой необходимо открыть исходный файл с именем filename, прочесть из него требуемые данные и закрыть этот файл.

from pt4exam import *
# Исходные данные следует вводить с помощью функций файлового ввода.
# Для вывода результатов используйте функцию print()
# с атрибутами форматирования %0.2f
# Пример (для числа а): print("%0.2f" % a)
def solve():
    task("ExamFBase2")
    filename = get_str() # имя исходного файла
    f = open(filename, 'r')
    line = f.readline().split()
    f.close()
    a = float(line[0])
    b = float(line[1])
    c = float(line[2])
    if a < b:
        min, max = a, b
    else:
        min, max = b, a
    if c < min:
        min = c
    elif c > max:
        max = c;
    print("MIN=%0.2f" % min)
    print("MAX=%0.2f" % max)

start(solve)

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

Ввод и вывод массивов

Рассмотрим еще одно задание группы ExamBase, особенностью которого является вывод в качестве результата элементов двумерного массива.

ExamBase28°. На вход в первой строке подаются два целых положительных числа M и N, во второй строке — вещественное число D, а в третьей строке — набор из M вещественных чисел. Сформировать и вывести двумерный вещественный массив размера M × N, у которого первый столбец совпадает с исходным набором чисел, а элементы каждого следующего столбца равны сумме соответствующего элемента предыдущего столбца и числа D (в результате каждая строка массива будет содержать элементы арифметической прогрессии). Каждую строку элементов массива выводить на новой экранной строке, для каждого числа отводить 7 экранных позиций.

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

Анализируя исходные данные, можно заметить, что полученная матрица должна иметь 7 строк, тогда как на экране отображаются только первые пять. Это связано с тем, что по умолчанию используется режим «сокращенного» отображения данных, при котором на экране выводится только несколько начальных строк. Признаком того, что имеются данные, не выведенные на экране, является многоточие, расположенное в нижней части того раздела, в котором показаны не все данные. Кроме того, в режиме сокращенного отображения окно задачника содержит кнопку, которая отображается в правом верхнем углу раздела исходных данных (на этой кнопке изображается стилизованная стрелка, направленная вниз). Для вывода всех данных достаточно нажать эту кнопку; можно также нажать клавишу [Ins] или выполнить двойной щелчок мышью в любом месте раздела с данными задания (кроме раздела, содержащего формулировку). Если выполнить эти действия для нашего окна, то оно изменится следующим образом:

Повторный двойной щелчок мышью, нажатие клавиши [Ins] или кнопки (на которой в данной ситуации будет отображаться стрелка, направленная вверх — см. рисунок) восстанавливает сокращенное отображение данных. Заметим, что в режиме сокращенного отображения нумеруется только первая строка данных, а в режиме полного отображения нумерацией снабжаются все строки.

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

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

При решении на языке Python задач на обработку массивов следует использовать стандартные структуры данных этого языка; обычно наилучшим вариантом является список (list), хотя в некоторых задачах более удобным может оказаться множество (set) или словарь (dictionary).

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

def solve():
    task("ExamBase28")
    m, n = [int(e) for e in input().split()]
    d = float(input())
    b = input().split()
    a = []
    for i in range(m):
        a.append([float(b[i])])
        for j in range(1,n):
            a[i].append(a[i][j-1] + d)
    for i in range(m):
        for j in range(n):
            print("%7.2f" % a[i][j], end = "")
        print()

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

При выводе полученного набора данных необходимо обеспечить его правильное форматирование: каждый элемент должен выводиться на семи экранных позициях с двумя дробными знаками и, кроме того, каждая прогрессия должна выводиться на новой экранной строке. Это достигается за счет использования соответствующих атрибутов форматирования и вызова функции print без параметров в конце каждой итерации второго цикла по i (при выводе элементов прогрессии используется именованный параметр end со значением "", который подавляет автоматический переход на новую экранную строку). Информация о том, как выполнить правильное форматирование выходных данных, содержится в комментариях к программе-заготовке и в разделе отладки окна задачника.

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

Начиная с версии 2.2 задачника PT for Exam, при решении задач можно использовать функции Show и ShowLine из базового задачника Programming Taskbook, отображающие требуемые данные в разделе отладки окна задачника. Описание отладочных возможностей задачника приводится на вкладке «Отладка» в окне «Информация», которое можно вызвать из окна задачника, нажав клавишу F1.

В версии 4.19 базового задачника для языка Python эти функции были переработаны, чтобы упростить отображение в разделе отладки сложных структур данных. Например, для вывода в раздел отладки содержимого матрицы a, полученной при решении задачи ExamBase28, достаточно вызвать функцию show с параметром a:

    show(a)

В результате содержимое раздела отладки примет вид, подобный приведенному ниже:

  1>  [ [ 80.40 , 81.99 , 83.58 , 85.17 , 86.76 ]
  2>    [ 57.64 , 59.23 , 60.82 , 62.41 , 64.00 ]
  3>    [ 6.79 , 8.38 , 9.97 , 11.56 , 13.15 ]
  4>    [ 21.77 , 23.36 , 24.95 , 26.54 , 28.13 ]
  5>    [ 32.54 , 34.13 , 35.72 , 37.31 , 38.90 ]
  6>    [ 2.92 , 4.51 , 6.10 , 7.69 , 9.28 ]
  7>    [ 99.94 , 101.53 , 103.12 , 104.71 , 106.30 ]
  8>    [ 90.61 , 92.20 , 93.79 , 95.38 , 96.97 ]
  9>    [ -0.63 , 0.96 , 2.55 , 4.14 , 5.73 ]
 10>  ]

Чтобы еще более повысить наглядность матрицы, отображаемой в разделе отладки, можно задать ширину вывода ее элементов, используя функцию set_width:

    set_width(7)
    show(a)

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

  1>  [ [   65.49 ,   68.76 ,   72.03 ,   75.30 ,   78.57 ]
  2>    [   85.30 ,   88.57 ,   91.84 ,   95.11 ,   98.38 ]
  3>    [   -0.89 ,    2.38 ,    5.65 ,    8.92 ,   12.19 ]
  4>    [   93.97 ,   97.24 ,  100.51 ,  103.78 ,  107.05 ]
  5>    [   33.11 ,   36.38 ,   39.65 ,   42.92 ,   46.19 ]
  6>    [   71.41 ,   74.68 ,   77.95 ,   81.22 ,   84.49 ]
  7>    [   44.02 ,   47.29 ,   50.56 ,   53.83 ,   57.10 ]
  8>    [   71.44 ,   74.71 ,   77.98 ,   81.25 ,   84.52 ]
  9>    [   91.83 ,   95.10 ,   98.37 ,  101.64 ,  104.91 ]
 10>    [    5.32 ,    8.59 ,   11.86 ,   15.13 ,   18.40 ]
 11>  ]

Решение с файловым вводом исходных данных

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

from pt4exam import *
# Исходные данные следует вводить с помощью функций файлового ввода.
# Для вывода результата используйте функцию print(end = "") и print()
# с атрибутами форматирования %7.2f
# Пример (для числа а): print("%7.2f" % a, end = "")
def solve():
    task("ExamFBase28")
    filename = get_str() # имя исходного файла
    f = open(filename, 'r')
    line =  f.readline().split()
    m = int(line[0])
    n = int(line[1])
    line =  f.readline()
    d =  float(line)
    b = f.readline().split()
    a = []
    for i in range(m):
        a.append([float(b[i])])
        for j in range(1,n):
            a[i].append(a[i][j-1] + d)
    f.close()	
    for i in range(m):
        for j in range(n):
            print("%7.2f" % a[i][j], end = "")
        print()


start(solve)

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


PrevNext

 

Рейтинг@Mail.ru

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

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