Programming Taskbook


E-mail:

Пароль:

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

 

ЮФУ SMBU

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

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

 

Решения | PascalABC.NET | Обработка строк

PrevNext


Выполнение задания на обработку строк: String9

Особенности выполнения заданий на обработку символов и строк рассмотрим на примере задания String9.

String9°. Дано четное число N (> 0) и символы C1 и C2. Вывести строку длины N, которая состоит из чередующихся символов C1 и C2, начиная с C1.

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

Программу-заготовку для решения задания String9 можно создать с помощью модуля PT4Load. Приведем текст созданной заготовки (здесь и далее мы не будем указывать начальную директиву uses PT4):

begin
  Task('String9');
end.

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

Данные типа char и string в окне задачника заключаются в апострофы; это позволяет, в частности, отличить числовые данные (например, 2) от символьных и строковых данных, содержащих цифры (например, '1'). Кроме того, апострофы дают возможность увидеть пробелы, находящиеся в начале или в конце строк.

Ввод исходных данных

Добавим в программу фрагмент, обеспечивающий ввод исходных данных. При этом будем учитывать, что данные типа char надо вводить с помощью функций ReadChar, ReadChar2 и т. д., а данные типа integer — с помощью функций ReadInteger, ReadInteger2 и т. д.:

begin
  Task('String9');
  var (c1, c2) := ReadChar2;
  var n := ReadInteger;
end.

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

Запуск нового варианта программы уже не будет считаться ознакомительным, поскольку в программе выполняется ввод исходных данных. Так как порядок ввода исходных данных является ошибочным, этот вариант решения будет признан неверным и приведет к сообщению «Неверно указан тип при вводе исходных данных. Для ввода 1-го элемента (целого типа) использована переменная символьного типа».

Напомним правило, определяющее порядок ввода и вывода данных для задачника Programming Taskbook: ввод и вывод данных производится по строкам (слева направо), а строки просматриваются сверху вниз.

Исправим нашу программу, изменив в ней порядок ввода исходных данных:

begin
  Task('String9');
  var n := ReadInteger;
  var (c1, c2) := ReadChar2;
end.

Теперь исходные данные вводятся правильно. Первый этап решения задачи пройден:

Формирование требуемой строки и ее вывод

Для формирования нужной строки воспользуемся операцией «+» сцепления строк; для вывода полученной строки используем стандартную процедуру Print:

begin
  Task('String9');
  var n := ReadInteger;
  var (c1, c2) := ReadChar2;
  var s := '';
  for var i := 1 to n do
    s += c1 + c2;
  Print(s);
end.

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

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

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

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

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

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

  for var i := 1 to n div 2 do

После запуска исправленной программы и успешного прохождения 5 тестов мы получим сообщение «Задание выполнено!»:

Нажав клавишу [F2], мы можем вывести на экран окно результатов, в котором будут перечислены все наши попытки решения задачи (буква «p», которая указывается перед датой, означает, что при выполнении задания использовался язык Pascal):

String9   A24/03 11:37 Ознакомительный запуск.
String9   A24/03 11:48 Неверно указан тип при вводе исходных данных.
String9   A24/03 11:49 Запуск с правильным вводом данных.
String9   A24/03 11:49 Ошибочное решение.
String9   A24/03 11:52 Задание выполнено!

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

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

PrevNext

 

Рейтинг@Mail.ru

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

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