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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 621, средняя оценка - 4.99
Kimel
15 / 15 / 0
Регистрация: 01.02.2012
Сообщений: 182
01.02.2012, 17:47     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #1
Хотя я и начинающий с++-шник. Хочу помочь другим людям. Здесь я буду выкладывать всё что мне удалось решить. В моих решениях будет много хедеров, делал я это в Dev C++. Ос Win 7 64 bit.

Начнём со второй главы:
Упражнение 1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream> 
 
using namespace std;
 
int main()
{
   setlocale(0,"Rus");
   float gallons, cufeet;
 
   cout << "Введите количество галоннов: \n";
   cin >> gallons;
   cufeet = gallons / 7.481;
   cout << "Еквивалент в футах = " << cufeet << endl;
    
   return 0;
}

Упражнение 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main()
{
   setlocale(0,"Rus");
   
    cout << 1990 << setw(8) << 135 << endl
           << 1991 << setw(8) << 7290 << endl 
           << 1992 << setw(8) << 11300 << endl
           << 1993 << setw(8) << 16200 << endl;
  
   return 0;
}

Упражнение 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    int var = 10;
 
    cout << var << endl;      
    var *= 2;                 
    cout << var-- << endl;    
    cout << var << endl;      
    return 0;
}

Упражнение 4
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    cout<<"\nУ лукоморья дуб срубили\nКота на мясо порубили \nА по неведанным дорожкам\nШагали черти в босоножках\n"; 
    return 0;
}

Упражнение 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream> 
#include <ctype.h>
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    char ch;
    cin >> ch;
    cout << islower(ch);  // При вводе строчной буквы будет 2 при прописной 0. Но есть нюанс, поддерживаються только англ буквы 
    return 0;
}


Упражнение 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
 
    float a,b,c,d,f;
    cout << "Введите кол-во доларов"<<endl;
    cin >> f;
    b=f/1.487;
    c=f/0.172;
    a=f/0.584;
    d=f/0.00955;
    cout << f <<"доларов = "<< b<<" фунтов стерлинга"<<endl;
    cout << f <<"доларов = "<< c<<" франков"<<endl;
    cout << f <<"доларов = "<< a<<" немецких марок"<<endl;
    cout << f <<"доларов = "<< d<<" японских йен"<<endl;
    return 0;
}

Упражнение 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    double f,c;
    cout << "Введите количество градусов по Цельсию"<<endl;
    cin >> c;
    f=c*1.8+32;
    cout <<setprecision(3)<< f << " градусов по Фаренгейту "<< endl; // Регуляция кол-во символов после запятой
    return 0;
}

Упражнение 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    long pop1=2425785, pop2=47, pop3=9761;       
 
    cout << setfill('.') <<setw(8) << "LOCATION" << setw(12) // Обратите внимание на одинарные кавычки
           << "POPULATION" << endl
           <<setw(8) << "Portcity" << setw(12) << pop1 << endl
           << setw(8) << "Hightown" << setw(12) << pop2 << endl
           << setw(8) << "Lowville" << setw(12) << pop3 << endl;
    return 0;
}

Упражнение 9

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    char dummychar;
    double a,b,c,d,e,f;
    cout << "Введите а и b"<< endl;
    cin >>a>>dummychar>>b;
    cout << "Введите c и d"<<endl;
    cin >>c>>dummychar>>d;
    cout <<(b*c)+(d*a)<<dummychar<<(b*d)<<endl;
 
    return 0;
}

Упражнение 10 (Намучился с этой задачей)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream> 
 
using namespace std;
 
int main() 
{
    setlocale(0,"Rus");
    float a,b,c,f;
    cout << "Введите количество фунтов"<<endl;
    cin >> a;
    cout << "Введите количество шиллингов"<<endl;
    cin >> b;
    cout << "Введите количество пенсов"<<endl;
    cin >> c;
    f = a+(b+c/12)/20;
    cout << "Количество фунтов = " << f << endl;
    return 0;
}

Упражнение 11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream> 
#include <iomanip>
 
using namespace std;
 
