Как создать массив в c windows forms

Обновлено: 07.07.2024

Массивы – это структура данных, представляющая собой набор переменных одинакового типа, имеющих общее имя.

Каждый элемент массива однозначно определяется именем и индексом (номером элемента в массиве). Индексы массива принадлежат целочисленному типу.

Все элементы массива имеют одинаковый тип.

Используются при работе с таблицами и списками.

Массив может быть:

В статическом массиве размеры массива (верхний индекс элементов) задаются при объявлении массива (размеры известны до компиляции программы).

тип[ ] ИмяМассива = new тип [размер];

тип [ , ] ИмяМассива = new тип [количество строк, количество столбцов];

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

// using – раздел объявления модулей;

namespace WindowsFormsApplication1 //пространство имен приложения

public partial class Form1 : Form // объявление класса

public Form1() // объявление формы1

InitializeComponent(); // объявление компонент на форме

// глобальное объявление массивов

int[] А = new int[5]; // одномерный массив А из 5 целых чисел

double[,] M = new double[2, 3]; // двумерный массив M[2х3]

double[] F = < 1.5, 2.1, 3.65, 4.7, 5.14, 6.36 >; // F[6] из 6 вещественных чисел

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

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

private void button1_Click(object sender, EventArgs e)

// инициализация элементов массива A, объявленного глобально

A[1] = 5; A[2] = 6; A[3] = 0; A[4] = -5; A[5] = -10;

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

private void button2_Click(object sender, EventArgs e)

int[] B = new int[10]; // массив B объявлен локально

for (int k = 0; k <= 4; k++) // с инициализацией элементов


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

private void button1_Click(object sender, EventArgs e)

int size = int.Parse(textBox1.Text); //Задание верхней границы массива

int [] H = new int[size];

20.1 Операции с массивами в Windows-приложениях

- вывод/ввод элементов массива;

- поиск максимального или минимального элемента массива;

- поиск заданного элемента массива;

Ввод/Вывод массивоввWindows-приложениях

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

Пример. Форма разделена условно на две части – для ввода и вывода массива.

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

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




В нижней части отображается введенный массив в форме, удобной для восприятия пользователя. Для этого пригодны элементы: ListBox, CheckedListBox, ComboBox. Как только вводится очередной элемент, он немедленно отображается во всех объектах.

Три объекта вывода элементов массива приведены для демонстрации, реально их всех отображать не нужно. Компонент выбирается по желанию пользователя.

Ярким примером ссылочного типа данных являются массивы (как объекты!).

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

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

Важно! Если массив только объявляется, но явно не инициализируется, каждый его элемент будет установлен в значение, принятое по умолчанию для соответствующего типа данных (например, элементы массива типа bool будут устанавливаться в false, а элементы массива типа int — в 0). В примере, если мы удалим строки с инициализацией, будет напечатано пять нулей.

Примечание. Такие же действия с полями экземпляра структуры выполняет конструктор по умолчанию (без параметров).

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

Для обращения к элементам массива используются индексы . Индекс представляет номер элемента в массиве, при этом нумерация начинается с нуля, поэтому индекс первого элемента будет равен 0. А чтобы обратиться к пятому элементу в массиве, нам надо использовать индекс 4, к примеру: myArr[4] .

Инициализация массива

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

Для этого необходимо перечислить включаемые в массив элементы в фигурных скобках < >. Такой синтаксис удобен при создании массива известного размера, когда нужно быстро задать его начальные значения:

1) инициализация массива с использованием ключевого слова new:
int[] m1 = new int[] ;

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

Кроме того, применять ключевое слово new не обязательно (как при создании массива m2).

Неявно типизированные массивы

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

Определение массива объектов

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

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

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

Обратите внимание на четвертый тип цикла foreach (object me in arrByObject). Легко запомнить: Для каждого (for each) объекта с именем me, входящего в (in) массив arrByObject (учите английский!). На печать выводится как сам объект (элемент массива объектов), так и тип этого объекта (метод GetType(), присущий всем объектам класса Object, от которого наследуются все типы).

Свойство Length

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

Вставим в предыдущем примере перед Console.ReadKey() оператор
Console.WriteLine(arrByObject.Length);
Будет напечатано значение, равное 4 (число объектов в массиве). Чаще всего оно используется для задания числа элементов массива в цикле for<>.

Многомерные массивы

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

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

Обратите особое внимание на способ объявления двумерного массива. Схематическое представление массива myArr[,] показано ниже:

38

Заметим, что в программе используется еще один объект – ran, принадлежащий к классу Random, метод которого (функция Next() ) возвращает целое число в заданном диапазоне (1,15).

Инициализация многомерных массивов

Первое значение в каждом ряду сохраняется на первой позиции в массиве, второе значение — на второй позиции и т.д.

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

Ниже в качестве примера приведена общая форма инициализации двумерного массива (4 строки, 2 столбца):

Перейдем к рассмотрению примеров решения задач, где применяются массивы и циклы.

Требуется найти сумму и произведение N элементов массива, используя три варианта циклов (for, while, do-while).
Решение. В классе Program объявим статический массив действительных чисел a[1000] и 7 методов (кроме Main()), ввод исходных данных и вычисление сумм и произведений с использованием трех типов циклов.

Тогда наша программа может быть написана так:

Часто в задачах нужно ввести числа или другие данные в двумерный массив (матрицу) и иметь возможность их обрабатывать.

Содержание

Поиск на других ресурсах:

Условие задачи

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

Также есть возможность сохранения результирующей матрицы в текстовом файле “ Res_Matrix.txt ”.

Выполнение

1. Запуск Microsoft Visual Studio . Создание проекта

Подробный пример запуска Microsoft Visual Studio и создания приложения по шаблону Windows Forms Application описывается в теме:

Сохранить проект под любым именем.

2. Создание главной формы Form1

Создать форму, как показано на рисунке 1.

Разместить на форме элементы управления следующих типов:

  • четыре элемента управления типа Button . Автоматически будут созданы четыре объекта (переменные) с именами button1 , button2 , button3 , button4 ;
  • три элемента управления типа Label с именами label1 , label2 , label3 ;
  • один элемент управления типа TextBox , доступ к которому можно получить по имени textBox1 .

Сформировать свойства элементов управления типа Button и Label:

Для настройки вида и поведения формы нужно выполнить следующие действия:

  • установить название формы. Для этого свойство Text = “ Произведение матриц ”;
  • свойство StartPosition = “ CenterScreen ” (форма размещается по центру экрана);
  • свойство MaximizeBox = “ false ” (убрать кнопку развертывания на весь экран).

3. Создание второстепенной формы Form2

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

Добавить новую форму к приложению, вызвав команду

В открывшемся окне выбрать « Windows Form ». Имя файла оставить без изменений « Form2.cs ».

Разместить на форме в любом месте элемент управления типа Button (рис. 2). В результате будет получен объект с именем button1.

В элементе управления button1 нужно установить следующие свойства:

  • свойство Text = “ OK ”;
  • свойство DialogResult = “ OK ” (рис. 3). Это означает, что при нажатии (клике «мышкой») на button1, окно закроется с кодом возвращения равным “ OK ”;
  • свойство Modifiers = “Public”. Это означает, что кнопка button1 будет видимой из других модулей (из формы Form1).

Настроить свойства формы Form2:

  • свойство Text = “ Ввод матрицы ”;
  • свойство StartPosition = “CenterScreen” (форма размещается по центру экрана);
  • свойство MaximizeBox = “false” (убрать кнопку развертывания на весь экран).

4. Ввод внутренних переменных

Следующий шаг – введение внутренних переменных в текст модуля “ Form1.cs ”.

Для этого сначала нужно активировать модуль “ Form1.cs ”.

В тексте модуля “ Form1.cs ” добавляем следующий код:

Объясним некоторые значения переменных:

  • Max – максимально-допустимая размерность матрицы;
  • n – размерность матрицы, введенная пользователем из клавиатуры в элементе управления TextBox1;
  • MatrText – двумерная матрица элементов управления типа TextBox. В эту матрицу будут вводиться элементы матрицы в виде строк. Ввод данных будет формироваться в форме Form2;
  • Matr1, Matr2 – матрицы элементов типа double, в которые будут копироваться данные из матрицы MatrText;
  • Matr3 – результирующая матрица, которая равная произведению матриц Matr1 и Matr2;
  • f1, f2 – переменные, определяющие были ли введенные данные соответственно в матрицы Matr1 и Matr2;
  • dx, dy – габариты одной ячейки типа TextBox в матрице MatrText;
  • form2 – объект класса формы Form2, по которыму будет получен доступ к этой форме.

5. Программирование события Load формы Form1

Листинг обработчика события Load формы Form1 следующий:

Объясним некоторые фрагменты кода в методе Form1_Load().

Событие Load генерируется (вызывается) в момент загрузки любой формы. Поскольку форма Form1 есть главной формой приложения, то событие Load формы Form1 будет вызываться сразу после запуска приложения на выполнение. Поэтому, здесь целесообразно ввести начальную инициализацию глобальных элементов управления и внутренних переменных программы. Эти элементы управления могут быть вызваны из других методов класса.

В обработчике события Form1_Load() выделяется память для двумерной матрицы строк MatrText один лишь раз. При завершении приложения эта память будет автоматически освобождена.

Память выделяется в два этапа:

  • для самой матрицы MatrText – как двумерного массива;
  • для каждого элемента матрицы, который есть сложным объектом типа TextBox.

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

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

6. Разработка дополнительного метода обнуления данных в матрице MatrText

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

Листинг метода Clear_MatText() следующий:

7. Программирование события клика на кнопке button1 (« Ввод матрицы 1 … »)

При нажатии (клике) на button1 должно вызываться окно ввода новой матрицы. Размер матрицы зависит от значения n .

Листинг обработчика события клика на кнопке button1 следующий:

