簡體   English   中英

從其他方法對 arrays 進行數學運算時如何使用 ref 關鍵字?

[英]How to use ref keyword when performing mathematical operations with arrays from other methods?

我一直在嘗試實現一個程序,該程序可以從二維數組中獲取預分配的值並將其中的各個元素計算為一維 arrays,然后將其與二維數組分開顯示。

這是一個例子:

  public int[,] GetTemperatures()
        {
            int[,] dailyTemperature =
            {
                {38, 40, 42, 34},
                {55, 41, 40, 30},
                {28, 39, 21, 60},
                {61, 52, 43, 42},
                {35, 36, 30, 29},
                {24, 33, 37, 40}
            };

            Console.Write(" ");
            for (int i = 0; i < dailyTemperature.Length; i++)
            {
                Console.Write(dailyTemperature[i] + " ");
            }
            Console.WriteLine();
            for (int i = 0; i < dailyTemperature.GetLength(0); i++)
            {
                Console.Write(dailyTemperature[i].Substring(0, dailyTemperature[i].Length - 1) + " "); 

                for (int j = 0; j < dailyTemperature.GetLength(1); j++)
                {
                    Console.Write(dailyTemperature[i, j] + "    "); 
                }
                Console.WriteLine();
            }
            return dailyTemperature;
}
 public int[] GetTemperatureSum(ref int [,] dailyTemperature)
        {
            for (int i = 0; i < temperatureSum.GetLength(1); i++)
            {
                int[] temperatureSum = { 0, 1, 2, 3, 4, 5 };
                temperatureSum[0] = dailyTemperature[0, 0] + dailyTemperature[0, 1] + dailyTemperature[0, 2] + dailyTemperature[0, 3];
                temperatureSum[1] = dailyTemperature[1, 0] + dailyTemperature[1, 1] + dailyTemperature[1, 2] + dailyTemperature[1, 3];
                temperatureSum[2] = dailyTemperature[2, 0] + dailyTemperature[2, 1] + dailyTemperature[2, 2] + dailyTemperature[2, 3];
                temperatureSum[3] = dailyTemperature[3, 0] + dailyTemperature[3, 1] + dailyTemperature[3, 2] + dailyTemperature[3, 3];
                temperatureSum[4] = dailyTemperature[4, 0] + dailyTemperature[4, 1] + dailyTemperature[4, 2] + dailyTemperature[4, 3];
                temperatureSum[5] = dailyTemperature[5, 0] + dailyTemperature[5, 1] + dailyTemperature[5, 2] + dailyTemperature[5, 3];

                Console.Write(temperatureSum[i] + " ");

            }
            return temperatureSum;
        }

前者是我從中提取值的第一種方法。 我試圖將 6 行中每一行的總和相加,得到一個包含六個元素的水平一維數組。 后者是第二種方法,我在每一行中添加這些溫度的總和。

但是,我收到 CS7036 錯誤,指出“沒有給定的參數對應於‘Weather.GetTemperatureSum(ref int [ , ])’的必需形式參數‘dailyTemperature’”

天氣是 class,我試圖在其中實現它。我在 Main() 中執行程序,在 do...while 循環中調用這兩種方法以顯示 arrays。

如果有人可以幫助我,我會很高興,因為我已經堅持了幾天了。

這里不需要ref關鍵字,正常傳數組即可。 無論如何,集合類型都是通過引用傳遞的,但您可能應該在此處閱讀ref的含義: ref(C# 參考)

但是,代碼存在一些問題。 首先,您似乎在GetTemperatureSum方法的for循環中迭代了錯誤的數組。 您應該迭代輸入數組值。

其次,如果你想在for循環之外訪問temperatureSum (即作為返回值),那么你需要在for循環之外聲明它。 目前它的 scope 僅限於for循環。 編寫的代碼無法編譯。

要解決將多維數組中的值相加的實際問題,我們應該首先考慮迭代兩個維度,以便將每個“父”維度的值相加。 為此,我們可以使用嵌套for循環,其中外層循環遍歷第一個維度(一組天數),內層循環遍歷內部維度(當前集合中的天數)。 然后我們可以將每個集合的值添加到我們輸入數組的適當維度中的值(它應該被初始化為集合的數量,或者輸入數組的外部維度的值)。

例如:

public static int[] GetTemperatureSum(int[,] dailyTemperature)
{
    // Create an array to hold the sums of each set of days
    int[] temperatureSum = new int[dailyTemperature.GetLength(0)];

    // Loop over each set of days
    for (int set = 0; set < dailyTemperature.GetLength(0); set++)
    {
        // Loop over each day in the set
        for (int day = 0; day < dailyTemperature.GetLength(1); day++)
        {
            // Add this day's temp to our sum for this set
            temperatureSum[set] += dailyTemperature[set, day];
        }
    }

    return temperatureSum;
}

現在我們可以像這樣調用這個方法:

static void Main(string[] args)
{
    int[,] dailyTemperature =
    {
    {38, 40, 42, 34},
    {55, 41, 40, 30},
    {28, 39, 21, 60},
    {61, 52, 43, 42},
    {35, 36, 30, 29},
    {24, 33, 37, 40}
};

    int[] sums = GetTemperatureSum(dailyTemperature);

    for (int set = 0; set < dailyTemperature.GetLength(0); set++)
    {
        Console.ForegroundColor = ConsoleColor.White;
        Console.Write($"Set #{set + 1}: ");
        Console.ForegroundColor = ConsoleColor.Gray;

        for (int day = 0; day < dailyTemperature.GetLength(1); day++)
        {
            Console.Write(dailyTemperature[set, day]);
            if (day < dailyTemperature.GetLength(1) - 1)
            {
                Console.Write(" + ");
            }
            else
            {
                Console.Write(" = ");
            }
        }

        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine(sums[set]);
    }

    Console.ResetColor();
    Console.Write("\nDone. Press any key to exit...");
    Console.ReadKey();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM