Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 07.12.2014
Сообщений: 16
1

Сделать две очереди, так, чтобы в одной остались только символы, в другой — только числа

24.06.2015, 15:35. Показов 592. Ответов 9
Метки нет (Все метки)

Помогите,пожалуйста,решить задачку.
Даны 2 очереди, заполненные символами латинского алфавита и числами. Сделать из них две, так, чтобы в одной остались только символы, в другой - только числа.

Добавлено через 15 часов 57 минут
Опишите хотя бы алгоритм решения,кто знает.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.06.2015, 15:35
Ответы с готовыми решениями:

Обработать строку так, чтобы чтобы в ней остались только те слова которые содержат буквы и цифры
Привет всем, помогите решить задачу. Обработать строку таким образом чтобы чтобы в ней остались...

Как сделать так, чтобы обработка нажатия происходила только в одной определённой процедуре?
Как сделать так, чтобы обработка нажатия не происходила в определённой процедуре? Допустим чтобы...

Переставить числа так, чтобы сначала шли только 0, затем только 1, затем только 2
Даны целые числа A,A,A,...,A, каждое из которых является либо 0, либо 1, либо 2. Переставить числа...

Как сделать так чтобы выводились только те элементы, которые встречаются только 2 раза?
Как сделать так чтобы выводились только те элементы, которые встречаются только 2 раза? ...

__________________
9
1642 / 1071 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
24.06.2015, 16:03 2
Цитата Сообщение от DimaIT Посмотреть сообщение
Опишите хотя бы алгоритм решения,кто знает.
Я боюсь алгоритм Вам не поможет без понимания работы с динамическими структурами данных. Учите матчасть, читайте умные книжки.
А примеров кода на этом форуме можно найти довольно много - поиск рулит.
0
0 / 0 / 0
Регистрация: 07.12.2014
Сообщений: 16
24.06.2015, 16:10  [ТС] 3
Спасибо за ответ.
Не могли бы Вы посоветовать парочку умных книжек по динамическим структурам?
0
1642 / 1071 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
24.06.2015, 16:17 4
Не самое легкое и простое чтиво: http://www.cyberguru.ru/progra... age21.html

Добавлено через 3 минуты
или вот, из соседней темы: Ищу книжку Профессиональное программирование на Турбо Паскале
0
Модератор
Эксперт по электронике
7522 / 3710 / 1456
Регистрация: 01.02.2015
Сообщений: 11,541
Записей в блоге: 2
24.06.2015, 21:04 5
А и вправду, как их разделить - в смысле алгоритм?
Навскидку:
1. Есть две очереди №1 и №2, а также одна переменная типа "элемент очереди".
2. Определимся, что в очередь №1 в конце концов должны попасть "символы", а в №2 - "цифры".
3. "Перекладываем" из №1 элементы в №2. Если попалась "цифра", то перекладываем всё остальное из №1 в №2. Запомненную цифру из переменной добавляем в №2. Теперь всё в №2.
4. Перекладываем из №2 в №1. Если попался "символ", то опять запоминаем его в переменной и всё остальное - переносим из №2 в №1. "Символ" из переменной - в №1.
5. Повторяем 3 и 4. Попутно с операциями 3 и 4 проверяем упорядоченность "символов" и "цифр".
6. Если всё упорядоченно, то почти конец - осталось лишь из общей очереди перенести цифры или символы в пустующую очередь.
7. Вуаля.

Т.е. упорядочиваем по-одному элементу при переносе из очереди в очередь.

Но может что-то ещё есть?
0
Модератор
Эксперт по электронике
7522 / 3710 / 1456
Регистрация: 01.02.2015
Сообщений: 11,541
Записей в блоге: 2
26.06.2015, 01:26 6
У меня получилось так. Алгоритм слегка иной, но смысл тот же:
1. Есть две очереди №1 и №2, а также одна переменная типа "элемент очереди".
2. Сливаем обе очереди в одну.
3. "Перекладываем" элементы из одной очереди во вторую. Если попалась "цифра", то перекладываем всё остальное из первой во вторую. Запомненную цифру из переменной добавляем во вторую. Теперь всё во второй.
4. Аналогично перекладываем элементы из второй очереди в первую.
5. Повторяем 3 и 4. Попутно с операциями 3 и 4 проверяем упорядоченность "символов" и "цифр".
6. Если всё упорядоченно, то почти конец - осталось лишь из общей очереди перенести цифры или символы в пустующую очередь.
7. Вуаля (это обязательное слово).