В вышеприведенном листинге читается значение n . После этого осуществляется настройка ячеек матрицы строк MatrText.

На основе введенного значения n формируются размеры формы form2 и позиция кнопки button1.

Если в форме Form2 пользователь нажал на кнопке OK (button2), то строки с MatrText переносятся в двумерную матрицу вещественных чисел Matr1. Преобразование из строки в соответствующее вещественное число выполняется методом Parse() из класса Double.

Также формируется переменная f1, которая указывает что данные в матрицу Matr1 внесены.

Листинг обработчика события клика на кнопке button2 подобен листингу обработчика события клика на кнопке button1. Только он отличается шагами 7-8. На этом участке формируются матрица Matr2 и переменная f2.

9. Программирование события Leave потери фокуса ввода элементом управления textBox1

В приложении может возникнуть ситуация, когда пользователь изменяет значение n на новое. В этом случае должны заново формироваться флажки f1 и f2. Также изменяется размер матрицы MatrText, которая выводится в форме Form2.

Изменение значения n можно проконтролировать с помощью события Leave элемента управление textBox1. Событие Leave генерируется в момент потери фокуса ввода элементом управления textBox1 (рис. 4).

Листинг обработчика события Leave следующий:

10. Программирование события клика на кнопке button3 (« Результат »)

Вывод результата будет осуществляться в ту же форму, в которой вводились матрицы Matr1 и Matr2. Сначала произведение этих матриц будет сформировано в матрице Matr3. Потом значение с Matr3 переносится в MatrText и отображается на форме Form2.

Листинг обработчика события клика на кнопке button3.

11. Программирование события клика на кнопке button4 (« Сохранить в файле «Res_Matr.txt” ”)

Для сохранения результирующей матрицы Matr3 можно использовать возможности класса FileStream.

Класс FileStream описан в модуле System.IO . Поэтому в начале приложения нужно добавить следующий код:

Листинг обработчика события клика на кнопке button4 следующий:

12. Запуск приложения на выполнение

После этого можно запускать приложение на выполнение и тестировать его работу.

Исходный код примеров из этой статьи можете скачать из нашего github-репозитория.

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

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

Для объявления массива, после указания типа его элементов, ставятся квадратные скобки:

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

Либо после объявления:

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

Если попытаться вывести элементы массива na1 :

то приложение не будет собрано, т.к. массив предварительно нужно проинициализировать.

Инициализация массивов

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

После объявления массива значения элементам присваиваются через индекс:

Есть возможность задать конкретные значения в момент объявления с использованием ключевого слова new и указанием типа:

Либо без ключевого слова new:

Неявная типизация

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

Либо предоставить возможность “поработать” системе вывода типов:

Доступ к элементам массива. Обход элементов массива.

Как уже было сказано выше, за доступ к элементам массива отвечают числовые индексы:

При этом, если вы укажете индекс больше, чем максимально возможный, то будет выброшено исключение:

Приведенная выше строка приведет к выбросу следующего исключения:

Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array .

Обход элементов массива можно производить с помощью циклов for , foreach и while , последний самый неудобный для работы с массивами, его мы рассматривать не будем. Если вы работаете с циклом for , то для указания верхней границы инкрементируемой переменной можно воспользоваться свойством Length у массива:

Более удобным для обхода элементов будет foreach :

Преимущество цикла for состоит в том, что в нем вы можете модифицировать элементы массива:

Передача массива в метод

Создадим метода WorkWithArray , который изменяет содержимое массива:

Вызовем его в методе Main :

Ниже приведена иллюстрация того, как массив и ссылки на него располагаются в памяти.

Переменные na5 в методе Main и arr в методе WorkWithArray ссылаются на одну и ту же область памяти в куче, поэтому изменение массива через переменную arr отражается на переменной na5 .

Многомерные массивы

Прямоугольные массивы

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

Рассмотрим на примерах работу с такими массивами:

Зубчатые массивы

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

Класс System.Array

Свойства класса System.Array

Имя свойства

Назначение

Число элементов в массиве. Учитываются все измерения.

Методы класса System.Array

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

Имя метода

Назначение

BinarySearch(Array, Object)*

Выполняет поиск элемента в массиве.

Clear(Array, Int32, Int32)

Присваивает значение по умолчанию определенному количеству элементов массива начиная с заданного индекса.

Создает копию массива (неполную).

Copy(Array, Array, Int32)*

Копирует данные из одного массива в другой в заданном количестве.

CopyTo(Array, Int32)*

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

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

GetValue(Int32)*

Возвращает значение по указанному индексу.

IndexOf(Array, Object)*

Возвращает индекс первого вхождения элемента в массиве.

Reverse(Array)*

Задает обратный порядок для элементов в массиве.

Сортирует элементы массива.

Для вывода содержимого массива в консоль создадим метод PrintArray :

Ниже приведены примеры использования представленных выше методов и свойств класса System.Array :

Исходный код примеров из этой статьи можете скачать из нашего github-репозитория.

Читайте также: