Как зациклить оператор 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...
}
}