home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 June
/
SIMTEL_0692.cdr
/
msdos
/
ddjmag
/
ddj8709.arc
/
SHAMM.SEP
< prev
next >
Wrap
Text File
|
1987-08-13
|
17KB
|
685 lines
byte
Ch
integer
Count
Diff
Flag[7001]
I
Iter
K
Prime
T1
T2
constants
SIZE = 7001
main
read clock (T1)
for (Iter,1,1,1) ** Main loop **
assign (0,Count)
for (I,1,SIZE,1) ** Init. flags **
assign (1,Flag[I])
for (I,1,SIZE,1)
if (Flag[I] = 1)
assign (I+I+3,Prime)
assign (I + Prime,K)
while (K SIZE)
assign (0,Flag[K])
assign (K+Prime,K)
assign (Count+1,Count)
else
read clock (T2)
wait (5000)
assign ((T2-T1)/60,Diff)
write output (1,"@i",Diff)
get key (100,Ch)
Example 1: V.I.P. text output for the first version of the sieve program
byte
Ch
integer
Count
Diff
Flag[7001]
Iter
T1
T2
main
read clock (T1)
for (Iter,1,1,1)
init ** Initialize flags **
body (Count) ** Body of sieve **
read clock (T2)
assign (T2 - T1,Diff)
write output (1,"@i",Diff)
get key (5000,Ch)
body (Count)
<-- integer Count
integer
Flags[7001]
I
K
Prime
assign (0,Count)
for (I,1,7001,1)
if (Flag[I] = 1)
assign (I+I+3,Prime)
assign (I+Prime,K)
while (K 7001)
assign (0,Flag[K])
assign (K+Prime,K)
assign (Count+1,Count)
else
init
integer
I
for (I,1,7001,1)
assign (1,Flag[I])
Example 2: V.I.P. text output for the modified sieve program
PROGRAM CBTree;
{======================================================
Program to test the compare the time needed in creating and
searching a binary tree and a CB-tree.
Author: Namir Clement Shammas
======================================================}
CONST SIZE = 1000;
RANGE = 10000;
MainLoopCount = 100;
TYPE Bin_Ptr = ^Bin_Node;
{ normal binary tree strcutures }
Bin_Node = RECORD
Value : INTEGER;
Left, Right : Bin_Ptr;
END;
CB_Ptr = ^CB_Node;
{ Record structure for clustured binary tree }
CB_Node = RECORD
Value : INTEGER;
HLeft, HRight,
LLeft, LRight : CB_Ptr;
END;
REGTYPE = RECORD
AX,BX,CX,DX,BP,
DI,SI,DS,ED,FLAGS : INTEGER
END;
Time_Rec = RECORD
HOUR, MIN, SEC, HSEC : BYTE
END;
VAR Numbers : ARRAY [1..SIZE] OF INTEGER;
Iter, I, Choice, CDV, Diff : INTEGER;
BinTreeRoot : Bin_Ptr;
CBTreeRoot : CB_Ptr;
Timer_Start, Timer_Stop, Time_Elapsed : Time_Rec;
{-----------------------------------------------------}
PROCEDURE Get_Time(VAR TIME : Time_Rec { output });
VAR REGISTER : REGTYPE;
AH : BYTE;
BEGIN
AH := $2C;
WITH REGISTER, TIME DO BEGIN
AX:= AH SHL 8;
MSDOS(REGISTER);
HOUR := Hi(CX);
MIN := Lo(CX);
SEC := Hi(DX);
HSEC := Lo(DX);
END;
END;
{---------------------------------------------------------}
PROCEDURE Time_Diff(T_Start,
T_Finish : Time_Rec; { input }
VAR Delta_Time : Time_Rec { output });
BEGIN
WITH Delta_Time DO BEGIN
HOUR := T_Finish.HOUR - T_Start.HOUR;
IF T_Start.MIN > T_Finish.MIN THEN BEGIN
HOUR := HOUR - 1;
T_Finish.MIN := T_Finish.MIN + 60;
END;
MIN := T_Finish.MIN - T_Start.MIN;
IF T_Start.SEC > T_Finish.SEC THEN BEGIN
MIN := MIN - 1;
T_Finish.SEC := T_Finish.SEC + 60;
END;
SEC := T_Finish.SEC - T_Start.SEC;
IF T_Start.HSEC > T_Finish.HSEC THEN BEGIN
SEC := SEC - 1;
T_Finish.HSEC := T_Finish.HSEC + 100;
END;
HSEC := T_Finish.HSEC - T_Start.HSEC;
END; (* WITH *)
END; (* Time_Diff *)
{---------------------------------------------------------}
PROCEDURE Show_Time(T : Time_Rec { input });
BEGIN
WITH T DO BEGIN
WRITE('Time elapsed = ',HOUR,' : ',MIN,' : ',SEC,'.',HSEC);
END;
END; (* Show_Time *)
{---------------------------------------------------------}
PROCEDURE Create(Choice : INTEGER { input });
VAR J : INTEGER;
Angle, FloatSize, Increment : REAL;
BEGIN
CASE Choice OF
1 : BEGIN
Angle := 0.0;
Increment := Pi / 360.0;
FOR J := 1 TO SIZE DO BEGIN
Numbers[J] := Trunc(SIN(Angle) * RANGE);
Angle := Angle + Increment;
END;
END;
2 : BEGIN
Angle := 0.0;
Increment := Pi / 360.0;
FOR J := 1 TO SIZE DO BEGIN
Numbers[J] := Trunc(COS(Angle) * RANGE);
Angle := Angle + Increment;
END;
END;
ELSE BEGIN
Numbers[1] := RANGE div 2;
FOR J := 2 TO SIZE DO
Numbers[J] := Trunc(Random * RANGE);
END;
END; { CASE }
END;
{---------------------------------------------------------}
PROCEDURE Bin_Insert(VAR Root : Bin_Ptr; { input }
Item : INTEGER { input });
(* Insert element in binary-tree *)
BEGIN
IF Root = NIL THEN BEGIN
NEW(Root);
Root^.Value := Item;
Root^.Left := NIL;
Root^.Right := NIL
END
ELSE
WITH Root^ DO
IF Item < Value THEN Bin_Insert(Left,Item)
ELSE Bin_Insert(Right,Item);
END;
{---------------------------------------------------------}
PROCEDURE Bin_Search(VAR Root : Bin_Ptr; { input }
Target : INTEGER { input });
(* Recursive procedure to search for Target value *)
BEGIN
IF Root <> NIL THEN
IF Target <> Root^.Value THEN
IF Target < Root^.Value THEN BEGIN
Root := Root^.Left;
Bin_Search(Root,Target)
END
ELSE BEGIN
Root := Root^.Right;
Bin_Search(Root,Target)
END;
END;
{---------------------------------------------------------}
PROCEDURE CB_Insert(VAR Root : CB_Ptr; { input }
VAR Item : INTEGER { input });
(* Insert element in a CB-tree *)
BEGIN
IF Root = NIL THEN BEGIN
NEW(Root);
Root^.Value := Item;
Root^.LLeft := NIL;
Root^.LRight := NIL;
Root^.HLeft := NIL;
Root^.HRight := NIL;
END
ELSE
WITH Root^ DO BEGIN
Diff := Value - Item;
IF Diff > 0 THEN
IF ABS(Diff) <= CDV THEN CB_Insert(LLeft,Item)
ELSE CB_Insert(HLeft,Item)
ELSE
IF ABS(Diff) <= CDV THEN CB_Insert(LRight,Item)
ELSE CB_Insert(HRight,Item);
END; (* WITH *)
END;
{---------------------------------------------------------}
PROCEDURE CB_Search(VAR Root : CB_Ptr; { input }
VAR Target : INTEGER { input });
(* Recursive procedure to search for Target value *)
BEGIN
IF Root <> NIL THEN
IF Target <> Root^.Value THEN BEGIN
Diff := Root^.Value - Target;
IF Target < Root^.Value THEN BEGIN
IF ABS(Diff) <= CDV THEN Root := Root^.LLeft
ELSE Root := Root^.HLeft;
CB_Search(Root,Target)
END
ELSE BEGIN
IF ABS(Diff) <= CDV THEN Root := Root^.LRight
ELSE Root := Root^.HRight;
CB_Search(Root,Target)
END;
END;
END;
{---------------------------------------------------------}
BEGIN (* MAIN *)
CDV := Trunc(0.05 * RANGE);
ClrScr;
WRITE(' ':10);
WRITELN('--------- Menu for Method of Generating Numbers --------');
WRITELN;
WRITELN(' 0) Random numbers ');
WRITELN(' 1) Sine function ');
WRITELN(' 2) Cosine function ');
WRITELN;
WRITE('Enter code for array creation : ');
READLN(Choice); WRITELN;
Create(Choice);
WRITELN; WRITELN('Created array'); WRITELN;
(* Building the binary tree *)
BinTreeRoot := NIL;
Get_Time(Timer_Start);
FOR I := 1 TO SIZE DO
Bin_Insert(BinTreeRoot,Numbers[I]);
Get_Time(Timer_Stop);
Time_Diff(Timer_Start, Timer_Stop, Time_Elapsed);
Show_Time(Time_Elapsed);
WRITELN(' for creating binary Tree'); WRITELN;
(* Building the CB-tree *)
CBTreeRoot := NIL;
Get_Time(Timer_Start);
FOR I := 1 TO SIZE DO
CB_Insert(CBTreeRoot,Numbers[I]);
Get_Time(Timer_Stop);
Time_Diff(Timer_Start, Timer_Stop, Time_Elapsed);
Show_Time(Time_Elapsed);
WRITELN(' for creating CB-Tree'); WRITELN;
Get_Time(Timer_Start);
FOR Iter := 1 TO MainLoopCount DO
FOR I := SIZE DOWNTO 1 DO
Bin_Search(BinTreeRoot,Numbers[SIZE + 1 - I]);
Get_Time(Timer_Stop);
Time_Diff(Timer_Start, Timer_Stop, Time_Elapsed);
Show_Time(Time_Elapsed); WRITELN(' for binary tree search');
WRITELN;
Get_Time(Timer_Start);
FOR Iter := 1 TO MainLoopCount DO
FOR I := SIZE DOWNTO 1 DO
CB_Search(CBTreeRoot,Numbers[SIZE + 1 - I]);
Get_Time(Timer_Stop);
Time_Diff(Timer_Start, Timer_Stop, Time_Elapsed);
Show_Time(Time_Elapsed); WRITELN(' for CB-tree search');
WRITELN;
WRITELN('DONE'); WRITELN;
END.
Listing 1: Turbo Pascal program that compares the speed of building and searching binary and CB trees
PROGRAM Test_Clustered_Lists;
{$R+,V-}
{============================================================
Turbo Pascal program that implements routine for inserting,
searching and viewing clustered list structures.
Copyright (c) 1987 Namir Clement Shammas
============================================================}
CONST LENSTRING = 30;
MAX_LIST = 100;
«MDNM»
CDV = 0; { Critical Difference value }
TYPE LSTRING = STRING[LENSTRING];
KeyArray = ARRAY [1..MAX_LIST] OF LSTRING;
ListPtr = ^ListNode;
{ CLustered List structure }
ListNode = RECORD
Key : LSTRING;
{ other fields may be placed here }
NextPtr, NextHi : ListPtr;
END;
VAR Head : ListPtr;
LesKeys : KeyArray;
I, Count : INTEGER;
{---------------------------------------------------------}
PROCEDURE Search_Node(Head : ListPtr; { input }
SearchData : LSTRING; { input }
VAR Found : BOOLEAN; { output }
VAR LastPtr,
ThisPtr : ListPtr { output });
{ search for 'SearchData' in list }
VAR HiTrack : BOOLEAN;
Ord1, Diff : INTEGER;
BEGIN
Found := FALSE;
HiTrack := TRUE;
LastPtr := NIL;
ThisPtr := Head;
Ord1 := ORD(SearchData[1]);
WHILE (ThisPtr <> NIL) AND (ThisPtr^.Key < SearchData) DO BEGIN
LastPtr := ThisPtr;
IF HiTrack THEN BEGIN
Diff := ORD(ThisPtr^.Key[1]) - Ord1;
IF ABS(Diff) > CDV
THEN
ThisPtr := ThisPtr^.NextHi
ELSE BEGIN
ThisPtr := ThisPtr^.NextPtr;
HiTrack := FALSE { switch to low track }
END; { IF ABS(Diff) }
END
ELSE
ThisPtr := ThisPtr^.NextPtr;
{ END IF HiTrack }
END; { WHILE }
IF ThisPtr <> NIL THEN Found := (ThisPtr^.Key = SearchData);
END; { Search_Node }
{---------------------------------------------------------}
PROCEDURE Insert_List(VAR Head : ListPtr; { in/out }
NewData : LSTRING { input });
{ Insert new data string into the list }
VAR Found : BOOLEAN;
Ord1, Diff : INTEGER;
Tempo : LSTRING;
Node, LastPtr, ThisPtr : ListPtr;
BEGIN
Ord1 := ORD(NewData[1]); { get ascii code of firt char }
IF Head = NIL THEN BEGIN { start a new list }
new(Head);
WITH Head^ DO BEGIN
NextPtr := NIL;
NextHi := NIL;
Key := NewData
END; { WITH }
END
ELSE BEGIN { expand list }
new(Node);
WITH Node^ DO BEGIN
Key := NewData;
NextPtr := NIL;
NextHi := NIL
END; { WITH }
Search_Node(Head, Node^.Key, Found, LastPtr, ThisPtr);
IF LastPtr = NIL THEN BEGIN { insert as new list head }
Diff := ORD(Head^.Key[1]) - Ord1;
IF ABS(DIFF) > CDV THEN
Node^.NextHi := Head
ELSE
Node^.NextHi := Head^.NextHi;
Node^.NextPtr := Head;
{ END IF }
Head := Node;
END
ELSE BEGIN { insert new data in the middle or at the tail }
Diff := Ord1 - ORD(LastPtr^.Key[1]);
IF Diff <= CDV THEN BEGIN
{ insert inside a clustered sublist }
{ LasPtr may be a high of low track node }
Node^.NextPtr := LastPtr^.NextPtr;
LastPtr^.NextPtr := Node
END
ELSE BEGIN
IF ThisPtr <> NIL
THEN BEGIN
Diff := Ord1 - ORD(ThisPtr^.Key[1]);
IF ABS(Diff) > CDV
THEN BEGIN {insert between two high track nodes }
Node^.NextHi := LastPtr^.NextHi;
LastPtr^.NextHi := Node
END
ELSE BEGIN {swap names in the next high track node }
Tempo := Node^.Key;
Node^.Key := ThisPtr^.Key;
ThisPtr^.Key := Tempo;
{ insert a new swapped first element }
{ in clustered sublist }
Node^.NextPtr := ThisPtr^.NextPtr;
ThisPtr^.NextPtr := Node
END; { IF }
END
ELSE BEGIN { insert as last high track node }
Node^.NextHi := LastPtr^.NextHi;
LastPtr^.NextHi := Node
END; { IF }
END; { IF }
END; { IF LastPtr = NIL }
END; { IF Head = NIL }
END; { Insert_List }
{---------------------------------------------------------}
PROCEDURE List_to_Array(Head : ListPtr; { input }
VAR Keys : KeyArray; { output }
VAR Count : INTEGER { output });
{ Converts the list to an array containing sorted names }
{---------------------------------------------------------}
PROCEDURE Visit_Low_Node(VAR Node : ListPtr);
{ Local recursive routine to visit low tracks of a list }
BEGIN
IF (Node <> NIL) AND (Count < MAX_LIST) THEN BEGIN
Count := Count + 1;
Keys[Count] := Node^.Key;
WRITE(' ',Keys[Count]:10);
Visit_Low_Node(Node^.NextPtr);
END
ELSE WRITELN(' -]');
END; { Visit_Low_Node }
{---------------------------------------------------------}
PROCEDURE Visit_Hi_Node(VAR Node : ListPtr);
{ Local recursive routine to visit high tracks of a list }
BEGIN
IF (Node <> NIL) AND (Count < MAX_LIST) THEN BEGIN
Count := Count + 1;
Keys[Count] := Node^.Key;
WRITE(Keys[Count]:10);
Visit_Low_Node(Node^.NextPtr);
Visit_Hi_Node(Node^.NextHi);
END;
END; { Visit_Hi_Node }
{---------------------------------------------------------}
BEGIN
IF Head <> NIL THEN BEGIN
Count := 0;
Visit_Hi_Node(Head);
END
ELSE
Count := 0;
{ END IF }
END; { List_to_Array }
{---------------------------------------------------------}
BEGIN
ClrScr;
IF CDV < 0 THEN BEGIN
WRITELN('Adjust Critical Difference Value Please');
HALT
END;
Head := NIL;
WRITELN('List of sorted capitals '); WRITELN;
Insert_List(Head,'Athens'); Insert_List(Head,'London');
Insert_List(Head,'Bonn'); Insert_List(Head,'Ankara');
Insert_List(Head,'Sau Paulo'); Insert_List(Head,'Moscow');
Insert_List(Head,'Otawa'); Insert_List(Head,'Tokyo');
Insert_List(Head,'Bern'); Insert_List(Head,'Warsaw');
Insert_List(Head,'Cairo'); Insert_List(Head,'Rome');
Insert_List(Head,'Madrid'); Insert_List(Head,'Lisbon');
Insert_List(Head,'Paris'); Insert_List(Head,'Baghdad');
List_to_Array(Head, LesKeys, Count);
END.
Listing 2: Turbo Pascal program to demonstrate clustered lists structured