Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Операционные системы / Лабораторная работа № 7

.pdf
Скачиваний:
22
Добавлен:
02.01.2020
Размер:
302.23 Кб
Скачать
Успеваемость студентов Группа
ИКС-007
Студент ФИО
Иванов № зачетки
12345
Предмет
Информатика Семестр
1
Оценка Зачет
зачтено Экзамен
5
Предмет
Экономика Семестр
3
Оценка Зачет
зачтено
Семестр
4
Оценка Курсовая
5
Экзамен
5
Предмет
ОССиО Семестр
4
Оценка РГР
5
Экзамен
5
Студент ФИО
Петров № зачетки
12346
Предмет

Лабораторная работа №7 по дисциплине "Операционные системы, среды и оболочки"

Взаимодействие между сложными объектами Windows на VBScript/JScript

Инициируя несколько объектов-приложений для обработки одного и того же файла данных можно использовать текущую директорию, в которой располагается обрабатывающий информацию сценарий. В этом каталоге можно сохранять все необходимые промежуточные файлы данных или конечные результаты. Также можно создать структуру подпапок, в которой размещаются исходные данные или будут помещены результаты выполнения скрипта. Текущую директорию можно узнать через свойство CurrentDirectory объекта

WScript.Shell.

Обычно все пути к нужным файлам и директориям устанавливаются в виде значений отдельных переменных, которые объявляются глобальными и видны из любой части сценария, а процесс присваивания происходит в отдельной инициирующей процедуре пользователя. Например, InitPath.

DIM path1, path2, path3, vShell

SUB InitPath SET vShell=WScript.CreateObject("WScript.Shell") path1=vShell.CurrentDirectory path2=path1&"\input\" path3=path1&"\output\result.txt"

END SUB

Обмен данными между приложениями можно выполнять как с помощью текстового файла, так и с помощью структурированного XML-файла. В первом случае для доступа к нужному разделу хранимой в тексте информации необходимо выполнить чтение некоторого количества строк с соответствующим анализом каждого из прочитанных блоков текста, до тех пор, пока не будет обнаружена строка начала размещения необходимых для пользователя данных.

При использовании структурированного тэгами XML-файла подобный последовательный перебор строк и анализ содержимого каждой из них не требуется. Достаточно указать наименование нужного пользователю тэга, расположенного среди прочих тэгов относительно текущего узла,

который называется «родительским узлом». Пример заполненной структуры представлен на рисунке. Здесь корневым узлом будет узел «Успеваемость студентов». Дочерними узлами для успеваемости студентов будут узлы «Группа», их ровно столько, сколько групп

студентов разных специальностей будут отмечены в данной ведомости. Узел «Группа» содержит набор дочерних узлов «Студент», для каждого из которых узел «Группа» будет являться родительским узлом. Например, можно на основе информации о группе и студентах создать таблицу «Список студентов группы», в которой будут фигурировать записи узла «Студент», распределенные по колонкам таблицы, таким как «ФИО», «№ зачетки». Колонку «Предмет» расположить в рассматриваемой таблице не получится, так как список предметов кроме наименования содержит дочерние узлы, которые

сложно вписать в двумерную таблицу без дублирования информации о соответствующем студенте. В последнем случае дублирование приведет к тому, что таблица перестанет быть ведомостью и превратится в избыточную таблицу БД, в которой для каждого предмета будет копироваться вся соответствующая информация о студенте, который этот предмет сдавал.

ФИО

№ зачетки

Предмет

Семестр

Оценка

Иванов

12345

Информатика

1

зачтено, 5

Иванов

12345

Экономика

3

зачтено

Иванов

12345

Экономика

4

5, 5

Иванов

12345

ОССиО

4

5, 5

Петров

12346

Если расположить наименования предметов в каждой дополнительной колонке, то дублирования информации о студенте можно избежать.

ФИО

№ зачетки

Информатика

Экономика

ОССиО

Иванов

12345

зачтено, 5

зачтено, 5, 5

5, 5

Петров

12346

В последнем варианте появляется возможность компактно в табличном виде сохранить информацию, однако отметки по предметам сложно отделить друг от друга и сформировать отчеты по сданным студентами экзаменам, зачетам и прочим способам сдачи изученных дисциплин. Допустим, необходимо составить список экзаменационных предметов изученных в 4 семестре студентами группы. Даже при использовании обеих таблиц подобную информацию получить не удастся. Причина в том, что оценка – это структурированная запись, содержимое которой подразумевает варианты типов хранимой информации: зачет, экзамен, курсовая, РГР. Значение оценки и количество параметров оценки определяется с помощью дополнительно введенных в узел дочерних элементов, описываемых в XML-файле с помощью тэгов, вложенных в тэг «Оценка».

Пример содержимого XML-файла для рисунка таков

<?xml version="1.0" encoding="windows-1251"?> <Успеваемость студентов><Группа>ИКС-007 <Студент><ФИО>Иванов</ФИО><№ зачетки>12345</№ зачетки> <Предмет>Информатика <Семестр>1 <Оценка><Зачет>зачтено </Зачет><Экзамен>5

</Экзамен></Оценка></Семестр></Предмет> <Предмет>Экономика <Семестр>3 <Оценка><Зачет>зачтено

</Зачет></Оценка></Семестр><Семестр>4 <Оценка><Курсовая>5 </Курсовая><Экзамен>5 </Экзамен></Оценка></Семестр></Предмет> <Предмет>ОССиО <Семестр>4 <Оценка><РГР>5 </РГР><Экзамен>5

</Экзамен></Оценка></Семестр></Предмет> </Студент>

<Студент><ФИО>Петров</ФИО><№ зачетки>12346</№ зачетки> <Предмет>…</Предмет></Студент></Группа></Успеваемость студентов>

Создайте каталог Lab7 в директории C:\STUDENT\группа\. Сформируйте в нем с помощью программы «Блокнот» структурированный файл XML data1.xml в соответствии с приведенным примером, который содержит информацию о предметах и итоговых оценках по семестрам в каждой из изученных студентами дисциплин. Ограничьтесь списком

студентов одной группы, занеся в файл информацию по 5 различным предметам с разнообразным видом итоговой оценки (зачет, курсовая, экзамен и т.д.).

Для обработки XML-файла с помощью сценария необходимо создать объект XML-

документа. Используя метод WScript.CreateObject("Msxml.DOMDocument"),

можно создать такой объект, а возвращаемая при вызове метода ссылка позволяет обращаться к методам и свойствам XML-документа. Переменная, которая будет содержать ссылку на объект можно обозначить как docXML. Загрузка готового документа из файла осуществляется методом docXML.load("путь к XML-файлу"), который в случае удачной загрузки (в том числе при корректной структуре, то есть без опечаток в тэгах, загружаемого XML-файла) возвращает логическое значение true.

Продвижение по дереву структуры XML-документа начинается с корневого узла, ссылку на который можно получить через свойство XML-документа docXML.documentElement. Удобнее всего определить переменную root и передать ей полученную ссылку на корневой узел. Дочерние узлы для текущего родительского узла представляют собой коллекцию объектов root.childNodes, перемещение между элементами которой возможно в цикле

FOR EACH node IN root.childNodes

WScript.Echo(node.text)

NEXT

Свойство text узла node позволяет задавать или считывать помещенную в соответствующем тэге текстовую информацию. Каждый из дочерних узлов node может в свою очередь являться родительским узлом для подчиненных ему тэгов. Метод node.hasChildNodes() возвращает логическое значение true в случае наличия дочерних узлов. Каждый узел, за исключением корневого узла, имеет свойство node.parentNode, которое содержит ссылку на родительский узел. Наименование текущего тэга можно узнать через свойство node.nodeName. Кроме этого, можно непосредственно получить ссылку на первый и последний дочерние узлы с помощью свойств root.firstChild и root.lastChild.

Коллекцию дочерних узлов можно также получить фильтром, по конкретному наименованию интересующего Вас тэга с помощью метода node.getElementsByTagName("наименование тэга"). К отдельному элементу коллекции можно обратиться через метод root.childNodes.item(порядковый номер узла в коллекции), а общее количество элементов можно узнать, прочитав свойство length.

nodes=node.getElementsByTagName("Студент") nodes.item(0).text="исключен" fio=nodes.item(0).getElementsByTagName("ФИО") WScript.Echo("Студент " & fio.item(0).text & " будет исключен за неуспеваемость")

Для получения содержащегося в тэге значения обычно выделяют отдельную функцию, которую используют в сценарии для прочтения значений в указанном узле.

FUNCTION GetTagVal(tagNode, tagName)

DIM Value

Value=tagNode.getElementsByTagName(tagName)

IF Value.lenght>0

GetTagVal=Value.item(0).text

ELSE

GetTagVal=""

END IF

END FUNCTION

Использование XML-файлов в качестве источников получения информации широко распространено как в Интернет-приложениях, так и в офисных программах. При этом каждое из зарегистрированных программ в операционной системе Windows предоставляет свои интерфейсы для взаимодействия с оболочкой программы. Для пакета Microsoft Office таким интерфейсом является VBA (Visual Basic for Application), который используется, как внутри пакета для написания макросов, так и вне его для предоставления возможности управления документами остальными программами пользователя.

В программе сценарии, написанном на JScript или VBScript, создание экземпляра приложения Word и Excel выполняет метод CreateObject, которому передаются соответствующие параметры "Word.Application" и "Excel.Application".

Экземпляры программ имеют общее свойство логического типа Visible, которое позволяет отображать или скрывать окно программы.

При работе с Word можно использовать заготовленный и сохраненный шаблон документа, который при создании экземпляра текстового документа можно указать. Для этого

используется метод программы objWord.Documents.Add("наименование шаблона

документа"), если не указывать параметр, то будет добавлен документ на основе шаблона Normal.dot. Текущая позиция курсора или выделенный фрагмент документа определяется объектом objWord.Selection, который содержит свойства и методы для работы над текущим документом. Ссылку на этот объект можно назначить переменной sel.

Перемещение курсора обеспечивают методы sel.MoveRight(тип шага),

sel.MoveLeft(тип шага), sel.MoveUp(тип шага), sel.MoveDown(тип шага).

Тип шага задает вид пропускаемой единицы блока текста, а указываемое значение параметра зависит от направления перемещения курсора.

Горизонтальное перемещение курсора Вертикальное перемещение курсора

Константа

Значение

wdCell ячейка

12

wdCharacter символ

1

wdWord слово

2

wdSentence предложение

3

Константа

Значение

wdLine строка

5

wdParagraph абзац

4

wdWindow край видимой области 11

wdScreen экран

7

Для пополняемого документа, где его расширение предполагается в различных участках, резонно использовать закладки, которые предварительно устанавливаются в шаблоне документа. Для перехода на закладку используется метод objWord.Documents.Bookmarks("наименование закладки").Select(). Чтение и внесение новой информации относительно позиции или выделения курсора осуществляется через свойство sel.Text. Также можно выполнить передачу текста методом sel.TypeText("текст"). Изменения, внесенные в документ, сохраняются методом objWord.Documents.SaveAs("путь").

Создайте сценарий script1.vbs выполняющий чтение из XML-файла data1.xml информации о студентах и организовывающий вывод определенной информации в программе Word. Необходимо предварительно создать шаблон документа, содержащий шапку и таблицу. В шапке документа указывается наименование группы, а в таблице приводится информация о ФИО студентов, их зачетках, а также количестве изученных дисциплин. Необходимо добавить в шаблоне документа закладки в шапке и в первой пустой ячейке таблицы. С помощью закладок Вы можете устанавливать курсор в необходимом месте документа и заполнять шаблон с помощью программы сценария. Пример шаблона такой:

СПИСОК СТУДЕНТОВ ГРУППЫ: [установите в этом месте закладку]

№ п/п

ФИО

№ зачетки

Кол-во дисциплин

[установите

 

 

 

закладку]

 

 

 

После заполнения документа его необходимо сохранить в каталоге, из которого запущен скрипт, а имя документа должно содержать наименование соответствующей группы с расширением DOC, список которой представлен в файле документа.

При работе с программой Excel, также актуально понятие курсора, то есть, той ячейки, для которой в текущий момент производится чтение или запись информации. Рабочую книгу Excel можно создать (или открыть существующий шаблон книги) с помощью метода objExcel.WorkBooks.Add("наименование шаблона документа"). Выделение диапазона ячеек, для которых будет осуществляться операция ввода текса, выполняет метод objExcel.Range("диапазон ячеек").Select(). Для чтения или изменения текста в отмеченных ячейках используется свойство objExcel.Selection.Value. При работе с документом можно выполнять операции записи и чтения в ячейках, не выделяя их. Для этого используется метод objExcel.Cells(номер строки, номер столбца).Value.

Сохранение изменений в файле выполняет метод objExcel.ActiveWorkBook.SaveAs("путь").

Создайте сценарий script2.vbs, который будет выполнять чтение из XML-файла data1.xml информации о студентах и организовывающий вывод определенной информации в программе Excel. Данные, которые необходимо отразить в рабочей книге, должны отражать зачетные (с зачетом и без экзамена) дисциплины и количество студентов получивших по ним зачет, а также экзаменационные предметы (с зачетами, курсовыми и прочими отметками) с указанием среднего балла за экзамен среди всех студентов, его сдававших. Файл результат должен быть сохранен под именем соответствующей группы с расширением XLS.