-1

I was able to write a program to pass my c++ class in college except for one feature. I was unable to create a function that sorted the names inside an array of structs with name of type char alphabetically. Please advise on how to tackle this problem.

I would need a function that sorts the accountRecords array alphabetically.

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


//Structure Initilizations
const int NAME_SIZE = 25, ADDR_SIZE = 100, CITY_SIZE = 51, STATE_SIZE = 4, DATE_SIZE = 16, CUSTOMER_ID = 10, TRANSACTION_TYPE = 16;

struct MasterRecord
{
    int customerID;
    char name[NAME_SIZE]; // SORT THIS FIELD ALPHABETICALLY
    char address[ADDR_SIZE];
    char city[ADDR_SIZE];
    char state[STATE_SIZE];
    char zip[STATE_SIZE];
    float accountBalance;
    char lastTransactionDate[15];
};
struct TransactionRecord
{
    int customerID;
    char transactionType;
    float amount;
    char transactionDate[15];
};

//File Array Initializations
vector<MasterRecord> masterRecordList(101);
vector<TransactionRecord> transRecordList(101);

//Array List Record Position
int masterRecordArrayPosition = 0;
int transactionRecordArrayPosition = 0;

//User Menu Answer Variable Initialization
int userAnswer = 0;
string recordNotFoundAnswer = "";

//Print Function Prototypes
void showMenu();
void showMasterRecord(int);
void showTransactionRecord(int);

//Main Menu Function Prototypes
void newCustomerRecord(int);
void editCustomerRecord(int);
void deleteCustomerRecord(int);
int randomComputerID();
int searchMasterRecord(int);
void saveAccountRecords();
void saveTransRecords();
void newTransactionRecord(int);

//Placeholders Variables
int customerIDsearch = 0;
int customerIDSearchArrayPosition = 0;
int userNameCharactererror = 0;

//Function Loop Counters
int accountWriteCounter = 0;
int transWriteCounter = 0;
int showRecordCounter = 0;
int showTransCounter = 0;

//System time Declaration and Conversion for [lastTransactionDate]
time_t now = time(0);
tm *ltm = localtime(&now);
string currentYearInString = to_string(1900 + ltm->tm_year);
string currentMonthInString = to_string(1 + ltm->tm_mon);
string currentDayInString = to_string(ltm->tm_mday);
string currentDateInString = currentMonthInString + "/" + currentDayInString + "/" + currentYearInString;
char dateInChar[15];


//Main Program
int main()
{
    //Final conversion of time in string to char for storage
    strncpy_s(dateInChar, currentDateInString.c_str(), 15);


    //Open MasterRecord file and read records to arrays
    fstream masterRecord("masterRecord.dat", ios::in | ios::binary);
    int listCounter = 0;

    if (!masterRecord) {
        cout << "Unable to open the user records file, creating file database....Done!" << endl;
        masterRecord.open("masterRecord.dat", ios::out | ios::binary);
    }
    else {

        while (!masterRecord.eof()) {
            masterRecord.read(reinterpret_cast<char *>(&masterRecordList[listCounter]), sizeof(masterRecordList[0]));
            if (masterRecordList[listCounter].customerID != 0) {
                listCounter++;
            }
            masterRecordArrayPosition = listCounter;
        }
        masterRecord.close();

    }

    //Open Transaction Record and read to arrays
    fstream transactionRecord("transactionRecord.dat", ios::in | ios::binary);
    int listCounter2 = 0;

    if (!transactionRecord) {
        cout << "Unable to open the transaction file, creating file database....Done!" << endl << endl;
        transactionRecord.open("transactionRecord.dat", ios::out | ios::binary);
    }
    else {

        while (!transactionRecord.eof()) {
            transactionRecord.read(reinterpret_cast<char *>(&transRecordList[listCounter2]), sizeof(transRecordList[0]));
            if (transRecordList[listCounter2].customerID != 0) {
                listCounter2++;
            }

            transactionRecordArrayPosition = listCounter2;
        }
        transactionRecord.close();
    }


    //Time Declaration Used to Generate Random IDs
    srand((unsigned)time(0));

    //Main user Program Loop
    while (userAnswer != 6) {

        showMenu();
        cin >> userAnswer; cout << endl;


        //Menu Input Data Validation
        if (cin.fail()) {
            cout << "Please only enter numbers 1-6 for the corresponding menu selection." << endl;
            cin.clear();
            cin.ignore();
        }
        else {
            if (userAnswer < 1 || userAnswer > 7) {
                cout << "Please only enter numbers 1-6 for the corresponding menu selection." << endl;
                userAnswer = 0;
            }
        }

        //Menu Selection Switch Case    
        switch (userAnswer) {
        case 1:
            newCustomerRecord(masterRecordArrayPosition);
            cout << "Record has been saved." << endl << endl;
            break;
        case 2:
            newTransactionRecord(transactionRecordArrayPosition);
            break;
        case 3:
            cout << "Please enter the Customer ID you would like to Delete" << endl << endl; //[Delete Customer Record] Function goes here
            cin >> customerIDsearch;
            customerIDSearchArrayPosition = searchMasterRecord(customerIDsearch);
            if (customerIDSearchArrayPosition != 9999) {
                deleteCustomerRecord(customerIDSearchArrayPosition);
            }
            break;
        case 4:
            cout << "Please enter the Customer ID you would like to edit." << endl << endl; //[Search/Edit Customer Record] Function goes here
            cin >> customerIDsearch;
            customerIDSearchArrayPosition = searchMasterRecord(customerIDsearch);
            if (customerIDSearchArrayPosition != 9999) {
                editCustomerRecord(customerIDSearchArrayPosition);
            }
            else {
                cout << "Record was not found, would you like to add a new record? Y = Yes, N = No" << endl << endl;
                cin >> recordNotFoundAnswer;
                if (recordNotFoundAnswer == "Y" | recordNotFoundAnswer == "y") {
                    newCustomerRecord(masterRecordArrayPosition);
                    cout << "Record has been saved." << endl << endl;
                }
                else if (recordNotFoundAnswer == "N" | recordNotFoundAnswer == "n") {
                    userAnswer = 0;

                }
            }
            break;
        case 5:
            cout << setw(212) << "Please find all customer records in the database" << endl << endl;  //[Show all Records] Function goes here
            cout  << setw(40) << "Name:" << setw(10) << "ID:" << setw(23) << "Street Address:"  <<setw(10) << "ZIP:"  << setw(16) << "L.Trans Date:" << setw(11) << "Balance: " << endl;
            while (showRecordCounter < 100) {
                if (masterRecordList[showRecordCounter].customerID != 0) {
                    showMasterRecord(showRecordCounter);
                }
                showRecordCounter = showRecordCounter + 1;
            } showRecordCounter = 0;
            userAnswer = 0;
            cout << endl;
            break;
        case 6:
            cout << "Saving changes to database...Done!" << endl;
            saveAccountRecords();
            saveTransRecords();
            cout << "Done!" << endl;
            break;
        case 7:
            cout << "Showing all transaction Records:" << endl << endl;
            while (showTransCounter < 100) {
                if (transRecordList[showTransCounter].customerID != 0) {
                    showTransactionRecord(showTransCounter);
                }
                showTransCounter = showTransCounter + 1;
            } showTransCounter = 0;
            userAnswer = 0;
            break;
        }


    }

    return 0;

}

