Как выйти из цикла, когда требование выполнено в C

Я сделал цикл 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 соответственно.

Ваше условие цикла rollDice > 0. И rollDice = (rand()%firInp) + 1;. В каких случаях условие может быть ложным? Он также неинициализируется в первой итерации.

Eugene Sh. 14.12.2020 22:48

«Кстати, я новичок в C» — у меня есть для вас предложение: включите все предупреждения, которые может выдать ваш компилятор, и внимательно прочитайте его вывод. Попробуйте создать компиляции без предупреждений.

pmg 14.12.2020 22:49

@ЕвгенийШ. да. rollDice никогда не станет равным нулю. потому что он добавляет 1 к уже минимальному случаю с номером 0. Ему нужна переменная флага.

the trickster 14.12.2020 23:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что ты делаешь, неправильно. Переменная 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 14.12.2020 23:08

@RockJumpwa22, пожалуйста, прочитайте правку. У вас все еще есть ошибка в вашем коде, которая исправлена ​​​​в редактировании.

the trickster 14.12.2020 23:09

Спасибо! Вы очень помогли.

RockJumpwa22 14.12.2020 23:55

Другие вопросы по теме