10065 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Массивы. Обьявление массивов. Сортировка массивов02.12.2009, 20:13. Показов 114357. Ответов 1
Метки нет (Все метки)
Массивы.
Массивы, друзья мои, очень простая и крайне необходимая штука. Простой пример: ты считал из директории 50 имен файлов и тебе необходимо как-то поместить их в памяти, что-бы потом с ними работать. Без использования массива, ты должен объявить пятьдесят переменных и в каждую записать имя файла. Это безумие. Но еще большее безумие потом работать с этими переменными, пытаясь найти в них нужные нужные тебе данные. Иное дело массив. Имея его (в хорошем смысле), можно под одним именем запомнить все твои пятьдесят имен файлов и перебирать их сколько угодно, в любом цикле, меняя лишь индекс члена массива. Т.е., другими словами, Массив - это сколько угодно значений, объединенных одним именем. Массив, прежде чем использовать, надо объявить. Объявляется он совершенно также как и переменная. Если ты объявишь его локально в процедуре (здесь можно использовать ключевое слово Static), то он будет доступен только в этой процедуре и нигде больше, если в разделе (General)-(Daclarations) формы (c оператором Dim) - то во всей форме, а если тебе нужно объявить его глобально, так, чтобы он был доступен всему проекту, то в стандартном модуле с ключевым словом Public. Кроме того , массивы бывают статическими и динамическими. Статические массивы. Статический массив - это когда ты заранее знаешь, сколько переменных туда нужно будет записать, т.е. если ты объявил массив на 10 членов, то уж туда никак не запихнешь одиннадцать. В форме он объявляется так:
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.
Теперь переделаем его в двухмерный массив, чтобы в еще одну строчку записать множитель, на который умножается число 8. Переделаем наш код на такой:
таким образом элемент массива Chislo (7,2) будет иметь значение 56. Обратите внимание, что размерность массива определяет колиство циферек в объявлении. Массив Chislo (10,5) - тоже двухмерный, только строк в табличке было-бы не две, а пять. А объявление трехмерного массива выглядело бы так Dim(10,5,2).Такую трехмерную таблицу нарисовать мне затруднительно. В принципе VB поддерживает до 64 размерностей массива, но это в голове трудно укладывается. Все, как видите очень просто. Однако статические массивы используются довольно редко. Чаше мы не знаем сколько данных мы будем иметь и потом ведь хочется дописать при необходимости в массив новые данные. Для этого существуют Динамические массивы. Часто возникает ситуация, когда мы не знаем заранее, сколько элементов массива мы будем использовать заранее. Поэтому массив объявляется без размерности, например
Первый путь, это года мы узнаем (просчитываем) , сколько элементов массива нам нужно, и после этого объявляем массив небходимого нам размера. Однако мне это путь не очень нравится, поскольку, нам приходится задавать два цикла: один - для просчета необходимого количества элементов, второй - для собственно присваивания массиву значений переменных. Второй путь, это когда мы в одном цикле при нахождении каждого нового данного переобъявляем массив с увеличением количества его элементов. Но этот способ загружает компьютер и может занимать много времени на обработку, особенно если создается большой массив. Происходит это из-за перераспределения элементов массива в памяти всякий раз при его переобъявлении и добавлении нового члена. Но именно такой способ мы применим при разработке программки Scanfiles, которая будет сканировать файлы в выбранной директории, сортировать их по-возрастанию и выводить в Text1. Хочу сразу заметить, что при переобъявлении массива все записанные в него данные стираются - массив обнуляется. Чтобы этого не происходило, надо использовать ключевое слово Peserve:
Из всей этой дребедни нам нужны три константы: vbArchive, vbReadOnly и vbHidden для этого самого "поразрядного сравнения". Делается это так: Чтобы узнать, только для чтения ли этот файл: Переменная = GetAttr("полный путь к файлу") And vbReadOnly Если в Переменной не ноль, то файл - только для чтения. Аналогично для других констант. Чтобы установить аттрибут, например "Архивный" для файла: SetAttr "C:\Andrey\index.htm", vbReadOnly при этом уже установленные атрибуты файла сбрасываются. Если надо установить атрибуты "только для чтения" и "архивный": SetAttr "C:\Andrey\index.htm", vbReadOnly +vbArchive Все просто, а по сути - издевательство. Про атрибуты - все. Более интересные данные о файлах мы получим, когда начнем использовать FSO. Но об этом не сегодня. Итак, для хранения атрибута (на основании "поразрядного сравнения") продолжаем объявлять переменные (еще две)
Поскольку количество элементов нашего массива меняется, а для сортировки его с помощью циклов For...Next нам надо точно знать минимальный (нижняя граница) и максимальный (верхняя граница) доступные значения индекса массива, то я использую функции LBound для определения минимального индекса и UBound для определения максимального индекса указанной размерности. Синтаксис их такой Переменная=LBound(Massive,1) 'возвращает в Переменную минимальный индекс массива Massive по размерности 1. Переменная=UBound(Massive,1) 'возвращает в Переменную максимальный индекс массива Massive по размерности 1. Надо сказать, что размерность - не обязательный параметр и по-умолчанию принимается за единицу. Теперь перейдем к сортировке массива:
Можно ли присвоить один массив другому не по отдельному элементу (в цикле), а сразу. Присвоение массивов. Visual Basic 6.0 и версии выше дают возможность проводить операции присваивания с массивами точно также, как с переменными. Теперь нет необходимости создавать цикл For...Next для присваивания одного массива другому по каждому элементу. Достаточно написать такой оператор
Однако при этом следут учитывать, что для исключинения ошибок при таком присвоении, желательно соблюдать одинаковую размерность и тип массивов. Хотя при присвоении динамического массива динамическому массиву, массив в левой части оператора изменяется, как бы подстраивается под оператор в правой части. Однако при работе со статическими массивами возможна ошибка компиляции. Кроме того при присвоении, например массива типа Long типу Integer может возникнуть ошибка переполнения (Owerflow). В программе операция присвоения может выглядеть приблизиельно так (на форме должны быть кнопка Command1 и текстбокс Text1):
22
|
02.12.2009, 20:13 | |
Ответы с готовыми решениями:
1
Сортировка массивов Сортировка и слияние массивов Сортировка массивов методом подсчета: написать код по образцу Обработка одномерных массивов и Обработка двухмерных массивов. |
10065 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
05.12.2009, 18:29 [ТС] | 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||
Процедура для сортировки массива методом пузырька
Процедура для сортировки массива методом Шелла
Процедура для сортировки массива методом выборки
Процедура для сортировки массива методом вставок
Процедура для сортировки массива методом двоичных вставок
Процедура для упорядочивания массива пирамидальной сортировкой
Процедура для сортировки массива методом фон Неймана (слияний)
Функция для поиска k-ого по величине элемента массива
Функция для поиска наименьшего элемента
Поиск в упорядоченной последовательности первого элемента, не меньшего, чем T
источник: http://alglib.sources.ru/
36
|
05.12.2009, 18:29 | |
05.12.2009, 18:29 | |
Помогаю со студенческими работами здесь
2
программы усложненной структуры, обработка двухмерных массивов, использование стандартных функций для работы с массивами, сортировка массивов. Сортировка массивов по убыванию и замена массивов Обработка одномерных массивов. Сортировка массивов Обработка одномерных массивов. Сортировка массивов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |