Кодировка VSS C для распечатки елки - PullRequest
0 голосов
/ 20 июня 2020

Это мой текущий код

void printer(int input)
{
    int star;
    int space;
    for (int i = 1; i <= input; i++)
    {
        star = i;
        space = i + input - star - 1;

        for (int j = 0; j < space; j++)
        {
            printf(" ");
        }

        for (int s = 0; s < star; s++)
        {
            printf("*");
        }

        printf("\n");
    }
}

Я пытаюсь распечатать его, например,

How tall 3?
  *
 * *
* * *
_| |_
\___/

и вот что я получаю. Что не так с моим кодом? и как исправить код?

How Tall? 3
  *
  **
  ***

Ответы [ 4 ]

0 голосов
/ 20 июня 2020

Это можно сделать так:

#include <stdio.h>
void printer(int input)
{
    // for stars
    for (int i = 1; i <= input; i++) {
        for (int j = 1; j <= input - i; j++) {
            printf(" ");
        }    
        for (int k = 1; k <= i; k++) {
            if (k == 1) printf("*");
            else printf(" *");
        }
        printf("\n");
    }
    // for base
    int base_half_len = input - 1;
    for (int i = 1; i < base_half_len; i++) {
        printf("_");
    }
    printf("| |");
    for (int i = 1; i < base_half_len; i++) {
        printf("_");
    }
    printf("\n\\");
    for (int i = 1; i < 2 * input - 2; i++) {
        printf("_");
    }
    printf("/\n");
}
int main(void) {
    // your code goes here
    printer(10);
    return 0;
}

Вот ссылка, по которой я тестировал: https://ideone.com/7zpNeW

0 голосов
/ 20 июня 2020

С этим слишком много вещей пошло не так. Я не буду публиковать правильный код, но могу помочь вам с ним.

  • Поскольку вам нужен пробел после звезд, напечатайте "* " вместо "*"

  • Вы должны использовать декрементный пробел в начале, прежде чем печатать звезду, в этом есть логическая ошибка, а именно, вы добавляете и вычитаете i и звездочку, что одно и то же. Вам нужно указать (ввод - звездочка) пробелы для l oop.

  • Для ствола вам нужно разработать несколько симметричных logi c. Надеюсь, это вам поможет.

0 голосов
/ 20 июня 2020

По сути, этот фрагмент кода, который вы здесь используете:

star = i;
space = i + input - star - 1; // or, space = input - 1 + i - star;

, совпадает с записью:

star = i;
space = input - 1;

Это потому, что i и star имеют одинаковое значение (молчит star = i), и, следовательно, отрицать друг друга.

Теперь вы можете увидеть здесь константу? Да, значение input нигде не меняется, и поэтому ваш код всегда на 1 меньше входного. (В этом случае ему всегда предшествуют пробелы 2 (=3-1)), например:

  *
  **
  ***
^^ mark two spaces

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


Следовательно, чтобы решить вашу проблему, вы можете временно сохранить значение input и уменьшать его на 1 на каждой итерации, чтобы оно выглядело как пирамида.

Пример:

void printer(int input)
{
    int star;
    int space;
    // Store the original length of the space
    int space_length = input;
    for (int i = 1; i <= input; i++)
    {
        star = i;
        // Get the number of spaces for the current iteration
        space = space_length - 1;

        for (int j = 0; j < space; j++) {
            printf(" ");
        }

        for (int s = 0; s < star; s++) {
            printf("* ");
            //       ^ note this space after the asterisk
        }

        // Decrease the length of the space every step
        // So that it appears like a slope
        // Note how we are using 'space_length' instead of input
        // This is because if we decrement 'input', this loop
        // will get affected, which is not what we want
        space_length--;

        printf("\n");
    }

    ///////// bottom part of the tree /////////
    // number of spaces needed = input - length of "_| |_" - 1
    for (int i = 1; i <= input - (4 - 1); i++)
        printf(" ");
    printf("_| |_\n");
    // number of spaces needed = input - length of "\\___/" - 1
    for (int i = 1; i <= input - (4 - 1); i++)
        printf(" ");
    printf("\\___/\n");
}

, что дает результат:

  * 
 * * 
* * * 
_| |_
\___/
0 голосов
/ 20 июня 2020

проблема в вашем формате. поскольку вы уже знаете размер дерева, вы можете вычесть размер первого набора пробелов (первых пробелов в каждой строке), равного spaces = (size - 1) - i. это должно быть для каждого i:

i1 = 2
i2 = 1
i3 = 0

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

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