Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операционные системы / Отчёт по ОС 7.docx
Скачиваний:
20
Добавлен:
02.01.2020
Размер:
525.64 Кб
Скачать

Запуск script1.Vbs:

cscript //nologo script1.vbs data1.xml

  1. Создали скрипт script2.vbs, считывающий информацию об успеваемости студентов группы из data1.xml, заносящий её в книгу Excel и сохраняющий последний документ под именем «Название группы.xls» в каталоге, из которого запущен скрипт. Заносить необходимо следующую информацию: наименования дисциплин, по которым студенты сдавали зачёт, и количество студентов, сдавших зачёт (для каждой дисциплины); наименования предметов, по которым студенты сдавали экзамен, и средний балл за экзамен по каждому предмету.

На рисунке 5 представлено содержимое папки после выполнения script2.vbs

Рисунок 5 — Папка после выполнения script2.vbs

На рисунке 6 показано содержимое обрабатываемой скриптом книги Excel.

Рисунок 6 — Результат работы script2.vbs

Текст script2.Vbs:

REM---------------------------------------Функция позволяет получить значение текста в

REM --------------------------------------первом дочернем узле tagName узла tagNode

Function GetTagVal(tagNode, tagName)

Dim Value

Set Value=tagNode.getElementsByTagName(tagName)

If Value.length>0 Then

GetTagVal=Value.item(0).text

Else GetTagVal=""

End If

End Function

REM------------------------------------------

Dim docXML, objExcel, WBE, objArgs, root, group, groupStud, z, dicZ, dicStudZ

Dim count, dicEkz, dicStudEkz, sum

Set docXML=WScript.CreateObject("Microsoft.XMLDOM")

Set objArgs=WScript.Arguments

If NOT(docXML.load(objArgs(0))) Then

WScript.Echo "Ошибка при загрузке списка студентов xml"

WScript.Quit

End If

REM--------------------------------------Корневой узел документа xml(УспеваемостьСтудентов)

Set root=docXML.documentElement

REM--------------------------------------Узел "Группа" (единственный для документа)

Set group=root.childnodes.item(0)

Set objExcel=WScript.CreateObject("Excel.Application")

REM-----------------------------------Объект Dictionary для создания коллекции данных

REM---------------------------------- (ассоциативная структура "ключ"-"значение")

REM-------------------------------------DicZ для хранения названий зачётных предметов

Set dicZ=WScript.CreateObject("Scripting.Dictionary")

REM-------------------------------------DicStudZ для хранения числа студентов, получивших

REM----------------------------------------------------------зачёт по зачётным предметам

Set dicStudZ=WScript.CreateObject("Scripting.Dictionary")

REM----------------------------------------------------------DicEkz для хранения названий

REM----------------------------------------------------------экзаменационных предметов

Set dicEkz=WScript.CreateObject("Scripting.Dictionary")

REM----------------------------------------------------------DicStudEkz для хранения среднего балла

REM----------------------------------------------------------по каждому экзамену

Set dicStudEkz=WScript.CreateObject("Scripting.Dictionary")

REM----------------------------------------------------------Новая книга Excel

Set WBE=objExcel.WorkBooks.Add

objExcel.Visible=true

objExcel.Cells(1,1).Value="Зачёт"

REM----------------------------------------------------------Коллекция узлов "Студент"

Set groupStud=group.GetElementsByTagName("Студент")

For Each stud in groupStud

REM---------------------------------------Коллекция узлов "Предмет" (для каждого)

REM--------------------------------------------------------------студента

Set predmet=stud.GetElementsByTagName("Предмет")

REM------------------------------------------Знаем, что предметов 5, выбираем студента,

REM---------------------------------который сдал все предметы, чтобы отобрать зачётные

if predmet.length=5 Then

for each pr in predmet

REM---------------------------------------------Коллекция узлов "Семестр" (для каждого)

REM-----------------------------------------------------------------предмета

Set semestr=pr.GetElementsByTagName("Семестр")

for each sem in semestr

Set z=sem.GetElementsByTagName("Зачёт")

REM-------------------------------------Если в семестре есть узел "Зачёт",добавляем

REM----------------------------------------название предмета в словарь DicZ под ключом,

REM-------------------------------------------------------соответствующим названию предмета

if z.length<>0 Then

dicZ.Add GetTagVal(pr, "НазваниеПредмета"), GetTagVal(pr, "НазваниеПредмета")

Exit For

End if

Next

Next

Exit For

End If

Next

REM-----------Вводим в книгу названия зачётных предметов (со 2 строки, в 1 столбец)

i=2

For each key in dicZ

objExcel.Cells(i, 1).Value=dicZ.item(key)

i=i+1

Next

REM--счётчик студентов, получивших зачёт по предмету

count=0

REM-------------------Для каждого зачётного предмета (перебор в словаре по ключу)

For each key in dicZ

For Each stud in groupStud

Set predmet=stud.GetElementsByTagName("Предмет")

for each pr in predmet

REM-------------------------------------------------------------------------Если предмет зачётный

if GetTagVal(pr, "НазваниеПредмета")=dicZ.item(key) Then

Set semestr=pr.GetElementsByTagName("Семестр")

for each sem in semestr

Set z=sem.GetElementsByTagName("Зачёт")

REM------------------------------Если у студента зачёт, увеличиваем счётчик на 1

if z.item(0).text="зачтено" Then

count=count+1

Exit For

End if

Next

Exit for

End if

Next

Next

REM------------------------Добавляем под ключом, соответствующим названию предмета,

REM---------------в нужную библиотеку число студентов, получивших по предмету зачёт

dicStudZ.Add key, count

REM----------------------Для нового предмета счётчик обнуляется

count=0

Next

i=2

REM-----------Вводим в книгу количества студентов (со 2 строки, во 2 столбец)

For each key in dicStudZ

objExcel.Cells(i, 2).Value=dicStudZ.item(key)

i=i+1

Next

objExcel.Cells(1,5).Value="Экзамен"

REM------------------------Составление списка предметов с экзаменом

For Each stud in groupStud

Set predmet=stud.GetElementsByTagName("Предмет")

if predmet.length=5 Then

for each pr in predmet

Set semestr=pr.GetElementsByTagName("Семестр")

for each sem in semestr

Set z=sem.GetElementsByTagName("Экзамен")

if z.length<>0 Then

dicEkz.Add GetTagVal(pr, "НазваниеПредмета"), GetTagVal(pr, "НазваниеПредмета")

Exit For

End if

Next

Next

Exit For

End If

Next

i=2

REM-----Вводим в книгу названия зэкзаменационных предметов (со 2 строки, в 5 столбец)

For each key in dicEkz

objExcel.Cells(i, 5).Value=dicEkz.item(key)

i=i+1

Next

REM-----------count -- число студентов, сдававших экзамен

count=0

REM-----------sum -- общая сумма баллов по экзамену

sum=0

For each key in dicEkz

For Each stud in groupStud

Set predmet=stud.GetElementsByTagName("Предмет")

for each pr in predmet

if GetTagVal(pr, "НазваниеПредмета")=dicEkz.item(key) Then

Set semestr=pr.GetElementsByTagName("Семестр")

for each sem in semestr

Set z=sem.GetElementsByTagName("Экзамен")

REM----------------------------------------Если в семестре был экзамен

if z.length<>0 Then

REM-----------------------------------------Увеличиваем число сдавших студентов

count=count+1

REM-------------------------------------------------Увеличиваем сумму баллов на балл студента

sum=sum+CInt(z.item(0).text)

Exit for

End if

Next

Exit for

End if

Next

Next

REM----------------Вычисляем средний балл по предмету

sum=sum/count

REM-------------------------Запись среднего балла в соответствующую библиотеку с ключом,

REM--------------------------соответствующим названию предмета

dicStudEkz.Add key, sum

count=0

sum=0

Next

i=2

REM-----------Вводим в книгу средние баллы (со 2 строки, 6 столбец)

For each key in dicStudEkz

objExcel.Cells(i, 6).Value=dicStudEkz.item(key)

i=i+1

Next

objExcel.ActiveWorkBook.SaveAs("C:\LR7\"&group.childnodes.item(0).text&".xls")

REM-------------------------------

REM-----------Закрываем книгу

WBE.Close

REM-----------Очищение объектов-библиотек от данных

dicZ.RemoveAll

dicStudZ.RemoveAll

dicEkz.RemoveAll

dicStudEkz.RemoveAll

Соседние файлы в папке Операционные системы