home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / TURBOPAS / WRDS2.ZIP / WRDS2.PAS
Encoding:
Pascal/Delphi Source File  |  1985-12-28  |  4.0 KB  |  189 lines

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