15

我有一组数字,我试图反转。我相信我的代码中的函数是正确的,但我无法获得正确的输出。

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

18 回答 18

24

这将是我的方法:

#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));
  ...
}
于 2013-10-31T17:27:23.203 回答
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] << " ";
}
于 2013-10-31T17:23:25.360 回答
4

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

希望你喜欢这种方法。

于 2018-09-28T02:22:49.010 回答
3

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

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

  2. 您应该进行第二次循环以打印所有元素,而不仅仅是数组的一半。执行相反操作的循环不需要打印它。

于 2013-10-31T17:25:33.273 回答
2

您不是在打印数组,而是在打印temp- 的值,它只是数组的一半......

于 2013-10-31T17:23:18.250 回答
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;
   }
}
于 2013-10-31T17:29:34.527 回答
1

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

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

瞧!你完成了!=)

解决方案详情:

这是最有效的解决方案: Swap 不能交换 3 个值,但 reverse 绝对可以。记得包括算法。这太简单了,绝对不需要编译的代码。

我认为这解决了OP的问题

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

于 2014-10-24T02:16:09.323 回答
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)

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

于 2017-01-07T23:33:01.650 回答
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像 Carlos Abraham 这样的 ofc 说在库中使用内置函数

于 2019-04-22T16:06:50.910 回答
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];
    }
}
于 2014-07-06T16:44:27.423 回答
0
for(i=0;i<((s3)/2);i++)
{         
    z=s2[i];
    s2[i]=s2[(s3-1)-i];
    s2[(s3-1)-i]=z;
}
于 2017-08-15T06:29:57.923 回答
0

首先,您将 temp 分配给数组元素,您应该删除arr[i] = temp;statment。下一个问题是您正在打印仅显示一半数组元素的临时变量(在您的 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] << " ";
    }
}
于 2017-05-25T18:14:36.700 回答
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; 
}
于 2021-01-02T07:51:42.843 回答
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;
}
于 2016-11-16T19:25:08.117 回答
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--;
    }
}
于 2017-08-30T14:23:36.240 回答
0

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

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

于 2017-06-04T15:30:04.643 回答
-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;        
}
于 2018-09-27T20:47:52.880 回答
-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];
    }
}
于 2016-06-23T08:17:19.403 回答