Форум программистов, компьютерный форум 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() { ... 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 С++
Здравствуйте, подскажите где ошибка? Задание Даны действительные числа х, у . Если х, у отрицательные то каждое значение заменить его модулем; если отрицательное только одно из них, то оба...
C++ Запись текста в файл http://www.cyberforum.ru/cpp-beginners/thread439138.html
Нужно составить прогрумма которая создает файл и записывает в него текст. Программа не записывает в файл текст после пробела, помогите пожалуйста. char name; char text; cout<<"vvedite put' i im9...
C++ allocator std::map Подскажите вопрос, есть тестовое задание: Написать allocator для std::map, располагающий элементы контейнера последовательно в памяти. Подскажите где про это почитать и разъясните... подробнее

Показать сообщение отдельно
Ferrari F1
604 / 497 / 100
Регистрация: 27.01.2015
Сообщений: 2,913
Записей в блоге: 1
Завершенные тесты: 1
27.03.2015, 11:44
Продолжение:
Глава 12


Номер 10

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
#include <iostream>
#include <iomanip>
#include <windows.h>
#include <conio.h>
using namespace std;
 
class fraction
{
    __int32 a, b;
public:
    fraction() : a(0), b(1)
    {}
 
    fraction(__int32 c, __int32 d) : a(c), b(d)
    {}
 
    fraction operator+(const fraction& t2) const
    {
        fraction tmp;
        tmp.a = a * t2.b + b * t2.a;
        tmp.b = b * t2.b;
        return tmp;
    }
 
    fraction operator-(const fraction& t2)
    {
        fraction tmp;
        tmp.a = a * t2.b - b * t2.a;
        tmp.b = b * t2.b;
        return tmp;
    }
 
    fraction operator*(const fraction& t2)
    {
        fraction tmp;
        tmp.a = a * t2.a;
        tmp.b = b * t2.b;
        return tmp;
    }
 
    fraction operator/(const fraction& t2)
    {
        fraction tmp;
        tmp.a = a * t2.b;
        tmp.b = b * t2.a;
        return tmp;
    }
 
    void lowterms(void)
    {
        __int16 A(a), B(b), C;
        while (B)
        {
            C = A % B;
            A = B;
            B = C;
        }
        a /= abs(A);
        b /= abs(A);
    }
 
    void set()
    {
        cin >> a >> b;
    }
 
    void show() const
    {
        cout << a << '/' << b << endl;
    }
 
    bool operator==(const fraction& t1) const
    {
        return a == t1.a || b == t1.b ? 1 : 0;
    }
 
    bool operator!=(const fraction& t1) const
    {
        return a != t1.a && b != t1.b ? 1 : 0;
    }
    friend ostream& operator<<(ostream& stream, fraction& frac)
    {
        stream << frac.a << '/' << frac.b;
        return stream;
    }
    friend istream& operator>>(istream& stream, fraction& frac)
    {
        while (true)
        {
            cin.clear();
            cin.sync();
            char ch;
            stream.unsetf(ios::skipws);
            stream >> frac.a >> ch >> frac.b;
            if (ch == '/' && stream && frac.b != 0) break;
            cout << "Дробь введена неверно, повторите ввод." << endl;
        }
        stream.setf(ios::skipws);
        return stream;
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    for (char ch('z'); ch != '0'; ch = getche())
    {
        system("cls");
        fraction t1, t2, t3, zero;
        cout << "Введите 1-ую дробь:" << endl;
        cin >> t1;
        cout << "Введите операцию:" << endl;
        cin >> ch;
        cout << "Введите 2-ую дробь:" << endl;
        cin >> t2;
        switch (ch)
        {
        case '+':
            t3 = t1 + t2; t3.lowterms();
            cout << "Результат равен:\n" << t3;
            break;
        case '-':
            t3 = t1 - t2; t3.lowterms();
            cout << "Результат равен:\n" << t3;
            break;
        case '*':
            t3 = t1 * t2; t3.lowterms();
            cout << "Результат равен:\n" << t3;
            break;
        case '/':
            t3 = t1 / t2; t3.lowterms();
            cout << "Результат равен:\n" << t3;
            break;
        default: cout << "Ошибка!" << endl;
        }
        cout << "\nПовторить? (1 - да. 0 - нет.) ";
    }
    cout << '\n' << endl;
    system("pause");
    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
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#include <iostream>
#include <iomanip>
#include <windows.h>
#include <conio.h>
#include <sstream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
 
const __int16 MAX(80);
 
class bMoney
{
    static const __int16 MAX = 80;
    char arr[MAX];
    long double money;
public:
    bMoney() : money(0)
    {
        arr[0] = 0;
    }
    explicit bMoney(const long double& tmp) : money(tmp)
    {}
    void ldtoms(long double& tmp)
    {
        stringstream ss;
        ss << fixed << setprecision(3) << tmp;
        ss >> arr;
        char tmp1[MAX], tmp2[MAX]; int count(0);
        for (int i(0); arr[i] != 0; i++)
        {
            if (arr[i] != '.') count = i; else break;
        }
        for (int i(0); i <= count; i++)
        {
            tmp1[i] = arr[i];
            if (!(count - i)) tmp1[i + 1] = 0;
        }
        for (int i(count + 1), j(0); arr[i] != 0; i++, j++)
        {
            tmp2[j] = arr[i];
            if (!(strlen(arr) - 1 - i)) tmp2[j + 1] = 0;
        }
        string tmp3(tmp1), tmp4(tmp2);
        reverse(tmp3.begin(), tmp3.end());
        for (int i(0); i <= count; i++)
        if (!((i + 1) % 4)) tmp3.insert(i, " ");
        reverse(tmp3.begin(), tmp3.end());
        tmp3.insert(0, "$ ");
        cout << "\nДенежная сумма в строковом формате:\n" << tmp3 + tmp4 << '\n' << endl;
    }
 
    void operator+(const bMoney& tmp1) const
    {
        bMoney tmp;
        long double tmp2(money + tmp1.money);
        tmp.ldtoms(tmp2);
    }
 
    void operator-(const bMoney& tmp1) const
    {
        bMoney tmp;
        long double tmp2(money - tmp1.money);
        tmp.ldtoms(tmp2);
    }
 
    friend void operator*(const long double&, const bMoney&);
 
    void operator*(const long double& tmp1) const
    {
        bMoney tmp;
        long double tmp2(money * tmp1);
        tmp.ldtoms(tmp2);
    }
 
    void operator/(const bMoney& tmp1) const
    {
        bMoney tmp;
        long double tmp2(money / tmp1.money);
        tmp.ldtoms(tmp2);
    }
 
    friend void operator/(const long double&, const bMoney&);
 
    void operator/(const long double& tmp1) const
    {
        bMoney tmp;
        long double tmp2(money / tmp1);
        tmp.ldtoms(tmp2);
    }
 
    void mstold(char temp[])
    {
        for (unsigned int i(0), j(0); i < strlen(temp); i++)
        {
            switch (temp[i])
            {
            case '0':
                arr[j] = temp[i]; j++;
                break;
            case '1':
                arr[j] = temp[i]; j++;
                break;
            case '2':
                arr[j] = temp[i]; j++;
                break;
            case '3':
                arr[j] = temp[i]; j++;
                break;
            case '4':
                arr[j] = temp[i]; j++;
                break;
            case '5':
                arr[j] = temp[i]; j++;
                break;
            case '6':
                arr[j] = temp[i]; j++;
                break;
            case '7':
                arr[j] = temp[i]; j++;
                break;
            case '8':
                arr[j] = temp[i]; j++;
                break;
            case '9':
                arr[j] = temp[i]; j++;
                break;
            case '.':
                arr[j] = temp[i]; j++;
                break;
            }
            if (!(strlen(temp) - i - 1))
                arr[j] = 0;
        }
        cin.clear();
        cin.sync();
        money = stold(arr);
    }
    friend void round(bMoney&);
    friend void operator>>(istream& stream, bMoney& bm)
    {
        char tmp[MAX];
        cin.getline(tmp, MAX);
        bm.mstold(tmp);
    }
};
 
void round(bMoney& tmp1)
{
    long double fractpart, intpart;
    fractpart = modf(tmp1.money, &intpart);
    intpart = fractpart <= 0.49 ? intpart : intpart + 1;
    tmp1.ldtoms(intpart);
}
 
void operator/(const long double& tmp1, const bMoney& tmp2)
{
    bMoney tmp;
    long double tmp3(tmp1 / tmp2.money);
    tmp.ldtoms(tmp3);
}
 
void operator*(const long double& tmp1, const bMoney& tmp2)
{
    bMoney tmp;
    long double tmp3(tmp2.money * tmp1);
    tmp.ldtoms(tmp3);
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    for (char ch('z'); ch != '0'; ch = getche())
    {
        bMoney t1, t2, t3;
        if (ch != 'z') cout << '\n' << endl;
        cout << "Введите 1-ую денежную строку:" << endl;
        cin >> t1;
        cout << "\nВведите 2-ую денежную строку:" << endl;
        cin >> t2;
        cout << "\nВведите вещественное число:" << endl;
        long double temp123; cin >> temp123;
        cin.clear();
        cin.sync();
        cout << "\nВведите строку для округления:" << endl;
        cin >> t3;
        cout << "\nОкругление bMoney";
        round(t3);
        cout << "bMoney = bMoney + bMoney";
        t1 + t2;
        cout << "bMoney = bMoney - bMoney";
        t1 - t2;
        cout << "bМоnеу = bMoney * long double";
        t1 * temp123;
        cout << "bМоnеу = long double * bMoney";
        temp123 * t1;
        cout << "long double = bMoney / bMoney";
        t1 / t2;
        cout << "bMoney = bMoney / long double";
        t1 / temp123;
        cout << "bMoney = long double / bMoney";
        temp123 / t1;
        cout << "Повторить? (1 - да. 0 - нет.) ";
    }
    cout << '\n' << endl;
    system("pause");
    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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
#include <iostream>
#include <iomanip>
#include <fstream>
#include <windows.h>
#include <typeinfo>
#include <process.h>
using namespace std;
 
const int LEN = 32;
const int MAXEM = 100;
 
enum employee_type { tmanager, tscientist, tlaborer };
 
class employee
{
private:
    char name[LEN];
    unsigned long number;
    static int n;
    static employee* arrap[];
public:
    virtual void getdata()
    {
        cin.ignore(10, '\n');
        cout << " Введите фамилию: "; cin >> name;
        cout << " Введите номер: "; cin >> number;
    }
    virtual void putdata()
    {
        cout << "\n Фамилия: " << name;
        cout << "\n Номер: " << number;
    }
    virtual employee_type get_type();
    static void add();
    static void display();
    static void read();
    static void write();
    static void find();
};
 
int employee::n;
employee* employee::arrap[MAXEM];
 
class manager : public employee
{
private:
    char title[LEN];
    double dues;
public:
    void getdata()
    {
        employee::getdata();
        cout << " Введите титул: "; cin >> title;
        cout << " Введите налоги: "; cin >> dues;
    }
    void putdata()
    {
        employee::putdata();
        cout << "\n Титул: " << title;
        cout << "\n Налоги гольф-клуба: " << dues;
    }
};
 
class scientist : public employee
{
private:
    int pubs;
public:
    void getdata()
    {
        employee::getdata();
        cout << " Введите число публикаций: "; cin >> pubs;
    }
    void putdata()
    {
        employee::putdata();
        cout << "\n Число публикаций: " << pubs;
    }
};
 
class laborer : public employee {
};
 
void employee::add()
{
    char ch;
    cout << "'m' для добавления менеджера"
        "\n's' для добавления ученого"
        "\n'l' для добавления рабочего"
        "\nВаш выбор: ";
    cin >> ch;
    switch (ch)
    {
    case 'm': arrap[n] = new manager; break;
    case 's': arrap[n] = new scientist; break;
    case 'l': arrap[n] = new laborer; break;
    default: cout << "\nНеизвестный тип работника\n"; return;
    }
    arrap[n++]->getdata();
}
 
void employee::display()
{
    for (int j = 0; j < n; j++)
    {
        cout << (j + 1);
        switch (arrap[j]->get_type())
        {
        case tmanager: cout << ". Тип: Менеджер"; break;
        case tscientist: cout << ". Тип: Ученый"; break;
        case tlaborer: cout << ". Тип: Рабочий"; break;
        default: cout << ". Неизвестный тип";
        }
        arrap[j]->putdata();
        cout << endl;
    }
}
 
employee_type employee::get_type()
{
    if (typeid(*this) == typeid(manager))
        return tmanager;
    else if (typeid(*this) == typeid(scientist))
        return tscientist;
    else if (typeid(*this) == typeid(laborer))
        return tlaborer;
    else
    {
        cerr << "\nНеправильный тип работника"; exit(1);
    }
    return tmanager;
}
 
void employee::write()
{
    int size;
    cout << "Идет запись " << n << " работников.\n";
    ofstream ouf;
    employee_type etype;
    ouf.open("EMPLOY.DAT", ios::trunc | ios::binary);
    if (!ouf)
    {
        cout << "\nНевозможно открыть файл\n"; return;
    }
    for (int j = 0; j < n; j++)
    {
        etype = arrap[j]->get_type();
        ouf.write((char*)&etype, sizeof(etype));
        switch (etype)
        {
        case tmanager: size = sizeof(manager); break;
        case tscientist: size = sizeof(scientist); break;
        case tlaborer: size = sizeof(laborer); break;
        }
        ouf.write((char*)(arrap[j]), size);
        if (!ouf)
        {
            cout << "\nЗапись в файл невозможна\n"; return;
        }
    }
}
 
void employee::read()
{
    int size;
    employee_type etype;
    ifstream inf;
    inf.open("EMPLOY.DAT", ios::binary);
    if (!inf)
    {
        cout << "\nНевозможно открыть файл\n"; return;
    }
    n = 0;
    while (true)
    {
        inf.read((char*)&etype, sizeof(etype));
        if (inf.eof())
            break;
        if (!inf)
        {
            cout << "\nНевозможно чтение типа\n"; return;
        }
        switch (etype)
        {
        case tmanager:
            arrap[n] = new manager;
            size = sizeof(manager);
            break;
        case tscientist:
            arrap[n] = new scientist;
            size = sizeof(scientist);
            break;
        case tlaborer:
            arrap[n] = new laborer;
            size = sizeof(laborer);
            break;
        default: cout << "\nНеизвестный тип в файле\n"; return;
        }
        inf.read((char*)arrap[n], size);
        if (!inf)
        {
            cout << "\nЧтение данных из файла невозможно\n"; return;
        }
        n++;
    }
    cout << "Идет чтение " << n << " работников\n";
}
 
void employee::find()
{
    cout << "Введите номер для поиска:" << endl;
    int size, num;
    cin >> num;
    employee* temp;
    employee_type etype;
    ifstream inf;
    inf.open("EMPLOY.DAT", ios::binary);
    if (!inf)
    {
        cout << "\nНевозможно открыть файл\n"; return;
    }
    n = 0;
    while (true)
    {
        inf.read((char*)&etype, sizeof(etype));
        if (inf.eof())
            break;
        if (!inf)
        {
            cout << "\nНевозможно чтение типа\n"; return;
        }
        switch (etype)
        {
        case tmanager:
            temp = new manager;
            size = sizeof(manager);
            break;
        case tscientist:
            temp = new scientist;
            size = sizeof(scientist);
            break;
        case tlaborer:
            temp = new laborer;
            size = sizeof(laborer);
            break;
        default: cout << "\nНеизвестный тип в файле\n"; return;
        }
        inf.read((char*)temp, size);
        if (temp->number == num)
        {
            switch (etype)
            {
            case tmanager: cout << "\nТип: Менеджер"; break;
            case tscientist: cout << "\nТип: Ученый"; break;
            case tlaborer: cout << "\nТип: Рабочий"; break;
            }
            temp->employee::putdata();
            cout << '\n' << endl;
        }
    }
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char ch;
    while (true)
    {
        cout <<
            "'f' - найти работника по номеру в файле"
            "\n'a' - добавление сведений о работнике"
            "\n'd' - вывести сведения обо всех работниках"
            "\n'w' - записать все данные в файл"
            "\n'r' - прочитать все данные из файла"
            "\n'x' - выход"
            "\nВаш выбор: ";
        cin >> ch;
        switch (ch)
        {
        case 'f':
            employee::find(); break;
        case 'a':
            employee::add(); break;
        case 'd':
            employee::display(); break;
        case 'w':
            employee::write(); break;
        case 'r':
            employee::read(); break;
        case 'x': exit(0);
        default: cout << "\nНеизвестная команда";
        }
    }
    system("pause");
    return 0;
}

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