5.5. Массивы


            Проект 5.4. «Сортировка числового массива».  Разработаем проект, который позволит заполнять числовой массив целыми случайными числами, а затем предоставит возможность сортировать массив различными способами.

            Заполнение массива случайными числами. Для генерации последовательности случайных чисел используем функцию Rnd. При запуске программы функция Rnd дает  равномерно  распределенную псевдослучайную (т.е. каждый раз повторяющуюся)   последовательность чисел в интервале 0£Х<1. Для того чтобы генерировались различающиеся между собой последовательности, можно использовать оператор Randomize.

            Для получения последовательности случайных чисел в заданном интервале А£Х<В необходимо использовать следующую формулу:

А+(В-А)*Rnd

            Тогда, получение целочисленной последовательности случайных чисел на интервале 0£Х<10 достигается использованием функции выделения целой части числа:

Int(Rnd * 10)

            Заполнение массива bytA, состоящего из 10 элементов, реализуем с помощью цикла со счетчиком, причем предусмотрим в целях визуального контроля его вывод в текстовое поле txtDim c использованием функции Str (преобразования числа в строковую форму).

 

Проект «Сортировка числового массива».

1

Создать новый проект. Разместить на форме текстовое поле txtDim и кнопкe cmd1.

2

Установить для свойства MultiLine текстового поля значение True и подобрать размер шрифта так, чтобы массив распечатывался в одной строке текстового поля.

3

Ввести для кнопки событийную процедуру заполнения массива и его вывода в текстовое поле:

Dim bytI, bytA(1 To 10) As Byte

Private Sub cmdDim_Click()

Randomize

For bytI = 1 To 10

bytA(bytI) = Int(Rnd * 10)

txtDim.Text = txtDim.Text + Str(bytA(bytI))

Next bytI

End Sub

4

Запустить проект и несколько раз щелкнуть по кнопке Заполнить.

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

            Поиск минимального элемента. Будем считать сначала, что минимальный элемент равен первому элементу массива bytA(1) и присвоим переменной bytMin его значение.

            Затем в цикле сравним последовательно элементы массива со значением переменной bytMin, если какой-либо элемент окажется меньше, присвоим его значение переменной bytMin, а его индекс присвоим переменной bytN.  Распечатаем результаты.

5

Разместить на форме текстовое поле кнопку cmd2 и создать для нее событийную процедуру поиска минимального элемента:

 

Private Sub cmdMin_Click()

bytMin = bytA(1)

For bytI = 2 To 10

If bytA(bytI) < bytMin Then bytMin = bytA(bytI): bytN = bytI

Next bytI

Print "Минимальный элемент "; bytMin; "его индекс"; bytN

End Sub

6

Запустить проект. Последовательно щелкать на кнопках Заполнить и Мин. элемент.

В текстовом окне будет появляться заполненный массив, а на форме будет печататься минимальный элемент и его индекс.

 

            Сортировка массива по возрастанию методом перестановок. Идея алгоритма сортировки по возрастанию массива, состоящего из N элементов, методом перестановок элементов состоит в последовательном поиске минимальных элементов и их перемещении к началу массива с помощью перестановок с элементами, имеющими меньший индекс.

            На первом шаге находим минимальный элемент массива и меняем его местами с первым элементом массива. Остаются неупорядоченными N-1 элемент. Проводим поиск минимального элемента среди элементов со 2 по N-1 и делаем перестановку.

            Повторяем процедуру поиска минимального элемента среди оставшихся неупорядоченных элементов многократно.  Повторение реализуем с помощью цикла со счетчиком, максимальное значение которого составляет N-1. В результате массив сортируется по возрастанию.

            Так как, поиск минимального элемента массива проводится многократно, реализуем рассмотренную ранее событийную процедуру cmdMin_Click() как общую процедуру МинЭлемент (bytJ, bytN As Byte), где bytJ – является входным параметром, а bytN – выходным параметром.  

7

Ввести программный код общей процедуры поиска минимального элемента:

 

Sub МинЭлемент(J, N As Byte)

'общая процедура поиска минимального элемента

bytMin = bytA(bytI)

bytN = bytI

For bytJ = bytI + 1 To 10

If bytA(bytJ)< bytMin Then bytMin = bytA(bytJ): bytN = bytJ

Next bytJ

End Sub

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

            Процесс сортировки массива можно сделать наглядным, если в текстовое поле выводить состояние массива на каждом шаге сортировки.

8

Поместить на форму текстовое поле txtSort и кнопку cmdSort.

9

Ввести программный код событийной процедуры сортировки массива:

 

Private Sub cmdSort_Click()

'событийная процедура сортировки

txtSort.Text = ""

For bytI = 1 To 9

'вызов общей процедуры поиска минимального элемента

Call МинЭлемент(bytJ, bytN)

'перестановка

bytR = bytA(bytI)

bytA(bytI) = bytA(bytN)

bytA(bytN) = bytR

'печать массива для каждого цикла сортировки

For bytK = 1 To 10

txtSort.Text = txtSort.Text + Str(bytA(bytK))

Next bytK

Next bytI

End Sub

10

Для большей наглядности разместить на форме две метки с номерами элементов массива (горизонтальная) и значениями счетчика цикла сортировки (вертикальная).

11

Запустить проект на выполнение. Щелкнуть по кнопкам Заполнить массив, Мин. элемент и Сортировка.

12

7

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

13

Сохранить проект в файле prj4.vbp.

 

            Проект 5.5. «Сортировка строкового массива».  Разработаем проект, который позволяет сортировать строковый массив (например, содержащий компьютерные термины) по алфавиту.

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

            Такие текстовые файлы должны содержать только коды самих символов (не должны содержать управляющие коды форматирования текста, тэги языка HTML и т.д.) и, следовательно, должны создаваться в простейших текстовых редакторах (типа Блокнот). 

            В таких файлах элементы данных (последовательности символов) отделяются друг от друга с помощью разделителей (чаще всего запятой).

Создадим два текстовых файла данных, первый, содержащий буквы алфавита, а второй файл, содержащий компьютерные термины.

 

Проект «Сортировка строкового массива».

1

Запустить Блокнот, создать файл, ввести буквы русского алфавита и сохранить под именем alphabet.txt.

 

2

Создать файл, ввести компьютерные термины и сохранить под именем term.txt.

 

 

            Прежде чем приступить к считыванию данных из текстового файла в строковый массив (или последовательность строковых переменных) необходимо открыть файл с помощью специального оператора Open:

Open Имя_файла For Режим_работы As # Номер_файла

     Имя_файла должно содержать путь к файлу и собственно имя файла, Режим_работы определяет, что файл открыт для считывания данных (Input) или, наоборот, для записи данных в файл (Output), а Номер_файла содержит целое число в интервале от 1 до 511.

            Например, чтобы открыть  для считывания данных файл alphabet.txt, находящийся на CD-ROM (логическое имя которого E:), необходимо ввести следующий код:

Open "E:\practicum\VisualBasic\project\project5\alphabet.txt" For Input As #1

            Для чтения данных из файла используется функция Input:

Input # Номер_файла, Список_переменных

            После завершения считывания данных файл необходимо закрыть с помощью оператора Close:

Close # Номер_файла

            Произведем чтение данных из файла alphabet.txt в строковый массив с помощью цикла со счетчиком.

3

Создать проект, на форму поместить кнопку cmdAlph и текстовое поле txtAlph, в котором можно наблюдать результат заполнения массива.

4

Создать событийную процедуру считывания данных из файла alphabet.txt в строковый массив strA:

 

Private Sub cmdAlph_Click()

Open"E:\practicum\VisualBasic\project\project5\alphabet.txt" For Input As #1

For bytI = 1 To 33

Input #1, strA(bytI)

txtAlph.Text = txtAlph.Text + strA(bytI)

Next bytI

Close #1

End Sub

 

            Произведем теперь чтение данных из файла term.txt в строковый массив с помощью цикла с предусловием. Это вариант используется, если заранее неизвестно количество элементов данных в файле, и в качестве условия используется функция EOF (End Off File):

EOF(Номер_файла)

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

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

 

5

Поместить на форму кнопку cmdTerm и окно списка lstTerm, в котором можно наблюдать результат заполнения массива.

6

Создать событийную процедуру считывания данных из файла term.txt в строковый массив strB и его отображения в окне списка lstTerm:

 

Private Sub cmdTerm_Click()

Open "E:\practicum\VisualBasic\project\project5\term.txt" For Input As #2

bytI = 1

Do Until EOF(2)

Input #2, strB(bytI)

lstTerm.AddItem strB(bytI)

bytI = bytI + 1

Loop

Close #2

End Sub

 

            Сортировка массива.  В исходном строковом массиве strB термины хранятся в неупорядоченном виде. Сравним последовательно во внутреннем цикле со счетчиком bytI букву «а» алфавита с первыми символами терминов, в случае их совпадения присвоим первому элементу результирующего символьного массива  strC это значение. Повторим эту процедуру последовательно для всех букв алфавита с использованием внешнего цикла со счетчиком bytK. Получим упорядоченный строковый массив strC.

7

Поместить на форму кнопку cmdSort и создать событийную процедуру сортировки массива:

 

Private Sub cmdSort_Click()

bytJ = 1

For bytK = 1 To 33

For bytI = 1 To 10

If strA(bytK) = Left$(strB(bytI), 1) Then strC(bytJ) = strB(bytI): bytJ = bytJ + 1

Next bytI

Next bytK

End Sub

 

            Визуализация отсортированного массива. Для визуализации отсортированного массива используем второе окно списка.

8

Поместить на форму кнопку cmdRez, окно списка lstSort и создать событийную процедуру визуализации отсортированного массива:

 

Private Sub cmdRez_Click()

For bytJ = 1 To 10

lstSort.AddItem strC(bytJ)

Next bytJ

End Sub

9

Запустить проект на выполнение. Последовательно щелкнуть по кнопкам Считать алфавит, Считать термины, Сортировать, Показать:

 

10

Сохранить проект в файле prj5.vbp.    

 

Задания для самостоятельного выполнения (Ответы)

5.14.     Создать проект, реализующий поиск максимального элемента числового массива.

5.15.     Создать проект, реализующий сортировку числового массива по убыванию методом перестановок.

5.16.     Создать проект, реализующий сортировку массива по возрастанию «пузырьковым» методом.

5.17.     Усовершенствовать проект 5.5 «Сортировка строкового массива». Предусмотреть возможность сохранения отсортированного массива в файле.

5.18.     Создать проект «Словарь компьютерных терминов», который выводит определение заданного пользователем термина. Термины и их определения хранить в файлах данных.

5.19.     Создать проект «Русско-английский и англо-русский словарь», который обеспечивает перевод слов, хранящихся в файлах данных.

5.20.     Усовершенствовать проект 5.3 «Проверка знаний», так чтобы вопросы и правильные ответы хранились в файлах данных, задавались вопросы и вводились ответы с использованием цикла и ответы учащегося сохранялись в файле.