OriginalGriff
Во - первых, не используйте методы преобразования с пользовательским вводом-если введенное ими значение не соответствует правильному формату, ваше приложение выйдет из строя. Вместо этого используйте методы TryParse:
double height, weight;
double BMI = 0;
if (!double.TryParse(textBox1.Text, out height))
{
MessageBox.Show($"\"{textBox1.Text}\" is not a valid height");
return;
}
if (!double.TryParse(textBox2.Text, out weight))
{
MessageBox.Show($"\"{textBox3.Text}\" is not a valid weight");
return;
}
Во-вторых, вы пропускаете случаи, когда значения равны: 18,5, между 24,9 и 25, между 29,9 и чуть меньше 30.
Измените свои тесты на эти, и вы охватите все случаи (а также сделаете свой код более читабельным):
if (BMI < 18.5)
{
...
}
else if (BMI < 25.0)
{
...
}
else if (BMI < 30.0)
{
...
}
В-третьих, особенно когда вы начинаете работу, всегда используйте фигурные скобки, даже если они не нужны, так ваш код будет более очевиден:
else if (BMI >= 30)
label3.Text = Convert.ToString(" obese");
label3.forecolor="Color.Red;
Является эквивалентом:
else if (BMI >= 30)
{
label3.Text = Convert.ToString(" obese");
}
label3.forecolor="Color.Red;
Это не одно и то же:
else if (BMI >=30)
{
label3.Text = Convert.ToString("Obese");
label3.ForeColor = Color.Red;
}
И это означает, что ForColor устанавливается в красный цвет каждый раз!
У вас также нет способа сбросить цвет после того, как кто - то набрал лишний вес, поэтому, когда вы устанавливаете задний цвет на зеленый, он никогда больше не возвращается к белому.
Лучший способ сделать это вот так:
BMI = weight / (height * height);
string text = "Major Error!";
Color backColor = SystemColors.Window;
Color foreColor = SystemColors.WindowText;
if (BMI < 18.5)
{
text = "Under Weight";
foreColor = Color.Blue;
}
else if (BMI < 25.0)
{
text = "Normal";
foreColor = Color.Black;
}
else if (BMI < 30.0)
{
text = "Over Weight";
backColor = System.Drawing.Color.Green;
foreColor = Color.White;
}
else
{
text = Convert.ToString("Obese");
foreColor = Color.Red;
}
label3.Text = text;
label3.ForeColor = foreColor;
label3.BackColor = backColor;
Заметьте, что я избавился от вашей фальшивки
Convert.ToString
вызовы также - вам не нужно преобразовывать строку в строку, это просто глупо, и делает ваш код более трудным для чтения.
Наконец, сделайте себе одолжение и прекратите использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что "TextBox8" - это номер мобильного телефона сегодня, но когда вам нужно будет изменить его через три недели, вы это сделаете? Используйте описательные имена - например, "tbMobileNo", - и ваш код станет легче читать, более самодокументируемым, легче поддерживать - и на удивление быстрее кодировать, потому что Intellisense может добраться до "tbMobile" за три нажатия клавиш, где "TextBox8" занимает размышление и 8 нажатий клавиш...