четверг, 25 октября 2012 г.

Подготовка к ЕГЭ в компьютерной форме

Задания для подготовки к пробному ЕГЭ по информатике в компьютерной форме скачать здесь.
Рассмотрим подробнее некоторые задачи.

С4

Будем называть разделителем символ '.' (точка) или ''(пробел). Будем называть словом любую непустую последовательность идущих подряд букв и (или) цифр, не содержащую разделителей, и ограниченную слева началом строки или разделителем, а справа — разделителем. Например, строка
AsdF 10 AS42 AS  77qqq.
содержит 5 слов: AsdF, 10, AS42, AS, 77qqq
Будем называть подходящим словом слово, являющееся записью целого числа в системе счисления с основанием 5. Например, слова
10, 44444, 0013, 0 – подходящие, а слова
46, two, один, 33а, 3z4z не являются подходящими.
Составьте программу, которая вводит строку символов длиной не менее 2 и не более 32, заканчивающуюся символом '.' (точка), а затем выводит на экран для всех подходящих слов входной строки, сумму соответствующих чисел. Значение суммы должно выводиться в десятичной системе счисления. Например, для входной строки
100 у3 AS42  AS  22 77w.
программа должна вывести 37.
Ничего, кроме суммы чисел, программа выводить не должна.

Решение
Напомню сперва функции, применяемые для работы с символьными данными:
function Length(S:string):integer - длина строки
function Ord(C: char):integer- код символа С в таблице ASCII.
Таким образом, если C - символ соответствующий некоторой цифре, то получить саму цифру можно следующим образом:
N := Ord(C) - Odr('0'); 
Рассмотрим программу для решения
var
  InS, Word: string; //InS - исходная строка, Word - отдельное слово в строке
  Sum, Tmp, Num5,  i: integer; // Sum - итоговая сумма, Tmp - код ошибки при переводе в пятеричную систему, Num5 - одно число

// Опишем процедуру, проверяет является ли строка корректно записанным пятеричным числом и переводит его в десятичную систему счисления
procedure StrToFiveInt(NumberStr: string; var NumberVar: integer; var ErrorCode: integer); 
var
  i, Pow:integer;
begin
  NumberVar := 0;
  Pow := 1;
  ErrorCode := 0; // код ошибки "0" - ошибок нет
  if length(NumberStr) = 0 then ErrorCode := 2 //код ошибки "2" - входная строка пустая 
  else
  begin
    for i := length(NumberStr) downto 1 do
    begin
      if (NumberStr[i]>='0') and (NumberStr[i]<='4') then
      begin
        // Переводим, используя развернутый вид числа
        NumberVar := NumberVar + (ord(NumberStr[i])-ord('0')) * Pow;
        Pow := Pow * 5;
      end
      else
      begin
        ErrorCode := 1;// код ошибки "1" - недопустимые символы в строке
      end;
    end;
  end;
end;

//Основная программа
begin
  read(InS);
  i := 1;
  Word := '';
  Sum := 0;
  Tmp := 0;
  for i := 1 to length(InS) do
  begin
    if (InS[i] = ' ') or (InS[i] = '.') then //находим разделитель
    begin
      StrToFiveInt(Word, Num5, Tmp); //переводим строку в число
      if Tmp = 0 then //если перевод прошел без ошибок, добавляем полученное число в сумму
      begin
        Sum := Sum + Num5;
      end;
      Word:=''; //очищаем текущее слово
    end
    else
    begin
      Word := Word + InS[i];
    end;
  end;
  StrToFiveInt(Word, Num5, Tmp);
  if Tmp = 0 then
  begin
    Sum := Sum + Num5;
  end;
  write(Sum);
  readln;
  readln;
end.

Комментариев нет:

Отправить комментарий