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

Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ") - C++

Восстановить пароль Регистрация
 
skitale
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 49
Записей в блоге: 1
13.10.2012, 10:07     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ") #1
Лафоре "ООП в Си ++ " - проблемы с упражнением 12, глава 7

Условие:
Напишите программу, которая будет принимать от пользователя две денежные строки вида $ *** *** ***.*** и после выдавать сумму этих строк.

Я написал код для перевода строки в число, начал тестить, но появилась такая фигня: если ввожу большие числа, то на выходе получаю число большее, чем должно быть. С небольшими числами все ок.
Пишу в Code::Blocks. Там по видимому добавляются какие-то хвосты к дробной части, ни никак не могу понять почему - заранее спасибо за любую помощь!

Ниже привожу код программы и скриншоты консоли.

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
98
99
100
101
102
103
104
// Упражнение 12, глава 7
// Преобразуем строку в число 
 
 
#include <iostream>
#include<string.h>
#include<STDLIB.H>
#include<MATH.H>
 
using namespace std;
 
class bMoney
{
    private:
        
        float money; // в это число надо будет преобразовать строку (или наоборот)
        string init_string; // исходная строка
 
    public:
 
    bMoney():money(0), init_string("Default")
    {}
 
    void get_string()
    {
        cout << "\n Enter the string : ";
        getline(cin,init_string);
        cout << "\n Your string is : " << init_string;
    }
 
 
    void string_to_longdouble()
    {
        int length=init_string.length();
        bool dot_flag=0; // флаг первого появления точки
        int fractional_counter=0; // счетчик количества цифр после первого появления точки
        float fraction_part=0; // дробная часть
        long double integer_part=0; // целая часть числа
        int divisor=1; // делитель 
 
 
        for (int i=0; i<length ; i++)
        {
            char ch_item=init_string.at(i);
            int i_item=static_cast<int>(ch_item);  // перевели символ в числовой эквивалент
//            cout << "\ni_item = " << i_item;
 
            if (i_item>47 && i_item<58)
            {
                if (dot_flag==1)
                {
                    fractional_counter++;
 
                    fraction_part=fraction_part*10 + (i_item - 48);
 
                    if (fractional_counter==2) break;
                }
                else
                {
                    integer_part=integer_part*10 + (i_item - 48);
                }
            }
 
            if (i_item==46) // ловим первое появление точки
                {
                    if (dot_flag==0)
                    {
                        dot_flag=1;
                    }
                }
        }
 
        for (int i=0; i<fractional_counter; i++) // создаем делитель для получения дробной части
        {
            divisor*=10;
        }
 
        cout << "\n\n ------------------------------ " ;
 
        cout << "\n integer_part = " << integer_part;
        cout << "\n fraction_part = " << fraction_part;
 
        cout << "\n\n fractional_counter = " << fractional_counter;
        cout << "\n divisor = " << divisor;
 
 
        cout << "\n\n fraction_part/divisor = " << fraction_part/divisor;
 
 
        money=integer_part + fraction_part/divisor;
 
        cout << fixed << "\n\n money = " << money << endl;
    }
};
 
int main()
{
    bMoney m1;
 
    m1.get_string();
    m1.string_to_longdouble();
 
    return 0;
}
Миниатюры
Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ")   Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ")   Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ")  

Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2012, 10:07     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ")
Посмотрите здесь:

C++ Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Задача из "ООП в C++" Р. Лафоре C++
C++ Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой
Код из "Р.Лафоре. ООП в С++" C++
C++ Обучение по книге Страуструпа "принципы и практика C++". Не выводится "Hello, World"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
13.10.2012, 11:18     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ") #2
не совсем то выложил, пару минут думаю
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
13.10.2012, 11:22     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ") #3
Думаю вам должна помочь функция stoull(). Добавьте в класс что нибудь такое:
C++
1
2
3
4
5
void stolong()
{
    money = stoull(init_string);
    cout << fixed << "\n\n money = " << money << endl;
}
Про stoull: http://en.cppreference.com/w/cpp/str...c_string/stoul
skitale
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 49
Записей в блоге: 1
13.10.2012, 11:58  [ТС]     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ") #4
Что-то не работает
Компилятор говорит, что функция не объявлена (error: 'stoull' was not declared in this scope).
Пробовал объявить
C++
1
unsigned long long stoull();
Но в ответ: error: too many arguments to function 'long long unsigned int stoull()'

Может я что-то не то сделал? (Опыта мало еще - только учусь )
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.10.2012, 12:39     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ") #5
Цитата Сообщение от skitale Посмотреть сообщение
Может я что-то не то сделал?
C++
1
#include<string>
Добавлено через 2 минуты
Ещё лучше:
C++
1
2
3
4
#include <iostream>
#include<string>
#include<cstdlib>
#include<cmath>
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
13.10.2012, 12:54     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ") #6
Цитата Сообщение от skitale Посмотреть сообщение
Пробовал объявить
Да не надо там ничего объявлять, это стандартная функция из стандарта С++11. Вот пример: http://liveworkspace.org/code/069e8d...8f78077bafb4dc
skitale
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 49
Записей в блоге: 1
13.10.2012, 13:02  [ТС]     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ") #7
По ходу дела мой компилятор не поддерживает этот стандарт...
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
13.10.2012, 14:05     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ") #8
Цитата Сообщение от MrGrig Посмотреть сообщение
не совсем то выложил, пару минут думаю
особо ничего интересного не придумал, сначало меня смутило то что хоть вы и разделяете целые и дробные части вы все равно используете их как 2 целых числа, тип данных для них указан всетаки вещественный, но видимо это сделано для вместимости очень большого числа. можно попробовать тип long long для ну очень больших чисел, а также можно при конвертировании строки в число создавать динамический массив нужной размерности и складывать туда каждую цифру в отдельную клетку, правда чтобы сложить такое число придется использовать циклы, это увеличит расходы. Можно например читать только первые 7-8 символов целого числа и несколько цифр дробной части.
skitale
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 49
Записей в блоге: 1
13.10.2012, 15:18  [ТС]     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ") #9
Цитата Сообщение от MrGrig Посмотреть сообщение
особо ничего интересного не придумал, сначало меня смутило то что хоть вы и разделяете целые и дробные части вы все равно используете их как 2 целых числа, тип данных для них указан всетаки вещественный, но видимо это сделано для вместимости очень большого числа. можно попробовать тип long long для ну очень больших чисел, а также можно при конвертировании строки в число создавать динамический массив нужной размерности и складывать туда каждую цифру в отдельную клетку, правда чтобы сложить такое число придется использовать циклы, это увеличит расходы. Можно например читать только первые 7-8 символов целого числа и несколько цифр дробной части.
Дело в том, что я не знаю пока как сделать динамический массив )) (я стараюсь выполнять упражнения главы теми средствами, которые были даны в этой главе или в более ранних)

А из-за чего происходит такая петрушка не знаете? Хотелось бы знать механизм. Может есть идеи где почитать на эту тему? Вроде бы про типы данных читал, но там ничего подобного не написано.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2012, 09:59     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ")
Еще ссылки по теме:

C++ Структура "Комплексное число", проблемы с выводом
Разобраться в примерх к книге Лафоре "Обьектно-ориентированое программирование в С++" C++
Не компилируется листинг "Передача по ссылке аргументов" Р.Лафоре C++

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

Или воспользуйтесь поиском по форуму:
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
14.10.2012, 09:59     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ") #10
Цитата Сообщение от skitale Посмотреть сообщение
Дело в том, что я не знаю пока как сделать динамический массив )) (я стараюсь выполнять упражнения главы теми средствами, которые были даны в этой главе или в более ранних)
А из-за чего происходит такая петрушка не знаете? Хотелось бы знать механизм. Может есть идеи где почитать на эту тему? Вроде бы про типы данных читал, но там ничего подобного не написано.
C++
1
2
3
4
5
тип данных mas = new тип данных количество выделяемых ячеек под тип данных(целое число)
//для двумерного массива
тип данных *mas = new *тип данных количество выделяемых ячеек под тд
for(int i=0;i<количество выделяемых ячеек под тд;i++)
    mas[i] = new тип данных количество выделяемых ячеек под тд;
Добавлено через 1 минуту
Цитата Сообщение от skitale Посмотреть сообщение
А из-за чего происходит такая петрушка не знаете? Хотелось бы знать механизм.
очень может быть что из за переполнения
Yandex
Объявления
14.10.2012, 09:59     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ")
Ответ Создать тему
Опции темы

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