Как можно сократить if, else if?
Ребята, здравствуйте, я новичок в c# и хотел бы узнать, как можно сделать более компактным метод и сократить кол-во if, else if? Если возможно, то как можно было бы в метод занести переменные (height и weight), чтобы убрать лишние строки кода. Вот сам код:
double BMI()
{
Console.Write("...");
double height = Convert.ToInt32(Console.ReadLine());
Console.Write("...");
double weight = Convert.ToInt32(Console.ReadLine());
return weight / Math.Pow((height / 100), 2);
}
double bodyMassIndex = BMI();
Console.WriteLine(bodyMassIndex);
if (bodyMassIndex < 16)
Console.WriteLine("...");
else if (bodyMassIndex >= 16 && bodyMassIndex < 18.5)
Console.WriteLine("...");
else if (bodyMassIndex >= 18.5 && bodyMassIndex < 25)
Console.WriteLine("...");
else if (bodyMassIndex >= 25 && bodyMassIndex < 30)
Console.WriteLine("...");
else if (bodyMassIndex >= 30 && bodyMassIndex < 35)
Console.WriteLine("...");
else if (bodyMassIndex >= 35 && bodyMassIndex < 40)
Console.WriteLine("...");
else if (bodyMassIndex >= 40)
Console.WriteLine("...");
Ход программы таков: Мы запрашиваем вес и рост человека и рассчитываем Индекс Массы Тела. И при условиях что ниже или находиться каком-либо диапазоне выводим его стадию ожирения и наоборот.
Ответы (2 шт):
Автор решения: Aleksandr Fetisov
→ Ссылка
Можно использовать switch вместо if elif else Что-то вроде этого будет
double BMI()
{
Console.Write("...");
double height = Convert.ToInt32(Console.ReadLine());
Console.Write("...");
double weight = Convert.ToInt32(Console.ReadLine());
return weight / Math.Pow((height / 100), 2);
}
double bodyMassIndex = BMI();
Console.WriteLine(bodyMassIndex);
switch (bodyMassIndex)
{
case var n when n < 16:
Console.WriteLine("...");
break;
case var n when n < 18.5:
Console.WriteLine("...");
break;
case var n when n < 25:
Console.WriteLine("...");
break;
case var n when n < 30:
Console.WriteLine("...");
break;
case var n when n < 35:
Console.WriteLine("...");
break;
case var n when n < 40:
Console.WriteLine("...");
break;
default:
Console.WriteLine("...");
break;
}
Есть еще вариант занести переменные height и weight в метод BMI, можетешь передать их как параметры. Примерно так:
double BMI(double height, double weight)
{
return weight / Math.Pow((height / 100), 2);
}
Console.Write("...");
double height = Convert.ToInt32(Console.ReadLine());
Console.Write("...");
double weight = Convert.ToInt32(Console.ReadLine());
double bodyMassIndex = BMI(height, weight);
Console.WriteLine(bodyMassIndex);
switch (bodyMassIndex)
{
case var n when n < 16:
Console.WriteLine("...");
break;
case var n when n < 18.5:
Console.WriteLine("...");
break;
case var n when n < 25:
Console.WriteLine("...");
break;
case var n when n < 30:
Console.WriteLine("...");
break;
case var n when n < 35:
Console.WriteLine("...");
break;
case var n when n < 40:
Console.WriteLine("...");
break;
default:
Console.WriteLine("...");
break;
}
Окей, ну вот вариант короткий
double BMI()
{
Console.Write("Введите рост в см: ");
double height = Convert.ToInt32(Console.ReadLine());
Console.Write("Введите вес в кг: ");
double weight = Convert.ToInt32(Console.ReadLine());
return weight / Math.Pow((height / 100), 2);
}
double bodyMassIndex = BMI();
Console.WriteLine("Ваш ИМТ: " + bodyMassIndex);
string[] messages = {"Выраженный дефицит массы тела", "Недостаточная (дефицит) масса тела",
"Норма", "Избыточная масса тела (предожирение)", "Ожирение I степени",
"Ожирение II степени", "Ожирение III степени (морбидное)"};
double[] ranges = {0, 16, 18.5, 25, 30, 35, 40};
for (int i = 0; i < ranges.Length - 1; i++)
{
if (bodyMassIndex >= ranges[i] && bodyMassIndex < ranges[i + 1])
{
Console.WriteLine(messages[i]);
break;
}
}
Автор решения: Alexander Petrov
→ Ссылка
string message = bodyMassIndex switch
{
< 16 => "a",
< 18.5 => "b",
< 25 => "c",
< 30 => "d",
< 35 => "e",
< 40 => "f",
_ => "g"
};
Console.WriteLine(message);