Перейти к содержимому

Как задать размер массива в си шарп

  • автор:

Изменить размер массива динамически

Вы подходите неправильно. Если вам нужно менять размер контейнера, вы должны вместо массива использовать List .

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

Отслеживать
ответ дан 27 окт 2016 в 11:54
206k 28 28 золотых знаков 293 293 серебряных знака 526 526 бронзовых знаков

В вашем примере управляемый массив. Напрямую — никак, только через аллокацию (выделение памяти) нового массива. Например есть метод Array.Resize, внутри он создает новый массив заданного размера, копирует в него содержимое старого массива и возвращает ссылку на новый массив.

Если очень сильно нужно изменить размер неуправляемого массива без аллокации нового — можно воспользоваться нативным классом (функция HeapReAlloc ) из моего вопроса: Инспекция класса для работы с HeapAlloc

Отслеживать
ответ дан 27 окт 2016 в 11:53
507 4 4 серебряных знака 16 16 бронзовых знаков

  • c#
  • массивы
  • динамические-массивы
    Важное на Мете
Связанные
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Задать размерность массива с клавиатуры

Как с клавиатуры ввести размерность матрицы и саму матрицу
как с клавиатуры ввести размерность матрицы ну а потом и саму матрицу

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

Какова максимальная размерность массива
Есть ли предел у числа n, одномерного массива? for (int i = 0; i < n; i++)

2441 / 1839 / 406

Регистрация: 15.12.2013

Сообщений: 8,224

Лучший ответ

Сообщение было отмечено Albertashko как решение

Решение

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace C1 { class Program { static void Main(string[] args) { int n; Console.WriteLine("Vvedute n"); n = Convert.ToInt32(Console.ReadLine()); int[] x = new int[n]; for (int i = 0; i  n; i++) { Console.WriteLine("Vvedute element massuva",i); x[i] = Convert.ToInt32(Console.ReadLine()); } Console.ReadLine(); } } }

87844 / 49110 / 22898

Массивы

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

Массив представляет собой совокупность переменных одного типа с общим для обращения к ним именем.
В C# массивы могут быть как одномерными, так и многомерными.
Массивы служат самым разным целям, поскольку они предоставляют удобные средства для объединения связанных вместе переменных.
Массивами в C# можно пользоваться практически так же, как и в других языках программирования.
Тем не менее, у них имеется одна особенность: они реализованы в виде объектов. Смотрите также заметку «Массивы. Класс System.Array».
Объединение данных возможно и в коллекции, об этом — в статье Класс ArrayList. Пример необобщенной коллекции

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

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

using System; namespace массивы < class Program < static void Main(string[] args) < // Объявляем массив int[] myArr = new int[5]; // Инициализируем каждый элемент myArr[0] = 2004; myArr[1] = 2005; myArr[2] = 2008; myArr[3] = 2008; myArr[4] = 2014; // вывод элементов массива foreach (int r in myArr) Console.WriteLine(r); Console.ReadKey(); >> >

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

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

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

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

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

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

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

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

2) инициализации строкового массива без использования слова new:
string[] m2 = < «Фамилия», «Имя», «Отчество» >;

3) используем ключевое слово new и желаемый размер массива символов:
char[] m3 = new char[4] < ‘Я’,’з’,’ы’,’к’ >;

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

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

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

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

using System; namespace массивы < class Program < static void Main(string[] args) < var m1 = new[] < 1, 2, 3 >; Console.WriteLine("Тип массива 1 - ", m1.GetType()); var m2 = new[] < "One", "Two", "Three" >; Console.WriteLine("Тип массива 2 - ", m2.GetType()); Console.ReadKey(); > > >

36

Результат:

Разумеется, как и при создании массива с использованием явного синтаксиса C#, элементы, указываемые в списке инициализации массива, должны обязательно иметь один и тот же базовый тип (т.е. должны все быть int, string или char). Обратите внимание на метод GetType(), позволяющий программным путем определять тип элементов массива.

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

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

Хотя на первый взгляд это выглядит довольно понятно, существует одна важная особенность. В основе каждого типа в системе типов .NET (в том числе фундаментальных типов данных) в конечном итоге лежит базовый класс System.Object.

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

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

using System; namespace массивы < class Program < static void Main(string[] args) < // Объявляем и инициализируем массив объектов object[] arrByObject = < true, 10, "Язык C#", 13.7>; // Выведем элемент тип каждого элемента массива foreach (object me in arrByObject) Console.WriteLine(" - ", me, me.GetType()); Console.ReadLine(); > > >

37

Результат:

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

Свойство Length

Реализация в C# массивов в виде объектов дает целый ряд преимуществ. Одно из них заключается в том, что с каждым массивом связано свойство Length, содержащее число элементов, из которых может состоять массив. Следовательно, у каждого массива имеется специальное свойство, позволяющее определить его длину.

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

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

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

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

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

using System; namespace массивы < class Program < static void Main(string[] args) < // Объявляем двумерный массив int[,] myArr = new int[4, 5]; Random ran = new Random(); // Инициализируем данный массив for (int i = 0; i < 4; i++) < for (int j = 0; j < 5; j++) < myArr[i, j] = ran.Next(1, 15); Console.Write("\t", myArr[i, j]); > Console.WriteLine(); > Console.ReadLine(); > > >

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

