Пытаетесь напечатать шаблоны на C#, но привыкли использовать синтаксис Java, что вы можете дать?

Код ниже предназначен для шаблона «а», чувствую, как только я получу «а», я смогу получить другие.

Мне нравится синтаксис array [int] .length в java, и он помог распечатать шаблон, как показано на рисунке. Но я не думаю, что такое существует в C #.

      class Main 
{
    public static void main(String[] args)
    {
        char[][] arr = new char[10][10];
        int starCount = 10;
        for(int i = 0; i < arr.length; i++)
        {
            for(int j = 0; j < starCount; j++)
            {
                arr[i][j] = '*';
            }
            for(int k = starCount; k < arr[i].length; k++)
            {
                arr[i][k] = '-';
            }
            starCount--;
        }
        for(int a = 0; a < arr.length; a++)
        {
            for(int b = 0; b < arr[a].length; b++)
            {
                System.out.print(arr[a][b]);
            }
            System.out.println();

        }
    }
}

Этот код печатает '*' в убывающем порядке, но я не могу решить, как заменить пустые элементы массива символом '-', как показано на изображении.

      class MainClass {
  public static void Main (string[] args) 
  {
    char[ , ] arr = new char[10,10];
    int starCount = 10;
    for(int i = 0; i < arr.Length; i++)
    {
      for (int j = 0; j < starCount; j++)
      {
        arr[i , j] = '*';
      }
      for (int k = 0; ) //IDK WHAT TO DO TO ASSIGN ARR[I , K] = '-';
      starCount--;

    }
    for (int i = 0; i < 10; i++) 
    {
     for (int j = 0; j < 10; j++)
     {
       Console.Write(arr[i , j]);
     }
     Console.WriteLine();
    }
  }
}

4 ответа

Вы можете использовать два вложенных цикла for и один оператор if для печати всех этих шаблонов:

      int n = 5;
for (int i = -n; i <= n; i++) {
    for (int j = -n; j <= n; j++) {
        // a) if (i + j <= 0)
        // b) if (i + j >= 0)
        // c) if (i <= j)
        // d) if (Math.abs(i) + Math.abs(j) <= n)
        if (i + j <= 0)
            System.out.print("*");
        else
            System.out.print("-");
    }
    System.out.println();
}

Выход (комбинированный):

      a)           b)           c)           d)
***********  ----------*  ***********  -----*-----
**********-  ---------**  -**********  ----***----
*********--  --------***  --*********  ---*****---
********---  -------****  ---********  --*******--
*******----  ------*****  ----*******  -*********-
******-----  -----******  -----******  ***********
*****------  ----*******  ------*****  -*********-
****-------  ---********  -------****  --*******--
***--------  --*********  --------***  ---*****---
**---------  -**********  ---------**  ----***----
*----------  ***********  ----------*  -----*-----

Самый простой способ - посмотреть документацию по C # для класса Array. Там вы обнаружите, что у класса Array естьGetLength() метод, который возвращает то, что length свойство массива Java возвращается.

Используя этот метод, вы можете изменить свой код на

      class MainClass {
  public static void Main (string[] args) 
  {
    char[ , ] arr = new char[10,10];
    int starCount = 10;
    for(int i = 0; i < arr.GetLength(0); i++)
    {
      for (int j = 0; j < starCount; j++)
      {
        arr[i , j] = '*';
      }
      for (int k = starCount; k < arr.GetLength(1); k++)
      {
        arr[i , k] = '*';
      }
      starCount--;

    }
    for (int i = 0; i < arr.GetLength(0); i++) 
    {
     for (int j = 0; j < arr.GetLength(1); j++)
     {
       Console.Write(arr[i , j]);
     }
     Console.WriteLine();
    }
  }
}

Вот другой подход к исходной проблеме, который вам может быть проще преобразовать.

Создайте строку из 10 звезд и 9 тире, например, жестко запрограммированную таким образом:

      String line = "**********---------";

Теперь выведите 10 строк с подстроками этой строки:

      for (int i = 0; i < 10; i++)
    System.out.println(line.substring(i, i + 10));

Выход

      **********
*********-
********--
*******---
******----
*****-----
****------
***-------
**--------
*---------

Если размер динамический, на основе int значение в переменной starCount, то в Java 11+ вы можете использовать repeat() метод:

      String line = "*".repeat(starCount) + "-".repeat(starCount - 1);
for (int i = 0; i < starCount; i++)
    System.out.println(line.substring(i, i + starCount));

Это должно быть легко сделать на C#. См .: Лучший способ повторить символ в C#.

В версиях Java ниже 11 вы можете создать char[]:

      char[] line = new char[2 * starCount - 1];
Arrays.fill(line, 0, starCount, '*');
Arrays.fill(line, starCount, line.length, '-');
for (int i = 0; i < starCount; i++)
    System.out.println(new String(line, i, starCount));

По какой-то причине, когда вы переключились с java на C#, вы отказались от использования массивов с зазубринами:

      //java 
char[][] arr = new char[10][10];

Для прямоугольных массивов:

      //c#
char[ , ] arr = new char[10,10];

Это, несомненно, делает вашу жизнь более тяжелой, потому что это означает, что нужно изменить гораздо больше. C# поддерживает зубчатые массивы точно так же, как это делает Java, и на самом деле, если бы я не написал выше «// java», вы бы не смогли определить, C# это или java, потому что они одинаковы.

Мне нравится синтаксис array [int] .length в Java ... Но я не думаю, что такое существует в C#.

Это действительно так, и вам нужно изменить только один символ, чтобы получить его: свойства в C# названы в регистре Pascal, поэтому вы хотите Length, нет length

Фактически, логика всего этого блока java, который у вас есть, будет отлично работать на C# - просто вставьте его и измените следующие незначительные изменения:

      length -> Length
System.out.print -> Console.Write
System.out.println -> Console.WriteLine
Другие вопросы по тегам