/* 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; }
|