Песни о Паскале - [97]

Шрифт
Интервал

Пусть наша новая программа повторит действия танцевального тренера, – инженеры называют это моделированием. Работать будем, конечно, не с живыми детьми, мы представим их как-то иначе. Условимся обозначать их латинскими буквами: девочек – строчными, а мальчиков – заглавными (только потому, что они выше ростом).



Рис. 99 – Запись в танцевальный кружок

Теперь станьте на место учителя: к вам приходят то мальчик, то девочка, но вы не знаете, кто будет следующим, – это поток, и в нём доступен только первый его элемент. Организовать входной поток можно посимвольным вводом «мальчиков» и «девочек». Но мы сделаем ещё проще: представим поток детишек строкой, и будем считать, что к преподавателю они являются слева направо по одному. Например, строка


>      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

>      c1:= S_IN[i]; { выбираем из входного потока }

>      if c1 in ['A'..'Z']

>      then begin { если это мальчик…}

>      { если в очереди есть девочка }

>      if GetFromQue(Girls, c2)

>      { добавляем пару в выходной поток }

>      then S_OUT:= S_OUT+c1+c2+’ ’

>      { а иначе помещаем мальчика в очередь }

>      else PutInQue(Boys, c1);

>      end

>      else begin { а если это девочка…}

>      { если в очереди есть мальчик }

>      if GetFromQue(Boys, c2)

>      { добавляем пару в выходной поток }

>      then S_OUT:= S_OUT+c2+c1+’ ’

>      { а иначе помещаем девочку в очередь }

>      else PutInQue(Girls, c1);

>      end

>end;

>Writeln('Входной поток:' );

>Writeln(S_IN);

>Writeln('Выходной поток:' );

>Writeln(S_OUT);


>if Length(Boys)>0 then begin

>      Writeln('В очереди мальчиков остались:' );

>      Writeln(Boys);

>end;


>if Length(Girls)>0 then begin

>      Writeln('В очереди девочек остались:' );

>      Writeln(Girls);

>end;

>Readln;

>end.


Процедура PutInQue просто добавляет символ в конец строки. Строго говоря, если длина строки достигнет 255, то новый символ не попадет в очередь. Но мы не станем усложнять программу дополнительными проверками, – считаем, что емкости очереди нам достаточно.

Но для функции GetFromQue, выбирающей из очереди первый символ, контроль строки на пустоту необходим, иначе работа модели нарушится. Функция возвращает состояние очереди, бывшее до извлечения символа (TRUE, если очередь не была пуста). А сам извлекаемый символ возвращается через параметр arg, – это ссылка на символьную переменную. Вот, пожалуй, и вся премудрость. Испытайте эту программу. Добавьте операторы печати для наблюдения за очередями.


Рекомендуем почитать
Трудный выбор. Радужная

В день 21-летия мне подарили два странных артефакта. Кто бы еще вчера сказал, что я - не человек, как и вся моя семья, я бы покрутила пальцем у виска. Но теперь все иначе, сказка оказалась правдой, а я - наследной принцессой в трех государствах другого мира, да и с сущностью моей совсем неясно. Кто я? Дракон или эльф? А может обычный человек, которому судьба приготовила испытания? Когда мир на грани катастрофы, семья на краю пропасти, останется ли место для всепоглощающей любви? Как сделать выбор и не допустить ошибку? А может ну его, этот мир?..


Разбитый Адам

Бог умер на кресте и сгнил, согласно научной картине мира, оставив своих детей. Либеральная Цивилизация решает покончить с "колыбелью человечества" и запускает в Солнце шаттлы с ядерными боеголовками. Теперь над Землей довлеет Багровый глаз. И он растет каждый час. Сможет ли Цивилизация сделать новый эволюционный шаг в виртуальный мир и вырезать из своих мозгов Архетип? Или Рай и жизнь для удовольствия – лишь дегенеративная сказка? Выдержит ли Прогресс экспансию Евразии или он обречен быть утопленным в животной религиозности? Знакомьтесь! Дьявол, заточенный в теле инвалида-гомосексуалиста, хлыстовка, ставшая Великой блудницей, самозванец, занявший опустевший трон Бога, а также отважные психонавты и другие неординарные личности сойдутся в напряженной схватке, чтобы решить, сохранит ли человек Образ Божий или станет чем-то другим? Роман-антиутопия "Разбитый Адам" повествует о развитии и столкновении апокалиптических проектов Евразии и западной цивилизации в середине 27-го столетия.


Круг Камней: Кровь эльфов

Давняя вражда между эльфами и людьми вспыхнула с новой силой. Эльфы завоевывают все новые территории и мечтают уничтожить Империю людей. Армия чудовищ, запечатанная в древнем эльфийском городе, оказалась на свободе. Неведомым образом все это связано с магией Круга Камней, о которой люди ничего не знают. Дознаватель Кристиан Уорден, несостоявшийся боевой маг, мечтавший о спокойной жизни советника лорда-правителя, оказался в эпицентре войны. Теперь ему придется совершить невозможное, чтобы выяснить правду о таинственном Круге и остановить врагов.


Столократия

15/09/2017rusamlib.ruhttp://samlib.rusamlib.ru2017-09-15 11:40:17http://samlib.ru/w/wbirjuk/zver_kc20doc.shtmlsamlib59bb91f724b474.929370741.0Бирюк В.Зверь Лютый. Книга 20. СтолократияЗверьлютыйКнига 20. СтолократияЧасть 77. "Увидишь клад, какого не..."Глава 419-- Шолом алейхем.-- Алейхем ашшалом. Э-э-э...-- Ну и что вы хочите сказать этим своим бесконечным "э-э-э", которое звучит как призыв взволнованной беременной овцы к заезжему акушеру в тот волнительный момент, когда уже поздно и опорос пошёл?-- Уважаемые! Я не знаю об чём вы тут спорите, но ехать уже пора!-- Золотые слова.


Новая религия

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


Ряска Правды

Люди до смерти боятся нечисти, обходят болото стороной. Нечисть, в свою очередь, презрительно фыркает, воротит нос и выбираться из чащоб не спешит. Впрочем, везде встречаются мечтатели — неправильную кикимору по имени Златеника тянет прочь, на свободу. Когда на берегу болота откуда ни возьмись является очаровательный принц, Ника принимает его деловое предложение. Вот только болото не отпускает так просто. Да и люди так просто не принимают. Во дворце гадюк больше, чем на топи. А если ещё и помочь темному магу…