Получилось так
Pascal
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
program QueueMockery;
 
type
  TQueueElement = char;
  TQueue = string;
 
  {------------------------------------------------------------}
  { Реализация структуры "очередь"                             }
  {------------------------------------------------------------}
  procedure QueuePut(var aQ: TQueue; aData: TQueueElement);
  begin
    aQ := aQ + aData;
  end;
 
  function QueueGet(var aQ: TQueue): TQueueElement;
  begin
    if Length(aQ) > 0 then
    begin
      QueueGet := aQ[1];
      Delete(aQ, 1, 1);
    end
    else
      QueueGet := '#';
  end;
 
  function QueueEmpty(aQ: TQueue): boolean;
  begin
    QueueEmpty := (Length(aQ) = 0);
  end;
 
  { упорядочивание очереди, переставлением элементов очереди из aFrom в aTo}
  function QueueOrder(var aFrom, aTo: TQueue): integer;
  var
    Elem, Temp: TQueueElement;
    ChangeCount: integer;
    PrevElementIsDigit, CurrElementIsDigit: boolean;
    FirstTime: boolean;
 
    procedure Count(aElem: TQueueElement);
    begin
      CurrElementIsDigit := (aElem in ['0'..'9']);
      if FirstTime then
      begin
        FirstTime := False;
        PrevElementIsDigit := CurrElementIsDigit;
      end;
      if CurrElementIsDigit xor PrevElementIsDigit then
        Inc(ChangeCount);
      PrevElementIsDigit := CurrElementIsDigit;
    end;
 
  begin
    ChangeCount := 0;
    if QueueEmpty(aFrom) then
    begin
      QueueOrder := 0;
      exit;
    end;
    FirstTime := True;
    {из очереди aFrom берём элементы и переставляем в очередь aTo
    до тех пор, пока не встретится "цифра".
    Её запоминаем в переменной Elem.}
    {заодно готовимся к подсчёту количества чередований "цифр" и "букв".}
    repeat
      Elem := QueueGet(aFrom);
      CurrElementIsDigit := (Elem in ['0'..'9']);
      if CurrElementIsDigit then
        break
      else
        QueuePut(aTo, Elem);
      if FirstTime then
      begin
        FirstTime := False;
        PrevElementIsDigit := CurrElementIsDigit;
      end;
      PrevElementIsDigit := CurrElementIsDigit;
    until QueueEmpty(aFrom);
    {остатки очереди aFrom переносим в очередь aTo}
    {заодно подсчитываем количество чередований "цифр" и "букв".}
    while not QueueEmpty(aFrom) do
    begin
      Temp := QueueGet(aFrom);
      QueuePut(aTo, Temp);
      Count(Temp);
    end;
    {если в очереди aFrom присутствовала "цифра", которую запомнили
     в переменной Elem - переносим её в очередь aTo.}
    if (Elem in ['0'..'9']) then
    begin
      QueuePut(aTo, Elem);
      Count(Elem);
    end;
    QueueOrder := ChangeCount;
  end;
 
  {выделение из начала очереди aFrom элементов (или цифр или букв) в очередь aTo}
  procedure QueueSeparate(var aFrom, aTo: TQueue);
  var
    Elem: TQueueElement;
    PrevElementIsDigit, CurrElementIsDigit: boolean;
    FirstTime: boolean;
  begin
    FirstTime := True;
    while not QueueEmpty(aFrom) do
    begin
      Elem := QueueGet(aFrom);
      CurrElementIsDigit := (Elem in ['0'..'9']);
      if FirstTime then
      begin
        FirstTime := False;
        PrevElementIsDigit := CurrElementIsDigit;
      end;
      if not (CurrElementIsDigit xor PrevElementIsDigit) then
        QueuePut(aTo, Elem)
      else
      begin
        QueuePut(aFrom, Elem);
        break;
      end;
      PrevElementIsDigit := CurrElementIsDigit;
    end;
  end;
 
var
  Q1, Q2: TQueue;
begin
  Q1 := 'abcd123efgh4';
  Q2 := '56jklmnop78';
  writeln('Очереди до упорядочивания:');
  writeln('Q1= ', Q1);
  writeln('Q2= ', Q2);
  {упорядочивание}
  QueueOrder(Q2, Q1);{не глядя на результат, сливаем обе очереди в одну}
  repeat
    {from Q1 to Q2}
    if QueueOrder(Q1, Q2) <= 1 then
      break;
    {from Q2 to Q1}
    if QueueOrder(Q2, Q1) <= 1 then
      break;
  until False;
  {разделение общей очереди на две}
  if not QueueEmpty(Q1) then
    QueueSeparate(Q1, Q2)
  else
    QueueSeparate(Q2, Q1);
  writeln('Очереди после упорядочивания:');
  writeln('Q1= ', Q1);
  writeln('Q2= ', Q2);
