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

ПиОА_1 семестр_1 / ПОСОБИЕ_VB.Net

.pdf
Скачиваний:
658
Добавлен:
06.03.2016
Размер:
3.4 Mб
Скачать

For i As Int32 = 0 To a.GetUpperBound(0)

For j As Int32 = 0 To a.GetUpperBound(1)

'Установка ширины столбцов таблицы b.Columns(j).Width = 40 b.Rows(i).Cells(j).Value = _

Convert.ToString(a(i, j))

Next j Next i

End Sub

Private Sub Button1_Click(...) Handles Button1.Click

'В двумерном массиве удалить все строки, содержащие 0

Dim kol, n, m, i, j As Int32 Dim f As Boolean

Dim b(,) As Int32 'вспомогательный массив

n = a.GetLength(0) : m = a.GetLength(1)

'Вывод массива до удаления out_put(a, DataGridView1) kol = 0

'Цикл по для подсчета количества удаляемых строк

For i = 0 To n - 1 For j = 0 To m - 1

If a(i, j) = 0 Then kol += 1 : Exit For

End If Next j

Next i

'проверка условия останутся ли строки в массиве

If kol < n Then

'если да

ReDim b(n - kol - 1, m - 1) i = 0 : kol = 0

While i

<= n - 1

f =

True

For

j = 0 To m - 1

If a(i, j) = 0 Then

f = False : Exit For

End If Next j

If f Then

68

'заполнение массива b строками не содержащими нулей

For j = 0 To m - 1 b(kol, j) = a(i, j)

Next j kol += 1

End If i += 1

End While 'Конец цикла While

'изменения размерности массива a и его инициализация

ReDim a(kol - 1, m - 1)

'заполнение массива a содержимым массива b For i = 0 To kol - 1

For j = 0 To m - 1 a(i, j) = b(i, j)

Next j Next i

'Вывод массива после удаления строк out_put(a, DataGridView2)

'если нет

Else : MsgBox("в массиве больше нет элементов")

End If End Sub

Private Sub Form1_Load(...) Handles MyBase.Load

'Вывод исходного массива сразу после загрузки формы

out_put(a, DataGridView1)

End Sub

End Class

Рис. 6.15 Интерфейс задачи 6.15

69

Сортировка массивов

Под сортировкой обычно понимают процесс перестановки объектов некоторого множества в определенном порядке. Цель сортировки – облегчить в дальнейшем поиск элементов отсортированного множества. Это очень часто выполняемая, фундаментальная операция. Объекты сортируются в телефонных справочниках, в библиотеках, в словарях, то есть почти всюду, где нужно искать хранимые объекты. На отсортированных данных легче определить, имеются ли в них пропущенные элементы, все ли элементы проверены, легче найти общие элементы двух однотипных структур, слить их воедино. Практически любой список данных ценнее, когда он отсортирован по какому-либо определенному принципу. Для отсортированных данных легче принять решение.

Рассмотрим в этом разделе методы сортировки, которые называются простыми и требуют в наихудшем случае n2 сравнений (n – количество рассматриваемых элементов), по следующим причинам:

1.Простые методы хороши для обсуждения основных принципов сортировки.

2.Соответствующие программы легко понять. К тому же они короткие: ведь нужно помнить, что программы тоже занимают место в памяти!

3.Простые методы оказываются быстрее для малых n, хотя их нельзя использовать для больших n.

Простые методы сортировки, делятся на три основные категории в соответствии с используемыми приемами:

-сортировка выбором;

-сортировка обменом;

-сортировка вставками.

Сортировка выбором

Суть сортировки методом выбора заключается в следующем:

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

70

На втором шаге просматриваются n - 1 элементов массива начиная со второго, среди них определяется наименьший, который затем меняется местами с элементом, стоящим на втором месте.

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

На рис. 6.16 приведен пример сортировки по возрастанию методом выбора заданного одномерного массива, состоящего из семи элементов, по шагам. Всего шагов 6.

Рис. 6.16. Пример сортировки выбором

Сортировка обменом

Суть сортировки методом обмена (пузырька) заключается в последовательных просмотрах массива от начала к концу и обмене местами соседних элементов, расположенных «неправильно», то есть таких, что при i < j, аi > aj.

Первый шаг. Просматривается весь массив, начиная с первой пары элементов (a1 и а2). Если первый элемент этой пары больше второго, то они меняются местами, иначе – остаются без изменения. Затем берется вторая пара элементов (a2 и а3). Если a2 > a3, то они меняются местами, иначе – остаются без изменения, и так далее. На этом первом шаге будут просмотрены все пары элементов массива ai

