Лекции по программированию на Паскале. Часть 5

36. Д И Н А М И Ч Е С К И Е П Е Р Е М Е Н Н Ы Е Статической переменной (статически размещенной) именуется описан-ная очевидным образом в программке переменная, воззвание к ней осуществля-ется по имени. Место в памяти для размещения статических переменныхопределяется при компиляции программки. В Лекции по программированию на Паскале. Часть 5 отличие от таких статических переменных в программках, написанныхна языке ПАСКАЛЬ, могут быть сделаны динамические переменные. Основ-ное свойство динамических переменных состоит в том, что они соз-даются и память для их выделяется во время выполнения программки.Располагаются динамические переменные в динамической области памяти(heap - области). Динамическая Лекции по программированию на Паскале. Часть 5 переменная не указывается очевидно в описаниях переменныхи к ней нельзя обратиться по имени. Доступ к таким переменным осу-ществляется при помощи указателей и ссылок. Работа с динамической областью памяти в TURBO PASCAL реализуется спомощью процедур и функций New, Dispose, GetMem, FreeMem, Mark,Release, MaxAvail, MemAvail, SizeOf. Процедура New( var p: Pointer ) выделяет Лекции по программированию на Паскале. Часть 5 место в динамической об-ласти памяти для размещения динамической переменной p^ и ее адресприсваивает указателю p. Процедура Dispose( var p: Pointer ) высвобождает участок памяти,выделенный для размещения динамической переменной процедурой New, изначение указателя p становится неопределенным. Проуедура GetMem( var p: Pointer; size: Word ) выделяет участокпамяти в heap Лекции по программированию на Паскале. Часть 5 - области, присваивает адресок его начала указателю p,размер участка в б задается параметром size. Процедура FreeMem( var p: Pointer; size: Word ) высвобождает учас-ток памяти, адресок начала которого определен указателем p, а размер -параметром size. Значение указателя p становится неопределенным. Процедура Mark( var p: Pointer ) записывает в указатель p адресначала участка Лекции по программированию на Паскале. Часть 5 свободной динамической памяти на момент ее вызова. Процедура Release( var p: Pointer ) высвобождает участок динамичес-кой памяти, начиная с адреса, записанного в указатель p процедуройMark, то-есть, очищает ту динамическую память, которая была занятапосле вызова процедуры Mark. Функция MaxAvail: Longint возвращает длину в б самого длинно-го Лекции по программированию на Паскале. Часть 5 свободного участка динамической памяти. Функция MemAvail: Longint полный объем свободной динамической па-мяти в б. Вспомогательная функция SizeOf( X ): Word возвращает объем в бай-тах, занимаемый X, при этом X может быть или именованием переменной любоготипа, или именованием типа. Разглядим некие примеры работы с указателями. var p1, p2: ^Integer Лекции по программированию на Паскале. Часть 5; Тут p1 и p2 - указатели либо пременные ссылочного типа. p1:=NIL; p2:=NIL; После выполнения этих операторов присваивания указатели p1 и p2 небудут ссылаться ни на какой определенный объект. New(p1); New(p2); Процедура New(p1) делает последующие деяния: -в памяти ЭВМ выделяется участок для размещения величины целоготипа; -адрес этого участка Лекции по программированию на Паскале. Часть 5 присваивается переменной p1: г===== г===== ¦ *--¦--------->¦ ¦ L=====- L=====- p1 p1^ Аналогично, процедура New(p2) обеспечит выделение участка памяти,адресок которого будет записан в p2: г===== г===== ¦ *--¦--------->¦ ¦ L=====- L=====- p2 p2^ После выполнения операторов присваивания p1^:=2; p2^:=4; в выделенные участки памяти будут записаны значения 2 и 4 соответ-ственно: г===== г===== ¦ *--¦--------->¦ 2 ¦ L Лекции по программированию на Паскале. Часть 5=====- L=====- p1 p1^ г===== г===== ¦ *--¦--------->¦ 4 ¦ L=====- L=====- p2 p2^ В итоге выполнения оператора присваивания p1^:=p2^; в участок памяти, на который ссылается указатель p1, будет записанозначение 4: г===== г===== ¦ *--¦--------->¦ 4 ¦ L=====- L=====- p1 p1^ г===== г===== ¦ *--¦--------->¦ 4 ¦ L=====- L=====- p2 p2^ После выполнения оператора присваивания p2:=p1; оба указателя будут содержать адресок Лекции по программированию на Паскале. Часть 5 первого участка памяти: г===== г===== ¦ *--¦--------->¦ 4 ¦ L=====- --->L=====- p1 ¦ p1^ p2^ ¦ г===== ¦ ¦ *--¦------- L=====- p2 Переменные p1^, p2^ являются динамическими, потому что память для нихвыделяется в процессе выполнения программки при помощи процедуры New. Динамические переменные могут заходить в состав выражений, напри-мер: p1^:=p1^+8; Write('p1^=',p1^:3); Пример. В итоге выполнения программки Лекции по программированию на Паскале. Часть 5: Program DemoPointer; var p1,p2,p3:^Integer; begin p1:=NIL; p2:=NIL; p3:=NIL; New(p1); New(p2); New(p3); p1^:=2; p2^:=4; p3^:=p1^+Sqr(p2^); writeln('p1^=',p1^:3,' p2^=',p2^:3,' p3^=',p3^:3); p1:=p2; writeln('p1^=',p1^:3,' p2^=',p2^:3) end. на экран монитора будут выведены Лекции по программированию на Паскале. Часть 5 результаты: p1^= 2 p2^= 4 p3^= 18p1^= 4 p2^= 4 37. Д И Н А М И Ч Е С К И Е С Т Р У К Т У Р ЫД А Н Н Ы Х Структурированные типы данных, такие, как массивы, огромного количества, за-писи, представляют собой статические структуры, потому что их размерынеизменны Лекции по программированию на Паскале. Часть 5 в течение всего времени выполнения программки. Нередко требуется, чтоб структуры данных меняли свои размеры в ходерешения задачки. Такие структуры данных именуются динамическими, кним относятся стеки, очереди, списки, деревья и другие. Описание ди-намических структур при помощи массивов, записей и файлов приводит кнеэкономному использованию памяти ЭВМ и наращивает время решения Лекции по программированию на Паскале. Часть 5 за-дач. Любая компонента хоть какой динамической структуры представляет собойзапись, содержащую по последней мере два поля: одно поле типа указа-тель, а 2-ое - для размещения данных. В общем случае запись можетсодержать не один, а несколько укзателей и несколько полей данных.Поле данных может быть переменной, массивом, обилием либо записью. Для предстоящего Лекции по программированию на Паскале. Часть 5 рассмотрения представим отдельную компоненту в ви-де: г===== ¦ D ¦ ¦=====¦ ¦ p ¦ L=====-где поле p - указатель; поле D - данные. Описание этой составляющие дадим последующим образом: type Pointer = ^Comp; Comp = record D:T; pNext:Pointer end; тут T - тип данных. Разглядим главные правила работы с динамическими структурамиданных типа стек, очередь и Лекции по программированию на Паскале. Часть 5 перечень, базируясь на приведенное описаниекомпоненты. 38. С Т Е К И Стеком именуется динамическая структура данных, добавление компо-ненты в которую и исключение составляющие из которой делается изодного конца, именуемого верхушкой стека. Стек работает по принципу LIFO (Last-In, First-Out) - поступивший последним, обслуживается первым. Обычно над стеками производится три Лекции по программированию на Паскале. Часть 5 операции: -начальное формирование стека (запись первой составляющие); -добавление составляющие в стек; -выборка составляющие (удаление). Для формирования стека и работы с ним нужно иметь две пере-менные типа указатель, 1-ая из которых определяет верхушку стека, авторая - вспомогательная. Пусть описание этих переменных имеет вид: var pTop, pAux: Pointer; где Лекции по программированию на Паскале. Часть 5 pTop - указатель верхушки стека; pAux - вспомогательный указатель. Изначальное формирование стека производится последующими операторами: г===== г===== New(pTop); ¦ *--¦--- ¦ ¦ L=====- ¦ ¦=====¦ pTop L-->¦ ¦ L=====- г===== г===== pTop^.pNext:=NIL; ¦ *--¦--- ¦ ¦ L=====- ¦ ¦=====¦ pTop L-->¦ NIL ¦ L=====- г===== г===== pTop^.D:=D1; ¦ *--¦--- ¦ D1 ¦ L=====- ¦ ¦=====¦ pTop L-->¦ NIL ¦ L=====- Последний оператор либо группа операторов записывает содержимоеполя данных первой Лекции по программированию на Паскале. Часть 5 составляющие. Добавление составляющие в стек призводится с внедрением вспо-могательного указателя: г===== г===== г===== New(pAux); ¦ *--¦--- ¦ ¦ ----¦--* ¦ L=====- ¦ ¦=====¦ ¦ L=====- pTop ¦ ¦ ¦¦ NIL ¦ L=====- г===== г===== г===== pAux^.pNext:=pTop; ¦ *--¦--- ¦ ¦ ----¦--* ¦ L=====- ¦ ¦=====¦¦ NIL ¦<- L=====- г===== г===== г===== pTop:=pAux; ¦ *--¦--- ¦ ¦ ----¦--* ¦ L=====- ¦ ¦=====¦¦ *--¦- pAux L=====- ¦ ¦ г===== ¦ ¦ D1 ¦ ¦ ¦=====¦ ¦ ¦ NIL ¦¦ *--¦- L=====- ¦ ¦ г===== ¦ ¦ D1 ¦ ¦ ¦=====¦ ¦ ¦ NIL ¦¦ *--¦- L=====- ¦ ¦ г===== ¦ ¦ D2 ¦ ¦ ¦=====¦ ¦ --¦--* ¦¦ NIL ¦ L=====- 1-ый оператор либо группа операторов производит чтение данныхиз составляющие - верхушки стека. 2-ой оператор изменяет значение ука-зателя верхушки стека: г===== г===== D3:=pTop^.D; ¦ *--¦--- ¦ D3 ¦ pTop:=pTop^.pNext; L=====- ¦ ¦=====¦ pTop ¦ ¦ ¦ ¦ L=====- ¦ ¦ г===== ¦ ¦ D2 ¦ ¦ ¦=====¦ L-->¦ *--¦- L=====- ¦ ¦ г===== ¦ ¦ D1 ¦ ¦ ¦=====¦ ¦ ¦ NIL ¦<- L=====- Как видно из рисунка, при чтении компонента удаляется из стека. Пример. Составить программку, которая сформировывает стек, добавляет внего случайное количество компонент, а потом читает все компонентыи выводит их на экран монитора, В качестве данных взять строчку симво-лов. Ввод данных - с клавиатуры монитора, признак конца ввода - строкасимволов END. Program STACK; uses Crt; type Alfa= String[10]; PComp= ^Comp; Comp= Record sD: Alfa; pNext: PComp end; var pTop: PComp; sC: Alfa; Procedure CreateStack(var pTop: PComp; var sC: Alfa); begin New(pTop); pTop^.pNext:=NIL; pTop^.sD:=sC end; Procedure AddComp(var pTop: PComp; var sC: Alfa); var pAux: PComp; begin NEW(pAux); pAux^.pNext:=pTop; pTop:=pAux; pTop^.sD:=sC end; Procedure DelComp(var pTop: PComp; var sC:ALFA); begin sC:=pTop^.sD; pTop:=pTop^.pNext end; begin Clrscr; writeln(' ВВЕДИ Строчку '); readln(sC); CreateStack(pTop,sC); repeat writeln(' ВВЕДИ Строчку '); readln(sC); AddComp(pTop,sC) until sC='END'; writeln('****** ВЫВОД РЕЗУЛЬТАТОВ ******'); repeat DelComp(pTop,sC); writeln(sC); until pTop = NIL end. 39. О Ч Е Р Е Д И Очередью именуется динамическая структура данных, добавление ком-поненты в которую делается в один конец, а подборка осуществляетсяс другого конца. Очередь работает по принципу: FIFO (First-In, First-Out) - поступивший первым, обслуживается первым. Для формирования очереди и работы с ней нужно иметь три пере-менные типа указатель, 1-ая из которых определяет начало очереди,2-ая - конец очереди, 3-я - вспомогательная. Описание составляющие очереди и переменных типа указатель дадим сле-дующим образом: type PComp=^Comp; Comp=record D:T; pNext:PComp end; var pBegin, pEnd, pAux: PComp; где pBegin - указатель начала очереди, pEnd - указатель конца очере-ди, pAux - вспомогательный указатель. Тип Т определяет тип данных составляющие очереди. Изначальное формирование очереди производится последующими операторами: г===== г===== г===== New(pBegin); ¦ *--¦--- ¦ ¦ ¦ ¦ L=====- ¦ ¦=====¦ L=====- pBegin L-->¦ ¦ pEnd L=====- г===== г===== г===== pBegin^.pNext:=NIL; ¦ *--¦--- ¦ ¦ ¦ ¦ L=====- ¦ ¦=====¦ L=====- pBegin L-->¦ NIL ¦ pEnd Лекции по программированию на Паскале. Часть 5 L=====- г===== г===== г===== pBegin^.D:=D1; ¦ *--¦--- ¦ D1 ¦ ¦ ¦ L=====- ¦ ¦=====¦ L=====- pBegin L-->¦ NIL ¦ pEnd L=====- г===== г===== г===== pEnd:=pBegin; ¦ *--¦--- ¦ D1 ¦ ----¦--* ¦ L=====- ¦ ¦=====¦ ¦ L=====- pBegin L-->¦ NIL ¦¦ NIL ¦<--- pEnd ¦ ¦¦ NIL ¦<--- pEnd ¦ NIL ¦¦ * ¦<--- pEnd ¦ NIL ¦¦ * ¦ pEnd L-->¦ NIL ¦¦ *--¦-------------------->¦ NIL ¦¦ *--¦------>¦ *--¦------>¦ NIL ¦¦ *--¦------>¦ NIL ¦<--- pEnd ¦ L=====- ¦ L=====- L=====- ¦ ¦ L-------------- Пример. Составить программку, которая сформировывает очередь, добавляетв нее случайное количество Лекции по программированию на Паскале. Часть 5 компонент, а потом читает все компонен-ты и выводит их на экран монитора. В качестве данных взять строчку сим-волов. Ввод данных - с клавиатуры монитора, признак конца ввода -строка знаков END. Program QUEUE; uses Crt; type Alfa= String[10]; PComp= ^Comp; Comp= record sD:Alfa; pNext:PComp end Лекции по программированию на Паскале. Часть 5; var pBegin, pEnd: PComp; sC: Alfa; Procedure CreateQueue(var pBegin,pEnd: PComp; var sC: Alfa); begin New(pBegin); pBegin^.pNext:=NIL; pBegin^.sD:=sC; pEnd:=pBegin end; Procedure AddQueue(var pEnd:PComp; var sC:Alfa); var pAux: PComp; begin New(pAux); pAux^.pNext:=NIL; pEnd^.pNext:=pAux; pEnd:=pAux; pEnd Лекции по программированию на Паскале. Часть 5^.sD:=sC end; Procedure DelQueue(var pBegin: PComp; var sC: Alfa); begin sC:=pBegin^.sD; pBegin:=pBegin^.pNext end; begin Clrscr; writeln(' ВВЕДИ Строчку '); readln(sC); CreateQueue(pBegin,pEnd,sC); repeat writeln(' ВВЕДИ Строчку '); readln(sC); AddQueue(pEnd,sC) until sC='END'; writeln(' ***** ВЫВОД РЕЗУЛЬТАТОВ *****'); repeat DelQueue(pBegin,sC); writeln(sC Лекции по программированию на Паскале. Часть 5); until pBegin=NIL end.


lekarstvennie-rasteniya-referat.html
lekarstvennie-sredstva-gormonov-gipofiza.html
lekarstvennie-sredstva-primenyaemie-v-pediatrii.html