Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Часть III. Программирование на Visual Basic - второй уровень

Поиск

Если вам кажется, что вы уже все можете, то вы правы и неправы. Правы потому, что вы можете написать сколь угодно большую программу, разбив ее на разумное число процедур. Неправы потому, что ваша способность манипулировать данными разных типов еще очень ограничена. А без нее вам не поддадутся «умные» задачи. Например, не познакомившись с так называемыми массивами, вы не сможете запрограммировать игру в крестики-нолики или морской бой. Не освоив работу со строками, вы не сможете решить задачу о мало-мальски серьезной шифровке и расшифровке секретных сообщений. Не умея работать с файлами, вы не сможете сохраняться в созданных вами играх. Вам нужно освоить начала объектного программирования, познакомиться с базами данных, с работой в Интернете и с другими вещами.

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

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

 

 

Глава 13. Массивы

Массивы- одно из главных средств хранения в памяти компьютера больших объемов информации.

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

В основе массивов лежит понятие индекса.

Переменные с индексами

В математике широко применяются так называемые индексированные переменные. На бумаге они записываются так:

x1 x2 b8 yi yi-6 zij zi+1j

а читаются так: икс первое, икс второе, бэ восьмое, игрек итое, игрек и минус шестое, зет итое житое, зет и плюс первое житое. Все эти маленькие подстрочные цифры и выражения называются индексами. Поскольку в алфавите Visual Basic нет подстрочных букв и цифр, то те же индексированные переменные в Visual Basic приходится обозначать так:

X(1) X(2) B(8) Y(i) Y(i-6) Z(i,j) Z(i+1,j)

Зачем математикам нужны индексированные переменные? Их удобно применять хотя бы при операциях над числовыми рядами. Числовой ряд – это просто несколько чисел, выстроенных по порядку одно за другим. Чисел в ряду может быть много и даже бесконечно много.

Возьмем, например, бесконечный ряд чисел Фибоначчи: 1 1 2 3 5 8 13 21 34..... Попробуйте догадаться, по какому закону образуются эти числа. Если вы сами не догадались, то я подскажу: каждое из чисел, начиная с третьего, является суммой двух предыдущих. А теперь попробуем записать это утверждение с помощью языка математики. Для этого обозначим каждое из чисел Фибоначчи индексированной переменной таким образом:

Первое число Фибоначчи обозначим так: f(1),

Второе число Фибоначчи обозначим так: f(2) и т.д.

 

Тогда можно записать, что f(1)=1 f(2)=1 f(3)=2 f(4)=3 f(5)=5 f(6)=8......

Очевидно, что f(3)=f(1)+f(2),

f(4)=f(2)+f(3),

f(5)=f(3)+f(4) и т.д.

Как математически одной формулой записать тот факт, что каждое из чисел является суммой двух предыдущих? Математики в индексном виде записывают это так:

f(i)=f(i-2)+f(i-1).

Для пояснения подставим вместо i любое число, например, 6. Тогда получится:

f(6)=f(6-2)+f(6-1) или

f(6)=f(4)+f(5), что соответствует определению чисел Фибоначчи.

 

Задание 115: Запишите в индексном виде, как получается из предыдущего числа ряда последующее:

1) 14 18 22 26.....

2) 6 12 24 48....

3) 3 5 9 17 33 65....

 

Вот еще примеры, когда математики предпочитают использовать индексы. Пусть мы на протяжении года каждый день раз в сутки измеряли температуру за окном. Тогда вполне естественно обозначить через t(1) температуру первого дня года, t(2) - второго,....., t(365) - последнего. Пусть 35 спортсменов прыгали в высоту. Тогда через h(1) можно обозначить высоту, взятую первым прыгуном, h(2) - вторым и т.д.

Одномерные массивы переменных величин

Одна из типичных задач программирования формулируется примерно так. Имеется большое количество данных, например, тех же температур или высот. С этими данными компьютер должен что-нибудь сделать, например, вычислить среднегодовую температуру, количество морозных дней, максимальную взятую высоту и т.п. Раньше мы уже вычисляли подобные вещи, и при этом данные вводили в компьютер с клавиатуры одно за другим в одну и ту же ячейку памяти (см. Глава 8). Однако, программистская практика показывает, что удобно, а часто и необходимо иметь данные в оперативной памяти сразу все, а не по очереди. Тогда для задачи про температуру нам понадобится 365 ячеек. Эти 365 ячеек мы и назовем массивом. Итак, массивом можно назвать ряд ячеек памяти, отведенных для хранения значений индексированной переменной. Вопрос о том, как большое количество значений оказывается в памяти, отложим на будущее (16.2).

Знаете, что напоминает одномерный массив? Список ListBox, который мы проходили в 15.5. Такой же аккуратный ряд пронумерованных элементов.

 

