Выполнение задания на обработку строк: String9
Особенности выполнения заданий на обработку символов и строк рассмотрим на примере задания String9.
String9°. Дано четное число N (> 0) и символы C1 и C2.
Вывести строку длины N, которая состоит из чередующихся символов C1 и C2, начиная с C1.
Создание программы-заготовки и знакомство с заданием
Программу-заготовку для решения задания String9 можно создать с помощью
модуля PT4Load.
В созданный проект будет входить файл String9.rb (Ruby) или String9.jl (Julia). Приведем текст функции solve
из данного файла (именно в эту функцию требуется ввести решение задачи):
[Ruby]
def solve()
task "String9"
end
[Julia]
function solve()
task("String9")
end
После запуска программы на экране появится
окно задачника. На рисунке
приведены два варианта представления окна в режиме с динамической
и с фиксированной компоновкой:
Символьные и строковые данные в окне задачника для языка Ruby заключаются в двойные кавычки; это позволяет отличить
числовые данные (например, 2) от символьных и строковых данных, содержащих цифры
(например, символа "2"). Кроме того, кавычки дают возможность увидеть пробелы, находящиеся в начале или в конце строк.
В языке Julia различаются символьные и строковые данные, поэтому в окне задачника символьные данные
будут звключаться в одинарные кавычки, а строковые в двойные, что соответствует правилам этого языка.
Ввод исходных данных
Добавим в программу фрагмент, обеспечивающий ввод исходных данных.
Для ввода данных целого типа можно использовать функцию get_i,
символьные данные в языке Ruby можно вводить функцией get_s, а в языке Julia функцией get_c:
[Ruby]
def solve()
task "String9"
a = get_s
b = get_s
n = get_i
end
[Julia]
function solve()
task("String9")
a = get_c()
b = get_c()
n = get_i()
end
Мы намеренно ввели данные не в том порядке, в котором они указаны в окне задачника.
Запуск нового варианта программы уже не будет считаться ознакомительным, поскольку в программе
выполняется ввод исходных данных. Так как порядок ввода исходных данных является ошибочным, этот вариант решения будет
признан неверным и приведет к сообщению «Неверно указан тип при вводе исходных данных. Для ввода 1-го элемента (целого типа)
использована переменная строкового типа» (для языка Julia в сообщении вместо слова «строкового» будет использовано
слово «символьного»).
Напомним правило, определяющее порядок ввода и вывода данных для задачника Programming
Taskbook: ввод и вывод данных производится по строкам (слева направо), а строки просматриваются сверху вниз.
Исправим программу, изменив в ней порядок ввода:
[Ruby]
def solve()
task "String9"
n = get_i
a = get_s
b = get_s
end
[Julia]
function solve()
task("String9")
n = get_i()
a = get_c()
b = get_c()
end
Теперь исходные данные вводятся правильно. Первый этап решения задачи пройден.
[Ruby]
def solve()
task "String9"
n, a, b = get3
end
[Julia]
function solve()
task("String9")
n, a, b = get3()
end
Формирование требуемой строки и ее вывод
Для формирования нужной строки воспользуемся операцией сцепления строк
(в языке Ruby она обозначается символом сложения +, а в языке Julia символом умножения *);
для вывода полученной строки используем функцию put:
[Ruby]
def solve()
task "String9"
n, a, b = get3
s = ""
n.times {s += a + b}
put s
end
[Julia]
function solve()
task("String9")
n, a, b = get3()
s = ""
for i in 1:n
s *= a * b
end
put(s)
end
При запуске этой программы в области результатов будет выведена строка, оканчивающаяся особым символом
красной звездочкой, например:
"a1a1a1a1a1*
Красная звездочка, расположенная в конце строки, отображаемой на экране, означает, что длина полученной
строки превышает длину контрольной (т. е. «правильной») строки. Для того чтобы увидеть на экране
всю полученную строку, достаточно подвести курсор мыши к строке со звездочкой; при этом полный текст строки появится
во всплывающей подсказке.
Правильное решение, его тестирование и просмотр результатов
Ошибка в предыдущей программе возникла из-за неверного указания количества итераций цикла. Действительно,
на каждой итерации к строке добавляется по два символа, поэтому после n итераций строка будет содержать
2n символов (а не n, как требуется в задании).
Для исправления ошибки достаточно вдвое уменьшить число итераций, изменив заголовок цикла следующим образом:
[Ruby]
(n / 2).times {s += a + b}
[Julia]
for i in 1:n ÷ 2
В варианте для языка Ruby мы использовали операцию «/», поскольку в языке Ruby (как и во многих других языках программирования)
эта операция, при наличии обоих операндов целого типа, означает целочисленное деление. В языке Julia
для операции деления нацело предусмотрен особый символ ÷, отсутствующий на клавиатуре.
Для его ввода в программу надо набрать текст \div и сразу после этого нажать клавишу Tab.
Заметим, что текст \div соответствует символу ÷ в системе LaTeX, предназначенной
для подготовки математических текстов.
Аналогичными действиями в редакторе VS Code можно вводить в программу на языке Julia и другие специальные символы.
После запуска исправленной программы и успешного прохождения 5 тестов
мы получим сообщение «Задание выполнено!». Нажав клавишу [F2],
мы можем вывести на экран окно результатов, в
котором будут перечислены все наши попытки решения задачи (буква «r», которая
указывается перед датой, означает, что при выполнении задания использовался язык
Ruby; для языка Julia предусмотрена буква «u»):
String9 r06/09 15:46 Ознакомительный запуск.
String9 r06/09 15:50 Неверно указан тип при вводе исходных данных.
String9 r06/09 15:55 Запуск с правильным вводом данных.
String9 r06/09 16:00 Ошибочное решение.
String9 r06/09 16:05 Задание выполнено!
[Ruby]
def solve()
task "String9"
n, a, b = get3
s = (a + b) * (n / 2)
put s
[Julia]
function solve()
task("String9")
n, a, b = get3()
s = (a * b) ^ (n ÷ 2)
put(s)
end
[Ruby]
def solve()
task "String9"
n = get / 2
((get + get) * n).put
[Julia]
function solve()
task("String9")
n = get() ÷ 2
put((get() * get()) ^ n)
end
|