home *** CD-ROM | disk | FTP | other *** search
/ Play and Learn 2 / 19941.ZIP / 19941 / GERMAN / GERMANL / COMBO1.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-02-05  |  19.4 KB  |  731 lines

  1. {$R-}    {Range checking off}
  2. {$B+}    {Boolean complete evaluation on}
  3. {$S+}    {Stack checking on}
  4. {$I+}    {I/O checking on}
  5. {$N-}    {No numeric coprocessor}
  6. {$M 65500,16384,655360} {Turbo 3 default stack and heap}
  7.  
  8. program COMBO;
  9.  
  10.  
  11. Uses
  12.   Crt;
  13.  
  14. const
  15.    STRINGSIZE = 40;
  16.    LARGESTRING = 80;
  17.    SPACE = ' ';
  18.    SENTINEL = '';
  19.  
  20. type
  21.    STRING_40 = string[STRINGSIZE];
  22.    STRING_80 = string[LARGESTRING];
  23.    STACKTYPE = ^STACKNODE;
  24.    STACKNODE = record
  25.      LEVEL:  INTEGER;
  26.      WORD:  STRING_80;
  27. {! 1.^ The SYSTEM unit now uses this name as a standard identifier.}
  28.      SAME, SUB, NEXT  : STACKTYPE
  29.    end;
  30.  
  31.  
  32. var
  33.   FileName : STRING[20];
  34.   FileName1 : STRING[20];
  35.   LessonName : STRING[20];
  36.   LessonNumber : STRING[20];
  37.   Counter1 : integer;
  38.   DOLOOP : BOOLEAN;
  39.   ROOT, WRKLEAF1, WRKLEAF2 :  STACKTYPE;
  40.   LEVELS : TEXT;
  41.   FLOOR  : INTEGER;
  42.   STUFF   : STACKNODE;
  43.   INFILE  : TEXT;
  44.   OUTFILE : TEXT;
  45.   INFILE1 : TEXT;
  46.   OUTFILE1: TEXT;
  47.   WORD1 : STRING_80;
  48.   INT1    : INTEGER;
  49.   INSTR1  : STRING_80;
  50.   INTER   : INTEGER;
  51.   INST    : STRING_80;
  52.   WORDS   : STRING_80;
  53.   NUMS    : INTEGER;
  54.   Y       : STRING_40;
  55.   X       : BOOLEAN;
  56.   IND     : INTEGER;
  57.   CONT    : STRING_40;
  58.   FLAGEXIT, FLAGADD : BOOLEAN;
  59.   SAVESTR1, SAVESTR2, SAVESTR3, SAVESTR4, SAVESTR5 : STRING_80;
  60.   VERB, NOUN, PREP, ART, QUESTION  : STRING_80;
  61.   UTILNUM, NUM1, NUM2, NUM3, NUM4, NUM5 : INTEGER;
  62.   TST1,TST2,TST3,TST4,TST5:   STRING_80;
  63.   FOUND   :  BOOLEAN;
  64.   NAME    :  STRING_40;
  65.   LETTER  : CHAR;
  66.   HOR     :  INTEGER;
  67.   INPUT   :  CHAR;
  68.   WORD : STRING_80;
  69.   HORIZ : INTEGER;
  70.   VERT  : INTEGER;
  71.  
  72. Procedure ClearRest;
  73.   var
  74.     X,Y   : integer;
  75.  
  76.   begin
  77.     for Y := 4 to 20 do
  78.       begin
  79.         GotoXY(1,Y);
  80.         ClrEol
  81.       end
  82.   end;
  83.  
  84.   procedure CreateWindow(X1,Y1,X2,Y2:  integer);
  85.  
  86.  
  87. var
  88.   border:  integer;
  89.  
  90. BEGIN
  91.  
  92.   window(1,1,80,25);
  93.   GoToXY(X1,Y1) ; Write('┌'); GoToXY(X1,Y2); Write('└');
  94.   For border  := (X1+1) to (X2-1) do
  95.     begin
  96.       GoToXY(border,Y1); Write('─');
  97.       GoToXY(border,Y2); Write('─')
  98.     end;
  99.   GoToXY(X2,Y1); write('┐'); GoToXY(X2,Y2); Write('┘');
  100.   for border :=(Y1+1) to (Y2-1) do
  101.     begin
  102.       GoToXY(X1,border); write('│');
  103.       GoToXY(X2,border); write ('│')
  104.     end;
  105.   window(X1+1, Y1+1, X2-1, Y2-1);
  106.   ClrScr;
  107.   gotoXY(1,1);
  108.  
  109. END;
  110.  
  111. Procedure INPUTLINE (var  instring  : string_80);
  112. var
  113.   key  :  byte;
  114.   FuncKey  : boolean;
  115.   inchar : char;
  116.   letter  : char;
  117.  
  118. function getkey : Byte;
  119.  
  120. begin
  121.   FuncKey := false;
  122.   repeat until KeyPressed;
  123.     if KeyPressed then
  124.       begin
  125.         letter:=ReadKey;
  126.         if letter = #0  then
  127.           begin
  128.             letter := ReadKey;
  129.             FuncKey := true;
  130.           end
  131.       end;
  132.       key:=ord(letter);
  133.       Case key of
  134.         01 : key := 132;
  135.         15 : key := 148;
  136.         21 : key := 129
  137.       end;
  138.       if FuncKey then
  139.         begin
  140.           Case key of
  141.             01 : key := 132 ;
  142.             30 : key := 142 ;
  143.             15 : key := 148 ;
  144.             24 : key := 153 ;
  145.             21 : key := 129 ;
  146.             22 : key := 154 ;
  147.             31 : key := 225 ;
  148.           end
  149.         end;
  150.         GetKey := key;
  151.  
  152.        end;
  153.  
  154. begin
  155.   instring := '';
  156.   Repeat
  157.     inchar := chr(Getkey) ;
  158.          If (key = 8) then
  159.             begin
  160.               Delete(instring,length(instring),1);
  161.               gotoXY(Horiz,Vert);
  162.               ClrEol;
  163.               write(instring)
  164.             end
  165.          Else if (key <> 8) then
  166.            begin
  167.              instring := instring + inchar ;
  168.             { if length(instring) = 35 then
  169.                begin
  170.                  X := WhereX;
  171.                  Y := WhereY;
  172.                  gotoXY(length(instring)+4,Y);
  173.                  write('You only have three letters left.');
  174.                  gotoXY(X,Y);
  175.                  delay(900);
  176.                  ClrEol
  177.                end}
  178.            end;
  179.     If (((key <> 13) or (length(instring) <> 80))and (key<>8)) then write(inchar)
  180.   Until ((key = 13) or (length(instring)=80)) ;
  181.   If (key = 13) then Delete(instring,length(instring),1);
  182.     If length(instring)<> 0 then
  183.       begin
  184.         while Copy(instring,length(instring),1) = chr(32) do
  185.         delete(instring,length(instring),1);
  186.         while pos(space,instring)=1 do
  187.         Delete(instring,1,1)
  188.       end
  189. End ;
  190.  
  191. function GETREC(var WORKINT: INTEGER;var  WORKSTR:  STRING_80;
  192.                 var WORKFILE: TEXT): boolean;
  193.    begin
  194.         if not EOF(WORKFILE) then
  195.             begin
  196.               readln(WORKFILE, WORKINT);
  197.               readln(WORKFILE, WORKSTR);
  198.               GETREC := TRUE
  199.             end
  200.         else begin
  201.                GETREC := FALSE
  202.              end
  203.    end;
  204.  
  205. procedure PUTREC(var INT1: INTEGER; var INST:  STRING_80);
  206.    begin
  207.  
  208.             begin
  209.               writeln(OUTFILE1, INT1);
  210.               writeln(OUTFILE1, INST);
  211.             end
  212.  
  213.    end;
  214.  
  215. procedure MAKE(var STACK : STACKTYPE);
  216.  
  217. begin
  218.   STACK := NIL
  219. end;
  220.  
  221. procedure PUSH(var LEAF: STACKTYPE; var STACK: STACKTYPE);
  222.  
  223. begin
  224.   LEAF^.NEXT := STACK;
  225.   STACK      := LEAF
  226. end;
  227.  
  228. function POP(var LEAF : STACKTYPE; var STACK: STACKTYPE): boolean;
  229.  
  230. begin
  231.   if (STACK = NIL) then
  232.     POP := FALSE
  233.   else
  234.     begin
  235.       LEAF := STACK;
  236.       STACK := STACK^.NEXT;
  237.       LEAF^.NEXT := NIL;
  238.       POP := TRUE
  239.     end
  240. end;
  241.  
  242.  
  243. function FINDBRANCH (var W, X, Y, Z, N : INTEGER;
  244.                      var OUTSTRNG1, OUTSTRNG2, OUTSTRNG3, OUTSTRNG4, OUTSTRNG5: STRING_80;
  245.         ar LEAF: STACKTYPE; var STACK: STACKTYPE);
  246.  
  247. begin
  248.   LEAF^.NEXT := STACK;
  249.   STACK      := LEAF
  250. end;
  251.  
  252. function POP(var LEAF : STACKTYPE; var STACK: STACKTYPE): boolean;
  253.  
  254. begin
  255.   if (STACK = NIL) then
  256.     POP := FALSE
  257.   else
  258.     begin
  259.       LEAF := STACK;
  260.       STACK := STACK^.NEXT;
  261.       LEAF^.NEXT := NIL;
  262.       POP := TRUE
  263.     end
  264. end;
  265.  
  266.  
  267. function FINDBRANCH (var W, X, Y, Z, N : INTEGER;
  268.                      var OUTSTRNG1, OUTSTRNG2, OUTSTRNG3, OUTSTRNG4, OUTSTRNG5: STRING_80;
  269.         := FINDPTR^.WORD;
  270.       FINDPTR   := FINDPTR^.SUB;
  271.       while ((X <> 1) and (FINDPTR <> NIL)) do
  272.         begin
  273.           FINDPTR := FINDPTR^.SAME;
  274.           X := X - 1
  275.         end;
  276.         X := B;
  277.         if FINDPTR = NIL then FLAG := FALSE
  278.         else
  279.           begin
  280.             OUTSTRNG2 := FINDPTR^.WORD;
  281.             FINDPTR   := FINDPTR^.SUB;
  282.             while ((Y <> 1) and (FINDPTR <> NIL)) do
  283.               begin
  284.                 FINDPTR := FINDPTR^.SAME;
  285.                 Y := Y - 1;
  286.               end;
  287.               Y := C;
  288.               if FINDPTR = NIL then FLAG := FALSE
  289.               else
  290.                 begin
  291.                   OUTSTRNG3 := FINDPTR^.WORD;
  292.                   FINDPTR   := FINDPTR^.SUB;
  293.                   while ((Z <> 1) and (FINDPTR <> NIL)) do
  294.                     begin
  295.                       FINDPTR := FINDPTR^.SAME;
  296.                       Z := Z - 1;
  297.                     end;
  298.                     Z := D;
  299.                     if FINDPTR = NIL then FLAG := FALSE
  300.                     else
  301.                       begin
  302.                         OUTSTRNG4 := FINDPTR^.WORD;
  303.                         FINDPTR   := FINDPTR^.SUB;
  304.                       end
  305.                 end
  306.           end
  307.     end;
  308.   if FLAG then FINDBRANCH := TRUE
  309.       else FINDBRANCH := FALSE
  310. end;
  311.  
  312.  
  313.  
  314. {procedure PRINTTREE(var STEM : STACKTYPE);
  315.  
  316. var
  317.   FLAGEND : BOOLEAN;
  318.   Q,R,S,T,U : INTEGER;
  319.   PRNTSTR1, PRNTSTR2, PRNTSTR3, PRNTSTR4, PRNTSTR5: STRING_40;
  320.  
  321.  
  322.  
  323. begin
  324.   FLAGEND := FALSE;
  325.   WRITELN('BEGIN PRINTING ALL COMBINATIONS:');
  326.   Q :=1; R:=1; S:=1; T:=1;
  327.   while not FLAGEND do begin
  328.     if FINDBRANCH(Q,R,S,T,U, PRNTSTR1,PRNTSTR2,PRNTSTR3,PRNTSTR4,PRNTSTR5,STEM) then begin
  329.       WRITE(PRNTSTR1+' ');
  330.       WRITE(PRNTSTR2+' ');
  331.       WRITE(PRNTSTR3+' ');
  332.       WRITELN(PRNTSTR4);
  333.       T := T + 1
  334.     end
  335.     else begin
  336.       if(PRNTSTR1='EMPTY') then FLAGEND := TRUE
  337.       else begin
  338.         if(PRNTSTR2='EMPTY') then begin
  339.           Q := Q+1;
  340.           R := 1;
  341.         end
  342.           else begin
  343.             if(PRNTSTR3='EMPTY') then begin
  344.               R := R+1;
  345.               S := 1
  346.             end
  347.               else begin
  348.                 if(PRNTSTR4='EMPTY') then begin
  349.                   S := S+1;
  350.                   T := 1
  351.                 end
  352.               end
  353.           end
  354.       end
  355.     end
  356.   end
  357. end;}
  358.  
  359.  
  360.  
  361.  
  362.  
  363.  
  364. function SCANTREE(var WRKINT : INTEGER ; WRKSTR : STRING_80;
  365.                   var BEGINPTR : STACKTYPE;
  366.                   var SUBPTR   : STACKTYPE): boolean;
  367.  
  368. var
  369.   SCANPTR  :  STACKTYPE;
  370.   TRAILPTR :  STACKTYPE;
  371.  
  372. begin
  373.   if (BEGINPTR = NIL) then begin
  374.        SCANTREE := FALSE
  375.      end
  376.    else begin
  377.      TRAILPTR := BEGINPTR;
  378.      SCANPTR  := BEGINPTR;
  379.      if (WRKINT <> SCANPTR^.LEVEL) then begin
  380.        SCANPTR := SCANPTR^.SUB;
  381.      end;
  382.      if (SCANPTR = NIL) then
  383.        begin
  384.          SCANTREE := FALSE;
  385.          SUBPTR := TRAILPTR
  386.        end
  387.        else begin
  388.          while ((SCANPTR <> NIL) and (SCANPTR^.WORD <> WRKSTR)) do
  389.            begin
  390.              TRAILPTR := SCANPTR;
  391.              SCANPTR := SCANPTR^.SAME
  392.            end;
  393.            if (SCANPTR = NIL) then begin
  394.              SCANTREE := FALSE;
  395.              SUBPTR := TRAILPTR
  396.            end
  397.            else begin
  398.              SCANTREE := TRUE;
  399.              SUBPTR := SCANPTR
  400.            end
  401.        end
  402.    end
  403. end;
  404.  
  405. function ISBRANCH(var ININT1 : INTEGER ; var INSTR1 : STRING_80;
  406.                   var ININT2 : INTEGER ; var INSTR2 : STRING_80;
  407.                   var ININT3 : INTEGER ; var INSTR3 : STRING_80;
  408.                   var ININT4 : INTEGER ; var INSTR4 : STRING_80;
  409.                   var ROOT   : STACKTYPE): boolean;
  410.  
  411. var
  412.   ISPTR1, ISPTR2, ISPTR3, ISPTR4 : STACKTYPE;
  413.  
  414.  
  415. begin
  416.   ISBRANCH := FALSE;
  417.   if SCANTREE(ININT1, INSTR1, ROOT, ISPTR1) then begin
  418.     if SCANTREE(ININT2, INSTR2, ISPTR1, ISPTR2) then begin
  419.       if SCANTREE(ININT3, INSTR3, ISPTR2, ISPTR3) then begin
  420.         if SCANTREE(ININT4, INSTR4, ISPTR3, ISPTR4) then
  421.           ISBRANCH := TRUE
  422.         end
  423.       end
  424.     end
  425. end;
  426.  
  427.  
  428.  
  429. procedure ADDELE(var WRKINT: INTEGER; var WRKSTR : STRING_80;
  430.                  var BEGINPTR : STACKTYPE;
  431.                  var SUBPTR   : STACKTYPE);
  432.  
  433. var
  434.   ADDPTR   : STACKTYPE;
  435.  
  436. begin
  437.   NEW(ADDPTR);
  438.   ADDPTR^.LEVEL := WRKINT;
  439.   ADDPTR^.WORD  := WRKSTR;
  440.   ADDPTR^.SAME  := NIL;
  441.   ADDPTR^.SUB   := NIL;
  442.   if (BEGINPTR = NIL) then begin
  443.     BEGINPTR := ADEUDóöUJƒ<QYIQJöh╘ü    %9AQH4(Çüò╣É4(Çüò▒═öüëò¥Ñ╕4(ÇÇö⌐àÿÇíAQIx╣1Y0Ç≡°üMU    AQIx╣1Y0ñü╤íò╕UE
  444.         end
  445.       end
  446.     end
  447. end;
  448.  
  449.  
  450.  
  451. procedure ADDELE(var WRKINT: INTEGER; var WRKSTR : STRING_80;
  452.                  var BEGINPTR : STACKTYPE;
  453.                  var SUBPTR   : STACKTYPE);
  454.  
  455. var
  456.   ADDPTR   : STACKTYPE;
  457.  
  458. begin
  459.   NEW(ADDPTR);
  460.   ADDPTR^.LEVEL := WRKINT;
  461.   ADDPTR^.WORD  := WRKSTR;
  462.   ADDPTR^.SAME  := NIL;
  463.   ADDPTR^.SUB   := NIL;
  464.   if (BEGINPTR = NIL) then begin
  465.     BEGINPTR :=$AEDUVS2LJ*Ñ*ÑCRPTV@┬.MQ╨ä"
  466. èAíD ¡╠üíD ¡Älñ L¼φ-┴íD    QA°s├30≡0É39°8≡ÇÉ≡0É38I≡0q: STRING_80;
  467.                      var ROOT   : STACKTYPE);
  468.  
  469.  
  470. var
  471.   TEMPPTR1 : STACKTYPE;
  472.   TEMPPTR2 : STACKTYPE;
  473.   TEMPPTR3 : STACKTYPE;
  474.   TEMPPTR4 : STACKTYPE;
  475.   TEMPPTR5 : STACKTYPE;
  476.  
  477. begin
  478.   if not (SCANTREE(ININT1, INSTR1, ROOT,     TEMPPTR1)) then
  479.   ADDELE(ININT1, INSTR1,ROOT,    TEMPPTR1);
  480.   if not (SCANTREE(ININT2, INSTR2, TEMPPTR1, TEMPPTR2)) then
  481.   ADDELE(ININT2, INSTR2,TEMPPTR1,TEMPPTR2);
  482.   if not (SCANTREE(ININT3, INSTR3, TEMPPTR2, TEMPPTR3)) then
  483.   ADDELE(ININT3, INSTR3,TEMPPTR2,TEMPPTR3);
  484.   if not (SCANTREE(ININT4, INSTR4, TEMPPTR3, TEMPPTR4)) then
  485.   ADDELE(ININT4, INSTR4,TEMPPTR3,TEMPPTR4);
  486.   if not (SCANTREE(ININT5, INSTR5, TEMPPTR4, TEMPPTR5)) then
  487.   ADDELE(ININT5, INSTR5,TEMPPTR4,TEMPPTR5)
  488. end;
  489.  
  490.  
  491. procedure BREAKTREE(var STEM : STACKTYPE);
  492.  
  493. var
  494.   BRKPTR    : STACKTYPE;
  495.   STACKPTR  : STACKTYPE;
  496.   WRKINT    : INTEGER;
  497.   WRKSTR    : STRING_80;
  498.  
  499. begin
  500.   ASSIGN (OUTFILE1, FileName1);
  501.   REWRITE(OUTFILE1);
  502.   MAKE(STACKPTR);
  503.   PUSH(STEM, STACKPTR);
  504.   while POP(BRKPTR, STACKPTR) do
  505.     begin
  506.       if (BRKPTR^.SAME <> NIL) then PUSH(BRKPTR^.SAME,STACKPTR);
  507.       if (BRKPTR^.SUB  <> NIL) then PUSH(BRKPTR^.SUB, STACKPTR);
  508.       WRKINT := BRKPTR^.LEVEL;
  509.       WRKSTR := BRKPTR^.WORD;
  510.       PUTREC(WRKINT, WRKSTR);
  511.     end;
  512.     CLOSE(OUTFILE1)
  513. end;
  514.  
  515. procedure ADDLEAVES(var BRANCH  : STACKTYPE; var PASSLEAF: STACKTYPE;
  516.                      var PASSFILE : TEXT);
  517.  
  518. var
  519.   TEMPLEAF   :  STACKTYPE;
  520.   ININT      :  INTEGER;
  521.   INSTR      :  STRING_80;
  522.   FLAGEND    :  BOOLEAN;
  523.   INFILE     :  TEXT;
  524.  
  525. begin
  526.     if not GETREC(ININT, INSTR, PASSFILE) then PASSLEAF := NIL
  527.     else
  528.       begin
  529.         NEW(TEMPLEAF);
  530.         TEMPLEAF^.SAME:=NIL;
  531.         TEMPLEAF^.SUB:=NIL;
  532.         TEMPLEAF^.LEVEL  := ININT;
  533.         TEMPLEAF^.WORD := INSTR;
  534.         if TEMPLEAF^.LEVEL > BRANCH^.LEVEL then
  535.           begin
  536.             BRANCH^.SUB  := TEMPLEAF;
  537.             ADDLEAVES(BRANCH^.SUB, PASSLEAF, PASSFILE);
  538.             TEMPLEAF := PASSLEAF
  539.           end;
  540.         if ((TEMPLEAF <> NIL) AND (TEMPLEAF^.LEVEL = BRANCH^.LEVEL)) then
  541.           begin
  542.             BRANCH^.SAME := TEMPLEAF;
  543.             ADDLEAVES(BRANCH^.SAME, PASSLEAF, PASSFILE);
  544.             TEMPLEAF := PASSLEAF
  545.           end;
  546.         if ((TEMPLEAF <> NIL) AND (TEMPLEAF^.LEVEL < BRANCH^.LEVEL)) then
  547.           begin
  548.             PASSLEAF := TEMPLEAF
  549.           end;
  550.      end;
  551. end;
  552.  
  553. procedure RECALLTREE (var LEAF  :  STACKTYPE);
  554.  
  555.   var
  556.     TEMPREC, PASSREC : STACKTYPE;
  557.     WORKINT  : INTEGER;
  558.     WORKSTR  : STRING_80;
  559.     INFILE   : TEXT;
  560.  
  561. begin
  562.  
  563.         WRITELN('NAME OF DATA FILE [.TRE WILL BE ADDED]');
  564.         READ(NAME);
  565.         ASSIGN(INFILE,NAME +'.TRE');
  566.         RESET(INFILE);
  567.         X :=GETREC(WORKINT,WORKSTR,INFILE);
  568.         NEW(TEMPREC);
  569.         TEMPREC^.SAME:=NIL;
  570.         TEMPREC^.SUB:=NIL;
  571.         TEMPREC^.LEVEL := WORKINT;
  572.         TEMPREC^.WORD := WORKSTR;
  573.         LEAF  :=  TEMPREC;
  574.         PASSREC := NIL;
  575.         ADDLEAVES(LEAF, PASSREC, INFILE);
  576.         CLOSE(INFILE)
  577. end;
  578. begin
  579.   make(root);
  580.   word1:='book';
  581.   TextMode(C80);
  582.   DOLOOP := true;
  583.   FLAGADD := true;
  584.   ClrScr;
  585.   GotoXY(1,25);
  586.   Write('ä = Ctrl-a   ü = Ctrl-u  ö = Ctrl-o  ß = Alt-s  Ä = Alt-a  Ü = Alt-u   Ö = Alt-o');
  587.   While DOLOOP do
  588.   begin
  589.   WORD :='EMPTY';
  590.   Num1 := 25;
  591.   CreateWindow(1,1,80,22);
  592.   ClrScr;
  593.   GotoXY(1,1);
  594.   WRITELN('                           QUESTION DATA GENERATOR');
  595.   WRITELN('  This program creates data files of the questions and answers to be');
  596.   WRITELN('  maniplated 
  597. begin
  598.   make(root);
  599.   word1:='book';
  600.   TextMode(C80);
  601.   DOLOOP := true;
  602.   FLAGADD := true;
  603.   ClrScr;
  604.   GotoXY(1,25);
  605.   Write('ä = Ctrl-a   ü = Ctrl-u  ö = Ctrl-o  ß = Alt-s  Ä = Alt-a  Ü = Alt-u   Ö = Alt-o');
  606.   While DOLOOP do
  607.   begin
  608.   WORD :='EMPTY';
  609.   Num1 := 25;
  610.   CreateWindow(1,1,80,22);
  611.   ClrScr;
  612.   GotoXY(1,1);
  613.   WRITELN('                           QUESTION DATA GENERATOR');
  614.   WRITELN('  This program creates data files of the questions and answers to be');
  615.   WRITELN('  maniplated gth ');
  616.   WRITELN('  of any data string is 80 characters. Should you exceed the maximum,');
  617.   WRITELN('  the excess will not be accepted. First the program asks for the question');
  618.   WRITELN('  which will be entered by pressing return.  Then the possible answers ');
  619.   WRITELN('  are to be entered one element at a time. If more than one answer is desired');
  620.   WRITELN('  enter "Y" or press return to enter another set of answers. All answers will');
  621.   WRITELN('  be coded to correspond to their respective questions.');
  622.   WRITELN('  YOU MUST HAVE COMMAND.COM ON YOUR DISK TO BE ABLE TO SAVE YOUR FILE.');
  623.   WRITELN('  To enter the lesson name, use six or less characters, since');
  624.   WRITELN('  the file name itself can be no longer than eight character and the lesson');
  625.   WRITE('  number will be added. Enter name and press return:');
  626.   READLN(LessonName);
  627.   WRITE('  Enter the lesson number and press return:');
  628.   READLN(LessonNumber);
  629.   FileName := LessonName+LessonNumber +'.DAT';
  630.   ASSIGN (OUTFILE, FileName);
  631.   REWRITE (OUTFILE);
  632.   Counter1:=1;
  633.    savestr1 := 'EMPTY'; savestr2 := 'EMPTY';
  634.    savestr3 := 'EMPTY'; savestr4 := 'EMPTY';
  635.    savestr5 := 'EMPTY';
  636.     ClrScr;
  637.     Word1 := 'book';
  638.     while WORD1 <> SENTINEL do
  639.       begin
  640.         WRITELN('Input data and press return. PRESS RETURN ALONE TO QUIT.');
  641.         WRITELN ('Input word(s) or sentence ',counter1,'.');
  642.         Horiz := WhereX;
  643.         Vert  := WhereY;
  644.         INPUTLINE (WORD1);
  645.         WRITELN (OUTFILE, WORD1);
  646.         WRITELN;
  647.              flagadd := true;
  648.              if WORD1 = SENTINEL then flagadd := false;
  649.              while flagadd do begin
  650.                 num1 := 1; num2 := 2; num3 := 3; num4 := 4; num5 := 5;
  651.                 writeln('CURRENT FIRST ELEMENT IS ',savestr1);
  652.                 writeln('ENTER NEW FIRST ELEMENT =>');
  653.                 horiz:=WhereX;
  654.                 Vert := WhereY;
  655.                 ClrEol;
  656.                 inputline(verb);
  657.                 if verb = '' then
  658.                     verb := savestr1
  659.                 else
  660.                     savestr1 := verb;
  661.                 writeln;
  662.                 writeln('CURRENT SECOND ELEMENT IS ',savestr2);
  663.                 writeln('ENTER NEW SECOND ELEMENT =>');
  664.                 horiz:=WhereX;
  665.                 Vert := WhereY;
  666.                 ClrEol;
  667.                 inputline(noun);
  668.                 if noun = '' then
  669.                     noun := savestr2
  670.                 else
  671.                     savestr2 := noun;
  672.                 writeln;
  673.                 writeln('CURRENT THIRD ELEMENT IS ',savestr3);
  674.                 writeln('ENTER NEW THIRD ELEMENT =>');
  675.                 horiz:=WhereX;
  676.                 Vert := WhereY;
  677.                 ClrEol;
  678.                 inputline(prep);
  679.                 if prep = '' then
  680.                     prep := savestr3
  681.                 else
  682.                     savestr3 := prep;
  683.                 writeln;
  684.                 writeln('CURRENT FOURTH ELEMENT IS ',savestr4);
  685.                 writeln('ENTER NEW FOURTH ELEMENT =>');
  686.                 horiz:=WhereX;
  687.                 Vert := WhereY;
  688.                 ClrEol;
  689.                 inputline(art);
  690.                 {if art = '' then
  691.                     art := savestr4
  692.                 else}
  693.                     savestr4 := art;
  694.                 str(Counter1, Question);
  695.                 createbrch(num1,verb,num2,noun,num3,prep,num4,art,num5,Question,root);
  696.                 writeln(verb + ' ',noun + ' ',prep + ' ',art);
  697.                 write('ADD ANOTHER BRANCH Y/N');
  698.                 readln(cont);
  699.                 if ((cont = 'n')or(cont='N')) then
  700.                   begin
  701.                     flagadd := false;
  702.                     ClrScr
  703.                   end
  704.                   else
  705.                     begin
  706.                       ClearRest;
  707.                       GotoXY(1,4)
  708.                     end
  709.             end;
  710.             counter1 := counter1+1;
  711.           end;
  712.  CLOSE (OUTFILE);
  713.         begin
  714.              FileName1 := LessonName+LessonNumber +'.TRE';
  715.              breaktree(ROOT);
  716.           end;
  717.   ClrScr;
  718.   GotoXY(15,10);
  719.   write('Willst du noch eine Aufgabe machen? ("J" oder "N")');
  720.       input := Readkey;
  721.       If not ((input = 'J')OR(input='j'))
  722.       then doloop := false;
  723.       ClrScr;
  724.    end; {of outer Doloop}
  725.    window(1,1,80,25);
  726.    ClrScr;
  727.    GotoXY(16,10);
  728.    writeln('Ende. Bis zur nächsten Aufgabe! Tschüß!');
  729.    GotoXY(1,23);
  730.    TextMode(C80)
  731. end.