Еще один способ приблизиться к выводу пирамиды (по центру) - использовать модификатор width field для вашей printf
строки формата для padding чем сам символ заполнения.Затем вы можете просто циклически выводить количество символов, необходимое для каждой строки (которое увеличивается на 2
в каждой строке, например, 1, 3, 5, ...
).
Например, принимая количество строк вывода в качестве первого аргумента дляВ вашей программе (или используя 4
по умолчанию, если аргумент не указан), вы можете сделать что-то похожее на следующее:
#include <stdio.h>
#include <stdlib.h>
#define FILL '*'
void pyramid (int n)
{
if (n < 1) /* validate positive value */
return;
int l = 1, /* initial length of fill chars */
max = n * 2 - 1, /* max number of fill chars */
pad = max / 2; /* initial padding to center */
for (int i = 0; i < n; i++) { /* loop for each line */
if (pad) /* if pad remains */
printf ("%*s", pad--, " "); /* output pad spaces */
for (int j = 0; j < l; j++) /* output fill chars */
putchar (FILL);
putchar ('\n'); /* output newline */
l += 2; /* increment fill by 2 */
}
}
int main (int argc, char **argv) {
int n = argc > 1 ? (int)strtol (argv[1], NULL, 0) : 4;
pyramid (n);
return 0;
}
( примечание: вы можете использовать unsigned
введите везде, чтобы обеспечить положительные значения, или вы можете просто подтвердить, что у вас есть положительные значения. Вы должны также включить errno.h
и проверить преобразование strtol
, хотя оно вернет 0
, если не предоставлены цифры)
Это также помогает #define
заполнить ваш символ в верхней части кода, так что у вас есть удобное место для изменения, если вам нужен другой символ.Это предотвращает копание в вашей функции для последующего поиска константы.
Пример использования / Вывод
$ ./bin/pyramidtop 1
*
$ ./bin/pyramidtop 5
*
***
*****
*******
*********
$ ./bin/pyramidtop 10
*
***
*****
*******
*********
***********
*************
***************
*****************
*******************