# trad-shapes.cpp

/* trad-shapes.cpp. Code generated using Microsoft Visual C++.

Using traditional structured programming, this program creates shapes,

displays their properties, and prints them.

*/

#include <iostream>

#include <math.h>

using namespace std;

/* printLine is a useful function for line printing.

For simplicity, this implementation outputs the end

points of the line; going into graphics programming

would distract from the purpose of this demonstration.

*/

void printLine( int x1, int y1, int x2, int y2 ) {

cout << "Line from (" << x1 << "," << y1 << ") ";

cout << "to (" << x2 << "," << y2 << ")n";

}

/* Rectangle

A rectangle basically looks like this:

|------ length -----|

1 --------------------- 2 -

| | |

| | |

| | | height

| | |

4 --------------------- 3 -

The code for Rectangle follows (28 lines of code).

*/

struct Rectangle {

int x1, y1, x2, y2, x3, y3, x4, y4;

};

void createRect( Rectangle* r, int x, int y, int length, int height) {

r->x1 = x;

r->y1 = y;

r->x2 = x + length;

r->y2 = y;

r->x3 = x + length;

r->y3 = y - height;

r->x4 = x;

r->y4 = y - height;

}

void displayRect( Rectangle r ) { // displays properties

cout << "Rectangle Properties: ";

cout << "Top-left corner is (" << r.x1 << "," << r.y1 << ")n";

cout << "Line 1-2 is " << (r.x2 - r.x1) << " points long.n";

cout << "Line 2-3 is " << (r.y2 - r.y3) << " points long.n";

cout << "Line 3-4 is " << (r.x3 - r.x4) << " points long.n";

cout << "Line 4-1 is " << (r.y1 - r.y4) << " points long.n";

}

void printRect( Rectangle r ) {

cout << "Rectangle:n";

printLine( r.x1, r.y1, r.x2, r.y2 );

printLine( r.x2, r.y2, r.x3, r.y3 );

printLine( r.x3, r.y3, r.x4, r.y4 );

printLine( r.x4, r.y4, r.x1, r.y1 );

}

/* Isosceles

An isosceles triangle basically looks like this:

1

^ -

/ |

/ | height

/ |

3 /------- 2 -

|--base-|

The code for Isosceles follows. With 27 lines of code, it about as

long as Rectangle, with some time savings for structure and typing.

However, these time savings were partially negated by the time it took

to debug the bugs introduced by the cut-and-paste method of reuse. For

a small program like this, the typo effect is minor, but in large

programs, the bugs introduced can be quite significant.

*/

struct Isosceles {

int x1, y1, x2, y2, x3, y3;

};

void createIso( Isosceles* i, int x, int y, int height, int base) {

if ( base%2 == 1 )

// base is odd, so increment to allow even division by two

base++;

i->x1 = x;

i->y1 = y;

i->x2 = x + (base/2);

i->y2 = y - height;

i->x3 = x - (base/2);

i->y3 = y - height;

}

void displayIso( Isosceles i ) { // displays properties

cout << "Isosceles Triangle Properties: ";

cout << "Topmost point is (" << i.x1 << "," << i.y1 << ")n";

float slope = sqrt( pow(i.y1-i.y2, 2) + pow(i.x2-i.x1, 2) ); // Pythagoran formula

cout << "Line 1-2 is " << slope << " points long.n";

cout << "Line 2-3 is " << (i.x2 - i.x3) << " points long.n";

cout << "Line 3-1 is " << slope << " points long.n";

}

void printIso( Isosceles i ) {

cout << "Isosceles Triangle:n";

printLine( i.x1, i.y1, i.x2, i.y2 );

printLine( i.x2, i.y2, i.x3, i.y3 );

printLine( i.x3, i.y3, i.x1, i.y1 );

}

/* Parallelogram

A parallelogram basically looks like this:

|------ base -----|

1 --------------------- 2

4 --------------------- 3

The code for Parallelogram follows. With 29 lines of code, it about as

long as Rectangle and Triangle. Again, the code was primarily composed

by cutting and pasting, which introduced a number of compiler errors

that had to be debugged. By this time, we can tell that each new shape

of this level of simplicity takes just under 30 lines of code.

*/

struct Parallelogram {

int x1, y1, x2, y2, x3, y3, x4, y4;

};

void createPar( Parallelogram* p, int x1, int y1, int base, int x4, int y4 ) {

p->x1 = x1;

p->y1 = y1;

p->x2 = x1 + base;

p->y2 = y1;

p->x3 = x4 + base;

p->y3 = y4;

p->x4 = x4;

p->y4 = y4;

}

void displayPar( Parallelogram p ) { // displays properties

cout << "Parallelogram Properties: ";

cout << "Top-left corner is (" << p.x1 << "," << p.y1 << ")n";

float slope = sqrt( pow(p.y1-p.y4, 2) + pow(p.x1-p.x4, 2) ); // Pythagoran formula

cout << "Line 1-2 is " << (p.x2 - p.x1) << " points long.n";

cout << "Line 2-3 is " << slope << " points long.n";

cout << "Line 3-4 is " << (p.x3 - p.x4) << " points long.n";

cout << "Line 4-1 is " << slope << " points long.n";

}

void printPar( Parallelogram p ) {

cout << "Parallelogram:n";

printLine( p.x1, p.y1, p.x2, p.y2 );

printLine( p.x2, p.y2, p.x3, p.y3 );

printLine( p.x3, p.y3, p.x4, p.y4 );

printLine( p.x4, p.y4, p.x1, p.y1 );

}

int main() {

Rectangle r;

createRect( &r, 3,10, 6, 8 ); // anchor point, length, height

cout << "n";

displayRect( r );

cout << "n";

printRect( r );

Isosceles i;

createIso( &i, 3,10, 6, 8 ); // anchor point, height, base

cout << "n";

displayIso( i );

cout << "n";

printIso( i );

Parallelogram p;

createPar( &p, 3,10, 6, 5,7 ); // upper anchor, base, lower anchor

cout << "n";

displayPar( p );

cout << "n";

printPar( p );

return 0;

}