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

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

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

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

13.10.2012, 10:07. Просмотров 753. Ответов 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++):

Разобраться в примерх к книге Лафоре "Обьектно-ориентированое программирование в С++" - 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++
Помогите пожалуйста с задачей. Могу сделать ее просто, но надо через ООП и у меня не получается. Дано натуральное число N (N&lt;20),...

Двусвязный список с объектом трех типов: "целое число", "вещественное число", "строка" - C++
Есть проблема. Реализовать двухсвязный список. Каждый элемент списка может содержать один объект. Объект может быть трех типов: &quot;целое...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
13.10.2012, 11:18 #2
не совсем то выложил, пару минут думаю
DiffEreD
1430 / 767 / 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
5417 / 4813 / 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
1430 / 767 / 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 символов целого числа и несколько цифр дробной части.
Дело в том, что я не знаю пока как сделать динамический массив )) (я стараюсь выполнять упражнения главы теми средствами, которые были даны в этой главе или в более ранних)

А из-за чего происходит такая петрушка не знаете? Хотелось бы знать механизм. Может есть идеи где почитать на эту тему? Вроде бы про типы данных читал, но там ничего подобного не написано.
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 Посмотреть сообщение
А из-за чего происходит такая петрушка не знаете? Хотелось бы знать механизм.
очень может быть что из за переполнения
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2012, 09:59
Привет! Вот еще темы с ответами:

Обучение по книге Страуструпа "принципы и практика C++". Не выводится "Hello, World" - C++
Ребят, помогите пожалуйста, пропал на первом же примере из книги, автор даёт код для вывода Hello world!#include &quot;std_lib_facilities.h&quot; ...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

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

Перегрузка функций "ввести в поток", "вывести с потока", "умножить вектор на число" - C++
Подскажите пожалуйста, как убрать ошибки с этой программы? (делала перегрузку &quot;ввести в поток&quot; и &quot;вывести с потока&quot;, а также &quot;умножить...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.10.2012, 09:59
Ответ Создать тему
Опции темы

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