#include <iostream.h> 
const double pi = 3.14159;
class box {
  public: double height, width, length;
    // Default constructor:
    box ( ) { }
    // Argument-bearing constructor:
    box (double h, double w, double l) {height = h; width = w; length = l;}
    // Volume member function:
    double volume ( ) {return height * width * length;}
};
class cylinder {
  public: double radius, length;
    // Default Constructor:
    cylinder ( ) { }
    // Argument-bearing constructor:
    cylinder (double r, double l) {radius = r; length = l;}
    // Volume member function:
    double volume ( ) {return pi * radius * radius * length;}
};
class railroad_car {
  public: railroad_car ( ) { }
          virtual char* short_name ( ) {return "rrc";}
          virtual double capacity ( ) {return 0.0;}
};
class box_car : public railroad_car, public box {
  public: // Constructor:
          box_car ( ) : box (10.5, 9.5, 40.0) { }
          // Displayers:
          virtual char* short_name ( ) {return "box";}
          virtual double capacity ( ) {return volume ( );}
};
class tank_car : public railroad_car, public cylinder {
  public: // Constructor:
          tank_car ( ) : cylinder (3.5, 40.0) { }
          // Displayers:
          virtual char* short_name ( ) {return "tnk";}
          virtual double capacity ( ) {return volume ( );}
};
class engine : public railroad_car {
  public: engine ( ) { }
          virtual char* short_name ( ) {return "eng";}
};
class caboose : public railroad_car {
  public: caboose ( ) { }
          virtual char* short_name ( ) {return "cab";}
};
// Define railroad-car pointer array:
railroad_car *train[100];
// Declare enumeration constants, needed in switch statement:
enum {eng_code, box_code, tnk_code, cab_code};
// Overload <<:
ostream& operator<< (ostream& output_stream, railroad_car& r) {
  output_stream << "[" << r.short_name ( ) << "]";
  return output_stream;}
main ( ) {
  // Declare various integer variables:
  int n, car_count, type_code;
  // Read car-type number and create car class objects:
  for (car_count = 0; cin >> type_code; ++car_count)
    switch (type_code) {
      case eng_code: train[car_count] = new engine;   break;
      case box_code: train[car_count] = new box_car;  break;
      case tnk_code: train[car_count] = new tank_car; break;
      case cab_code: train[car_count] = new caboose;  break;
    }
  // Display icons:
  cout << *train[0];
  for (n = 1; n < car_count; ++n) {
    cout << "-" << *train[n];
    }
  cout << endl;
}
