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

Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Конвертер текстового файла http://www.cyberforum.ru/cpp-beginners/thread439174.html
Добрый день!!! Простите за наглость... Помогите пожалуйста написать программу-конвертер текстовых файлов из dos в windows и обратно. С командной строки должно вводится направление /d или /w. Я очень мало в этом понимаю. Заранее спасибо!!!
C++ Проблема с libmms - ошибка при компиляции. Здравствуйте. Уже который день не могу разобраться с упомянутой в заголовке библиотекой, а именно: пишу примерно такой тестовый код #include <iostream> #include <libmms/mms.h> int main() { mms_t *stream; char mms_link="mms://audio.rfn.ru/radiorus/audio/710/90.asf"; stream=mms_connect(0, 0, mms_link, 128); http://www.cyberforum.ru/cpp-beginners/thread439169.html
C++ Привет. Как можна найти с даного примера умножение элементов массива с четными номерами?
#include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <iostream> using namespace std; int main(int argc, _TCHAR* argv)
C++ Начало DEV С++
Здравствуйте, подскажите где ошибка? Задание Даны действительные числа х, у . Если х, у отрицательные то каждое значение заменить его модулем; если отрицательное только одно из них, то оба значения увеличить на 0.5; если оба значения не отрицательные и ни одно из них не принадлежат отрезку , то оба значения уменьшить в 10 раз; в остальных случаях х, у оставить без изменения. Решение ...
C++ Запись текста в файл http://www.cyberforum.ru/cpp-beginners/thread439138.html
Нужно составить прогрумма которая создает файл и записывает в него текст. Программа не записывает в файл текст после пробела, помогите пожалуйста. char name; char text; cout<<"vvedite put' i im9 faila:\n"; cin>>name; ofstream out(name); cout<<"vvedite text:\n"; cin>>text; out<<text; out.close();
C++ allocator std::map Подскажите вопрос, есть тестовое задание: Написать allocator для std::map, располагающий элементы контейнера последовательно в памяти. Подскажите где про это почитать и разъясните по-возможности, что это вообще такое (std::map я вкурсе что это контейнер и как с ним работать) в ступор вводит allocator подробнее

Показать сообщение отдельно
Purcell
 Аватар для Purcell
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
10.03.2014, 16:06     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Глава 7. Связанные друг с другом задачи 7, 11 и 12. Попытался решить их, сохранив использование типа long double.

Упражнение 7
Кликните здесь для просмотра всего текста
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
// преобразование строки в "денежном" формате в число типа long double
 
#include <iostream>
#include <cstring> // для функции strlen()
#include <iomanip> // для манипулятора setprecision()
#include <stdlib.h> // для функции strtold()
 
using namespace std;
//////////////////////////////////////////////////////
class Money
{
    private:
        char mstring[100];  // сумма в "денежном" формате
        long double umoney; // для хранения суммы в другом формате
    public:
        // перевод суммы из "денежного" формата в число типа long double
        void mstold(char mas[])
        {
            for (int i = 0, j = 0; i < strlen(mas); i++)
            {
                // пропускаем все элементы массива, не являющиеся
                // цифрой или точкой
                if (isdigit(mas[i]) || mas[i] == '.')
                {
                    mstring[j++] = mas[i];
                } 
            }
            umoney = strtold(mstring, NULL); // преобразование в long double
        }
        // вывод числа типа long double
        void output() const
        {
            cout << fixed << setprecision(2) << umoney << endl;
        }
};
/////////////////////////////////////////////////////
int main()
{
    char mas[100];
    char ch;
    Money obj;
    do
    {
        cout << "Введите денежную сумму: ";
        cin >> mas;
        obj.mstold(mas);
        obj.output();
        cout << "Продолжить (y/n) ? ";
        cin >> ch;
    }
    while (ch != 'n');
    return 0;
}


Упражнение 11
Кликните здесь для просмотра всего текста
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
/* функция для преобразования числа типа long double
   в строку и для вывода её в "денежном" формате */
 
