首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#中的二维数组方程

C#中的二维数组方程
EN

Stack Overflow用户
提问于 2011-10-14 23:06:35
回答 1查看 136关注 0票数 1

我有一个310行120列的数组。

我每隔10秒从串行端口获取填充此数组的数据。

如何将此数据发送到数组的第一行,并在下一次迭代中将其发送到下行,并持续到操作完成?

完成后,取数组的最大值、最小值和平均值。最后,数组中所选单元格的平均值、最大值和最小值。

在C#中使用数组可以做到这一点吗?

代码语言:javascript
运行
复制
([7,31]-xxxxx.MIN([$28$5:$45$95])/(xxxxx.MAX[$28$5:$46$95]-xxxxx.MIN[$28$5:$45$95])
EN

回答 1

Stack Overflow用户

发布于 2012-08-18 01:23:23

你在问题下面所做的评论有点澄清了它,但是评论的扭曲性质把这一行搞乱了:

...receive a string like 0#,22008,21930,000000#,22008,21930,00000,n/ a,n/a!但只能使用0#,22008,21930,00000。那个..。

所以我现在假设那些奇怪的字符是一个结束符。以其他方式调整它。

设置数组长度120是完全不必要的,并且二维数组在这里没有添加新的可用方法。我们将使用锯齿数组来代替。310的长度可能是有原因的,所以我们将保留它。

因此,在每一行上,前24个“单元”是来自流的输入。我不熟悉端口,但我可以放心地假设您可以将RS485/USB路由到Stream对象。单元格0、4、8、12、16和20用it填充,{01,02,03,04,05,06}中的一个表示它来自哪个LPC。

但在稍后的评论中,你会指定你想要这样:

(32,6-MIN(28,541,96))/(MAX(28,541,96)-MIN(28,541,96))

即使在Excel中,这也需要这些ID的最小/最大/平均值。我们在这段代码中避免了这一点,它忽略了这些列。

代码语言:javascript
运行
复制
class LaserArray
{
    private int minimum;
    private int maximum;
    private double average;
    private bool finishedReading;
    private StreamReader sr;

    public int Minimum
    { get { return finishedReading ? minimum : -1; } }
    public int Maximum
    { get { return finishedReading ? maximum : -1; } }
    public double Average
    { get { return finishedReading ? average : -1; } }
    public bool FinishedReading
    { get { return finishedReading; } }
    public bool StreamInitialized
    { get { return sr != null; } }

    private int[][] arr;

    public LaserArray()
    {
        arr = new int[310][];
        finishedReading = false;
    }

    public bool InitStream(Stream s)
    {
        try
        {
            sr = new StreamReader(s);
            /*alternatively, as I have no clue about your Stream:
             * sr = new StreamReader(s, bool detectEncodingFromByteOrderMarks)
             * sr = new StreamReader(s, Encoding encoding)
             * sr = new StreamReader(s, Encoding encoding, bool detectEncodingFromByteOrderMarks)
             * sr = new StreamReader(s, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
             * */
        }
        catch(Exception)
        {
            Console.WriteLine("Invalid Stream object.");
            sr = null;
            return false;
        }
        return true;
    }

    public void ReadInData()
    {
        if (sr == null)
        {
            Console.WriteLine("Initialize a Stream with UseStream first.");
            return;
        }
        if (finishedReading)
        {
            Console.WriteLine("The stream is already read.");
            return;
        }

        minimum = int.MaxValue; maximum = 0;
        int currentTotal = 0;

        for (int rowCounter = 0; rowCounter < 310; rowCounter++)
        {
            arr[rowCounter] = new int[24];
            int indexCounter = 0;
            for (int i = 0; i < 6; i++)
            {                                   // 0#,22008,21930,00000, n / a, n / a !
                char[] buffer = new char[28];   //123456789012345678901234  5  67  8 makes 28 characters?
                try
                {
                    sr.ReadBlock(buffer, 0, 2 + 5 + 1); 
                }
                catch (IOException e)
                {
                    //some error occurred
                    Console.WriteLine("IOException: " + e.Message);
                }

                string input = new String(buffer);
                arr[rowCounter][indexCounter] = int.Parse(input.Substring(2, 2));
                indexCounter++;

                int currentNumber;

                currentNumber = int.Parse(input.Substring(6, 5));
                arr[rowCounter][indexCounter] = currentNumber;
                currentTotal += currentNumber;
                if (currentNumber > maximum)
                    maximum = currentNumber;
                if (currentNumber < minimum)
                    maximum = currentNumber;
                indexCounter++;

                currentNumber = int.Parse(input.Substring(12, 5));
                arr[rowCounter][indexCounter] = currentNumber;
                currentTotal += currentNumber;
                if (currentNumber > maximum)
                    maximum = currentNumber;
                if (currentNumber < minimum)
                    maximum = currentNumber;
                indexCounter++;

                currentNumber = int.Parse(input.Substring(18, 5));
                arr[rowCounter][indexCounter] = currentNumber;
                currentTotal += currentNumber;
                if (currentNumber > maximum)
                    maximum = currentNumber;
                if (currentNumber < minimum)
                    maximum = currentNumber;
                indexCounter++;
            }
        }

        average = currentTotal / (double) 310;
        //succesfully read in 310 lines of data
        finishedReading = true;
    }

    public int GetMax(int topRow, int leftColumn, int bottomRow, int rightColumn)
    {
        if (!finishedReading)
        {
            Console.WriteLine("Use ReadInData first.");
            return -1;
        }

        int max = 0;

        for (int i = topRow; i <= bottomRow; i++)
            for (int j = leftColumn; j <= rightColumn; j++)
            {
                if (j == 0 || j == 4 || j == 8 || j == 12 || j == 16 || j == 20 || j == 24)
                    continue;

                if (arr[i][j] > max)
                    max = arr[i][j];
            }

        return max;
    }
    public int GetMin(int topRow, int leftColumn, int bottomRow, int rightColumn)
    {
        if (!finishedReading)
        {
            Console.WriteLine("Use ReadInData first.");
            return -1;
        }

        int min = 99999;

        for (int i = topRow; i <= bottomRow; i++)
            for (int j = leftColumn; j <= rightColumn; j++)
            {
                if (j == 0 || j == 4 || j == 8 || j == 12 || j == 16 || j == 20 || j == 24)
                    continue;

                if (arr[i][j] < min)
                    min = arr[i][j];
            }

        return min;
    }
    public double GetAverage(int topRow, int leftColumn, int bottomRow, int rightColumn)
    {
        if (!finishedReading)
        {
            Console.WriteLine("Use ReadInData first.");
            return -1;
        }

        int total = 0;
        int counter = 0;

        for (int i = topRow; i <= bottomRow; i++)
            for (int j = leftColumn; j <= rightColumn; j++)
            {
                if (j == 0 || j == 4 || j == 8 || j == 12 || j == 16 || j == 20 || j == 24)
                    continue;

                counter++;
                total += arr[i][j];
            }

        return total / (double) 310;
    }

}

这应该是不言而喻的。创建一个LaserArray,初始化流,readIn数据,然后享受结果。

此外,我很无聊,而且在度假,所以这就是为什么我要如此详细地回答一个一年前的问题。

还有声誉。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7769627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档