|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Динамические массивы. MyList2Class = Class(MyList1Class)
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 пользоваться по отношению к этой переменной нельзя. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.012 сек.) |