双数组的问题

本文关键字:问题 数组 | 更新日期: 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();)来修复它。

由于这看起来可能是一个家庭作业问题,我尽量不在我的答案中给出一个直接的解决方案,但我看到您的代码中有许多值得您检查的问题部分。

  1. 为什么是X, Y, Z数组?每次通过外部循环创建一个新数组,将数组的长度设置为行中元素的数量,然后只将值赋给X和Y中的一个元素,并且从不将Z赋给任何东西。

  2. 正如photo在他的回答中所暗示的,for (int n = 0; n < 1; n++)的目的是什么?

  3. 你想用do-while循环完成什么?正如Skeet先生在评论中提到的那样,X[n]Y[n]Z[n]不存在,因为n不存在于它所声明的循环之外。即使它确实存在,Z[n]也将永远为零,因为在Z数组初始化后,您永远不会给它赋值,所以do-while循环将永远运行。