Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
44
Добавлен:
27.04.2015
Размер:
265.44 Кб
Скачать

4.9.3. Средства vb для ввода/вывода и отображения строк

Простейшим способом отображения в программе текстовых строк, вводимых с клавиатуры, а, следовательно, и из текстового файла, яв­ляется использование объекта текстового поля. Как известно, объекты текстового поля могут иметь любые размеры. Если содержимое текстовой информации не помещается в текстовое поле, к текстовому полю можно добавить полосы прокрутки так, чтобы пользователь смог увидеть весь текст.

Для ввода строковых данных и отображения их на форме могут использоваться известные элементы управления TextBox, ListBox, ComboBox. Причем для отображения нескольких строк в текстовом поле, свойство Multiline устанавливается в значение True. Для отображения строковой информации на форме, не подлежащей редактированию пользователем, используется элемент управления Label. Отображать текстовую информацию в качестве заголовков можно также на кнопках, в заголовке окна формы и т.д. Для отображения используется свойство Text этих элементов. Например:

Label1.Text="Введите место рождения"

Для того, чтобы текст оставался до определённого времени невидимым, его свойству Visible первоначально надо присвоить значение False, а затем, когда нужно это поле отобразить, свойству Visible присваивается значение True.

Напомним, что типы данных в VB являются классами и управляются из пространства имен System, а классы, в свою очередь, состоят из методов и свойств.

Значение свойства Text всех элементов управления имеет тип String. Поэтому для записи числового значения в свойство Text элемента управления необходимо произвести явное преобразование в тип String, например методом ToString соответствующего типа данных или соответствующей встроенной функцией CStr( ):

Dim ЧислоДней As Integer = 31

Label1.Text= ЧислоДней.ToString

Label2.Text = CStr(ЧислоДней)

Здесь переменная ЧислоДней обрабатывается методом ToString( ), который принадлежит классу Integer или функцией CStr( ). Для явного преобразования можно также воспользоваться методом класса Convert:

Label1.Text = Convert.ToString(ЧислоДней)

При включенном режиме строгого контроля типов Option Strict On отсутствие явного преобразования вызовет ошибку периода компиляции.

Значение, вводимое из поля Text элементов TextBox, ListBox, ComboBox в переменные числовых типов также надо преобразовывать из строки в число. Для этого существуют соответствующие функции VB и методы класса Convert:

Dim ЧислоДней As Integer=Convert.ToInt32(TextBox1.Text)

Dim Длина As Double=Convert.ToDouble(TextBox2.Text)

Dim Скорость As Single= CSng(TextBox3.Text)

4.9.4. Средства vb и vs для обработки строк

В VB существует всего одна операция для работы со строками – конкатенация (объединение строк). Она объединяет несколько строк в одну:

ТекстоваяПеременная=Строка1 & Строка2 & …

Строка1, Строка2… - это строковые выражения, состоящие из строковых переменных, строковых констант, строковых литералов и свойств объектов Text. Например:

Label1.Text = "Cтудент " & TextBox1.Text & " сдал " & _

СданоЛабораторок(ИндексСтудента) & " лабораторных работ"

Как известно, VB является полностью объектно-ориентированным языком. Это в частности сказывается в том, что строки в VB являются не базовыми типами, подобными числовым типам, а объектами класса String. Этот класс является общим для всех языков платформы .NET Framework. Обращение к строкам производится по тем же правилам, что и к свойствам и методам элементов управления. Например, TextBox1.Text возвращает свойство Text объекта TextBox1, а метод ListBox1.Items.Add("Февраль") добавляет строку с текстом Февраль в список ListBox1.

Обращение к свойствам и методам объекта производится по правилу точечной нотации:

ИмяОбъекта.ИмяСвойства

ИмяОбъекта.ИмяМетода()

Обращение к функциям производится стандартным способом:

ИмяФункции(СписокФактическихПараметров).

К наиболее частым действиям со строками, кроме конкатенации, можно отнести следующие действия:

  • выделение части строки;

  • поиск в строке по образцу;

  • замена по образцу;

  • изменение регистра символов (большие – маленькие буквы);

  • удаление лишних пробелов;

  • добавление выравнивающих полей.

Выделение части строки. Среди нескольких существующих способов выделения части строки разработчики рекомендуют метод Substring(). Этот метод возвращает часть строки заданной длины, начиная с указанной позиции в строке. Синтаксис обращения следующий:

ИмяОбъекта.Substring(ИндексСтартСимСтроке, КолСимволов).

Как известно, индекс всегда начинается с 0.

В следующем примере выделяется один символ строки, начиная с пятого по счёту:

Dim S As String = "Крокодил"

Dim ПятыйСимволСтроки As String = S.Substring(4,1)ПятыйСимволСтроки=”о"

Если количество возвращаемых символов не указано, возвращается часть строки от стартового символа до конца строки.

Для выделения последних символов строки необходимо знать размер строки, который возвращает свойство Length:

Dim S As String = "Крокодил"

Dim L As Integer = S.Length 'L=8

Существует также специальный метод Right(), возвращающий последние символы. Для использования этого метода размер строки знать не нужно:

Dim ПослДвеБук As String = Strings.Right(S, 2) 'ПослДвеБук = "ил"

Необходимо обратить внимание на особый синтаксис обращения к этому методу. Здесь строковый объект не указывается перед точкой, а является параметром обращения к методу; это – так называемый статический метод класса.

Поиск в строке. Часто нужно искать в строке положение разделителя слов, например, пробела между именем и отчеством. Для поиска заданного символа используется метод IndexOf(). Этот метод возвращает индекс первого вхождения символа в строку:

Dim ФИО As String = "Сидоров Иван Петрович"

Dim ПервыйПробел As Integer = ФИО.IndexOf(" ")'ПервыйПробел = 7

Dim P As Integer = ФИО.IndexOf("о") 'P=3

Если нужно найти последнее вхождение символа в строке, используется метод LastIndexOf():

Dim ПоследПробел As Integer = ФИО.LastIndexOf(" ")'ПоследПробел = 12

P = ФИО.LastIndexOf("о") 'P=17

А что делать, если пробелов или искомых подстрок в строке несколько и требуется разобрать текст по словам? В этом случае используется более общая модификация метода IndexOf( ):

Строка.IndexOf(Символ,СтартовыйИндексПоиска)

Например:

СледИнПро=ФИО.IndexOf(" ", ПредыдущийИндексПробела)

P = ФИО.IndexOf("о",4) 'P=5

P = ФИО.IndexOf("б",4) 'P=-1 символ “б” не найден

Если символ не найден, возвращается значение –1.

Методы, имеющие несколько вариантов списков параметров обращения, называются перегруженными методами.

Для полного разбора строки на слова существуют метод и одноименная функция Split(), превращающие строку в массив слов или других подстрок, разделённых запятыми или какими-то другими разделителями. Синтаксис обращения следующий:

Строка.Split(СимволРазделитель) – для метода;

Split(Строка,СтрокаРазделитель) – для функции.

И метод, и функция Split() применяются для разбивки исходной строки на

подстроки и сохранения этих подстрок в массив. Метод Split() разделяет строку по границам, определяемым одиночными символами, а функция Split() позволяет указывать границу разбиения как последовательность из нескольких символов.

Ниже приведен пример разбора на отдельные слова строки, состоящей из нескольких слов:

Dim ФИО As String="Иванов Иван Иванович"

Dim Mas ()As String =Split(ФИО," ")

Label1.Text="Фамилия – " & Mas(0) 'Massiv(0)=”Иванов

Label2.Text="Имя – " & Mas(1) 'Massiv(1)=”Иван

Label3.Text="Отчество – "& Mas(2) 'Massiv(2)=”Иванович

Существуют обратные метод и функция Join(), которые возвращают строку, получаемую объединением нескольких строк, содержащихся в указанном массиве. Синтаксис обращения следующий:

String.Join(СимволРазделитель, ОдномерныйМассив) – для метода

Join(ОдномерныйМассив, СимволРазделитель) – для функции.

Здесь и в методе, и в функции в качестве символа разделителя можно использовать, как одиночный символ, так и строку. Если в качестве разделителя задана строка нулевой длины, то все подстроки массива объединяются в одну строку без разделения.

Кроме того, существуют методы, проверяющие окончание строки (EndsWith) и начало строки (StartsWith). Пример их использования очевиден:

If TextBox1.Text.EndsWith("ич") Then

Обращение = "Дорогой "

ElseIf TextBox1.Text.EndsWith("на")

Обращение = "Дорогая "

Else

Обращение = "Товарищ "

End If

Замена символов. Для замены символов используется метод Replace()c указанием заменяемых и заменяющих символов:

Строка.Replace(ИсходнаяПодстрока,НоваяПодстрока).

Этот метод возвращает новую подстроку, созданную на основе исходной строки путём указанной замены. Например:

Dim Был As String = "Дорогой "

Dim Станет As String = Был.Replace("ой", "ая" )

Если возвращаемое значение присваивается исходной строке, всё равно образуется новая строка, а старая с этим именем становится недоступной и автоматически удаляется «службой уборки мусора», встроенной в .NET Framework.

