tags:

views:

99

answers:

5

Howdy! I'm working on an old project from one of my programming courses and having some issues tracking down which line in my code is causing a syntax error.

When I attempt to compile the code, Visual Studio tells me that there is a syntax error towards the end of main on the line containing this function call:

sortData(carray, numRec, sortby);

I dont think that's the case, because commenting out that call only moves the error to the next line of code.

I can't tell what is causing the error and am hoping a veteran eye could help.

I've include all of the code as I suspect the error is being caused in one of the function calls.

ohbijuan

P.S. Also - Does anyone know if the compiler compiles top to bottom or whether it actually follows function calls during the compile process?

#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std;

//customer struct
struct customer
{
    int id;
    string fname, lname;
    double totalQuantity, totalPurchases, totalProfit;
};

//Error Codes
const int INPUT_FILE_FAIL_NO_CONTINUE = 2;
const int INPUT_FILE_DATA_ERROR = 3;

//Global Constants
const int arraySize = 200;
const int numType = 5; //# of the types of coffee we currently offer

//Coffee prices per pound
const double colombWhole = 3.75;
const double colombRetail = 4.85;
const double konaWhole = 4.25;
const double konaRetail = 5.25;
const double ethiopWhole = 4.30;
const double ethiopRetail = 5.75;
const double jamaWhole = 5.25;
const double jamaRetail = 7.75;
const double brazWhole = 4.65;
const double brazRetail = 5.90;

//Function prototypes
int readData (ifstream &infile, customer carray[], int size);
//PRE:  The address of the ifstream object, the addres of the array of customer structs and the size of
//      the array is passed in
//POST: All of the customer data is read in AND the totalQuantity, totalPurchases and totalProfit for
//      each customer is calculated. The number of records read is returned.

void sortData (customer carray[], int recordcount, int sortfield);
//PRE:  The address of the array of customers, the number of customer records in the array and the field
//      on which to be sorted is passed into the function.
//POST: The array is sorted on the basis of the specified field in ascending order

int findMax (const customer carray[], int startRange, int recordcount, int sortfield);
//PRE:  The address of the array of customers, the field to sort on and a range of values is passed in
//POST: The address of the largest value is returned




int main()
{
    //Array of customer structs
    customer crecords[arraySize];

    //Initialize the members of our struct to zero
    for (int i = 0; i < arraySize; i++)
    {
        crecords[i].totalProfit = 0;
        crecords[i].totalPurchases = 0;
        crecords[i].totalQuantity = 0;
    }

    //Declare filestream objects
    ifstream ifile;
    ofstream ofile1, ofile2, ofile3;

    //user responses
    char pquit = 'Y';
    char specAnother; 
    int sortby;
    string ifilename;

    //Ask user for name of input file
    cout << "Please enter the name of the input file: " ;
    cin >> ifilename;

    //Attempt to open the input file
    ifile.open(ifilename.c_str());
    while (ifile.fail())
    {
        cout    << endl << "The input file could not be found. Would you like to specify " 
                << "another file?" << endl << "(Enter Y or N):";
        cin     >> specAnother; //Ask user if they want to specify another

        if (specAnother == 'N' || specAnother == 'n')
        {   
            exit(INPUT_FILE_FAIL_NO_CONTINUE);
        }
        else
        {
            cout    << endl << "Please enter the name of the new input file: " ;
            cin     >>  ifilename;
        }

        ifile.clear(); //Clear the flags, else the input file fail flag will perpetually return true
        ifile.open(ifilename.c_str());

    } 

    //File opened successfully, let's begin reading in data and also keep track of the # of 
    //records read
    int numRec = readData(ifile, crecords, arraySize); 
    cout << "Finished reading " << numRec << " records" << endl;


    do
    {
        //Ask user how they would like to sort the data for the report
        cout    << endl << "What would you like to sort on?" << endl;
        cout    << "1) Sort by POUNDS bought" << endl
                << "2) Sort by PURCHASE AMOUNT" << endl
                << "3) Sort by PROFIT" << endl;

        cin     >> sortby;
        if (sortby > 3 || sortby < 1)
        {
            cout    << "You entered an invalid sorting method, try again" << endl
                    << "Enter an option:";
            cin     >> sortby;
        }

        cout    << "You entered " << sortby << endl;
    }

    //Sort Data
    sortData(carray, numRec, sortby);
    return 0;
}

//Function Definitions
int readData (ifstream &infile, customer carray[], int size)
{
    int x = 0, coffeeType, quantity;
    double currentSale, internalCost, profitOnSale;
    while (infile >> carray[x].id && x < size)
    {
        infile >> carray[x].fname >> carray[x].lname;
        while (infile >> coffeeType && coffeeType != 0)
        {
            infile >> quantity;
            switch(coffeeType)
            {
            case 1:
                carray[x].totalQuantity += quantity;
                currentSale = quantity * colombRetail;
                carray[x].totalPurchases += currentSale;
                internalCost = quantity * colombWhole;
                profitOnSale = currentSale - internalCost;
                carray[x].totalProfit += profitOnSale;
                break;

            case 2:
                carray[x].totalQuantity += quantity;
                currentSale = quantity * konaRetail;
                carray[x].totalPurchases += currentSale;
                internalCost = quantity * konaWhole;
                profitOnSale = currentSale - internalCost;
                carray[x].totalProfit += profitOnSale;
                break;

            case 3:
                carray[x].totalQuantity += quantity;
                currentSale = quantity * ethiopRetail;
                carray[x].totalPurchases += currentSale;
                internalCost = quantity * ethiopWhole;
                profitOnSale = currentSale - internalCost;
                carray[x].totalProfit += profitOnSale;
                break;

            case 4:
                carray[x].totalQuantity += quantity;
                currentSale = quantity * jamaRetail;
                carray[x].totalPurchases += currentSale;
                internalCost = quantity * jamaWhole;
                profitOnSale = currentSale - internalCost;
                carray[x].totalProfit += profitOnSale;
                break;

            case 5:
                carray[x].totalQuantity += quantity;
                currentSale = quantity * brazRetail;
                carray[x].totalPurchases += currentSale;
                internalCost = quantity * brazWhole;
                profitOnSale = currentSale - internalCost;
                carray[x].totalProfit += profitOnSale;
                break;

            default:
                cout    <<"The input file contains an undeclared coffee type at record " << x 
                        <<"Program terminating!" << endl; 
                //return exit(INPUT_FILE_DATA_ERROR);

            }
        }

        x++;    //At this point, we have encountered our sentinel value of 0 that indicates the end of our
        //customer record. Let's move on to the next customer.        
    }

    return x;
}

int findMax (const customer carray[], int startRange, int recordcount, int sortfield)
{
    int maxLoc = startRange;
    switch(sortfield)
    {
    case 1:

        for (int i = startRange + 1; i <= recordcount; i++)
        {
                if (carray[maxLoc].totalQuantity < carray[i].totalQuantity)
                maxLoc = i;
        }

    case 2:

        for (int i = startRange + 1; i <= recordcount; i++)
        {
            if (carray[maxLoc].totalPurchases < carray[i].totalPurchases)
                maxLoc = i;
        }

    case 3:

        for (int i = startRange + 1; i <= recordcount; i++)
        {
            if (carray[maxLoc].totalProfit < carray[i].totalProfit)
                maxLoc = i;
        }    
    }

    return maxLoc;
}




void sortData (customer carray[], int recordcount, int sortfield)
{
    for (int i = 0; i < recordcount ; i++)
    {
        int max = findMax(carray, i, recordcount, sortfield);
        swap(carray[i], carray[max]);
    }
}
+5  A: 

Your problem is that you have this:

do
{
    // ...
}

without a trailing while (...); just before the call to sortData.

RichieHindle
Thanks Richie! I cant believe I missed that. Damn! I think I'm going back to bed!
noobzilla
@obijuan: One more thing. In the function findMax() the cases are missing break; statement.
Naveen
Thanks for the catch Naveen!
noobzilla
+2  A: 

Where is while clause of your do..while statement?

Jack
+2  A: 

do { … } requires a condition at the end, such as do { … } while (busy); If you just want to execute a piece of code in a block, just put that block there and remove the do.

Tim
+1  A: 

Your do {} is missing a while clause after the brackets, that would result in a syntax error.

Another thing I also noticed -- the findMax switch statement is missing a default tag, and it's also missing break statements. Not sure if that's your intention or not, but it's usually not for most switches.

Kaleb Brasee
Thanks Kaleb. Another miss on my part - That's what I get for writing code when under the influence of cold medicine :)
noobzilla
A: 

where is your while after do ????

do

{

// something

}

while(condition);

this is the correct syntax

Davit Siradeghyan