C++ 对于循环重置(在特定情况下将i重新初始化为1)-不';你不能按预期工作吗?

C++ 对于循环重置(在特定情况下将i重新初始化为1)-不';你不能按预期工作吗?,c++,C++,我有一个名为flip的预定义函数,它可以改变向量元素的顺序,如下所示: for FLIP(9, [3 2 6 8 5 9 1 7 4], 1, 6) -> v = [9 5 8 6 2 3 1 7 4] void FLIP(int x, int v[100], int w, int y) { int aux; for (int p = w; p <= y / 2; p++) { aux = v[p]; v[p] = v[y

我有一个名为flip的预定义函数,它可以改变向量元素的顺序,如下所示:

for FLIP(9, [3 2 6 8 5 9 1 7 4], 1, 6) ->
v = [9 5 8 6 2 3 1 7 4] 

void FLIP(int x, int v[100], int w, int y)
{
    int aux;
    for (int p = w; p <= y / 2; p++)
    {
        aux = v[p];
        v[p] = v[y - p + 1];
        v[y - p + 1] = aux;
    }
}
基本上,第三个参数必须是1

好吧,我想我可能会先用两个翻盖电话来获得最高的号码。首先应用于获取v[1]中的最大数字,然后将其移动到v[n]

然后我应该重置for循环,这样我就可以在I=1的情况下得到其他值

不幸的是,它没有按预期工作

这是我的节目

#include <iostream>

using namespace std;

void FLIP(int x, int v[100], int w, int y)
{
    int aux;
    for (int p = w; p <= y / 2; p++)
    {
        aux = v[p];
        v[p] = v[y - p + 1];
        v[y - p + 1] = aux;
    }
}

int main()
{
    int n, v[100], max = -32000;
    cin >> n;
    int copie = n;
    for (int t = 1; t <= n; t++)
    {
        cin >> v[t];
    }
    for (int i = 1; i <= n; i++)
    {
        if (v[i] > max)
        {
            max = v[i];
        }
    }
    for (int i = 1; i <= n; i++)
    {
        if (max == 1)
        {
            break;
        }
        if (v[i] == max)
        {
            FLIP(n, v, 1, i);
            FLIP(n, v, 1, n);
            i = 1;
            max--;
            n--;
        }
    }
    for (int i = 1; i <= copie; i++)
    {
        cout << v[i] << " ";
    }
}
我明白了
623154789

我真的不明白为什么会这样。我没想到这个循环会在max变为1之前结束,现在我不明白发生了什么

你能给我解释一下我做错了什么,我怎样才能纠正它吗?
谢谢。

如果最大值是第一个数字,则只应使用该函数一次,因此请输入“如果”来检查

i=0
开始,而不是从
i=1
开始,因为每次它都会直接跳到第二个值

for (int i = 1; i <= n; i++)
{
    if (max == 1)
    {
        break;
    }
    if (v[i] == max)
    {
        if (i!=1)
      {
        FLIP(n, v, 1, i);
        FLIP(n, v, 1, n);
      }
        else
        FLIP(n, v, 1, n);

        i = 0;
        max--;
        n--;
    }
}

<代码> >(int i=1;i在C++中,数组索引从0开始),因此如果数组<代码> ARR < /C>包含[2, 3, 5 ],则ARR [0 ]=2,ARR [1 ]=3,ARR [2 ]=5。您(和您的老师)似乎会感觉到索引从1开始。直到您清除(至少在您自己的头脑中)。你基本上没有机会让这个代码工作。C也使用了0个数组。对于C和C++,beta是什么。首先,我觉得你很糟糕,因为你被教了一些非常恐怖的C++,你必须在以后再学习。我建议你读一下:这里有一个提示:在你的主循环中设置<代码> i <代码> 1之后,WHA。在循环的下一次迭代开始之前,
i
是否发生t?我建议您尽量避免在循环本身内部更改循环计数器,因为这通常会导致混乱的行为。使用一个从
n
循环到1的循环,并在第一个循环中找到最大元素的第二个循环。
 n = 9
v = [3 2 6 8 5 9 1 7 4] 
for (int i = 1; i <= n; i++)
{
    if (max == 1)
    {
        break;
    }
    if (v[i] == max)
    {
        if (i!=1)
      {
        FLIP(n, v, 1, i);
        FLIP(n, v, 1, n);
      }
        else
        FLIP(n, v, 1, n);

        i = 0;
        max--;
        n--;
    }
}