Question

I am new to c# and have no idea how to use methods in my calculator app,I write this 4 Calculator separately but have no idea ho to use methods to combine it together. My tutor said this program's each independent action/process should be a method and I have no idea how to do it.

This Calculator will permit the user to choose from the following main menu:

  1. Length calculator
  2. Body Mass Index calculator
  3. Waist to Height calculator
  4. Fuel Consumption calculator
  5. Exit the calculator

Current Code:

 static int ReadOption() {
        int option =0 ;
        bool ValidMainMenuOption = false;

    do{
       option = int.Parse(Console.ReadLine());

       if ((1 <=option) & (option <= 5)) {
           ValidMainMenuOption = true ;
       } else {
           ValidMainMenuOption = false;
       } // end if

       if (!ValidMainMenuOption){
           Console.WriteLine("\n\t\a Option must be 1,2,3,4,5");
           DisplayMenu();
       } //end if 
     } while (!ValidMainMenuOption);

    return option;
    } //end ReadOption

    /* Displays Main Menu
     * Precondition:true
     * postcondition: mainMenu displayed
     */
    static void DisplayMenu() {
        string mainMenu = "\n1)Length Calculator"
                        + "\n2)Body Mass Index Calculator"
                        + "\n3)Waist to Height Calculator"
                        + "\n4)Fuel Consumption Calculator"
                        + "\n5)Exit the Calculator"
                        + "\n\n Enter your option(1,2,3,4 or 5 to exit):";
        Console.Write(mainMenu);
    } //end mainMenu

    static void Main() {
        const int Exit = 5;
        int menuOption = ReadOption();



        do {
            if (menuOption != Exit) {


            }// end if

        } while (menuOption != Exit);

        // need to output terminating message 
        Console.ReadKey();

    } //end Main

} //end Class

// **LengthCalculator Code:**

