С основным увеличением / уменьшением проблемы в цикле - PullRequest
1 голос
/ 05 марта 2019

просто предпринимаю один онлайн-курс, пытаясь назначить что-то вроде обратного треугольника. Я могу сделать это в Python, но по какой-то причине в C это не работает для меня, в частности, часть цикла for, где должно уменьшаться значение k. Пробовал это также в другом пустом проекте, просто чтобы проверить проблему, но пока он не работал для меня. Увеличение (цикл j) работает, уменьшение (цикл k) по некоторым причинам не работает (также со всеми вариантами синтаксиса: k = k - 1; k - = 1; k--).

Не знаю, где может быть проблема.

int main(void){
   int height, i, j, k;
   bool check = false;

while (check == false)
{
    height = get_int("Height: ");

    if (height >= 1 && height <= 8)
    {
        for (i = 0; i < height; i++)
        {
            for (k = height -2; k >=0; k--)
            {
                printf(".");
            }
            for (j = 0; j <= i; j++)
            {
                printf("#");
            }
            printf("\n");
        }
        check = true;
    }
}}

Для высоты 5 это целевой результат

....#
...##
..###
.####
#####

и это фактический результат

....#
....##
....###
....#####
....###### 

Ответы [ 5 ]

0 голосов
/ 05 марта 2019

Опубликованное решение кажется более сложным, чем могло бы быть. Вам просто нужно распечатать все строки до требуемой высоты и найти способ напечатать уменьшающееся число '.' в начале каждой строки.

#include <stdio.h>

void draw_triangles(int height, char upper_left, char bottom_right)
{
    if (height < 1  ||  height > 8)
        return;

    for (int row = 0; row < height; ++row)
    {
        // Calculate how many chars are in the left side of each row
        int edge = height - row - 1;
        for ( int i = 0; i < edge; ++i )
            putchar(upper_left);

        for ( int i = edge; i < height; ++i)
            putchar(bottom_right);

        putchar('\n');
    }
}

int main(void)
{
    // Let's test it
    for (int i = 0; i <= 10; ++i)
    {
        printf("%d:\n", i);
        draw_triangles(i, '.', '#');
        puts("");
    }
}
0 голосов
/ 05 марта 2019

Значение k уменьшается, но диапазон, для которого работает цикл for k, остается тем же, что и высота входной переменной, не изменяется. В результате он всегда печатает 4 (высота-2 + 1) точки. Чтобы уточнить больше см. Следующие шаги:

input->height 5 <br>
i = 0, printing four dots for k = 3,2,1,0. printing one '#' for j=0 <br>
i = 1, printing four dots for k = 3,2,1,0. printing two '#' for j=0,1 <br>
i = 2, printing four dots for k = 3,2,1,0. printing three '#' for j=0,1,2 <br>
i = 3, printing four dots for k = 3,2,1,0. printing four '#' for j=0,1,2,3 <br>
i = 4, printing four dots for k = 3,2,1,0. printing five '#' for j=0,1,2,3,4 <br>
for (k = height -i-2; k >=0; k--) //to decrease starting value of k by one each time. 
input->height 5 <br>
i = 0, printing four dots for k = 3,2,1,0. printing one '#' for j=0 <br>
i = 1, printing three dots for k = 2,1,0.  printing two '#' for j=0,1 <br>
i = 2, printing two dots for k = 1,0.      printing three '#' for j=0,1,2 <br>
i = 3, printing one dots for k = 0.        printing four '#' for j=0,1,2,3 <br>
i = 4, printing zero dots for k = .        printing five '#' for j=0,1,2,3,4 <br>

0 голосов
/ 05 марта 2019

Ваша переменная height никогда не изменяется при построении вывода.Вы всегда начинаете с k = 3. Как вы ожидаете, что число . на выходе изменится?

Попробуйте использовать переменную i при распечатке ..

0 голосов
/ 05 марта 2019

Просто измените оператор цикла for на

for (k = height - 1; k >=i; k--)

k индексирование должно начинаться с 'height' - 1 и заканчивается переменной i.

Так что для height = 5,первый внутренний цикл for будет выполнен 5 раз, когда i увеличится на единицу, внутренний цикл for будет выполнен минус 1 раз и т. д.

0 голосов
/ 05 марта 2019

Во втором цикле k должно быть >= i, а не >= 0.Я заменил get_int на 5.

int main(void){
int height, i, j, k;
bool check = false;

while (check == false)
{
    height = 5;

    if (height >= 1 && height <= 8)
    {
        for (i = 0; i < height; i++)
        {
          for (k = height -2; k >= i; k--)
          {
            printf(".");
          }
          for (j = 0; j <= i; j++)
          {
            printf("#");
          }
          printf("\n");
    }
    check = true;
}
}}

Вывод:

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