Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Оператор return; http://www.cyberforum.ru/cpp-beginners/thread32210.html
В коде одного примера встретился оператор return; Который просто ничего не возвращает. Вот часть кода: void PartList::Iterate(void (Part::*pFunc)()const)const { if (!pHead) { return; } PartNode *pNode=pHead; do (pNode->GetPart()->*pFunc)();
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; эта строка скомпилится именно в sar xX, 1, или какую-то более сложную последовательность, с присваиванием и т.д. ?? (Просто, i++ будет инкремент, а i>>1 - ничего не будет, значение i останется прежним. А как надо?) Заранее...
C++ Ограничения для структуры if
у меня прога некорректно работает. есть подозрения на структуру if - в ней должно выполнятся 5 условий if ((f_card==1)&&(f_card==1)&&(f_card==1)&&(f_card==1)&&(f_card==1)) существуют ли ограничения для кол-ва условий в структуре if и может ли из-за большого кол-ва условий давать сбой?
C++ Составить алгоритм и программу http://www.cyberforum.ru/cpp-beginners/thread32114.html
Составить алгоритм и программу для решения следующей задачи. Дано два массива X(5),Y(7). Составить из них один массив, разместив элементы произвольным образом. Результат вывести к печати. X=(4, -3, 8, 2, 7); Y=(-5, 12, 9, 0, -1, 6, 6)
C++ Задача на типы данных 1. Ввести натуральные числа n и m, и напечатать период десятичной дроби m/n, если дробь конечна (до 50 знаков после запятой), то период = 0 подробнее

Показать сообщение отдельно
Biblio
2 / 2 / 0
Регистрация: 30.04.2009
Сообщений: 27
30.04.2009, 16:33     Проверка арифметического переполнения для int
Есть задача (из книги Лафоре ООП в С++, задача 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));
}
Помогите, пожалуйста. Или подправьте мою программу или исправьте и растолкуйте решение Лафоре.
Заранее спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 00:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru