Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 24.06.2022
Сообщений: 38

C++ задача на mutex

20.01.2023, 20:39. Показов 2573. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написать программу, позволяющую имитировать «идеальный экзамен». В экзамене
может принимать участие несколько экзаменаторов. Один экзаменатор одновременно
может принимать экзамен только у одного студента. Оценка генерируется случайным
образом в диапазоне от 2 – 5. При этом у студента есть неограниченное количество
попыток сдать экзамен экзаменатору (но не подряд). Студент получивший оценку 3 и
выше считается успешно сдавшим экзамен. Программа должна выводить на
экран фио или номер студента и данные об оценке за каждую попытку. Работа программы
заканчивается тогда, когда все студенты успешно сдали экзамен.

Крайне сложно для меня, ни разу с таким не сталкивался. Но буду очень благодарен, до сдачи 6 часов))
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.01.2023, 20:39
Ответы с готовыми решениями:

Mutex
Есть код, вида: public static Mutex mut = new Mutex(); public static void FirstMethod() { ...

Mutex
#include <iostream> #include <windows.h> #include <iostream> #include <fstream> #include <cstdlib> #include <map> #include...

mutex
День добрый. Прошу объяснить мне дураку m_hShared = OpenMutex(MUTEX_ALL_ACCESS, TRUE, L"FileMutexEx"); if(m_hShared) ...

42
0 / 0 / 0
Регистрация: 24.06.2022
Сообщений: 38
20.01.2023, 22:17  [ТС]
Студворк — интернет-сервис помощи студентам
Написать программу, позволяющую имитировать «идеальный экзамен». В экзамене
может принимать участие несколько экзаменаторов. Один экзаменатор одновременно
может принимать экзамен только у одного студента. Оценка генерируется случайным
образом в диапазоне от 2 – 5. При этом у студента есть неограниченное количество
попыток сдать экзамен экзаменатору (но не подряд, за каждым сдавшим должен пройти как минимум 1 студент, чтобы предыдущий смог сдать снова). Студент получивший оценку 3 и
выше считается успешно сдавшим экзамен. Программа должна выводить на
экран фио или номер студента и данные об оценке за каждую попытку. Если остался один студент, то он может сдавать экзамен сколь угодно раз подряд до успешной сдачи. Работа программы
заканчивается тогда, когда все студенты успешно сдали экзамен.

Добавлено через 4 минуты
Ещё попрошу, если получится покоменить, буду очень рад. У всех стили написания разные, подчеркну для себя чего нибудь)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.01.2023, 22:36
abit, я думаю, задание - типичное кю. Моё предположение -
Цитата Сообщение от h8erqqq Посмотреть сообщение
но не подряд
значит - нельзя иддти к тому же преподу у которого получил последний неуд. То есть студень должен помнить последнего "обидчика". Агрегировав в классе - ExamTry студента и последнего препода (указатель) поставившего неуд, можно это как-то решить. Хотя вариантов тут море.
0
0 / 0 / 0
Регистрация: 24.06.2022
Сообщений: 38
20.01.2023, 22:40  [ТС]
Я думаю всё таки просто подряд нельзя сдавать, каков бы ни был препод. В переформулированном условии всё понятно в принципе).
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.01.2023, 23:09
Цитата Сообщение от h8erqqq Посмотреть сообщение
Я думаю всё таки просто подряд нельзя сдавать, каков бы ни был препод.
Это ваше право. Вы можете остановить программу когда любой из экзаменующихся не нашел препода для сдачи перепробовав все варианты. Например. Или контролировать не остался ли последний и уже на нём проверять. Однако, условие
Цитата Сообщение от h8erqqq Посмотреть сообщение
Работа программы
заканчивается тогда, когда все студенты успешно сдали экзамен.
может быть невыполнимо. Это разрушает задачу до основания.
С другой стороны, есть вариант её спасти.
Смысл
Цитата Сообщение от h8erqqq Посмотреть сообщение
попыток сдать экзамен экзаменатору (но не подряд)
может состоять в том, что залоченный одним единым мутексом поток препода, мог бы многократно нагружен попыткоами одного и того же студента. Но мы знаем, что random обязательно даст ему зелёный свет. Тогда весь смысл интриги теряется, потому, что будет работать правило "пришёл, увидел, задолбал" (сдал то есть).
Для предметного анализа, нужно развивать воображение. Но ваше право считать так как вам угодно.
Удачи.
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
21.01.2023, 00:56
Не скажу, что тут прям все отлично работает, но есть от чего оттолкнуться. Сам с потоками недавно знакомство начал, вот что получилось.
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
#include <iostream>
#include <cstdlib>
#include <thread>
using namespace std;
 
