Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа_3_1_Лс_27_11_2011.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
4.63 Mб
Скачать

Ilорядок действий

1. Расположите на форме 5 кнопок.

2. Значения свойств объектов, которые определяют внешний вид приложения, установите по своему усмотрению.

3. Значения свойств Caption формы и кнопок установите в соответствии с рис.10.7.

4. Установите значения свойств Name формы и кнопок.

5.1. Проанализируйте приведенный ниже программный код, а затем наберите его.

Option Explicit

Dim A(1 To 10) As Integer ' массив

Dim i As Integer, j As Integer

Dim Amax As Integer

Dim imax As Integer

Dim H As Integer

Private Sub cmdФорм_Click()

Randomize Timer

Print "Вихідний масив"

For i = 1 To 10

A(i) = Int(100 * Rnd())

Print A(i);

Next i

End Sub

Private Sub cmdCls_Click()

Form1.Cls

Form1.Caption = " Сортування "

End Sub

Sub Print_Mas()

Print

Print "Відсортований масив:"

For i = 1 To 10

Print A(i);

Next i

End Sub

5.2. Проанализируйте описанный метод сортировки "пузырьком". Добавьте приведенный программный код в проект.

Рис. 10.8 Схема алгоритма “ Метода пузырька".

Рассмотрим суть метода на примере. Пусть надо расставить по убыванию четыре числа:

2

10

5

6

Будем просматривать числа слева направо, очередное число будем сравнивать со следующим справа: если следующее число больше очередного, то поменяем их местами. Ниже для наглядности "очередное" число заключено в рамку.

Начинаем с самого левого числа:

2

10

5

6

Следующее число больше, значит, меняем их местами:

10

2

5

6

Переходим ко второму по счету числу:

10

2

5

6

Сравниваем его со следующим, оно больше, значит, меняем их местами:

10

5

2

6

Переходим к следующему, третьему, числу:

10

5

2

6

Сравниваем его со следующим, четвертым. Следующес больше, значит, меняем их местами:

10

5

6

2

На предпоследнем числе надо остановиться, так как если перейдем на последнее число, то его не с чем будет сравнивать — справа чисел нет.

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

Самое большое число тоже находится на своем месте, где и положено быть. Однако это чистая случайность: результат того, что первоначально данное число стояло на втором месте; с любого другого места оно просто передвинулось бы на место левее. А вот самое маленькое число в конце просмотра обязательно окажется на последнем месте.

Повторим все сначала. Первое число сравниваем со вторым:

10

5

6

2

Второе не больше первого, поэтому их менять местами не будем, а просто переходим к следующему числу:

10

5

6

2

Сравниваем его со следующим; следующее больше предыдущего — значит, меняем их местами:

10

6

5

2

Переходим к следующему:

10

6

5

2

Сравниваем со следующим — менять не надо. Просмотр опять закончен, так как мы достигли предпоследнего числа. В результате второго просмотра второе по меньшинству число встало свое место — предпоследнее.

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

Четвертого прохода не требуется, так как если три числа встали на свое место, то четвертое окажется на своем месте автоматически.

Подведем итог: Если имеем массив из N элементов, то надо сделать N-1 проход по массиву от l-го до предпоследнего N-1– го элемента. При каждом проходе надо текущий i-й элемент сравнивать со следующим (i + l)-м элементом, и если текущий элемент меньше следующего, необходимо менять их местами. Наверное, вы поняли, почему метод носит название "пузырька" —наименьший элемент как бы "всплывает" на свое последнее место.

Private Sub CmdБуль_Click()

Form1.Caption = " Сортування "

Form1.Caption = Form1.Caption + " Бульбашка"

For i = 1 To 10

For j = i + 1 To 10

If A(i) < A(j) Then

Call Exchange(i, j)

End If

Next j

Next i

Call Print_Mas

End Sub

Private Sub Exchange(k As Integer, p As Integer)

Dim Вох As Integer

Вох = A(k)

A(k) = A(p)

A(p) = Вох

End Sub

5.3. Проанализируйте описанный "Улучшенный метод пузырька". Добавьте приведенный программный код в проект.

Рис. 10.9 Схема алгоритма "Улучшенного метода пузырька".

Рассмотрим суть метода на примере. Пусть надо расставить по убыванию четыре числа

2

10

5

6

