Как сделать массив в обратном порядке c
Исходный код примеров из этой статьи можете скачать из нашего 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 :
Читайте также: