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

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

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

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

13.10.2012, 10:07. Просмотров 757. Ответов 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;
}
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;целое...

9
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
13.10.2012, 11:18 #2
не совсем то выложил, пару минут думаю
0
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
0
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()'

Может я что-то не то сделал? (Опыта мало еще - только учусь )
0
alsav22
5421 / 4816 / 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>
0
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
13.10.2012, 12:54 #6
Цитата Сообщение от skitale Посмотреть сообщение
Пробовал объявить
Да не надо там ничего объявлять, это стандартная функция из стандарта С++11. Вот пример: http://liveworkspace.org/code/069e8d...8f78077bafb4dc
0
skitale
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 100
Записей в блоге: 1
13.10.2012, 13:02  [ТС] #7
По ходу дела мой компилятор не поддерживает этот стандарт...
0
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
13.10.2012, 14:05 #8
Цитата Сообщение от MrGrig Посмотреть сообщение
не совсем то выложил, пару минут думаю
особо ничего интересного не придумал, сначало меня смутило то что хоть вы и разделяете целые и дробные части вы все равно используете их как 2 целых числа, тип данных для них указан всетаки вещественный, но видимо это сделано для вместимости очень большого числа. можно попробовать тип long long для ну очень больших чисел, а также можно при конвертировании строки в число создавать динамический массив нужной размерности и складывать туда каждую цифру в отдельную клетку, правда чтобы сложить такое число придется использовать циклы, это увеличит расходы. Можно например читать только первые 7-8 символов целого числа и несколько цифр дробной части.
0
skitale
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 100
Записей в блоге: 1
13.10.2012, 15:18  [ТС] #9
Цитата Сообщение от MrGrig Посмотреть сообщение
особо ничего интересного не придумал, сначало меня смутило то что хоть вы и разделяете целые и дробные части вы все равно используете их как 2 целых числа, тип данных для них указан всетаки вещественный, но видимо это сделано для вместимости очень большого числа. можно попробовать тип long long для ну очень больших чисел, а также можно при конвертировании строки в число создавать динамический массив нужной размерности и складывать туда каждую цифру в отдельную клетку, правда чтобы сложить такое число придется использовать циклы, это увеличит расходы. Можно например читать только первые 7-8 символов целого числа и несколько цифр дробной части.
Дело в том, что я не знаю пока как сделать динамический массив )) (я стараюсь выполнять упражнения главы теми средствами, которые были даны в этой главе или в более ранних)

А из-за чего происходит такая петрушка не знаете? Хотелось бы знать механизм. Может есть идеи где почитать на эту тему? Вроде бы про типы данных читал, но там ничего подобного не написано.
0
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 Посмотреть сообщение
А из-за чего происходит такая петрушка не знаете? Хотелось бы знать механизм.
очень может быть что из за переполнения
0
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;умножить...


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

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

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