Удаление символов. Для удаления символов используется метод Remove(). Он удаляет заданное количество символов, начиная с заданной позиции:

Строка.Remove(НачальнаяПозиция, КоличествоУдаляемыхСимволов).

Dim Оценка As String ="неудовл."

Оценка = Оценка.Remove(0,2)

Изменение регистра символов. Используемые для этого методы возвращают копию строки, преобразованную к указанному регистру. Метод ToUpper()создаёт строку, преобразованную к верхнему регистру, метод ToLower() – к нижнему регистру. Параметров эти методы не требуют, например:

Dim ВсёБолБуквами As String= ИсходнаяСтрока.ToUpper()

Dim ВсёМалБуквами As String= ИсходнаяСтрока.ToLower()

Иногда пользователи забывают вводить имена собственные с большой буквы. В этом случае приложение может подправлять своего пользователя. Для того, чтобы каждое слово строки начиналось с большой буквы, используется функция VB StrConv() со следующим синтаксисом:

StrConv(ИсходнаяСтрока, VbStrConv.ProperCase).

TextBox1.Text=StrConv(TextBox1.Text,VbStrConv.ProperCase)

После выполнения такого оператора все слова, записанные в текстовом поле TextBox1 в несколько строк, будут начинаться с заглавной буквы. Здесь VbStrConv.ProperCase – встроенная константа VB. Функция StrConv()является наиболее общим методом преобразования регистров. При помощи средства IntelliSense можно изучить и другие его возможности, реализуемые различными встроенными константами VB.

Удаление лишних пробелов. Пробелы в начале или конце строки могут появляться из-за привычки части пользователей нажимать <Space>, где надо и не надо. Лишние пробелы влияют на результат операции сравнения. Метод TrimStart() удаляет пробелы в начале строки, перед первым непробельным символом, TrimEnd() удаляет пробелы в конце строки, а Trim() удаляет пробелы и в конце, и в начале строки.

Создание строки из одинаковых символов. Для создания стоки из заданного количества одинаковых символов используется функция:

StrDup (КоличествоСимволов, Символ).

TextBox1.Text = StrDup(5, "*")

VB содержит по два метода для конкатенации строк и многих других операций со строками: вы можете использовать операто­ры и функции из более ранних версий VB – Mid( ), UCase( ), LCase( )и другие, а можете использовать методы .NET FrameworkSubstring( ), ToUpper( ), ToLower( )и другие. Никаких реальных ограниче­ний не существует в применении тех или других методов, хотя более старые методы сохранены в основном в целях совместимости. Список методов и свойств класса String приведён в таблице4.9.5-1. Там же указаны соответствующие функции VB.

Таблица 4.9.4-1

Метод Framework/

Функция VB

Описание

Пример для.NETFramework

Строка.Substring(n[,k])

Mid(Строка, n[,k])

Возвращает фиксированное числоkсимволов строки (или все символы до конца строки, если параметр k отсутствует),начиная с заданной начальной позиции. Первый элемент строки имеет индекс 0.

Dim Cols, Middle As String

Cols = "First Second Third"

Middle = Cols.SubString(6,6)

'Middle="Second"

Строка.IndexOf(ПодСтрока[,n] )

InStr([n,]Строка,ПодСтрока)

Ищет позицию вхождения одной строки в другую, начиная с первого (или n-го) символа.

Dim Name As String

Dim S As Short

Name = "Abraham"

S = Name.IndexOf("h")

'S=4

Строка.LastIndexOf(ПодСтрока[,n] )

InStrRev(Строка, ПодСтрока[,n])

Ищет позицию первого вхождения одной строки в другую, начиная с последнего символа, или (если указан аргумент n) с указанной позиции.

Поиск ведется справа налево.

Dim Name As String

Dim S As Short

Name = "Abraham"

S = Name.LastIndexOf("a")

'S=5

Строка.Split( Разделитель)

Split(Строка, Разделитель)

Преобразует строку, разделенную заданным разделителем в массив подстрок.

См. пример на стр.275

Строка.EndsWith(ПодСтрока)

Проверяет конец строки на совпадение с указанной подстрокой. Возвращает результат логического типа.

Dim Name As String = "Abraham"

Dim b As Boolean

b = Name.EndsWith("am")

‘b=True

Строка.StartsWith(ПодСтрока )

Проверяет начало строки на совпадение с указанной подстрокой. Возвращает результат логического типа.

Dim Name As String = "Abraham"

Dim b As Boolean

b = Name.StarsWith("b")

