I've been making a program for my Civil Air Patrol rocketry teacher that will calculate the total altitude of a rocket in both a dragfree and normal enviroment. The drag free code works fine but the normal code (DMotor and DRocket) don't give me good output. Can anyone identify a problem? I'm using VC6 on Windows 98.

Code:
#include <math.h>
#include "conversion.h"
#define g 9.81
#define p 2.696
#define rho 2.696
#define GRAV 32.2


double sqr(double inp)
{
 return inp*inp;
}

struct OutputData
{
 double Sb, Sc, St, VMax, VAve;
};

struct DOutputData
{
 double yc, y1, yt;
};

class DFreeMotor
{
 public:
  double Weight, TImpulse, TImpP, AveT, MaxWeight;
  double BurnW, TDur, VMax, VAve, Sb, Sc, St;
  DFreeMotor()
  {
   Weight = 3.12;
   TImpulse = 2.5;
   AveT = 8;
   TDur = 0.32;
   MaxWeight = 113.2;
   TImpP = 100;
  }
  OutputData OutD;
  OutputData Calc(double LiftW);
};

OutputData DFreeMotor::Calc(double LiftW)
{
 TImpulse *= (TImpP / 100);
 TImpulse = NSecLBSec(TImpulse);
 BurnW = LiftW - Weight;
 BurnW = GramLB(BurnW);
 TDur = TImpulse / AveT;
 VMax = TImpulse*GRAV/BurnW;
 VAve = VMax/2;
 Sb = VAve * TDur;
 Sc = sqr(VMax)/(2*GRAV);
 St = Sb + Sc;
 OutD.Sb = Sb;
 OutD.Sc = Sc;
 OutD.St = St;
 OutD.VMax = VMax;
 OutD.VAve = VAve;
 return OutD;
}

class DFreeRocket
{
 public:
  DFreeMotor Engine;
  double Weight;
  DFreeRocket()
  {
   Weight = 32;
  }
  OutputData OutD;
  OutputData Calc();
};

OutputData DFreeRocket::Calc()
{
 OutD = Engine.Calc(Weight);
 return OutD;
}

class DMotor
{
 public:
  /*
  Terms:
  m : Rocket Mass (KG)
  A : Rocket Cross-Sectional Area in m^2
  cd: Drag Coefficient = 0.75 for average rocket
  t : Burn Time, Thrust Duration
  T : Average Thrust
  I : Motor Impulse
  v : Burnout Velocity
  y1: Burnout Altitude
  yc: Coasting Distance
  ta: Coasting time => Delay Time for Motor
  mr: Empty Rocket Mass
  me: Loaded Rocket Mass
  mp: Propellant Weight
  */
  double m, A, Cd, t, T ,I, v, y1, yc, ta, maxw, mr, me, mp;
  double k, q, x, qa, qb;
  DOutputData OutD;
  DOutputData Calc(double LiftW);
  DMotor()
  {
   mp = 3.12;
   I = 2.5;
   T = 8;
   maxw = 113.2;
   I = 100;
   Cd = 0.75;
  }
};

DOutputData DMotor::Calc(double LiftW) 
{
 me = LiftW;
 mr = 2.0;
 m = mr + me - (mp/2);
 k = 0.5 * rho * Cd * A;
 q = sqrt((T-(m * g))/k);
 x = ((2 * k * q)/m);
 t = I / T;
 v = q * (1 - exp(-x * t)) / (1 + exp(-x * t));
 y1 = (-m/(2 * k)) * log(((m * g) + (k * sqr(v))/(T - (m * g))));
 m = mr + me - mp;
 yc = (m/(2 * k)) * log(((m * g) + (k * sqr(v)))/(m * g));
 qa = sqrt((m * g) / k);
 qb = sqrt((g * k) / m);
 ta = (tan(v / qa)) / (qb);
 OutD.yc = yc;
 OutD.y1 = y1;
 OutD.yt = yc + y1;
 return OutD;
}

class DRocket
{
 public:
  DMotor Engine;
  double Weight;
  DRocket()
  {
   Weight = 32;
  }
  DOutputData OutD;
  DOutputData Calc();
};

DOutputData DRocket::Calc()
{
 OutD = Engine.Calc(Weight);
 return OutD;
}
THANKS