首页 > 解决方案 > 销售佣金 8.10 Dietel

问题描述

我无法弄清楚为什么我不断收到“索引超出数组范围”错误。我正在尝试计算要显示的薪水。有没有人可以向我解释错误消息是如何工作的。

namespace sales_commission {
    class Program {
        static void Main (string[] args) {
            const int ARRAY_LENGTH = 8;


            int[] salaries = { 210, 400, 450, 950, 800, 330, 430, 233, 223, 590, 679, 1000 };

            var salary = new int[ARRAY_LENGTH];

            foreach(int number in salaries) {

                try {
                    if (number >= 200 && number <= 299) {
                        salary[0]++;
                    } else if (number >= 300 && number <= 399) {
                        salary[1]++;
                    } else if (number >= 400 && number <= 499) {
                        salary[2]++;
                    } else if (number >= 500 && number <= 599) {
                        salary[3]++;
                    } else if (number >= 600 && number <= 699) {
                        salary[4]++;
                    } else if (number >= 700 && number <= 799) {
                        salary[5]++;
                    } else if (number >= 800 && number <= 899) {
                        salary[6]++;
                    } else if (number >= 900 && number <= 999) {
                        salary[7]++;
                    } else if (number >= 1000) {
                        salary[8]++;
                    }
                } catch (IndexOutOfRangeException ex) {
                    Console.WriteLine (ex.Message);
                    Console.WriteLine ($"salaries[{number}] = {salary[number]}");
                }

            }

            for (var result = 0; result <= salary.Length; ++result) {
                Console.WriteLine ($"{result* 100 + 200} - {result * 100 + 200 + 99}  {salary[result],15}");
            }



        }
    }
}

标签: c#

解决方案


你有 9 个薪级。200-299、300-399、400-499、500-599、600-699、700-799、800-899、900-999 和 >= 1000。这意味着您需要 9 个存储空间用于计数。数组索引从 0 开始,因此您的数组长度需要为 9,这将为您提供 [0 到 8] 个索引。

const int ARRAY_LENGTH = 8;    // This needs to be 9.

你得到一个超出范围的数组,因为:

} else if (number >= 1000) {
    salary[8]++;              // Index 8 doesn't exist, only [0 to 7] for an ARRAY_LENGTH of 8.

您的循环还访问数组边界之外的数据。这是因为循环的条件一直运行到它达到并包含长度本身的索引。因此,如果您的数组有 8 个空格 [0 到 7],那么您的循环将从 [0 到 8] 运行,并且当它访问索引 8 时,您就超出了界限。这可以很容易地修复如下: -

for (var result = 0; result <= salary.Length; ++result) {  // Change this to result < salary.Length
    Console.WriteLine ($"{result* 100 + 200} - {result * 100 + 200 + 99 {salary[result],15}");
}

推荐阅读