C — Мое уменьшение для цикла работает, но не уверен, почему

#c #cs50

#c #cs50

Вопрос:

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


Проблема: хотя мой код работает правильно для назначения, я не уверен, почему мой цикл for работает только так, как указано.

Чтобы уточнить, что должен делать мой код: возьмите число, введенное пользователем, и постройте две полупирамиды: одну уменьшающуюся и одну увеличивающуюся.

Вот пример изображения: пример пирамиды


Вопрос: В моем текущем уменьшении для цикла у меня есть: for (int s = u - y; s > 1; s--)

Это для цикла работает. Но когда я пытаюсь for (int s = u - 1; s > 1; s--) или for (int s = u; s > 1; s--) , оно не уменьшается.

Почему этот цикл for уменьшается только при вычитании с использованием переменной y?

Вот мой код:

 #include <stdio.h>
#include <cs50.h>

int main(void)
{
    // Get a number value from User (u) that is between 1 and 8.
    int u;
    do
    {
        u = get_int("Type a number: n");
    }
    while (u < 1 || u > 8);


   // Print a new line each loop, until reaching User number (u)
   for (int y = 0; y < u; y  )
   {
        // Print a "." by (u - 1) number of times. Subtract another "." each loop
        for (int s = u - y; s > 1; s--)
        {
            printf(".");
        }

        // Print a "#" by (y) number of times. Add another "#" each loop
        for (int width = 0; width <= y; width  )
        {
            printf("#");
        }

        printf("n");
    }
}
 

Комментарии:

1. Привет @hunfben, добро пожаловать в StackOverflow. Ваша переменная u нигде не меняется, верно? Тогда if u = 8 , u - 1 всегда будет 7, поэтому цикл s for всегда будет переходить от 7 к 1 и печатать ровно 6 точек. y с другой стороны, это переменная, которая изменяется от 0 до u , что означает, что каждый раз y изменяется, s = u - y изменяется, как и количество напечатанных точек.

2. Почему вы помечаете вопрос о C с помощью C ?

3. @ChoKaPeek Спасибо за прием и спасибо за вашу помощь! Ваш ответ имеет полный смысл. Я полагаю, что я неправильно понял, как тогда работал цикл for. Я предположил, что когда-то s был инициализирован в цикле for, он не изменился, и именно s-- это вызвало фактическое уменьшение значения. Мне еще многому нужно научиться здесь, большое спасибо за ваш ответ!

4. @Eric Я прошу прощения, я привык к форумам / сайтам социальных сетей, где вам нужно использовать более широкую сеть с тегами, чтобы получить ответ. С этого момента я обязательно буду использовать только связанные теги, поскольку это сообщество намного отзывчивее и полезнее, чем другие!

Ответ №1:

Чокапик ответил на вопрос в комментариях. Вот другой подход, использующий возможность форматированного вывода C указывать переменную ширину поля:

         char* dots = "........";
        char* octos = "########";
        for (int nOctos=0; nOctos <= u; nOctos  ) {
            printf("%.*s%.*sn", u-nOctos, dots, nOctos, octos);
        }
 

Разбить его:

%s означает «я передаю a char* в список параметров»

. означает «использование ширины поля»

* означает «ширина поля указана в параметре перед char* »