------------------------------------------------------------------------------
MC logo
Point With Struct
[^] CSc 220 Home
------------------------------------------------------------------------------
[Introduction] [Boolean and Control] [Functions] [Arrays and Pointers] [Dynamic Arrays] [Array Errors] [Command Array] [Standard Containers] [Structs and Classes] [Automatic Pointer] [Multi-File Programs] [Copying Objects] [Templates] [Inheritance] [Plain C I/O] [Type Odds And Ends] [Plain C Strings] [File I/O]
[Plain Structs] [Point With Struct] [C++ Point Class] [Linked List (Structs)] [Linked List (Classes)] [C++ v. Java Classes I] [Prime Generator Algorithm] [Fast Primes Generator]
pt.cpp
/* 
 * This is an ADT for the simplest data structure I could think of,
 * a point.  Except for the I/O (and one string parameter) this
 * would compile in plain C. 
 */

#include <iostream>
#include <string>
#include <math.h>
using namespace std;

/* Points. */
typedef struct Point {
        double xval, yval;
} Point;

/* Fill in a point. */
Point mkpt(double x, double y) {
        Point p;

        p.xval = x;
        p.yval = y;

        return p;
}

/* Distance to another point.  Pythagorean thm. */
double dist(Point a, Point b) {
        double xd = a.xval - b.xval;
        double yd = a.yval - b.yval;
        return sqrt(xd*xd + yd*yd);
}

/* Add or subtract two points. */
Point add(Point a, Point b)
{
        return mkpt(a.xval + b.xval, a.yval + b.yval);
}
Point sub(Point a, Point b)
{
        return mkpt(a.xval - b.xval, a.yval - b.yval);
}

/* Move the existing point. */
void move(Point *p, double a, double b)
{
        p->xval += a;
        p->yval += b;
}

/* Print the point to standard output.  The class ostream is a base class
   for output streams of various types. */
void print(Point p)
{
        cout << "(" << p.xval << "," << p.yval << ")";
}

// Print a line of the form x op y = z, where x, y, and z are points. 
void prline(Point x, string op, Point y, Point z)
{
        print(x);
        cout << " " << op << " ";
        print(y);
        cout << " = ";
        print(z);
        cout << endl;
}

main() 
{
        // Some points.
        Point a = mkpt(5.2, -4.8);
        Point b = mkpt(3.0, 9.0);
        Point c = mkpt(-3.38, 0.0);
        Point d = mkpt(0.0, 0.0);

        // Some arith. on the points.
        d = sub(b, c);
        prline(b, "-", c, d);
        prline(a, "+", b, add(a, b));
        print(a); 
        cout << " is " << dist(a,d) << " from "; 
        print(d); 
        cout << endl;

        // Point variables are not references.
        Point fred[5];
        int m;
        for(m = 0; m < 5; m++) fred[m] = a;
        double w = 4.5;
        double x = -2.31;
        for(m = 0; m < 5; m++) {
                move(&fred[m], w, x);
                w += 3.4;
                x -= 1.3;
        }
        for(m = 0; m < 5; m++) {
                print(fred[m]);
                cout << endl;
        }
}