71

и ai+1. В результате максимальный элемент массива переместится в конец массива.

Далее, поскольку самый большой элемент находится теперь на своем месте, часть массива рассматривается без него, то есть с первого до (n - 2)-го элемента. И для этой части массива повторяются предыдущие действия, в результате чего второй по величине элемент массива переместится на (n - 2)-е место в массиве.

Эти действия продолжают до тех пор, пока число элементов в текущей части массива не уменьшится до одного. При сортировке выполняется n - 1 просмотров массива.

На рис. 6.17 приведен пример сортировки по возрастанию методом обмена заданного одномерного массива, состоящего из пяти элементов, по шагам. Всего шагов 4.

1 шаг

2 шаг

 

 

3 шаг

4 шаг

 

 

Рис. 6.17 Пример сортировки обменом

Сортировка вставкой

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

72

довательно шаг за шагом. На каждом i-м шаге считается, что часть массива a1, a2,…, ai уже упорядочена, т.е. a1 < a2 < … < ai.

1) Для i-го элемент подбирается место в уже отсортированной части массива так, чтобы после его вставки упорядоченность не нарушилась. Т.е. ищется такое место j (1 ≤ j i − 1), чтобы выполнялось условие aj ai < aj+1.

Элементы с индексами большими или равными j и меньшими или равными i-1 сдвигаются вправо на одну позицию (j – место, i – номер рассматриваемого элемента). Элемент ai вставляется на найденное место j. С каждым шагом отсортированная часть массива увеличивается на один элемент. При сортировке выполняется n-1 просмотр массива.

Подобный алгоритм тратит много времени на поиск правильной позиции для нового элемента. Фактически этот алгоритм работает даже медленнее, чем, например, сортировка выбором.

Например, рассмотрим вставку элементов, начиная с элемента, стоящего на 5 месте. Это четвертый шаг сортировки. Запоминаем этот элемент, ищем место вставки – это место 2; сдвигаем элементы с 2-го по 4-й на одну позицию вправо; на первое место вставляем рассматриваемый элемент, который запомнили.

4 шаг. Запомнили, нашли, сдвинули, вставили.

5 шаг. Запомнили, нашли, сдвинули, вставили.

73

6 шаг. Запомнили, нашли, сдвинули, вставили.

Задача 6.16. Отсортировать одномерный массив по возрастанию:

-методом выбора;

-методом обмена;

-методом вставки.

Фрагменты программного кода:

'метод выбора

n = a.GetLength(0)

For i As int32 = 0 To n – 2 'Цикл по количеству проходов

Min = a(i): nom = i

For j As int32 = i + 1 To n-1

If (a(j) < Min) Then Min = a(j): nom = j

Next j

'Обмен местами элемента a(i) с минимальным элементом ' в рассматриваемой части массива

z = a(i): a(i) = a(nom): a(nom) = z

Next i

'метод обмена

n = a.GetLength(0)

For i As int32 = 0 To n – 2 'Цикл по количеству проходов

For j As int32 = 0 To n - i - 2 If a(j) > a(j + 1) Then

'Обмен местами соседних элементов, если они стоят 'не в «нужном» порядке

z = a(j): a(j) = a(j + 1): a(j + 1) = z

End If Next j Next i

74

'метод вставки

n = a.GetLength(0)

For i As int32 = 1 To n - 1 b = a(i)

j = 0

'поиск места

While (b > a(j)) And (j <= i) j += 1

End While

'сдвиг

For k As int32 = i To j + 1 Step -1 a(k) = a(k - 1)

Next k

'вставка a(j) = b

Next i

Вкачестве улучшенных методов сортировки рассмотрим:

-сортировку бинарными вставками;

-быструю сортировку, первый вариант которой предложил Хоар.

Сортировка бинарными вставками

Двоичная (бинарная) вставка использует для отыскания места вставки в отсортированную часть массива алгоритм двоичного (бинарного) поиска.

Рассматриваемый элемент массива сравнивается с элементом, находящимся на середине интервала отсортированных элементов:

a1 a2 a3

a4

a5 a6 a7 a8

a9

a10

 

 

 

 

 

отсортированная часть

Если а9 оказывается меньше а4, то далее рассматривается интервал слева от а4, если нет, то справа от а4.

Введем обозначения:

75

i – номер рассматриваемого на данном шаге элемента массива;

lf, rg – соответственно левая (left) или правая (right) динамически изменяемые границы интервала для вставки i-го элемента;

c – середина этого интервала. Описание метода:

