DEV Community

Sabin Sim
Sabin Sim

Posted on

15. C# (Project C: BMI Health Checker)

Practicing Numeric Types, Arithmetic Precision & Range-Based Logic

This project is designed to strengthen your understanding of:

  • double and floating-point behavior
  • Arithmetic operators (*, /)
  • Unit conversion
  • Range-based conditional logic
  • Sequential validation flow

This is not about health advice.

It is about thinking in numerical conditions.


Why This Project Exists

Many beginners can write formulas.

Few truly understand:

  • Why int division breaks precision
  • How unit conversion affects correctness
  • How range boundaries must be ordered
  • How else if executes sequentially

BMI calculation looks simple.

But it exposes:

  • Type system behavior
  • Runtime arithmetic rules
  • Conditional structure design

This project forces you to think about correctness before output.


System Flow

Your program must follow this structured sequence.

1. Input

Ask the user to enter:

  • Height in centimeters
  • Weight in kilograms

You must store both values using double.

Do not use int.

You must convert height from centimeters to meters.

This conversion must happen before BMI calculation.


2. Calculation

Create a method:

CalculateBMI(weight, heightInMeters)

Formula:

weight / (height * height)

Do not calculate everything inside Main.

You must separate responsibility.


3. Classification — Range Logic

After calculating BMI, classify it using if / else if.

Use these Asian standard boundaries:

  • BMI < 18.5 → "Underweight"
  • 18.5 ≤ BMI < 23 → "Normal"
  • BMI ≥ 23 → "Overweight"

You must implement this as sequential range checks.

Do not combine everything into one long condition.

Do not skip boundary comparisons.

Order matters.


4. Output

Print:

"Your BMI is XX.XX and you are [Category]."

The numeric value should display two decimal places.


Required Concepts

You must use:

  • double
  • Arithmetic operators (*, /)
  • if / else if
  • Method separation
  • Proper unit conversion

If you use int, you are missing the point.

If you skip conversion, your result will be wrong.


Design Constraints

Do not:

  • Perform integer division
  • Hard-code values inside conditions
  • Merge calculation and classification into one block
  • Skip method separation
  • Ignore boundary overlap

Your structure must reflect:

Input → Transform → Compute → Classify → Output

This is layered responsibility.


Common Beginner Mistakes

  1. Using int instead of double
    → Integer division truncates decimals.
    → The compiler performs type-based arithmetic rules.

  2. Forgetting unit conversion
    → Using 170 instead of 1.7 produces unrealistic BMI values.
    → The formula expects meters.

  3. Writing overlapping conditions
    → Example: checking bmi >= 18.5 without limiting upper bound.

  4. Incorrect ordering of else if
    → Conditions are evaluated top-down.
    → The first true condition stops evaluation.

  5. Mixing responsibilities inside Main
    → Reduces clarity of logical separation.


What the Compiler Is Really Doing

When you divide:

If both operands are int,
the compiler generates integer division instructions.

If at least one operand is double,
the operation is promoted to floating-point division.

Conditionals are evaluated sequentially.

else if is not parallel logic.

It is ordered boolean evaluation.


What Happens at Runtime

  1. Input is parsed into numeric types.
  2. Height is converted.
  3. A method call pushes arguments onto the stack.
  4. BMI is calculated using floating-point arithmetic.
  5. Conditional checks execute top-down.
  6. First true condition returns the category.
  7. Final formatted output is printed.

Every step is deterministic.

Precision and order define correctness.


What This Project Is Really Teaching

You are practicing:

  • Numeric correctness
  • Type awareness
  • Boundary design
  • Sequential evaluation
  • Responsibility separation

Real systems fail when:

Units are wrong
Types are wrong
Boundaries are wrong

This project trains you to prevent that.


Why I Am Not Posting the Solution

Because numeric logic becomes yours only when:

You calculate it
You test edge cases
You inspect decimal output
You debug incorrect ranges

Reading a solution builds familiarity.

Implementing it builds precision.

Top comments (0)