这种代码通常可以在PHP中运行,但由于C#中的范围要严格得多,所以并非如此.我不知道如何编写这段代码而不重复自己.
static double Cube()
{
Console.Write("Enter the side length of the cube: ");
try
{
double x = Convert.ToDouble(Console.Read());
return Math.Pow(x, 3);
}
catch (FormatException)
{
Console.WriteLine("Invalid input, please enter a number.");
Cube();
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
..后来在Main():
switch (choice)
{
case 0:
return;
case 1:
double final = Cube();
break;
default:
Console.WriteLine("Please enter 0 or 1.");
Main();
break;
}
Console.WriteLine("The volume is: {0}", Convert.ToString(final));
Run Code Online (Sandbox Code Playgroud)
该Cube()
方法工作正常,但在我看来它很混乱(return 1
最后让编译器开心).但是出现了一个错误,称当前上下文中不存在名称"final".它无法找到最终结果.因此,我所看到的唯一方法是将这个Console.WriteLine
语句放在double final = Cube()之后.
我也尝试double final;
在开关外面声明,然后只final
在每个案例中设置,但这也没有用.
谢谢!
Eri*_*ert 19
你是对的:这是一团糟.重来.
你的根本问题是你没有分开你的担忧.您有一个方法可以同时执行用户输入,输入验证,重试逻辑和数学运算.你应该为每个人制定方法.
此外,使用TryParse来处理故障情况,而不是异常处理.
最后,递归完全是错误的工具.问题必须具有以下特征才能通过递归来解决:
您的问题没有这些属性,因此递归自动是错误的工具.你想要的工具是一个循环.
static void Main()
{
double x = ObtainDoubleFromUser(
"Enter the side length of the cube: ",
"Please enter a number: ");
Console.WriteLine("The volume is {0}", Cube(x));
}
static double ObtainDoubleFromUser(string firstMessage, string failureMessage)
{
Console.Write(firstMessage);
while(true)
{
double result;
if (Double.TryParse(Console.Read(), out result))
return result;
Console.Write(failureMessage);
}
}
static double Cube(double x)
{
return Math.Pow(x, 3);
}
Run Code Online (Sandbox Code Playgroud)
这一切都有意义吗?如果可能,您希望避免递归和异常处理.并将您的疑虑分开.