Создать двумерный массив вывести на экран visual studio
Ярким примером ссылочного типа данных являются массивы (как объекты!).
Объявление массивов
Для того чтобы воспользоваться массивом в программе, требуется двухэтапная процедура. Во-первых, необходимо объявить переменную, которая может обращаться к массиву. И во-вторых, нужно создать экземпляр массива (объект), используя оператор 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[,] показано ниже:
Заметим, что в программе используется еще один объект – 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. Запуск приложения на выполнение
После этого можно запускать приложение на выполнение и тестировать его работу.
Элементы массива могут быть любого типа данных, даже массива!
Многомерные массивы
Массив массивов называется многомерным массивом:
int array [ 2 ] [ 4 ] ; // 2-элементный массив из 4-элементных массивовПоскольку у нас есть 2 индекса, то это двумерный массив.
В двумерном массиве первый (левый) индекс принято читать как количество строк, а второй (правый) как количество столбцов. Массив выше можно представить следующим образом:
[0][0] [0][1] [0][2] [0][3] // строка №0
[1][0] [1][1] [1][2] [1][3] // строка №1
Чтобы получить доступ к элементам двумерного массива, просто используйте два индекса:
Инициализация двумерных массивов
Для инициализации двумерного массива проще всего использовать вложенные фигурные скобки, где каждый набор значений соответствует определенной строке:
Хотя некоторые компиляторы могут позволить вам упустить внутренние фигурные скобки, все же рекомендуется указывать их в любом случае: улучшается читабельность и уменьшается вероятность получения незапланированных нулевых элементов массива из-за того, что C++ заменяет отсутствующие инициализаторы значением 0 :
В двумерном массиве со списком инициализаторов можно не указывать только левый индекс (длину массива):
Компилятор может сам вычислить количество строк в массиве. Однако не указывать два индекса — это уже ошибка:
Подобно обычным массивам, многомерные массивы можно инициализировать значением 0 следующим образом:
Обратите внимание, это работает только в том случае, если вы явно объявляете длину массива (указываете левый индекс)! В противном случае, вы получите двумерный массив с 1 строкой.
Доступ к элементам в двумерном массиве
Для доступа ко всем элементам двумерного массива требуется два цикла: один для строк и один для столбцов. Поскольку доступ к двумерным массивам обычно выполняется по строкам, то левый индекс используется в качестве внешнего цикла:
for ( int row = 0 ; row < numRows ; ++ row ) // доступ по строкам for ( int col = 0 ; col < numCols ; ++ col ) // доступ к каждому элементу в строкеМногомерные массивы более двух измерений
Многомерные массивы могут быть более двух измерений. Например, объявление трехмерного массива:
Трехмерные массивы трудно инициализировать любым интуитивным способом с использованием списка инициализаторов, поэтому лучше инициализировать весь массив значением 0 и явно присваивать элементам значения с помощью вложенных циклов.
Доступ к элементам трехмерного массива осуществляется так же, как и к элементам двумерного массива:
Пример двумерного массива
Рассмотрим пример использования двумерного массива:
Эта программа вычисляет и выводит таблицу умножения от 1 до 9 (включительно). Обратите внимание, при выводе таблицы в цикле for мы начинаем с 1 вместо 0. Это делается с целью предотвращения вывода нулевой строки и нулевого столбца, содержащих одни нули!
Результат выполнения программы:
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
Двумерные массивы обычно используются в играх типа tile-based, где каждый элемент массива представляет собой один фрагмент/плитку. Они также используются в компьютерной 3D-графике (в виде матриц) для вращения, масштабирования и отражения фигур.
Подоспела очередная порция задач по информатике для школьников. На этот раз рассмотрим работу с двухмерными массивами на C++. Эти задачи достаточно интересные. И большая часть из них мне понравилась.
Задача №1
Найдите индексы первого вхождения максимального элемента.
Формат входных данных
Программа получает на вход размеры массива n и m, затем n строк по m чисел в каждой. n и m не превышают 100.
Формат выходных данных
Выведите два числа: номер строки и номер столбца, в которых стоит наибольший элемент в двумерном массиве. Если таких элементов несколько, то выводится тот, у которого меньше номер строки, а если номера строк равны то тот, у которого меньше номер столбца.
Решение
Задача №2
Дано нечетное число n, не превосходящее 15. Создайте двумерный массив из n×n элементов, заполнив его символами "." (каждый элемент массива является строкой из одного символа). Затем заполните символами "*" среднюю строку массива, средний столбец массива, главную диагональ и побочную диагональ. В результате "*" в массиве должны образовывать изображение звездочки. Выведите полученный массив на экран, разделяя элементы массива пробелами.
Решение
Задача №3
Дано число n, не превышающее 100. Создайте массив размером n×n и заполните его по следующему правилу. На главной диагонали должны быть записаны числа 0. На двух диагоналях, прилегающих к главной, числа 1. На следующих двух диагоналях числа 2, и т.д.
Решение
Задача №4
Дан двумерный массив и два числа: i и j. Поменяйте в массиве столбцы с номерами i и j.
Формат входных данных
Программа получает на вход размеры массива n и m, не превосходящие 100, затем элементы массива, затем числа i и j.
Формат выходных данных
Выведите результат.
Решение
Задача №5
Дано число n, не превосходящее 10, и массив размером n × n. Проверьте, является ли этот массив симметричным относительно главной диагонали. Выведите слово “YES”, если массив симметричный, и слово “NO” в противном случае.
Решение
Задача №6
Дан квадратный двумерный массив размером n × n и число k. Выведите элементы k-й по счету диагонали ниже главной диагонали (т.е. если k = 1, то нужно вывести элементы первой диагонали, лежащей ниже главной, если k = 2, то второй диагонали и т.д.).
Значение k может быть отрицательным, например, если k = −1, то нужно вывести значение первой диагонали лежащей выше главной. Если k = 0, то нужно вывести элементы главной диагонали.
Программа получает на вход число n, не превосходящие 10, затем массив размером n × n, затем число k.
Решение
Задача №7
Дан двумерный массив размером n×m (n и m не превосходят 1000). Симметричный ему относительно главной диагонали массив называется транспонированным к данному. Он имеет размеры m×n: строки исходного массива становятся столбцами транспонированного, столбцы исходного массива становятся строками транспонированного.
Для данного массива постройте транспонированный массив и выведите его на экран.
Решение
Задача №8
В кинотеатре n рядов по m мест в каждом (n и m не превосходят 20). В двумерном массиве хранится информация о проданных билетах, число 1 означает, что билет на данное место уже продан, число 0 означает, что место свободно. Поступил запрос на продажу k билетов на соседние места в одном ряду. Определите, можно ли выполнить такой запрос.
Формат входных данных
Программа получает на вход числа n и m. Далее идет n строк, содержащих m чисел (0 или 1), разделенных пробелами. Затем дано число k.
Формат выходных данных
Программа должна вывести номер ряда, в котором есть k подряд идущих свободных мест. Если таких рядов несколько, то выведите номер наименьшего подходящего ряда. Если подходящего ряда нет, выведите число 0.
Решение
Задача №9
Дан прямоугольный массив размером n×m. Поверните его на 90 градусов по часовой стрелке, записав результат в новый массив размером m×n.
Формат входных данных
Вводятся два числа n и m, не превосходящие 100, затем массив размером n×m.
Формат выходных данных
Выведите получившийся массив. Числа при выводе разделяйте одним пробелом.
Решение
Задача №10
По данным числам n и m заполните двумерный массив размером n×m числами от 1 до n×m “змейкой”, как показано в примере.
Формат входных данных
Вводятся два числа n и m, каждое из которых не превышает 20.
Формат выходных данных
Выведите полученный массив, отводя на вывод каждого элемента ровно 4 символа.
Решение
Задача №11
По данным числам n и m заполните двумерный массив размером n×m числами от 1 до n×m “диагоналями”, как показано в примере.
Формат входных данных
Вводятся два числа n и m, не превышающие 100.
Формат выходных данных
Выведите полученный массив, отводя на вывод каждого элемента ровно 4 символа.
Решение
Задача №12
Даны числа n и m. Заполните массив размером n × m в шахматном порядке: клетки одного цвета заполнены нулями, а другого цвета - заполнены числами натурального ряда сверху вниз, слева направо. В левом верхнем углу записано число 1.
Формат входных данных
Вводятся два числа n и m, не превышающие 100.
Формат выходных данных
Выведите полученный массив, отводя на вывод каждого элемента ровно 4 символа.
Решение
Задача №13
По данным числам n и m заполните двумерный массив размером n×m числами от 1 до n×m по спирали, выходящей из левого верхнего угла и закрученной по часовой стрелке, как показано в примере.
Формат входных данных
Вводятся два числа n и m, не превышающие 100.
Формат выходных данных
Выведите полученный массив, отводя на вывод каждого элемента ровно 4 символа.
Читайте также: