Visual Basic с нуля. Глава 10. Массивы. Их границы. Сортировка. Vba массивы примеры работы с массивами


Данные массива. VBA для чайников

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

При работе с массивами нужно помнить следующее.

* Можно создавать массивы данных любых типов. VBA с успехом хранит в массивах строки, даты, денежные значения и данные любых числовых типов.

* В одном массиве могут храниться данные только одного типа. Нельзя создать массив с раздельными ячейками для хранения и данных типа Date и данных типа String.

Правда, второе ограничение очень легко преодолеть. Как вы уже знаете, тип данных Variant допускает хранение данных любого из допустимых в VBA типов, и массивы данных типа Variant тоже вполне допустимы. Здесь следует иметь в виду, что информация, хранимая в виде данных типа Variant, занимает существенно больше места в памяти, чем та же информация в виде данных более определенного типа; для массивов произвольной длины это может потребовать дополнительно очень значительного расхода памяти. Но необходимость поместить в один массив неопределенной длины набор данных различных типов возникает крайне редко.

С другой стороны, довольно часто необходимо работать с наборами родственных в некотором смысле элементов разного типа. Именно такие наборы составляют структуру типичной базы данных. В базе данных для хранения адресов, например, каждая запись представляет собой некоторый набор элементов информации (имя и адрес), относящихся к одному объекту (человеку). Для подобных данных как раз и предлагается создавать пользовательские типы данных- как это сделать, вы узнаете чуть позже, в разделе "Определение своих собственных типов данных").

Поделитесь на страничке

Следующая глава >

it.wikireading.ru

Visual Basic с нуля. Глава 10. Массивы. Их границы. Сортировка.

Массивы.

Массивы, друзья мои, очень простая и крайне необходимая штука. Простой пример: ты считал из директории 50 имен файлов и тебе необходимо как-то поместить их в памяти, что-бы потом с ними работать. Без использования массива, ты должен объявить пятьдесят переменных и в каждую записать имя файла. Это безумие. Но еще большее безумие потом работать с этими переменными, пытаясь найти в них нужные нужные тебе данные. Иное дело массив. Имея его (в хорошем смысле), можно под одним именем запомнить все твои пятьдесят имен файлов и перебирать их сколько угодно, в любом цикле, меняя лишь индекс члена массива. Т.е., другими словами,

Массив - это сколько угодно значений, объединенных одним именем.

Массив, прежде чем использовать, надо объявить. Объявляется он совершенно также как и переменная. Если ты объявишь его локально в процедуре (здесь можно использовать ключевое слово Static), то он будет доступен только в этой процедуре и нигде больше, если в разделе (General)-(Daclarations) формы (c оператором Dim) - то во всей форме, а если тебе нужно объявить его глобально, так, чтобы он был доступен всему проекту, то в стандартном модуле с ключевым словом Public. Кроме того , массивы бывают статическими и динамическими.

Статические массивы.

Статический массив - это когда ты заранее знаешь, сколько переменных туда нужно будет записать, т.е. если ты объявил массив на 10 членов, то уж туда никак не запихнешь одиннадцать. В форме он объявляется так:

Dim Chislo(9) As Long

Что здесь важно.Dim - оператор, который точно также, как и при объявлении переменной, объявляет массив и выделяет для нее память.Chislo - ну это просто имя, придумывается также как и для переменной и отвечает тем же требованиям.(9) - количество элементов в массиве - их 10. Почему так. Дело в том, что элементы массива нумеруются с нуля, а не с единицы, поэтому у нас десять элементов массива c номерами 0, 1, 2, 3, 4, 5, 6, 7, 8 и 9. Если для каких-то целей такой порядок тебя не устраивает, то используется оператор Option Base 1, который прописывается в разделе Declarations и привязывает первый элемент ВСЕХ, повторяю ВСЕХ, массивов в программе к единице.As Long - определение типа данных массива так же как тип обычной переменной. Почти всегда все элементы массива имеют один и тот же тип ( в данном случае длинное число Long). На крайняк, если это не так, или если ты не знаешь какого типа будут данные, можно задать тип Variant, но это нежелательно из-за того, что это занимает значительный объем памяти, особенно если массив большой.Размерность - ее так сразу не заметно, но она здесь присутствует и равна единице, потому, что у на одна циферка (девятка), т.е. наш массив является одномерным - по сути список значений. Теперь создадим массив для хранения результатов, ну скажем таблицы умножения на 8. Поскольку на ноль умножать бесперспективно, привязываем первый элемент массива к единице и объявляем переменную x для организации цикла For...Next.

Option Explicit Option Base 1Dim Chislo(10) As Long 'так как мы используем оператор Option Base, то элементы массива нумеруются с единицы Dim x As Long

Положим на форму Text1 с установленными свойствами .MultiLine в True, а .ScrollBars - в 2-Вертикаль, а также кнопку Command1. В процедуре Form_Load напишем цикл, который будет присваивать каждому элементу массива значение, соответствующее его номеру, умноженному на 8.

Private Sub Form_Load() Text1.Text = ""For x = 1 To 10 Chislo(x) = x * 8Next xEnd Sub

Как видите, в цикле мы вместо номера элемента просто используем значение x, и таким образом перебираются все элементы массива. Теперь мы выведем значения элементов массива в Text1 в процедуре Command1.

Private Sub Command1_Click()For x = 1 To 10 Text1.Text = Text1.Text & Chislo(x) & vbCrLfNext xEnd Sub

Таким образом наш одномерный массив представляет собой аналог таблицы с одной строчкой:

1 элемент

2 элемент

3 элемент

4 элемент

5 элемент

6 элемент

7 элемент

8 элемент

9 элемент

10 элемент

8

16

34

32

40

48

56

64

72

80

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

Option Explicit Option Base 1Dim Chislo(10, 2) As LongDim x As Long

Private Sub Form_Load() Text1.Text = ""For x = 1 To 10 Chislo(x, 1) = x Chislo(x, 2) = x * 8Next x

Private Sub Command1_Click()For x = 1 To 10 Text1.Text = Text1.Text & "8 x " & Chislo(x, 1) & " = " & Chislo(x, 2) & vbCrLfNext xEnd Sub

И наш массив будет представлять собой следующее

 

1 элемент

2 элемент

