Функции и структуры в C ++ - PullRequest
0 голосов
/ 03 марта 2011

/ * Я попал в тупик в своем коде. Я думаю, что занятия будут проще, чем структуры, но глава моей книги заставляет меня создавать структуры. : / В настоящее время я получаю сообщение об ошибке, что моя функция не соответствует перегруженной функции. Книга действительно говорит о них, но примеры перегрузки функций в книге не помогают мне. Также книга требует, чтобы я ввел номера счетов и заполнил объекты, а когда их попросят указать номер счета, у них должна быть возможность «ВЫЙТИ» из ввода номеров и перейти к следующей части программы; весь этот образ мыслей немного напрягает мой мозг, и я надеялся, что смогу помочь. Я прошу прощения, если форматирование моего кода является грязным, я попытался переформатировать его здесь, чтобы все это вошло в скобки кода.

Ошибка происходит в строке ... 161 в функции displayAccounts. Параметры были разными в верхней и нижней части двух функций, я изменил его, и это работает. Я собираюсь пройтись по разным частям и, если это правильно, опубликовать правильный код. * /

Я точно понял вопрос, который мне нужен. Мне нужно, чтобы цикл "QUIT" был разрешен для отслеживания номеров счетов. Это позволило бы пользователю вводить 0 в любое время, когда его просят ввести номер счета, и это меня смущало больше всего.

#include <iostream>
#include <iomanip>

using namespace std;

struct BankAccount
{
    void enterAccountsData(BankAccount *accounts);
    void computeInterest(BankAccount *accounts);
    void displayAccounts(BankAccount *accounts, const int QUIT);

    int accountNum; // holds the account number.
    double accountBal; // holds the account balance.
    double annualInterest; // holds the interest rate.
    int term; // holds the term for the accounts.
};

int main()
{
    const int MAX_ACCOUNTS = 100; // The maximum number of bank accounts.
    const int QUIT = 0; // sentinal value.
    int input;
    int num = 0;
    BankAccount data[MAX_ACCOUNTS];
    BankAccount display;

    cout << "Enter " << QUIT << " to stop, otherwise enter 1 and procreed.";
    cin >> input;

    while(true)
    {
        if(input != QUIT)
        {
            data[MAX_ACCOUNTS].enterAccountsData(data);
            data[MAX_ACCOUNTS].computeInterest(data);
        }
        else
        {
            break;
        }
    }

    display.displayAccounts(data, QUIT);
    //system("pause");
    return 0;
}

void BankAccount::enterAccountsData(BankAccount *accounts)
{
    cout << setprecision(2) << fixed;

    const int NUM_OF_ACCOUNTS = 100; // the number of bank accounts. (change the number for more bank accounts)
    int found;
    int quit = 0;

    /* First for loop which asks and holds the account information
    entered in by the user. */
    for(int num = 0; num < NUM_OF_ACCOUNTS; num++)
    {
        do
        {
            found = 0;
            cout << "Enter in account # " << (num + 1) << endl;
            cin >> accounts[num].accountNum; // holds the value of the account number

            // Checks if the account number is valid.
            while(accounts[num].accountNum < 999 || accounts[num].accountNum > 10000)
            {
                cout << "Account number must be four didgets:" << endl;
                cin >> accounts[num].accountNum;
            }
            // Checks if the account numbers are the same.
            for(int check = 0; check < num; check++)
            {
                while(accounts[num].accountNum == accounts[check].accountNum)
                {
                    cout << endl << "Account Numbers cannot be the same, enter in a new account number." << endl;
                    found = 1;
                    break;
                }
            }
        } while(found); // end of do while.

        // Holds the values for the account balances.
        cout << "Enter the accounts balance."  << endl;
        cin >> accounts[num].accountBal;

        // Makes sure that the account balance is not negative.
        while(accounts[num].accountBal < 0)
        {
            cout << "Account cannot have a negitive balance." << endl;
            cin >> accounts[num].accountBal;
        }
        // Holds the interest rate.
        cout << endl << "Enter the interest rate for account # " << (num + 1) << endl;
        cin >> accounts[num].annualInterest;

        // Makes sure the interest rate is valid
        while(accounts[num].annualInterest > 0 && accounts[num].annualInterest > 0.15)
        {
            cout << endl << "Annual interest must be from 0 to 0.15." << endl;
            cin >> accounts[num].annualInterest;
        }
        // Makes sure the interest rate is not negetive
        while(accounts[num].annualInterest < 0)
        {
            cout << endl << "Interest rate cannot be negetive" << endl;
            cin >> accounts[num].annualInterest;
        }
        // Holds the value for the length of the interest.
        cout << endl << "How many years will this interest rate be held for? " << endl;
        cin >> accounts[num].term;

        //Checks for valid length of time for the term held
        while(accounts[num].term < 0 || accounts[num].term > 11)
        {
            cout << "The Term must be greater than 1 and should not exceed 10" << endl;
            cin >> accounts[num].term;
        }
    }
    cout << "If you wish to stop enter 0 otherwise type 1 to proceed" << endl;
    cin >> quit;
    if(quit = 0)
    {
        return;
    }
}

void BankAccount :: computeInterest(BankAccount *accounts)
{
    const int NUM_OF_ACCOUNTS = 100; // the number of bank accounts.
    const int MONTHS_IN_YEAR = 12;
    double total = 0;
    double average = 0;

    for(int num = 0; num < NUM_OF_ACCOUNTS; num++)
    {
        /*Goes through the term year and calculates the total
        of each account balance. Then calculates the average. */

        for(int year = 0; year < accounts[num].term; year++)
        {
            for(int month = 0; month < MONTHS_IN_YEAR; month++)
            {
                accounts[num].accountBal = (accounts[num].accountBal * accounts[num].annualInterest) + accounts[num].accountBal;
            }
            int month = 1;
            cout << endl << "Total amount for account # " << (num + 1) << " is: " << accounts[num].accountBal << endl ;
            total += accounts[num].accountBal;
            cout << endl << "The total amount of all accounts is: " << total << endl;
        }
    }
    average = total / NUM_OF_ACCOUNTS;
    cout << "Average of all the bank accounts is: " << average << endl;
}

void BankAccount :: displayAccounts(BankAccount *accounts)
{
    int input = 0;
    int found;
    const int MAX_ACCOUNTS = 100;
    int quit = 0;

    cout << endl << "Which account do you want to access?" << endl <<
    "To stop or look at none of the account numbers type: " << quit << endl;
    cin >> input;

    for(int num = 0; num < MAX_ACCOUNTS; num++)
    {
        while(num < MAX_ACCOUNTS && input != accounts[num].accountNum)
        {
            num++;
        }
        if(input == accounts[num].accountNum) // This if sees if an account matches what the user entered.
        {
            cout << "Account: " << accounts[num].accountNum << endl << "Balance is: " <<
            accounts[num].accountBal << endl << "Interest rate is: " << accounts[num].annualInterest;
            cout << endl << "Enter another account number or type 0 to quit." << endl;
            found = 1;
            cout << endl;
            cin >> input;
        }
        if(found == 0)
        {
            cout << "Sorry that account doesn't exist. Enter another account number." << endl;
            cin >> input;
        }
    }
}

Ответы [ 4 ]

2 голосов
/ 03 марта 2011

В C ++ классы и структуры точно такие же конструкции .Фактически это одно и то же - пользовательский тип.

В зависимости от того, использовали ли вы ключевое слово struct или class для определения своего UDT, вызывается другое.что ключ class по умолчанию имеет значение private доступ к члену и частное наследование, тогда как ключ struct по умолчанию имеет значение public.

Кроме этой разницы в синтаксисе, вы можете использовать любой из них, не беспокоясь оодин из них «проще», чем другой.

В любом случае, ошибка вашего компилятора (укажите ее в следующий раз), вероятно, связана с несоответствием объявления / определения.

Ваше объявление:

void displayAccounts(BankAccount *accounts, const int QUIT);

Начало определения:

void BankAccount :: displayAccounts(BankAccount *accounts) {

Начало определения должно быть

void BankAccount::displayAccounts(BankAccount* accounts, const int QUIT) {

для соответствия.Я также исправил ваш интервал, чтобы быть лучше.:)

1 голос
/ 03 марта 2011
void displayAccounts(BankAccount *accounts, const int QUIT);

... выглядит по-разному между объявлением и определением.Второй параметр отсутствует в определении.

0 голосов
/ 03 марта 2011

В объявлении члена структуры displayAccounts () есть:

void displayAccounts(BankAccount *accounts, const int QUIT);

и при определении метода позже:

void BankAccount :: displayAccounts(BankAccount *accounts)

Вы только что пропустили

const int QUIT 

параметр для определения функции-члена.

0 голосов
/ 03 марта 2011

Не уверен, что ваш вопрос, но классы и структуры в C ++ эквивалентны, за исключением того, что поля являются открытыми по умолчанию в структурах, но частными по умолчанию в классах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...