Предположим, что заголовок ncurses есть и что мой random_number_generator()
метод работает. Я пытаюсь выйти из цикла, нажав «а» (в конце концов, я хочу выйти, нажав CtrlЕ).
Мой код продолжает печатать случайные числа каждую секунду, как и предполагалось. Я хочу, чтобы он завершился, если выполнено любое из условий:
Он выйдет, если случайное число кратно делителю.
Это выйдет, если я использую getch()
, Я думаю, что это должно работать, но это не выход, когда я ударил .
int main(int argc, char *argv[]){
int lowest = atoi(argv[1]);
int highest = atoi(argv[2]);
int divisor = atoi(argv[3]);
int random_number;
srand((unsigned)time(0));
int c;
do
{
random_number = random_number_generator(lowest, highest);
cout << random_number << endl;
sleep(1);
} while(random_number % divisor != 0 || (c=getch())!=49);
return 0;
}
Редактировать:
Я пытался изменить условие на && вместо этого, но getch все еще не позволяет ему выйти:
Диапазон выходов случайных чисел 1-10:
4
a3 <-hit a
aaa4 <-hit a many times
5 <-exits
Потому что Короткое замыкание поведение логики или оператора ||
если первое выражение истинно, второе не выполняется.
random_number % divisor != 0 || (c=getch())!=49
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^
True not get executes
Так как random_number % divisor != 0
верно, вот почему все равно, что вы вводите
использование &&
вместо
Всякий раз, когда вы используете условие, убедитесь, что все части ведут себя как ожидалось.
Для большей ясности лучше использовать:
do
{
random_number = random_number_generator(lowest, highest);
cout << random_number << endl;
sleep(1);
} while(random_number % divisor != 0 && (c=getch())!='a');
Теперь, если вы введете «а», второе условие ложно, и цикл завершается.
Ваш цикл while имеет оператор ИЛИ (||) с двумя условиями, в этом случае вычисление выполняется слева направо. Есть две ситуации, когда условие может быть истинным, одна из них если random_number% divisor == 0, другая c = getch () == 49, если какое-либо из этих условий выполнено, тогда цикл завершится, иначе он выполнит его следующая итерация.
Поскольку оценка условия выполняется слева направо, поэтому, если первое условие внутри while () истинно, выполняется следующая итерация, поэтому всякий раз, когда random_number% divisor == 0, будет выполняться следующая итерация.
Решение: поместите c = getch ()! = 49 с левой стороны, сделайте его первым условием и поместите делитель random_number%! = 0 с правой стороны, сделайте его вторым условием слева направо.
потому что при любом заданном входе, по крайней мере, условие удовлетворяется и или (||) продолжает цикл. USE и (&&) вместо
Измени свою работу || to &&
а также сделать c=getch()!=49
Первый контроль. Вы можете увидеть пример ниже;
int lowest = atoi(argv[1]);
int highest = atoi(argv[2]);
int divisor = atoi(argv[3]);
int random_number;
srand((unsigned)time(0));
int c;
do
{
random_number = random_number_generator(lowest, highest);
cout << random_number << endl;
sleep(1);
} while((c=getch())!=49 && random_number % divisor != 0);
return 0;
char c;
do
{
random_number = random_number_generator(lowest, highest);
cout << random_number << endl;
if(random_number % divisor == 0)
break;
else if((c=getchar())=='a')
break;
else;
sleep(1);
} while(1);
#include <stdio.h>
#include <conio.h>
int main(int argc, char *argv[])
{
int lowest = atoi(argv[1]);
int highest = atoi(argv[2]);
int divisor = atoi(argv[3]);
int random_number;
srand((unsigned)time(0));
char c;
do
{
random_number = random_number_generator(lowest, highest);
printf("%d\n",random_number);
if(random_number % divisor == 0)
break;
else if(kbhit()){
c = getch();
if(c=='a')
break;
}
else;
sleep(1);
} while(1);
return 0;
}