Проблемы с двойным массивом? - PullRequest
0 голосов
/ 15 декабря 2011

Мне необходимо создать программу, которая считывает данные из файла .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);
   }
}

Ответы [ 4 ]

0 голосов
/ 16 декабря 2011

Хорошо, я не уверен, правильно ли я понял, так что если вы посмотрите на то, что я сделал, и скажите мне, поможет ли это.

После небольшой проверки я придумал следующее:

Класс для значений

    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 на случай, если ваш источник текста в будущем изменится.

0 голосов
/ 15 декабря 2011

Хорошо, одна вещь, которую я заметил, - когда вы устанавливаете свои X, Y, Z переменные, вы устанавливаете для него длину объекта массива вместо его значения - это преднамеренно?

Поместите разрыв отладки в строку с: double SurfaceArea = (X [n] * Y [n + 1]) - (X [n + 1] * Y [n]); и проверьте тип данных "X", "Y" и "Z"

В прошлом у меня были проблемы, когда он пытался вычислить их как строки (потому что он извлек их из источника данных в виде строк). Я решил исправить это, добавив CInt () к каждой из переменных (или Convert.ToInt32 ();).

Надеюсь, это поможет.

0 голосов
/ 15 декабря 2011

Поскольку это может показаться проблемой с домашней работой, я пытаюсь не дать прямого решения в своем ответе, но вижу ряд сомнительных частей вашего кода, которые вы должны изучить.

  1. Почему массивы X, Y, Z?Вы создаете новый массив каждый раз через внешний цикл, устанавливая длину массива равным количеству элементов в строке, затем назначая значение только одному элементу X и Y, и никогда не назначая Z ни к чему.

  2. Как подсказывает Фог в своем ответе, какова цель: for (int n = 0; n < 1; n++)?

  3. Что вы пытаетесь достичь с помощью цикла do-while?Как уже упоминалось в комментариях г-на Скита, X[n], Y[n], Z[n] не существует, поскольку n не существует вне цикла, для которого он объявлен.Даже если бы он существовал, Z[n] всегда будет нулем, потому что вы никогда не назначаете что-либо массиву Z после его инициализации, поэтому цикл do-while будет работать вечно.

0 голосов
/ 15 декабря 2011

Шаг через ваш код в отладчике. Обратите особое внимание на поведение линии

        for (int n = 0; n < 1; n++) 

Этот цикл будет выполняться сколько раз? Каким будет значение n во время каждой итерации цикла?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...