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

Как сделать вещественный массив

  • автор:

Как сделать вещественный массив

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

Особенностью массивов в C# относительно языков C/C++ является то, что память под них всегда выделяется динамически . Это объясняется тем, что любой массив является наследником класса Array.

Вначале рассмотрим работу с одномерным массивом, затем рассмотрим приёмы работы с двухмерными и многомерными массивами.

Одномерные массивы

Одномерный массив — это массив, имеющий одно измерение.

Прежде чем начать работать с массивом, необходимо создать ссылку на объект:

Затем выделяется память под заданное количество элементов массива:

имя_массива = new тип_элементов [ количество_элементов ];

После этого с массивом можно выполнять какие-либо действия.

Например, создадим массив из 5 вещественных чисел:

Две рассмотренные выше операции можно объединить:

double [] x = new double[5];

Как и простую переменную, массив можно инициализировать , т.е. задать элементам массива начальные значения (пусть это будут числа 4,5,3,2,1 ):

double []x = new double[5] ;

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

Полученную запись можно упростить:

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

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

К стати. А как система отреагирует вот на такую запись:

Оказывается, совершенно спокойно. Точно так же её вполне устроит и такое:

double []x = new double[0];

Массив из нуль чисел — это тоже массив. Создать его можно, а вот обращаться к данным этого массива не получится. Отрицательное же количество элементов оценивается как ошибочное. Ни создать такой массив, и тем более работать с ним не выйдет. Компилятор сразу выдаст ошибку.

Дальнейшая работа с массивом ведётся так же, как обычно это было в C/C++. После выхода из блока, в котором был создан массив, выделенная под массив память освобождается «сборщиком мусора». Но происходит это не сразу, а тогда, когда система посчитает нужным это сделать. В большинстве случает это не имеет для программиста ни какого значения.

Пример . Дан массив из n действительных чисел. Вычесть из каждого элемента массива среднее значение массива. Распечатать полученный массив.

Возможный вариант решения:

public static void Main(string[] args)

double []x = new double[5];

int i, n = x.Length;

Console.WriteLine(«Задайте вещественных чисел:», n);

s /= n; // это среднее значение

Console.WriteLine(«Массив после обработки:»);

foreach(double r in x)

Console.Write(«Press any key to continue . . . «);

Двумерные массивы (матрицы)

Двумерный массив имеет два измерения. Работа с матрицей, как и работа с одномерным массивом, начинается с создания ссылки на матрицу с последующим выделением памяти. Также возможна инициализация элементов матрицы. Пусть требуется создать матрицу действительных чисел A[2×3] . Рассмотрим варианты работы.

1)Создание ссылки на матрицу и выделение памяти:

double [,]a = new double[2, 3];

2)Создаём ссылку на матрицу, выделяем память и одновременно инициализируем элементы матрицы:

Как видим, каждую строку берём в свой блок, в остальном всё делается так же, как и для одномерного массива.

То же самое можно записать по аналогии с одномерным массивом ещё проще:

Пример . Пронормировать матрицу действительных чисел A[2×3] , т.е. каждый элемент матрицы поделить на максимальное по модулю число.

Возможный вариант решения:

public static void Main(string[] args)

double [,]a = new double[n, m];

Console.WriteLine(«Задайте матрицу A[*]:», n , m);

a[i, j] = double.Parse(Console.ReadLine());

double max = Math.Abs(a[0, 0]);

if(Math.Abs(a[i, j]) > max)

max = Math.Abs(a[i, j]);

Console.WriteLine(«Mатрица A[*] после нормирования:», n , m);

Console.Write(«Press any key to continue . . . «);

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

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

Пример описания трёхмерного массива:

double [,,]V = new double[2, 3, 3];

Здесь выделяется память под массив, который можно представить состоящим из двух таблиц размером 3 x3 .

Пример инициализации трёхмерного массива:

double [,,]V = new double[2, 3, 3]

А ещё проще инициализировать так:

Дальнейшая работа с многомерными массивами ведётся как и с матрицами, только индексов больше и, как правило, возрастает вложенность циклов.

Стандартные методы и свойства для работы с массивами

Все массивы, как было сказано ранее, являются наследниками класса Array . Благодаря этому при работе с массивами имеется большое количество готовых методов и свойств. Рассмотрим некоторые из них. Во всех примерах x — одномерный массив, a — матрица.

1) Length — возвращает количество элементов в массиве. Обычно используется в циклах, например:

2) Rank — возвращает размерность массива. Пример:

1) Sort() — сортировка массива. Метод многократно перегружен. Примеры использования:

сортируем весь массив по возрастанию:

начиная с i-го элемента, упорядывачиваем k элементов массива (у нас: сортируем 3 элемента, начиная с 2-го):

2) Reverse() — изменяем порядок следования элементов массива на обратный:

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

Array.Reverse(x, 0, 3);

3) BinarySearch() — поиск в упорядоченном массиве индекса элемента, равного заданному значению. Если поиск не увенчался успехом, то ответом будет отрицательное число. Пример:

int j = Array.BinarySearch(x, t);

4) IndexOf() — поиск первого вхождения в массиве заданного значения, например, поиск положения числа 4 в массиве x . Если в массиве нет такого значения, то ответом будет отрицательное число.

int j = Array.IndexOf(x,4);

5) LastIndexOf() — поиск последнего вхождения в массиве заданного значения, например, поиск положения числа 4 в массиве x . Если в массиве нет такого значения, то ответом будет отрицательное число.

int j = Array.LastIndexOf(x,4);

6) GetLength() — получение количества элементов по данной размерности. Размерности нумеруются с 0 . Таким образом, для двумерного массива ввод массива действительных чисел с клавиатуры можно записать:

a[i, j] = double.Parse(Console.ReadLine());

Как задать массив с целыми и вещественными числами?

Mrrl

Не bouble, а double.
В описании массива пишете
double *arr2;
а в инициализации —
arr2=new double[n];
Если поменять тип только в одном месте, будет ошибка.

Ответ написан более трёх лет назад
Нравится 1 4 комментария

Inessevanston

Эшли Эванстон @Inessevanston Автор вопроса
Как всегда часами тупить из-за опечатки >_<. Спасибо

AtomKrieg

Эшли Эванстон: поэтому обычно пишут double *arr2 = new double[n]; непосредственно перед местом использования. А то что у в начале наделано переменных это какой-то паскаль-стайл.

Mrrl

AtomKrieg: Так здесь по логике программы массив пересоздаётся много раз, удлинняясь при каждом введённом числе.

AtomKrieg

Ответы на вопрос 2

Olej

инженер, программист, преподаватель

Как задать массив, в который можно записать и целые и вещественные числа?
Пытаюсь поставить тип float или bouble,

1. массив, содержащий значения типов int & double создать нельзя! — C++ типизированный язык, и в массиве могут быть элементы только одного типа;
2. при инициализации массива double вы можете указать константы int, но они будут тут же преобразованы к типу double (но не наоборот);
3. если вы попробуете позже использовать такие загруженные значения как int — это не удасться, они уже преобразованы в double.

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать

Nipheris

Станислав Макаров @Nipheris Куратор тега C++
Как задать массив, в который можно записать и целые и вещественные числа?
boost::variant

Только сначала убедитесь, что вы понимаете, что делаете и чего хотите.

C++ типизированный язык, и в массиве могут быть элементы только одного типа;

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

Как сделать вещественный массив

Сообщение от nec117

Начал изучать язык Си. Пока что жуткие проблемы с синтаксисом, пытаюсь понять. Огромная просьба, помогите написать программу, которая создаёт массив вещественных чисел(положительных и отрицательных), а потом выводит сумму всех дробных частей положительных элементов этого массива. Заранее огромнейшее спасибо всем, кто поможет. ОЧень срочно нужно! Помогите..

ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение — плюс к премии. Выдал бан — лучший модератор месяца со всеми вытекающими.

alexinspir
Посмотреть профиль
Найти ещё сообщения от alexinspir

Создать двумерный массив из вещественных чисел с рандомными числами C#

у вас вопрос по работе кода, но код вы не показываете. Отредактируйте вопрос, добавьте код, в котором ошибки. Опишите какие ошибки в каких строках возникают.

18 мая 2021 в 21:53
У меня этот код работает. Что здесь не так?
18 мая 2021 в 22:14
он то работает, но вещественные числа не выходят типа 15,34
18 мая 2021 в 22:15

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

На самом деле числа вещественные, просто их надо отформатировать, типа «» , тогда вы увидите нули после запятой. Если вам нужны не нули, то это надо либо генерить целые до 10000, преобразовать в double и делить на 100, либо использовать NextDouble() .

double[,] a = new double[5, 10]; Random random = new Random(); for (int i = 0; i < 5; i++) < for (int j = 0; j < 10; j++) < a[i, j] = random.NextDouble() * 100; // NextDouble() дает случайное вещественное число в диапазоне от 0 до 1 Console.Write("", a[i, j]); > Console.WriteLine(); > 
 6,72 60,22 24,42 84,20 12,61 30,64 93,47 3,50 22,79 4,34 95,71 90,95 44,50 21,76 1,87 80,73 32,53 40,60 0,96 67,08 41,52 24,01 95,61 63,47 75,61 62,24 24,47 94,76 23,46 20,95 19,74 26,59 48,49 41,25 36,37 14,57 47,68 54,40 53,48 55,64 60,67 24,19 98,83 87,44 9,94 86,21 10,73 9,66 74,33 8,64 

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

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