Вы находитесь на странице: 1из 19

1

Лабораторная работа №4

Тема: Хранение и обработка данных. Организация прямого доступа и


многомерные данные. Организация циклов в программах. Функции обработки
глобалей и навигация в многомерных массивах.
Цель работы: Освоить основные операции над глобалами.

Теоретические сведения

1. Создание программ с помощью Cache Studio

Cache Studio – это одно из приложений, вызываемых из меню Cache-куба. Для


разработки программ предлагается графический редактор, позволяющий
комфортно создавать классы, CSP – страницы, программы на макроязыке,
включаемые файлы, программы на промежуточном коде, а также компилировать
их в выполняемый объектный код.
Cache Studio предоставляет разработчику такое вспомогательное средство, как
автоматический синтаксический контроль. Различные элементы языка
подсвечиваются различным цветом. И в случае нарушения синтаксических
правил выводится сообщение об ошибках. Cache Studio имеет собственный
отладчик, который может быть использован для поиска ошибок в приложениях.

Рисунок 1 – Запуск программы Cache Studio из Cache-куба.


2

Панель мастеров Панель отладки

Главное меню Стандартная панель

Область
Область редактирования Область
проекта инспектора

Область
информации

Рисунок 2 – Описание программы Cache Studio.

2. Основные теоретические сведения о циклических алгоритмах

Командные конструкции For, While, Do/While обеспечивают многократное


выполнение заданного сегмента кода. Это называется циклом.
Общая форма команды For:
For <for parameter> {code}
Здесь блок {code} выполняется столько раз, сколько задано в параметре команды
<for parameter>. Команды, следующие в той же строке программы после
3
закрывающей скобки, уже не относятся к команде «For» и выполняются только
один раз.
Интересной особенностью команды «For» в Cache является разнообразие
вариантов параметра команды. Здесь возможны:
 Список различных выражений
For level=<value> [, <value>…] {code}
 Задание числового диапазона
For level=<num value> : <num value> : <num value> {code}
Здесь первое выражение рассматривается как начальное значение, второе как
величина инкремента и третье как конечное значение переменной цикла.
 Числовой диапазон, как показано выше, но без конечного значения.
For level=<num value> : <num value> {code}
В этом случае в теле цикла наращивается некоторая переменная, а для выхода
из цикла служит функция Quit.
 Безаргументная форма. В этой форме нет ни переменной цикла, ни
начального, ни конечного значений.
For {code} //как минимум два пробела после «For»!

Основные правила циклических выражений:


 Начальное значение, инкремент и конечное значение (если оно задано)
вычисляются до первого прохода тела цикла и сохраняются внутри цикла.
Изменение этих значений внутри цикла не влияет на число итераций.
 После окончания цикла переменная цикла имеет то значение, которое она
имела при выполнении последней итерации.
 В конфликтных случаях (например, если конечное значение при
положительном инкременте меньше начального) тело цикла не выполняется
ни разу.
Необходимо отметить, что различные формы конструкции «For» могут
свободно комбинироваться.

Общая форма команд While и Do/While


4
Две управляющие конструкции:
While <value> [, <value>…] {code}
и
Do {code} While <value> [, <value>…]
Также являются циклами. Они отличаются методом проверки условия
окончания цикла. В первой конструкции условие проверяется до выполнения
блока программы, а во второй – после. Кроме того, чтобы блок программы
выполнился, все выражения в списке должны быть логически истинны.
Важное отличие между этими конструкциями заключается в том, что в
случае Do/While блок кода выполняется хотя бы один раз, чего нельзя сказать
о While.

3. Основные теоретические сведения о глобальных переменных


Cache ObjectScript использует полностью интегрированные в язык
хранимые структуры данных, так называемые глобальные переменные. Эти
переменные так же как и временные «локальные», могут существовать в виде
простых или индексированных структур. Глобальные переменные, или кратко
глобалы, являясь хранимыми данными, создают не только основу для
длительного хранения объектов, но и основу для возможного в Cache
ObjectScript чрезвычайно эффективного прямого доступа.
Многомерность данных в Cache реализуется через индексы, поэтому в
качестве синонима здесь говорят об индексированных переменных.
Синтаксис, лежащий в основе индексированных переменных, достаточно
прост. Индексы заключаются в скобки и отделяются друг от друга запятыми.
Например:
x(1990,”Август”,23)=”День рождения”

Переменная x имеет заключённые в скобки индексы, в данном примере их


три. То, что здесь видится таким простым, приобретает в Cache совершенно
особое значение благодаря следующим замечаниям:
5
 Нет необходимости в предварительном объявлении размерности
массива. Создаются лишь заданные командой Set записи.
 Это становится возможным благодаря концепции разряжённых
массивов, когда лишь существующие записи занимают место в памяти
или на диске.
Массив разряжённый; это означает, что исходя из наличия узла массива y(2,7)
нельзя автоматически предполагать наличие какого-либо другого узла, например
y(2,4).
При помощи одно единственного знака циркумфлекса, или знака глобала ^ -
локальная переменная превращается в хранимую (глобальную) переменную. При
этом база данных на основе глобалов воспринимается не как отдельная сущность,
а как логическое расширение концепции локальных переменных. Например:

