LINUX.ORG.RU

ПОмогите разобраться с isnan


0

1

В общем пытаюсь решить задачу на С++: написать программу, в результате выполнения которой булевская переменная t получает значение TRUE, если выполняется заданное условие, и FALSE в противном случае (ОПЕРАТОР IF НЕ ИСПОЛЬЗОВАТЬ!!!). Условие: из 2-х введенных символов только одна является цифрой;

#include <iostream> #include <math.h> #include <stdio.h> using namespace std; int main(void) { bool t,c3,c4; int c1,c2; cout<<«Введите 2 числа»<<endl; cin>>c1>>c2; c3=isnan(c1); t=(c3=true)&&(c3=false); cout<<boolalpha<<t<<endl; }

Но почему то всё равно выводится false. Объясните пожалуйста, а то я только начала на C++ пытаться что то делать))

t=(c3=true)&&(c3=false)

Скажи, а если вычислить результат такого выражения:

bool t, я_не_пиздабол, я_пиздабол;
я_пиздабол = true;
я_не_пиздабол = !я_пиздабол;
t = (я_не_пиздабол)&&(я_пиздабол);
cout<<boolalpha<<t<<endl;
Ответ какой будет?

delete83 ★★
()

t=(c3=true)&&(c3=false);

во первых там наверное должно быть не присаивание а сравнение?

t=(c3==true)&&(c3==false);

Во вторых результат всегда будет false потому что false && true всегда дает false;-)

AIv ★★★★★
()
Ответ на: комментарий от delete83

Ну это то я понял, а вот то что всегда false будет вот этого не знал, а как тогда правильно будет?

Turistovik
() автор топика

P.S. почему тут используется isnan, а не isdigit - мне не понятно и не интересно

aho
()

Выше по треду почти все укурены. Какой нафиг isnan?! ISDIGIT, БЛЕАТЬ!

Deleted
()

решение несложное, используйте XOR:

bool is_digit(symbol_t); //прототип
symbol_t symbol1, symbol2;
//вводите symbol1 и symbol2
bool result = is_digit(symbol1) ^ is_digit(symbol2);

Вам остаётся только выбрать какой реальный тип данных Вы будете использовать в качестве symbol_t и написать/упереть_из_стандартной_библиотеки функцию is_digit

//чур в удалённых не смотреть, я там упоротый :)

shty ★★★★★
()
Ответ на: комментарий от shty

решение несложное, используйте XOR:

bool is_digit(symbol_t); //прототип
symbol_t symbol1, symbol2;
//вводите symbol1 и symbol2
bool result = is_digit(symbol1) ^ is_digit(symbol2);
Вам остаётся только выбрать какой реальный тип данных Вы будете использовать в качестве symbol_t и написать/упереть_из_стандартной_библиотеки функцию is_digit

//чур в удалённых не смотреть, я там упоротый :)

На всякий случай добавлю: с реальной сишной функцией isdigit нужно делать примерно так:

#include <cctype>

// ...

c = (bool)std::isdigit(a) ^ (bool)std::isdigit(b);
}
Без явного преобразования в bool этот код может работать не так как ожидиается.

Deleted
()
Ответ на: комментарий от aho

битовые операции над булевыми значениями - не есть хорошо

Если не ошибаюсь, в C++ «булевость» или «битовость» оператора ^ зависит от типов операндов.

Deleted
()
Ответ на: комментарий от Deleted

Примерно так? Или я опять не понял?

int main(void)
{ 
//bool isdigit(int); //прототип
int symbol1, symbol2,c;
cout<<"Введите 2 символа:"<<endl;
cin>>symbol1>>symbol2;
//вводите symbol1 и symbol2
c = (bool)std::isdigit(symbol1) ^ (bool)std::isdigit(symbol2);
cout<<c<<endl;
}
Turistovik
() автор топика
Ответ на: комментарий от Deleted

> Если не ошибаюсь, в C++ «булевость» или «битовость» оператора ^ зависит от типов операндов.

нет - это битовый оператор для целых чисел и перечислений

aho
()
Ответ на: комментарий от aho

Если не ошибаюсь, в C++ «булевость» или «битовость» оператора ^ зависит от типов операндов.

нет - это битовый оператор для целых чисел и перечислений

По законам жанра, сейчас в тред должен прийти бородатый программист в сияющих доспехах, достать стандарт из широких штанин и сказать кто из нас прав. Ждём...

Deleted
()
Ответ на: комментарий от Deleted

