Как исправить условие, чтобы оно не выполнялось, выполняйте непрерывную часть - PullRequest
0 голосов
/ 12 января 2019

Проблема в том, что программа продолжает запрашивать высоту даже в том случае, если введено число от 1 до 8. У меня также возникают трудности с пониманием того, почему мне нужно пересчитать «int height» после цикла while, но это побочная проблема.

{
   do
   {
    int height = get_int("Height: \n");
   }
   while ('h'>8 || 'h'<1);

  int height;

  printf ("Stored: %d\n", height);
}

Я ожидаю, что он представляет число, введенное пользователю, но не проходит запрос на ввод, несмотря на условия в функции while.

Ответы [ 5 ]

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

ваш тест в то время как никогда не меняется и всегда верен, компилятор ссылается на 'h' как символ и преобразует его в свой код ASCII, который равен 104 (который всегда больше, чем 8). время в этом коде для компилятора всегда похоже на while (104 > 8 || 104 < >);. Кроме того, вам не нужно повторно указывать int height;, переменная высоты уже объявлена.

вы можете изменить свой код на что-то вроде:

{

do {
   int height = get_int("Height : \n");
} while ( height > 8 || height < 1);

printf ("Stored: %d\n", height);

}

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

В вашем состоянии:

while ('h'>8 || 'h'<1)

'h' - символьная константа. Это не имеет ничего общего с переменной height. Вы сравниваете эту константу с 8 и 1. В ASCII код для 'h' больше 8, поэтому условие всегда будет истинным.

Также:

int height = get_int("Height: \n");

Объявление height внутри цикла означает, что он перестает существовать вне цикла, включая условный цикл. height, который вы определили позже, является другой переменной, чем эта.

Переместите определение height за пределы цикла и используйте height в сравнении:

int height;
do
{
    height = get_int("Height: \n");
} while (height>8 || height<1);

printf ("Stored: %d\n", height);
0 голосов
/ 12 января 2019

'h' является константой. В ASCII оно всегда будет иметь целочисленное значение 104. Так что 'h' > 8 всегда будет правдой.

Что касается вашего второго вопроса. Переменная height, определенная внутри цикла do-while, находится в другой области видимости. Новый height создается в начале каждой итерации и уничтожается в конце каждой итерации.

Определение height перед циклом сделает его доступным внутри и после цикла.

int height = 0;
do {
    height = get_int("Height: \n");
} while (height > 8 || height < 1);
printf("Stored: %d\n", height);

Попробуйте подробнее ознакомиться с правилами области видимости C .

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

Вы должны объявить переменную int high снаружи. Как это

Проблема в том, что программа продолжает запрашивать высоту даже в том случае, если введено число от 1 до 8. У меня также возникают трудности с пониманием того, почему мне нужно пересчитать «int height» после цикла while, но это побочная проблема.

{

int высота; делать

{

height = get_int ("Height: \ n");

}

while ('h'> 8 || 'h' <1); </p>

printf («Сохранено:% d \ n», высота);

}

0 голосов
/ 12 января 2019
do
{
   int height = get_int("Height: \n");
}
while ('h'>8 || 'h'<1);

тест является константным выражением, 'h'>8 всегда истинно и 'h'<1 всегда ложно, поэтому тест всегда верен, нет причин делать остановку во время

примечание: int height - локальная переменная, существующая только в блоке do


int высота;

printf («Сохранено:% d \ n», высота);

вы печатаете неинициализированную переменную


переместите int height; до выполнения do и замените int height = get_int("Height: \n"); на height = get_int("Height: \n"); и, конечно, замените тест, чтобы проверить значение высоты

...