Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поясните смысл кода, Элементарно, но непонятно:) 
V
    Опции темы
Kruger2
Дата 21.6.2011, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



Код

#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
PM MAIL   Вверх
asmdzen
Дата 21.6.2011, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



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

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

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

PM MAIL   Вверх
Kruger2
Дата 21.6.2011, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



Код

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


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

Это сообщение отредактировал(а) Kruger2 - 21.6.2011, 11:19
PM MAIL   Вверх
borisbn
Дата 21.6.2011, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 21.6.2011, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



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

PM MAIL   Вверх
Kruger2
Дата 21.6.2011, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



Код


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


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

Код

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


Так ли это?

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

Это сообщение отредактировал(а) Kruger2 - 21.6.2011, 11:40
PM MAIL   Вверх
asmdzen
Дата 21.6.2011, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Kruger2, if(23) то же самое что if(true) то же самое что if((n = 3) != 0) и if(n = 3).
то есть если условие не равно нулю то выполняется код if.
return ++n; можно написать и как return n + 1; что будет правильней IMHO.
у вас просто код запутан немного, писать было бы правильней как xvr показал.
PM MAIL   Вверх
xvr
Дата 21.6.2011, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



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

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

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


PM MAIL   Вверх
Kruger2
Дата 21.6.2011, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



тест

Добавлено @ 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

Это сообщение отредактировал(а) Kruger2 - 21.6.2011, 12:05
PM MAIL   Вверх
borisbn
Дата 21.6.2011, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(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());

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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Kruger2
Дата 21.6.2011, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



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

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

Код

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


Как задать зависимость?
PM MAIL   Вверх
borisbn
Дата 21.6.2011, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Код

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



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Kruger2
Дата 21.6.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



borisbn, 
Ух ты, красота, спасибо. 

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

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

Добавлено через 4 минуты и 24 секунды
Такая формула кажется совершенно нелогичной мне. Любое число * на шаг+ первое число всё таки получается как и надо. Но кажись моей сноровки не хватает, что бы самому до такого дотюкать. Может стоит что то дополнительно почитать, что бы научиться такие формулы создавать?)
PM MAIL   Вверх
borisbn
Дата 21.6.2011, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(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 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 21.6.2011, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



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

Поставил

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0864 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.