#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); Это уравнение неверно. Это уравнение необходимо заменить кодом, о котором я упоминал ранее.