Почему мой цикл while не проходит через все случаи, когда условия выполняются

#c# #loops #while-loop #do-while

#c# #циклы #цикл while #do-while

Вопрос:

У меня проблема с циклом while, в png, связанном ниже, вы увидите, что я пытаюсь сделать.

1

2

Если дата будет равна 5 3 0, она должна вернуться CCCDG . Что-то не так. Я не могу использовать For или Goto и должен использовать while или do-while .

 using System;

namespace FlowChart
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string wprowadzoneLiczby = Console.ReadLine();
            int[] arr = Array.ConvertAll(wprowadzoneLiczby.Split(' '), new Converter<string, int>(int.Parse)); 
                
            while (arr[0]>0)
            {
                while (arr[2]>0 amp;amp; arr[0]>0)
                {
                    arr[0] -= 1;
                    arr[2] -= 1;
                    Console.Write("C");
                }
                while (arr[2]<0)
                {
                    Console.Write("D");
                    while (arr[2]>0)
                    {
                        Console.WriteLine();
                        break;
                    }
                    while (arr[2]<=0)
                    {
                        Console.Write("G");
                        break;
                    }
                    break;
                }
                break;
            }
            while (arr[0]<0)
            {
                Console.Write("E");
                Console.Write("G");
                Console.WriteLine();
                break;
            }
        }
    }
}
 

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

1. while цикл, который имеет безусловный разрыв в конце, по сути, является просто if оператором.

2. В вашем примере ввод 5 3 0 , arr[2] будет равен 0 . Почему какой-либо из (внутренних) циклов должен выполняться, когда у вас есть условия, требующие arr[2] , чтобы они не были равны 0?

3. Возможно, полезно прочитать книгу Эрика Липперта » Как отлаживать небольшие программы»

4. Хорошо, итак, у меня есть другой вопрос, возможно, глупый, но если while внутри while заканчивается, он возвращается к первому while или переходит к следующему.

5. Я хочу подчеркнуть важность обучения использованию отладчика. Вместо того, чтобы пытаться угадать, что делает программа, вы можете фактически следовать каждому шагу пути. К сожалению, это иногда упускается из виду при обучении программированию.

Ответ №1:

Такое чувство, что я делаю за вас домашнее задание 🙂 (но мне было скучно)

За этим легче следить, если вы используете переменные «x», «y», «z», а не массив. Я уверен, что есть другие способы учета этого. Особенно часть «z> 0» на блок-схеме. Но это «нормально».

Обратите внимание, что в вашем коде этот последний цикл может никогда не завершиться, поскольку его можно получить с x> 0, если x> y в начале.

Обратите внимание, я учел это, чтобы просто принимать числа в виде строки. Просто я ленив и не хочу продолжать вводить строки по мере кодирования. Я уверен, что вы можете реорганизовать этот бит по мере необходимости.

Обратите break внимание на то, чтобы избежать этого цикла.

Также обратите внимание, что есть несколько способов, которыми это может привести к сбою. т.е. что произойдет, если вы введете менее 3 чисел?

Как говорили другие… Узнайте, как использовать отладчик для пошагового выполнения вашего кода. Узнайте о «модульных тестах». Они будут «утверждать», что вы получаете правильный вывод для каждого ввода. Это означает, что вы можете просто «запустить тесты», чтобы проверить, какие из них завершились неудачей, вместо того, чтобы вручную вводить строки снова и снова.

         static void Main(string[] args)
        {
            V2("1 2 3");
            V2("-2 0 2");
            V2("1 -1 2");
            V2("2 2 0");
            V2("5 3 0");

            Console.ReadLine();
        }

        static void V2(string numbers)
        {
            Console.Write(numbers   " = ");
            string[] n = numbers.Split(' ');

            int x = int.Parse(n[0]);
            int y = int.Parse(n[1]);
            int z = int.Parse(n[2]);

            while (x > 0)
            {
                while (y > 0)
                {
                    x -= 1;
                    y -= 1;
                    Console.Write("C");
                }
                Console.Write("D");
                break;
            }
            if (x <= 0)
            {
                Console.Write("E");
            }

            if (x <= 0 || z <= 0)
            {
                Console.Write("G");
            }

            Console.WriteLine();
        }
    }
 

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

1. Я ценю ваш вклад. При написании этого кода я предполагал, что данные будут введены правильно, и важно не использовать arr [0], а присваивать переменной. Однако это короткий код, и я сосредоточен только на использовании функции while . Через несколько минут я пришел к правильному решению. Я не ожидал, что кто-то что-то напишет для меня. Это также мой первый пост, и я понятия не имею, как завершить вопрос. Я желаю всем хорошего дня. И мой урок с сегодняшнего дня — научиться debbug!

2. Не беспокойтесь. Мы все учимся. Комментарий «домашнее задание» должен был быть шуткой. Вероятно, не очень хорошо перевел. Итак, я тоже кое-что узнал. Ни один из комментариев не был задуман как критика. Просто наблюдения. Рад слышать, что вы добились прогресса.