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

  1. /*    REXX-Programm  bin.cmd  für die Binomial-Koeffizienten    */
  2. /*               (gesprochen: "n über m")                       */
  3.    signal on syntax name binMsg
  4.  
  5. /* Diese Variablen müssen für jede Prozedur definiert werden, damit die  */
  6. /* Prozedur die Variable bufND kennt und die Variable ND übernehmen kann.*/
  7.    Pfd=SysSearchPath("PATH", "kzr.cmd")
  8.    lp=LastPos("\", Pfd)
  9.    Pfd=DelStr(Pfd, 1+lp)
  10.    bufND =Pfd||"NDZahl.DAT"
  11.    bufMsg=Pfd||"Meldung.DAT"
  12.    ND = LineIn(bufND, 1)
  13.  
  14.    parse arg n,m,s
  15.  
  16.    if length(s) > 0 then
  17.    do
  18.      ret=LineOut(bufMsg, "Im Argument von  bin(.. , ..)  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.    p0p=n*m /* Diese Anweisung provoziert eine Syntax-Fehlermeldung */
  26.  
  27.    nn=n//1
  28.    if (nn<>0) then
  29.    do
  30.       ret=LineOut(bufMsg, "Das erste Argument der Funktion  bin(...)  muß eine ganze Zahl sein !")
  31.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  32.   /*  damit in den diesbezüglichen temporären Dateien                      */
  33.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  34.       EXIT
  35.     end
  36.  
  37.    mm=m//1
  38.    if (mm<>0) then
  39.    do
  40.       ret=LineOut(bufMsg, "Das zweite Argument der Funktion  bin(...)  muß eine ganze Zahl sein !")
  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.    if (n>2000) then
  48.    do
  49.      ret=LineOut(bufMsg, "Das erste Argument der Funktion  bin(.. , ..)  darf 2000 nicht überschreiten !")
  50.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  51.   /*  damit in den diesbezüglichen temporären Dateien                      */
  52.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  53.      EXIT
  54.    end
  55.  
  56.    if (n<m) then
  57.    do
  58.       ret=LineOut(bufMsg, "In der Funktion  bin(...)  muß die erste Variable größer als die Zweite sein !")
  59.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  60.   /*  damit in den diesbezüglichen temporären Dateien                      */
  61.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  62.       EXIT
  63.    end
  64.  
  65.    if m=1 then do y=n; SIGNAL A; EXIT; end
  66.    if m=n then do y=1; SIGNAL A; EXIT; end
  67.    if m=0 then do y=1; SIGNAL A; EXIT; end
  68.  
  69.    numeric digits ND+10
  70.  
  71.    um=1; i=1 /* Berechnung von n! */
  72.    do while (i<m+1)
  73.      um=um*i
  74.      i=i+1
  75.    end
  76.  
  77.    un=1; i=1 /* Berechnung von m! */
  78.    do while (i<n+1)
  79.      un=un*i
  80.      i=i+1
  81.    end
  82.  
  83.    unm=1; i=1 /* Berechnung von (n-m)! */
  84.    do while (i<n-m+1)
  85.      unm=unm*i
  86.      i=i+1
  87.    end
  88.  
  89.    y=un/(um*unm)
  90.  
  91. A:
  92.    numeric digits ND
  93.    return(Format(y))
  94.  
  95. binMsg:
  96.    sf=ErrorText(RC)
  97.    if  Pos("Arithmetic overflow", sf) > 0 | Pos("Invalid whole", sf) >0 then
  98.    do
  99.      ret=LineOut(bufMsg, "Es müssen zu große Zahlenwerte verarbeitet werden !")
  100.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  101.   /*  damit in den diesbezüglichen temporären Dateien                      */
  102.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  103.      EXIT
  104.    end
  105.  
  106.    if  Pos("Bad arithmetic conversion", sf) > 0 then
  107.    do
  108.      ret=LineOut(bufMsg, "Sie haben in  bin(...)  kein gültiges Argument eingegeben !")
  109.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  110.   /*  damit in den diesbezüglichen temporären Dateien                      */
  111.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  112.      EXIT
  113.    end
  114.  
  115.