Форум программистов, компьютерный форум, киберфорум
Наши страницы

Turbo Pascal

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
ST2502
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 12
#1

Список слов распечатать в алфавитном порядке. В Turbo Pascal или Pascal ABC - Turbo Pascal

23.02.2013, 01:18. Просмотров 2291. Ответов 20
Метки нет (Все метки)

Дана непустая последовательность слов, в каждом из которых содержится от 1 до 6 заглавных латинских букв; соседние слова разделены запятой, за последним словом следует точка. В качестве внутреннего представления последовательности слов использовать массив из 6 списков, в котором хранятся 5-буквенные слова, упорядоченные по алфавиту.
Требуется ввести эту последовательность слов в память ЭВМ, преобразовав ее во внутреннее представление, а затем распечатать в алфавитном порядке: сначала все однобуквенные слова, затем все двубуквенные и т.д.
В программе должны быть определены процедура выделения очередного слова из исходной последовательности и процедура вставки слова в упорядоченный список. Вводить последовательность слов следует посимвольно. Следует упорядочивать списки одновременно с вводом слов: введенное слово следует сразу вставлять в "свое" место в ранее упорядоченный список. Для упрощения рекомендуется использовать списки с заглавными звеньями. В этом случае следует в начале выполнения программы построить список(списки) с одним заглавным звеном. В звеньях списков(вершинах) следует хранить не только слова, но и дополнительную информацию(порядковый номер слова в исходной последовательности или число его вхождений в эту последовательность). Для каждого слова лучше иметь только одно звено, фиксируя в нем число вхождений этого слова в последовательность; при печати же надо продублировать слово данное число раз.

Я понимаю, что условий много))) но без всех этих условий у меня не примут работу. Лично от меня условие написать по возможности комментарии, чтобы мне самой понять ее))))
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2013, 01:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Список слов распечатать в алфавитном порядке. В Turbo Pascal или Pascal ABC (Turbo Pascal):

Нужно перевести код с Pascal ABC на Turbo Pascal - рисование работающей мельницы - Turbo Pascal
Вот код, он должен рисовать работающею мельницу. uses graphABC,crt; type point=record x,y:integer; end; ...

Переобразовать pascal abc в turbo - Turbo Pascal
Привет всем, помогите перевести текст из Pascal ABC в Turbo-Pascal. В ABC program grant; Uses graphABC,CRT; Var klavisha:char; ...

Turbo Pascal, Pascal ABC, Free Pascal, PascalABC.NET - в чем разница? - Pascal
Всем привет, решил изучать Паскаль, но на форуме увидел 4 его версии - Turbo Pascal, Pascal ABC, Free Pascal, PascalABC.NET и не понял, в...

Различия трансляторов Pascal ABC.Net и Turbo/Borland Pascal - Pascal
Пожалуйста, объясните различия между компиляторами Pascal ABC.Net и Turbo/Borland Pascal

Чем отличаются Turbo Pascal и Pascal ABC? - Pascal
Чем отличаются турбо паскаль и abc? Просто у меня windows7 последняя теперь стоит, и там турбо паскаль не идет, а нам по нему задания...

Нужен Turbo pascal или Free pascal на русском - Pascal
Нужен Turbo pascal или Free pascal на русском языке, есть такой или нет? По книге обучаюсь по Turbo pascal, а установлен pascalABC, в книге...

20
Mawrat
12789 / 5696 / 672
Регистрация: 19.09.2009
Сообщений: 8,838
23.02.2013, 22:02 #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
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
program Project1;
 
uses
  Crt;
 
type
  {Тип основных данных списка.}
  TData = record
    S : String; {Слово.}
    Cnt : Integer; {Счётчик - сколько раз слово S присутствует в тексте.}
  end;
  {Тип указателя на элемент списка.}
  TPElem = ^TElem;
  {Тип элемента списка.}
  TElem = record
    Data : TData; {Основные данные элемента.}
    PNext : TPElem; {Указатель на следующий элемент списка.}
  end;
 
{Добавление элемента в однонаправленный упорядоченный список.
Список упорядочен по возрастанию (т. е. по алфавиту в соответствие
с действующей кодировочной таблицей.}
procedure Add(var aPList : TPElem; const aStr : String);
var
  PNew, PPrev, PCur : TPElem;
begin
  {Указатель на предыдущий элемент.}
  PPrev := nil;
  {Указатель на текущий элемент.}
  PCur := aPList;
  {Ищем позицию для вставки нового элемента. Новый элемент вставляется
  между элементами PPrev и PCur.}
  while (PCur <> nil) and (PCur^.Data.S < aStr) do begin
    {Переходим к следующему элементу.}
    PPrev := PCur;
    PCur := PCur^.PNext;
  end;
  {Вставка элемента в список.}
  {Вставка элемента в конец списка. В этом случае PPrev является указателем
  на последний элемент списка.}
  if PCur = nil then begin
    New(PNew);
    PNew^.Data.S := aStr;
    PNew^.Data.Cnt := 1;
    PNew^.PNext := nil;
    {Если список пуст, то новый элемент становится единственным
    элементом списка.}
    if PPrev = nil then
      aPlist := PNew
    {Если список непустой, то новый элемент добавляем после последнего
    элемента списка.}
    else
      PPrev^.PNext := PNew;
  {Найдено такое же слово. В этом случае вместо вставки выполняем
  увеличение счётчика по этому слову.}
  end else if PCur^.Data.S = aStr then
    Inc(PCur^.Data.Cnt)
  {Вставка вначале или внутри списка. В этом случае мы должны вставить новый
  элемент между элементами PPrev и PCur}
  else begin
    New(PNew);
    PNew^.Data.S := aStr;
    PNew^.Data.Cnt := 1;
    PNew^.PNext := PCur;
    if PPrev = nil then {Если вставка в начало списка.}
      aPList := PNew
    else                {Если вставка внутри списка.}
      PPrev^.PNext := PNew;
  end;
end;
 
{Освобождение памяти, занятой под список и инициализация списка.}
procedure Free(var aPList : TPElem);
var
  PDel : TPElem;
begin
  while aPList <> nil do begin
    PDel := aPList;
    aPList := aPList^.PNext;
    Dispose(PDel);
  end;
end;
 
{Распечатка однонаправленного списка.}
procedure WritelnList(const aPList : TPElem);
var
  PElem : TPElem;
  i, j : Integer;
begin
  if aPList = nil then begin
    Writeln('Список пуст.');
    Exit;
  end;
 
  PElem := aPList;
  i := 0;
  while PElem <> nil do begin
    {Распечатываем текущее слово PElem^.Data.Cnt раз.}
    for j := 1 to PElem^.Data.Cnt do begin
      Inc(i); {Счётчик распечатанных слов.}
      if i > 1 then Write(', ');
      Write(PElem^.Data.S);
    end;
    PElem := PElem^.PNext;
  end;
  Writeln;
end;
 
{Выделение слова из входной последовательности.
Функция работает так. Если введён символ отличный от разделителя, то
этот символ добавляется к строке aStr и распечатывается на экране.
После этого выполняется чтение следующего символа с консоли ввода.
Если введён разделитель, то он обрабатывается, затем функция завершает
работу и возвращает в качестве своего значения этот разделитель.
Через параметр aStr функция возвращает слово - непрерывную последовательность
символов, отличных от разделителей.}
function GetWord(var aStr : String) : Char;
const
  {Множество разделителей слов.}
  D = ['.', ',', ':', ';', '!', '?', '-', ' ', #0, #8, #9, #10, #13, #27];
var
  Ch : Char;
begin
  aStr := '';
  repeat
    Ch := Readkey;
    if not (Ch in D) then begin
      aStr := aStr + Ch;
      Write(Ch);
    end else if Ch = #13 then
      Writeln
    else if Ch = #0 then
      Readkey
    else if not (Ch in [#8, #27]) then
      Write(Ch);
  until Ch in D;
  GetWord := Ch;
end;
 
const
  M = 6;
var
  Arr : array[1..M] of TPElem;
  Ch : Char;
  i : Integer;
  S : String;
begin
  {Начальная инициализация массива.}
  for i := 1 to M do Arr[i] := nil;
 
  repeat
    {Обработка текста, выделение слов, создание списков.}
    Writeln('Задайте текст. Обработаны будут только те слова, которые состоят');
    Writeln('не более, чем из ', M, ' букв. Прекратить ввод - ESC.');
    repeat
      Ch := GetWord(S);
      i := Length(S);
      case i of
        1..M: Add(Arr[i], S);
      end;
    until Ch = #27;
    Writeln;
 
    {Распечатка результатов.}
    Writeln('Результаты:');
    for i := 1 to M do begin
      Writeln('Слова с длиной ', i, ':');
      WritelnList(Arr[i]);
    end;
    Writeln;
 
    {Освобождение памяти, занятой под списки.}
    for i := 1 to M do Free(Arr[i]);
    Writeln('Память, занятая под списки, освобождена.');
 
    Writeln('Повторить - Enter, выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
3
ST2502
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 12
23.02.2013, 22:25  [ТС] #3
Mawrat, спасибооо большоее))) оперативно))) а остальные условия учтены?
0
Mawrat
12789 / 5696 / 672
Регистрация: 19.09.2009
Сообщений: 8,838
23.02.2013, 23:02 #4
Пожалуйста.
Цитата Сообщение от ST2502 Посмотреть сообщение
а остальные условия учтены?
Да, учтены. По порядку:
Цитата Сообщение от ST2502 Посмотреть сообщение
В качестве внутреннего представления последовательности слов использовать массив из 6 списков, в котором хранятся 5-буквенные слова, упорядоченные по алфавиту.
Это сделано. Только формулировка здесь неверная. Правильно: "... в котором хранятся слова с длинами от 1 до 6, соответственно в списках: Arr[1]..Arr[6]. В каждом списке слова упорядочены по алфавиту."
И ещё уточню - слова хранятся почти по алфавиту. - Согласно кодировочной таблице. Если работа и идёт в Borland/Turbo Pascal, то действует кодировочная таблица CP866.
Цитата Сообщение от ST2502 Посмотреть сообщение
Требуется ввести эту последовательность слов в память ЭВМ, преобразовав ее во внутреннее представление, а затем распечатать в алфавитном порядке: сначала все однобуквенные слова, затем все двубуквенные и т.д.
Сделано.
Цитата Сообщение от ST2502 Посмотреть сообщение
В программе должны быть определены процедура выделения очередного слова из исходной последовательности и процедура вставки слова в упорядоченный список.
Сделано.
Цитата Сообщение от ST2502 Посмотреть сообщение
Вводить последовательность слов следует посимвольно.
Это тоже реализовано - применена функция Readkey().
Цитата Сообщение от ST2502 Посмотреть сообщение
Следует упорядочивать списки одновременно с вводом слов: введенное слово следует сразу вставлять в "свое" место в ранее упорядоченный список.
Сделано.
Цитата Сообщение от ST2502 Посмотреть сообщение
Для упрощения рекомендуется использовать списки с заглавными звеньями. В этом случае следует в начале выполнения программы построить список(списки) с одним заглавным звеном.
Заглавное звено я не стал делать.
Цитата Сообщение от ST2502 Посмотреть сообщение
В звеньях списков(вершинах) следует хранить не только слова, но и дополнительную информацию(порядковый номер слова в исходной последовательности или число его вхождений в эту последовательность). Для каждого слова лучше иметь только одно звено, фиксируя в нем число вхождений этого слова в последовательность;
Сделано.
Цитата Сообщение от ST2502 Посмотреть сообщение
при печати же надо продублировать слово данное число раз.
И это тоже сделано.

