Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LABVB10.doc
Скачиваний:
33
Добавлен:
16.03.2016
Размер:
704 Кб
Скачать

Лабораторная работа n 8. Массивы

До сих пор мы имели дело с константами или переменными, каждая из которых представляла собой какую-то одну величину некоторого типа. Такие типы данных называют простыми. Примеры простых типов данных: integer, single, boolean.

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

Массив представляет собой упорядоченный набор данных одного типа, называемых элементами массива. Например, упорядоченный набор вещественных или целых чисел, упорядоченный набор символов, набор элементов управления и т.д.

Что значит "упорядоченный набор"? Это означает, что компоненты этого набора расположены в определенном порядке, каждому из них соответствует свой номер (индекс), при этом номер следующего элемента больше, чем номер предыдущего.

Внимание! В отличие от ”старых” версий VB нумерация в VB.NET начинается с 0: элемент массива, стоящий на первом месте имеет номер 0, на втором месте - номер 1и так далее.

Набор, упорядоченный по одному признаку, имеет размерность 1, иначе – одно измерение. Это одномерный массив.

Примером массива размерности 2 (двумерного массива) может служить таблица, в клетках которой расположены некоторые данные: матрица, шахматная доска с расположенными на ней фигурами и т.д.

Чтобы представить, как можно с помощью двух индексов указать на местоположение элемента массива, представим себе шахматную доску. Вертикали шахматной доски обозначаются латинскими буквами a,b,c,d,e,f,g,h, а горизонтали - цифрами 1,2,...,8. Чтобы в записи шахматной партии указать место, на котором стоит какая-то фигура, нужно указать соответствующую букву и цифру, например, (f,3).

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

В практических задачах возникает необходимость обрабатывать массивы и большей размерности.

Количество элементов в массиве называют размером массива. Для многомерного массива существует понятие размера по определенной размерности. Так, для шахматной доски размеры по обеим размерностям совпадают и равны 8; для прямоугольной матрицы они различаются.

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

Рассмотрим, как это делается.

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

Dim <имя массива>(<список индексных выражений>) As<тип>

Имя массива выбирается по общим правилам, тип – один из типов VB.

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

Обратим внимание на то, что максимальное значение индекса по каждой размерности на единицу меньше соответствующего размера.

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

Dim Mas1(5) As Single ‘ объявлен одномерный _ массив, имеющий имя Mas1и состоящий из 6 вещественных чисел,

Dim Tabl1 (12, 10) As Integer ' объявлен двумерный массив, имеющий имя Tabl1 и состоящий из 13 целых чисел по первой размерности и 11 целых чисел по второй размерности.

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

Каждое конкретное значение индекса (индексной переменной) – это номер по соответствующей размерности, поэтому для доступа к произвольному элементу массива нужно указать имя массива и в скобках – список индексов: Mas1(3)= 3.14159, x= Tabl1(5,3) и т.д.. В первом случае четвертому элементу массива Mas1 присваивается значение числа . Во втором случае переменнойx присваивается значение элемента массива Tabl1, которое находится в шестой строке и четвертом столбце.

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

Рассмотрим пример создания массива путем ввода его элементов.

Dim n, s As Integer

Dim MyMas(19) As Integer

s=0

n=InputBox(“Укажите количество чисел (не больше 20)”)

For i = 0 to n-1

MyMas(i)=InputBox(“Введите очередное число”)

Next i

For i = 0 to n-1

s=s+ MyMas(i )

Next i

MsgBox “Сумма ” & n & “ чисел ” & “равна ” & s

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

Обратим внимание на то, что массив MyMas может содержать не больше 20 элементов, поэтому желательно предупредить об этом. В противном случае программа может завершиться аварийно, т.к. значение индекса не будет принадлежать заданному диапазону. Это самая распространенная ошибка при работе с массивами.

Размер массива можно задать и с помощью переменной, но в этом случае нужно обязательно задать значение этой переменной, а затем объявить массив:

n = InputBox(“Укажите размер массива”)

Dim MyMas(n-1) As Integer

Элементы управления ListBox и ComboBox.

Для представления одно- и двумерных массивов можно использовать элементы управления ListBox (список) и ComboBox (ниспадающий или комбинированный список). Содержимое списка организовано как одномерный массив, т.е. каждый элемент имеет некоторое значение и номер (индекс).

Программное заполнение списков производится с помощью метода Add

коллекции Items

<имя списка>.Items. Add(<строка>).

Для добавления сразу нескольких элементов в список можно использовать метод AddRange:

<имя списка>.Items.AddRange(<строка1>, <строка2>,…,<строкаN>).

Удаление элемента из списка по его тексту:

<имя списка>.Items. Remove(<удаляемый текст >).

Удаление элемента из списка по его индексу:

<имя списка>.Items. RemoveAt(<индекс >).

Вставка элемента в определенное место списка:

<имя списка>.Items.Insert(<индекс>, <строка>).

Доступ к элементам списка:

< имя строковой переменной>=<имя списка>.Items(<индекс>).

Выделение элементов списка. Свойство SelectedIndex задает или возвращает номер выделенного элемента списка. Если не выбран ни один элемент из списка, то возвращает -1. Свойство SelectedItem задает или возвращает текст выделенного элемента списка.

Добавление выделенного элемента:

<имя списка>.Items. Add(<имя списка>.SelectedItem)

Удаление выделенного элемента:

<имя списка>.Items. Remove(<имя списка>.SelectedItem) либо

<имя списка>.Items. RemoveAt(<имя списка>.SelectedIndex).

Свойство Count позволяет определить количество элементов в списке:

Dim num As Integer = ListBox1.Items.Count.

Для удаления всех элементов из списка служит метод Clear коллекции Items:

ListBox1.Items.Clear.

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

For i=0 To n-1

VisMas=VisMas & “ “ & MyMas(i)

Next i

ListBox1.Items.Add( VisMas)

Задание 1. Создать массив, состоящий из n последовательных натуральных чисел, начиная с числа k. Создать массив из чисел, стоящих на нечетных местах в первом массиве. Оба массива отобразить на экране, используя элементы управления List Box и Combo Box. В конце каждого списка поместить сумму чисел соответствующего массива. Очистить содержимое списков.

Указание: сначала выполнить задание при n=5, k=10, а затем – при произвольных n и k.

Задание 2. Создать массив из произвольных символов вводом с клавиатуры в объект List Box. Определить количество цифр и латинских букв среди введенных символов. Из полученного массива создать массив цифр, массив латинских букв и массив прочих символов. Отобразить полученные массивы.

Рассмотрим особенности работы с двумерным массивом.

Напишем программу, которая копирует четные числа из одномерного массива в двумерный и затем выводит их на экран в квадрат со стороной равной 3.

<добавить необходимые объявления >

Dim Mas(8) As Integer, Mas1(2, 2) As Integer

‘Заполняем одномерный массив

For k=0 to 8

Mas(k)=2*k

Next k

‘Копируем полученные числа в двумерный массив

For i=0 To 2

For j=0 To 2

k=3*i + j

Mas1(i,j)=mas(k)

Next j

Next i

‘Получили нужный массив, теперь выведем его на экран

For i=0 To 2

VisMas=”“

For j=0 To 2

VisMas=VisMas & “ “ & Mas1(i,j)

Next j

ListBox1. Items. Add( VisMas)

Next i

Как выполняется эта программа? Сначала создается одномерный массив Mas четных чисел. В этом массиве элементы нумеруются индексом k, который принимает значения от 0 до 8. Обратите внимание на то, как “связаны” пара индексов i и j, которые указывают место элемента в двумерном массиве, с индексом k. Формула k=3*i+j позволяет для каждой пары значений i и j, меняющихся от 0 до 2 получить единственное значение k, которое меняется от 0 до 8. При такой зависимости перечисление элементов двумерного массива происходит по строкам. Здесь мы применили двойной цикл. Параметр внешнего цикла i используется для нумерации строк, а параметр внутреннего цикла j - для нумерации столбцов. При первом входе в цикл параметр i принимает значение 0 и выполняется внутренний цикл, т.е. параметр j пробегает значения от 0 до 2, и создаются элементы массива Mas1(0,0), Mas1(0,1), Mas1(0,2), затем параметр внешнего цикла i принимает значение 1, а параметр j снова пробегает все значения от 0 до 2, создаются элементы Mas1(1,0), Mas(1,1), Mas(1,2) и т.д. пока значение параметра i не станет равным 3.

Скопируйте эту программу и проанализируйте результат ее работы. Обратите внимание на то, как получено табличное представление двумерного массива. Модифицируйте программу на случай, когда двумерный массив имеет произвольный размер (nxn).

Как было сказано выше, при работе с массивами удобно использовать вычисляемый цикл, для одномерных массивов – одинарный, а для двумерных – двойной, если обрабатываются все элементы массива. Если же в двумерном массиве обрабатываются только элементы строки (столбца), то используется одномерный массив, т.к. один из индексов в этом случае не изменяется.

Задание 3. Создать двумерный массив (nxn). Найти сумму элементов произвольной строки, произвольного столбца, обеих диагоналей. Отобразить массив с помощью списка.

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

Задаем строковую переменную определенной длины (максимальное количество символов на представление числа плюс 1 на пробел) –

Dim st As String*5 'Задаем строковую переменную определенной длины (максимальное

‘ количество символов на представление числа плюс 1 на пробел)

Rset st=str(Mas(I,j)) ‘выравниваем по правому краю очередной элемент

Vismas=vismas & st ‘ формируем строку таблицы.

Для автоматического (т.е. во время выполнения программы) создания массива объектов необходимо свойству Index соответствующего объекта присвоить значение 0 . Очередной элемент массива создается с помощью события Load и делается видимым, например,

Load Command1(1)

Command1(1).Visible =true

Так создается вторая командная кнопка (первая - с индексом 0 -уже создана при разработке формы!). Для каждого вновь создаваемого объекта из массива объектов необходимо указать его место на форме, при этом можно воспользоваться координатами и размерами исходного объекта (с индексом 0).

Можно создать массив объектов на этапе проектирования. Для этого достаточно каждому вновь помещаемому на форму объекту присваиваить одно и то же имя.Этот способ иногда приводит к неумышленному созданию массива объектов.

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

Задание 4. Создать массив объектов “Текстовое окно”. Отобразить в нем массив, построенный в предыдущем задании.

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

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

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

Dim Dinmas() As Integer,

Dim Dinmas1(,) As Integer.

В нужном месте программы помещают оператор ReDim. Его синтаксис таков:

ReDim [Preserve] <имя массива>(<индексное выражение>)

Оператор ReDim отличается от оператора Dim только служебным словом Preserve, которое можно опустить. Если оно отсутствует, то массив создается заново, т.е. при переопределении массива в этом случае прежнее содержимое массива уничтожается. Если служебное слово Preserve включено в оператор ReDim, то содержимое массива сохраняется, если при этом новый размер массива меньше, то “лишние“ элементы отбрасываются.

Задание 5. Модифицировать программу задания 4 лабораторной работы N 7 следующим образом:

числа помещаются в динамический массив,

находится минимальное число,

числа сортируются по возрастанию

находится максимальное число.

Задание 6. Квадрат называется магическим, если сумма элементов любого столбца, любой строки и любой диагонали равна одному и тому же числу.

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

Указание. Использовать динамический массив.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]