home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c221 / 5.ddi / MWHC.005 / 20 < prev    next >
Encoding:
Text File  |  1992-06-09  |  5.8 KB  |  221 lines

  1. #include <iostream.h>
  2. #include <stdlib.h>
  3.  
  4. #define TAB "\t"
  5. #define SPACES "    "
  6. #define NL  "\n"
  7. void error(char* str);
  8. int randint(int u);
  9. iostream *bar;
  10.  
  11.         // base class
  12. //--------------------------------------------------------------------------
  13. class define_array {
  14. public: 
  15.     int cursize, maxsize, max, first_item;
  16.     int *x;
  17.     define_array(int m, int n);            // constructor
  18.     define_array() {}                // default constructor
  19.     void start (int& i) const { i = 0; }
  20.     ~define_array() { delete x; }        // destructor
  21.     };
  22.  
  23. // constructor
  24. define_array::define_array (int m, int n) {
  25.     if (m<1 || n<m)  error ("illegal array size");
  26.     cursize = 0;
  27.     maxsize = m;
  28.     max = n;
  29.   //cout << "curs=" << cursize << " maxs=" << maxsize << " max=" << max << NL;
  30.     x = new int[maxsize];
  31.     }
  32. //==========================================================================
  33.  
  34.  
  35.                // First virtual drived class 
  36. //--------------------------------------------------------------------------
  37. class create_array : virtual public define_array { 
  38. public: 
  39.     int b1x, b1y;
  40.     create_array() { b1x = 3; b1y = 4; }
  41.     void insert (int t);
  42.     void insert (float f);
  43.     int valid(int i) { return i<=max; }
  44.     ~create_array() { b1x = 0; b1y = 0; }
  45.     };
  46.  
  47. void create_array::insert (int t) {
  48.     //cout << "inside insert cursize = " << cursize << NL;
  49.     if (++cursize > maxsize) error ("too many elements");
  50.     int i = cursize-1;
  51.     x[i] = t;
  52.     
  53.     while (i>0 && x[i-1]>x[i]) {
  54.     int temp = x[i];        // swap 
  55.      x[i] = x[i-1];
  56.     x[i-1] = temp;
  57.     i--;
  58.     }
  59.     }
  60. void create_array::insert(float f) {
  61.     insert((int)f);
  62.     }
  63. //==========================================================================
  64.  
  65.  
  66.             // Second virtual drived class 
  67. //--------------------------------------------------------------------------
  68. class array_op : virtual public define_array {
  69. public: 
  70.     int b2x, b2y;
  71.     array_op() { b2x = 5; b2y = 6; }
  72.     int binary_search (int t) const;    
  73.     int ok(int& i) const;
  74.     int next_item(int& i) const;
  75.     ~array_op() { b2x = 0; b2y = 0; }
  76.     };
  77.  
  78. int array_op::binary_search (int item) const {
  79.     int start = 0;
  80.     int end = cursize-1;
  81.     
  82.     while (start <= end) {        
  83.     int mid = (start+end)/2;
  84.     if (item < x[mid])
  85.         end = mid-1;
  86.     else if (item > x[mid])
  87.         start = mid+1;
  88.     else
  89.         return 1;            
  90.     }
  91.     return 0;            
  92.     }
  93.  
  94. int array_op::ok(int& i) const {
  95.     return i<cursize;
  96.     }
  97.  
  98. int array_op::next_item(int& i) const {
  99.     return x[i++];
  100.     }
  101. //==========================================================================
  102.  
  103.  
  104.         // multiple inheritance
  105. //--------------------------------------------------------------------------
  106. class manipulate_array : public create_array, public array_op {
  107. public: 
  108.     int dx, dy;
  109.     manipulate_array(int a, int b); 
  110.     static void FOO(void);
  111.     void swap(int index1, int index2); 
  112.     void inc(int index);
  113.     void inc(float index);
  114.     void dec(int index);
  115.     void dec(float index);
  116.     };
  117.  
  118. manipulate_array::manipulate_array(int num, int m):define_array(num,m) { 
  119.     dx = 7; dy = 8; 
  120.     }
  121.  
  122. void manipulate_array::swap(int i, int j) { 
  123.     int temp;
  124.     temp = x[i];
  125.     x[i] = x[j];
  126.     x[j] = temp;
  127.     if (j == maxsize)  x[j-1] = first_item;    
  128.     }
  129.  
  130. void manipulate_array::inc(int item) {  
  131.     dx += item; 
  132.     if (valid(x[item]+1))  x[item] += 1;
  133.     if (item == 0)  first_item = x[item];
  134.     }
  135.  
  136. void manipulate_array::inc(float item) {  
  137.     dy += item;
  138.     inc((int) item); 
  139.     }
  140.  
  141. void manipulate_array::dec(int item) { 
  142.     dx -= item; 
  143.     if (x[item] > 1 )   x[item] -= 1; 
  144.     }
  145.  
  146. void manipulate_array::dec(float item) {
  147.     dy -= item;
  148.     dec((int) item);
  149.     }
  150.  
  151. void manipulate_array::FOO(void) {
  152.     cout << "\nFOO is a static function of the class manipulate_array\n" << NL;
  153.     }
  154. //==========================================================================
  155.  
  156.  
  157. void main (void) {
  158.     int var;
  159.     int count = 0;
  160.     int m = 10;                // number of items
  161.     int n = 100;            // maximum integer
  162.     manipulate_array d(m, n);    // derived from create_array array_op 
  163.     void display_array_in_order(manipulate_array& arr);
  164.     void search(manipulate_array& arr, int item);
  165.  
  166.     int flipflop = 0;    // if 0 insert int else insert float
  167.     while (++count <= m) {
  168.     var = randint(n);
  169.     if (d.valid(var)) {
  170.         if (flipflop) d.insert((float) var);  
  171.         else d.insert(var);
  172.         flipflop = 1-flipflop;
  173.         }
  174.     }
  175.     d.FOO();
  176.     cout << "---------------------------------------------------------" << NL;
  177.     cout << "\tList in ascending order:\n" << NL;
  178.     display_array_in_order(d);
  179.     int val = 43;
  180.     search(d, val);   
  181.     cout << "---------------------------------------------------------" << NL << NL;
  182.     for (int i=0; i<=m; i++) 
  183.     d.inc(i);
  184.     for (i=0; i<m; i++){ 
  185.     d.dec(i);
  186.         d.swap(i, i+1);
  187.       }
  188.     cout << "---------------------------------------------------------" << NL;
  189.     cout << "\n\tList rotated left and incremented by 1: " << NL;
  190.     display_array_in_order(d);
  191.     val = 43;
  192.     search(d, val);
  193.     cout << "---------------------------------------------------------" << NL << NL;
  194.     cout << "Done ..." << NL;
  195.     }
  196.  
  197. void search(manipulate_array& arr, int val) {
  198.     if (arr.binary_search(val))
  199.     cout << "\titem: " << val << " found in the list" << NL;
  200.     else 
  201.     cout << "\titem: " << val << " not found in the list" << NL;
  202.     }
  203.  
  204. void display_array_in_order(manipulate_array& arr) {
  205.     int var;
  206.     arr.start(var);
  207.     while (arr.ok(var)) cout << arr.next_item(var) << SPACES;
  208.     cout << NL ;
  209.     }
  210.  
  211. int randint(int max) {
  212.     int rnd = rand();
  213.     if (rnd < 0) rnd = -rnd;
  214.     return 1 + rnd%max;
  215.     }
  216.  
  217. void error(char* str) {
  218.     cout << "array contains: " << str << NL;
  219.     exit(1);
  220.     }
  221.