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

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

Войти
Регистрация
Восстановить пароль
 
probnik1
0 / 0 / 0
Регистрация: 13.02.2014
Сообщений: 5
#1

Составить программу, которая обеспечивает начальное формирование предметного указателя - C++

13.02.2014, 08:20. Просмотров 562. Ответов 8
Метки нет (Все метки)

Прошу помощи с программой 2х летней давности.
Да, да! Все так и есть - эту программу задавали еще 2 года назад, но как то забылось и не хочет вспоминаться, да и большую часть занятий по этим темам я вообще пропустил ибо с работы не отпускали во время сессий =(
А сейчас если не сдам, то плакал мой диплом т.к. меня вовсе отчислят.
Поиском пользовался очень много раз но к ожидаемому ответу так и не пришел (программа либо не работает либо никто не отвечал в подобной теме). На самом деле это вообще курсовой проект... Но ближе к делу -
Вот сама задачка:
"Предметный указатель организован как линейный список.
каждая компонента содержит слово и номера страниц на которых это слово встречается.
Кол-во номеров страниц относящихся к одному слову может лежать в интервале от одного до десяти.
Составить прогу, которая обеспечивает
-начальное формирование предметного указателся
-вывод предметного указателя
-вывод номеров страниц для заданного слова
Так же программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе."
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2014, 08:20     Составить программу, которая обеспечивает начальное формирование предметного указателя
Посмотрите здесь:

Написать программу, которая обеспечивает:начальное формирование каталога файлов;вывод каталога файлов;удаление файлов... - C++
Уважаемые хакеры!Прошу вашей помощи!Я в СИ не особо шарю.((( А на днях уже сдавать.Очень рассчитываю на любую вашу помощь. Вот задача. ...

Pазработать программу для работы с Базой данных, которая обеспечивает автоматизированную продажу авиабилетов на месяц вперед. - C++
помогите пожалуйста решить задачу на языке с++ Pазработать программу для работы с Базой данных, которая обеспечивает автоматизированную...

составить программу, которая находит максимальное и минимальное значение среди элементов одномерного массива Y, которая состоит из N целых чисел - C++
составить программу, которая находит максимальное и минимальное значение среди элементов одномерного массива Y, которая состоит из N целых...

Вернуть программу в начальное состояние - C++
подскажите у меня прога при нажатии клавиш выполняет определенные действия и закрывает кансоль,как сделать чтобы после выполнения прога...

Составить программу, которая выводит Х, умноженное на 2 - C++
Всем привет) Перешел с паскаля на С++ только... Нужно составить программу, которая выводит Х, умноженное на 2. Пример: Вводим Х...

Составить программу, которая определяет, существует ли треугольник - C++
Составить программу, которая определяет, существует ли треугольник, используя функцию: bool treugolnik(float a, float b, float c) {bool...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ded_Vasilij
231 / 213 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
13.02.2014, 08:36     Составить программу, которая обеспечивает начальное формирование предметного указателя #2
probnik1, Ну есть же море готовых, я список раза 3, минимум выкладывал. Вот еще раз, все работает, только вместо типа char подставите структуру с нужными полями, и будет Вам счастье.
файл L2.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
39
40
41
#pragma once
#include <iostream>
 
class L2_elem
{
public: 
    char el;//вот здесь напишете структуру
    L2_elem* next;
    L2_elem* prev;
    L2_elem();                                      //Г§Г*Г*óëèòü ГіГЄГ*Г§Г*òåëè
    L2_elem (char c, L2_elem* n,L2_elem* p);        //ïðèñâГ*ГЁГўГ*Г*ГЁГҐ Г§Г*Г*Г·ГҐГ*ГЁГ©
    char get_el();
    L2_elem* get_n();
    L2_elem* get_p();
};
class L2 
{
    L2_elem* head;                              // ãîëîâГ*
    L2_elem* tail;                              // õâîñò
    L2_elem* GetElemById(int i);
    
public:
    L2();                                       // ГЁГ*èöèГ*ëèçГ*öèÿ
    ~L2();                                      // äåñòðóêòîð
    L2(const L2 &List);                         // êîïèðîâГ*Г*ГЁГҐ
    L2& operator = (const L2& List);            // îïåðГ*òîð ïåðåãðóçêè
    bool isEmpty ()const;                       // ïðîâåðêГ* Г*Г* ïóñòîòó
    char popHead ();                            // ïîëó÷èòü ýëåìåГ*ГІ ГЁГ§ Г*Г*Г·Г*Г«Г* Г±ГЇГЁГ±ГЄГ*
    char popTail ();                            // ïîëó÷èòü ýëåìåГ*ГІ ГЁГ§ ГЄГ®Г*Г¶Г* Г±ГЇГЁГ±ГЄГ*
    void pushHead (char c);                     // äîáГ*ГўГЁГІГј ýëåìåГ*ГІ Гў Г*Г*Г·Г*ëî Г±ГЇГЁГ±ГЄГ*
    void pushTail (char c);                     // äîáГ*ГўГЁГІГј ýëåìåГ*ГІ Гў ГЄГ®Г*ГҐГ¶ Г±ГЇГЁГ±ГЄГ*       
    void AddAfter(char c, int i);               // äîáГ*ГўГЁГІГј ýëåìåГ*ГІ ïîñëå Г§Г*Г¤Г*Г*Г*îãî
    char DelAfter( int i);                      // ГіГ¤Г*ëèòü ýëåìåГ*ГІ ïîñëå Г§Г*Г¤Г*Г*Г*îãî
    
    void printTail()const;                      // ГЇГҐГ·Г*ГІГј Г± õâîñòГ*
    int size ()const;                           // Г°Г*çìåð Г±ГЇГЁГ±ГЄГ*
    void makeEmpty();                           // ñäåëГ*ГІГј ïóñòûì
    static void L2_menu();
    friend std::istream& operator>>(std::istream& i, L2& L);
    friend std::ostream& operator<<(std::ostream& o, const L2& L);
};
файл L2.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
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
#include <iostream>
#include "L2.h"
#include "error.h"
using namespace std;
L2_elem :: L2_elem()
    : prev(0), next(0)
{
    
}
char L2_elem :: get_el()
{
    return el;
}
 
L2_elem*  L2_elem :: get_p()
{
    return prev;
}
 
L2_elem :: L2_elem (char c, L2_elem* n,L2_elem* p)      //ïðèñâГ*ГЁГўГ*Г*ГЁГҐ Г§Г*Г*Г·ГҐГ*ГЁГ©
{
    el = c;
    next = n;
    prev = p;
}
 
 
//ðåГ*ëèçГ*öèÿ L2
 
L2 :: L2()
{
    head = 0;                                           // ГЇГ® óìîë÷Г*Г*ГЁГѕ âûçûâГ*ГҐГІГ±Гї ГЄГ®Г*ñòðóêòîð ГЎГҐГ§ ГЇГ*Г°Г*ìåòðîâ L2_elem
    tail = 0;
}
 
bool L2 :: isEmpty () const                                 // ïðîâåðêГ* Г*Г* ïóñòîòó
{
    return head == 0;
} 
 
void L2 :: makeEmpty()                                  // î÷èñòèòü ГІГҐГЄГіГ№ГЁГ© ñïèñîê
{   
    
    L2_elem* p = 0;
    while (head)
    {
        p = head;
        head = head->next;          
        delete p;
    }
    head = 0;
    tail = head;
}
 
L2 :: ~L2()                                             // äåñòðóêòîð - Г®Г* ГЁ Гў Г*ôðèêå äåñòðóêòîð
{
    
    makeEmpty();
}
 
L2 :: L2 (const L2 &List)                               // ГЄГ®Г*ñòðóêòîð êîïèðîâГ*Г*ГЁГї
{
    try
    {
        head = 0;
        tail = 0;
        L2_elem* temp = List.head;
 
        while (temp)
        {
            char c = temp->el;
            temp = temp->next;
            pushTail(c);
        }
    }
    catch (bad_alloc e)
    {
        makeEmpty();
        throw;      
    }
}
 
L2& L2::operator = (const L2& List)         // îïåðГ*òîð ïåðåãðóçêè
{
    makeEmpty();
    L2_elem* temp = List.head;
    while(temp)
    {
        char c = temp->el;              
        temp = temp->next;
        pushTail(c);
    }
    return *this;
}
 
void L2 :: pushHead (char c)                            // äîáГ*ГўГЁГІГј ýëåìåГ*ГІ Гў Г*Г*Г·Г*ëî Г±ГЇГЁГ±ГЄГ*
{
 
    {
        L2_elem* NewEl = new L2_elem(c,head,0); 
        if (isEmpty())
        {
            head = NewEl;
            tail = head;
        }
        else
        {
            NewEl->next = head;
            head->prev = NewEl;
            head = NewEl;
        }
    }
 
}
void L2 :: pushTail (char c)                            // äîáГ*ГўГЁГІГј ýëåìåГ*ГІ Гў ГЄГ®Г*ГҐГ¶ Г±ГЇГЁГ±ГЄГ*   
{   
        L2_elem* NewEl = new L2_elem(c,0,tail); 
        if ( isEmpty() )                                    // åñëè ñïèñîê ГЇГіГ±ГІ
        {
            tail = NewEl;                                   // äåëГ*ГҐГ¬ Г*îâûé ýëåìåГ*ГІ õâîñòîì
            head = tail;
        }
        else
        {
            NewEl->prev = tail;
            tail->next =  NewEl;
            tail = NewEl;
        }
}
 
L2_elem *L2::GetElemById(int i)
{
    L2_elem *p = (i<0?0:head); 
    for(int k = 0; k < i && p; k++)
    {
        p = p->next;
    } 
    return p;
}
 
void L2 :: AddAfter(char c, int i)
{
    if (i == 0)
    {
        pushHead(c);
        return;
    }
 
    L2_elem *p = GetElemById(i); 
    if(!p) { throw ListError(); }
 
    if (p == tail)
    {
        pushTail(c);
        return;
    }
    
    L2_elem* NewEl = new L2_elem(c,p->next,p); 
    NewEl->next->prev = NewEl;
    NewEl->prev->next = NewEl;
}
 
char L2 :: DelAfter(int i)              // ГіГ¤Г*ëèòü ýëåìåГ*ГІ ïîñëå Г§Г*Г¤Г*Г*Г*îãî
{
    if (i == 0)
    {
        return popHead();       
    }
 
    L2_elem *p = GetElemById(i);
    if(!p) { throw ListError(); }
 
    if (p == tail)
    {
        return popTail();
    }
 
    char c = p->el;
    p->prev->next = p->next;
    p->next->prev = p->prev;
    delete p;
    return c;
}
 
char L2 :: popHead () 
{
    if ( isEmpty() ) 
    {
        throw ListError();
    }
    char c = head->el;    
    if ( head->next == 0 )                              // åñëè Гў Г±ГЇГЁГ±ГЄГҐ ГўГ±ГҐГЈГ® 1 ýëåìåГ*ГІ
    {
        delete head;                                    // ГіГ¤Г*ëÿåì ГҐГЈГ®
        head = 0;                                       // ГЁ ãîâîðèì, Г·ГІГ® ñïèñîê ГЇГіГ±ГІ
        tail = 0;
    }
    else 
    {
        head = head->next;                              // ñäâèãГ*ГҐГ¬ tail Г*Г* ïðåäûäóùèé ýëåìåГ*ГІ
        delete  head->prev;                             // ГЁ ГіГ¤Г*ëÿåì Г±ГІГ*ðûé ïîñëåäГ*ГЁГ© ýëåìåГ*ГІ
        head->prev = 0;
    } 
    return c;
}
 
char L2 :: popTail () 
{
    if ( isEmpty() ) 
    {
        throw ListError(); 
    } 
    char c = tail->el;    
    if ( tail->prev == 0 )                              // åñëè Гў Г±ГЇГЁГ±ГЄГҐ ГўГ±ГҐГЈГ® 1 ýëåìåГ*ГІ
    {
        delete tail;                                    // ГіГ¤Г*ëÿåì ГҐГЈГ®
        head = 0;                                       // ГЁ ãîâîðèì, Г·ГІГ® ñïèñîê ГЇГіГ±ГІ
        tail = 0;
        return c;
    }
    else 
    {
        tail = tail->prev;                              // ñäâèãГ*ГҐГ¬ tail Г*Г* ïðåäûäóùèé ýëåìåГ*ГІ
        delete ( tail->next );                          // ГЁ ГіГ¤Г*ëÿåì Г±ГІГ*ðûé ïîñëåäГ*ГЁГ© ýëåìåГ*ГІ
        tail->next = 0;
    } 
    return c;
}
 
 
 
 
int L2 :: size()const
{
    if (isEmpty())
    {
        return 0;
    }
    L2_elem* temp = head;
    int size = 0;
    while (temp)
    {       
        temp = temp->next;
        size++;
    }
    return size;
}
 
std::istream& operator>>(std::istream& i, L2& L)
{
    char c;
    cin >>c;
    L.pushHead(c);
    return i;   
}
 
std::ostream& operator<<(std::ostream& o, const L2& L) 
{
    L2_elem* temp = L.tail;
    while (temp)
    {
        o << temp->el << "\t";
        temp = temp->prev;
    }   
    return o;
}
файл error.h
C++
1
2
3
4
5
6
7
#pragma once
struct ListError
{
    char* mem;
    char* empty;
};
int Readint();
файл файл error.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include "error.h"
using namespace std;
int Readint()
{
    unsigned int a;
    cin >> a;
    if (!cin)
    {
        cin.clear();
        while (cin.peek() !='\n')
            cin.ignore();
        cin.ignore();
    }
    return a;
}
Ну и для полного комплекта менюшка
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
void L2 :: L2_menu()
{   
    int menu = 0;
    int stop = 0;
    const int N = 11;
    L2 list1, list2;
    
    
    system("cls");
    
    
    while(menu != N)
    {   
        cout << "ГЊГ…ГЌГћ L2\n";
        cout << "1. äîáГ*ГўГЁГІГј ýëåìåГ*ГІ Гў ãîëîâó\n";
        cout << "2. äîáГ*ГўГЁГІГј ýëåìåГ*ГІ Гў õâîñò\n";
        cout << "3. ГіГ¤Г*ëèòü ýëåìåГ*ГІ ГЁГ§ ãîëîâû\n";
        cout << "4. ГіГ¤Г*ëèòü ýëåìåГ*ГІ ГЁГ§ õâîñòГ*\n";
        cout << "5. ГЇГҐГ·Г*ГІГј\n";    
        cout << "6. Г°Г*çìåð\n";
        cout << "7. êîïèðîâГ*Г*ГЁГҐ\n";
        cout << "8. ïðèñâГ*ГЁГўГ*Г*ГЁГҐ\n";    
        cout << "9 ГўГ±ГІГ*ГўГЄГ* ýëåìåГ*ГІГ* ïîñëå Г§Г*Г¤Г*Г*Г*îãî\n";
        cout << "10 ГіГ¤Г*ëåГ*ГЁГҐ ýëåìåГ*ГІГ* ïîñëå Г§Г*Г¤Г*Г*Г*îãî\n";
        cout << "11. âîçâðГ*ГІ Гў ïðåäûäóùåå ìåГ*Гѕ\n";    
        try
        {
            cout << "ââåäèòå Г*îìåð ГЇГіГ*ГЄГІГ* ìåГ*Гѕ\n";
            menu = Readint();
            switch(menu)
            {
            case 1 : 
                {                   
                        cout <<"Ââåäèòå êîëè÷åñòâî ýëåìåГ*òîâ, êîòîðûå ГўГ» õîòèòå äîáГ*ГўГЁГІГј\n";
                        stop = Readint();
                        cout << "Ââåäèòå ñèìâîëû Г± ГЄГ«Г*ГўГЁГ*òóðû\n";
                        for (int i = 0; i < stop; i++)
                        {                       
                            cin >> list1;
                            
                        }                                       
                    break;
                }
            case 2 :
                {   
                    cout <<"Ââåäèòå êîëè÷åñòâî ýëåìåГ*òîâ, êîòîðûå ГўГ» õîòèòå äîáГ*ГўГЁГІГј\n";
                    stop = Readint();
                    cout << "Ââåäèòå ñèìâîëû Г± ГЄГ«Г*ГўГЁГ*òóðû\n";
                    for (int i = 0; i < stop; i++)
                    {                           
                        char x;
                        cin >> x;
                        list1.pushTail(x);
                    }
                    break;
                }
            case 3 :
                {
                    list1.popHead();
                    break;
                }
            case 4 :
                {
                    list1.popTail();
                    break;
                }
            case 5 :
                {
                    cout << list1 <<endl;               
                    break;
                }
            case 6 :
                {
                    cout <<"\nÊîëè÷åñòâî ýëåìåГ*òîâ Гў Г±ГЇГЁГ±ГЄГҐ = "<< list1.size()<<endl;
                    break;
                }
            case 7 :
                {
                    L2 list3(list1);
                    cout << list3;
                    break;
                }
            case 8 :
                {
                    list2 = list1;
                    cout << list1 << "\n" << list2;
                    break;
                }
            case 9 :
                {
                    cout << "ââåäèòå Г*îìåð ïîçèöèè\n";
                    int i = Readint();
                    cout << "ââåäèòå ñèìâîë\n";
                    char c;
                    cin >> c;
                    list1.AddAfter(c,i);            
                    break;
                }
            case 10 :
                {               
                    cout << "ââåäèòå Г*îìåð ïîçèöèè\n";
                    int i = Readint();
                    list1.DelAfter(i);
                    break;
                }
            case 11 :
                {               
                    
                    break;
                }           
            }
        }
 
        catch(bad_alloc e)
        {
            cerr << e.what();
        }
        catch (ListError)
        {
            cout << "îøèáêГ*\n" ;          
        }
    }
}
Дальше думаю сообразите.
probnik1
0 / 0 / 0
Регистрация: 13.02.2014
Сообщений: 5
13.02.2014, 08:53  [ТС]     Составить программу, которая обеспечивает начальное формирование предметного указателя #3
Честно говоря у меня познания вообще не ахти... =(
Спасибо за код. Буду пытаться сейчас связывать все это может получится)
Ded_Vasilij
231 / 213 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
13.02.2014, 09:10     Составить программу, которая обеспечивает начальное формирование предметного указателя #4
probnik1, примерно год назад мои знания тоже были фактически нулевыми, и ничего, было бы желание.
probnik1
0 / 0 / 0
Регистрация: 13.02.2014
Сообщений: 5
13.02.2014, 09:13  [ТС]     Составить программу, которая обеспечивает начальное формирование предметного указателя #5
Цитата Сообщение от Ded_Vasilij Посмотреть сообщение
probnik1, Ну и для полного комплекта менюшка
C++
1
void L2 :: L2_menu()
Дальше думаю сообразите.
Извиняюсь за глупый вопрос, но Меню какое расширение должно иметь? Просто как я уже отписался выше познания у меня не ахти в С++ вообще =(
Ded_Vasilij
231 / 213 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
13.02.2014, 09:22     Составить программу, которая обеспечивает начальное формирование предметного указателя #6
Цитата Сообщение от probnik1 Посмотреть сообщение
Меню какое расширение должно иметь?
Ну создайте файл main.cpp
C++
1
2
3
4
5
int main(int argc, char const *argv[])
 {
    L2::L2_menu();
    return 0;
 }
Как-то так

Добавлено через 1 минуту
И реализацию меню можно тут же поместить, а можно в L2.cpp - это уж как душе угодно
probnik1
0 / 0 / 0
Регистрация: 13.02.2014
Сообщений: 5
13.02.2014, 09:32  [ТС]     Составить программу, которая обеспечивает начальное формирование предметного указателя #7
что то я совсем не так сделал
Вложения
Тип файла: rar Новая папка.rar (5.3 Кб, 10 просмотров)
probnik1
0 / 0 / 0
Регистрация: 13.02.2014
Сообщений: 5
14.02.2014, 08:05  [ТС]     Составить программу, которая обеспечивает начальное формирование предметного указателя #8
Вроде с горем пополам разобрался(благодаря книжке С++ за 24 часа и то правда почитал только основы синтаксиса с библиотеками ибо времени вчера не ахти было) уж слишком много лишних функций для моей задачи) ну да ни в этом дело. Я все еще никак понять не могу - как обьявить меню(??) , так как используя
main.cpp
C++
1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
 
int main(int argc, char const *argv[])
 {
    L2 :: L2_menu();
    return 0;
 }
компилятор пишет "не обьявлена L2"
само меню я убрал в l2.cpp добавил библиотеку <cstdlib> и немного "}" ";" больше он там не ругался вроде ни на что.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2014, 08:52     Составить программу, которая обеспечивает начальное формирование предметного указателя
Еще ссылки по теме:

составить программу, которая определяет углы со сторонами a,b,c - C++
составить программу, которая определяет углы со сторонами a,b,c

Составить программу, которая образует матрицу (n × n) - C++
Составить программу, которая образует матрицу (n × n) случайных вещественных чисел, находит наибольшее значение среди элементов...

Составить программу которая выполняет следующие действия - C++
Составить программу которая выполняет следующие действия: 1. Создает динамический список 2. Выполняет поиск в списке 3. Вывод на...

Составить программу, которая вычисляет площадь кольца - C++
Арифметика: Z=cosα+ cos2α+ cos6α+ cos7α Текст: Составить программу, которая вычисляет площадь кольца. Внешний и внутренний радиус...


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

Или воспользуйтесь поиском по форуму:
Ded_Vasilij
231 / 213 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
14.02.2014, 08:52     Составить программу, которая обеспечивает начальное формирование предметного указателя #9
probnik1, наверное нужно написать
C++
1
2
#include "L2.h"
#include "error.h"
Yandex
Объявления
14.02.2014, 08:52     Составить программу, которая обеспечивает начальное формирование предметного указателя
Ответ Создать тему
Опции темы

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