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

Как сделать перезапуск оператора множественного выбора

08.04.2019, 17:07. Показов 2105. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Возникло несколько проблем. Как сделать оператор множественного ввода перезапускаемым? Т.е. Допустим юзер ввел 1, посмотрел как все отработало, ему задается вопрос "Продолжить работу?", юзер соглашается и в этом моменте нужно перезапустить главный switch(choice), чтобы он смог выбрать например 2 или 3. Я сам дошел до того, что нужно выводить весь свитч во внешнюю функцию, но тогда придется объявлять много вещей внутри той функции.
И вторая проблема появляется если решить первую, допустим человек сначала добавил несколько контактов ( это записная книжка кстати), потом он хочет попробовать поискать, вводит что хочет продолжить работу, выбирает пункт 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
85
86
87
88
89
cin >> choice;
    switch (choice){
        case 1: {system("cls");
                for (int i = 0; i < 3; i++)
                    {   in.open(files[i]);
                        in >> notes[i];
                        in.close();
                        cout << notes[i];} 
                cout << "Хотите продолжить работу? 1- да, 2- нет\n";
                cin >> InnerChoice;
                switch (InnerChoice) 
                {
                case 1: reRun(); break;
                case 2: cout << "Good bye!\n"; break;
                default: cout << "Неверный ввод!"<<endl; break;
                }
                break; }
        case 2: {cout << "Сколько контактов вы хотите добавить?"; cin >> n; cin.ignore(256, '\n');
                  Notebook * NewNotes = new Notebook[n];
                  for (int i = 0; i < n; i++)
                      cin >> NewNotes[i];
                  system("cls");
                  for (int i = 0; i < 3; i++)
                  {
                      in.open(files[i]);
                      in >> notes[i];
                      in.close();
                      cout << notes[i];
                  }
                  for (int i = 0; i < n; i++)
                      cout << NewNotes[i];
                  cout << "Хотите продолжить работу? 1- да, 2- нет\n";
                  cin >> InnerChoice;
                  switch (InnerChoice)
                  {
                  case 1: reRun(); break;
                  case 2: cout << "Good bye!\n"; break;
                  default: cout << "Неверный ввод!" << endl; break;
                  }
                  break; }
        case 3: {cout << " Как будем искать? Если по дате рождения введите 1, для поиска по другим признакам введите 2." << endl;
            int search;
            cin >> search;
            switch (search)
            {
            case 1: int year, month, day;
                cout << "Введите день, месяц, год рождения контакта";
                cin >> day >> month >> year;
                for (int i = 0; i < 3; i++)
                {
                    if (notes[i].CheckDate(day, year, month))
                        cout << notes[i];
                }
                for (int i = 0; i < n; i++)
                {
                    if (NewNotes[i].CheckDate(day, year, month))
                        cout << NewNotes[i];
                } cout << "Хотите продолжить работу? 1- да, 2- нет\n";
                cin >> InnerChoice;
                switch (InnerChoice)
                {
                case 1: reRun(); break;
                case 2: cout << "Good bye!\n"; break;
                default: cout << "Неверный ввод!" << endl; break;
                }
                break;
            case 2: string priznak;
                cout << "Введите предполагаемое имя, место работы , интерес или качество контакта (!) (что-то одно)\n";
                getline(cin, priznak);
                cout << "Идет поиск...\n";
                for (int i = 0; i < 3; i++)
                {
                    if (notes[i].CheckOther(priznak))
                        cout << notes[i];
                }
                for (int i = 0; i < n; i++)
                {
                    if (NewNotes[i].CheckOther(priznak))
                        cout << NewNotes[i];
                } cout << "Хотите продолжить работу? 1- да, 2- нет\n";
                cin >> InnerChoice;
                switch (InnerChoice)
                {
                case 1: reRun(); break;
                case 2: cout << "Good bye!\n"; break;
                default: cout << "Неверный ввод!" << endl; break;
                }
                break;
            }}


Добавлено через 6 минут
UPD: Понял, что перезапускаемость можно реализовать посредством goto. Что об этом думаете? Второй вопрос по-прежнему в силе
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.04.2019, 17:07
Ответы с готовыми решениями:

Использование оператора множественного выбора
Помогите пожалуйста с простой прогой: --&gt; С начала 1990 года по некоторый день прошло n месяцев и 2 дня. определить название месяца...

Написать программу вычисления выражения c использованием оператора множественного выбора Switch
Всем привет!) Помогите с написанием программы для вычисления выражения c использованием оператора множественного выбора Switch. Заранее...

Написать программу вычисления выражения c использованием оператора множественного выбора Switch
Всем привет!) Помогите с написанием программы для вычисления выражения c использованием оператора множественного выбора Switch. Заранее...

15
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
08.04.2019, 17:16
Лучший ответ Сообщение было отмечено Shprexan как решение

Решение

Shprexan, если очень упрознить, то можно так:
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
#include <iostream>
 
void print_phrase() {
    std::cout << "Hello, world!\n";
}
void print_value() {
    std::cout << "3.14\n";
}
 
void menu() {
    std::uint8_t continue_choice;
    do {
        std::size_t menu_choice;
        std::cout << "Enter 1 to print phrase\nEnter 2 to print value\n";        
        std::cin >> menu_choice;
        switch (menu_choice) {
            case 1: 
                print_phrase();
                break;
            case 2:
                print_value();
                break;
            default:
                std::cout << "Wrong enter!\n";
                break;
        }
        std::cout << "Do you want to continue? [Y/N]\n";
        std::cin >> continue_choice;
    } while (continue_choice != 'N');
}
 
int main() { 
    menu();
}
1
2 / 2 / 0
Регистрация: 10.11.2018
Сообщений: 25
08.04.2019, 18:09  [ТС]
UPDD: Как сделать возврат через do while я разобрался. Теперь вопрос посложнее, второй, как сделать, чтобы те контакты которые добавились во втором пункте , участвовали в поиске , после перезапуска?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
08.04.2019, 18:24
Цитата Сообщение от Shprexan Посмотреть сообщение
как сделать, чтобы те контакты которые добавились во втором пункте , участвовали в поиске , после перезапуска?
Расскажите подробнее, какие контакты?
Где добавились? Куда добавились?
Приведите минимально воспроизводимый урывок кода, демонстрирующий вашу проблему.
0
2 / 2 / 0
Регистрация: 10.11.2018
Сообщений: 25
08.04.2019, 19:00  [ТС]
Цитата Сообщение от Azazel-San Посмотреть сообщение
Расскажите подробнее, какие контакты?
Начать нужно с того, что это моя курсовая работа по программированию на плюсах. Задание такое: создать записную книжку, которая хранит следующие поля : имя, номер телефона, адрес и т.д т.п. Собственно имеется класс :
Кликните здесь для просмотра всего текста
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
class Notebook
{
private:
 
    string name, company, adres, number, interests, kachestva;
    Date birth;
public:
    friend ostream& operator << (ostream& out, Notebook &obj);
    friend istream& operator >>(istream& in, Notebook &obj);
    friend ifstream& operator >> (ifstream& in, Notebook &obj);
    friend ofstream& operator << (ofstream& out, Notebook&obj);
    bool CheckDate(int day, int year, int month)
    {
        if (this->birth.day == day && this->birth.month == month && this->birth.year == year)
            return 1;
        else return 0;
    }
    bool CheckOther(string priznak)
    {
        if (this->company == priznak || this->interests == priznak || this->name == priznak || this->kachestva == priznak || this->number == priznak)
            return 1;
        else return 0;
    }
 
};
. Далее, чтобы каждый раз не вводить много много информации, добавил три контакта, информация в которые записывается из внешних .тхт файлов ( как сделать из одного не додумался, да и не получалось особо) . Собственно первый кейс отвечает за вывод уже имеющихся трёх контактов. Второй кейс отвечает за добавление новых контактов, добавить я добавил, но видимы они в пределах этого кейса, также как и первые три только в пределах первого кейса видны( потому как, для вывода всех контактов во втором кейсе, приходится вот так изворачиваться
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Notebook *notes = new Notebook[size + n];
        for (int i = 0; i < 3; i++)
        {
            in.open(files[i]);
            in >> notes[i];
            in.close();
        }
        for (int i = 0; i < n; i++)
            cin >> notes[size + i];
        system("cls");
        for (int i = 0; i < (size + n); i++)
        {
            cout << notes[i];}
. То есть заново вводить из файла). Либо я не понимаю как юзать дин. память, либо надо вообще менять архитектуру программы. Буду рад помощи и конструктивных советов.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
08.04.2019, 19:10
Shprexan, покажите код где вы выделяете память и где у вас происходит выбор кейса, а лучше весь мейн.
0
2 / 2 / 0
Регистрация: 10.11.2018
Сообщений: 25
08.04.2019, 19:12  [ТС]
Azazel-San,
Кликните здесь для просмотра всего текста
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
int main()
{
    setlocale(LC_ALL, "rus");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    string files[] = { "file1.txt", "file2.txt", "file3.txt" };
    int choice, n = 0, InnerChoice, flag = 0;
       int size = sizeof(files) / sizeof(string);
    Notebook *notes = new Notebook[size];
    ifstream in;    
    do {
    cout << "В вашей записной книжке есть три контакта! \nЧтобы посмотреть их введите 1. \nЧтобы добавить еще контакты нажмите 2. \nЧтобы перейти к поиску по контактам нажмите 3.\n Для выхода нажмите 4." << endl;
    cin >> choice;
    switch (choice) {
    case 1: {system("cls");
        for (int i = 0; i < size; i++)
        {
            in.open(files[i]);
            in >> notes[i];
            in.close();
            cout << notes[i];
        }   break; }
    case 2: {cout << "Сколько контактов вы хотите добавить?\n"; cin >> n; cin.ignore(256, '\n');
        Notebook *notes = new Notebook[size + n];
        for (int i = 0; i < 3; i++)
        {
            in.open(files[i]);
            in >> notes[i];
            in.close();
        }
        for (int i = 0; i < n; i++)
            cin >> notes[size + i];
        system("cls");
        for (int i = 0; i < (size + n); i++)
        {
            cout << notes[i];
            flag++;
        }break; }
    case 3: {cout << " Как будем искать? Если по дате рождения введите 1, для поиска по другим признакам введите 2." << endl;
        int search;
        cin >> search;
        cin.ignore(256, '\n');
        for (int i = 0; i < 3; i++)
        {
            in.open(files[i]);
            in >> notes[i];
            in.close();
        }
        switch (search)
        {
        case 1: {int year, month, day;
            cout << "Введите день, месяц, год рождения контакта";
            cin >> day >> month >> year;
            for (int i = 0; i < flag; i++)
            {
                if (notes[i].CheckDate(day, year, month))
                    cout << notes[i];
            }break; }
        case 2: {string priznak;
            cout << "Введите предполагаемое имя, место работы , интерес или качество контакта (!) (что-то одно)\n";
            getline(cin, priznak);
            cout << "Идет поиск...\n";
            for (int i = 0; i < flag ; i++)
            {
                if (notes[i].CheckOther(priznak))
                    cout << notes[i];
            }break;
        }
        }
    case 4: {cout << "Good bye!" << endl; break; }
    default: {cout << "Неверный ввод!" << endl;     
        break;  }}
    }
    cout << "Хотите продолжить работу? 1- да, 2- нет\n";
    cin >> InnerChoice;
    system("cls");
    } while (InnerChoice == 1);
    return 0;
}
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
08.04.2019, 19:19
Shprexan, итак.
Во втором кейсе вы добавляете новые записи, но куда в файл?
Потом почему при выделении вы выделяете памяти размеров size + n?
Вы же спросили сколько пользователь хочет добавить записей, например он введёт 2, а вы зачем-то выделите больше, зачем?
И не забывайте удалить память во 2м кейсе, у вас там утечка есть.
0
2 / 2 / 0
Регистрация: 10.11.2018
Сообщений: 25
08.04.2019, 19:23  [ТС]
Azazel-San, Почему же в файл, в массив объектов. Память выделил размером size+n, чтобы туда влезли 3 записи из внешних файлов , то есть пользователь вводит 2, значит всего будет объектов 5. Насчет утечки помню, просто забыл написать там.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
08.04.2019, 19:29
Лучший ответ Сообщение было отмечено Shprexan как решение

Решение

Shprexan, это не так работает, вначале мейна вы выделили допустим памяти для трёх объектов , а потом во втором кейсе, почему-то для пяти, хотя должны были для дополнительных двух.
Массивы не так работают , их нельзя так легко расширять , если знаете что вам надо будет добавить ещё элементов, то стоит заранее выделить больше памяти.
1
2 / 2 / 0
Регистрация: 10.11.2018
Сообщений: 25
08.04.2019, 19:41  [ТС]
Azazel-San, В общем то, проблема с поиском решается тем, что память надо выделить единожды, объекты из файлов сразу до свитча внести в массив объектов. В первом кейсе только вывод, во втором кейсе, первые три ячейки памяти заняты, память никакая не выделяется ( поскольку выделил сразу размером size +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
71
72
73
74
75
76
77
78
79
int main()
{
    setlocale(LC_ALL, "rus");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    string files[] = { "file1.txt", "file2.txt", "file3.txt" };
    int choice, n = 0, InnerChoice, flag = 0;
    int size = sizeof(files) / sizeof(string);
    Notebook *notes = new Notebook[size+5];
    ifstream in;
    for (int i = 0; i < size; i++)
    {
        in.open(files[i]);
        in >> notes[i];
        in.close();
    }
        
    cout << "Добро пожаловать в вашу записную книжку!" << endl;
    do {
    cout << "В вашей записной книжке есть три контакта! \nЧтобы посмотреть их введите 1. \nЧтобы добавить еще контакты нажмите 2. \nЧтобы перейти к поиску по контактам нажмите 3.\n Для выхода нажмите 4." << endl;
    cin >> choice;
    switch (choice) {
    case 1: {system("cls");
        for (int i = 0; i < size; i++)
        {
            cout << notes[i];
        }   break; }
    case 2: {cout << "Сколько контактов вы хотите добавить?\n"; cin >> n; cin.ignore(256, '\n');
        for (int i = 0; i < n; i++)
        cin >> notes[size + i];
        system("cls");
        for (int i = 0; i < (size + n); i++)
        {
            cout << notes[i];
            flag++;
        }break; }
    case 3: {cout << " Как будем искать? Если по дате рождения введите 1, для поиска по другим признакам введите 2." << endl;
        int search;
        cin >> search;
        cin.ignore(256, '\n');
        for (int i = 0; i < 3; i++)
        {
            in.open(files[i]);
            in >> notes[i];
            in.close();
        }
        switch (search)
        {
        case 1: {int year, month, day;
            cout << "Введите день, месяц, год рождения контакта";
            cin >> day >> month >> year;
            for (int i = 0; i < flag; i++)
            {
                if (notes[i].CheckDate(day, year, month))
                    cout << notes[i];
            }break; }
        case 2: {string priznak;
            cout << "Введите предполагаемое имя, место работы , интерес или качество контакта (!) (что-то одно)\n";
            getline(cin, priznak);
            cout << "Идет поиск...\n";
            for (int i = 0; i < flag ; i++)
            {
                if (notes[i].CheckOther(priznak))
                    cout << notes[i];
            }break;
        }
        }
    case 4: {cout << "Good bye!" << endl; break; }
    default: {cout << "Неверный ввод!" << endl;     
        break;  }}
    }
    cout << "Хотите продолжить работу? 1- да, 2- нет\n";
    cin >> InnerChoice;
    system("cls");
    } while (InnerChoice == 1);
    system("pause");
    return 0;
    delete[] notes;
}
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
08.04.2019, 19:50
Shprexan, каким образом формируется размер массива, который до свитча?
Что за sizeof(files) / sizeof(string)? Что такое string? И в чем идея так выделять?
0
2 / 2 / 0
Регистрация: 10.11.2018
Сообщений: 25
08.04.2019, 19:56  [ТС]
Azazel-San,
C++
1
    string files[] = { "file1.txt", "file2.txt", "file3.txt" };
sizeof(files)/sizeof(string) - определяет кол-во файлов , 1 файл = 1 объект. Размер формируется так, чтобы обязательно влезли записи из файлов + несколько дополнительного места для второго кейса
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
08.04.2019, 20:42
Shprexan, может вам и виднее.
Опять же попытаюсь на простом примере:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Допустим есть некая структура что представляет из себя точку
// и содержит координаты х и у
struct point {
    int x;
    int y;
};
 
int main() {
    constexpr std::size_t size = 10;
    point* point_arr[size]{}; // Выделили массив указателей из 10 элементов.
    point_arr[0] = new point{5, 5};
    point_arr[1] = new point{2, 3}; // Заполнили 2 из 10
 
    std::size_t how_to_add;
    std::cin >> how_to_add; // допустим пользователь ввел 5
 
    for (size_t i = 0; i < how_to_add; ++i) { // дозаполнили массив
        point_arr[2 + i] = new point{i, i}; // обратите внимание, здесь 2 это смещение,
        // т.к. в начале мы уже выделили память под 2 объекта
    }
    // по окончании цикла у нас в  массиве point_arr будет выделено 7 объектов из 10
}
0
2 / 2 / 0
Регистрация: 10.11.2018
Сообщений: 25
08.04.2019, 20:45  [ТС]
Цитата Сообщение от Azazel-San Посмотреть сообщение
point_arr[i] = new point{i, i};
А не 5? Он же начнет с 0-го элемента переписывать массив
0
08.04.2019, 20:46

Не по теме:

Цитата Сообщение от Shprexan Посмотреть сообщение
А не 5? Он же начнет с 0-го элемента переписывать массив
Опечатка, поправил, обновите страницу

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.04.2019, 20:46
Помогаю со студенческими работами здесь

Перегрузка оператора, для множественного использования
Всем доброе утро и с наступающим! Делаю свой класс строки, и мне захотелось сделать так чтобы ввод в эту строку был подобно выводу cout ...

Оператор множественного выбора.
Задание 1! Составить программу, которая по введенному номеру месяца, выдает его название. Задание 2! Составить программу, которая...

Оператор множественного выбора
Какой из перечисленных операторов является оператором множественного выбора? 1) if 2) switch 3) continue 4) break

Оператор множественного выбора, язык C
Нужно решить задачу, помогите пожалуйста!!! Дан номер месяца (1 — январь, 2 — февраль, ...). Вывести число дней в этом месяце для не...

Ошибка с оператором множественного выбора
здравствуйте, форумчане. вот код реализации очереди: #include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;locale.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru