program Hermitsche_Polynome (input,output);  { Prak5.pas von Rene' Scholz }

uses crt;

const       max_polynom = 20;
            max_wert    = 30;


function hermit(n,y :integer) :integer; (* Berechnung des Funktionswertes *)
begin
 if (n=0) or (n=1) then
    begin
      if n=0 then hermit:=1;
      if n=1 then hermit:=2*y;
    end
 else
 hermit:=2*y*hermit(n-1,y) - 2*(n-1)*hermit(n-2,y);
end;



procedure show_interestings( y:integer);
var  i:integer;
begin
 clrscr;
 for i:=0 to max_polynom do
  begin
    write('Polynom H [ ',i,' ] (',y,')         ist  :    ');
    writeln(hermit(i,y) );
    writeln;
  end;
 writeln;
 writeln('             Das war wieder Schwerstarbeit !  ');
 writeln;

end;



procedure show_polynom( n:integer);
var x:integer;
begin
 clrscr;
 for x:=-max_wert to max_wert  do
  begin
    writeln('   H [' ,n,' ] (',x,')         ist :-->   ' ,hermit(n,x) );
    writeln;
  end;
 writeln;
 writeln('           Ende der Vorstellung  ');
 writeln;
end;



procedure show_wert;
var grad,x  :integer;
begin
  clrscr;
  writeln;
  write(' Grad des Polynoms ist   ?     ');readln(grad);
  writeln;
  if grad>=0 then
  begin
     write(' und welchen Wert   X    ? ');
     readln(x);
  end;

  if Grad>=0 then
        begin
          writeln;writeln;
          write('  Ergebnis  :   ');
          writeln(hermit(grad,x) );
        end
  else  writeln('      Der Grad ist doch nicht negativ  !!  ');
  writeln;

end;



function show_menu:integer;
var wa       :string;
    hz,error :integer;

begin
clrscr;
 writeln('   *** Berechnung der Funktions-Werte der Hermitschen Polynome ***');
 writeln('                       by  Rene'' Scholz .');
 writeln;writeln;writeln;
 writeln('                       Wollen Sie  : ');
 writeln;
 writeln('1:  einen bestimmten Wert eines  bestimmten Polynoms  berechnen ');
 writeln;
 writeln('2:  interessante Werte aller Polynome vom Grad <= ',
   max_polynom,'  berechnen ');
 writeln;
 writeln('3:  ein  konstantes  Polynom  fuer  -',
   max_wert,'  <  X  <  ',max_wert,'  berechnen       ?');
 writeln;writeln;
 writeln('ENDE:    -->    Hit Enter  ');
 writeln;writeln;writeln;writeln;
 write('                   --> Geben Sie Ihre Wahl bekannt :  ');
 readln(wa);
 val(wa,hz,error);
 show_menu:=hz;
end;




var x,grad,wahl     :integer;
    answer          :string;

begin                     { Main }
 clrscr;
 repeat

 wahl:=show_menu;

 case wahl of
   1  : begin
           repeat
             clrscr;
             show_wert;
             write('     Weiter ?    (Y/N)  ');
             readln(answer);
           until not((answer='Y')  or  (answer='y'));
        end;

   2  : begin
           repeat
             clrscr;
             write(' Mit welchem Wert  X  moechten Sie',
                   ' die Polynome testen ?  :  ');
             readln(x);
             show_interestings(x);

             write('   Nochmal  ?    (Y/N)  ');
             readln(answer);
           until not((answer='Y')  or  (answer='y'));
        end;

   3  : begin
           repeat
             clrscr;
             write(' Welches Polynom H[n] moechten Sie testen ?     n :  ');
             readln(grad);
             show_polynom(grad);

             write('   Nochmal  ?    (Y/N)  ');
             readln(answer);
           until not((answer='Y')  or  (answer='y'));
        end;

 end;                  { of Case }

 until wahl=0;         { Hier endet das Haupt-Programm }

 clrscr;
 writeln('By.');
end.