Выполнение задания на обработку строк: String9
Особенности выполнения заданий на обработку символов и строк рассмотрим на
примере задания String9.
String9°. Дано четное число N (> 0)
и символы C1 и C2. Вывести строку длины N,
которая состоит из чередующихся символов C1 и C2,
начиная с C1.
Создание программы-заготовки и знакомство с заданием
Проект-заготовку для решения задания String9 можно создать с помощью
модуля PT4Load. При этом в редактор среды Visual Basic будет загружен
файл, содержащий процедуру Solve, в которую необходимо ввести решение задания.
В средах VB5-6 файл будет иметь имя String9.bas, а в средах VB.NET String9.vb.
Приведем содержимое этих файлов:
[VB5-6, файл String9.bas]
Option Explicit
Sub Solve()
Task "String9"
End Sub
[VB.NET, файл String9.vb]
Option Strict On
Imports System.Math
Imports PT4.VisualBasic
Module PT4Tasks
Sub Solve()
Task("String9")
End Sub
End Module
После запуска программы на экране появится окно задачника следующего вида.
Символьные данные в окне задачника заключаются в двойные кавычки; это
позволяет, в частности, отличить числовые данные (например, 2) от строк,
содержащих цифры (например, "2"). Кроме того, кавычки дают возможность увидеть
пробелы, находящиеся в начале или в конце строк.
Ввод исходных данных
Добавим в программу фрагмент, обеспечивающий ввод исходных данных. При
этом будем учитывать, что для языка Visual Basic как символы, так и строки надо
вводить с помощью процедуры GetS, а числовые данные целого типа с
помощью процедуры GetN:
[VB5-6]
Sub Solve()
Task "String9"
Dim c1 As String * 1, c2 As String * 1, n As Integer
GetS c1
GetS c2
GetN n
End Sub
[VB.NET]
Sub Solve()
Task("String9")
Dim c1, c2 As String, n As Integer
GetS(c1)
GetS(c2)
GetN(n)
End Sub
Мы намеренно ввели данные не в том порядке, в котором они указаны в окне
задачника.
Обратите внимание на то, что в VB5-6 переменные c1 и c2 описаны как String * 1;
это подчеркивает, что данные переменные содержат единственный символ.
В VB.NET отсутствуют строки фиксированного размера, поэтому переменные c1 и c2 описаны как
«обычные» строки типа String.
Следует заметить, что в VB.NET появился новый тип данных Char, специально предназначенный
для хранения отдельных символов. Однако при использовании традиционных средств
языка Visual Basic для работы со строками
в данном типе нет необходимости. Тип Char необходим при обработке строк с применением
свойств и методов классов, определенных в библиотеке .NET Framework (в частности, классов String и StringBuilder).
Подобный способ обработки строк рассматривается в разделе, посвященном языкам
C# и Visual Basic .NET.
Запуск нового варианта программы уже не будет считаться ознакомительным,
поскольку в программе выполняется ввод исходных данных. Так как порядок ввода
исходных данных является ошибочным, этот вариант решения будет признан
неверным и приведет к сообщению «Неверно указан тип при вводе исходных
данных. Для ввода 1-го элемента (целого типа) использована переменная строкового
типа».
Напомним правило, определяющее порядок ввода и вывода данных для
задачника Programming Taskbook: ввод и вывод данных производится по строкам
(слева направо), а строки просматриваются сверху вниз.
Исправим процедуру Solve, изменив в ней порядок ввода исходных данных:
[VB5-6]
GetN n
GetS c1
GetS c2
[VB.NET]
GetN(n)
GetS(c1)
GetS(c2)
Теперь исходные данные вводятся правильно. Однако из-за того что в
программе отсутствует вывод результирующих данных, решение снова будет
признано ошибочным; при этом на информационной панели появится сообщение
«Выведены не все результирующие данные. Количество выведенных данных: 0
(из 1)»
Формирование требуемой строки и ее вывод
Для формирования нужной строки воспользуемся операцией «&» сцепления
строк; для вывода полученной строки используем процедуру PutS:
[VB5-6]
Sub Solve()
Task "String9"
Dim c1 As String * 1, c2 As String * 1, n As Integer _
i As Integer, s As String
GetN n
GetS c1
GetS c2
s = ""
For i = 1 To n
s = s & c1 & c2
Next
PutS s
End Sub
[VB.NET]
Sub Solve()
Task("String9")
Dim c1, c2, s As String, _
n, i As Integer
GetN(n)
GetS(c1)
GetS(c2)
s = ""
For i = 1 To n
s = s & c1 & c2
Next
PutS(s)
End Sub
Заметим, что в присваивании переменной s пустой строки "" нет необходимости,
так как в языке Visual Basic все переменные автоматически инициализируются
нулевыми значениями соответствующего типа (нулями для числовых типов, пустой
строкой для строковых типов). Однако явная инициализация делает текст программы
более наглядным, поэтому во всех программах на языке Visual Basic рекомендуется явно
инициализировать все необходимые переменные.
При выполнении программы в области результатов будет выведена строка,
оканчивающаяся особым символом красной звездочкой, например:
"a1a1a1a1a1*
Красная звездочка, расположенная в конце строки, отображаемой на экране,
означает, что длина полученной строки превышает длину контрольной (т. е.
«правильной») строки. Для того чтобы увидеть на экране всю
полученную строку, достаточно подвести курсор мыши к строке со звездочкой; при
этом полный текст строки появится во всплывающей подсказке.
Правильное решение, его тестирование и просмотр результатов
Ошибка в предыдущей программе возникла из-за неверного указания количества
итераций цикла. Действительно, на каждой итерации к строке добавляется по два
символа, поэтому после n итераций строка будет содержать 2n символов (а не n, как
требуется в задании).
Для исправления ошибки достаточно вдвое уменьшить число итераций, изменив
заголовок цикла следующим образом (обратите внимание на использование операции
целочисленного деления «\»):
For i = 1 To n \ 2
После запуска исправленной программы мы получим сообщение «Верное
решение. Тест номер 1 (из 5)», а после пяти подобных запусков
сообщение «Задание выполнено!». С помощью модуля PT4Results
мы можем вывести на экран окно результатов, в
котором будут перечислены все наши попытки решения задания (буква «b», которая
указывается перед датой, означает, что при выполнении задания использовался язык
Visual Basic):
String9 b24/03 11:37 Ознакомительный запуск.
String9 b24/03 11:48 Неверно указан тип при вводе исходных данных.
String9 b24/03 11:49 Выведены не все результирующие данные.
String9 b24/03 11:49 Ошибочное решение.
String9 b24/03 11:52 Задание выполнено!
|