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

Проверка вместимости числа в буфер - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.06.2010, 14:22     Проверка вместимости числа в буфер #1
Есть класс дроби. Собственно он определяется двумя главными параметрами типа int. Все сделано, все работает. Кроме проверки переполнения. Вводим допустим число 22222222222222222 - программа пишет сразу какой-то бред. Каким способом можно обойти это и выполнить проверку на вместимость в буфер? Реально ли это сделать, не изменяя типа главных параметров?

Я начал переписывать программу, используя два чара вместо инт. Переполнение, буквы вместо цифр, 0 в некоторых элементах, на все это проверка работает. Но есть пара тройка НО.

//1) Объем переделки кода. Он конечно маленький, но если делаешь для себя стоит ли его переделывать такое долгое время?
2) Объем функций которые получаются при переделке через char. Переделал только одну вчера ночью, на что терпения хватило. Она увеличилась примерно в два раза по сравнению с исходной функцией.
3) Интерес, как сделать не через char. Ибо с чаром все понял, сделать все реально, вопрос только во времени.

Пример функции которая получилась после использования чара. Написана на скоро руку, при огромном желании идти спать.

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
Fraction Fraction::operator +(Fraction &ob)
{
    int f;int d; int c; int k; int l; int z;
    char*p; char*x;
    p=new char; x=new char;
    Fraction tempOb;
    if(strcmp(znam, ob.znam)==0)
    {
        f=atoi(tempOb.chisl);
        d=atoi(ob.chisl);
        c=atoi(chisl);
        f=d+c;
        k=atoi(tempOb.znam);
        l=atoi(znam);
        k=l;
        p=_itoa(f,p,10);
        x=_itoa(k,x,10);
        strcpy_s(tempOb.chisl,p);
        strcpy_s(tempOb.znam,x);
    }
    else
    {
        f=atoi(tempOb.chisl);
        d=atoi(ob.chisl);
        c=atoi(chisl);
        k=atoi(ob.znam);
        l=atoi(znam);
        f=c*k+d*l;
        z=atoi(tempOb.znam);
        z=l*k;
        p=_itoa(f,p,10);
        x=_itoa(z,x,10);
        strcpy_s(tempOb.chisl,p);
        strcpy_s(tempOb.znam,x);
    }
    tempOb.operator ~();
    return tempOb;
    delete p;
    delete x;
}
Добавлено через 1 час 20 минут
Отменяю пункт 1. Не слишком то долго оказалось. Тем не менее главный вопрос+интерес еще остались.

Добавлено через 8 часов 33 минуты
Как это сделать-то, товарищи программеры?

Добавлено через 9 часов 4 минуты
Хм. Никто не подскажет?

Добавлено через 14 часов 43 минуты
Что ж. Апдейт
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
25.06.2010, 14:35     Проверка вместимости числа в буфер #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
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
#define abs(a) ((a)<0?-(a):a)
class number
{
private:
    __int64 n, d;
 
    void reduce(__int64 &a, __int64 &b)const
    {
        if(a % b == 0)
        {
            a /= b;
            b = 1;
            return;
        }
        for(int i = 2; i <= sqrt(double(min(abs(a),abs(b)))); i++)
            if(a % i == 0 && b % i == 0)
            {
                a /= i;
                b /= i;
            }
        if(b < 0)
            a = -a, b = -b;
    }
 
    __int64 NOD(__int64 x, __int64 y)const
    {
        return x%y?NOD(y,x%y):y;
    }
    __int64 NOK(int x, int y)const
    {
        return x*y/NOD(x,y);
    }
public:
    number(__int64 nn = 0, __int64 dd = 1)
    {
        reduce(nn,dd);
        n = nn, d = dd;
    }
    bool operator == (number a)const
    {
        return n == a.n && d == a.d;
    }
 
    bool operator == (__int64 k)const
    {
        return d == 1 && n == k;
    }
 
    bool operator < (number a)const
    {
        return n*a.d < a.n*d;
    }
    number operator*(number k)const
    {
        __int64 a = n, b = d, p = k.n, q = k.d;
        reduce(a,q);
        reduce(p,b);
        number res;
        res.n = a*p, res.d = b*q;
        return res;
    }
 
    number operator/(number k)const
    {
        return *this*number(k.d,k.n);
    }
 
    number operator+(number k)const
    {
        int b = NOK(d,k.d);
        int a = n*b/d + k.n*b/k.d;
        return number(a,b);
    }
 
    number operator-(number k)const
    {
        return *this+number(-k.n,k.d);
    }
 
    void print()
    {
        cout << n;
        if(d != 1)
            cout << '\\' << d;
    }
};
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
25.06.2010, 14:36     Проверка вместимости числа в буфер #3
А какой тип используется в качестве основного?

Попробую предположить что-либо сейчас.
Допустим основной тип - это 32-х битное целое, то есть int, тогда при сложении можно использовать в качестве результирующего элемента 64-х битное целое. Сейчас уже многие компиляторы поддерживают типы long long. Потом сравнивать с максимальными значениями (лежат в файле limits). Ну может как вариант еще запихивать все в числа в double - он тоже большой.