Рассмотрим на простом примере, как Visual Basic управляется с массивами. Предположим, в зоопарке живут три удава. Известна длина каждого удава в сантиметрах (500, 400 и 600). Какая длина получится у трех удавов, вытянутых в линию?

Обозначим длину первого удава - dlina(1), второго - dlina(2), третьего - dlina(3). Прикажем Visual Basic отвести под эту индексированную переменную массив ячеек в памяти:

Dim dlina (1 To 3) As Integer

Здесь 1 - нижняя граница индекса, 3 - верхняя граница индекса. Слово To обозначает до. В целом эту строку можно перевести так: Отвести в памяти под переменную dlina ряд ячеек типа Integer, пронумерованных от 1 до 3.

Вот программа полностью:

Dim dlina(1 To 3) As Integer

Dim summa As Integer

Private Sub Command1_Click()

dlina(1) = 500

dlina(2) = 400

dlina(3) = 600

'В этот момент в трех ячейках памяти уже находятся числа

'и с ними можно выполнять арифметические действия

summa = dlina(1) + dlina(2) + dlina(3)

Debug.Print summa

End Sub

Если смысл написанного выше вам неясен, запустите отладочный пошаговый режим выполнения программы и загляните в текущие значения dlina(1), dlina(2), dlina(3), summa.

Теперь запишем ту же программу в предположении, что длины удавов заранее неизвестны и мы их вводим при помощи InputBox:

Dim dlina(1 To 3) As Integer

Private Sub Command1_Click()

dlina(1) = InputBox("Введите длину 1-го удава")

dlina(2) = InputBox("Введите длину 2-го удава")

dlina(3) = InputBox("Введите длину 3-го удава")

Debug.Print dlina(1) + dlina(2) + dlina(3)

End Sub

 

Вопрос: Что напечатает следующий фрагмент:

i = 2: a(3) = 10: a(i) = 100: a(i + 6) = a(i) + a(5 - i): i = 0: Debug.Print a(i + 3) + a(2) + a(i + 8)

Ответ: 220

Пояснение: i = 2; a(3) = 10; a(2) = 100; a(2 + 6) = a(2) + a(5 - 2); i = 0; Debug.Print a(0 + 3) + a(2) + a(0 + 8)

 

 

Теперь решим ту же задачу про удавов в предположении, что удавов не три, а тысяча:

Dim dlina(1 To 1000) As Integer

Dim summa As Integer

Private Sub Command1_Click()

'Вводим длины тысячи удавов, хоть это и утомительно и никто так не делает:

For i = 1 To 1000

dlina(i) = InputBox("Введите длину " & i & "-го удава")

Next

'Здесь на первом выполнении цикла i=1 и поэтому компьютер вводит число в ячейку dlina(1),

'на втором - i=2 и поэтому компьютер вводит число в ячейку dlina(2) и т.д.

'Определяем суммарную длину тысячи удавов:

summa = 0

For i = 1 To 1000

summa = summa + dlina(i)

Next

Debug.Print summa

End Sub

Отлаживая эту программу, возьмите, конечно, вместо числа 1000 число 3.

 

 

Решим еще одну задачу. Дан ряд из 10 произвольных чисел: a(1), a(2),..., a(10). Подсчитать и напечатать суммы восьми троек стоящих рядом чисел: a(1)+a(2)+a(3), a(2)+a(3)+a(4), a(3)+a(4)+a(5),......, a(8)+a(9)+a(10).

Dim a(1 To 10) As Integer

Private Sub Command1_Click()

a(1) = 23: a(2) = 28: a(3) = 4: a(4) = 0: a(5) = 12

a(6) = 10: a(7) = 23: a(8) = 2: a(9) = 9: a(10) = 1

For i = 1 To 8

Debug.Print a(i) + a(i + 1) + a(i + 2)

Next

End Sub

 

Задание 116:. Напишите с использованием массива программу вычисления среднегодовой температуры (Для отладки в компьютере годом можно считать неделю).

Задание 117:. Подсчитайте количество теплых дней в году (когда температура выше 20 град.).

Задание 118:. Каким по порядку идет самый жаркий день?

Задание 119:. Вычислить и распечатать первые 70 чисел Фибоначчи.

Двумерные массивы

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

  1-й день 2-й день 3-й день 4-й день
Метеостанция 1 -8 -14 -19 -18
Метеостанция 2        
Метеостанция 3        

Требуется (в порядке возрастания трудности):

1) Распечатать температуру на 2-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день.

2) Распечатать показания термометров всех метеостанций за 2-й день

3) Определить среднюю температуру на третьей метеостанции

4) Распечатать всю таблицу

