Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комплект Информатика / Курс лекций.doc
Скачиваний:
128
Добавлен:
22.05.2015
Размер:
4.8 Mб
Скачать

Int *StackEntries;

int StackPointer;

int MaxStack;

public:

StackOflntegersCint Max)

{

StackEntries = new int[Max]:

StackPointer = 0:

MaxStack = Max:

}

void push(int NewEntry)

{

if (StackPointer < MaxStack)

StackEntries[StackPointer++] = NewEntry;

}

int pop ( )

{if (StackPointer >0) return SrackEntries[--StackPointer]:}

}:

1) Надо заметить, что дисциплина изменения указателя стека, примененная в данном классе, является допустимой, но в корне отличается от изложенной ранее. Здесь указатель всегда показывает на свободное место в стеке, поэтому при проталкивании (push) очередной элемент сначала помещается в стек. А затем указатель смещается на свободное место. При выталкивании (pop), наоборот, сначала смещается указатель, а затем извлекается значение.

Рисунок 3 – Стек в памяти

Листинг 2. Стек целых чисел (реализация на Java и С#)

class StackOflntegers

{private int[] StackEntries:

private int StackPointer;

private int MaxStack;

public StackOfIntegers(int Max)

{StackEntries = new int[Max]:

StackPointer = 0:

MaxStack = Max;

}

public void push(int NewEntry)

{if (StackPointer < MaxStack)

StackEntries[StackPointer++] = NewEntry:

}

public int pop ( )

{if (StackPointer >0) return SrackEntnes[--StackPointer]:

else return 0;

}

}

Используя этот класс как шаблон, при помощи следующего оператора на Java или С# можно создать объект с именем StackOne, представляющий стек объемом до 50 целых чисел:

StackOfIntegers StackOne = new Stack0flntegers(50);

Для C++ это будет оператор StackOfIntegers Stack0ne(50):

Далее в программе в стек StackOne можно протолкнуть значение 106, применив оператор

StackOne.push(106):

или получить в переменную OldValue верхнюю запись из StackOne при помощи оператора

OldValue - StackOne.pop ( ):

Возвращаясь к листингам 1 и 2, обратите внимание, что для обеспечения целостности структур данных в классе используется инкапсуляция. В частности, StackEntries и StackPointer определены в разделе private, тогда как методы push и pop — в разделе public. Так, внутренняя структура стека недоступна за пределами экземпляров класса. Любое обращение к стеку должно быть выполнено при помощи общих методов.

Чтобы понять важность такой защиты, предположим, что StackEntries и StackPointer определены как publiс, и программисту требуется обратиться к третьей записи стека типа StackOfIntegers. Программист, который знает, как стек реализован в памяти, может нарушить целостность стека и обратиться к массиву StackEntry напрямую, а не путем выталкивания первых двух записей. Проблема состоит в том, что в будущем программисты, обслуживающие это приложение, могут внести где-либо в программе изменения, не совместимые с этой прямой ссылкой на запись. Например, для увеличения максимального размера стека можно изменить внутреннюю организацию типа StackOfIntegers с массива на связную структуру, в которой прямая ссылка, предполагающая, что стек реализован в виде массива, будет недопустима.

В завершение раздела заметим, что класс StackOfInteges в том виде, как он определен в листингах 1 и 2, иллюстрирует кульминацию темы, проходящей через все предыдущие лекции, — это набор структур данных и процедур для управления ими в одном программном модуле. Действительно, концепция классов позволяет еще более расширить эту тему, так как разрешает программистам объединять структуры данных и относящиеся к ним процедуры в форме пользовательских типов данных, при помощи которых можно создавать множество экземпляров. На самом деле концепция классов является более общей, чем концепция типов данных, так как класс может состоять, в том числе, только из процедур. Или другой экстремальный случай — класс может включать только структуры данных. Таким образом, концепция классов ~ это мощный инструмент разработки программного обеспечения, при помощи которого можно проектировать и реализовывать шаблоны для программных модулей различных видов. Классы и объектно-ориентированный принцип стали основными инструментами в сегодняшнем арсенале средств разработки приложений.

Знания обычно принимают одну из двух форм: первый случай иллюстрируется тем, что человек знает свое имя, а второй — что человек знает, как ходить. Первый пример — это пример описательных знаний, которые отвечают на вопросы «кто?», «что?», или «почему?». Зачастую мы связываем описательные знания с накоплением фактов. Второй пример — это процедурные знания, отвечающие на вопрос «как?». Их мы ассоциируем с возможностью производить подходящее действие. Важны обе формы. В частности, накопление исключительно описательных данных редко говорит о превосходном владении предметом изучения.

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