static void Main(string[] args) {

        double Centimetres = 0.0, Feet = 0.0, Inches = 0.0; 
        string AnotherConversion = null;
        string LengthCalculatorMenu;
        int LengthCalculatorOption;

         do{
            LengthCalculatorMenu = ("Enter 1) Convert centimetres to feet and inches:"
                                 +  "\nEnter 2) Convert feet and inches to centimetres:");
            Console.Write(LengthCalculatorMenu);
            LengthCalculatorOption = int.Parse(Console.ReadLine());

            if (LengthCalculatorOption == 1) {
                Console.WriteLine("Please Enter the Centimetres(cm) that you wish to convert to feet and inches");
                Centimetres = double.Parse(Console.ReadLine());
                Feet = (Centimetres / 2.54) / 12;
                int iFeet = (int)Feet;
                Inches = (Feet - (double)iFeet) * 12;
                Console.WriteLine("\nThe equivalent in feet and inches is {0:G1} ft {1:G1} ins", Feet, Inches);
                Console.Write("\nWould you like to make an another conversion? \n\n(Enter Y to make an another conversion/Enter any other key to exit):");
                AnotherConversion = Console.ReadLine();
            } else if (LengthCalculatorOption == 2) {
                Console.WriteLine("Please Enter the Feet");
                Feet = double.Parse(Console.ReadLine());
                Console.WriteLine("Please Enter the Inches");
                Inches = double.Parse(Console.ReadLine());
                Centimetres = ((Feet * 12) + Inches) * 2.54;
                Console.WriteLine("\nThe equivalent in centimetres is {0:G}cm", Centimetres);
                Console.Write("\nWould you like to make an another conversion? \n\n(Enter Y to make an another conversion/Enter any other key to exit):");
                AnotherConversion = Console.ReadLine();
            }
         } while (AnotherConversion == "y" || AnotherConversion == "Y");

// **BMI Calculator code:**

 static void Main(string[] args) {

        double WeightKg = 0.0, HeightCm = 0.0, Weightlbs = 0.0, WeightOz = 0.0, BMI = 0.0, Feet = 0.0, Inches = 0.0;
        int BMIOption;
        string again = null;

     do{
        string BMIMenu = ("Which Measurement You Want to use to enter the weight and height?"
                        + "\n1)Enter 1 for Metric"
                        + "\n2)Enter 2 for British Imperial:");
        Console.Write(BMIMenu);
        BMIOption = int.Parse(Console.ReadLine());

        if (BMIOption == 1) {
            Console.Write("\nPlease Enter your Weight in Kilogram (kg):");
            WeightKg = double.Parse(Console.ReadLine());
            Console.Write("\nPlease Enter your Height in in centimetres (cm):");
            HeightCm = double.Parse(Console.ReadLine());
            BMI = WeightKg / (HeightCm / 100 * HeightCm / 100);

            if (BMI >= 35.0) {
                Console.WriteLine("\nYour BMI is {0:G},Severe Obesity", BMI);
            } else if (BMI >= 30.0) {
                Console.WriteLine("\nYour BMI is {0:G},Obese", BMI);
            } else if (BMI >= 25.0) {
                Console.WriteLine("\nYour BMI is {0:G},OverWeight", BMI);
            } else if (BMI >= 18.5) {
                Console.WriteLine("\nYour BMI is {0:G},Healthy BodyWeight", BMI);
            } else if (BMI <= 18.5) {
                Console.WriteLine("\nYour BMI is {0:G},UnderWeight", BMI);
            }//End if
            Console.Write("\nWould you like to make an another conversion? \n\n(Enter Y to make an another conversion/Enter any other key to exit):");
            again = Console.ReadLine();

            } else if (BMIOption == 2) {
            Console.WriteLine("Please Enter your Weight in Pounds (lbs):");
            Weightlbs = double.Parse(Console.ReadLine());
            Console.WriteLine("Please Enter your Weight in Ounces (oz):");
            WeightOz = double.Parse(Console.ReadLine());
            Console.WriteLine("Please Enter your Height in Feet (ft):");
            Feet = double.Parse(Console.ReadLine());
            Console.WriteLine("Please Enter your Height in Inches (ins):");
            Inches = double.Parse(Console.ReadLine());

            WeightKg = ((Weightlbs * 16) + WeightOz) / 35.2;
            HeightCm = ((Feet * 12) + Inches) * 2.54;
            BMI = WeightKg / (HeightCm / 100 * HeightCm / 100);

            if (BMI >= 35) {
                Console.WriteLine("Your BMI is {0:G},Severe Obesity", BMI);
            } else if (BMI >= 30) {
                Console.WriteLine("Your BMI is {0:G},Obese", BMI);
            } else if (BMI >= 25) {
                Console.WriteLine("Your BMI is {0:G},OverWeight", BMI);
            } else if (BMI >= 18.5) {
                Console.WriteLine("Your BMI is {0:G},Healthy BodyWeight", BMI);
            } else if (BMI <= 18.5) {
                Console.WriteLine("Your BMI is {0:G},UnderWeight", BMI);
            }//End if
            Console.Write("\nWould you like to make an another conversion? \n\n(Enter Y to make an another conversion/Enter any other key to exit):");
            again = Console.ReadLine();
           }
     } while (again == "y" || again == "Y");

// Waist to Height Code:

 static void Main(string[] args) {

        int WaistToHeightCalculatorOption;
        int GenderOption;
        string AnotherConversion = null;
        double HeightCm = 0.0, WaistCm = 0.0; 
        double WaistToHeightRatio = 0.0;
        double WaistIns = 0.0, HeightFeet = 0.0, HeightIns = 0.0, HeightTotalInIns = 0.0;

        do {
            string WaistToHeightCalculatorMenu = ("\nWhich Measurement You Want to use to enter the weight and height?"
                                               + "\n1)Enter 1 for Metric"
                                               + "\n2)Enter 2 for British Imperial:");
            Console.Write(WaistToHeightCalculatorMenu);
            WaistToHeightCalculatorOption = int.Parse(Console.ReadLine());

            if (WaistToHeightCalculatorOption == 1) {

                Console.Write("\nPlease Enter your Height in cm:");
                HeightCm = double.Parse(Console.ReadLine());
                Console.Write("\nPlease Enter your Waist in centimetres (cm):");
                WaistCm = double.Parse(Console.ReadLine());

                WaistToHeightRatio = WaistCm / HeightCm;
                Console.Write("\n1)Enter 1 If you are Male"
                            + "\n2)Enter 2 If you are Female:");
                GenderOption = int.Parse(Console.ReadLine());

                if (GenderOption == 1 && WaistToHeightRatio >= 0.536) {
                    Console.Write("\nYour Waist to Height Ration is {0}, Your Risk of Obesity Related Cardiovascular Diseases is at High Risk", WaistToHeightRatio);
                } else if (GenderOption == 1 && WaistToHeightRatio < 0.536) {
                    Console.Write("\nYour Waist to Height Ration is {0}, Your Risk of Obesity Related Cardiovascular Diseases is at low Risk", WaistToHeightRatio);
                } else if (GenderOption == 2 && WaistToHeightRatio >= 0.492) {
                    Console.Write("\nYour Waist to Height Ration is {0}, Your Risk of Obesity Related Cardiovascular Diseases is at High Risk", WaistToHeightRatio);
                } else if (GenderOption == 2 && WaistToHeightRatio < 0.492) {
                    Console.Write("\nYour Waist to Height Ration is {0}, Your Risk of Obesity Related Cardiovascular Diseases is at low Risk", WaistToHeightRatio);
                } //End if

                Console.Write("\n\nWhould you like to make an anothe conversion? /n/n Enter Y to make an another conversion/Ener any other key to exit:");
                AnotherConversion = Console.ReadLine();


            } else if (WaistToHeightCalculatorOption == 2) {
                Console.Write("\nPlase Enter your Waist in inches:");
                WaistIns = double.Parse(Console.ReadLine());
                Console.Write("\nPlease Enter the Height in feet:");
                HeightFeet = double.Parse(Console.ReadLine());
                Console.Write("\nPlease Enter the Heigt in inches:");
                HeightIns = double.Parse(Console.ReadLine());
                WaistToHeightRatio = WaistIns / HeightTotalInIns;
                HeightTotalInIns = (HeightFeet * 12) + HeightIns;
                Console.Write("\nMale Enter 1 , Female Enter 2:");
                GenderOption = int.Parse(Console.ReadLine());

                if (GenderOption == 1 && WaistToHeightRatio >= 0.536) {
                    Console.Write("Your Waist to Height Ration is {0}, Your Risk of Obesity Related Cardiovascular Diseases is at High Risk", WaistToHeightRatio);
                } else if (GenderOption == 1 && WaistToHeightRatio < 0.536) {
                    Console.Write("Your Waist to Height Ration is {0}, Your Risk of Obesity Related Cardiovascular Diseases is at low Risk", WaistToHeightRatio);
                } else if (GenderOption == 2 && WaistToHeightRatio >= 0.492) {
                    Console.Write("Your Waist to Height Ration is {0}, Your Risk of Obesity Related Cardiovascular Diseases is at High Risk", WaistToHeightRatio);
                } else if (GenderOption == 2 && WaistToHeightRatio < 0.492) {
                    Console.Write("Your Waist to Height Ration is {0}, Your Risk of Obesity Related Cardiovascular Diseases is at low Risk", WaistToHeightRatio);
                } //End if
                Console.Write("\n\nWhould you like to make an anothe conversion? /n/n Enter Y to make an another conversion/Ener any other key to exit:");
                AnotherConversion = Console.ReadLine();
            }
        } while (AnotherConversion == "Y" || AnotherConversion == "y");

// **Fuel Consumption code:**

static void Main(string[] args) {
        int FuelConsumptionMenuOption;
        double Litre = 0.0, Kilometre = 0.0, Gallon = 0.0 , Mile = 0.0 ;
        double ComsumptionPer100Km = 0.0, ComsumptionPer100KmInMPG = 0.0,ComsumptionPer100KmInKm = 0.0, ComsumptionPerGal = 0.0;
        ComsumptionPer100KmInMPG = ((Kilometre/1.609)/(Litre/4.546))*100;
        string ToSeeMPerGalOption, ToSeelPerKmOption;
        string AnotherConversion;
     do{
        string FuelConsumptionMenu = ("\nWhich Measurement You Want to use to enter the weight and height?"
                                               + "\n1)Enter 1 for Metric"
                                               + "\n2)Enter 2 for British Imperial:");
        Console.Write(FuelConsumptionMenu);
        FuelConsumptionMenuOption = int.Parse(Console.ReadLine());

        if (FuelConsumptionMenuOption == 1) {
            Console.Write("\nPlease Enter Litres(l) of Fuel used over distance travelled:");
            Litre = double.Parse(Console.ReadLine());
            Console.Write("\nPlease Enter Kilometres driven:");
            Kilometre = double.Parse(Console.ReadLine());
            ComsumptionPer100Km = Litre / (Kilometre / 100);
            Console.WriteLine("\nYour Consumption in Litres per 100 Kilometres is {0}", ComsumptionPer100Km);
            Console.Write("\nWould you like to see the equivalent result in miles per gallon (mpg)?"
                             + "\n(Press Y For yes or Press other key to cancel this option):");
            ToSeeMPerGalOption = Console.ReadLine();
            ComsumptionPer100KmInMPG = ((Kilometre / 1.609) / (Litre / 4.546)*100) ;

            if (ToSeeMPerGalOption == "Y" || ToSeeMPerGalOption == "y") {
                Console.Write("\nThe equivalent result in miles per gallon (mpg) is {0}", ComsumptionPer100KmInMPG);
            }
            Console.Write("\n\nWhould you like to make an anothe conversion? /n/n Enter Y to make an another conversion/Ener any other key to exit:");
            AnotherConversion = Console.ReadLine();

        } else if (FuelConsumptionMenuOption == 2) {
            Console.Write("\nPlease Enter Gallons (gal) of Fuel used over distance travelled:");
            Gallon = double.Parse(Console.ReadLine());
            Console.Write("\nPlease Enter Miles (m)driven:");
            Mile = double.Parse(Console.ReadLine());
            ComsumptionPerGal = Gallon / Mile;
            Console.WriteLine("\nYour Consumption in Miles per Gallon is {0}", ComsumptionPerGal);
            Console.Write("\nWould you like to see the equivalent result in litres per 100 kilometres(km)?"
                             + "\n(Press Y For yes or Press other key to cancel this option):");
            ToSeelPerKmOption = Console.ReadLine();
            ComsumptionPer100KmInKm = ((Mile * 1.609) / (Gallon * 4.546)) * 100;

            if (ToSeelPerKmOption == "Y" || ToSeelPerKmOption == "y") {
                Console.Write("\nThe equivalent result in litres per 100 kilometres(km) is {0}", ComsumptionPer100KmInKm);
            }
        }//End if 
        Console.Write("\n\nWhould you like to make an anothe conversion? /n/n Enter Y to make an another conversion/Ener any other key to exit:");
        AnotherConversion = Console.ReadLine();

     } while (AnotherConversion == "Y" || AnotherConversion == "y");
Was it helpful?

Solution

At the moment, your various calculators all start like this:

static void Main(string[] args) {

That means each calculator is within a method called 'Main'. (If 'method' is a confusing word, try thinking of them as 'subroutines' or 'functions' for now.)

You need to rename the different methods to have names of their own, for example 'LengthCalculator', 'WaistToHeightCalculator' etc, like this:

static void LengthCalculator(string[] args) {

You can keep all the methods within one class if you like (i.e. move them to within the closing brace } for the class (not the namespace, which are the outermost braces in the file). This isn't necessarily good practice but it will keep things simpler to start with.

The program itself currently looks like this:

static void Main() {
    const int Exit = 5;
    int menuOption = ReadOption();

    do {
        if (menuOption != Exit) {
             // do something
        }
    } while (menuOption != Exit);
        // need to output terminating message 
        Console.ReadKey();
}

There are better ways of structuring this, but it will do. What you need where it says 'do something' is an if... else if... block (again, there are better ways, but I'll keep it simple):

if (menuOption == 1) {
    LengthCalculator();
} else if (menuOption == 2) {
    BodyMassIndexCalculator();
}

etc. This syntax, LengthCalculator(), is used to 'call' the method (i.e. run the subroutine).

Now when a user enters the menu option, the correct calculator will be called.

OTHER TIPS

To reduce the clutter in your main method, you should move away the logic of calculating each thing.

Separating your concerns will allow for extensibility and less coupling on your code.

You can achieve this using interfaces :

internal interface ICalculator
{
    double Calculate(params double[] values);
}

internal class BmiCalculator : ICalculator
{
    /// <summary>
    /// </summary>
    /// <param name="values">Mass, height</param>
    /// <returns></returns>
    public double Calculate(params double[] values)
    {
        if (values == null) throw new ArgumentNullException("values");
        if (values.Length < 2) throw new ArgumentOutOfRangeException("values");
        double mass = values[0];
        double height = values[1];
        return mass / (Math.Pow(height, 2.0d));
    }
}

public class FuelConsumptionCalculator : ICalculator
{
    /// <summary>
    /// </summary>
    /// <param name="values">Litres, per kilometers, distance</param>
    /// <returns></returns>
    public double Calculate(params double[] values)
    {
        if (values == null) throw new ArgumentNullException("values");
        if (values.Length < 3) throw new ArgumentOutOfRangeException("values");
        double liters = values[0];
        double perKilometers = values[1];
        double distance = values[2];
        return (liters * perKilometers) / distance;
    }
}

Now that your logic has been moved away from your main method there are multiple approaches on how to use them, namely enums, generics or manually.

The interesting thing here is params double[] values parameter in the interface, it allows you to supply any number of parameters, the downside is to know what they should be. You certainly know what they must be but as a hint I've specified them onto the XML doc. of each concrete implementation of ICalculator.Calculate.

internal enum Calculation
{
    Bmi,
    FuelConsumption
}

internal class Demo
{
    public Demo()
    {
        var valuesBmi = new[] { 60.0d, 1.70d };
        var valuesFc = new[] { 65.0d, 100.0d, 500.0d };

        double withEnum1 = WithEnum(Calculation.Bmi, valuesBmi);
        double withEnum2 = WithEnum(Calculation.FuelConsumption, valuesFc);

        double withGenerics1 = WithGenerics<BmiCalculator>(valuesBmi);
        double withGenerics2 = WithGenerics<FuelConsumptionCalculator>(valuesFc);

        double manually1 = new BmiCalculator().Calculate(valuesBmi);
        double manually2 = new FuelConsumptionCalculator().Calculate(valuesFc);
    }

    private static double WithGenerics<T>(params double[] values) where T : ICalculator, new()
    {
        var foo = new T();
        return foo.Calculate(values);
    }

    private static double WithEnum(Calculation calculation, double[] values)
    {
        double calculate;
        switch (calculation)
        {
            case Calculation.Bmi:
                var bmiCalculator = new BmiCalculator();
                calculate = bmiCalculator.Calculate(values);
                break;
            case Calculation.FuelConsumption:
                var fuelConsumptionCalculator = new FuelConsumptionCalculator();
                calculate = fuelConsumptionCalculator.Calculate(values);
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }
        return calculate;
    }
}

Personally I would invoke them manually as when typing the code, Intellisense will show the documentation, i.e. you will know what values should be sent against having to browse the definition of each through Object Browser.

enter image description here

I hope I've addressed your main concern, if not do not hesitate to comment and/or update your question with more details.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top