При вставке i-го элемента его вначале сравнивают с элементом, который находится в середине интервала индексов [lf, rg], где lf = 1, rg = i-1. Номер с этого элемента определяется по формуле

с = (lf + rg) div 2.

Далее проверяется условие ас > ai. Если оно выполняется, то правая граница рассматриваемого интервала индексов сдвигается влево, она становится равной rg = с. Если условие не выполняется, т.е. ас <= ai, то сдвигается вправо левая граница интервала, она становится равной lf = с.

Затем сравнение ai происходит с элементом, который находится в середине уже нового интервала индексов. Сравнение происходит до тех пор, пока в интервале не останется один (lf = rg) или два соседних элемента (lf rg). Это произойдет, когда вновь найденная середина с совпадет с левой границей lf рассматриваемого интервала.

Далее решается вопрос, на какое место произойдет вставка эле-

мента ai: на место lf, rg или rg +1, т.е. если ai < alf, то он должен встать на место с индексом lf, если нет, то проверяется условие ai

arg, если оно верно, то элемент должен встать на место с индексом rg, если нет, то на место с индексом rg + 1.

До вставки все элементы рассматриваемой части массива, начиная с позиции вставки и правее до (i+1)-го, сдвигаются на одну позицию вправо, освобождая место для i-го элемента.

Пример определения места и вставки последнего 8-го элемента в заданном одномерном массиве приведен на рис. 6.18.

76

Рис. 6.18 Пример последнего шага бинарной сортировки

77

Быстрая сортировка

Суть метода заключается в следующем:

1.В исходном неотсортированном массиве некоторым образом выбирается разделительный элемент x (барьерный элемент).

2.Элементы массива переставляются таким образом, чтобы слева от х оказались элементы, меньшие или равные х, а справа – элементы массива, большие х. Отсюда можно сделать вывод, что элемент ak

оказался на своем месте. Исходный массив при этом разделился на две неотсортированные части, барьером между которыми является элемент x = ak .

a1, a2 , K, ak −1 x ,

ak = x ,

x < ak +1, ak + 2 , K, an

3.Для дальнейшей сортировки необходимо применить пп. 1,2 для каждой из этих частей.

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

Способы задания разделительного элемента:

1.Выбирается первый или последний элемент рассматриваемой части массива.

2.Выбирается элемент, находящийся в середине рассматриваемой части массива.

3.Принимается среднее арифметическое всех элементов рассматриваемой части массива.

4.Принимается среднее арифметическое из трех элементов в начале, в конце и в середине рассматриваемой части массива.

5.Выбирается случайным образом из рассматриваемой части массива.

На рис. 6.19 приведен пример разделения одномерного массива на два подмассива при первом шаге быстрой сортировки. В качестве разделительного (барьерного) выбран элемент, находящийся в середине массива. Это четвертый элемент массива, его значение равно 6. В результате

78

Рис. 6.19 Пример разделения массива на два подмассива при первом шаге быстрой сортировки

Задача 6.17. Отсортировать одномерный массив по возрастанию методом быстрой сортировки.

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

Sub quick_sort(ByVal i_n As Int32, _

ByVal i_k As Int32, ByRef a() As Int32)

Dim i, j, k, x, p As Int32 i = i_n : j = i_k

k = (i + j + 1) \ 2 'определение индекса барьерного элемента

x = a(k)

'задание барьерного элемента x

 

 

 

79

Do

'цикл деления на подмассивы

While

a(i) < x

i

= i + 1

End While

While x < a(j) j = j - 1

End While

If i <= j Then

p = a(i) : a(i) = a(j) : a(j) = p i = i + 1 : j = j - 1

End If

Loop Until i > j

If i_n < j Then quick_sort(i_n, j, a)

If i < i_k Then quick_sort(i, i_k, a)

End Sub

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

Private Sub Button1_Click(...) Handles Button1.Click Dim a() As Int32

Dim n As Int32 n = 20

ReDim a(n - 1)

'задание элементов массива

For i As Int32 = 0 To n - 1 a(i) = i

Next i

'изменение порядка следования элементов массива на обратный

Array.Reverse(a)

'вывод элементов массива до сортировки

For i As Int32 = 0 To n - 1

TextBox1.Text &= Convert.ToString(a(i)) & " "

Next i

'вызов быстрой сортировки quick_sort(0, n - 1, a)

'вывод элементов массива после сортировки

For i As Int32 = 0 To n - 1

TextBox2.Text &= Convert.ToString(a(i)) & " "

Next i

End Sub

80

Задача 6.18. Отсортировать двумерный массив по возрастанию значений первого столбца методом бинарных вставок.

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

