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

Задача из "ООП в C++" Р. Лафоре - C++

Восстановить пароль Регистрация
 
Purcell
 Аватар для Purcell
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
14.08.2013, 01:33     Задача из "ООП в C++" Р. Лафоре #1
Глава 3. Задача 11 (стр. 141 - 4-е издание, СПб, Питер, 2012).

Не слишком ли громоздкая конструкция у меня получилась для решения такой задачи? Есть ли ошибки? Как вам оформление и комментарии? Насколько полезны комментарии?

Автор учебника просил создать калькулятор, который умеет складывать и вычитать денежные суммы, выраженные в устаревшей денежной системе Великобритании, а также умножать такую сумму на вещественное число. Правда, я организовал другое взаимодействие с пользователем и добавил возможность чтения пользователем краткой инструкции. Автор просил подобную организацию:
Введите 1-й операнд, операцию и 2-й операнд: 20 + 4
Результат равен: 24
Продолжить вычисления (y/n) ? n

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
// 11.cpp
/* калькулятор, складывающий и вычитающий денежные суммы,
   выраженные в устаревшей денежной системе Великобритании,
   а также умножающий эти суммы на вещественные числа */
 
# include <iostream>
 
using namespace std;
 
int main()
{
    char ch;    // выбор пользователя продолжать работать с программой или выйти
    do          // цикл, пока пользователь не введёт 'n' (ch == 'n')
    {
        int first_pou, first_sch, first_pen;    // вводимые фунты, шиллинги и пенсы
        int second_pou, second_sch, second_pen;     // вводимые фунты, шиллинги и пенсы
        int last_pou, last_sch, last_pen;           // выводимые фунты, шиллинги и пенсы
        int temp;                                   // для временного хранения значений
        int choice;                       // для выбора пользователя одной из трёх функции программы
        float number;                           // число, на которое умножается сумма
        char point;                             // для "нейтрализации" вводимого символа точки
        cout << "Если нужно сложить две суммы, введите '1'. Если нужно вычесть ";
        cout << "одну сумму из другой, введите '2'. Если нужно умножить сумму ";
        cout << "на число, введите '3', для получения инструкции по использованию этой ";
        cout << "программы введите '4': ";
        cin >> choice;
        cout << endl;
        switch (choice)    // выбор функции программы
        {
            case (1):      // 1-я функция: сложение 2-х сумм
                cout << "Введите 1-ю сумму: ВЈ";
                cin >> first_pou >> point >> first_sch >> point >> first_pen;
                cout << "Введите 2-ю сумму: ВЈ";
                cin >> second_pou >> point >> second_sch >> point >> second_pen;
                last_pou = first_pou + second_pou;
                last_sch = first_sch + second_sch;
                last_pen = first_pen + second_pen;
                if (last_pen > 11)    // если пенсов больше, чем 1 шиллинг (1 шиллинг = 12 пенсов),
                {                     // то лишнее переводится в шиллинги
                    last_sch = last_sch + (last_pen / 12);
                    if (last_pen % 12 == 0)
                    {
                        last_pen = 0;
                    }
                    else
                    {
                        last_pen = last_pen - 12;
                    }
                }
                if (last_sch > 19)    // если шиллингов больше, чем 1 фунт (1 фунт = 20 шиллингам),
                {                     // то лишнее переводится в фунты
                    last_pou = last_pou + (last_sch / 20);
                    if (last_sch % 20 == 0)
                    {
                        last_sch = 0;
                    }
                    else
                    {
                        last_sch = last_sch - 20;
                    }
                }
                cout << "Всего: ВЈ" << last_pou << "."
                << last_sch << "." << last_pen << endl;
                break;
            case (2):    // 2-я функция: вычитание одной суммы из другой
                cout << "Введите 1-ю сумму: ВЈ";
                cin >> first_pou >> point >> first_sch >> point >> first_pen;
                cout << "Введите 2-ю сумму: ВЈ";
                cin >> second_pou >> point >> second_sch >> point >> second_pen;
                last_pen = first_pen - second_pen;
                if (last_pen > 11)    // если пенсов больше, чем 1 шиллинг (1 шиллинг = 12 пенсов),
                {                     // то лишнее переводится в шиллинги
                    temp = last_pen / 12;
            for (int i = 0; i < temp; i++)
                    {
                        last_pen = last_pen - 12;
                    }
                    last_sch = first_sch - second_sch + temp;
                }
                else if (last_pen < 0)    // если количество пенсов оказалось меньше нуля, то
                {                         // необходимо вычесть соответстующее количество шиллингов
                    last_pen = 0 - last_pen;
                    if (last_pen < 12)    // если пенсов от -11 до 0, то вычитается всего лишь
                    {                     // 1 шиллинг
                        temp = 1;
                    }
                    else                  // если пенсов от меньше -11, то вычисляется количество
                    {                     // шиллингов, которые необходимо вычесть
                        temp = last_pen / 12 + 1;
                        for (int i = 1; i < temp; i++)
                        {
                            last_pen = last_pen - 12;
                        }
                    }
                    if (last_pen == 0)                 // вычисление итогового количества пенсов
                    {
                        temp--;
                    }
                    else
                    {
                        last_pen = 12 - last_pen;
                    }
                    last_sch = first_sch - second_sch - temp; // и шиллингов
                }
                else                                      // если вышеперечисленные условия
                {                                         // не соблюдены, то вычисление количества
                    last_sch = first_sch - second_sch;    // шиллингов является простой задачей
                }
                if (last_sch > 19) // если шиллингов больше, чем 1 фунт, или равно 1 фунтy
                {                  // (1 фунт = 20 шиллингов), то лишнее переводится в фунты
                    temp = last_sch / 20;
                    for (int i = 0; i < temp; i++)
                    {
                        last_sch = last_sch - 20;
                    }
                    last_pou = first_pou - second_pou + temp;
                }
                else if (last_sch < 0)    // если количество шиллингов оказалось меньше нуля,
                {                         // то необходимо вычесть соответствующее количество фунтов
                    last_sch = 0 - last_sch;
                    if (last_sch < 19)    // если шиллингов от -19 до 0,
                    {                     // вычитается всего лишь 1 шиллинг
                        temp = 1;
                    }
                    else                  // если шиллингов меньше -19, то вычисляется количество
                    {                     // фунтов, которое необходимо вычесть
                        temp = last_sch / 20 + 1;
                        for (int i = 1; i < temp; i++)
                        {
                            last_sch = last_sch - 20;
                        }
                    }
                    if (last_sch == 0)             // вычисление итогового количества шиллингов
                    {
                        temp--;
                    }
                    else
                    {
                        last_sch = 20 - last_sch;
                    }
                    last_pou = first_pou - second_pou - temp; // и фунтов
                }
                else                                 // если вышеперечисленные условия не соблюдены,
                {                                     // то вычисление количества фунтов является
                    last_pou = first_pou - second_pou; // простой задачей
                }
                cout << "Всего: ВЈ" << last_pou << "."
                << last_sch << "." << last_pen << endl;
                break;
            case (3):    // 3-я функция: умножение суммы на вещественное число
                cout << "Введите сумму: ВЈ";
                cin >> first_pou >> point >> first_sch >> point >> first_pen;
                cout << "Введите число, на которое необходимо умножить сумму: ";
                cin >> number;
                last_pou = first_pou * number;
                last_sch = first_sch * number;
                last_pen = first_pen * number;    
                if (last_pen > 11) // если пенсов больше, чем 1 шиллинг (1 шиллинг = 12 пенсов),
                {                   // то лишнее переводится в шиллинги
                    temp = last_pen / 12;
                    last_sch = last_sch + temp;
                    for (int i = 0; i < temp; i++)
                    {
                        last_pen = last_pen - 12;
                    }
                }
                if (last_sch > 19)    // если шиллингов больше, чем фунтов (1 фунт = 20 шиллингам),
                {                     // то лишнее переводится в фунты
                    temp = last_sch / 20;
                    last_pou = last_pou + temp;
                    for (int i = 0; i < temp; i++)
                    {
                        last_sch = last_sch - 20;
                    }
                }
                cout << "Всего: ВЈ" << last_pou << "."
                << last_sch << "." << last_pen << endl;
                break;
            case (4):
                cout << "Устаревшая денежная система Великобритании выглядит следующим ";
                cout << "образом: 1 фунт = 20 шиллингов, 1 шиллинг = 12 пенсов. Вводите";
                cout << " сумму сразу после символа фунта и разделяйте фунты, шиллинги и ";
                cout << "пенсы точками без пробелов. Это должно выглядеть вот так: ";
                cout << "'ВЈ10.4.11' или 'ВЈ3.0.5'. Даже если какой-то элемент из данной ";
                cout << "денежной системы отсутствует, его отсутствие необходимо обозначить ";
                cout << " числом '0': 'ВЈ0.2.9' или 'ВЈ194.18.0'. При умножении суммы ";
                cout << "на число, вводите это число так, как если бы вы вводили его на ";
                cout << "обычном калькуляторе.\n";
                break;
            default:
                cout << "Ошибка! Вы ввели недопустимое значение\n";
        }
        cout << "\nЖелаете продолжить работу с программой (y/n)? ";
        cin >> ch;
        cout << endl;
    }
    while (ch != 'n');
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2013, 01:33     Задача из "ООП в C++" Р. Лафоре
Посмотрите здесь:

Ищу ответы на задания из книги Лафоре Р. "Объектно-ориентированное программирование в С++" 4 издание. C++
C++ Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
C++ Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ")
C++ Через ООП: Дать для числа наименование: "рубль", "рубля", "рублей";
C++ Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TimeToWork
4 / 4 / 0
Регистрация: 13.04.2013
Сообщений: 25
14.08.2013, 04:48     Задача из "ООП в C++" Р. Лафоре #2
1) Хотелось бы видеть объединение фунтов-шиллингов-пенсов в один тип под названием "АнглийскиеДеньги". И создание 3 переменных данного типа. Вот такое
C++
1
2
3
int first_pou, first_sch, first_pen;    // вводимые фунты, шиллинги и пенсы
int second_pou, second_sch, second_pen;     // вводимые фунты, шиллинги и пенсы
int last_pou, last_sch, last_pen;           // выводимые фунты, шиллинги и пенсы
выглядит очень некрасиво.

