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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Или/И или я в непонятках 
:(
    Опции темы
0761
Дата 2.9.2011, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!
Вот пример:

Код

long double temp = fld + i2.fld;
    if ((temp > UP) || (temp < DOWN))
    {
        cout << "Ошибка, б";
        exit(1);
    }
    else
    {
        return Int(static_cast<int>(temp));
    }

, где UP/DOWN - верхняя и нижняя границы типа int. 
Берем за temp число 15. Следовательно здесь 
Код

if ((temp > UP) || (temp < DOWN))

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

cout << "Ошибка, б";
        exit(1);


Насколько я понимаю, дизъюнкция двух нулей дает ноль, следовательно мы должны были отправиться в ветку else.

PM MAIL   Вверх
volatile
Дата 3.9.2011, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Чему у вас равны UP и DOWN
Покажите код. 

Цитата(0761 @  2.9.2011,  22:24 Найти цитируемый пост)
где UP/DOWN - верхняя и нижняя границы типа int. 

скорей всего они равны чему-то другому.


PM MAIL   Вверх
newbee
Дата 3.9.2011, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Скорее всего что-то с привидением типов во время сравнения. Нужно больше информации о том, что такое up & down.


--------------------
You're face to face
With man who sold the world
PM   Вверх
Чoо
Дата 3.9.2011, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



с приведением типов там всё оК будет


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
0761
Дата 3.9.2011, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



UP и DOWN у меня константы типа лонг дабл, равные границам типа инт
PM MAIL   Вверх
Чoо
Дата 3.9.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



у меня почему-то работает именно так как и должно работать:
user posted image


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
volatile
Дата 3.9.2011, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Оно и будет работать.

Цитата(0761 @  3.9.2011,  14:23 Найти цитируемый пост)
UP и DOWN у меня константы типа лонг дабл, равные границам типа инт 

Код покажите.
PM MAIL   Вверх
Чoо
Дата 3.9.2011, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



да, будет работать.. а поведение программы будет такое как у ТС, если перепутать значения в up и down с точностью наоборот


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
0761
Дата 3.9.2011, 16:43 (ссылка)  | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

const long double UP = 2147483648;
const long double DOWN = -2147483648;

class Int
{
private:
    int fld;
public:
    Int (): fld(0)
    { }
    Int (int i): fld(i)
    { }
    void setint()
    {
        cout << "Введи число: ";
        cin >> fld;
    }
    void display()
    {
        cout << fld;
    }
    Int operator+ (Int);
    
};

Int Int::operator+ (Int i2)
{
    long double temp = fld + i2.fld;
    if ((temp > UP) || (temp < DOWN))
    {
        cout << "Ошибка, блеать";
        exit(1);
    }
    else
    {
        return Int(static_cast<int>(temp));
    }
}

int main()
{
    setlocale(LC_ALL,"Rus");
    Int i1,i2,i3;
    i1.setint();
    i2.setint();
    i3 = i1 + i2;
    i3.display();

    getche();
    return 0;
}

ну вот, грубо говоря, отрывок
PM MAIL   Вверх
volatile
Дата 3.9.2011, 17:10 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну наконец-то, после двух дней просьб!!!
 
Цитата(0761 @  3.9.2011,  16:43 Найти цитируемый пост)
const long double UP = 2147483648;
const long double DOWN = -2147483648;

Вот и Ошибка!

2147483648 = 80000000h;
У вас DOWN и UP равны.

нужно так:
const long double UP = 2147483647;

а еще лучше так:
Код

#include <limits>
...
    const long double UP = std::numeric_limits <int>::max();
    const long double DOWN = std::numeric_limits <int>::min();


PM MAIL   Вверх
0761
Дата 5.9.2011, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



volatile, о, спасибо большое) только я так и не понял, почему для константы типа лд значения границ типа инт равны 
PM MAIL   Вверх
mes
Дата 5.9.2011, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(0761 @  5.9.2011,  14:57 Найти цитируемый пост)
только я так и не понял,


кратко : переполнение.. 
легче всего будет разобрать на char.. посмотрите чему равно 1000 0000b для signed и чему для unsigned char.. 
в помошь гугль: представление чисел в двоичной системе...



Это сообщение отредактировал(а) mes - 5.9.2011, 16:41


--------------------
PM MAIL WWW   Вверх
0761
Дата 18.9.2011, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Продолжим?
Перевести в верхний регистр строку:
так работает:

Код

for (int i = 0; i < strlen(str); i++)
    {
        if ((*(str+i) >= 'a')||(*(str+i)<='z'))
        {
            *(str+i) = toupper(*(str+i));
        }
    }


а должно так:

Код

for (int i = 0; i < strlen(str); i++)
    {
        if ((*(str+i) >= 'a')&&(*(str+i)<='z'))
        {
            *(str+i) = toupper(*(str+i));
        }
    }

PM MAIL   Вверх
volatile
Дата 18.9.2011, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(0761 @  18.9.2011,  23:01 Найти цитируемый пост)
так работает:
for (int i = 0; i < strlen(str); i++)
    {
        if ((*(str+i) >= 'a')||(*(str+i)<='z'))
        {
            *(str+i) = toupper(*(str+i));
        }
    }

Ну и в чем вопрос?
Да так работает
Еще и так будет работать:
Код
...
        if (1)
        {
            *(str+i) = toupper(*(str+i));
        }

И что дальше?
PM MAIL   Вверх
0761
Дата 18.9.2011, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



volatile,  вопрос таков: "почему работает с дизъюнкцией, а должно работать с конъюнкцией". Или я что-то не понимаю. 
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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