Задание на обработку строк
Создание программы-заготовки и знакомство с заданием
В качестве примера задания на обработку строк рассмотрим задание String9.
Программу-заготовку для решения этого задания можно создать с помощью команды меню «Модули | Создать шаблон программы», кнопки или клавиатурной комбинации Shift+Ctrl+L. Эта заготовка будет иметь следующий вид:
uses PT4; begin Task('String9'); end.
После запуска данной программы на экране появится окно задачника:
Данные типа char
и string
в окне задачника заключаются в апострофы; это позволяет, в частности,
отличить числовые данные (например, 9
) от символьных и строковых данных, содержащих цифры
(например, '9'
).
Кроме того, апострофы дают возможность увидеть пробелы, находящиеся в начале или конце строк.
Ввод исходных данных
Добавим в программу фрагмент, обеспечивающий ввод исходных данных (мы намеренно ввели данные не в том порядке, в котором они указаны в окне задачника):
uses PT4; var n: integer; c1, c2: char; begin Task('String9'); read(c1, c2, n); end.
Запуск нового варианта программы уже не будет считаться ознакомительным, поскольку в программе выполняется ввод исходных данных. Так как порядок ввода исходных данных является ошибочным, этот вариант решения будет признан неверным и приведет к сообщению «Неверно указан тип при вводе исходных данных»:
Общее правило, определяющее порядок ввода и вывода данных для задачника Programming Taskbook гласит: ввод и вывод данных производится по строкам (слева направо), а строки просматриваются сверху вниз. Иными словами, данные, отображаемые в окне задачника, вводятся и выводятся в том порядке, в котором читается обычный текст.
На панели индикаторов, расположенной под информационной панелью,
отмечено, что введен всего один элемент исходных данных (из трех), хотя в процедуре read
нашей программы
были
указаны три переменные. Это объясняется тем, что при вводе первой из этих переменных (с1
)
была обнаружена ошибка несоответствия типа, поэтому задачник не стал анализировать остальные данные,
которые программа пыталась ввести. Здесь проявляется еще одно правило задачника
Programming Taskbook: при обнаружении первой ошибки ввода-вывода
анализ оставшихся исходных данных и результатов не проводится.
Исправим нашу программу, изменив порядкок параметров в процедуре ввода:
read(n, c1, c2);
Теперь с вводом данных проблем не возникает, однако из-за того что в программе отсутствует вывод результирующих данных, решение по-прежнему считается ошибочным:
Данная ошибка, в отличие от предыдущей, связана не с вводом исходных данных, а с выводом результатов. Это отмечается в окне задачника двумя способами: цветной маркер ошибки располагается рядом с индикатором вывода, и этим же цветом выделяется заголовок раздела результатов (который в данном случае не содержит никаких данных).
Формирование и вывод требуемой строки
Для формирования нужной строки воспользуемся операцией +
(сцепления строк):
uses PT4; var n, i: integer; c1, c2: char; s: string; begin Task('String9'); read(n, c1, c2); s := ''; for i := 1 to n do s := s + c1 + c2; write(s); end.
Заметим, что в операторе s := ''
нет необходимости, так как все глобальные переменные в Паскале автоматически
инициализируются «нулевыми» значениями (для числовых данных это обычные нули, для символов — это
символ #0
, для
строк — пустая строка ''
).
Результат выполнения этой программы будет следующим:
Красная звездочка, расположенная в конце выведенной строки, означает, что длина полученной строки превышает длину верной строки. Для того чтобы увидеть на экране всю полученную строку, достаточно подвести курсор мыши к строке со звездочкой; при этом полный текст строки появится во всплывающей подсказке:
Замечание. Красная звездочка может появиться и при выводе ошибочных числовых данных. Например, если ожидается
целое число в диапазоне от 1
до 99
, а получено число 10000
, то на экране изобразится первая цифра этого большого
числа, за которой будет указана красная звездочка: 1*
.
Верное решение
Ошибка в предыдущей программе возникла из-за неверного указания количества итераций цикла. Действительно,
на каждой итерации к строке добавляется по два символа, поэтому после n
итераций
строка будет содержать 2*n
символов (а не n
, как требуется в задании).
Для исправления ошибки достаточно вдвое уменьшить число итераций:
uses PT4; var n, i: integer; c1, c2: char; s: string; begin Task('String9'); read(n, c1, c2); s := ''; for i := 1 to n div 2 do s := s + c1 + c2; write(s); end.
После запуска этого варианта мы получим сообщение «Верное решение. Тест номер 1 (из 5)», а после пяти подобных запусков — сообщение «Задание выполнено!»:
Замечание. Приведем другой, более быстрый, способ решения задания String9, в котором результирующая строка заполняется посимвольно, как обычный массив:
uses PT4; var n, i: integer; c1, c2: char; s: string; begin Task('String9'); read(n, c1, c2); SetLength(s, n); for i := 1 to n div 2 do begin s[2 * i - 1] := c1; s[2 * i] := c2; end; write(s); end.
Обратите внимание на процедуру SetLength(s, n)
, которая обеспечивает правильную настройку длины результирующей
строки s
. Без вызова этой процедуры программа работала бы неверно, так как любая
глобальная строковая переменная инициализируется пустой строкой, а при работе с отдельными символами строки
корректировка ее длины не производится.
Просмотр результатов выполнения задания
Щелкнув мышью на метке «Результаты (F2)», расположенной в правом верхнем углу окна задачника, или нажав клавишу F2, мы можем вывести на экран окно результатов, в котором будет перечислены все наши попытки решения задачи:
String9 a08/09 11:17 Ознакомительный запуск. String9 a08/09 11:18 Неверно указан тип при вводе исходных данных. String9 a08/09 11:21 Выведены не все результирующие данные. String9 a08/09 11:26 Ошибочное решение. String9 a08/09 11:29 Задание выполнено!
Для закрытия окна результатов достаточно нажать клавишу Esc. Окно результатов можно отобразить на экране и после закрытия окна задачника и возврата в среду PascalABC.NET. Для этого надо использовать команду меню «Модули | Просмотреть результаты», кнопку или клавиатурную комбинацию Shift+Ctrl+R.