Программа C для перевернутого треугольного паттерна

Я хочу нарисовать такой узор:

567898765
 4567654
  34543
   232
    1

Но я не могу понять это, потому что это вывод, который я сейчас получаю:

567898765
 45678987654
  3456789876543
   234567898765432
    12345678987654321

Это мой код:

#include <stdio.h>

int main() {
  int a, b, c, s;
  for (a = 5; a >= 1; a--) {
    for (s = a; s <= 4; s++) {
      printf(" ");
    }
    for (b = a; b <= 9; b++) {
      printf("%d", b);
    }
    for (c = 8; c >= a; c--) {
      printf("%d", c);
    }
    printf("\n");
  }
  return 0;
}

Посмотрите здесь

Sergiu 12.04.2023 14:19

Вы должны разбить эту проблему на части: сначала придумайте способ напечатать 567898765 с учетом 5, затем зациклите это, чтобы получить треугольник, выровненный по левому краю; затем выясните, сколько пробелов нужно печатать в начале каждой строки, чтобы выровнять ее по центру.

AKX 12.04.2023 14:21

Пожалуйста, не размещайте изображения текста, размещайте текст как правильно отформатированный текст.

Jabberwocky 12.04.2023 14:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В основном вы поняли правильно, только постоянные значения 9 и 8 в циклах b и c неуместны, поскольку центральная ось треугольника не всегда равна 9; значения равны 2*a-1 и 2*a-2 соответственно.

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

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

Основной причиной некорректного вывода вашей программы является использование магических чисел 9 и 8 в этих циклах for.

for (b = a; b <= 9; b++) {
  printf("%d", b);
}
for (c = 8; c >= a; c--) {
  printf("%d", c);
}

Могу предложить следующее решение.

#include <stdio.h>

int main( void )
{
    const unsigned int MAX_HEIGHT = 50;

    while (1)
    {
        unsigned int n;

        printf( "Enter the height of a triangle not greater than %u (0 - exit): " , MAX_HEIGHT );

        if (scanf( "%u", &n ) != 1 || n == 0) break;

        int width = 1 + snprintf( NULL, 0, "%d", 2 * n - 1 );

        putchar( '\n' );

        for (unsigned int i = n; i != 0; --i)
        {
            printf( "%*u", ( n - i + 1 ) * width, i );

            size_t j = 1;

            for (; j < i; j++)
            {
                printf( "%*u", width, i + j );
            }

            --j;
            while (j-- != 0)
            {
                printf( "%*u", width, i + j );
            }

            putchar( '\n' );
        }

        putchar( '\n' );
    }
}

Вывод программы может выглядеть так

Enter the height of a triangle not greater than 50 (0 - exit): 10

 10 11 12 13 14 15 16 17 18 19 18 17 16 15 14 13 12 11 10
     9 10 11 12 13 14 15 16 17 16 15 14 13 12 11 10  9
        8  9 10 11 12 13 14 15 14 13 12 11 10  9  8
           7  8  9 10 11 12 13 12 11 10  9  8  7
              6  7  8  9 10 11 10  9  8  7  6
                 5  6  7  8  9  8  7  6  5
                    4  5  6  7  6  5  4
                       3  4  5  4  3
                          2  3  2
                             1

Enter the height of a triangle not greater than 50 (0 - exit): 5

 5 6 7 8 9 8 7 6 5
   4 5 6 7 6 5 4
     3 4 5 4 3
       2 3 2
         1

Enter the height of a triangle not greater than 50 (0 - exit): 1

 1

Enter the height of a triangle not greater than 50 (0 - exit): 0

Другие вопросы по теме