Conditional Compilation

    int i, sum = 0;
    int a[100];

    for (i = 0; i < 100; i++) {
        sum = sum + a[i];
#if 0           // #ifdef DEBUG
        cout << i << " " << a[i] << " " << sum
#endif
    }
    cout << sum;

Structures

Arrays allow items of the same type to be grouped in the same structure.

Structures in C/C++ allow items of different types to be grouped together.

An element of an array is accessed using an index into an array.

An element of a structure is accessed using a field name for the element.

Field Access

To access a field of the structure use the ``structname.fieldname''. Often we have an address to a structure (a pointer) in which case we could use ``(*pstructname).fieldname'' or more commonly ``pstructname->fieldname''.

Example:

/*
 * /cs/cs2005/pub/example/structexample.C -- structure example in C++
 */
#include <iostream.h>
#include <iomanip.h>  // needed for formatting (manipulating) output

#define MAXNAME 12

struct datestruct {
    int day;         /* 1-31 */
    int month;       /* 1-12 */
    int year;        /* 1995 */
};

enum levels {mainfloor, balcony};

struct ticketstruct {
    char sbFirst[MAXNAME]; /* first name */
    char sbLast[MAXNAME];  /* last name */
    struct datestruct date;
    char chAisle;          /* A to Z */
    int wRow;
    int wSeat;
    enum levels level;
    float cost;
};

void GetTicket(struct ticketstruct &tkt);  // inclusion of param name optional
void PrintTicket(struct ticketstruct tkt);  // inclusion of param name optional

void main(void)
{
    struct ticketstruct tkt;
    
    GetTicket(tkt);
    PrintTicket(tkt);
}

/*
 * GetTicket - get ticket values
 */
void GetTicket(struct ticketstruct &tkt) // call-by-reference parameter
{
    strcpy(tkt.sbFirst, "Joe");
    strcpy(tkt.sbLast, "Rocket");
    tkt.date.day = 6;
    tkt.date.month = 7;
    tkt.date.year = 1996;
    tkt.chAisle = 'Q';
    tkt.wRow = 3;
    tkt.wSeat = 12;
    tkt.level = mainfloor;
    tkt.cost = 25.00;
}

/*
 * PrintTicket - print ticket values
 */
void PrintTicket(struct ticketstruct tkt)
{
    cout << tkt.sbFirst << " " << tkt.sbLast << "\n";
    cout << "on " << tkt.date.month << "/" 
         << tkt.date.day << "/" << tkt.date.year << "\n";
    cout << "aisle: " << tkt.chAisle << "  row: " << tkt.wRow << "  seat: "
        << tkt.wSeat;
    switch (tkt.level) {
      case mainfloor:
        cout << " on the main floor\n";
        break;
      case balcony:
        cout << " in the balcony\n";
        break;
    }
    cout << "cost = $" << tkt.cost << "\n";
    // ugly C++ output formatting to get the cents to print
    // see pg. 214 of Shiflet text
    cout << setiosflags(ios::showpoint|ios::fixed) << setprecision(2) 
        << "cost = $" << tkt.cost << "\n";
}

Sample execution:

> structexample
Joe Rocket
on 7/6/1996
aisle: Q  row: 3  seat: 12 on the main floor
cost = $25
cost = $25.00

Array of Structs

We could have an entire array of structures (versus having a parallel array for each field.

#define MAXTICKETS 15000

struct ticketstruct rgTicket[MAXTICKETS];

rgTicket[i].date.month;   /* access the month field */

for (i = 0; i < MAXTICKETS; i++) {
    GetTicket(rgTicket[i]);
    PrintTicket(rgTicket[i]);
}

Polynomial Example Revisited

Could enclose all information about the polynomial in a single structure (have an array within the structure).

struct Polynomial {
    int wDegree;
    float rgCoeff[MAXCOEFF];
};

Polynomial poly;  // in C++ can just use the name of the structure

/*
 * /cs/cs2005/pub/example/polystruct.C -- read and print a polynomial in C++
 *
 * programmer -- Craig Wills
 *
 * date -- November 2, 1996
 *
 * modification history
 */

#define MAXCOEFF 10       /* maximum number of coefficients */

#include <iostream.h>

#define FALSE 0
#define TRUE 1
typedef short Boolean;

struct Polynomial {
    int wDegree;
    float rgCoeff[MAXCOEFF];
};

/* function prototypes */
void ReadPoly(Polynomial &);
void PrintPoly(Polynomial);

void main()
{
    Polynomial poly;  // in C++ can just use the name of the structure
    
    /* read in and print a polynomial */
    ReadPoly(poly);
    PrintPoly(poly);
}

/*
 * ReadPoly -- read and store the contents of a polynomial along with its
 *     degree.
 */
void ReadPoly(Polynomial &poly)
{
    Boolean bOk;                /* is the degree ok? */
    int i;

    /* obtain the degree of the polynomial */
    bOk = FALSE;
    while (!bOk) {
        cout << "What is the degree of your polynomial? \n";
        cin >> poly.wDegree;
        if ((poly.wDegree < 0) || (poly.wDegree >= MAXCOEFF))
            cout << poly.wDegree << "is not in the allowed degree range of 0-"
                << MAXCOEFF-1 << "\n";
        else
            bOk = TRUE;
    }

    /* obtain the coefficients of the polynomial */
    for (i = poly.wDegree; i >= 0; i--) {
        cout << "Enter the coefficient for the degree " << i << " term: ";
        cin >> poly.rgCoeff[i];
    }
}    

/*
 * PrintPoly -- print the contents of a polynomial given the coefficient
 *    list and the polynomial degree (in a rather ugly manner).
 */
void PrintPoly(Polynomial poly)
{
    int i;

    cout << "f(x) =";
    for (i = poly.wDegree; i >= 0; i--) {
        cout << " + " << poly.rgCoeff[i] << "x^" << i;
    }
    cout << "\n";
}