【问题标题】:Deleting array from user input从用户输入中删除数组
【发布时间】:2018-09-12 08:14:59
【问题描述】:

我是 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

如果这令人困惑,我很抱歉!我正在努力学习自己。感谢您的耐心等待!

【问题讨论】:

  • size 是数组中元素的数量,还是顶部索引?你知道顶部索引比元素数少一吗?
  • @Someprogrammerdude size 是元素的数量,即 2。
  • @PKPython arr 的类型是什么? “正常”C++ 数组从索引0 开始,在索引size-1 结束,所以在这种情况下,您的for 循环必须在i &lt; size 终止,而不是i &lt;= size。使用size=2 玩它:i 将变为012 - 这是您正在访问的数组中只有两个元素的三个元素。您在其他几个地方执行此操作,因此请查看每个数组访问并问自己“我访问的这个索引是否可以大于size-1?”。使用调试器还可以帮助您了解程序中每个步骤发生的情况——这真的很有帮助。
  • 没有理事会的大学编程如何实现数据存储并将代码分离为功能部分会导致代码噩梦。也许教授想为学生说明这一点。或者可能是他不在乎,或者只是想让他们在语言方面挣扎,作为一种教育努力。无论如何,问题是这是不完整的代码,不清楚我们使用的是什么。只清楚根本不使用关注点分离。
  • 还可以考虑使用std::arraystd::vector 而不是原始C++ 数组。当您的数组索引越界时,它们通常会显示一条诊断消息,因为越界访问原始 C++ 数组只会导致 undefined bahaviour(google that)。

标签: c++ arrays loops dynamic


【解决方案1】:

假设:

  1. arr 是一个固定大小的数组。
  2. size 实际上是存储数组当前“已使用”元素计数的变量。
  3. 您的输入策略接受从 1 开始的索引,因此 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】:

    这个问题似乎是由数组索引的混淆引起的。在 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 变量。我不知道那是什么,你使用它的方式对我来说毫无意义,所以我忽略了它,但你可能不应该。

    【讨论】:

      【解决方案3】:

      您缺少arr 声明

      【讨论】:

        猜你喜欢
        • 2016-02-06
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多