Наличие неправильных решений при выполнении программы,

#c#

#c#

Вопрос:

Я работал над калькулятором двух классов BMI для своего класса. Мне, наконец, удалось выполнить отладку при запуске программы. Однако я заметил, что это не позволит мне вводить высоту или вес в виде десятичной дроби.

Пример

ввод 6.4 для высоты приводит к сбою

Кажется, что указание 6 высоты и 220 веса всегда объявляет недостаточный вес и показывает неверное значение ИМТ

пример:

Высота 6

Вес 220

ИМТ: оценка $ 0.09

Он неправильно вычисляет BMI. Глядя на код, я не могу понять, почему он вычисляет это неправильно.

-Редактировать — Удалось заставить его принимать десятичные дроби! (Спасибо всем!) Однако, похоже, это все еще мешает вычислению BMI

-Редактировать- Код работает!

(Часть кода 1) Обновленный Mk2

 using System;

namespace Calculator
{

public class BMICalc
{
    private const
        decimal REQ = 703;
    private decimal weightPerson;
    private decimal heightPerson;

    public BMICalc()
    {

    }
    public BMICalc(decimal weiP, decimal heiP)
    {
        this.weightPerson = weiP;
        this.heightPerson = heiP;

    }

    public decimal SetBmi()
    {
        decimal bmi;
        bmi = Convert.ToDecimal((this.weightPerson * 0.45m) / ((this.heightPerson * 12 * 0.025m) * (this.heightPerson * 12 * 0.025m)));

        if (bmi < 18.5m)

        {
            Console.WriteLine("UnderWeight");
            Console.ReadLine();
        }
        if (bmi > 18.5m amp;amp; bmi < 25.0m)
        {
            Console.WriteLine("Normal");
            Console.ReadLine();
        }
        if (bmi > 25.0m amp;amp; bmi < 29.9m)
        {
            Console.WriteLine("OverWeight");
            Console.ReadLine();
        }
        if (bmi > 29.9m amp;amp; bmi < 40.0m)
        {
            Console.WriteLine("Obese");
            Console.ReadLine();
        }

        return bmi;
    }

    public override string ToString()
    {
        return "tCalculator"  
            "nn Weight:"   this.weightPerson  
            "nn Height:"   this.heightPerson  
            "nn BMI Score:"   SetBmi().ToString();


    }
}
}
  

Код (часть 2) Обновленный Mk 2

    namespace Calculator
{
public class App
{
    public static void Main() // 
    {
        decimal heiP, weiP;

        heiP = InputHeight();

        weiP = InputWeight();



        BMICalc bmiCal = new BMICalc(weiP, heiP);

        Console.Clear();
        Console.WriteLine(bmiCal.ToString());
        Console.ReadKey();
    }
    public static decimal InputHeight()
    {
        decimal hNumber;

        Console.Write("Please enter your height: ");
        hNumber = Convert.ToDecimal(Console.ReadLine());
        return hNumber;
    }

    public static decimal InputWeight()
    {
        Decimal wNumber;

        Console.Write("Please enter your weight: ");

        wNumber = Convert.ToDecimal(Console.ReadLine());
        return wNumber;
    }


}
}
  

Комментарии:

1. «Однако я заметил, что он не позволит мне вводить высоту или вес в виде десятичной дроби» — это потому, что вы явно ожидаете целое число — Convert.ToInt32(Console.ReadLine()) . Вы также сохраняете значения в виде целых чисел, что означает, что при вычислении BMI вы выполняете целочисленное деление . Я бы предположил, что исправление вашего приложения для обработки и хранения двойных / десятичных чисел также решит вашу проблему с вычислениями

2. Можете ли вы опубликовать какие-либо исключения, которые программа выдает при «сбое»?

3. Все ваши входные данные и вычисления предполагают, что числа являются двойными / десятичными, но все ваши типы данных являются целыми числами. В лучшем случае это приведет к ошибкам усечения, а в худшем — к сбоям. (Что, кстати, и является тем, что вы получаете.)

4. Необработанное исключение типа ‘System. FormatException’ произошло в mscorlib.dll Дополнительная информация: Входная строка была в неправильном формате.

5. Хорошо. Мне удалось изменить его, чтобы теперь он мог принимать десятичные дроби! Но, к сожалению, он по-прежнему неправильно вычисляет BMI

Ответ №1:

Вы вводите параметры в конструктор, ожидающий вес (weiP), высоту (heiP) (в таком порядке), пока вы передаете height, weight из BMICalc bmiCal = new BMICalc(heiP, weiP);

Именно по этой причине выводимое значение неверно. Поменяйте местами параметры, и все должно быть в порядке.

Редактировать

Поскольку вы вводите вес в фунтах и рост в футах, вам нужно будет преобразовать футы в дюймы (умножение на 12), а затем также умножить рост и вес на показатель преобразования.

Таким образом, формула будет:

 bmi = Convert.ToDecimal((this.weightPerson * 0.45) / ((this.heightPerson * 12 * 0.025) * (this.heightPerson * 12 * 0.025)));
  

Валюта поступает, когда используется переопределенный метод toString(). Указанный там формат предназначен для валюты.

Комментарии:

1. Хорошо, я поменялся местами, и теперь это BMICalc (weiP, heiP), и теперь он выполняет математику. Однако он по-прежнему неправильно вычисляет BMI, и по какой-то странной причине он делает это в качестве валюты? пример 6.5 и 220 генерируют 3660,59

2. Исправлена валюта, честно говоря, даже не осознавал этого. (Я основал этот код на примере из учебника, который был программой для автомобильного билета) В любом случае, то, что вы говорите, имеет смысл! Я попытался ввести код, который вы мне предоставили, до того, как он выполнит расчет BMI, однако он выдает мне ошибки, в которых говорится, что «Оператор ‘*’ не может быть применен к десятичной или двойной

3. Я думаю, вам может потребоваться преобразовать значения 0.45 и 0.025 в десятичные, и это должно устранить ошибку, о которой вы упомянули.

4. Хорошо, это исправило ошибку. (Спасибо) Однако он по-прежнему дает тот же результат, о котором я упоминал ранее. Я должен был поместить эту строку между десятичным bmi; и bmi = (this. weightPerson * BMICalc.REQ) / (это. Высоченный человек * это. heightPerson); верно? Может быть, это неправильное уравнение или, может быть, все операторы if.

5. bmi = (это. weightPerson * BMICalc.REQ) / (это. Высоченный человек * это. heightPerson); Это уравнение неверно. Это уравнение необходимо заменить кодом, о котором я упоминал ранее.