我是c#的新手并且不知道如何在我的计算器应用程序中使用方法,我分别编写这个4计算器,但不知道如何使用方法将它们组合在一起。 我的导师说这个程序的每个独立的动作/过程应该是一种方法,我不知道该怎么做。
此计算器允许用户从以下主菜单中进行选择:
当前代码:
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");
答案 0 :(得分:2)
目前,您的各种计算器都是这样开始的:
static void Main(string[] args) {
这意味着每个计算器都在名为“主要”的方法中。 (如果&#39;方法&#39;是一个令人困惑的词,请尝试将它们视为&#39;子程序&#39;或&#39;功能&#39;现在。)
您需要重命名不同的方法以拥有自己的名称,例如&#39; LengthCalculator&#39; WaistToHeightCalculator&#39;等,像这样:
static void LengthCalculator(string[] args) {
如果您愿意,可以将所有方法保留在一个类中(即将它们移动到类的右大括号}
内(而不是命名空间,这是文件中最外面的大括号)。这不是&# 39; t必然是良好的练习,但它会让事情变得更简单。
程序本身目前看起来像这样:
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();
}
有更好的方法来构建这个,但它会做到。你需要什么,说什么做什么&#39;是一个if... else if...
块(同样,有更好的方法,但我会保持简单):
if (menuOption == 1) {
LengthCalculator();
} else if (menuOption == 2) {
BodyMassIndexCalculator();
}
等。此语法LengthCalculator()
用于调用&#39;方法(即运行子程序)。
现在,当用户进入菜单选项时,将调用正确的计算器。
答案 1 :(得分:1)
为了减少main方法的混乱,你应该移开计算每件事物的逻辑。
Separating your concerns将允许您的代码具有可扩展性和更少的耦合。
您可以使用接口实现此目的:
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;
}
}
现在你的逻辑已经从主方法中移开了,有多种方法可以使用它们,即枚举,泛型或手动。
这里有趣的是接口中的params double[] values
参数,它允许您提供任意数量的参数,缺点是知道它们应该是什么。您当然知道它们必须是什么,但作为提示,我已将它们指定到XML文档中。每个具体实施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;
}
}
就个人而言,我会手动调用它们,因为在输入代码时,Intellisense会显示文档,即您将知道应该发送哪些值来反对通过对象浏览器浏览每个文件的定义。 / p>
我希望我已经解决了您的主要问题,如果不是毫不犹豫地评论和/或更新您的问题并提供更多详细信息。