int main() 
{
     setlocale(0,"Rus");
     cout << setiosflags(ios::left) <<setw(15) << "Фамилия"<< setw(15)<< "Имя"<<setw(15) << "Адресс"<<setw(15)<< "Город"<<endl
            <<setw(15)<< "Иванов"<<setw(15)<<"Петя"<<setw(15)<<"Кленовая 16"<<setw(10)<<"Москва"<<endl
            <<setw(15)<< "Иванов"<<setw(15)<<"Петя"<<setw(15)<<"Кленовая 16"<<setw(10)<<"Москва"<<endl
            <<setw(15)<< "Иванов"<<setw(15)<<"Петя"<<setw(15)<<"Кленовая 16"<<setw(10)<<"Москва"<<endl;
    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
#include <iostream> 
 
using namespace std;
 
int main() 
{
setlocale(0,"Rus");
float a,b,z;
int c,k;
cout << "Введите кол-во футов " << endl;
cin >> a;
c = static_cast<int>(a);
b = a - c;
b *= 20;
k = static_cast<int>(b);
z = b - k;
z = z*12;
z = static_cast<int>(z);
k = static_cast<int>(k);
cout << c <<"."<< k <<"."<< z << endl;
return 0;
}
Это конец второй главы, третюю сделаю позже если будет нужна
 Комментарий модератора 
Пост обновлен по просьбе ТС
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2012, 17:47     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Посмотрите здесь:

Объектно-ориентированное программирование C++
C++ Объектно-ориентированное программирование
C++ Объектно ориентированное программирование
Ищу ответы на задания из книги Лафоре Р. "Объектно-ориентированное программирование в С++" 4 издание. C++
C++ Объектно-ориентированное программирование C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
18.03.2015, 21:53     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #221
Ferrari F1, а 10 главу почему пропустил?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,888
Записей в блоге: 1
Завершенные тесты: 1
19.03.2015, 12:18     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #222
dicros,
Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"

Добавлено через 5 минут
Просто 11 главу очень долго делал, и таким образом 10-ая затерялась на предыдущих страницах темы, долго делал из-за восьмого задания, где надо самому парсер переделывать, очень муторная задачка.
Recrut_rf
6 / 6 / 0
Регистрация: 14.10.2014
Сообщений: 44
Завершенные тесты: 2
20.03.2015, 21:18     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #223
Замучился тут с упражнением 2 главы 10. Задание всё-таки сделал и решил написать этот небольшой пост, может кому понадобится.
ПРОБЛЕМА С которой я столкнулся:
Функция toupper() из задания ну никак не хотела переводить символы строки в верхний регистр. Лишь почитав инфу на сайте

http://www.cplusplus.com/reference/cctype/toupper/

догадался - всё дело в кодировке. Я использую SetConsoleCP(1251) и SetConsoleOutputCP(1251) - а с ними функция нормально работает если вводить лишь латинские символы. Для тех - кому нужна кириллица, используйте setlocale(LC_ALL, "rus") например.
LittleMonkey
1 / 1 / 0
Регистрация: 20.04.2014
Сообщений: 140
25.03.2015, 01:07     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #224
Kimel, Извините, а с задачами из 4 главы не поможете?
Recrut_rf
6 / 6 / 0
Регистрация: 14.10.2014
Сообщений: 44
Завершенные тесты: 2
25.03.2015, 10:55     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #225
Цитата Сообщение от LittleMonkey Посмотреть сообщение
Kimel, Извините, а с задачами из 4 главы не поможете?
Вот ссылки на 4 главу:

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

Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,888
Записей в блоге: 1
Завершенные тесты: 1
27.03.2015, 11:43     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #226
Глава 12


Номер 1

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
#include <iostream>
#include <iomanip>
#include <fstream>
#include <windows.h>
using namespace std;
 
class Distance
{
    int feet;
    float inches;
public:
    Distance() : feet(0), inches(0)
    {}
    Distance(int ft, float in) : feet(ft), inches(in)
    {}
    void set()
    {
        cout << "Введите футы" << endl;
        cin >> feet;
        cout << "Введите дюймы" << endl;
        cin >> inches;
    }
    void showdist() const
    {
        cout << feet << "\'-" << inches << '\"';
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    fstream file("text.txt", ios::ate | ios::out | ios::in | ios::binary);
    Distance* dist = new Distance;
    char ch(0);
    do
    {
        cout << "Введите информацию для записи в файл." << endl;
        dist->set();
        file.write((char*)dist, sizeof(*dist));
        cout << "Повторить ввод? (y/n)" << endl;
        cin >> ch;
    } while (ch == 'y');
    file.seekg(0);
    while (file.read((char*)dist, sizeof(*dist)))
    {
        dist->showdist();
        cout << endl;
    }
    cout << endl;
    system("pause");
    return 0;
}


Номер 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
#include <iostream>
#include <iomanip>
#include <fstream>
#include <windows.h>
#include <process.h>
using namespace std;
 
int main(int argc, char* argv[])
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    if (argc != 3)
    {
        cerr << "Формат команды: путь имя_файла";
        exit(-1);
    }
    ifstream input(argv[1]);
    if (!input)
    {
        cerr << "\nНевозможно открыть " << argv[1];
        exit(-1);
    }
    ofstream output(argv[2], ios::trunc);
    if (!output)
    {
        cerr << "\nНевозможно открыть " << argv[2];
        exit(-1);
    }
    output << input.rdbuf();
    system("pause");
    return 0;
}


Номер 3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <iomanip>
#include <fstream>
#include <windows.h>
#include <process.h>
using namespace std;
 
int main(int argc, char* argv[])
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    if (argc != 2)
    {
        cerr << "Формат команды: путь имя_файла";
        exit(-1);
    }
    ifstream file(argv[1], ios::ate);
    cout << "Размер файла равен: " << file.tellg() << " байт." << endl;
    system("pause");
    return 0;
}


Номер 4

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
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <windows.h>
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    string name;
    unsigned long number;
    char ch(0);
    ofstream output("text.txt", ios::trunc);
    do
    {
        cout << "Введите фамилию, имя, отчество сотрудника." << endl;
        getline(cin, name);
        cout << "Введите номер сотрудника." << endl;
        cin >> number;
        output << '\n' << name << '\n' << number;
        cout << "Продолжить ввод? (y/n)" << endl;
        cin >> ch;
        cin.clear();
        cin.sync();
    } while (ch == 'y');
    output.close(); cout << endl;
    ifstream input("text.txt");
    input.ignore(1);
    while (getline(input, name))
    {
        cout << "Фамилия, имя, отчество сотрудника:" << endl;
        cout << name << endl;
        input >> number;
        cout << "Номер сотрудника:" << endl;
        cout << number << '\n' << endl;
        input.ignore(1);
    }
    system("pause");
    return 0;
}


Номер 5

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
#include <iostream>
#include <fstream>
#include <iomanip>
#include <windows.h>
using namespace std;
 
class Time
{
    short h, m, s;
public:
    void get_time()
    {
        while (1)
        {
            cout << "Введите часы: ";
            cin >> h;
            if (cin && h < 24)
            {
                cin.clear(); cin.sync(); break;
            }
            cin.clear(); cin.sync(); system("cls");
        }
        while (1)
        {
            cout << "Введите минуты: ";
            cin >> m;
            if (cin && m < 60)
            {
                cin.clear(); cin.sync(); break;
            }
            cin.clear(); cin.sync();
        }
        while (1)
        {
            cout << "Введите секунды: ";
            cin >> s;
            if (cin && s < 60)
            {
                cin.clear(); cin.sync(); break;
            }
            cin.clear(); cin.sync();
        }
    }
    void put_time() const
    {
        cout << "\nВремя: " << endl;
        cout << h << ':' << m << ':' << s << endl;
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    Time* t;
    for (char ch('a'); ch != '\n';)
    {
        t = new Time;
        t->get_time();
        t->put_time();
        delete t;
        cout << "Повторить ввод?" << endl;
        cin.unsetf(ios::skipws);
        cin >> ch;
        cin.sync();
        cin.clear();
    }
    system("pause");
    return 0;
}


Номер 6

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 <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <windows.h>
using namespace std;
 
class name
{
    string str;
    unsigned short number;
    friend ofstream& operator<<(ofstream& out, name& objname)
    {
        cout << "Введите фамилию, имя, отчество сотрудника." << endl;
        getline(cin, objname.str);
        cout << "Введите номер сотрудника." << endl;
        cin >> objname.number;
        out << '\n' << objname.str << '\n' << objname.number;
        return out;
    }
    friend ifstream& operator>>(ifstream& in, name& objname)
    {
        in.ignore(1);
        while (getline(in, objname.str))
        {
            cout << "Фамилия, имя, отчество сотрудника:" << endl;
            cout << objname.str << endl;
            in >> objname.number;
            cout << "Номер сотрудника:" << endl;
            cout << objname.number << '\n' << endl;
            in.ignore(1);
        }
        return in;
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    name str;
    char ch(0);
    ofstream output("text.txt", ios::trunc);
    do
    {
        output << str;
        cout << "Продолжить ввод? (y/n)" << endl;
        cin >> ch;
        cin.clear();
        cin.sync();
    } while (ch == 'y');
    output.close(); cout << endl;
    ifstream input("text.txt");
    input >> str;
    system("pause");
    return 0;
}


Номер 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
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <windows.h>
using namespace std;
 
class name
{
    string str;
    unsigned short number;
    static fstream namestream;
public:
    void write()
    {
        cout << "Введите фамилию, имя, отчество сотрудника." << endl;
        getline(cin, str);
        cout << "Введите номер сотрудника." << endl;
        cin >> number;
        namestream << '\n' << str << '\n' << number;
    }
    static void openstream()
    {
        namestream.open("text.txt", ios::trunc | ios::in | ios::out);
    }
    static void readclose(name& arg)
    {
        namestream.seekg(0);
        namestream.ignore(1);
        while (getline(namestream, arg.str))
        {
            cout << "Фамилия, имя, отчество сотрудника:" << endl;
            cout << arg.str << endl;
            namestream >> arg.number;
            cout << "Номер сотрудника:" << endl;
            cout << arg.number << '\n' << endl;
            namestream.ignore(1);
        }
        namestream.close();
    }
};
 
fstream name::namestream;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    name str;
    char ch(0);
    name::openstream();
    do
    {
        str.write();
        cout << "Продолжить ввод? (y/n)" << endl;
        cin >> ch;
        cin.clear();
        cin.sync();
    } while (ch == 'y');
    system("cls");
    name::readclose(str);
    system("pause");
    return 0;
}


Номер 8

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
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <windows.h>
using namespace std;
 
struct link
{
    int data;
    link* next;
};
 
class linklist
{
    link* first;
public:
    linklist()
    {
        first = 0;
    }
    void additem(int d);
    void display();
    friend ofstream& operator<<(ofstream& output, linklist& list)
    {
        link* current = list.first;
        while (current)
        {
            output << '\n' << current->data;
            current = current->next;
        }
        return output;
    }
    friend ifstream& operator>>(ifstream& input, linklist& list)
    {
        input.seekg(0);
        input.ignore(1);
        short temp;
        while (input >> temp)
        {
            list.additem(temp);
            input.ignore(1);
        }
        return input;
    }
};
 
void linklist::additem(int d)
{
    link* newlink = new link;
    newlink->data = d;
    newlink->next = first;
    first = newlink;
}
 
void linklist::display()
{
    link* current = first;
    while (current)
    {
        cout << current->data << endl;
        current = current->next;
    }
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    linklist* li = new linklist;
    char ch(0);
    while (ch != 'n')
    {
        cout <<
            "Для добавления ссылки в список нажмите 1.\n"
            "Для показа данных по всем ссылкам из списка нажмите 2.\n"
            "Для записи в файл данных для всех ссылок нажмите 3.\n"
            "Для считывания всех данных из файла нажмите 4.\n" << endl;
        short z;
        cin >> z;
        ofstream output;
        ifstream input;
        switch (z)
        {
        case 1:
            li->additem(25);
            li->additem(36);
            li->additem(49);
            li->additem(64);
            break;
        case 2:
            cout << "\nСодержимое линейного списка:" << endl;
            li->display();
            break;
        case 3:
            cout << "\nПроизводится запись данных..." << endl;
            output.open("text.txt", ios::trunc);
            output << *li;
            output.close();
            break;
        case 4:
            cout << "\nПроизводится чтение данных...\n" << endl;
            input.open("text.txt");
            delete li;
            li = new linklist;
            input >> *li;
            input.close();
            li->display();
            break;
        default: cout << "\nВведена неверная цифра" << endl;
        }
        cout << "\nПовторить? (y/n) ";
        cin >> ch;
        cout << endl;
    }
    system("pause");
    return 0;
}


Номер 9

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
#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)
    {
        char ch;
        stream >> frac.a >> ch >> frac.b;
        return stream;
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    for (char ch('z'); ch != '0'; ch = getche())
    {
        if (ch != 'z') cout << '\n' << endl;
        fraction t1, t2, t3, zero;
        cout << "Введите выражение:" << endl;
        cin >> t1 >> ch >> 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;
}


Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,888
Записей в блоге: 1
Завершенные тесты: 1
27.03.2015, 11:44     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #227
Продолжение:
Глава 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;
}

LittleMonkey
1 / 1 / 0
Регистрация: 20.04.2014
Сообщений: 140
30.03.2015, 23:32     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #228
Recrut_rf,
у меня вопрос по задаче 1 из 4 главы (мобильный номер)
там можно первый ноль не прописывать номера, но если ввести номер, к примеру, 98 098 9898, то и этот ноль учитываться не будет. Как сделать так, что б не учитывался только первый ноль?
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,888
Записей в блоге: 1
Завершенные тесты: 1
31.03.2015, 05:09     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #229
LittleMonkey,
ввести номер, как строку, но тебе еще равно об этом думать, посколько это описывается лишь в главе массивы и строки, поэтому обойдись без этих нулей.
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
08.04.2015, 15:24     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #230
Помогите разобраться с примером, никак не могу понять что именно в нем происходит

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
#include <iostream>
using namespace std;
 
int main()
{
    setlocale(0, "Rus");
    int i;
    while (true)
    {
        cout << "\nВведите целое число: ";
        cin >> i;
 
        if (cin.good())
        {
            cin.ignore(10, '\n');
            break;
        }
 
        cin.clear();
        cout << "Неправильный ввод данных";
        cin.ignore(10, '\n');
    }
 
    cout << "целое число: " << i << endl;
 
    return 0;
}
Насколько я понимаю метод cin.ignore(10, '\n'); работает следующим образом
C++
1
2
3
4
5
 char chararray[10]; 
 cout << "Type 'abcdef': "; 
 cin.ignore( 5, 'c' ); 
 cin >> chararray; 
 cout << chararray;
Если в приведенном примере записать выражание teststring, то отбросятся первые 5 симоволов и сохраняться только tring
Или если записать вот так tectstring, то увидев что уже на 3 символе встречается 'с' отброситься все что было до него а остальное сохраниться т.е в результате будет tstring.


Отсюда возникает вопрос каким образом метод cin.ignore(10, '\n'); работает в приведенном первом примере?
Допустим я ввожу число вида: 3434983465464 (состоящее из 13 символов) значит метод cin.ignore(10, '\n') в результате сохранит число 464, а первые 10 символов (3434983465) отбросит. Но на практике происходит совсем наоборот даже если ввести 23 он это число и сохраняет ничего не пропуская. Если это возможно объясните попроще что именно делает этот метод.
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,888
Записей в блоге: 1
Завершенные тесты: 1
08.04.2015, 16:52     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #231
dicros,
метод ignore(MAX, '\n') удаляет символы из потока, включая разделитель, пока не встретит '\n' или пока не удалит MAX символов.
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
08.04.2015, 16:59     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #232
Ferrari F1, это я понимаю, я не понимаю на примере как это работает вот смотри допустим

я ввожду число 34 выполянется условие
C++
1
2
3
4
5
      if (cin.good())
        {
            cin.ignore(10, '\n');
            break;
        }
т.е тут всего 2 символа 34, а удаляется вплоть до 10 символов, значит они просто удалятся. Так откуда же тогда в переменной i все равно сохраняется число 34? если они удалились
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,888
Записей в блоге: 1
Завершенные тесты: 1
08.04.2015, 19:49     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #233
dicros,
Попробовал изменить твой код, заменив cin.ignore на перегруженный метод с 1 аргументом:
C++
1
cin.ignore(10); // удаляем 10 символов из потока при вводе
Теперь все 10 символов удаляются из потока, с чем это связано, не знаю.
Вобщем хз почему cin.ignore с 2 арг-ами не удаляет
lss
919 / 849 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
08.04.2015, 20:50     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #234
Вызов деструкторов вручную - это UB.
Деструктор вызывается автоматически, при выходе объекта из области видимости.

Добавлено через 3 минуты
Вызов деструктора
LittleMonkey
1 / 1 / 0
Регистрация: 20.04.2014
Сообщений: 140
03.05.2015, 16:55     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #235
Ferrari F1,
Добрый день!
Интересует Ваша 5 программа из 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
#include <iostream>
#include <iomanip>
#include <windows.h>
#include <string>
using namespace std;
 
class publication
{
    string name;
    float cost;
public:
    virtual void getdata() = 0
    {
        cout << "Введите стоимость книги и ее название:" << endl;
        cin >> cost >> name;
    }
    virtual void putdata() const = 0
    {
        cout << "Cтоимость книги и ее название:" << endl;
        cout << cost << ' ' << name << endl;
    }
    virtual bool isOveersize() = 0
    {
        cout << "Превышение размера!" << endl;
        return 0;
    }
};
 
class book : public publication
{
    short pages, count;
public:
    void getdata()
    {
        publication::getdata();
        cout << "Введите кол-во страниц в книге:" << endl;
        cin >> pages;
        count = pages;
    }
    void putdata() const
    {
        publication::putdata();
        cout << "Ее стоимость:\n" << pages << endl;
        cout << "Кол-во страниц:\n" << count << endl;
    }
    bool isOveersize()
    {
        if (count > 800)
            publication::isOveersize();
        else
            return 1;
    }
};
 
class tape : public publication
{
    float time;
    float count;
public:
    void getdata()
    {
        publication::getdata();
        cout << "Введите время записи:" << endl;
        cin >> time;
        count = time;
    }
    void putdata() const
    {
        publication::putdata();
        cout << "Время записи книги:\n" << time << endl;
        cout << "Кол-во страниц:\n" << count << endl;
    }
    bool isOveersize()
    {
        if (count > 90)
            publication::isOveersize();
        else
            return 1;
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    const short MAX(2);
    publication* mas[MAX];
    for (short i(0); i < MAX;)
    {
        cout << "Ввести данные о книге(1) или о записи(2)?" << endl;
        char ch; cin >> ch;
        if (ch == '1')
        {
            mas[i] = new book;
            mas[i++]->getdata();
        }
        else if (ch == '2')
        {
            mas[i] = new tape;
            mas[i++]->getdata();
        }
        else
            cout << "Введена некорректная цифра. Повторите ввод.\n";
        cin.clear();
        cin.sync();
        cout << endl;
    }
    for (short i(0); i < MAX; i++)
    {
        mas[i]->putdata();
        mas[i]->isOveersize();
        cout << endl;
    }
    system("pause");
    return 0;
}
Подскажите, пожалуйста, как сделать так, чтоб об ошибке выдавало сразу после ввода данных о конкретной книге, а не после вывода данных о всех книгах?
Буду очень благодарна за помощь!!
Recrut_rf
6 / 6 / 0
Регистрация: 14.10.2014
Сообщений: 44
Завершенные тесты: 2
04.05.2015, 21:42     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #236
LittleMonkey,

Цитата Сообщение от LittleMonkey Посмотреть сообщение
Подскажите, пожалуйста, как сделать так, чтоб об ошибке выдавало сразу после ввода данных о конкретной книге, а не после вывода данных о всех книгах?


Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <windows.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
 
using namespace std;
 
class publication
{
    private:
        string title;
        float prc;
        public:
            virtual void getdata() 
            {
                cout << "\nВведите название книги: "; cin >> title;
                cout << "\nВведите цену книги: "; cin >> prc;
            }
            virtual void putdata() 
            {
                cout << "\nНазвание книги: "; cout << title;
                cout << "\nЦена книги: "; cout << prc;
            }
            virtual bool isOveersize() = 0;
};
////////////////////////////////////////////////
class book : public publication
{
    private:
        int strn;   // кол-во страниц
        public:
            void getdata()
            {
                publication::getdata();
                cout << "\nВведите количество страниц в книге: "; cin >> strn;
            }
            void putdata() 
            {
                publication::putdata();
                cout << "\nКоличество страниц в книге: "; cout << strn;
            }
            bool isOveersize()
            {
                cout << "Превышение размера!" << endl;
                return (strn > 800) ? true : false;
            }
};
//////////////////////////////////////////////
class type : public publication
{
    private:
        float min;                               // время
        public:
                void getdata()
                {
                    publication::getdata();
                    cout << "\nВведите время записи книги (мин.): "; cin >> min; 
                }
                void putdata() 
                {
                    publication::putdata();
                    cout << "\nВремя записи книги в минутах: "; cout << min;
                }
                bool isOveersize()
                {
                    cout << "Превышение размера!" << endl;
                    return (min > 90) ? true : false;
                }
                
};
///////////////////////////////////////
class info : public book 
{
    public:
        void getdata()
        {
            book::getdata();
            book::isOveersize();
        }
        void putdata()
        {
            book::putdata();
        }
        
};
//////////////////////////////////////
class info2 : public type 
{
    public:
        void getdata()
        {
            type::getdata();
            type::isOveersize();
        }
        void putdata()
        {
            type::putdata();
        }
        
};
//////////////////////////////////////
int main(int argc, char** argv)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    publication* ppub[100];
    char ch;
    int n = 0;
 
