Lez's home   MSc Degree   -   Previous page   Next page  

Coding

// testdial.cpp

// tests class Dial
// tdc 23/01/2000
// set editor tabstops to 3
// Change the value of myname. Do _not_ change any other code in this file.

#ifndef dial_h
#include "dial.h"
#endif
#include <iostream>
#include <iomanip>
#include <cstdlib>

const int longring = 24;
const int shortring = 12;
const char myname[] = "Lez Bullwer & Mingguang Lui";

int main( int argc, char* argv[] )
{
   void show( const Dial&, const Dial& ); // display the time
   void alarm( int ); // ring the alarm
   Dial bedtime_hrs( 24, 23 ), bedtime_mins( 60, 0 ),
     alarm_hrs = Dial( 24, 7 ), alarm_mins,
     snooze_hrs = alarm_hrs,
     snooze_mins;
   alarm_mins = bedtime_mins;
   snooze_mins.set( 60, 30 );

   if( argc != 2 )
   {
     cout << "incorrect number of arguments" << endl;
     cout << "usage: testdial <minutes increment>" << endl;
     return 1;
   }

   int increment = atoi( argv[1] ); // single arg is increment in minutes
   if( increment < 0 || increment > 1440 )
   {
     cout << "invalid argument - must be positive and < 1440" << endl;
     return 2;
   }

   cout << myname << endl;
   cout << "bedtime = "; show( bedtime_hrs, bedtime_mins );
   cout << "alarm set for "; show( alarm_hrs, alarm_mins );
   cout << "snooze set for "; show( snooze_hrs, snooze_mins );
   cout << "minutes increment: " << increment << endl;

   bool timetogetup = ( bedtime_hrs == alarm_hrs ) &&
     ( bedtime_mins == alarm_mins );

   while ( !timetogetup )
   {
     bedtime_mins += increment;
     bedtime_hrs += bedtime_mins.passedtop();
     show( bedtime_hrs, bedtime_mins );
     timetogetup = ( bedtime_hrs == alarm_hrs ) &&
       ( bedtime_mins == alarm_mins );
   }
   alarm( longring );

   bool timemustgetup = ( bedtime_hrs == snooze_hrs ) &&
       ( bedtime_mins == snooze_mins );
   while ( !timemustgetup )
   {
     bedtime_mins += increment;
     bedtime_hrs += bedtime_mins.passedtop();
     show( bedtime_hrs, bedtime_mins );
     timemustgetup = ( bedtime_hrs == snooze_hrs ) &&
       ( bedtime_mins == snooze_mins );
   }
   alarm( shortring );
   return 0;
}

void alarm ( int rings )
{
   cout << 'B';
   while( rings-- > 0 )
     cout << 'r';
   cout << endl;
}

void show( const Dial& a, const Dial& b )
{
   cout << setw(2) << setfill('0') << a.value() << ":"
     << setw(2) << b.value() << endl;
}


// testclk.cpp

// tests class clock24
// tdc 23/01/2000
// set editor tabstops to 3
// Do not change this file except the value of myname and increment

#include <iostream>
#include <cstdlib>
#ifndef clock24_h
#include "clock24.h"
#endif

const int shortring = 12;
const int longring = 24;
const char *myname = "Lez Bullwer & Mingguang Liu";

int main( int argc, char *argv[] )
{
   void soundalarm( int );
   void show( char*, const Clock24& );
   void getprogname( char*, char* );

   if ( argc != 2 )
   {
     char progname[30];
     getprogname( argv[0], progname );
     cout << "incorrect number of arguments" << endl
          << "usage: " << progname << " <minutes increment>" << endl;
     return 1;
   }
   const int increment = atoi( argv[1] );
   if( increment < 0 || increment >= 1440 )
   {
     cout << "invalid argument - must be positive and < 1440" << endl;
     return 2;
   }

   Clock24 bedtime( 23,0 ), alarm, snooze = alarm;
   snooze = alarm = bedtime;
   alarm.set( 7, 0 );
   snooze.set( 7, 30 );

   cout << myname << endl;
   show( "bedtime = ", bedtime );
   show( "alarm set for ", alarm );
   show( "snooze set for ", snooze );
   cout << "minutes increment: " << increment << endl;
   int minutestosleep = alarm - bedtime;

   while ( minutestosleep > 0 )
   {
     bedtime+= increment;
     cout << "time = " << bedtime << endl;
     minutestosleep-= increment;
   }
   soundalarm( shortring );

   int minutestosnooze = snooze - bedtime;

   while ( minutestosnooze > 0 )
   {
     bedtime+= increment;
     cout << "time = " << bedtime << endl;
     minutestosnooze-= increment;
   }
   soundalarm( longring );
   cout << endl << endl;

   return 0;
}

void soundalarm( int rings )
{
   cout << 'B';
   while( rings-- > 0 )
     cout << 'r';
   cout << endl;
}

void show( char comment[], const Clock24& clk )
{
   cout << comment << clk << endl;
}

void getprogname( char* pathname, char* progname )
// extracts the file name from a path name
// pre - pathname contains the full path name
// post - progname contains the name of the program excluding the .exe
{
   char *a = pathname + strlen(pathname) - 1; // go to end of pathname
   char *p = progname, *q = progname;
   while ( *a != '.' ) // look back for the dot
     a--;
   *a = '\0'; // terminate it (don't want the .exe bit)
   a--;
   while ( a >= pathname && *a != '\\' && *a != '/' && *a != ':' )
     a--; // look back for the slash or the start of the path
   a++;
   q = a;
   for ( ; *a; a++, p++ )
     *p = ( *a + 'a' - 'A' ); // copy into & change to lower case
   *p = '\0'; // terminate it (probably not necessary)
   strcpy( progname, q ); // copy into 2nd arg.
}


// dial.h

// header for dial.cpp
// OOPD Assignment 1
// Lez Bullwer & Mingguang Liu
// 24/02/00

#ifndef Dial_h
#define Dial_h
#include <iostream.h>

class Dial
{
   public:
     Dial (); // default constructor
     Dial (int, int); // conversion constructor
     Dial (const Dial&); // copy constructor
     ~Dial(); // destructor
     void set (int, int); // member function, set position
     int value() const;
     int passedtop(); // advance time function
     bool operator==(const Dial&) const; // comparsion operator
     Dial& operator+=(int);
     friend Dial operator+(const Dial&, const Dial&);
     friend ostream& operator<<(ostream&, const Dial&);
   private:
     int dialdivision, position, advance;
};

#endif


// dial.cpp

// implementation of dial.h
// OOPD Assignment 1
// Lez Bullwer & Mingguang Liu
// 24/02/00

#include"dial.h"
#include<iostream.h>

Dial::Dial() // default constructor
: dialdivision(0), position(0), advance(0) {}

Dial::Dial(int a, int b) // conversion constructor
: dialdivision(a), position(b), advance(0) {}

Dial::Dial (const Dial& b) // copy constructor
{
   dialdivision = b.dialdivision;
   position = b.position;
   advance = b.advance;
}

Dial::~Dial() // destructor
{
}

void Dial::set(int div, int m)
{
   dialdivision = div;
   position = m;
}

int Dial::value() const // show current position
{
   return position;
}

int Dial::passedtop()
{
   if (advance == 0)
     advance = position/dialdivision; // adjust advance position
   position %= dialdivision; // checking gone over the top
   return (advance);
}

bool Dial::operator==(const Dial& b) const // comparison operator
{
   if (dialdivision != b.dialdivision)
     return false; // not the same sort of dial
   else
     return (position == b.position); // return comparison
}

Dial& Dial::operator+=(int d) // addition & assign operator
{
   position += d; // increment position
   advance = position/dialdivision; // adjust advance position
   position %= dialdivision; // checking gone over the top
   return(*this);
}

