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

Задача 7 главы 7 из книги Р. Лафоре. Строки - C++

Восстановить пароль Регистрация
 
StNic
0 / 0 / 0
Регистрация: 20.12.2013
Сообщений: 5
21.11.2014, 14:00     Задача 7 главы 7 из книги Р. Лафоре. Строки #1
Добрый день! Недавно начал изучать С++ по, наверное, уже всем поднадоевшему, учебнику Роберта Лафоре. На данный момент изучаю главу с массивами и строками. Меня привела в тупик задача 7 главы 7:
Одним из недостатков C++ является отсутствие для бизнес-программ встроенного типа для денежных значений, такого, как $173 698 001.32. Такой денежный тип должен иметь возможность для хранения числа с фиксированной десятичной точкой точностью около 17 знаков, которого было бы достаточно для хранения национального долга в долларах и центах. К счастью, встроенный тип C++ long double имеет точность 19 цифр, поэтому мы можем использовать его как базисный для класса money, даже используя плавающую точку. Однако нам нужно будет добавить возможность ввода и вывода денежных значений с предшествующим им знаком доллара и разделенными запятыми группы по три числа: так проще читать большие числа. Первым делом при разработке такого класса напишем метод mstold(), который принимает денежную строку, то есть строку, представляющую собой некоторое количество денег типа
"$1 234 567 890 123.99"
в качестве аргумента и возвращает эквивалентное ее значению число типа long double.
Вам нужно будет обработать денежную строку как массив символов и, просматривая ее символ за символом, скопировать из нее только цифры (0-9) и десятичную точку в другую строку. Игнорируется все остальное, включая знак доллара и запятые. Затем вы можете использовать библиотечную функцию _atold() (заметим, что здесь название функции начинается с символа подчеркивания — заголовочные файлы STDLIB.H или MATH.H) для преобразования новой строки к числу типа long double. Предполагаем, что денежное значение не может быть отрицательным. Напишите функцию main() для проверки метода mstold(), которая несколько раз получает денежную строку от пользователя и выводит соответствующее число типа long double.

Вот, собственно, что у меня получилось

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
#include <windows.h>
#include <math.h>
#include <iostream>
#include <iomanip>
using namespace std;
 
const int MAX = 22;
class money {
    private:
        long double sum;
 
    public:
        money(): sum(0.0)
        { }
        money(long double sm): sum(sm)
        { }
        void show() const {
            cout << setprecision(MAX) << sum << endl;
        }
        long double mstold(char []);
};
 
long double money::mstold(char numb[]) {
    long double mny;
    char num[MAX];
    int k = 0;
    for (int j = 0; j < strlen(numb); j++)
        for (int i = 0; i < 10; i++)
            if (numb[j] == (i + '0'))
                num[k++] = numb[j];
            else if (numb[j] == '.') {
                num[k++] = '.';
                break;
            }
    num[k] = '\0';
    mny = _atold(num);
    return mny;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    money mn, result;
    char number[MAX];
    char answer = 'a';
    do {
        cout << "Введите значение суммы: ";
        cin.get(number, MAX);
        result = mn.mstold(number);
        cout << "Вы ввели сумму: ";
        result.show();
        cout << "Вы хотите продолжить (y/n)? ";
        cin >> answer;
    } while (answer != 'n');
    return 0;
}
По условию задачи, пользователь несколько раз должен ввести строку и получить результат. Для этого я воспользовался циклом do. Первый раз я нормально ввожу строку, например, то значение, которое предложено в книге - $1 234 567 890 123.99 - и получаю нужный результат уже в числовом значении - 1234567890123.99. Дальше идет предложение о том, чтобы продолжить перевод чисел. Я ввожу любое значение, кроме 'n', но дальше программа просто уходит в бесконечный цикл, выводя сообщения о том, что уже введен 0. При этом в массиве number[0] = '\0'. Может кто-нибудь подскажет как я могу это исправить. Большое спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2014, 14:00     Задача 7 главы 7 из книги Р. Лафоре. Строки
Посмотрите здесь:

Карточная игра из книги Лафоре C++
Листинг из книги Лафоре C++
Пример из книги Лафоре C++
C++ Пример из книги Лафоре
Упражнение из книги Лафоре C++
Задания из книги Р. Лафоре C++
C++ - Задания из книги Р. Лафоре C++
C++ Программка из 4 главы книги Страуструпа принципы и практика - не работает

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
StNic
0 / 0 / 0
Регистрация: 20.12.2013
Сообщений: 5
27.11.2014, 15:42  [ТС]     Задача 7 главы 7 из книги Р. Лафоре. Строки #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
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
 
const int MAX = 22;
class money {
    private:
        long double sum;
        string number;
    public:
        money(): sum(0.0)
        { }
        money(long double sm): sum(sm)
        { }
        void getmoney() {
            cout << "Введите значение суммы: ";
            getline(cin, number, 'E');
        }
        void showmoney() const {
            cout << "Вы ввели сумму: "
                 << setiosflags( ios::fixed )
                 << setiosflags( ios::showpoint)
                 << setprecision(2)
                 << sum << endl;
        }
        void mstold();
};
 
void money::mstold() {
    char numb[MAX];
    int nlen = number.length();
    int k = 0;
    for (int j = 0; j < nlen; j++)
        for (int i = 0; i < 10; i++)
            if (number.at(j) == (i + '0'))
                numb[k++] = number.at(j);
            else if (number.at(j) == '.') {
                numb[k++] = '.';
                break;
            }
    numb[nlen] = 0;
    sum = _atold(numb);
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    char answer = 'y';
    money mn;
    do {
        mn.getmoney();
        mn.mstold();
        mn.showmoney();
        cout << "Вы хотите продолжить (y/n)? ";
        cin >> answer;
    } while (answer != 'n');
    return 0;
}
Yandex
Объявления
27.11.2014, 15:42     Задача 7 главы 7 из книги Р. Лафоре. Строки
Ответ Создать тему
Опции темы

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