我正在编写一个C ++应用程序,用户输入一个0(零)或一个(1)作为输入,然后将这些数字存储为数组并对它们进行排序,使零首先出现,最后出现
但是,我认为我的数组中的内存地址正在弄乱排序操作。
接受输入的函数如下所示:
cout << "Please enter number " << i+1 << ":\n";
cin >> ar[i];
然后有一个被调用的函数对输入进行排序并显示已排序的列表:
sort_elements(ar, number);
...而且这个功能看起来像这样:
void sort_elements(int ar[], long int num_elements) {
int temp_num;
num_elements -= 1; //since the array starts at 0
cout << "num_elements is " << num_elements << "\n";
for (int i=0; i < (num_elements/2); i++ ) {
if (ar[i] > ar[num_elements-i]) {
temp_num = ar[i];
ar[i] = ar[num_elements-i];
ar[num_elements-i] = temp_num;
}
}
cout << "Here's your neatly sorted list of numbers: \n";
for (int j=0; j <= num_elements; j++) {
cout << ar[j] << ", ";
}
cout << "\n";
}
对于五个数字输入,从三个“1”开始,以两个“0”结束,这将产生如下输出:
1, 0, 1, 1, 1892218304,
我假设1892218304
是一个内存地址,这会弄乱输入。虽然我真的不知道。
有人能弄清楚为什么我的排序操作搞砸了吗?
提前致谢。
答案 0 :(得分:4)
建议 在标准库中使用向量和排序
#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>
int main()
{
std::vector<int> v;
for(int i=0; i < 10; i++)
{
v.push_back(i);
}
std::sort(v.begin(), v.end());
return 0;
}
答案 1 :(得分:2)
您看到的数字不是内存地址,而是紧接在数组之前或之后的4个字节的值,解释为int
。您的代码有一个off-by-one错误,导致访问数组外部。即使我没有证据,我仍然怀疑。
但是,我发现你发布的代码没有任何问题会导致它在数组范围之外访问。
调用此函数时,您确定num_elements
具有正确的值吗?
更新以解决粘贴代码问题
事情从一开始就出现了问题:
int number;
int ar[number]
这称为可变长度数组,它在C90或任何C ++版本中都不合法。您的程序编译可能是“感谢”编译器扩展...这有助于引发错误:number
的值在分配数组之前未初始化。
您需要执行以下操作之一:
ar
声明为常量大小的数组(您可以接受的输入数量的硬限制)ar
后,new[]
动态分配number
std::vector
而不是数组答案 2 :(得分:1)
在我看来,你只是在输出中获得未初始化的值。
在这种情况下,最简单的“排序”方法可能是计数排序 - 即计算0的数量和用户输入的1的数量,然后打印出适当数量的0,然后输入相应的数字1的。
答案 3 :(得分:1)
正如托尼所说,你的排序算法不正确。
如果我们假设以下值:
ar [0] = 0 ar [1] = 1 ar [2] = 0 ar [3] = 1 ar [4] = 0
给我们num_elements等于5。
通过编写的函数运行它,我们得到以下排序行为:
第一次通过,i = 0 ar [0]&gt; ar [4] - &gt;不是真的,所以没有开关
塞康传球,i = 1 ar [1]&gt; ar [3] - &gt;不是真的,所以没有开关
没有第三遍,因为你的for循环条件得到满足 i = 2 num_elements / 2 = 2 2不小于2
因此,基于您的代码,您没有对任何内容进行排序。这是第一个问题。
您的打印问题很有意思,根据您所显示的内容,您的函数中代码片段顶部的num_elements减1,因此&lt; =条件是正确的,您不应超出您的范围'ar'数组。你确定这是确切的代码,或者你没有在这里正确地复制它并且你实际上有一个范围问题?
(编辑:虽然其他答案暗示通过向量使用内置排序方法,但我建议您仍然使用当前的实现来弄清楚为什么这是错误的,以及您需要做些什么来解决它。并不总是有一个内置排序的可用类型,因此理解基础知识对任何年轻程序员都很重要。)
EDIT2:根据您提供的链接,您没有正确定义整数数组。当数字尚未初始化时,您正在基于未初始化的整数(int ar [number])定义数组。然后,您从标准输入中读取一个值来设置数字,并假设您的数组已被动态调整为从cin读取的大小。它没有这种方式。你的整个循环是在数组范围之外读/写,这是一个很大的禁忌。您想先读取数字,然后根据读取的大小定义数组。 - 看起来Jon又打败了我.. BAH! :P
答案 4 :(得分:0)
从未写入读取并打印到屏幕的最后一个元素。我认为你接受输入的功能可能有一个错误,就像你有一条像你在这里一样的线
num_elements - = 1; //因为数组从0开始
在输入函数处,以便您写入的第一个元素位于地址1.然后当您读取它们时,您从地址零读取。
答案 5 :(得分:0)
我同意Jim的观点:使用C ++标准库中的工具尽可能完成您的任务。
此外,我建议您自己完成算法,手动,而不是让计算机为您运行。听说过“Rubber Duck Debugging Method”吗? :-)试一试。