Если к ней являлось больше мальчиков, дама заносила их в мальчишечью записную книжку, то есть, ставила в очередь. Приняв девочку, она выбирала из этой очереди первого мальчика и составляла пару. Если же являлось больше девочек, то дама ставила их в девчоночью очередь (в другой записной книжке), а с приходом очередного мальчика составляла новую пару. Так, в порядке поступления, составлялись пары мальчиков и девочек.
Пусть наша новая программа повторит действия танцевального тренера, – инженеры называют это моделированием. Работать будем, конечно, не с живыми детьми, мы представим их как-то иначе. Условимся обозначать их латинскими буквами: девочек – строчными, а мальчиков – заглавными (только потому, что они выше ростом).
Теперь станьте на место учителя: к вам приходят то мальчик, то девочка, но вы не знаете, кто будет следующим, – это поток, и в нём доступен только первый его элемент. Организовать входной поток можно посимвольным вводом «мальчиков» и «девочек». Но мы сделаем ещё проще: представим поток детишек строкой, и будем считать, что к преподавателю они являются слева направо по одному. Например, строка
ZHJKqwertASDyuiopQWERTYUIOPasdf
означает, что первым явится мальчик по имени Z, а последней – девочка по имени f. Первая пара составится из мальчика Z и девочки q. Это упрощение не меняет сути нашей модели, но избавляет её от второстепенных деталей.
Итак, с учетом всех договоренностей, явим задачу в окончательном виде. Дана строка, состоящая из больших и маленьких букв латинского алфавита – «мальчиков» и «девочек». Мы должны сформировать другую строку, состоящую из тех же символов, но следующих попарно: сначала большая буква – «мальчик», затем маленькая – «девочка». Пары разделяются пробелом. Например, для указанной выше строки, пары должны быть составлены так:
Zq Hw Je Kr At Sy Du Qi Wo Ep Ra Ts Yd Uf
А напоследок программа должна напечатать имена тех, кто временно остался без пары. Здесь это будут пришедшие в числе последних мальчики I, O и P.
Если логика программы вам ясна, разрешим теперь главный вопрос: как организовать очередь символов? Ведь очередь – это не просто массив данных, а механизм, содержащий и хранилище данных и процедуры для работы с ними.
Сделаем так. Элементы очереди – символы – будем хранить в строковых переменных. К ним добавим ещё две процедуры: одну – для установки элемента в очередь, другую (это будет функция) – для извлечения из очереди первого элемента. Назовем их соответственно PutInQue – «поставить в очередь» и GetFromQue – «извлечь из очереди» (Queue – «очередь» или «хвост»). Всё это представлено в программе «P_45_1».
{ P_45_1 – Запись в танцевальный кружок }
{ Постановка символа arg в очередь Que }
procedure PutInQue(var Que: string; arg: char);
begin
Que:= Que + arg; { добавляем в конец строки }
end;
{ Выбор из очереди Que элемента в параметр arg }
function GetFromQue(var Que: string; var arg: char): boolean;
begin
if Length(Que) = 0 { если очередь пуста }
then GetFromQue:= false
else begin
GetFromQue:= true; { если не пуста }
arg:= Que[1]; { запоминаем первый элемент }
Delete (Que, 1, 1); { и удаляем его из очереди }
end
end;
{ Глобальные переменные }
var S_IN : string; { входной поток – символы }
S_OUT : string; { выходной поток (пары) }
Boys : string; { очередь мальчиков }
Girls : string; { очередь девочек }
c1,c2 : char; { очередная пара – символы строки }
i : integer; { индекс во входном потоке }
begin {--- Главная программа ---}
{ задаем (вводим) входной поток: A..Z – мальчики, a..z – девочки }
S_IN:='ZHJKqwertASDyuiopQWERTYUIOPasdf';
S_OUT:=''; { выходной поток пока пуст }
Boys:=''; Girls:=''; { Очищаем очереди мальчиков и девочек }
{ Цикл обработки входного потока }
for i:=1 to Length(S_IN) do begin