КАТЕГОРИИ: Архитектура-(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); }
Дата добавления: 2014-01-04; Просмотров: 297; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |