2014-09-24 2 views
-1

Итак, приведена кодировка для: • Проектировать, реализовывать, тестировать и дебугировать программу C#, чтобы отображать частоты суммы двух кубиков для 100 рулонов. Включите следующее:Ошибка в частотном коде на C#

  1. Объявление массива, представляющего возможные результаты бросков двух кубиков.

  2. Для каждой записи в файле приращивайте элемент массива, соответствующий этому результату.

  3. Последний, дисплей счетчика частоты для этого моделирования

Но я получаю сообщение об ошибке:

InvalidArgument=Value of '10' is not valid for 'index'. 
Parameter name: index. 

я поставил *** так что вы знаете, где сообщение показывается на части кодирование. Я не понимаю, что я делаю неправильно. Пожалуйста помоги.

private void createButton_Click(object sender, EventArgs e) 
    { 

     int[] rollArray = new int[100];   //Creates Array for holding rolls. 
     int i; 
     int dice1;        //Dice 1 
     int dice2;        //Dice 2 
     int total;        //Dice Totals. 
     int index; 
     int rollValue; 

     FrequencySum.Items.Clear(); 
     for (i = 0; i < 10; i++)    //index numbering starting at 0. 
     { 

      FrequencySum.Items.Add("0");  //Frequency values between 2 and 12. 
     } 

     for (i = 0; i < 100; i++)    //100 Dice Rolls, indexing starts at 0, there is 100 & Loop. 
     { 
      dice1 = diceRoll.Next(6) + 1;  //Rolls Dice 1 
      dice2 = diceRoll.Next(6) + 1;  //Rolls Dice 2. 
      rollValue = dice1 + dice2;   //value of the rolls for dice 1 and dice 2. 
      index = rollValue - 2;    //roll 2 is item 0 and roll 12 is item 10. 
     -----►FrequencySum.Items[index] = (int.Parse (FrequencySum.Items[index].ToString())+ 1).ToString(); *** ◄------- this is where the error comes up 

     } 

     total = 0;        //Displays total of rolls. 
     for (i = 0; i < 10; i++) 
     { 
      total += int.Parse(FrequencySum.Items[i].ToString()); 
     } 
     FrequencySum.Items.Add(total); 

    } 
+0

Проблема в том, что вы не выделили достаточное количество элементов в массиве 'Frequency.Items []'. Когда вы катите 12, вы вычитаете 2, чтобы получить индекс 10, но вы создали пространство для индексов с 0 по 9. –

+0

@BrianRogers - Итак, как бы я исправить это? – LaTachuela

+0

См. Ответ Руфуса Л. –

ответ

1

Проблема заключается в том, что вы только выделение 10 слотов, когда вам нужны 11. Помните, что оба «2» и «12» являются включительно, так что есть 11 возможностей, а не 10.

// item count: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 
// list index: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 
// dice sum: 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 

Попробуйте это:

for (i = 0; i < 11; i++) //index starts at 0 and ends at 10 (11 indexes) 
{ 
    FrequencySum.Items.Add("0"); //Frequency values between 2 and 12. 
} 

и здесь:

for (i = 0; i < 11; i++) 
{ 
    total += int.Parse(FrequencySum.Items[i].ToString()); 
} 
+0

Спасибо, Руфус, я пробовал кодирование, и это сработало. – LaTachuela

1

Ваши кости ценности действительно от 2 до 12 лет, но есть 11 значений в общей сложности, не 10. Таким образом, вы должны инициализировать список с 11 нулями, а не 10. Это, очевидно, относится и к подсчету Итого.

Ошибки вы сделали это настолько часто, он имеет свое собственное название: Off-by-one error

+0

Каков наилучший способ изменить код, чтобы он работал? – LaTachuela

Смежные вопросы