Member 14075859 Ответов: 3

Мне нужно выйти из цикла, но оператор goto не работает


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

Что я уже пробовал:

START:
            //menu at the start
            Console.WriteLine("Welcome to Caesar Cipher Program!");
            Console.WriteLine("---------------------------------");

            
            Console.WriteLine("Please press 1 for Encyption ");
            Console.WriteLine("Please press 2 for Decryption ");
            Console.WriteLine("Please press 3 for Analysis ");
            Console.WriteLine("Please press 4 for About ");
            Console.WriteLine("Please press 5 to Exit ");
            int Choice = 0;
            Choice = Convert.ToInt32(Console.ReadLine());
            string InputText;

            
            //encryption


            if (Convert.ToBoolean(Choice==1))
            
            {
                
                Console.WriteLine("Please type in a text or character to encrypt: ");
                InputText = Console.ReadLine();

                Console.WriteLine("Please input your key(integer only): ");
                int key;
                key = Convert.ToInt32(Console.ReadLine());

                Console.WriteLine("Your encrypted text is : ");

                string EncryptedText;
                EncryptedText = Encrypt(InputText, key);
                Console.WriteLine(EncryptedText);

                //giving user choice to exit or restart program
                Console.WriteLine("Press 1 to exit or 2 to re start program! ");
                int choice2 = 0;
                if (Convert.ToBoolean(choice2==1))
                {
                    return;
                }

                if (Convert.ToBoolean(choice2==2))
                {
                    goto START;
                }

            }

3 Ответов

Рейтинг:
6

OriginalGriff

Во-первых, забудь об этом goto существует вообще - и не пытайтесь им пользоваться, пока не наберетесь хотя бы пятилетнего опыта. К тому времени вы будете знать, когда вам действительно нужно использовать его, а когда это огромная ошибка. До тех пор, если вы считаете, что вам нужно использовать его, ваш дизайн плох и нуждается в переработке.

C# предоставляет множество конструкций циклов, в том числе

while (condition)
   {
   statements;
   }
И
do
   {
   statements;
   } while (condition);
Они помогают вашему коду быть более чистым от нагрузки, чем в настоящее время, и это делает ваш код более надежным и ремонтопригодным.

И, честно говоря, там есть много такого, что показывает отсутствие понимания.
Например:
if (Convert.ToBoolean(Choice==1))
== - это оператор, который сравнивает два элемента и возвращает true, если они одинаковы, и false, если они разные. Так почему же вам нужно преобразовать результат в логическое значение? Это уже бул!
if (Choice == 1)
Делает то же самое, и его легче читать.

Существует также switch оператор в C#, который будет "очищать" ваш код:
string choice = "";
while (choice != "5")
   {
   PrintMenu();
   choice = Console.GetLine();
   switch (choice)
      {
      case "1": Encrypt(); break;
      case "2": Decrypt(); break;
      case "3": Analysis(); break;
      case "4": About(); break;
      case "5": return;
      default: Console.WriteLine("Unknown choice: {0}, please try again.", choice); break;
      }
   }
Затем поместите каждую "функцию" в отдельный метод, и все это начнет выглядеть аккуратнее и проще в работе!


Member 14075859

Спасибо за ваше предложение
но часть if (Choice == 1)
он говорит, что не может преобразовать строку в bool

OriginalGriff

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

Member 14075859

Ну спасибо Вам большое сэр
Этот переключатель мне очень помог

OriginalGriff

Это значительно облегчает чтение кода, не так ли? :смеяться:

Dave Kreskowiak

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

Значит... никогда и это всегда ошибка? (конечно, зависит от языка)
:)

Рейтинг:
2

RickZeeland

Проблема в том, что ваша переменная choice2 всегда равна 0:

int choice2 = 0;


Рейтинг:
1

Patrice T

Может быть, вам стоит попробовать прочитать клавиатуру и сохранить чтение в choice2 вместо нуля.

int choice2 = 0;


Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

Отладка кода C# в Visual Studio - YouTube[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.