38

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

В C# допускаются массивы трех и более измерений. Ниже приведена общая форма объявления многомерного массива:
тип[,…,] имя_массива = new тип[размер1, размер2, … размеры];

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

Для инициализации многомерного массива достаточно заключить в фигурные скобки список инициализаторов каждого его размера:
тип[,] имя_массива =
,
< val, val, val, …, val>,

>;
где val обозначает инициализирующее значение, а каждый внутренний блок — отдельный ряд.

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

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

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

int[,] myArr = < , , , >;

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

Задача «Три цикла»

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

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

using System; namespace циклы < class Program < static double [] a= new double[1000]; static void Main(string[] args) < int n = InputA(); Console.WriteLine("сумма_F = ",sumF(n)); Console.WriteLine("сумма_W = ",sumW(n)); Console.WriteLine("сумма_D = ",sumD(n)); Console.WriteLine("произведение_F = ",multyF(n)); Console.WriteLine("произведение_W = ",multyW(n)); Console.WriteLine("произведение_D = ",multyD(n)); Console.ReadKey(); > // Ввод размерности и массива static int InputA() < int n; Console.Write("Ввести кол-во элементов:"); n = Convert.ToInt32(Console.ReadLine()); for (int i = 0; i < n; i++) < Console.Write("a[] http://c-sharp.pro/wp-content/uploads/2018/04/41.jpg"> 41

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

Оператор foreach

Последний пример иллюстрирует применение оператора foreach к массивам. Если есть необходимость выполнить некоторые действия со всеми элементами массивов, то этот оператор цикла будет самым кратким.

using System; namespace ConsoleApplication1 < class Program < static void Main(string[] args) < // Объявляем два массива int[] myArr = new int[5]; int[,] myTwoArr = new int[5, 6]; Random ran = new Random(); // Инициализируем массивы for (int i = 1; i // Вычисляем квадрат каждого элемента одномерного массива foreach (int f in myArr) Console.WriteLine(" в квадрате равно ", f, f*f); Console.WriteLine(); // Вычислим сумму элементов многомерного массива int sum = 0; foreach (int f2 in myTwoArr) sum += f2; Console.WriteLine("Сумма 2d массива: ", sum); Console.ReadLine(); > > >

42

Результат:

Задачи, предполагающие использование массивов и циклов, подробно рассмотрены в разделе «Примеры решения задач на тему «Массивы строки»»

Перейдем к рассмотрению объектов, относящихся к классу String (строка).

NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.

Массивы

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

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

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

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 < class Program < static void Main(string[] args) < // Объявляем массив int[] myArr = new int[5]; // Инициализируем каждый элемент массива вручную myArr[0] = 100; myArr[1] = 23; myArr[2] = 25; myArr[3] = 31; myArr[4] = 1; foreach (int i in myArr) Console.WriteLine(i); Console.ReadLine(); >> >

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

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

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

// Синтаксис инициализации массива с использованием // ключевого слова new int[] myArr = new int[] ; // Синтаксис инициализации массива без использования // ключевого слова new string[] info = < "Фамилия", "Имя", "Отчество" >; // Используем ключевое слово new и желаемый размер char[] symbol = new char[4] < 'X','Y','Z','M' >;

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

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

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

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 < class Program < static void Main(string[] args) < var arr1 = new[] < 1, 2, 3 >; Console.WriteLine("Тип массива arr1 - ",arr1.GetType()); var arr2 = new[] < "One", "Two", "Three" >; Console.WriteLine("Тип массива arr2 - ",arr2.GetType()); Console.ReadLine(); > > > 

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

Разумеется, как и при создании массива с использованием явного синтаксиса C#, элементы, указываемые в списке инициализации массива, должны обязательно иметь один и тот же базовый тип (т.е. должны все быть int, string или MyCar).

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

В большинстве случаев при определении массива тип элемента, содержащегося в массиве, указывается явно. Хотя на первый взгляд это выглядит довольно понятно, существует одна важная особенность. В основе каждого типа в системе типов .NET (в том числе фундаментальных типов данных) в конечном итоге лежит базовый класс System.Object. В результате получается, что в случае определения массива объектов находящиеся внутри него элементы могут представлять собой что угодно:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 < class Program < static void Main(string[] args) < // Объявляем и инициализируем массив объектов object[] arrByObject = < true, 10, "Привет", 13.7m >; // Выведем в консоль тип каждого члена массива foreach (object me in arrByObject) Console.WriteLine("Тип - ",me,me.GetType()); Console.ReadLine(); > > >

Массив объектов

Свойство Length

Реализация в C# массивов в виде объектов дает целый ряд преимуществ. Одно из них заключается в том, что с каждым массивом связано свойство Length, содержащее число элементов, из которых может состоять массив. Следовательно, у каждого массива имеется специальное свойство, позволяющее определить его длину.

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

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 < class Program < static void Main(string[] args) < int[] myArr = < 1, 2, 3, 4 >; for (int i = 0; i < myArr.Length; i++) Console.WriteLine(myArr[i]); Console.ReadLine(); >> >

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *