Оператор переключения частоты символов увеличивает неправильный индекс

#c#

Вопрос:

 public int MaxNumberOfBalloons(string text)
{
    // arr = {b, a, l, o, n}
    int[] arr = new int[5];

    foreach (char ch in text)
    {
        switch (ch)
        {
            case 'b':
                Console.WriteLine(ch);
                arr[0]  ;
                break;
            case 'a':
                arr[1]  ;
                break;
            case 'l':
                arr[2]  ;
                break;
            case 'o':
                arr[3]  ;
                break;
            case 'n':
                arr[4]  ;
                break;
            default:
                break;
        }
    }

    int counter = 0;

    Console.WriteLine("Before");

    displayArr(arr);

    while (checkArr(arr))
    {
        foreach (int i in arr)
        {
            if (i == 2 || i == 3)
            {
                arr[i] -= 2;
            }
            else
            {
                arr[i]--;
            }
        }

        counter  ;
    }

    Console.WriteLine("After");

    displayArr(arr);

    return counter;
}

public bool checkArr(int[] arr)
{
    for (int i = 0; i < arr.Length; i  )
    {
        if (i == 2)
        {
            if (arr[i] > 1)
                continue;
            else
                return false;
        }
        if (i == 3)
        {
            if (arr[i] > 1)
                continue;
            else
                return false;
        }
        if (arr[i] == 0)
            return false;
    }
    return true;
}
 

Результаты теста для входной строки: text = «bb»

Вывод на консоль перед циклом while:

 b
b
Before
0
2
2
2
2
 

Через некоторое время цикл:

 After
0
2
2
2
2
 

counter возвращено 1.

Вопрос: Почему оператор switch работает не так, как ожидалось?

Наблюдение: Увеличивается весь остальной индекс, кроме того, который должен. Я написал Консоль.WriteLine в случае, если предполагается, что он приземлился дважды, и это произошло, но он увеличил все остальные индексы, кроме этого.

Метод отображения очень прост: простой итератор, который выводит содержимое каждого индекса в переданном ему массиве.

В основном я просто вызываю MaxNumberOfBalloons метод и передаю ему строку.

Комментарии:

1. Научитесь использовать отладчик. Пошагово просмотрите свой код и посмотрите, где ваша логика не работает (или где входные данные не соответствуют ожиданиям). Неясно, чего вы ожидаете от результата, чтобы знать, где все может пойти не так.

2. Вы также не показываете код displayArr , чтобы узнать, может ли это быть проблемой.

3. И там также не указано, что находится text на входе. Как вы вызываете этот метод?

4. Запуск вашего кода с простой реализацией displayArr показывает правильный вывод (по крайней мере, для «До»)

5. @eglease dotnetfiddle.net/gLllOx

Ответ №1:

Я думаю, что проблема в том, с displayArr чем .

Если я изменю его на:

 for (int i = 0; i < arr.Length; i  )
{
    Console.WriteLine(arr[i]);
}
 

Вы печатаете не массив, а индекс массива на основе значения массива.

Это работает правильно.

Поэтому вместо печати arr[0] , которая есть 2 , вы печатаете arr[arr[0]] то же arr[2] самое , что и то, что есть 0 .

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

Это очень интересная ошибка, и мне потребовалось некоторое время, чтобы ее увидеть.

Комментарии:

1. Мне пришлось распечатать i , чтобы посмотреть, что происходит. Не так-то просто решить эту проблему.

2. Я был так неправ, и я приношу извинения всем в этой теме. Это была моя вина. Спасибо вам всем.

3. Это была сложная ошибка. Не за что извиняться. Вы проделали отличную работу с dotnetfiddle. Если это решило вашу проблему, пожалуйста, отметьте ответ как решение.