Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Поясните смысл кода


Автор: Kruger2 21.6.2011, 10:54
Код

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

int generation () {
 int n;
    if ((n = rand() % 8 + 2) % 2)
       return ++n;
    return n;
         }
int main () {
    srand(time(NULL));
    
    printf("%d\n", generation());
    
system ("pause");
return 0;
}



Тут непонятно.

Код


if ((n = rand() % 8 + 2) % 2)
       return ++n;
    return n;


Если n = случайное число в пределах от 2 до 10 и деление по модулю на 2 я так понимаю, что это действие указывает, что нужны только четные числf, однако я раньше писал что то вроде:

Код

n=rand () % 8 + 2;

if (n % 2==0) 
printf("%d ", n);


Я вижу действие % 2 незакончнным будто нужно ещё ==0 добавить. Также не совсем понятно, что дает ++n.

Добавлено через 14 минут и 35 секунд
% 2 означает наверное, что данное условие должно делиться на 2 без остатка.

++n получается пробегает по числам в заданном пределе. т.е .между числами 2, 4, 6, 8, 10. Но без цикла for мне это кажется фигнёй какой тоsmile

Автор: asmdzen 21.6.2011, 11:14
Цитата(Kruger2 @  21.6.2011,  10:54 Найти цитируемый пост)
Код

if ((n = rand() % 8 + 2) % 2)
       return ++n;
    return n;

если n получается нечетное - возвращается n+1
в противном случае просто n.

Автор: Kruger2 21.6.2011, 11:18
Код

if ((n = rand() % 8 + 2) % 2)  !=0
then
       return ++n;
else
    return n;


т.е. читать можно так?

Автор: borisbn 21.6.2011, 11:20
Цитата(Kruger2 @  21.6.2011,  10:54 Найти цитируемый пост)
Я вижу действие % 2 незакончнным будто нужно ещё ==0 добавить.

вот тогда будет проверка на чётность, а в приведённом коде - на нечётность, т.е. что рез-т остатка от деления не равен 0
Цитата(Kruger2 @  21.6.2011,  10:54 Найти цитируемый пост)
Также не совсем понятно, что дает ++n.

оба return'а возвращают чётные числа.
Цитата(Kruger2 @  21.6.2011,  10:54 Найти цитируемый пост)
n = случайное число в пределах от 2 до 10

от 2 до 9, т.к. n % 8 == 0...7, а +2 == 2 до 9

Автор: xvr 21.6.2011, 11:21
rand() % 8 - Возвращает остаток от деления случайного числа на 8, т.е. число в диапазоне 0-7
n = rand() % 8 + 2 - В n присваивается случайное число в диапазоне 2-9
if ( n %2) - Проверяет, что остаток от деления n на 2 не равен нулю, т.е. n нечетное
return ++n; - Возвращает увеличенное на 1 n, т.е. число становится четным

Автор: Kruger2 21.6.2011, 11:39
Код


    if ((n = rand() % 8 + 2) % 2  !=0)
       ++n;
    return n;


Если я правильно понял, то эта запись эквивалентна этой:

Код

 if ((n = rand() % 8 + 2) % 2)
       return ++n;
    return n;


Так ли это?

Добавлено @ 11:40
Компилятор вроде подтверждает мои догадкиsmile

Автор: asmdzen 21.6.2011, 11:45
Kruger2, if(23) то же самое что if(true) то же самое что if((n = 3) != 0) и if(n = 3).
то есть если условие не равно нулю то выполняется код if.
return ++n; можно написать и как return n + 1; что будет правильней IMHO.
у вас просто код запутан немного, писать было бы правильней как xvr показал.

Автор: xvr 21.6.2011, 11:57
Цитата(asmdzen @  21.6.2011,  11:45 Найти цитируемый пост)
у вас просто код запутан немного,
Я бы прилагательное 'немного' сюда не применял  smile 
Цитата(asmdzen @  21.6.2011,  11:45 Найти цитируемый пост)
писать было бы правильней как xvr показал. 

Совсем правильно было бы написать
Код

return (rand()%5+1)*2;


Автор: Kruger2 21.6.2011, 11:59
тест

Добавлено @ 12:03
Код

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

int generation () {
      return (rand() % 5 + 1) *2;
         }
