В настоящее время используется C # и возникают проблемы с циклом - PullRequest
0 голосов
/ 29 сентября 2019

В настоящее время у меня возникают проблемы с зацикливанием следующего кода, поэтому часть else снова задает вопрос.

String name, wtd, act, trav;        
Console.WriteLine("What is your name?");
name = Console.ReadLine();
Console.WriteLine("Hello {0}, What do you want to do today?", name);
Console.WriteLine("1) Action\n2) Chilling\n3) Danger\n4) Good Food\n");
int result, ppl;
result = Convert.ToInt32(Console.ReadLine());
if (result == 1)
{
    wtd = "action";
    act = "Stock Car Racing";
}
else if (result == 2)
{
    wtd = "chilling";
    act = "Hiking";
}
else if (result == 3)
{
    wtd = "danger";
    act = "Skydiving";
}
else if (result == 4)
{
    wtd = "good food";
    act = "to Taco Bell";
}
else
{
    wtd = "";
    act = "";
    Console.WriteLine("I do not understand. Please select again");
}
Console.WriteLine("Okay. If you are in the mood for " + wtd + ", then you should go " + act + "and travel in " + trav +".");

* Остальная часть кода работает нормально.trav переменная работает нормально

Я пытался использовать цикл while, но он всегда возвращается с ошибками или не запускается так, как я хочу.Одной из наиболее распространенных ошибок при использовании цикла while являются « использование неназначенной локальной переменной wtd» и « использование неназначенной локальной переменной act».Эти ошибки происходят в последней Console.WriteLine части кода.

Мне также нужно, чтобы переменные определялись на основе используемого ввода, и я хотел бы, чтобы они зацикливались, если есть какой-либо недопустимый ввод, как и любое другое значение, кромеперечисленные (1,2,3,4).

Ответы [ 3 ]

1 голос
/ 29 сентября 2019

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

Что-то вроде этого должно работать:

int result = Convert.ToInt32(Console.ReadLine());
int ppl;
while (result < 1 && result > 4)
{
    Console.WriteLine("I do not understand. Please select again");
    result = Convert.ToInt32(Console.ReadLine());
}

Что касается ошибки, которую вы«использование неназначенной локальной переменной wtd» просто означает, что переменной не может быть присвоено значение, когда вы пытаетесь печатать в конце.Это исправлено простой инициализацией значения, когда вы объявляете значение сверху:

String name = "", wtd = "", act = "", trav = "";
0 голосов
/ 29 сентября 2019

Вы должны использовать Int32.TryParse, чтобы подтвердить, что ввод является действительным int.Используя do while, вы можете проверить число от 1 до 4 включительно.Я также рекомендую использовать switch вместо if elseif.

int result, ppl;
String name, wtd, act, trav;        
Console.WriteLine("What is your name?");
name = Console.ReadLine();
Console.WriteLine("Hello {0}, What do you want to do today?", name);
do
{
    Console.WriteLine("1) Action\n2) Chilling\n3) Danger\n4) Good Food\n");
    Console.WriteLine("I do not understand. Please select again");
} while (!Int32.TryParse(Console.ReadLine(), out result) || result < 1 || result > 4)
switch (result)
{
    case 1:
        wtd = "action";
        act = "Stock Car Racing";
        break;
    case 2:
        wtd = "chilling";
        act = "Hiking";
        break;
    case 3:
        wtd = "danger";
        act = "Skydiving";
        break;
    case 4:
        wtd = "good food";
        act = "to Taco Bell";
        break;
    default:
        wtd = act = "";
}
Console.WriteLine("Okay. If you are in the mood for " + wtd + ", then you should go " + act + "and travel in " + trav +".");
0 голосов
/ 29 сентября 2019

Для неназначенных сообщений о локальных переменных, если вы объявили переменные вне цикла и просто использовали их внутри цикла, появятся неназначенные информационные сообщения о локальных переменных, это не нарушит работу приложения, оно просто скажет вам, что вы этого не сделалииспользуйте переменную в текущей области видимости.Это хорошая функция, которая поможет вам очистить код от неиспользуемых переменных.

Что касается вашего кода, вы можете сделать это следующим образом:

string name = string.Empty, wtd = string.Empty, act = string.Empty, trav = string.Empty;
int result = 0, ppl = 0;
bool isTrue = true;
Console.WriteLine("What is your name?");
name = Console.ReadLine();
Console.WriteLine("Hello {0}, What do you want to do today?", name);
while (isTrue)
{
    Console.WriteLine("1) Action\n2) Chilling\n3) Danger\n4) Good Food\n");
    var isValidInt = int.TryParse(Console.ReadLine(), out result);
    if(isValidInt)
    {
        if (result == 1)
        {
            wtd = "action";
            act = "Stock Car Racing";
            isTrue = false;
        }
        else if (result == 2)
        {
            wtd = "chilling";
            act = "Hiking";
            isTrue = false;
        }
        else if (result == 3)
        {
            wtd = "danger";
            act = "Skydiving";
            isTrue = false;
        }
        else if (result == 4)
        {
            wtd = "good food";
            act = "to Taco Bell";
            isTrue = false;
        }
        else
        {
            wtd = "";
            act = "";
            Console.WriteLine("I do not understand. Please select again");
        }
    }
    else
    {
        Console.WriteLine("Use numbers only");
    }
}
Console.WriteLine("Okay. If you are in the mood for " + wtd + ", then you should go " + act + "and travel in " + trav + ".");

Переменная isTrue сообщит циклу, что цикл должен продолжаться, например, если пользовательский ввод 1, для переменной будет установлено значение false, чтобы завершить цикл, если пользователь введет какие-либо числа больше 4, он просто оставит его внутри цикла и начнет все сначала.

Я также заменил эту строку result = Convert.ToInt32(Console.ReadLine()); на эту int.TryParse(Console.ReadLine(), out result);, вы всегда должны использовать TryParse вместо непосредственного преобразования целых чисел.TryParse проверит строку, если она является допустимым целым числом, затем проанализирует ее и вернет true (как целое число), а out будет проанализированным целым числом.если анализ не удался, он вернет false.

Таким образом, вы будете уверены, что получите только целые числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...