Обратное содержимое в массиве

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

Вывод: 10 9 8 7 6. Почему я не могу получить вторую половину номеров? Когда я удаляю "/2" из счета, на выходе выводят: 10 9 8 7 6 6 7 8 9 10

void reverse(int [], int);

int main ()
{
   const int SIZE = 10;
   int arr [SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

   reverse(arr, SIZE);
   return 0;
}
void reverse(int arr[], int count)
{
   int temp;
   for (int i = 0; i < count/2; ++i)
   {
      arr[i] = temp;
      temp = arr[count-i-1];
      arr[count-i-1] = arr[i];
      arr[i] = temp;

      cout << temp << " ";
   }
}

Ответ 1

Это будет мой подход:

#include <algorithm>
#include <iterator>

int main()
{
  const int SIZE = 10;
  int arr [SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  std::reverse(std::begin(arr), std::end(arr));
  ...
}

Ответ 2

Линия

arr[i] = temp;

неверно. (На первой итерации вашего цикла он устанавливает значение arr[i] в значение undefined, а дальнейшие итерации устанавливают его на неправильное значение.) Если вы удалите эту строку, ваш массив должен быть правильно изменен.

После этого вы должны переместить код, который печатает обратный массив, в новый цикл, который итерации по всему списку. Ваш текущий код печатает только первые count/2 элементы.

int temp, i;
for (i = 0; i < count/2; ++i) {
    temp = arr[count-i-1];
    arr[count-i-1] = arr[i];
    arr[i] = temp;
}
for (i = 0; i < count; ++i) {
    cout << arr[i] << " ";
}

Ответ 3

Оба ответа выглядят корректно для меня.

1) Первый arr[i] = temp; должен быть удален

2) Вы должны сделать второй цикл для печати элементов all, а не только половины массива. Цикл, который делает обратное, не нуждается в его печати. ​​

Ответ 4

Вы не печатаете массив, вы печатаете значение temp - это всего лишь половина массива...

Ответ 5

void reverse(int [], int);
void printarray(int [], int );
int main ()
{
    const int SIZE = 10;
    int arr [SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    cout<<"Before reverse\n";
    printarray(arr, SIZE);
    reverse(arr, SIZE);
    cout<<"After reverse\n";
    printarray(arr, SIZE);

    return 0;
}

void printarray(int arr[], int count)
{
    for(int i = 0; i < count; ++i)
        cout<<arr[i]<<' ';

    cout<<'\n';
}

void reverse(int arr[], int count)
{
   int temp;
   for (int i = 0; i < count/2; ++i)
   {
      temp = arr[i];
      arr[i] = arr[count-i-1];
      arr[count-i-1] = temp;
   }
}

Ответ 6

Решение этого вопроса очень просто: векторы

std::vector<int> vector;
for(int i = 0; i < 10;i++)
{
    vector.push_back(i);
}
std::reverse(vector.begin(), vector.end());

Voila! Вы сделали! =)

Сведения о решении:

Это наиболее эффективное решение: Swap не может поменять 3 значения, но, безусловно, может измениться. Не забудьте включить алгоритм. Это так просто, что скомпилированный код определенно не нужен.

Я думаю, что это решает проблему OP

Если вы считаете, что есть какие-либо ошибки и проблемы с этим решением, прокомментируйте ниже

Ответ 7

Как прямой ответ на ваш вопрос: Ваша замена неверна

void reverse(int arr[], int count){
   int temp;
   for(int i = 0; i < count/2; ++i){
      arr[i] = temp; // <== Wrong, Should be deleted
      temp = arr[count-i-1];
      arr[count-i-1] = arr[i];
      arr[i] = temp;
    }
}

присваивание arr[i] = temp вызывает ошибку, когда он впервые входит в цикл, поскольку temp изначально содержит данные мусора и разрушает ваш массив, удаляет его, и код должен хорошо работать.

Как совет, используйте по возможности встроенные функции:

  • При замене вы можете просто использовать swap std::swap(arr[i], arr[count-i-1])
  • Для обратного в целом просто используйте reverse как std::reverse(arr, arr+count)

Я использую С++ 14 и без проблем обращается с массивами.

Ответ 8

Я бы использовал функцию reverse() из библиотеки <algorithm>.

Запустите его онлайн: repl.it/@abranhe/Reverse-Array

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
  int arr [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  reverse(begin(arr), end(arr));

  for(auto item:arr)
  {
    cout << item << " ";
  }
}

Выход:

10 9 8 7 6 5 4 3 2 1

Надеюсь, вам нравится этот подход.

Ответ 9

Прежде всего, какое значение вы имеете в этой части кода? int temp; ? Вы не можете сказать, потому что в каждой отдельной компиляции это будет иметь различное значение - вы должны инициализировать свое значение, чтобы не иметь значения мусора из памяти. Следующий вопрос: почему вы присваиваете это временное значение вашему массиву? Если вы хотите придерживаться своего решения, я бы изменил функцию реверса следующим образом:

void reverse(int arr[], int count)
{
    int temp = 0;
    for (int i = 0; i < count/2; ++i)
    {
        temp = arr[count - i - 1];
        arr[count - i - 1] = arr[i];
        arr[i] = temp;
    }

    for (int i = 0; i < count; ++i)
    {
        std::cout << arr[i] << " ";
    }
}

