Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
19.05.2015
Размер:
719.36 Кб
Скачать

Var c: char;

num: array['0'..'9'] of integer;

k, count: integer;

s, sL, sR: string;

begin

{ ввод данных, подсчет количества цифр }

for c:='0' to '9' do num[c] := 0;

count := 0;

repeat

read(c);

if ('0' <= c) and (c <= '9') then begin

num[c] := num[c] + 1;

count := count + 1;

end;

until c = '.';

{ строим левую sL и правую sR части }

sL := '';

sR := '';

if (num['0']=count) or (num['0']=count-1) then

num['0']:=1;

for c:='9' downto '0' do

while num[c] > 1 do begin

sL := sL + c;

sR := c + sR;

num[c] := num[c] - 2;

end;

{ центральная цифра }

c := '9';

while (c >= '0') and (num[c] = 0) do

c := Pred(c);

if c >= '0' then sL := sL + c;

{ вывод результата }

s := sL + sR;

if (Length(s) = count) and (count > 0) then begin

writeln('YES');

writeln(s);

end

else

writeln('NO');

end.

  1. В этой задаче нужно считать, сколько раз встречается во входной последовательности каждая цифра. Для этого используется массив счетчиков

Var num: array['1'..'9'] of integer;

Этот массив сначала заполняем нулями:

for c:='1' to '9' do num[c] := 0;

Тогда цикл ввода данных получается почти такой же, как в предыдущей задаче:

repeat

read(c);

if ('1' <= c) and (c <= '9') then

num[c] := num[c] + 1;

until c = '.';

В принципе, нас не интересует число цифр, поэтому вместо увеличения num[c] на единицу можно просто записывать туда 1

num[c]:= 1;

или даже сделать логический массив вместо целочисленного (оставим это в качестве упражнения).

Теперь остается вывести все цифры (начиная с младшей), для которых элемент массива num равен нулю. Для того, чтобы обработать случай, когда все цифры 1..9 есть во входных данных нет, введем счетчик цифр count, который будем увеличивать на 1, получив ненулевую цифру.

count:=0;

for c:='1' to '9' do begin

if num[c] = 0 then write(c)

else count := count + 1;

end;

После этого цикла нужно проверить счетчик count: если он равен 9, выводим «0» (все цифры встретились во входных данных). Приведем полное решение (И. Титков):

Var num: array['1'..'9'] of integer;

c: char;

count: integer;

begin

for c:='1' to '9' do num[c] := 0;

repeat

read(c);

if ('1' <= c) and (c <= '9') then

num[c]:= 1;

until c = '.';

count := 0;

for c:='1' to '9' do begin

if num[c] = 0 then write(c)

else count := count + 1;

end;

if count = 9 then writeln('0');

end.

  1. В решении этой задачи можно выделить несколько ключевых моментов:

  1. Выбор удобного способа хранения данных.

  2. Ввод данных и предварительная обработка.

  3. Сортировка в нужном порядке.

  4. Вывод результата.

Информации о каждой ячейке включает ее номер и дату сдачи багажа. Для облегчения расчетов мы сразу представим дату как день от начала года (как это сделать – обсудим после). Эти данные можно объединить в структуру (запись) следующего вида:

type TCell = record no, day: integer; end;

Поле no – это номер ячейки, а поле day – день от начала года, когда в ячейку положен багаж.

Теперь подумаем, как из символьной строки вида '01.06' получить день от начала года. Для этого построим функцию dayFromStart, которая принимает символьную строку такого формата и возвращает целое число – день от начала года:

function dayFromStart(s: sring):integer;

begin

...

end;

В этой функции сначала выделим день и месяц в отдельные переменные d и m, используя стандартную процедуру Val. Номер дня записан в первых двух символах (их можно выделить как Copy(s,1,2)), а номер месяца – в 4 и 5-м символах (Copy(s,4,2)):

Соседние файлы в папке ЕГЗ_2012_Поляков_май