Как создать правую и левую выровненную лестницу с #s, ЧТО СТОРОНА СТОРОНА в C - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь создать что-то похожее на это:

Марио Лестница

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

int answer = get_int("Height: ");

while( answer < 1 || answer > 8){
    answer = get_int("Height: ");

}

int column = answer -1;

for(int i = 1; i <=answer; i++){
    for(int j = 1; j <= column; j++){
        printf(" ");
    }
    column--;
    for(int k = 1; k <= i ; k++){
        printf("#");
    }
    printf("\n");
}

for(int a = 1; a <=answer; a++){
    for(int b = 1; b <=a; b++){
        printf("#");
    }
    printf("\n");
}

}

и вывод будет таким:

вывод

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Вам нужно объединить верхнюю и нижнюю петли в одну:

  1. Сначала напечатайте левый пробел.
  2. Затем напечатайте левую сторону пирамиды / треугольника
  3. Печатьразделитель
  4. Печать правой стороны треугольника
  5. Печать новой строки.

Повторите приведенное выше для нужного количества линий.


Вот вычищенный и исправленный код.Обратите внимание, что я изменил его, чтобы взять счетчик из первого аргумента программы (например, ./mypgm 4) для [моей] простоты отладки:

#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char **argv)
{
    int answer;

    --argc;
    ++argv;

    if (argc != 1)
        exit(1);

    answer = atoi(*argv);

    int column = answer - 1;

    for (int i = 1; i <= answer; i++) {
        // print left margin
        for (int j = 1; j <= column; j++)
            printf(" ");

        // print left pyramid
        for (int k = 1; k <= i; k++)
            printf("#");

        // print separater
        printf(" ");

        // print right pyramid
        for (int a = 1; a <= i; a++)
            printf("#");

        column--;

        printf("\n");
    }

    return 0;
}
0 голосов
/ 23 января 2019

Поля ширины и прецизионности спецификатора %s могут использоваться для печати изображения.
В поле ширины будет напечатано как минимум требуемое количество символов, а в поле точности будет напечатано необходимое количество символов.,Значения могут использоваться в спецификаторе, или звездочка может использоваться для получения значения из аргументов.
Ввод количества повторений строки определяет ширину поля для левой стороны.На каждой итерации точность увеличивается для количества символов, печатаемых в поле.
Правая сторона должна печатать только то же количество символов, что и левая сторона.

#include <stdio.h>

#define SIZE 8

int main( void) {
    char hash[SIZE + 1] = { [0 ... SIZE] '#'};
    char input[100] = "";
    int repeat = 0;
    int result = 0;

    do {
        printf ( "input height [1 to %d]\n", SIZE);
        if ( fgets ( input, sizeof input, stdin)) {//get a line
            result = sscanf ( input, "%d", &repeat);//try to scan an integer
        }
        else {
            fprintf ( stderr, "fgets EOF\n");
            return 0;
        }
    } while ( 1 != result || repeat <= 0 || repeat > SIZE);

    for ( int each = 0; each < repeat; ++each) {
        printf ( "%*.*s %.*s\n", repeat, each + 1, hash, each + 1, hash);
    }

    return 0;
}
0 голосов
/ 23 января 2019

Я не понимаю ваш код, так как в нем отсутствуют некоторые ключевые элементы для компиляции (где main? Что такое get_int?).

Однако, это мой подход:

#include <stdio.h>
#define HEIGHT 6

void print_whitespace(int n){printf("%*c", n, ' ');}
void print_hash(int n){while(n--) printf("#");}

int main(void) {
    for(int h = 1; h < HEIGHT ; h++)
    {
        print_whitespace(HEIGHT - h); // left side whitespaces
        print_hash(offset);           // left side '#'
        print_whitespace(1);          // center whitespace
        print_hash(offset);           // right side '#'
        print_whitespace(HEIGHT - h); // right side whitespaces
        printf("\n");
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...