//Databas Management Functions
void saveAccountRecords() {
    fstream masterRecord("masterRecord.dat", ios::out | ios::binary);
    while (accountWriteCounter < 100) {
        masterRecord.write(reinterpret_cast<char *>(&masterRecordList[accountWriteCounter]), sizeof(masterRecordList[0]));
        accountWriteCounter++;
    }
    masterRecord.close();
}
void saveTransRecords() {
    fstream transRecord("transactionRecord.dat", ios::out | ios::binary);
    while (transWriteCounter < 100) {
        transRecord.write(reinterpret_cast<char *>(&transRecordList[transWriteCounter]), sizeof(transRecordList[0]));
        transWriteCounter++;
    }
    transRecord.close();
}

//Random Function
int randomComputerID() {
    int randomNumber;
    randomNumber = (rand() % 1000) + 10000;

    return randomNumber;
}

//Program Print Functions
void showMenu() {
    cout << "Welcome to your C++ company terminal! Please enter one of the options below to continue." << endl << endl;
    cout << "1. New Customer Record" << endl;
    cout << "2. New Transaction Record" << endl;
    cout << "3. Delete Customer Record" << endl;
    cout << "4. Edit Customer Record" << endl;
    cout << "5. Show all Account Records in Database" << endl;
    cout << "6. Exit and Save Changes to Database" << endl << endl;
    cout << "Please enter the number for the correspondent action you would like to perform:" << endl;

}
void showMasterRecord(int arrayNum) {




cout  << setw(40)
<< masterRecordList[arrayNum].name << setw(10) << masterRecordList[arrayNum].customerID << setw(23)
<<  masterRecordList[arrayNum].address << setw(10)

<<  masterRecordList[arrayNum].zip << setw(16)
<<  masterRecordList[arrayNum].lastTransactionDate << setw(6) <<"$"
<<  masterRecordList[arrayNum].accountBalance; cout << endl;

}
void showTransactionRecord(int arrayNum) {
    cout << "Customer ID: " << transRecordList[arrayNum].customerID << endl;
    cout << "Amount: $" << transRecordList[arrayNum].amount << endl;
    cout << "Transaction Type: " << transRecordList[arrayNum].transactionType << endl;
    cout << "Transaction Date: " << transRecordList[arrayNum].transactionDate << endl << endl;

}

//Main Menu Functions [Please insert your functions here and prototype them above].
void newCustomerRecord(int arrayNum) {
    cout << "Customer ID: ";
    masterRecordList[arrayNum].customerID = randomComputerID();
    cout << masterRecordList[arrayNum].customerID; cout << endl;
    cin.ignore();



    do 
    {
        cout << "Name: ";
        cin.getline(masterRecordList[arrayNum].name, 25); 
        if (cin.fail()) {
            cout << endl << "Please enter only characters up 25 chracters for your name." << endl;
            userNameCharactererror = 1;
            cin.clear();
            cin.ignore(80, '\n');

        }
        else {
            userNameCharactererror = 0;
        }

    } while (userNameCharactererror == 1);

    cout << "Address: ";
    cin.getline(masterRecordList[arrayNum].address, 100);
    cout << "City: ";
    cin >> masterRecordList[arrayNum].city;
    cout << "State: ";
    cin >> masterRecordList[arrayNum].state;
    cout << "Zip Code: ";
    cin >> masterRecordList[arrayNum].zip;
    cout << "Opening Balance: $";
    cin >> masterRecordList[arrayNum].accountBalance; cout << endl; cout << endl;
    masterRecordArrayPosition = masterRecordArrayPosition + 1;
}

void editCustomerRecord(int arrayNum) {
    cout << "Customer ID: ";
    cout << masterRecordList[arrayNum].customerID; cout << endl;
    cin.ignore();
    cout << "Name: ";
    cin.getline(masterRecordList[arrayNum].name, 51);
    cout << "Address: ";
    cin.getline(masterRecordList[arrayNum].address, 100);
    cout << "City: ";
    cin >> masterRecordList[arrayNum].city;
    cout << "State: ";
    cin >> masterRecordList[arrayNum].state;
    cout << "Zip Code: ";
    cin >> masterRecordList[arrayNum].zip;
    cout << "Edit Balance: $";
    cin >> masterRecordList[arrayNum].accountBalance; cout << endl; cout << endl;

}
void deleteCustomerRecord(int arrayNum) {

    if (masterRecordList[arrayNum].accountBalance == 0)
    {
        masterRecordList[arrayNum].customerID = 0;
        cout << "Record has been deleted" << endl << endl;
    }
    else {
        cout << "Unable to delete record, customer accounts holds a positive balance" << endl << endl;
    }

}
int searchMasterRecord(int customerID) //Search by customer name and returns array position
{
    int arrayPosition = 0;
    int arrayCounter = 0;
    int customerIdPlaceholder = 0;
    while (arrayCounter < 100) {
        customerIdPlaceholder = masterRecordList[arrayCounter].customerID;
        if (customerIdPlaceholder == customerID) {
            cout << "Record has been found!" << endl << endl;
            arrayPosition = arrayCounter;
            arrayCounter = 100;
        }
        else {
            arrayPosition = 9999;
        }
        arrayCounter = arrayCounter + 1;

    }
    return arrayPosition;
};
void newTransactionRecord(int arrayNum) {

    // Request customer ID and transaction type from the user
    cout << "Customer ID: ";
    cin >> transRecordList[arrayNum].customerID;
    cin.ignore();
    cout << "Date: ";
    strncpy_s(transRecordList[arrayNum].transactionDate, dateInChar, 15);
    cout << transRecordList[arrayNum].transactionDate << endl;
    cout << "Transaction Type [D = Deposit] [W = Withdrawal]: ";
    cin >> transRecordList[arrayNum].transactionType;
    cout << "Amount: $";
    cin >> transRecordList[arrayNum].amount;

    //Search for customer account, update balance, and assign last transaction date
    customerIDSearchArrayPosition = searchMasterRecord(transRecordList[arrayNum].customerID);
    if (customerIDSearchArrayPosition != 9999) {

        if (transRecordList[arrayNum].transactionType == 'D') {

            masterRecordList[customerIDSearchArrayPosition].accountBalance = masterRecordList[customerIDSearchArrayPosition].accountBalance + transRecordList[arrayNum].amount;
            strncpy_s(masterRecordList[customerIDSearchArrayPosition].lastTransactionDate, dateInChar, 9);
            cout << "Deposit Successful! " << endl << endl;
        }
        else if (transRecordList[arrayNum].transactionType == 'W') {

            masterRecordList[customerIDSearchArrayPosition].accountBalance = masterRecordList[customerIDSearchArrayPosition].accountBalance - transRecordList[arrayNum].amount;
            strncpy_s(masterRecordList[customerIDSearchArrayPosition].lastTransactionDate, dateInChar, 9);
            cout << "Withdrawl Successful" << endl << endl;
        }
    }
    else {
        cout << "Customer account record was not found, transaction was not saved." << endl << endl;
    }
    transactionRecordArrayPosition = transactionRecordArrayPosition + 1;
}
Uwe Keim
  • 36,867
  • 50
  • 163
  • 268
  • Useful read: [Why is `iostream::eof` inside a loop condition considered wrong?](https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong). – molbdnilo Aug 01 '17 at 13:30
  • What have you tried so far? (please show research effort) Also, this is surely not a [MCVE](https://stackoverflow.com/help/mcve)? – Walter Aug 01 '17 at 13:38

1 Answers1

0

Something along these lines:

std::sort(masterRecordList.begin(),
          masterRecordList.begin() + masterRecordArrayPosition,
          [](const MasterRecord& l, const MasterRecord& r) {
            return strcmp(l.name, r.name) < 0;
          });
Igor Tandetnik
  • 45,980
  • 4
  • 51
  • 75