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

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

Войти
Регистрация
Восстановить пароль
 
skitale
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 100
Записей в блоге: 1
#1

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

13.10.2012, 10:07. Просмотров 745. Ответов 9
Метки нет (Все метки)

Лафоре "ООП в Си ++ " - проблемы с упражнением 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++
Всем доброго времени суток кто читает эту тему. Сегодня, изучая С++ по книге Лафоре &quot;Обьектно-ориентированое программирование в С++&quot; 4-е...

Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой - C++
Изучаю C++ по книге Р. Лафоре. Дошёл до 5-ой главы, и мне встретился пример использования консольной графики. Страница 179. Пример...

Код из "Р.Лафоре. ООП в С++" - C++
Р.Лафоре. &quot;ООП в С++ &quot; (4-е издание). 2012. Глава 12, стр.574, листинг 12.17, программа EMPL_IO. В классах присутствуют виртуальные...

Задача из "ООП в C++" Р. Лафоре - C++
Глава 3. Задача 11 (стр. 141 - 4-е издание, СПб, Питер, 2012). Не слишком ли громоздкая конструкция у меня получилась для решения...

Структура "Комплексное число", проблемы с выводом - C++
Задание - массив структур типа &quot;Комплексное число&quot;. Неправильно работает, точнее, неправильный вывод. Будто проверяет только первое условие...

Не компилируется листинг "Передача по ссылке аргументов" Р.Лафоре - C++
Вообщем в 5 Главе имеется листинг. Набрал его в Visual Studio 2013. При компиляции выдает ошибку. Пожалуйста, помогите разобраться! ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
13.10.2012, 11:18     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ") #2
не совсем то выложил, пару минут думаю
DiffEreD
1429 / 766 / 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
Сообщений: 100
Записей в блоге: 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
5416 / 4812 / 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
1429 / 766 / 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
Сообщений: 100
Записей в блоге: 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
Сообщений: 100
Записей в блоге: 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     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ")
Еще ссылки по теме:

Версия CodeBlocks к книге Стефана Р.Дэфиса "C++ для Чайников" - C++
Недавно купил книгу Стефана Р.Дэфиса &quot;C++ для Чайников&quot;. К ней прилагался диск с интегрированной версией CodeBlocks. До этого я уже работал...

Код, приведеном в книге "С++ за 21 дней. Либерти Джесс" не работает - C++
Здравствуйте. Я новичок в деле программировании, так что, пожалуйста, относитесь ко мне к пониманию. Купил книгу &quot;С++ Освой самостоятельно...

Ошибка в книге Скиены "Олимпиадные задачи по програмированию"?! - C++
Итак, всем привет:) Начал я на днях читать книгу Скиены, сейчас на главе про структуры даных. В книге приведен премер задачи &quot;Сборы на...

Вопросы по книге С. Бобровского "Самоучитель программирования на языке С++" - C++
В книге С. Бобровского &quot;Самоучитель программирования на языке С++&quot;, написание кодов небольших программ и объяснения для чего все написано. ...


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

Или воспользуйтесь поиском по форуму:
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     Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ")
Ответ Создать тему
Опции темы

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