Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Приклади читання оператора опису

Алгоритм читання оператора опису

Процедурний тип. Приклад

Процедурний тип

Склад абстрактного типу даних

 

За визначенням опис абстрактних типів даних повинен містити наступне:

· позначення типу,

· опис значень типу;

· опис операцій зі значеннями типу.

Таким чином компоненти, які входять в опис типу, гетерогенні, тому для опису абстрактних типів даних слід використовувати іменовані типи. При цьому для опису операцій на підпрограмному рівні інкапсуляції використовують підпрограмні типи, у мові Pascal – так звані процедурні, або у мові С покажчики на підпрограми, які називаються вказівники на функції.


Процедурний тип (procedural type) - це тип, множина значень якого містить посилання на закриті підпрограми. Об'єкти цього типу можуть використовуватися у лівій частині оператора присвоювання та в операціях відношень.

Опис типу являє собою опис інтерфейсу закритої підпрограми без вказування конкретного позначення підпрограми.

Підпрограми, позначення яких містимуться у правій частині оператора присвоювання, повинні мати модифікатор far наприкінці опису інтерфейсу.


program ATD;

type

pStack = ^stack;

pProc = procedure (stack: pStack; nMes: integer);

pFunc = function(stack: pStack): integer;

Stack = record

m_s: array[1..128] of integer;

m_sp: integer;

m_Push: pProc;

m_Pop: pFunc;

m_Init: pFunc;

end;

 

function Init(stack: pStack):integer; far;

begin

stack^.m_sp:= 0;

end;

 

procedure Push(stack: pStack;nMes: integer); far;

begin

 

end;

 

function Pop (stack: pStack): integer; far;

begin

 

end;

 

var

Pmy_Stack: pStacK;

 

begin

new(pmy_Stack);

pmy_Stack^.m_Push:= Push;

pmy_Stack^.m_Pop:= Pop;

pmy_Stack^.m_Init:= Init;

pmy_Stack^.m_init(pmy_Stack);

end.


Вказівник на функцію

У мові С для побудови абстрактних типів даних використовується вказівник на функцію. При цьому читання опису об'єкта в С ускладнюється. У загальному випадку опис об'єкта – це ідентифікатор (позначення об'єкта), доповнений різними ознаками, модифікаторами та позначеннями типу. Для читання опису використовують певний алгоритм.


Ø знайти позначення об'єкта (ідентифікатор);

Ø перевірити, чи є праворуч від позначення дужки () або [];

Ø якщо є, то читати опис зліва на право, а якщо ні, то читати опис справа на ліво;

Ø перевірити, чи є ліворуч від позначення символ *;

Ø якщо є, то читати опис справа на ліво;

Ø якщо є дужки, як у виразі, то спочатку читати всередині дужок;

Ø наприкінці читати позначення типу.


int nA; - опис змінної цілого типа;

int| *pnA; - опис вказівної змінної цілого типу;

int| *pnA[5] - опис масивів вказівників з п'яти елементів цілого типу;

int| (*pnA|)[5] - опис вказівника на масиви з п'яти елементів;

int| *pf() - опис функції без параметрів, яка повертає вказівник на значення цілого типу;

void(*pj)() - опис вказівника на процедуру без параметрів;

int (*p())[3] - опис функції, яка повертає вказівник на масив із трьох елементів цілого типу.


Вказівник на функцію. Приклад

struct StackRec{

int m_s[128];

int m_sp;

void (*m_Push) (StackRec*,int);

int (*m_Pop) (StackRec*);

void (*m_Init) (StackRec*);

};

 

void Push(StackRec *Stack, int nMes)

{

Stack->m_s[Stack->m_sp] = nMes;

Stack->m_sp ++;

}

 

int Pop(StackRec *Stack)

{

int nTemp;

nTemp = Stack->m_s[Stack->m_sp];

Stack->m_sp --;

return nTemp;

}

 

void Init(StackRec *Stack)

{

Stack->m_sp = 0;

}

 

void main()

{

StackRec *pStack;

pStack = new StackRec;

pStack->m_Push = Push;

pStack->m_Pop = Pop;

pStack->m_Init = Init;

pStack->m_Init(pStack);

pStack->m_Push(pStack, 22);

pStack->m_Push(pStack, 33);

}

 

<== предыдущая лекция | следующая лекция ==>
Абстрактний тип даних. 2 | Фізичні принципи
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 274; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.014 сек.