Компонентный Паскаль/Отбор данных: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 23:
<source lang="oberon2">
CONST
sig_max = 255256; (* максимальное значение счётчика для массива *)
VAR
p1 : SHORTINTEGER; (* нижний порог для шума *)
p2 : SHORTINTEGER; (* верхний порог для шума *)
sig : ARRAY 255sig_max OF SHORTINT; (* массив полученных замеров сигнала *)
i: INTEGER; (* счётчик чтения входного потока, чтобы не выйти за пределы массива *)
</source>
Строка 35:
PROCEDURE GetSignal;
BEGIN
FOR i:=0 to (sig_max-1) DO (* цикл обнуления исходного массива сигналов *)
a[i]:=0
END;
i:=0; (* предварительно обнуление счётчика *)
In.Open; (* открываем входной поток на чтение *)
WHILE (In.Done) & (i<=sig_max) (* охрана цикла *)
sig[i]:=SHORT(In.Int); (* чтение сигнала в цикле *)
INC(i) (* приращение счётчика цикла с условием по входу *)
END;
In.Close (* закрытие входного потока *)
EndEND GetSignal;
</source>
Для облегчения контроля ввода данных в тексте были определены две дополнительных переменных, о которых пока не было сказано ни слова. Это константа "sig_max" и счётчик цикла "i". Константа нужна для того, что один раз её определив, не нужно было выискивать её по всему тексту. Если потребуется под массив выделить больше места -- в следующий раз будет достаточно переопределить константу. Переменная счётчика цикла нам бы потребовалась в любом случае. Также в начале процедуры ввода нам потребовалось обнулить весь массив, при этом надо обратить внимание, что в целочисленном цикле константа sig_max уменьшена на "1". Это связано только с тем, что диапазон массива сигналов индексируется от 0 до 255 (т.е. 256 элементов). Если этого не сделать, то попытка обратиться к элементу массива с номером 256 закончится крахом. Это несколько необычно для людей, привыкших считать что автобусов, домов и квартир с номером "0" не существует. Чуть позже будет показано, как этот несколько странный момент обратить в преимущество.
 
После целочисленного цикла, переменная "i" опять получает присвоение, так как после целочисленного цикла она будет равна "255".
 
Цикл с условием на входе имеет сложное условие. Цикл будет повторяться до тех пор, пока есть данные на входе (In.Done), либо не закончится массив. Т.е. вовсе не факт, что массив будет использован полностью. И если дело будет обстоять именно так, то такой способ организации ввода данных не является оптимальным<ref name="цепочка">Для хранения данных, число которых заранее неизвестно используется структура, получившая название "связанный список", или проще "цепочка". У него тоже есть недостатки, но в ряде случаев может оказаться более удобным.</ref>.
 
== Примечания ==