5) Распечатать, в какие дни и на каких метеостанциях температура была в диапазоне 24-26 градусов тепла

Для этого обозначим показания термометров индексированной переменной с двумя индексами по следующей схеме:

t(1,1) t(1,2) t(1,3) t(1,4)
t(2,1) t(2,2) t(2,3) t(2,4)
t(3,1) t(3,2) t(3,3) t(3,4)

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

В памяти отводим массив из 3*4=12 ячеек под значения типа Integer индексированной переменной t. Будем называть его двумерным массивом:

Dim t (1 To 3, 1 To 4) As Integer

Программа:

Dim t(1 To 3, 1 To 4) As Integer

Private Sub Command1_Click()

'Зададим значения элементов массива примитивным присваиванием:

t(1, 1) = -8: t(1, 2) = -14: t(1, 3) = -19: t(1, 4) = -18

t(2, 1) = 25: t(2, 2) = 28: t(2, 3) = 26: t(2, 4) = 20

t(3, 1) = 11: t(3, 2) = 18: t(3, 3) = 20: t(3, 4) = 25

 

'Выполняем 1 пункт задания:

Debug.Print t(2, 4), t(3, 1)

 

'А теперь распечатаем второй столбец массива (2 пункт задания):

For i = 1 To 3: Debug.Print t(i, 2): Next

 

'Определим среднее значение элементов третьей строки (3 пункт задания):

i = 3

s = 0

For j = 1 To 4: s = s + t(i, j): Next

Debug.Print s / 4

 

'Распечатаем всю таблицу (4 пункт задания):

For i = 1 To 3

For j = 1 To 4

Debug.Print t(i, j),

Next j

Debug.Print

Next i

 

'Распечатаем станции и дни с температурой 24-26 градусов (5 пункт задания):

For i = 1 To 3

For j = 1 To 4

If t(i, j) >= 24 And t(i, j) <= 26 Then Debug.Print "Станция"; i; "день"; j

Next j

Next i

End Sub

 

Задание 120: Вычислить разницу между максимальной и минимальной температурой во всей таблице.

Какие бывают массивы

Массивы бывают не только числовые, но и строковые и типа Date и прочие. Подходит любой известный нам тип. Например:

Dim s(1 To 50) As String

Это означает, что в каждой из 50 ячеек должно находиться не число, а произвольная строка. Вот элементарный пример использования строкового массива:

Dim s(1 To 50) As String

Private Sub Command1_Click()

s(21) = "Привет": Debug.Print s(21)

End Sub

Вот пример работы с массивами других типов:

Dim b(1 To 30, 1 To 6) As Boolean

Dim DT(1 To 10) As Date

Private Sub Command1_Click()

b(2, 3) = False: Debug.Print b(2, 3)

DT(2) = #1/15/2156 11:59:42 PM#: Debug.Print DT(2)

End Sub

Еще пример:

Private Enum типРуль

вверх

влево

вниз

вправо

End Enum

Dim Руль(1 To 300) As типРуль

Private Sub Command1_Click()

Руль(200) = вправо: Debug.Print Руль(200)

Руль(220) = влево: Debug.Print Руль(220)

End Sub

Здесь будут напечатаны числа 3 и 1, так как элементы перечислимого типа пронумерованы по порядку от 0.

 

Границы индексов в круглых скобках тоже могут быть разными, например:

Dim a(20 To 60) As Integer

Здесь под числа отводится 41 ячейка. Еще пример:

Dim b(0 To 9, -20 To 30) As Integer

Здесь под числа отводится 10*51=510 ячеек.

Раз вы объявили границы индексов, то должны их придерживаться. Так, неправильно было бы теперь написать a(15) = 0.

 

Если нижняя граница индекса вашего массива равна нулю, то вы можете сэкономить усилия и вместо

Dim f (0 To 9) As Integer

писать

Dim f (9) As Integer

так как Visual Basic по умолчанию считает нижней границей индекса всех массивов число 0. Если же вам хочется, чтобы эта льгота касалась массивов с нижней границей равной не 0, а 1, то наверху программы напишите

Option base1

 

Массивы могут быть одномерные, двумерные, трехмерные, четырехмерные и т.д.:

Dim a (1 To 10) As Integer -одномерный массив 10 ячеек
Dim a (1 To 10, 1 To 5) As Integer -двумерный массив 50 ячеек
Dim a (1 To 10, 1 To 5, 1 To 2) As Integer -трехмерный массив 100 ячеек
Dim a (1 To 10, 1 To 5, 1 To 2, 1 To 3) As Integer -четырехмерный массив 300 ячеек


Поделиться:


Последнее изменение этой страницы: 2016-08-12; просмотров: 369; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.15.91 (0.013 с.)