反转数组中的内容

时间:2013-10-31 17:21:32

标签: c++ arrays function reverse

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

输出结果为: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 << " ";
   }
}

18 个答案:

答案 0 :(得分: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));
  ...
}

答案 1 :(得分: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] << " ";
}

答案 2 :(得分:3)

这两个答案对我来说都是正确的。

1)应删除第一个arr[i] = temp;

2)你应该做第二个循环来打印所有元素,而不仅仅是数组的一半。反向循环不需要打印它。

答案 3 :(得分:2)

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

答案 4 :(得分: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])
  • 反过来整体而言 只需使用std::reverse(arr, arr+count)
  • reverse即可

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

答案 5 :(得分: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] << " ";
    }
}

像卡洛斯·亚伯拉罕(Carlos Abraham)这样的官员说,要在algorithm库中使用内置函数

答案 6 :(得分: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

希望您喜欢这种方法。

答案 7 :(得分:1)

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

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

瞧!你完成了! =)

解决方案详情:

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

我认为这解决了OP的问题

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

答案 8 :(得分: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;
   }
}

答案 9 :(得分:0)

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

C ++实现:

{{1}}

答案 10 :(得分: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] << " ";
    }
}

答案 11 :(得分:0)

您的循环只会运行count/2次。所以它不会打印整个数组。

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

答案 12 :(得分:0)

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

答案 13 :(得分: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--;
      }
    }

答案 14 :(得分: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];
    }
}

答案 15 :(得分:0)

我的方法是交换数组的第一个和最后一个元素

int i,j;
for ( i = 0,j = size - 1 ; i < j ; i++,j--)
{  
    int temp = A[i];
    A[i] = A[j];
    A[j] = temp; 
}

答案 16 :(得分:-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;        
}

答案 17 :(得分:-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];
    }
}