Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Часть 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-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день. 2) Распечатать показания термометров всех метеостанций за 2-й день 3) Определить среднюю температуру на третьей метеостанции 4) Распечатать всю таблицу 5) Распечатать, в какие дни и на каких метеостанциях температура была в диапазоне 24-26 градусов тепла Для этого обозначим показания термометров индексированной переменной с двумя индексами по следующей схеме:
Обратите внимание, что первый индекс в скобках обозначает номер строки (метеостанции), второй - номер столбца (дня) прямоугольной таблицы. Такую таблицу математики называют матрицей. В памяти отводим массив из 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
Массивы могут быть одномерные, двумерные, трехмерные, четырехмерные и т.д.:
|
||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-08-12; просмотров: 369; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.15.91 (0.013 с.) |