3 элемент

4 элемент

5 элемент

6 элемент

7 элемент

8 элемент

9 элемент

10 элемент

1 элемент

1

2

3

4

5

6

7

8

9

10

2 элемент

8

16

34

32

40

48

56

64

72

80

таким образом элемент массива Chislo (7,2) будет иметь значение 56.Обратите внимание, что размерность массива определяет колиство циферек в объявлении. Массив Chislo (10,5) - тоже двухмерный, только строк в табличке было-бы не две, а пять. А объявление трехмерного массива выглядело бы такDim(10,5,2).Такую трехмерную таблицу нарисовать мне затруднительно. В принципе VB поддерживает до 64 размерностей массива, но это в голове трудно укладывается. Все, как видите очень просто. Однако статические массивы используются довольно редко. Чаше мы не знаем сколько данных мы будем иметь и потом ведь хочется дописать при необходимости в массив новые данные. Для этого существуют

Динамические массивы.

Часто возникает ситуация, когда мы не знаем заранее, сколько элементов массива мы будем использовать заранее. Поэтому массив объявляется без размерности, напримерDim Mass () as String Но, перед его непосредственным использованием, его надо переобъявить c указанием размерности. Делается это с помощью оператора Redim.

Redim Mass (5) as String

Вообще-то, у нас два пути использования динамического массива. Первый путь, это года мы узнаем (просчитываем) , сколько элементов массива нам нужно, и после этого объявляем массив небходимого нам размера. Однако мне это путь не очень нравится, поскольку, нам приходится задавать два цикла: один - для просчета необходимого количества элементов, второй - для собственно присваивания массиву значений переменных. Второй путь, это когда мы в одном цикле при нахождении каждого нового данного переобъявляем массив с увеличением количества его элементов. Но этот способ загружает компьютер и может занимать много времени на обработку, особенно если создается большой массив. Происходит это из-за перераспределения элементов массива в памяти всякий раз при его переобъявлении и добавлении нового члена. Но именно такой способ мы применим при разработке программки Scanfiles, которая будет сканировать файлы в выбранной директории, сортировать их по-возрастанию и выводить в Text1. Хочу сразу заметить, что при переобъявлении массива все записанные в него данные стираются - массив обнуляется. Чтобы этого не происходило, надо использовать ключевое слово Peserve:

Redim Preserve Mass (5) as String

Идем дальше. Поместим на форму объекты Dir1 и Text1. Начнем писать код. Обратите внимание, что процедуры Form_Load у нас не будет, так как под это событие обрабатывать нам нечего. Ну-с, фигачим

Option Explicit'Установим начальную нумерацию массива с единицы, сейчас так удобнееOption Base 1 'объявим переменныеDim OurDir As String 'для директории, где будем искать файлыDim FileName As String 'для имен находимых файловDim X As Long 'просто для цикла'и, наконец, наш динамический массив, как строковыйDim Files() As StringКроме того, поскольку одни имена - это уж совсем скучно, то мы еще во вторую размерность массива выведем атрибуты файла. Атрибуты, это когда по файлу шлепаешь правой кнопкой мыши и в выпавшем меню выбираешь "Свойства". Тогда снизу окна этих свойств можно увидеть галочки рядом с загадочными словами "Только чтение", "Скрытый" и "Архивный". Именно эти свойства можно устанавливать или получать с помощью оператора SetAttr и функции GetAttr. Весь геморрой в том, что этот атрибут представляет из себя число, получаемое из суммы значений атрибутов, приведенных в таблице ниже, и чтобы понять, какой атрибут все-таки у файла, нужно "с помощью оператора And выполнить поразрядное сравнение значения". Друзья мои. Это цитату из Help5 я привел для того, чтобы можно было почувствовать разницу между "академическим" и "вольным" изложением проблемы. Короче, привожу таблицу этих атрибутов:

Константа

Значение

Описание

vbNormal

0

Обычный.
vbReadOnly

1

Только для чтения.
vbHidden

2

Скрытый.
vbSystem

4

Системный.
vbDirectory

16

Каталог или папка.
vbArchive

32

Архивный.

Из всей этой дребедни нам нужны три константы: vbArchive, vbReadOnly и vbHidden для этого самого "поразрядного сравнения". Делается это так: Чтобы узнать, только для чтения ли этот файл:Переменная = GetAttr("полный путь к файлу") And vbReadOnly Если в Переменной не ноль, то файл - только для чтения. Аналогично для других констант. Чтобы установить аттрибут, например "Архивный" для файла:SetAttr "C:\Andrey\index.htm", vbReadOnly при этом уже установленные атрибуты файла сбрасываются. Если надо установить атрибуты "только для чтения" и "архивный":SetAttr "C:\Andrey\index.htm", vbReadOnly +vbArchive Все просто, а по сути - издевательство. Про атрибуты - все. Более интересные данные о файлах мы получим, когда начнем использовать FSO. Но об этом не сегодня. Итак, для хранения атрибута (на основании "поразрядного сравнения") продолжаем объявлять переменные (еще две)

Dim Attr As Long 'числовая, для атрибута файлаDim AttributFile As String 'строковая, для записи атрибута в виде слов

Напишем маленькую процедурку для Dir1 на событие Change. Дело в том, что событие Change наступает при двойном клике, а я и хочу, чтобы директория для поиска файлов устанавливалась по двойному клику. В этой процедурке мы очистим Text1 и обнулим переменные, ну и главное, запишем в переменную OurDir полный путь к директории, после чего перейдем к другой поцедуре - ScanDir, где собственно и будем искать файлы и записывать их имена и атрибуты в наш массив Files.

Private Sub Dir1_Change() Text1.Text = "" FileName = "" X = 0 OurDir = Dir1.Path ScanDir 'переходим к процедуре сканирования файловEnd Sub

Далее в процедуре ScanDir все, с учетом комментариев, понятно:

