АВТИ информатика по паскалю / METOD2 / Set_add
.docСпособы получение характеристического вектора
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