我一般不熟悉C ++和编程,并且为课程安排了小组作业。我们都在不同的部分上工作,我必须将程序的“删除”部分。我必须删除用户询问的特定变量(如果它在数组中),而不是将数组向右移动。完成所需的操作后,会将数组“缩小”一半。
我认为我可以轻松进行收缩,但是我的代码遇到了奇怪的问题,给了我看起来很奇怪的内存地址。
这是我的代码的一部分:)
else if (option == 'd') {
cout << "Delete element:" << endl; //Ask user which array position to delete//
for (int i = 0; i < count; ++i) {
cout << arr[i]; //print out which array index we have///
cout << endl;
int pos; //starts new variable for position///
cin >> pos;
if (pos >= 1 && pos <= size) //As long as position is greater than 1 and less than size it loops//
{
for (i = pos; i <= size; i++)
{
arr[i - 1] = arr[i];
}
arr[size] = 0;
cout << "Elements now:" << endl;
for
(i = 0; i <= size; i++)
cout << arr[i] << endl;
}
else
cout << "Element doesn't exist" << endl; //Tells user it doesn't exist if the position doesn't exist//
因此,如果我添加诸如2之类的元素,则表明2在数组中。我在输入中输入2,它给了我
Elements now:
2
-33686019
0
很抱歉,这令人困惑!我正在努力学习自己。谢谢您的耐心等待!
答案 0 :(得分:0)
该问题似乎是由于数组索引混乱引起的。在C ++数组中,数组从0开始,因此大小为n的数组的有效索引为0,1,...,n-1。这样做有充分的理由,一旦您成为有经验的程序员,它就成为了第二天性,但令人讨厌的是,用户坚持从1开始计数,因此对于用户而言,大小为n的数组的有效索引为1,2,...,n。
避免混淆的最佳方法是在输入时(或在输出之前)立即将用户索引转换为C ++索引。这样一来,您的大多数代码都使用C ++索引方案(由于它是C ++程序,因此非常合理)。
将其应用于您上面的代码
int pos;
cin >> pos;
--pos; // convert from user indexes to C++ indexes
if (pos >= 0 && pos < size) // C++ indexes
{
for (i = pos + 1; i < size; i++) // C++ indexes
{
arr[i - 1] = arr[i];
}
--size; // array is now smaller
cout << "Elements now:" << endl;
for (i = 0; i < size; i++) // C++ indexes
cout << arr[i] << endl;
}
else
cout << "Element doesn't exist" << endl;
我在您的代码中感到困惑的是count
变量。我不知道那是什么,您的使用方式对我来说毫无意义,所以我已经忽略了它,但是您可能不应该。
答案 1 :(得分:0)
假设:
arr
是固定大小的数组。size
实际上是一个变量,用于存储数组中当前“使用”的元素的数量。arr[0]
对应于输入pos = 1
。这部分有一些问题:
for (i = pos; i <= size; i++)
{
arr[i - 1] = arr[i];
}
arr[size] = 0;
首先,如果size等于数组的大小,则会得到未定义的行为,因为arr [size] 不存在。那就是您获得奇怪值的地方,它们是尝试在数组范围之外读取的结果。这是不确定的行为。
第二个在数组移位后,如果不想打印“未使用”的元素,则必须减小大小。
for (int i = pos-1; ++i < size; )
// array should stop when i < size, but increment happens at beginning of loop.
{
arr[i-1] = arr[i];
}
arr[size-1] = 0; // set last element to zero
size--;
答案 2 :(得分:0)
您缺少arr
声明