int main () {
    srand(time(NULL));
    
    printf("%d\n", generation());
    
system ("pause");
return 0;
}



Краткость сестра талантаsmile Красиво сократилосьsmile но правильна ли запись? какая то функция голая получается

Добавлено @ 12:05
Хотя мне тут функция тогда нафик не нужна smile 


Код

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

int main () {
    srand(time(NULL));
    
    printf("%d\n", (rand() % 5 + 1) *2);
    
system ("pause");
return 0;
}



Добавлено через 9 минут и 15 секунд
Спасибо за помощь. xvr + в репу от меня поставьте пожалуйста.
asmdzen 
borisbn

тоже по плюсику за помощь, если кто может поставитьsmile

Автор: borisbn 21.6.2011, 12:44
Цитата(Kruger2 @  21.6.2011,  11:59 Найти цитируемый пост)
 xvr + в репу от меня поставьте пожалуйста.

поставил.

Цитата(Kruger2 @  21.6.2011,  11:59 Найти цитируемый пост)
Хотя мне тут функция тогда нафик не нужна

я б оставил. запись
Цитата(Kruger2 @  21.6.2011,  11:59 Найти цитируемый пост)
  printf("%d\n", (rand() % 5 + 1) *2);

какая-то монстрообразная.

Цитата(Kruger2 @  21.6.2011,  11:59 Найти цитируемый пост)
  printf("%d\n", generation());

как-то покрасивше будет. имхо

Автор: Kruger2 21.6.2011, 14:18
Блин, по аналогии пример теперь не могу решитьsmile Нужен случайный выбор числа из списка: 6, 10, 14, 18, 22. Т.е. шаг 4.  

Значит мне нужно четное число, но с шагом 4. Деление тут не подходит и я не вижу какую закономерность прописать пытаюсь применить деление с остатком, как в прошлом примере, но судя по всему тут нужно что то другое:

Код

  int n;
    n = rand() % 17 + 6 /*Выбор чисел в промежутке от 6 до 22*/
     if (n)
          return n;
    


Как задать зависимость?

Автор: borisbn 21.6.2011, 14:40
Код

const int numbersCount = 5;
const int step = 4;
const int firstNumber = 6;
n = ( rand() % numbersCount ) * step + firstNumber;

Автор: Kruger2 21.6.2011, 15:17
borisbn, 
Ух ты, красота, спасибо. 

А если переменные не задавать как константы, то ничего не меняется. Вопрос, для чего определили переменные как константы? Я подозреваю, что причина должна бытьsmile

Борису + в репу от меня поставьте пожалуйстаsmile

Добавлено через 4 минуты и 24 секунды
Такая формула кажется совершенно нелогичной мне. Любое число * на шаг+ первое число всё таки получается как и надо. Но кажись моей сноровки не хватает, что бы самому до такого дотюкать. Может стоит что то дополнительно почитать, что бы научиться такие формулы создавать?)

Автор: borisbn 21.6.2011, 15:36
Цитата(Kruger2 @  21.6.2011,  15:17 Найти цитируемый пост)
А если переменные не задавать как константы, то ничего не меняется. Вопрос, для чего определили переменные как константы? Я подозреваю, что причина должна быть

причина - исключительно в самодокументируемости кода. я этим хотел показать, что это не совсем "переменные", т.е. "менять" я их не собираюсь, а что это константы, но именованные - для лучшей читабельности кода и для простоты их изменения (для экспериментов).
Кстати, если чуть доработать ф-цию генерации
Код

int generate( const int numbersCount, const int step, const int firstNumber )
{
    return ( rand() % numbersCount ) * step + firstNumber;
}

то она получится у тебя универсальная для всех (почти) случаев жизни smile

Цитата(Kruger2 @  21.6.2011,  15:17 Найти цитируемый пост)
Может стоит что то дополнительно почитать, что бы научиться такие формулы создавать?)

Знаешь, что нужно, чтобы лужайка из травы перед домом выглядела как у англичан - идеальная форма, идеальный цвет и т.п. ?  smile 

Автор: xvr 21.6.2011, 19:30
Цитата(Kruger2 @  21.6.2011,  15:17 Найти цитируемый пост)
Борису + в репу от меня поставьте пожалуйста

Поставил

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)