topical media & game development
basic-program-solutions-08-Soln8-7.c
? /
basic-program-solutions-08-Soln8-7.c
// Ex8_7.cpp : main project file.
// A CLR calculator supporting parentheses
include <stdafx.h>
using namespace System;
ref class Box
{
public:
Box()
{
Box(1.0, 1.0, 1.0);
}
Box(double lv, double wv, double hv)
{
lv = lv <= 0.0 ? 1.0 : lv; // Ensure positive
wv = wv <= 0.0 ? 1.0 : wv; // dimensions for
hv = hv <= 0.0 ? 1.0 : hv; // the object
lngth = lv>wv ? lv : wv; // Ensure that
wdth = wv<lv ? wv : lv; // length >= width
hght = hv;
}
double Volume()
{
return lngth*wdth*hght;
}
property double height
{
double get() { return hght; }
}
property double width
{
double get() { return wdth; }
}
property double length
{
double get() { return lngth; }
}
// Overloaded addition operator
Box^ operator+(Box^ box)
{
// New object has larger length and width of the two,
// and sum of the two heights
return gcnew Box(lngth > box->lngth ? lngth : box->lngth,
wdth > box->wdth ? wdth : box->wdth,
hght + box->hght);
}
// Divide one box into another
int operator/(Box^ box)
{
// Temporary for number in horizontal plane this way
int tc1 = 0;
// Temporary for number in a plane that way
int tc2 = 0;
tc1 = safe_cast<int>(lngth/box->lngth)*
safe_cast<int>(wdth/box->wdth); // to fit this way
tc2 = safe_cast<int>(lngth/box->wdth)*
safe_cast<int>(wdth/box->lngth); // and that way
//Return best fit
return static_cast<int>(hght/box->hght)*(tc1>tc2 ? tc1 : tc2);
}
// Post-multiply a box by an integer
Box^ operator*(int n)
{
if(n%2 == 0)
return gcnew Box(lngth, 2.0*wdth, (n/2)*hght); // n even
else
return gcnew Box(lngth, wdth, n*hght); // n odd
}
// Operator to return the free volume in a packed Box
double operator%(Box^ box)
{ return Volume() - (this/box)*box->Volume(); }
// Function for testing if a Box object is >= a constant
bool operator>=(double value)
{ return value <= this; }
// Function for testing if a Box object is <= a constant
bool operator<=(double value)
{ return value >= this; }
// Function for testing if a constant is > a Box object
static bool operator>(double value, Box^ box)
{ return value > box->Volume(); }
// Function for testing if a constant is < Box object
static bool operator<(double value, Box^ box)
{ return value < box->Volume(); }
// Function for testing if a Box object is > a constant
static bool operator>(Box^ box, double value)
{ return value < box; }
// Function for testing if a Box object is < a constant
static bool operator<(Box^ box, double value)
{ return value > box; }
// Function for testing if a constant is >= a Box object
static bool operator>=(double value, Box^ box)
{ return value >= box->Volume(); }
// Function for testing if a constant is <= a Box object
static bool operator<=(double value, Box^ box)
{ return value <= box->Volume(); }
// Function for testing if a constant is == Box object
static bool operator==(double value, Box^ box)
{ return value == box->Volume(); }
// Function for testing if Box object is == a constant
static bool operator==(Box^ box, double value)
{ return value == box; }
// CBox multiply operator n*aBox
static Box^ operator*(int n, Box^ box)
{ return box*n; }
private:
double lngth; // Length of a box in inches
double wdth; // Width of a box in inches
double hght; // Height of a box in inches
};
int main(array<System::String ^> ^args)
{
Box^ candy = gcnew Box(1.5, 1.0, 1.0); // Candy definition
Box^ candyBox = gcnew Box(7.0, 4.5, 2.0); // Candy box definition
Box^ carton = gcnew Box(30.0, 18.0, 18.0); // Carton definition
// Calculate candies per candy box
int numCandies = candyBox/candy;
// Calculate candy boxes per carton
int numCboxes = carton/candyBox;
// Calculate wasted carton space
double space = carton\%candyBox;
Console::WriteLine(L"There are {0} candies per candy box", numCandies);
Console::WriteLine(L"For the standard boxes there are {0} candy boxes per carton", numCboxes);
Console::WriteLine(L"with {0} cubic inches wasted.", space);
Console::Write(L"CUSTOM CANDY BOX ANALYSIS (No Waste)");
// Try the whole range of custom candy boxes
for(double length = 3.0 ; length <= 7.5 ; length += 0.5)
for(double width = 3.0 ; width <= 5.0 ; width += 0.5)
for(double height = 1.0 ; height <= 2.5 ; height += 0.5)
{
// Create new box each cycle
Box^ tryBox = gcnew Box(length, width, height);
if(carton\%tryBox < tryBox->Volume() &&
tryBox % candy == 0.0 && tryBox/candy >= 30)
{
Console::Write(L"\n\nTrial Box L = {0}", tryBox->length);
Console::WriteLine(L" W = {0} H = {1}", tryBox->width, tryBox->height);
Console::Write(L"Trial Box contains {0} candies", tryBox/candy);
Console::WriteLine(L" and a carton contains {0} candy boxes.", carton/tryBox);
}
}
Console::WriteLine();
return 0;
}
(C) Æliens
20/2/2008
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.