Private Sub ScanDir() FileName = Dir(OurDir & "\*.*", 0) 'присваиваем переменной значение функции Dir для всех файловReDim Files(2, 1) 'переобъявляем массив с минимальной размерностью, иначе может возникать ошибкаDo While FileName <> "" 'запускаем цикл, до тех пор, пока Dir не вернет пустую строку X = X + 1 'счетчик элементов массиваReDim Preserve Files(2, X) 'переобъявляем массив по счетчику, сохраняя уже имеющиеся в нем данные AttributFile = "" 'обнуляем переменные Attr = 0'проверяем файл на атрибут архивный Attr = GetAttr(OurDir & "\" & FileName) And vbArchiveIf Attr > 0 Then AttributFile = AttributFile & " Архивный"'проверяем файл на атрибут только для чтения Attr = GetAttr(OurDir & "\" & FileName) And vbReadOnlyIf Attr > 0 Then AttributFile = AttributFile & " Только чтение"'проверяем файл на атрибут скрытый для порядка, Бейсик все равно не видит такие файлы Attr = GetAttr(OurDir & "\" & FileName) And vbHiddenIf Attr > 0 Then AttributFile = AttributFile & " Скрытый"

Files(1, X) = FileName 'пишем в массив имя файла Files(2, X) = AttributFile 'пишем в массив атрибут файла FileName = Dir() 'запускаем функцию Dir без атрибутовLoop 'и так в цикле, пока файлы в директории не закончатся

If X > 0 Then Sort ' если хоть один файл найден, 'отправляемся к процедуре сортировкиElse Text1.Text = "Файлов не найдено" 'в противном случае выводим сообщение.End If End Sub Основная прелесть массивов в том, что с данными, записанными в них, можно что угодно делать: сортировать, разбивать на группы, осуществлять поиск, делать выборки и т.п. Сейчас мы наш массив отсортирум по возрастанию имен файлов. Скажу сразу, что алгоритмы сортировки разработаны и существуют давно. Приводимый в примере был разработан лично мною, а возможное совпадение его с другими алгоритмами совершенно случайно. Но прежде, чем перейти к сортировке, я хочу рассказать вот о чем. Поскольку количество элементов нашего массива меняется, а для сортировки его с помощью циклов For...Next нам надо точно знать минимальный (нижняя граница) и максимальный (верхняя граница) доступные значения индекса массива, то я использую функции LBound для определения минимального индекса и UBound для определения максимального индекса указанной размерности. Синтаксис их такой

Переменная=LBound(Massive,1) 'возвращает в Переменную минимальный индекс массива Massive по размерности 1.Переменная=UBound(Massive,1) 'возвращает в Переменную максимальный индекс массива Massive по размерности 1.

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

Private Sub Sort() 'процедура сортировкиDim K As LongDim N As LongDim y As Long 'просто для цикла For...NextDim Peremen As String 'для временного храненения из массива имени файлаDim Peremen2 As String 'и атрибута файлаDim NomerPerem As StringDim NomerPerem2 As String'сортировка массива K = LBound(Files, 2) 'присваиваем переменной К начальное значение массива - 1 (нижняя граница)For y = LBound(Files, 2) To UBound(Files, 2) 'просматриваем все строки массива с нижней до верхней границы Peremen = Files(1, y) 'присваиваем каждую строку в переменные Peremen2 = Files(2, y)'вложенный циклFor N = y To UBound(Files, 2) 'просматриваем строки массива, начиная с той, 'значения которой храняться в переменных Peremen и Peremen2

If Files(1, N) < Peremen Then 'если значение в массиве меньше, чем в переменной Peremen = Files(1, N) 'то присваиваем переменным Peremen и Peremen2 новые, меньшие значения Peremen2 = Files(2, N) K = N 'присваиваем номер найденного элемента массива переменной KEnd IfNext N'конец вложенного цикла NomerPerem = Files(1, y) 'сохраняем в переменных старые значения строки массива NomerPerem2 = Files(2, y) Files(1, y) = Peremen ' и присваиваем этой строке массива новые Files(2, y) = Peremen2If K > 0 Then 'если K не ноль, Files(1, K) = NomerPerem 'то строке К присваиваем старые значения из строки y Files(2, K) = NomerPerem2End If Peremen = "" 'обнуляем переменные Peremen2 = "" K = 0Next y'конец сортировки'просто выводим в Text1 отсортированные значения массиваFor X = 1 To UBound(Files, 2) Text1.Text = Text1.Text & Files(1, X) & Files(2, X) & vbCrLfNext XEnd Sub

Исходник программы можно, как всегда, скачать вверху страницы.

Можно ли присвоить один массив другому не по отдельному элементу (в цикле), а сразу.

Вопрос посетителя сайта Cubic: Можно ли присвоить один массив другому не по отдельному элементу (в цикле), а сразу?

Присвоение массивов. Visual Basic 6.0 и версии выше дают возможность проводить операции присваивания с массивами точно также, как с переменными. Теперь нет необходимости создавать цикл For...Next для присваивания одного массива другому по каждому элементу. Достаточно написать такой операторNewMassive=OldMassive и содержимое массива OldMassive присвоится массиву NewMassive. Однако при этом следут учитывать, что для исключинения ошибок при таком присвоении, желательно соблюдать одинаковую размерность и тип массивов. Хотя при присвоении динамического массива динамическому массиву, массив в левой части оператора изменяется, как бы подстраивается под оператор в правой части. Однако при работе со статическими массивами возможна ошибка компиляции. Кроме того при присвоении, например массива типа Long типу Integer может возникнуть ошибка переполнения (Owerflow). В программе операция присвоения может выглядеть приблизиельно так (на форме должны быть кнопка Command1 и текстбокс Text1):

Option Explicit Dim OldMassive() As LongDim NewMassive() As Long

Private Sub Command1_Click()Dim x As Long

For x = 0 To 999 'просто заполнение массива цифрамиReDim Preserve OldMassive(x) OldMassive(x) = xNext x

NewMassive = OldMassive 'присоение массивовFor x = 0 To UBound(NewMassive) ' считывание нового массива в Text1 Text1.Text = Text1.Text & NewMassive(x) & vbCrLfNext xEnd Sub

Я думаю, особых комментариев здесь не требуется. Сайт создан в системе uCoz

vbzero.narod.ru

Программирование в Excel (VBA). Одномерный массив. | Экономика

В статье «Программирование в Excel (VBA). Одномерный массив »  мы решаем задачу.

 

Можете скачать документ Excel Odnommas.zip .

 

Задача.

 

Найти среднее арифметическое чисел, принадлежащих отрезку от 2 до 184, кратных 2 и введённых с клавиатуры. Всего ввести N различных чисел.

 

Решение.

  1. Сервис-Макрос-Редактор Visual Basic.
  2. Insert-Module
  3. Insert-Procedure.
  4. Назовите модуль
  5. Запишите код:Dim i As Integer, j As Integer, k As Integer, rab As Integer,
    Введём переменные. Переменные могут состоять из нескольких букв.
  6. A(10) As Integer
  7. For i = 1 To 10
    ‘вводим массив из листа Excel
  8. A(i) = Cells(i, 1)
    Числа программа считывает из листа Excel.
  9. Next
    Оператор От и До закончен.
  10. Max = A(1)
    Принимаем значение в ячейке А1 равным максимальному значению.
  11. For i = 2 To 10
    Вводим снова оператор От и До.
  12.     If A(i) > Max Then
    Если ячейка больше максимальной, то
  13.     Max = A(i)
    Максимальной становится эта ячейка.
  14.     k = i
    Присвоим этому числу значение k.
  15.     End If
    Закрываем оператор Если
  16. Next
    Закрываем оператор От и До.
  17. Min = A(1)
    Присвоим ячейки А1 значение минимума.
  18. For i = 2 To 10
    Перебираем все ячейки и находим минимальное число.
  19.     If A(i) < Min Then
  20.     Min = A(i)
  21.     j = i
    Присваиваем минимальному значению переменную j
  22.     End If
  23. Next
  24. rab = A(k)
    Добавим переменную rab. Присвоим этой переменной максимальное значение.
  25. A(k) = A(j)
  26. A(j) = rab
    Поменяем максимальное и минимальное число с помощью переменной rab.
  27. For i = 1 To 10
  28. Cells(i, 1) = A(i)
  29. Next
  30. Run — Run Sub
  31. Сделанную работу сохраните.
  32. При повторном открытии документа Excel не отключайте макросы.
  33. Вверху я вставил этот код с комментариями, однако в программе Excel VBA код нужно вставить целиком.

Dim i As Integer, j As Integer, k As Integer, rab As Integer, _A(10) As IntegerFor i = 1 To 10 ‘вводим массив из листа ExcelA(i) = Cells(i, 1)NextMax = A(1)For i = 2 To 10    If A(i) > Max Then    Max = A(i)    k = i    End IfNextMin = A(1)For i = 2 To 10    If A(i) < Min Then    Min = A(i)    j = i    End IfNextrab = A(k)A(k) = A(j)A(j) = rabFor i = 1 To 10Cells(i, 1) = A(i)Next

Удачного программирования! При написании статьи «Программирование в Excel (VBA). Циклический алгоритм»  я пользовался лабораторным практикумом Информатика Часть 2: Программирование, введение в разработку приложений, Лабораторный практикум по VBA.Учебное пособие. Составители Ильичёва О.А., Глушкова В.Н.

economica-light.ru

Обработка массивов - VBA

В повседневной жизни часто приходится встречаться с информацией, представленной в табличном виде. Для обработки можно использовать электронные таблицы, а также VBA.

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

Данные в массивах

Массивы могут содержать данные любого типа: тип элементов массива распознается по идентификатору. Массивы необходимо объявлять. С помощью оператора Dim. При объявлении указывается имя массива, размерность и количество элементов по каждой размерности (эти количества должны быть определены до объявления массива).

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

Все действия с массивами выполняются поэлементно, в цикле. Поскольку массив — это последовательность с известным числом элементов, удобнее использовать цикл For.

Пример 1

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

Результат вычисления среднего роста будут записаны в ячейку B9.

Решение.

Sub средний_рост() Dim Rost(6) As Double Dim i As Integer Dim Сумма, Среднее As Double   ' ввод таблицы для обработки For i = 1 To 6 Rost(i) = Cells(1 + i, 2).Value Next i   ' нахождение суммы чисел в таблице Сумма = 0 For i = 1 To 6 Сумма = Сумма + Rost(i) Next i   ' вычисление среднего Среднее = Сумма / 6   'вывод Cells(9, 2).Value = Среднее MsgBox (Среднее) End Sub

Пояснение решения.

В строке Dim Rost(6) As Doubl объявляется массив чисел двойной точности именем Rost размерностью 6, то есть одномерная таблица Rost емкостью 6 (шесть) ячеек.

Аналогичным образом можно обрабатывать и двумерные массивы.

Пример 2

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

Решение.

Sub simetria() Const n = 4 Dim i, j Dim x(n, n) Dim t, check As Boolean For i = 1 To n For j = 1 To n x(i, j) = Cells(i, j) Next Next t = True 'предположим, что матрица симметрична i = 2 While t And (i < n) j = 1 While (j < i) And (x(i, j) = x(j, i)) j = j + 1 Wend t = (j = i) i = i + 1 Wend check = t MsgBox check End Sub

itteach.ru

Массивы в Visual Basic.NET

Массивы

Последнее обновление: 30.10.2015

Массив представляет собой набор данных одного типа. Например, объявим массив элементов типа Integer:

Dim nums(5) As Integer nums(0) = 0 nums(1) = 1 nums(2) = 2 nums(3) = 3 Console.WriteLine(nums(3))

Здесь мы объявили массив из 6 элементов типа Integer. По умолчанию всем шести элементам в массиве присваивается 0. Затем первым четырем элементам массива мы присваиваем некоторые значения. Обратите внимание, что индексация в массиве начинается с нуля. При этом мы не можем выйти за рамки установленной длины массива в 6 элементов. А следующий код вызовет исключение ArrayIndexOutOfRange, поскольку восьмого элемента в массиве не существует, в нем определено только 6 элементов:

Dim nums(5) As Integer nums(7) = 7

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

Dim nums() As Integer

В таком случае нам его еще предстоит инициализировать. Мы это можем сделать так:

Dim nums() As Integer nums = New Integer(5) {} nums(0) = 0 nums(1) = 1 nums(2) = 2 nums(3) = 3

В данном примере мы c помощью ключевого слова New указываем, что хотим создать новый объект. Также указываем размер массива. А фигурные скобки служат для инициализации массива. Однако нам необязательно присваивать все значения массива после объявления. Мы можем все сделать уже при объявлении массива:

Dim nums2 As Integer() = New Integer(5) {0, 1, 2, 3, 4, 5}

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

'Не указываем размер массива Dim nums1 As Integer() = New Integer() {0, 1, 2, 3, 4, 5} 'Сокращенный синтаксис инициализации Dim nums2 As Integer() = {0, 1, 2, 3, 4, 5}

В первой главе мы уже говорили, что тип переменной может выводиться компилятором автоматически. То же самое применимо и к массиву. Например:

Dim nums = {0, 1, 2, 3, 4, 5}

Кроме размера массив характеризуется таким понятием как размерность (dimension). В предыдущих примерах мы использовали одномерные массивы. Но массивы бывают и многомерными. Например:

'Одномерный массив Dim nums1 As Integer() = {0, 1, 2, 3, 4, 5} 'Двухмерный массив Dim nums2 As Integer(,) = {{0, 1, 2}, {3, 4, 5}} Console.WriteLine(nums2(1, 1))

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

Одномерный массив nums1
Двухмерный массив nums2
Изменение размера массива

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

Dim nums1 As Integer() = {0, 1, 2, 3, 4, 5} ReDim nums1(8)

ReDim пересоздает массив с новым размером. Чтобы сохранить все прежние элементы, нам надо также использовать ключевое слово Preserve.

Dim nums1 As Integer() = {0, 1, 2, 3, 4, 5} ReDim Preserve nums1(8)
Некоторые методы и свойства массивов
  • Свойство Length позволяет получить количество элементов массива

  • Свойство Rank позволяет получить размерность массива

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

  • Метод Sort сортирует элементы массива

Примеры использования:

Dim nums1 As Integer() = {8, 1, 5, 3, 4, 2} Dim lenght As Integer = nums1.Length() Console.WriteLine("количество элементов: {0}", lenght) Dim rank As Integer = nums1.Rank() Console.WriteLine("размерность массива: {0}", rank) nums1.Reverse() Array.Sort(nums1) Console.WriteLine(nums1(1))

metanit.com

Visual Basic.NET. Массивы | Programmirovanie-dla-sсhool

Урок из серии “Программирование на Visual Basic.NET для школьников”

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

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

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

Преимущество в использовании массивов состоит в том, что:

  • Не нужно придумывать большое количество имен для идентификации ячеек, предназначенных для хранения информации в памяти. Достаточно  одного имени – имени массива. Доступ к отдельным элементам будет  осуществляется по имени массива и порядковому номеру (индексу) элемента в массиве.
  • Использование переменных  в качестве индексов позволяет применять для обработки массивов операторы цикла.

Итак ….

Что такое массив?

Массив – это набор однотипных переменных или объектов, объединенных одним именем.

В массиве элементы пронумерованы. Номер элемента в массиве называется индексом.

Массив может быть одномерным или многомерным.

Размерность массива соответствует числу индексов, необходимых для идентификации отдельного элемента. Можно задать до 32 индексов, хотя случаи использования более трех индексов очень редки.

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

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

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

Доступ к элементу массива производится по его имени, состоящему из имени массива и значению индекса, например N(5).

Каждый элемент массива является переменной, т.е. обладает именем и значением. Поэтому элементы массива называют ещё индексированными переменными. Их можно использовать в программном коде также как и обычные переменные.

Например, оператор:

a(1) = a(0)

присваивает второму элементу массива значение, равное значению первого элемента.

Как массивы хранятся в памяти компьютера

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

Массиву надо выделить столько места (смежных ячеек памяти), чтобы его хватило всем элементам массива. Поэтому прежде чем использовать массив в программе, программист обязательно должен его объявить.

Объявление массива

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

Объявим одномерный целочисленный массив, содержащий 10 элементов.

Dim N(9) As Integer

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

Заполнение массива

Для начала работы с массивом необходимо его предварительно заполнить, то есть присвоить элементам массива определенные значения.

Это можно сделать различными способами:

  • заполнить массив случайными числами;
  • заполнить массив символами с клавиатуры;
  • заполнить массив из файла.

Проект «Заполнение массива»

Задание. Заполнить числовой массив случайными числами, строковый массив пятью символами, введенными с клавиатуры, и строковый массив буквами русского алфавита из текстового файла.

  1. Создадим графический интерфейс проектаДля этого поместить на форму:
    • Список ListBox1 для вывода целочисленного массива, заполненного случайными числами;
    • Список ListBox2  для вывода строкового массива, заполненного символами с клавиатуры;
    • Список ListBox3  для вывода строкового массива, заполненного символами алфавита из файла;
    • Кнопки Button1, Button2, Button3 для создания обработчиков событий.

  2. Заполним массив N(I) целыми случайными числами из диапазона от 1 до 100.

    На языке Visual Basic.NET для генерации случайных чисел используется функцию Rnd(). При запуске программы функция Rnd() дает псевдослучайную (т.е. каждый раз повторяющуюся) последовательность чисел из диапазона [0, 1].

    Для получения числовой последовательности случайных чисел из промежутка [0; 100], умножим полученное с помощью функции Rnd() число но 100 и выделим из полученного числа целую часть: Int(Rnd()* 100). Для получения случайных чисел из произвольного интервала [A;B] можно воспользоваться следующей формулой:

    (B – A) * Rnd() +A.

    Для генерации различающихся между собой последовательностей случайных чисел рекомендуется использовать оператор Randomize(), который использует аргумент для инициализации генератора случайных чисел Rnd(), задавая его новое начальное значение. Если аргумент опущен, то в качестве нового значения используется значение, возвращаемое системным таймером.

    Обработчик события заполнения массива случайными числами

    ' Заполнение массива случайными числами Dim i, N(9) As integer Randomize() ListBox1.Items.Clear() For i = 0 To 9 N(i) = Int(Rnd() * 100) ListBox1.Items.Add(Str(N(I))) Next i
  3. Заполним массив с клавиатуры.

    Для ввода элементов массива с клавиатуры можно использовать функцию InputBox(). Аргументами этой функции являются две строки, которые отображаются в диалоговом окне ввода, а значением функции – символ, введенный пользователем.

    Обработчик события заполнения массива с клавиатуры:

    'Заполнение текстового массива из 5 элементов с клавиатуры Dim A(4) As String Dim i As integer For I = 0 To 4 A(I) = InputBox("Введите " + Str(I + 1) + " элемент массива:", "Ввод элементов массива с клавиатуры") ListBox2.Items.Add(A(I)) Next I
  4. Заполним строковый массив буквами русского алфавита из текстового файла.

    Создадим в текстовом редакторе файл и введем первые 10 букв русского алфавита по одной букве в строке. Файл должен содержать только коды самих символов (не должен содержать управляющие коды форматирования текста) и, следовательно, должен создаваться в простейшем текстовом редакторе типа Блокнот. Сохраним файл alfavit.txt в кодировке Unicode.

    Для чтения из файла предназначен класс объектов StreamWriter из пространства имен System.IO. Поэтому добавим следующие операторы в самом начале кода, перед объявлением класса формы, которое начинается с Public Class Form1.

    Imports System Imports System.IO

    В обработчике события заполнения массива из файла объявим массив и переменную, которая будет ссылкой на объект StreamReader. В цикле со счетчиком произведем чтение букв алфавита из файла с использованием метода ReadLine() и введем буквы в список.

    Обработчик события заполнения массива из файла:

    'Заполнение текстового массива из файла Dim B(32) As String Dim sr As StreamReader sr = New StreamReader("alfavit.txt") For I = 0 To 9 B(I) = sr.ReadLine() ListBox3.Items.Add(B(I)) Next I

    Более подробно о работе с текстовым файлом можно посмотреть здесь.

  5. Запустим проект. Щелкнуть по кнопке Заполнение массива случайными числами, в первый список будут выведены элементы массива, заполненные случайными числами.

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

    Щелкните по кнопке Заполнение массива из файла, в третий список будут выведены элементы массива, заполненного буквами русского алфавита из файла.

    Так как не все элементы массива помещаются в список, появляется вертикальная полоса прокрутки.

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

В следующем уроке научимся выполнять поиск элементов в массиве.

Следующий урок: Обработка массива. Поиск максимального элемента

До встречи в следующем уроке.

Поделиться с друзьями

gospodaretsva.com

Visual Basic с нуля. Глава 10. Массивы. Их границы. Сортировка.

Массивы, друзья мои, очень простая и крайне необходимая штука. Простой пример: ты считал из директории 50 имен файлов и тебе необходимо как-то поместить их в памяти, что-бы потом с ними работать. Без использования массива, ты должен объявить пятьдесят переменных и в каждую записать имя файла. Это безумие. Но еще большее безумие потом работать с этими переменными, пытаясь найти в них нужные нужные тебе данные. Иное дело массив. Имея его (в хорошем смысле), можно под одним именем запомнить все твои пятьдесят имен файлов и перебирать их сколько угодно, в любом цикле, меняя лишь индекс члена массива. Т.е., другими словами,

Массив - это сколько угодно значений, объединенных одним именем.

Массив, прежде чем использовать, надо объявить. Объявляется он совершенно также как и переменная. Если ты объявишь его локально в процедуре (здесь можно использовать ключевое слово Static), то он будет доступен только в этой процедуре и нигде больше, если в разделе (General)-(Daclarations) формы (c оператором Dim) - то во всей форме, а если тебе нужно объявить его глобально, так, чтобы он был доступен всему проекту, то в стандартном модуле с ключевым словом Public. Кроме того , массивы бывают статическими и динамическими.

Статические массивы.

Статический массив - это когда ты заранее знаешь, сколько переменных туда нужно будет записать, т.е. если ты объявил массив на 10 членов, то уж туда никак не запихнешь одиннадцать. В форме он объявляется так:

Dim Chislo(9) As Long

Что здесь важно.Dim - оператор, который точно также, как и при объявлении переменной, объявляет массив и выделяет для нее память.Chislo - ну это просто имя, придумывается также как и для переменной и отвечает тем же требованиям.(9) - количество элементов в массиве - их 10. Почему так. Дело в том, что элементы массива нумеруются с нуля, а не с единицы, поэтому у нас десять элементов массива c номерами 0, 1, 2, 3, 4, 5, 6, 7, 8 и 9. Если для каких-то целей такой порядок тебя не устраивает, то используется оператор Option Base 1, который прописывается в разделе Declarations и привязывает первый элемент ВСЕХ, повторяю ВСЕХ, массивов в программе к единице.As Long - определение типа данных массива так же как тип обычной переменной. Почти всегда все элементы массива имеют один и тот же тип ( в данном случае длинное число Long). На крайняк, если это не так, или если ты не знаешь какого типа будут данные, можно задать тип Variant, но это нежелательно из-за того, что это занимает значительный объем памяти, особенно если массив большой.Размерность - ее так сразу не заметно, но она здесь присутствует и равна единице, потому, что у на одна циферка (девятка), т.е. наш массив является одномерным - по сути список значений. Теперь создадим массив для хранения результатов, ну скажем таблицы умножения на 8. Поскольку на ноль умножать бесперспективно, привязываем первый элемент массива к единице и объявляем переменную x для организации цикла For...Next.

Option Explicit Option Base 1Dim Chislo(10) As Long 'так как мы используем оператор Option Base, то элементы массива нумеруются с единицы Dim x As Long

Положим на форму Text1 с установленными свойствами .MultiLine в True, а .ScrollBars - в 2-Вертикаль, а также кнопку Command1. В процедуре Form_Load напишем цикл, который будет присваивать каждому элементу массива значение, соответствующее его номеру, умноженному на 8.

Private Sub Form_Load() Text1.Text = ""For x = 1 To 10 Chislo(x) = x * 8Next xEnd Sub

Как видите, в цикле мы вместо номера элемента просто используем значение x, и таким образом перебираются все элементы массива. Теперь мы выведем значения элементов массива в Text1 в процедуре Command1.

Private Sub Command1_Click()For x = 1 To 10 Text1.Text = Text1.Text & Chislo(x) & vbCrLfNext xEnd Sub

Таким образом наш одномерный массив представляет собой аналог таблицы с одной строчкой:

1 элемент

2 элемент

3 элемент

4 элемент

5 элемент

6 элемент

7 элемент

8 элемент

9 элемент

10 элемент

8

16

34

32

40

48

56

64

72

80

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

Option Explicit Option Base 1Dim Chislo(10, 2) As LongDim x As Long

Private Sub Form_Load() Text1.Text = ""For x = 1 To 10 Chislo(x, 1) = x Chislo(x, 2) = x * 8Next x

Private Sub Command1_Click()For x = 1 To 10 Text1.Text = Text1.Text & "8 x " & Chislo(x, 1) & " = " & Chislo(x, 2) & vbCrLfNext xEnd Sub

И наш массив будет представлять собой следующее

 

1 элемент

2 элемент

3 элемент

4 элемент

5 элемент

6 элемент

7 элемент

8 элемент

9 элемент

10 элемент

1 элемент

1

2

3

4

5

6

7

8

9

10

2 элемент

8

16

34

32

40

48

56

64

72

80

таким образом элемент массива Chislo (7,2) будет иметь значение 56.Обратите внимание, что размерность массива определяет колиство циферек в объявлении. Массив Chislo (10,5) - тоже двухмерный, только строк в табличке было-бы не две, а пять. А объявление трехмерного массива выглядело бы такDim(10,5,2).Такую трехмерную таблицу нарисовать мне затруднительно. В принципе VB поддерживает до 64 размерностей массива, но это в голове трудно укладывается. Все, как видите очень просто. Однако статические массивы используются довольно редко. Чаше мы не знаем сколько данных мы будем иметь и потом ведь хочется дописать при необходимости в массив новые данные. Для этого существуют динамические массивы.

Динамические массивы.

Часто возникает ситуация, когда мы не знаем заранее, сколько элементов массива мы будем использовать заранее. Поэтому массив объявляется без размерности, например

Dim Mass () as String

Но, перед его непосредственным использованием, его надо переобъявить c указанием размерности. Делается это с помощью оператора Redim.

Redim Mass (5) as String

Вообще-то, у нас два пути использования динамического массива. Первый путь, это года мы узнаем (просчитываем) , сколько элементов массива нам нужно, и после этого объявляем массив небходимого нам размера. Однако мне это путь не очень нравится, поскольку, нам приходится задавать два цикла: один - для просчета необходимого количества элементов, второй - для собственно присваивания массиву значений переменных. Второй путь, это когда мы в одном цикле при нахождении каждого нового данного переобъявляем массив с увеличением количества его элементов. Но этот способ загружает компьютер и может занимать много времени на обработку, особенно если создается большой массив. Происходит это из-за перераспределения элементов массива в памяти всякий раз при его переобъявлении и добавлении нового члена. Но именно такой способ мы применим при разработке программки Scanfiles, которая будет сканировать файлы в выбранной директории, сортировать их по-возрастанию и выводить в Text1. Хочу сразу заметить, что при переобъявлении массива все записанные в него данные стираются - массив обнуляется. Чтобы этого не происходило, надо использовать ключевое слово Peserve:

Redim Preserve Mass (5) as String

Идем дальше. Поместим на форму объекты Dir1 и Text1. Начнем писать код. Обратите внимание, что процедуры Form_Load у нас не будет, так как под это событие обрабатывать нам нечего. Ну-с, фигачим

Option Explicit'Установим начальную нумерацию массива с единицы, сейчас так удобнееOption Base 1 'объявим переменныеDim OurDir As String 'для директории, где будем искать файлыDim FileName As String 'для имен находимых файловDim X As Long 'просто для цикла'и, наконец, наш динамический массив, как строковыйDim Files() As StringКроме того, поскольку одни имена - это уж совсем скучно, то мы еще во вторую размерность массива выведем атрибуты файла. Атрибуты, это когда по файлу шлепаешь правой кнопкой мыши и в выпавшем меню выбираешь "Свойства". Тогда снизу окна этих свойств можно увидеть галочки рядом с загадочными словами "Только чтение", "Скрытый" и "Архивный". Именно эти свойства можно устанавливать или получать с помощью оператора SetAttr и функции GetAttr. Весь геморрой в том, что этот атрибут представляет из себя число, получаемое из суммы значений атрибутов, приведенных в таблице ниже, и чтобы понять, какой атрибут все-таки у файла, нужно "с помощью оператора And выполнить поразрядное сравнение значения". Друзья мои. Это цитату из Help5 я привел для того, чтобы можно было почувствовать разницу между "академическим" и "вольным" изложением проблемы. Короче, привожу таблицу этих атрибутов:

Константа

Значение

Описание

vbNormal

0

Обычный.
vbReadOnly

1

Только для чтения.
vbHidden

2

Скрытый.
vbSystem

4

Системный.
vbDirectory

16

Каталог или папка.
vbArchive

32

Архивный.

Из всей этой дребедни нам нужны три константы: vbArchive, vbReadOnly и vbHidden для этого самого "поразрядного сравнения". Делается это так: Чтобы узнать, только для чтения ли этот файл:Переменная = GetAttr("полный путь к файлу") And vbReadOnly Если в Переменной не ноль, то файл - только для чтения. Аналогично для других констант. Чтобы установить аттрибут, например "Архивный" для файла:SetAttr "C:\Andrey\index.htm", vbReadOnly при этом уже установленные атрибуты файла сбрасываются. Если надо установить атрибуты "только для чтения" и "архивный":SetAttr "C:\Andrey\index.htm", vbReadOnly +vbArchive Все просто, а по сути - издевательство. Про атрибуты - все. Более интересные данные о файлах мы получим, когда начнем использовать FSO. Но об этом не сегодня. Итак, для хранения атрибута (на основании "поразрядного сравнения") продолжаем объявлять переменные (еще две)

Dim Attr As Long 'числовая, для атрибута файлаDim AttributFile As String 'строковая, для записи атрибута в виде слов

Напишем маленькую процедурку для Dir1 на событие Change. Дело в том, что событие Change наступает при двойном клике, а я и хочу, чтобы директория для поиска файлов устанавливалась по двойному клику. В этой процедурке мы очистим Text1 и обнулим переменные, ну и главное, запишем в переменную OurDir полный путь к директории, после чего перейдем к другой поцедуре - ScanDir, где собственно и будем искать файлы и записывать их имена и атрибуты в наш массив Files.

Private Sub Dir1_Change() Text1.Text = "" FileName = "" X = 0 OurDir = Dir1.Path ScanDir 'переходим к процедуре сканирования файловEnd Sub

Далее в процедуре ScanDir все, с учетом комментариев, понятно:

Private Sub ScanDir() FileName = Dir(OurDir & "\*.*", 0) 'присваиваем переменной значение функции Dir для всех файловReDim Files(2, 1) 'переобъявляем массив с минимальной размерностью, иначе может возникать ошибкаDo While FileName <> "" 'запускаем цикл, до тех пор, пока Dir не вернет пустую строку X = X + 1 'счетчик элементов массиваReDim Preserve Files(2, X) 'переобъявляем массив по счетчику, сохраняя уже имеющиеся в нем данные AttributFile = "" 'обнуляем переменные Attr = 0'проверяем файл на атрибут архивный Attr = GetAttr(OurDir & "\" & FileName) And vbArchiveIf Attr > 0 Then AttributFile = AttributFile & " Архивный"'проверяем файл на атрибут только для чтения Attr = GetAttr(OurDir & "\" & FileName) And vbReadOnlyIf Attr > 0 Then AttributFile = AttributFile & " Только чтение"'проверяем файл на атрибут скрытый для порядка, Бейсик все равно не видит такие файлы Attr = GetAttr(OurDir & "\" & FileName) And vbHiddenIf Attr > 0 Then AttributFile = AttributFile & " Скрытый"

Files(1, X) = FileName 'пишем в массив имя файла Files(2, X) = AttributFile 'пишем в массив атрибут файла FileName = Dir() 'запускаем функцию Dir без атрибутовLoop 'и так в цикле, пока файлы в директории не закончатся

If X > 0 Then Sort ' если хоть один файл найден, 'отправляемся к процедуре сортировкиElse Text1.Text = "Файлов не найдено" 'в противном случае выводим сообщение.End If End SubОсновная прелесть массивов в том, что с данными, записанными в них, можно что угодно делать: сортировать, разбивать на группы, осуществлять поиск, делать выборки и т.п. Сейчас мы наш массив отсортирум по возрастанию имен файлов. Скажу сразу, что алгоритмы сортировки разработаны и существуют давно. Приводимый в примере был разработан лично мною, а возможное совпадение его с другими алгоритмами совершенно случайно. Но прежде, чем перейти к сортировке, я хочу рассказать вот о чем. Поскольку количество элементов нашего массива меняется, а для сортировки его с помощью циклов For...Next нам надо точно знать минимальный (нижняя граница) и максимальный (верхняя граница) доступные значения индекса массива, то я использую функции LBound для определения минимального индекса и UBound для определения максимального индекса указанной размерности. Синтаксис их такой

Переменная=LBound(Massive,1) 'возвращает в Переменную минимальный индекс массива Massive по размерности 1.Переменная=UBound(Massive,1) 'возвращает в Переменную максимальный индекс массива Massive по размерности 1.

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

Private Sub Sort() 'процедура сортировкиDim K As LongDim N As LongDim y As Long 'просто для цикла For...NextDim Peremen As String 'для временного храненения из массива имени файлаDim Peremen2 As String 'и атрибута файлаDim NomerPerem As StringDim NomerPerem2 As String'сортировка массива K = LBound(Files, 2) 'присваиваем переменной К начальное значение массива - 1 (нижняя граница)For y = LBound(Files, 2) To UBound(Files, 2) 'просматриваем все строки массива с нижней до верхней границы Peremen = Files(1, y) 'присваиваем каждую строку в переменные Peremen2 = Files(2, y)'вложенный циклFor N = y To UBound(Files, 2) 'просматриваем строки массива, начиная с той, 'значения которой храняться в переменных Peremen и Peremen2

If Files(1, N) < Peremen Then 'если значение в массиве меньше, чем в переменной Peremen = Files(1, N) 'то присваиваем переменным Peremen и Peremen2 новые, меньшие значения Peremen2 = Files(2, N) K = N 'присваиваем номер найденного элемента массива переменной KEnd IfNext N'конец вложенного цикла NomerPerem = Files(1, y) 'сохраняем в переменных старые значения строки массива NomerPerem2 = Files(2, y) Files(1, y) = Peremen ' и присваиваем этой строке массива новые Files(2, y) = Peremen2If K > 0 Then 'если K не ноль, Files(1, K) = NomerPerem 'то строке К присваиваем старые значения из строки y Files(2, K) = NomerPerem2End If Peremen = "" 'обнуляем переменные Peremen2 = "" K = 0Next y'конец сортировки'просто выводим в Text1 отсортированные значения массиваFor X = 1 To UBound(Files, 2) Text1.Text = Text1.Text & Files(1, X) & Files(2, X) & vbCrLfNext XEnd Sub

Исходник программы можно, как всегда, скачать вверху страницы.

Присвоение содержимого одного массива другому.

Можно ли присвоить один массив другому не по отдельному элементу (в цикле), а сразу?Visual Basic 6.0 и версии выше дают возможность проводить операции присваивания с массивами точно также, как с переменными. Теперь нет необходимости создавать цикл For...Next для присваивания одного массива другому по каждому элементу. Достаточно написать такой операторNewMassive=OldMassive и содержимое массива OldMassive присвоится массиву NewMassive. Однако при этом следут учитывать, что для исключинения ошибок при таком присвоении, желательно соблюдать одинаковую размерность и тип массивов. Хотя при присвоении динамического массива динамическому массиву, массив в левой части оператора изменяется, как бы подстраивается под оператор в правой части. Однако при работе со статическими массивами возможна ошибка компиляции. Кроме того при присвоении, например массива типа Long типу Integer может возникнуть ошибка переполнения (Owerflow). В программе операция присвоения может выглядеть приблизиельно так (на форме должны быть кнопка Command1 и текстбокс Text1):

Option Explicit Dim OldMassive() As LongDim NewMassive() As Long

Private Sub Command1_Click()Dim x As Long

For x = 0 To 999 'просто заполнение массива цифрамиReDim Preserve OldMassive(x) OldMassive(x) = xNext x

NewMassive = OldMassive 'присоение массивовFor x = 0 To UBound(NewMassive) ' считывание нового массива в Text1 Text1.Text = Text1.Text & NewMassive(x) & vbCrLfNext xEnd Sub

Я думаю, особых комментариев здесь не требуется.

Copyright © 2005 4us

Сайт создан в системе uCoz

vbzero.narod.ru