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

Волченков Проектирование Wиндоwс-Приложений на языке Висуал Басиц 2010

.pdf
Скачиваний:
73
Добавлен:
16.08.2013
Размер:
2.11 Mб
Скачать

Задание 5.3. Создать и отладить проект Windows приложения «Рисование шахматной доски».

Рассмотрим создание приложения «Шахматная доска». Щелчок единственной командной кнопки на форме после запус-

ка приложения (рис. 5.9, а) должен приводить к «исчезновению» этой кнопки и появлению на форме новых меток (объектов Label) – 64-х клеток «шахматной доски» (рис. 5.9, б).

а

Рис. 5.9. Форма приложения после старта (а) и после щелчка кнопки (б)

Код приложения (код 5.6) содержит объявления динамического массива меток cell(,), всех необходимых констант и переменных, а также процедуру для щелчка единственной кнопки на форме.

Код 5.6

Public Class Form1

Dim cell(,) As Label Const n As Integer = 8

Const w As Integer = 25 : Const h As Integer = 25 Const p As Integer = 10

Dim i, j As Short Dim c1, c2 As Color Dim bc As String

Private Sub B_Click(ByVal _

sender As System.Object, _

ByVal e As System.EventArgs) _

71

Handles B.Click Me.Width = 2 * p + w * n + 8

Me.Height = 2 * p + h * n + 32

c1 = Color.FromArgb(255, 255, 255, 192) _ ' светло-жёлтый цвет.

c2 = Color.FromArgb(255, 128, 64, 0) _

' тёмно-коричневый цвет. Button1.Visible = False

ReDim cell(n - 1, n - 1) For j = 0 To n - 1

For i = 0 To n - 1 cell(i, j) = New Label

cell(i, j).Width = w : cell(i, j).Height = h cell(i, j).Left = p + i * w

cell(i, j).Top = p + j * h

cell(i, j).BorderStyle = BorderStyle.Fixed3D If (i + j) Mod 2 = 0 Then

cell(i, j).BackColor = c1 cell(i, j).ForeColor = c2

Else

cell(i, j).BackColor = c2 cell(i, j).ForeColor = c1

End If Me.Controls.Add(cell(i, j))

Next

Next End Sub End Class

Варианты задания 5.3. Оба варианта задания должны использовать форму приложения «Шахматная доска» (см. рис. 5.9) произвольного размера с единственной командной кнопкой, имеющей имя B, а также код процедуры B_Click для щелчка этой кнопки (код 5.6). Этот код должен быть дополнен операторами для нумерации клеток шахматной доски.

Вариант 1. Клетки пронумеровать так, как показано на рис. 5.10, а.

Вариант 2. На клетки нанести обозначения, принятые у шахматистов, как показано на рис. 5.10, б.

Указания (к обоим вариантам).

1. В теле внутреннего цикла необходимо установить значение свойства cell(i, j).Text очередной метки – клетки «шахмат-

72

ной доски». При этом цвет символов на клетках должен быть следующим: тёмные символы на светлом фоне и светлые символы на тёмном фоне (например, жёлтые символы на коричневом фоне и коричневые символы на жёлтом фоне).

а б

Рис. 5.10. Форма с «шахматной доской» для 1-го (а) и для 2-го (б) вариантов

2. Необходимо ввести две новые переменные: k – для «сквозной» нумерации клеток; bc – для нумерации, принятой у шахматистов. Значение каждой из этих двух переменных на каждом шаге цикла должно вычисляться в соответствии с кодом 5.7.

Код 5.7

k = i + j * n + 1

Select

Case i

 

Case

0

: bc = "a" & 8 - j

Case

1

: bc = "b" & 8 - j

Case

2

: bc = "c" & 8 - j

Case

3

: bc = "d" & 8 - j

Case

4

: bc = "e" & 8 - j

Case

5

: bc = "f" & 8

- j

Case

6

: bc = "g" & 8

- j

Case

7

: bc = "h" & 8

- j

 

 

 

73

End Select

'

Вариант

1.

cell(i,

j).Text = k

cell(i,

j).Text = bc

'

Вариант

2.

Отчет о работе

Отчет заключается в демонстрации студентом на терминале работы трёх самостоятельно отлаженных проектов: «Калькулятор», «Калькулятор с единственной кнопкой» и «Шахматная доска». Проекты должны давать ожидаемые результаты при работе в режиме отладчика.

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

74

Работа № 6

Использование программных массивов для обработки большого числа однотипных данных

(на примере одномерного и двумерного массивов)

Цель работы: изучение и использование понятия программного массива как обобщения понятия переменной при программирова-

нии процедур на языке Visual Basic .NET (2005, 2009), создание проектов, в программных модулях которых целесообразно использовать одномерные и многомерные программные массивы.

Подготовка к работе

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

1.Как объявляется одномерный массив? Что такое индекс массива и диапазон изменения индекса?

2.Как можно находить максимальный (или минимальный) элемент массива чисел? Значение индекса максимального (или минимального) элемента?

3.В чем заключается идея «пузырьковой» сортировки одномерного массива чисел?

4.Приведите примеры алгоритмов сортировки одномерного массива более эффективных, чем алгоритм «пузырьковой» сортировки.

5.В чем заключается идея двумерного (дихотомического) поиска элемента в отсортированном массиве? Как зависит число шагов двумерного поиска от длины массива?

6.Как с помощью двумерного массива можно хранить и обрабатывать матрицу значений функции двух переменных f(x, y)?

7.Как можно использовать понятие динамического массива для загрузки в двумерный массив значений цвета «точек» произвольного изображения?

75

8. Какой объект следует объявить и использовать при обработке изображения с целью дальнейшего сохранения этого изображения в файле графического формата?

Задания

В ходе выполнения данной работы студенту необходимо выполнить три задания (по вариантам).

6.1.Создать и отладить проект Windows приложения «Сортировка массива».

6.2.Создать и отладить проект Windows приложения «Быстрый поиск в отсортированном массиве методом дихотомии».

6.3.Создать и отладить проект Windows приложения «Обработка изображения как двумерного массива пикселей».

Проекты создаются в системе проектирования Visual Studio 2005 на языке Visual Basic 2005. Для каждого из проектов скомпилировать исполняемый файл приложения.

Пример выполнения работы

Задание 1. Создать и отладить проект Windows приложения «Сортировка массива».

Рассмотрим приложение, демонстрирующее «пузырьковую» сортировку одномерного массива элементов, которыми являются даты рождения. Для определенности будем считать, что даты в этом массиве находятся в диапазоне от 1 января 1971 г. до 31 декабря 1980 г. (в интервале, равном 10 годам).

На рис 6.1 показано окно приложения, на котором два поля спи-

ска и три команды меню: Генерация списка дат, Сортировка, Выход.

Щелчок 1-й команды вызывает заполнение 1-го поля случайными датами, а щелчок 2-й команды – заполнение 2-го поля этими датами, отсортированными по возрастанию.

Число n задаётся пользователем с помощью окна ввода, которое появляется после щелчка 1-й команды.

76

Рис. 6.1. Результат генерации заданного числа дат (здесь n = 5000) и «пузырьковой» сортировки массива этих дат

Даты создаются случайно с помощью рандомизации – оператора Randomize и функции Rnd. Идея генерации списка дат заключается в следующем. Сначала с помощью функции DateDiff необходимо определить, сколько дней в указанном интервале:

Y = DateDiff("Y", CDate(d1), CDate(d2)) + 1

'Y = 3653 – число дней в интервале

'с 1.1.1971 г. по 31.12.1980 г.

Затем в цикле от i = 0 до n – 1, с помощью функции DateAdd необходимо создать n элементов массива – случайных дат:

d(i) = DateAdd("Y", Y * Rnd(), CDate(d1))

Программный код класса данной формы следующий:

Код 6.1

Public Class Form1

Const d1 As String = "1.1.71"

Const d2 As String = "31.12.80"

Dim Y, i, j, n As Integer

Dim d0, d() As Date

Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load

ListBox1.Items.Clear()

77

ListBox2.Items.Clear()

Y = DateDiff("Y", CDate(d1), CDate(d2)) + 1

Randomize()

End Sub

Private Sub ГенерацияСпискаДат_Click(ByVal sender _ As System.Object, _

ByVal e As System.EventArgs) _ Handles ГенерацияСпискаДат.Click

ListBox1.Items.Clear() : ListBox2.Items.Clear() n = CInt(InputBox("Введите число дат", _

"Ввод длины массива", 5000))

ReDim d(n - 1) For i = 0 To n - 1

ListBox1.Items.Add(DateAdd("Y", Y * Rnd(), _ CDate(d1)))

d(i) = CDate(ListBox1.Items.Item(i))

Next End Sub

Private Sub Сортировка_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) _

Handles Сортировка.Click For i = 0 To n - 2

For j = i To n - 1

If d(j) < d(i) Then

d0 = d(i) : d(i) = d(j) : d(j) = d0 End If

Next

Next

For i = 0 To n - 1 ListBox2.Items.Add(d(i))

Next End Sub End Class

