尝试使用临时变量来反转数组中的元素。 我无法弄清楚如何做到这一点
int arraysize = 12;//Size of the array
int option;// Option to be switched
int list[12];//numbers in the array
int total = 0;// Total of all numbers initialised to zero
double average = 0;// average of all numbers
int largestNum = 0;//largest Number
int smallestNum = 6;//first number in the array
int NumberOccurance = 0;// number of times the checked number appears
int usernum;//number to be check for times it appears
int userscaleup;//number to be multiplied by the array contents
int tempnum;// store the value
int endarray;
ifstream infile("data.dat");
ofstream outfile("output.dat");
do
{
cout << "\t7. Reverse Order\n";
cin >> option;// Taking in the users option from the menu
switch (option)
case 7:
case 7:
for (int index = 0; index < arraysize/2; index++, endarray--)
{
infile >> list[index];
int endarray = list[arraysize];// variable endarray holds value of end side of array
int swapholder = list[index];
list[index] = list[endarray];//Swap
list[endarray] = swapholder;
cout << list[index] << ' ';
}
break;
while (option != 9);
}
我一直在输出随机负数。试过多种解决方案。我已经注释掉的那一行也给出了随机的负数。
数组大小为12。
必须使用临时变量来执行此操作。有人可以告诉我这样做的正确方法吗?
编辑:更新了我的代码。该程序现在正在构建,但是当我运行它时它会崩溃。有什么建议吗?
答案 0 :(得分:1)
尝试:
int temp = 0;
for (int index = 0, backwardsIndex = arraysize - 1; index < arraysize / 2; index++, backwardsIndex--)
{
temp=list[index];
list[index]=list[backwardsIndex];
list[backwardsIndex]=temp;
}
答案 1 :(得分:0)
这是伪代码,但应该给你一个想法。在这里,我使用两个从阵列正面和背面向中间移动的计数器
count_front = 0;
count_back = max_array_element; //11
While ( count_front < count_back ) {
temp_var = array[count_front];
array[count_front] = array[count_back];
array[count_back] = temp_var;
count_front++;
count_back--;
}
答案 2 :(得分:0)
临时变量用于交换:t = list [1]; list [1] = list [2];列表[2] =吨; 要反转数组,交换第一个和最后一个元素(最小和最大),然后是下一个最低(最小+ 1,最大-1),直到最小值> =最大。
答案 3 :(得分:0)
您的索引大小为12,并且您在索引中添加了11,因此在索引2处它将转到索引13 ....这超出了数组的范围..
如果你试图扭转它(比如make first last和last first),它需要看起来像这样:
int otherside = arraysize; //set the otherside at the end of the array
for (int index = 0; index < arraysize/2; index++)
{
int swapholder = list[index]; // V
list[index] = list[otherside]; // Swap them
list[otherside] = swapholder; // ^
otherside =-1; //move backward from end.
// moving forward from beginning is the index++
cout << list[index] << ' ' << list[otherside] <<'/n';
}
这意味着你定义2个变量,1个在开始时,1个在结束时,你在开始时取一个并在临时中保持它,取最后一个并保存它,然后取温度并保存在最后......你从头开始向前移动一次,然后重复一次,重复......重复应该是阵列大小的一半,因为它一次从两个方向移动,因此运动量的一半是需要
编辑:有2个case 7:
,摆脱一个,这一定是导致崩溃的原因!
答案 4 :(得分:0)
简单地说,让标准库函数std::reverse
为您完成工作。 (如果你的目标不是自己实施这个练习)
答案 5 :(得分:0)
除非以某种方式需要,否则不要使用数组。
请改用std::vector
。 (要求你#include <vector>
)。
然后你可以简单地做一些事情:
std::vector< int > list;
// fill vector. usually with list.push_back( item );
std::reverse( list.begin( ) , list.end( ) );
如果你想继续使用数组,你可以像这样反转它:
std::reverse( std::begin( list ) , std::end( list ) );
无需循环和交换。
如果您无法使用std::reverse
:
首先,如果您声明数组的最大大小使用它并将其声明为const
并将其写为大写,那么您就会看到差异!
const int ARRAY_SIZE = 12; // const can't be changed runtime.
int list[ARRAY_SIZE]; // Not a good idea to name it list since it's not a list!
下一步:
分割循环不需要复杂的循环结构。
首先填充数组:
// fill array
for( int i = 0 ; i < ARRAY_SIZE ; ++i )
{
infile >> list[i];
}
然后:
// declare this outside and give it a std. value so you don't redeclare it every run of the loop
int swapHolder = 0;
// reverse array
for( int i = 0 ; i < ARRAY_SIZE / 2 ; ++i )
{
swapHolder = list[i]; // save the value of first position
list[i] = list[ARRAY_SIZE - 1 - i]; // fill it with the lastPosition - 1 - i
list[ARRAY_SIZE - 1 - i] = swapHolder; // replace lastPosition - 1 - i
}
ARRAY_SIZE - 1
因为数组可能包含12个值,但它从0开始,因此它的索引是0 - 11.
工作example。
此外:
case 7:
case 7:
毫无意义。