2011-10-14 17 views
1

我有一個310行和120列的數組。在C中具有數組二維的方程式#

我得到的數據將從串行端口以10秒的間隔填充此數組。

如何將此數據發送到數組的第一行以及下一次迭代到下一行並持續到操作完成?

完成後,取數組的最大值,最小值和平均值。最後,選擇數組中的單元格的平均值,最大值和最小值。

這是可能的數組在C#中?

([7,31]-xxxxx.MIN([$28$5:$45$95])/(xxxxx.MAX[$28$5:$46$95]-xxxxx.MIN[$28$5:$45$95]) 
+2

代碼示例看起來像Excel,而不是C#。 – Oded

+1

你可以發佈你的數據樣本嗎?我懷疑一個簡單的foreach循環就足夠了... – Nate

+1

爲什麼不只是有一個數組列表? – Vlad

回答

1

您的問題下面提出的意見,澄清了一點,但評論的扭曲性質混亂這一行:

...收到一個字符串這樣0#,22008,21930 ,00000,n/a,n/a! 但只使用0#,22008,21930,00000。 ...

所以我現在就假設那些怪異的字符是一個結束語。否則適應。

完全不需要設置120的排列長度,並且2維陣列不增加在這裏可用的新方法。我們只需要使用鋸齒狀數組。 310的長度可能有一些原因,所以我們會保持這一點。

因此,在每一行中,前24個「單元格」是來自流的輸入。我不熟悉端口,但我可以放心地假設你可以將RS485/USB路由到Stream對象。 單元格0,4,8,12,16和20填充了{01,02,03,04,05,06}中的一個ID以指示它來自哪個LPC。

但稍後在評論中指定想要這樣的:

([32.6] -MIN([28.5]:[41,96]))/(MAX([28 ,[5]:[41,96]) - MIN([28,5]:[41,96]))

即使在Excel中,這也會佔用這些ID的最小/最大/ 。儘管我們在這段代碼中避免了這種情況,但它忽略了那些列。

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]; //123456789makes 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,初始化數據流,讀取數據,然後獲得結果。

此外,我很無聊,度假,所以這就是爲什麼我在這麼詳細的回答一個一年的問題。

也有口碑。