home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol080
/
sort.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1984-04-29
|
3KB
|
131 lines
program sort(0);
{insertion sort. This program is designed to follow the
data input section. It sorts the transaction file
into ascending order which is necessary for the merge
program to work correctly. }
TYPE
subje = record
subj : array[1..45]of char;
ssic : array [1..5] of char;
action : array [1..6] of char;
info : array [1..16] of char;
acct_number : array [1..4] of char
end;
ItemRecords = record
item :subje;
Next :^ItemRecords
end;
ItemPointers = ^ItemRecords;
str4 = array [1..4] of char;
str5 = array [1..5] of char;
VAR
ListHead :ItemPointers;
Newitem :subje;
done,
error :boolean;
fin,fout :file of subje;
infilename,
outfilename:string 14;
i,
count : integer;
PROCEDURE Rjust(VAR ssic:str5);
{ssic is a numeric field stored as a string. In order for a
sort to work properly, it must be right justified. Any
alphabetics sneaking into the field will be sorted below the
numbers in accordance with the ASCII collating sequence.}
var
temp : str5;
i : integer;
begin
temp := ' ';
while ssic[5] = ' ' do
begin
for i := 2 to 5 do
begin
temp[i] := ssic[(i-1)];
end; {for loop}
ssic := ' '; {gotta clear out the string before rewriting}
ssic := temp;
end; {while}
end; {Rjust}
PROCEDURE Convert(acct_number:str4; VAR count:integer);
begin
count := (((ord(acct_number[1])-48)*1000)+
((ord(acct_number[2])-48)*100 )+
((ord(acct_number[3])-48)*10 )+
((ord(acct_number[4])-48) ));
end; {convert procedure}
PROCEDURE InsertItem( Newitem :subje);
VAR
entry,
PriorEntry,
Newentry :ItemPointers;
Searching :boolean;
begin
(* FIND the position where the New item will be Inserted *)
entry := ListHead;
Searching := TRUE;
While Searching and (entry <> NIL) DO
WITH entry^ DO
{the following IF statement may be changed to sort on any field
of the record }
IF Newitem.ssic < item.ssic then
Searching := FALSE
Else
begin
PriorEntry := entry;
entry := Next
end;
(* CREATE the New entry and Insert it in position *)
New(Newentry);
Newentry^.item := Newitem;
Newentry^.Next := entry;
IF entry = ListHead then
ListHead := Newentry
Else PriorEntry^.Next := Newentry;
end; (* InsertItem *)
PROCEDURE WriteItems;external;
begin (* MAIN PROGRAM *)
ListHead := NIL; (* MAKE the LIST EMPTY *)
Writeln(' ':12,'Insertion Sort Using a Linked List');
writeln;writeln;writeln;
write(' INPUT FILE: ');
readln(infilename);
write(' OUTPUT FILE: ');
readln(outfilename);
reset(infilename,fin);
reset(outfilename,fout);
if not (eof(fout)) then
begin
writeln(' ':12,' FILE ALREADY EXISTS');
writeln(' ':12,' Erase it or choose another name');
end
else rewrite(outfilename,fout);
writeln;writeln;writeln;
Read(fin,Newitem); (* READ the First Item *)
Convert(Newitem.acct_number,count);
for i := 2 to count do
begin
read(fin,Newitem);
if (Newitem.ssic <> ' ') and (Newitem.ssic <> 'ZZZZZ')
then
begin
Rjust(newitem.ssic);
insertitem(Newitem);
end; {if}
end; {for loop}
(* Insert the New item in its correct position *)
Writeln(' ':12,'The Sorted List');
writeln(' ':12,'is being written into ',outfilename);
(* Write all the Items in order *)
WriteItems
end. (* SORTLIST *)