#include <iostream.h> 
#include <string.h> 
const double pi = 3.14159;
class box {
  public: double height, width, length;
    // Default constructor:
    box ( ) { }
    // parameter-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 ( ) { }
    // parameter-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: char *serial_number;
          railroad_car ( ) { }
          // New constructor:
          railroad_car (char *input_buffer) {
            // Create new array just long enough:
            serial_number = new char[strlen(input_buffer) + 1];
            // Copy string into new array:
            strcpy (serial_number, input_buffer);
          }
          virtual char* short_name ( ) {return "rrc";}
          virtual double capacity ( ) {return 0.0;}
};
class box_car : public railroad_car, public box {
  public: // Constructors:
          box_car ( ) : box (10.5, 9.5, 40.0) { }
          box_car (char *input_buffer) : railroad_car (input_buffer),
                                         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: // Constructors:
          tank_car ( ) : cylinder (3.5, 40.0) { }
          tank_car (char *input_buffer) : railroad_car (input_buffer),
                                          cylinder (3.5, 40.0)
           { }
          // Displayers:
          virtual char* short_name ( ) {return "tnk";}
          virtual double capacity ( ) {return volume ( );}
};
class engine : public railroad_car {
  public: engine ( ) { }
          // New constructor:
          engine (char *input_buffer) : railroad_car (input_buffer) { }
          virtual char* short_name ( ) {return "eng";}
};
class caboose : public railroad_car {
  public: caboose ( ) { }
          caboose (char *input_buffer) : railroad_car (input_buffer) { }
          virtual char* short_name ( ) {return "cab";}
};
railroad_car *train[100];
char input_buffer[100];
enum {eng_code = 'E', box_code = 'B', tnk_code = 'T', cab_code = 'C'};
char extract_car_code (char *input_buffer) {return input_buffer[4];}
main ( ) {
  int n, car_count;
  // Read serial number and create car class objects:
  for (car_count = 0; cin >> input_buffer; ++car_count) {
    // Construct new class object:
    switch (extract_car_code (input_buffer)) {
      case eng_code:
        train[car_count] = new engine (input_buffer);   break;
      case box_code:
        train[car_count] = new box_car (input_buffer);  break;
      case tnk_code:
        train[car_count] = new tank_car (input_buffer); break;
      case cab_code:
        train[car_count] = new caboose (input_buffer);  break;
    }
  }
  // Display report:
  for (n = 0; n < car_count; ++n) {
    // Display short name and capacity and terminate the line: 
    cout << train[n] -> short_name ( )
         << "     "
         << train[n] -> capacity ( )
         << endl;
  }
}