В общем примерно так:
C++
1
2
3
4
// int a, b;
// double sum;
if((sum = a + b) > std::numeric_limits<int>::max())
   error(); // overflow
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.06.2010, 17:14  [ТС]     Проверка вместимости числа в буфер #4
fasked, М. Интересно. Но мне нужна обработка в самом начале. Защита от дурака вообщем-то. Два инт использую в основной программе. Если вводишь fA.chisl как: 22222222222222222222222222222222222222222222222222, то программа естественно работает неверно. С чар такую проверку устроить - проблем не возникает. А вот с целочисленными типами как-то не особо выходит.
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
25.06.2010, 17:21     Проверка вместимости числа в буфер #5
Тебе нужно просто проверить, влезет ли число, передаваемое как строка, в инт?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.06.2010, 17:26  [ТС]     Проверка вместимости числа в буфер #6
Цитата Сообщение от Хохол Посмотреть сообщение
Тебе нужно просто проверить, влезет ли число, передаваемое как строка, в инт?
Как строка - проверяется без проблем)

Мне нужно проверить влезет ли число, передаваемое как инт в размер инт. Пытался через limits, однако если число больше чем может вместить инт, например то же число, что в прошлом сообщении, число остается дефолтным, например 0, и прога летит куда подальше. Аналогично нужна проверка на то введен ли символ, что у меня делается примерно вот так.

C++
1
2
3
4
5
6
//chisl=-100500;
//znam=-100500
if((chisl==-100500)||znam==-100500))
{
std::cout<<"Ожидается ввод числа\n";
exit(0);
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
25.06.2010, 17:27     Проверка вместимости числа в буфер #7
Lavroff, вот не так давно проверку ввода спрашивали http://www.cyberforum.ru/cpp-beginne...tml#post815717
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
25.06.2010, 17:28     Проверка вместимости числа в буфер #8
C++
1
2
3
4
5
6
7
const string maxValue = "2147483647";
bool isGood(string s)
{
    // тут проверяешь на всякую чушь типа букв
    // теперь это точно неотрицательное число
    return s.size() < maxValue.size() || s.size() == maxValue.size() && s <= maxValue;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.06.2010, 17:34  [ТС]     Проверка вместимости числа в буфер #9
Цитата Сообщение от easybudda Посмотреть сообщение
Lavroff, вот не так давно проверку ввода спрашивали http://www.cyberforum.ru/cpp-beginne...tml#post815717
А без stl и трая кетча?

Добавлено через 1 минуту
Хохол, Хм... А без стринга реально?)
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
25.06.2010, 17:35     Проверка вместимости числа в буфер #10
Конечно. strlen и strcmp спасут тебя.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.06.2010, 17:38  [ТС]     Проверка вместимости числа в буфер #11
Цитата Сообщение от Хохол Посмотреть сообщение
Конечно. strlen и strcmp спасут тебя.
А без чара вцелом?)) Если ввод такой:

C++
1
2
3
4
5
6
setlocale(LC_ALL, "Russian");
    int chisl,znam,cel;
    Fraction fA,fB,fC;
    cout<<"Введите fA в виде двух чисел\n";cin>>fA.chisl>>fA.znam;
    cout<<"Введите fB в виде двух чисел\n";cin>>fB.chisl>>fB.znam;
    cout<<"Введите целое число\n";cin>>cel;
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
25.06.2010, 17:45     Проверка вместимости числа в буфер #12
Низзя так.

Добавлено через 32 секунды
Читай как строку, а потом atoi тебе в помощь.

Добавлено через 3 минуты
И да, кстати, atoi запросто может заменить все остальные проверки. Если передать хрень, она вернет 0, и достаточно явно проверить, была ли строка равна "0".
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.06.2010, 17:46  [ТС]     Проверка вместимости числа в буфер #13
Цитата Сообщение от Хохол Посмотреть сообщение
Низзя так.

Добавлено через 32 секунды
Читай как строку, а потом atoi тебе в помощь.

Добавлено через 3 минуты
И да, кстати, atoi запросто может заменить все остальные проверки. Если передать хрень, она вернет 0, и достаточно явно проверить, была ли строка равна "0".
Через char-то сделано. Ладно. Понял. Если учитывать что программа из книжки по обучению, то серьезные проверки не особо то и нужны.

У меня проверка на буквы через isalpha; проверка на вместимость через atoi. Ибо еще есть проверка знаменателя, в котором atoi тоже возвращает 0.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
25.06.2010, 17:51     Проверка вместимости числа в буфер #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#include <iostream>
#include <limits>
 
int main(){
    int a = 0, b = 0;
 
    while ( true ){
        std::cout << "A = ";
        std::cin >> a;
        if ( std::cin.fail() ){
            std::cerr << "Wrong A value!" << std::endl;
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            continue;
        }
        std::cout << "B = ";
        std::cin >> b;
        if ( std::cin.fail() ){
            std::cerr << "Wrong B value!" << std::endl;
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            continue;
        }
        break;
    }
 
    std::cout << "Fraction: " << a << " / " << b << std::endl;
 
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2010, 17:53     Проверка вместимости числа в буфер
Еще ссылки по теме:

Создать шаблон класса,реализующий буфер из 5 вещественных чисел. Числа ввести с клавиатуры C++
C++ Разветвляющийся алгоритм. Определить размеры очередей после проезда маршрутного такси заданной вместимости
C++ Возведение числа в степень и проверка числа на четность

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.06.2010, 17:53  [ТС]     Проверка вместимости числа в буфер #15
easybudda, Огромное спасибо!
Yandex
Объявления
25.06.2010, 17:53     Проверка вместимости числа в буфер
Ответ Создать тему
Опции темы

Текущее время: 16:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru