Кафедра «Автоматизированные и вычислительные системы»
по выполнению лабораторных работ № 9-11
по дисциплине «Системное программное обеспечение»
для студентов специальности 230101 «Вычислительные
машины, комплексы, системы и сети»
очной формы обучения
Воронеж 2008
Составитель: канд. техн. наук О.Б. Кремер
УДК 78.029.983
Методические указания по выполнению лабораторных работ № 9-11 по дисциплине «Системное программное обеспечение» для студентов специальности 230101 «Вычислительные машины, комплексы, системы и сети» очной формы обучения / ГОУВПО «Воронежский государственный технический университет»; составитель О.Б. Кремер. Воронеж, 2008. 30 с.
Методические указания включают краткие сведения по каждой теме лабораторной работы, задания и ход выполнения некоторых заданий по разработке системных программ, которые выполняются в среде объектно-ориентированного программирования Delphi. Указания снабжены перечнем рекомендованной литературы.
Издание соответствует требованиям Государственного образовательного стандарта высшего профессионального образования по направлению 230100 «Информатика и вычислительная техника», специальности 230101 «Вычислительные машины, комплексы, системы и сети», дисциплине «Системное программное обеспечение».
Предназначены для студентов четвертого курса.
Методические указания подготовлены в электронном виде в текстовом редакторе MS Word и содержатся в файле Metod_9-11.doc.
Табл. 2. Ил. 1. Библиогр.: 9 назв.
Рецензент канд. техн. наук, доц. Е.А. Ганцева
Ответственный за выпуск зав. кафедрой д-р техн. наук, проф. С.Л. Подвальный
Издается по решению редакционно-издательского совета Воронежского государственного технического университета
© ГОУВПО «Воронежский государственный технический университет», 2008
До выполнения заданий лабораторной работы необходимо изучить теоретическую часть по теме работы.
Лабораторная работа считается выполненной, если каждое задание выполнено на компьютере, программа принята преподавателем и оформлен и распечатан отчет по проделанной работе.
Отчет по лабораторной работе состоит из следующих частей:
титульный лист;
номер и формулировка задания;
алгоритм решения задачи (только для заданий самостоятельного выполнения) или описание хода выполнения работы;
экранные формы (при наличии);
листинг программы с комментариями на русском языке.
На титульном листе приводятся следующие данные:
Воронежский государственный технический университет;
факультет автоматики и электромеханики;
кафедра автоматизированных и вычислительных систем;
отчет по лабораторной работе № … по дисциплине «Системное программное обеспечение»;
номер варианта (при наличии).
фамилия, инициалы преподавателя;
фамилия, инициалы студента, шифр и номер группы;
город, год.
Отчет по лабораторной работе должен быть оформлен и сдан преподавателю на следующей лабораторной работе.
Задание 1. Разработать программу, позволяющую пользователю получить информацию о состоянии клавиатуры, т.е. вывести на экран работу программы-ловушки нажатия пользователем некоторых клавиш.
О состоянии клавиатуры дают информацию следующие функции API: GetKeyState, GetAsyncKeyState, GetKeyboardState.
Функция GetKeyState Описание: function GetKeyState(VirtKey: Integer): Integer;
Функция определяет каково состояние виртуальной клавиши: поднята, нажата или пеpеключается.
Паpаметpы: VirtKey: Виpтуальная клавиша.
Возвpащаемое значение:
Клавиша нажата, если стаpший бит pавен 1, и клавиша пеpеключается, если младший бит pавен 1.
Ход выполнения:
1. В Delphi создать проект на диске с уникальным именем.
2. Для примера составим функцию CapsLock, которая позволит определить включена или выключена клавиша CapsLock. В Windows определены специальные константы для каждой клавиши. VK_CAPITAL – константа кода виртуальной клавиши CapsLock.
function CapsLock : boolean;
begin
result:=(GetKeyState(VK_CAPITAL) and 1) <> 0;
end;
3. Поместить на форму объект Button и подписать выполняемое действие щелчком по данной кнопке (свойство Caption). Добавить объект Edit или Label, в котором будет появляться сообщение о состоянии клавиши CapsLock.
4. В событие OnClick объекта Button ввести следующие операторы:
a:=CapsLock;
if a=TRUE then
EditCL.Text:= 'нажата клавиша CapsLock '
else
EditCL.Text:=' клавиша CapsLock не нажата ';
5. Запустить программу на выполнение.
6. Самостоятельно составить функции и процедуры-ловушки нажатия на клавиши пользователями (не менее 5). Таблица кодов виртуальных клавиш представлена в Приложении 1.
7. Сдать преподавателю работу.
Задание 2. Разработать программу, позволяющую по установленной в программе горячей клавише возвращать активность приложения.
Ход выполнения:
В Delphi создать проект на диске с уникальным именем.
2. В разделе Private надо описать следующую процедуру:
procedure WMHotKey(var Message: TMessage); message WM_HOTKEY;
3. Листинг процедуры имеет следующий вид:
procedure TForm1.WMHotKey(var Message: TMessage);
begin
application.Restore;
application.BringToFront;
showmessage('Нажата CTRL-F7');
end;
4. В событие формы OnActivate добавить оператор, позволяющий назначить горячую клавишу:
RegisterHotKey(Form1.Handle, 123, mod_control, VK_F7);
5. В событие формы OnDestroy добавить оператор, отменяющий горячие клавиши:
UnregisterHotKey(Handle, 123);
6. Изменить горячую клавишу в программе.
7. Сдать преподавателю работу.
Задание 3. Разработать программу, позволяющую перехватить нажатие клавиш, с использованием стандартных событий объекта Form.
Ход выполнения:
В Delphi создать проект на диске с уникальным именем.
В событие формы OnKeyDown добавить оператор:
if Key = VK_RIGHT then
…
Самостоятельно оформить экранную форму приложения, в котором надо перехватить нажатие не менее 5-ти клавиш.
4. Сдать преподавателю работу.
Задание 4. Разработать программу, позволяющую менять раскладку клавиатуры.
Ход выполнения:
В Delphi создать проект на диске с уникальным именем.
В программе использовать переменную Layout
Layout: array[0.. KL_NAMELENGTH] of char;
На форме создать объекты Button1, Button2, Edit, которые позволят переключать раскладку клавиатуры с русской на английскую и проверить работоспособность переключения.
4. Для русской раскладки клавиатуры используется функция:
LoadKeyboardLayout( StrCopy(Layout,'00000419'), KLF_ACTIVATE)
Для английской раскладки клавиатуры – функция:
LoadKeyboardLayout(StrCopy(Layout,'00000409'), KLF_ACTIVATE)
5. Сдать преподавателю работу.
Задание 5. Дан листинг программы запуска внешнего приложения и ожидания его завершения. Подключите ее к программе предыдущего задания и замените внешнее приложение.
procedure TForm1.Button1Click(Sender: TObject);
var
si : Tstartupinfo;
p : Tprocessinformation;
begin
FillChar( Si, SizeOf( Si ) , 0 );
with Si do begin
cb := SizeOf( Si);
dwFlags := startf_UseShowWindow;
wShowWindow := 4;
end;
Application.Minimize;
Createprocess(nil,'notepad.exe',nil,nil,false,
Create_default_error_mode,nil,nil,si,p);
Waitforsingleobject(p.hProcess,infinite);
Application.Restore;
end;
Задание 6. Составить учебную задачу с использованием приведенных приемов перехвата нажатия клавиш клавиатуры. Записать постановку задачи и составить программу.
Оформить отчет по заданию 6 лабораторной работы с распечаткой уникальных процедур с пояснениями и экранной формы программы и копии экранов результата работы программы.
Цель работы: изучить основные методы организации таблиц идентификаторов, получить представление о преимуществах и недостатках, присущих различным методам организации таблиц идентификаторов.
Задание 1: Написать программу, которая получает на входе набор идентификаторов, организует таблицы идентификаторов с помощью заданных методов, позволяет осуществить многократный поиск произвольного идентификатора в таблицах и сравнить эффективность методов организации таблиц. Список идентификаторов считать заданным в виде текстового файла. Длина идентификаторов ограничена 32 символами.
При выполнении семантического анализа, генерации кода и оптимизации результирующей программы компилятор должен оперировать характеристиками основных элементов исходной программы — переменных, констант, функций и других лексических единиц входного языка. Эти характеристики могут быть получены компилятором на этапе синтаксического анализа входной программы (чаще всего при анализе структуры блоков описаний переменных и констант), а также дополнены на этапе подготовки к генерации кода (например при распределении памяти).
Набор характеристик, соответствующий каждому элементу исходной программы, зависит от типа этого элемента, от его смысла (семантики) и, соответственно, от той роли, которую он исполняет в исходной и результирующей программах. В каждом конкретном случае этот набор характеристик может быть свой в зависимости от синтаксиса и семантики входного языка, от архитектуры целевой вычислительной системы и от структуры компилятора. Но есть типовые характеристики, которые чаще всего присущи тем или иным элементам исходной программы. Например для переменной — это ее тип и адрес ячейки памяти, для константы — ее значение, для функции — количество и типы формальных аргументов, тип возвращаемого результата, адрес вызова кода функции.
Главной характеристикой любого элемента исходной программы является его имя. Именно с именами переменных, констант, функций и других элементов входного языка оперирует разработчик программы — поэтому и компилятор должен уметь анализировать эти элементы по их именам.
Имя каждого элемента должно быть уникальным. Многие современные языки программирования допускают совпадения (неуникальность) имен переменных и функций в зависимости от их области видимости и других условий исходной программы. В этом случае уникальность имен должен обеспечивать сам компилятор, здесь же будем считать, что имена элементов исходной программы всегда являются уникальными.
Таким образом, задача компилятора заключается в том, чтобы хранить некоторую информацию, связанную с каждым элементом исходной программы, и иметь доступ к этой информации по имени элемента. Для решения этой задачи компилятор организует специальные хранилища данных, называемые таблицами идентификаторов, или таблицами символов. Таблица идентификаторов состоит из набора полей данных (записей), каждое из которых может соответствовать одному элементу исходной программы. Запись содержит всю необходимую компилятору информацию о данном элементе и может пополняться по мере работы компилятора. Количество записей зависит от способа организации таблицы идентификаторов, но в любом случае их не может быть меньше, чем элементов в исходной программе. В принципе, компилятор может работать не с одной, а с несколькими таблицами идентификаторов — их количество и структура зависят от реализации компилятора.