Генерация случайных чисел и печать Готово! если они попадают в диапазон C

Извините, если на этот вопрос был дан ответ в другом месте, я искал, но не смог найти то, что искал.

В любом случае, я застрял на проблеме с домашним заданием в университете, проблема просит меня создать сценарий, который случайным образом генерирует числа от 0 до 99 и печатает число на новой строке каждый раз, и если только что напечатанное число попадает в диапазон 68 -74, тогда он должен напечатать Done! на следующей строке и выйти из скрипта.

Мне дали шаблон с уже сделанным за меня кодом, он выглядит так:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    srand(time(NULL));
    /**
     * Your solution must start from below this point. No code modifications WHATSOEVER are allowed ABOVE this point!
     */


    /**
     * Your solution must have finished by this point. No code modifications WHATSOEVER are allowed BELOW this point!
     */
    return 0;
}

int getRandInt() {
    return rand() % 100;
}

Во всяком случае, после долгих возни я, наконец, заставил его бесконечно печатать список случайных чисел, а не 1 случайное число. Я сделал это, используя:

do
    printf ("%d\n", getRandInt());
while (getRandInt());

Я пробовал подключать такие вещи, как:

do
    printf ("%d\n", getRandInt());
while (getRandInt() <68);

чтобы увидеть, будет ли он печатать хотя бы только случайные целые числа меньше 68, но это просто заставляет его печатать только 1 или 2 случайных числа (иногда со значениями больше 68) вместо огромного списка, который печатает предыдущий блок кода.

Я вызываю правильную функцию? Должен ли я использовать цикл Do While? Как установить диапазон чисел для выхода из цикла и печати «Готово!»? Очевидно, что я не могу редактировать код вне комментариев.

Я очень новичок в кодировании и буду признателен за любую помощь в решении этой проблемы.


person Permanent Waves    schedule 07.08.2014    source источник
comment
Сколько экспериментов вы провели?   -  person SingleStepper    schedule 07.08.2014
comment
Много, я подключал разные вещи все утро.   -  person Permanent Waves    schedule 07.08.2014
comment
Теперь будем надеяться, что ваш профессор тоже сюда не придет!   -  person SingleStepper    schedule 08.08.2014


Ответы (3)


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

Попробуйте следующий фрагмент кода:

/**
 * Your solution must start from below this point. No code modifications WHATSOEVER are       allowed ABOVE this point!
 */
    int ret;
    do{
            ret = getRandInt();
            printf("%d\n",ret);

    }while(!(ret >= 68 && ret <= 74));

    printf("Done!\n");
/**
 * Your solution must have finished by this point. No code modifications WHATSOEVER are allowed BELOW this point!
 */

Из приведенного выше кода, когда число попадает в диапазон от 68 до 74, он печатает Done! и выходит из цикла. Если нет (!(ret >= 68 && ret <= 74)), цикл продолжится и будет выполняться до тех пор, пока число не упадет между 68 и 74.

person Sathish    schedule 07.08.2014
comment
Спасибо, эта работа отлично! И самое главное я понимаю, почему это работает. Я пытался объявить другую переменную, но я не делал этого в цикле, поэтому я продолжал повторять одно и то же случайное число. Я также не знал о команде &&. Еще раз спасибо и спасибо всем, кто прокомментировал, это очень ценно! - person Permanent Waves; 07.08.2014
comment
@PermanentWaves && это логично и операторно. когда левые и правые условия верны, он вернет true. - person Sathish; 07.08.2014
comment
Условие if с exit бессмысленно: вы можете переместить печать Done! после условия while. - person user694733; 07.08.2014
comment
@Sathish Я помню && теперь из MATLAB, и я вижу, что кто-то еще написал скрипт, используя while(r › 74 || r ‹ 68); так это просто закон ДеМоргана, верно? вместо того, чтобы быть (все, что НЕ входит в этот диапазон), это пока (все, что находится за пределами этого диапазона) - person Permanent Waves; 07.08.2014
comment
@PermanentWaves Я. ты прав!. вы можете найти много способов, как это! - person Sathish; 07.08.2014

Каждый раз, когда вы вызываете getRandInt(), вы получаете новое случайное значение. Это означает, что вы проверяете условие в цикле while с другим случайным числом, чем вы печатаете.

Чтобы это исправить, вам нужно получить случайное значение и сохранить его, а затем выполнить сравнение. Вы можете решить эту проблему, используя множество различных типов циклов, включая do/while.

Также обратите внимание, что использование родителей с вашим оператором do является хорошим стилем:

do {
    // code here.
} while ( ... );

Поскольку вы определили это как домашнее задание, я оставлю помощь здесь, если у вас нет других вопросов.

person Nathan S.    schedule 07.08.2014
comment
поэтому я должен объявить другой номер типа int, а затем сделать что-то вроде: int number = getRandInt(), а затем вызвать число int в цикле? - person Permanent Waves; 07.08.2014

Я думаю, вы просто запутались в том, как написать условие в цикле do while.

Попробуйте этот код, он будет работать!

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int getrandom_no()
{
    return rand() % 100;
}

int main(void) {
    int r=0;

    srand(time(NULL)); /* To use rand function you must use srand first */
    do 
    {
        r = getrandom_no();
        printf("%d\n",r);
    }while(r > 74 || r < 68);
    puts("Done!");

    return 0;
}
person ani627    schedule 07.08.2014
comment
Этот скрипт работает, но мне не разрешено редактировать какой-либо код, кроме комментариев. В любом случае спасибо, так как чем больше примеров я должен изучить, тем лучше мое понимание. - person Permanent Waves; 07.08.2014