Форум программистов, компьютерный форум, киберфорум
Наши страницы

Проверка арифметического переполнения для int - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Оператор return; http://www.cyberforum.ru/cpp-beginners/thread32210.html
В коде одного примера встретился оператор return; Который просто ничего не возвращает. Вот часть кода: void PartList::Iterate(void (Part::*pFunc)()const)const { if (!pHead) { return; }...
C++ Как увидеть результат выполнения программы в Dev-C++ 4.9.9.2 ? И ещё, когда запускаю exe-файл, вместо нормального текста какая-то абракадабра на русском языке. Можно это исправить? Только начал изучать программирование, если можно, отвечайте общедоступным... http://www.cyberforum.ru/cpp-beginners/thread32172.html
Переменная в register, операция >>, во что компилится? C++
Если объявлена переменная register unsigned int i=100; и затем мне надо выполнять операцию >>1 (деление на 2), в цикле, дак вот, если написать просто i=i>>1; эта строка скомпилится именно в...
C++ Ограничения для структуры if
у меня прога некорректно работает. есть подозрения на структуру if - в ней должно выполнятся 5 условий if ((f_card==1)&&(f_card==1)&&(f_card==1)&&(f_card==1)&&(f_card==1)) существуют ли...
C++ Подправить сортировку в проге http://www.cyberforum.ru/cpp-beginners/thread32139.html
Мне необходимо переделать сортировку по возрастанию количества цифр в строке в сортировку по убыванию (это конкретная часть из программы). int Sort::fcel (char*a) { int b=0; for (int...
C++ Как можно посчитать ширину дерева? Товарищи!!!!! подскажите пожалуйста как можно посчитать ширину дерева!!!????? (под шириной дерева понимается максимальное количество елементов, находящихся на одном уровне) очень надо!!! подробнее

Показать сообщение отдельно
Biblio
2 / 2 / 0
Регистрация: 30.04.2009
Сообщений: 27

Проверка арифметического переполнения для int - C++

30.04.2009, 16:33. Просмотров 6259. Ответов 3
Метки (Все метки)

Есть задача (из книги Лафоре ООП в С++, задача 4, глава 8):
Создайте класс Int, основанный на упражнении 1 из главы 6 [ЭТО В ДАННОМ СЛУЧАЕ НЕ ВАЖНО]. Перегрузите четыре целочисленных арифметических операции(+, -, *, /), так, чтобы их можно было использовать для операций с объектами класса Int [УЧЕБНЫЙ КЛАСС, СОЗДАННЫЙ РАНЕЕ]. Если результат какой-либо из операций выходит за границы типа int (в 32-битной системе), имеющие значение от 2147483648 до -2147483647, то операция должна послать сообщение от ошибке и завершить программу. Такие типы данных полезны там, где ошибки могут быть вызваны арифметическим переполнением, которое недопустимо. Подсказка: для облегчения проверки переполнения выполняйте вычисления с использованием типа long double. Напишите программу для проверки этого класса.
Лафоре дает ответ, но 1) он у меня не работает; 2) я не понимаю, что он делает в программе.
Решение Лафоре:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//ex8_4.cpp
//работа перегружаемых арифметических операций с типом Int
#include <iostream>
using namespace std;
#include <process.h>         //для exit()
///////////////////////////////////////////////////////////
class Int
    {
    private:
      int i;
    public:
      Int():i(0)             //конструктор без аргументов
        {}
      Int(int ii):i(ii)      //конструктор с одним
                             //аргументом
        {}                   //(из int в Int)
      void putInt()          //вывод Int
        {cout <<i;}
      void getInt()          //чтение Int с клавиатуры
        {cin >>i;}
      operator int()         //операция преобразования
        {return i;}          //(Int в int)
      Int operator +(Int i2) //сложение
        {return checkit(long double(i)+long double(i2));}
      Int operator -(Int i2) //вычитание
        {return checkit(long double(i)-long double(i2));}
      Int operator *(Int i2) //умножение
        {return checkit(long double(i)*long double(i2));}
      Int operator /(Int i2) //деление
        {return checkit(long double(i)/long double(i2));}
      Int checkit(long double answer) //проверка
                                      //результатов
        {
        if(answer >2147483647.0L ||answer <-2147483647.0L )
          {cout <<"\nОшибка переполнения\n ";exit(1);}
        return Int(int(answer));
        }
    };
///////////////////////////////////////////////////////////
int main()
    {
    Int alpha =20;
    Int beta =7;
    Int delta,gamma;
    gamma =alpha +beta;     //27
    cout <<"\ngamma=";gamma.putInt();
    gamma =alpha -beta;      //13
    cout <<"\ngamma=";gamma.putInt();
    gamma =alpha *beta;      //140
    cout <<"\ngamma=";gamma.putInt();
    gamma =alpha /beta;      //2
    cout <<"\ngamma=";gamma.putInt();
    delta =2147483647;
    gamma =delta +alpha;    //ошибка переполнения
    delta =-2147483647;
    gamma =delta -alpha;     //ошибка переполнения
    cout <<endl;
    return 0;
    }
В моей собственной программе перегрузка происходит нормально, но проверку на переполнение сделать не получается.
Моя программа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//Имитация работы класса int. Инициализация объектов, ввод, вывод, перегрузка арифметических операций
#include <iostream>
#include <process.h>         
using namespace std;
class Int
{
    private:
        int n;//поле класса типа int
    public:
        Int() : n(0){/*пустое тело*/}//инициализирущий конструктор. присваивает полю по умолчанию значение ноль
        Int(int d) : n(d){/*пустое тело*/}//конструктор с одни параметром
        void set(int d) { n = d; }//метод инициализирует поле класса целым числом
 
        void output()//метод вывода значения поля на экран
        {
            cout << "Zna4enie polya ravno " << n << endl;
        }
 
        Int operator+(Int);//перегрузка сложения
        Int operator*(Int);//перегрузка умножения
        Int operator-(Int);//перегрузка вычитания
        Int operator/(Int);//перегрузка деления
};
 
 
int main()
{
    Int a, b, c;
    a.output();
    b.output();
    c.output();
    a.set(100000000);
    b.set(2147483647);
    a.output();
    b.output();
    c = a+b;
    cout << "Slojenie "; c.output();
    a.output();
    b.output();
    c = a*b;
    cout << "Umnojenie "; c.output();
    a.output();
    b.output();
    c = a-b;
    cout << "Vichitanie "; c.output();
    a.output();
    b.output();
    c = a/b;
    cout << "Delenie "; c.output();
 
    return 0;
}
 
Int Int::operator+(Int d2)//метод перегрузки сложения
{
    long double m = n+d2.n;
    if(m > 2147483648.0L || m < -2147483647.0L)
    {
        cout << "Perepolneneie!";
        exit(1);
    }
    else return Int(int(m));
}
 
Int Int::operator*(Int d2)//метод перегрузки умножения
{
    long double m = n*d2.n;
    cout << "m ravno " << m << endl;
    if(m > 2147483648.0L || m < -2147483647.0L)
    {
        cout << "Perepolneneie!";
        exit(1);
    }
    else return Int(int(m));
}
 
Int Int::operator-(Int d2)//метод перегрузки вычитания
{
    long double m = n-d2.n;
    if(m > 2147483648.0L || m < -2147483647.0L)
    {
        cout << "Perepolneneie!";
        exit(1);
    }
    else return Int(int(m));
}
 
Int Int::operator/(Int d2)//метод перегрузки деления
{
    long double m = n/d2.n;
    if(m > 2147483648.0L || m < -2147483647.0L)
    {
        cout << "Perepolneneie!";
        exit(1);
    }
    else return Int(int(m));
}
Помогите, пожалуйста. Или подправьте мою программу или исправьте и растолкуйте решение Лафоре.
Заранее спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.