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

Var Info: array[1..1000] of tInfo;

s: string;

N, p, i, j, count, curTime: integer;

c: char;

temp: TInfo;

{ функция для преобразования времени в число }

function Time2Int(sTime: string): integer;

Var h, m, code0: integer;

begin

code0 := Ord('0');

h := 10*(Ord(sTime[1])-code0) + (Ord(sTime[2])-code0);

m := 10*(Ord(sTime[4])-code0) + (Ord(sTime[5])-code0);

Time2Int := 60*h + m;

end;

{--------------------------------------------}

begin

readln(s);

curTime := Time2Int(s);

readln(N);

count := 0;

{ ввод данных о пассажирах }

for i:=1 to N do begin

readln(s);

p := Pos(' ', s);

Info[count+1].name := Copy(s,1,p-1);

Info[count+1].time := Time2Int(Copy(s,p+1,Length(s)-p));

if Info[count+1].time <= curTime+120 then

count := count + 1;

end;

{ сортировка массива }

for i:=1 to count do

for j:=count-1 downto i do

if Info[j].time > Info[j+1].time then begin

temp := Info[j];

Info[j] := Info[j+1];

Info[j+1] := temp;

end;

{ вывод списка }

for i:=1 to count do

writeln(Info[i].name);

end.

  1. условия становится ясно, что задача решается в два этапа:

  1. прочитать символы до точки и определить длину самого короткого слова из латинских букв (обозначим ее minLen);

  2. сделать «сдвиг» кодов латинских букв на minLen влево.

Начнем с первого. Простое посимвольное чтение строки s до первой встреченной точки выглядит так (здесь c – переменная типа char):

s := ''; { пустая строка }

repeat

read(c); { прочитали символ }

s := s + c; { добавили в конец строки }

until c = '.';

При этом нам нужно еще определить длину самого короткого слова с учетом того, что между словами может быть сколько угодно символов-разделителей (разных!). Введем переменную len, которая будет определять длину текущего (очередного, вводимого в данный момент) слова.

Как определить, что прочитанный символ – латинская буква? Конечно, можно использовать условный оператор со сложным условием:

if (('a' <= c) and (c <= 'z')) or

(('A' <= c) and (c <= 'Z')) then ...

Более красиво это можно сделать с помощью оператора in, который проверяет, входит ли элемент во множество:

If c in ['a'..'z', 'a'..'z'] then ...

Здесь множество в квадратных скобках содержит два интервала: от 'a' до 'z' и от 'A' до 'Z'.

Если очередной прочитанный символ – латинская буква, нужно увеличить len на единицу (слово продолжается). Если же это не латинская буква, то слово закончилось, так как встречен символ-разделитель . Если в переменной len ненулевое значение, нужно сравнить эту длину с минимальной и, если прочитанное слово короче всех предыдущих, записать его длину в minLen. Таким образом, цикл ввода выглядит так:

s := '';

minLen := 201; { любое число > 200 }

len := 0;

repeat

read(c);

s := s + c;

If c in['a'..'z','a'..'z'] then

len := len + 1

else begin

if (len > 0) and (len < minLen) then

minLen := len;

len := 0;

end;

until c = '.';

Теперь нужно в цикле пройти всю прочитанную строку и «сдвинуть» каждый символ (точнее, его код) вправо на minLen:

for i:=1 to Length(s) do

if s[i] in ['a'..'z','A'..'Z'] then begin

code := Ord(s[i]); { старый код }

k := code - minLen; { новый код }

s[i] := Chr(k);

end;

Однако такое решение не учитывает цикличность: например, при сдвиге буквы 'A' на 2 символа влево мы не получим 'Y'. Поэтому после изменения кода нужно проверить, не вышел ли он за допустимые границы (диапазона латинских букв), а если вышел, то добавить к полученному коду 26 (число латинских букв), что обеспечит циклический сдвиг:

k := code - minLen; { новый код }

{ цикличность }

if s[i] in ['a'..'z'] then

if k < Ord('a') then k := k + 26;

if s[i] in ['A'..'Z'] then

if k < Ord('A') then k := k + 26;

Вот полная программа:

var c: char;

s: string;

len, minLen, code, i, k: integer;

begin

s := '';

minLen := 201; { любое число > 200 }

len := 0;

{ чтение данных }

repeat

read(c);

s := s + c;

if c in['a'..'z','A'..'Z'] then

len := len + 1

else begin

if (len > 0) and (len < minLen) then

minLen := len;

len := 0;

end;

until c = '.';

{ сдвиг кодов на minLen влево }

for i:=1 to Length(s) do

if s[i] in ['a'..'z','A'..'Z'] then begin

code := Ord(s[i]); { старый код }

k := code - minLen; { новый код }

{ цикличность }

if s[i] in ['a'..'z'] then

if k < Ord('a') then k := k + 26;

if s[i] in ['A'..'Z'] then

if k < Ord('A') then k := k + 26;

{ запись нового кода }

s[i] := Chr(k);

end;

writeln(s);

end.

  1. В условии очень важна последняя строчка: «количество голосов избирателей в исходном списке может быть велико (свыше 1000), а количество различных партий в этом списке не превосходит 10». Это значит, что

  • нельзя хранить в массиве все прочитанные записи

  • можно (и нужно) хранить в массиве названия партий, их не больше 10.

Таким образом, нужно выделить массив строк:

const MAX = 10;

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