Ну я так и делал, но пишет
Цитата
[Ïðåäóïðåæäåíèå] sort.dpr(33): Return value of function 'CmpStr' might be undefined
Вот тот же код (на всякий случай)::
Код
program sort;
{$APPTYPE CONSOLE}
uses
SysUtils,
windows;
{
ôóíêöèÿ ñðàâíåíèÿ 2-õ ñòðîê â ëåêñèêîãðàôè÷åñêîì ïîðÿäêå
}
function CmpStr(const a, b: string): integer;
var
i, lenA, lenB: byte;
begin
lenA := length(a);
lenB := length(b);
i := 1;
while (i <= lenA) and (i <= lenB) and (a[i] = b[i]) do
inc(i);
if (i > lenA) and (i > lenB) then
CmpStr := 0
else if (i > lenA) or ((i <= lenB) and (a[i] < b[i])) then
CmpStr := -1
else if (i > lenB) or ((i <= lenA) and (a[i] > b[i])) then
CmpStr := 1;
end;
type
{ âîçìîæíûå âèäû ìîðôåì: ïðèñòàâêà, êîðåíü, ñóôôèêñ, îêîí÷àíèå }
MorphemeType = (
PREFIX,
ROOT,
SUFFIX,
TERMINATION
);
MorphPtr = ^Morpheme;
{ ñòðóêòóðà, õðàíÿùàÿ èíôîðìàöèþ î ìîðôåìå â ñïèñêå ìîðôåì }
Morpheme = record
_type: MorphemeType; { âèä ìîðôåìû }
_value: string; { çíà÷åíèå ìîðôåìû }
next: MorphPtr; { óêàçàòåëü íà ñëåäóþùóþ ìîðôåìó â ñïèñêå }
end;
{ îáúåêò - ñïèñîê ìîðôåì, ôàêòè÷åñêè îáû÷íûé îäíîíàïðàâëåííûé ñïèñîê, âîò òîëüêî ýëåìåíòû
äîáàâëÿþòñÿ íå â íà÷àëî èëè êîíåö ñïèñêà, à äîáàâëÿþòñÿ òàêèì îáðàçîì, ÷òîáû ïîñëå äîáàâëåíèÿ
î÷åðåäíîãî ýëåìåíòà â ñïèñîê, îí (ñïèñîê) áûë óïîðÿäî÷åí ïî ïîëÿì _value â ëåêñèêîãðàôè÷åñêîì ïîðÿäêå
}
MorphemList = object
first: MorphPtr; // óêàçàòåëü íà ïåðâûé ýëåìåíò ñïèñêà
constructor Create; // ñîçäàíèå ïóñòîãî ñïèñêà
destructor Free; // óíè÷òîæåíèå ñïèñêà
procedure Add(const mType: MorphemeType; const value: string); {
äîáàâëåíèå ìîðôåìû â ñïèñîê (mType - òèï ìîðôåìû), value - çíà÷åíèå
}
procedure Print; // ïå÷àòü ñïèñêà ìîðôåì
end;
constructor MorphemList .Create;
begin
first := nil;
end;
destructor MorphemList.Free;
var
head: MorphPtr;
begin
while first <> nil do begin
head := first;
first := first^.next;
dispose(head);
end;
end;
procedure MorphemList.Add(const mType: MorphemeType; const value: string);
var
p, prev, next: MorphPtr;
cmp: integer;
begin
new(p);
p^._type := mType;
p^._value := value;
if first = nil then begin
p^.next := nil;
first := p;
end else begin
prev := nil;
next := first;
cmp := CmpStr(next^._value, value);
while (next <> nil) and (cmp < 0) do begin
prev := next;
next := next^.next;
if next <> nil then
cmp := CmpStr(next^._value, value);
end;
if (cmp <> 0) or (mType = ROOT) then begin
if (prev = nil) then begin
p^.next := first;
first := p;
end else if (next = nil) then begin
p^.next := nil;
prev^.next := p
end else begin
p^.next := next;
prev^.next := p;
end;
end else dispose(p);
end;
end;
procedure MorphemList.Print;
var
p: MorphPtr;
begin
p := first;
while p <> nil do begin
writeln(p^._value);
p := p^.next;
end;
end;
{
â ðåçóëüòàòå ðàáîòû ïðîöåäóðû, íà âõîä êîòîðîé ïîñòóïàåò ñòðîêà S âèäà
<íàçâàíèå_ìîðôåìû òèï_ìîðôåìû>
áóäåò çàïèñü òèïà_ìîðôåìû â ïåðåìåííóþ mType è ñàìîé ìîðôåìû â ïåðåìåííóþ value
}
procedure GetMorphemInfo(const s: string;
var mType: MorphemeType;
var value: string);
var
temp: string;
begin
temp := copy(s, pos(' ', s) + 1, 255);
if temp = 'ROOT' then
mType := ROOT
else if temp = 'PREFIX' then
mType := PREFIX
else if temp = 'SUFFIX' then
mType := SUFFIX
else mType := TERMINATION;
value := copy(s, 1, pos(' ', s) - 1);
end;
const
// ñèìâîëüíîå îòîáðàæåíèå íàçâàíèé âèäîâ ìîðôåì
// szMotphTypes[PREFIX] == "PREFIX" è ò.ä.
szMorphTypes: array [ MorphemeType ] of string =
('PREFIX',
'ROOT',
'SUFFIX',
'TERMINATION'
);
var
// ìàññèâ ñïèñêîâ ìîðôåì, êàæäûé ýëåìåíò ìàññèâà - ñïèñîê ìîðôåì îïðåäåëåííîãî âèäà,
// íàïðèìåð mList[ROOT] - ñïèñîê êîðíåé
mList: array [ MorphemeType ] of ^MorphemList;
mt: MorphemeType; // äîïîëíèòåëüíàÿ ïåðåìåííàÿ
morphFile: Text; // òåêñòîâûé ôàéë ñ ìîðôåìàìè (ïðèìåð ñîäåðæàíèÿ ôàéëà ÿ ïðèâåë)
temp, value: string; // äîïîëíèòåëüíûé ïåðåìåííûå
begin
{îáðàùåíèå ê ðóññêîìó ÿçûêó}
setconsoleCp(1251);
setconsoleOutputCp(1251);
assign( morphFile, 'morphems.txt' );
reset( morphFIle ); // îòêðûâàåì ôàéë ñ ìîðôåìàìè äëÿ ÷òåíèÿ
for mt := PREFIX to TERMINATION do
new( mList[ mt ], Create ); // ñîçäàåì âñå ñïèñêè ìîðôåì
while not eof ( morphFile ) do begin // ÷èòàåì ñòðîêè èç ôàéëà
readln( morphFIle, temp );
GetMorphemInfo(temp, mt, value); // âûäåðãèâàåì èç ñòðîêè èíôîðìàöèþ î ìîðôåìå
mList[mt]^.Add(mt, value); // çàíîñèì ìîðôåìó â ñîîòâåòñòâóþùèé ñïèñîê
end;
for mt := PREFIX to TERMINATION do begin
writeln( szMorphTypes[ mt ], '''s:'); // ïîäñêàçêà ïîêàçûâàåò ñïèñîê êàêîé èç ìîðôåì ñåé÷àñ áóäåò âûâåäåí
mList[ mt ]^.Print; // ïå÷àòü î÷åðåäíîãî ñïèñêà ñïèñêà
writeln;
dispose( mList[ mt ], Free ); // óäàëåíèå ñïèñêà
end;
close( morphFile ); // íå çàáûâàåì çàêðûòü ôàéë
end.