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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
#1

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

25.06.2010, 14:22. Просмотров 1076. Ответов 14
Метки нет (Все метки)

Есть класс дроби. Собственно он определяется двумя главными параметрами типа 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 минуты
Что ж. Апдейт
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2010, 14:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка вместимости числа в буфер (C++):

Проверка символа перед занесением в буфер - C++
Можно ли как то проверять символ на принадлежность к буквам перед заносом его в буфер?

создать шаблон класса,реализующий буфер из произвольного (5) числа вещественных чисел. Числа ввести с клавиатуры содержащие буфера вывести на экран - C++
Помогите, пожалуйста.

Запись числа в буфер обмена - C++
Всем доброго времени суток. Задание следующее: Определить координаты (x, y) и цвет точки, в которой находится курсор, вывести на экран...

Создать шаблон класса,реализующий буфер из 5 вещественных чисел. Числа ввести с клавиатуры - C++
Создать шаблон класса,реализующий буфер из 5 вещественных чисел. Числа ввести с клавиатуры содержимое буфера вывести на экран вроде бы...

Разветвляющийся алгоритм. Определить размеры очередей после проезда маршрутного такси заданной вместимости - C++
Известны размеры очередей на трех соседних остановках. Определить размеры очередей после проезда маршрутного такси заданной вместимости.

Возведение числа в степень и проверка числа на четность - C++
Добрый вечер что то вообще не понял эту тему помогите пожалуйста С помощью директивы #define написать следующие макросы: a) возведение...

14
Хохол
Эксперт С++
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;
    }
};
0
fasked
Эксперт С++
4952 / 2532 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
25.06.2010, 17:14  [ТС] #4
fasked, М. Интересно. Но мне нужна обработка в самом начале. Защита от дурака вообщем-то. Два инт использую в основной программе. Если вводишь fA.chisl как: 22222222222222222222222222222222222222222222222222, то программа естественно работает неверно. С чар такую проверку устроить - проблем не возникает. А вот с целочисленными типами как-то не особо выходит.
0
Хохол
Эксперт С++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
25.06.2010, 17:21 #5
Тебе нужно просто проверить, влезет ли число, передаваемое как строка, в инт?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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);
0
easybudda
Модератор
Эксперт CЭксперт С++
9699 / 5649 / 964
Регистрация: 25.07.2009
Сообщений: 10,872
25.06.2010, 17:27 #7
Lavroff, вот не так давно проверку ввода спрашивали http://www.cyberforum.ru/cpp-beginne...tml#post815717
1
Хохол
Эксперт С++
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;
}
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
25.06.2010, 17:34  [ТС] #9
Цитата Сообщение от easybudda Посмотреть сообщение
Lavroff, вот не так давно проверку ввода спрашивали http://www.cyberforum.ru/cpp-beginne...tml#post815717
А без stl и трая кетча?

Добавлено через 1 минуту
Хохол, Хм... А без стринга реально?)
0
Хохол
Эксперт С++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
25.06.2010, 17:35 #10
Конечно. strlen и strcmp спасут тебя.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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;
0
Хохол
Эксперт С++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
25.06.2010, 17:45 #12
Низзя так.

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

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

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

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

У меня проверка на буквы через isalpha; проверка на вместимость через atoi. Ибо еще есть проверка знаменателя, в котором atoi тоже возвращает 0.
0
easybudda
Модератор
Эксперт CЭксперт С++
9699 / 5649 / 964
Регистрация: 25.07.2009
Сообщений: 10,872
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;
}
3
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
25.06.2010, 17:53  [ТС] #15
easybudda, Огромное спасибо!
0
25.06.2010, 17:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2010, 17:53
Привет! Вот еще темы с ответами:

Проверка числа - C++
Дано натуральное число n&gt;1. Проверьте, является ли оно простым. Программа должна вывести слово YES, если число простое и NO, если число...

Проверка на числа - C++
bool number(int a) { int s=0; for(int i=1;i&lt;a;i++) if(a%i==0) s+=i; if(a==s) return 1;

Проверка простоты числа - C++
Объясните плиз что значит =! , pc - это функция проверки на простоту числа do { cout &lt;&lt; &quot;Vvedite prostoe P: &quot;; cin &gt;&gt; p; ...

Проверка на числа в файле - C++
Нужно сделать проверку на буквы в файле, тоесть если есть буквы, то выводим на экран сообщение, если нету, то считываем матрицу. ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.