Печать по правому краю # лестничная клетка с использованием одинарной петли - PullRequest
0 голосов
/ 05 января 2019

Я хочу напечатать лестницу с выравниванием по правому краю с одной петлей.

Я пытался напечатать выровненную по правому краю # лестницу.
Я это сделал. Но я хочу напечатать то же самое с одной петлей.

for(i=0;i<n;i++)
{
    for(j=0;j<n;j++)
    {
        if(i+j>=n-1)
        {
          printf("#");
        }
        else
        {
          printf(" ");
        }
    }
    printf("\n");
}

Ответы [ 2 ]

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

Пока строка с отметками # достаточно длинна (по крайней мере, n из них), вы можете использовать:

for (i = 0; i < n; i++)
    printf("%*.*s\n", n, i+1, "##########");

Маркеры * в строке формата означают «прочитать int из списка параметров» - см., Например, спецификацию POSIX printf() или спецификацию C11 fprintf(). Например, нотация "%10.6s\n" будет означать «напечатать поле шириной 10 символов, выровненное по правому краю, пустое поле слева, не более 6 символов из строкового аргумента». Итак, если n равно 10, цикл работает следующим образом:

printf("%10.1s\n", "##########");    // 9 blanks, 1 hash
printf("%10.2s\n", "##########");    // 8 blanks, 2 hashes
…
printf("%10.9s\n", "##########");    // 1 blank, 9 hashes
printf("%10.10s\n", "##########");   // 0 blanks, 10 hashes

Вы можете попробовать следующий код:

#include <stdio.h>

int main(void)
{
    int n = 10;

    for (int i = 0; i < n; i++)
        printf("%*.*s\n", n, i + 1, "##########");

    return 0;
}

Или:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int n = 10;
    char data[n + 1];
    memset(data, '#', n);
    data[n] = '\0';

    for (int i = 0; i < n; i++)
        printf("%*.*s\n", n, i + 1, data);

    return 0;
}

Или:

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

int main(void)
{
    int n = 10;
    char *data = malloc(n + 1);
    memset(data, '#', n);
    data[n] = '\0';

    for (int i = 0; i < n; i++)
        printf("%*.*s\n", n, i + 1, data);

    free(data);
    return 0;
}

Последние два будут обрабатывать значения n больше 10 без каких-либо проблем. Как показано, первое не будет (но, конечно, его можно легко адаптировать для обработки умеренных значений n). Обратите внимание, что средний использует VLA (массив переменной длины); это обязательная функция C99 и дополнительная функция C11 и C18. Последний должен проверить, что malloc() успешно. Для вероятных значений n это вряд ли даст сбой в этом контексте, но в более крупной программе проверка всегда рекомендуется.

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

Короче говоря: есть много способов сделать это. Вот некоторые из моих голов.

Рекурсия:

void print(int n, int j) {
    if (j < n) {
        for (int i = 0; i < n; i++) {
            putchar(i + j >= n - 1 ? '#' : ' ');
        }

        puts("");
        print(n, j + 1);
    }
}

int main() {
    print(10, 0);
    return 0;
}

memset

#include <stdio.h>
#include <string.h>

int main() {
    int i, n = 10;
    char s[n+1];
    memset(s, ' ', sizeof(char) * (n + 1));

    for (i = 0; i <= n; i++) {
        memset(s + n - i, '#', sizeof(char) * (n + 1 - i));
        s[n+1] = '\0';
        printf("%s\n", s);
    }

    return 0;
}

Перейдите на n * n и используйте условное выражение, чтобы определить, когда печатать новую строку:

int main() {
    int i, j, n = 10;

    for (i = 0, j = 0; i <= n * n; i++) {
        putchar(j++ >= n - 1 ? '#' : ' ');

        if (i % n == 0) {
            puts("");
            j = i / n;
        }
    }

    return 0;
}

goto:

int main() {
    int i = 0, j, n = 10;

    loop:
    for (j = 0; j <= n; j++) {
        putchar(j++ >= n - 1 ? '#' : ' ');
    }

    puts("");
    if (i++ < n) goto loop;

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...