Programming Taskbook


E-mail:

Пароль:

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

English

ЮФУ

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

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

 

Решения | Pascal | Обработка строк

PrevNext


Выполнение задания на обработку строк: 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*

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

Примечание. Красная звездочка может появиться и при выводе ошибочных числовых данных. Например, если ожидается целое число в диапазоне от 1 до 99, а получено число 10000, то на экран будет выведена только первая цифра этого числа, за которой будет указана красная звездочка: 1*.

Правильное решение, его тестирование и просмотр результатов

Ошибка в предыдущей программе возникла из-за неверного указания количества итераций цикла. Действительно, на каждой итерации к строке добавляется по два символа, поэтому после 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 Задание выполнено!

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

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.

Обратите внимание на процедуру SetLength(s, n), которая обеспечивает правильную настройку длины результирующей строки s. Без вызова этой процедуры программа работала бы неверно (выводила бы пустую строку), так как любая глобальная строковая переменная инициализируется пустой строкой, а при работе с отдельными символами строки корректировка ее длины не производится.

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

begin
  Task('String9');
  Write(ReadInteger div 2 * (ReadChar + ReadChar));
end.

PrevNext

 

Рейтинг@Mail.ru

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

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