Sub sort_bv(ByRef arr(,) As Int32) Dim i, n, m, c, lf, rg, k As Int32 Dim p() As Int32

n = arr.GetLength(0) m = arr.GetLength(1) ReDim p(n - 1)

i = 1

While i <= n - 1 lf = 0

rg = i - 1

c = (lf + rg) \ 2

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

While lf <> c

If arr(c, 0) > arr(i, 0) Then rg = c

Else : lf = c

End If

c = (lf + rg) \ 2

End While

'определение места для вставки

If arr(lf, 0) < arr(i, 0) Then If arr(i, 0) > arr(rg, 0) Then

lf = rg + 1 Else : lf = rg

End If End If k = i

'запомнить строку

p(0) = arr(i, 0) : p(1) = arr(i, 1)

'сдвиг элементов

While k > lf

arr(k, 0) = arr(k - 1, 0) arr(k, 1) = arr(k - 1, 1) k = k - 1

End While

'вставка строки массива

81

arr(lf, 0) = p(0) : arr(lf, 1) = p(1) i = i + 1

End While End Sub

6.8. Контрольные вопросы и задания

1.Что такое массив данных?

2.Что такое размер и размерность массива?

3.Перечислите способы формирования массивов.

4.Как и в каком разделе программного кода описываются массивы?

5.Как определить местоположение элемента в одномерном и двумерном массиве?

6.Что такое индекс в одномерном массиве? Каким требованиям он должен удовлетворять?

7.Как осуществляется доступ к элементам массива?

8.Опишите отличия статических и динамических массивов.

9.Что такое динамический массив? Опишите отличия их от статических массивов. Каков порядок описания и применения динамических двумерных массивов?

10.Какая процедура позвляет выделить необходимое количество памяти под массивы?

11.Приведите примеры методов и свойств класса Array.

12.Как создать экземпляр (объект) класса?

13.Для чего создаются объекты классов?

14.Какой метод класса Random можно использовать для заполнения массива случайными числами из заданного диапазона?

15.Для чего служит оператор Imports?

16.В чем состоит отличие класса Array от класса ArrayList

17.Как можно изменениеть порядок элементов в списке?

18.Какой тип циклических операторов чаще всего используется при работе с двумерными массивами?

19.Опишите элемент управления DataGridView.

20.Опишите способы доступа к ячейке таблицы DataGridView.

82

21.Какие свойства элемента управления DataGridView вы использовали в программном коде для вывода двумерных массивов?

22.Какими соотношениями связаны номера строк и столбцов элементов, расположенных на главной и на побочной диагонали?

23.Опишите суть сортировки методом выбора.

24.Опишите суть сортировки методом обмена (пузырька).

25.Опишите суть сортировки методом вставки.

26.С какими улучшенными методами сортировки вы познакомились?

27.Создать приложение, реализующее следующие задачи:

1)формирование одномерного массива с помощью метода Next

класса Random;

2)вывод сформированного массива в таблицу DataGridView;

3)нахождение суммы элементов, имеющих нечетное значение;

4)вывод индексов тех элементов, значения которых больше заданного числа;

5)перестановка местами первых трех и последних трех элементов, сохраняя порядок их следования.

Для выбора задачи используйте компоненты RadioButton.

Формирование массива, его вывод в DataGridView и каждую задачу оформите в виде пользовательских процедур.

28.Создать приложение, реализующее следующие задачи:

1)заполнение двух одномерных массивов разного размера целыми натуральными случайными числами;

2)для каждого из двух массивов:

-поиск минимального элемента и его номера;

-удаление всех элементов, имеющих минимальные значения;

3)объединение двух преобразованных массивов в третий;

4)сортировка по возрастанию третьего массива;

5)вставка в качестве пометки числа 0 перед каждым минимальным элементом в третьем массиве.

83

Используйте динамически описанные массивы. Для заполнения массивов используйте метод Next класса Random. Для объединения массивов используйте методы и свойства класса Array.

Формирование массива, его вывод в DataGridView и каждую задачу оформите в виде пользовательских процедур.

29.Создать приложение, реализующее следующие задачи:

1)заполнение двумерного массива размером n*m отрицательными и положительными целыми случайными числами;

2)вывод сформированного массива в таблицу DataGridView;

3)существует ли в данном массиве строка, в которой имеется два элемента массива, имеющие наибольшие значения;

4)замена минимального по модулю элемента каждого столбца нулем;

5)обмен местами первого и последнего столбца.

Для выбора задачи используйте компонент RadioButton. Используйте динамическое описание массивов.

