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

Содержимое удалено Содержимое добавлено
м <source> -> <syntaxhighlight> (phab:T237267)
 
Строка 21:
Вспомним, что для ввода целых чисел есть процедура "In.Int". Но мало того что, данные необходимо вводить, поток на ввод надо ещё открыть. Для этого служит процедура "In.Open". Как понять, что входные данные закончились? Переменная In.Done примет значение FALSE. Пожалуй, стоит напомнить, что для хранения данных нам потребуется массив, а для пороговых значений -- парочка переменных.
Итак, опишем секцию данных:
<sourcesyntaxhighlight lang="oberon2">
CONST
sig_max = 256; (* максимальное значение счётчика для массива *)
Строка 30:
i: INTEGER; (* счётчик чтения входного потока, чтобы не выйти за пределы массива *)
tmp : INTEGER (* временная переменная для хранения числа, так как In.Int имеет свои особенности *)
</syntaxhighlight>
</source>
 
===Ввод данных===
 
После задания входных структур давайте введём данные:
<sourcesyntaxhighlight lang="oberon2">
PROCEDURE GetSignal;
BEGIN
Строка 49:
END;
END GetSignal;
</syntaxhighlight>
</source>
Для облегчения контроля ввода данных в тексте были определены две дополнительных переменных, о которых пока не было сказано ни слова. Это константа "sig_max" и счётчик цикла "i". Константа нужна для того, что один раз её определив, не нужно было выискивать её по всему тексту. Если потребуется под массив выделить больше места -- в следующий раз будет достаточно переопределить константу. Переменная счётчика цикла нам бы потребовалась в любом случае. Также в начале процедуры ввода нам потребовалось обнулить весь массив, при этом надо обратить внимание, что в целочисленном цикле константа sig_max уменьшена на "1". Это связано только с тем, что диапазон массива сигналов индексируется от 0 до 255 (т.е. 256 элементов). Если этого не сделать, то попытка обратиться к элементу массива с номером 256 закончится крахом. Это несколько необычно для людей, привыкших считать что автобусов, домов и квартир с номером "0" не существует. Чуть позже будет показано, как этот несколько странный момент обратить в преимущество.
 
Строка 64:
 
Вот пример того, как можно отсеять помехи:
<sourcesyntaxhighlight lang="oberon2">
PROCEDURE LimitSig;
BEGIN
Строка 79:
END;
END LimitSig;
</syntaxhighlight>
</source>
Как видно из кода, через альтернативную ветку ELSIF уровень сигнала устанавливается несколько выше(600), чем устанавливается сигнал попавший в достоверный диапазон(500). Это может пригодиться, как индикатор того, что это была точка завышенного сигнала. Уровень полезного сигнала был выбран на уровне "500" потому, что он примерно соответствует середине измерительного диапазона 50...1000.
 
Строка 88:
 
Часть символов ("#" и ".") уже представлено по условию задачи, и они обозначают "есть сигнал" и "нет сигнала" соответственно. Но у нас появился ещё один сигнал, значение которого равно "600". И его надо как-то тоже обозначать. Поскольку он превышает нормальный уровень нужно визуально указать на этот факт. Очень удобно будет использовать символ "^". Ниже примерный вид процедуры, который мог бы это сделать:
<sourcesyntaxhighlight lang="oberon2">
PROCEDURE OutSig;
CONST
Строка 107:
Log.Ln; Log.String('[Конец приёма]');Log.Ln
END OutSig;
</syntaxhighlight>
</source>
 
=== Общий вид программы ===
Строка 113:
Полный текст программы ниже.
 
<sourcesyntaxhighlight lang="oberon2">
MODULE TestHello9;
(* это программа на языке
Строка 188:
BEGIN
END TestHello9.
</syntaxhighlight>
</source>
В процедуре "Start" определены последовательные вызовы для обработки цифрового сигнала. Код разбит на довольно мелкие процедуры ,что вполне позволяет оценить, что делает каждая из них даже без комментариев.
 
Строка 195:
В качестве исходных данных предлагаются следующие числа:
 
<sourcesyntaxhighlight lang="dos">
5 8 78 40 123 32 465 1 322 567 401 0 234 32 658 23 61 23 14 18 22 34 2 2 18 32 44 41
49 51 48 67 2 1320 930 999 30 254 29 171 25 160 2 5 4 6 7 8 1350 4380 2356 2 2 2 2 2
</syntaxhighlight>
</source>
 
 
Строка 212:
В результате компиляции и выполнения программы будет выведена следующая информация:
 
<sourcesyntaxhighlight lang="dos">
компилируется "TestHello9" 560 524
старый модуль TestHello9 выгружен
Строка 220:
....................................................................
[Конец приёма]
</syntaxhighlight>
</source>
 
Обратите внимание на размер программы: 560 байт.