nextupprevious
 

Next:4.5.2 Приближенное вычисление сумм
Up:4.5 Обработка последовательности последовательностей
Previous:4.5 Обработка последовательности последовательностей


4.5.1 Обработка слов предложения

Задача. Задана последовательность идентификаторов, после каждого из которых следует ровно один пробел. Распечатать каждый идентификатор на отдельной строке, удаляя из него все цифры и заменяя в нем все буквы на симметричные им относительно середины латинского алфавита.

Решение. Последовательность идентификаторов -- это последовательность последовательностей, состоящих из букв и цифр. Такое рассмотрение приводит к программе РАСПЕЧАТКА, в которой учитывается непустота любой последовательности, образующей идентификатор, а также константность выражения, дающего сумму номеров букв $A$ и $Z$ в литерном типе.

module ОбработкаСловПредложения;
    var X:char; N:integer;
begin
        N := integer('Z') + integer('A');
        while ~ Eof do
                (*Обработка идентификатора и пробела за ним *)
                repeat
                       read(X);
                       if ('A' <= X) & (X <= 'Z')
                       then write(chr(N-integer(X)))
                     end
                until X = ' ';
                writeLn
        end
end ОбработкаСловПредложения.

Другой вариант решения можно получить, если рассматривать исходную последовательность как последовательность литер, на которой определены функции "первый необработанный символ текущего идентификатора", "идентификатор закончился". Для этих функций довольно очевидны соотношения сведения, позволяющие осуществить вычисление без использования вложенных циклов (см. программу ОбработкаСловПредложений2).
 

module ОбработкаСловПредложения2;
    var X:char; N:integer;
begin
    N := integer('Z') + integer('A');
    while ~ Eof do
            read(X);
            if X # ' ' then (* X - символ текущего идентификатора*)
                if ('A' <=X) & (X<= 'Z') then write(Chr(N-Ord(X))) end
            else (* Идентификатор закончился *) writeln
    end
end ОбработкаСловПредложения2.

Сравнивая эти два варианта, можно заметить, что с точки зрения эффективности они практически не различаются. Нельзя отдать безусловное предпочтение ни одному из них и с точки зрения наглядности: первый вариант алгоритма имеет более сложную логическую структуру, однако она вполне адекватна структуре входных данных.

Next:4.5.2 Приближенное вычисление сумм
Up:4.5 Обработка последовательности последовательностей
Previous:4.5 Обработка последовательности последовательностей



© В.Н. Касьянов, Е.В.Касьянова, 2004