Computer Science 2610
Spring 2000
Self-test exercises 1
Solutions

Savitch, page 164, problem 6

#include <iostream.h>

// gravity(d,m1,m2) returns the gravitational force
// between two objects of masses m1 and m2, separated
// by a distance of d.  Masses m1 and m2 should be in grams,
// and distance d should be in cemtimeters.  The
// result is a number of dynes.  (A dyne is unit f force.)

double gravity(double d, double m1, double m2)
{
  double G = 6.673E-8;
  return (G*m1*m2)/(d*d);
}

// Interact with the user, repeatedly asking for two
// masses and a distance, and telling the force of 
// gravity between the two masses.
//
// Stop when a negavite distance is given.  (When to stop
// was not specified in the problem.)

int main()
{
  double d, m1, m2;

  do {
    cout << "Give a distance in centimeters and two masses in grams.\n"
            "I will tell you the gravitational force between two objects\n"
            "with those masses, separated by that distance.\n"
            "Type a negative number to quit.\n";
    cin >> d;
    if(d >= 0) {
      cin >> m1 >> m2;
      cout << "The force is " << gravity(d,m1,m2) << " dynes\n\n";
    }
  } while(d >= 0);

  return 0;
}

Savitch, page 210, problem 2.

#include <iostream.h>

// average(x1,x2,x3,x4) returns the average of x1,
// x2, x3 and x4.

double average(double x1, double x2, double x3, double x4)
{
  return (x1 + x2 + x3 + x4)/4;
}

// avg_stddev(s1,s2,s3,s4,avg,stddev) 
// sets avg to the average of s1, s2, s3 and s4, and sets
// stddev to the standard deviation of s1, s2, s3 and s4.
   
void avg_stddev(double s1, double s2, double s3, double s4,
                double& avg, double& stddev)
{
  avg = average(s1,s2,s3,s4);
  double v1 = s1 - avg;
  double v2 = s2 - avg;
  double v3 = s3 - avg;
  double v4 = s4 - avg;
  stddev = sqrt(average(v1*v1, v2*v2, v3*v3, v4*v4));
}

// Repeatedly ask the user for four numbers, and compute
// their average and standard deviation.  Stop when
// the first score is negative.

int main()
{
  double s1,s2,s3,s4,avg,stddev;

  do {
    cout << "What are the four scores?\n"
            "(Type a negative number to stop.)\n";
    cin >> s1;
    if(s1 >= 0) {
      cin >> s2 >> s3 >> s4;
      avg_stddev(s1, s2, s3, s4, avg, stddev);
      cout << "The average is " << avg << endl;
      cout << "The standard deviation is " << stddev << endl;
    }
  } while(s1 >= 0);

  return 0;
}

Savitch, page 211, problem 4.

#include <iostream.h>

// get_feet_and_inches(feet,inches) prompts the user
// for a length in feet and inches, reads them, and
// sets variables feet and inches to the values read.

void get_feet_and_inches(int& feet, int& inches)
{
  cout << "Please type a number of feet and a number of inches.\n";
  cin >> feet >> inches;
}

// show_meters_and_centimeters(meters,centimeters) prints
// a length in meters and centimeters.

void show_meters_and_centimeters(int meters, double centimeters)
{
  cout << meters << " meters and " << centimeters << " centimeters\n";
}

// convert_to_meters(feet,inches,meters,centimeters) converts
// a length in feet and inches (give by variables feet and
// inches) into meters and centimeters.  It sets veriables
// meters and centimeters to the results.

void convert_to_meters(int feet, int inches, 
                       int& meters, double& centimeters)
{
  double length_in_feet   = feet + inches/12.0;
  double length_in_meters = 0.3048*length_in_feet;
  meters      = (int) length_in_meters;
  centimeters = 100*(length_in_meters - meters);
}

// Repeatedly get feet and inches and report the length
// in meters and centimeters.  Stop at a negative number.

int main()
{ 
  int feet,inches,meters;
  double centimeters; 

  do {
    get_feet_and_inches(feet,inches);
    if(feet >= 0) {
      convert_to_meters(feet,inches,meters,centimeters);
      show_meters_and_centimeters(meters,centimeters);
    }
  } while(feet >= 0);

  return 0;
}

Savitch, page 213, problem 11.

Here is the function. Use your imagination for a program that uses it.
// get_area_and_perimeter(a,b,c,area,perimeter) computes
// the area and perimeter of a triangle whose sides
// have lengths a, b and c.
//
// Out: Variables area and perimeter are set to the area
// and perimeter.
//
// The side lengths should be possible side lengths of
// a triangle.  If not, area and perimeter are set to
// some values, but the values have no meaning.

void get_area_and_perimeter(double a, double b, double c,
                            double& area, double& perimeter)
{
  // The area is sqrt(s(s-a)(s-b)(s-c)), where s is
  // half the perimeter of the triangle.  But be careful:
  // if the side lengths are nonsense, it is possible that
  // this tries to compute the square root of a negative
  // number.

  double s,v;
  perimeter = a + b + c;
  s = perimeter/2;
  v = s*(s-a)*(s-b)*(s-c);
  if(v >= 0) area = sqrt(v);
  else area = 0;
}

Savitch, page 213, problem 12.

// windchill(t,v) returns the wind chill index for
// a temperature of t degrees celsius and a wind
// speed of v meters per second.
//
// Require: t <= 10.  If t > 10, then the temperature
// t is returned.

double windchill(double t, double v)
{
  if(t > 10) return t;
  else return 33 - (10*sqrt(v) - v + 10.5)*(33 - t)/23.1;
}