2) У пользователя должна быть возможность ввести только пенсы либо только шиллинги и пенсы. Мы ведь не говорим в реальной жизни "Сколько будет 7 гривен 17 коппек + 0 гривен 5 копеек?". Желательно чуток улучшить механизм ввода.
3) Судя по названию книги "ООП в C++" и номеру страницы (141) уже вероятно начали щупать работу с классами. Если так, то должен быть класс "АнглийскиеДеньги" с набором функций - возможных операций.
В этом случае вводимая пользователем информация должна быть вида
17.5.5+2.2.2
4) Даже если до классов ещё не дошли от этого
switch (choice)
нужно отказаться - у вас операции + и - занимают по 30 строк каждая. Попробуйте переводить деньги в пенсы и делать операции над ними.

Сам эту книгу не читал, поэтому могу ошибаться - может там 130 страниц введения и данная задача призвана лишь для фиксации в голове ученика знаний о существовании не только 10тичной системы исчисления.
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
14.08.2013, 19:57     Задача из "ООП в C++" Р. Лафоре #3
Цитата Сообщение от Purcell Посмотреть сообщение
Не слишком ли громоздкая конструкция у меня получилась для решения такой задачи?
Вроде это задание.

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
int a, b, c, e, f, x, y, z;
    double d, x1, y1, z1;
    char si;
    do {
        cout <<"Введите первое число, знак операции, второе число: "; cin >>a >>b >>c >>si >>d >>e >>f;
        //при умножении ввод выглядит так: 1 3 7 * 2.856 0 0
        switch (si)
            {
                case '+': x=a+d; y=b+e; z=c+f;
                    if (z>11) {++y; z%=12;}//если пенсов больше 11, то прибавляем к кол-ву шиллингов +1 и пенсы кратны 12
                    if (y>19) {++x; y%=20;}//если шиллингов больше 19, то фунтам прибавляем +1, а шиллинги кратно 12
                    break;
                case '-': x=a-d; y=b-e; z=c-f;
                    if (z<0) {--y; z+=12;}//если пенсов меньше 0, то вычитаем из шиллингов 1, а пенсы приводим к положительному числу прибавляя 12
                    if (y<0) {--x; y+=20;}//если шиллингов меньше 0, то вычитаем из фунтов 1, а шиллинги приводим к положительному числу прибавив 20
                    break;
                case '*': x1=a*d; y1=b*d; z1=c*d;
                    x=static_cast<int>(x1); y=static_cast<int>(y1); z=static_cast<int>(z1);
                    if (z>11) {y+=(z/12); z%=12;}//если пенсов больше 11, то получаем количество +шиллингов(z/12), далее к шиллингами прибавляем +шиллинги, и пенсы кратны 12
                    if (y>19) {x+=(y1/20); y%=20;}//если шиллингов больше 19, то получаем кол-во +фунтов(y/20), далее к фунтам прибавляем +фунты и шиллинги кратны 20
                    break;
            }
        cout <<x <<"." <<y <<"." <<z <<endl;
        cout <<"Еще раз? (y/n)" <<endl;
    } while ((si=_getche())!='n');
Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
Purcell
 Аватар для Purcell
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
15.08.2013, 12:21  [ТС]     Задача из "ООП в C++" Р. Лафоре #4
Цитата Сообщение от TimeToWork Посмотреть сообщение
3) Судя по названию книги "ООП в C++" и номеру страницы (141) уже вероятно начали щупать работу с классами.
Пока ещё нет. Это задача для закрепления 3 главы, которая посвящена циклам и ветвлениям. А уже в следующей главе речь идёт от структурах и перечислениях, в 5-й - о функциях, в 6-й - об объектах и классах. Когда эти главы пройду, я усовершенствую эту программку, как вы мне советуете. Тем более, наверняка автор книги попросит сделать то же самое: уже заметил, что после каждой главы необходимо приводить решение старой задачи в соответствие с только что пройденной темой.

Цитата Сообщение от TimeToWork Посмотреть сообщение
2) У пользователя должна быть возможность ввести только пенсы либо только шиллинги и пенсы. Мы ведь не говорим в реальной жизни "Сколько будет 7 гривен 17 коппек + 0 гривен 5 копеек?". Желательно чуток улучшить механизм ввода.
Как это сделать, пока не могу сообразить или ещё не знаю подходящих для решения этой задачи возможностей C++.

Цитата Сообщение от TimeToWork Посмотреть сообщение
4) Даже если до классов ещё не дошли от этого
switch (choice)
нужно отказаться - у вас операции + и - занимают по 30 строк каждая. Попробуйте переводить деньги в пенсы и делать операции над ними.
Действительно, используя перевод всех сумм в пенсы для операций над ними, код стал менее объёмным, а жизнь проще Правда, от оператора switch не смог отказаться.

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
// 11.cpp
/* калькулятор, складывающий и вычитающий денежные суммы,
   выраженные в устаревшей денежной системе Великобритании,
   а также умножающий эти суммы на вещественные числа */
 
# include <iostream>
 
using namespace std;
 
int main()
{
    char ch;    // выбор пользователя продолжать работать с программой или выйти
    int first_pou, first_sch, first_pen;    // вводимые фунты, шиллинги и пенсы
    int second_pou, second_sch, second_pen;     // вводимые фунты, шиллинги и пенсы
    int last_pou, last_sch, last_pen;           // выводимые фунты, шиллинги и пенсы
    int oper;                                   // выбор функции программы
    float number;                           // число, на которое умножается сумма
    do          // цикл, пока пользователь не введёт 'n' (ch == 'n')
    {
        cout << "Если нужно сложить две суммы, введите '1'. Если нужно вычесть ";
        cout << "одну сумму из другой, введите '2'. Если нужно умножить сумму ";
        cout << "на число, введите '3', для получения инструкции по использованию этой ";
        cout << "программы введите '4': ";
        cin >> oper;
        cout << endl;
        switch (oper)
        {
            case (1):                          // сложение 2-х сумм
                cout << "Введите 1-ю сумму: ";
                cin >> first_pou >> first_sch >> first_pen;
                cout << "Введите 2-ю сумму: ";
                cin >> second_pou >> second_sch >> second_pen;
                last_pen = first_pen + second_pen + (first_sch + second_sch) * 12 +
                (first_pou + second_pou) * 240;
                last_pou = last_pen / 240;
                last_sch = (last_pen - last_pou * 240) / 12;
                last_pen = (last_pen - last_pou * 240) - last_sch * 12;
                cout << "Результат: ВЈ" << last_pou << "." << last_sch << "." << last_pen << endl;
                break;
            case (2):                         // вычитание одной суммы из другой
                cout << "Введите 1-ю сумму: ";
                cin >> first_pou >> first_sch >> first_pen;
                cout << "Введите 2-ю сумму: ";
                cin >> second_pou >> second_sch >> second_pen;
                last_pen = first_pen - second_pen + (first_sch - second_sch) * 12 +
                (first_pou - second_pou) * 240;
                last_pou = last_pen / 240;
                last_sch = (last_pen - last_pou * 240) / 12;
                last_pen = (last_pen - last_pou * 240) - last_sch * 12;
                cout << "Результат: ВЈ" << last_pou << "." << last_sch << "." << last_pen << endl;
                break;
            case (3):                         // умножение суммы на число
                cout << "Введите сумму: ";
                cin >> first_pou >> first_sch >> first_pen;
                cout << "Введите число: ";
                cin >> number;
                last_pen = first_pen + first_sch * 12 + first_pou * 240;
                last_pen *= number;
                last_pou = last_pen / 240;
                last_sch = (last_pen - last_pou * 240) / 12;
                last_pen = (last_pen - last_pou * 240) - last_sch * 12;
                cout << "Результат: ВЈ" << last_pou << "." << last_sch << "." << last_pen << endl;
                break;
            case (4):                         // инструкция
                cout << "Устаревшая денежная система Великобритании выглядит следующим ";
                cout << "образом: 1 фунт = 20 шиллингов, 1 шиллинг = 12 пенсов. Вводите";
                cout << " сумму, разделяя фунты, шиллинги и пенсы пробелами: '7 12 3'.";
                cout << " Даже если какой-то элемент из данной денежной системы отсутствует, его ";
                cout << "отсутствие необходимо обозначить числом '0': '0 2 9' или '194 18 0'." << endl;
                break;
            default:
                cout << "Ошибка! Вы ввели недопустимое значение\n";
        }
        cout << "Желаете продолжить? (y/n) ";
        cin >> ch;
    }
    while (ch != 'n');
    return 0;
}
Спасибо, вам, за конструктивную критику.

