0 / 0 / 1
Регистрация: 20.12.2013
Сообщений: 9
1

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

21.11.2014, 14:00. Показов 1950. Ответов 2
Метки нет (Все метки)

Добрый день! Недавно начал изучать С++ по, наверное, уже всем поднадоевшему, учебнику Роберта Лафоре. На данный момент изучаю главу с массивами и строками. Меня привела в тупик задача 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'. Может кто-нибудь подскажет как я могу это исправить. Большое спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.11.2014, 14:00
Ответы с готовыми решениями:

Работа с Классами или разбираем 10 Упражнение 6 главы книги ООП в С++ Р.Лафоре
Доброго времени суток господа. Подскажите пожалуйста каким образом можно объединить классы? Почему...

Лафоре, код из 10 главы
Как не ломал голову, не могу понять, зачем тут префиксная запись инкремента на 16-ой строке кода :...

Задача из книги Р.Лафоре содержит ошибки, исправьте пожалуйста
#include &lt;iostream&gt; using namespace std; int main() { int age; for(int j=0;j&lt;4;j++) {...

Задача про взлом кода из книги Эрика Фримена про основы javascript в конце 5 главы.
читаю книгу Эрика Фримена про основы javascript.В конце 5 главы есть задачка про взлом кода.Никак...

2
0 / 0 / 1
Регистрация: 20.12.2013
Сообщений: 9
27.11.2014, 15:42  [ТС] 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;
}
0
0 / 0 / 2
Регистрация: 08.01.2017
Сообщений: 10
11.05.2017, 00:18 3
Шёл 2017 а Роберт Лафоре и его книга 1996-ого года все еще актуальны.
Предлагаю свой вариант решения данной задачи, может кому интересно будет...
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
#include<iostream>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include<string>
#include<iomanip>
 
class money
{
private:
    long double count;
    std::string strForeign;
public:
    money() {
        count = 0;
 
    }
    void class_money_mstold();
    void class_money_show_money();
    void class_money_get_money();
};
 
#include"money.h"
 
void money::class_money_mstold()
{
    char arr[22];
    int k(0);
    for (int i(0); i < std::size(strForeign); i++)
    {
        if ((strForeign.at(i) >= '0' && strForeign.at(i) <= '9') || strForeign.at(i) == '.')
        {
            arr[k++] = strForeign.at(i);
        }
    }
    arr[k] = '\0';
    count = atof(arr);
}
 
void money::class_money_get_money()
{
 
    std::cout << "Enter money: ";
    std::getline(std::cin, strForeign, 'E');
}
 
void money::class_money_show_money()
{
    std::cout << "\nYou entered=" << std::setiosflags(std::ios::fixed)
        << std::setiosflags(std::ios::showpoint)
        << std::setprecision(2) << count;
}
 
int main()
{
    money dollar;
    dollar.class_money_get_money();
    dollar.class_money_mstold();
    dollar.class_money_show_money();
    
    _getch();
    return 0;
}
Вложился в один цикл for с выражением внутри.

Добавлено через 18 минут
Чутка подправил.
Добавил на всяк do, while и обнуление массива в функции, чтобы не забивать его всяким "мусором".
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<conio.h>
#include<stdlib.h>
#include<math.h>
#include<string>
#include<iomanip>
//----------------------------------------------------------------------
 
class money
{
private:
    long double count;
    std::string strForeign;
public:
    money() {
        count = 0;
    }
    void class_money_mstold();
    void class_money_show_money();
    void class_money_get_money();
};
//----------------------------------------------------------------------
void money::class_money_mstold()
{
    char arr[22]="";
    int k(0);
    for (int i(0); i < std::size(strForeign); i++)
    {
        if ((strForeign.at(i) >= '0' && strForeign.at(i) <= '9') || strForeign.at(i) == '.')
        arr[k++] = strForeign.at(i);
    }
    arr[k] = '\0';
    count = atof(arr);
}
void money::class_money_get_money()
{
 
    std::cout << "Enter money: ";
    std::getline(std::cin, strForeign, 'E');
}
void money::class_money_show_money()
{
    std::cout << "\nYou entered=" << std::setiosflags(std::ios::fixed)
        << std::setiosflags(std::ios::showpoint)
        << std::setprecision(2) << count;
}
//----------------------------------------------------------------------
int main()
{
    money dollar; char ch('y');
    do{
    dollar.class_money_get_money();
    dollar.class_money_mstold();
    dollar.class_money_show_money();
    std::cout << "\nRetry? y/n:"; std::cin >> ch;
    } while (ch == 'y');
    exit(1);
    _getch();
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.05.2017, 00:18
Помогаю со студенческими работами здесь

Проблема с калькулятором из 6 главы книги Страуструпа
После ввода выражения и нажатия клавиши enter, switch не попадает в default, а ждет ввода...

Пример из главы про репу из книги Марлоу
Simon Marlow -&gt; Parallel and Concurrent Programming in Haskell -&gt; Example: Computing Shortest Paths...

Программка из 4 главы книги Страуструпа принципы и практика - не работает
В общем в 4 главе в подпункте векторы на странице 152 имеется вот такой код: #include &lt;iostream&gt;...

Не получается сделать 6е задание 3й главы из книги Бьярне Страуструп
Здравствуйте, я совсем не давно начал изучать C++ и начал с книги Бьярна Страуструпа, и остановился...

Задания из книги Р. Лафоре
Добрый день, решаю задачу из книги Лафоре. Если в двух словах, то нужно перевести строку в long...

Задания из книги Р. Лафоре
Приветствую всех! Выполняю задание из книги Р. Лафоре &quot;ООП в С++&quot;. Задание главы 7. Одним из...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru