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

Var j: integer;

begin

j := 1;

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

Word2Value:= 0;

if j <= 27 then

if j < 19 then

Word2Value:= j + (j div 10)

else Word2Value:= (j-18)*10;

end;

Тогда получается такое решение:

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

s, s1: string;

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

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

function Word2Value(s1: string): integer;

Var j: integer;

begin

j := 1;

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

Word2Value:= 0;

if j <= 27 then

if j < 19 then

Word2Value:= j + (j div 10)

else Word2Value:= (j-18)*10;

end;

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

begin

for i:=1 to 27 do

readln(words[i]);

readln(N);

sum:=0;

for i:=1 to N do begin

readln(s);

p := 1;

number := 0;

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;

v := Word2Value(s1); { получить число из слова }

if v > 0 then { если известное число...}

number:=number + v

else begin { если неизвестное число...}

number := 0; p := 0;

end;

end;

sum:=sum + number;

end;

writeln(sum);

end.

Возможен еще один вариант, который, согласно критериям оценивания для этой задачи, считается правильным и эффективным. Нужно выделить массив не на 27, а на 99 строк,

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

загрузить заданные 27 строк:

for i:=1 to 9 do readln(words[i]);

for i:=1 to 9 do readln(words[10+i]);

for i:=1 to 9 do readln(words[10*i]);

а затем составить полный словарь возможных «правильных» строк:

for i:=2 to 9 do

for j:=1 to 9 do

words[10*i+j]:= words[10*i] + ' ' + words[j];

Теперь основной цикл получается очень простой: сравниваем введенную строку со всеми строками из словаря, и если нашли совпадение, добавляем к сумме найденное число и выходим из цикла, используя оператор break:

sum:= 0;

for i:=1 to N do begin

readln(f,s);

for j:=1 to 99 do

if s = words[j] then begin

sum:=sum + j;

break; { этот оператор можно не писать }

end;

end;

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

Var sum, I, j, n: integer;

s: string;

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

begin

for i:=1 to 9 do readln(words[i]);

for i:=1 to 9 do readln(words[10+i]);

for i:=1 to 9 do readln(words[10*i]);

for i:=2 to 9 do

for j:=1 to 9 do

words[10*i+j] := words[10*i] + ' ' + words[j];

readln(N);

sum:=0;

for i:=1 to N do begin

readln(s);

for j:=1 to 99 do

if s = words[j] then begin

sum:=sum + j;

break;

end;

end;

writeln(sum);

end.

Внутренний цикл for (в котором сравниваются строки) можно заменить на цикл с условием, тогда не нужен оператор break:

j := 1;

while (j <= 99) and (s <> words[j]) do

j:= j + 1;

if j < 100 then sum:=sum + j;

Получилось очень короткое и красивое решение, но оно не лишено недостатков. Например, можно считать избыточным расход памяти (99 строк в массиве вместо 27). Однако, такое решение (согласно критериям оценивания для этой задачи) считается правильным и эффективным.

  1. Решение этой задачи явно подразумевает три этапа:

  1. чтение данных и подсчет букв, с которых начинаются слова, с помощью массива счётчиков;

  2. сортировка букв и соответствующих счётчиков

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

В Паскале массив счётчиков можно сделать с символьными индексами:

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