反转数组中的内容

问题描述 投票:12回答:17

我有一系列数字,我试图扭转。我相信我的代码中的函数是正确的,但我无法得到正确的输出。

输出显示: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 << " ";
   }
}
c++ arrays function reverse
17个回答
20
投票

这将是我的方法:

#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));
  ...
}

0
投票
#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];
    }
}

0
投票
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.

C ++实现:


#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;
}

0
投票

你的循环只会在count/2时间运行。所以它不会打印整个数组。

此外,应使用temp=ar[i]而不是ar[i]=temp,因为ar[i]的值不会存储在后一个语句中的任何位置,因此它会被破坏。


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

0
投票

我会尝试使用指针来解决这个问题。我的代码如下。

    #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--;
      }
    }

0
投票

首先,你将temp分配给数组元素,你应该删除arr[i] = temp;语句。接下来的问题是你正在打印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] << " ";
    }
}

-2
投票

您可以使用以下示例来反转数组中的内容:

#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;        
}

-4
投票

试试这可以比其他代码更好地下降。

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

16
投票

这条线

arr[i] = temp;

是错的。 (在循环的第一次迭代中,它将arr[i]设置为未定义的值;进一步的迭代将其设置为不正确的值。)如果删除此行,则应正确反转数组。

之后,您应该将打印反转数组的代码移动到一个新循环中,该循环遍历整个列表。您当前的代码仅打印第一个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)你应该做第二个循环来打印所有元素,而不仅仅是数组的一半。反向循环不需要打印它。


2
投票

你没有打印数组,你打印的是temp的值 - 这只是数组的一半......


1
投票
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;
   }
}

1
投票

这个问题的解决方案非常简单:向量

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

瞧!你完成了! =)

方案细节:

这是最有效的解决方案:交换不能交换3个值,但绝对可以。请记住包含算法。这非常简单,绝对不需要编译代码。

我认为这解决了OP的问题

如果您认为此解决方案有任何错误和问题,请在下面发表评论


1
投票

作为您问题的直接答案:您的交换是错误的

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)

我正在使用C ++ 14并且反向使用数组没有任何问题。


1
投票

我会使用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

希望你喜欢这种方法。


1
投票

首先,你在这个代码中有什么价值? 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图书馆中使用功能

© www.soinside.com 2019 - 2024. All rights reserved.