home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / tbbyte.arc / WRDS2.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1985-08-14  |  4.1 KB  |  191 lines

  1. PROGRAM concordance;
  2.  
  3.  
  4. {    Word frequency program
  5.  
  6.      Author:          Peter Grogono
  7.      Date Written:    September, 1977
  8.  
  9.      From: Programming in Pascal
  10.            by Peter Grogono
  11.  
  12.      Modified for Turbo Pascal 2.0b
  13.      by David W. Carroll
  14.      May 5, 1985
  15.      Version 2
  16.  
  17. }
  18.  
  19. CONST
  20.  maxwordlen = 20;
  21.  
  22. TYPE
  23.   charindex = 1 .. maxwordlen;
  24.   counttype = 1 .. maxint;
  25.   wordtype = ARRAY [charindex] OF char;
  26.  
  27.   pointer = ^entrytype;
  28.   entrytype =
  29.     RECORD
  30.       left, right : pointer;
  31.       word : wordtype;
  32.       count : counttype
  33.     END;
  34.  
  35. VAR
  36.   wordtree : pointer;
  37.   nextword : wordtype;
  38.   letters : SET OF char;
  39.   infile : TEXT;
  40.  
  41.   PROCEDURE inblock;
  42.   CONST
  43.     bell = 07;
  44.  
  45.   VAR
  46.     infname : string [20];
  47.     goodfile : boolean;
  48.  
  49.   BEGIN
  50.      repeat
  51.         ClrScr;
  52.         write ('Input filename  -->  ');
  53.         readln (infname);
  54.         assign(infile,infname);
  55.         {$I-} reset(infile) {$I+};
  56.         goodfile := (IOresult = 0);
  57.         if not goodfile then
  58.         begin
  59.           write (chr(bell));
  60.           writeln ('FILE ',infname,' NOT FOUND');
  61.           delay(3000)
  62.         end;
  63.      until goodfile;
  64.   END;
  65.  
  66. procedure Uppercase(var Str : wordtype);
  67. var
  68.  indx,len    : counttype;
  69.  
  70. begin
  71.   Len := maxwordlen;
  72.   for Indx := 1 to len do
  73.      Str[Indx] := UpCase(Str[Indx]);
  74. end;
  75.  
  76.  
  77.   PROCEDURE readword (VAR wrd : wordtype);
  78.     CONST
  79.       blank = ' ';
  80.  
  81.     VAR
  82.       buffer : ARRAY [charindex] OF char;
  83.       charcount : 0 .. maxwordlen;
  84.       ch : char;
  85.  
  86.     BEGIN
  87.       IF NOT eof(infile) THEN
  88.         REPEAT
  89.           read(infile,ch);
  90.           ch := chr(ord(ch) AND 127);
  91.         UNTIL eof(infile) OR (ch IN letters);
  92.       IF NOT eof(infile) THEN
  93.         BEGIN
  94.           charcount := 0;
  95.           WHILE ch IN letters DO
  96.             BEGIN
  97.               IF charcount < maxwordlen THEN
  98.                 BEGIN
  99.                   charcount := charcount + 1;
  100.                   buffer[charcount] := ch
  101.                 END;
  102.               IF eof(infile) THEN
  103.                 ch := blank
  104.               ELSE
  105.                 BEGIN
  106.                   read(infile,ch);
  107.                   ch := chr(ord(ch) AND 127)
  108.                 END;
  109.             END; {while}
  110.           FOR charcount := charcount + 1 TO maxwordlen DO
  111.             buffer[charcount] := blank;
  112.           wrd := buffer
  113.         END
  114.     END; {readword}
  115.  
  116.  
  117.   PROCEDURE printword (wrd : wordtype);
  118.     CONST
  119.       blank = ' ';
  120.  
  121.     VAR
  122.       buffer : ARRAY [charindex] OF char;
  123.       charpos : 1 .. maxwordlen;
  124.  
  125.     BEGIN
  126.       buffer := wrd;
  127.       FOR charpos := 1 TO maxwordlen DO
  128.         write(buffer[charpos])
  129.     END; {printword}
  130.  
  131.  
  132.  
  133.  
  134. PROCEDURE makeentry (VAR tree : pointer; entry : wordtype);
  135. VAR
  136.   uentry : wordtype;
  137.   uword : wordtype;
  138.  
  139.     BEGIN
  140.       IF tree = NIL THEN
  141.         BEGIN
  142.           new(tree);
  143.           WITH tree^ DO
  144.             BEGIN
  145.               word := entry;
  146.               count := 1;
  147.               left := NIL;
  148.               right := NIL
  149.             END; {with}
  150.         END
  151.       ELSE
  152.         WITH tree^ DO
  153.           BEGIN
  154.             uentry := entry;
  155.             uppercase(uentry);
  156.             uword := word;
  157.             uppercase(uword);
  158.             IF uentry < uword THEN
  159.               makeentry(left,entry)
  160.             ELSE IF uentry > uword THEN
  161.               makeentry(right,entry)
  162.             ELSE count := count + 1
  163.           END
  164.     END; {makeentry}
  165.  
  166.   PROCEDURE printtree (tree : pointer);
  167.     BEGIN
  168.       IF tree <> NIL THEN
  169.         WITH tree^ DO
  170.           BEGIN
  171.             printtree(left);
  172.             printword(word);
  173.             writeln(count);
  174.             printtree(right)
  175.           END
  176.     END; {printtree}
  177.  
  178.   BEGIN {concordance}
  179.     letters := ['a' .. 'z','A' .. 'Z'];
  180.     wordtree := NIL;
  181.     inblock;
  182.     WHILE NOT eof(infile) DO
  183.       BEGIN
  184.         readword(nextword);
  185.         IF NOT eof(infile) THEN
  186.           makeentry(wordtree,nextword)
  187.       END; {while}
  188.     printtree(wordtree)
  189.   END.  {concordance}
  190.  
  191.