我应该输入数组x[ ]
并创建一个新数组y[ ]
,该数组将从原始数组向右移。
我对第一个元素y[0]
{7, 8, 4, 2, 3}
{-693726240, 7, 8, 4, 2}
错误在哪里?
谢谢。
#include <iostream>
using namespace std;
int main()
{
int i, j, n, m=0, x[100],y[100];
cin >>n;
for(int i=0; i<n; i++)
{
cout << "enter "<< i+1 <<". element: ";
cin >> x[i];
if (i>0)
y[m++] = x[i-1];
else //THIS IS FOR Y[0] BUT DOESN'T WORK
y[m++] = x[n-1];
}
// ARRAY SHIFTED TO THE RIGHT:
for(int j=0; j<m; j++)
{
cout << y[j]<<" ";
}
return 0;
}
答案 0 :(得分:3)
循环以i == 0
开头。您在第i次迭代中读取了第i个元素。在第0次迭代中读i == n - 1
时,x[n - 1]
还在将来。 C ++没有义务为您将变量初始化为任何特定的值,因此,当您从尚未初始化的位置读取数据时,很可能会遇到垃圾(在这种情况下为-693726240
)。
要解决此问题,您必须解决时间悖论。在迭代0时不要分配任何东西;等到循环完成并输入所有数据后,再潜入并填充第0个元素。
或者,先阅读整个x
,然后在知道所有值的情况下,使用当前算法将x
移入y
(即,将当前的“一切皆有”循环分开)进入读取循环和移位循环)。这样,当您从x
开始时,所有y
的值都将被知道,并且不会有任何时间旅行的麻烦。
答案 1 :(得分:0)
假设您写了y[m++] = x[n-1]
Amadan的答案强调了一种解决问题的方法,这是您可以遵循的一些代码:
for(int i = 0;i < n-1;i++){
cin>>x[i];`
y[i+1] = x[i];
}
cin>>x[n-1];
y[0] = x[n-1];
答案 2 :(得分:0)
很好,@ Amadan,谢谢您的解释和快速回答
我还删除了“ j”和“ m”作为新数组的单独变量, 认为实际上并不需要它,我可以使用与原始数组相同的“ i”和“ n”(对吗?还是应该保留新变量?)
这里的正确代码有效:
#include <iostream>
using namespace std;
int main()
{
int i, j, n, m=0, x[100],y[100];
cin >>n;
for(int i=0; i<n; i++)
{
cout << "enter "<< i+1 <<". element: ";
cin >> x[i];
if (i>0)
y[i] = x[i-1];
}
y[0] = x[n-1];
// ARRAY SHIFTED TO THE RIGHT:
for(int i=0; i<n; i++)
{
cout << y[i]<<" ";
}
return 0;
}
答案 3 :(得分:0)
我也尝试了@Amadan建议的其他替代方法,并将其用于左移 -首先输入所有元素,然后在所有已知元素后分配另一个数组元素
我认为这是最好的,经过测试和工作。再次感谢:
#include <iostream>
using namespace std;
int main()
{
int i, n, x[100],y[100], z[100];
cin >>n;
for(int i=0; i<n; i++)
cin >> x[i];
// ARRAY SHIFTED TO THE RIGHT:
for(int i=0; i<n; i++)
{
if (i > 0) y[i] = x[i-1];
else y[i] = x[n-1];
cout << y[i]<<" ";
}
cout << endl;
// ARRAY SHIFTED TO THE LEFT:
for(int i=0; i<n; i++)
{
if (i < n-1) z[i] = x[i+1];
else z[i] = x[0];
cout << z[i]<<" ";
}
return 0;
}