Будем просматривать числа слева направо, очередное число будем сравнивать со следующим справа: если следующее число больше очередного, то поменяем их местами. Ниже для наглядности "очередное" число заключено в рамку.

Установили H=0

1-й просмотр. Начинаем с самого левого числа:

2

10

5

6

Следующее число больше, значит, меняем их местами:

10

2

5

6

Установили H=1 (перемещения были)

Переходим ко второму по счету числу:

10

2

5

6

Сравниваем его со следующим, оно больше, значит, меняем их местами:

10

5

2

6

Установили H=1

Переходим к следующему, третьему, числу:

10

5

2

6

Сравниваем его со следующим, четвертым. Следующее больше, значит, меняем их местами:

10

5

6

2

Установили H=1

На предпоследнем числе надо остановиться, так как если перейдем на последнее число, то его не с чем будет сравнивать — справа чисел нет.

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

Проверяем значение H. Оно равно 1, перемещения были и поэтому повторим все сначала.

Установили H=0

2-й просмотр. Первое число сравниваем со вторым:

10

5

6

2

Второе не больше первого, поэтому их менять местами не будем, а просто переходим к следующему числу:

10

5

6

2

Сравниваем его со следующим; следующее больше предыдущего — значит, меняем их местами:

10

6

5

2

Установили H=1

Переходим к следующему:

10

6

5

2

Сравниваем со следующим — менять не надо. Просмотр опять закончен, так как мы достигли предпоследнего числа. В результате второго просмотра второе по меньшинству число встало свое место — предпоследнее.

Проверяем значение H. Оно равно 1, перемещения были и поэтому установили H=0

3-й просмотр. При третьем просмотре перемещений нет, т.к. все числа уже на своих местах. Проверяем значение H. Оно равно 0, и поэтому вычисления завершены.

Подведем итог: Если массив имеет “немного” неупорядоченностей, то по сравнению с методом "пузырька" уменьшается число просмотров — как только массив упорядочен, вычисления прекращаются, и холостых просмотров не будет.

Private Sub CmdПол_Буль_Click()

Form1.Caption = " Сортування "

Form1.Caption = Form1.Caption + " Бульбашка поліпшена "

Do

H = 0

For i = 1 To 9

If A(i) < A(i + 1) Then

Call Exchange(i, j)

H = 1

End If

Next i

Loop While H <> 0

Call Print_Mas

End Sub

5.4. Проанализируйте описанный "Метод выбора". Добавьте приведенный программный код в проект.

Рис. 10.10 Схема алгоритма “Метода выбора".

Суть метода состоит в следующем. Пусть надо по-прежнему отсортировать по убыванию массив из 10 элементов. Это можно выполнять за несколько шагов.

1-й шаг. Выполнить просмотр массива с l-го элемента по 10-й, найти наименьший элемент и поменять его местами с 10-м:

6

4

2

7

0

8

1

5

3

9

6

4

2

7

9

8

1

5

3

0

2-й шаг. Выполнить просмотр массива со 1-го элемента по 9-й (без 10-гo), найти наименьший элемент и поменять его местами с 9-м элементом массива:

6

4

2

7

9

8

1

5

3

0

6

4

2

7

9

4

3

5

1

0

3-й шаг. Выполнить просмотр массива со 1-го элемента по 8-й (без 9-гo), найти наименьший элемент и поменять его местами с 8-м элементом массива

6

4

2

7

9

4

3

5

1

0

6

4

5

7

9

4

3

2

1

0

и т.д.

Подведем итог. Должно быть выполнено 9(10-1) просмотров массива; j-й просмотр начинается с j-го элемента массива. Каждый просмотр состоит из двух действий:

  1. найти наименьший элемент среди элементов с номерами j=1, 2,…,i;

  2. поменять местами наибольший элемент с i-м.

Действиe 2 целесообразно оформить в виде отдельной процедуры.

Private Sub CmdВиб_Click()

Print 'Собственно сортировка

For i = 10 To 1 Step -1

Amax = A(i)

For j = 1 To i

If A(j) <= Amax Then

Amax = A(j)

imax = j

End If

Next j

Call Exchange(i, imax)

Next i

Call Print_Mas

End Sub

6. Проверьте правильность работы проекта.

  1. Сохраните проект под именем Лр10_Зад11_Фамилия