Служба спасения студентов
Служба спасения для студентов

СибГУТИ Лабораторная работа 2 Операционные системы скачать бесплатно

Скачать бесплатно
Задание
Написать резидентную программу, которая будет работать, как “будильник” – через заданный интервал времени издавать короткий звуковой сигнал – “тикать” (например, через 1–2 секунды). По завершении более длительного интервала времени (от нескольких секунд до нескольких минут или часов) должен раздаваться более продолжительный мелодичный звуковой сигнал, имитирующий звонок будильника. 
Длительность звукового сигнала – “тиканья” – не должна быть слишком большой. Её следует задавать в программе в пределах от 1/10 до ½ доли секунды.
По окончании “звонка будильника” “тиканье” должно продолжаться. “Звонок” должен раздаваться только один раз.
В то время, когда звучит “звонок”, не должно быть слышно “тиканья” (звонок может длиться в течение нескольких секунд, и в этот интервал времени теоретически могут попасть звуки “тиканья”). 
Для получения эффекта “мелодичного звонка” следует использовать несколько звуковых частот с различной продолжительностью звучания каждой из них.
Временной интервал, через который должно происходить “тиканье” (в секундах – целое число секунд), задавать с клавиатуры в качестве параметра; время, через которое должен прозвонить будильник (в минутах – их число может быть дробным), тоже задавать в качестве параметра. Отсчёт времени для “звонка” вести с момента запуска программы.
Описание входных параметров
Программа принимает два параметра: 
1. паузу между тиканьями (в секундах);
2. время, через которое зазвенит будильник (в минутах).
Первый параметр должен быть целочисленного типа и иметь неотрицательное значение. Второй параметр должен быть целого или дробного типа (например, 0.2. Это будет одна пятая часть минуты). 
Описание основных переменных и подпрограмм
    oldTimer - переменная процедурного типа для запуска старой процедуры обработки прерывания таймера.
  tickDur - продолжительность тиканья.
  ringDur - продолжительность звонка.
  tickP - продолжительность паузы тиканья.
  ringP - продолжительность паузы до звонка.
  tickPaused – определяет, наступила ли пауза тиканья.
  ringPaused – определяет, идет ли пауза до звонка.
  tickC - счетчик для тиканий и пауз тиканья.
  ringC - счетчик для звонка и паузы до звонка.
  ringStopped – определяет, отзвучал ли уже звонок.
  Timer - процедура, предназначенная для обработки прерываний таймера. 
Алгоритм решения
При возникновении прерывания таймера вызывается процедура Timer. В ней сначала увеличивается на единицу значение счетчика тиканий и пауз тиканий. Если установлена пауза тиканья, то проверяется, не пора ли эту паузу завершить. Если пора, то начинается тиканье. А если уже шло тиканье, то проверяется, не пора ли завершить тиканье. Если пора, то тиканье завершается, и начинается пауза тиканья;
Проверяется, звенел ли уже звонок. Если не звенел, то значение счетчика звонков и пауз звонков увеличивается на единицу. Потом проверяется, не идет ли пауза для звонка. Если идет, то проверяется, не пора ли завершать эту паузу. Если пора, то включаем звонок. А если звонок уже был включен, то выдаем звуковые сигналы звонка с различными частотами в зависимости от значения счетчика для звонка, чтобы получилось мелодичное звучание. Далее проверяем, не пора ли завершать звонок. Если пора, то останавливаем звонок.
Текст программы
...
Копия экрана программы
Ответы на контрольные вопросы
1) Как будет вести себя Ваша программа, если в качестве параметров командной строки ошибочно ввести символы вместо чисел? Или отрицательное число? Или в случае неверного количества параметров – например, если он будет всего один, или, наоборот, их окажется большее количество, чем нужно?
Программа  выдает сообщения об ошибках, если указаны неверные параметры или их количество не равно двум.
2) Возможно ли задавать время продолжительности звонка с точностью до полуминуты?
18.2 * 30 секунд = 546 импульсов таймера. 546 – целое число. Поэтому возможно.
3) Какие изменения потребуется сделать в программе, чтобы сделать “звонок будильника” звучащим многократно, каждый раз снова через такой же интервал времени, который был задан вначале?
Для этого необходимо в процедуре Timer удалить строку:
  if not ringStopped then
4) Каким образом можно изменять длительность звукового сигнала (например, “тиканья”) в обработчике прерываний таймера? Какой параметр программы отвечает за продолжительность сигнала?
Для этого необходимо считать импульсы таймера от начала тиканья. 
В программе за длительность тиканья отвечает константа tickDur , значение которой можно изменить. Длительность тиканья задается в количестве импульсов таймера. Если длительность тиканья нужно уменьшить, то надо уменьшить значение этой константы.
5) Добавьте третий параметр для задания продолжительности “звонка” с клавиатуры.
Это реализовано  в программе quest5.pas.
Заявка на расчет