class Student
{
public:
    Student( string n ) : name(n), bBusy(false) {}
    void setMark( int m ) { mark = m; }
    bool isPassed() { return (mark > 2); }
    string GetResult() { return name + " is got " + to_string(mark) + ( mark>2 ? " (passed)" : " (failed)" ); }
    void setBusy(bool b) { bBusy = b; }
    bool isBusy() { return bBusy; }
private:
    int mark {0};
    string name;
    bool bBusy;
};
 
class Examiner
{
public:
    Examiner( string n ) : name(n), bBusy(false) {}
    void Examine( Student& s )
    {
        srand( std::hash<std::thread::id>{}(std::this_thread::get_id()) );
        this_thread::sleep_for(std::chrono::seconds(rand()%3 + 1)); // sleep 1-3s
        s.setMark( rand()%4 + 2 );
        string str = name + ": " + s.GetResult() + "\n";
        cout << str;
        s.setBusy(false);
        bBusy = false;
    }
    void setBusy(bool b) { bBusy = b; }
    bool isBusy() { return bBusy; }
private:
    string name;
    bool bBusy;
};
 
int main()
{
    int i, j, neg_num;
    int studN = 100;
    int examN = 5;
    Student* apStuds[studN];
    Examiner* apExams[examN];
 
    for( i=0; i<studN; ++i )
        apStuds[i] = new Student( "Stud_" + to_string(i+1) );
    for( i=0; i<examN; ++i )
        apExams[i] = new Examiner( "Exam_" + to_string(i+1) );
 
    while( 1 )
    {
        // find examiner
        for( j=0; j<examN; ++j )
            if( !(apExams[j]->isBusy()) )
            {
                // find stud
                for( i=0; i<studN; ++i )
                    if( !(apStuds[i]->isBusy()) && !(apStuds[i]->isPassed()) )
                        break;
                if( i < studN )
                {
                    apStuds[i]->setBusy(true);
                    apExams[j]->setBusy(true);
                    thread t( (apExams[j]->Examine), ref(*apExams[j]), ref(*apStuds[i]) );
                    t.detach();
                }
            }
 
        neg_num = 0;
        for( i=0; i<studN; ++i )
            if( !(apStuds[i]->isPassed()) )
                ++neg_num;
        if( neg_num < 2 ) break;
    }
    cout<<"Complete! "<<neg_num<<" students haven`t passed"<<endl;
    for( int i=0; i<studN; ++i )
        delete apStuds[i];
    for( int i=0; i<examN; ++i )
        delete apExams[i];
    return 0;
}
1
0 / 0 / 0
Регистрация: 24.06.2022
Сообщений: 38
21.01.2023, 04:35  [ТС]
Постараюсь узнать сегодня что там имеется в виду. Сообщу тут)
Спасибо всем что приняли участие!)

Добавлено через 1 час 35 минут
Сижу и уже час пытаюсь понять в чём дело:
main.cpp: In function 'int main()':
main.cpp:37:44: error: invalid use of non-static member function 'void Examiner::Examine(Student)'
37 | thread t( (apExams[j]->Examine), ref(*apExams[j]), ref(*apStuds[i]) );
| ~~~~~~~~~~~~~^~~~~~~~
In file included from main.cpp:2:
examiner.h:15:10: note: declared here
15 | void Examine( Student s )
| ^~~~~~~

Не подскажите?
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
21.01.2023, 20:51
h8erqqq, покажите main.cpp
0
0 / 0 / 0
Регистрация: 24.06.2022
Сообщений: 38
22.01.2023, 17:10  [ТС]
Evgen173
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
#include "student.h"
#include "examiner.h"
 
#include <iostream>
#include <cstdlib>
#include <thread>
using namespace std;
 
 
int main()
{
    int i, j, neg_num;
    int studN = 100;
    int examN = 5;
    Student* apStuds[studN];
    Examiner* apExams[examN];
 
    for( i=0; i<studN; ++i )
        apStuds[i] = new Student( "Stud_" + to_string(i+1) );
    for( i=0; i<examN; ++i )
        apExams[i] = new Examiner( "Exam_" + to_string(i+1) );
 
    while( 1 )
    {
        // find examiner
        for( j=0; j<examN; ++j )
            if( !(apExams[j]->isBusy()) )
            {
                // find stud
                for( i=0; i<studN; ++i )
                    if( !(apStuds[i]->isBusy()) && !(apStuds[i]->isPassed()) )
                        break;
                if( i < studN )
                {
                    apStuds[i]->setBusy(true);
                    apExams[j]->setBusy(true);
                    thread t( (apExams[j]->Examine), ref(*apExams[j]), ref(*apStuds[i]) );
                    t.detach();
                }
            }
 
        neg_num = 0;
        for( i=0; i<studN; ++i )
            if( !(apStuds[i]->isPassed()) )
                ++neg_num;
        if( neg_num < 2 ) break;
    }
    cout<<"Complete! "<<neg_num<<" students haven`t passed"<<endl;
    for( int i=0; i<studN; ++i )
        delete apStuds[i];
    for( int i=0; i<examN; ++i )
        delete apExams[i];
    return 0;
}
Добавлено через 7 минут
Доброго времени суток, вас озарение так и не посетило?

Добавлено через 2 минуты
abit, Доброго времени суток, до вас озарение так и не дошло?

Добавлено через 3 часа 12 минут
IGPIGP, всё таки как я в переформулировке написал.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.01.2023, 18:16
Цитата Сообщение от h8erqqq Посмотреть сообщение
IGPIGP, всё таки как я в переформулировке написал.
h8erqqq, по сути вы не написали ничего определённого. Общественность решила, например, что
Цитата Сообщение от h8erqqq Посмотреть сообщение
подряд
это значит, что неудачник не может идти сразу к любому свободному преподу (кроме своего обидчика, - настаиваю). То есть, он должен подождать, пока кто-то не сдаст перед ним.
Но тогда, если все преподы свободны, а у нас оказалось 2 и более неудачников, то ни один не может сделать попытку пересдачи.
Я считаю, что если ваш препод это имеет ввиду то он тоже не умеет думать. А условие
Цитата Сообщение от h8erqqq Посмотреть сообщение
Работа программы
заканчивается тогда, когда все студенты успешно сдали экзамен.
Главное условие задачи, знаменующее её финал (результат, просто говоря), нужно выбросить на помойку. Вместе с задачей. Этог моё мнение. Может я и не прав, но тогда опишите ситуацию определённее.
0
0 / 0 / 0
Регистрация: 24.06.2022
Сообщений: 38
22.01.2023, 18:43  [ТС]
Я тоже согласен что задача неправильно сформулирована и в принципе дикая какая-то. Поэтому я её и не сдам, видимо.
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
22.01.2023, 18:46
h8erqqq, чтобы выполнить задание прям по условию, я не могу сообразить, куда там втыкать мьютекс. Попробовал разбить проект на файлы, работает, ошибку как у вас не выдает. Приложу проект на всякий случай, он под CodeBlocks если что
Вложения
Тип файла: rar testThread.rar (533.3 Кб, 6 просмотров)
0
0 / 0 / 0
Регистрация: 24.06.2022
Сообщений: 38
22.01.2023, 19:22  [ТС]
Evgen173, А можете пожалуйста текстовым кинуть? А то ругается на этот файл.

Добавлено через 23 минуты
Evgen173, Так что, есть возможность скинуть текстовым? Или с помощью встроенной функции на форуме?
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
22.01.2023, 19:37
Лучший ответ Сообщение было отмечено h8erqqq как решение

Решение

h8erqqq,
main.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
#include "student.h"
#include "examiner.h"
 
#include <iostream>
#include <thread>
using namespace std;
 
int main()
{
    int i, j, neg_num;
    int studN = 100;
    int examN = 5;
    Student* apStuds[studN];
    Examiner* apExams[examN];
    thread aThreads[examN];
 
    for( i=0; i<studN; ++i )
        apStuds[i] = new Student( "Stud_" + to_string(i+1) );
    for( i=0; i<examN; ++i )
        apExams[i] = new Examiner( "Exam_" + to_string(i+1) );
 
    while( 1 )
    {
        // find examiner
        for( j=0; j<examN; ++j )
            if( !(apExams[j]->isBusy()) )
            {
                // find stud
                for( i=0; i<studN; ++i )
                    if( !(apStuds[i]->isBusy()) && !(apStuds[i]->isPassed()) )
                        break;
                if( i < studN )
                {
                    apStuds[i]->setBusy(true);
                    apExams[j]->setBusy(true);
 
                    //  thread t( (apExams[j]->Examine), ref(*apExams[j]), ref(*apStuds[i]) );
                    //  t.detach();
 
                    if( aThreads[j].joinable() ) aThreads[j].join();
                    aThreads[j] = thread( (apExams[j]->Examine), ref(*apExams[j]), ref(*apStuds[i]) );
                }
            }
 
        neg_num = 0;
        for( i=0; i<studN; ++i )
            if( !(apStuds[i]->isPassed()) )
                ++neg_num;
        if( neg_num < 2 ) break;
    }
    for( j=0; j<examN; ++j )
        aThreads[j].join();
    neg_num = 0;
    for( i=0; i<studN; ++i )
        if( !(apStuds[i]->isPassed()) )
            ++neg_num;
    cout<<"Complete! "<<neg_num<<" students haven`t passed"<<endl;
    for( int i=0; i<studN; ++i )
        delete apStuds[i];
    for( int i=0; i<examN; ++i )
        delete apExams[i];
    return 0;
}
examiner.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
#ifndef _EXAMINER_H
#define _EXAMINER_H
 
#include <iostream>
#include <thread>
#include <string>
#include <cstring>
#include <cstdlib>
 
class Examiner
{
public:
    Examiner( std::string n ) : name(n), bBusy(false) {}
    void Examine( Student& s )
    {
        srand( std::hash<std::thread::id>{}(std::this_thread::get_id()) );
        std::this_thread::sleep_for(std::chrono::seconds(rand()%2 + 1)); // sleep 1-3s
        s.setMark( rand()%4 + 2 );
        std::string str = name + ": " + s.GetResult() + "\n";
        std::cout << str;
        s.setBusy(false);
        bBusy = false;
    }
    void setBusy(bool b) { bBusy = b; }
    bool isBusy() { return bBusy; }
private:
    std::string name;
    bool bBusy;
};
 
#endif // _EXAMINER_H
student.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef _STUDENT_H
#define _STUDENT_H
 
#include <string>
//#include <cstring>
 
class Student
{
public:
    Student( std::string n ) : name(n), bBusy(false) {}
    void setMark( int m ) { mark = m; }
    bool isPassed() { return (mark > 2); }
    std::string GetResult() { return name + " is got " + std::to_string(mark) + ( mark>2 ? " (passed)" : " (failed)" ); }
    void setBusy(bool b) { bBusy = b; }
    bool isBusy() { return bBusy; }
private:
    int mark {0};
    std::string name;
    bool bBusy;
};
 
#endif // _STUDENT_H
1
0 / 0 / 0
Регистрация: 24.06.2022
Сообщений: 38
22.01.2023, 19:41  [ТС]
Evgen173, Опять выдаёт ошибку, но думаю разберусь. От всей души благодарю вас!
0
0 / 0 / 0
Регистрация: 24.06.2022
Сообщений: 38
23.01.2023, 05:23  [ТС]
Evgen173, Огромное спасибо вам, разобрался и сдал. Вы мой спаситель!) Карма вознаградит)
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
23.01.2023, 06:19
TS : [20.01.2023, 19:39]
Цитата Сообщение от h8erqqq Посмотреть сообщение
до сдачи 6 часов))
TS : [23.01.2023, 04:23]
Цитата Сообщение от h8erqqq Посмотреть сообщение
разобрался и сдал
Это как так ?

Добавлено через 8 минут
Цитата Сообщение от h8erqqq Посмотреть сообщение
разобрался и сдал
А я вот не разобрался, чей-то решение от Evgen173, мне вообще не нравится.
Хоть я и не шарю в потоках, ну точно это было бы не так.
Логика решения усложненная.
Я вот не вижу в классах Student и Examiner необходимости знать что-то о потоках.
Я бы их в очереди посадил и считал барашек.
0
0 / 0 / 0
Регистрация: 24.06.2022
Сообщений: 38
23.01.2023, 06:21  [ТС]
SmallEvil, дал ещё возможность сдать, так что повезло)
Всё равно интересно было решение.

Добавлено через 1 минуту
SmallEvil, потоки тут отлично реализованы, на мой взгляд. Просто задача предполагает решение таким способом)
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
23.01.2023, 06:25
Цитата Сообщение от h8erqqq Посмотреть сообщение
Просто задача предполагает решение таким способом)
Каким таким ?
Вы раньше говорили вообще о мютексах...
0
0 / 0 / 0
Регистрация: 24.06.2022
Сообщений: 38
23.01.2023, 06:26  [ТС]
SmallEvil, в примере у препода были мьютексы. Можно было с их помощью реализовать, так же тема была на потоки. Поэтому всё прекрасно. Человек написал как сам видел, и я ему благодарен.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
23.01.2023, 06:29
Цитата Сообщение от h8erqqq Посмотреть сообщение
Человек написал как сам видел
Ну так значит нет никакого :
Цитата Сообщение от h8erqqq Посмотреть сообщение
задача предполагает решение таким способом
Что это за выдумки ?
Я же не говорил что у меня было бы без потоков.
Очереди, потоки, мьютексы.

Добавлено через 19 секунд
Цитата Сообщение от h8erqqq Посмотреть сообщение
Человек написал как сам видел, и я ему благодарен.
Славно )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.01.2023, 06:29

C++ mutex
Есть небольшое задание, буквально пару строк. Можете посмотреть, пожалуйста? Генератор чисел который показывает скок чисел...

Mutex
Без мьютексов все работает нормально, но вставив мьютексы, почему-то процесс ребенок не выполняет свой кусок кода from multiprocessing...

Mutex in Linux
Добрый день. Допустим есть код void func () { pthread_mutex_lock(&amp;mutexConsole); printf(&quot;Son get task: %s\n&quot;,mes); ...

qt named mutex ?
Есть ли Qt именные мьютексы? То есть в winapi я могу открыть мьютекс по имени HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE,...

Работа с mutex
Господа, есть такая проблема. Нужно реализовать многопоточность при помощи mutex. Должны быть 3 параллельных потока, в каждом потоке идет...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru