1
Console.WriteLine("Enter the number of triangles: ");
        int n = int.Parse(Console.ReadLine());
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n + 1; j++)
            {
                for (int k = 0; k < j; k++)
                    Console.Write("+");
                Console.WriteLine();
            }
        }

Программа выводит треугольники в ряд вертикально, а нужно горизонтально, что нужно для этого сделать? введите сюда описание изображения

foder.
  • 47
  • 1
    Нарисовать их в буфере двумерного массива, а потом вывести буфер. Учтите что стандартная консольная длина строки - 80 символов. – Blackmeser Oct 13 '21 at 02:08
  • Только я не уверен - в консоли используется моноширинный текст или нет? – Andrew Stop_RU_war_in_UA Oct 13 '21 at 05:51
  • Связанный вопрос https://ru.stackoverflow.com/a/1171427/373567 – aepot Oct 13 '21 at 07:56

1 Answers1

3
var n = 5;
var sb = new StringBuilder();
for (var r = 1; r <= n; ++r)
{
    for (var c = 0; c < n; ++c)
    {
        sb.Append('+', r)
            .Append(' ', n - r)
            .Append(' ');
    }
    sb.AppendLine();
}
Console.Write(sb);

Идем построчно, добавляем части треугольника по слоям: сначала верхний слой, где у всех треугольников по одному значащему символу, затем — второй и т. д. до n.

Здесь:

  • r — номер строки;
  • c — номер треугольника, как видно по коду, мы внутри каждой строки итерируем по треугольникам и добавляем строчки для каждого из них;
  • .Append('+', r) — добавляем r плюсиков, на первой строке их один, на второй — 2 и т. д.;
  • .Append(' ', n - r) — "забиваем" ширину пробелами, так чтобы все треугольники во всех слоях были одинаковой ширины;
  • .Append(' ') — добавляем отступ между треугольниками по горизонтали;
  • .AppendLine() — добавляем перевод строки.

введите сюда описание изображения

  • А зачем промежуточный StringBuilder? Может быть, выводить прямо на консоль? – VladD Oct 13 '21 at 12:47
  • 1
    @VladD, можно и сразу на консоль, почему-то так написал, наверное по привычке разделил "расчеты" и вывод. Ну, такую простую задачу можно решить сотней способов, хоть stream получать извне и писать в него – Андрей NOP Oct 13 '21 at 14:00
  • @АндрейNOP, а как можно сразу на консоль без промежуточного StringBuilder? – foder. Oct 13 '21 at 14:47
  • @foder., замените соответственно на Console.Write(new string('+', r)), Console.Write(new string(' ', n - r)), Console.Write(" "), Console.WriteLine() – Андрей NOP Oct 13 '21 at 15:52
  • @АндрейNOP: Ну это да, у меня тоже привычка разделять модель и представление. Но тут в коде присутствует форматирование, это в принципе задача представления, так что по идее без особого ущерба можно упростить. – VladD Oct 14 '21 at 07:43
  • @VladD, я посчитал, что здесь форматирование — часть "бизнес-логики" :) А выводить можно потом хоть на консоль, хоть в файл, хоть на принтер, хоть на какой-то другой кастомный "процессор", но да, конкретно здесь этому "процессору" придется, возможно, как-то посимвольно решать как тот или иной отобразить. Можно было вместо конкретных символов ввести специальную грамматику, набор классов для нее, свой билдер для компоновки в результирующий набор и т. д. Для такой задачи оверхед :) – Андрей NOP Oct 14 '21 at 09:43
  • @АндрейNOP: Я думал об этом, но ведь вывод в виде строки, разделённой на логические строки символами \r\n, явно не универсален. Например, на принтер лучше было бы выводить картинку или postscript, в файл — сериализованный формат наподобие json/xml и т. д. А для совсем-совсем правильного вывода на консоль неплохо бы ещё знать её ширину. Поэтому получается, что форматирование сильно специфично конкретному формату вывода. – VladD Oct 14 '21 at 10:35