# C++ Notes: Struct Example

## Problem - Points

Suppose we have the following problem. We want to read a set of (x, y) coordinates and a name, then sort them in order increasing distance from the origin (0, 0). This is the kind of data you might have if we digitized a map with the origin at some central point (eg, London) and the coordinates of other cities.

## Global Declaration

Types are usually used in more than one function, and are therefore global or defined in an include file.

    // Define a struct to hold each point.
    struct Point {
        float x;   // x coordinate
        float y;   // y coordinate
        char  name[20]; // name of the point
    };

## Local Declarations

    Point pts[1000];  // array to hold up to 1000 points.
    int   n = 0;      // number of points in the array.

## Reading the input

To read structs, you need to read each of the fields.

    while (cin >> pts[n].name >> pts[n].x >> pts[n].y) {
        n++;
    }

## Utility function to compute distance to origin

    float dist(Point p) {
        // Compute the distance from the origin
        return sqrt(p.x*p.x + p.y*p.y);
    }

## Sorting an array of Points

Here's a simple bubble sort function that stops when there are no more exchanges. It sorts Points by their distance from the origin by calling on the function defined above.

    void bubbleSort(Point pt[], int size) {
        bool doMore = true;
        while (doMore) {
            doMore = false;  // Assume no more passes unless exchange made.
            for (int i=0; i<size-1; i++) {
                if (dist(pt[i]) > dist(pt[i+1])) {
                    // Exchange elements
                    Point temp = pt[i]; pt[i] = pt[i+1]; pt[i+1] = temp;
                    doMore = true;  // Exchange requires another pass.
                }
            }
        }
    }