Выполнение задания на обработку строк: String9
Особенности выполнения заданий на обработку символов и строк рассмотрим на
примере задания String9.
String9°. Дано четное число N (> 0) и символы C1 и C2.
Вывести строку длины N,
которая состоит из чередующихся символов C1 и C2, начиная с C1.
Создание программы-заготовки и знакомство с заданием
Программу-заготовку для решения задания String9 можно создать с помощью
модуля PT4Load. Приведем текст созданной заготовки
(здесь и далее мы не будем указывать начальные директивы компилятора, заголовок program и директиву uses,
поскольку эта часть программы может отличаться для разных сред языка Pascal и разных версий задачника):
begin
Task('String9');
end.
После запуска программы на экране появится окно задачника. На рисунке
приведены два варианта представления окна в режиме с динамической
и с фиксированной компоновкой:
Данные типа char и string в окне задачника заключаются в апострофы; это
позволяет, в частности, отличить числовые данные (например, 2) от символьных и
строковых данных, содержащих цифры (например, '2'). Кроме того, апострофы дают
возможность увидеть пробелы, находящиеся в начале или в конце строк.
Ввод исходных данных
Добавим в программу фрагмент, обеспечивающий ввод исходных данных. При
этом будем учитывать, что данные типа char надо вводить с помощью процедуры
GetC, а данные типа integer с помощью процедуры GetN:
var
n: integer;
c1, c2: char;
begin
Task('String9');
GetC(c1);
GetC(c2);
GetN(n);
end.
Мы намеренно ввели данные не в том порядке, в котором они указаны в окне
задачника.
Запуск нового варианта программы уже не будет считаться ознакомительным,
поскольку в программе выполняется ввод исходных данных. Так как порядок ввода
исходных данных является ошибочным, этот вариант решения будет признан
неверным и приведет к сообщению «Неверно указан тип при вводе исходных
данных. Для ввода 1-го элемента (целого типа) использована переменная символьного
типа».
Напомним правило, определяющее порядок ввода и вывода данных для
задачника Programming Taskbook: ввод и вывод данных производится по строкам
(слева направо), а строки просматриваются сверху вниз.
Исправим нашу программу, изменив в ней порядок ввода исходных данных:
GetN(n);
GetC(c1);
GetC(c2);
Теперь исходные данные вводятся правильно. Первый этап решения задачи пройден.
Формирование требуемой строки и ее вывод
Для формирования нужной строки воспользуемся операцией «+» сцепления
строк; для вывода полученной строки используем процедуру PutS:
var
n, i: integer;
c1, c2: char;
s: string;
begin
Task('String9');
GetN(n);
GetC(c1);
GetC(c2);
s := '';
for i := 1 to n do
s := s + c1 + c2;
PutS(s);
end.
При выполнении этой программы в области результатов будет выведена строка,
оканчивающаяся особым символом красной звездочкой, например:
'a1a1a1a1a1*
Красная звездочка, расположенная в конце строки, отображаемой на экране,
означает, что длина полученной строки превышает длину контрольной (т. е.
«правильной») строки. Для того чтобы увидеть на экране всю
полученную строку, достаточно подвести курсор мыши к строке со звездочкой; при
этом полный текст строки появится во всплывающей подсказке.
Правильное решение, его тестирование и просмотр результатов
Ошибка в предыдущей программе возникла из-за неверного указания количества
итераций цикла. Действительно, на каждой итерации к строке добавляется по два
символа, поэтому после n итераций строка будет содержать 2n символов (а не n, как
требуется в задании).
Для исправления ошибки достаточно вдвое уменьшить число итераций, изменив
заголовок цикла следующим образом:
for i := 1 to n div 2 do
После запуска исправленной программы и успешного прохождения 5 тестов
мы получим сообщение «Задание выполнено!». Нажав клавишу [F2],
мы можем вывести на экран окно результатов, в
котором будут перечислены все наши попытки решения задачи (буква «p», которая
указывается перед датой, означает, что при выполнении задания использовался язык
Pascal):
String9 p24/03 11:37 Ознакомительный запуск.
String9 p24/03 11:48 Неверно указан тип при вводе исходных данных.
String9 p24/03 11:49 Запуск с правильным вводом данных.
String9 p24/03 11:49 Ошибочное решение.
String9 p24/03 11:52 Задание выполнено!
var
n, i: integer;
c1, c2: char;
s: string;
begin
Task('String9');
GetN(n);
GetC(c1);
GetC(c2);
SetLength(s, n);
for i := 1 to n div 2 do
begin
s[2 * i - 1] := c1;
s[2 * i] := c2;
end;
PutS(s);
end.
begin
Task('String9');
Write(ReadInteger div 2 * (ReadChar + ReadChar));
end.
|