Проект 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 «Проверка знаний», так чтобы вопросы и правильные ответы хранились в файлах данных, задавались вопросы и вводились ответы с использованием цикла и ответы учащегося сохранялись в файле.