end.
Громоздко.

Сразу предупреждаю ТС - реализацию очереди - то, ради чего давалось задание - преподаватель не примет по причине упрощения.
0
13067 / 5853 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
26.06.2015, 16:58 7
Тоже предложу решение. Очередь реализована на однонаправленном динамическом списке. Решение строится классическим образом - на вызовах только двух подпрограмм:
Pop() - добавление элемента в конец очереди;
Push() - изъятие элемента из начала очереди.

1. Если нельзя использовать вспомогательную очередь.
Pascal
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
program Project1;
 
type
  {Тип основных данных.}
  TData = Char;
  {Тип указателя на элемент очереди.}
  TPElem = ^TElem;
  {Тип элемента очереди.}
  TElem = record
    Data : TData;   {Основные данные.}
    PNext : TPElem; {Указатель на следующий элемент очереди.}
  end;
  {Тип, определяющий очередь.}
  TQueue = record
    PFirst, PLast : TPElem; {Указатели на первый и на последний элементы очереди.}
  end;
 
{Начальная инициализация очереди. Внимание! Эту процедуру можно выполнять
только в отношении пустой очереди. Иначе будут утечки памяти.
Если очередь непустая, то следует применить вызов QFree().}
procedure Init(var aQ : TQueue);
begin
  aQ.PFirst := nil;
  aQ.PLast := nil;
end;
 
{Добавление элемента в конец очереди.}
procedure Push(var aQ : TQueue; const aData : TData);
var
  P : TPElem;
begin
  New(P);           {Выделение памяти для элемента.}
  P^.Data := aData; {Записываем основные данные.}
  P^.PNext := nil;  {Т. к., элемент добавляется в конец очереди, то указатель на следующий элемент = NIL.}
  if aQ.PFirst = nil then {Если очередь пустая, то новый элемент становится первым элементом очереди.}
    aQ.PFirst := P
  else                    {Если очередь не пустая, то новый элемент прикрепляем к последнему элементу очереди.}
    aQ.PLast^.PNext := P;
  aQ.PLast := P;    {Добавленный элемент становится последним элементом очереди.}
end;
 
{Изъятие элемента из начала очереди. Если очередь непустая, то
из начала очереди извлекается элемент и его значение возвращается
через параметр aData. В этом случае функция возвращает True.
Если очередь пустая, то операция отменяется и функция возвращает False.}
function Pop(var aQ : TQueue; var aData : TData) : Boolean;
var
  P : TPElem;
begin
  Pop := False;
  P := aQ.PFirst;
  if P <> nil then
  begin
    aData := P^.Data;       {Читаем данные первого элемента очереди.}
    aQ.PFirst := P^.PNext;  {Первым элементом очереди становится тот элемент, который раньше был вторым.}
    if aQ.PFirst = nil then {Если очередь оказалась пустой, то обнуляем указатель на её последний элемент.}
      aQ.PLast := nil;
    Dispose(P);             {Освобождаем память, занятую для элемента.}
    Pop := True;
  end;
end;
 
{Освобождение памяти, выделенной для элементов очереди (очистка очереди).}
procedure QFree(var aQ : TQueue);
var
  Data : TData;
begin
  while Pop(aQ, Data) do;
end;
 
{Распечатка очереди в направлении: начало - конец.
Здесь для упрощения и ускорения работы будем работать с очередью, как со списком.}
procedure QWriteln(const aQ : TQueue);
var
  P : TPElem;
begin
  P := aQ.PFirst;
  if P = nil then
    Write('Очередь пуста.')
  else
  repeat
    Write(P^.Data, ' ');
    P := P^.PNext;
  until P = nil;
  Writeln;
end;
 
var
  Q1, Q2 : TQueue;
  Data : TData;
  i, Cnt : Integer;
  S : String;
