Я сделал цикл while, и он частично работает. Я хочу, чтобы код останавливался, когда введенные значения находятся под параметром, но он продолжает работать независимо от вывода. Вот мой код:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <time.h>
int main()
{
// defining variables until "till here" comment
int i;
int rollDice;
int firInp;
int secInp;
srand (time(NULL)); // seeding rand so that we get different values every time
// till here
while(rollDice > 0)
{
printf("Enter the amount of faces you want your dice to have (MAX=24, MIN=1): "); // prints the message
scanf("%d", &firInp); // user input stored into firInp
printf("Enter the amount of throws you want(MAX=499, MIN=1): "); // this message is printed after the users first input
scanf("%d", &secInp); // user input stored into secInp
if (((firInp < 25)&&(firInp > 1))&&((secInp < 500)&&(secInp > 1))){ // if statement to check parameters
for(i = 0; i < secInp; i++){
rollDice = (rand()%firInp) + 1;
printf("%d \n", rollDice);
}
}
else{
printf("Sorry, these numbers don't meet the parameters\nPlease enter a number in the right parameters.\n");
}
}
return 0;
}
Я новичок в C кстати.
редактировать: я хочу, чтобы цикл продолжался, если пользовательский ввод больше 24 499 соответственно.
«Кстати, я новичок в C» — у меня есть для вас предложение: включите все предупреждения, которые может выдать ваш компилятор, и внимательно прочитайте его вывод. Попробуйте создать компиляции без предупреждений.
@ЕвгенийШ. да. rollDice
никогда не станет равным нулю. потому что он добавляет 1 к уже минимальному случаю с номером 0. Ему нужна переменная флага.
То, что ты делаешь, неправильно. Переменная rollDice
предназначена для хранения значений результатов, а не для проверки условий. Он будет иметь случайные значения, и, поскольку значения на кубиках не могут быть отрицательными или zero
, он не может выйти из цикла while. Я не знаю, что будет rand()
производить, поэтому я просто предполагаю.
Диапазон для rand()
равен [0,RAND_MAX), включая zero
и исключая RAND_MAX
. Но из-за этого выражения (rand()%firInp) + 1
вы добавляете к нему единицу. Так что он никогда не станет Зеро.
Вы можете использовать переменную flag
и установить для нее значение 1
. Когда условия if
выполнены, вы можете установить флаг в 0. Он выйдет из цикла while
.
Исправленный код: -
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <time.h>
int main()
{
// defining variables until "till here" comment
int i;
int rollDice;
int firInp;
int secInp;
int flag = 1;
srand (time(NULL)); // seeding rand so that we get different values every time
// till here
while(flag)
{
printf("Enter the amount of faces you want your dice to have (MAX=24, MIN=1): "); // prints the message
scanf("%d", &firInp); // user input stored into firInp
printf("Enter the amount of throws you want(MAX=499, MIN=1): "); // this message is printed after the users first input
scanf("%d", &secInp); // user input stored into secInp
if (((firInp < 25)&&(firInp > 1))&&((secInp < 500)&&(secInp > 1))){ // if statement to check parameters
for(i = 0; i < secInp; i++){
rollDice = ((rand() + 1)%firInp);
printf("%d \n", rollDice);
}
flag = 0;
}
else{
printf("Sorry, these numbers don't meet the parameters\nPlease enter a number in the right parameters.\n");
}
}
return 0;
}
РЕДАКТИРОВАТЬ :-
Кроме того, деление с 0
равно undefined
. rand()
может достигать значения 0
. Вы должны добавить 1
к rand()
, а не добавлять ко всему модулю. Это может создать ошибку, если rand()
выдаст 0
в качестве вывода.
Ты гений. Спасибо!
@RockJumpwa22, пожалуйста, прочитайте правку. У вас все еще есть ошибка в вашем коде, которая исправлена в редактировании.
Спасибо! Вы очень помогли.
Ваше условие цикла
rollDice > 0
. ИrollDice = (rand()%firInp) + 1;
. В каких случаях условие может быть ложным? Он также неинициализируется в первой итерации.