#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
нигде не меняется, верно? Тогда ifu = 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*
»