Опубликован: 31.08.2006 | Доступ: свободный | Студентов: 3974 / 230 | Оценка: 4.14 / 3.89 | Длительность: 39:16:00
ISBN: 978-5-9570-0021-3
Лекция 13:

Исследование текстовых файлов и обработка строк

Работа с кодами ASCII

Чтобы определить ASCII-код конкретной буквы, вы можете использовать функцию Asc из Visual Basic. Например, следующий оператор программы присваивает короткой целочисленной переменной AscCode число 122 (ASCII-код строчной буквы "z"):

Dim AscCode As Short
AscCode = Asc("z")

Точно так же, с помощью функции Chr можно преобразовать ASCII-код в букву. Например, этот оператор программы присваивает символьной переменной букву "z":

Dim letter As Char
letter = Chr(122)

Такой же результат можно получить, если вы будете использовать только что объявленную переменную AscCode:

letter = Chr(AscCode)

Как можно сравнить одну текстовую строку или ASCII-код с другой? Вы просто должны использовать один из операторов сравнения, предоставляемых Visual Basic для работы с текстовыми и числовыми элементами. Эти операторы сравнения приведены в следующей таблице:

Оператор Значение
<> Не равно
= Равно
< Меньше, чем
> Больше, чем
<= Меньше или равно
>= Больше или равно

Символ "больше, чем" другой символ, если его ASCII-код больше. Например, значение ASCII буквы "Б" больше, чем значение ASCII буквы "A", так что выражение

"A" < "Б"

истинно, а выражение

"A" > "Б"

ложно.

При сравнении двух строк, которые содержат больше одного символа, Visual Basic начинает со сравнения первого символа в первой строке с первым символом во второй строке, а затем продолжает посимвольное сравнение этих строк до тех пор, пока не найдет различие. Например, строки Mike и Michael одинаковы до третьего символа ("k" и "c"). Так как значение ASCII "k" больше, чем значение "c", выражение

"Mike" > "Michael"

истинно.

Если между строками не найдено различий, то они равны. Если две строки равны на протяжении нескольких символов, но одна строка продолжается, а вторая заканчивается, то более длинная строка больше, чем более короткая. Например, выражение

"AAAAA" > "AAA"

истинно.

Сортировка строк в текстовом поле

В следующем упражнении демонстрируется, как можно использовать операторы сравнения и некоторые строковые методы и функции для сортировки строк текста в текстовом поле. Программа является доработанной версией утилиты Quick Note и содержит команду Открыть, которая позволяет открывать существующий файл, и команду Закрыть, которая закрывает этот файл. Также в ней имеется команда Сортировка текста в меню Файл, которую вы можете использовать для сортировки текста, отображаемого в настоящий момент в текстовом поле.

Так как все содержимое текстового поля хранится в одной строке, вначале программа должна разбить эту длинную строку на более короткие отдельные строки. Затем эти строки можно отсортировать с помощью Sub-процедуры ShellSort - процедуры сортировки по алгоритму, созданному в 1959 году Дональдом Шеллом. Чтобы упростить эту задачу, я создал стандартный модуль, который определяет динамический строковый массив, который будет хранить каждую из строк текстового поля. Я также поместил в этот стандартный модуль процедуру ShellSort, так что я могу вызывать ее из любой процедуры события проекта. (Подробнее о стандартных модулях см. в "Использование модулей и процедур" )

Одним из интересных моментов этой программы является процедура, которая определяет число строк в объекте текстового поля. В Visual Basic нет функции, которая бы автоматически вычисляла это значение. Я хотел, чтобы программа смогла построчно сортировать текстовое поле любого размера. Для этого я создал код, имеющий следующий вид. Он использует метод Substring для поиска в объекте текстового поля единственного символа, а затем функцию Chr для поиска символа возврата каретки (чей ASCII-код равен 13), стоящего в конце каждой строки. (Особенно обратите внимание на то, как в качестве части свойства Text объекта txtNote используется метод Substring - класс String автоматически предоставляет этот метод, а также многие другие для любых свойств или переменных, которые объявлены как имеющие тип String.)

Dim ln, curline, letter As String
Dim i, charsInFile, lineCount As Short
'определяем число строк объекта текстового поля (txtNote)
lineCount = 0 'эта переменная содержит общее количество строк
charsInFile = txtNote.Text.Length	 'получаем общее число символов
For i = 0 To charsInFile (Файл)  - 1 'берем по одному символу за раз
	letter = txtNote.Text.Substring(i, 1) 'получаем символ
	If letter = Chr(13) Then 'если нашли возврат каретки
		lineCount += 1 'переходим на следующую строку (увеличиваем счетчик)
		i += 1 'пропускаем символ перевода строки (всегда следует 'за возвратом каретки)
	End If
Next i

Общее число строк в текстовом поле присваивается короткой целой переменной lineCount. Далее в программе это значение используется для задания размера динамического массива, который хранит все строки по отдельности. Затем окончательный массив строк передается в процедуру ShellSort для сортировки, и ShellSort возвращает строковый массив, отсортированный по алфавиту. Когда строковый массив отсортирован, я просто копирую его в цикле For обратно в текстовое поле.

Сайдахмад Зарипов
Сайдахмад Зарипов
Жанболат Шаймерден
Жанболат Шаймерден

Можно ли выбирать язык для надписей и команд в среде разработки?