1 | #include <fstream.hfa>
|
---|
2 | #include <stdlib.hfa>
|
---|
3 | #include <enum.hfa>
|
---|
4 |
|
---|
5 | struct MR { double mass, radius; };
|
---|
6 |
|
---|
7 | enum( MR ) Planet { // typed enumeration
|
---|
8 | // mass (kg) radius (km)
|
---|
9 | MERCURY = { 0.330_E24, 2.4397_E6 },
|
---|
10 | VENUS = { 4.869_E24, 6.0518_E6 },
|
---|
11 | EARTH = { 5.976_E24, 6.3781_E6 },
|
---|
12 | MOON = { 7.346_E22, 1.7380_E6 }, // not a planet
|
---|
13 | MARS = { 0.642_E24, 3.3972_E6 },
|
---|
14 | JUPITER = { 1898._E24, 71.492_E6 },
|
---|
15 | SATURN = { 568.8_E24, 60.268_E6 },
|
---|
16 | URANUS = { 86.86_E24, 25.559_E6 },
|
---|
17 | NEPTUNE = { 102.4_E24, 24.746_E6 },
|
---|
18 | PLUTO = { 1.303_E22, 1.1880_E6 }, // not a planet
|
---|
19 | };
|
---|
20 |
|
---|
21 | enum( double ) { G = 6.6743_E-11 }; // universal gravitational constant (m3 kg-1 s-2)
|
---|
22 |
|
---|
23 | static double surfaceGravity( Planet p ) with( p ) {
|
---|
24 | // return G * mass / ( radius \ 2 ); // no qualification, exponentiation
|
---|
25 | return G * p.mass / ( p.radius \ 2 ); // qualification, exponentiation
|
---|
26 | }
|
---|
27 | static double surfaceWeight( Planet p, double otherMass ) {
|
---|
28 | return otherMass * surfaceGravity( p );
|
---|
29 | }
|
---|
30 |
|
---|
31 | int main( int argc, char * argv[] ) {
|
---|
32 | // if ( argc != 2 ) exit | "Usage: " | argv[0] | "earth-weight"; // terminate program
|
---|
33 | // double earthWeight = convert( argv[1] );
|
---|
34 | double earthWeight;
|
---|
35 | sin | earthWeight; // test-suite input comes for indirection
|
---|
36 | double earthMass = earthWeight / surfaceGravity( EARTH );
|
---|
37 |
|
---|
38 | // Planet rp = fromInt( prng( countof( Planet ) ) ); // select random orbiting body
|
---|
39 | Planet rp = fromInt( countof( Planet ) - 1 ); // non-random for test suite
|
---|
40 | choose( rp ) { // implicit breaks
|
---|
41 | case MERCURY, VENUS, EARTH, MARS:
|
---|
42 | sout | rp | "is a rocky planet";
|
---|
43 | case JUPITER, SATURN, URANUS, NEPTUNE:
|
---|
44 | sout | rp | "is a gas-giant planet";
|
---|
45 | default:
|
---|
46 | sout | rp | "is not a planet";
|
---|
47 | }
|
---|
48 |
|
---|
49 | for ( p; Planet ) { // enumerate
|
---|
50 | sout | "Your weight on" | ( p == MOON ? "the" : " " ) | p
|
---|
51 | | "is" | wd( 1,1, surfaceWeight( p, earthMass ) ) | "kg";
|
---|
52 | }
|
---|
53 | }
|
---|