‘b=False

Строка.Replace(Старая, Новая )

Replace(Строка, Старая, Новая)

Заменяет старую подстроку в строке на новую.

Dim S1 As String = "Карман"

S1 = S1.Replace("ман","тон")

'S1="Картон"

Строка.Remove(n, k)

Удаляет k символов из середины строки, начиная с n-го символа.

Dim RawStr,CleanStr As String

RawStr = "Hello333 there!"

CleanStr = RawStr.Remove(5,3)

‘CleanStr="Hello there!"

Строка.ToUpper

UCase(Строка)

Изменяет регистр букв строки на верхний регистр.

Dim Name, NewName As String

Name = "Kim"

NewName = Name.ToUpper

'NewName="KIM"

Строка.ToLower

Изменяет регистр букв строки на нижний регистр.

Dim Name, NewName As String

Name = "Kim"

NewName = Name.ToLower

'NewName="kim"

Строка.TrimStart([Символ])

LTrim(Строка)

Удаляет пробелы или любые указанные в скобках символы в начале строки. Удаление любого символа производит только метод. Функция VB удаляет только пробелы.

Dim S As String=" Hello!!!"

S = S.TrimStart()

‘S="Hello"

Строка.TrimEnd([Символ] )

RTrim(Строка)

Удаляет пробелы или любые указанные в скобках символы в конце строки. Удаление любого символа производит только метод. Функция VB удаляет только пробелы.

Dim S As String = "Hello!!!"

S = S.TrimEnd("!")

‘S="Hello"

Строка.Trim([Символ] )

Trim(Строка)

Удаляет пробелы или любые указанные в скобках символы, как в начале строки, так и в конце. Удаление любого символа производит только метод. Функция VB удаляет только пробелы.

DimSp, TrAsString

Sp = " Hello "

Tr = Sp.Trim()

'Tr="Hello"

Строка.Length

Len(Строка)

Определяет число символов в строке.

Dim River As String

Dim Size As Short

River = "Mississippi"

Size = River. Length

'Size=11

Строка.Insert(n, ПодСтрока)

Вставляет подстроку в n-ю позицию строки.

Dim Oldstr, Newstr As String

Old = "Hi Felix"

Newstr=Old.Insert(3,"there")

'Newstr="Hi there Felix"

String.Join(Символ,ОдномМассив)

Join(Массив[,Символ])

Объединяет строки из одномерного массива в одну строку, разделенные указанным символом. Если символ не указан, то разделяет пробелом.

Dim Mas()As String Mas={"хо","ро","шо"}

Dim S1, S2 As String

S1 = Join(Mas,":")

S2 = String.Join("", Mas)

‘S1="хо:ро:шо"

‘S2="хорошо"

Средства работы со строками класса StringBuilder. Любой объект класса String является неизменяемым и его значение никогда не изменяется после создания строки. Это означает, что при каждом примене­нии метода, который изменяет значение строки, в действительности создается но­вый объект типа String. Например, следующее выражение: S=S.Insert(3, "1234")не изменяет исходную строку в памяти. Вместо этого метод Insert() создает новый объект типа String, который затем присваивается объектной переменной S. Исход­ный строковый объект в памяти, в конце концов, будет уничтожен во время следу­ющей сборки мусора, если только на него не указывает другая переменная. Схема выделения памяти .NET обеспечивает, что этот механизм добавляет относительно небольшие непроизводительные издержки, тем не менее, слишком большое коли­чество операций выделения и освобождения памяти может ухудшить эффектив­ность приложения. Объект типа System.Text.StringBuilder предлагает решение этой про­блемы. Причем при использовании объектов класса StringBuilder необходимо подключить библиотеку System.Text (Imports System.Text).

Объект типа System.Text.StringBuilder можно представить в виде буфера, который содержит строку, способную увеличиваться в размерах от нуля символов и до теку­щей вместимости этого буфера. До тех пор, пока эта вместимость не превышена, строка строится в буфере, и память не выделяется и не освобождается. Если строка становится больше текущей вместимости буфера, объект класса StringBuilder создает буфер большего размера. Используемый по умолчанию буфер изначально содержит 16 символов, но это значение можно изменить, присвоив другое значение вместимости в конструкторе StringBuilder( ) или присвоив новое значение свойству Capacity:

Создание объекта StringBuilder с начальной вместимостью 1000 символов.

Dim sb As New StringBuilder(1000)

Строку, хранящуюся в объекте StringBuilder, можно обрабатывать с помощью нескольких методов, большая часть которых имеет такое же имя и работает так же, как методы, определенные в классе String. Например, методы Insert(), Remove()и Replace().Чаще всего строку внутри объекта StringBuilder строят с помощью метода этого объекта Append(), который принимает аргумент любого типа и добавляет его к текущей внутренней строке:

'Создание списка первых 100 целых чисел, разделенных запятыми

For n As Integer = 1 То 100

'Обратите внимание на то, что два метода Append исполняются быстрее,

'чем один метод Append, аргумент которого- конкатенация n и строки ","

sb.Append(n) : sb.Append(",")

Next n

sb.Insert(0,"Список чисел:")'Вставляет строку в начало буфера

TextBox1.Text=sb.ToString() ' Список чисел: 1,2,3,4,5,6,...

TextBox2.Text=CStr(sb.Length) ' Длина строки равна 309

Свойство Length возвращает текущую длину внутренней строки.

Также имеется метод AppendFormat( ), который позволяет задать строку форматирования, во многом так же, как и метод String.Format( ), и метод AppendLine( ), который добавляет в буфер обмена StringBuilder строку и используемый по умолчанию символ конца строки:

For n As Integer = 1 То 100

sb.AppendLine(CStr(n))

Next n

В результате этого фрагмента программы получится объект-строка из чисел, причем каждое число будет записываться с новой строки. Так как технически содержимое объекта StringBuilder является не строкой, а символьным буфером, то в нужный момент (например, для вывода результата или присвоения) этот объект необходимо преобразовать в строку методом ToString( ).

Пример 4.9.4-1. Создать проект, который вводит с клавиатуры строки a и b, отображает их на форме, а затем обрабатывает, удаляя из строки a все символы, входящие в строку b и расположенные на нечетных позициях строки b, результат обработки необходимо отобразить на форме.

  1. Разработанная форма интерфейса пользователя приведена на рис. 4.9.4-1.

Рис. 4.9-4-1

Схема алгоритма обработки представлена на рис. 4.9-4-2.

Рис. 4.9-4-2

  1. Программный код решаемой задачи представлен на рис. 4.9-4-3. Он содержит процедуры vvod( ), vivod( )и Обработка( ).

Public Class Form1

'Процедура вывода результата в TextBox

Sub vivod(ByVal z As String, ByRef t As TextBox)

If z.Length <> 0 Then

t.Text = z

Else

t.Text = "Все удалено"

End If

End Sub

'Функция ввода исходных данных из TextBox

Function vvod(ByVal T As TextBox) As String

Return T.Text

End Function

Private Sub Button1_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles Button1.Click

Dim Str1, Str2 As String

Str1 = vvod(TextBox1) : Str2 = vvod(TextBox2)

Обработка(Str2, Str1) : vivod(Str1, TextBox3)

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles Button2.Click

End

End Sub

'Процедура решения задачи удаления символов из строки

Sub Обработка(ByVal b As String, ByRef a As String)

Dim d, m, i, j As Short

m = CShort(a.Length) 'длина строки a

d = CShort(b.Length) 'длина строки b

For i = 0 To CShort(d - 1) Step 2 'перебор нечетных симв. строки b

j = 0

Do While j < m 'перебор всех символов строки a

If a.Substring(j, 1) = b.Substring(i, 1) Then

a = a.Remove(j, 1) 'пока симв. совпад.-удаляем из a

m = CShort(m - 1) 'уменьшаем длину строки a

Else

j = CShort(j + 1) 'переход к след.символу строки a

End If

Loop

Next i

End Sub

End Class

Рис. 4.9.4-3

Если в процедуре Обработка( )использовать логический оператор AndAlso (см. Тему 4.4), то процедура будет иметь вид, представленный на рис. 4.9.4-4.

'Процедура удаления символов из строки, используя оператор AndAlso

Sub Обработка(ByVal b As String, ByRef a As String)

Dim d, m, i, j As Short

m = CShort(a.Length) 'длина строки a

d = CShort(b.Length) 'длина строки b

For i = 0 To CShort(d - 1) Step 2 'перебор нечетных символов

j = 0

'перебор всех символов строки a

Do While j < m AndAlso a.Substring(j,1) = b.Substring(i,1)

a = a.Remove(j, 1) 'пока симв. совпад.-удаляем из a

m = CShort(m - 1) 'уменьшаем длину строки a

Loop

j = CShort(j + 1) 'переход к след.символу строки a

Next i

End Sub

Рис. 4.9.4-4

  1. Выполнить проект и получить результаты, представленные на рис. 4.9.4-5.

Рис. 4.9.4-5

Соседние файлы в папке Учебное_пособие-Раздел4-Информатика-270100з