#include <iostream>
#include <stdio.h> // для функции sprintf()
#include <cstring> // для функции strlen()
using namespace std;
//-----------------------------------------------------------------
// функция для ввода числа типа long double
long double input()
{
    long double umoney;
    do
    {
        cout << "Введите денежную сумму: ";
        cin >> umoney;
        if (umoney > 9999999999999990.00)
        {
            cout << "Сумма слишком велика!" << endl;
        }
        if (umoney < 0)
        {
            cout << "Сумма не может быть отрицательным числом!" << endl;
        }
    }
    while (umoney > 9999999999999990.00 || umoney < 0);
    return umoney;
}
//-------------------------------------------------------------------
/* функция для преобразования числа типа long double
   в строку и для вывода её в "денежном" формате */
void ldtoms(long double ldmoney)
{
    char ustring[100];  // буфер
    char outmoney[100]; // строка для вывода суммы
    int len;      // количество символов в буфере ustring
    int zero;     // количество нулей перед числом
    // конвертация суммы из long double в массив символов
    // с сохренением 2-х знаков после запятой
    if (ldmoney >= 0 && ldmoney <= 9999999999999990.00)
    {
        sprintf (ustring, "%.2Lf", ldmoney);
    }
    else
    {
        cout << "Введенное вами число не находится в допустимом "
        "диапазоне!" << endl;
    }
 
    len = strlen(ustring);
    zero = 19 - len;
    // сначала создается массив с нулями в начале строки
    // и со всеми запятыми
    outmoney[0] = '$';
    for (int count = 1, count_2 = 0; count <= 24; count++)
    {
        switch (count)
        {
            case (2): outmoney[count] = ','; break;
            case (6): outmoney[count] = ','; break;
            case (10): outmoney[count] = ','; break;
            case (14): outmoney[count] = ','; break;
            case (18): outmoney[count] = ','; break;
            default:
                if (zero != 0)
                {
                    outmoney[count] = '0';
                    zero--;
                }
                else
                {
                    outmoney[count] = ustring[count_2++];
                }
        }
        if (count == 24)
        {
            outmoney[++count] = '\0';
        }
    }
    // потом убираются все нули в начале строки и лишние запятые
    while (outmoney[1] == '0' || outmoney[1] == ',')
    {
        for (int count = 1; count <= 24; count++)
        {
            outmoney[count] = outmoney[count + 1];
        }
    }
    cout << outmoney << endl;
}
//-------------------------------------------------------------------
int main()
{
    long double money;
    char ch;
    do
    {
        money = input();
        ldtoms(money);
        cout << "Продолжить (y/n)? ";
        cin >> ch;
    }
    while (ch != 'n');
    return 0;
}


Упражнение 12
Кликните здесь для просмотра всего текста
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/* объединение упражнений 7 и 11 с добавлением функции
   для сложения двух объектов типа BMoney              */
 
#include <iostream>
#include <cstring> // для функции strlen()
#include <stdlib.h> // для функций strtold() и exit()
#include <stdio.h> // для функции sprintf()
 
using namespace std;
//////////////////////////////////////////////////////////////
class BMoney
{
    private:
        char mstring[100];    // сумма в "денежном" формате
        long double umoney;   // для хранения суммы в другом формате
        char ustring[100];    // буфер
        char outmoney[100];  // строка для вывода суммы
    public:
        // ввод суммы
        void putmoney()
        {
            cout << "Введите сумму (от '$0.00' до "
            "'$9,999,999,999,999,990.00)': ";
            cin >> mstring;
            if (mstring[0] == '-' || mstring[1] == '-')
            {
                cout << "Введеное вами число не находится в допустимом"
                " диапазоне!" << endl;
                exit(0);
            }
        }
        //-------------------------------------------------------------------
        // вывод суммы
        void getmoney() const
        {
            cout << outmoney << endl;
        }
        //-------------------------------------------------------------------
        // перевод суммы из "денежного" формата в число типа long double
        void mstold()
        {
            int len = strlen(mstring);
            for (int i = 0, j = 0; i < len; i++)
            {
                // пропускаем все элементы массива, не являющиеся
                // цифрой или точкой
                if (isdigit(mstring[i]) || mstring[i] == '.')
                {
                    mstring[j++] = mstring[i];
                }
                if (i == len - 1)
                {
                    mstring[j] = '\0';
                }
            }
            umoney = strtold(mstring, NULL); // преобразование в long double
        }
        //-------------------------------------------------------------------
        /* функция для преобразования числа типа long double
           в строку и для вывода её в "денежном" формате */
        void ldtoms()
        {
            int len;      // количество символов в буфере ustring
            int zero;     // количество нулей перед числом
            // конвертация суммы из long double в массив символов
            // с сохренением 2-х знаков после запятой
            if (umoney >= 0 && umoney <= 9999999999999990.00)
            {
                sprintf (ustring, "%.2Lf", umoney);
            }
            else
            {
                cout << "Итоговая сумма не находится в допустимом"
                " диапазоне!" << endl;
                exit(0);
            }
 
            len = strlen(ustring);
            zero = 19 - len;
            // сначала создается массив с нулями в начале строки
            // и со всеми запятыми
            outmoney[0] = '$';
            for (int count = 1, count_2 = 0; count <= 24; count++)
            {
                switch (count)
                {
                    case (2): outmoney[count] = ','; break;
                    case (6): outmoney[count] = ','; break;
                    case (10): outmoney[count] = ','; break;
                    case (14): outmoney[count] = ','; break;
                    case (18): outmoney[count] = ','; break;
                    default:
                        if (zero != 0)
                        {
                            outmoney[count] = '0';
                            zero--;
                        }
                        else
                        {
                            outmoney[count] = ustring[count_2++];
                        }
                }
                if (count == 24)
                {
                    outmoney[++count] = '\0';
                }
            }
            // потом убираются все нули в начале строки и лишние запятые
            while (outmoney[1] == '0' || outmoney[1] == ',')
            {
                for (int count = 1; count <= 24; count++)
                {
                    outmoney[count] = outmoney[count + 1];
                }
            }
        }
        //-------------------------------------------------------------------
        // функция для сложения 2-х объектов типа BMoney
        void madd(BMoney m1, BMoney m2)
        {
            umoney = m1.umoney + m2.umoney;
        }
};
//////////////////////////////////////////////////////////////
int main()
{
    BMoney obj_1, obj_2, obj_3;
    char ch;
    do
    {
        obj_1.putmoney();
        obj_1.mstold();
        obj_2.putmoney();
        obj_2.mstold();
        obj_3.madd(obj_1, obj_2);
        obj_3.ldtoms();
        obj_3.getmoney();
        cout << "Продолжить вычисления (y/n)? ";
        cin >> ch;
    }
    while (ch != 'n');
    return 0;
}


Добавлено через 4 минуты
Цитата Сообщение от Scythian Посмотреть сообщение
ГЛАВА 7 ЗАДАЧА 7

Хочу поделиться своим вариантом. Мне кажется он лаконичней и более универсален.

Кликните здесь для просмотра всего текста
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
#include<iostream>
#include<stdlib.h>
#include<string>
#include<iomanip>
using namespace std;
 
class money
{
private:
    long double denughka;
public:
    money(){};
    void mstold(string st)
    {
        string m="0123456789.";
        int pos=0,l=0;
        while(pos>=0)
        {
            pos=st.find_first_not_of(m);
            if(pos==-1)
                break;
            st.replace(pos,1,"");
        }
        denughka=atof(st.c_str());
    }
    void show()
    {
        cout<<setiosflags(ios::fixed)<<setprecision(2)<<endl<<denughka<<endl;
    }
};
int main()
{
    money d;
    string s;
    char ch='Y';
    while(ch!='N')
    {
        cout<<"Enter the sum\t";
        cin>>s;
        d.mstold(s);
        d.show();
        cout<<"\nto continue?(Y/N)";
        cin>>ch;
    }
    system("pause");
    return 0;
}
Спасибо) Только не функция atof, а atold. Ведь используется long double.

Добавлено через 20 часов 58 минут
В 12 упражнении функции exit() нужно передавать не '0', а '1'.
 
Текущее время: 09:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru