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

вопрос в самом низу посмотрите интересно понять

01.11.2011, 15:27. Показов 676. Ответов 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
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
298
299
300
301
302
# include <iostream>              // класс для работы с вводом-выводом
# include <windows.h>             // для функции  CharToOem();
# include <fstream>           // класс для работы с файлом
 
using namespace std;
    char bufRus[256];
    char* Rus(const char* text)
    {
        CharToOem(text, bufRus);
    return bufRus;
    }
 
struct lfile{
    char name[15];
    char data[10];
    int upd;
};
struct sp{
    lfile elfile;   // поле данных
    sp *next;   // указатель
};
 
sp*print_list(sp *list);//прототип функции вывод на экран
 
 
sp* ft_enter();//прототип функции ввод из текстового файла
sp* fb_enter();// прототип функции ввод из типизированного файла
sp* fs_enter();// прототип функции ввод с экрана
sp* sort(sp *list);// прототип сортировки
void search(sp *list); // прототип функций поиск по имени и вывод в файл
void fsearch(sp *list); //прототип функции поиск файла с наибольшим количеством обращений
 //
sp* pind(sp *list); //прототип получения адреса
sp* del(sp *list,sp *adr);// прототип функции удаления файла
sp * vst(sp *list,sp *adr);// прототип фунции вставка файла
void zmn(sp *list); // прототип функции замена файла
 
void main()
{
   int v;
   sp *k;
   do{
      cout<<Rus("  0: формирование списка из текстового файла")<<endl;
      cout<<Rus("  1: формирование списка из типизированного файла")<<endl;
      cout<<Rus("  2: формирование списка с экрана")<<endl;
      cout<<Rus("  3: сортировка")<<endl;
      cout<<Rus("  4: поиск по заданному полю с сохранением результатов в файле")<<endl;
      cout<<Rus("  5: выборка файла с наибольшим количеством обращений")<<endl;
      cout<<Rus("  6: замена записи")<<endl;
      cout<<Rus("  7: удаление записи после указанного адреса")<<endl;
      cout<<Rus("  8: вставка записи после указанного адреса")<<endl;
      cout<<Rus("  9: вывод списка")<<endl;
      cout<<Rus("  10: выход")<<endl;
      cout<<Rus("вариант ")<<endl;
      cin>>v;
      switch(v){
        case 0: k = ft_enter(); break;/*вызов функции ввод тектового файла в переменную к, чтоб по ней потом можно было делать сортировку, поиск и тд*/
        case 1: k = fb_enter(); break; // вызов функции ввод с типизированного файла
        case 2: k = fs_enter(); break;// вызов функции ввод с экрана
        case 3: k = sort(k); print_list(k); break;// вызов 2 функций сортировки по переменной к, и вывод списка на экран
        case 4: search(k);break;//вызов функции поиск по переменной к и сохранение в файл одной строки
        case 5: fsearch(k); break;//вызов функции поиск файла с наибольшим количеством обращений к нему
        case 6: zmn(k); print_list(k); break;//вызов функции замена строки по указаному номеру
        case 7: k = del(k,pind(k)); print_list(k); break;// вызов функции удаление строки после указанного номера
        case 8: k = vst(k,pind(k)); print_list(k); break;//вызов функции вставка строки после указанного номера
        case 9: print_list(k);break;//вызов функции вывод списка на экран
        case 10:return; break;
 
        }
    } while(true);//цикл будет повтрятся
}
 
//ввод списка из текстового файла
sp* ft_enter(){
    char name[10];// символьный тип которое будет именем файла и его типом не больше 10знаков
    cout<<Rus("введи имя входн тип.файла")<<endl;
    cin>>name;// ввод имени и типа
    sp* list = new sp;    //создаем указатель на голову списка
    sp *ptr;  //указатель на элемент списка
    bool on=true; //флажок, который определяет, читаем ли мы первый элемент списка или последующие
    ifstream inf(name);//считывание файла по имени name в inf
    while (!inf.eof()){ // цикл пока не будет достигнут конец файла
        if(on){     //если до этого список был пуст, то
            ptr=list;  //записываем в него первый элемент
            on=false;
        }else{  //если список не пуст, то записываем в него текущий элемент (настраиваем указатель на след. элемент)
            ptr->next=new sp; //выделяем память под следующий элемент списка
            ptr=ptr->next;//ptr теперь указывает на тот элемент который был выделен строкой выше
        }
        inf>> ptr->elfile.name;   //читаем конкретные данные в текущий элемент списка
        inf>> ptr->elfile.data;
        inf>> ptr->elfile.upd;
        inf.ignore();
    }
    ptr->next=NULL; //для последнего элемента списка указатель на следующий элемент не определен/пуст (установлен в NULL)
    inf.close();//закрытие файла
    return list;  //  возвращаем указатель на первый элемент списка
}
 
//ввод списка из типизированного файла
sp* fb_enter(){
    sp* list =new sp; //создаем указатель на голову списка
    sp *ptr,*q;//два указателя на sp.
    int ok=1;//Переменная ok со значением 1.
    char name[15];// символьный тип которое будет именем файла и его типом не больше 15знаков
    cout<<Rus("введи имя входн тип.файла")<<endl;
    cin>>name;// ввод имени и типа
    ifstream intf(name, ios::binary); //режим бинарного открытия файла
    ptr=list; //теперь ptr указывает туда же куда и list
    while (!intf.eof()){  // // цикл пока не будет достигнут конец файла
        intf.read(reinterpret_cast<char *>(&ptr->elfile),sizeof(lfile)); /*читаем из бинарного файла байты кол-вом размер структуры lfile в переменную. reinterpret_cast<T> - небезопасное преобразование. В данном случае т.к. read принимает указатель на char* преобразовываем указатель на lfile в указатель на char и читаем в него. */
            if(ptr->elfile.upd != NULL){  // если не ноль
                q=ptr;//q теперь указывает туда же куда и ptr.
                ptr->next=new sp;//ptr теперь указывает на тот элемент который был выделен строкой выше
                ptr=ptr->next;// ptr теперь указывает на тот элемент который был выделен строкой выше
            }
    }
    ptr->next=NULL;//обнуляем следующий элемент за q.
    intf.close();//закрытие файла
    return list; // возвращаем указатель на первый элемент списка
}
 
 
//ввод списка с экрана
sp* fs_enter(){
    sp* list =new sp; //выделяем память под список
    sp *ptr; //указатель на элемент списка
    char name; // символьный тип которое будет именем файла и его типом
    cout<< Rus("Введиде имя, дату создания, кольчество обращений к файлу")<<endl;
    ptr=list; //теперь ptr указывает на список
    while (true){
        cin>>ptr->elfile.name;
        cin>>ptr->elfile.data;
        cin>>ptr->elfile.upd;
        cout<<Rus("ещё (y/n)")<<endl;
        cin>>name;
        if(name=='n') break;
        ptr->next=new sp; //выделяем память под строку
        ptr=ptr->next;//указываем на эту строку
    }
    return list; //возвращаем указатель на первый элемент списка
}
 
//Функция вывода списка на экран, как параметр берёт указатель на список.
sp* print_list(sp *list){
    sp *prt = list;
    int i=0;
    do {
        cout<<++i<<"  ";// первый файл
        cout<<prt->elfile.name<<"      ";
        cout<<prt->elfile.data<<"      ";
        cout<<prt->elfile.upd<<endl;
        prt=prt->next;//следующий
        if(prt == NULL) break;
    } while (true);
}
 
//сортировка списка как параметр берёт указатель на список.
sp* sort(sp *list){
    sp *pt=list, *ptr, *pred=list, *q;
    int ok,ok1;
    do{
        ok=0, ok1=1; ptr=list;
        while (ptr->next){
            if(ptr->elfile.upd > ptr->next->elfile.upd){
                if(ok1) { // первый элемент
                    ok1=0;
                    q=pt;
                    pt=pt->next;
                    q->next=pt->next;
                    pt->next=q;
                    ptr=pt;
                    ok=1;
                }
                else {
                    q=pred->next;
                    pred->next=pred->next->next;
                    q->next=pred->next->next;
                    pred->next->next=q;
                    ptr=pt->next;
                    ok=1;
                }
            }
                pred=ptr;
                ptr=ptr->next;
        }
    } while(ok);
    return pt;
}
 
//поиск файла по имени и вывод его в текстовый файл
void search(sp *list){
    sp *prt = list;
    char f[15],r[15];
    cout<<Rus("введите текст")<<endl;
    cin>>f;
    cout<<Rus("введите выходной файл")<<endl;
    cin>>r;
    ofstream inf(r);
    while (true){
        if(strstr(prt->elfile.name,f)){ // сравнивает имя файла введенное с теми что в списке, если совпадает то выводит о нем всю информацию в другой файл
          inf<<prt->elfile.name<<"  ";
          inf<<prt->elfile.data<<"  ";
          inf<<prt->elfile.upd<<endl;
        }
        prt=prt->next;//переход на другую строку
        if(prt == NULL) break;
    }
}
 
//Файл с наиольшим кольчеством обращений
void fsearch(sp *list){
     sp *prt = list;
     int p=-1;
     sp *r;
     while (true){
        if(prt->elfile.upd > p){//если первое обращение больше другого
            p = prt->elfile.upd; // присвоить его значение в р
            r = prt; //запомнить максимум
        }
        prt=prt->next;
        if(prt == NULL) break;
     }
     cout<<Rus("Файл с наиольшим кольчеством обращений")<<endl;
     cout<<r->elfile.name<<" ";
     cout<<r->elfile.data<<" ";
     cout<<r->elfile.upd<<endl;
}
 
//получить адрес
sp* pind(sp *list){
    sp *prt = list;
    int i=1,j=0;
    cout<<Rus("Введите номер")<<endl;
    cin>>j; //номер строки
    while (true){
        if(i==j){
            return prt; //строка под этим номером
            break;
        }
        prt=prt->next;
        if(prt == NULL) break;
        i++;
    }
}
 
//удаление элемента с адресом adr
sp* del(sp *list,sp *adr){
    sp *pt=list, *q;
    if(adr==list){// если номер совпал то...
        pt=adr->next;//  перейти на другую строку
        q=adr;// запомнить ее
    }else{
        q = adr->next;
        adr->next = adr->next->next;
    }
    delete(q); //удаляет строку после указанного номера
    return pt;
}
 
//вставка нового элемента после элемента с адресом adr
sp * vst(sp *list,sp *adr){
    lfile rab;
    sp *pt=list,*q=new sp;
    cout<<"name=";
    cin>>rab.name;
    cout<<"data=";
    cin>>rab.data;
    cout<<"up=";
    cin>>rab.upd;
    q->elfile=rab;// в список на который ссылался q присваиваем строки rab
    if(adr==list){
        pt=q;
        q->next=adr;
    }else{
        q->next= adr->next;
        adr->next=q;
    }
    return pt;
}
 
//заменить поле
void zmn(sp *list){
    sp *prt = list;
    int i=1,j=0;
    cout<<Rus("Введите номер")<<endl;
    cin>>j; // номер поля которое заминить
    while (true){
        if(i==j){// если номер есть тоесть равен то..
        cout << Rus (" Введите имя нового файла");
    cin>>prt->elfile.name;
    cout << Rus (" Введите дату создания файла");
    cin>>prt->elfile.data;
    cout << Rus (" Введите количество обращений к файлу");
    cin>>prt->elfile.upd;
            break;
        }
        prt=prt->next;
        if(prt == NULL) break;
        i++;
    }
}
ВОТ ФУНКЦИЯ нахождения адреса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//получить адрес
sp* pind(sp *list){
    sp *prt = list;
    int i=1,j=0;
    cout<<Rus("Введите номер")<<endl;
    cin>>j; //номер строки
    while (true){
        if(i==j){
            return prt; //строка под этим номером
            break;
        }
        prt=prt->next;
        if(prt == NULL) break;
        i++;
    }
}
вот функция удаления файла после введеного номера допустим ввели 2 то удаляет 3 строку
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//удаление элемента с адресом adr
sp* del(sp *list,sp *adr){
    sp *pt=list, *q;
    if(adr==list){// если номер совпал то...
        pt=adr->next;//  перейти на другую строку
        q=adr;// запомнить ее
    }else{
        q = adr->next;
        adr->next = adr->next->next;
    }
    delete(q); //удаляет строку после указанного номера
    return pt;
}
В этой функции используется указатель adr я вот только не понимаю как мы его можем сравнивать с list если adr встречается впервые и в нем нету никакой величены, помогите понять эту суть...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.11.2011, 15:27
Ответы с готовыми решениями:

Аттачменты в самом низу формы
Если аттачменты не присоединены к РТФ, то они автоматом отображаются в самом низу формы. Как бы их скрыть? Может есть какое-то...

Футер в самом низу страницы
Помогите расположить футер в самом низу страницы :) чёт я это дело не продумал, а ща его не получается уже в самый низ всунуть, так как он...

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

9
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
01.11.2011, 15:45
Цитата Сообщение от lexflax Посмотреть сообщение
adr встречается впервые и в нем нету никакой величены
В строке 64 ему присваивается "какая-то величина".
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
01.11.2011, 15:47  [ТС]
но я не вижу чтоб там было adr и так же в вызове функции pind в ее описание тоже адр нету
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
01.11.2011, 16:03
Цитата Сообщение от lexflax Посмотреть сообщение
и так же в вызове функции pind в ее описание тоже адр нету
Сурьёзно?
А где связь между pind и adr, который в del?
Срочно читай про функции, формальные и фактические параметры.
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
01.11.2011, 16:06  [ТС]
да я читал и не раз, только все равно путаюсь, так объяснить нельзя? вы явно хорошо связь всю эту цепочку видите, не поможите как нибудь все равно сам до этого дойду у меня без вариантов так сказать, но время тикает мало осталось
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
01.11.2011, 16:16
Разберёшься с этим примером, сможешь и со своим разобраться.

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
#include <iostream>
 
int func1( int a )
{
     a = a * 2;
     return a;
}
 
int func2( int a )
{
     a = a + 10;
     return a;
}
 
int main()
{
    int a = 5;
 
    int b = func1( 10 );
    int c = func2( 20 );
 
    std::cout << a << "  " << b << "  " << c << std::endl;
    return 0;
 
}
1
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
01.11.2011, 16:29  [ТС]
Цитата Сообщение от Deviaphan Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    int a = 5;
 
    int b = func1( 10 );
    int c = func2( 20 );
 
    std::cout << a << "  " << b << "  " << c << std::endl;
    return 0;
 
}
C++
1
2
3
4
5
    int a = 5;
    int b = func1( 10 );// а почему в скобках 10? не а должно быть?
    int c = func2( 20 ); а тут почему 20 ? а не 15? ведь там объявленно а=а+10
    std::cout << a << " *" << b << " *" << c << std::endl;
    return 0;
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
01.11.2011, 16:32
Цитата Сообщение от lexflax Посмотреть сообщение
а почему в скобках 10? не а должно быть?
Цитата Сообщение от lexflax Посмотреть сообщение
а тут почему 20 ? а не 15? ведь там объявленно а=а+10
А я знал, что ты именно это спросишь.) Потому такой код и написал. Разбирайся. В отладчике запусти. Разбирайся.)
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
01.11.2011, 16:33
lexflax, Вот. Вот и разбирайся.

Связи в названиях между формальными параметрами и фактическими нету никакой.
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
01.11.2011, 17:03  [ТС]
Цитата Сообщение от Deviaphan Посмотреть сообщение
C++
1
2
3
4
int b = func1( 10 );
int c = func2( 20 );
std::cout << a << " *" << b << " *" << c << std::endl;
return 0;
C++
1
2
3
4
int b = func1( 10 ); то есть это значение а которое вверху было объявленно, тоесть b на выходе будет 20, а с на выходе будет 30 так?
int c = func2( 20 );
std::cout << a << " *" << b << " *" << c << std::endl;
return 0;
Добавлено через 25 минут
по своему примеру все равно понять не могу
C++
1
2
3
4
5
6
7
8
9
10
11
case 0: k = ft_enter(); break;/*вызов функции ввод тектового файла в переменную к, чтоб по ней потом можно было делать сортировку, поиск и тд*/
                case 1: k = fb_enter(); break; // вызов функции ввод с типизированного файла
                case 2: k = fs_enter(); break;// вызов функции ввод с экрана
                case 3: k = sort(k); print_list(k); break;// вызов 2 функций сортировки по переменной к, и вывод списка на экран
                case 4: search(k);break;//вызов функции поиск по переменной к и сохранение в файл одной строки
                case 5: fsearch(k); break;//вызов функции поиск файла с наибольшим количеством обращений к нему
                case 6: zmn(k); print_list(k); break;//вызов функции замена строки по указаному номеру
                case 7: k = del(k,pind(k)); print_list(k); break;// вызов функции удаление строки после указанного номера
                case 8: k = vst(k,pind(k)); print_list(k); break;//вызов функции вставка строки после указанного номера
                case 9: print_list(k);break;//вызов функции вывод списка на экран
                case 10:return; break;
ну k понятно в ей присваивается список который сначала или из текстового файла вводится или из типизированного или с экрана это первые три вызова, потом по ней же сортировка делается, ну в case 7 все равно не пойму, вызов функции del( в ней само это k, и вызов функции нахождения адреса по к) но возвращает там ptr тоесть ту строку которая совпала с веденной, вот я наверно сам и ответил на свой вопрос) ))))))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.11.2011, 17:03
Помогаю со студенческими работами здесь

Вертикальный TSplitter оказывается в самом низу
Как так может получиться, что splitter оказывается внизу? object pnlParent: TPanel Align = alClient Left = 3 Top = 99...

Разместить footer в самом низу страницы
Привет, слушайте, есть вопрос по css, не знаешь как разместить footer чтобы он был в самом низу страницы и не было отступов по краям и...

Загрузочные диски в самом низу списка, не получается изменить
Проблема у знакомого возникла после того,как ребенок поигрался кнопкой вкл/выкл компа и аварийной перезагрузки. Как я понял долго игрался!...

@media в самом низу файла, но все равно не использует
Приветствую. Имею @media (max-width: 1024px) { .col-md-5.section-library-function-row-box .btn-top { left: 34px; } }

Как убрать пустоту в самом низу страницы сайта?
Доброго времени суток! Вопрос такой: есть обычная таблица вставленная в .html файл, в которой размещены различные элементы: шапка, рисунки,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru