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

Лабораторная работа №3 / Лабораторная работа №3

.pdf
Скачиваний:
33
Добавлен:
09.05.2015
Размер:
833.55 Кб
Скачать

11

Результат отладки программы в «Терминале» имеет вид, представленный на рисунке 9.

Рисунок 9 – Получение списка возрастов.

Это один из классических циклов Cache ObjectScript, использование которого либо в этой форме, либо в различных модификациях при прямом доступе к глобалам остаѐтся актуальным.

Каким образом получают к уже заданному индексу (27 к примеру) первый индекс на втором уровне? Это осуществляется точно таким же способом, как и ранее, путѐм использования пустой строки на втором уровне индексации:

12

USER>w $O(^Medizine(27,""))

мужской

Пусть требуется ответить на вопрос, есть ли среди пациентов возрастом 65 лет женщины? Ответом будет программа:

USER>d ^p5

мужской

Результат выполнения программы дал ответ «мужской», интерпретация которого может означать, что женщин данного возраста на лечение не поступало.

Функция $Query. Исходя их особого характера функции $Order, она, прежде всего, предназначена для получения всех по порядку существующих индексов в пределах данного уровня. Однако иногда более естественным является другой способ просмотра. Если просмотр последовательности индексов сначала уходит в глубину и показывает детали на более высоких уровнях до тех пор, пока эти уровни не закончатся, а потом просматривается следующая запись на более высокой ступени индексации, то это так называемый поиск «depth-first» (сначала вглубь), осуществляемый с помощью функции $Query. С помощью этой функции мы получаем имя узла на следующем уровне, но в отличие от функции $O, получается полная ссылка в виде строки символов:

13

USER>w $Q(^Medizine(27)) ^Medizine(27,"мужской","110/80",38.6)

USER>w $Q(^Medizine(27,"мужской","110/80",38.6))

^Medizine(34,"женский","115/85")

Чтобы получить в нашей модели данных все определѐнные записи, необходимо

применить цикл:

USER>d ^p6

^Medizine(27,"мужской","110/80",38.6) = Тарасов

^Medizine(34,"женский","115/85") = Ивененко

^Medizine(45,"мужской",36.6) = Петров

^Medizine(50,"женский") = Сидорова

^Medizine(60,"мужской","100/80",39.3) = Горбунков

^Medizine(65) = Турчинов

^Medizine(65,"мужской","125/60",36.6) = Иванов

^Medizine(71,"мужской","140/60",36.9) = Иващенков

Анализ индексированных переменных с помощью функций $QLength и $QSubscript. В некоторых вариантах постановки задачи, вне зависимости от того, имеем ли мы дело с глобальной или локальной индексированной переменной, возникает необходимость исследования еѐ структуры. На переднем плане тогда стоят вопросы:

1.Сколько уровней (индексов) имеет индексированная переменная?

2.Каково значение i-го индекса?

14

Демонстрация использования данной функции в терминале имеет следующий вид:

USER>w $QL("^Medizine(65)")

1

USER>w $QL("^Medizine(65,""мужской"")")

2

В последнем примере использованы двойные кавычки, чтобы интерпретатор языка не перепутал индекс и аргумент функции $QL. Аргумент всегда берѐтся в двойные кавычки.

Теперь обратимся к функции $QSubscript (сокращѐнно $QS), которая имеет два аргумента. Первым аргументом является исследуемое значение имени индексированной переменной, второй задаѐт, какой именно индекс следует извлечь. Если в общем случае значение имени имеет форму Name(s1, s2, s3….sn),

то результат функции $QS(Name(s1, s2, s3….sn), m) равен значению m-го индекса в случае, если m не превышает n:

USER>w $QS("^Medizine(27,""мужской"",""110/80"")",3)

110/80

Комбинированное использование рассмотренных функций:

Пусть нужно дать ответ на вопрос, поступал ли на лечение пациент с фамилией

«Иванов», и если поступал, то вывести информацию о нѐм. Ответом является программа, которая запрашивает фамилию пациента и выдаѐт параметры,

характеризующие его состояние. Фамилия помещается в переменную p, в цикле пролистываются все существующие записи о пациентах и далее если находим, что очередная запись равна р (фамилия человека), то выводим на экран все данные о нѐм.

15

Результат работы такой программы приведѐн на рисунке 9.1

Рисунок 9.1 – Результат работы программы.

16

Самостоятельная работа

1.Создать программу (№1) для определения фамилий пациентов, температура тела которых находится выше нормы (т.е. более 36,6), используя информацию о структуре данных, приведѐнную в таблице 1.

Рисунок 10 - Результат работы программы №1, которую нужно создать.

2.Усложнить предыдущую программу (№1), подсчитав количество пациентов с повышенной температурой, а, также создав интерфейс ввода порога температуры, фамилии пациентов, со значением выше которой следует вывести на экран.

17

Рисунок 11 – Результат работы программы №2, которую нужно создать.

3.Создать программу (№3) для определения артериального давления и температуры тела пациента по его фамилии, используя информацию о структуре данных, приведѐнную в таблице 1.

Рисунок 12 - Рисунок 11 – Результат работы программы №2.

18

Вопросы для самоподготовки

1.Чем глобальная переменная отличается от локальной?

2.Чем индексированная переменная отличатся от скалярной?

3.Что такое циклический алгоритм? Какие операторы реализуют его в языке

Cache ObjectScript?

4.Для чего используется программа Cache Studio?

5.С помощью каких функций в Cache ObjectScript осуществляется навигация в многомерных массивах?

6.Какая функция определяет существование данных на n-м уровне?

7.Чем характеризуется поиск “Depth-first”?

8.Результатом работы, какой функции является имя n-го индекса массива?

9.Какую роль выполняет функция $Query? Что является еѐ аргументом?

10.Для чего используется знак косвенности (@)?

Рекомендуемые источники

1.Документация, поставляемая с Cache, доступная по локальному адресу:

C:\InterSystems\Cache\Docs\Main.html

2.СУБД Cache. Объектно-ориентированная разработка приложений. Учебный курс. В.Кирстен и др. СПб: Питер, 2001г.- 415 с.

3.СУБД Cache. Работа с объектами. И. И. Труб – М.: ДИАЛОГ-МИФИ, 2006 – 480с.

4.http://www.intersystems.ru

5.http://www.sql.ru/forum/actualthread.aspx