Замечание. Результат сравнения двух дат, которое происходит во внутреннем цикле процедуры сортировки методом «пузырька», отличается от результата лексикографического сравнения строк, представляющих эти даты. Для сортировки строк (например, имён или фамилий), которые помещаются в поле списка, нет необходимости применять тот или иной метод сортировки – достаточно установить значение свойства Sorted этого поля равным True (Истина).

78

Варианты задания 6.1. В обоих вариантах задания 6.1 использовать форму, представленную в примере выполнения задания 6.1. Необходимо лишь заменить рассмотренную в этом примере процедуру сортировки методом «пузырька» другой процедурой, в которой используется иной метод сортировки – в соответствии с вариантом.

Вариант 1. Использовать метод сортировки с помощью поиска в массиве максимального (или минимального) элемента.

Вариант 2. Использовать метод сортировки с помощью вставки «головы» списка (первого элемента) в отсортированный «хвост» этого списка. (Процедура для данного метода является рекурсивной.)

Задание 6.2. Создать и отладить проект Windows приложения «Быстрый поиск в отсортированном массиве методом дихотомии».

Рассмотрим приложение «Быстрый поиск в отсортированном массиве», которое демонстрирует метод, известный как «дихотомия» – последовательное разбиение массива на две равные части и сравнение элемента, находящегося в точке разбиения, с искомым элементом.

1. Рассмотрим сначала массив «русских фамилий» строкового типа. Форма работающего приложения показана на рис. 6.2.

Рис. 6.2. Экран приложения «Быстрый поиск в одномерном массиве» с результатом: значением порядкового номера (индекса) фамилии «Васильев» и протоколом поиска

79

На форме одно текстовое поле. В него пользователь вводит фамилию, для которой он хочет найти значение её порядкового номера (индекса). Это так называемый «поисковый запрос».

На форме есть также два фрейма: в левом – исходный список фамилий; в правом – два списка с результатами поиска. В первом из них формируется главный результат поиска – значение индекса данной фамилии в отсортированном массиве фамилий. Во втором фиксируются все шаги поиска. Список этих шагов образуют так называемый «протокол» процесса поиска.

Есть на форме ещё один, невидимый вспомогательный список с именем РусскиеФамилии, содержащий 100 распространённых русских фамилий. Этот список необходим для генерации массива фамилий произвольной длины. Можно взять за основу, например, следующий список:

1.

Абрамов

26.

Демин

51.

Михеев

76.

Сидоров

2.

Александров

27.

Дмитриев

52.

Мишин

77.

Сидоров

3.

Алексеев

28.

Евграфов

53.

Никодимов

78.

Сонин

4.

Алексеев

29.

Евстигнеев

54.

Николаев

79.

Степанов

5.

Алехин

30.

Егоров

55.

Николаев

80.

Терентьев

6.

Алешин

31.

Зиновьев

56.

Никонов

81.

Тимофеев

7.

Антонов

32.

Иванов

57.

Олегов

82.

Титов

8.

Афанасьев

33.

Иванов

58.

Онуфриев

83.

Тихонов

9.

Борин

34.

Иванов

59.

Павлов

84.

Томин

10.

Борисов

35.

Иванов

60.

Павлов

85.

Трофимов

11.

Валентинов

36.

Иванов

61.

Панин

86.

Ульянов

12.

Ванин

37.

Ильин

62.

Панин

87.

Фадеев

13.

Варфоломеев

38.

Ильин

63.

Пантелеев

88.

Федоров

14.

Васильев

39.

Клементьев

64.

Петров

89.

Федоров

15.

Васильев

40.

Климов

65.

Петров

90.

Филимонов

16.

Вениаминов

41.

Константинов

66.

Петров

91.

Филиппов

17.

Викторов

42.

Костин

67.

Петров

92.

Фомин

18.

Владимиров

43.

Лавров

68.

Пронин

93.

Фомин

19.

Володин

44.

Лазарев

69.

Пронин

94.

Харитонов

20.

Ганин

45.

Леонтьев

70.

Прошин

95.

Харламов

21.

Глебов

46.

Манин

71.

Родионов

96.

Юрьев

22.

Григорьев

47.

Маринин

72.

Романов

97.

Юрьин

23.

Гришин

48.

Марьин

73.

Ромин

98.

Яковлев

24.

Давыдов

49.

Михайлов

74.

Семин

99.

Яковлев

25.

Данилов

50.

Михайлов

75.

Сергеев

100.

Яшин

Некоторые фамилии в этом списке повторяются, чтобы при рандомизации они встречались чаще (например, фамилия «Иванов»).

80