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

Var words: array[1..27] of string;

и читать его в цикле:

for i:=1 to 27 do

readln(words[i]);

Затем, как обычно, читаем количество строк с данными и обрабатываем их в цикле. Обработка сводится к тому, чтобы поместить записанное в строке число в переменную (назовем ее number) и добавить это число к сумме (переменная sum):

readln(N);

sum:=0;

for i:=1 to N do begin

readln(s);

{ получить число и записать его в number }

sum:= sum + number;

end;

Сложность в том, что нужно складывать только числа в интервале от 1 до 99, а остальные – игнорировать. Это значит, что если в строке встретится слово, не входящее в словарь, нужно записать в переменную number значение 0.

Используя тот факт, что слова в строке разделены пробелами, можно «резать» строку по этим пробелам, «откусывая» начальное слово и переводя его в число. Цикл обработки строки может быть записан так:

number:=0;

p:=1;

while p > 0 then begin

p:= Pos(' ', s); { ищем номер пробела }

if p = 0 then { если пробела нет, }

s1 := s { ... то слово - это вся строка }

else begin { если пробел есть, то ... }

s1 := Copy(s, 1, p-1); { выделить первое слово }

Delete(s, 1, p); { и удалить его из строки }

end;

{ !!! изменить number !!! }

end.

Самый важный момент – как изменить переменную number. Во-первых, нужно попытаться найти выделенное первое слово (строку s1) в словаре. Для этого используем цикл, в котором сравниваем s1 с каждым элементом массива words:

j := 1; { начали с первого элемента }

while (j <= 27) and (s1 <> words[j]) do

j:= j + 1; { перейти к следующему слову }

Цикл завершается, когда слово найдено (в этом случае j<=27) или же массив полностью просмотрен и совпадения не найдено (при этом j>27).

В первом случае (если строка s1 найдена в словаре) нужно добавить к number соответствующее значение, например, так:

if j < 10 then { число от 1 до 9 }

number:=number + j

else

if j < 19 then { число от 11 до 19 }

number:=number + j + 1

else

number:=number + (j-18)*10; { десятки 10, 20, ... 90 }

или так:

if j < 19 then

number:=number + j + (j div 10)

else number:=number + (j-18)*10;

Если строка s1 не найдена в словаре (число не входит в диапазон 1..99), то нужно записать в number нуль, и в переменную p также нужно записать нуль, чтобы остановить цикл while. Таким образом, изменение number можно записать так:

if j <= 27 then

if j < 19 then

number:=number + j + (j div 10)

else number:=number + (j-18)*10

else begin

number:= 0; p:= 0;

end

Итак, все принципиальные моменты мы обсудили, теперь нужно собрать все в одну программу:

Var sum, p, I, j, n, number: integer;

s, s1: string;

words: array[1..27] of string;

begin

for i:=1 to 27 do { читаем словарь }

readln(words[i]);

readln(N); { читаем количество строк }

sum:=0;

for i:=1 to N do begin

readln(s); { читаем очередную строку }

number := 0;

p := 1;

while p > 0 do begin

p := Pos(' ',s); { найти пробел }

if p = 0 then s1 := s { в строке одно слово }

else begin { выделить первое слово }

s1 := Copy(s, 1, p-1);

Delete(s, 1, p);

end;

j := 1; { ищем слово в словаре }

while (j <= 27) and (s1 <> words[j]) do j:=j+1;

if j <= 27 then { если слово найдено… }

if j < 19 then

number:=number + j + (j div 10)

else number:=number + (j-18)*10

else begin { если слово не найдено… }

p:= 0; number:= 0;

end

end;

sum:=sum+number; { добавить число к сумме }

end;

writeln(sum);

end.

Рассмотрим другие правильные варианты решения. Например, для сокращения основной программы (и для того, чтобы сделать ее более понятной) можно выделить операцию получения числа, соответствующего заданному слову, в функцию:

function Word2Value(s1: string): integer;

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