Добавлено через 6 минут
Сейчас ещё проверю...

Добавлено через 1 минуту
Есть проблемы. Сейчас подправлю...

Добавлено через 17 минут
Исправил. Исправленный код в том же сообщении, выше..

Добавлено через 28 секунд
Проверяй.
2
ST2502
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 12
23.02.2013, 23:02  [ТС] #5
Mawrat, *______* боже, что я бы делала без вас))) еще раз огромное спасибооо)))
0
Mawrat
12789 / 5696 / 672
Регистрация: 19.09.2009
Сообщений: 8,838
23.02.2013, 23:07 #6
Если в программе что-то непонятно - спрашивай. Расскажу. Вообще, что касается списков, желательно рисовать элементы и их связи на бумаге - так легче разобраться, что происходит при действиях со списком.
2
HighPredator
23.02.2013, 23:08
  #7

Не по теме:

Цитата Сообщение от ST2502 Посмотреть сообщение
что я бы делала без вас)
Сидели бы без работы.

0
Mawrat
12789 / 5696 / 672
Регистрация: 19.09.2009
Сообщений: 8,838
23.02.2013, 23:14 #8
Цитата Сообщение от ST2502 Посмотреть сообщение
Mawrat, *______* боже, что я бы делала без вас))) еще раз огромное спасибооо)))
Цитата Сообщение от HighPredator Посмотреть сообщение
Сидели бы без работы.
На самом деле, может выпасть ещё одно испытание - если работодатель попросит дать разъяснения по действиям в программе. Поэтому в коде надо постараться разобраться.
0
HighPredator
5544 / 1857 / 346
Регистрация: 10.12.2010
Сообщений: 5,479
Записей в блоге: 2
23.02.2013, 23:15 #9
Цитата Сообщение от Mawrat Посмотреть сообщение
На самом деле, может выпасть ещё одно испытание - если работодатель попросит дать разъяснения по действиям программы. Поэтому в коде надо постараться разобраться.
Тоже верно.
2
ST2502
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 12
23.02.2013, 23:23  [ТС] #10
Цитата Сообщение от HighPredator Посмотреть сообщение

Не по теме:


Сидели бы без работы.

не сидела бы)))
Цитата Сообщение от Mawrat Посмотреть сообщение
На самом деле, может выпасть ещё одно испытание - если работодатель попросит дать разъяснения по действиям в программе. Поэтому в коде надо постараться разобраться.
он попросит)) разберусь, вроде все понятно)))
0
Mawrat
12789 / 5696 / 672
Регистрация: 19.09.2009
Сообщений: 8,838
23.02.2013, 23:45 #11
ST2502, например, может быть такой вопрос: в функции GetWord() пояснить назначение строк:
Pascal
1
2
3
4
5
6
    end else if Ch = #13 then
      Writeln
    else if Ch = #0 then
      Readkey
    else if Ch <> #8 then
      Write(Ch);
Ответ.
Если введён символ с кодом #13 - то это перевод каретки. Т. е., переход на новую строку. Поэтому мы выполняем вызов Writeln.
Если спросят - а почему бы в этом случае не написать так: Write(Ch) или так: Write(#13)?
Ответ: потому что на самом деле перевод каретки состоит из двух знаков: #13#10 - переход на новую строку и конец строки. Поэтому вместо Writeln можно написать так: Write(#13#10).
Теперь что касается знака #0. Если пользователь нажмёт какую-нибудь функциональную клавишу F1, F2 и т. д., то в этом случае Readkey() вернёт код #0. А при следующем вызове Readkey() вернёт скан-код нажатой клавиши. Поэтому в программе, если вызов Readkey() вернул #0, то значит произошло нажатие функциональной клавиши. В этом случае мы ещё раз вызываем Readkey(), чтобы прочитать скан-код клавиши. Далее этот скан код мы никак не используем, т. к., он нам не нужен.
Знак #8 - это нажатие клавиши BackSpace.

Добавлено через 19 минут
И ещё немного подправил - чтобы символ #27 (ESC) не распечатывался на экране.
Т. е., заменил:
Pascal
1
2
    else if Ch <> #8 then
      Write(Ch);
на:
Pascal
1
2
    else if not (Ch in [#8, #27]) then
      Write(Ch);
Полностью:
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
{Выделение слова из входной последовательности.
Функция работает так. Если введён символ отличный от разделителя, то
этот символ добавляется к строке aStr и распечатывается на экране.
После этого выполняется чтение следующего символа с консоли ввода.
Если введён разделитель, то он обрабатывается, затем функция завершает
работу и возвращает в качестве своего значения этот разделитель.
Через параметр aStr функция возвращает слово - непрерывную последовательность
символов, отличных от разделителей.}
function GetWord(var aStr : String) : Char;
const
  {Множество разделителей слов.}
  D = ['.', ',', ':', ';', '!', '?', '-', ' ', #0, #8, #9, #10, #13, #27];
var
  Ch : Char;
begin
  aStr := '';
  repeat
    Ch := Readkey;
    if not (Ch in D) then begin
      aStr := aStr + Ch;
      Write(Ch);
    end else if Ch = #13 then
      Writeln
    else if Ch = #0 then
      Readkey
    else if not (Ch in [#8, #27]) then
      Write(Ch);
  until Ch in D;
  GetWord := Ch;
end;
И ещё добавил Writeln перед распечаткой результатов.
Исправленный код в прежнем сообщении.
2
ST2502
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 12
24.02.2013, 12:19  [ТС] #12
Mawrat, а можно функцию GetWord без этих символов( #0, #8, #9, #10, #13, #27)? так как я не мастер в проге и препод догадается, что я не сама это сделала)))) + "прекратить ввод - esc" можно его заменить просто enter? "Память занятая под списки освобождена" для чего это было сделано? обязателен ли он? "повторить - enter" это тоже не понадобится думаю)) также он читает любые слова менее 6 букв, например, "f f f", "qw//", "а**", "wer**/", хотя он должен читать только слова с латинскими буквами без других символов. можете исправить?))
0
Mawrat
12789 / 5696 / 672
Регистрация: 19.09.2009
Сообщений: 8,838
24.02.2013, 12:46 #13
Цитата Сообщение от ST2502 Посмотреть сообщение
а можно функцию GetWord без этих символов( #0, #8, #9, #10, #13, #27)?
Ну в общем, если пользователь обязуется не нажимать функциональные клавиши (F1, F2, и др.), то можно убрать код #0. Код #8 - это клавиша BackSpace - пользователь может попытаться стереть какие-нибудь символы. Поэтому эту клавишу желательно перехватывать. Код #10 можно убрать. #13 - это Enter. А #27 - это ESC.
Цитата Сообщение от ST2502 Посмотреть сообщение
"прекратить ввод - esc" можно его заменить просто enter?
Да, можно и по Enter завершение ввода сделать.
Цитата Сообщение от ST2502 Посмотреть сообщение
"Память занятая под списки освобождена" для чего это было сделано? обязателен ли он?
Раз мы память выделили, то её надо позже освободить. Т. е., раз мы у системы (или у менеджера памяти) взяли память, то потом её надо возвратить. Иначе будут утечки памяти. Т. е. память будет помечена, как используемая в программе, хотя программа к ней уже не будет иметь доступа. Таким образом эту память не сможет использовать менеджер памяти и соответственно, она не будет отдана системе. Ещё такие участки памяти называют "мёртвыми".
Вообще, когда проверяется код программы, где идёт работа с динамической памятью, первое что делается, смотрят - ага есть вызов New(), теперь смотрим - есть ли вызов Dispose()? Нет Dispose() - всё, это уже серьёзный недочёт. Чаще всего, убедившись в отсутствии Dispose(), проверка сразу же и заканчивается.
Цитата Сообщение от ST2502 Посмотреть сообщение
он читает любые слова менее 6 букв, например, "f f f", "qw//", "а**", "wer**/", хотя он должен читать только слова с латинскими буквами без других символов.
Да сейчас "буквами" считаются любые символы, отличные от разделителей. Можно изменить код таким образом, чтобы только буквы латиницы учитывались.
---
В общем я сейчас подправлю. И выложу здесь код чуть позже.
1
ST2502
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 12
24.02.2013, 13:06  [ТС] #14
Цитата Сообщение от Mawrat Посмотреть сообщение
Ну в общем, если пользователь обязуется не нажимать функциональные клавиши (F1, F2, и др.), то можно убрать код #0.
обязуюсь))
Цитата Сообщение от Mawrat Посмотреть сообщение
Код #8 - это клавиша BackSpace - пользователь может попытаться стереть какие-нибудь символы. Поэтому эту клавишу желательно перехватывать.
наоборот, мне легче было бы если при неправильном вводе смогла стереть ненужное)))
0
Mawrat
12789 / 5696 / 672
Регистрация: 19.09.2009
Сообщений: 8,838
24.02.2013, 13:45 #15
Цитата Сообщение от ST2502 Посмотреть сообщение
наоборот, мне легче было бы если при неправильном вводе смогла стереть ненужное)))
Тогда понадобится поменять алгоритм ввода. И здесь уже надо будет уточнить тогда. У нас есть два условия:
Цитата Сообщение от ST2502 Посмотреть сообщение
Вводить последовательность слов следует посимвольно.
Цитата Сообщение от ST2502 Посмотреть сообщение
В программе должны быть определены процедура выделения очередного слова из исходной последовательности
У нас сейчас есть функция GetWord(), которая извлекает слова из посимвольного ввода с консоли. И таким образом у нас выполняются оба условия - у нас есть процедура, которая обеспечивает посимвольный ввод и извлечение слов.
Сейчас у пользователя нет возможности редактирования текста, который он вводит. Если мы такую возможность предоставим, то нам понадобится отслеживать изменения, сделанные пользователем. Это сделать можно - мы должны будем хранить всё введённые символы в буфере - в символьном массиве. Если пользователь нажмёт BackSpace (#8), то мы уменьшим значимую длину буфера на 1 - тем самым, удалим последний символ. В течение всего времени ввода текста мы не должны извлекать слова, потому что нам не известно окончательное состояние текста (ведь пользователь может часть слов стереть). Только когда пользователь завершит ввод (нажмёт Enter (#13), например) - вот тогда мы начнём извлекать слова из буфера.
Устроит такой вариант?

Добавлено через 2 минуты
Клавиши стрелок запретим - потому что логика с их участием усложнится.
0
24.02.2013, 13:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2013, 13:45
Привет! Вот еще темы с ответами:

Из множества выбрать три различные точки по условию -из Turbo Pascal во Free Pascal - Turbo Pascal
Даны 2 множества точек на плоскости. Выбрать три различные точки первого множества так, чтобы круг ограниченный окружностью , проходящий...

Составить в алфавитном порядке список всех слов, встречающихся в тексте - Turbo Pascal
Дан файл содержащий текст на русском языке. Составить в алфавитном порядке список всех слов, встречающихся в этом тексте Добавлено...

Составить в алфавитном порядке список всех слов, встречающихся в тексте - Turbo Pascal
Дан файл содержащий текст на русском языке. Составить в алфавитном порядке список всех слов, встречающихся в этом тексте Добавлено...

Составить в алфавитном порядке список всех слов, встречающихся в этом тексте - Pascal
Дана строка, содержащая текст на русском языке. Составить в алфавитном порядке список всех слов, встречающихся в этом тексте.


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

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

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