home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / TABLERUN.ZIP / TABLERUN.PRG
Encoding:
Text File  |  1993-04-12  |  2.8 KB  |  104 lines

  1. program Tablerun;  {Calculate tables as Chi square}
  2.    uses crt;
  3.  
  4. const
  5.    LoProb   = 0.005;                                    {Mod. #1}
  6.    HiProb   = 0.995;                                    {Mod. #1}
  7.    OneThird = 1.0 / 3.0;
  8.  
  9. type
  10.    KeyListType = string[4];
  11.    FuncType    = function(Argument: real): real;
  12.  
  13. var
  14.    ChiSq, Probability, Unused, CumDis   : real;
  15.    LoChiSq, HiChiSq, Numer, Term, NormX : real;
  16.    DegFreedom, Code                     : integer;
  17.    OK                                   : boolean;
  18.    CharFlag, Reply, Reply2              : char;
  19.    FuncName                             : FuncType;
  20.  
  21. {$I ChiProb.PSL}
  22. {$I GetKey.PSL}
  23. {$I GetNumI.PSL}
  24. {$I GetNumR.PSL}
  25. {$I NormDis.PSL}
  26. {$I Power.PSL}
  27. {$I Root.PSL}
  28.  
  29. function GetProb(X: real): real;
  30.  
  31. begin
  32.    if DegFreedom < 30 then
  33.       GetProb := ChiProb(X, DegFreedom)
  34.    else
  35.       begin
  36.          Term  := 2.0 / 9.0 / DegFreedom;
  37.          Numer := Power(X / DegFreedom, OneThird) - 1.0 + Term;
  38.          NormX := Numer / sqrt(Term);
  39.          NormDis(0.0, 1.0, NormX, Unused, CumDis);
  40.          GetProb := 1.0 - CumDis
  41.       end
  42. end;
  43.  
  44. {$F+}
  45.  
  46. function DeltaProb(X:real): real;
  47.  
  48. begin
  49.    DeltaProb := GetProb(X) - Probability
  50. end;
  51.  
  52. {$F-}
  53.  
  54. BEGIN
  55.    clrscr;
  56.    writeln('DoChiSq - Generate chi-square tables');
  57.    writeln;
  58.    repeat
  59.       writeln('Degrees of freedom?');
  60.       GetNumI(DegFreedom, CharFlag, Code)
  61.    until
  62.       (Code = 0) and (DegFreedom > 0);
  63.    writeln;
  64.    writeln('Which would you like to specify, C or P ?');
  65.    writeln('   C - Chi-square');
  66.    writeln('   P - Probability');
  67.    write('Which one? ');
  68.    GetKey('CcPp', Reply, Reply2);
  69.    writeln(Reply);
  70.    writeln;
  71.    if (Reply = 'C') or (Reply = 'c') then
  72.       begin
  73.          repeat
  74.             writeln('Value for Chi-square?');
  75.             GetNumR(ChiSq, CharFlag, Code)
  76.          until
  77.             (Code = 0) and (ChiSq > 0.0);
  78.          writeln('Probability = ', GetProb(ChiSq))
  79.       end
  80.    else
  81.       begin
  82.          repeat
  83.             writeln('Value for Probability?');
  84.             GetNumR(Probability, CharFlag, Code)
  85.          until
  86.             (Code = 0) and (Probability >= LoProb) and
  87.                            (Probability <= HiProb);
  88.          if DegFreedom < 40 then
  89.             if DegFreedom < 9 then
  90.                LoChiSq := 1.0E-6                        {Mod. #2}
  91.             else
  92.                LoChiSq := 0.05 * Power(DegFreedom, 1.6) {Mod. #2}
  93.          else
  94.             LoChiSq := DegFreedom / 2.0;                {Mod. #2}
  95.          HiChiSq  := 2.0 * DegFreedom + 7.0;            {Mod. #2}
  96.          FuncName := DeltaProb;
  97.          Root(LoChiSq, HiChiSq, FuncName, ChiSq, OK);
  98.          if OK then
  99.             writeln('Chi-square = ', ChiSq)
  100.          else
  101.             writeln('Can''t converge on your answer.')
  102.       end
  103. END.
  104.