簡體   English   中英

二維數組中的列和行?

[英]Columns and rows in a 2D array?

        {
        int woodchuckSim = 0;
        int numOfDays = 0;
        bool validNumber = false;
        bool validDays = false;
        Random ran1 = new Random();
        
        //display banner

        //Ask user how many woodchucks to simulate
        while(!validNumber)
        {
            Write("How many woodchucks would you like to simulate? (1 - 100) ");
            int.TryParse(ReadLine(), out woodchuckSim);
            if((woodchuckSim <= 0) || (woodchuckSim > 100))
            {
                WriteLine("\nPlease enter a correct amount of woodchucks to simulate: ");
            }
            else
            {
                validNumber = true;
            }
        }

        //Ask user how many days to simulate
        while(!validDays)
        {
            Write("\nHow many days would you like to simulate? (1 - 10) ");
            int.TryParse(ReadLine(), out numOfDays);
            if((numOfDays <= 0) || (numOfDays > 10))
            {
                WriteLine("Please enter a positive whole number between 1 and 10: ");
            }
            else
            {
                validDays = true;
            }
        }

        //Using random class populate each cell between 1 and 50 that represents # of pieces of wood chucked by specific woodchuck on that specific day
        int[,] sim = new int[woodchuckSim, numOfDays];

        WriteLine($"{woodchuckSim} {numOfDays}");
        for (int i = 0; i < sim.GetLength(0); i++)
        {
            for (int j = 0; j < sim.GetLength(1); j++)
            {
                sim[i, j] = ran1.Next(1, 50);
                Write(sim[i, j] + "\t");
            }
            {
                WriteLine(i.ToString());
            }
        }
        WriteLine("Press any key to continue...");
        ReadLine();
    }

到目前為止,這是我在土撥鼠模擬編碼作業中的代碼,但我需要像圖片一樣在側面和頂部有一個列和行標簽。 我真的不知道該怎么做,我不確定我是否遺漏了代碼或輸入了錯誤的內容。 同樣在代碼的末尾,它會打印出以直線方式模擬的土撥鼠數量,就像用戶輸入 15 一樣,它會在最后以直線打印 0-14,這不是我想要的,任何幫助都會贊賞,謝謝! (第二張圖是我的代碼打印出來的)

圖片

WhatMyCode正在打印