Теперь это будет работать, но у вас есть другие варианты решения этой проблемы.

Решение с помощью указателей:

void reverse(int arr[], int count)
{
    int* head = arr;
    int* tail = arr + count - 1;
    for (int i = 0; i < count/2; ++i)
    {
        if (head < tail)
        {
            int tmp = *tail;
            *tail = *head;
            *head = tmp;

            head++; tail--;
        }
    }

    for (int i = 0; i < count; ++i)
    {
        std::cout << arr[i] << " ";
    }
}

И, например, Карлос Абрахам говорит, что использовать встроенную функцию в библиотеке algorithm

Ответ 10

#include "stdafx.h"
#include <iostream>
using namespace std;

void main()
{
    int n, i;
    cout << "n = ";
    cin >> n;
    int *a = new int[n];
    int *b = new int[n];
    for (i = 0; i < n; i++)
    {
        cout << "a[" << i << "]= ";
        cin >> a[i];
    }
    for (i = 0; i < n; i++)
    {
        b[i] = a[n - 1 - i];
    }
    for (i = 0; i < n; i++)
    {
        cout << b[i];
    }
}

Ответ 11

Procedure :

 1.Take an array.

 2.Then by default function reverse(array_name, array_name + size) .
  reverse(array_name, array_name + size) function exits in algorithm.h header file.

 3.Now print the array. 

 N.B  Here we use new and delete for dynamic memory allocation.

Реализация С++:


#include<bits/stdc++.h>
using namespace std;


int main()
{
   int n;
   cin>>n;

   int *arr = new int[n];


   for(int i=0; i<n; i++)  cin>>arr[i];

   reverse(arr, arr+n);

   for(int i=0; i<n; i++)    cout<<arr[i]<<" ";

   delete[] arr;

   return 0;
}

Ответ 12

Прежде всего, вы назначаете temp элементам массива, и вы должны удалить arr[i] = temp; Постулаты. Следующая проблема заключается в том, что вы печатаете временную переменную, которая показывает только половину элементов массива (в вашем цикле for). Если вы не хотите использовать векторы STL, я бы предложил это решение:

#include <iostream>

void reverseArray(int userArray[], int size);

void printArray(int userArray[], int size);

int main(int arg, char**argv) {

    int arr[]{ 1,2,3,4,5,6,7,8,9,10 };
    int sizeOfArray = sizeof(arr) / sizeof(arr[0]);

    reverseArray(arr, sizeOfArray);
    printArray(arr, sizeOfArray);

    system("pause");
    return(0);
}

void reverseArray(int userArray[], int size) {

    int* ptrHead = userArray;
    int* ptrTail = userArray + (size-1);

    while (ptrTail > ptrHead) {
        int temp = *ptrHead;
        *ptrHead = *ptrTail;
        *ptrTail = temp;

        ptrHead++;
        ptrTail--;
    }
}

void printArray(int userArray[], int size) {
    for (int i = 0; i < size; i++) {
        std::cout << userArray[i] << " ";
    }
}

Ответ 13

Ваш цикл будет работать только для count/2 раз. Поэтому он не будет печатать весь массив.

Кроме того, вместо ar[i]=temp следует использовать temp=ar[i], поскольку значение ar[i] не хранится нигде в последнем утверждении, поэтому оно уничтожается.

Ответ 14

for(i=0;i<((s3)/2);i++)
{         
    z=s2[i];
    s2[i]=s2[(s3-1)-i];
    s2[(s3-1)-i]=z;
}

Ответ 15

Я попытался бы использовать указатели для решения этой проблемы. Мой код ниже.

    #include <iostream>

    void displayArray(int table[], int size);

    void rev(int table[], int size);


    int main(int argc, char** argv) {

      int a[10] = { 1,2,3,4,5,6,7,8,9,10 };

      rev(a, 10);
      displayArray(a, 10);

      return 0;
    }

    void displayArray(int table[], int size) {
      for (int i = 0; i < size; i++) {
          std::cout << table[i] << " ";
      }
      std::cout << std::endl;
    }

    void rev(int table[], int size) {

      int *start = table;
      int *end = table + (size - 1);

      for (int i = 0; i < size; i++) {

          if (start < end) {
              int temp = *end;
              *end = *start;
              *start = temp;
          }

          start++;
          end--;
      }
    }

Ответ 16

Вы можете использовать следующий пример для обращения содержимого в массиве:

#include <iostream>

int main()
{
    int n, x;

    // order value for var x
    cin >> x;  

    // create array and the value for array is value var x
    int arr[x];

    // loop for insert values for array by reverse  
    for(int i=x; i > 0; i--) {

        // var i is number of elements in array 
        cin >> n;
        arr[i - 1] = n;
    }

    // show element in array
    for(int l = 0; l < x; l++) {
        cout<<arr[l]<<endl;
    }

    return 0;        
}

Ответ 17

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

using namespace std;
int main() {
    int a[5]={4,6,3,5,9};
    for(int i=4;i>=0;i--) {
        cout<<"\n"<<a[i];
    }
}