我正在编写一个简单的练习程序,允许用户输入各种形状的角的x / y坐标,然后程序会告诉用户我创建的形状(区域,周长等)的基本事实一个名为TRIANGLE的类,我有一个方法来确定每一边的长度(并将每一边的长度分配给他们自己的变量)和周长。我正在尝试编写另一种方法来比较那些长度变量,以确定哪一侧是斜边,高度和基数。这是我到目前为止的代码:
public void GetLength()
{
string choice;
double side1length = Math.Sqrt(((corner1.x - corner2.x) + (corner1.y - corner2.y) * (corner1.x - corner2.x) + (corner1.y - corner2.y)));
double side2length = Math.Sqrt(((corner2.x - corner3.x) + (corner2.y - corner3.y) * (corner2.x - corner3.x) + (corner2.y - corner3.y)));
double side3length = Math.Sqrt(((corner3.x - corner1.x) + (corner3.y - corner1.y) * (corner3.x - corner1.x) + (corner3.y - corner1.y)));
Console.WriteLine("Which side do you want the length of? (first, second, third, perimeter)");
choice = Console.ReadLine();
switch (choice)
{
case "first":
Console.Write($"The first side is {length1} units long");
break;
case "second":
Console.Write($"The second side is {length2} units long");
break;
case "third":
Console.Write($"The third side is {length3} units long");
break;
case "perimeter":
Console.Write($"The perimeter is {length1 + length2 + length3}");
break;
}
}
public void GetArea()
{
double hypotenuse, height, Base;
if (side1length > side2length)
if (side1length > side3length)
hypotenuse = length1;
}
我是否需要在GetLength()
方法中使用out关键字?问题是我尝试访问GetArea()
方法中的变量的方式?两者都是吗?我完全违反了继承规则吗?什么是更好的方法呢?
答案 0 :(得分:0)
GetArea()
从不调用GetLength()
,其变量的范围为private
,因此GetArea()
无法使用它们。要么使用out
参数,要么将变量作为私有范围限定为类,而不是方法:
private double side1length;
private double side2length;
private double side3length;
public void GetLength()
{
string choice;
side1length = ...;
side2length = ...;
side3length = ...;
...
}
public void GetArea()
{
GetLength();
// Now you can use the variables here
....
}
答案 1 :(得分:0)
这里你已经在GetLength()方法中编写了局部变量,即side1length,side2length,...等等,所以你不能在GetArea()方法中使用它们。 您应该首先阅读此内容,然后再次尝试解决方案。 https://docs.thunderstone.com/site/vortexman/variable_scope_global_vs_local.html
答案 2 :(得分:0)
首先,永远不会调用GetLength()
,因此不会计算side*length
。{/ p>
其次,side*length
是局部变量,您最好首先查看变量范围。
有几种方法可以解决你的问题,Koby回答了一个问题。如果您愿意,也可以使用out
,但请记住在调用GetLength()
之前声明变量
public void GetLength(out double side1length, out double side2length, out double side3length) {
// ...
}
public void GetArea() {
double side1length, side2length, side3length;
GetLength(out side1length, out side2length, out side3length);
// ...
}
您还可以声明struct / class并作为变量返回。下面是使用struct的示例。
public struct SideLengths {
public double side1;
public double side2;
public double side3;
}
public SideLengths GetLength() {
SideLengths sl;
sl.side1 = Math.Sqrt(((corner1.x - corner2.x) + (corner1.y - corner2.y) * (corner1.x - corner2.x) + (corner1.y - corner2.y)));
// ...
return sl;
}
public void GetArea() {
SideLengths sl = GetLength();
// use sl.side1 instead side1length in your original code
}
此外,如果是我,我不会在功能中加入互动。最好在“main”函数中询问用户交互,而不是单个实用程序函数。例如:
public double GetLength(string which) {
double retVal;
// calculating length
return retVal;
}
static void Main() {
// other code
Console.WriteLine("Which side do you want the length of? (first, second, third, perimeter)");
choice = Console.ReadLine();
double length = GetLength(choice);
// print out the length
}
这仍然不是最好的做法,但现在比你的好。但是,我会在这个阶段离开你,因为显然你是一个初学者,如果你被推得太深,它可能会弄乱你的想法。
最后,请考虑更好地命名变量。