Добавлено через 10 минут
Цитата Сообщение от Kins Посмотреть сообщение
Вроде это задание.
Спасибо Оно самое. Только вот в данном решении есть недостаток. Например, при сложении сумм, если пенсов больше 11, то этот код прибавляет только 1 шиллинг. А что будет если сумма пенсов будет больше 23? Тогда программа выдаст 3.4.34 или 0.8.29. Мне кажется, было бы лучше, если бы программа переводила лишние пенсы в шиллинги. Аналогично с шиллингами и вычитанием.
reisal78
15.08.2013, 16:56
  #5

Не по теме:

Привет, я тоже учусь по этой книге, на данный момент я сижу в 7й главе. Если есть желание разбираться вместе, жду скайп в личку

Purcell
 Аватар для Purcell
0 / 0 / 0
Регистрация: 14.08.2013
Сообщений: 20
16.08.2013, 14:30  [ТС]     Задача из "ООП в C++" Р. Лафоре #6
Цитата Сообщение от reisal78 Посмотреть сообщение

Не по теме:

Привет, я тоже учусь по этой книге, на данный момент я сижу в 7й главе. Если есть желание разбираться вместе, жду скайп в личку

Хорошо Правда, я не c Windows и не с компиляторами Microsoft и Bordland прохожу эту книгу. А с компилятором gcc и Linux. Сейчас в меня могут полететь камни, но при беглом перелистывании книги я обнаружил немного специфических вещей для Windows (в основном общие основы). Дальше, конечно, я буду двигаться в сторону программирования под Linux. И ещё: я не знаю насколько быстро буду проходить эту книгу, т.к. параллельно я изучаю Linux, а как пройду функции и классы из Лафоре, возьмусь параллельно изучать Linux API (уже нашёл материал).
А скайп чуть позже напишу. Т.к мне ещё не положено по правилам форума писать личные сообщения (не менее 2 дней и не менее 5 сообщений с момента регистрации).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2013, 14:45     Задача из "ООП в C++" Р. Лафоре
Еще ссылки по теме:

Код из "Р.Лафоре. ООП в С++" C++
Разобраться в примерх к книге Лафоре "Обьектно-ориентированое программирование в С++" C++
Не компилируется листинг "Передача по ссылке аргументов" Р.Лафоре C++

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

Или воспользуйтесь поиском по форуму:
reisal78
 Аватар для reisal78
603 / 516 / 119
Регистрация: 28.04.2013
Сообщений: 1,451
16.08.2013, 14:45     Задача из "ООП в C++" Р. Лафоре #7
Цитата Сообщение от Purcell Посмотреть сообщение
Хорошо Правда, я не c Windows и не с компиляторами Microsoft и Bordland прохожу эту книгу. А с компилятором gcc и Linux. Сейчас в меня могут полететь камни, но при беглом перелистывании книги я обнаружил немного специфических вещей для Windows (в основном общие основы). Дальше, конечно, я буду двигаться в сторону программирования под Linux. И ещё: я не знаю насколько быстро буду проходить эту книгу, т.к. параллельно я изучаю Linux, а как пройду функции и классы из Лафоре, возьмусь параллельно изучать Linux API (уже нашёл материал).
А скайп чуть позже напишу. Т.к мне ещё не положено по правилам форума писать личные сообщения (не менее 2 дней и не менее 5 сообщений с момента регистрации).

Не по теме:

И тебе тоже нельзя отправить сообщение =( Суровые правила форума. Но выход то всегда можно найти лови мой скайп тут. =)

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

PS. Если у кого то еще появится желание присоединиться - милости прошу =)

Yandex
Объявления
16.08.2013, 14:45     Задача из "ООП в C++" Р. Лафоре
Ответ Создать тему
Опции темы

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