有幾個步驟可以做到這一點,但這並不難:

  1. 寫下列標題(在行標題所在的開頭包括空格
  2. 寫下划線
  3. 對於每一行,先寫行標題
  4. 然后對於行中的每一列,寫入列數據
  5. 列數據寫入后,寫換行開始下一行

這是一個生成類似於您的輸出的表的示例。 請注意,我們使用PadLeft用空格填充每列數據,使它們的寬度相同。 我還根據您在下面的評論包含了SumAvg列。 此外,為了清理主要代碼,我添加了以不同顏色編寫文本的方法和從用戶獲取整數的方法:

private static readonly Random Random = new Random();

private static void WriteColor(string text,
    ConsoleColor foreColor = ConsoleColor.Gray,
    ConsoleColor backColor = ConsoleColor.Black)
{
    Console.ForegroundColor = foreColor;
    Console.BackgroundColor = backColor;
    Console.Write(text);
    Console.ResetColor();
}

private static void WriteLineColor(string text,
    ConsoleColor foreColor = ConsoleColor.Gray,
    ConsoleColor backColor = ConsoleColor.Black)
{
    WriteColor(text + Environment.NewLine, foreColor, backColor);
}

public static int GetIntFromUser(string prompt, Func<int, bool> validator = null)
{
    var isValid = true;
    int result;

    do
    {
        if (!isValid)
        {
            WriteLineColor("Invalid input, please try again.", ConsoleColor.Red);
        }
        else isValid = false;

        Console.Write(prompt);
    } while (!int.TryParse(Console.ReadLine(), out result) ||
                (validator != null && !validator.Invoke(result)));

    return result;
}

public static void Main()
{
    int columnWidth = 6;

    ConsoleColor sumForeColor = ConsoleColor.DarkRed;
    ConsoleColor sumBackColor = ConsoleColor.Gray;
    ConsoleColor avgForeColor = ConsoleColor.White;
    ConsoleColor avgBackColor = ConsoleColor.DarkGreen;

    int numWoodchucks = GetIntFromUser(
        "How many woodchucks would you like to simulate? (1 - 100) ... ",
        x => x >= 1 && x <= 100);
    int numDays = GetIntFromUser(
        "How many days would you like to simulate? (1 - 10) .......... ",
        x => x >= 1 && x <= 10);
    int[,] data = new int[numWoodchucks, numDays];

    // Write column headers, starting with a blank row header
    Console.WriteLine();
    Console.Write(new string(' ', columnWidth));
    for (int col = 1; col <= data.GetLength(1); col++)
    {
        Console.Write($"{col}".PadLeft(columnWidth));
    }
    Console.Write(" ");
    WriteColor("Sum".PadLeft(columnWidth - 1), sumForeColor, sumBackColor);
    Console.Write(" ");
    WriteLineColor("Avg".PadLeft(columnWidth - 1), avgForeColor, avgBackColor);

    // Write column header underlines
    Console.Write(new string(' ', columnWidth));
    for (int col = 0; col < data.GetLength(1); col++)
    {
        Console.Write(" _____");
    }
    Console.Write(" ");
    WriteColor("_____", sumForeColor, sumBackColor);
    Console.Write(" ");
    WriteLineColor("_____", avgForeColor, avgBackColor);

    int total = 0;

    for (int row = 0; row < data.GetLength(0); row++)
    {
        // Write row header
        Console.Write($"{row + 1} |".PadLeft(columnWidth));

        int rowSum = 0;

        // Store and write row data
        for (int col = 0; col < data.GetLength(1); col++)
        {
            data[row, col] = Random.Next(1, 50);
            Console.Write($"{data[row, col]}".PadLeft(columnWidth));
            rowSum += data[row, col];
        }

        // Write sum and average
        Console.Write(" ");
        WriteColor($"{rowSum}".PadLeft(columnWidth - 1),
            sumForeColor, sumBackColor);
        Console.Write(" ");
        WriteLineColor($"{Math.Round((double) rowSum / data.GetLength(1), 1):F1}"
            .PadLeft(columnWidth - 1), avgForeColor, avgBackColor);

        total += rowSum;
    }

    // Write the sum of all the items
    Console.Write(new string(' ', columnWidth + columnWidth * data.GetLength(1) + 1));
    WriteColor("_____", sumForeColor, sumBackColor);
    Console.Write(" ");
    WriteLineColor("_____", avgForeColor, avgBackColor);

    // Write the average of all the items
    Console.Write(new string(' ', columnWidth + columnWidth * data.GetLength(1) + 1));
    WriteColor($"{total}".PadLeft(columnWidth - 1), sumForeColor, sumBackColor);
    Console.Write(" ");
    WriteLineColor(
        $"{Math.Round((double) total / (data.GetLength(0) * data.GetLength(1)), 1):F1}"
        .PadLeft(columnWidth - 1), avgForeColor, avgBackColor);

    Console.Write("\nPress any key to continue...");
    Console.ReadKey();
}

輸出

在此處輸入圖片說明

未測試,但類似這樣:

    Write("\t");
    for (int i = 0; i < sim.GetLength(0); i++)
    {
        Write(i.ToString() + "\t");
    }
    WriteLine("\t");
    for (int i = 0; i < sim.GetLength(0); i++)
    {
        Write("_____\t");
    }
    WriteLine();

   for (int i = 0; i < sim.GetLength(0); i++)
    {
        {
            WriteLine(i.ToString().PadLeft(3) + " |\t");
        }            
        for (int j = 0; j < sim.GetLength(1); j++)
        {
            sim[i, j] = ran1.Next(1, 50);
            Write(sim[i, j] + "\t");
        }
    }

就像我說的,沒有經過測試,只是直接在編輯器中輸入,但這應該會讓你接近。 此外,查看 string.PadLeft(int) 函數,讓您的數字像示例一樣右對齊。

暫無
暫無

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

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