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

13.8. Абстракция строки

Как обычно, в процессе реализации типа данных мы начинаем изучение абстракции строки с рассмотрения ее представления. Основная задача заключается в хранении слов, пробелов и симво­лов табуляции таким способом, который бы сделал операцию вы­равнивания относительно простой и эффективной. В частности, мы должны по возможности избежать ненужной манипуляции сим­волами. Поскольку самой важной операцией с этой точки зрения является операция выравнивания justify,то мы начнем рассмот­рение именно с нее. Выравнивание состоит из следующих шагов:

1.Отыскание первого пробела, подлежащего выравниванию.

2.Расширение промежутков между словами. Удобно держать слова, пробелы и символы табуляции отдельно в представлении с тем, чтобы операция justifyмогла легко нахо­дить первый выравниваемый пробел и все пропуски, подлежащие расширению. Например, мы могли использовать массивarray[элемент], где

элемент == variant [word: string, tab, space: int]

Проектирование

max. tab-width

% Представление строки хранит пробелы, символы табуляции и слова отдельно; % смежные пробелы объединены.

% Пробелы и символы табуляции используются в качестве счетчика числа % пробелов в выходной строке.

% Хранится также длина строки и позиция крайнего правого символа табу-% ляции,

item == variant [word: string, tab, space: int] rep = record [length: int, % текущая длина строки right-tab: int, % индекс крайнего правого символа % табуляции или 0, если он от-% сутствует

stuff: array [item]] % Слова, пробелы и символы табу­ляции

% Хранится в виде константы для облегчения % дальнейших модификаций

% Типичная строка есть последовательность символов. % Функция абстракции есть: % if l.length = 0 then " "

% else chars (1.stuff [I ]) Ц ... II chars (top (1.stuff)) % где chars (item) есть

% символы в слове, если item есть слово % в противном случае п пробелов, где п есть целое число % для item, состоящего из пробелов или символов табуляции % Инвариант представления есть i. lengths сумме числа пробелов и символов табуляции+размер

слов & r.right-tab>=0 & low (r, stuff) = I

& r.right>0=>r.stuff [r.right-tab] есть

символ табуляции & и больше символов табуляции справа в r. stuff нет

& в r.stuff нет смежных пробелов

& целое число в каждом признаке пробела и символа табуляции ?> О & целое число в каждом элементе символа табуляции

<=: max- tab-width == I

& для каждого элемента символа табуляции в r .staff count по модулю max-tab-width == 1, где count есть число сим­волов, считая от начала r.stuff и до конца, включая данный символ табуляции

Рис. 13.13. Реализация документации для абстракции строки.

Здесь мы храним информацию о смежных промежутках в одном элементе массива: intдля символа табуляции или пробела от­слеживает, сколько пропусков должно быть сделано в выходной строке. Для повышения эффективности в представлении должна храниться также текущая длина строки. Кроме этого, выравнива­ние будет выполняться быстрее, если по мере добавления к строке символов табуляции мы будем следить за крайним правым симво­лом табуляции. Подобная оптимизация оправдана в том случае, если символы табуляции встречаются редко. Как правило, так и бывает. Реализация абстракции lineприведена на рис. 13.13.

294 Глава IS

Проектирование

Соседние файлы в папке POSIBNIK