Dial operator+(const Dial& a, const Dial& b)
{
   Dial temp=a;
   temp.position += b.position;
   return temp;
}

ostream& operator<<(ostream& strm, const Dial& b)
{
   strm << b.position;
   return strm;
}


// Clock24.h

// header for clock24.cpp
// OOPD Assignment 1
// Lez Bullwer & Mingguang Liu
// 16/03/2000

#ifndef clock24_h
#define clock24_h
#include"dial.h"
#include<iostream>

class Clock24
{
  public:    
    Clock24 ();                      // defacult constructor
    Clock24 (int, int);              // conversion constructor
    Clock24 (const Clock24&);    // copy constructor
    ~Clock24();                      // destructor
    void set (int, int);            // set time
    Clock24& operator+=(int);
    friend int operator-(const Clock24&, const Clock24&);
    friend ostream& operator<<(ostream&, const Clock24&);

  private:
    Dial hours, minutes;
};

#endif

// clock24.cpp

// implementation of clock.h
// OOPD Assignment 1
// Lez Bullwer & Mingguang Liu
// 16/03/2000

#include "Clock24.h"
#include<iostream>
#include<iomanip>

Clock24::Clock24()                        // default constructor
:  hours(24, 0), minutes(60, 0) {}

Clock24::Clock24 (int a, int b)           // conversion constructor
:  hours(24, a), minutes(60, b) {}

Clock24::Clock24 (const Clock24& b)   // copy constructor
{
  hours = b.hours;
  minutes = b.minutes;
}

Clock24::~Clock24()     // destructor
{
}

void Clock24::set (int a, int b)    // set Clock time
{
  hours.set(24, a);
  minutes.set(60, b);
}

Clock24& Clock24::operator+=(int d)      // addition & assign operator
{
  minutes += d;
  hours += minutes.passedtop();
  return (*this);
}

int operator-(const Clock24& a, const Clock24& b)    // subtraction to give total mins
{
  int temp;
  if ( (a.hours.value() - b.hours.value()) >= 0 )
    temp = ( a.hours.value() * 60 + a.minutes.value() )
        - ( b.hours.value() * 60 + b.minutes.value() );
  else
    temp = ( a.hours.value() * 60 + a.minutes.value() )
        - ( b.hours.value() * 60 + b.minutes.value() ) + 24 * 60;
  return temp;
}

ostream& operator << (ostream& strm, const Clock24& b)
{
  strm << setw(2) << setfill('0') << b.hours << ":"
      << setw(2) << b.minutes;
  return strm;
}

// imprl.h

// header for imprl.cpp
// OOPD Assignment 1
// Lez Bullwer & Mingguang Liu
// 16/03/2000

#ifndef imprl_h
#define imprl_h
#include"dial.h"
#include<iostream>

class Imperial
{
  public:
    Imperial ();                // default constructor
    Imperial (int, int);        // conversion constructor
    Imperial (int);             // another conversion constructor
    Imperial (const Imperial&);  // copy constructor
    ~Imperial();                // destructor
    void set(int, int);         // set reading
    Imperial& operator=(const Imperial&);
    friend Imperial operator+(const Imperial&, const Imperial&);
    friend int operator-(const Imperial&, const Imperial&);
    friend Imperial& operator+=(Imperial&, const Imperial&);
    friend float operator*(const float, const Imperial&);
    friend ostream& operator<<(ostream&, const Imperial&);

  private:
    Dial yards, feet, inches;
};

#endif

// imprl.cpp

// implementation of imprl.h
// OOPD Assignment 1
// Lez Bullwer & Mingguang Liu
// 16/03/2000

#include "imprl.h"
#include<iostream>
#include<iomanip>

const int YRDS = 100, FT = 3, INCH = 12;

Imperial::Imperial()                          // default constructor
:  yards(YRDS, 0), feet(FT, 0), inches(INCH, 0) {}

Imperial::Imperial(int a_feet, int a_inch)    // conversion constructor
{
  int x_inch = 0, x_feet = 0, x_yard = 0;
  x_inch = a_inch;
  inches.set(12, a_inch);
  x_feet = inches.passedtop();
  x_feet += a_feet;
  feet.set(3, x_feet);
  x_yard = feet.passedtop();
  yards.set(100, x_yard);
}

Imperial::Imperial(int a)                        //another conversion constructor
:  yards(YRDS, 0), feet(FT, 0), inches(INCH, a) {}

Imperial::Imperial(const Imperial& x)        // copy constructor
{
  yards = x.yards;
  feet = x.feet;
  inches = x.inches;
}

Imperial::~Imperial()            // destructor
{
}

void Imperial::set(int a_feet, int a_inch)
{
  int x_inch = 0, x_feet = 0, x_yard = 0;
  inches.set(12, a_inch);
  x_feet += inches.passedtop();
  x_feet += a_feet;
  feet.set(3, x_feet);
  x_yard += feet.passedtop();
  yards.set(100, x_yard);
}

Imperial& Imperial::operator=(const Imperial& x)    // assign operator
{
  if (this == &x)
    return *this;
  inches.set(INCH, x.inches.value());
  feet.set(FT, x.feet.value());
  yards.set(YRDS, x.yards.value());
  return (*this);
}

Imperial operator+(const Imperial& a, const Imperial& b)
{
  Imperial temp;
  int totalincha, totalinchb, total ;

  totalincha = a.inches.value() + a.feet.value() * INCH
        + a.yards.value() * INCH * FT;
  totalinchb = b.inches.value() + b.feet.value() * INCH
        + b.yards.value() * INCH * FT;

  total = totalincha + totalinchb;

  temp.inches.set(INCH, total % INCH);
  total /= INCH;
  temp.feet.set(FT, total % FT);
  total /= FT;
  if (total >= 100)
    cout << "over 100 yards - restarting count" << endl;
  temp.yards.set(YRDS, (total % YRDS));

  return temp;
}

int operator-(const Imperial& a, const Imperial& b)
{
  int temp, totala, totalb;
  totala = a.inches.value() + a.feet.value() * INCH
        + a.yards.value() * INCH * FT;
  totalb = b.inches.value() + b.feet.value() * INCH
        + b.yards.value() * INCH * FT;

  if  (totala > totalb)
    temp = totala - totalb;
  else
    temp = totalb - totala;
  return temp;
}

Imperial& operator+=(Imperial& a, const Imperial& b)
{
  Imperial temp;
  int totalincha, totalinchb, total ;

  totalincha = a.inches.value() + a.feet.value() * INCH
        + a.yards.value() * INCH * FT;
  totalinchb = b.inches.value() + b.feet.value() * INCH
        + b.yards.value() * INCH * FT;

  total = totalincha + totalinchb;

  a.inches.set(INCH, total % INCH);
  total /= INCH;
  a.feet.set(FT, total % FT);
  total /= FT;
  if (total >= 100)
    cout << "over 100 yards - restarting count" << endl;
  a.yards.set(YRDS, (total % YRDS));

  return a;
}

float operator*(float flt, const Imperial& x)    // multiply operator
{
  float temp;
  int total;
  total = x.inches.value() + (x.feet.value() * 12) + (x.yards.value() * 3 * 12);
  temp = flt * total;
  return temp;
}

ostream& operator << (ostream& strm, const Imperial& x)
{
  strm << x.yards << " yds " << x.feet << " ft " << x.inches << " ins";
  return strm;
}

// metric.cpp

// tests class imperial - converts from imperial to metric
// OOPD Assignment 1
// Lez Bullwer & Mingguang Liu
// 16/03/2000

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctype.h>
#ifndef imprl_h
#include "imprl.h"
#endif

int main( void )
{
  void show( const float inMetres );
  void show( const Imperial& totalout );
  bool okayToAdd( const int a, const int b );

  int yards, feet, inches;
  bool anotheradd = true;

  const float convert = 0.0254;      // convert from inches to metres

  cout << "Imperial addition & conversion to Metric " << endl;
  cout << "---------------------------------------- " << endl;

  cout << "Enter length in feet and inches (e.g. 2 6): " << endl;
  cout << "*** Positive values only ***" << endl;
  cout << "Length : ";

  if (!((cin>>feet) && (cin>>inches) && (okayToAdd(feet, inches))) )
  {  //check input is numeric and within limits
    cout << "Exiting" << endl;
    return 0;
  }

  Imperial length1(feet, inches);
  Imperial length2, totallength(length1), subtotal;

  cout << "Length (non-numeric to finish): ";

  while ( ((cin>>feet) && (cin>>inches)) && (okayToAdd(feet, inches)) )
  { // check input is numeric and within limits
    length2.set(feet, inches);
    totallength += length2;
    show(totallength);

    cout << "Length (non-numeric to finish): ";
  }

  // convert to metric
  float metres;
  metres = convert * totallength;

  show(totallength);
  show(metres);

  return 0;
}

void show( const Imperial& totalout )
{
  cout << totalout << endl;
}

 
void show( const float inMetres )
{
  cout << " in metres: " << setprecision(6) << setw(4) << inMetres;
}

bool okayToAdd( const int ft, const int inc )
{
  return ( (ft >= 0 && inc >= 0) );
}

// worm.cpp

// tests class imperial - converts from imperial to metric
// OOPD Assignment 1
// Lez Bullwer & Mingguang Liu
// 16/03/2000

#include <iostream>
#include <iomanip>
#include <cstdlib>
#ifndef imprl_h
#include "imprl.h"
#endif

int main( void )
{
  bool okayToAdd( const int inc );
  bool okayForTravel( const int inc );
  bool okayForTime( const int inc );
  void errormessage(char comment[]);
  void show( const Imperial& lgth );

  int n_yards, n_feet, n_inches, hours;
  const float convert = 0.0254;            // convert from inches to metres
  char *start, *travel, *time;
  start  = "Enter start position in inches ( 0-11 ): ";
  travel = "How far does the worm travel per hour? (in inches): ";
  time  = "How many hours does the worm travel?: ";

  cout << start;
  while ( (!(cin>>n_inches) || cin.peek() !='\n') || (!okayToAdd(n_inches)) )
  // need to check input is number and not greater than 11
  {
    errormessage(start);
    cin.clear();
    cin.ignore(1000, '\n');
  }

  Imperial length1(n_inches);
  Imperial length2(length1), totallength();

  cout << travel;
  while ( (!(cin>>n_inches) || cin.peek() !='\n') || (!okayForTravel(n_inches)) )
  // need to check input is a number and within limits
  {
    errormessage(travel);
    cin.clear();
    cin.ignore(1000, '\n');
  }

  cout << time;
  while ( (!(cin>>hours) || cin.peek() !='\n') || (!okayForTime(hours)))
  // need to check input is a number and within limits
  {
    errormessage(time);
    cin.clear();
    cin.ignore(1000, '\n');
  }

  for (int i = 0; i < hours; i++)
  {
    length2 += n_inches;
  }

  // convert to metric
  float metres;
  metres = convert * length2;

 
  cout << "Worm travelled from:  ";
  show(length1);
  cout << "Worm travelled to:    ";
  show(length2);
  int total;
  total = length2 - length1;
  cout << "Distance in inches:   " << total << endl;
  cout << "In metres this is:    " << metres << endl;
  if (metres > 2.0)
    cout << " ... and the worm was very tired!!!!!!" << endl;

  return 0;
}

void show( const Imperial& lgth )
{
  cout << lgth << endl;
}

void show( const float inMetres )
{
  cout << " in metres: " << setprecision(6) << setw(4) << inMetres;
}

bool okayToAdd( const int inc )        //check within limits
{
  return ( (inc >= 0 && inc < 12) );
}

bool okayForTravel( const int inc )      //check within limits
{
  if (inc > 50)
    cout << "A worm can't go that fast!!" << endl;
  return ( (inc >= 0 && inc < 51) );
}

bool okayForTime( const int inc )      //check within limits
{
  if (inc > 24)
    cout << "A worm can't crawl for that long!!" << endl;
  return ( (inc >= 0 && inc < 25) );
}

void errormessage(char comment[])
{
  cout << "Incorrect input. Try again " << endl;
  cout << comment ;
}

// meter.h

// header for meter.cpp
// OOPD Assignment 1
// Lez Bullwer & Mingguang Liu
// 16/03/2000

#ifndef meter_h
#define meter_h
#include"dial.h"
#include<iostream>

class Meter
{
  public:
    Meter ();                       // default constructor
    Meter (int, int, int, int);     // conversion constructor
    Meter (const Meter&);       // copy constructor
    ~Meter();                       // destructor
    void set (int, int, int, int);  // set meter reading
    Meter& operator+=(int);
    friend int operator-(const Meter&, const Meter&);
    friend ostream& operator<<(ostream&, const Meter&);

  private:
    Dial thou, hund, ten, unit;
};

#endif

// meter.cpp

// implementation of meter.h
// OOPD Assignment 1
// Lez Bullwer & Mingguang Liu
// 16/03/2000

#include "meter.h"
#include<iostream>
#include<iomanip>

const int MAX = 10;

Meter::Meter()                      // default constructor
:  thou(MAX, 0), hund(MAX, 0), ten(MAX,0), unit(MAX,0) {}

Meter::Meter (int a, int b, int c, int d)    // conversion constructor
:  thou(MAX, a), hund(MAX, b), ten(MAX,c), unit(MAX,d) {}

Meter::Meter (const Meter& x)            // copy constructor
{
  thou = x.thou;
  hund = x.hund;
  ten = x.ten;
  unit = x.unit;
}

Meter::~Meter()                    // destructor
{
}

void Meter::set (int a, int b, int c, int d)      // set meter reading
{
  thou.set(MAX, a);
  hund.set(MAX, b);
  ten.set(MAX, c);
  unit.set(MAX, d);
}

Meter& Meter::operator+=(int someunits)    // addition & assign operator
{
  unit += someunits;
  ten += unit.passedtop();
  hund += ten.passedtop();
  thou += hund.passedtop();
  return (*this);
}

int operator-(const Meter& a, const Meter& b) // subtraction give total units
{
  int temp, value1, value2;
  value1 = a.thou.value() * 1000 + a.hund.value() * 100
        + a.ten.value() * 10 + a.unit.value();
  value2 = b.thou.value() * 1000 + b.hund.value() * 100
        + b.ten.value() * 10 + b.unit.value();

  if ( ( value1 - value2 >= 0 ) )  //a.thou.value() - b.thou.value()) > 0 )
  { //which value is larger
    temp = value1 - value2;
  }
  else
  {
    temp = (value1 + 10000) - value2;
  }
  return temp;
}

ostream& operator << (ostream& strm, const Meter& x)
{
  strm << setw(1) << setfill('0')
      << x.thou << x.hund << x.ten << x.unit;
  return strm;
}

// elecmetr.cpp

// tests class Meter - gives reading and cost
// OOPD Assignment 1
// Lez Bullwer & Mingguang Liu
// 16/03/2000

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctype.h>
#ifndef meter_h
#include "meter.h"
#endif

int main( int argc, char *argv[] )
{
  void errormessage(char comment[]);
  bool isPositive( const int inc );
  bool argsAreLetters( int argc, char *argv[] );
  void getprogname( char*, char* );

  int unitsperday, numofdays;
  int costperunit = 8;          //cost in pence

  if ( (argsAreLetters( argc, argv ) ) || (argc != 5) )
  {
    char progname[30];
    getprogname( argv[0], progname );
    cout   << "incorrect number of arguments" << endl
        << "current reading required (4 digits) as follows: " << endl
        << "usage: " << progname
        << " <thousands hundreds tens units>" << endl
        << "e.g. if current reading = 1234 then enter: " << endl
        << "elecmetr 1 2 3 4" << endl;
    return 1;
  }

  int thousands, hundreds, tens, units;
  char ch_zero = '0';
  char ch1 = *argv[1],
      ch2 = *argv[2],
      ch3 = *argv[3],
      ch4 = *argv[4];

  thousands = ch1 - ch_zero;
  hundreds  = ch2 - ch_zero;
  tens      = ch3 - ch_zero;
  units     = ch4 - ch_zero;

  Meter electMeter(thousands, hundreds, tens, units);
  Meter electPrevious(electMeter);

  char *unitsused, *daystorun;
  unitsused = "no. of units used per day? (< 100) : ";
  cout << unitsused ;
  while ( (!(cin>>unitsperday) || cin.peek() !='\n') || (!isPositive(unitsperday)) )
  // need to check input is a number & within limits
  {
    errormessage(unitsused);
    cin.clear();
    cin.ignore(1000, '\n');
  }

  daystorun = "no. of days to run? (< 100) : ";
  cout << daystorun;
  while ( (!(cin>>numofdays) || cin.peek() !='\n') || (!isPositive(numofdays)) )
  // need to check input is a number & within limits
  {
    errormessage(daystorun);
    cin.clear();
    cin.ignore(1000, '\n');
  }

 
  for (int i = 0; i < numofdays; i++)
  {
    electMeter += unitsperday;
  }

  int units_used = electMeter - electPrevious;
  int totalpound, totalpence;
  totalpound = (units_used * costperunit) / 100;
  totalpence = (units_used * costperunit) % 100;

  cout << endl;
  cout << "Previous reading:        " << electPrevious << endl;
  cout << "Current reading:         " << electMeter << endl;
  cout << "Units used:            " << setfill(' ')
      << setw(4) << units_used << endl;
  cout << "Cost per unit:        £  0." << setfill('0')
      << setw(2) << costperunit << endl;
  cout << "                  ======= " << endl;
  cout << "Total cost of units used: £" << setfill(' ') << setw(3)
      << totalpound << "." << setfill ('0') << setw(2) << totalpence <<endl;

  return 0;
}

void errormessage(char comment[])
{
  cout << "Incorrect input. Try again " << endl;
  cout << comment ;
}

bool isPositive( const int inc )      //check value within limits
{
  return ( (inc >= 0 && inc < 100) );
}

bool argsAreLetters( int argc, char *argv[] )
// check arguments are numbers
{
  char ch;
  for ( int i = 1; i < argc; i++)
  {
    ch = char(*argv[i]);
    if ( !(isdigit(ch)) )
      return true;
  }
  return false;
}

void getprogname( char* pathname, char* progname )
// extracts the file name from a path name
// pre - pathname contains the full path name
// post - progname contains the name of the program excluding the .exe
{
  char *a = pathname + strlen(pathname) - 1; // go to end of pathname
  char *p = progname, *q = progname;
  while ( *a != '.' )  // look back for the dot
    a--;
  *a = '\0';        // terminate it (don't want the .exe bit)
  a--;
  while ( a >= pathname && *a != '\\' && *a != '/' && *a != ':' )
    a--;          // look back for the slash or the start of the path
  a++;
  q = a;
  for ( ; *a; a++, p++ )
    *p = ( *a + 'a' - 'A' );    // copy into & change to lower case
  *p = '\0';              // terminate it (probably not necessary)
  strcpy( progname, q );      // copy into 2nd arg.
}

Lez's home   MSc Degree   -   Previous page   Next page  
Copyright 2000 Lez Bullwer