我需要创建一个从.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);
}
}
答案 0 :(得分:0)
在调试器中逐步执行代码。特别注意线的行为
for (int n = 0; n < 1; n++)
这个循环会执行多少次?在循环的每次迭代中,n的值是多少?
答案 1 :(得分:0)
嗯,我注意到的一件事是当你设置你的X,Y,Z变量时,你将它设置为数组对象的长度而不是它的值 - 这是故意的吗?
在行上放置一个调试中断: double SurfaceArea =(X [n] * Y [n + 1]) - (X [n + 1] * Y [n]); 并检查数据类型“X”,“Y”和“Z”
我在过去遇到过问题,它试图将它们计算为字符串(因为它将数据源作为字符串从数据源中取出)。我最后通过将CInt()添加到每个变量(或Convert.ToInt32();)来修复它。
希望这有帮助。
答案 2 :(得分:0)
由于这可能是一个家庭作业问题,我试图不直接解决我的答案,但我看到你应该检查的代码中有一些可疑的部分。
为什么X,Y,Z阵列?您每次通过外部循环创建一个新数组,将数组的长度设置为行中元素的数量,然后仅将值分配给X和Y的一个元素,并且永远不会将Z赋值给任何东西。
正如phoog在答案中所说,目的是什么:for (int n = 0; n < 1; n++)
?
你想用do-while循环做什么?正如Skeet先生的评论中提到的,X[n]
,Y[n]
,Z[n]
不存在,因为n
在循环之外不存在它被声明为。即使它确实存在,Z[n]
总是为零,因为在初始化之后你永远不会为Z数组赋值,所以do-while循环将永远运行。
答案 3 :(得分: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联系起来,以防将来你的文本来源发生变化。