Как сделать массив в обратном порядке c

Обновлено: 07.07.2024

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

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

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

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

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

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

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

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

Например, для указанного выше a3 – это будут нули, так как для типа int значение по умолчанию: 0;

Если попытаться вывести элементы массива 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)*

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

Exists (T[], Predicate )

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

GetValue(Int32)*

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

IndexOf(Array, Object)*

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

Reverse(Array)*

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

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

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

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

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

Пользователь помещает неизвестное количество целых чисел в массив (динамический). Программа должна выводить эти числа в обратном порядке, например:
Целые числа в обратном порядке.
Exmp. 324,12,5987 -> 423, 21, 7895
Exmp. 123, 100 -> 321, 1 (два 0 удаляются)

Вот мой код на данный момент:

Решение

Вот segmentation fault происходит как count не инициализируется.
Я нашел много ошибок в вашей программе, например:

Лучше использовать функцию, чтобы изменить каждое число a[i] ,

И вы можете сделать так:

Или вы можете просто сделать это так:

Еще один способ сделать это, сначала сделать каждый номер int to string сначала, а потом reverse Это.

Другие решения

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

В любом случае, заглядывая в ваш код глубже: кажется, что после того, как вы вычислили count содержание переменной a[i] был уничтожен … ( a[i]==0 выйти из while петля).

Пользователь помещает неизвестное количество целых чисел в массив (динамический). Программа должна выводить эти числа в обратном порядке, например: Целые числа в обратном порядке. Exmp. 324,12,5987 -> 423, 21, 7895 Exmp. 123, 100 -> 321, 1 (два нуля удаляются)

Вот мой код на данный момент:

2 ответа

Здесь segmentation fault встречается, поскольку count не инициализирован. Я обнаружил в вашей программе много ошибок, например:

Лучше использовать функцию для переворота каждого числа a[i] .

А сделать можно так:

Или вы можете просто сделать это так:

Другой способ сделать это: сначала сделать каждое число сначала int to string , а затем reverse .

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

В любом случае, если посмотреть глубже в свой код: кажется, что после того, как вы вычислили count , содержимое переменной a[i] было уничтожено . ( a[i]==0 для выхода из > цикл).

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

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

Синтаксис

Пример

Давайте перевернем массив:

Результат выполнения кода:

Пример

А теперь давайте запишем перевернутый массив в новую переменную:

Результат выполнения кода:

Пример . Применение

Давайте перевернем символы строки в обратном порядке. Для этого разобьем строку в массив с помощью split по разделителю '' (этот разделитель положит каждый символ строки в отдельный элемент массива), перевернем этот массив с помощью reverse и затем сольем перевернутый массив обратно с помощью join :

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