Как зациклить оператор if со многими другими условиями if

У меня проблема с циклом if-оператора в моем коде. Я посмотрел на другие потоки на StackOverflow, но я не мог заставить его работать несколько раз. Программа, которую я пытаюсь создать, является базовым конвертером для литейной компании. То, что я пытался сделать, это сделать так, чтобы пользователь мог ввести тип преобразования, необходимый затем вес воска. Затем он даст пользователю правильное количество граммов драгоценного металла для использования. Проблема в том, что мне нужно запустить его с самого начала до пользователя делается с его помощью. Я попытался использовать оператор while, но он просто зацикливает другую часть if-оператора. Вот мой код для ссылки:

static void Main(string[] args)
    {
        double waxWeight, bronzeWeight, silverWeight, fourteenkGoldWeight,
            eighteenkGoldWeight, twentytwokGoldWeight, platinumWeight;
        string wW;

        bool doesUserWantToLeave = false;

        Console.WriteLine("Please specify the type of conversion you would like to accomplish:" 
            + "n(Bronze, Silver, 14k Gold, 18k Gold, 22k Gold, Platinum, or Exit):");

        string conversionType = Console.ReadLine();

        //bool B = conversionType == "Bronze";
        //bool S = conversionType == "Silver";
        //bool ftG = conversionType == "14k Gold";
        //bool etG = conversionType == "18k Gold";
        //bool ttG = conversionType == "22k Gold";
        //bool P = conversionType == "Platinum";

        while (!doesUserWantToLeave)
        {

            if (conversionType == "Bronze")
            {
                Console.WriteLine("What is the weight of the wax model?");
                wW = Console.ReadLine();
                waxWeight = double.Parse(wW);

                bronzeWeight = waxWeight * 10;
                Console.WriteLine("You need " + bronzeWeight + " grams of bronze.");
                Console.ReadLine();
            }

            else if (conversionType == "Silver")
            {
                Console.WriteLine("What is the weight of the wax model?");
                wW = Console.ReadLine();
                waxWeight = double.Parse(wW);

                silverWeight = waxWeight * 10.5;
                Console.WriteLine("You need " + silverWeight + " grams of silver.");
                Console.ReadLine();
            }

            else if (conversionType == "14k Gold")
            {
                Console.WriteLine("What is the weight of the wax model?");
                wW = Console.ReadLine();
                waxWeight = double.Parse(wW);

                fourteenkGoldWeight = waxWeight * 13.5;
                Console.WriteLine("You need " + fourteenkGoldWeight + " grams of 14 Karat gold.");
                Console.ReadLine();
            }

            else if (conversionType == "18k Gold")
            {
                Console.WriteLine("What is the weight of the wax model?");
                wW = Console.ReadLine();
                waxWeight = double.Parse(wW);

                eighteenkGoldWeight = waxWeight * 15;
                Console.WriteLine("You need " + eighteenkGoldWeight + " grams of 18 Karat gold.");
                Console.ReadLine();
            }

            else if (conversionType == "22k Gold")
            {
                Console.WriteLine("What is the weight of the wax model?");
                wW = Console.ReadLine();
                waxWeight = double.Parse(wW);

                twentytwokGoldWeight = waxWeight * 17.3;
                Console.WriteLine("You need " + twentytwokGoldWeight + " grams of 22 Karat gold.");
                Console.ReadLine();
            }

            else if (conversionType == "Platinum")
            {
                Console.WriteLine("What is the weight of the wax model?");
                wW = Console.ReadLine();
                waxWeight = double.Parse(wW);

                platinumWeight = waxWeight * 21.5;
                Console.WriteLine("You need " + platinumWeight + " grams of platinum.");
                Console.ReadLine();
            }

            else if (conversionType == "Exit")
            {
                doesUserWantToLeave = true;
            }

            else
            {
                Console.WriteLine("Sorry! That was an invalid option!");
                Console.ReadLine();
            }
        }
    }

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

