双数组的问题
本文关键字:问题 数组 | 更新日期: 2023-09-27 18:18:02
我需要创建一个程序,从.cvs文件中读取数据,并使用这些(x, y和z)值进行一系列计算。
我将文件作为字符串读取,然后将其分成3个较小的字符串,分别为x, y和z。
x、y、z坐标表示湖泊等高线的x、y坐标,深度(z)。我必须做的计算之一是计算湖泊的表面积,使用公式(x[i]*y[i+1])-(x[i+1]*y[i])
,其中z(depth) = 0
。
我可以让我的代码完美地运行,直到x[i+1]
和y[i+1]
,它一直给我一个0的值。
谁能告诉我怎么解决这个问题?
我的代码;
{
string[] ss = File.ReadAllLines(@"C:File.csv");
for (int i = 1; i < ss.Length; i++)
{
string[] valuesAsString = ss[i].Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
double[] X = new double[valuesAsString.Length];
double[] Y = new double[valuesAsString.Length];
double[] Z = new double[valuesAsString.Length];
for (int n = 0; n < 1; n++)
{
X[n] = double.Parse(valuesAsString[0]);
Y[n] = double.Parse(valuesAsString[1]);
}
do
{
double SurfaceArea = (X[n] * Y[n + 1]) - (X[n + 1] * Y[n]);
Console.WriteLine(SurfaceArea);
}
while (Z[n] == 0);
}
}
好吧,我不确定我写的对不对,所以如果你能看看我做的,告诉我是否有帮助。
稍微检查了一下之后,我想到了以下内容:
值
的类 public class ValueXyz
{
public double X { get; set; }
public double Y { get; set; }
public int Z { get; set; }
}
管理计算的类:
public class SurfaceCalculator
{
private ValueXyz[] _valuesXyz;
private double _surface;
private readonly string _textWithValues;
public SurfaceCalculator(string textWithValues)
{
_textWithValues = textWithValues;
SetValuesToCalculate();
}
public double Surface
{
get { return _surface; }
}
public void CalculateSurface()
{
for (var i = 0; i < _valuesXyz.Length; i++)
{
if (_valuesXyz[i].Z == 0)
_surface = (_valuesXyz[i].X*_valuesXyz[i + 1].Y) - (_valuesXyz[i + 1].X*_valuesXyz[i].Y);
}
}
private void SetValuesToCalculate()
{
var valuesXyz = _textWithValues.Split(' ');
_valuesXyz = valuesXyz.Select(item => new ValueXyz
{
X = Convert.ToDouble(item.Split(',')[0]),
Y = Convert.ToDouble(item.Split(',')[1]),
Z = Convert.ToInt32(item.Split(',')[2])
}).ToArray();
}
}
现在你的客户端代码可以这样做:
[TestMethod]
public void TestSurfaceCalculatorGetsAValue()
{
//var textWithValues = File.ReadAllText(@"C:File.csv");
var textWithValues = "424.26,424.26,0 589.43,231.46,0 720.81,14.22,1";
var calculator = new SurfaceCalculator(textWithValues);
calculator.CalculateSurface();
Assert.IsNotNull(calculator.Surface);
}
我不太确定我的想法是正确的如何实现公式,但我只是想暴露一个你可以使用的替代方案,你永远不会有很多方法做一件事:)。
欢呼。
顺便说一下,我的部分意图是不把你的功能捆绑在csv上,以防将来你的文本来源会改变。
在调试器中逐步检查代码。要特别注意
这一行的行为 for (int n = 0; n < 1; n++)
这个循环将执行多少次?在循环的每次迭代中n的值是多少?
嗯,我注意到的一件事是,当你设置你的X, Y, Z变量时,你将它设置为数组对象的长度而不是它的值-这是故意的吗?
在行中添加一个调试中断符:双SurfaceArea = (X [n] * Y (n + 1))——(X (n + 1) * Y [n]);并检查"X"、"Y"answers"Z"的数据类型
我在过去遇到过问题,它试图将它们计算为字符串(因为它将其作为字符串从数据源中取出)。我最终通过将CInt()添加到每个变量(或Convert.ToInt32();)来修复它。
由于这看起来可能是一个家庭作业问题,我尽量不在我的答案中给出一个直接的解决方案,但我看到您的代码中有许多值得您检查的问题部分。
-
为什么是X, Y, Z数组?每次通过外部循环创建一个新数组,将数组的长度设置为行中元素的数量,然后只将值赋给X和Y中的一个元素,并且从不将Z赋给任何东西。
-
正如photo在他的回答中所暗示的,
for (int n = 0; n < 1; n++)
的目的是什么? -
你想用do-while循环完成什么?正如Skeet先生在评论中提到的那样,
X[n]
、Y[n]
、Z[n]
不存在,因为n
不存在于它所声明的循环之外。即使它确实存在,Z[n]
也将永远为零,因为在Z数组初始化后,您永远不会给它赋值,所以do-while循环将永远运行。