【问题标题】:AddFirst method doesn't workAddFirst 方法不起作用
【发布时间】:2014-11-02 18:58:32
【问题描述】:

情况:

你好,我已经做了一个可以用线性数组执行多个函数的程序,我不想使用预制的数组类,所以我有一些方法,比如 addFirst、addLast、removeFirst、removeLast 等。

我的程序(不是类的一部分)为 addFirst 方法生成一个随机数以添加到数组的“第一个”位置

我的程序(不是类的一部分)为 addFirst 方法生成一个随机数,以添加到数组的“Last”位置

问题:

我的问题是,我的 addFirst 似乎无法正常工作,我知道这是因为当我运行我的 displayUI 方法时,应该在数组值的第一个位置的值而不是在数组的最后一个位置。

console.writeline() 之后会发生什么:

Values currently in array: 11, 21, 80, 25

然而,应该发生什么:

Values currently in array: 25, 80, 21, 11

不确定我做错了什么,这是我的 addFirst 代码:

public void addFirst(int value) //Adds an item to the first position in the array.
{
    if (isFull())
    {
        throw new Exception("List Full");
    }
    else
    {

        for (int i = count; i > 0; i--)
        {
            values[i] = values[i--];
        }
        values[count] = value;
        count++;

    }
}

【问题讨论】:

  • List 还是调试?
  • 如果这不是家庭作业,您应该只使用List<int> 类并使用InsertAt() 方法。如果是家庭作业,您应该向老师提出这样的问题,以便他们更好地理解他们希望您遇到的问题。
  • 我可以问你一个问题:这是一项学习任务还是你只是喜欢重新发明轮子?
  • 一条建议:1)绘制操作前后的数组状态; 2) 使用简单的结构; 3) 在调试器中逐行跟踪您的代码。
  • 老实说,是的,这是一个家庭作业,可以在不依赖内置数组功能的情况下构建数组类。我在星期五晚上得到了它,直到星期三我才再次上大学,我正在度过我的周末。我今天从一个类图构建了这个,我唯一的问题是,我的 addLast 方法也按我的预期工作,但是我的 addFirst 的输出不是我预期的。这项任务不会很快到期,我只是想把它排除在外。

标签: c# arrays


【解决方案1】:
            for (int i = count; i > 0; i--)
            {
                values[i] = values[i-1];
            }

            values[0] = value;

最后你应该有values[0] 而不是values[count]。您想添加第一个位置,即 0。

编辑在您发表评论之后。我不知道你是如何计算计数和数组的,因为我把它作为参数放在我的例子中!

    static void Main(string[] args)
    {
        int[] test = new int[5];
        test[0] = 10;
        test[1] = 20;
        test[2] = 40;
        test[3] = 80;

        addFirst(123, test.Length, test);

        foreach(int i in test)
        {
            Console.WriteLine(i);
        }

    }

    public static void addFirst(int value, int count, int[] test) 
    {
        //Check for full list done by you already

        for (int i = count-1; i > 0; i--)
        {
            test[i] = test[i-1];
        }

        test[0] = value;
    }

这是有效的代码。您可以检查您的逻辑是否存在其他问题。

【讨论】:

  • 当我这样做时,我的 displayUI 方法只返回最后输入的值,如果我最后输入 '50' 到数组中,那么它将输出 50,0,0,0 我不明白与 addLast 相同的问题,按预期工作。
  • 有点用,如果我添加 9、21、10 和 88,它只会显示 9,21、10、0...88 不会显示。
  • @Method 它将显示 0,因为当您编写 int[] p = new int[5] 时。您正在创建包含 5 个零元素的数组!
  • 如果我的 addFirst 继续将下一个数字添加到数组的第一个位置,如果我输入了。 16,26,36,46 的顺序,然后 46 将是数组中的第一个位置,显示得很好,第二个和第三个也是如此,但是 16(最后一个位置)在数组中显示为 0,当应该是 16 岁。知道是什么导致了我的问题吗?
  • 这会影响其他所有内容,因为它根本不存储 16,而是将 0 存储在第四个位置。
【解决方案2】:

您需要解决的一个明显问题:

           values[i] = values[i-1];

也可能想在 for 循环之前移动 count++

因为你想添加第一个(而不是最后一个)

values[0] = value;

【讨论】:

  • 什么,这与我已经存在的代码完全相同吗? '--' =/= '-1'?
  • 不,这不是一回事。一个更改 i 的值,你不应该在循环中这样做
  • @Method - values[i] = values[i--]; 等同于 values[i] = values[i]; i = i-1;
【解决方案3】:

我不知道你的数组是如何增长的。我认为您采用了一个非常大的数组并且只是添加到它?例如一个包含 100 个元素的数组。

您应该注意的一件事是i--i-1 之间的区别。 i-- 首先将i 作为Values 的索引,然后将i 的值递减并放入i。换句话说,i-- 表示i=i-1;。所以你的 for 循环会颠倒转变。考虑count = 5:在第一次执行for循环时i将是5。首先执行赋值的右侧,因此右侧的值将具有索引5,然后i将递减,因此@987654332 @ 将是 4,因此分配将是 values[4]、values[5] 等等。所以你是在左移而不是右移。

你的第二个错误是你必须说Values[0]=value;而不是values[count]=value;

【讨论】:

    猜你喜欢
    • 2015-04-03
    • 2013-09-19
    • 2016-06-10
    • 2012-09-20
    • 2019-05-21
    • 2014-04-13
    • 1970-01-01
    相关资源
    最近更新 更多