5.12 Bitwise exclusive OR operator [expr.xor] exclusive-or-expression: and-expression exclusive-or-expression ^ and-expression 1 The usual arithmetic conversions are performed; the result is the bitwise exclusive OR function of the operands. The operator applies only to integral or enumeration operands.

aho
()
Ответ на: комментарий от aho

То есть стандарт гарантирует, что две истинные булевы переменные всегда равны побитово?

Deleted
()
Ответ на: комментарий от aho

> используйте XOR:

is_digit(symbol1) ^ is_digit(symbol2);

битовые операции над булевыми значениями - не есть хорошо

Страуструп разрешил:

Язык программирования С++ (2010) (русское издание), стр 174

Побитовые логические операторы &, |, ^, ~, >>, << применяются к интегральным типам и перечислениям, то есть к типам bool, char, short, int, long (возможно, с модификатором unsigned).

а вот Вам цитата из стандарта («Working Draft, Standard for Programming Language C++»), чтобы не было сомнений:

5.12 Bitwise exclusive OR operator [expr.xor]

1 The usual arithmetic conversions are performed; the result is the bitwise exclusive OR function of the operands. The operator applies only to integral or enumeration operands.

shty ★★★★★
()
Ответ на: комментарий от Turistovik

Блин прям аж обидно-столько обьясняли, и нифига не понял...(

никто не обещал что будет легко :) что конкретно непонятно?

shty ★★★★★
()
Ответ на: комментарий от shty

Ну для начала это правильно? Если нет то что изменить.

#include <iostream>
#include <math.h>
#include <stdio.h>
#include <cctype>	
using namespace std;
int main(void)
{ 
//bool isdigit(int); //прототип
int symbol1, symbol2,c;
cout<<"Введите 2 символа:"<<endl;
cin>>symbol1>>symbol2;
//вводите symbol1 и symbol2
c = (bool)std::isdigit(symbol1) ^ (bool)std::isdigit(symbol2);
cout<<c<<endl;
}

Turistovik
() автор топика
Ответ на: комментарий от Turistovik

для начала давайте внимательно прочитаем условие:

Условие: из 2-х введенных символов только одна является цифрой;

то есть один из символов может не являться цифрой, Вы же используете для описания символов тип int, поясните каким образом Вы введёте не цифру вот здесь:

int symbol1, symbol2;
std::cout << "Введите 2 символа:" << std::endl;
std::cin >> symbol1 >> symbol2;

или даже так - попробуйте ввести не цифру

shty ★★★★★
()
Ответ на: комментарий от shty

а как ещё могло быть? (bool)2 это 1 :)

Я думал что в плюсах true - это что угодно кроме 0. То есть побитово две переменные с истинным значением не обязаны быть равными. Оказывается ошибался =).

Deleted
()
Ответ на: комментарий от Turistovik

очевидно, что для представления символа лучше всего подходит тип char :)

ну и код бы выглядел так, например:

char symbol1, symbol2;
std::cout<< "Введите 2 символа:" << std::endl;
std::cin >> symbol1 >> symbol2;
shty ★★★★★
()

ВСЕМ ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ!!!

Turistovik
() автор топика
Ответ на: комментарий от shty

> а вот Вам цитата из стандарта («Working Draft, Standard for Programming Language C++»), чтобы не было сомнений:

спасибо, но Вы опоздали с этой цитатой :) как бы я и не имел ввиду, что оно не сработает, смешивание bool и int в битовых операциях может дать неправильный результат "( 1 ^ 2 ) != ( 1 ^ true )" и т.д., т.е. это еще одно место, где надо быть внимательным и не зевнуть функцию, возвращающую int( тот же стандартный isdigit, который по стандарту не обязан возвращать только 0 или 1 ), или не забыть скастовать переменную к bool, хотя да - это всего лишь мое личное мнение

aho
()
Ответ на: комментарий от aho

как бы я и не имел ввиду, что оно не сработает, смешивание bool и int в битовых операциях может дать неправильный результат "( 1 ^ 2 ) != ( 1 ^ true )" и т.д., т.е. это еще одно место, где надо быть внимательным и не зевнуть функцию, возвращающую int( тот же стандартный isdigit, который по стандарту не обязан возвращать только 0 или 1 ), или не забыть скастовать переменную к bool

не, ну чё там зевать :)

bool foo(char symbol1, char symbol2) {
    return (bool)std::isdigit(symbol1) ^ (bool)std::isdigit(symbol2);
}

и да, С++ такой язык где вообще особо лучше не зевать

shty ★★★★★
()

t = isdigit(c1) != isdigit(c2);

arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.