home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / kzr_0899.zip / N!!.CMD < prev    next >
OS/2 REXX Batch file  |  1998-07-11  |  3KB  |  88 lines

  1. /* REXX-Funktion n!!.CMD */
  2.    signal on syntax name n!!Msg
  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.    bufND =Pfd||"NDZahl.DAT"
  10.    bufMsg=Pfd||"Meldung.DAT"
  11.    ND = LineIn(bufND, 1)
  12.  
  13.    parse arg n,y
  14.    p0p=n*n /* Diese Anweisung provoziert eine Syntax-Fehlermeldung */
  15.  
  16.    if length(y) > 0 then
  17.    do
  18.      ret=LineOut(bufMsg, "Im Argument von  n!!(...)  ist mindestens  1  nicht zulässiges Komma !")
  19.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  20.   /*  damit in den diesbezüglichen temporären Dateien                      */
  21.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  22.      EXIT
  23.    end
  24.  
  25.    if n=0 | n=-1 then do u=1; Signal W; end
  26.  
  27.    if n < -1 then
  28.    do
  29.      ret=LineOut(bufMsg, "Das Argument der Funktion  n!!(...)  muß größer als -2 sein !")
  30.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  31.   /*  damit in den diesbezüglichen temporären Dateien                      */
  32.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  33.      EXIT
  34.    end
  35.  
  36.    if n > 6000 then
  37.    do
  38.      ret=LineOut(bufMsg, "Das Argument der Funktion  n!!(...)  sollte 6000 nicht überschreiten,",
  39.                          "          ",
  40.                          "weil sonst die Rechenzeit zu groß werden würde.")
  41.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  42.   /*  damit in den diesbezüglichen temporären Dateien                      */
  43.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  44.      EXIT
  45.    end
  46.  
  47.    nn=n//1
  48.    if nn <> 0 then
  49.    do
  50.       ret=LineOut(bufMsg, "Das Argument der Funktion  n!!(...)  muß eine ganze Zahl sein !")
  51.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  52.   /*  damit in den diesbezüglichen temporären Dateien                      */
  53.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  54.       EXIT
  55.     end
  56.  
  57.     Numeric Digits ND+10
  58.     u=n; i=1
  59.     do while n-2*i > 0
  60.       u=u*(n-2*i)
  61.       i=i+1
  62.     end
  63.  
  64. W:
  65.    numeric digits ND
  66.    return(Format(u))
  67.  
  68. n!!Msg:
  69.    sf=ErrorText(RC)
  70.    if  Pos("Arithmetic overflow", sf) > 0 | Pos("Invalid whole", sf) >0 then
  71.    do
  72.      ret=LineOut(bufMsg, "Es müssen zu große Zahlenwerte verarbeitet werden !")
  73.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  74.   /*  damit in den diesbezüglichen temporären Dateien                      */
  75.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  76.      EXIT
  77.    end
  78.  
  79.    if  Pos("Bad arithmetic conversion", sf) > 0 then
  80.    do
  81.      ret=LineOut(bufMsg, "Sie haben in  n!!(...)  kein gültiges Argument eingegeben !")
  82.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  83.   /*  damit in den diesbezüglichen temporären Dateien                      */
  84.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  85.      EXIT
  86.    end
  87.  
  88.