using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _20240902
{
    internal class Program
    {
        static void P1_Array練習()
        {
            //宣告一個字串陣列,放入資料,並練習取得資料顯示出來。
            Console.Write("請輸入您的字串數量: ");
            int count = int.Parse(Console.ReadLine());
            string[] strArray = new string[count];

            Console.WriteLine("請輸入您的字串:");
            for (int i = 0; i < count; i++)
            {
                strArray[i] = Console.ReadLine();  // 使用 i 作為索引
            }

            // 逐一顯示所有字串
            Console.WriteLine("以下是您的字串:");
            for (int i = 0; i < count; i++)
            {
                Console.WriteLine(strArray[i]);  // 使用 i 作為索引
            }

        }
        static void P2_練習陣列給值()
        {
            //宣告一個陣列,使用迴圈放入數值1-10
            int[] arr = new int[10];
            for (int i = 0; i < 10; i++)
            {
                arr[i] = i + 1;
            }

            //印出所有陣列
            Console.WriteLine("陣列從第一個讀取到最後一個");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"陣列內容: arr[{i + 1}]{arr[i]}");
            }

            //反轉印出
            Console.WriteLine("陣列從最後一個讀取到第一個");
            for (int i = 9; i >= 0; i--)
            {
                Console.WriteLine($"陣列內容:arr[{i + 1}] {arr[i]}");
            }
            //改成用sort
            Array.Sort(arr);
            Console.WriteLine("陣列排序後:");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"陣列內容:arr[{i + 1}] {arr[i]}");
            }
            //sort後,再反轉印出
            Array.Reverse(arr);
            Console.WriteLine("陣列反轉後:");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"陣列內容:arr[{i + 1}] {arr[i]}");
            }
        }
        static void P3_練習_費式數列()
        {
            // 陣列前兩者為1_後面的每個項目都是前兩者相加
            Console.Write("請輸入一個數值:");
            int count = int.Parse(Console.ReadLine());
            int[] arr = new int[count];
            arr[0] = 1;
            arr[1] = 1;
            for (int i = 2; i < count; i++)
            {
                arr[i] = arr[i - 1] + arr[i - 2];
            }
            Console.Clear();
            Console.WriteLine("產生結果:");
            for (int x = 0; x < count; x++)
            {
                Console.WriteLine($"陣列[{x}] 存放數字:{arr[x]}");
            }
        }

        static void p4_練習_均溫()
        {
            // 希望產生的結果如圖所示,請協助計算平均溫度
            // 26, 28, 29, 31, 35, 34, 36, 37, 36, 32, 28, 18
            //Console.WriteLine("01月\\t02月\\t03月\\t04月\\t05月\\t06月\\t07月\\t08月\\t09月\\t10月\\t11月\\t12月   ");

            // 使用 double 型別來存儲溫度
            double[] temp = { 26, 28, 29, 31, 35, 34, 36, 37, 36, 32, 28, 18 };

            // 列印月份標題
            for (int i = 0; i < temp.Length; i++)
            {
                Console.Write($"{(i + 1).ToString("D2")}月\\t");
            }// 格式化輸出月份標題
            Console.WriteLine("\\n--------------------------------------------------------------------------------------");

            // 列印溫度
            foreach (var t in temp)
            {
                Console.Write($"{t}度\\t");
            }
            // 計算平均溫度
            double total = 0;
            foreach (var t in temp)
            {
                total += t;
            }
            double average = total / temp.Length; // 平均溫度average算法
            // 格式化顯示平均溫度
            Console.WriteLine($"\\n平均溫度為 {average:F2} 度");
        }

        static void P5_多維陣列()

        {
            // 討論多維陣列,請參考這份文件後,練習自己舉一個例子
            // <https://learn.microsoft.com/zh-tw/dotnet/csharp/language-reference/builtin-types/arrays#multidimensional-arrays>
            //多維度陣列:
            //一維度的陣列:簡單的陣列,只有一個資訊。
            //二維度的陣列:有兩個資訊,一個是行,一個是列。
            //三維度的陣列:有三個資訊,一個是層,一個是行,一個是列。
            //以此類推,可以有更多維度的陣列。

            //二維陣列舉例:員工的身高和體重。
            string[,] employee = new string[2, 3];
            //宣告員工表單,第一個維度是員工名稱,第二個維度是身高體重。
            employee[0, 0] = "John";
            employee[0, 1] = "175";
            employee[0, 2] = "70";
            employee[1, 0] = "Mary";
            employee[1, 1] = "165";
            employee[1, 2] = "65";
            //所以我也可以這樣寫
            string[,] employee02 = { { "John", "175", "70" }, { "Mary", "165", "65" } };
            //這邊有兩個括弧,最大的括弧是列,裡面的小括弧則是屬性(欄位)。

            //如果要列印員工表單
            Console.WriteLine("員工表單:");
            for (int i = 0; i < 2; i++) // 列印列
            {
                for (int j = 0; j < 3; j++) // 列印欄
                {
                    Console.Write(employee[i, j] + "\\t"); // 印出員工名稱和身高體重
                }
                Console.WriteLine();
            }
            //列是列車的列,欄是欄杆的欄。

        }

        static void P6_多維陣列_屬性方法()
        {
            // 查看多維陣列有哪些屬性和方法
            int[,,] apple = new int[2, 5, 9];
            Console.WriteLine("apple.Length: " + apple.Length); // 90,查看APPLE的所有元素數量
            Console.WriteLine("apple.Rank: " + apple.Rank); // 查看此陣列的維度,此陣列是三維,所以3

            Console.WriteLine("apple.GetLength(0): " + apple.GetLength(0));
            // 2,GetLength是一種方法(method),這邊設GetLengh為0,表示查看第一維度的元素數量

        }

        static void P7_多維陣列_取值()
        {
            //如何取得所有在多維陣列中的值?
            //方法一,,用Console.WriteLine來印出所有值

            int[,,] apple = new int[3, 3, 3]
            {
                {
                    {23, 56, 78},
                    {12, 34, 90},
                    {45, 67, 89}
                },
                {
                    {11, 22, 33},
                    {44, 55, 66},
                    {77, 88, 99}
                },
                {
                    {10, 20, 30},
                    {40, 50, 60},
                    {70, 80, 90}
                }
            };
            //方法二,for,可行,只是隨著層數越多,內部便需要迴圈越多次。
            for (int i = 0; i < apple.GetLength(0); i++)//先抓取第一維度
            {
                for (int j = 0; j < apple.GetLength(1); j++)//再抓取第二維度
                {
                    for (int k = 0; k < apple.GetLength(2); k++)//最後抓取第三維度
                    {
                        Console.Write(apple[i, j, k] + "\\t");//印出所有值
                    }
                    Console.WriteLine();//換行
                }
                Console.WriteLine();//結束
            }
            Console.WriteLine("下面是foreach方法");

            //方法三,foreach,可行。
            foreach (var item in apple)
            {
                Console.Write(item + "\\t");
            }

            //方法四,join ,不可行

        }

        static void P8_不規則陣列()
        {
            // 討論不規則陣列,請參考這份文件後,練習自己舉一個例子
            // <https://learn.microsoft.com/zh-tw/dotnet/csharp/language-reference/builtin-types/arrays#jagged-arrays>
            //不規則陣列:每一個陣列的元素,同時自己也是一個陣列。
            //戶外教學時,遊覽車們是一組陣列,但遊覽車中還有由陣列組成的班級,班級中還有由小隊陣列組成的學生。

            //有三台遊覽車,每台遊覽車小隊數量不一定。
            string[][] bus = new string[3][];
            bus[0] = new string[] { "小隊1", "小隊2", "小隊3" };
            bus[1] = new string[] { "小隊4", "小隊5", "小隊6" };
            bus[2] = new string[] { "小隊7", "小隊8", "小隊9", "小隊10" };
            //[遊覽車0:小隊1,小隊2,小隊3]、[遊覽車1:小隊4,小隊5,小隊6]、[遊覽車2:小隊7,小隊8,小隊9,小隊10]
            //也可以這樣
            bus[0][0] = "小隊1號";
            bus[0][1] = "小隊2號";
            bus[0][2] = "小隊3號";
            //----------------------------------我是分隔線---------------------------------------------------------
            //如何取出小隊?
            //方法一 Console.WriteLine(bus[0][0]);
            Console.WriteLine("方法一(省略)\\n");
            Console.WriteLine(bus[0][0]); //以下省略

            Console.WriteLine("for方法\\n");

            //----------------------------------我是分隔線---------------------------------------------------------
            //方法二 for
            for (int i = 0; i < bus.Length; i++) // 抓取遊覽車
            {
                for (int j = 0; j < bus[i].Length; j++)  // 抓取小隊
                {
                    Console.WriteLine(bus[i][j]);//印出每個小隊,為什麼我可以直接這樣做?請參考P9
                }
            }

            //----------------------------------我是分隔線---------------------------------------------------------
            //方法三 foreach
            Console.WriteLine("foreach方法全顯示-1搭上join\\n");
            //方法3-1,你可以穿插兩種方式
            //foreach穿插join
            foreach (string[] team in bus)
            {
                Console.WriteLine(string.Join("\\t", team));//join出每個小隊陣列
            }
            Console.WriteLine("foreach方法全顯示-2搭配for\\n");

            //----------------------------------我是分隔線---------------------------------------------------------
            //方法3-2,foreach穿插for
            foreach (string[] team in bus)
            {
                for (int j = 0; j < team.Length; j++)
                {
                    Console.WriteLine(team[j]);//印出每個小隊
                }
            }

            //----------------------------------我是分隔線---------------------------------------------------------
            //方法四 join (X)
            //Console.WriteLine("join方法");
            //string result = string.Join("\\t", bus[0]);//join出第一台車的第一個小隊
            //Console.WriteLine(result); // 印出第一台車的第一個小隊
            //join印不出全部
        }

        static void P9不規則陣列補充()
        {
            string[] x = { "皮卡丘", "超夢" };
            //假如我們要取得x[0]的第一個字母,可以這樣做
            //string firstElement = x[0];
            // 然後對這個變數使用 Substring 方法
            //string z = firstElement.Substring(0, 1);
            //但是,如果我們直接用 x[0].Substring(0, 1) 呢?
            string z = x[0].Substring(0, 1); //這邊沒有先指定變數是x[0],且後面還可以直接加.Substring(0,1)?
            //舉一反三,假設已經提前知道此變數是一個string,便可以跳過直接指定x[0],然後使用.Substring(0,1)
            //那麼陣列也理所應當可以直接使用,詳情查看P8不規則陣列
        }

        static void Main(string[] args)
        {
            //P1_Array練習();
            //P2_練習陣列給值();
            //P3_練習_費式數列();
            //p4_練習_均溫();
            //P5_多維陣列();
            //P6_多維陣列_屬性方法();
            //P7_多維陣列_取值();
            P8_不規則陣列();
            //P9不規則陣列補充();
        }

    }
}