Programming Taskbook


E-mail:

Пароль:

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

 

ЮФУ

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

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

 

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

PrevNext


Базовые алгоритмы: ExamBegin2, ExamBegin28

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

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

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

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

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

#include <iostream>
#include <iomanip>
#include "pt4exam.h"
using namespace std;

void Solve()
{
  Task("ExamBegin2");

}

После запуска программы на экране появится окно задачника. На рисунке приводится вид окна в режиме с динамической компоновкой, появившемся в версии 4.11 задачника.

В дальнейшем будем считать, что установлен режим окна с динамической компоновкой, поскольку при выполнении заданий, связанных с ЕГЭ, он обеспечивает более наглядное отображение данных по сравнению с режимом с фиксированной компоновкой (для переключения режимов предназначена клавиша [F4]).

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

В программе-заготовке вместо заголовочного файла pt4.h подключается файл pt4exam.h, специально предназначенный для использования при выполнении заданий групп Exam. Данный файл содержит объявление единственной функции Task, инициализирующей задание. Никакие дополнительные функции и потоки, связанные с вводом-выводом, в него не включены. Это обусловлено тем, что ввод-вывод при выполнении заданий групп Exam надо выполнять, используя стандартные потоки ввода-вывода cin и cout. Поскольку эти потоки требуются в любой программе, выполняющей задания групп Exam, к программе-заготовке автоматически подключается заголовочный файл iostream (а также заголовочный файл iomanip, содержащий средства для форматирования выходных данных).

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

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

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

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

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

#include <iostream>
#include <iomanip>
#include "pt4exam.h"
using namespace std;

void Solve()
{
  Task("ExamBegin2");
  double a, b, c;
  cin >> a >> b >> c;
}

Мы воспользовались стандартным потоком ввода cin, введя все три исходных числа в одном операторе.

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

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

double min, max;
if (a < b)
{
  min = a;
  max = b;
}
else
{
  min = b;
  max = a;
}
if (c < min)
  min = c;
else
  if (c > max)
    max = c;

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

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

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

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

cout << min << " " << max;

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

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

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

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

cout << "MIN=" << min << endl;
cout << "MAX=" << max << endl;

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

cout << fixed << setprecision(2);

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

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

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

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

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

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

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

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

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

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

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

Приведем вариант правильного решения (в этом варианте учитывается, что результирующий двумерный массив имеет не более 20 строк и столбцов; соответствующее условие приведено в преамбуле к описанию группы ExamBegin):

#include <iostream>
#include <iomanip>
#include "pt4exam.h"
using namespace std;

void Solve()
{
  Task("ExamBegin28");
  int m, n;
  double d, a[20][20];
  cin >> m >> n >> d;
  for (int i = 0; i < m; i++)
    cin >> a[i][0];
  for (int j = 1; j < n; j++)
    for (int i = 0; i < m; i++)
      a[i][j] = a[i][j - 1] + d;
  cout << fixed << setprecision(2);
  for (int i = 0; i < m; i++)
  {
    for (int j = 0; j < n; j++)
      cout << setw(7) << a[i][j];
    cout << endl;
  }
}

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

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

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

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

for (int i = 0; i < m; i++)
{
  for (int j = 0; j < n; j++)
    Show(a[i][j], 7);
  ShowLine();
}

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

  1>    -3.04    2.82    8.68   14.54   20.40   26.26
  2>    67.23   73.09   78.95   84.81   90.67   96.53
  3>    73.68   79.54   85.40   91.26   97.12  102.98
  4>    78.64   84.50   90.36   96.22  102.08  107.94
  5>    10.33   16.19   22.05   27.91   33.77   39.63
  6>    -1.85    4.01    9.87   15.73   21.59   27.45
  7>    84.48   90.34   96.20  102.06  107.92  113.78
  8>    52.94   58.80   64.66   70.52   76.38   82.24

PrevNext

 

Рейтинг@Mail.ru

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

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