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


Автор: Simon14 25.1.2010, 01:58
Всем доброго времени суток есть задача вібрать из масива четніе и нечетніе числа пробовал так но відает ошибгу посмотрите что можносделать и в чем моя ошибка 
Код
#include<iostream>
#include<cmath>
//#include<math.h>
#include<locale>
using namespace std;
int main ()
{
    
    long double x;
    int z;
    int r;
    int i=0;
int c;
    while(i<=20)
    {    
    if ( fmod(4,2)==0)
    {
    c=3;
    }
    else
    {
            c=4;
    }
cout<<"otvet12 "<<c<<endl;
    i++;
    }
    return 0;}


зарание всем спасибо

Добавлено через 13 минут и 40 секунд
вот сделал так 
Код
#include<iostream>
#include<cmath>
//#include<math.h>
#include<locale>
using namespace std;
int main ()
{
    
    long double x;
    int z;
    int r;
    int i=0;
int c;
    while(i<=20)
    {    
    if ( 4%2==0)
    {
    c=3;
    }
    else
    {
            c=4;
    }
cout<<"otvet12 "<<c<<endl;
    i++;
    }
    return 0;}


Автор: Данкинг 25.1.2010, 02:13
Какую ошибку-то? Мне кажется, что остаток от деления 4 на 2 всегда будет равен нулю. smile К тому же зачем объявлены всякие лишние переменные вроде x, z, r ?

Автор: Simon14 25.1.2010, 02:22
уже  сделал как привел выше  но вопрос был в том  как находить четные и нечетные числа с помошью mod

Автор: NewDima 25.1.2010, 11:41
Число четное:
Код

#define isEven(a) !(bool)(a%2)
#define isEven(a) !(bool)(a&1)


Добавлено через 4 минуты и 55 секунд
а mod - это и есть %.

Автор: Леопольд 25.1.2010, 12:33
Цитата(NewDima @  25.1.2010,  11:41 Найти цитируемый пост)
Код

#define isEven(a) !(bool)(a%2)
#define isEven(a) !(bool)(a&1)

Не делай так. Лучше вообще забудь про макросы. Тоже самое, но более безопасно:
Код

template<typename T>
inline bool isEven(T a){
    return !(a%2);
}

Автор: zim22 25.1.2010, 12:56
Цитата(Леопольд @  25.1.2010,  11:33 Найти цитируемый пост)
bool result = ~(a%2);

ну и зачем битовое НЕ применять? чем логическое не устраивает?

Автор: Леопольд 25.1.2010, 13:43
Цитата(zim22 @  25.1.2010,  12:56 Найти цитируемый пост)
ну и зачем битовое НЕ применять? чем логическое не устраивает? 

Опечатался, уже исправил

Автор: NewDima 25.1.2010, 14:52
Цитата(Леопольд @ 25.1.2010,  19:33)
Лучше вообще забудь про макросы.

Причина?

Автор: baldina 25.1.2010, 16:16
Цитата(NewDima @  25.1.2010,  14:52 Найти цитируемый пост)
Цитата(Леопольд @ 25.1.2010,  19:33)
Лучше вообще забудь про макросы.

Причина? 


потому что

Код

template<typename T>
inline bool isEven(T a){ return !(a%2); }

int x = 1;
// выводит 1 1 1 1
std::cout << isEven(x+1) << ' ';
std::cout << (isEven(x+1)) << ' ';
std::cout << isEven((x+1)) << ' ';
std::cout << isEven(1+x) << std::endl;


#define isEven(a) !(bool)(a%2)
int x = 1;
// выводит 0 0 1 0
std::cout << isEven(x+1) << ' ';
std::cout << (isEven(x+1)) << ' ';
std::cout << isEven((x+1)) << ' ';
std::cout << isEven(1+x) << std::endl;



Автор: zim22 25.1.2010, 17:18
Цитата(baldina @  25.1.2010,  15:16 Найти цитируемый пост)
потому что
// выводит 0 0 1 0

а теперь выводит 1 1 1 1
Код

#define isEven(a) !(bool)((a)%2)

Автор: NewDima 25.1.2010, 17:20
baldina, у меня некорректно составленный макрос, согласен, забыл про скобки. Но вот вызов функции для проверки четности числа - ИМХО странное занятие. Инструкция inline всегда была для компилятором чем-то сродни пожеланию, или что-то изменилось, и вы гарантируете, что эта функция будет встроена в тело основного кода и дополнительные вызовы сгенерированы не будут?

Добавлено через 24 секунды
zim22, вот и я о том же

Автор: zim22 25.1.2010, 17:40
Цитата(NewDima @  25.1.2010,  16:20 Найти цитируемый пост)
zim22, вот и я о том же

я просто код исправил. я тоже против макросов в данном случае. 

я бы его использовал, если бы:
1) у него было адское имя типа UGLY_MACROS_THAT_CHECK_WHETHER_VARIABLE_IS_EVEN_OR_NOT
2) после использования ему был бы сразу сделан #undef

адское имя резало бы мне глаза и мне бы пришлось поменять макрос на функцию smile

Автор: NewDima 25.1.2010, 17:53
Нет, я не говорю, что нужно пихать их куда ни поподя, но и говорить, что про макросы вообще нужно забыть без аргументации неправильно как-то. А вообще я php-программист, многого в плюсах и сях не знаю и мне действительно интересно, почему была высказана такая точка зрения. Может я тоже передумаю их использовать  smile

Добавлено через 1 минуту и 27 секунд
Единственная проблема, которую я вижу - неподчинение пространствам имен

Автор: zim22 25.1.2010, 23:28
Цитата(NewDima @  25.1.2010,  16:53 Найти цитируемый пост)
Единственная проблема, которую я вижу - неподчинение пространствам имен

http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.5

Автор: Леопольд 26.1.2010, 02:05
Цитата(NewDima @  25.1.2010,  14:52 Найти цитируемый пост)
Цитата(Леопольд @ 25.1.2010,  19:33)
Лучше вообще забудь про макросы.
Причина? 

Цитата(NewDima @  25.1.2010,  17:20 Найти цитируемый пост)
baldina, у меня некорректно составленный макрос, согласен, забыл про скобки.

На мой взгляд, этого уже достаточно smile По крайней мере мне ни к чему ошибки, которые я буду искать неопределённо долгое время. Не знаю ни один компилятор, который явно укажет на то что ошибка именно в макросе. К тому же этот макрос можно переопределить совсем в другой и т.д. Никакой статической типизации. Т.е. ему всё равно что у него в "аргументах", если можно так сказать. Уж лучше написать функцию, которая будет принимать инт максимальной размерности чем макрос. Однако, иногда, без макросов не обойтись. Но это точно не тот случай.

Цитата(NewDima @  25.1.2010,  17:20 Найти цитируемый пост)
Но вот вызов функции для проверки четности числа - ИМХО странное занятие. Инструкция inline всегда была для компилятором чем-то сродни пожеланию, или что-то изменилось, и вы гарантируете, что эта функция будет встроена в тело основного кода и дополнительные вызовы сгенерированы не будут?

И не такое встраивается, независимо от того есть инлайн или нет. Даже если нет инлайн и компиляция будет не в дебаг а в релиз, то эта функция всё равно встроится, слишком она мала. Дешевле её встроить чем push потом call и следом pop. Для любого компилятора это не составит труда. Если не нравится функция, то лучше ручками записать проверку, чем использовать "удобный" макрос.

Автор: NewDima 26.1.2010, 04:46
Леопольд, по поводу конкретно этих макросов я полностью согласен, и не считаю, что без них не обойтись. С минусами в принципе согласен, но нельзя иногда без них, или глупо просто смотрится код. Но это ни тот случай.

zim22, спасибо за ссылку

Автор: baldina 26.1.2010, 12:52
Я всего лишь продемонстрировал, что использование макросов менее удобно и более склонно к ошибкам. Раскрытие макросов зависит от контекста, не работает система типов, макросы вообще не являются частью языка. Про это сто раз писалось и говорилось.
да, директива inline является советом, а не указанием. однако современные компиляторы в состоянии встроить даже то, что не является inline. и они это делают достаточно эффективно.
всегда стоит предпочитать ясность кода, скорость разработки и удобство сопровождения сомнительной оптимизации.

Автор: dix75 26.1.2010, 21:01
Цитата(Simon14 @  25.1.2010,  01:58 Найти цитируемый пост)
 есть задача вібрать из масива четніе и нечетніе числа 


Код

#include "vector"
#include "iostream"
#include "boost/lambda/lambda.hpp"
#include "boost/lambda/if.hpp"
#include "algorithm"
//------------------------------------------------------------------------------
int main(int argc, char *argv[])
{
    using namespace  boost::lambda;
    std::vector<int> vec(100);
    std::generate(vec.begin(), vec.end(), rand);
    std::for_each(vec.begin(), vec.end(), if_( _1%2 ==0 )[std::cout<< constant("Чётное число:  ") << _1 <<"\n"] );
    std::for_each(vec.begin(), vec.end(), if_( _1%2 )   [std::cout<< constant("Нечётное число:  ") << _1 <<"\n"] );
    return (EXIT_SUCCESS);
}
//------------------------------------------------------------------------------


Автор: serg76 1.2.2010, 14:21
 smile 
Код
  int i=3;
  if(i&1)
  {
    нечет
  }
  else
  {
    четное
  }

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