home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / microcrn / issue_46.arc / CING46.ARC / GRIND.C < prev    next >
Text File  |  1988-05-11  |  4KB  |  172 lines

  1. /*
  2.      From the C'ing Clearly column in Micro Cornucopia Magazine Issue #46
  3.  
  4.      Program:  Grind
  5.  
  6.      Version:  1.11
  7.      Date:     26-Oct-1988
  8.  
  9.      Language: ANSI C
  10.  
  11.      Tests all aspects of a C compiler's functions, including disk i/o,
  12.      screen i/o, floating point, recursion, prototyping, and memory
  13.      allocation. It should be a large enough program to test the advanced
  14.      optimizers in some compilers.
  15.  
  16.      Developed by Scott Robert Ladd. This program is public domain.
  17. */
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <math.h>
  22.  
  23. #define MAXFLOATS 1000
  24.  
  25. struct tabent
  26.      {
  27.      double val, vsum, vsqr, vcalc;
  28.      };
  29.  
  30. struct tabent table[MAXFLOATS];
  31.  
  32. char *errmsg[] = {
  33.                  "GRIND.TBL cannot be created",
  34.                  "GRIND.TBL cannot be closed properly",
  35.                  "GRIND.IN cannot be found",
  36.                  "GRIND.IN has been truncated",
  37.                  "GRIND.IN cannot be closed properly"
  38.                  };
  39.  
  40. /* function prototypes */
  41. short main(void);
  42. void  readfloats(void);
  43. void  sortfloats(void);
  44. void  quicksort(struct tabent *, short, short);
  45. void  maketable(void);
  46. void  writetable(void);
  47. void  error(short);
  48.  
  49. short main(void)
  50.      {
  51.      puts("\nGrind (C) v1.10  -- A Benchmark Program\n");
  52.  
  53.      readfloats();
  54.  
  55.      sortfloats();
  56.  
  57.      maketable();
  58.  
  59.      writetable();
  60.  
  61.      puts("\7End run GRIND!!!");
  62.  
  63.      return(0);
  64.      }
  65.  
  66. void readfloats()
  67.      {
  68.      register short i;
  69.      char buf[12];
  70.      FILE *fltsin;
  71.  
  72.      printf("--> Reading in floats. At #     ");
  73.      if (NULL == (fltsin = fopen("GRIND.IN","r")))
  74.           error(2);
  75.  
  76.      for (i = 0; i < MAXFLOATS; ++i)
  77.           {
  78.           printf("\b\b\b\b\b%5d",i);
  79.           if (NULL == fgets(buf,12,fltsin))
  80.                error(3);
  81.           table[i].val = atof(buf);
  82.           }
  83.  
  84.      if (fclose(fltsin))
  85.           error(4);
  86.  
  87.      printf("\n");
  88.      }
  89.  
  90. void sortfloats()
  91.      {
  92.      puts("--> Sorting data");
  93.      quicksort(table,0,MAXFLOATS-1);
  94.      }
  95.  
  96. void quicksort(struct tabent * item,
  97.                short left,
  98.                short right)
  99.      {
  100.      register short i, j;
  101.      struct tabent x, y;
  102.  
  103.      i = left;
  104.      j = right;
  105.      x = item[(i+j)/2];
  106.  
  107.      do
  108.           {
  109.           while (item[i].val < x.val && i < right) i++;
  110.           while (x.val < item[j].val && j > left)  j--;
  111.           if (i <= j)
  112.                {
  113.                y = item[i];
  114.                item[i] = item[j];
  115.                item[j] = y;
  116.                i++;
  117.                j--;
  118.                }
  119.           }
  120.      while (i <= j);
  121.  
  122.      if (left < j)  quicksort(item,left,j);
  123.      if (i < right) quicksort(item,i,right);
  124.      }
  125.  
  126. void maketable()
  127.      {
  128.      register short i;
  129.      double sum = 0.0;
  130.  
  131.      puts("--> Calculating table values");
  132.  
  133.      for (i = 0; i < MAXFLOATS; ++i)
  134.           {
  135.           sum = sum + table[i].val;
  136.           table[i].vsum  = sum;
  137.           table[i].vsqr  = table[i].val * table[i].val;
  138.           table[i].vcalc = sqrt(fabs(table[i].val)) * log10(fabs(table[i].val));
  139.           }
  140.      }
  141.  
  142. void writetable()
  143.      {
  144.      FILE *fd;
  145.      register short i;
  146.  
  147.      if (NULL == (fd = fopen("GRIND.TBL","w+")))
  148.           error(0);
  149.  
  150.      puts("--> Writing Table to File");
  151.  
  152.      for (i = 0; i < MAXFLOATS; i = i + 10)
  153.           {
  154.           fprintf(fd,
  155.                   "val = %5.2f, sum = %5.2f, sqr = %5.2f, calc = %5.2f\n",
  156.                   table[i].val,
  157.                   table[i].vsum,
  158.                   table[i].vsqr,
  159.                   table[i].vcalc);
  160.           }
  161.  
  162.      if (fclose(fd))
  163.           error(1);
  164.  
  165.      }
  166.  
  167. void error(short err_no)
  168.      {
  169.      printf("\n\7GRIND ERROR: %s\n",errmsg[err_no]);
  170.      exit(err_no);
  171.      }
  172.