АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Динамические массивы. MyList2Class = Class(MyList1Class)

Читайте также:
  1. Динамические массивы
  2. Динамические параметры
  3. Массивы
  4. Массивы
  5. Механические, аэродинамические, электромагнитные.
  6. Многомерные символьные массивы
  7. Открытые массивы
  8. ТЕРМОДИНАМИЧЕСКИЕ СВОЙСТВА ВОДЫ
  9. Указатели и массивы
  10. Указатели и массивы

Interface

 

uses Unit1;

 

Type

 

MyList2Class = Class(MyList1Class)

Public

procedure PrependItem(sName: string; Salary: double);

procedure PrependFromFile(sFileName: string);

end;

Implementation

 

procedure MyList2Class.PrependItem(sName: string; Salary: double);

Var

pNew: pPersonType;

Begin

if not AloneItem(sName, Salary, pNew) then

Begin

pNew^.pNext:= pHead;

pHead:= pNew;

end;

end;

 


procedure MyList2Class.PrependFromFile(sFileName: string);

Var

F: Text;

sName: string[40];

Salary: double;

 

Begin

Assign(F, sFileName);

 

{$I-}

Reset(F);

{$I+}

if IOResult <> 0 then

Begin

WriteLN('File ', sFileName, ' not found');

Halt;

end;

 

while not EOF(F) do

Begin

Readln(F, sName);

Readln(F, Salary);

 

PrependItem(sName, Salary);

end;

end;

 

end.

 

 


В файле Unit3.pas описан класс MyList3Class – наследник базового класса MyList2Class. Все методы базового класса сохраняют силу, а в дополнение появляются два новых метода: InsertItem и InsertFromFile. С их помощью каждый новый элемент списка ставится в то место списка (в середину, в начало, в конец), которое он должен занять в порядке сортировки. Ясно, что перед каждым очередным добавлением элемента список должен быть отсортированным.

 


Текст файла Unit3.pas:

 

unit Unit3;

 

Interface

 

uses Unit1, Unit2, Math;

 

Type

 

MyList3Class = Class(MyList2Class)

Public

 

function CompareTwoRecords(var R1, R2: PersonType): integer;

procedure InsertItem(sName: string; Salary: double);

procedure InsertFromFile(sFileName: string);

end;

 

Implementation

 

function MyList3Class.CompareTwoRecords(

var R1, R2: PersonType): integer;

 

// Функция возвращает:

// –1, если запись R1 «меньше» записи R2

// +1, если запись R1 «больше» записи R2

// 0, если запись R1 «равна» записи R2

 

Var

l1, l2, l0, i: integer;

 

Begin

l1:= Length(R1.sName);

l2:= Length(R2.sName);

l0:= Min(l1, l2);

 


for i:= 1 to l0 do

if R1.sName[i] < R2.sName[i] then

Begin

CompareTwoRecords:= -1;

Exit;

End

Else

if R1.sName[i] > R2.sName[i] then

Begin

CompareTwoRecords:= +1;

Exit;

end;

 

if l1 < l2 then

Begin

CompareTwoRecords:= -1;

Exit;

End

Else

if l1 > l2 then

Begin

CompareTwoRecords:= +1;

Exit;

end;

 

if R1.Salary < R2.Salary then

Begin

CompareTwoRecords:= -1;

Exit;

End

Else

if R1.Salary > R2.Salary then

Begin

CompareTwoRecords:= +1;

Exit;

end;

 

// Если уж сюда попали, значит, никаких различий между записями не найдено.

 

CompareTwoRecords:= 0;

end;

 


procedure MyList3Class.InsertItem(sName: string; Salary: double);

Var

pNew, pCurr, pPrev: pPersonType;

pc: pChar;

Begin

if not AloneItem(sName, Salary, pNew) then

Begin

if CompareTwoRecords(pNew^, pHead^) < 0 then

Begin

pNew^.pNext:= pHead;

pHead:= pNew;

Exit;

end;

 

pPrev:= pHead;

pCurr:= pPrev^.pNext;

 


while pCurr <> Nil do

Begin

if CompareTwoRecords(pNew^, pCurr^) < 0 then

Begin

pPrev^.pNext:= pNew;

pNew^.pNext:= pCurr;

Exit;

end;

 

pPrev:= pCurr;

pCurr:= pCurr^.pNext;

end;

 

pPrev^.pNext:= pNew;

pTail:= pNew;

end;

end;

 

procedure MyList3Class.InsertFromFile(sFileName: string);

Var

F: Text;

sName: string [40];

Salary: double;

 

Begin

Assign(F, sFileName);

 

{SI-}

Reset(F);

{SI+}

 

if IOResult <> 0 then

Begin

WriteLN('File ', sFileName, ' not found');

Halt;

end;

 

while not EOF(F) do

Begin

ReadLN(F, sName);

ReadLN(F, Salary);

 

InsertItem(sName, Salary);

end;

end;

 

end.

 

 


Динамические массивы

 

Динамические массивы не имеют фиксированного размера. Память под массив выделяется, когда ему придается значение (!) или по отношению к нему применяется процедура SetLength.

<Объявление динамического массива> ::=

<Имя массива>: array of <Тип>

 

Переменная <Имя массива> в действительности является указателем, однако, знаком ^, процедурами New, Dispose пользоваться по отношению к этой переменной нельзя.


1 | 2 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.011 сек.)