Как можно сократить if, else if?

Рейтинг: 0Ответов: 2Опубликовано: 17.02.2023

Ребята, здравствуйте, я новичок в 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("...");

Ход программы таков: Мы запрашиваем вес и рост человека и рассчитываем Индекс Массы Тела. И при условиях что ниже или находиться каком-либо диапазоне выводим его стадию ожирения и наоборот.

Ответы

▲ -1Принят

Можно использовать 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;
    }
}
▲ 3

Pattern matching.

string message = bodyMassIndex switch
{
    < 16 => "a",
    < 18.5 => "b",
    < 25 => "c",
    < 30 => "d",
    < 35 => "e",
    < 40 => "f",
    _ => "g"
};

Console.WriteLine(message);