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

Способы получение характеристического вектора

Type Letter = ‘a’ .. ‘z’;

Ind = 1..26;

Tset = array [ind] of Letter;

Tbool = array[ind] of Boolean;

Var A,B,C : Tset; {Базовый тип} na, nb, nc : ind;

A1,B1,C1 : Tbool; {Характеристический вектор}

1. Из элементов массива базового типа, ограничиваясь его длиной.

for i:=1 to 26 do A1[i] := false;

for i:=1 to na do A1[ord (A[i]) – ord (‘a’) + 1] := true;

Здесь na - длина вводимого массива, 26 – длина массива базового типа. Необходимо знать активную часть массива. Элемент множества A[i] есть символ ASCII с порядковым номером ord (A[i]). Вычитая из него номер первого базового элемента ( в нашем примере – это ‘a’), мы получаем его порядковый номер в характеристическом векторе.

Например, если ‘a’ имеет номер 97 в ASCII, то его номер в характеристическом векторе будет 97 - 97 + 1 = 1, номер элемента ‘b’ , который следует в ASCII за ‘a’, будет 98 – 97 +1 = 2 и т.д.

2. Из текстового файла, длина вектора совпадает с мощностью базового множества

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

While not eof(f) do

Begin

Read (f, ch) ;

A1[ord (ch) – ord (‘a’) + 1] := true;

End

3. Из текстового файла, длина вектора совпадает с длиной строки (256).

Если элементы множества – символы ASCII, как в предыдущих примерах, то можно не вычитать него номер первого базового элемента ( в нашем примере – это ‘a’), а оставить адрес ASCII.

While not eof(f) do

Begin

Read (f, ch) ;

A1[ord (ch)] := true;

End

В этом случае нам нужно описать булевский массив как

Tbool = array [0..255] of Letter.

Это – пример «заминированной » программы, когда в ch может прочитаться любой символ из файла, в том числе и невидимый пробел, скрытый служебный: перевод строки, конец файла, …

Этот символ “сработает” и вызовет непредсказуемую ошибку в программе.

Если же элементы не символы ASCII, а, например, числа, то этот способ описания не применим.

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

В противном случае, контроль возлагается полностью на программиста.

4. Индексы массива – элементы базового множеств.

Tset = array [Letter] of Letter

Как повлияет это на читабельность программы?

Появилась возможность: A[‘b’] := ‘b

For ch := ‘a’ to ‘z’ do A1[ch] := true

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