Инструменты пользователя

Инструменты сайта


bb:redbook:202

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
bb:redbook:202 [2017/08/30 16:50]
prospero78 [2.4 Вывод данных на экран]
bb:redbook:202 [2020/10/29 07:08] (текущий)
Строка 94: Строка 94:
 Часть символов ("#" и ".") уже представлено по условию задачи, и они обозначают "есть сигнал" и "нет сигнала" соответственно. Но у нас появился ещё один сигнал, значение которого равно "600". И его надо как-то тоже обозначать. Поскольку он превышает нормальный уровень нужно визуально указать на этот факт. Очень удобно будет использовать символ "^". Ниже примерный вид процедуры, который мог бы это сделать: Часть символов ("#" и ".") уже представлено по условию задачи, и они обозначают "есть сигнал" и "нет сигнала" соответственно. Но у нас появился ещё один сигнал, значение которого равно "600". И его надо как-то тоже обозначать. Поскольку он превышает нормальный уровень нужно визуально указать на этот факт. Очень удобно будет использовать символ "^". Ниже примерный вид процедуры, который мог бы это сделать:
 <code oberon2> <code oberon2>
-PROCEDURE Сиг_Вывести;+PROCEDURE Сигнал_Печать;
  CONST  CONST
  _п = " "; (* пауза в передаче сигнала *)  _п = " "; (* пауза в передаче сигнала *)
Строка 111: Строка 111:
  END;  END;
  мЛог.Ln; мЛог.String('[Конец приёма]'); мЛог.Ln  мЛог.Ln; мЛог.String('[Конец приёма]'); мЛог.Ln
-END Сиг_Вывести;+END Сигнал_Печать;
 </code> </code>
  
 ==== 2.5 Общий вид программы ==== ==== 2.5 Общий вид программы ====
 Для запуска всей программы нужно определить запускающую процедуру с признаком экспорта. Пусть она по традиции будет называться "Start". Также нельзя забывать про правило упреждающего объявления (вспоминаем содержание прошлых глав). Полный текст программы ниже. Для запуска всей программы нужно определить запускающую процедуру с признаком экспорта. Пусть она по традиции будет называться "Start". Также нельзя забывать про правило упреждающего объявления (вспоминаем содержание прошлых глав). Полный текст программы ниже.
 +
 +  Привет9.odc
 + 
 <code oberon2> <code oberon2>
-MODULE TestHello9;+MODULE КнигаПривет9;
  (* это программа на языке  (* это программа на языке
  Компонетный Паскаль. Она показывает  Компонетный Паскаль. Она показывает
  как можно вводить данные и обрабатывать их*)  как можно вводить данные и обрабатывать их*)
  
- IMPORT In, Log, Math;+ IMPORT мВв := In,  
 + мЛог := Log, 
 + Math;
  
  CONST  CONST
- _sig_max = 256;+ _разм = 256; 
 +
  VAR  VAR
- p1: SHORTINT; + цШум_низ: SHORTINT; 
- p2: SHORTINT; + цШум_верх: SHORTINT; 
- sig: ARRAY _sig_max OF SHORTINT; + мцСигнал: ARRAY _разм OF SHORTINT; 
- i: INTEGER; + цИтер: INTEGER; 
- tmp: INTEGER;+ цВрем: INTEGER;
  
- PROCEDURE GetSignal;+ PROCEDURE Сигнал_Получ;
  BEGIN  BEGIN
- FOR := 0 TO ( _sig_max - 1) DO + FOR цИтер := 0 TO(_разм - 1) DO 
- sig[i] := 0+ мцСигнал[цИтер] := 0
  END;  END;
- := 0; + цИтер := 0; 
- In.Open; + мВв.Open; 
- WHILE (In.Done) & ( _sig_max ) DO + WHILE (мВв.Done) & (цИтер _разм) DO 
- In.Int(tmp); + мВв.Int(цВрем); 
- sig[i] := SHORT(tmp); + мцСигнал[цИтер] := SHORT(цВрем); 
- INC(i)+ INC(цИтер)
  END;  END;
- END GetSignal;+ END Сигнал_Получ;
  
- PROCEDURE LimitSig;+ PROCEDURE Сигнал_Ограничить;
  BEGIN  BEGIN
- p1 := 50; + цШум_низ := 50; 
- p2 := 1000; + цШум_верх := 1000; 
- FOR := 0 TO _sig_max - 1 DO + FOR цИтер := 0 TO _разм - 1 DO 
- IF sig[i] < p1 THEN + IF мцСигнал[цИтер] < цШум_низ THEN 
- sig[i] := 0 + мцСигнал[цИтер] := 0 
- ELSIF sig[i] > p2 THEN + ELSIF мцСигнал[цИтер] > цШум_верх THEN 
- sig[i] := 600+ мцСигнал[цИтер] := 600
  ELSE  ELSE
- sig[i] := 500+ мцСигнал[цИтер] := 500
  END;  END;
  END;  END;
- END LimitSig;+ END Сигнал_Ограничить;
  
- PROCEDURE OutSig;+ PROCEDURE Сигнал_Печать;
  CONST  CONST
- _p = "."; (* пауза в передаче сигнала *)+ _п = "."; (* пауза в передаче сигнала *)
  _s = "#"; (* полезный сигнал *)  _s = "#"; (* полезный сигнал *)
- _m = "^"; (* молния? *)+ _м = "^"; (* молния? *)
  BEGIN  BEGIN
- Log.String('[Начало приёма]'); Log.Ln; + мЛог.String('[Начало приёма]'); мЛог.Ln; 
- FOR := 0 TO _sig_max - 1 DO + FOR цИтер := 0 TO _разм - 1 DO 
- IF sig[i] = 0 THEN + IF мцСигнал[цИтер] = 0 THEN 
- Log.String(_p+ мЛог.String(_п
- ELSIF sig[i] = 500 THEN + ELSIF мцСигнал[цИтер] = 500 THEN 
- Log.String(_s)+ мЛог.String(_s)
  ELSE  ELSE
- Log.String(_m)+ мЛог.String()
  END;  END;
  END;  END;
- Log.Ln; Log.String('[Конец приёма]'); Log.Ln + мЛог.Ln; мЛог.String('[Конец приёма]'); мЛог.Ln 
- END OutSig;+ END Сигнал_Печать;
  
- PROCEDURE Start*;+ PROCEDURE Старт*;
  VAR  VAR
  BEGIN  BEGIN
- GetSignal+ Сигнал_Получ
- LimitSig+ Сигнал_Ограничить
- OutSig + Сигнал_Печать 
- END Start;+ END Старт;
  
 BEGIN BEGIN
-END TestHello9.+END КнигаПривет9.
 </code> </code>
   
-В процедуре ''Start'' определены последовательные вызовы для обработки цифрового сигнала. Код разбит на довольно мелкие процедуры, что вполне позволяет оценить, что делает каждая из них даже без комментариев. +В процедуре ''Старт'' определены последовательные вызовы для обработки цифрового сигнала. Код разбит на довольно мелкие процедуры, что вполне позволяет оценить, что делает каждая из них даже без комментариев. 
 +Кроме того, обратите внимание, что литера "О" у нас нигде не используется, а значит она не нужна в константах, но это становится понятно, только получения рабочего кода. 
 +И обратите внимание, что все три вызова внутренних процедур внутри процедуры ''Старт'' есть ничто иное, как прямое указание-подсказка на создание типа ''тСигнал'', с привязкой этих процедур к этому типу.
  
 ==== 2.6 Исходные данные и результат ==== ==== 2.6 Исходные данные и результат ====
Строка 209: Строка 216:
  
 В результате компиляции и выполнения программы будет выведена следующая информация: В результате компиляции и выполнения программы будет выведена следующая информация:
-<code> + 
-компилируется "TestHello9  588   524 +  компилируется "КнигаПривет9  588   524 
-старый модуль TestHello9 выгружен +  старый модуль КнигаПривет9 выгружен 
-[Начало приёма] +  [Начало приёма] 
-..#.#.#.###.#.#.#............#.#.^##.#.#.#......^^^........................................................ +  ..#.#.#.###.#.#.#............#.#.^##.#.#.#......^^^............................................................ 
-........................................................................................................... +  .............................................................................................................. 
-.......................................... +  ................................... 
-[Конец приёма] +  [Конец приёма] 
-</code>+
  
 Обратите внимание на размер всей программы: **588 байт**. Обратите внимание на размер всей программы: **588 байт**.
  
 Из выведенного сигнала видно, что была передана комбинация букв: "SOS SOS O". В первом случае сигнал был детектирован(выделен) точно. Во втором случае, в символ "О", видимо, вмешалась гроза, а в третьем случае сигнал трижды зашкаливал, и скорей всего, смысловой нагрузки не несёт. Вполне возможно, что в этот момент рядом работал мобильный телефон(( Сигнал **SOS** принят как международный, и буквально означает «спасите наши души». Существует целый стандарт, который описывает все параметры такого сигнала, и порядок действий при его приёме. Подробнее можно почитать в [[https://ru.wikipedia.org/wiki/SOS|Википедии]]. Возможно, кто-то из читающих эту главу таким образом в будущем спасёт не одну человеческую жизнь. )). Из выведенного сигнала видно, что была передана комбинация букв: "SOS SOS O". В первом случае сигнал был детектирован(выделен) точно. Во втором случае, в символ "О", видимо, вмешалась гроза, а в третьем случае сигнал трижды зашкаливал, и скорей всего, смысловой нагрузки не несёт. Вполне возможно, что в этот момент рядом работал мобильный телефон(( Сигнал **SOS** принят как международный, и буквально означает «спасите наши души». Существует целый стандарт, который описывает все параметры такого сигнала, и порядок действий при его приёме. Подробнее можно почитать в [[https://ru.wikipedia.org/wiki/SOS|Википедии]]. Возможно, кто-то из читающих эту главу таким образом в будущем спасёт не одну человеческую жизнь. )).
 +
 +==== Задание ====
 +   * Сделайте так, чтобы литера "О" не была бесполезным определением.
 +   * Доработайте так, чтобы вместо морзянки выводились литеры
 +   * Попробуйте сделать с помощью типа ''тСигнал'' с привязкой процедур.
bb/redbook/202.1504101011.txt.gz · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)