【问题标题】:Need help understanding code需要帮助理解代码
【发布时间】:2009-05-20 22:26:41
【问题描述】:

我正在学习 C# 课程,我需要帮助理解以下代码。

代码有一个数组,表示对调查的响应,值从 1 到 10。

输出显示这些评级以及选择某个值的次数。

以下代码来自我的书,但我已将其修改为只是一个基本示例。

int[] responses = { 3, 2, 5, 6, 3, 5 , 4, 5, 5, 5};
int[] frequency = new int[7];


for (int answer = 0; answer < responses.Length; answer++)
   ++frequency[responses[answer]];

for (int rating = 1; rating < frequency.Length; rating++)
   Console.WriteLine(rating + ", " + frequency[rating]);

Console.Read();

++frequency[responses[answer]]; 行是如何工作的?在看这个时,如果我第一次通过循环使用reponses[answer],这将代表responses[0],这将是一个3,对吗?这就是我感到困惑的地方,这行的++frequency 部分是做什么的?

【问题讨论】:

    标签: c# arrays


    【解决方案1】:
    frequency[responses[answer]] = frequency[responses[answer]] + 1;
    

    编辑:我认为这样写还不清楚。作为个人喜好,我不喜欢对存在大量索引的元素使用一元运算(++x、x++ 等)。

    【讨论】:

      【解决方案2】:

      它将数组中该位置的频率加一。

      例如,位置 3(来自您的示例)的频率将在该行执行后增加一。

      编辑:所以,更详细地说,当 answer = 0 时,responses[0] = 3,所以 frequency[3] 会加一。

      ++ 也很容易出现在命令的末尾。换句话说,

      ++frequency[responses[answer]];
      


      与使用相同(在这种情况下)

      frequency[responses[answer]]++;
      

      【讨论】:

        【解决方案3】:

        让我们分解一下:正如您所指出的,在第一次通过时,responses[answer] 将评估为“3”

        所以这看起来像 ++frequency[3]

        ++ 将索引 3 处的数组的值增加 1

        够简单吗?

        我还应该指出,在数组之前应用 ++ 而不是在它之后会影响递增的执行方式(尽管它不会影响这段代码的结果)。

        例如:

        int n = 2;
        int j = ++n;
        int k = n++;
        

        j 和 k 是什么?

        j 将是 3,k 也将是 3。这是因为如果您将 ++ 放在前面,它会先评估它。如果你把它放在最后,它会在表达式的其余部分之后计算它。

        【讨论】:

          【解决方案4】:

          如果有帮助,请将 ++frequency[] 视为“频率 = 频率 + 1”。

          如果 ++ 运算符出现在变量之前,则在执行语句之前应用增量。如果 ++ 之后出现,则执行该语句,然后变量递增。

          在这种情况下,这无关紧要,因为在之前或之后递增不会影响逻辑。

          由于“responses[answer]”的计算结果为一个数字,因此该行代码会增加该数组索引处的频率条目。所以第一次通过,答案是 0,所以响应 [答案] 是 3,所以频率 [3] 框增加 1。下一次通过,频率 [2] 框增加......等等.等等

          【讨论】:

            【解决方案5】:

            frequency 是一个数组,其中所有元素都初始化为 0(int 的默认值)。 ++frequency[responses[answer]] 行将增加在responses[answer] 处找到的整数所指出的频率元素。通过将 ++ 放在频率前面,数组元素将在返回结果值之前递增。

            你可以read more about the ++ operator here

            【讨论】:

              【解决方案6】:

              在这种情况下,边走边重写代码通常很有用。

              当答案 = 0

              • ++频率[响应[0]]
              • ++频率[3],因为响应[0] = 3
              • 频率现在看起来像 { 0, 0, 0, 1, 0, 0, 0 }

              当答案 = 1

              • ++频率[响应[1]]
              • ++频率[2] 因为响应[1] = 2
              • 频率现在看起来像 { 0, 0, 1, 1, 0, 0, 0 }

              等等。

              【讨论】:

                【解决方案7】:

                这意味着在频率[3]处增加值。其中 3 是响应 [answer] 的返回结果。类似地,下一次迭代将在频率[2]处增加值。

                【讨论】:

                  【解决方案8】:

                  C# 中的 ++ 运算符应用于整数时会将其加一。

                  您正在查看的特定行,频率是具有 7 个元素的整数数组。这有点令人困惑,因为按照您在代码中解释它的方式,该代码似乎会与 6 以上的响应数组中的任何值中断。

                  撇开这个问题不谈,它基本上是递增它正在访问的数组的任何索引。因此,在您的示例中,response[0] 将为 3。因此,此行将找到频率 [3] 的值并将其递增 1。由于整数数组的所有值都初始化为零,因此在第一次迭代后,频率 [3 ] 将是 1。然后,如果您的响应数组中稍后还有 3,则频率 [3] 将再次增加(即响应 [4])。

                  希望对你有帮助。

                  【讨论】:

                    【解决方案9】:

                    代码 sn-p 的目标似乎是确定每个响应出现在 'responses' 数组中的次数。因此,对于您的示例集,频率[3] 应该是 5,频率[5] 应该是 5,等等。

                    因此,您所询问的行从响应数组中获取当前元素,并将频率数组中的关联值增加 1,以指示在响应中观察到特定值。

                    一旦整个代码 sn-p 执行,频率数组包含响应数组中每个元素从 0 到 7 的观察次数。

                    【讨论】:

                      【解决方案10】:

                      它使用频率数组来计算每个响应输入的次数。您可以为每个答案设置一个计数器:

                      int numberOfOnes = 0;
                      int numberOfTwos = 0;
                      // Etc...
                      

                      但这将是丑陋的编程,而且不那么容易或高效。使用频率数组可以让您不使用 if/else if 块或开关,并使您的代码更易于阅读。

                      关于频率阵列的另一件事。

                      int[] frequency = new int[7]; 
                      

                      这会将数组中的所有整数初始化为 0,这就是为什么您可以从递增它开始,而不是查看它是否是该特定响应的第一次,然后用 1 或类似性质的东西初始化它。

                      祝你好运,所有有趣的 C# 都在你面前。

                      【讨论】:

                        猜你喜欢
                        • 2021-07-29
                        • 2010-11-04
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2016-07-08
                        • 2018-01-27
                        • 1970-01-01
                        相关资源
                        最近更新 更多