^OTD.Tovar(123000,50,”Зелёный киви”)=4

Ход работы

1. Изучить теоретический материал, изложенный выше в данной методичке, а


также в главах 3.2 и 3.3 методических указаний в формате PDF.
2. Из меню Cache-куба открыть Cache Studio, ознакомиться с его интерфейсом и
создать новую программу. См. рисунок 3.
6

Рисунок 3 – Создание новой программы на языке Cache Object Script.

3. На примерах, изложенных ниже, изучить основные приёмы работы с глобалами


с использованием циклических структур:
 Занести следующие данные о пациентах в глобал ^Medizine:
Таблица 1 – Данные о пациентах.
Фамилия Кровяное Температура
Возраст Пол
пациента давление тела
Иванов 65 мужской 125/60 36,6
Сидорова 50 женский Нет данных Нет данных
Тарасов 27 мужской 110/80 38,6
Петров 45 мужской Нет данных 36,6
Иваненко 34 женский 115/85 Нет данных
Горбунков 60 мужской 100/80 39,3
Иващенко 71 мужской 140/60 36,9
Турчинов 65 мужской Нет данных Нет данных

Программа имеет вид, приведённый на рисунке ниже:


7

После набора кода в центральном окне, рисунок 4, программу следует


откомпилировать, путём нажатии клавиш Ctrl+F7. Перекомпилируйте программу
каждый раз, когда что-то в ней меняете или исправляете ошибки!
После первой компиляции программа попросит сохранение, см. рисунок 5.

Рисунок 4 – Работа над собственной программой в Cache Studio.


8

Рисунок 5 – Сохранение программы на диске.

Для выполнения программы используйте программу «Терминал», также


вызываемую из меню Cache-куба. См. рисунок 6.
Вызов программы осуществляется с помощью оператора «do», далее пробел,
далее знак циркумфлекс «^» и затем полное имя программы, которая тестируется. В
конце каждой строки нажимается «Enter».
9

Рисунок 6 – Выполнение созданной программы в «Терминале».

Убедитесь в том, что все данные сохранены на диске в глобале ^Medizine. Для
этого откройте портал управления системой:

Рисунок 7 – Просмотр глобалов в области User.


10
 Работа с функцией $Data. Функция $Data (коротко $D) – это функция с
именем переменной в качестве аргумента. Эта функция может работать с
локальной или с глобальной, скалярной или индексированной переменной.
Значение функции $Data определяет, существует ли заданная в виде
аргумента переменная и какая у неё структура. Функция возвращает четыре
различных результата:
1. Если её значение равно 0 (10), то переменная не существует;
2. Если её результат 1(11), то переменная существует.
Пример программы, которая позволяет определить имеется ли данный
пациент на лечении или нет, приведена на рисунке ниже:
Программа имеет вид:

Здесь применён оператор косвенности - @, который преобразует в данном


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

Результат её работы может быть следующим:


11

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

 Работа с функцией $Order. Она является основной функцией, служащей для


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

USER> w $O(^Medizine(65))

71

Получим ответ на следующий вопрос: Пациенты, каких возрастов


присутствуют на лечении? Ответом будет программа:
12

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


рисунке 9.

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

Это один из классических циклов Cache ObjectScript, использование которого


либо в этой форме, либо в различных модификациях при прямом доступе к
глобалам остаётся актуальным.
Каким образом получают к уже заданному индексу (27 к примеру) первый
индекс на втором уровне? Это осуществляется точно таким же способом, как и
ранее, путём использования пустой строки на втором уровне индексации:
13
USER>w $O(^Medizine(27,""))
мужской

Пусть требуется ответить на вопрос, есть ли среди пациентов возрастом 65 лет


женщины? Ответом будет программа:

USER>d ^p5
мужской

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


которого может означать, что женщин данного возраста на лечение не поступало.

 Функция $Query. Исходя их особого характера функции $Order, она, прежде


всего, предназначена для получения всех по порядку существующих
индексов в пределах данного уровня. Однако иногда более естественным
является другой способ просмотра. Если просмотр последовательности
индексов сначала уходит в глубину и показывает детали на более высоких
уровнях до тех пор, пока эти уровни не закончатся, а потом просматривается
следующая запись на более высокой ступени индексации, то это так
называемый поиск «depth-first» (сначала вглубь), осуществляемый с
помощью функции $Query. С помощью этой функции мы получаем имя узла
на следующем уровне, но в отличие от функции $O, получается полная
ссылка в виде строки символов:
14
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-го индекса?
15
Демонстрация использования данной функции в терминале имеет следующий
вид:

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, в цикле
пролистываются все существующие записи о пациентах и далее если находим, что
очередная запись равна р (фамилия человека), то выводим на экран все данные о
нём.
16

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

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


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

1. Создать программу (№1) для определения фамилий пациентов, температура


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

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

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


повышенной температурой, а, также создав интерфейс ввода порога
температуры, фамилии пациентов, со значением выше которой следует вывести
на экран.
18

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

3. Создать программу (№3) для определения артериального давления и


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

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


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

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

Вам также может понравиться