I am pretty stuck with my bezier curve programme. I think i almost have it done, but it has alot of run time errors which i cant debug.
Can anyone help who is good at debugging cos i am stumped.
Help is much appreciated.

Here is the code for the programme:

Code:
#pragma windows 500000,500000
#include <windows.h>
#include <dbos/graphics.h>
#include <iostream.h>
#include <math.h>

int controlpoints();
int translate();
int clearscreen();
int replot();
int scale();
int fact(int i);
int nCi(int i);
double bu(int i,double u);
void C(double u);
void calc_bez();
void draw_bez();


int degrees=3;
double controlpoint[8][3]={{0,350,0},{250,350,0},{300,100,0},{350,500,0},{400,200,0},{450,450,0},{500,350,0},{650,350,0}};
double controlpointT[8][3];
double translation[3];
int handle;
double scalingfactor;
int a=1;
int b=0;

const int number=1000;
double bez_points[number][3];

int main()
{  int width=650;  int height=650;

   winio("%gr[black]&", width, height);
   winio("%ca[Bezier Curve]&");
   winio("%ww&");
   winio("\t%bfBezier Curve Options%sf\n&");
   winio("\n \tDegrees Of Bezier Curve\t%dd%1rd\n&",1, &degrees);
   winio("\n \t%^bt[Change Control Points]\n&", controlpoints);
   winio("\n \t%2`ga%rb[Show Control Lines]\n \t%rb[Don`t Show Control Lines]\n\n&",&a,&b,&a,&b);
   winio("\n \t%bfTRANSFORMATIONS:%sf\n&");
   winio("\n \t%^bt[Translate]\n&", translate);
   winio("\n \t%^bt[Scale]\n&", scale);
   winio("\n \t%bt[Rotate]\n&");
   winio("\n\n \t%bf%bt[Quit]%sf&");
   winio("%lw", &handle);
}

int translate()
{
   if (degrees<1)
   {
      winio("%ca[Error]&");
      winio("The bezier curve must have at least 1 degree.\n\nPlease increase the number of degrees&");
      winio("\n\n%bt[Back to main menu]");
   }

   else if (degrees>7)
   {
      winio("%ca[Error]&");
      winio("The bezier curve cannot have more than 7 degrees.\n\nPlease decrease the number of degrees&");
      winio("\n\n%bt[Back to main menu]");
   }

   else if  (degrees<=7)
   {
   winio("%ca[Translating]%ww&");
   winio("Please enter the amounts by which you wish to translate your bezier curve\n\n&");
   winio("Enter translaton co-ordinates for the x co-ordinate:\t%rf\n\n&",&translation[0]);
   winio("Enter translation co-ordinates for the y co-ordinate:\t%rf\n\n&",&translation[1]);
   winio("Enter translation co-ordinates for the z co-ordinates:\t%rf\n\n&",&translation[2]);
   winio("%bt[Next]");

   for (int i=0; i<8; i++)
   {
      for (int j=0; j<3; j++)
      {
         controlpointT[i][j]=controlpoint[i][j]+translation[j];

         controlpoint[i][j]=controlpointT[i][j];
      }
   }

   winio("%ca[Translating]&");
   winio("%^bt[Replot Graph]\t\t&", replot);
   winio("%bt[Return To Main Menu Without Re-Plotting]");
   }

   return 1;
}

int scale()
{
   winio("%ca[Scaling]&");
   winio("Please enter the scaling factor, by which you wish to scale your bezier curve\n\n&");
   winio("Please note, the scaling factor must be between 0 and 1:\t%rf\n\n&", &scalingfactor);
   winio("%bt[Next]");


   winio("%ca[Scaling]&");
   winio("%^bt[Replot Graph]\t\t&", replot);
   winio("%bt[Return To Main Menu Without Re-Plotting]");

   return 1;
}

int clearscreen()
{
   clear_screen();
   return 1;
}

int controlpoints()
{
   if (degrees>7)
   {
      winio("%ca[Error]&");
      winio("The bezier curve must cannot have more than 7 degrees.\n\nPlease decrease the number of degrees and re-plot the control points&");
      winio("\n\n%bt[Back to main menu]");
   }

   else if (degrees<1)
   {
      winio("%ca[Error]&");
      winio("The bezier curve must have at least 1 degree.\n\nPlease increase the number of degrees and re-plot the control points&");
      winio("\n\n%bt[Back to main menu]");
   }

   else if (degrees<=7)
   {
      winio("%ca[Control Points]&");
      winio("%ww&");
      for (int y=0; y<degrees+1; y++)
      {
         winio("Enter control point %wd co-ordinates (x,y,z):\t%rf\t%rf\t%rf\n\n&",y+1,&controlpoint[y][0],&controlpoint[y][1],&controlpoint[y][2]);
      }
      winio("%bt[Done]");

      clearscreen();

      if (a==1)
      {
         for (int i=0; i<degrees; i++)
         {
            
            draw_line(controlpoint[i][0],controlpoint[i][1],controlpoint[i+1][0],controlpoint[i+1][1],9);
         }
      }
      // draw curve
      
      draw_bez();
   }

   return 1;
}

int replot()
{
   for (int d=1; d<degrees+1; d++)
   {
         clearscreen();

         if (a==1)
         {
            for (int i=0; i<degrees; i++)
            {
               
               draw_line(controlpoint[i][0],controlpoint[i][1],controlpoint[i+1][0],controlpoint[i+1][1],9);
            }
         }
   }

   return 0;
}

int fact(int i)
{
   if (i<=1) return 1;
   else return i*fact(i-1);
}

int nCi(int i)
{
   return fact(degrees)/(fact(degrees-i)*fact(i));
}


double bu(int i,double u)
{
   return nCi(i)*pow(1-u,degrees-1)*pow(u,i);
}

void C(double u)
{
   double point[3];
  
   for (int k=0;k<3;k++)
   {
      for (int i=0;i<degrees+1;i++)
      {
         for (int j=0;j<number;j++)
         {
            point[k]=bu(i,u)*controlpoint[i][k];

            bez_points[j][k]=point[k];            
         }
      }
   }
}

void calc_bez()
{
   double u;

   for (int i=0;i<number;i++)
   {
      u=(i)/(number-1);
      
      C(u);
   }
}

void draw_bez()
{
   calc_bez();

   for (int i=0;i<number;i++)
   {
      draw_line(bez_points[i][0],bez_points[i][1],bez_points[i+1][0],bez_points[i+1][1],9);
   }
}