Формирование массива, его вывод в DataGridView и каждую задачу оформите в виде пользовательских процедур.

30.Создать приложение, реализующее следующие задачи:

1)заполнение двумерного массива размером n*m отрицательными, положительными числами и нулями с помощью таблицы

DataGridView;

2)вставка первой строки после каждой четной строки;

3)удаление всех строк, содержащих ноль.

4)вывод модифицированного массива в таблицу

DataGridView;

Для выбора задачи используйте компоненты RadioButton. Используйте динамическое описание массивов.

Формирование массива и каждую задачу оформите в виде пользовательских процедур.

31. Создать приложение, реализующее следующие задачи:

84

1)заполнение двумерного массива размером n*n (квадратную матрицу) положительными числами с помощью таблицы

DataGridView;

2)определение симметричности заданной матрицы относительно главной диагонали;

3)вывод месторасположения несимметричных элементов относительно побочной диагонали в заданной матрице;

4)определение симметричности заданной матрицы относительно горизонтальной оси;

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

Для выбора задачи используйте компоненты RadioButton. Используйте динамическое описание массивов.

Формирование массива и каждую задачу оформите в виде пользовательских процедур.

85

7.СТРОКОВЫЙ ТИП ДАННЫХ

Вреальных задачах часто встречаются объекты символьного типа строки – это последовательность символов, заключенных в двойные кавычки. Количество символов в строке называется ее дли-

ной. Два следующих друг за другом апострофа ("") обозначают пустую строку, т.е. строку с нулевой длиной.

Формат описания строковой переменой:

Dim Имя_строки As String

Например:

Dim St As String

St = "Это строковая константа"

Dim St As String = "Это строковая константа"

Примечание. Vb.Net не поддерживает строки фиксированной длины.

7.1. Операции над строками

Над строками допустимы операции сцепления (конкатенации) и сравнения (=, <, >, <=, >=, <>). Операция сцепления «&» применяется для соединения нескольких строк в одну строку. Все остальные действия над строками и символами возможно осуществить используя методы, принадлежащие классу System.String библиотеки .NET

Framework.

Как и все массивы в .NET Framework, строки являются одномерными массивами, в которых индексация ведется от нуля.

Как и в других классах в классе String есть общие методы и методы экземпляра класса. Общие методы определяются именем класса String. Методы экземпляра класса должны уточняться именем экземпляра. Некоторые строковые свойства и методы класса String приведены в табл. 6.5.

 

Таблица 7.1. Некоторые методы и свойства класса String

Название

 

Описание

 

 

 

Свойства

 

 

 

Возвращает символ, находящийся в заданной позиции

 

 

 

poz, например:

 

Chars (poz)

 

Dim St As String = "ABCDE", c As Char

 

 

 

c = St.Chars(3)

 

 

 

Результат: переменная c содержит символ D

 

 

 

 

 

 

86

 

Продолжение табл. 6.5

 

Возвращает количество символов в строке, например:

 

Dim St As String = "ABCDE"

Length

Dim n As byte

 

n = st.length

 

Результат: переменная n содержит целое число 5

 

 

 

Методы класса String

 

Копирует строку St, например:

 

St = "Изучение строк" :

Copy (St)

St1 = String.Copy(St)

 

Результат: St1="Изучение строк"

 

(St1 получает строку St)

 

 

 

Возвращает отформатированное значение выражения

Format

согласно шаблону формата, например:

Dim St As String

(выражение,

St = Format(2/3, "0.00")

шаблон)

Результат: Строка St содержит строку "0.67"

 

 

 

 

Методы экземпляра класса String

SubString

Возвращает подстроку, начинающуюся с заданной на-

(позиция,kol)

чальной позиции и заданным количеством символов kol

 

 

 

Возвращает индекс первого вхождения символа или под-

 

строки в заданной строке. Если вхождений нет, то воз-

IndexOf

вращается -1, например:

TextBox2.Text = St.IndexOf("с")

(подстрока)

 

 

Результат:

 

 

Replace

Заменяет все вхождения одной подстроки другой под-

(подстрока1,

строкой, например:

подстрока2)

St = "Звезда скрылась за горизонтом"

 

St = St.Replace("Звезда", "Луна")

 

Результат: Переменная St содержит строку

 

"Луна скрылась за горизонтом"

 

 

 

Возвращает новую строку, полученную вставкой под-

Insert

строки с заданной позиции исходной строки, например:

TextBox2.Text = St.Insert(9, " функции ")

(poz,

Результат:

подстрока)

St:

 

 

 

 

87