home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / kzr_0899.zip / POT.CMD < prev    next >
OS/2 REXX Batch file  |  1999-08-24  |  3KB  |  86 lines

  1. /*  REXX-Programm  pot(x,y) für die Funktion  x hoch y */
  2.    signal on syntax name potMsg
  3.  
  4. /* Diese Variablen müssen für jede Prozedur definiert werden, damit die  */
  5. /* Prozedur die Variable bufND kennt und die Variable ND übernehmen kann.*/
  6.    Pfd=SysSearchPath("PATH", "kzr.cmd")
  7.    lp=LastPos("\", Pfd)
  8.    Pfd=DelStr(Pfd, 1+lp)
  9.    NDApot=Pfd||"NDApot.DAT"
  10.    bufND =Pfd||"NDZahl.DAT"
  11.    bufMsg=Pfd||"Meldung.DAT"
  12.    ND = LineIn(bufND, 1)
  13.  
  14.    if ND > 400 then
  15.    do
  16.      ND=400
  17.      call charout(NDApot) ; Call SysFileDelete NDApot
  18.      ret=LineOut(NDApot, 400)
  19.      Call Charout,"   Achtung, nur 400 Dezimalstellen bei der Berechnung von  pot(.. , ..)"
  20.      say
  21.      Beep(444, 200); Beep(628, 300)  /* Hier kein EXIT ! */
  22.    end
  23.  
  24.   /* Wenn ND <= 400 ist, wird ND = ND  weitergegeben */
  25.    call charout(NDApot) ; Call SysFileDelete NDApot
  26.    ret=LineOut(NDApot, ND)
  27.  
  28.    NUMERIC DIGITS ND+6
  29.    arg xx,y,s
  30.    
  31.    if length(s) >= 0 then 
  32.    if DataType(s, 'N') <> 0 then 
  33.    do
  34.      call charout(NDApot) ; Call SysFileDelete NDApot
  35.      ret=LineOut(bufMsg, "Im Argument von  pot(.. , ..)  ist mindestens  1  nicht zulässiges Komma !")
  36.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  37.   /*  damit in den diesbezüglichen temporären Dateien                      */
  38.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  39.      EXIT
  40.    end
  41.                                   
  42.    if xx=0 & y=0 then do u=1; SIGNAL W; end
  43.    if xx=0 & y=1 then do u=0; SIGNAL W; end
  44.    if xx=1 & y=0 then do u=1; SIGNAL W; end
  45.  
  46.    /* Wenn y geradzahlig ist, xx**y verwenden. */
  47.    if abs(y)//1 = 0 then do; u=xx**y; Signal W; end
  48.  
  49.    /* y ist nicht ganzzahlig */
  50.    if xx < 0 & abs(y)//1 <> 0 then
  51.    do
  52.      call charout(NDApot) ; Call SysFileDelete NDApot
  53.      ret=LineOut(bufMsg, "Die Potenz " xx"  hoch  "y"  ist keine reelle Zahl !")
  54.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  55.   /*  damit in den diesbezüglichen temporären Dateien                      */
  56.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  57.      EXIT
  58.    end
  59.  
  60.    /* Wenn xx > 0 ist. */
  61.    vz=+1
  62.    /* Wenn xx < 0 ist. */
  63.    if xx < 0 then
  64.    do
  65.      if abs(y)//2=0 then vz=+1; else vz=-1
  66.    end
  67.  
  68.    x=abs(xx)
  69.    u=vz*exp(y*ln(x))
  70.  
  71. W: NUMERIC DIGITS ND
  72.    return(Format(u))
  73.  
  74. potMsg:
  75.    sf=ErrorText(RC)
  76.    if  Pos("Bad arithmetic conversion", sf) > 0 then
  77.    do
  78.      call charout(NDApot) ; Call SysFileDelete NDApot
  79.      ret=LineOut(bufMsg, "Sie haben in  pot(.. , ..)  keine gültigen Argumente eingegeben !")
  80.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  81.   /*  damit in den diesbezüglichen temporären Dateien                      */
  82.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  83.      EXIT
  84.    end
  85.  
  86.