【问题标题】:How to reverse order of a set array如何反转集合数组的顺序
【发布时间】:2023-04-02 06:17:01
【问题描述】:

这是我班级的一个练习,我不知道如何执行需要逆序的函数。

#include <iostream>
#include <iomanip>

void reverseorder(int[], int);
void printout(int[], int);

const int SIZE = 10;

int main()
{
int number[SIZE] = {10, 15, 20, 25, 30, 35, 40, 45, 50, 55};

reverseorder(number, SIZE);
printout(number, SIZE);
}

void reverseorder(int number[], int SIZE)
{
    for (int i = 0; i < SIZE; i++)
    {

        number[i] = number[SIZE - i];
        return;
    }
}

void printout(int number[], int SIZE)
{
    for (int i = 0; i < SIZE; i++)
    {
        std::cout << number[i] << std::setw(5);
    }
    std::cout << std::endl;
}

我知道 fnc void reverseorder(int number[], int SIZE) 不正确,因为这是唯一需要做的事情。如果您知道答案但不想直接给我,那么任何提示也将不胜感激!谢谢大家

编辑:目前的输出是: SalvGis-MBP:c++ 编程$ ./a.out 503709838 15 20 25 30 35 40 45 50 55

但我希望它是 55 50 45 40 35 30 25 20 15 10

不确定为什么要生产 503709838。有人提到第一次迭代被破坏了,这可能解释了它。

【问题讨论】:

标签: c++ arrays reverse function-definition


【解决方案1】:

要反转数组,您需要使用标准函数std::swap 或自己编写这样的函数。

这个函数

void reverseorder(int number[], int SIZE)
{
    for (int i = 0; i < SIZE; i++)
    {

        number[i] = number[SIZE - i];
        return;
    }
}

不交换数组的元素。因此,例如在第一次迭代中,由于这个语句

    number[i] = number[SIZE - i];

元素number[0] 的值将会丢失。而且当i等于0时,使用了数组number[SIZE - i]的不存在元素。

你需要交换数组的两半。

还有这个语句中对 std::setw 的调用

std::cout << number[i] << std::setw(5);

没有意义。这个调用应该放在输出的表达式number[i]之前。

注意这两个函数的第二个参数都应该是 size_t 类型的,输出数组的函数的第一个参数应该是限定符const,因为在函数中使用的数组没有改变。

你来了。

#include <iostream>
#include <utility>

void reverseorder( int a[], size_t n )
{
    for ( size_t i = 0; i < n / 2; i++ )
    {
        std::swap( a[i], a[n-i-1] );
    }
}

std::ostream & printout( const int a[], size_t n, std::ostream &os = std::cout )
{
    for ( size_t i = 0; i < n; i++ )
    {
        os << a[i] << ' ';
    }

    return os;
}


int main() 
{
    int number[] = {10, 15, 20, 25, 30, 35, 40, 45, 50, 55};
    const size_t N = sizeof( number ) / sizeof( *number );

    printout( number, N ) << '\n';

    reverseorder( number, N );

    printout( number, N ) << '\n';

    return 0;
}

程序输出是

10 15 20 25 30 35 40 45 50 55 
55 50 45 40 35 30 25 20 15 10 

如果你可能不使用 std::swap 那么在循环中写例如

    for ( size_t i = 0; i < n / 2; i++ )
    {
        int tmp = a[i];
        a[i] = a[n-i-1];
        a[n-i-1] = tmp;
    }

【讨论】:

  • 谢谢弗拉德,我现在就去试试!
  • 没有 std::swap 工具有什么办法吗?你的方法完全有效,但我们还没有在我正在上课的课程中了解到这一点,我猜教授不希望我在这个练习中使用它,因为它会破坏目的。我将研究 std::swap ,看看我是否可以弄清楚如何在不使用它的情况下对其进行编码,但如果有意义的话,同时基本上使用它
  • @SalvGi 我们,初学者,应该互相帮助,:)
  • 来自 Mowcow 另外,我最终做了什么而不是 std::swap 以防万一你想知道我自己做了一个简单的交换功能。无效交换(int&n1,int&n2){int tmp; tmp=n1; n1=n2; n2=tmp;返回; }
  • @SalvGi 是的,你可以编写这样一个声明的函数,例如 void swap( int &a, int &b );在函数体内,您可以放置​​类似于我在答案中显示的代码。
【解决方案2】:

如果你被允许使用 STL,你可以这样做

void reverseorder(int number[], int SIZE)
{
    std::reverse(number, number + SIZE);
}

【讨论】:

  • 我怀疑他是否希望我使用它,否则这个练习会容易得多!感谢您向我展示这一点,尽管我相信它将来会派上用场!
  • 与您的教授确认是否确实不允许这样做。他们可能不会阻止你,只是因为这很容易。简单就是好:)
【解决方案3】:

在这一行:

number[i] = number[SIZE - i];

这不会反转它实际上是用它之前的数字增量替换。当索引i 到达数组中间时,它将再次开始重复数组的后半部分。

【讨论】:

    【解决方案4】:
    void reverse(int *num,int size){
        for(int i = 0;i<(size)/2;i++){
            const int temp = num[i];
            num[i] = num[size-i-1];
            num[size-i-1] = temp;
        }
    }
    

    num是指向数组的指针,size是数组的大小, temp 是一个变量,它保存一个值以将第一个元素与最后一个元素交换 以及带有 last-1 的第二个元素 .... 我们需要重复这个(数组的大小)/2 次​​p>

    【讨论】:

      猜你喜欢
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 2017-07-29
      • 2021-12-24
      • 2015-04-05
      • 1970-01-01
      • 2016-02-27
      相关资源
      最近更新 更多