суббота, 3 декабря 2011 г.

ТТП, Лекция 13

Лекция 13. Динамические структуры данных

Статические и динамические переменные

Для обычных переменных память выделяется до того, как программа начинает выполняться.
Динамическая переменная – это переменная, область памяти для которой выделяется в процессе работы программы.

Указатель – переменная, которая содержит адрес другой переменной.

Имя:^Тип;

P1:^integer;
P2:^real;

Выделение и освобождение памяти

New(Указатель) –создает переменную и ее адрес записывает в переменную-указатель.
Dispose(Указатель) –  освобождает память, занимаемую динамической переменной.

Var
            P1,p2,p3:^integer;
Begin
            New(p1);
            New(p2);
            Readln(p1^,p2^);
            P3^:=p1^+p2^;
            Writeln(p3^);
            Dispose(p1);
End.

Список

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

type
     p_student=^student;
     student=record
          name:string[20];
          next:p_student;
     end;
var
     head:p_student; { начало списка }
     curr:p_student; { текущий элемент списка }
     buf:string[20]; { буфер для ввода с клавиатуры }
begin
     repeat
          write('Фамилия-> ');
          readln(buf);
          if length(buf)<>0 then
               begin
                    new(curr);
                    curr^.name:=buf;
                    curr^.next:=head;
                    head:=curr;
               end;
     until length(buf)=0;
     writeln('** Введенный список **');
     curr:=head;
     while curr<>NIL do begin
          writeln(curr^.name );
          curr:=curr^.next;
     end;
     readln;
end.

Контрольные вопросы
1. Что является значением переменной-указателя (в общем случае)?
2. Как выделить память для динамической переменной?
3. Как получить доступ к динамической переменной?
4. Что представляют из себя элементы динамической структуры «список»?
5. Из каких частей состоит запись, являющаяся элементом динамической структуры список?

ТТП, Лекция 12

Лекция 12. Модуль программиста

Структура модуля


unit ИмяМодуля;
interface
            { объявление типов, констант, переменных, процедур и функций,
   которые могут использоваться в программах, использующих этот модуль }
implementation
            { объявление типов, констант, переменных, процедур и функций,
              которые используются в процедурах и функциях модуля }

            { инструкции реализации процедур и функций модуля }
begin
            { инструкции инициализации переменных модуля }
end.

Пример модуля программиста


{ функции для решения задач комбинаторики }
unit Komb;

interface
    { k - кол-во элементов множества }
    { r - кол-во элементов подмножества }
    function sochet(k: integer; r: integer): longint;
    function razm  (k: integer; r: integer): longint;
    function perest(k: integer): longint;

implementation

    function factor(x: integer):longint;
       var
          f,i: longint;
       begin
          f:=1;
          for i:=2 to x do f:=f*i;
          factor:=f;
       end;

    function sochet(k: integer; r: integer): longint;
       begin
           sochet:=Round(factor(k)/(factor(r)*factor(k-r)));
       end;

   function razm(k: integer; r: integer): longint;
       begin
           razm:=Round(factor(k)/factor(k-r));
       end;

  function perest(k: integer): longint;
       begin
           perest:=factor(k);
       end;

  begin

  end.

Компиляция модуля 
Компилируется модуль обычным образом (не забыть задать режим компиляции «на диск»).

Пример использования модуля
uses komb; { используется модуль программиста "Комбинаторика" }
var
   k: integer;        { кол-во элементов множества }
   r: integer;        { кол-во элементов подмножества }
   p,a,c: longint;    { количество перестановок, размещений и сочетаний }

begin
     writeln('Введите кол-во элементов множества и подмножества');
     readln(k,r);
               p:=perest(k);
               a:=razm(k,r);
               c:=sochet(k,r);
               writeln('Количество перестановок ',k,' элементов равно ',p);
               writeln('Количество размещений из ',k,' по ',r,' равно ',a);
               writeln('Количество различных сочетаний из ',k,' по ',r,' равно ',c);
     writeln('Для завершения работы программы нажмите <Enter>');
     readln;
end.


Контрольные вопросы
1. Перечислите разделы модуля программиста
2. Для чего указывается объявление процедуры (функции) в разделе interface?
3. Как выполнить компиляцию модуля?
4. Что является результатом компиляции модуля?
5. Что надо сделать, чтобы функции и процедуры, находящиеся в модуле, стали доступны программе, которой они нужны?