(*---------------------------------------------------------------------------
   :Program.    Kurve
   :Author.     Jörg Wesemann
   :Address.    Auf der Heide 10, 2807 Achim - Baden
   :Phone.      (0)4202 / 70658
   :Shortcut.   [jwe]
   :Version.    2.94
   :Date.       23.03.89
   :Copyright.  PD
   :Language.   Modula-II
   :Translator. M2Amiga
   :Imports.    JWELib: Parser
   :Update.     none.
   :Contents.   Sucht die Wendestellen einer Funktion in einem Intervall
   :Remark.     none.
---------------------------------------------------------------------------*)


IMPLEMENTATION MODULE wendestellen;

FROM SYSTEM 		IMPORT 	FFP,ADR;
FROM FFPInOut 		IMPORT 	WriteReal,ReadReal;
FROM InOut 		IMPORT 	Write,WriteString,WriteLn,WriteCard,OpenOutput,
				CloseOutput;
FROM startupproc 	IMPORT 	CLS,crlf,cursorr,solve,m,n,fn,eps,center,string,
		 		nullbuffer,dateiabfrage,fragedatei,wptr;
FROM intervall 		IMPORT	kleinintervall;
FROM JWELib 		IMPORT 	parse;    
FROM Strings 		IMPORT 	Length;
FROM menu 		IMPORT 	wartemenu;    
FROM Intuition		IMPORT	WindowToFront;    


PROCEDURE wendestellen;
  
  CONST
    MAXFOUND = 20;
  
  VAR
    x,dx,xmin,xmax	: FFP;
    found,success	: BOOLEAN;
    art,cfound		: CARDINAL;
  
BEGIN
  nullbuffer[2]:= "0.2";
  kleinintervall(nullbuffer,ADR("WENDESTELLEN - Intervall"));
  xmin:= parse(nullbuffer[1],0.0);
  dx:=   parse(nullbuffer[2],0.0);
  xmax:= parse(nullbuffer[3],0.0);  
  art:= CARDINAL(parse(nullbuffer[4],0.0));
  WindowToFront(wptr);
  Write(CLS);
  IF dateiabfrage THEN
    fragedatei();
  END;     
  center("WENDESTELLENBESTIMMUNG"); WriteLn;
  center("----------------------"); crlf(2);
  center("von"); crlf(2);
  cursorr( 20+(31-Length(string)) DIV 2 );
  WriteString("f(x) = ");
  WriteString(string); crlf(3);
  cursorr(26); WriteString("Xmin: "); WriteReal(xmin,m,n); cursorr(5);
  WriteString("Xmax: "); WriteReal(xmax,m,n); crlf(3);
  found:= FALSE;
  success:= FALSE;
  cfound:= 0;
  x:= solve(xmin,xmax,dx,2,art,success);
  IF success THEN
    REPEAT
      INC(cfound);
      IF (fn(x,3)<-eps) OR (fn(x,3)>eps) THEN
        cursorr(29);
        IF (fn(x,1)<eps) AND (fn(x,1)>-eps) THEN
          WriteString("S( ");
        ELSE						(* IF 3		*)
          WriteString("W( ");
        END;						(* IF 3		*)
      ELSE						(* IF 2		*)
        success:= FALSE;
      END;						(* IF 2		*)
      IF success THEN					(* IF 4		*)
        WriteReal(x,m,n); WriteString(" , "); WriteReal(fn(x,0),m,n);
        WriteString(" )"); WriteLn;
        found := TRUE;
      END;						(* IF 4		*)
      xmin := x + dx;
      x:= solve(xmin,xmax,dx,2,art,success);
    UNTIL NOT success OR (x>xmax) OR (cfound > MAXFOUND);			(* REPEAT 1	*)
  END;							(* IF 1		*)
  IF found = FALSE THEN 
    WriteLn; cursorr(22);
    WriteString("Keine Wendestellen im Intervall gefunden"); WriteLn;
  END;
  WriteLn;
  CloseOutput;
  crlf(2); cursorr(22);
  WriteString("Bitte 'RETURN' drücken für MENU ");
  wartemenu;
END wendestellen;    
      
END wendestellen.