        do
    {
        cout << "\n Вводим данные для книги или плёнки (к / п)";
        cin >> ch;
        if(ch=='к')
        {
            ppub[n] = new info;
        }
        else
        {
            ppub[n] = new info2;
        }
        ppub[n++]->getdata();
        cout << "\n Продолжить? ( д / н )";
        cin >> ch;       
    }
    while(ch!='н');
    for(int j = 0; j < n; j++)
    {
        ppub[j]->putdata();
        
    } 
    cout << endl; 
    system("pause");
    return 0;
}


Наверное это самый примитивный способ решения данной проблемы
LittleMonkey
1 / 1 / 0
Регистрация: 20.04.2014
Сообщений: 140
05.05.2015, 19:31     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #237
Recrut_rf,
Спасибо большое!!

Очень выручили!
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,888
Записей в блоге: 1
Завершенные тесты: 1
10.05.2015, 11:58     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #238
Привет всем, меня очень долго не было, вот глава 13, но скажу сразу, что алгоритм деления у меня крайне неэффектиный (лень было писать алгоритм деления в столбик), писать прогу очень не хотелось, но все же поборол себя.
Глава 13

Verylong.cpp

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
#include "verylong.h"
 
void verylong::putvl() const
{
    char temp[SZ];
    strcpy(temp, vlstr);
    if (!sign) cout << '-';
    cout << strrev(temp);
}
 
void verylong::getvl()
{
    cin >> vlstr;
    if (*vlstr != '-')
        sign = 1;
    else
    {
        sign = 0;
        int i(1);
        for (; i <= strlen(vlstr); i++)
            vlstr[i - 1] = vlstr[i];
    }
    for (int i(0), z(i); i < strlen(vlstr); i++)
    {
        z = vlstr[i] != '0' ? 1 : 0;
        i = z ? strlen(vlstr) : i;
        if (!(strlen(vlstr) - i - 1)) vlstr[1] = 0;
    }
    if (*vlstr == '0' && strlen(vlstr) > 1)
    {
        char temp[SZ];
        int i(0), j(0);
        for (; i < strlen(vlstr);)
        if (vlstr[i] == '0') i++; else break;
        for (; i < strlen(vlstr);)
            temp[j++] = vlstr[i++];
        temp[j] = 0;
        strcpy(vlstr, temp);
    }
    vlen = strlen(vlstr);
    strrev(vlstr);
    sign = *vlstr == '0' && vlen == 1 ? 1 : sign;
}
 
verylong verylong::operator+(const verylong v)
{
    if (!sign && !v.sign)
    {
        verylong s1(*this);
        s1.sign = 1;
        return verylong(v) - s1;
    }
    if (sign != v.sign)
    {
        verylong s1;
        s1 = *this;
        if (!sign)
        {
            s1.sign = 1;
        }
        else
        {
            s1.sign = 0;
        }
        return verylong(v) - s1;
    }
    char temp[SZ];
    int j;
    int maxlen = (vlen > v.vlen) ? vlen : v.vlen;
    int carry(0);
    for (j = 0; j < maxlen; j++)
    {
        int d1 = (j > vlen - 1) ? 0 : vlstr[j] - '0';
        int d2 = (j > v.vlen - 1) ? 0 : v.vlstr[j] - '0';
        int digitsum = d1 + d2 + carry;
        if (digitsum > 9)
        {
            digitsum -= 10; carry = 1;
        }
        else
            carry = 0;
        temp[j] = digitsum + '0';
    }
    if (carry) temp[j++] = '1';
    temp[j] = 0;
    return verylong(temp);
}
 
verylong verylong::operator-(const verylong v)
{
    if (!sign && !v.sign)
    {
        if (!bigger(vlstr, v.vlstr)) return verylong("0");
        verylong sub, t1(*this), t2(v);
        t1.sign = 1; t2.sign = 1;
        if (bigger(vlstr, v.vlstr) > 0) sub.sign = 0;
        return sub = t2 - t1;
    }
    if (bigger(vlstr, v.vlstr) < 0 && sign && v.sign)
    {
        verylong sub(verylong(v) - *this);
        sub.sign = 0;
        return sub;
    }
    if (sign != v.sign)
    {
        if (!sign && v.sign)
        {
            verylong t1(*this);
            t1.sign = 1;
            t1 = t1 + v;
            t1.sign = 0;
            return t1;
        }
        else
        {
            verylong t1(v);
            t1.sign = 1;
            return *this + t1;
        }
    }
    char temp[SZ];
    int i(0), carry(i);
    for (; i < vlen; i++)
    {
        int d1 = !carry ? vlstr[i] - '0' : (vlstr[i] - '0') - 1;
        int d2 = v.vlstr[i] >= '0' && v.vlstr[i] <= '9' ? v.vlstr[i] - '0' : 0;
        int digitsub;
        if (d1 >= d2)
        {
            digitsub = d1 - d2; carry = 0;
        }
        else
        {
            digitsub = d1 + 10 - d2; carry = 1;
        }
        temp[i] = digitsub + '0';
    }
    temp[i] = 0;
    strrev(temp);
    for (int i(0), z(i); i < strlen(temp); i++)
    {
        z = temp[i] != '0' ? 1 : 0;
        i = z ? strlen(temp) : i;
        if (!(strlen(temp) - i - 1)) temp[1] = 0;
    }
    if (*temp == '0' && strlen(temp) > 1)
    {
        char temp1[SZ];
        int i(0), j(0);
        for (; i < strlen(temp);)
        if (temp[i] == '0') i++; else break;
        for (; i < strlen(temp);)
            temp1[j++] = temp[i++];
        temp1[j] = 0;
        strcpy(temp, temp1);
    }
    strrev(temp);
    verylong pf(temp);
    pf.sign = this->sign;
    return verylong(pf);
}
 
verylong verylong::operator/(const verylong v)
{
    if (*vlstr == '0' && vlen == 1)
        return verylong("0");
    if (bigger(vlstr, v.vlstr) < 0)
        return verylong("0");
    if (*v.vlstr == '0' && v.vlen == 1)
        return verylong("акбишО");
    verylong sum(*this), g(v), i, one("1");
    sum.sign = 1; g.sign = 1;
    while (bigger(sum.vlstr, v.vlstr) >= 0)
    {
        sum = sum - g;
        i = i + one;
    }
    i.sign = !sign && v.sign || sign && !v.sign ? 0 : 1;
    return verylong(i);
}
 
verylong verylong::operator*(const verylong v)
{
    verylong pprod;
    verylong tempsum;
    for (int j(0); j < v.vlen; j++)
    {
        pprod = this->multdigit(v.vlstr[j] - '0');
        for (int k(0); k < j; k++)
            pprod = this->mult10(pprod);
        tempsum = tempsum + pprod;
    }
    tempsum.sign = !sign && v.sign || sign && !v.sign ? 0 : 1;
    if (*tempsum.vlstr == '0' && tempsum.vlen == 1) tempsum.sign = 1;
    return tempsum;
}
 
verylong verylong::mult10(const verylong v) const
{
    char temp[SZ];
    for (int j(v.vlen - 1); j >= 0; j--)
        temp[j + 1] = v.vlstr[j];
    temp[0] = '0';
    temp[v.vlen + 1] = 0;
    return verylong(temp);
}
 
verylong verylong::multdigit(const int d2) const
{
    char temp[SZ];
    int j, carry(0);
    for (j = 0; j < vlen; j++)
    {
        int d1(vlstr[j] - '0');
        int digitprod(d1 * d2 + carry);
        if (digitprod > 9)
        {
            carry = digitprod / 10;
            digitprod %= 10;
        }
        else
            carry = 0;
        temp[j] = digitprod + '0';
    }
    if (carry) temp[j++] = carry + '0';
    temp[j] = 0;
    return verylong(temp);
}
 
int bigger(const char* s1, const char* s2)
{
    char str1[SZ], str2[SZ];
    strcpy(str1, s1); strcpy(str2, s2);
    strrev(str1); strrev(str2);
    if (strlen(str1) > strlen(str2)) return 1;
    else if (strlen(str1) < strlen(str2)) return -1;
    else for (int i(0); i < strlen(str1);)
    {
        if (str1[i] - '0' > str2[i] - '0') return 1;
        else if (str1[i] - '0' < str2[i] - '0') return -1;
        else i++;
    }
    return 0;
}

Verylong.h

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
#include <iostream>
#include <stdlib.h>
using namespace std;
 
const int SZ = 1000;
 
class verylong
{
    char vlstr[SZ];
    int vlen;
    bool sign;
    verylong multdigit(const int) const;
    verylong mult10(const verylong) const;
public:
    verylong() : vlen(0), sign(1)
    {
        *vlstr = 0;
    }
    verylong(const char s[SZ])
    {
        strcpy(vlstr, s);
        vlen = strlen(s);
    }
    verylong(const unsigned long n)
    {
        ltoa(n, vlstr, 10);
        strrev(vlstr);
        vlen = strlen(vlstr);
    }
    void putvl() const;
    void getvl();
    verylong operator+(const verylong);
    verylong operator-(const verylong);
    verylong operator*(const verylong);
    verylong operator/(const verylong);
};
 
int bigger(const char*, const char*);

main.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "verylong.h"
#include <windows.h>
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    verylong v1, v2, v3;
    v1.getvl();
    v2.getvl();
    v3 = v1 - v2;
    v3.putvl();
    cout << endl;
    system("pause");
    return 0;
}

Recrut_rf
6 / 6 / 0
Регистрация: 14.10.2014
Сообщений: 44
Завершенные тесты: 2
11.05.2015, 00:12     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #239
Ferrari F1, Очень хорошо ... я твой код частенько просматриваю и скажу честно - без него некоторые задачи задолбался бы решать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2015, 12:50     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Еще ссылки по теме:

Объектно-ориентированное программирование C++
Разобраться в примерх к книге Лафоре "Обьектно-ориентированое программирование в С++" C++
C++ Объектно-ориентированное приложение: "Эмулятор банкомата"

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

Или воспользуйтесь поиском по форуму:
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,888
Записей в блоге: 1
Завершенные тесты: 1
11.05.2015, 12:50     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++" #240
Глава 14


Номер 1

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
#include <iostream>
#include <iomanip>
#include <windows.h>
using namespace std;
 
template <class atype>
double gcd(atype* array, int size)
{
    double sum(0);
    for (int i(0); i < size; i++)
        sum += array[i];
    return sum / size;
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    double array1[] = { 1, 2, 3, 4 };
    long array2[] = { 1, 2, 3, 4 };
    short array3[] = { 1, 2, 3, 4 };
    char array4[] = { 1, 2, 3, 4 };
    cout << gcd(array1, 4) << endl
        << gcd(array2, 4) << endl
        << gcd(array3, 4) << endl
        << gcd(array4, 4) << endl;
    system("pause");
    return 0;
}


Номер 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
61
62
63
64
#include <iostream>
#include <iomanip>
#include <windows.h>
using namespace std;
 
template <class type>
class queue
{
    enum { MAX = 10 };
    type st[MAX];
    int head, tail;
public:
    queue() : head(0), tail(0)
    {}
    void put(type var);
    void get();
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    queue<double> s1;
    s1.put(11.);
    s1.put(22.);
    s1.put(33.);
    s1.put(44.);
    s1.put(55.);
    s1.put(66.);
    cout.setf(ios::showpoint);
    cout << "1: "; s1.get();
    cout << "2: "; s1.get();
    cout << "3: "; s1.get();
    cout << "4: "; s1.get();
    cout << "5: "; s1.get();
    cout << "6: "; s1.get();
    system("pause");
    return 0;
}
 
template <class type>
void queue<type>::get()
{
    if (!tail)
        cout << "Очередь пуста." << endl;
    else
    {
        cout << st[head] << endl;
        for (int i(0); i <= tail; i++)
            st[i] = st[i + 1];
        tail--;
    }
}
 
template <class type>
void queue<type>::put(type var)
{
    if (tail == MAX)
        cout << "\nОчередь переполнена." << endl;
    else
    {
        st[tail++] = var;
    }
}


Номер 3

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
#include <iostream>
#include <iomanip>
#include <windows.h>
using namespace std;
 
template <class type>
class queue
{
    enum { MAX = 10 };
    type st[MAX];
    int head, tail;
public:
    class flow
    {};
    queue() : head(0), tail(0)
    {}
    void put(type var);
    void get();
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char ch;
    queue<double> s1;
    do
    {
        try
        {
            double temp;
            cout << "Положить(1) или взять(2) из очереди элемент? ";
            cin >> ch;
            switch (ch)
            {
            case '1':
                cout << "Введите элемент для вставки: ";
                cin >> temp;
                s1.put(temp);
                break;
            case '2':
                s1.get();
                break;
            default:
                cout << "Введена неверная цифра. ";
            }
            cout << "Повторить ввод? (1 - да, 0 - нет.) ";
            cin >> ch;
            system("cls");
        }
        catch (queue<double>::flow)
        {
            system("cls");
            cout << "Очередь пуста или переполнена." << endl;
        }
    } while (ch != '0');
    system("pause");
    return 0;
}
 
template <class type>
void queue<type>::get()
{
    if (!tail)
        throw flow();
    else
    {
        cout << st[head] << endl;
        for (int i(0); i <= tail; i++)
            st[i] = st[i + 1];
        tail--;
    }
}
 
template <class type>
void queue<type>::put(type var)
{
    if (tail == MAX)
        throw flow();
    else
    {
        st[tail++] = var;
    }
}


Номер 4

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
#include <iostream>
#include <iomanip>
#include <windows.h>
using namespace std;
 
template <class atype>
void swaps(atype& a1, atype& a2)
{
    atype temp(a1);
    a1 = a2;
    a2 = temp;
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    double a(1), b(2);
    cout << a << ' ' << b << endl;
    swaps(a, b);
    cout << a << ' ' << b << endl;
    system("pause");
    return 0;
}


Номер 5

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <iomanip>
#include <windows.h>
using namespace std;
 
template <class atype, class btype>
atype amax(atype* arr, btype size)
{
    atype armax(0);
    for (btype i(0); i < size; i++)
        armax = arr[i] > armax ? arr[i] : armax;
    return armax;
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    double array[] = { 1, 3, 5, 7, 9, 0, 2, 5, 9 };
    cout << amax(array, 9) << endl;
    system("pause");
    return 0;
}


Номер 6

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
#include <iostream>
#include <iomanip>
#include <windows.h>
#include <process.h>
using namespace std;
 
const int LIMIT = 100;
 
template <class type>
class safearray
{
    type arr[LIMIT];
public:
    type& operator[](int n)
    {
        if (n < 0 || n >= LIMIT)
        {
            cout << "\nОшибочный индекс!"; exit(1);
        }
        return arr[n];
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    safearray<double> sa1;
    cout.setf(ios::showpoint);
    for (int j = 0; j < LIMIT; j++)
        sa1[j] = j * 10;
    for (int j = 0; j < LIMIT; j++)
    {
        double temp = sa1[j];
        cout << "Элемент " << j << " равен " << temp << endl;
    }
    cout.unsetf(ios::showpoint);
    safearray<int> sa2;
    for (int j = 0; j < LIMIT; j++)
        sa2[j] = j * 10;
    for (int j = 0; j < LIMIT; j++)
    {
        int temp = sa2[j];
        cout << "Элемент " << j << " равен " << temp << endl;
    }
    system("pause");
    return 0;
}


Номер 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
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
#include <iostream>
#include <iomanip>
#include <windows.h>
#include <conio.h>
using namespace std;
 
template <class type>
class fraction
{
    type a, b;
public:
    fraction() : a(0), b(1)
    {}
    fraction(type c, type 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)
    {
        type 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;
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    for (char ch('z'); ch != '0'; ch = getche())
    {
        if (ch != 'z') cout << '\n' << endl;
        fraction<short> t1, t2, t3, zero;
        cout << "Введите первую дробь:" << endl;
        t1.set();
        cout << "Введите вторую дробь:" << endl;
        t2.set();
        if (t1 == zero)
        {
            cout << "Неверная дробь!" << endl;
            ch = 0;
        }
        else
        {
            cout << "Введите операцию:" << endl;
            cin >> ch;
        }
        switch (ch)
        {
        case '+':
            t3 = t1 + t2; t3.lowterms();
            cout << "Результат равен:\n"; t3.show();
            break;
        case '-':
            t3 = t1 - t2; t3.lowterms();
            cout << "Результат равен:\n"; t3.show();
            break;
        case '*':
            t3 = t1 * t2; t3.lowterms();
            cout << "Результат равен:\n"; t3.show();
            break;
        case '/':
            t3 = t1 / t2; t3.lowterms();
            cout << "Результат равен:\n"; t3.show();
            break;
        default: cout << "Ошибка!" << endl;
        }
        cout << "Повторить? (1 - да. 0 - нет.) ";
    }
    cout << '\n' << endl;
    system("pause");
    return 0;
}


Номер 8

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
#include <iostream>
#include <iomanip>
#include <windows.h>
using namespace std;
 
const int LIMIT = 10;
 
template <class type>
class safearray
{
    type arr[LIMIT];
public:
    class flow
    {};
    type& operator[](int n)
    {
        if (n < 0 || n >= LIMIT) throw flow();
        return arr[n];
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    safearray<double> sa1;
    cout.setf(ios::showpoint);
    try
    {
        for (int j = 0; j < 10; j++)
            sa1[j] = j * 10;
        for (int j = 0; j < 10; j++)
        {
            double temp = sa1[j];
            cout << "Элемент " << j << " равен " << temp << endl;
        }
    }
    catch (safearray<double>::flow)
    {
        cout << "Возникла ошибка!" << endl;
    }
    cout.unsetf(ios::showpoint);
    cout.put('\n');
    safearray<int> sa2;
    try
    {
        for (int j = 0; j < 10; j++)
            sa2[j] = j * 10;
        for (int j = 0; j < 10; j++)
        {
            int temp = sa2[j];
            cout << "Элемент " << j << " равен " << temp << endl;
        }
    }
    catch (safearray<int>::flow)
    {
        cout << "Возникла ошибка!" << endl;
    }
    cout.put('\n');
    system("pause");
    return 0;
}


Номер 9

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
#include <iostream>
#include <iomanip>
#include <windows.h>
using namespace std;
 
const int LIMIT = 9;
 
template <class type>
class safearray
{
    type arr[LIMIT];
public:
    class flow
    {
    public:
        long pos;
        flow(long p) : pos(p)
        {}
    };
    type& operator[](int n)
    {
        if (n < 0 || n >= LIMIT) throw flow(n);
        return arr[n];
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    safearray<double> sa1;
    cout.setf(ios::showpoint);
    try
    {
        for (int j = 0; j < 10; j++)
            sa1[j] = j * 10;
        for (int j = 0; j < 10; j++)
        {
            double temp = sa1[j];
            cout << "Элемент " << j << " равен " << temp << endl;
        }
    }
    catch (safearray<double>::flow f)
    {
        cout << "Возникла ошибка!" << endl;
        cout << "Виновник - элемент с индексом: " << f.pos << endl;
    }
    cout.unsetf(ios::showpoint);
    cout.put('\n');
    safearray<int> sa2;
    try
    {
        for (int j = 0; j < 10; j++)
            sa2[j] = j * 10;
        for (int j = 0; j < 10; j++)
        {
            int temp = sa2[j];
            cout << "Элемент " << j << " равен " << temp << endl;
        }
    }
    catch (safearray<int>::flow g)
    {
        cout << "Возникла ошибка!" << endl;
        cout << "Виновник - элемент с индексом: " << g.pos << endl;
    }
    cout.put('\n');
    system("pause");
    return 0;
}


Номер 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
#include <iostream>
#include <iomanip>
#include <string>
#include <windows.h>
#include <cstdlib>
using namespace std;
 
int isFeet(string);
 
class Distance
{
private:
    int feet;
    float inches;
public:
    class exp
    {
    public:
        string error;
        exp(string e) : error(e)
        {}
    };
    Distance()
    {
        feet = 0; inches = 0.0;
    }
    Distance(int ft, float in)
    {
        if (in >= 12)
            throw exp("Дюймы должны быть между 0.0 и 11.99\n");
        feet = ft; inches = in;
    }
    void showdist()
    {
        cout << feet << "\'-" << inches << '\"';
    }
    void getdist();
};
 
void Distance::getdist()
{
    string instr;
    while (true)
    {
        cout << "\n\nВведите футы: ";
        cin.unsetf(ios::skipws);
        cin >> instr;
        if (isFeet(instr))
        {
            cin.ignore(10, '\n');
            feet = atoi(instr.c_str());
            break;
        }
        cin.ignore(10, '\n');
        throw exp("Футы должны быть целыми < 1000\n");
    }
    while (true)
    {
        cout << "Введите дюймы: ";
        cin.unsetf(ios::skipws);
        cin >> inches;
        if (inches >= 12.0 || inches < 0.0)
        {
            throw exp("Дюймы должны быть между 0.0 и 11.99\n");
        }
        if (cin.good())
        {
            cin.ignore(10, '\n');
            break;
        }
    }
}
 
int isFeet(string str)
{
    int slen = str.size();
    if (slen == 0 || slen > 5)
        return 0;
    for (int j = 0; j < slen; j++)
    if ((str[j] < '0' || str[j] > '9') && str[j] != '-')
        return 0;
    double n = atof(str.c_str());
    if (n <-999.0 || n > 999.0)
        return 0;
    return 1;
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    Distance d;
    char ans;
    do
    {
        try
        {
            d.getdist();
            cout << "\nРасстояние = ";
            d.showdist();
        }
        catch (Distance::exp str)
        {
            cout << str.error << endl;
        }
        cout << "\nЕще раз (y/n)? ";
        cin >> ans;
        cin.ignore(10, '\n');
    } while (ans != 'n');
    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
#include <iostream>
#include <iomanip>
#include <string>
#include <windows.h>
#include <cstdlib>
using namespace std;
 
class String
{
private:
    enum { SZ = 80 };
    char str[SZ];
public:
    class flow
    {};
    class con
    {};
    String()
    {
        strcpy(str, "");
    }
    String(char s[])
    {
        if (strlen(s) > 256) throw con();
        strcpy(str, s);
    }
    void display() const
    {
        cout << str;
    }
    String operator+(String ss) const
    {
        String temp;
        if (strlen(str) + strlen(ss.str) < SZ)
        {
            strcpy(temp.str, str);
            strcat(temp.str, ss.str);
        }
        else
        {
            throw flow();
        }
        return temp;
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    try
    {
        String s1 = "\nС Рождеством! ";
        String s2 = "С Новым годом!";
        String s3;
        s1.display();
        s2.display();
        s3.display();
        s3 = s1 + s2;
        s3.display();
    }
    catch (String::flow)
    {
        cout << "Длинная инициализирующая строка!" << endl;
    }
    catch (String::con)
    {
        cout << "Переполнение строкового буфера!" << endl;
    }
    cout << 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
#include <iostream>
#include <fstream>
#include <iomanip>
#include <windows.h>
#include <process.h>
using namespace std;
 
const int MAX = 10;
int buff[MAX];
 
class dofile
{
    ofstream os;
    ifstream is;
    char* str;
public:
    class err
    {};
    dofile(char* s) : str(s)
    {}
    void write()
    {
        os.open(str, ios::trunc | ios::binary);
        if (!os) throw err();
        os.seekp(0, ios::beg);
        cout << "Идет запись...\n";
        os.write((char*)(buff), MAX * sizeof(int));
        if (!os) throw err();
        os.close();
    }
    void read()
    {
        is.open(str, ios::binary);
        if (!is) throw err();
        is.seekg(0, ios::beg);
        cout << "Идет чтение...\n";
        is.read((char*)(buff), MAX * sizeof(int));
        if (!is) throw err();
        is.close();
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    for (int j = 0; j < MAX; j++)
        buff[j] = j;
    try
    {
        dofile f1("data.txt");
        f1.write();
        f1.read();
    }
    catch (dofile::err)
    {
        cout << "Ошибка!" << endl;
    }
    for (int j = 0; j < MAX; j++)
    {
        cout << buff[j];
        cout.put(' ');
    }
    cout.put('\n');
    system("pause");
    return 0;
}


Yandex
Объявления
11.05.2015, 12:50     Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Ответ Создать тему
Опции темы

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