3 ответов


вы спрашиваете только для типа металла один раз. Переместите две строки, в которых вы запрашиваете и получаете пользовательский ввод внутри while петли:

while (!doesUserWantToLeave)
{
    Console.WriteLine("Please specify the type of conversion you would like to accomplish:" 
        + "\n(Bronze, Silver, 14k Gold, 18k Gold, 22k Gold, Platinum, or Exit):");

    string conversionType = Console.ReadLine();


    if (conversionType == "Bronze")
    {
...

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

во-первых, следующие три строки повторяются после каждого if и поэтому нужно только спросить один раз в верхней части цикла:

Console.WriteLine("What is the weight of the wax model?");
wW = Console.ReadLine();
waxWeight = double.Parse(wW);

далее, последние две строки в каждом элементе if в основном повторяется, но известна только часть, которая изменяется (имя металла). Так что все они могут быть удалены и заменены только один раз в конце цикла:

Console.WriteLine("You need " + metalWeight + " grams of {0}.", 
                  conversionType.ToLower());
Console.ReadLine();

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

static void Main(string[] args)
{
    bool userWantsToStay = true;
    var conversions = new Dictionary<string, double>
    {
        { "Bronze", 10.0 },
        { "Silver", 10.5 },
        { "14k Gold", 13.5 },
        { "18k Gold", 15.0 },
        { "22k Gold", 17.3 },
        { "Platinum", 21.5 }
    };

    while (userWantsToStay)
    {
        Console.WriteLine("Please specify the type of conversion you would like to accomplish:");
        Console.WriteLine("(Bronze, Silver, 14k Gold, 18k Gold, 22k Gold, Platinum, or Exit):");
        var metalType = Console.ReadLine();

        Console.WriteLine("What is the weight of the wax model?");
        var wW = Console.ReadLine();
        var waxWeight = double.Parse(wW);

        if (conversions.ContainsKey(metalType))
        {
            var metalWeight = waxWeight * conversions[metalType];
            Console.WriteLine("You need {0} grams of {1}.", metalWeight, metalType.ToLower());
            Console.ReadLine();
        }
        else if (metalType == "Exit")
        {
            userWantsToStay = false;
        }
        else
        {
            Console.WriteLine("Sorry! That was an invalid option! Try again");
            Console.ReadLine();
        }
    }
}

это может быть улучшено (много ReadLines вероятно, может быть удален; вы не проверяете, является ли ввод веса допустимым двойным перед разбором), но он установит вас на правильный путь.


вы должны повторно назначить пользовательскую опцию в конце цикла, иначе она никогда не изменится:

while (!doesUserWantToLeave)
{
    if (conversionType == "Bronze")
    {
        //....
    }
    // ...
    else if (conversionType == "Exit")
    {
        doesUserWantToLeave = true;
    }
    else
    {
        Console.WriteLine("Sorry! That was an invalid option!");
    }
    conversionType = Console.ReadLine();
}

таким образом, вы также должны удалить все другие Console.ReadLine(); в курсе. Вы также можете использовать break вместо doesUserWantToLeave = true который выходит из цикла.


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

public void Main(string[] args)
{
   while(!doesUserWantToLeave) {
      Console.WriteLine("Please specify the type of conversion you would like to accomplish:" 
      + "\n(Bronze, Silver, 14k Gold, 18k Gold, 22k Gold, Platinum, or Exit):");
      string conversionType = Console.ReadLine();

      Console.WriteLine("What is the weight of the wax model?");
      double waxWeight = double.Parse(Console.ReadLine());

      double weight = ConvertMethod(conversionType, waxWeight);

      Console.WriteLine(string.Format("You need {0} grams of {1}.", weight, conversionType));
   }
}

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

public double ConvertMethod(string type, double weight)
{
   switch(type) {
      case "Silver":
         return weight * 10.5;
      case "Bronze":
         return weight * 10;

     // etc...
   }
}