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

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

Войти
Регистрация
Восстановить пароль
 
StNic
0 / 0 / 0
Регистрация: 20.12.2013
Сообщений: 5
Завершенные тесты: 1
#1

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

21.11.2014, 14:00. Просмотров 561. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2014, 14:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задача 7 главы 7 из книги Р. Лафоре. Строки (C++):

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

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

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

Рекурсия с++ из книги Лафоре - C++
Что за принцип у работы рекурсии? // factor2.cpp // подсчет факториала числа с помощью рекурсии #include &lt;iostream&gt; using...

Листинг из книги Лафоре - C++
Добрый вечер. Хочу попросить помощи: в третьей главе книги Лафоре идет объяснение циклов, начинается с цикла for. В данной главе...

Пример из книги Лафоре - C++
Здравствуйте! Не могли бы подсказать, по какой причине в листинге ниже переменные должны быть обязательно быть изначально изначально с...

2
StNic
0 / 0 / 0
Регистрация: 20.12.2013
Сообщений: 5
Завершенные тесты: 1
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
demonmadman
0 / 0 / 0
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2017, 00:18
Привет! Вот еще темы с ответами:

Пример из книги Лафоре - C++
В третьей главе книги Лафоре по с++ есть пример использующий функцию getche(): #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace...

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

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

Упражнение из книги Лафоре - C++
//11.cpp #include &lt;iostream&gt; using namespace std; class sterling { private: long pounds; int shil; int pens;


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

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

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