begin
  {Начальная инициализация очередей.}
  Init(Q1);
  Init(Q2);
  repeat
    Writeln('--------------------------------------------------');
    Randomize; {Инициализация генератора случайных чисел.}
    {Записываем в очереди случайные наборы символов алфавита и цифр.}
    for i := 1 to Random(11) do
      if Random(2) = 0 then {Случайная заглавная буква английского алфавита.}
        Push(Q1, Chr(65 + Random(26)))
      else                  {Случайная десятичная цифра.}
        Push(Q1, Chr(48 + Random(10)));
    for i := 1 to Random(11) do
      if Random(2) = 0 then {Случайная заглавная буква английского алфавита.}
        Push(Q2, Chr(65 + Random(26)))
      else                  {Случайная десятичная цифра.}
        Push(Q2, Chr(48 + Random(10)));
    Writeln('Начальное состояние очередей:');
    QWriteln(Q1);
    QWriteln(Q2);
 
    {Решение.}
    {1. Переливаем все элементы из второй очереди - в первую.}
    while Pop(Q2, Data) do
      Push(Q1, Data);
    {2. Переливаем все элементы из первой очереди - во вторую и производим подсчёт элементов.}
    Cnt := 0;
    while Pop(Q1, Data) do
    begin
      Push(Q2, Data);
      Inc(Cnt);
    end;
    {3. Переливаем Cnt элементов из второй очереди:
      - в первую очередь - те элементы, которые являются цифрами;
      - во вторую очередь (т. е., в саму себя) все остальные элементы (т. е., те, которые НЕ являются цифрами).}
    while (Cnt > 0) and Pop(Q2, Data) do
    begin
      if Data in ['0'..'9'] then
        Push(Q1, Data)
      else
        Push(Q2, Data);
      Dec(Cnt);
    end;
 
    {Ответ.}
    Writeln('Состояние очередей после обработки:');
    QWriteln(Q1);
    QWriteln(Q2);
 
    {Освобождение памяти, выделенной для элементов очередей.}
    QFree(Q1);
    QFree(Q2);
    Writeln('-----');
    Writeln('Память, выделенная для очередей, освобождена.');
 
    Write('Повторить - Enter, выход - любой символ + Enter. ');
    Readln(S);
  until S <> '';
end.
2. Если можно использовать вспомогательную очередь.
Pascal
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
program Project1;
 
type
  {Тип основных данных.}
  TData = Char;
  {Тип указателя на элемент очереди.}
  TPElem = ^TElem;
  {Тип элемента очереди.}
  TElem = record
    Data : TData;   {Основные данные.}
    PNext : TPElem; {Указатель на следующий элемент очереди.}
  end;
  {Тип, определяющий очередь.}
  TQueue = record
    PFirst, PLast : TPElem; {Указатели на первый и на последний элементы очереди.}
  end;
 
{Начальная инициализация очереди. Внимание! Эту процедуру можно выполнять
только в отношении пустой очереди. Иначе будут утечки памяти.
Если очередь непустая, то следует применить вызов QFree().}
procedure Init(var aQ : TQueue);
begin
  aQ.PFirst := nil;
  aQ.PLast := nil;
end;
 
{Добавление элемента в конец очереди.}
procedure Push(var aQ : TQueue; const aData : TData);
var
  P : TPElem;
begin
  New(P);           {Выделение памяти для элемента.}
  P^.Data := aData; {Записываем основные данные.}
  P^.PNext := nil;  {Т. к., элемент добавляется в конец очереди, то указатель на следующий элемент = NIL.}
  if aQ.PFirst = nil then {Если очередь пустая, то новый элемент становится первым элементом очереди.}
    aQ.PFirst := P
  else                    {Если очередь не пустая, то новый элемент прикрепляем к последнему элементу очереди.}
    aQ.PLast^.PNext := P;
  aQ.PLast := P;    {Добавленный элемент становится последним элементом очереди.}
end;
 
{Изъятие элемента из начала очереди. Если очередь непустая, то
из начала очереди извлекается элемент и его значение возвращается
через параметр aData. В этом случае функция возвращает True.
Если очередь пустая, то операция отменяется и функция возвращает False.}
function Pop(var aQ : TQueue; var aData : TData) : Boolean;
var
  P : TPElem;
begin
  Pop := False;
  P := aQ.PFirst;
  if P <> nil then
  begin
    aData := P^.Data;       {Читаем данные первого элемента очереди.}
    aQ.PFirst := P^.PNext;  {Первым элементом очереди становится тот элемент, который раньше был вторым.}
    if aQ.PFirst = nil then {Если очередь оказалась пустой, то обнуляем указатель на её последний элемент.}
      aQ.PLast := nil;
    Dispose(P);             {Освобождаем память, занятую для элемента.}
    Pop := True;
  end;
end;
 
{Освобождение памяти, выделенной для элементов очереди (очистка очереди).}
procedure QFree(var aQ : TQueue);
var
  Data : TData;
begin
  while Pop(aQ, Data) do;
end;
 
{Распечатка очереди в направлении: начало - конец.
Здесь для упрощения и ускорения работы будем работать с очередью, как со списком.}
procedure QWriteln(const aQ : TQueue);
var
  P : TPElem;
begin
  P := aQ.PFirst;
  if P = nil then
    Write('Очередь пуста.')
  else
  repeat
    Write(P^.Data, ' ');
    P := P^.PNext;
  until P = nil;
  Writeln;
end;
 
var
  Q1, Q2, Q3 : TQueue;
  Data : TData;
  i : Integer;
  S : String;
begin
  {Начальная инициализация очередей.}
  Init(Q1);
  Init(Q2);
  Init(Q3);
  repeat
    Writeln('--------------------------------------------------');
    Randomize; {Инициализация генератора случайных чисел.}
    {Записываем в очереди случайные наборы символов алфавита и цифр.}
    for i := 1 to Random(11) do
      if Random(2) = 0 then {Случайная заглавная буква английского алфавита.}
        Push(Q1, Chr(65 + Random(26)))
      else                  {Случайная десятичная цифра.}
        Push(Q1, Chr(48 + Random(10)));
    for i := 1 to Random(11) do
      if Random(2) = 0 then {Случайная заглавная буква английского алфавита.}
        Push(Q2, Chr(65 + Random(26)))
      else                  {Случайная десятичная цифра.}
        Push(Q2, Chr(48 + Random(10)));
    Writeln('Начальное состояние очередей:');
    QWriteln(Q1);
    QWriteln(Q2);
 
    {Решение.}
    {1. Переливаем все элементы из первой очереди - во вторую.}
    while Pop(Q1, Data) do
      Push(Q2, Data);
    {2. Переливаем из второй очереди:
     - в первую очередь - те элементы, которые являются цифрами;
     - в третью очередь - все остальные элементы (т. е., те элементы, которые НЕ являются цифрами.}
    while Pop(Q2, Data) do
      if Data in ['0'..'9'] then
        Push(Q1, Data)
      else
        Push(Q3, Data);
    {3. Переливаем все элементы из третьей очереди - во вторую.}
    while Pop(Q3, Data) do
      Push(Q2, Data);
 
    {Ответ.}
    Writeln('Состояние очередей после обработки:');
    QWriteln(Q1);
    QWriteln(Q2);
 
    {Освобождение памяти, выделенной для элементов очередей.}
    QFree(Q1);
    QFree(Q2);
    QFree(Q3);
    Writeln('-----');
    Writeln('Память, выделенная для очередей, освобождена.');
 
    Write('Повторить - Enter, выход - любой символ + Enter. ');
    Readln(S);
  until S <> '';
end.
1
Модератор
Эксперт по электронике
7522 / 3710 / 1456
Регистрация: 01.02.2015
Сообщений: 11,541
Записей в блоге: 2
26.06.2015, 17:57 8
Точно!
Я забыл, что очередь<>стек, т.е. считанные элементы можно поместить в ту же очередь, и они не будут "мешать" (некоторое время).
Поэтому в своём решении я просто "переливал" элементы из одной очереди в другую, постепенно по одной переставляя "цифры" в конец очереди - долго и затратно.
0
13067 / 5853 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
26.06.2015, 18:01 9
Да. И ещё в решении используется счётчик (Cnt) для подсчёта элементов очереди. С помощью него определяется, когда следует завершить цикл просмотра очереди.
1
Модератор
Эксперт по электронике
7522 / 3710 / 1456
Регистрация: 01.02.2015
Сообщений: 11,541
Записей в блоге: 2
26.06.2015, 19:16 10
Счетчик это уже последствие, главное было - куда девать "не те" элементы.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.06.2015, 19:16

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Как сделать так чтобы вводились только числа в Edit?
Мне нужно чтобы Edit был всегда integer.

Как сделать так, чтобы код мог принимать только определенные числа?
Дело в том, что если вводить числа с 5-ти до 8-ми, то ответы в коде сходятся, а если ввести числа...

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

Как сделать так что бы по нажатию одной кнопки нажимались по очереди две?
Поясню на примере. Допустим нажимаю я кнопку K и в первый раз вместо K реализуется 1, а во второй...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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